From a7c69b5b49cddcac73eb84d47b30915f66a7143f Mon Sep 17 00:00:00 2001 From: Rmys Date: Fri, 4 Apr 2025 18:24:19 +0300 Subject: [PATCH] remove -kf6 --- .../akonadi-calendar-kf6/actions.py | 19 - .../akonadi-calendar-kf6/files/qt5.patch | 13 - .../akonadi-calendar-kf6/pspec.xml | 198 - .../akonadi-calendar-tools-kf6/actions.py | 21 - .../files/qt5.patch | 12 - .../akonadi-calendar-tools-kf6/pspec.xml | 156 - .../akonadi-contacts-kf6/actions.py | 19 - .../akonadi-contacts-kf6/files/qt5.patch | 12 - .../akonadi-contacts-kf6/pspec.xml | 193 - .../akonadi-import-wizard-kf6/actions.py | 21 - .../akonadi-import-wizard-kf6/pspec.xml | 184 - .../kde6/applications/akonadi-kf6/actions.py | 21 - .../akonadi-kf6/files/akonadi-apparmor.patch | 165 - .../akonadi-kf6/files/dbupdater.diff | 41 - .../applications/akonadi-kf6/files/qt5.patch | 48 - .../kde6/applications/akonadi-kf6/pspec.xml | 200 - .../applications/akonadi-kf6/translations.xml | 13 - .../applications/akonadi-mime-kf6/actions.py | 19 - .../applications/akonadi-mime-kf6/pspec.xml | 159 - .../applications/akonadi-notes-kf6/actions.py | 19 - .../akonadi-notes-kf6/files/qt5.patch | 12 - .../applications/akonadi-notes-kf6/pspec.xml | 146 - .../akonadi-search-kf6/actions.py | 19 - .../akonadi-search-kf6/files/qt5.patch | 12 - .../applications/akonadi-search-kf6/pspec.xml | 199 - .../akonadiconsole-kf6/actions.py | 21 - .../applications/akonadiconsole-kf6/pspec.xml | 185 - .../applications/akregator-kf6/actions.py | 21 - .../kde6/applications/akregator-kf6/pspec.xml | 186 - .../kde6/applications/analitza-kf6/actions.py | 19 - .../kde6/applications/analitza-kf6/pspec.xml | 147 - .../analitza-kf6/translations.xml | 14 - desktop/kde6/applications/ark-kf6/actions.py | 19 - ...ont-hardcode-bzip2-mimetype-in-tests.patch | 44 - ...support-application-vnd-efi-iso-mime.patch | 36 - ....2-fix-checks-using-old-ISO-mimetype.patch | 44 - ...23.08.2-fix-support-for-bzip2-format.patch | 121 - .../applications/ark-kf6/files/libzip.patch | 11 - desktop/kde6/applications/ark-kf6/pspec.xml | 183 - .../applications/artikulate-kf6/actions.py | 22 - .../applications/artikulate-kf6/pspec.xml | 197 - .../artikulate-kf6/translations.xml | 8 - .../applications/audiocd-kio-kf6/actions.py | 19 - .../applications/audiocd-kio-kf6/pspec.xml | 177 - .../applications/baloo-widgets-kf6/actions.py | 19 - .../applications/baloo-widgets-kf6/pspec.xml | 157 - .../kde6/applications/blinken-kf6/actions.py | 20 - .../kde6/applications/blinken-kf6/pspec.xml | 140 - .../applications/blinken-kf6/translations.xml | 8 - .../kde6/applications/bomber-kf6/actions.py | 19 - .../kde6/applications/bomber-kf6/pspec.xml | 150 - desktop/kde6/applications/bovo-kf6/actions.py | 19 - .../bovo-kf6/files/org.kde.bovo.desktop | 123 - desktop/kde6/applications/bovo-kf6/pspec.xml | 152 - .../calendarsupport-kf6/actions.py | 19 - .../calendarsupport-kf6/files/qt5.patch | 12 - .../calendarsupport-kf6/pspec.xml | 187 - .../kde6/applications/cantor-kf6/actions.py | 28 - .../kde6/applications/cantor-kf6/pspec.xml | 210 - .../applications/cantor-kf6/translations.xml | 18 - desktop/kde6/applications/component.xml | 3 - .../kde6/applications/dolphin-kf6/actions.py | 21 - .../dolphin-kf6/files/2cd3d58e.patch | 310 - .../dolphin-kf6/files/95551f44.patch | 35 - .../dolphin-kf6/files/a07f2422.patch | 37 - .../files/dolphin-17.04.0-allow-root.patch | 28 - .../dolphin-kf6/files/find-kactivities.patch | 15 - .../dolphin-kf6/files/kdebug-419585.patch | 47 - .../kde6/applications/dolphin-kf6/pspec.xml | 228 - .../dolphin-plugins-kf6/actions.py | 21 - .../dolphin-plugins-kf6/pspec.xml | 140 - .../dolphin-plugins-kf6/translations.xml | 8 - .../applications/dragonplayer-kf6/actions.py | 19 - .../applications/dragonplayer-kf6/pspec.xml | 149 - .../applications/eventviews-kf6/actions.py | 19 - .../eventviews-kf6/files/qt5.patch | 12 - .../applications/eventviews-kf6/pspec.xml | 189 - .../kde6/applications/falkon-kf6/actions.py | 22 - .../falkon-kf6/files/bookmarks_json.diff | 1077 - .../falkon-kf6/files/homepage.patch | 24 - .../falkon-kf6/files/speeddial.diff | 21 - .../kde6/applications/falkon-kf6/pspec.xml | 186 - .../applications/falkon-kf6/translations.xml | 8 - .../applications/ffmpegthumbs-kf6/actions.py | 23 - .../files/ffmpegthumbs-ffmpeg3.patch | 296 - .../applications/ffmpegthumbs-kf6/pspec.xml | 135 - .../ffmpegthumbs-kf6/translations.xml | 8 - .../applications/filelight-kf6/actions.py | 19 - .../kde6/applications/filelight-kf6/pspec.xml | 156 - .../filelight-kf6/translations.xml | 8 - .../applications/granatier-kf6/actions.py | 18 - .../kde6/applications/granatier-kf6/pspec.xml | 145 - .../granatier-kf6/translations.xml | 8 - .../grantlee-editor-kf6/actions.py | 21 - .../granatier-kf6/actions.py | 18 - .../granatier-kf6/pspec.xml | 152 - .../granatier-kf6/translations.xml | 8 - .../grantlee-editor-kf6/pspec.xml | 173 - .../applications/grantleetheme-kf6/actions.py | 19 - .../grantleetheme-kf6/files/qt5.patch | 12 - .../applications/grantleetheme-kf6/pspec.xml | 174 - .../kde6/applications/gwenview-kf6/actions.py | 19 - .../kde6/applications/gwenview-kf6/pspec.xml | 216 - .../gwenview-kf6/translations.xml | 8 - .../incidenceeditor-kf6/actions.py | 19 - .../incidenceeditor-kf6/files/qt5.patch | 12 - .../incidenceeditor-kf6/pspec.xml | 206 - .../kaccounts-integration-kf6/actions.py | 18 - .../kaccounts-integration-kf6/pspec.xml | 171 - .../kaccounts-providers-kf6/actions.py | 19 - .../kaccounts-providers-kf6/pspec.xml | 149 - .../applications/kaddressbook-kf6/actions.py | 21 - .../applications/kaddressbook-kf6/pspec.xml | 187 - .../kaddressbook-kf6/translations.xml | 8 - .../kde6/applications/kalarm-kf6/actions.py | 20 - .../kde6/applications/kalarm-kf6/pspec.xml | 213 - .../kde6/applications/kalgebra-kf6/actions.py | 21 - .../kde6/applications/kalgebra-kf6/pspec.xml | 152 - .../kalgebra-kf6/translations.xml | 8 - .../kde6/applications/kalzium-kf6/actions.py | 19 - .../kde6/applications/kalzium-kf6/pspec.xml | 178 - .../applications/kalzium-kf6/translations.xml | 8 - .../kde6/applications/kamera-kf6/actions.py | 19 - .../kde6/applications/kamera-kf6/pspec.xml | 140 - .../applications/kamera-kf6/translations.xml | 8 - .../kde6/applications/kanagram-kf6/actions.py | 21 - .../kde6/applications/kanagram-kf6/pspec.xml | 150 - .../kanagram-kf6/translations.xml | 8 - .../kde6/applications/kapman-kf6/actions.py | 20 - .../kde6/applications/kapman-kf6/pspec.xml | 152 - .../applications/kapman-kf6/translations.xml | 8 - .../applications/kapptemplate-kf6/actions.py | 19 - .../applications/kapptemplate-kf6/pspec.xml | 140 - .../kapptemplate-kf6/translations.xml | 8 - desktop/kde6/applications/kate-kf6/actions.py | 20 - .../kate-kf6/files/36ede44f.patch | 153 - .../kate-kf6/files/e002696b.patch | 38 - .../files/kate-17.04.0-allow-root.patch | 36 - .../files/kwrite-17.04.0-allow-root.patch | 36 - .../kate-kf6/files/org.kde.kate.desktop | 132 - desktop/kde6/applications/kate-kf6/pspec.xml | 198 - .../kde6/applications/katomic-kf6/actions.py | 21 - .../kde6/applications/katomic-kf6/pspec.xml | 154 - .../applications/katomic-kf6/translations.xml | 8 - .../applications/kblackbox-kf6/actions.py | 19 - .../kde6/applications/kblackbox-kf6/pspec.xml | 154 - .../kblackbox-kf6/translations.xml | 8 - .../kde6/applications/kblocks-kf6/actions.py | 19 - .../kde6/applications/kblocks-kf6/pspec.xml | 151 - .../applications/kblocks-kf6/translations.xml | 8 - .../kde6/applications/kbounce-kf6/actions.py | 19 - .../kde6/applications/kbounce-kf6/pspec.xml | 157 - .../applications/kbounce-kf6/translations.xml | 8 - .../applications/kbreakout-kf6/actions.py | 19 - .../kde6/applications/kbreakout-kf6/pspec.xml | 156 - .../kbreakout-kf6/translations.xml | 8 - .../kde6/applications/kbruch-kf6/actions.py | 21 - .../kde6/applications/kbruch-kf6/pspec.xml | 139 - .../applications/kbruch-kf6/translations.xml | 8 - .../kde6/applications/kcalc-kf6/actions.py | 19 - desktop/kde6/applications/kcalc-kf6/pspec.xml | 146 - .../applications/kcalc-kf6/translations.xml | 8 - .../applications/kcalutils-kf6/actions.py | 20 - .../kcalutils-kf6/files/qt5.patch | 13 - .../kde6/applications/kcalutils-kf6/pspec.xml | 169 - .../applications/kcharselect-kf6/actions.py | 19 - .../applications/kcharselect-kf6/pspec.xml | 138 - .../kcharselect-kf6/translations.xml | 8 - .../applications/kcolorchooser-kf6/actions.py | 19 - .../applications/kcolorchooser-kf6/pspec.xml | 133 - .../kcolorchooser-kf6/translations.xml | 8 - .../kde6/applications/kcron-kf6/actions.py | 19 - desktop/kde6/applications/kcron-kf6/pspec.xml | 145 - .../applications/kcron-kf6/translations.xml | 8 - .../kde-dev-scripts-kf6/actions.py | 18 - .../kde-dev-scripts-kf6/pspec.xml | 128 - .../kde-dev-scripts-kf6/translations.xml | 8 - .../kdebugsettings-kf6/actions.py | 19 - .../applications/kdebugsettings-kf6/pspec.xml | 144 - .../applications/kdeconnect-kf6/actions.py | 20 - .../applications/kdeconnect-kf6/pspec.xml | 205 - .../kdeconnect-kf6/translations.xml | 8 - .../applications/kdeedu-data-kf6/actions.py | 19 - .../applications/kdeedu-data-kf6/pspec.xml | 116 - .../kdegraphics-mobipocket-kf6/actions.py | 19 - .../kdegraphics-mobipocket-kf6/pspec.xml | 139 - .../translations.xml | 8 - .../kdegraphics-svgpart-kf6/actions.py | 20 - .../kdegraphics-svgpart-kf6/pspec.xml | 135 - .../kdegraphics-thumbnailers-kf6/actions.py | 19 - .../kdegraphics-thumbnailers-kf6/pspec.xml | 132 - .../translations.xml | 8 - .../kdenetwork-filesharing-kf6/actions.py | 19 - .../kdenetwork-filesharing-kf6/pspec.xml | 147 - .../translations.xml | 8 - .../kde6/applications/kdenlive-kf6/actions.py | 19 - .../kdenlive-kf6/files/kdenlive-mlt6.patch | 22 - .../kde6/applications/kdenlive-kf6/pspec.xml | 210 - .../kdenlive-kf6/translations.xml | 11 - .../applications/kdepim-addons-kf6/actions.py | 20 - .../applications/kdepim-addons-kf6/pspec.xml | 259 - .../kdepim-runtime-kf6/actions.py | 19 - .../kdepim-runtime-kf6/files/2fd3604a.patch | 60 - .../kdepim-runtime-kf6/files/c99afc75.patch | 120 - .../kdepim-runtime-kf6/files/fb0d78fb.patch | 1302 - .../applications/kdepim-runtime-kf6/pspec.xml | 228 - .../kdepim-runtime-kf6/translations.xml | 8 - .../kdesdk-thumbnailers-kf6/actions.py | 21 - .../kdesdk-thumbnailers-kf6/pspec.xml | 140 - desktop/kde6/applications/kdf-kf6/actions.py | 20 - desktop/kde6/applications/kdf-kf6/pspec.xml | 148 - .../kde6/applications/kdiagram-kf6/actions.py | 21 - .../kde6/applications/kdiagram-kf6/pspec.xml | 116 - .../kde6/applications/kdialog-kf6/actions.py | 19 - .../kde6/applications/kdialog-kf6/pspec.xml | 162 - .../kde6/applications/kdiamond-kf6/actions.py | 21 - .../kde6/applications/kdiamond-kf6/pspec.xml | 156 - .../kdiamond-kf6/translations.xml | 8 - .../keditbookmarks-kf6/actions.py | 18 - .../applications/keditbookmarks-kf6/pspec.xml | 153 - .../kde6/applications/kfind-kf6/actions.py | 16 - desktop/kde6/applications/kfind-kf6/pspec.xml | 156 - .../applications/kfourinline-kf6/actions.py | 21 - .../applications/kfourinline-kf6/pspec.xml | 159 - .../kfourinline-kf6/translations.xml | 8 - .../applications/kgeography-kf6/actions.py | 21 - .../applications/kgeography-kf6/pspec.xml | 143 - .../kgeography-kf6/translations.xml | 8 - desktop/kde6/applications/kget-kf6/actions.py | 18 - desktop/kde6/applications/kget-kf6/pspec.xml | 187 - .../applications/kget-kf6/translations.xml | 8 - desktop/kde6/applications/kgpg-kf6/actions.py | 20 - desktop/kde6/applications/kgpg-kf6/pspec.xml | 180 - .../kde6/applications/khangman-kf6/actions.py | 20 - .../kde6/applications/khangman-kf6/pspec.xml | 151 - .../khangman-kf6/translations.xml | 8 - .../applications/khelpcenter-kf6/actions.py | 20 - .../applications/khelpcenter-kf6/pspec.xml | 166 - .../kidentitymanagement-kf6/actions.py | 19 - .../kidentitymanagement-kf6/pspec.xml | 176 - desktop/kde6/applications/kig-kf6/actions.py | 22 - desktop/kde6/applications/kig-kf6/pspec.xml | 153 - .../applications/kig-kf6/translations.xml | 8 - .../kde6/applications/killbots-kf6/actions.py | 21 - .../kde6/applications/killbots-kf6/pspec.xml | 154 - .../killbots-kf6/translations.xml | 8 - .../kde6/applications/kimap-kf6/actions.py | 19 - .../applications/kimap-kf6/files/qt5.patch | 13 - desktop/kde6/applications/kimap-kf6/pspec.xml | 157 - .../applications/kio-admin-kf6/actions.py | 19 - .../kde6/applications/kio-admin-kf6/pspec.xml | 138 - .../kio-admin-kf6/translations.xml | 8 - .../applications/kio-extras-kf6/actions.py | 25 - .../applications/kio-extras-kf6/pspec.xml | 226 - .../applications/kio-gdrive-kf6/actions.py | 21 - .../applications/kio-gdrive-kf6/pspec.xml | 150 - .../kio-gdrive-kf6/translations.xml | 8 - .../applications/kio-zeroconf-kf6/actions.py | 19 - .../applications/kio-zeroconf-kf6/pspec.xml | 143 - .../kio-zeroconf-kf6/translations.xml | 8 - .../kde6/applications/kiriki-kf6/actions.py | 21 - .../kde6/applications/kiriki-kf6/pspec.xml | 149 - .../applications/kiriki-kf6/translations.xml | 8 - .../kde6/applications/kiten-kf6/actions.py | 19 - desktop/kde6/applications/kiten-kf6/pspec.xml | 167 - .../applications/kiten-kf6/translations.xml | 13 - .../applications/kitinerary-kf6/actions.py | 19 - .../applications/kitinerary-kf6/pspec.xml | 171 - .../kitinerary-kf6/translations.xml | 8 - .../applications/kjumpingcube-kf6/actions.py | 21 - .../applications/kjumpingcube-kf6/pspec.xml | 153 - .../kjumpingcube-kf6/translations.xml | 8 - .../kde6/applications/kldap-kf6/actions.py | 16 - desktop/kde6/applications/kldap-kf6/pspec.xml | 160 - .../applications/kleopatra-kf6/actions.py | 18 - .../kleopatra-kf6/files/qt5.patch | 35 - .../kde6/applications/kleopatra-kf6/pspec.xml | 178 - .../kde6/applications/klettres-kf6/actions.py | 20 - .../kde6/applications/klettres-kf6/pspec.xml | 150 - .../klettres-kf6/translations.xml | 8 - .../kde6/applications/klickety-kf6/actions.py | 21 - .../kde6/applications/klickety-kf6/pspec.xml | 158 - .../klickety-kf6/translations.xml | 8 - .../kde6/applications/klines-kf6/actions.py | 21 - .../kde6/applications/klines-kf6/pspec.xml | 152 - .../applications/klines-kf6/translations.xml | 8 - .../applications/kmahjongg-kf6/actions.py | 19 - .../kde6/applications/kmahjongg-kf6/pspec.xml | 151 - .../kmahjongg-kf6/translations.xml | 8 - .../kmail-account-wizard-kf6/actions.py | 21 - .../kmail-account-wizard-kf6/pspec.xml | 175 - .../kde6/applications/kmail-kf6/actions.py | 21 - desktop/kde6/applications/kmail-kf6/pspec.xml | 236 - .../kmailtransport-kf6/actions.py | 19 - .../applications/kmailtransport-kf6/pspec.xml | 176 - .../kde6/applications/kmbox-kf6/actions.py | 19 - .../applications/kmbox-kf6/files/qt5.patch | 13 - desktop/kde6/applications/kmbox-kf6/pspec.xml | 146 - .../kde6/applications/kmime-kf6/actions.py | 19 - .../applications/kmime-kf6/files/qt5.patch | 53 - desktop/kde6/applications/kmime-kf6/pspec.xml | 148 - .../kde6/applications/kmines-kf6/actions.py | 21 - .../kde6/applications/kmines-kf6/pspec.xml | 150 - .../applications/kmines-kf6/translations.xml | 8 - desktop/kde6/applications/kmix-kf6/actions.py | 21 - desktop/kde6/applications/kmix-kf6/pspec.xml | 196 - .../applications/kmix-kf6/translations.xml | 8 - .../kde6/applications/kmplot-kf6/actions.py | 20 - .../kmplot-kf6/files/kmplot-isnan.patch | 42 - .../kde6/applications/kmplot-kf6/pspec.xml | 149 - .../applications/knavalbattle-kf6/actions.py | 21 - .../applications/knavalbattle-kf6/pspec.xml | 154 - .../knavalbattle-kf6/translations.xml | 8 - .../kde6/applications/knetwalk-kf6/actions.py | 21 - .../kde6/applications/knetwalk-kf6/pspec.xml | 156 - .../knetwalk-kf6/translations.xml | 8 - .../applications/kollision-kf6/actions.py | 21 - .../kde6/applications/kollision-kf6/pspec.xml | 151 - .../kollision-kf6/translations.xml | 8 - .../applications/kolourpaint-kf6/actions.py | 21 - .../applications/kolourpaint-kf6/pspec.xml | 156 - .../kolourpaint-kf6/translations.xml | 8 - .../kde6/applications/kompare-kf6/actions.py | 19 - .../kde6/applications/kompare-kf6/pspec.xml | 188 - .../applications/kompare-kf6/translations.xml | 8 - .../applications/konqueror-kf6/actions.py | 23 - .../konqueror-kf6/files/konquerorkcfg.patch | 12 - .../kde6/applications/konqueror-kf6/pspec.xml | 229 - .../kde6/applications/konsole-kf6/actions.py | 19 - .../kde6/applications/konsole-kf6/pspec.xml | 171 - .../kde6/applications/kontact-kf6/actions.py | 21 - .../kde6/applications/kontact-kf6/pspec.xml | 172 - .../kontactinterface-kf6/actions.py | 19 - .../kontactinterface-kf6/pspec.xml | 153 - .../applications/konversation-kf6/actions.py | 22 - .../applications/konversation-kf6/pspec.xml | 144 - .../applications/korganizer-kf6/actions.py | 21 - .../applications/korganizer-kf6/pspec.xml | 206 - desktop/kde6/applications/kpat-kf6/actions.py | 19 - desktop/kde6/applications/kpat-kf6/pspec.xml | 175 - .../applications/kpimtextedit-kf6/actions.py | 19 - .../kpimtextedit-kf6/files/qt5.patch | 24 - .../applications/kpimtextedit-kf6/pspec.xml | 182 - .../kde6/applications/kpkpass-kf6/actions.py | 19 - .../kde6/applications/kpkpass-kf6/pspec.xml | 144 - .../applications/kpkpass-kf6/translations.xml | 8 - .../kde6/applications/kpmcore-kf6/actions.py | 26 - .../kde6/applications/kpmcore-kf6/pspec.xml | 196 - .../kqtquickcharts-kf6/actions.py | 22 - .../applications/kqtquickcharts-kf6/pspec.xml | 146 - desktop/kde6/applications/krdc-kf6/actions.py | 19 - desktop/kde6/applications/krdc-kf6/pspec.xml | 187 - .../applications/krdc-kf6/translations.xml | 8 - desktop/kde6/applications/krfb-kf6/actions.py | 19 - desktop/kde6/applications/krfb-kf6/pspec.xml | 185 - .../applications/krfb-kf6/translations.xml | 8 - .../kross-interpreters-kf6/actions.py | 21 - .../kross-interpreters-kf6/pspec.xml | 148 - .../kde6/applications/kruler-kf6/actions.py | 20 - .../kde6/applications/kruler-kf6/pspec.xml | 144 - .../applications/kruler-kf6/translations.xml | 8 - .../applications/ksanecore-kf6/actions.py | 19 - .../kde6/applications/ksanecore-kf6/pspec.xml | 144 - .../ksanecore-kf6/translations.xml | 8 - .../kde6/applications/kshisen-kf6/actions.py | 19 - .../kde6/applications/kshisen-kf6/pspec.xml | 152 - .../applications/kshisen-kf6/translation.xml | 8 - .../kde6/applications/ksmtp-kf6/actions.py | 19 - desktop/kde6/applications/ksmtp-kf6/pspec.xml | 152 - .../applications/ksmtp-kf6/translations.xml | 8 - .../kde6/applications/ksquares-kf6/actions.py | 21 - .../kde6/applications/ksquares-kf6/pspec.xml | 153 - .../ksquares-kf6/translations.xml | 8 - .../kde6/applications/ksudoku-kf6/actions.py | 21 - .../kde6/applications/ksudoku-kf6/pspec.xml | 157 - .../applications/ksudoku-kf6/translations.xml | 8 - .../applications/ksystemlog-kf6/actions.py | 19 - .../applications/ksystemlog-kf6/pspec.xml | 158 - .../ksystemlog-kf6/translations.xml | 8 - .../kde6/applications/kteatime-kf6/actions.py | 22 - .../kde6/applications/kteatime-kf6/pspec.xml | 147 - .../kteatime-kf6/translations.xml | 8 - .../kde6/applications/ktimer-kf6/actions.py | 19 - .../kde6/applications/ktimer-kf6/pspec.xml | 144 - .../applications/ktimer-kf6/translations.xml | 8 - .../kde6/applications/ktnef-kf6/actions.py | 19 - .../applications/ktnef-kf6/files/qt5.patch | 12 - desktop/kde6/applications/ktnef-kf6/pspec.xml | 157 - .../kde6/applications/ktorrent-kf6/actions.py | 19 - .../kde6/applications/ktorrent-kf6/pspec.xml | 194 - .../ktorrent-kf6/translations.xml | 8 - .../applications/ktuberling-kf6/actions.py | 19 - .../applications/ktuberling-kf6/pspec.xml | 163 - .../kde6/applications/kturtle-kf6/actions.py | 20 - .../kde6/applications/kturtle-kf6/pspec.xml | 153 - .../applications/kturtle-kf6/translations.xml | 8 - .../kwalletmanager-kf6/actions.py | 19 - .../applications/kwalletmanager-kf6/pspec.xml | 178 - .../kwalletmanager-kf6/translations.xml | 8 - .../kde6/applications/kwave-kf6/actions.py | 21 - desktop/kde6/applications/kwave-kf6/pspec.xml | 170 - .../applications/kwordquiz-kf6/actions.py | 19 - .../kde6/applications/kwordquiz-kf6/pspec.xml | 177 - .../applications/libgravatar-kf6/actions.py | 19 - .../libgravatar-kf6/files/qt5.patch | 12 - .../applications/libgravatar-kf6/pspec.xml | 188 - .../kde6/applications/libkcddb-kf6/actions.py | 22 - .../kde6/applications/libkcddb-kf6/pspec.xml | 151 - .../libkcddb-kf6/translations.xml | 8 - .../libkcompactdisc-kf6/actions.py | 19 - .../libkcompactdisc-kf6/pspec.xml | 158 - .../applications/libkdcraw-kf6/actions.py | 16 - .../kde6/applications/libkdcraw-kf6/pspec.xml | 150 - .../libkdcraw-kf6/translations.xml | 13 - .../applications/libkdegames-kf6/actions.py | 19 - .../applications/libkdegames-kf6/pspec.xml | 185 - .../applications/libkdepim-kf6/actions.py | 16 - .../libkdepim-kf6/files/qt5.patch | 25 - .../kde6/applications/libkdepim-kf6/pspec.xml | 194 - .../libkeduvocdocument-kf6/actions.py | 19 - .../libkeduvocdocument-kf6/pspec.xml | 142 - .../applications/libkexiv2-kf6/actions.py | 16 - .../kde6/applications/libkexiv2-kf6/pspec.xml | 138 - .../libkexiv2-kf6/translations.xml | 13 - .../kde6/applications/libkgapi-kf6/actions.py | 19 - .../libkgapi-kf6/files/DateTime.patch | 15 - .../libkgapi-kf6/files/latitudeservice.patch | 11 - .../applications/libkgapi-kf6/files/qt5.patch | 12 - .../kde6/applications/libkgapi-kf6/pspec.xml | 173 - .../kde6/applications/libkleo-kf6/actions.py | 18 - .../applications/libkleo-kf6/files/qt5.patch | 38 - .../kde6/applications/libkleo-kf6/pspec.xml | 220 - .../applications/libkmahjongg-kf6/actions.py | 19 - .../applications/libkmahjongg-kf6/pspec.xml | 152 - .../libkomparediff2-kf6/actions.py | 19 - .../libkomparediff2-kf6/pspec.xml | 178 - .../kde6/applications/libksane-kf6/actions.py | 18 - .../kde6/applications/libksane-kf6/pspec.xml | 148 - .../libksane-kf6/translations.xml | 13 - .../applications/libksieve-kf6/actions.py | 19 - .../libksieve-kf6/files/qt5.patch | 35 - .../kde6/applications/libksieve-kf6/pspec.xml | 196 - .../applications/libktorrent-kf6/actions.py | 19 - .../applications/libktorrent-kf6/pspec.xml | 155 - .../libktorrent-kf6/translations.xml | 13 - .../kde6/applications/lokalize-kf6/actions.py | 21 - .../lokalize_build_with_hunspell1.6.patch | 11 - .../kde6/applications/lokalize-kf6/pspec.xml | 215 - .../lokalize-kf6/translations.xml | 8 - .../applications/mailcommon-kf6/actions.py | 20 - .../applications/mailcommon-kf6/pspec.xml | 213 - .../applications/mailimporter-kf6/actions.py | 20 - .../mailimporter-kf6/files/qt5.patch | 25 - .../applications/mailimporter-kf6/pspec.xml | 183 - .../kde6/applications/marble-kf6/actions.py | 28 - .../kde6/applications/marble-kf6/pspec.xml | 185 - .../applications/marble-kf6/translations.xml | 13 - .../applications/messagelib-kf6/actions.py | 22 - .../applications/messagelib-kf6/pspec.xml | 245 - .../applications/mimetreeparser/actions.py | 19 - .../applications/mimetreeparser/pspec.xml | 163 - .../mimetreeparser/translations.xml | 8 - .../kde6/applications/minuet-kf6/actions.py | 19 - .../minuet-kf6/files/qtfix2.patch | 13 - .../minuet-kf6/files/qtfixc.patch | 14 - .../kde6/applications/minuet-kf6/pspec.xml | 167 - .../kde6/applications/okular-kf6/actions.py | 22 - .../kde6/applications/okular-kf6/pspec.xml | 226 - .../applications/okular-kf6/translations.xml | 13 - .../kde6/applications/parley-kf6/actions.py | 20 - .../kde6/applications/parley-kf6/pspec.xml | 177 - .../applications/parley-kf6/translations.xml | 8 - .../partitionmanager-kf6/actions.py | 19 - .../partitionmanager-kf6/pspec.xml | 159 - .../partitionmanager-kf6/translations.xml | 8 - .../kde6/applications/picmi-kf6/actions.py | 21 - desktop/kde6/applications/picmi-kf6/pspec.xml | 145 - .../applications/picmi-kf6/translations.xml | 8 - .../pim-data-exporter-kf6/actions.py | 21 - .../pim-data-exporter-kf6/pspec.xml | 189 - .../pim-sieve-editor-kf6/actions.py | 21 - .../pim-sieve-editor-kf6/pspec.xml | 160 - .../applications/pimcommon-kf6/actions.py | 17 - .../pimcommon-kf6/files/qt5.patch | 12 - .../kde6/applications/pimcommon-kf6/pspec.xml | 234 - .../kde6/applications/poxml-kf6/actions.py | 23 - desktop/kde6/applications/poxml-kf6/pspec.xml | 140 - .../applications/poxml-kf6/translations.xml | 8 - desktop/kde6/applications/rocs-kf6/actions.py | 21 - desktop/kde6/applications/rocs-kf6/pspec.xml | 220 - .../signon-kwallet-extension-kf6/actions.py | 19 - .../signon-kwallet-extension-kf6/pspec.xml | 124 - .../applications/spectacle-kf6/actions.py | 21 - .../kde6/applications/spectacle-kf6/pspec.xml | 203 - .../spectacle-kf6/translations.xml | 8 - desktop/kde6/applications/step-kf6/actions.py | 20 - desktop/kde6/applications/step-kf6/pspec.xml | 164 - .../kde6/applications/umbrello-kf6/actions.py | 25 - .../umbrello-kf6/files/upstream.patch | 77852 ---------------- .../kde6/applications/umbrello-kf6/pspec.xml | 213 - .../umbrello-kf6/translations.xml | 8 - desktop/kde6/component.xml | 3 - desktop/kde6/framework/attica-kf6/actions.py | 19 - desktop/kde6/framework/attica-kf6/pspec.xml | 130 - .../framework/attica-kf6/translations.xml | 13 - desktop/kde6/framework/baloo-kf6/actions.py | 21 - desktop/kde6/framework/baloo-kf6/pspec.xml | 177 - .../kde6/framework/bluez-qt-kf6/actions.py | 17 - desktop/kde6/framework/bluez-qt-kf6/pspec.xml | 138 - .../framework/breeze-icons-kf6/actions.py | 19 - .../breeze-icons-kf6/files/250a7d0b.patch | 62 - .../breeze-icons-kf6/files/breeze-16.svg | 308 - .../breeze-icons-kf6/files/breeze-22.svg | 308 - .../breeze-icons-kf6/files/breeze-64.svg | 308 - .../breeze-icons-kf6/files/breeze-96.svg | 308 - .../breeze-icons-kf6/files/breeze-dark-16.svg | 358 - .../breeze-icons-kf6/files/breeze-dark-22.svg | 358 - .../breeze-icons-kf6/files/breeze-dark-48.svg | 358 - .../breeze-icons-kf6/files/breeze-dark-96.svg | 358 - .../breeze-icons-kf6/files/breeze-dark.svg | 358 - .../breeze-icons-kf6/files/breeze.patch | 11 - .../breeze-icons-kf6/files/breeze.svg | 317 - .../kde6/framework/breeze-icons-kf6/pspec.xml | 136 - desktop/kde6/framework/component.xml | 3 - .../extra-cmake-modules-kf6/actions.py | 22 - .../extra-cmake-modules-kf6/pspec.xml | 115 - .../frameworkintegration-kf6/actions.py | 19 - .../frameworkintegration-kf6/pspec.xml | 162 - desktop/kde6/framework/kapidox-kf6/actions.py | 19 - .../files/fedora/kf5-kapidox-install.patch | 51 - desktop/kde6/framework/kapidox-kf6/pspec.xml | 120 - .../framework/kapidox-kf6/translations.xml | 8 - .../kde6/framework/karchive-kf6/actions.py | 19 - desktop/kde6/framework/karchive-kf6/pspec.xml | 142 - desktop/kde6/framework/kauth-kf6/actions.py | 19 - desktop/kde6/framework/kauth-kf6/pspec.xml | 138 - .../kde6/framework/kbookmarks-kf6/actions.py | 19 - .../kde6/framework/kbookmarks-kf6/pspec.xml | 151 - .../framework/kcalendarcore-kf6/actions.py | 19 - .../framework/kcalendarcore-kf6/pspec.xml | 132 - .../kcalendarcore-kf6/translations.xml | 8 - .../kde6/framework/kcmutils-kf6/actions.py | 19 - desktop/kde6/framework/kcmutils-kf6/pspec.xml | 162 - desktop/kde6/framework/kcodecs-kf6/actions.py | 19 - desktop/kde6/framework/kcodecs-kf6/pspec.xml | 133 - .../framework/kcolorscheme-kf6/actions.py | 19 - .../kde6/framework/kcolorscheme-kf6/pspec.xml | 142 - .../kcolorscheme-kf6/translations.xml | 8 - .../kde6/framework/kcompletion-kf6/actions.py | 19 - .../kde6/framework/kcompletion-kf6/pspec.xml | 143 - desktop/kde6/framework/kconfig-kf6/actions.py | 19 - desktop/kde6/framework/kconfig-kf6/pspec.xml | 137 - .../framework/kconfigwidgets-kf6/actions.py | 19 - .../kconfigwidgets-kf6/comar/package.py | 6 - .../framework/kconfigwidgets-kf6/pspec.xml | 164 - .../kde6/framework/kcontacts-kf6/actions.py | 19 - .../framework/kcontacts-kf6/files/qt5.patch | 25 - .../kde6/framework/kcontacts-kf6/pspec.xml | 148 - .../kde6/framework/kcoreaddons-kf6/actions.py | 19 - .../kcoreaddons-kf6/comar/package.py | 8 - .../kde6/framework/kcoreaddons-kf6/pspec.xml | 144 - desktop/kde6/framework/kcrash-kf6/actions.py | 19 - desktop/kde6/framework/kcrash-kf6/pspec.xml | 136 - desktop/kde6/framework/kdav-kf6/actions.py | 16 - .../kde6/framework/kdav-kf6/files/qt5.patch | 12 - desktop/kde6/framework/kdav-kf6/pspec.xml | 162 - .../kde6/framework/kdav-kf6/translations.xml | 13 - .../kde6/framework/kdbusaddons-kf6/actions.py | 19 - .../kde6/framework/kdbusaddons-kf6/pspec.xml | 133 - .../framework/kdeclarative-kf6/actions.py | 19 - .../kde6/framework/kdeclarative-kf6/pspec.xml | 173 - desktop/kde6/framework/kded-kf6/actions.py | 21 - desktop/kde6/framework/kded-kf6/pspec.xml | 144 - desktop/kde6/framework/kdesu-kf6/actions.py | 19 - desktop/kde6/framework/kdesu-kf6/pspec.xml | 144 - desktop/kde6/framework/kdnssd-kf6/actions.py | 19 - desktop/kde6/framework/kdnssd-kf6/pspec.xml | 133 - .../kde6/framework/kdoctools-kf6/actions.py | 19 - .../kdoctools-kf6/files/docbook.patch | 12 - .../kde6/framework/kdoctools-kf6/pspec.xml | 150 - .../framework/kfilemetadata-kf6/actions.py | 16 - .../framework/kfilemetadata-kf6/pspec.xml | 169 - .../framework/kglobalaccel-kf6/actions.py | 19 - .../kde6/framework/kglobalaccel-kf6/pspec.xml | 148 - .../kde6/framework/kguiaddons-kf6/actions.py | 19 - .../kde6/framework/kguiaddons-kf6/pspec.xml | 138 - .../kde6/framework/kholidays-kf6/actions.py | 16 - .../framework/kholidays-kf6/files/qt5.patch | 12 - .../kholidays-kf6/files/sunrise-fix.patch | 21 - .../kde6/framework/kholidays-kf6/pspec.xml | 141 - desktop/kde6/framework/ki18n-kf6/actions.py | 19 - desktop/kde6/framework/ki18n-kf6/pspec.xml | 133 - .../kde6/framework/ki18n-kf6/translations.xml | 13 - .../kde6/framework/kiconthemes-kf6/actions.py | 19 - .../kde6/framework/kiconthemes-kf6/pspec.xml | 166 - .../kde6/framework/kidletime-kf6/actions.py | 19 - .../kde6/framework/kidletime-kf6/pspec.xml | 144 - .../framework/kimageformats-kf6/actions.py | 19 - .../framework/kimageformats-kf6/pspec.xml | 125 - desktop/kde6/framework/kio-kf6/actions.py | 21 - .../framework/kio-kf6/files/6e7775d3.patch | 34 - .../framework/kio-kf6/files/8ad69215.patch | 53 - desktop/kde6/framework/kio-kf6/pspec.xml | 235 - .../framework/kirigami-addons-kf6/actions.py | 22 - .../framework/kirigami-addons-kf6/pspec.xml | 169 - .../kirigami-addons-kf6/translations.xml | 8 - .../kde6/framework/kirigami-kf6/actions.py | 34 - desktop/kde6/framework/kirigami-kf6/pspec.xml | 138 - .../kde6/framework/kitemmodels-kf6/actions.py | 19 - .../kde6/framework/kitemmodels-kf6/pspec.xml | 133 - .../kde6/framework/kitemviews-kf6/actions.py | 20 - .../kde6/framework/kitemviews-kf6/pspec.xml | 133 - .../kde6/framework/kjobwidgets-kf6/actions.py | 19 - .../kde6/framework/kjobwidgets-kf6/pspec.xml | 141 - .../kde6/framework/knewstuff-kf6/actions.py | 19 - .../knewstuff-kf6/files/49f2037a.patch | 42 - .../knewstuff-kf6/files/4f01e2ff.patch | 51 - .../kde6/framework/knewstuff-kf6/pspec.xml | 187 - .../framework/knotifications-kf6/actions.py | 19 - .../framework/knotifications-kf6/pspec.xml | 166 - .../framework/knotifyconfig-kf6/actions.py | 19 - .../framework/knotifyconfig-kf6/pspec.xml | 160 - .../kde6/framework/kpackage-kf6/actions.py | 20 - desktop/kde6/framework/kpackage-kf6/pspec.xml | 148 - .../framework/kpackage-kf6/translations.xml | 8 - desktop/kde6/framework/kparts-kf6/actions.py | 19 - desktop/kde6/framework/kparts-kf6/pspec.xml | 167 - desktop/kde6/framework/kpeople-kf6/actions.py | 20 - desktop/kde6/framework/kpeople-kf6/pspec.xml | 157 - .../kde6/framework/kplotting-kf6/actions.py | 19 - .../kde6/framework/kplotting-kf6/pspec.xml | 129 - desktop/kde6/framework/kpty-kf6/actions.py | 19 - desktop/kde6/framework/kpty-kf6/pspec.xml | 141 - .../framework/kquickcharts-kf6/actions.py | 19 - .../kde6/framework/kquickcharts-kf6/pspec.xml | 120 - .../kquickcharts-kf6/translations.xml | 8 - desktop/kde6/framework/krunner-kf6/actions.py | 19 - desktop/kde6/framework/krunner-kf6/pspec.xml | 159 - .../kde6/framework/kservice-kf6/actions.py | 19 - desktop/kde6/framework/kservice-kf6/pspec.xml | 154 - .../kstatusnotifieritem-kf6/actions.py | 19 - .../kstatusnotifieritem-kf6/pspec.xml | 137 - .../kstatusnotifieritem-kf6/translations.xml | 8 - desktop/kde6/framework/ksvg-kf6/actions.py | 19 - desktop/kde6/framework/ksvg-kf6/pspec.xml | 155 - .../kde6/framework/ksvg-kf6/translations.xml | 8 - .../framework/ksyndication-kf6/actions.py | 19 - .../kde6/framework/ksyndication-kf6/pspec.xml | 134 - .../kde6/framework/ktexteditor-kf6/actions.py | 22 - .../kde6/framework/ktexteditor-kf6/pspec.xml | 192 - .../framework/ktexttemplate-kf6/actions.py | 19 - .../framework/ktexttemplate-kf6/pspec.xml | 135 - .../ktexttemplate-kf6/translations.xml | 8 - .../framework/ktextwidgets-kf6/actions.py | 19 - .../kde6/framework/ktextwidgets-kf6/pspec.xml | 159 - .../framework/kunitconversion-kf6/actions.py | 20 - .../framework/kunitconversion-kf6/pspec.xml | 133 - .../framework/kuserfeedback-kf6/actions.py | 24 - .../framework/kuserfeedback-kf6/pspec.xml | 146 - .../kuserfeedback-kf6/translations.xml | 8 - desktop/kde6/framework/kwallet-kf6/actions.py | 21 - desktop/kde6/framework/kwallet-kf6/pspec.xml | 174 - .../framework/kwidgetsaddons-kf6/actions.py | 19 - .../framework/kwidgetsaddons-kf6/pspec.xml | 154 - .../framework/kwindowsystem-kf6/actions.py | 19 - .../framework/kwindowsystem-kf6/pspec.xml | 159 - desktop/kde6/framework/kxmlgui-kf6/actions.py | 19 - desktop/kde6/framework/kxmlgui-kf6/pspec.xml | 163 - .../framework/modemmanager-qt-kf6/actions.py | 19 - .../framework/modemmanager-qt-kf6/pspec.xml | 134 - .../networkmanager-qt-kf6/actions.py | 19 - .../framework/networkmanager-qt-kf6/pspec.xml | 143 - .../framework/oxygen-icons-kf6/actions.py | 18 - .../oxygen-icons-kf6/files/128x128.png | Bin 6090 -> 0 bytes .../oxygen-icons-kf6/files/16x16.png | Bin 506 -> 0 bytes .../oxygen-icons-kf6/files/22x22.png | Bin 748 -> 0 bytes .../oxygen-icons-kf6/files/256x256.png | Bin 12795 -> 0 bytes .../oxygen-icons-kf6/files/32x32.png | Bin 1147 -> 0 bytes .../oxygen-icons-kf6/files/48x48.png | Bin 1908 -> 0 bytes .../oxygen-icons-kf6/files/64x64.png | Bin 2754 -> 0 bytes .../oxygen-icons-kf6/files/logotype-pisi.svg | 317 - .../kde6/framework/oxygen-icons-kf6/pspec.xml | 66 - .../plasma-wayland-protocols-kf6/actions.py | 19 - .../files/a95fc86f.diff | 93 - .../plasma-wayland-protocols-kf6/pspec.xml | 108 - .../translations.xml | 8 - desktop/kde6/framework/prison-kf6/actions.py | 19 - desktop/kde6/framework/prison-kf6/pspec.xml | 150 - desktop/kde6/framework/purpose-kf6/actions.py | 21 - desktop/kde6/framework/purpose-kf6/pspec.xml | 162 - .../framework/purpose-kf6/translations.xml | 8 - .../qqc2-desktop-style-kf6/actions.py | 19 - .../qqc2-desktop-style-kf6/pspec.xml | 126 - desktop/kde6/framework/solid-kf6/actions.py | 19 - desktop/kde6/framework/solid-kf6/pspec.xml | 159 - desktop/kde6/framework/sonnet-kf6/actions.py | 18 - desktop/kde6/framework/sonnet-kf6/pspec.xml | 141 - .../syntax-highlighting-kf6/actions.py | 22 - .../syntax-highlighting-kf6/pspec.xml | 131 - .../framework/threadweaver-kf6/actions.py | 19 - .../kde6/framework/threadweaver-kf6/pspec.xml | 129 - desktop/kde6/plasma/bluedevil-kf6/actions.py | 19 - desktop/kde6/plasma/bluedevil-kf6/pspec.xml | 210 - .../kde6/plasma/breeze-grub-kf6/actions.py | 12 - desktop/kde6/plasma/breeze-grub-kf6/pspec.xml | 157 - desktop/kde6/plasma/breeze-gtk-kf6/actions.py | 19 - desktop/kde6/plasma/breeze-gtk-kf6/pspec.xml | 174 - desktop/kde6/plasma/breeze-kf6/actions.py | 24 - desktop/kde6/plasma/breeze-kf6/pspec.xml | 349 - .../plasma/breeze-plymouth-kf6/actions.py | 22 - .../breeze-plymouth-kf6/files/pisi.16bit.png | Bin 8380 -> 0 bytes .../breeze-plymouth-kf6/files/pisi.logo.png | Bin 6078 -> 0 bytes .../kde6/plasma/breeze-plymouth-kf6/pspec.xml | 170 - desktop/kde6/plasma/component.xml | 3 - desktop/kde6/plasma/discover-kf6/actions.py | 21 - .../discover-kf6/files/appstream-1.0.patch | 599 - .../plasma/discover-kf6/files/dc67ef22.patch | 193 - desktop/kde6/plasma/discover-kf6/pspec.xml | 259 - desktop/kde6/plasma/drkonqi-kf6/actions.py | 21 - desktop/kde6/plasma/drkonqi-kf6/pspec.xml | 223 - .../kde6/plasma/drkonqi-kf6/translations.xml | 8 - .../plasma/kactivitymanagerd-kf6/actions.py | 23 - .../plasma/kactivitymanagerd-kf6/pspec.xml | 194 - .../kde6/plasma/kde-cli-tools-kf6/actions.py | 19 - .../plasma/kde-cli-tools-kf6/comar/package.py | 7 - .../kde6/plasma/kde-cli-tools-kf6/pspec.xml | 218 - .../kde6/plasma/kde-gtk-config-kf6/actions.py | 24 - .../kde-gtk-config-kf6/files/schemas.patch | 11 - .../kde6/plasma/kde-gtk-config-kf6/pspec.xml | 215 - .../kde6/plasma/kdecorations-kf6/actions.py | 21 - .../kde6/plasma/kdecorations-kf6/pspec.xml | 181 - .../plasma/kdecorations-kf6/translations.xml | 8 - .../plasma/kdeplasma-addons-kf6/actions.py | 19 - .../files/dictionarymatchengine.patch | 12 - .../plasma/kdeplasma-addons-kf6/pspec.xml | 248 - desktop/kde6/plasma/kgamma-kf6/actions.py | 21 - desktop/kde6/plasma/kgamma-kf6/pspec.xml | 186 - .../kde6/plasma/kinfocenter-kf6/actions.py | 21 - .../kinfocenter-kf6/files/kcm-about-distrorc | 4 - .../files/pisilinux-kinfocenter.diff | 91 - .../kinfocenter-kf6/files/pisilinux.svg | 535 - desktop/kde6/plasma/kinfocenter-kf6/pspec.xml | 253 - desktop/kde6/plasma/kmenuedit-kf6/actions.py | 21 - desktop/kde6/plasma/kmenuedit-kf6/pspec.xml | 211 - desktop/kde6/plasma/kpipewire-kf6/actions.py | 19 - desktop/kde6/plasma/kpipewire-kf6/pspec.xml | 220 - .../plasma/kpipewire-kf6/translations.xml | 8 - desktop/kde6/plasma/kscreen-kf6/actions.py | 23 - desktop/kde6/plasma/kscreen-kf6/pspec.xml | 209 - .../kde6/plasma/kscreenlocker-kf6/actions.py | 21 - .../kscreenlocker-kf6/files/no-autolock.patch | 12 - .../kde6/plasma/kscreenlocker-kf6/pspec.xml | 262 - .../kde6/plasma/ksshaskpass-kf6/actions.py | 21 - .../ksshaskpass-kf6/files/ksshaskpass-kf6.sh | 2 - desktop/kde6/plasma/ksshaskpass-kf6/pspec.xml | 183 - .../kde6/plasma/ksystemstats-kf6/actions.py | 21 - .../kde6/plasma/ksystemstats-kf6/pspec.xml | 197 - .../plasma/ksystemstats-kf6/translations.xml | 8 - .../kde6/plasma/kwallet-pam-kf6/actions.py | 19 - desktop/kde6/plasma/kwallet-pam-kf6/pspec.xml | 171 - .../kwayland-integration-kf6/actions.py | 21 - .../plasma/kwayland-integration-kf6/pspec.xml | 193 - desktop/kde6/plasma/kwayland-kf6/actions.py | 19 - desktop/kde6/plasma/kwayland-kf6/pspec.xml | 194 - .../kde6/plasma/kwayland-kf6/translations.xml | 8 - desktop/kde6/plasma/kwin-kf6/actions.py | 21 - desktop/kde6/plasma/kwin-kf6/files/4692.patch | 206 - desktop/kde6/plasma/kwin-kf6/pspec.xml | 397 - desktop/kde6/plasma/kwrited-kf6/actions.py | 21 - desktop/kde6/plasma/kwrited-kf6/pspec.xml | 176 - .../kde6/plasma/layer-shell-qt-kf6/actions.py | 19 - .../kde6/plasma/layer-shell-qt-kf6/pspec.xml | 196 - .../layer-shell-qt-kf6/translations.xml | 8 - desktop/kde6/plasma/libkscreen-kf6/actions.py | 23 - desktop/kde6/plasma/libkscreen-kf6/pspec.xml | 216 - .../kde6/plasma/libksysguard-kf6/actions.py | 19 - .../files/libksysguard_kauth.diff | 339 - .../kde6/plasma/libksysguard-kf6/pspec.xml | 254 - desktop/kde6/plasma/libplasma-kf6/actions.py | 21 - desktop/kde6/plasma/libplasma-kf6/pspec.xml | 269 - desktop/kde6/plasma/milou-kf6/actions.py | 19 - desktop/kde6/plasma/milou-kf6/pspec.xml | 185 - desktop/kde6/plasma/oxygen-kf6/actions.py | 16 - desktop/kde6/plasma/oxygen-kf6/pspec.xml | 200 - .../kde6/plasma/oxygen-sounds-kf6/actions.py | 19 - .../kde6/plasma/oxygen-sounds-kf6/pspec.xml | 164 - .../plasma/oxygen-sounds-kf6/translations.xml | 8 - .../plasma/plasma-activities-kf6/actions.py | 19 - .../files/build-source.patch | 17 - .../files/kamd-rename.patch | 91 - .../plasma/plasma-activities-kf6/pspec.xml | 215 - .../plasma-activities-stats-kf6/actions.py | 20 - .../files/build-source.patch | 17 - .../files/kamd-rename.patch | 91 - .../plasma-activities-stats-kf6/pspec.xml | 196 - .../plasma-browser-integration-kf6/actions.py | 28 - .../plasma-browser-integration-kf6/pspec.xml | 197 - .../kde6/plasma/plasma-desktop-kf6/actions.py | 23 - .../plasma-desktop-kf6/files/ac9ef2b6.patch | 100 - .../plasma-desktop-kf6/files/af9aeecc.patch | 95 - .../plasma-desktop-animation-duration.patch | 140 - .../kde6/plasma/plasma-desktop-kf6/pspec.xml | 325 - .../plasma-desktop-kf6/translations.xml | 8 - .../plasma/plasma-firewall-kf6/actions.py | 19 - .../kde6/plasma/plasma-firewall-kf6/pspec.xml | 190 - .../plasma-firewall-kf6/translations.xml | 8 - .../plasma/plasma-integration-kf6/actions.py | 20 - .../plasma/plasma-integration-kf6/pspec.xml | 299 - desktop/kde6/plasma/plasma-nm-kf6/actions.py | 21 - desktop/kde6/plasma/plasma-nm-kf6/pspec.xml | 250 - desktop/kde6/plasma/plasma-pa-kf6/actions.py | 20 - desktop/kde6/plasma/plasma-pa-kf6/pspec.xml | 204 - .../plasma/plasma-pa-kf6/translations.xml | 8 - desktop/kde6/plasma/plasma-sdk-kf6/actions.py | 19 - desktop/kde6/plasma/plasma-sdk-kf6/pspec.xml | 218 - .../plasma-systemmonitor-kf6/actions.py | 19 - .../plasma/plasma-systemmonitor-kf6/pspec.xml | 215 - .../plasma-systemmonitor-kf6/translations.xml | 8 - .../kde6/plasma/plasma-vault-kf6/actions.py | 21 - .../kde6/plasma/plasma-vault-kf6/pspec.xml | 197 - .../plasma/plasma-vault-kf6/translations.xml | 8 - .../kde6/plasma/plasma-welcome-kf6/actions.py | 19 - .../kde6/plasma/plasma-welcome-kf6/pspec.xml | 205 - .../plasma-welcome-kf6/translations.xml | 8 - .../plasma/plasma-workspace-kf6/actions.py | 34 - .../plasma/plasma-workspace-kf6/comar/kde.pam | 13 - .../files/0001-Rename-qdbus-in-startkde.patch | 32 - ...0003-Remove-export-of-QT_PLUGIN_PATH.patch | 29 - .../plasma-workspace-kf6/files/390890.patch | 41 - .../files/build_fix-qt.patch | 12 - .../files/create_kdehome.patch | 19 - .../plasma-workspace-kf6/files/d5a3e749.patch | 49 - ...02ce50edc3891f1fa41173132c820b917d57.patch | 31 - .../plasma-workspace-kf6/files/kde-env.sh | 19 - .../plasma-workspace-kf6/files/kde-np.pam | 13 - .../plasma/plasma-workspace-kf6/files/kde.pam | 13 - .../files/kscreensaver.pam | 6 - .../files/lockscreen-focus.patch | 17 - .../files/plasma-animation-duration.patch | 94 - .../plasma/plasma-workspace-kf6/pspec.xml | 528 - .../actions.py | 25 - .../plasma-workspace-wallpapers-kf6/pspec.xml | 181 - .../kde6/plasma/plasma5-support/actions.py | 19 - desktop/kde6/plasma/plasma5-support/pspec.xml | 209 - .../plasma/plasma5-support/translations.xml | 8 - .../kde6/plasma/plymouth-kcm-kf6/actions.py | 19 - .../kde6/plasma/plymouth-kcm-kf6/pspec.xml | 191 - .../plasma/plymouth-kcm-kf6/translations.xml | 8 - .../actions.py | 23 - .../pspec.xml | 194 - desktop/kde6/plasma/powerdevil-kf6/actions.py | 23 - .../files/powerdevil-enable-upower.patch | 13 - desktop/kde6/plasma/powerdevil-kf6/pspec.xml | 244 - .../kde6/plasma/print-manager-kf6/actions.py | 16 - .../kde6/plasma/print-manager-kf6/pspec.xml | 189 - .../plasma/print-manager-kf6/translations.xml | 8 - .../kde6/plasma/qqc2-breeze-style/actions.py | 19 - .../kde6/plasma/qqc2-breeze-style/pspec.xml | 180 - .../plasma/qqc2-breeze-style/translations.xml | 8 - desktop/kde6/plasma/sddm-kcm-kf6/actions.py | 21 - desktop/kde6/plasma/sddm-kcm-kf6/pspec.xml | 209 - .../kde6/plasma/sddm-kcm-kf6/translations.xml | 8 - .../plasma/system-settings-kf6/actions.py | 23 - .../kde6/plasma/system-settings-kf6/pspec.xml | 249 - .../xdg-desktop-portal-kde-kf6/actions.py | 23 - .../xdg-desktop-portal-kde-kf6/pspec.xml | 218 - .../translations.xml | 8 - pisi-index.xml | 54053 +---------- pisi-index.xml.sha1sum | 2 +- pisi-index.xml.xz | Bin 1097224 -> 1042212 bytes pisi-index.xml.xz.sha1sum | 2 +- 871 files changed, 2304 insertions(+), 201462 deletions(-) delete mode 100755 desktop/kde6/applications/akonadi-calendar-kf6/actions.py delete mode 100755 desktop/kde6/applications/akonadi-calendar-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/akonadi-calendar-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/akonadi-calendar-tools-kf6/actions.py delete mode 100755 desktop/kde6/applications/akonadi-calendar-tools-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/akonadi-calendar-tools-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/akonadi-contacts-kf6/actions.py delete mode 100755 desktop/kde6/applications/akonadi-contacts-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/akonadi-contacts-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/akonadi-import-wizard-kf6/actions.py delete mode 100755 desktop/kde6/applications/akonadi-import-wizard-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/akonadi-kf6/actions.py delete mode 100644 desktop/kde6/applications/akonadi-kf6/files/akonadi-apparmor.patch delete mode 100755 desktop/kde6/applications/akonadi-kf6/files/dbupdater.diff delete mode 100755 desktop/kde6/applications/akonadi-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/akonadi-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/akonadi-kf6/translations.xml delete mode 100755 desktop/kde6/applications/akonadi-mime-kf6/actions.py delete mode 100755 desktop/kde6/applications/akonadi-mime-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/akonadi-notes-kf6/actions.py delete mode 100755 desktop/kde6/applications/akonadi-notes-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/akonadi-notes-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/akonadi-search-kf6/actions.py delete mode 100755 desktop/kde6/applications/akonadi-search-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/akonadi-search-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/akonadiconsole-kf6/actions.py delete mode 100755 desktop/kde6/applications/akonadiconsole-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/akregator-kf6/actions.py delete mode 100755 desktop/kde6/applications/akregator-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/analitza-kf6/actions.py delete mode 100755 desktop/kde6/applications/analitza-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/analitza-kf6/translations.xml delete mode 100755 desktop/kde6/applications/ark-kf6/actions.py delete mode 100644 desktop/kde6/applications/ark-kf6/files/ark-23.08.2-dont-hardcode-bzip2-mimetype-in-tests.patch delete mode 100644 desktop/kde6/applications/ark-kf6/files/ark-23.08.2-explicitly-support-application-vnd-efi-iso-mime.patch delete mode 100644 desktop/kde6/applications/ark-kf6/files/ark-23.08.2-fix-checks-using-old-ISO-mimetype.patch delete mode 100644 desktop/kde6/applications/ark-kf6/files/ark-23.08.2-fix-support-for-bzip2-format.patch delete mode 100755 desktop/kde6/applications/ark-kf6/files/libzip.patch delete mode 100755 desktop/kde6/applications/ark-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/artikulate-kf6/actions.py delete mode 100755 desktop/kde6/applications/artikulate-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/artikulate-kf6/translations.xml delete mode 100755 desktop/kde6/applications/audiocd-kio-kf6/actions.py delete mode 100755 desktop/kde6/applications/audiocd-kio-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/baloo-widgets-kf6/actions.py delete mode 100755 desktop/kde6/applications/baloo-widgets-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/blinken-kf6/actions.py delete mode 100755 desktop/kde6/applications/blinken-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/blinken-kf6/translations.xml delete mode 100755 desktop/kde6/applications/bomber-kf6/actions.py delete mode 100755 desktop/kde6/applications/bomber-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/bovo-kf6/actions.py delete mode 100755 desktop/kde6/applications/bovo-kf6/files/org.kde.bovo.desktop delete mode 100755 desktop/kde6/applications/bovo-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/calendarsupport-kf6/actions.py delete mode 100755 desktop/kde6/applications/calendarsupport-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/calendarsupport-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/cantor-kf6/actions.py delete mode 100755 desktop/kde6/applications/cantor-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/cantor-kf6/translations.xml delete mode 100644 desktop/kde6/applications/component.xml delete mode 100755 desktop/kde6/applications/dolphin-kf6/actions.py delete mode 100644 desktop/kde6/applications/dolphin-kf6/files/2cd3d58e.patch delete mode 100644 desktop/kde6/applications/dolphin-kf6/files/95551f44.patch delete mode 100644 desktop/kde6/applications/dolphin-kf6/files/a07f2422.patch delete mode 100755 desktop/kde6/applications/dolphin-kf6/files/dolphin-17.04.0-allow-root.patch delete mode 100644 desktop/kde6/applications/dolphin-kf6/files/find-kactivities.patch delete mode 100644 desktop/kde6/applications/dolphin-kf6/files/kdebug-419585.patch delete mode 100755 desktop/kde6/applications/dolphin-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/dolphin-plugins-kf6/actions.py delete mode 100755 desktop/kde6/applications/dolphin-plugins-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/dolphin-plugins-kf6/translations.xml delete mode 100755 desktop/kde6/applications/dragonplayer-kf6/actions.py delete mode 100755 desktop/kde6/applications/dragonplayer-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/eventviews-kf6/actions.py delete mode 100755 desktop/kde6/applications/eventviews-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/eventviews-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/falkon-kf6/actions.py delete mode 100644 desktop/kde6/applications/falkon-kf6/files/bookmarks_json.diff delete mode 100644 desktop/kde6/applications/falkon-kf6/files/homepage.patch delete mode 100644 desktop/kde6/applications/falkon-kf6/files/speeddial.diff delete mode 100644 desktop/kde6/applications/falkon-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/falkon-kf6/translations.xml delete mode 100755 desktop/kde6/applications/ffmpegthumbs-kf6/actions.py delete mode 100755 desktop/kde6/applications/ffmpegthumbs-kf6/files/ffmpegthumbs-ffmpeg3.patch delete mode 100755 desktop/kde6/applications/ffmpegthumbs-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/ffmpegthumbs-kf6/translations.xml delete mode 100755 desktop/kde6/applications/filelight-kf6/actions.py delete mode 100755 desktop/kde6/applications/filelight-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/filelight-kf6/translations.xml delete mode 100755 desktop/kde6/applications/granatier-kf6/actions.py delete mode 100755 desktop/kde6/applications/granatier-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/granatier-kf6/translations.xml delete mode 100755 desktop/kde6/applications/grantlee-editor-kf6/actions.py delete mode 100755 desktop/kde6/applications/grantlee-editor-kf6/granatier-kf6/actions.py delete mode 100755 desktop/kde6/applications/grantlee-editor-kf6/granatier-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/grantlee-editor-kf6/granatier-kf6/translations.xml delete mode 100755 desktop/kde6/applications/grantlee-editor-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/grantleetheme-kf6/actions.py delete mode 100755 desktop/kde6/applications/grantleetheme-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/grantleetheme-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/gwenview-kf6/actions.py delete mode 100755 desktop/kde6/applications/gwenview-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/gwenview-kf6/translations.xml delete mode 100755 desktop/kde6/applications/incidenceeditor-kf6/actions.py delete mode 100755 desktop/kde6/applications/incidenceeditor-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/incidenceeditor-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kaccounts-integration-kf6/actions.py delete mode 100755 desktop/kde6/applications/kaccounts-integration-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kaccounts-providers-kf6/actions.py delete mode 100755 desktop/kde6/applications/kaccounts-providers-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kaddressbook-kf6/actions.py delete mode 100755 desktop/kde6/applications/kaddressbook-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/kaddressbook-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kalarm-kf6/actions.py delete mode 100755 desktop/kde6/applications/kalarm-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kalgebra-kf6/actions.py delete mode 100755 desktop/kde6/applications/kalgebra-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kalgebra-kf6/translations.xml delete mode 100644 desktop/kde6/applications/kalzium-kf6/actions.py delete mode 100644 desktop/kde6/applications/kalzium-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/kalzium-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kamera-kf6/actions.py delete mode 100755 desktop/kde6/applications/kamera-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kamera-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kanagram-kf6/actions.py delete mode 100755 desktop/kde6/applications/kanagram-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kanagram-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kapman-kf6/actions.py delete mode 100755 desktop/kde6/applications/kapman-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kapman-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kapptemplate-kf6/actions.py delete mode 100755 desktop/kde6/applications/kapptemplate-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kapptemplate-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kate-kf6/actions.py delete mode 100644 desktop/kde6/applications/kate-kf6/files/36ede44f.patch delete mode 100644 desktop/kde6/applications/kate-kf6/files/e002696b.patch delete mode 100755 desktop/kde6/applications/kate-kf6/files/kate-17.04.0-allow-root.patch delete mode 100755 desktop/kde6/applications/kate-kf6/files/kwrite-17.04.0-allow-root.patch delete mode 100755 desktop/kde6/applications/kate-kf6/files/org.kde.kate.desktop delete mode 100755 desktop/kde6/applications/kate-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/katomic-kf6/actions.py delete mode 100755 desktop/kde6/applications/katomic-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/katomic-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kblackbox-kf6/actions.py delete mode 100755 desktop/kde6/applications/kblackbox-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kblackbox-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kblocks-kf6/actions.py delete mode 100755 desktop/kde6/applications/kblocks-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kblocks-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kbounce-kf6/actions.py delete mode 100755 desktop/kde6/applications/kbounce-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kbounce-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kbreakout-kf6/actions.py delete mode 100755 desktop/kde6/applications/kbreakout-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kbreakout-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kbruch-kf6/actions.py delete mode 100755 desktop/kde6/applications/kbruch-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kbruch-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kcalc-kf6/actions.py delete mode 100755 desktop/kde6/applications/kcalc-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kcalc-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kcalutils-kf6/actions.py delete mode 100755 desktop/kde6/applications/kcalutils-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/kcalutils-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kcharselect-kf6/actions.py delete mode 100755 desktop/kde6/applications/kcharselect-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kcharselect-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kcolorchooser-kf6/actions.py delete mode 100755 desktop/kde6/applications/kcolorchooser-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kcolorchooser-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kcron-kf6/actions.py delete mode 100755 desktop/kde6/applications/kcron-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kcron-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kde-dev-scripts-kf6/actions.py delete mode 100755 desktop/kde6/applications/kde-dev-scripts-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kde-dev-scripts-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kdebugsettings-kf6/actions.py delete mode 100755 desktop/kde6/applications/kdebugsettings-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/kdeconnect-kf6/actions.py delete mode 100644 desktop/kde6/applications/kdeconnect-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/kdeconnect-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kdeedu-data-kf6/actions.py delete mode 100755 desktop/kde6/applications/kdeedu-data-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/kdegraphics-mobipocket-kf6/actions.py delete mode 100644 desktop/kde6/applications/kdegraphics-mobipocket-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/kdegraphics-mobipocket-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kdegraphics-svgpart-kf6/actions.py delete mode 100755 desktop/kde6/applications/kdegraphics-svgpart-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kdegraphics-thumbnailers-kf6/actions.py delete mode 100755 desktop/kde6/applications/kdegraphics-thumbnailers-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kdegraphics-thumbnailers-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kdenetwork-filesharing-kf6/actions.py delete mode 100755 desktop/kde6/applications/kdenetwork-filesharing-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kdenetwork-filesharing-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kdenlive-kf6/actions.py delete mode 100644 desktop/kde6/applications/kdenlive-kf6/files/kdenlive-mlt6.patch delete mode 100755 desktop/kde6/applications/kdenlive-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kdenlive-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kdepim-addons-kf6/actions.py delete mode 100755 desktop/kde6/applications/kdepim-addons-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kdepim-runtime-kf6/actions.py delete mode 100644 desktop/kde6/applications/kdepim-runtime-kf6/files/2fd3604a.patch delete mode 100644 desktop/kde6/applications/kdepim-runtime-kf6/files/c99afc75.patch delete mode 100644 desktop/kde6/applications/kdepim-runtime-kf6/files/fb0d78fb.patch delete mode 100755 desktop/kde6/applications/kdepim-runtime-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kdepim-runtime-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kdesdk-thumbnailers-kf6/actions.py delete mode 100755 desktop/kde6/applications/kdesdk-thumbnailers-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kdf-kf6/actions.py delete mode 100755 desktop/kde6/applications/kdf-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kdiagram-kf6/actions.py delete mode 100755 desktop/kde6/applications/kdiagram-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kdialog-kf6/actions.py delete mode 100755 desktop/kde6/applications/kdialog-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kdiamond-kf6/actions.py delete mode 100755 desktop/kde6/applications/kdiamond-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kdiamond-kf6/translations.xml delete mode 100755 desktop/kde6/applications/keditbookmarks-kf6/actions.py delete mode 100755 desktop/kde6/applications/keditbookmarks-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kfind-kf6/actions.py delete mode 100755 desktop/kde6/applications/kfind-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kfourinline-kf6/actions.py delete mode 100755 desktop/kde6/applications/kfourinline-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kfourinline-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kgeography-kf6/actions.py delete mode 100755 desktop/kde6/applications/kgeography-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kgeography-kf6/translations.xml delete mode 100644 desktop/kde6/applications/kget-kf6/actions.py delete mode 100644 desktop/kde6/applications/kget-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/kget-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kgpg-kf6/actions.py delete mode 100755 desktop/kde6/applications/kgpg-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/khangman-kf6/actions.py delete mode 100755 desktop/kde6/applications/khangman-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/khangman-kf6/translations.xml delete mode 100755 desktop/kde6/applications/khelpcenter-kf6/actions.py delete mode 100755 desktop/kde6/applications/khelpcenter-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kidentitymanagement-kf6/actions.py delete mode 100755 desktop/kde6/applications/kidentitymanagement-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kig-kf6/actions.py delete mode 100755 desktop/kde6/applications/kig-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kig-kf6/translations.xml delete mode 100755 desktop/kde6/applications/killbots-kf6/actions.py delete mode 100755 desktop/kde6/applications/killbots-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/killbots-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kimap-kf6/actions.py delete mode 100755 desktop/kde6/applications/kimap-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/kimap-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/kio-admin-kf6/actions.py delete mode 100644 desktop/kde6/applications/kio-admin-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/kio-admin-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kio-extras-kf6/actions.py delete mode 100755 desktop/kde6/applications/kio-extras-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/kio-gdrive-kf6/actions.py delete mode 100644 desktop/kde6/applications/kio-gdrive-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/kio-gdrive-kf6/translations.xml delete mode 100644 desktop/kde6/applications/kio-zeroconf-kf6/actions.py delete mode 100644 desktop/kde6/applications/kio-zeroconf-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/kio-zeroconf-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kiriki-kf6/actions.py delete mode 100755 desktop/kde6/applications/kiriki-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kiriki-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kiten-kf6/actions.py delete mode 100755 desktop/kde6/applications/kiten-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kiten-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kitinerary-kf6/actions.py delete mode 100755 desktop/kde6/applications/kitinerary-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kitinerary-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kjumpingcube-kf6/actions.py delete mode 100755 desktop/kde6/applications/kjumpingcube-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kjumpingcube-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kldap-kf6/actions.py delete mode 100755 desktop/kde6/applications/kldap-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kleopatra-kf6/actions.py delete mode 100755 desktop/kde6/applications/kleopatra-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/kleopatra-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/klettres-kf6/actions.py delete mode 100755 desktop/kde6/applications/klettres-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/klettres-kf6/translations.xml delete mode 100755 desktop/kde6/applications/klickety-kf6/actions.py delete mode 100755 desktop/kde6/applications/klickety-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/klickety-kf6/translations.xml delete mode 100755 desktop/kde6/applications/klines-kf6/actions.py delete mode 100755 desktop/kde6/applications/klines-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/klines-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kmahjongg-kf6/actions.py delete mode 100755 desktop/kde6/applications/kmahjongg-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kmahjongg-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kmail-account-wizard-kf6/actions.py delete mode 100755 desktop/kde6/applications/kmail-account-wizard-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kmail-kf6/actions.py delete mode 100644 desktop/kde6/applications/kmail-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kmailtransport-kf6/actions.py delete mode 100755 desktop/kde6/applications/kmailtransport-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kmbox-kf6/actions.py delete mode 100755 desktop/kde6/applications/kmbox-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/kmbox-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kmime-kf6/actions.py delete mode 100755 desktop/kde6/applications/kmime-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/kmime-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kmines-kf6/actions.py delete mode 100755 desktop/kde6/applications/kmines-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kmines-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kmix-kf6/actions.py delete mode 100755 desktop/kde6/applications/kmix-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kmix-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kmplot-kf6/actions.py delete mode 100755 desktop/kde6/applications/kmplot-kf6/files/kmplot-isnan.patch delete mode 100755 desktop/kde6/applications/kmplot-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/knavalbattle-kf6/actions.py delete mode 100755 desktop/kde6/applications/knavalbattle-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/knavalbattle-kf6/translations.xml delete mode 100755 desktop/kde6/applications/knetwalk-kf6/actions.py delete mode 100755 desktop/kde6/applications/knetwalk-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/knetwalk-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kollision-kf6/actions.py delete mode 100755 desktop/kde6/applications/kollision-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kollision-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kolourpaint-kf6/actions.py delete mode 100755 desktop/kde6/applications/kolourpaint-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kolourpaint-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kompare-kf6/actions.py delete mode 100755 desktop/kde6/applications/kompare-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kompare-kf6/translations.xml delete mode 100755 desktop/kde6/applications/konqueror-kf6/actions.py delete mode 100755 desktop/kde6/applications/konqueror-kf6/files/konquerorkcfg.patch delete mode 100755 desktop/kde6/applications/konqueror-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/konsole-kf6/actions.py delete mode 100755 desktop/kde6/applications/konsole-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kontact-kf6/actions.py delete mode 100755 desktop/kde6/applications/kontact-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kontactinterface-kf6/actions.py delete mode 100755 desktop/kde6/applications/kontactinterface-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/konversation-kf6/actions.py delete mode 100755 desktop/kde6/applications/konversation-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/korganizer-kf6/actions.py delete mode 100755 desktop/kde6/applications/korganizer-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kpat-kf6/actions.py delete mode 100755 desktop/kde6/applications/kpat-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kpimtextedit-kf6/actions.py delete mode 100755 desktop/kde6/applications/kpimtextedit-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/kpimtextedit-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kpkpass-kf6/actions.py delete mode 100755 desktop/kde6/applications/kpkpass-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kpkpass-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kpmcore-kf6/actions.py delete mode 100755 desktop/kde6/applications/kpmcore-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kqtquickcharts-kf6/actions.py delete mode 100755 desktop/kde6/applications/kqtquickcharts-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/krdc-kf6/actions.py delete mode 100755 desktop/kde6/applications/krdc-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/krdc-kf6/translations.xml delete mode 100755 desktop/kde6/applications/krfb-kf6/actions.py delete mode 100755 desktop/kde6/applications/krfb-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/krfb-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kross-interpreters-kf6/actions.py delete mode 100755 desktop/kde6/applications/kross-interpreters-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kruler-kf6/actions.py delete mode 100755 desktop/kde6/applications/kruler-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kruler-kf6/translations.xml delete mode 100644 desktop/kde6/applications/ksanecore-kf6/actions.py delete mode 100644 desktop/kde6/applications/ksanecore-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/ksanecore-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kshisen-kf6/actions.py delete mode 100755 desktop/kde6/applications/kshisen-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kshisen-kf6/translation.xml delete mode 100755 desktop/kde6/applications/ksmtp-kf6/actions.py delete mode 100755 desktop/kde6/applications/ksmtp-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/ksmtp-kf6/translations.xml delete mode 100755 desktop/kde6/applications/ksquares-kf6/actions.py delete mode 100755 desktop/kde6/applications/ksquares-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/ksquares-kf6/translations.xml delete mode 100644 desktop/kde6/applications/ksudoku-kf6/actions.py delete mode 100644 desktop/kde6/applications/ksudoku-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/ksudoku-kf6/translations.xml delete mode 100755 desktop/kde6/applications/ksystemlog-kf6/actions.py delete mode 100755 desktop/kde6/applications/ksystemlog-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/ksystemlog-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kteatime-kf6/actions.py delete mode 100755 desktop/kde6/applications/kteatime-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kteatime-kf6/translations.xml delete mode 100755 desktop/kde6/applications/ktimer-kf6/actions.py delete mode 100755 desktop/kde6/applications/ktimer-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/ktimer-kf6/translations.xml delete mode 100755 desktop/kde6/applications/ktnef-kf6/actions.py delete mode 100755 desktop/kde6/applications/ktnef-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/ktnef-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/ktorrent-kf6/actions.py delete mode 100644 desktop/kde6/applications/ktorrent-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/ktorrent-kf6/translations.xml delete mode 100755 desktop/kde6/applications/ktuberling-kf6/actions.py delete mode 100755 desktop/kde6/applications/ktuberling-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kturtle-kf6/actions.py delete mode 100755 desktop/kde6/applications/kturtle-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kturtle-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kwalletmanager-kf6/actions.py delete mode 100755 desktop/kde6/applications/kwalletmanager-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kwalletmanager-kf6/translations.xml delete mode 100755 desktop/kde6/applications/kwave-kf6/actions.py delete mode 100755 desktop/kde6/applications/kwave-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/kwordquiz-kf6/actions.py delete mode 100755 desktop/kde6/applications/kwordquiz-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libgravatar-kf6/actions.py delete mode 100755 desktop/kde6/applications/libgravatar-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/libgravatar-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libkcddb-kf6/actions.py delete mode 100755 desktop/kde6/applications/libkcddb-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libkcddb-kf6/translations.xml delete mode 100755 desktop/kde6/applications/libkcompactdisc-kf6/actions.py delete mode 100755 desktop/kde6/applications/libkcompactdisc-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libkdcraw-kf6/actions.py delete mode 100755 desktop/kde6/applications/libkdcraw-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libkdcraw-kf6/translations.xml delete mode 100755 desktop/kde6/applications/libkdegames-kf6/actions.py delete mode 100755 desktop/kde6/applications/libkdegames-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libkdepim-kf6/actions.py delete mode 100755 desktop/kde6/applications/libkdepim-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/libkdepim-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libkeduvocdocument-kf6/actions.py delete mode 100755 desktop/kde6/applications/libkeduvocdocument-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libkexiv2-kf6/actions.py delete mode 100755 desktop/kde6/applications/libkexiv2-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libkexiv2-kf6/translations.xml delete mode 100755 desktop/kde6/applications/libkgapi-kf6/actions.py delete mode 100755 desktop/kde6/applications/libkgapi-kf6/files/DateTime.patch delete mode 100755 desktop/kde6/applications/libkgapi-kf6/files/latitudeservice.patch delete mode 100755 desktop/kde6/applications/libkgapi-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/libkgapi-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libkleo-kf6/actions.py delete mode 100755 desktop/kde6/applications/libkleo-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/libkleo-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libkmahjongg-kf6/actions.py delete mode 100755 desktop/kde6/applications/libkmahjongg-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libkomparediff2-kf6/actions.py delete mode 100755 desktop/kde6/applications/libkomparediff2-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libksane-kf6/actions.py delete mode 100755 desktop/kde6/applications/libksane-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/libksane-kf6/translations.xml delete mode 100755 desktop/kde6/applications/libksieve-kf6/actions.py delete mode 100755 desktop/kde6/applications/libksieve-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/libksieve-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/libktorrent-kf6/actions.py delete mode 100644 desktop/kde6/applications/libktorrent-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/libktorrent-kf6/translations.xml delete mode 100755 desktop/kde6/applications/lokalize-kf6/actions.py delete mode 100755 desktop/kde6/applications/lokalize-kf6/files/lokalize_build_with_hunspell1.6.patch delete mode 100755 desktop/kde6/applications/lokalize-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/lokalize-kf6/translations.xml delete mode 100755 desktop/kde6/applications/mailcommon-kf6/actions.py delete mode 100755 desktop/kde6/applications/mailcommon-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/mailimporter-kf6/actions.py delete mode 100755 desktop/kde6/applications/mailimporter-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/mailimporter-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/marble-kf6/actions.py delete mode 100755 desktop/kde6/applications/marble-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/marble-kf6/translations.xml delete mode 100755 desktop/kde6/applications/messagelib-kf6/actions.py delete mode 100755 desktop/kde6/applications/messagelib-kf6/pspec.xml delete mode 100644 desktop/kde6/applications/mimetreeparser/actions.py delete mode 100644 desktop/kde6/applications/mimetreeparser/pspec.xml delete mode 100644 desktop/kde6/applications/mimetreeparser/translations.xml delete mode 100755 desktop/kde6/applications/minuet-kf6/actions.py delete mode 100755 desktop/kde6/applications/minuet-kf6/files/qtfix2.patch delete mode 100755 desktop/kde6/applications/minuet-kf6/files/qtfixc.patch delete mode 100755 desktop/kde6/applications/minuet-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/okular-kf6/actions.py delete mode 100755 desktop/kde6/applications/okular-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/okular-kf6/translations.xml delete mode 100755 desktop/kde6/applications/parley-kf6/actions.py delete mode 100755 desktop/kde6/applications/parley-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/parley-kf6/translations.xml delete mode 100755 desktop/kde6/applications/partitionmanager-kf6/actions.py delete mode 100755 desktop/kde6/applications/partitionmanager-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/partitionmanager-kf6/translations.xml delete mode 100755 desktop/kde6/applications/picmi-kf6/actions.py delete mode 100755 desktop/kde6/applications/picmi-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/picmi-kf6/translations.xml delete mode 100755 desktop/kde6/applications/pim-data-exporter-kf6/actions.py delete mode 100755 desktop/kde6/applications/pim-data-exporter-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/pim-sieve-editor-kf6/actions.py delete mode 100755 desktop/kde6/applications/pim-sieve-editor-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/pimcommon-kf6/actions.py delete mode 100755 desktop/kde6/applications/pimcommon-kf6/files/qt5.patch delete mode 100755 desktop/kde6/applications/pimcommon-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/poxml-kf6/actions.py delete mode 100755 desktop/kde6/applications/poxml-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/poxml-kf6/translations.xml delete mode 100755 desktop/kde6/applications/rocs-kf6/actions.py delete mode 100755 desktop/kde6/applications/rocs-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/signon-kwallet-extension-kf6/actions.py delete mode 100755 desktop/kde6/applications/signon-kwallet-extension-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/spectacle-kf6/actions.py delete mode 100755 desktop/kde6/applications/spectacle-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/spectacle-kf6/translations.xml delete mode 100755 desktop/kde6/applications/step-kf6/actions.py delete mode 100755 desktop/kde6/applications/step-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/umbrello-kf6/actions.py delete mode 100755 desktop/kde6/applications/umbrello-kf6/files/upstream.patch delete mode 100755 desktop/kde6/applications/umbrello-kf6/pspec.xml delete mode 100755 desktop/kde6/applications/umbrello-kf6/translations.xml delete mode 100644 desktop/kde6/component.xml delete mode 100755 desktop/kde6/framework/attica-kf6/actions.py delete mode 100755 desktop/kde6/framework/attica-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/attica-kf6/translations.xml delete mode 100755 desktop/kde6/framework/baloo-kf6/actions.py delete mode 100755 desktop/kde6/framework/baloo-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/bluez-qt-kf6/actions.py delete mode 100755 desktop/kde6/framework/bluez-qt-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/breeze-icons-kf6/actions.py delete mode 100644 desktop/kde6/framework/breeze-icons-kf6/files/250a7d0b.patch delete mode 100644 desktop/kde6/framework/breeze-icons-kf6/files/breeze-16.svg delete mode 100644 desktop/kde6/framework/breeze-icons-kf6/files/breeze-22.svg delete mode 100644 desktop/kde6/framework/breeze-icons-kf6/files/breeze-64.svg delete mode 100644 desktop/kde6/framework/breeze-icons-kf6/files/breeze-96.svg delete mode 100644 desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-16.svg delete mode 100644 desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-22.svg delete mode 100644 desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-48.svg delete mode 100644 desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-96.svg delete mode 100644 desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark.svg delete mode 100644 desktop/kde6/framework/breeze-icons-kf6/files/breeze.patch delete mode 100644 desktop/kde6/framework/breeze-icons-kf6/files/breeze.svg delete mode 100755 desktop/kde6/framework/breeze-icons-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/component.xml delete mode 100755 desktop/kde6/framework/extra-cmake-modules-kf6/actions.py delete mode 100755 desktop/kde6/framework/extra-cmake-modules-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/frameworkintegration-kf6/actions.py delete mode 100755 desktop/kde6/framework/frameworkintegration-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kapidox-kf6/actions.py delete mode 100644 desktop/kde6/framework/kapidox-kf6/files/fedora/kf5-kapidox-install.patch delete mode 100755 desktop/kde6/framework/kapidox-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kapidox-kf6/translations.xml delete mode 100755 desktop/kde6/framework/karchive-kf6/actions.py delete mode 100755 desktop/kde6/framework/karchive-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kauth-kf6/actions.py delete mode 100644 desktop/kde6/framework/kauth-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kbookmarks-kf6/actions.py delete mode 100755 desktop/kde6/framework/kbookmarks-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kcalendarcore-kf6/actions.py delete mode 100644 desktop/kde6/framework/kcalendarcore-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kcalendarcore-kf6/translations.xml delete mode 100755 desktop/kde6/framework/kcmutils-kf6/actions.py delete mode 100755 desktop/kde6/framework/kcmutils-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kcodecs-kf6/actions.py delete mode 100755 desktop/kde6/framework/kcodecs-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kcolorscheme-kf6/actions.py delete mode 100644 desktop/kde6/framework/kcolorscheme-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kcolorscheme-kf6/translations.xml delete mode 100644 desktop/kde6/framework/kcompletion-kf6/actions.py delete mode 100644 desktop/kde6/framework/kcompletion-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kconfig-kf6/actions.py delete mode 100755 desktop/kde6/framework/kconfig-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kconfigwidgets-kf6/actions.py delete mode 100755 desktop/kde6/framework/kconfigwidgets-kf6/comar/package.py delete mode 100755 desktop/kde6/framework/kconfigwidgets-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kcontacts-kf6/actions.py delete mode 100755 desktop/kde6/framework/kcontacts-kf6/files/qt5.patch delete mode 100755 desktop/kde6/framework/kcontacts-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kcoreaddons-kf6/actions.py delete mode 100755 desktop/kde6/framework/kcoreaddons-kf6/comar/package.py delete mode 100755 desktop/kde6/framework/kcoreaddons-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kcrash-kf6/actions.py delete mode 100644 desktop/kde6/framework/kcrash-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kdav-kf6/actions.py delete mode 100644 desktop/kde6/framework/kdav-kf6/files/qt5.patch delete mode 100644 desktop/kde6/framework/kdav-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kdav-kf6/translations.xml delete mode 100755 desktop/kde6/framework/kdbusaddons-kf6/actions.py delete mode 100755 desktop/kde6/framework/kdbusaddons-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kdeclarative-kf6/actions.py delete mode 100755 desktop/kde6/framework/kdeclarative-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kded-kf6/actions.py delete mode 100755 desktop/kde6/framework/kded-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kdesu-kf6/actions.py delete mode 100755 desktop/kde6/framework/kdesu-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kdnssd-kf6/actions.py delete mode 100755 desktop/kde6/framework/kdnssd-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kdoctools-kf6/actions.py delete mode 100644 desktop/kde6/framework/kdoctools-kf6/files/docbook.patch delete mode 100644 desktop/kde6/framework/kdoctools-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kfilemetadata-kf6/actions.py delete mode 100644 desktop/kde6/framework/kfilemetadata-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kglobalaccel-kf6/actions.py delete mode 100755 desktop/kde6/framework/kglobalaccel-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kguiaddons-kf6/actions.py delete mode 100755 desktop/kde6/framework/kguiaddons-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kholidays-kf6/actions.py delete mode 100755 desktop/kde6/framework/kholidays-kf6/files/qt5.patch delete mode 100755 desktop/kde6/framework/kholidays-kf6/files/sunrise-fix.patch delete mode 100755 desktop/kde6/framework/kholidays-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/ki18n-kf6/actions.py delete mode 100755 desktop/kde6/framework/ki18n-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/ki18n-kf6/translations.xml delete mode 100755 desktop/kde6/framework/kiconthemes-kf6/actions.py delete mode 100755 desktop/kde6/framework/kiconthemes-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kidletime-kf6/actions.py delete mode 100755 desktop/kde6/framework/kidletime-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kimageformats-kf6/actions.py delete mode 100644 desktop/kde6/framework/kimageformats-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kio-kf6/actions.py delete mode 100644 desktop/kde6/framework/kio-kf6/files/6e7775d3.patch delete mode 100644 desktop/kde6/framework/kio-kf6/files/8ad69215.patch delete mode 100755 desktop/kde6/framework/kio-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kirigami-addons-kf6/actions.py delete mode 100644 desktop/kde6/framework/kirigami-addons-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kirigami-addons-kf6/translations.xml delete mode 100755 desktop/kde6/framework/kirigami-kf6/actions.py delete mode 100755 desktop/kde6/framework/kirigami-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kitemmodels-kf6/actions.py delete mode 100755 desktop/kde6/framework/kitemmodels-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kitemviews-kf6/actions.py delete mode 100755 desktop/kde6/framework/kitemviews-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kjobwidgets-kf6/actions.py delete mode 100644 desktop/kde6/framework/kjobwidgets-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/knewstuff-kf6/actions.py delete mode 100644 desktop/kde6/framework/knewstuff-kf6/files/49f2037a.patch delete mode 100644 desktop/kde6/framework/knewstuff-kf6/files/4f01e2ff.patch delete mode 100755 desktop/kde6/framework/knewstuff-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/knotifications-kf6/actions.py delete mode 100755 desktop/kde6/framework/knotifications-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/knotifyconfig-kf6/actions.py delete mode 100755 desktop/kde6/framework/knotifyconfig-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kpackage-kf6/actions.py delete mode 100755 desktop/kde6/framework/kpackage-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kpackage-kf6/translations.xml delete mode 100755 desktop/kde6/framework/kparts-kf6/actions.py delete mode 100755 desktop/kde6/framework/kparts-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kpeople-kf6/actions.py delete mode 100755 desktop/kde6/framework/kpeople-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kplotting-kf6/actions.py delete mode 100755 desktop/kde6/framework/kplotting-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kpty-kf6/actions.py delete mode 100644 desktop/kde6/framework/kpty-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kquickcharts-kf6/actions.py delete mode 100644 desktop/kde6/framework/kquickcharts-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kquickcharts-kf6/translations.xml delete mode 100755 desktop/kde6/framework/krunner-kf6/actions.py delete mode 100755 desktop/kde6/framework/krunner-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kservice-kf6/actions.py delete mode 100755 desktop/kde6/framework/kservice-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kstatusnotifieritem-kf6/actions.py delete mode 100644 desktop/kde6/framework/kstatusnotifieritem-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kstatusnotifieritem-kf6/translations.xml delete mode 100644 desktop/kde6/framework/ksvg-kf6/actions.py delete mode 100644 desktop/kde6/framework/ksvg-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/ksvg-kf6/translations.xml delete mode 100755 desktop/kde6/framework/ksyndication-kf6/actions.py delete mode 100755 desktop/kde6/framework/ksyndication-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/ktexteditor-kf6/actions.py delete mode 100755 desktop/kde6/framework/ktexteditor-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/ktexttemplate-kf6/actions.py delete mode 100644 desktop/kde6/framework/ktexttemplate-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/ktexttemplate-kf6/translations.xml delete mode 100755 desktop/kde6/framework/ktextwidgets-kf6/actions.py delete mode 100755 desktop/kde6/framework/ktextwidgets-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kunitconversion-kf6/actions.py delete mode 100644 desktop/kde6/framework/kunitconversion-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kuserfeedback-kf6/actions.py delete mode 100644 desktop/kde6/framework/kuserfeedback-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/kuserfeedback-kf6/translations.xml delete mode 100755 desktop/kde6/framework/kwallet-kf6/actions.py delete mode 100755 desktop/kde6/framework/kwallet-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kwidgetsaddons-kf6/actions.py delete mode 100755 desktop/kde6/framework/kwidgetsaddons-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kwindowsystem-kf6/actions.py delete mode 100755 desktop/kde6/framework/kwindowsystem-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/kxmlgui-kf6/actions.py delete mode 100755 desktop/kde6/framework/kxmlgui-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/modemmanager-qt-kf6/actions.py delete mode 100755 desktop/kde6/framework/modemmanager-qt-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/networkmanager-qt-kf6/actions.py delete mode 100755 desktop/kde6/framework/networkmanager-qt-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/oxygen-icons-kf6/actions.py delete mode 100644 desktop/kde6/framework/oxygen-icons-kf6/files/128x128.png delete mode 100644 desktop/kde6/framework/oxygen-icons-kf6/files/16x16.png delete mode 100644 desktop/kde6/framework/oxygen-icons-kf6/files/22x22.png delete mode 100644 desktop/kde6/framework/oxygen-icons-kf6/files/256x256.png delete mode 100644 desktop/kde6/framework/oxygen-icons-kf6/files/32x32.png delete mode 100644 desktop/kde6/framework/oxygen-icons-kf6/files/48x48.png delete mode 100644 desktop/kde6/framework/oxygen-icons-kf6/files/64x64.png delete mode 100644 desktop/kde6/framework/oxygen-icons-kf6/files/logotype-pisi.svg delete mode 100755 desktop/kde6/framework/oxygen-icons-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/plasma-wayland-protocols-kf6/actions.py delete mode 100644 desktop/kde6/framework/plasma-wayland-protocols-kf6/files/a95fc86f.diff delete mode 100644 desktop/kde6/framework/plasma-wayland-protocols-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/plasma-wayland-protocols-kf6/translations.xml delete mode 100755 desktop/kde6/framework/prison-kf6/actions.py delete mode 100755 desktop/kde6/framework/prison-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/purpose-kf6/actions.py delete mode 100644 desktop/kde6/framework/purpose-kf6/pspec.xml delete mode 100644 desktop/kde6/framework/purpose-kf6/translations.xml delete mode 100755 desktop/kde6/framework/qqc2-desktop-style-kf6/actions.py delete mode 100755 desktop/kde6/framework/qqc2-desktop-style-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/solid-kf6/actions.py delete mode 100755 desktop/kde6/framework/solid-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/sonnet-kf6/actions.py delete mode 100755 desktop/kde6/framework/sonnet-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/syntax-highlighting-kf6/actions.py delete mode 100755 desktop/kde6/framework/syntax-highlighting-kf6/pspec.xml delete mode 100755 desktop/kde6/framework/threadweaver-kf6/actions.py delete mode 100755 desktop/kde6/framework/threadweaver-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/bluedevil-kf6/actions.py delete mode 100755 desktop/kde6/plasma/bluedevil-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/breeze-grub-kf6/actions.py delete mode 100755 desktop/kde6/plasma/breeze-grub-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/breeze-gtk-kf6/actions.py delete mode 100755 desktop/kde6/plasma/breeze-gtk-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/breeze-kf6/actions.py delete mode 100755 desktop/kde6/plasma/breeze-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/breeze-plymouth-kf6/actions.py delete mode 100755 desktop/kde6/plasma/breeze-plymouth-kf6/files/pisi.16bit.png delete mode 100755 desktop/kde6/plasma/breeze-plymouth-kf6/files/pisi.logo.png delete mode 100755 desktop/kde6/plasma/breeze-plymouth-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/component.xml delete mode 100755 desktop/kde6/plasma/discover-kf6/actions.py delete mode 100644 desktop/kde6/plasma/discover-kf6/files/appstream-1.0.patch delete mode 100644 desktop/kde6/plasma/discover-kf6/files/dc67ef22.patch delete mode 100755 desktop/kde6/plasma/discover-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/drkonqi-kf6/actions.py delete mode 100755 desktop/kde6/plasma/drkonqi-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/drkonqi-kf6/translations.xml delete mode 100755 desktop/kde6/plasma/kactivitymanagerd-kf6/actions.py delete mode 100755 desktop/kde6/plasma/kactivitymanagerd-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/kde-cli-tools-kf6/actions.py delete mode 100755 desktop/kde6/plasma/kde-cli-tools-kf6/comar/package.py delete mode 100755 desktop/kde6/plasma/kde-cli-tools-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/kde-gtk-config-kf6/actions.py delete mode 100644 desktop/kde6/plasma/kde-gtk-config-kf6/files/schemas.patch delete mode 100755 desktop/kde6/plasma/kde-gtk-config-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/kdecorations-kf6/actions.py delete mode 100755 desktop/kde6/plasma/kdecorations-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/kdecorations-kf6/translations.xml delete mode 100755 desktop/kde6/plasma/kdeplasma-addons-kf6/actions.py delete mode 100755 desktop/kde6/plasma/kdeplasma-addons-kf6/files/dictionarymatchengine.patch delete mode 100755 desktop/kde6/plasma/kdeplasma-addons-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/kgamma-kf6/actions.py delete mode 100755 desktop/kde6/plasma/kgamma-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/kinfocenter-kf6/actions.py delete mode 100755 desktop/kde6/plasma/kinfocenter-kf6/files/kcm-about-distrorc delete mode 100755 desktop/kde6/plasma/kinfocenter-kf6/files/pisilinux-kinfocenter.diff delete mode 100755 desktop/kde6/plasma/kinfocenter-kf6/files/pisilinux.svg delete mode 100755 desktop/kde6/plasma/kinfocenter-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/kmenuedit-kf6/actions.py delete mode 100755 desktop/kde6/plasma/kmenuedit-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/kpipewire-kf6/actions.py delete mode 100644 desktop/kde6/plasma/kpipewire-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/kpipewire-kf6/translations.xml delete mode 100755 desktop/kde6/plasma/kscreen-kf6/actions.py delete mode 100755 desktop/kde6/plasma/kscreen-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/kscreenlocker-kf6/actions.py delete mode 100644 desktop/kde6/plasma/kscreenlocker-kf6/files/no-autolock.patch delete mode 100755 desktop/kde6/plasma/kscreenlocker-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/ksshaskpass-kf6/actions.py delete mode 100755 desktop/kde6/plasma/ksshaskpass-kf6/files/ksshaskpass-kf6.sh delete mode 100755 desktop/kde6/plasma/ksshaskpass-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/ksystemstats-kf6/actions.py delete mode 100644 desktop/kde6/plasma/ksystemstats-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/ksystemstats-kf6/translations.xml delete mode 100755 desktop/kde6/plasma/kwallet-pam-kf6/actions.py delete mode 100755 desktop/kde6/plasma/kwallet-pam-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/kwayland-integration-kf6/actions.py delete mode 100755 desktop/kde6/plasma/kwayland-integration-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/kwayland-kf6/actions.py delete mode 100755 desktop/kde6/plasma/kwayland-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/kwayland-kf6/translations.xml delete mode 100755 desktop/kde6/plasma/kwin-kf6/actions.py delete mode 100644 desktop/kde6/plasma/kwin-kf6/files/4692.patch delete mode 100755 desktop/kde6/plasma/kwin-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/kwrited-kf6/actions.py delete mode 100755 desktop/kde6/plasma/kwrited-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/layer-shell-qt-kf6/actions.py delete mode 100644 desktop/kde6/plasma/layer-shell-qt-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/layer-shell-qt-kf6/translations.xml delete mode 100755 desktop/kde6/plasma/libkscreen-kf6/actions.py delete mode 100755 desktop/kde6/plasma/libkscreen-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/libksysguard-kf6/actions.py delete mode 100755 desktop/kde6/plasma/libksysguard-kf6/files/libksysguard_kauth.diff delete mode 100755 desktop/kde6/plasma/libksysguard-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/libplasma-kf6/actions.py delete mode 100755 desktop/kde6/plasma/libplasma-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/milou-kf6/actions.py delete mode 100755 desktop/kde6/plasma/milou-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/oxygen-kf6/actions.py delete mode 100755 desktop/kde6/plasma/oxygen-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/oxygen-sounds-kf6/actions.py delete mode 100644 desktop/kde6/plasma/oxygen-sounds-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/oxygen-sounds-kf6/translations.xml delete mode 100755 desktop/kde6/plasma/plasma-activities-kf6/actions.py delete mode 100755 desktop/kde6/plasma/plasma-activities-kf6/files/build-source.patch delete mode 100755 desktop/kde6/plasma/plasma-activities-kf6/files/kamd-rename.patch delete mode 100755 desktop/kde6/plasma/plasma-activities-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/plasma-activities-stats-kf6/actions.py delete mode 100755 desktop/kde6/plasma/plasma-activities-stats-kf6/files/build-source.patch delete mode 100755 desktop/kde6/plasma/plasma-activities-stats-kf6/files/kamd-rename.patch delete mode 100755 desktop/kde6/plasma/plasma-activities-stats-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/plasma-browser-integration-kf6/actions.py delete mode 100644 desktop/kde6/plasma/plasma-browser-integration-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/plasma-desktop-kf6/actions.py delete mode 100644 desktop/kde6/plasma/plasma-desktop-kf6/files/ac9ef2b6.patch delete mode 100644 desktop/kde6/plasma/plasma-desktop-kf6/files/af9aeecc.patch delete mode 100644 desktop/kde6/plasma/plasma-desktop-kf6/files/plasma-desktop-animation-duration.patch delete mode 100755 desktop/kde6/plasma/plasma-desktop-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/plasma-desktop-kf6/translations.xml delete mode 100644 desktop/kde6/plasma/plasma-firewall-kf6/actions.py delete mode 100644 desktop/kde6/plasma/plasma-firewall-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/plasma-firewall-kf6/translations.xml delete mode 100755 desktop/kde6/plasma/plasma-integration-kf6/actions.py delete mode 100755 desktop/kde6/plasma/plasma-integration-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/plasma-nm-kf6/actions.py delete mode 100755 desktop/kde6/plasma/plasma-nm-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/plasma-pa-kf6/actions.py delete mode 100755 desktop/kde6/plasma/plasma-pa-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/plasma-pa-kf6/translations.xml delete mode 100755 desktop/kde6/plasma/plasma-sdk-kf6/actions.py delete mode 100755 desktop/kde6/plasma/plasma-sdk-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/plasma-systemmonitor-kf6/actions.py delete mode 100644 desktop/kde6/plasma/plasma-systemmonitor-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/plasma-systemmonitor-kf6/translations.xml delete mode 100755 desktop/kde6/plasma/plasma-vault-kf6/actions.py delete mode 100755 desktop/kde6/plasma/plasma-vault-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/plasma-vault-kf6/translations.xml delete mode 100644 desktop/kde6/plasma/plasma-welcome-kf6/actions.py delete mode 100644 desktop/kde6/plasma/plasma-welcome-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/plasma-welcome-kf6/translations.xml delete mode 100644 desktop/kde6/plasma/plasma-workspace-kf6/actions.py delete mode 100755 desktop/kde6/plasma/plasma-workspace-kf6/comar/kde.pam delete mode 100755 desktop/kde6/plasma/plasma-workspace-kf6/files/0001-Rename-qdbus-in-startkde.patch delete mode 100755 desktop/kde6/plasma/plasma-workspace-kf6/files/0003-Remove-export-of-QT_PLUGIN_PATH.patch delete mode 100644 desktop/kde6/plasma/plasma-workspace-kf6/files/390890.patch delete mode 100755 desktop/kde6/plasma/plasma-workspace-kf6/files/build_fix-qt.patch delete mode 100755 desktop/kde6/plasma/plasma-workspace-kf6/files/create_kdehome.patch delete mode 100644 desktop/kde6/plasma/plasma-workspace-kf6/files/d5a3e749.patch delete mode 100755 desktop/kde6/plasma/plasma-workspace-kf6/files/f32002ce50edc3891f1fa41173132c820b917d57.patch delete mode 100755 desktop/kde6/plasma/plasma-workspace-kf6/files/kde-env.sh delete mode 100755 desktop/kde6/plasma/plasma-workspace-kf6/files/kde-np.pam delete mode 100755 desktop/kde6/plasma/plasma-workspace-kf6/files/kde.pam delete mode 100644 desktop/kde6/plasma/plasma-workspace-kf6/files/kscreensaver.pam delete mode 100755 desktop/kde6/plasma/plasma-workspace-kf6/files/lockscreen-focus.patch delete mode 100644 desktop/kde6/plasma/plasma-workspace-kf6/files/plasma-animation-duration.patch delete mode 100644 desktop/kde6/plasma/plasma-workspace-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/plasma-workspace-wallpapers-kf6/actions.py delete mode 100755 desktop/kde6/plasma/plasma-workspace-wallpapers-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/plasma5-support/actions.py delete mode 100644 desktop/kde6/plasma/plasma5-support/pspec.xml delete mode 100644 desktop/kde6/plasma/plasma5-support/translations.xml delete mode 100644 desktop/kde6/plasma/plymouth-kcm-kf6/actions.py delete mode 100644 desktop/kde6/plasma/plymouth-kcm-kf6/pspec.xml delete mode 100644 desktop/kde6/plasma/plymouth-kcm-kf6/translations.xml delete mode 100755 desktop/kde6/plasma/polkit-kde-authentication-agent-1-kf6/actions.py delete mode 100755 desktop/kde6/plasma/polkit-kde-authentication-agent-1-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/powerdevil-kf6/actions.py delete mode 100755 desktop/kde6/plasma/powerdevil-kf6/files/powerdevil-enable-upower.patch delete mode 100755 desktop/kde6/plasma/powerdevil-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/print-manager-kf6/actions.py delete mode 100755 desktop/kde6/plasma/print-manager-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/print-manager-kf6/translations.xml delete mode 100644 desktop/kde6/plasma/qqc2-breeze-style/actions.py delete mode 100644 desktop/kde6/plasma/qqc2-breeze-style/pspec.xml delete mode 100644 desktop/kde6/plasma/qqc2-breeze-style/translations.xml delete mode 100755 desktop/kde6/plasma/sddm-kcm-kf6/actions.py delete mode 100755 desktop/kde6/plasma/sddm-kcm-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/sddm-kcm-kf6/translations.xml delete mode 100755 desktop/kde6/plasma/system-settings-kf6/actions.py delete mode 100755 desktop/kde6/plasma/system-settings-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/xdg-desktop-portal-kde-kf6/actions.py delete mode 100755 desktop/kde6/plasma/xdg-desktop-portal-kde-kf6/pspec.xml delete mode 100755 desktop/kde6/plasma/xdg-desktop-portal-kde-kf6/translations.xml diff --git a/desktop/kde6/applications/akonadi-calendar-kf6/actions.py b/desktop/kde6/applications/akonadi-calendar-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/akonadi-calendar-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/akonadi-calendar-kf6/files/qt5.patch b/desktop/kde6/applications/akonadi-calendar-kf6/files/qt5.patch deleted file mode 100755 index 97c93f74af..0000000000 --- a/desktop/kde6/applications/akonadi-calendar-kf6/files/qt5.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -Nuar a/src/incidencechanger_p.cpp b/src/incidencechanger_p.cpp ---- a/src/incidencechanger_p.cpp 2017-12-04 13:20:36.000000000 +0300 -+++ b/src/incidencechanger_p.cpp 2017-12-16 22:01:34.956659792 +0300 -@@ -189,7 +189,9 @@ - << "isValid = " << mDefaultCollection.isValid() - << "has ACLs = " << hasRights(mDefaultCollection, ChangeTypeCreate); - // else fallthrough, and ask the user. -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - case DestinationPolicyAsk: { - mPendingCreations << change; - loadCollections(); // Now we wait, collections are being loaded async diff --git a/desktop/kde6/applications/akonadi-calendar-kf6/pspec.xml b/desktop/kde6/applications/akonadi-calendar-kf6/pspec.xml deleted file mode 100755 index e9a06a352c..0000000000 --- a/desktop/kde6/applications/akonadi-calendar-kf6/pspec.xml +++ /dev/null @@ -1,198 +0,0 @@ - - - - - akonadi-calendar-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - Akonadi calendar integration - Calendar integration for Akonadi. - mirrors://kde/stable/release-service/24.12.1/src/akonadi-calendar-24.12.1.tar.xz - - qt6-base-devel - ki18n-kf6-devel - kcodecs-kf6-devel - kdoctools-kf6-devel - boost-devel - kio-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kmailtransport-kf6-devel - akonadi-kf6-devel - extra-cmake-modules-kf6 - akonadi-mime-kf6-devel - kmime-kf6-devel - cyrus-sasl-devel - kcontacts-kf6-devel - kidentitymanagement-kf6-devel - kcalendarcore-kf6-devel - kcalutils-kf6-devel - akonadi-contacts-kf6-devel - prison-kf6-devel - grantleetheme-kf6-devel - - knotifications-kf6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - kimap-kf6-devel - libkleo-kf6-devel - libkdepim-kf6-devel - - - - - - - - akonadi-calendar-kf6 - - qt6-base - ki18n-kf6 - kcodecs-kf6 - kio-kf6 - kmime-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kcalendarcore-kf6 - kcalutils-kf6 - kcontacts-kf6 - akonadi-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - kwidgetsaddons-kf6 - kidentitymanagement-kf6 - akonadi-mime-kf6 - akonadi-contacts-kf6 - prison-kf6 - knotifications-kf6 - grantleetheme-kf6 - - messagelib-kf6 - pimcommon-kf6 - kimap-kf6 - libkleo-kf6 - libkdepim-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - /usr/bin - - - - - akonadi-calendar-kf6-devel - Development files for akonadi-calendar-kf6 - - qt6-base-devel - akonadi-calendar-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/akonadi-calendar-tools-kf6/actions.py b/desktop/kde6/applications/akonadi-calendar-tools-kf6/actions.py deleted file mode 100755 index dc7d4ed6e8..0000000000 --- a/desktop/kde6/applications/akonadi-calendar-tools-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/akonadi-calendar-tools-kf6/files/qt5.patch b/desktop/kde6/applications/akonadi-calendar-tools-kf6/files/qt5.patch deleted file mode 100755 index 1612503cf4..0000000000 --- a/desktop/kde6/applications/akonadi-calendar-tools-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:02:08.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-17 11:30:46.413624475 +0300 -@@ -46,7 +46,7 @@ - set(KDEPIM_LIB_VERSION "${KDEPIM_VERSION_NUMBER}") - set(KDEPIM_LIB_SOVERSION "5") - --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Widgets) - - diff --git a/desktop/kde6/applications/akonadi-calendar-tools-kf6/pspec.xml b/desktop/kde6/applications/akonadi-calendar-tools-kf6/pspec.xml deleted file mode 100755 index 8ae505527a..0000000000 --- a/desktop/kde6/applications/akonadi-calendar-tools-kf6/pspec.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - akonadi-calendar-tools-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - CLI tools to manage akonadi calendars - CLI tools to manage akonadi calendars - https://download.kde.org/stable/release-service/24.12.1/src/akonadi-calendar-tools-24.12.1.tar.xz - - boost-devel - akonadi-kf6-devel - akonadi-calendar-kf6-devel - extra-cmake-modules-kf6 - - kdoctools-kf6-devel - qt6-base-devel - kcompletion-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - - - - kunitconversion-kf6-devel - akonadi-contacts-kf6-devel - kcalutils-kf6-devel - libkdepim-kf6-devel - calendarsupport-kf6-devel - kmime-kf6-devel - kidentitymanagement-kf6-devel - - - - - - - - - akonadi-calendar-tools-kf6 - CLI tools to manage akonadi calendars - - ki18n-kf6 - libgcc - akonadi-kf6 - kconfig-kf6 - kcalendarcore-kf6 - qt6-base - kcalutils-kf6 - kcoreaddons-kf6 - calendarsupport-kf6 - akonadi-calendar-kf6 - - akonadi-notes-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/akonadi-contacts-kf6/actions.py b/desktop/kde6/applications/akonadi-contacts-kf6/actions.py deleted file mode 100755 index e241e5ce33..0000000000 --- a/desktop/kde6/applications/akonadi-contacts-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - #pisitools.dodoc("COPYING", "COPYING.BSD", "COPYING.LIB") diff --git a/desktop/kde6/applications/akonadi-contacts-kf6/files/qt5.patch b/desktop/kde6/applications/akonadi-contacts-kf6/files/qt5.patch deleted file mode 100755 index 1b98fed6e4..0000000000 --- a/desktop/kde6/applications/akonadi-contacts-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:02:01.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 19:06:49.046309936 +0300 -@@ -30,7 +30,7 @@ - set(kmime-kf6LIB_VERSION "5.7.0") - set(AKONADI_VERSION "5.7.0") - --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Widgets Test) - ########### Find packages ########### - find_package(KF5kio-kf6 ${KF5_VERSION} CONFIG REQUIRED) diff --git a/desktop/kde6/applications/akonadi-contacts-kf6/pspec.xml b/desktop/kde6/applications/akonadi-contacts-kf6/pspec.xml deleted file mode 100755 index 526e318781..0000000000 --- a/desktop/kde6/applications/akonadi-contacts-kf6/pspec.xml +++ /dev/null @@ -1,193 +0,0 @@ - - - - - akonadi-contacts-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - Libraries and daemons to implement Contact Management in Akonadi. - Libraries and daemons to implement Contact Management in Akonadi. - mirrors://kde/stable/release-service/24.12.1/src/akonadi-contacts-24.12.1.tar.xz - - qt6-base-devel - qt6-webengine-devel - libical-devel - ki18n-kf6-devel - prison-kf6-devel - gettext-devel - kdoctools-kf6-devel - boost-devel - kguiaddons-kf6-devel - akonadi-kf6-devel - extra-cmake-modules-kf6 - kio-kf6-devel - - kmime-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - kitemmodels-kf6-devel - ktexttemplate-kf6-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - grantleetheme-kf6-devel - kunitconversion-kf6-devel - - - kcmutils-kf6-devel - ktextaddons-kf6-devel - - - - - - - - akonadi-contacts-kf6 - - qt6-base - ki18n-kf6 - kcodecs-kf6 - kmime-kf6 - kio-kf6 - akonadi-kf6 - prison-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kjobwidgets-kf6 - kservice-kf6 - kcmutils-kf6 - kcompletion-kf6 - kcontacts-kf6 - qt6-webengine - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - kguiaddons-kf6 - - grantleetheme-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - ktexttemplate-kf6 - ktextaddons-kf6-devel - - - /etc/xdg - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - akonadi-contacts-kf6-devel - Development files for akonadi-contacts-kf6 - - qt6-base-devel - akonadi-contacts-kf6 - grantleetheme-kf6-devel - - ktexttemplate-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/akonadi-import-wizard-kf6/actions.py b/desktop/kde6/applications/akonadi-import-wizard-kf6/actions.py deleted file mode 100755 index dc7d4ed6e8..0000000000 --- a/desktop/kde6/applications/akonadi-import-wizard-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/akonadi-import-wizard-kf6/pspec.xml b/desktop/kde6/applications/akonadi-import-wizard-kf6/pspec.xml deleted file mode 100755 index ee843f565e..0000000000 --- a/desktop/kde6/applications/akonadi-import-wizard-kf6/pspec.xml +++ /dev/null @@ -1,184 +0,0 @@ - - - - - akonadi-import-wizard-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - CLI tools to manage akonadi calendars - Import data from other mail clients to kmail-kf6 - https://download.kde.org/stable/release-service/24.12.1/src/akonadi-import-wizard-24.12.1.tar.xz - - boost-devel - akonadi-kf6-devel - akonadi-calendar-kf6-devel - extra-cmake-modules-kf6 - kio-kf6-devel - kdoctools-kf6-devel - qt6-base-devel - qt6-keychain-devel - kcompletion-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - kiconthemes-kf6-devel - kunitconversion-kf6-devel - akonadi-contacts-kf6-devel - kcalutils-kf6-devel - libkdepim-kf6-devel - calendarsupport-kf6-devel - kmime-kf6-devel - kidentitymanagement-kf6-devel - kmailtransport-kf6-devel - akonadi-mime-kf6-devel - cyrus-sasl-devel - mailcommon-kf6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - kimap-kf6-devel - libkleo-kf6-devel - gpgme-devel - gpgme-qt6-devel - mailimporter-kf6-devel - ffmpeg-devel - libXScrnSaver-devel - - - - - akonadi-import-wizard-kf6 - Import data from other mail clients to kmail-kf6 - - ki18n-kf6 - kcrash-kf6 - libgcc - akonadi-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - qt6-base - qt6-keychain - kcontacts-kf6 - libkdepim-kf6 - pimcommon-kf6 - mailcommon-kf6 - messagelib-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - mailimporter-kf6 - kmailtransport-kf6 - kwidgetsaddons-kf6 - kidentitymanagement-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - /usr/lib - - - - akonadi-import-wizard-kf6-devel - Development files for akonadi-import-wizard-kf6 - - akonadi-import-wizard-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/akonadi-kf6/actions.py b/desktop/kde6/applications/akonadi-kf6/actions.py deleted file mode 100755 index 1ed97872e8..0000000000 --- a/desktop/kde6/applications/akonadi-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure("-DCMAKE_BUILD_TYPE=Release \ - -DINSTALL_QSQLITE_IN_QT_PREFIX=TRUE \ - -DMYSQLD_EXECUTABLE:FILEPATH=/usr/bin/mysqld \ - -DWITH_SOPRANO=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() - pisitools.dodoc("AUTHORS", "NEWS", "README.md") diff --git a/desktop/kde6/applications/akonadi-kf6/files/akonadi-apparmor.patch b/desktop/kde6/applications/akonadi-kf6/files/akonadi-apparmor.patch deleted file mode 100644 index 26e7b4206c..0000000000 --- a/desktop/kde6/applications/akonadi-kf6/files/akonadi-apparmor.patch +++ /dev/null @@ -1,165 +0,0 @@ -From 9c33b1b4f71c45f9943418ab1d6c8abf1ce8c90f Mon Sep 17 00:00:00 2001 -From: nl 6720 -Date: Thu, 26 Dec 2019 03:02:57 +0100 -Subject: Support more distributions in the AppArmor profiles - -Summary: -This fixes Akonadi on Arch Linux (and possibly others). - -Changes to the AppArmor profiles: - -- Allow writing and locking `/run/user/${uid}/akonadi`, the database engine socket is stored there. -- Add `abstractions/consoles`, needed for console output. - -PostgreSql specific: -- Add bash (it is a common default shell). -- Support `/usr/bin/*` paths for PostgreSQL binaries. -- Support `pg_upgrade`. - -MySQL specific: -- Add bash (it is a common default shell). -- Add `/usr/bin/mysqld` as a path for the MySQL daemon binary. -- Add `abstractions/openssl`. When using MySQL, both `akonadiserver` and `mysqld` will try to read `/etc/ssl/openssl.cnf`. -- Add `/etc/my.cnf` and `/etc/my.cnf.d/`, on Arch Linux the `my.cnf` configuration is stored there. - -Test Plan: `akonadictl start` on a system with active AppArmor and loaded profiles. - -Reviewers: #kde_pim, knauss - -Reviewed By: #kde_pim, knauss - -Subscribers: arojas, dvratil, knauss, jriddell, kde-pim, #kde_pim - -Tags: #kde_pim - -Differential Revision: https://phabricator.kde.org/D25964 ---- - apparmor/mysqld_akonadi | 8 +++++++- - apparmor/postgresql_akonadi | 24 ++++++++++++++++++++---- - apparmor/usr.bin.akonadiserver | 11 +++++++++-- - 3 files changed, 36 insertions(+), 7 deletions(-) - -diff --git a/apparmor/mysqld_akonadi b/apparmor/mysqld_akonadi -index c769d87..224b5b0 100644 ---- a/apparmor/mysqld_akonadi -+++ b/apparmor/mysqld_akonadi -@@ -4,7 +4,10 @@ - - profile mysqld_akonadi { - #include -+ #include -+ #include - #include -+ #include - #include - - capability setgid, -@@ -15,7 +18,9 @@ profile mysqld_akonadi { - - /etc/mysql/ r, - /etc/mysql/** r, -+ /etc/my.cnf{,.d/**} r, - @{sys}/devices/system/cpu/ r, -+ /{usr/,}bin/{b,d}ash mrix, - /{usr/,}bin/cat mrix, - /{usr/,}bin/chmod mrix, - /{usr/,}bin/dirname mrix, -@@ -26,8 +31,9 @@ profile mysqld_akonadi { - /usr/bin/mysql_install_db mrix, - /usr/bin/mysqladmin mrix, - /usr/bin/mysqlcheck mrix, -- /usr/sbin/mysqld mrix, -+ /usr/{,s}bin/mysqld mrix, - /usr/share/mysql/** r, - owner @{xdg_data_home}/akonadi/** rwk, - owner @{PROC}/@{pid}/loginuid r, -+ owner /{,var/}run/user/@{uid}/akonadi** rwk, - } -diff --git a/apparmor/postgresql_akonadi b/apparmor/postgresql_akonadi -index 3992204..e5f7712 100644 ---- a/apparmor/postgresql_akonadi -+++ b/apparmor/postgresql_akonadi -@@ -4,19 +4,35 @@ - - profile postgresql_akonadi { - #include -+ #include -+ #include -+ #include - #include - - capability setgid, - capability setuid, - - /etc/passwd r, -- /{usr/,}bin/dash mrix, -+ /{usr/,}bin/{b,d}ash mrix, - /{usr/,}bin/locale mrix, -- /usr/lib/postgresql/*/bin/initdb mrix, -- /usr/lib/postgresql/*/bin/pg_ctl mrix, -- /usr/lib/postgresql/*/bin/postgres mrix, -+ /{usr/,usr/lib/postgresql/*/,opt/pgsql*/}bin/initdb mrix, -+ /{usr/,usr/lib/postgresql/*/,opt/pgsql*/}bin/pg_ctl mrix, -+ /{usr/,usr/lib/postgresql/*/,opt/pgsql*/}bin/postgres mrix, - /usr/share/postgresql/** r, - owner /dev/shm/PostgreSQL.* rw, - owner @{xdg_data_home}/akonadi/** rwlk, - owner @{xdg_data_home}/akonadi/db_data/** l, -+ owner /{,var/}run/user/@{uid}/akonadi** rwk, -+ -+ # pg_upgrade -+ /{usr/,usr/lib/postgresql/*/}bin/pg_upgrade mrix, -+ /opt/pgsql*/** mr, -+ /{usr/,usr/lib/postgresql/*/,opt/pgsql*/}bin/pg_controldata mrix, -+ /{usr/,usr/lib/postgresql/*/,opt/pgsql*/}bin/pg_resetwal mrix, -+ /{usr/,usr/lib/postgresql/*/,opt/pgsql*/}bin/pg_dumpall mrix, -+ /{usr/,usr/lib/postgresql/*/,opt/pgsql*/}bin/pg_dump mrix, -+ /{usr/,usr/lib/postgresql/*/,opt/pgsql*/}bin/vacuumdb mrix, -+ /{usr/,usr/lib/postgresql/*/,opt/pgsql*/}bin/psql mrix, -+ /{usr/,usr/lib/postgresql/*/,opt/pgsql*/}bin/pg_restore mrix, -+ /{usr/,}bin/cp mrix, - } -diff --git a/apparmor/usr.bin.akonadiserver b/apparmor/usr.bin.akonadiserver -index 7acaa06..697d315 100644 ---- a/apparmor/usr.bin.akonadiserver -+++ b/apparmor/usr.bin.akonadiserver -@@ -6,8 +6,10 @@ - - /usr/bin/akonadiserver { - #include -+ #include - #include - #include -+ #include - #include - #include - -@@ -19,12 +21,15 @@ - /usr/bin/mysql_install_db PUx -> mysqld_akonadi, - /usr/bin/mysqladmin PUx -> mysqld_akonadi, - /usr/bin/mysqlcheck PUx -> mysqld_akonadi, -- /usr/lib/postgresql/*/bin/initdb PUx -> postgresql_akonadi, -- /usr/lib/postgresql/*/bin/pg_ctl PUx -> postgresql_akonadi, -+ /usr/{,s}bin/mysqld PUx -> mysqld_akonadi, -+ /{usr/,usr/lib/postgresql/*/,opt/pgsql*/}bin/initdb PUx -> postgresql_akonadi, -+ /{usr/,usr/lib/postgresql/*/,opt/pgsql*/}bin/pg_ctl PUx -> postgresql_akonadi, -+ /{usr/,usr/lib/postgresql/*/}bin/pg_upgrade PUx -> postgresql_akonadi, - /usr/sbin/mysqld PUx -> mysqld_akonadi, - /usr/share/mime/mime.cache r, - /usr/share/mime/packages/ r, - /usr/share/mime/types r, -+ /usr/share/qt/translations/* r, - @{PROC}/sys/kernel/core_pattern r, - @{PROC}/sys/kernel/random/boot_id r, - owner @{xdg_config_home}/* r, -@@ -43,4 +48,6 @@ - owner @{xdg_data_home}/akonadi/** rwk, - owner @{PROC}/@{pid}/loginuid r, - owner @{PROC}/@{pid}/mounts r, -+ owner /{,var/}run/user/@{uid}/akonadi** rwk, -+ owner /tmp/#[0-9]* m, - } --- -cgit v1.1 - - diff --git a/desktop/kde6/applications/akonadi-kf6/files/dbupdater.diff b/desktop/kde6/applications/akonadi-kf6/files/dbupdater.diff deleted file mode 100755 index a367067641..0000000000 --- a/desktop/kde6/applications/akonadi-kf6/files/dbupdater.diff +++ /dev/null @@ -1,41 +0,0 @@ -commit 4ca8b846baaad48ebbd723f6411f9571a3b0f5ad -Author: Dan Vrátil -Date: Tue Apr 22 11:28:07 2014 +0200 - - Remove the invalid GID part from PartTable before starting PartTable migration - - More people than we expected have invalid 'GID' part in their PartTable, - which breaks migration to schema 25, because it expects all part types - to have a valid name. - - To work around this fact, we DELETE all parts with name 'GID' from PartTable - before starting the actual migration. This will not fix the migration for - people with other invalid parts, but I haven't heard of any such. To make - this completely bullet-proof, we would need to iterate through all entries, - which would be massively slower than current INSERT INTO ... SELECT FROM approach. - - Distributions, this is a good choice for backporting into 1.12.1 ;-) - - BUG: 331867 - FIXED-IN: 1.12.2 - -diff --git a/server/src/storage/dbupdater.cpp b/server/src/storage/dbupdater.cpp -index ccaf584..d6368b5 100644 ---- a/server/src/storage/dbupdater.cpp -+++ b/server/src/storage/dbupdater.cpp -@@ -261,6 +261,15 @@ bool DbUpdater::complexUpdate_25() - } - } - -+ { -+ // It appears that more users than expected have the invalid "GID" part in their -+ // PartTable, which breaks the migration below (see BKO#331867), so we apply this -+ // wanna-be fix to remove the invalid part before we start the actual migration. -+ QueryBuilder qb( QLatin1String( "PartTable" ), QueryBuilder::Delete ); -+ qb.addValueCondition( QLatin1String( "PartTable.name" ), Query::Equals, QLatin1String( "GID" ) ); -+ qb.exec(); -+ } -+ - akDebug() << "Creating a PartTable_new"; - { - TableDescription description; diff --git a/desktop/kde6/applications/akonadi-kf6/files/qt5.patch b/desktop/kde6/applications/akonadi-kf6/files/qt5.patch deleted file mode 100755 index bbcbf9cf97..0000000000 --- a/desktop/kde6/applications/akonadi-kf6/files/qt5.patch +++ /dev/null @@ -1,48 +0,0 @@ -diff -Nuar a/autotests/libs/testrunner/setup.cpp b/autotests/libs/testrunner/setup.cpp ---- a/autotests/libs/testrunner/setup.cpp 2017-12-04 19:40:18.000000000 +0300 -+++ b/autotests/libs/testrunner/setup.cpp 2017-12-16 12:43:17.517970333 +0300 -@@ -309,7 +309,9 @@ - case Akonadi::ServerManager::NotRunning: - case Akonadi::ServerManager::Broken: - shutdownHarder(); -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - case Akonadi::ServerManager::Stopping: - // safety timeout - QTimer::singleShot(30 * 1000, this, &SetupTest::shutdownHarder); -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:01:14.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 12:43:59.721967288 +0300 -@@ -29,7 +29,7 @@ - - include(AkonadiMacros) - --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - set(AKONADI_VERSION ${PIM_VERSION}) - - ecm_setup_version(PROJECT -diff -Nuar a/src/core/models/entitytreemodel.cpp b/src/core/models/entitytreemodel.cpp ---- a/src/core/models/entitytreemodel.cpp 2017-12-04 19:40:18.000000000 +0300 -+++ b/src/core/models/entitytreemodel.cpp 2017-12-16 12:43:10.167970863 +0300 -@@ -324,7 +324,9 @@ - } - } - // fall through. -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - } - default: - return entityData(collection, index.column(), role); -@@ -373,7 +375,9 @@ - } - } - // fall through. -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - } - default: - return entityData(item, index.column(), role); diff --git a/desktop/kde6/applications/akonadi-kf6/pspec.xml b/desktop/kde6/applications/akonadi-kf6/pspec.xml deleted file mode 100755 index fffbc3cc46..0000000000 --- a/desktop/kde6/applications/akonadi-kf6/pspec.xml +++ /dev/null @@ -1,200 +0,0 @@ - - - - - akonadi-kf6 - https://userbase.kde.org/Akonadi - - PisiLinux Community - admins@pisilinux.org - - LGPLv2.1 - akonadi - library - PIM (Personal Information Management) Storage Service - akonadi is an extensible cross-desktop storage service for PIM data and meta data providing concurrent read, write, and query access. - mirrors://kde/stable/release-service/24.12.1/src/akonadi-24.12.1.tar.xz - - qt6-base-devel - qt6-designer-devel - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - qt6-sql-postgresql - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - - ki18n-kf6-devel - kiconthemes-kf6-devel - - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - sqlite-devel - shared-mime-info - mariadb-client - mariadb-server - postgresql-server - libxslt-devel - boost-devel - kitemmodels-kf6-devel - - kio-kf6-devel - kaccounts-integration-kf6-devel - libaccounts-qt6-devel - extra-cmake-modules-kf6 - libaccounts-glib-devel - xz-devel - - - - - - - - akonadi-kf6 - app:console - - kio-kf6 - sqlite - libgcc - ki18n-kf6 - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - libxml2 - qt6-base - - kitemmodels-kf6 - kcoreaddons-kf6 - - kiconthemes-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - mariadb-client - mariadb-server - - postgresql-server - libaccounts-qt6 - kaccounts-integration-kf6 - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-postgresql - - - /etc - /etc/xdg - /usr/bin - /usr/lib - /usr/share/dbus-1 - /usr/share/mime - /usr/share - /usr/share/doc/ - - - - - akonadi-kf6-devel - Development files for akonadi - - akonadi-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/akonadi-kf6/translations.xml b/desktop/kde6/applications/akonadi-kf6/translations.xml deleted file mode 100755 index e5cb4a9696..0000000000 --- a/desktop/kde6/applications/akonadi-kf6/translations.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - akonadi - PIM (Kişisel Bilgi Yönetimi) Depolama Servisi - Akonadi, PIM verisi ve meta veriler için eşzamanlı okuma, yazma ve sorgulama yapma imkanı sağlayan, masaüstü ortamından bağımsız, genişletilebilir bir depolama servisidir. - - - - akonadi-kf6-devel - akonadi için geliştirme dosyaları - - diff --git a/desktop/kde6/applications/akonadi-mime-kf6/actions.py b/desktop/kde6/applications/akonadi-mime-kf6/actions.py deleted file mode 100755 index e241e5ce33..0000000000 --- a/desktop/kde6/applications/akonadi-mime-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - #pisitools.dodoc("COPYING", "COPYING.BSD", "COPYING.LIB") diff --git a/desktop/kde6/applications/akonadi-mime-kf6/pspec.xml b/desktop/kde6/applications/akonadi-mime-kf6/pspec.xml deleted file mode 100755 index e927b51f6f..0000000000 --- a/desktop/kde6/applications/akonadi-mime-kf6/pspec.xml +++ /dev/null @@ -1,159 +0,0 @@ - - - - - akonadi-mime-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - Libraries and daemons to implement basic email handling - Libraries and daemons to implement basic email handling - mirrors://kde/stable/release-service/24.12.1/src/akonadi-mime-24.12.1.tar.xz - - qt6-base-devel - boost-devel - ki18n-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - gettext-devel - akonadi-kf6-devel - extra-cmake-modules-kf6 - kxmlgui-kf6-devel - libxslt-devel - extra-cmake-modules-kf6 - kmime-kf6-devel - kio-kf6-devel - shared-mime-info - - - - - akonadi-mime-kf6 - - qt6-base - ki18n-kf6 - akonadi-kf6 - libgcc - kio-kf6 - kmime-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - akonadi-mime-kf6-devel - Development files for akonadi-mime-kf6 - - qt6-base-devel - akonadi-mime-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/akonadi-notes-kf6/actions.py b/desktop/kde6/applications/akonadi-notes-kf6/actions.py deleted file mode 100755 index e241e5ce33..0000000000 --- a/desktop/kde6/applications/akonadi-notes-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - #pisitools.dodoc("COPYING", "COPYING.BSD", "COPYING.LIB") diff --git a/desktop/kde6/applications/akonadi-notes-kf6/files/qt5.patch b/desktop/kde6/applications/akonadi-notes-kf6/files/qt5.patch deleted file mode 100755 index 29df8fedec..0000000000 --- a/desktop/kde6/applications/akonadi-notes-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:02:04.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-17 11:11:24.680708300 +0300 -@@ -22,7 +22,7 @@ - include(ECMCoverageOption) - - --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - set(AKONADI_NOTES_VERSION ${PIM_VERSION}) - - set(kmime-kf6LIB_VERSION "5.7.0") diff --git a/desktop/kde6/applications/akonadi-notes-kf6/pspec.xml b/desktop/kde6/applications/akonadi-notes-kf6/pspec.xml deleted file mode 100755 index 98b78237b0..0000000000 --- a/desktop/kde6/applications/akonadi-notes-kf6/pspec.xml +++ /dev/null @@ -1,146 +0,0 @@ - - - - - akonadi-notes-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - Libraries and daemons to implement management of notes in Akonadi - Libraries and daemons to implement management of notes in Akonadi - mirrors://kde/stable/release-service/24.08.3/src/akonadi-notes-24.08.3.tar.xz - - qt6-base-devel - boost-devel - ki18n-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - gettext-devel - akonadi-kf6-devel - extra-cmake-modules-kf6 - kxmlgui-kf6-devel - libxslt-devel - extra-cmake-modules-kf6 - kmime-kf6-devel - shared-mime-info - - - - - - - - akonadi-notes-kf6 - - qt6-base - ki18n-kf6 - akonadi-kf6 - libgcc - kio-kf6 - kmime-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - akonadi-notes-kf6-devel - Development files for akonadi-notes-kf6 - - qt6-base-devel - akonadi-notes-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/akonadi-search-kf6/actions.py b/desktop/kde6/applications/akonadi-search-kf6/actions.py deleted file mode 100755 index 5ba0db45e0..0000000000 --- a/desktop/kde6/applications/akonadi-search-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*") diff --git a/desktop/kde6/applications/akonadi-search-kf6/files/qt5.patch b/desktop/kde6/applications/akonadi-search-kf6/files/qt5.patch deleted file mode 100755 index 5c5eadc0e0..0000000000 --- a/desktop/kde6/applications/akonadi-search-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:01:18.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 18:01:14.579593828 +0300 -@@ -32,7 +32,7 @@ - set(kcontacts-kf6_LIB_VERSION "5.7.0") - set(kcalendarcore-kf6_LIB_VERSION "5.7.0") - set(kmime-kf6_LIB_VERSION "5.7.0") --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - - find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Core Test) - find_package(KF5 ${KF5_VERSION} REQUIRED COMPONENTS I18n Config Crash kcmutils-kf6) diff --git a/desktop/kde6/applications/akonadi-search-kf6/pspec.xml b/desktop/kde6/applications/akonadi-search-kf6/pspec.xml deleted file mode 100755 index 270eb1af42..0000000000 --- a/desktop/kde6/applications/akonadi-search-kf6/pspec.xml +++ /dev/null @@ -1,199 +0,0 @@ - - - - - akonadi-search-kf6 - https://kde.org/ - - PisiLinux Community - admins@pisilinux.org - - LGPLv2.1 - akonadi - library - Libraries and daemons to implement searching in Akonadi - Libraries and daemons to implement searching in Akonadi - mirrors://kde/stable/release-service/24.12.1/src/akonadi-search-24.12.1.tar.xz - - qt6-base-devel - kcrash-kf6-devel - kconfig-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - akonadi-kf6-devel - kcontacts-kf6-devel - kmime-kf6-devel - kjobwidgets-kf6-devel - kservice-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kcalendarcore-kf6-devel - libical-devel - kcompletion-kf6-devel - boost-devel - kcmutils-kf6-devel - krunner-kf6-devel - xapian-core-devel - kdoctools-kf6-devel - ktextaddons-kf6-devel - extra-cmake-modules-kf6 - akonadi-mime-kf6-devel - - - - - - - - akonadi-search-kf6 - app:console - - qt6-base - kio-kf6 - ki18n-kf6 - kmime-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kcalendarcore-kf6 - kcontacts-kf6 - kcoreaddons-kf6 - xapian-core - krunner-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - akonadi-kf6 - ktextaddons-kf6 - akonadi-mime-kf6 - - - /etc/akonadi - /etc/xdg - /usr/bin - /usr/lib - /usr/share/dbus-1 - /usr/share/config - /usr/share/mime - /usr/share/kde4 - /usr/share/doc/ - /usr/share/akonadi - /usr/share/kservice-kf6s5 - /usr/share/locale - /usr/share - - - - - akonadi-search-kf6-devel - Development files for akonadi - - akonadi-search-kf6 - qt6-base-devel - ki18n-kf6-devel - kmime-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kcalendarcore-kf6-devel - kcontacts-kf6-devel - kcoreaddons-kf6-devel - xapian-core-devel - kcmutils-kf6-devel - krunner-kf6-devel - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/akonadiconsole-kf6/actions.py b/desktop/kde6/applications/akonadiconsole-kf6/actions.py deleted file mode 100755 index dc7d4ed6e8..0000000000 --- a/desktop/kde6/applications/akonadiconsole-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/akonadiconsole-kf6/pspec.xml b/desktop/kde6/applications/akonadiconsole-kf6/pspec.xml deleted file mode 100755 index 7f162b7f04..0000000000 --- a/desktop/kde6/applications/akonadiconsole-kf6/pspec.xml +++ /dev/null @@ -1,185 +0,0 @@ - - - akonadiconsole-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - Akonadi management and debugging console - Akonadi management and debugging console - https://download.kde.org/stable/release-service/24.12.1/src/akonadiconsole-24.12.1.tar.xz - - akonadi-contacts-kf6-devel - akonadi-kf6-devel - akonadi-calendar-kf6-devel - pimcommon-kf6-devel - akonadi-mime-kf6-devel - calendarsupport-kf6-devel - extra-cmake-modules-kf6 - kimap-kf6-devel - kcalendarcore-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcontacts-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kitemmodels-kf6-devel - kmime-kf6-devel - kpimtextedit-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - kitemviews-kf6-devel - akonadi-search-kf6-devel - libkdepim-kf6-devel - libkleo-kf6-devel - messagelib-kf6-devel - qt6-base-devel - qt6-sql-mysql - qt6-sql-postgresql - qt6-sql-sqlite - qt6-sql-odbc - - - kunitconversion-kf6-devel - kidentitymanagement-kf6-devel - cyrus-sasl-devel - gpgme-devel - gpgme-qt6-devel - ffmpeg-devel - libXScrnSaver-devel - qt6-webengine-devel - - - - - akonadiconsole-kf6 - Akonadi management and debugging console - - akonadi-kf6 - akonadi-contacts-kf6 - akonadi-mime-kf6 - calendarsupport-kf6 - kcalendarcore-kf6 - qt6-base - ki18n-kf6 - kmime-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kcontacts-kf6 - libkdepim-kf6 - kitemviews-kf6 - messagelib-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kitemmodels-kf6 - kpimtextedit-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - /usr/lib - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/akregator-kf6/actions.py b/desktop/kde6/applications/akregator-kf6/actions.py deleted file mode 100755 index c1f8c6bea3..0000000000 --- a/desktop/kde6/applications/akregator-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*", "README*") - diff --git a/desktop/kde6/applications/akregator-kf6/pspec.xml b/desktop/kde6/applications/akregator-kf6/pspec.xml deleted file mode 100755 index d5a5ddb6fb..0000000000 --- a/desktop/kde6/applications/akregator-kf6/pspec.xml +++ /dev/null @@ -1,186 +0,0 @@ - - - - - akregator-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - A KDE blogging client - akregator-kf6 helps you to keep informed about new stories on websites like KDE Dot News and Planet KDE blogs. The technology used is RSS and many sites support it. - https://download.kde.org/stable/release-service/24.12.1/src/akregator-24.12.1.tar.xz - - boost-devel - extra-cmake-modules-kf6 - - - kdoctools-kf6-devel - kio-kf6-devel - ktexteditor-kf6-devel - python-devel - qt6-base-devel - qt6-webengine-devel - - kcmutils-kf6-devel - knotifyconfig-kf6-devel - akonadi-mime-kf6-devel - akonadi-kf6-devel - kitemmodels-kf6-devel - grantleetheme-kf6-devel - kcontacts-kf6-devel - kontactinterface-kf6-devel - libkdepim-kf6-devel - akonadi-contacts-kf6-devel - libkleo-kf6-devel - gpgme-devel - gpgme-qt6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - kimap-kf6-devel - kmime-kf6-devel - cyrus-sasl-devel - kpimtextedit-kf6-devel - ksyndication-kf6-devel - ffmpeg-devel - knotifyconfig-kf6-devel - knotifications-kf6-devel - kuserfeedback-kf6-devel - libXScrnSaver-devel - kstatusnotifieritem-kf6-devel - - - - - akregator-kf6 - A Feed Reader by KDE - - kio-kf6 - ki18n-kf6 - kcrash-kf6 - kparts-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - libkdepim-kf6 - pimcommon-kf6 - messagelib-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - kpimtextedit-kf6 - ksyndication-kf6 - ktextwidgets-kf6 - grantleetheme-kf6 - knotifyconfig-kf6 - qt6-webengine - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kontactinterface-kf6 - kstatusnotifieritem-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/analitza-kf6/actions.py b/desktop/kde6/applications/analitza-kf6/actions.py deleted file mode 100755 index 6f7219ba16..0000000000 --- a/desktop/kde6/applications/analitza-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*", "TODO") diff --git a/desktop/kde6/applications/analitza-kf6/pspec.xml b/desktop/kde6/applications/analitza-kf6/pspec.xml deleted file mode 100755 index 0cc6fb54f9..0000000000 --- a/desktop/kde6/applications/analitza-kf6/pspec.xml +++ /dev/null @@ -1,147 +0,0 @@ - - - - - analitza-kf6 - https://invent.kde.org/education/analitza - - PisiLinux Community - admins@pisilinux.org - - GPLv2+ - hi32-app-kalgebra-kf6 - library - desktop.kde.edu - A KDE library for mathematical features - analitza-kf6 is a library to add mathematical features to programs. - mirrors://kde/stable/release-service/24.12.1/src/analitza-24.12.1.tar.xz - - cmake - eigen3 - cups-devel - mesa-devel - qt6-svg-devel - extra-cmake-modules-kf6 - qt6-base-devel - qt6-5compat-devel - qt6-declarative-devel - qt6-linguist - - - - - analitza-kf6 - - mesa - libgcc - qt6-svg - qt6-base - qt6-declarative - - - /usr/lib - /usr/share/doc - /usr/share/libanalitza/ - /usr/share/locale - - - - - analitza-kf6-devel - Development files for analitza-kf6 - - analitza-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/analitza-kf6/translations.xml b/desktop/kde6/applications/analitza-kf6/translations.xml deleted file mode 100755 index c4d5c3ff22..0000000000 --- a/desktop/kde6/applications/analitza-kf6/translations.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - analitza-kf6 - Matematiksel özellikler için bir KDE kitaplığı - analitza-kf6, programlara matematiksel özellikler eklemek için bir kitaplıktır. - - - - analitza-kf6-devel - analitza-kf6 için geliştirme dosyaları - Development files for analitza-kf6 - - diff --git a/desktop/kde6/applications/ark-kf6/actions.py b/desktop/kde6/applications/ark-kf6/actions.py deleted file mode 100755 index a7464b1612..0000000000 --- a/desktop/kde6/applications/ark-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/ark-kf6/files/ark-23.08.2-dont-hardcode-bzip2-mimetype-in-tests.patch b/desktop/kde6/applications/ark-kf6/files/ark-23.08.2-dont-hardcode-bzip2-mimetype-in-tests.patch deleted file mode 100644 index bea9d7f72f..0000000000 --- a/desktop/kde6/applications/ark-kf6/files/ark-23.08.2-dont-hardcode-bzip2-mimetype-in-tests.patch +++ /dev/null @@ -1,44 +0,0 @@ -https://invent.kde.org/utilities/ark/-/commit/785640b090b51e0067dbfc6c7944a478429204a2 - -From 785640b090b51e0067dbfc6c7944a478429204a2 Mon Sep 17 00:00:00 2001 -From: Elvis Angelaccio -Date: Sat, 14 Oct 2023 17:34:10 +0200 -Subject: [PATCH] Don't hardcode bzip2 mimetype in tests - -Just take the name from QMimeDatabase, since it changes depending on -whether we are using a shared-mime-info >= 2.3 ---- a/autotests/kerfuffle/adddialogtest.cpp -+++ b/autotests/kerfuffle/adddialogtest.cpp -@@ -37,7 +37,7 @@ void AddDialogTest::testBasicWidgets_data() - - QTest::newRow("tar") << QStringLiteral("application/x-tar") << false << -1 << -1; - QTest::newRow("targzip") << QStringLiteral("application/x-compressed-tar") << true << 3 << 7; -- QTest::newRow("tarbzip") << QStringLiteral("application/x-bzip-compressed-tar") << true << 3 << 7; -+ QTest::newRow("tarbzip") << QMimeDatabase().mimeTypeForFile(QStringLiteral("dummy.tar.bz2"), QMimeDatabase::MatchExtension).name() << true << 3 << 7; - QTest::newRow("tarZ") << QStringLiteral("application/x-tarz") << false << -1 << -1; - QTest::newRow("tarxz") << QStringLiteral("application/x-xz-compressed-tar") << true << 3 << 7; - QTest::newRow("tarlzma") << QStringLiteral("application/x-lzma-compressed-tar") << true << 3 << 7; ---- a/autotests/kerfuffle/createdialogtest.cpp -+++ b/autotests/kerfuffle/createdialogtest.cpp -@@ -38,7 +38,7 @@ void CreateDialogTest::testBasicWidgets_data() - - QTest::newRow("tar") << QStringLiteral("application/x-tar"); - QTest::newRow("targzip") << QStringLiteral("application/x-compressed-tar"); -- QTest::newRow("tarbzip") << QStringLiteral("application/x-bzip-compressed-tar"); -+ QTest::newRow("tarbzip") << QMimeDatabase().mimeTypeForFile(QStringLiteral("dummy.tar.bz2"), QMimeDatabase::MatchExtension).name(); - QTest::newRow("tarZ") << QStringLiteral("application/x-tarz"); - QTest::newRow("tarxz") << QStringLiteral("application/x-xz-compressed-tar"); - QTest::newRow("tarlzma") << QStringLiteral("application/x-lzma-compressed-tar"); ---- a/autotests/kerfuffle/mimetypetest.cpp -+++ b/autotests/kerfuffle/mimetypetest.cpp -@@ -30,7 +30,7 @@ void MimeTypeTest::testMimeTypeDetection_data() - QTest::addColumn("expectedMimeType"); - - const QString compressedGzipTarMime = QStringLiteral("application/x-compressed-tar"); -- const QString compressedBzip2TarMime = QStringLiteral("application/x-bzip-compressed-tar"); -+ const QString compressedBzip2TarMime = QMimeDatabase().mimeTypeForFile(QStringLiteral("dummy.tar.bz2"), QMimeDatabase::MatchExtension).name(); - const QString compressedXzTarMime = QStringLiteral("application/x-xz-compressed-tar"); - const QString compressedLzmaTarMime = QStringLiteral("application/x-lzma-compressed-tar"); - const QString compressedZTarMime = QStringLiteral("application/x-tarz"); --- -GitLab \ No newline at end of file diff --git a/desktop/kde6/applications/ark-kf6/files/ark-23.08.2-explicitly-support-application-vnd-efi-iso-mime.patch b/desktop/kde6/applications/ark-kf6/files/ark-23.08.2-explicitly-support-application-vnd-efi-iso-mime.patch deleted file mode 100644 index 21181a51db..0000000000 --- a/desktop/kde6/applications/ark-kf6/files/ark-23.08.2-explicitly-support-application-vnd-efi-iso-mime.patch +++ /dev/null @@ -1,36 +0,0 @@ -https://invent.kde.org/utilities/ark/-/commit/62d94c62f2fd2052be91dfe565e35a6d43c7d381 - -From 62d94c62f2fd2052be91dfe565e35a6d43c7d381 Mon Sep 17 00:00:00 2001 -From: Elvis Angelaccio -Date: Sat, 14 Oct 2023 15:21:53 +0200 -Subject: [PATCH] Explicitly support new application/vnd.efi.iso mimetype - -It has been introduced by the new shared-mime-info 2.3 release. The old -application/x-cd-image is kept as alias (so ark could still open ISO -files just fine), but it broke our mimetype unit test. - -While at it, we explicitly add the new entry to the list of supported -mimetypes. ---- a/autotests/kerfuffle/mimetypetest.cpp -+++ b/autotests/kerfuffle/mimetypetest.cpp -@@ -38,7 +38,7 @@ void MimeTypeTest::testMimeTypeDetection_data() - const QString compressedLzopTarMime = QStringLiteral("application/x-tzo"); - const QString compressedLrzipTarMime = QStringLiteral("application/x-lrzip-compressed-tar"); - const QString compressedLz4TarMime = QStringLiteral("application/x-lz4-compressed-tar"); -- const QString isoMimeType = QStringLiteral("application/x-cd-image"); -+ const QString isoMimeType = QMimeDatabase().mimeTypeForFile(QStringLiteral("dummy.iso"), QMimeDatabase::MatchExtension).name(); - const QString debMimeType = QMimeDatabase().mimeTypeForFile(QStringLiteral("dummy.deb"), QMimeDatabase::MatchExtension).name(); - const QString xarMimeType = QStringLiteral("application/x-xar"); - const QString appImageMimeType = QStringLiteral("application/x-iso9660-appimage"); ---- a/plugins/libarchive/kerfuffle_libarchive_readonly.json.cmake -+++ b/plugins/libarchive/kerfuffle_libarchive_readonly.json.cmake -@@ -71,6 +71,7 @@ - "application/x-lzop", - "application/x-source-rpm", - "application/vnd.debian.binary-package", -+ "application/vnd.efi.iso", - "application/vnd.ms-cab-compressed", - "application/x-xar", - "application/x-iso9660-appimage", --- -GitLab diff --git a/desktop/kde6/applications/ark-kf6/files/ark-23.08.2-fix-checks-using-old-ISO-mimetype.patch b/desktop/kde6/applications/ark-kf6/files/ark-23.08.2-fix-checks-using-old-ISO-mimetype.patch deleted file mode 100644 index 48d1b6d3e9..0000000000 --- a/desktop/kde6/applications/ark-kf6/files/ark-23.08.2-fix-checks-using-old-ISO-mimetype.patch +++ /dev/null @@ -1,44 +0,0 @@ -https://invent.kde.org/utilities/ark/-/commit/dac14f552fb147bf4c9f759611cdb3b544a500b9 - -From dac14f552fb147bf4c9f759611cdb3b544a500b9 Mon Sep 17 00:00:00 2001 -From: Elvis Angelaccio -Date: Sat, 14 Oct 2023 18:58:22 +0200 -Subject: [PATCH] Fix checks using old ISO mimetype - -The inherits() method doesn't work with mimetype aliases, and since shared-mime-info 2.3 -application/x-cd-image is an alias of application/vnd.efi.img ---- a/kerfuffle/mimetypes.cpp -+++ b/kerfuffle/mimetypes.cpp -@@ -104,7 +104,8 @@ QMimeType determineMimeType(const QString& filename, MimePreference mp) - } - - // #354344: ISO files are currently wrongly detected-by-content. -- if (mimeFromExtension.inherits(QStringLiteral("application/x-cd-image"))) { -+ // TODO: drop application/x-cd-image once all distributions ship shared-mime-info >= 2.3 -+ if (mimeFromExtension.inherits(QStringLiteral("application/vnd.efi.img")) || mimeFromExtension.inherits(QStringLiteral("application/x-cd-image"))) { - return mimeFromExtension; - } - ---- a/part/part.cpp -+++ b/part/part.cpp -@@ -926,7 +926,9 @@ void Part::slotCompleted() - qCWarning(ARK) << "No entry listed by the plugin"; - displayMsgWidget(KMessageWidget::Warning, xi18nc("@info", "The archive is empty or Ark could not open its content.")); - } else if (m_model->rowCount() == 1 && -- m_model->archive()->mimeType().inherits(QStringLiteral("application/x-cd-image")) && -+ // TODO: drop application/x-cd-image once all distributions ship shared-mime-info >= 2.3 -+ (m_model->archive()->mimeType().inherits(QStringLiteral("application/x-cd-image")) || -+ m_model->archive()->mimeType().inherits(QStringLiteral("application/vnd.efi.img"))) && - m_model->entryForIndex(m_model->index(0, 0))->fullPath() == QLatin1String("README.TXT")) { - qCWarning(ARK) << "Detected ISO image with UDF filesystem"; - displayMsgWidget(KMessageWidget::Warning, xi18nc("@info", "Ark does not currently support ISO files with UDF filesystem.")); --- -GitLab - - - -Questions or comments? -Please feel free to contact us. - -© 2001–2022 Gentoo Foundation, Inc. -Gentoo is a trademark of the Gentoo Foundation, Inc. The contents of this document, unless otherwise expressly stated, are licensed under the CC-BY-SA-4.0 license. The Gentoo Name and Logo Usage Guidelines apply. diff --git a/desktop/kde6/applications/ark-kf6/files/ark-23.08.2-fix-support-for-bzip2-format.patch b/desktop/kde6/applications/ark-kf6/files/ark-23.08.2-fix-support-for-bzip2-format.patch deleted file mode 100644 index 52ff8d74f4..0000000000 --- a/desktop/kde6/applications/ark-kf6/files/ark-23.08.2-fix-support-for-bzip2-format.patch +++ /dev/null @@ -1,121 +0,0 @@ -https://invent.kde.org/utilities/ark/-/commit/9bcbcb056c43abef88540c54f25bc6c1a78c7c0e - -From 9bcbcb056c43abef88540c54f25bc6c1a78c7c0e Mon Sep 17 00:00:00 2001 -From: Elvis Angelaccio -Date: Sat, 14 Oct 2023 17:07:16 +0200 -Subject: [PATCH] Fix support for bzip2 format with shared-mime-info 2.3 - -shared-mime-info 2.3 explicitly separated the mimetypes for bzip2 archives -from the mimetypes for the (old and deprecated) bzip archives. - -libarchive doesn't support the old bzip format, however we can't just -drop it from ark since we still need it on systems that use an old -shared-mime-info package. - -So for now we drop it only when we are sure that we are using a -shared-mime-info >= 2.3 ---- a/kerfuffle/mimetypes.cpp -+++ b/kerfuffle/mimetypes.cpp -@@ -76,6 +76,8 @@ QMimeType determineMimeType(const QString& filename, MimePreference mp) - mimeFromContent == db.mimeTypeForName(QStringLiteral("application/gzip"))) || - (mimeFromExtension.inherits(QStringLiteral("application/x-bzip-compressed-tar")) && - mimeFromContent == db.mimeTypeForName(QStringLiteral("application/x-bzip"))) || -+ (mimeFromExtension.inherits(QStringLiteral("application/x-bzip2-compressed-tar")) && -+ mimeFromContent == db.mimeTypeForName(QStringLiteral("application/x-bzip2"))) || - (mimeFromExtension.inherits(QStringLiteral("application/x-xz-compressed-tar")) && - mimeFromContent == db.mimeTypeForName(QStringLiteral("application/x-xz"))) || - (mimeFromExtension.inherits(QStringLiteral("application/x-tarz")) && ---- a/kerfuffle/pluginmanager.cpp -+++ b/kerfuffle/pluginmanager.cpp -@@ -165,6 +165,18 @@ QStringList PluginManager::supportedWriteMimeTypes(MimeSortingMode mode) const - supported.remove(QStringLiteral("application/x-tzo")); - } - -+ // shared-mime-info 2.3 explicitly separated application/x-bzip2-compressed-tar from application/x-bzip-compressed-tar -+ // since bzip2 is not compatible with the old (and deprecated) bzip format. -+ // See https://gitlab.freedesktop.org/xdg/shared-mime-info/-/merge_requests/239 -+ // With shared-mime-info 2.3 (or newer) we can't have both mimetypes at the same time, since libarchive does not support -+ // the old deprecated bzip format. Also we can't know which version of shared-mime-info the system is actually using. -+ // For these reasons, just take the mimetype from QMimeDatabase to keep the compatibility with any shared-mime-info version. -+ if (supported.contains(QLatin1String("application/x-bzip-compressed-tar")) && supported.contains(QLatin1String("application/x-bzip2-compressed-tar"))) { -+ supported.remove(QLatin1String("application/x-bzip-compressed-tar")); -+ supported.remove(QLatin1String("application/x-bzip2-compressed-tar")); -+ supported.insert(QMimeDatabase().mimeTypeForFile(QStringLiteral("dummy.tar.bz2"), QMimeDatabase::MatchExtension).name()); -+ } -+ - if (mode == SortByComment) { - return sortByComment(supported); - } ---- a/plugins/libarchive/CMakeLists.txt -+++ b/plugins/libarchive/CMakeLists.txt -@@ -4,7 +4,7 @@ include_directories(${LibArchive_INCLUDE_DIRS}) - - # NOTE: These are the mimetypes for "single-file" archives. They must be defined in the JSON metadata together with the "normal" mimetypes. - # However they need to be duplicated here because we need to pass them as C++ define to the plugin (see LIBARCHIVE_RAW_MIMETYPES define below). --set(SUPPORTED_LIBARCHIVE_RAW_MIMETYPES "application/x-compress;application/gzip;application/x-bzip;application/zlib;application/zstd;application/x-lzma;application/x-xz;application/x-lz4;application/x-lzip;application/x-lrzip;application/x-lzop;") -+set(SUPPORTED_LIBARCHIVE_RAW_MIMETYPES "application/x-compress;application/gzip;application/x-bzip;application/x-bzip2;application/zlib;application/zstd;application/x-lzma;application/x-xz;application/x-lz4;application/x-lzip;application/x-lrzip;application/x-lzop;") - - set(INSTALLED_LIBARCHIVE_PLUGINS "") - ---- a/plugins/libarchive/kerfuffle_libarchive.json.cmake -+++ b/plugins/libarchive/kerfuffle_libarchive.json.cmake -@@ -53,6 +53,7 @@ - "application/x-tar", - "application/x-compressed-tar", - "application/x-bzip-compressed-tar", -+ "application/x-bzip2-compressed-tar", - "application/x-tarz", - "application/x-xz-compressed-tar", - "application/x-lzma-compressed-tar", -@@ -119,6 +120,11 @@ - "CompressionLevelMax": 9, - "CompressionLevelMin": 1 - }, -+ "application/x-bzip2-compressed-tar": { -+ "CompressionLevelDefault": 9, -+ "CompressionLevelMax": 9, -+ "CompressionLevelMin": 1 -+ }, - "application/x-compressed-tar": { - "CompressionLevelDefault": 6, - "CompressionLevelMax": 9, ---- a/plugins/libarchive/kerfuffle_libarchive_readonly.json.cmake -+++ b/plugins/libarchive/kerfuffle_libarchive_readonly.json.cmake -@@ -61,6 +61,7 @@ - "application/x-compress", - "application/gzip", - "application/x-bzip", -+ "application/x-bzip2", - "application/x-lzma", - "application/x-xz", - "application/zlib", ---- a/plugins/libarchive/libarchiveplugin.cpp -+++ b/plugins/libarchive/libarchiveplugin.cpp -@@ -13,6 +13,7 @@ - - #include - -+#include - #include - #include - #include -@@ -34,6 +35,17 @@ LibarchivePlugin::LibarchivePlugin(QObject *parent, const QVariantList &args) - - #ifdef LIBARCHIVE_RAW_MIMETYPES - m_rawMimetypes = QStringLiteral(LIBARCHIVE_RAW_MIMETYPES).split(QLatin1Char(':'), Qt::SkipEmptyParts); -+ // shared-mime-info 2.3 explicitly separated application/x-bzip2 from application/x-bzip -+ // since bzip2 is not compatible with the old (and deprecated) bzip format. -+ // See https://gitlab.freedesktop.org/xdg/shared-mime-info/-/merge_requests/239 -+ // With shared-mime-info 2.3 (or newer) we can't have both mimetypes at the same time, since libarchive does not support -+ // the old deprecated bzip format. Also we can't know which version of shared-mime-info the system is actually using. -+ // For these reasons, just take the mimetype from QMimeDatabase to keep the compatibility with any shared-mime-info version. -+ if (m_rawMimetypes.contains(QLatin1String("application/x-bzip")) && m_rawMimetypes.contains(QLatin1String("application/x-bzip2"))) { -+ m_rawMimetypes.removeAll(QLatin1String("application/x-bzip")); -+ m_rawMimetypes.removeAll(QLatin1String("application/x-bzip2")); -+ m_rawMimetypes.append(QMimeDatabase().mimeTypeForFile(QStringLiteral("dummy.bz2"), QMimeDatabase::MatchExtension).name()); -+ } - qCDebug(ARK) << "# available raw mimetypes:" << m_rawMimetypes.count(); - #endif - } --- -GitLab \ No newline at end of file diff --git a/desktop/kde6/applications/ark-kf6/files/libzip.patch b/desktop/kde6/applications/ark-kf6/files/libzip.patch deleted file mode 100755 index 781cd268b0..0000000000 --- a/desktop/kde6/applications/ark-kf6/files/libzip.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Nuar a/plugins/libzipplugin/libzipplugin.cpp b/plugins/libzipplugin/libzipplugin.cpp ---- a/plugins/libzipplugin/libzipplugin.cpp 2018-04-09 23:42:03.000000000 +0300 -+++ b/plugins/libzipplugin/libzipplugin.cpp 2018-04-25 15:30:09.038240448 +0300 -@@ -41,6 +41,7 @@ - - #include - #include -+#include - - K_PLUGIN_FACTORY_WITH_JSON(LibZipPluginFactory, "kerfuffle_libzip.json", registerPlugin();) - diff --git a/desktop/kde6/applications/ark-kf6/pspec.xml b/desktop/kde6/applications/ark-kf6/pspec.xml deleted file mode 100755 index 179c0063e6..0000000000 --- a/desktop/kde6/applications/ark-kf6/pspec.xml +++ /dev/null @@ -1,183 +0,0 @@ - - - - - ark-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - desktop.kde6.utils - KDE Archiving Tool - Ark is a program for managing various archive formats within the KDE environment. - mirrors://kde/stable/release-service/24.12.1/src/ark-24.12.1.tar.xz - - qt6-base-devel - rar - lzop - bzip2 - unrar - p7zip - xz-devel - lzo-devel - zlib-devel - zstd-devel - kparts-kf6-devel - libzip-devel - karchive-kf6-devel - kconfig-kf6-devel - kcrash-kf6-devel - kio-kf6-devel - kpty-kf6-devel - kfilemetadata-kf6-devel - xz-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - docbook-xsl - libarchive-devel - extra-cmake-modules-kf6 - kitemmodels-kf6-devel - kwindowsystem-kf6-devel - - - - - - - - - - - - ark-kf6 - - qt6-base - zlib - libzip - libarchive - karchive-kf6 - kcrash-kf6 - kconfig-kf6 - kio-kf6 - unrar - kpty-kf6 - kfilemetadata-kf6 - ki18n-kf6 - libgcc - kxmlgui-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - kwidgetsaddons-kf6 - kparts-kf6 - kconfigwidgets-kf6 - kitemmodels-kf6 - p7zip - bzip2 - kwindowsystem-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/locale - /usr/lib - /usr/share/icons - /usr/share/man - /usr/share/doc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/artikulate-kf6/actions.py b/desktop/kde6/applications/artikulate-kf6/actions.py deleted file mode 100755 index ee66e7061b..0000000000 --- a/desktop/kde6/applications/artikulate-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import cmaketools -from pisi.actionsapi import kde6 - -def setup(): - cmaketools.configure("-B build -DBUILD_TESTING=OFF \ - -DKDE_INSTALL_LIBDIR=lib \ - -DCMAKE_INSTALL_PREFIX=/usr") - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*") diff --git a/desktop/kde6/applications/artikulate-kf6/pspec.xml b/desktop/kde6/applications/artikulate-kf6/pspec.xml deleted file mode 100755 index 278682bbdb..0000000000 --- a/desktop/kde6/applications/artikulate-kf6/pspec.xml +++ /dev/null @@ -1,197 +0,0 @@ - - - - - artikulate-kf6 - https://projects.kde.org/projects/kde/kdeedu/artikulate - - Osman Erkan - osman.erkan@pisilinux.org - - GPLv2 - LGPLv3 - FDLv1.2 - artikulate-kf6 - app:gui - desktop.kde.edu - Improve your pronunciation by listening to native speakers - artikulate-kf6, Improve your pronunciation by listening to native speakers. - mirrors://kde/stable/release-service/24.12.1/src/artikulate-24.12.1.tar.xz - - - - extra-cmake-modules-kf6 - ki18n-devel - kcrash-devel - kconfig-devel - karchive-devel - kcoreaddons-devel - knewstuff-devel - kirigami-devel - kdoctools-devel - qt5-declarative-devel - qt5-sql-postgresql - qt5-sql-mysql - qt5-sql-odbc - qt5-sql-sqlite - qt5-multimedia-devel - qt5-xmlpatterns-devel - - - - - artikulate-kf6 - - - - - extra-cmake-modules-kf6 - ki18n - kcrash - kconfig - karchive - kcoreaddons - knewstuff - kirigami - kdoctools - qt5-declarative - qt5-sql-postgresql - qt5-sql-mysql - qt5-sql-odbc - qt5-sql-sqlite - qt5-multimedia - qt5-xmlpatterns - - - /etc - /usr/lib - /usr/share/doc - /usr/bin - /usr/share - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/artikulate-kf6/translations.xml b/desktop/kde6/applications/artikulate-kf6/translations.xml deleted file mode 100755 index ff888e6183..0000000000 --- a/desktop/kde6/applications/artikulate-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - artikulate-kf6 - Improve your pronunciation by listening to native speakers - artikulate-kf6, Improve your pronunciation by listening to native speakers. - - diff --git a/desktop/kde6/applications/audiocd-kio-kf6/actions.py b/desktop/kde6/applications/audiocd-kio-kf6/actions.py deleted file mode 100755 index 995dd6b97e..0000000000 --- a/desktop/kde6/applications/audiocd-kio-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING", "COPYING.DOC") diff --git a/desktop/kde6/applications/audiocd-kio-kf6/pspec.xml b/desktop/kde6/applications/audiocd-kio-kf6/pspec.xml deleted file mode 100755 index 0fe65e4010..0000000000 --- a/desktop/kde6/applications/audiocd-kio-kf6/pspec.xml +++ /dev/null @@ -1,177 +0,0 @@ - - - - - audiocd-kio-kf6 - https://www.kde.org/applications/multimedia/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - GPL - LGPL - kio-kf6slave for accessing audio CDs - kio-kf6slave for accessing audio CDs - https://download.kde.org/stable/release-service/24.12.1/src/audiocd-kio-24.12.1.tar.xz - - cdparanoia-devel - flac-devel - gettext-devel - kconfig-kf6-devel - - kdoctools-kf6-devel - kio-kf6-devel - lame-devel - libkcompactdisc-kf6-devel - libvorbis-devel - qt6-base-devel - qt6-5compat-devel - ki18n-kf6-devel - qt6-phonon-devel - extra-cmake-modules-kf6 - libogg-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - libkcddb-kf6 - kcmutils-kf6-devel - - - - audiocd-kio-kf6 - kio-kf6slave for accessing audio CDs - - cdparanoia - flac - lame - libkcompactdisc-kf6 - libvorbis - qt6-base - qt6-5compat - qt6-phonon - kio-kf6 - ki18n-kf6 - libgcc - libogg - kconfig-kf6 - kcmutils-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - - libkcddb-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - - - audiocd-kio-kf6-devel - Development files for audiocd-kio-kf6 - - audiocd-kio-kf6 - qt6-base-devel - - - /usr/include - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/baloo-widgets-kf6/actions.py b/desktop/kde6/applications/baloo-widgets-kf6/actions.py deleted file mode 100755 index a7464b1612..0000000000 --- a/desktop/kde6/applications/baloo-widgets-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/baloo-widgets-kf6/pspec.xml b/desktop/kde6/applications/baloo-widgets-kf6/pspec.xml deleted file mode 100755 index d8f97baf1b..0000000000 --- a/desktop/kde6/applications/baloo-widgets-kf6/pspec.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - baloo-widgets-kf6 - https://www.kde.org - - Yusuf Aydemir - yusuf.aydemir@pisilinux.org - - LGPLv2 - library - app:console - Framework for searching and managing metadata - Baloo is a framework for searching and managing metada - mirrors://kde/stable/release-service/24.12.1/src/baloo-widgets-24.12.1.tar.xz - - baloo-kf6-devel - extra-cmake-modules-kf6 - kconfig-kf6-devel - - kdoctools-kf6-devel - - kfilemetadata-kf6-devel - - kio-kf6-devel - ki18n-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - qt6-base-devel - - - - - baloo-widgets-kf6 - Development files for baloo-widgets-kf6 - - baloo-kf6 - kconfig-kf6 - kcoreaddons-kf6 - kfilemetadata-kf6 - ki18n-kf6 - kio-kf6 - kwidgetsaddons-kf6 - libgcc - qt6-base - - - /etc - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - /usr/share/locale - - - - - baloo-widgets-kf6-devel - Development files for baloo-widgets-kf6 - - baloo-widgets-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/blinken-kf6/actions.py b/desktop/kde6/applications/blinken-kf6/actions.py deleted file mode 100755 index 5a0b867eec..0000000000 --- a/desktop/kde6/applications/blinken-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/blinken-kf6/pspec.xml b/desktop/kde6/applications/blinken-kf6/pspec.xml deleted file mode 100755 index 73e698ab32..0000000000 --- a/desktop/kde6/applications/blinken-kf6/pspec.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - blinken-kf6 - https://www.kde.org/applications/education/blinken/ - - Stefan Gronewold (groni) - groni@pisilinux.org - - FDL - GPL - LGPL - gui - desktop.kde.edu - blinken-kf6 - Memory Enhancement Game - blinken-kf6 is based on an electronic game released in 1978, which challenges players to remember sequences of increasing length. On the face of the device, there are 4 different color buttons, each one with their own distinctive sound. - mirrors://kde/stable/release-service/24.12.1/src/blinken-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - qt6-svg-devel - qt6-base-devel - qt6-phonon-devel - - - - - blinken-kf6 - blinken-kf6 - Memory Enhancement Game - - kcrash-kf6 - kconfig-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kguiaddons-kf6 - ki18n-kf6 - kxmlgui-kf6 - libgcc - qt6-base - qt6-phonon - qt6-svg - - - /usr/bin - /usr/share - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/blinken-kf6/translations.xml b/desktop/kde6/applications/blinken-kf6/translations.xml deleted file mode 100755 index 158c5e7ff4..0000000000 --- a/desktop/kde6/applications/blinken-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - blinken-kf6 - Hafıza geliştirme oyunu. - Hafıza geliştirme oyunu. - - diff --git a/desktop/kde6/applications/bomber-kf6/actions.py b/desktop/kde6/applications/bomber-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/bomber-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/bomber-kf6/pspec.xml b/desktop/kde6/applications/bomber-kf6/pspec.xml deleted file mode 100755 index 9457af697f..0000000000 --- a/desktop/kde6/applications/bomber-kf6/pspec.xml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - bomber-kf6 - https://www.kde.org/applications/games/bomber/ - - Alihan Öztürk - alihan@pisilinux.org - - GPLv3 - app:gui - desktop.kde.games - A single player arcade game - bomber-kf6 is a single player arcade game. The player is invading various cities in a plane that is decreasing in height. - mirrors://kde/stable/release-service/24.12.1/src/bomber-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - mesa-devel - kxmlgui-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - ki18n-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kcompletion-kf6-devel - kunitconversion-kf6-devel - kcrash-kf6-devel - - - - - bomber-kf6 - - ki18n-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-base - qt6-phonon - kcoreaddons-kf6 - kdbusaddons-kf6 - kcompletion-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/share/appdata - /usr/share/applications - /usr/share - /usr/share/bomber-kf6 - /usr/share/config.kcfg - /usr/share/icons - /usr/share/doc - /usr/share/kxmlgui-kf65 - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/bovo-kf6/actions.py b/desktop/kde6/applications/bovo-kf6/actions.py deleted file mode 100755 index 62c153796d..0000000000 --- a/desktop/kde6/applications/bovo-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("AUTHORS", "COPYING", "TODO", "README.PACKAGERS") diff --git a/desktop/kde6/applications/bovo-kf6/files/org.kde.bovo.desktop b/desktop/kde6/applications/bovo-kf6/files/org.kde.bovo.desktop deleted file mode 100755 index 737355992b..0000000000 --- a/desktop/kde6/applications/bovo-kf6/files/org.kde.bovo.desktop +++ /dev/null @@ -1,123 +0,0 @@ -[Desktop Entry] -Exec=bovo-kf6 -qwindowtitle %c -Name=bovo-kf6 -Name[ast]=bovo-kf6 -Name[bs]=bovo-kf6 -Name[ca]=bovo-kf6 -Name[ca@valencia]=bovo-kf6 -Name[cs]=bovo-kf6 -Name[da]=bovo-kf6 -Name[de]=bovo-kf6 -Name[el]=bovo-kf6 -Name[en_GB]=bovo-kf6 -Name[eo]=bovo-kf6 -Name[es]=bovo-kf6 -Name[et]=bovo-kf6 -Name[eu]=bovo-kf6 -Name[fa]=بُوُ -Name[fi]=bovo-kf6 -Name[fr]=bovo-kf6 -Name[ga]=bovo-kf6 -Name[gl]=bovo-kf6 -Name[hne]=बोवो -Name[hr]=bovo-kf6 -Name[hu]=bovo-kf6 -Name[it]=bovo-kf6 -Name[ja]=bovo-kf6 -Name[kk]=Бово -Name[km]=bovo-kf6 -Name[ko]=bovo-kf6 -Name[lt]=bovo-kf6 -Name[lv]=bovo-kf6 -Name[mai]=bovo-kf6 -Name[mr]=बोव्हो -Name[ms]=bovo-kf6 -Name[nb]=bovo-kf6 -Name[nds]=bovo-kf6 -Name[ne]=बोभो -Name[nl]=bovo-kf6 -Name[nn]=bovo-kf6 -Name[pa]=ਬੋਵੋ -Name[pl]=bovo-kf6 -Name[pt]=bovo-kf6 -Name[pt_BR]=bovo-kf6 -Name[ro]=bovo-kf6 -Name[ru]=bovo-kf6 -Name[sk]=bovo-kf6 -Name[sl]=bovo-kf6 -Name[sq]=bovo-kf6 -Name[sr]=Бово -Name[sr@ijekavian]=Бово -Name[sr@ijekavianlatin]=bovo-kf6 -Name[sr@latin]=bovo-kf6 -Name[sv]=bovo-kf6 -Name[te]=బొవొ -Name[tr]=bovo-kf6 -Name[ug]=bovo-kf6 -Name[uk]=Бово -Name[wa]=bovo-kf6 -Name[x-test]=xxbovo-kf6xx -Name[zh_CN]=bovo-kf6 -Name[zh_TW]=bovo-kf6 -Icon=bovo-kf6 -Type=Application -X-DocPath=bovo/index.html -GenericName=Five-in-a-row Board Game -GenericName[ast]=Xuegu de tableru cinco en llinia -GenericName[bs]=Pet-u-redu Igra na ploči -GenericName[ca]=Joc de cinc en fila -GenericName[ca@valencia]=Joc de cinc en fila -GenericName[cs]=Desková hra "pět v řadě" -GenericName[da]=Fem-på-række-brætspil -GenericName[de]=Fünf-Gewinnt-Brettspiel -GenericName[el]=Επιτραπέζιο παιχνίδι Πέντε στη σειρά -GenericName[en_GB]=Five-in-a-row Board Game -GenericName[eo]=Gobanga bretludo -GenericName[es]=Juego de tablero de cinco en línea -GenericName[et]=Viis ritta lauamäng -GenericName[eu]=Bostko artzain-jokoa -GenericName[fa]=بازی تخته پنج در یک سطر -GenericName[fi]=Viiden suora -GenericName[fr]=Jeu de plateau « Cinq-en-ligne » -GenericName[ga]=Cluiche cláir cúig-cinn-as-a-chéile -GenericName[gl]=Xogo de taboleiro «pai, fillo e nai» -GenericName[hne]=बोर्ड मं एक लकीर मं पांच वाले खेल -GenericName[hu]=Ötöt egy sorba táblajáték -GenericName[is]=Fimm-í-röð borðleikur -GenericName[it]=Forza 5, gioco da tavolo -GenericName[ja]=五目並べ -GenericName[kk]="Бесеуін - қатарға" ойны -GenericName[km]=ល្បែង​ក្ដារ ប្រាំ​ក្នុង​មួយ​ជួរ -GenericName[ko]=오목 게임 -GenericName[lt]=Penki-vienoje-eilutėje stalo žaidimas -GenericName[lv]=Galda spēle pieci-rindā -GenericName[mr]=एका-ओळीत-पाच बोर्ड खेळ -GenericName[nb]=Brettspill fem på rad -GenericName[nds]="Fief op de Reeg"-Speel -GenericName[ne]=एक पङ्क्तिमा पाँच बोर्ड खेल -GenericName[nl]=Vijf-op-een-rij bordspel -GenericName[nn]=Fem på rad -GenericName[pl]=Gra planszowa "Pięć w rzędzie" -GenericName[pt]=Jogo de Tabuleiro Cinco-em-Linha -GenericName[pt_BR]=Jogo de tabuleiro como Reversi -GenericName[ro]=Joc de table Cinci-în-linie -GenericName[ru]=Японские крестики-нолики -GenericName[sk]=Stolová hra Piškvorky -GenericName[sl]=Namizna igra Pet v vrsto -GenericName[sr]=Игра на табли „пет у низу“ -GenericName[sr@ijekavian]=Игра на табли „пет у низу“ -GenericName[sr@ijekavianlatin]=Igra na tabli „pet u nizu“ -GenericName[sr@latin]=Igra na tabli „pet u nizu“ -GenericName[sv]=Fem-i-rad brädspel -GenericName[tr]=Bir-satırda-beş Tahta Oyunu -GenericName[ug]=بىر-قۇردا-بەش تاختا ئويۇنى -GenericName[uk]=Гра на дошці (п'ять-в-рядку) -GenericName[wa]=Djeu «cénk e roye» -GenericName[x-test]=xxFive-in-a-row Board Gamexx -GenericName[zh_CN]=五子棋游戏 -GenericName[zh_TW]=五子棋棋盤遊戲 -Terminal=false -StartupNotify=true -X-DBUS-StartupType=Multi -Categories=Qt;KDE;Game;BoardGame; -X-DBUS-ServiceName=org.kde.bovo-kf6 diff --git a/desktop/kde6/applications/bovo-kf6/pspec.xml b/desktop/kde6/applications/bovo-kf6/pspec.xml deleted file mode 100755 index 46e645ae07..0000000000 --- a/desktop/kde6/applications/bovo-kf6/pspec.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - bovo-kf6 - https://www.kde.org/applications/games/bovo/ - - Alihan Öztürk - alihan@pisilinux.org - - GPLv3 - bovo-kf6 - app:gui - desktop.kde.games - A Gomoku like game for two players. - bovo-kf6 is a Gomoku like game for two players, where the opponents alternate in placing their respective pictogram on the game board. - mirrors://kde/stable/release-service/24.12.1/src/bovo-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - mesa-devel - qt6-svg-devel - kxmlgui-kf6-devel - kdoctools-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - kcrash-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - - - - - bovo-kf6 - - ki18n-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/share - /usr/share/appdata - /usr/share/icons - /usr/share/kxmlgui-kf65 - /usr/share/applications - /usr/share/bovo-kf6 - /usr/share/doc - - - org.kde.bovo.desktop - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/calendarsupport-kf6/actions.py b/desktop/kde6/applications/calendarsupport-kf6/actions.py deleted file mode 100755 index 82e40ee4b1..0000000000 --- a/desktop/kde6/applications/calendarsupport-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/calendarsupport-kf6/files/qt5.patch b/desktop/kde6/applications/calendarsupport-kf6/files/qt5.patch deleted file mode 100755 index 63c05eb022..0000000000 --- a/desktop/kde6/applications/calendarsupport-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:03:49.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-17 00:25:23.527037197 +0300 -@@ -28,7 +28,7 @@ - set(calendarsupport-kf6_LIB_VERSION ${PIM_VERSION}) - set(AKONADI_MIMELIB_VERSION "5.7.0") - set(KDEPIM_LIB_VERSION "5.7.0") --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - set(kmime-kf6_LIB_VERSION "5.7.0") - set(CALENDARUTILS_LIB_VERSION "5.7.0") - set(kcalendarcore-kf6_LIB_VERSION "5.7.0") diff --git a/desktop/kde6/applications/calendarsupport-kf6/pspec.xml b/desktop/kde6/applications/calendarsupport-kf6/pspec.xml deleted file mode 100755 index b59e6f8319..0000000000 --- a/desktop/kde6/applications/calendarsupport-kf6/pspec.xml +++ /dev/null @@ -1,187 +0,0 @@ - - - calendarsupport-kf6 - https://community.kde.org/KDE_PIM - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - Calendar support library - Calendar support library - mirrors://kde/stable/release-service/24.12.1/src/calendarsupport-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - akonadi-kf6-devel - kmime-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - kcodecs-kf6-devel - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kcoreaddons-kf6-devel - kservice-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - - kdoctools-kf6-devel - - - kunitconversion-kf6-devel - boost-devel - kcalutils-kf6-devel - kcalendarcore-kf6-devel - kidentitymanagement-kf6-devel - kholidays-kf6-devel - akonadi-calendar-kf6-devel - kcontacts-kf6-devel - pimcommon-kf6-devel - kimap-kf6-devel - cyrus-sasl-devel - akonadi-mime-kf6-devel - akonadi-contacts-kf6-devel - - kguiaddons-kf6-devel - - - - - - - - calendarsupport-kf6 - Calendar support library - - kio-kf6 - ki18n-kf6 - kmime-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kcalendarcore-kf6 - qt6-base - kcalutils-kf6 - kholidays-kf6 - pimcommon-kf6 - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - kwidgetsaddons-kf6 - akonadi-calendar-kf6 - kidentitymanagement-kf6 - - - /etc - /usr/lib/qt6 - /usr/lib - /usr/share - /usr/share/kservice-kf6types5 - /usr/share/locale - - - - - calendarsupport-kf6-devel - Development files for calendarsupport-kf6 - - calendarsupport-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/cantor-kf6/actions.py b/desktop/kde6/applications/cantor-kf6/actions.py deleted file mode 100755 index 1dc58c4fe0..0000000000 --- a/desktop/kde6/applications/cantor-kf6/actions.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import kde5 -from pisi.actionsapi import get - -NoStrip=["/usr/share/icons"] -# TODO: kalgebra-kf6 icon not shown in GUI -# TODO: more sub packages? *-libs etc.? - -def setup(): - pisitools.cxxflags.add("-std=c++11 -pthread") - # kde6.configure() - kde5.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/cantor-kf6/pspec.xml b/desktop/kde6/applications/cantor-kf6/pspec.xml deleted file mode 100755 index e07a644586..0000000000 --- a/desktop/kde6/applications/cantor-kf6/pspec.xml +++ /dev/null @@ -1,210 +0,0 @@ - - - - - cantor-kf6 - http://edu.kde.org/cantor-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2+ - cantor-kf6 - app:gui - desktop.kde.edu - A KDE frontend to mathematical softwares - cantor-kf6 is an application that lets you use your favorite mathematical applications from within a nice KDE-integrated Worksheet Interface. It offers assistant dialogs for common tasks and allows you to share your worksheets with others. - mirrors://kde/stable/release-service/24.12.1/src/cantor-24.12.1.tar.xz - - qt6-base-devel - qt6-sql-sqlite - qt6-sql-odbc - qt6-sql-mysql - qt6-sql-postgresql - qt6-assistant-devel - mesa-devel - qt6-svg-devel - qt6-webengine-devel - qt6-5compat-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - ktexteditor-kf6-devel - knewstuff-kf6-devel - kpty-kf6-devel - analitza-kf6-devel - libqalculate-devel - cln-devel - libspectre-devel - libxslt-devel - python-devel - python3-devel - R-devel - luajit-devel - syntax-highlighting-kf6-devel - poppler-qt6-devel - karchive-kf6-devel - extra-cmake-modules-kf6 - - - - - cantor-kf6 - - R - cln - kio-kf6 - kpty-kf6 - ki18n-kf6 - kparts-kf6 - kcrash-kf6 - libgcc - python - luajit - python3 - libxslt - kconfig-kf6 - kxmlgui-kf6 - analitza-kf6 - karchive-kf6 - kservice-kf6 - libspectre - knewstuff-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - ktexteditor-kf6 - ktextwidgets-kf6 - libqalculate - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-base - - - /etc - /usr/share - /usr/lib - /usr/share/man - /usr/share/doc - /usr/bin - /usr/share/locale - - - - - cantor-kf6-devel - Development files for cantor-kf6 - - cantor-kf6 - - - /usr/include - /usr/share/kde6/apps/cmake - - - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/cantor-kf6/translations.xml b/desktop/kde6/applications/cantor-kf6/translations.xml deleted file mode 100755 index af5bc8465f..0000000000 --- a/desktop/kde6/applications/cantor-kf6/translations.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - cantor-kf6 - Matematiksel uygulamalar için bir KDE önyüzü - cantor-kf6; Sage, Maxima, R and kalgebra-kf6 gibi uygulamalara arayüz sağlayarak kullanımı kolaylaştırmayı amaçlar. Çok kullanılan işler için dialoglar sağlar ve çalışmalarınızı başkalarıyla paylaşabilmenize olanak tanır. - - - - cantor-kf6-devel - cantor-kf6 için geliştirme dosyaları - - - - cantor-kf6-R - cantor-kf6 için R arkaucu - - diff --git a/desktop/kde6/applications/component.xml b/desktop/kde6/applications/component.xml deleted file mode 100644 index 8bfa1e61be..0000000000 --- a/desktop/kde6/applications/component.xml +++ /dev/null @@ -1,3 +0,0 @@ - - desktop.kde6.applications - diff --git a/desktop/kde6/applications/dolphin-kf6/actions.py b/desktop/kde6/applications/dolphin-kf6/actions.py deleted file mode 100755 index 7206317eba..0000000000 --- a/desktop/kde6/applications/dolphin-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/lib/systemd") - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/dolphin-kf6/files/2cd3d58e.patch b/desktop/kde6/applications/dolphin-kf6/files/2cd3d58e.patch deleted file mode 100644 index 9b45b435ae..0000000000 --- a/desktop/kde6/applications/dolphin-kf6/files/2cd3d58e.patch +++ /dev/null @@ -1,310 +0,0 @@ -From 2cd3d58eec5695899c26ca66a631fb79867b6584 Mon Sep 17 00:00:00 2001 -From: Nicolas Fella -Date: Tue, 7 Nov 2023 15:45:01 +0100 -Subject: [PATCH] Port away from KMoreTools - -The idea behind KMoreTools was to point the user at external tools for a given job. - -It provides a rather complex framework for that, including suggesting not-yet-installed tools. - -The UX behind that isn't great though, which somewhat deep menu hierarchies and a somewhat arbitrary list of tools. - -Most KDE apps have moved away from it, with only Dolphin remaining. - -Instead provide direct integration with relevant KDE tools (Filelight, KDiskFree, KFind) ---- - .kde-ci.yml | 1 - - CMakeLists.txt | 1 - - src/CMakeLists.txt | 2 - - src/dolphinmainwindow.cpp | 20 +++++---- - src/dolphinpart.cpp | 16 ++----- - src/search/dolphinsearchbox.cpp | 37 ++++++++++------ - src/search/dolphinsearchbox.h | 2 - - src/statusbar/statusbarspaceinfo.cpp | 66 +++++++++++++++++++++++++--- - 8 files changed, 98 insertions(+), 47 deletions(-) - -diff --git a/.kde-ci.yml b/.kde-ci.yml -index 28fcaac569..500b80c569 100644 ---- a/.kde-ci.yml -+++ b/.kde-ci.yml -@@ -28,7 +28,6 @@ Dependencies: - 'frameworks/kuserfeedback': '@latest-kf6' - 'plasma/kactivities': '@latest-kf6' - 'libraries/phonon': '@latest-kf6' -- 'libraries/kmoretools': '@latest-kf6' - - - 'on': ['Linux/Qt6', 'FreeBSD/Qt6'] - 'require': -diff --git a/CMakeLists.txt b/CMakeLists.txt -index d9e574f2cb..a14d6895b7 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -75,7 +75,6 @@ find_package(KF6 ${KF6_MIN_VERSION} REQUIRED COMPONENTS - WindowSystem - WidgetsAddons - Codecs -- MoreTools - ) - - find_package(KUserFeedbackQt6 1.2.1) -diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt -index 0792af0c0b..8eb5a0e9f0 100644 ---- a/src/CMakeLists.txt -+++ b/src/CMakeLists.txt -@@ -212,8 +212,6 @@ target_link_libraries( - KF6::Codecs - KF6::KCMUtils - -- KF6::MoreTools -- - ${FTS_LIB} - ) - -diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp -index 0d31df2da0..635121062a 100644 ---- a/src/dolphinmainwindow.cpp -+++ b/src/dolphinmainwindow.cpp -@@ -48,7 +48,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -1127,15 +1126,20 @@ void DolphinMainWindow::toggleShowMenuBar() - QPointer DolphinMainWindow::preferredSearchTool() - { - m_searchTools.clear(); -- KMoreToolsMenuFactory("dolphin/search-tools").fillMenuFromGroupingNames(&m_searchTools, {"files-find"}, m_activeViewContainer->url()); -- QList actions = m_searchTools.actions(); -- if (actions.isEmpty()) { -- return nullptr; -- } -- QAction *action = actions.first(); -- if (action->isSeparator()) { -+ -+ KService::Ptr kfind = KService::serviceByDesktopName(QStringLiteral("org.kde.kfind")); -+ -+ if (!kfind) { - return nullptr; - } -+ -+ auto *action = new QAction(QIcon::fromTheme(kfind->icon()), kfind->name(), this); -+ -+ connect(action, &QAction::triggered, this, [kfind] { -+ auto *job = new KIO::ApplicationLauncherJob(kfind); -+ job->start(); -+ }); -+ - return action; - } - -diff --git a/src/dolphinpart.cpp b/src/dolphinpart.cpp -index 4ba1f07420..bb27e0a5e4 100644 ---- a/src/dolphinpart.cpp -+++ b/src/dolphinpart.cpp -@@ -28,7 +28,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -527,17 +526,10 @@ void DolphinPart::slotOpenTerminal() - - void DolphinPart::slotFindFile() - { -- QMenu searchTools; -- KMoreToolsMenuFactory("dolphin/search-tools").fillMenuFromGroupingNames(&searchTools, {"files-find"}, QUrl::fromLocalFile(localFilePathOrHome())); -- QList actions = searchTools.actions(); -- if (!(actions.isEmpty())) { -- actions.first()->trigger(); -- } else { -- KIO::CommandLauncherJob *job = new KIO::CommandLauncherJob(QStringLiteral("kfind"), {url().toString()}, this); -- job->setDesktopName(QStringLiteral("org.kde.kfind")); -- job->setUiDelegate(new KDialogJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, widget())); -- job->start(); -- } -+ KIO::CommandLauncherJob *job = new KIO::CommandLauncherJob(QStringLiteral("kfind"), {url().toString()}, this); -+ job->setDesktopName(QStringLiteral("org.kde.kfind")); -+ job->setUiDelegate(new KDialogJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, widget())); -+ job->start(); - } - - void DolphinPart::updateNewMenu() -diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp -index a3cec6fe7e..dfd733e5da 100644 ---- a/src/search/dolphinsearchbox.cpp -+++ b/src/search/dolphinsearchbox.cpp -@@ -13,9 +13,10 @@ - #include "dolphinquery.h" - - #include "config-dolphin.h" -+#include - #include --#include - #include -+#include - #if HAVE_BALOO - #include - #include -@@ -395,18 +396,24 @@ void DolphinSearchBox::init() - searchLocationGroup->addButton(m_fromHereButton); - searchLocationGroup->addButton(m_everywhereButton); - -- auto moreSearchToolsButton = new QToolButton(this); -- moreSearchToolsButton->setAutoRaise(true); -- moreSearchToolsButton->setPopupMode(QToolButton::InstantPopup); -- moreSearchToolsButton->setIcon(QIcon::fromTheme("arrow-down-double")); -- moreSearchToolsButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); -- moreSearchToolsButton->setText(i18n("More Search Tools")); -- moreSearchToolsButton->setMenu(new QMenu(this)); -- connect(moreSearchToolsButton->menu(), &QMenu::aboutToShow, moreSearchToolsButton->menu(), [this, moreSearchToolsButton]() { -- m_menuFactory.reset(new KMoreToolsMenuFactory("dolphin/search-tools")); -- moreSearchToolsButton->menu()->clear(); -- m_menuFactory->fillMenuFromGroupingNames(moreSearchToolsButton->menu(), {"files-find"}, this->m_searchPath); -- }); -+ KService::Ptr kfind = KService::serviceByDesktopName(QStringLiteral("org.kde.kfind")); -+ -+ QToolButton *kfindToolsButton = nullptr; -+ if (kfind) { -+ kfindToolsButton = new QToolButton(this); -+ kfindToolsButton->setAutoRaise(true); -+ kfindToolsButton->setPopupMode(QToolButton::InstantPopup); -+ kfindToolsButton->setIcon(QIcon::fromTheme("arrow-down-double")); -+ kfindToolsButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); -+ kfindToolsButton->setText(i18n("Open %1", kfind->name())); -+ kfindToolsButton->setIcon(QIcon::fromTheme(kfind->icon())); -+ -+ connect(kfindToolsButton, &QToolButton::clicked, this, [this, kfind] { -+ auto *job = new KIO::ApplicationLauncherJob(kfind); -+ job->setUrls({m_searchPath}); -+ job->start(); -+ }); -+ } - - // Create "Facets" widget - m_facetsWidget = new DolphinFacetsWidget(this); -@@ -429,7 +436,9 @@ void DolphinSearchBox::init() - optionsLayout->addWidget(m_fromHereButton); - optionsLayout->addWidget(m_everywhereButton); - optionsLayout->addWidget(new KSeparator(Qt::Vertical, this)); -- optionsLayout->addWidget(moreSearchToolsButton); -+ if (kfindToolsButton) { -+ optionsLayout->addWidget(kfindToolsButton); -+ } - optionsLayout->addStretch(1); - - m_optionsScrollArea = new QScrollArea(this); -diff --git a/src/search/dolphinsearchbox.h b/src/search/dolphinsearchbox.h -index b73c2899ff..9f1ad29525 100644 ---- a/src/search/dolphinsearchbox.h -+++ b/src/search/dolphinsearchbox.h -@@ -18,7 +18,6 @@ class QToolButton; - class QScrollArea; - class QLabel; - class QVBoxLayout; --class KMoreToolsMenuFactory; - - /** - * @brief Input box for searching files with or without Baloo. -@@ -172,7 +171,6 @@ private: - DolphinFacetsWidget *m_facetsWidget; - - QUrl m_searchPath; -- QScopedPointer m_menuFactory; - - QTimer *m_startSearchTimer; - }; -diff --git a/src/statusbar/statusbarspaceinfo.cpp b/src/statusbar/statusbarspaceinfo.cpp -index 4eef8497df..546c217a7a 100644 ---- a/src/statusbar/statusbarspaceinfo.cpp -+++ b/src/statusbar/statusbarspaceinfo.cpp -@@ -8,11 +8,14 @@ - - #include "spaceinfoobserver.h" - -+#include -+#include - #include --#include -+#include - --#include -+#include - #include -+#include - - StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget *parent) - : KCapacityBar(KCapacityBar::DrawTextInline, parent) -@@ -87,11 +90,60 @@ void StatusBarSpaceInfo::mousePressEvent(QMouseEvent *event) - // Creates a menu with tools that help to find out more about free - // disk space for the given url. - -- // Note that this object must live long enough in case the user opens -- // the "Configure..." dialog -- KMoreToolsMenuFactory menuFactory(QStringLiteral("dolphin/statusbar-diskspace-menu")); -- menuFactory.setParentWidget(this); -- auto menu = menuFactory.createMenuFromGroupingNames({"disk-usage", "more:", "disk-partitions"}, m_url); -+ const KService::Ptr filelight = KService::serviceByDesktopName(QStringLiteral("org.kde.filelight")); -+ const KService::Ptr kdiskfree = KService::serviceByDesktopName(QStringLiteral("org.kde.kdf")); -+ -+ if (!filelight && !kdiskfree) { -+ // nothing to show -+ return; -+ } -+ -+ QMenu *menu = new QMenu(this); -+ -+ if (filelight) { -+ QAction *filelightFolderAction = menu->addAction(QIcon::fromTheme(QStringLiteral("filelight")), i18n("Disk Usage Statistics - current folder")); -+ -+ menu->connect(filelightFolderAction, &QAction::triggered, menu, [this, filelight](bool) { -+ auto *job = new KIO::ApplicationLauncherJob(filelight); -+ job->setUrls({m_url}); -+ job->start(); -+ }); -+ -+ // For remote URLs like FTP analyzing the device makes no sense -+ if (m_url.isLocalFile()) { -+ QAction *filelightDiskAction = menu->addAction(QIcon::fromTheme(QStringLiteral("filelight")), i18n("Disk Usage Statistics - current device")); -+ -+ menu->connect(filelightDiskAction, &QAction::triggered, menu, [this, filelight](bool) { -+ const QStorageInfo info(m_url.toLocalFile()); -+ -+ if (info.isValid() && info.isReady()) { -+ auto *job = new KIO::ApplicationLauncherJob(filelight); -+ job->setUrls({QUrl::fromLocalFile(info.rootPath())}); -+ job->start(); -+ } -+ }); -+ } -+ -+ QAction *filelightAllAction = menu->addAction(QIcon::fromTheme(QStringLiteral("filelight")), i18n("Disk Usage Statistics - all devices")); -+ -+ menu->connect(filelightAllAction, &QAction::triggered, menu, [this, filelight](bool) { -+ const QStorageInfo info(m_url.toLocalFile()); -+ -+ if (info.isValid() && info.isReady()) { -+ auto *job = new KIO::ApplicationLauncherJob(filelight); -+ job->start(); -+ } -+ }); -+ } -+ -+ if (kdiskfree) { -+ QAction *kdiskfreeAction = menu->addAction(QIcon::fromTheme(QStringLiteral("kdf")), i18n("KDiskFree")); -+ -+ connect(kdiskfreeAction, &QAction::triggered, this, [kdiskfree] { -+ auto *job = new KIO::ApplicationLauncherJob(kdiskfree); -+ job->start(); -+ }); -+ } - - menu->exec(QCursor::pos()); - } --- -GitLab - diff --git a/desktop/kde6/applications/dolphin-kf6/files/95551f44.patch b/desktop/kde6/applications/dolphin-kf6/files/95551f44.patch deleted file mode 100644 index 4cbe957c7b..0000000000 --- a/desktop/kde6/applications/dolphin-kf6/files/95551f44.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 95551f44922670be5c4d670833c2d4e398657495 Mon Sep 17 00:00:00 2001 -From: Nicolas Fella -Date: Fri, 8 Mar 2024 18:46:32 +0100 -Subject: [PATCH] Remove unneeded code for toggeling dockwidget visibility - -QDockWidget::toggleViewAction::toggled is emitted when minimizing -the application window on X11 (https://bugreports.qt.io/browse/QTBUG-48161 -potentially related). This will cause the dockwidget to be hidden when -minimizing the window. - -We don't actually seem to need that connection, triggering the action -(via shortcut or menu) seems to correctly show/hide the dockwidget -without it - -BUG: 481952 ---- - src/dolphinmainwindow.cpp | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp -index 03486a9cf6..1f4de8869c 100644 ---- a/src/dolphinmainwindow.cpp -+++ b/src/dolphinmainwindow.cpp -@@ -2619,8 +2619,6 @@ void DolphinMainWindow::createPanelAction(const QIcon &icon, const QKeySequence - - QAction *panelAction = actionCollection()->addAction(actionName, dockAction); - actionCollection()->setDefaultShortcut(panelAction, shortcut); -- -- connect(panelAction, &QAction::toggled, dockWidget, &QWidget::setVisible); - } - // clang-format off - void DolphinMainWindow::setupWhatsThis() --- -GitLab - diff --git a/desktop/kde6/applications/dolphin-kf6/files/a07f2422.patch b/desktop/kde6/applications/dolphin-kf6/files/a07f2422.patch deleted file mode 100644 index ff8171c82e..0000000000 --- a/desktop/kde6/applications/dolphin-kf6/files/a07f2422.patch +++ /dev/null @@ -1,37 +0,0 @@ -From a07f24228a94aab2bdeb3caaf7a4d694c0180ed7 Mon Sep 17 00:00:00 2001 -From: Felix Ernst -Date: Wed, 17 Apr 2024 07:32:27 +0000 -Subject: [PATCH] Fix crash while entering selection mode with Qt6.7 - -`deleteLater()` on a non-existing object seems to cause a crash with -Qt6.7. This makes some sense but wasn't the case previously. - -I didn't test this yet but it is a harmless change so if anyone can confirm we can IMO merge directly. - -This was brought up in https://invent.kde.org/system/dolphin/-/merge_requests/764#note_920935, reported in the bug linked below, and the sentry crash reporting page also has a few dozen reports (https://crash-reports.kde.org/organizations/kde/issues/13589/?project=4&query=is%3Aunresolved&referrer=issue-stream&stream_index=1). - -Dolphin 24.02 is also affected but we are already past the last bug fix release for it. - -BUG: 485599 ---- - src/selectionmode/bottombarcontentscontainer.cpp | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/selectionmode/bottombarcontentscontainer.cpp b/src/selectionmode/bottombarcontentscontainer.cpp -index d571b0302a..0e3087a9c5 100644 ---- a/src/selectionmode/bottombarcontentscontainer.cpp -+++ b/src/selectionmode/bottombarcontentscontainer.cpp -@@ -483,7 +483,9 @@ std::vector BottomBarContentsContainer::contextActionsFor(const KFile - if (selectedItems.isEmpty()) { - // There are no contextual actions to show for these items. - // We might even want to hide this bar in this case. To make this clear, we reset m_internalContextMenu. -- m_internalContextMenu.release()->deleteLater(); -+ if (m_internalContextMenu) { -+ m_internalContextMenu.release()->deleteLater(); -+ } - return std::vector{}; - } - --- -GitLab - diff --git a/desktop/kde6/applications/dolphin-kf6/files/dolphin-17.04.0-allow-root.patch b/desktop/kde6/applications/dolphin-kf6/files/dolphin-17.04.0-allow-root.patch deleted file mode 100755 index fbf1532200..0000000000 --- a/desktop/kde6/applications/dolphin-kf6/files/dolphin-17.04.0-allow-root.patch +++ /dev/null @@ -1,28 +0,0 @@ -diff -Nuar a/src/main.cpp b/src/main.cpp ---- a/src/main.cpp 2023-04-14 06:19:08.000000000 +0300 -+++ b/src/main.cpp 2023-04-20 21:26:52.104629720 +0300 -@@ -52,15 +52,15 @@ - { - #ifndef Q_OS_WIN - // Prohibit using sudo or kdesu-kf6 (but allow using the root user directly) -- if (getuid() == 0) { -- if (!qEnvironmentVariableIsEmpty("SUDO_USER")) { -- std::cout << "Running dolphin-kf6 with sudo can cause bugs and expose you to security vulnerabilities." << std::endl; -- return EXIT_FAILURE; -- } else if (!qEnvironmentVariableIsEmpty("kdesu-kf6_USER")) { -- std::cout << "Running dolphin-kf6 with kdesu-kf6 can cause bugs and expose you to security vulnerabilities." << std::endl; -- return EXIT_FAILURE; -- } -- } -+ //if (getuid() == 0) { -+ // if (!qEnvironmentVariableIsEmpty("SUDO_USER")) { -+ // std::cout << "Running dolphin-kf6 with sudo can cause bugs and expose you to security vulnerabilities." << std::endl; -+ // return EXIT_FAILURE; -+ //} else if (!qEnvironmentVariableIsEmpty("kdesu-kf6_USER")) { -+ // std::cout << "Running dolphin-kf6 with kdesu-kf6 can cause bugs and expose you to security vulnerabilities." << std::endl; -+ //return EXIT_FAILURE; -+ //} -+ //} - #endif - - /** diff --git a/desktop/kde6/applications/dolphin-kf6/files/find-kactivities.patch b/desktop/kde6/applications/dolphin-kf6/files/find-kactivities.patch deleted file mode 100644 index 6b53f87199..0000000000 --- a/desktop/kde6/applications/dolphin-kf6/files/find-kactivities.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index a14d6895b..fb7be4db2 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -88,9 +88,9 @@ if(KUserFeedbackQt6_FOUND) - endif() - - find_package(KF6 ${KF6_MIN_VERSION} OPTIONAL_COMPONENTS -- Activities - DocTools - ) -+find_package(KF6Activities) - set_package_properties(KF6Activities PROPERTIES DESCRIPTION "KActivities libraries" - URL "https://www.kde.org" - TYPE OPTIONAL diff --git a/desktop/kde6/applications/dolphin-kf6/files/kdebug-419585.patch b/desktop/kde6/applications/dolphin-kf6/files/kdebug-419585.patch deleted file mode 100644 index 2b87e72254..0000000000 --- a/desktop/kde6/applications/dolphin-kf6/files/kdebug-419585.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 35b4c6d4df1281afd621374e686f19e654ad7bae Mon Sep 17 00:00:00 2001 -From: "Martin T. H. Sandsmark" -Date: Tue, 7 Apr 2020 17:14:59 +0200 -Subject: Fix crashing on starting and quitting - -QCollator (especially with Qt 5.14 and ICU 65.1) is very unhappy with -threads. - -To avoid having to lock and unlock the mutex everywhere (and ensure it -is unlocked before calling other things that might lock it, etc.), we do -it as locally as possible. Even if for some reason Qt and ICU make -QCollator threadsafe in the future locking here should have minimal -impact. - -BUG: 419585 - -Differential Revision: https://phabricator.kde.org/D28659 ---- - src/kitemviews-kf6/kfileitemmodel.cpp | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/src/kitemviews-kf6/kfileitemmodel.cpp b/src/kitemviews-kf6/kfileitemmodel.cpp -index 4b35a02..e4dca27 100644 ---- a/src/kitemviews-kf6/kfileitemmodel.cpp -+++ b/src/kitemviews-kf6/kfileitemmodel.cpp -@@ -33,6 +33,9 @@ - #include - #include - #include -+#include -+ -+Q_GLOBAL_STATIC_WITH_ARGS(QMutex, s_collatorMutex, (QMutex::Recursive)) - - // #define KFILEITEMMODEL_DEBUG - -@@ -1878,6 +1881,8 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const - - int KFileItemModel::stringCompare(const QString& a, const QString& b, const QCollator& collator) const - { -+ QMutexLocker collatorLock(s_collatorMutex()); -+ - if (m_naturalSorting) { - return collator.compare(a, b); - } --- -cgit v1.1 - diff --git a/desktop/kde6/applications/dolphin-kf6/pspec.xml b/desktop/kde6/applications/dolphin-kf6/pspec.xml deleted file mode 100755 index bfa0cd1229..0000000000 --- a/desktop/kde6/applications/dolphin-kf6/pspec.xml +++ /dev/null @@ -1,228 +0,0 @@ - - - - - dolphin-kf6 - https://projects.kde.org/projects/kde/applications/dolphin-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - KDE File Manager - dolphin-kf6 is the File Manager for KDE. - mirrors://kde/stable/release-service/24.12.1/src/dolphin-24.12.1.tar.xz - - baloo-kf6-devel - baloo-widgets-kf6-devel - kfilemetadata-kf6-devel - extra-cmake-modules-kf6 - plasma-activities-kf6-devel - kbookmarks-kf6-devel - kcmutils-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kguiaddons-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - knotifications-kf6-devel - kparts-kf6-devel - ktextwidgets-kf6-devel - solid-kf6-devel - qt6-base-devel - qt6-phonon-devel - kio-extras-kf6-devel - libxml2-devel - docbook-xsl - kuserfeedback-kf6-devel - packagekit-qt6-devel - - - - - - - - dolphin-kf6 - - - qt6-base - kfilemetadata-kf6 - baloo-kf6 - baloo-widgets-kf6 - knewstuff-kf6 - kio-kf6 - ki18n-kf6 - solid-kf6 - kparts-kf6 - libgcc - kcodecs-kf6 - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcmutils-kf6 - kservice-kf6 - kbookmarks-kf6 - kitemviews-kf6 - qt6-phonon - kguiaddons-kf6 - plasma-activities-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kuserfeedback-kf6 - packagekit-qt6 - kcolorscheme-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/lib - /usr/share/doc - - - - dolphin-kf6-devel - - dolphin-kf6 - qt6-base-devel - qt6-phonon-devel - kio-kf6-devel - kcmutils-kf6-devel - knewstuff-kf6-devel - plasma-activities-kf6-devel - baloo-kf6-devel - baloo-widgets-kf6-devel - kfilemetadata-kf6-devel - kparts-kf6-devel - ktexteditor-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - - /usr/include - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-17 - 24.02.2 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-28 - 24.02.1 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-10 - 24.02.0 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/dolphin-plugins-kf6/actions.py b/desktop/kde6/applications/dolphin-plugins-kf6/actions.py deleted file mode 100755 index e4e5adbf7a..0000000000 --- a/desktop/kde6/applications/dolphin-plugins-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/dolphin-plugins-kf6/pspec.xml b/desktop/kde6/applications/dolphin-plugins-kf6/pspec.xml deleted file mode 100755 index fa66b3b2ab..0000000000 --- a/desktop/kde6/applications/dolphin-plugins-kf6/pspec.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - - - dolphin-plugins-kf6 - http://www.kde.org/ - - Pisi Linux Admins - admin@pisilinux.org - - GPLv2 - library - desktop.kde6.sdk - Extra dolphin-kf6 plugins - This package contains plugins that offer integration in dolphin-kf6 with the following version control systems: - mirrors://kde/stable/release-service/24.12.1/src/dolphin-plugins-24.12.1.tar.xz - - qt6-base-devel - qt6-5compat-devel - kdoctools-kf6-devel - dolphin-kf6-devel - kio-kf6-devel - - extra-cmake-modules-kf6 - - - - - dolphin-plugins-kf6 - - qt6-base - qt6-5compat - dolphin-kf6 - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - ktexteditor-kf6 - kwidgetsaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - ktextwidgets-kf6 - - - - /usr/share - /usr/lib - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/dolphin-plugins-kf6/translations.xml b/desktop/kde6/applications/dolphin-plugins-kf6/translations.xml deleted file mode 100755 index 22fa7841b7..0000000000 --- a/desktop/kde6/applications/dolphin-plugins-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - dolphin-plugins-kf6 - dolphin-kf6 eklentileri. - dolphin-kf6 için VCS (Version Control System) eklentileri. - - diff --git a/desktop/kde6/applications/dragonplayer-kf6/actions.py b/desktop/kde6/applications/dragonplayer-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/dragonplayer-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/dragonplayer-kf6/pspec.xml b/desktop/kde6/applications/dragonplayer-kf6/pspec.xml deleted file mode 100755 index 6fb68aafd7..0000000000 --- a/desktop/kde6/applications/dragonplayer-kf6/pspec.xml +++ /dev/null @@ -1,149 +0,0 @@ - - - - - dragonplayer-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.multimedia - Multimedia player - a multimedia player where the focus is on simplicity, instead of features. - mirrors://kde/stable/release-service/24.12.1/src/dragon-24.12.1.tar.xz - - qt6-base-devel - qt6-phonon-devel - kdoctools-kf6-devel - kio-kf6-devel - kcrash-kf6-devel - kparts-kf6-devel - docbook-xsl - kdbusaddons-kf6-devel - knotifications-kf6-devel - extra-cmake-modules-kf6 - - - - - dragonplayer-kf6 - - qt6-base - qt6-phonon - kio-kf6 - ki18n-kf6 - solid-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - qt6-phonon - kcoreaddons-kf6 - kdbusaddons-kf6 - kjobwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kparts-kf6 - - - /etc/xdg - /usr/share - /usr/bin - /usr/lib/qt6 - /usr/lib - /usr/share/doc - /usr/share/man/man1 - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/eventviews-kf6/actions.py b/desktop/kde6/applications/eventviews-kf6/actions.py deleted file mode 100755 index 82e40ee4b1..0000000000 --- a/desktop/kde6/applications/eventviews-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/eventviews-kf6/files/qt5.patch b/desktop/kde6/applications/eventviews-kf6/files/qt5.patch deleted file mode 100755 index 36fd034b76..0000000000 --- a/desktop/kde6/applications/eventviews-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:03:52.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-17 22:40:11.652631461 +0300 -@@ -32,7 +32,7 @@ - set(EVENTVIEW_LIB_VERSION ${PIM_VERSION}) - set(CALENDARUTILS_LIB_VERSION "5.7.0") - set(AKONADI_LIB_VERSION "5.7.0") --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - set(kcalendarcore-kf6_LIB_VERSION "5.7.0") - set(AKONADICALENDAR_LIB_VERSION "5.7.0") - set(kmime-kf6_LIB_VERSION "5.7.0") diff --git a/desktop/kde6/applications/eventviews-kf6/pspec.xml b/desktop/kde6/applications/eventviews-kf6/pspec.xml deleted file mode 100755 index 5b6a0a1a8f..0000000000 --- a/desktop/kde6/applications/eventviews-kf6/pspec.xml +++ /dev/null @@ -1,189 +0,0 @@ - - - eventviews-kf6 - https://community.kde.org/KDE_PIM - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - Library for creating events. - Library for creating events. - mirrors://kde/stable/release-service/24.12.1/src/eventviews-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - akonadi-kf6-devel - - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kcoreaddons-kf6-devel - kservice-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - - kdoctools-kf6-devel - - - kunitconversion-kf6-devel - boost-devel - libkdepim-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - - kcalutils-kf6-devel - calendarsupport-kf6-devel - kmime-kf6-devel - kidentitymanagement-kf6-devel - akonadi-calendar-kf6-devel - akonadi-contacts-kf6-devel - kdiagram-kf6-devel - kholidays-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - - - - - - - - eventviews-kf6 - Library for creating events. - - ki18n-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kcalendarcore-kf6 - kdiagram-kf6 - - kservice-kf6 - qt6-base - kcalutils-kf6 - kcontacts-kf6 - libkdepim-kf6 - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - calendarsupport-kf6 - akonadi-calendar-kf6 - - - - /etc - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - /usr/share/kservice-kf6types5 - /usr/share/locale - - - - - eventviews-kf6-devel - Development files for eventviews-kf6. - - eventviews-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/falkon-kf6/actions.py b/desktop/kde6/applications/falkon-kf6/actions.py deleted file mode 100644 index ad99952383..0000000000 --- a/desktop/kde6/applications/falkon-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools -from pisi.actionsapi import kde6 - -def setup(): - shelltools.export("CC", "clang") - shelltools.export("CXX", "clang++") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("CHANGELOG", "COPYING", "README*") diff --git a/desktop/kde6/applications/falkon-kf6/files/bookmarks_json.diff b/desktop/kde6/applications/falkon-kf6/files/bookmarks_json.diff deleted file mode 100644 index e2dfddb382..0000000000 --- a/desktop/kde6/applications/falkon-kf6/files/bookmarks_json.diff +++ /dev/null @@ -1,1077 +0,0 @@ -diff -Nuar a/src/lib/data/data/bookmarks.json b/src/lib/data/data/bookmarks.json ---- a/src/lib/data/data/bookmarks.json 2018-05-08 17:18:50.000000000 +0300 -+++ b/src/lib/data/data/bookmarks.json 2018-09-11 16:18:33.130790019 +0300 -@@ -1,29 +1,1053 @@ - { - "roots": { - "bookmark_bar": { -- "children": [ ], -- "description": "Bookmarks located in Bookmarks Toolbar", -- "expanded": true, -- "expanded_sidebar": true, -- "name": "Bookmarks Toolbar", -- "type": "folder" -+ "children": [ -+ { -+ "children": [ -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Github PisiLinux", -+ "type": "url", -+ "url": "https://github.com/pisilinux", -+ "visit_count": 1 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "gitter pisilinux", -+ "type": "url", -+ "url": "https://gitter.im/pisilinux", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "slack pisi", -+ "type": "url", -+ "url": "https://pisi.slack.com/messages/general/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Transifex", -+ "type": "url", -+ "url": "https://www.transifex.com/signin/?next=/messages/inbox/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Twitter'da PiSilinux", -+ "type": "url", -+ "url": "http://twitter.com/#!/pisilinux", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "PisiLinux Forum", -+ "type": "url", -+ "url": "https://www.pisilinux.org/forum", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "PisiLinux", -+ "type": "url", -+ "url": "https://www.pisilinux.org", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Hata Takip Sistemi", -+ "type": "url", -+ "url": "https://www.pisilinux.org/hata_kaydi", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "PiSilinux Çeviri Platformu", -+ "type": "url", -+ "url": "https://www.transifex.com/projects/p/PiSiLinux/", -+ "visit_count": 0 -+ } -+ ], -+ "description": "", -+ "expanded": false, -+ "expanded_sidebar": false, -+ "name": "PiSilinux Durakları", -+ "type": "folder" -+ }, -+ { -+ "children": [ -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Worldforum PiSiLinux", -+ "type": "url", -+ "url": "https://www.pisilinux.org/blog", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Pisilinux Ansiklopedisi", -+ "type": "url", -+ "url": "https://www.pisilinux.org/wiki", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Özgürlük İçin", -+ "type": "url", -+ "url": "http://www.ozgurlukicin.org/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Pardus-Linux.org", -+ "type": "url", -+ "url": "http://www.pardus-linux.org/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Linux Kullanıcıları Derneği", -+ "type": "url", -+ "url": "http://www.lkd.org.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Linux Belgelendirme Projesi", -+ "type": "url", -+ "url": "http://www.belgeler.org/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Tuxleaks - özgür belgeler;", -+ "type": "url", -+ "url": "http://tuxleaks.org/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "LibreOffice Türkiye", -+ "type": "url", -+ "url": "http://tr.libreoffice.org/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "LibreOffice Forum", -+ "type": "url", -+ "url": "http://forum.libreoffice.org.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "LibreOffice Wiki", -+ "type": "url", -+ "url": "http://wiki.libreoffice.org.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Mozilla Türkiye", -+ "type": "url", -+ "url": "http://www.mozilla.org.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "GNOME Türkiye", -+ "type": "url", -+ "url": "http://www.gnome.org.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "KDE Türkiye", -+ "type": "url", -+ "url": "http://www.kde.org.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "OpenOffice.org Türkiye", -+ "type": "url", -+ "url": "http://www.openoffice.org.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "WordPress Türkiye", -+ "type": "url", -+ "url": "http://www.wordpress-tr.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Debian Türkiye", -+ "type": "url", -+ "url": "http://www.debian.org.tr/Ana_sayfa", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Gentoo Türkiye", -+ "type": "url", -+ "url": "http://www.gentoo-tr.org/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Linux Mint Türkiye", -+ "type": "url", -+ "url": "http://www.linuxmint.org.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "OpenSUSE.org Türkiye", -+ "type": "url", -+ "url": "http://tr.opensuse.org/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Slackware Türkiye", -+ "type": "url", -+ "url": "http://www.slackware.org.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Ubuntu Türkiye", -+ "type": "url", -+ "url": "http://www.ubuntu-tr.net/", -+ "visit_count": 0 -+ } -+ ], -+ "description": "", -+ "expanded": false, -+ "expanded_sidebar": false, -+ "name": "Topluluk", -+ "type": "folder" -+ }, -+ { -+ "children": [ -+ { -+ "description": "", -+ "keyword": "", -+ "name": "A Bank", -+ "type": "url", -+ "url": "http://www.abank.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Akbank", -+ "type": "url", -+ "url": "http://www.akbank.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Aktif Bank", -+ "type": "url", -+ "url": "http://www.aktifbank.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Anadolu Bank", -+ "type": "url", -+ "url": "http://www.anadolubank.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Citibank", -+ "type": "url", -+ "url": "http://www.citibank.com.tr/homepage/tr/index.htm", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "DenizBank", -+ "type": "url", -+ "url": "http://www.denizbank.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Eurobank Tekfen", -+ "type": "url", -+ "url": "http://www.eurobanktekfen.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Fibabanka", -+ "type": "url", -+ "url": "http://www.fibabanka.com.tr/Default.aspx", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Finansbank", -+ "type": "url", -+ "url": "http://www.finansbank.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Garanti Bankası", -+ "type": "url", -+ "url": "http://www.garanti.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Halkbank", -+ "type": "url", -+ "url": "http://www.halkbank.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "HSBC", -+ "type": "url", -+ "url": "http://www.hsbc.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "ING Bank", -+ "type": "url", -+ "url": "http://www.ingbank.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Şekerbank", -+ "type": "url", -+ "url": "http://www.sekerbank.com.tr//default.jsp", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "TEB", -+ "type": "url", -+ "url": "http://www.teb.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Eurobank Tekfen", -+ "type": "url", -+ "url": "http://www.tekfenbank.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Tbank", -+ "type": "url", -+ "url": "http://www.tbank.com.tr/tr-TR/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Tekstil Bank", -+ "type": "url", -+ "url": "http://www.tekstilbank.com.tr/portal/index.htm", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "TurkishBank", -+ "type": "url", -+ "url": "http://www.turkishbank.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Türkiye İş Bankası", -+ "type": "url", -+ "url": "http://www.isbank.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "VakıfBank", -+ "type": "url", -+ "url": "http://www.vakifbank.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Yapı Kredi", -+ "type": "url", -+ "url": "http://www.yapikredi.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Ziraat Bankası", -+ "type": "url", -+ "url": "http://www.ziraatbank.com.tr/", -+ "visit_count": 0 -+ } -+ ], -+ "description": "", -+ "expanded": false, -+ "expanded_sidebar": false, -+ "name": "Bankalar", -+ "type": "folder" -+ }, -+ { -+ "children": [ -+ { -+ "description": "", -+ "keyword": "", -+ "name": "HGS sorgulama", -+ "type": "url", -+ "url": "https://hgsmusteri.ptt.gov.tr", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Vatandaşlık Portalı", -+ "type": "url", -+ "url": "https://www.turkiye.gov.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Türk Telekom : Rehber", -+ "type": "url", -+ "url": "http://www.ttrehber.turktelekom.com.tr/trk-wp/IDA2", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Güncel Türkçe Sözlük", -+ "type": "url", -+ "url": "http://www.tdk.org.tr/index.php?option=com_gts&view=gts", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Türk Dil Kurumu Yazım Kılavuzu", -+ "type": "url", -+ "url": "http://www.tdk.org.tr/index.php?option=com_seslissozluk&view=seslissozluk", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Hava Tahmini", -+ "type": "url", -+ "url": "http://www.mgm.gov.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Nöbetçi Eczaneler", -+ "type": "url", -+ "url": "http://www.treczane.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Türk Telekom : Rehber", -+ "type": "url", -+ "url": "http://www.ttrehber.turktelekom.com.tr/trk-wp/IDA2", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Aday İşlemleri Sayfası(OSYM)", -+ "type": "url", -+ "url": "https://ais.osym.gov.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Hastane Randevu Alma", -+ "type": "url", -+ "url": "http://hastanerandevu.gov.tr/Vatandas/", -+ "visit_count": 0 -+ } -+ ], -+ "description": "", -+ "expanded": false, -+ "expanded_sidebar": false, -+ "name": "Bilgi Sorgulama", -+ "type": "folder" -+ }, -+ { -+ "children": [ -+ { -+ "children": [ -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Açık Gazete", -+ "type": "url", -+ "url": "http://www.acikgazete.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "BBC Turkce", -+ "type": "url", -+ "url": "http://www.bbc.co.uk/turkce/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Bianet", -+ "type": "url", -+ "url": "http://www.bianet.org/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Dipnot TV", -+ "type": "url", -+ "url": "http://www.dipnot.tv/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Dördüncü Kuvvet Medya", -+ "type": "url", -+ "url": "http://www.dorduncukuvvetmedya.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Gazeteport", -+ "type": "url", -+ "url": "http://www.gazeteport.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "haber365.com | 365 Gün Haber!", -+ "type": "url", -+ "url": "http://haber365.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "MYNET haber", -+ "type": "url", -+ "url": "http://www.mynet.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "NTVMSNBC", -+ "type": "url", -+ "url": "http://www.ntvmsnbc.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "ekolay.net | spor", -+ "type": "url", -+ "url": "http://spor.ekolay.net/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "HABERTÜRK Spor", -+ "type": "url", -+ "url": "http://www.htspor.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "NTVSpor.net", -+ "type": "url", -+ "url": "http://www.ntvspor.net/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Sporx", -+ "type": "url", -+ "url": "http://www.sporx.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Zaytung", -+ "type": "url", -+ "url": "http://zaytung.com/", -+ "visit_count": 0 -+ } -+ ], -+ "description": "", -+ "expanded": false, -+ "expanded_sidebar": false, -+ "name": "E-haber", -+ "type": "folder" -+ }, -+ { -+ "children": [ -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Anadolu Ajansı", -+ "type": "url", -+ "url": "http://www.aa.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Anka Haber Ajansı", -+ "type": "url", -+ "url": "http://www.ankaajansi.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Cihan Haber Ajansı", -+ "type": "url", -+ "url": "http://www.cihan.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Doğan Haber Ajansı", -+ "type": "url", -+ "url": "http://www.dha.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "İhlas Haber Ajansı", -+ "type": "url", -+ "url": "http://www.iha.com.tr/", -+ "visit_count": 0 -+ } -+ ], -+ "description": "", -+ "expanded": false, -+ "expanded_sidebar": false, -+ "name": "Ajans", -+ "type": "folder" -+ }, -+ { -+ "children": [ -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Akşam", -+ "type": "url", -+ "url": "http://www.aksam.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "BirGün", -+ "type": "url", -+ "url": "http://www.birgun.net/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Cumhuriyet", -+ "type": "url", -+ "url": "http://www.cumhuriyet.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Hürriyet", -+ "type": "url", -+ "url": "http://www.hurriyet.com.tr/anasayfa/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Dünya", -+ "type": "url", -+ "url": "http://www.dunya.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Evrensel", -+ "type": "url", -+ "url": "http://www.evrensel.net/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Milliyet", -+ "type": "url", -+ "url": "http://www.milliyet.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Güneş", -+ "type": "url", -+ "url": "http://www.gunes.com/2011/07/08/index.html", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Habertürk", -+ "type": "url", -+ "url": "http://www.haberturk.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Ortadoğu", -+ "type": "url", -+ "url": "http://www.ortadogugazetesi.net/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Özgür Gündem", -+ "type": "url", -+ "url": "http://www.ozgur-gundem.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Posta", -+ "type": "url", -+ "url": "http://www.posta.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Sabah", -+ "type": "url", -+ "url": "http://www.sabah.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Radikal", -+ "type": "url", -+ "url": "http://www.radikal.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Star Gazete", -+ "type": "url", -+ "url": "http://www.stargazete.com/starextra/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Takvim", -+ "type": "url", -+ "url": "http://www.takvim.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Taraf", -+ "type": "url", -+ "url": "http://www.taraf.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Türkiye", -+ "type": "url", -+ "url": "http://www.turkiyegazetesi.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Vatan", -+ "type": "url", -+ "url": "http://www.gazetevatan.com/root.asp", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Yeni Asya", -+ "type": "url", -+ "url": "http://www.yeniasya.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Yeni Şafak", -+ "type": "url", -+ "url": "http://www.yenisafak.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Yeniçağ", -+ "type": "url", -+ "url": "http://www.yg.yenicaggazetesi.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Fotomaç", -+ "type": "url", -+ "url": "http://www.fotomac.com.tr/", -+ "visit_count": 0 -+ } -+ ], -+ "description": "", -+ "expanded": false, -+ "expanded_sidebar": false, -+ "name": "Gazeteler", -+ "type": "folder" -+ }, -+ { -+ "children": [ -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Digiturk TV Rehberi", -+ "type": "url", -+ "url": "http://tvguide.digiturk.tv/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "ATV", -+ "type": "url", -+ "url": "http://www.atv.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "CNBC-E", -+ "type": "url", -+ "url": "http://www.cnbce.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "CNN TÜRK", -+ "type": "url", -+ "url": "http://www.cnnturk.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Kanal D", -+ "type": "url", -+ "url": "http://www.kanald.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "FOX", -+ "type": "url", -+ "url": "http://www.fox.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Habertürk", -+ "type": "url", -+ "url": "http://tv.haberturk.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "NTV", -+ "type": "url", -+ "url": "http://www.ntvmsnbc.com/news/37103.asp", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Show TV", -+ "type": "url", -+ "url": "http://www.showtvnet.com/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "Star TV", -+ "type": "url", -+ "url": "http://www.startv.com.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "TRT", -+ "type": "url", -+ "url": "http://www.trt.net.tr/", -+ "visit_count": 0 -+ }, -+ { -+ "description": "", -+ "keyword": "", -+ "name": "tv8", -+ "type": "url", -+ "url": "http://www.tv8.com.tr/", -+ "visit_count": 0 -+ } -+ ], -+ "description": "", -+ "expanded": false, -+ "expanded_sidebar": false, -+ "name": "Televizyonlar", -+ "type": "folder" -+ } -+ ], -+ "description": "", -+ "expanded": false, -+ "expanded_sidebar": false, -+ "name": "Haberler", -+ "type": "folder" -+ }, -+ { -+ "type": "separator" -+ } -+ ], -+ "description": "Yer imleri araç çubuğuna kaydedildi", -+ "expanded": true, -+ "expanded_sidebar": true, -+ "name": "Yer İmler Araç Çubuğu", -+ "type": "folder" - }, - "bookmark_menu": { -- "children": [], -- "description": "Bookmarks located in Bookmarks Menu", -- "expanded": true, -- "expanded_sidebar": true, -- "name": "Bookmarks Menu", -- "type": "folder" -+ "children": [ -+ ], -+ "description": "Yer imleri menüye kaydedildi", -+ "expanded": true, -+ "expanded_sidebar": true, -+ "name": "Yer İmleri Menüsü", -+ "type": "folder" - }, - "other": { -- "children": [], -- "description": "All other bookmarks", -- "expanded": true, -- "expanded_sidebar": true, -- "name": "Unsorted Bookmarks", -- "type": "folder" -+ "children": [ -+ ], -+ "description": "Diğer tüm yer imleri", -+ "expanded": true, -+ "expanded_sidebar": true, -+ "name": "Sıralanmamış Yerimleri", -+ "type": "folder" - } -- }, -- "version": 1 -+ }, -+ "version": 1 - } -+ diff --git a/desktop/kde6/applications/falkon-kf6/files/homepage.patch b/desktop/kde6/applications/falkon-kf6/files/homepage.patch deleted file mode 100644 index 70f98c53be..0000000000 --- a/desktop/kde6/applications/falkon-kf6/files/homepage.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff -Nuar a/src/lib/preferences/preferences.cpp b/src/lib/preferences/preferences.cpp ---- a/src/lib/preferences/preferences.cpp 2018-02-27 16:56:58.000000000 +0300 -+++ b/src/lib/preferences/preferences.cpp 2018-04-08 21:18:23.966125844 +0300 -@@ -131,7 +131,7 @@ - Settings settings; - //GENERAL URLs - settings.beginGroup("Web-URL-Settings"); -- m_homepage = settings.value("homepage", QUrl(QSL("falkon-kf6:start"))).toUrl(); -+ m_homepage = settings.value("homepage", QUrl(QSL("falkon-kf6:speeddial"))).toUrl(); - m_newTabUrl = settings.value("newTabUrl", QUrl(QSL("falkon-kf6:speeddial"))).toUrl(); - ui->homepage->setText(m_homepage.toEncoded()); - ui->newTabUrl->setText(m_newTabUrl.toEncoded()); -diff -Nuar a/src/lib/app/browserwindow.cpp b/src/lib/app/browserwindow.cpp ---- a/src/lib/app/browserwindow.cpp 2018-02-27 16:56:58.000000000 +0300 -+++ b/src/lib/app/browserwindow.cpp 2018-04-08 20:11:08.593417016 +0300 -@@ -576,7 +576,7 @@ - - //Url settings - settings.beginGroup("Web-URL-Settings"); -- m_homepage = settings.value("homepage", "falkon-kf6:start").toUrl(); -+ m_homepage = settings.value("homepage", "falkon-kf6:speeddial").toUrl(); - settings.endGroup(); - - //Browser Window settings diff --git a/desktop/kde6/applications/falkon-kf6/files/speeddial.diff b/desktop/kde6/applications/falkon-kf6/files/speeddial.diff deleted file mode 100644 index 1de33f47b7..0000000000 --- a/desktop/kde6/applications/falkon-kf6/files/speeddial.diff +++ /dev/null @@ -1,21 +0,0 @@ -diff -Nuar a/src/lib/plugins/speeddial.cpp b/src/lib/plugins/speeddial.cpp ---- a/src/lib/plugins/speeddial.cpp 2018-02-27 16:56:58.000000000 +0300 -+++ b/src/lib/plugins/speeddial.cpp 2018-04-08 00:13:44.000000000 +0300 -@@ -63,10 +63,14 @@ - settings.endGroup(); - - if (allPages.isEmpty()) { -- allPages = "url:\"https:/kde.org\"|title:\"KDE Community Home\";" -+ allPages = "url:\"https://www.turhost.com\"|title:\"Turhost - Web Hosting\";" -+ "url:\"https://www.pisilinux.org\"|title:\"Pisilinux - Hoşgeldiniz\";" -+ "url:\"https://pisilinux.org/forum\"|title:\"Pisilinux Forum\";" -+ "url:\"https://pisilinux.org/wiki\"|title:\"Pisilinux Wiki\";" -+ "url:\"https://www.youtube.com/html5\"|title:\"YouTube-html5\";" -+ "url:\"https://www.google.com\"|title:\"Google\";" - "url:\"https://phabricator.kde.org/source/falkon/\"|title:\"falkon-kf6 Git\";" -- "url:\"https://bugs.kde.org/describecomponents.cgi?product=falkon-kf6\"|title:\"falkon-kf6 Bug Tracker\";" -- "url:\"https://duckduckgo.com\"|title:\"DuckDuckGo\";"; -+ "url:\"https://github.com/pisilinux\"|title:\"Github\";"; - - } - changed(allPages); diff --git a/desktop/kde6/applications/falkon-kf6/pspec.xml b/desktop/kde6/applications/falkon-kf6/pspec.xml deleted file mode 100644 index 2e9f87b86f..0000000000 --- a/desktop/kde6/applications/falkon-kf6/pspec.xml +++ /dev/null @@ -1,186 +0,0 @@ - - - - - falkon-kf6 - https://www.falkon-kf6.org/ - - Mustafa Cinasal - muscnsl@gmail.com - - GPLv3 - app:web - Cross-platform QtWebKit browser - falkon-kf6 is a new and very fast QtWebEngine browser - https://download.kde.org/stable/release-service/24.12.1/src/falkon-24.12.1.tar.xz - - extra-cmake-modules-kf6 - kwallet-kf6-devel - qt6-base-devel - qt6-declarative-devel - qt6-webchannel-devel - qt6-webengine-devel - qt6-sql-postgresql - qt6-svg-devel - qt6-sql-mysql - qt6-sql-odbc - qt6-linguist - qt6-sql-sqlite - qt6-5compat-devel - libgnome-keyring - libxslt-devel - python3-devel - openssl-devel - libxcb-devel - nss-devel - cmake - llvm - kio-kf6-devel - purpose-kf6-devel - karchive-kf6-devel - openssl-devel - pyside6-devel - python3-devel - karchive-kf6-devel - python3-shiboken6-devel - - - - - - - - - - falkon-kf6 - - qupzilla - - - kio-kf6 - kcrash-kf6 - purpose-kf6 - kcoreaddons-kf6 - libxcb - libgnome-keyring - openssl - pyside6 - python3 - karchive-kf6 - shiboken6 - kwallet-kf6 - qt6-base - qt6-declarative - qt6-webchannel - qt6-webengine - qt6-5compat - qt6-sql-sqlite - - - /usr/bin - /usr/lib - /usr/include - /usr/share - /usr/share/locale - /usr/share/bash-completion - /usr/share/metainfo - /usr/share/pixmaps - /usr/share/icons - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-25 - 24.02.2 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/falkon-kf6/translations.xml b/desktop/kde6/applications/falkon-kf6/translations.xml deleted file mode 100644 index ed3d47cfbd..0000000000 --- a/desktop/kde6/applications/falkon-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - falkon-kf6 - Cross-platform QtWebKit browser - falkon-kf6 is a new and very fast QtWebEngine browser - - diff --git a/desktop/kde6/applications/ffmpegthumbs-kf6/actions.py b/desktop/kde6/applications/ffmpegthumbs-kf6/actions.py deleted file mode 100755 index 135fe37030..0000000000 --- a/desktop/kde6/applications/ffmpegthumbs-kf6/actions.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import shelltools -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import get - -NoStrip=["/usr/share"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/ffmpegthumbs-kf6/files/ffmpegthumbs-ffmpeg3.patch b/desktop/kde6/applications/ffmpegthumbs-kf6/files/ffmpegthumbs-ffmpeg3.patch deleted file mode 100755 index c62180789d..0000000000 --- a/desktop/kde6/applications/ffmpegthumbs-kf6/files/ffmpegthumbs-ffmpeg3.patch +++ /dev/null @@ -1,296 +0,0 @@ -From: -Date: -Subject: -X-Git-Url: http://quickgit.kde.org/?p=ffmpegthumbs-kf6.git&a=commitdiff&h=3978c762072b7bc16b2096819b7cfa2052deaf5e ---- ---- - - ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -36,7 +36,7 @@ - - add_library(ffmpegthumbs-kf6 MODULE ${ffmpegthumbs-kf6_PART_SRCS}) - --target_link_libraries(ffmpegthumbs-kf6 Qt5::Gui KF5::kio-kf6Widgets ${AVUTIL_LIBRARIES} ${AVFORMAT_LIBRARIES} ${AVCODEC_LIBRARIES} ${SWSCALE_LIBRARIES} ) -+target_link_libraries(ffmpegthumbs-kf6 Qt5::Gui KF5::kio-kf6Widgets ${AVUTIL_LIBRARIES} ${AVFILTER_LIBRARIES} ${AVFORMAT_LIBRARIES} ${AVCODEC_LIBRARIES} ${SWSCALE_LIBRARIES} ) - - install(TARGETS ffmpegthumbs-kf6 DESTINATION ${PLUGIN_INSTALL_DIR}) - ---- a/cmake/FindFFmpeg.cmake -+++ b/cmake/FindFFmpeg.cmake -@@ -99,6 +99,7 @@ - - # Check for all possible component. - find_component(AVCODEC libavcodec avcodec libavcodec/avcodec.h) -+ find_component(AVFILTER libavfilter avfilter libavfilter/avfilter.h) - find_component(AVFORMAT libavformat avformat libavformat/avformat.h) - find_component(AVDEVICE libavdevice avdevice libavdevice/avdevice.h) - find_component(AVUTIL libavutil avutil libavutil/avutil.h) ---- a/ffmpegthumbnailer/moviedecoder.cpp -+++ b/ffmpegthumbnailer/moviedecoder.cpp -@@ -40,6 +40,10 @@ - , m_FormatContextWasGiven(pavContext != NULL) - , m_AllowSeek(true) - , m_initialized(false) -+ , m_bufferSinkContext(nullptr) -+ , m_bufferSourceContext(nullptr) -+ , m_filterGraph(nullptr) -+ , m_filterFrame(nullptr) - { - initialize(filename); - } -@@ -51,6 +55,9 @@ - - void MovieDecoder::initialize(const QString& filename) - { -+ m_lastWidth = -1; -+ m_lastHeight = -1; -+ m_lastPixfmt = AV_PIX_FMT_NONE; - av_register_all(); - avcodec_register_all(); - -@@ -67,7 +74,7 @@ - } - - initializeVideo(); -- m_pFrame = avcodec_alloc_frame(); -+ m_pFrame = av_frame_alloc(); - - if (m_pFrame) { - m_initialized=true; -@@ -82,6 +89,7 @@ - - void MovieDecoder::destroy() - { -+ deleteFilterGraph(); - if (m_pVideoCodecContext) { - avcodec_close(m_pVideoCodecContext); - m_pVideoCodecContext = NULL; -@@ -93,13 +101,13 @@ - } - - if (m_pPacket) { -- av_free_packet(m_pPacket); -+ av_packet_unref(m_pPacket); - delete m_pPacket; - m_pPacket = NULL; - } - - if (m_pFrame) { -- av_free(m_pFrame); -+ av_frame_free(&m_pFrame); - m_pFrame = NULL; - } - -@@ -239,7 +247,7 @@ - return false; - } - -- avcodec_get_frame_defaults(m_pFrame); -+ av_frame_unref(m_pFrame); - - int frameFinished = 0; - -@@ -264,7 +272,7 @@ - int attempts = 0; - - if (m_pPacket) { -- av_free_packet(m_pPacket); -+ av_packet_unref(m_pPacket); - delete m_pPacket; - } - -@@ -275,7 +283,7 @@ - if (framesAvailable) { - frameDecoded = m_pPacket->stream_index == m_VideoStream; - if (!frameDecoded) { -- av_free_packet(m_pPacket); -+ av_packet_unref(m_pPacket); - } - } - } -@@ -283,15 +291,100 @@ - return frameDecoded; - } - -+void MovieDecoder::deleteFilterGraph() -+{ -+ if (m_filterGraph) { -+ av_frame_free(&m_filterFrame); -+ avfilter_graph_free(&m_filterGraph); -+ m_filterGraph = nullptr; -+ } -+} -+ -+bool MovieDecoder::initFilterGraph(enum AVPixelFormat pixfmt, int width, int height) -+{ -+ AVFilterInOut *inputs = nullptr, *outputs = nullptr; -+ -+ deleteFilterGraph(); -+ m_filterGraph = avfilter_graph_alloc(); -+ -+ QByteArray arguments("buffer="); -+ arguments += "video_size=" + QByteArray::number(width) + "x" + QByteArray::number(height) + ":"; -+ arguments += "pix_fmt=" + QByteArray::number(pixfmt) + ":"; -+ arguments += "time_base=1/1:pixel_aspect=0/1[in];"; -+ arguments += "[in]yadif[out];"; -+ arguments += "[out]buffersink"; -+ -+ int ret = avfilter_graph_parse2(m_filterGraph, arguments.constData(), &inputs, &outputs); -+ if (ret < 0) { -+ qWarning() << "Unable to parse filter graph"; -+ return false; -+ } -+ -+ if(inputs || outputs) -+ return -1; -+ -+ ret = avfilter_graph_config(m_filterGraph, nullptr); -+ if (ret < 0) { -+ qWarning() << "Unable to validate filter graph"; -+ return false; -+ } -+ -+ m_bufferSourceContext = avfilter_graph_get_filter(m_filterGraph, "Parsed_buffer_0"); -+ m_bufferSinkContext = avfilter_graph_get_filter(m_filterGraph, "Parsed_buffersink_2"); -+ if (!m_bufferSourceContext || !m_bufferSinkContext) { -+ qWarning() << "Unable to get source or sink"; -+ return false; -+ } -+ m_filterFrame = av_frame_alloc(); -+ m_lastWidth = width; -+ m_lastHeight = height; -+ m_lastPixfmt = pixfmt; -+ -+ return true; -+} -+ -+bool MovieDecoder::processFilterGraph(AVPicture *dst, const AVPicture *src, -+ enum AVPixelFormat pixfmt, int width, int height) -+{ -+ if (!m_filterGraph || width != m_lastWidth || -+ height != m_lastHeight || pixfmt != m_lastPixfmt) { -+ -+ if (!initFilterGraph(pixfmt, width, height)) { -+ return false; -+ } -+ } -+ -+ memcpy(m_filterFrame->data, src->data, sizeof(src->data)); -+ memcpy(m_filterFrame->linesize, src->linesize, sizeof(src->linesize)); -+ m_filterFrame->width = width; -+ m_filterFrame->height = height; -+ m_filterFrame->format = pixfmt; -+ -+ int ret = av_buffersrc_add_frame(m_bufferSourceContext, m_filterFrame); -+ if (ret < 0) { -+ return false; -+ } -+ -+ ret = av_buffersink_get_frame(m_bufferSinkContext, m_filterFrame); -+ if (ret < 0) { -+ return false; -+ } -+ -+ av_picture_copy(dst, (const AVPicture *) m_filterFrame, pixfmt, width, height); -+ av_frame_unref(m_filterFrame); -+ -+ return true; -+} -+ - void MovieDecoder::getScaledVideoFrame(int scaledSize, bool maintainAspectRatio, VideoFrame& videoFrame) - { - if (m_pFrame->interlaced_frame) { -- avpicture_deinterlace((AVPicture*) m_pFrame, (AVPicture*) m_pFrame, m_pVideoCodecContext->pix_fmt, -+ processFilterGraph((AVPicture*) m_pFrame, (AVPicture*) m_pFrame, m_pVideoCodecContext->pix_fmt, - m_pVideoCodecContext->width, m_pVideoCodecContext->height); - } - - int scaledWidth, scaledHeight; -- convertAndScaleFrame(PIX_FMT_RGB24, scaledSize, maintainAspectRatio, scaledWidth, scaledHeight); -+ convertAndScaleFrame(AV_PIX_FMT_RGB24, scaledSize, maintainAspectRatio, scaledWidth, scaledHeight); - - videoFrame.width = scaledWidth; - videoFrame.height = scaledHeight; -@@ -302,7 +395,7 @@ - memcpy((&(videoFrame.frameData.front())), m_pFrame->data[0], videoFrame.lineSize * videoFrame.height); - } - --void MovieDecoder::convertAndScaleFrame(PixelFormat format, int scaledSize, bool maintainAspectRatio, int& scaledWidth, int& scaledHeight) -+void MovieDecoder::convertAndScaleFrame(AVPixelFormat format, int scaledSize, bool maintainAspectRatio, int& scaledWidth, int& scaledHeight) - { - calculateDimensions(scaledSize, maintainAspectRatio, scaledWidth, scaledHeight); - SwsContext* scaleContext = sws_getContext(m_pVideoCodecContext->width, m_pVideoCodecContext->height, -@@ -323,7 +416,7 @@ - convertedFrame->data, convertedFrame->linesize); - sws_freeContext(scaleContext); - -- av_free(m_pFrame); -+ av_frame_free(&m_pFrame); - av_free(m_pFrameBuffer); - - m_pFrame = convertedFrame; -@@ -355,9 +448,9 @@ - } - } - --void MovieDecoder::createAVFrame(AVFrame** avFrame, quint8** frameBuffer, int width, int height, PixelFormat format) --{ -- *avFrame = avcodec_alloc_frame(); -+void MovieDecoder::createAVFrame(AVFrame** avFrame, quint8** frameBuffer, int width, int height, AVPixelFormat format) -+{ -+ *avFrame = av_frame_alloc(); - - int numBytes = avpicture_get_size(format, width, height); - *frameBuffer = reinterpret_cast(av_malloc(numBytes)); ---- a/ffmpegthumbnailer/moviedecoder.h -+++ b/ffmpegthumbnailer/moviedecoder.h -@@ -23,6 +23,9 @@ - extern "C" { - #include - #include -+#include -+#include -+#include - } - - namespace ffmpegthumbnailer -@@ -52,9 +55,13 @@ - - bool decodeVideoPacket(); - bool getVideoPacket(); -- void convertAndScaleFrame(PixelFormat format, int scaledSize, bool maintainAspectRatio, int& scaledWidth, int& scaledHeight); -- void createAVFrame(AVFrame** avFrame, quint8** frameBuffer, int width, int height, PixelFormat format); -+ void convertAndScaleFrame(AVPixelFormat format, int scaledSize, bool maintainAspectRatio, int& scaledWidth, int& scaledHeight); -+ void createAVFrame(AVFrame** avFrame, quint8** frameBuffer, int width, int height, AVPixelFormat format); - void calculateDimensions(int squareSize, bool maintainAspectRatio, int& destWidth, int& destHeight); -+ -+ void deleteFilterGraph(); -+ bool initFilterGraph(enum AVPixelFormat pixfmt, int width, int height); -+ bool processFilterGraph(AVPicture *dst, const AVPicture *src, enum AVPixelFormat pixfmt, int width, int height); - - private: - int m_VideoStream; -@@ -68,6 +75,13 @@ - bool m_FormatContextWasGiven; - bool m_AllowSeek; - bool m_initialized; -+ AVFilterContext* m_bufferSinkContext; -+ AVFilterContext* m_bufferSourceContext; -+ AVFilterGraph* m_filterGraph; -+ AVFrame* m_filterFrame; -+ int m_lastWidth; -+ int m_lastHeight; -+ enum AVPixelFormat m_lastPixfmt; - }; - - } ---- a/tests/CMakeLists.txt -+++ b/tests/CMakeLists.txt -@@ -19,7 +19,7 @@ - - add_executable(ffmpegthumbtest ${ffmpegthumbtest_SRCS} ) - --target_link_libraries(ffmpegthumbtest Qt5::Gui KF5::kio-kf6Widgets ${AVUTIL_LIBRARIES} ${AVFORMAT_LIBRARIES} ${AVCODEC_LIBRARIES} ${SWSCALE_LIBRARIES}) -+target_link_libraries(ffmpegthumbtest Qt5::Gui KF5::kio-kf6Widgets ${AVUTIL_LIBRARIES} ${AVFILTER_LIBRARIES} ${AVFORMAT_LIBRARIES} ${AVCODEC_LIBRARIES} ${SWSCALE_LIBRARIES}) diff --git a/desktop/kde6/applications/ffmpegthumbs-kf6/pspec.xml b/desktop/kde6/applications/ffmpegthumbs-kf6/pspec.xml deleted file mode 100755 index bfe14eba07..0000000000 --- a/desktop/kde6/applications/ffmpegthumbs-kf6/pspec.xml +++ /dev/null @@ -1,135 +0,0 @@ - - - - - ffmpegthumbs-kf6 - https://projects.kde.org/projects/kde/kdemultimedia/ffmpegthumbs-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde.multimedia - ffmpeg based thumbnailer for KDE - FFmpeg-based thumbnail creator for video files - mirrors://kde/stable/release-service/24.12.1/src/ffmpegthumbs-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kio-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - taglib-devel - ffmpeg-devel - - - - - - ffmpegthumbs-kf6 - - kio-kf6 - ki18n-kf6 - kconfig-kf6 - ffmpeg - taglib - libgcc - qt6-base - - - /usr/share - /usr/lib - /usr/share/doc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/ffmpegthumbs-kf6/translations.xml b/desktop/kde6/applications/ffmpegthumbs-kf6/translations.xml deleted file mode 100755 index e0552529a9..0000000000 --- a/desktop/kde6/applications/ffmpegthumbs-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - ffmpegthumbs-kf6 - KDE için ffmpeg tabanlı önizleme - Video dosyaları için FFmpeg tabanlı önizleme oluşturur. - - diff --git a/desktop/kde6/applications/filelight-kf6/actions.py b/desktop/kde6/applications/filelight-kf6/actions.py deleted file mode 100755 index 43c04d9cb8..0000000000 --- a/desktop/kde6/applications/filelight-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/filelight-kf6/pspec.xml b/desktop/kde6/applications/filelight-kf6/pspec.xml deleted file mode 100755 index 3f205337e9..0000000000 --- a/desktop/kde6/applications/filelight-kf6/pspec.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - filelight-kf6 - http://utils.kde.org/projects/filelight-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - filelight-kf6 - app:gui - desktop.kde.utils - View disk usage information - filelight-kf6 allows you to quickly understand exactly where your diskspace is being used by graphically representing your file system as a set of concentric segmented-rings. - mirrors://kde/stable/release-service/24.12.1/src/filelight-24.12.1.tar.xz - - qt6-base-devel - qt6-svg-devel - qt6-declarative-devel - kdoctools-kf6-devel - qqc2-desktop-style-kf6 - kirigami-addons-kf6 - extra-cmake-modules-kf6 - kio-kf6-devel - kparts-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kdeclarative-kf6-devel - mesa-devel - docbook-xsl - - - - - filelight-kf6 - - qt6-svg - qt6-base - qt6-declarative - kparts-kf6 - kio-kf6 - ki18n-kf6 - solid-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qqc2-desktop-style-kf6 - kirigami-addons-kf6 - - - /usr/lib - /usr/lib/qt6 - /usr/share/doc - /usr/bin - /usr/share - /etc/xdg - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/filelight-kf6/translations.xml b/desktop/kde6/applications/filelight-kf6/translations.xml deleted file mode 100755 index cdd39da4da..0000000000 --- a/desktop/kde6/applications/filelight-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - filelight-kf6 - View disk usage information - filelight-kf6 allows you to quickly understand exactly where your diskspace is being used by graphically representing your file system as a set of concentric segmented-rings. - - diff --git a/desktop/kde6/applications/granatier-kf6/actions.py b/desktop/kde6/applications/granatier-kf6/actions.py deleted file mode 100755 index a3995454b7..0000000000 --- a/desktop/kde6/applications/granatier-kf6/actions.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/applications/granatier-kf6/pspec.xml b/desktop/kde6/applications/granatier-kf6/pspec.xml deleted file mode 100755 index 9a26930747..0000000000 --- a/desktop/kde6/applications/granatier-kf6/pspec.xml +++ /dev/null @@ -1,145 +0,0 @@ - - - - - granatier-kf6 - https://www.kde.org/applications/games/granatier/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - granatier-kf6 - app:gui - desktop.kde.games - A bomber-kf6man game - granatier-kf6 is a clone of the classic bomber-kf6man game, inspired by the work of the Clanbomber-kf6 clone. - mirrors://kde/stable/release-service/24.12.1/src/granatier-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - mesa-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - knewstuff-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - - kdoctools-kf6-devel - kcompletion-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - - - - granatier-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - knewstuff-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/granatier-kf6/translations.xml b/desktop/kde6/applications/granatier-kf6/translations.xml deleted file mode 100755 index bb603369a5..0000000000 --- a/desktop/kde6/applications/granatier-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - granatier-kf6 - Bombalama macera oyunu - granatier-kf6, oyuncunun yüksekliği her turda azalan bir uçak içinde şehirlere hücum ettiği tek kişilik bir macera oyunudur. - - diff --git a/desktop/kde6/applications/grantlee-editor-kf6/actions.py b/desktop/kde6/applications/grantlee-editor-kf6/actions.py deleted file mode 100755 index dc7d4ed6e8..0000000000 --- a/desktop/kde6/applications/grantlee-editor-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/grantlee-editor-kf6/granatier-kf6/actions.py b/desktop/kde6/applications/grantlee-editor-kf6/granatier-kf6/actions.py deleted file mode 100755 index a3995454b7..0000000000 --- a/desktop/kde6/applications/grantlee-editor-kf6/granatier-kf6/actions.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/applications/grantlee-editor-kf6/granatier-kf6/pspec.xml b/desktop/kde6/applications/grantlee-editor-kf6/granatier-kf6/pspec.xml deleted file mode 100755 index cbdd06b5bc..0000000000 --- a/desktop/kde6/applications/grantlee-editor-kf6/granatier-kf6/pspec.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - granatier-kf6 - https://www.kde.org/applications/games/granatier/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - granatier-kf6 - app:gui - desktop.kde.games - A bomber-kf6man game - granatier-kf6 is a clone of the classic bomber-kf6man game, inspired by the work of the Clanbomber-kf6 clone. - mirrors://kde/stable/release-service/24.12.1/src/granatier-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - mesa-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - knewstuff-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - - kdoctools-kf6-devel - kcompletion-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - - - - granatier-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - knewstuff-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/grantlee-editor-kf6/granatier-kf6/translations.xml b/desktop/kde6/applications/grantlee-editor-kf6/granatier-kf6/translations.xml deleted file mode 100755 index bb603369a5..0000000000 --- a/desktop/kde6/applications/grantlee-editor-kf6/granatier-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - granatier-kf6 - Bombalama macera oyunu - granatier-kf6, oyuncunun yüksekliği her turda azalan bir uçak içinde şehirlere hücum ettiği tek kişilik bir macera oyunudur. - - diff --git a/desktop/kde6/applications/grantlee-editor-kf6/pspec.xml b/desktop/kde6/applications/grantlee-editor-kf6/pspec.xml deleted file mode 100755 index 90ed6c07c0..0000000000 --- a/desktop/kde6/applications/grantlee-editor-kf6/pspec.xml +++ /dev/null @@ -1,173 +0,0 @@ - - - - - grantlee-editor-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - Editor for Grantlee themes - Editor for Grantlee themes - mirrors://kde/stable/release-service/24.12.1/src/grantlee-editor-24.12.1.tar.xz - - qt6-webengine-devel - kcrash-kf6-devel - extra-cmake-modules-kf6 - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kxmlgui-kf6-devel - qt6-base-devel - ktexteditor-kf6-devel - kwallet-kf6-devel - knewstuff-kf6-devel - karchive-kf6-devel - pimcommon-kf6-devel - messagelib-kf6-devel - grantleetheme-kf6-devel - akonadi-mime-kf6-devel - kpimtextedit-kf6-devel - libkdepim-kf6-devel - syntax-highlighting-kf6-devel - libkleo-kf6-devel - kparts-kf6-devel - gpgme-devel - gpgme-qt6-devel - cyrus-sasl-devel - akonadi-kf6-devel - kitemmodels-kf6-devel - kcontacts-kf6-devel - akonadi-contacts-kf6-devel - kimap-kf6-devel - kmime-kf6-devel - - ffmpeg-devel - libXScrnSaver-devel - - - - - grantlee-editor-kf6 - Editor for Grantlee themes - - kio-kf6 - ki18n-kf6 - kmime-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - karchive-kf6 - qt6-base - kcontacts-kf6 - knewstuff-kf6 - pimcommon-kf6 - messagelib-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kpimtextedit-kf6 - qt6-webengine - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - akonadi-contacts-kf6 - syntax-highlighting-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/grantleetheme-kf6/actions.py b/desktop/kde6/applications/grantleetheme-kf6/actions.py deleted file mode 100755 index a7464b1612..0000000000 --- a/desktop/kde6/applications/grantleetheme-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/grantleetheme-kf6/files/qt5.patch b/desktop/kde6/applications/grantleetheme-kf6/files/qt5.patch deleted file mode 100755 index 039d758d9d..0000000000 --- a/desktop/kde6/applications/grantleetheme-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:03:55.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 22:59:16.160410049 +0300 -@@ -30,7 +30,7 @@ - - set(grantleetheme-kf6_LIB_VERSION ${PIM_VERSION}) - --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - set(GRANTLEE_VERSION "5.1") - - find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Widgets Network) diff --git a/desktop/kde6/applications/grantleetheme-kf6/pspec.xml b/desktop/kde6/applications/grantleetheme-kf6/pspec.xml deleted file mode 100755 index cd864ba392..0000000000 --- a/desktop/kde6/applications/grantleetheme-kf6/pspec.xml +++ /dev/null @@ -1,174 +0,0 @@ - - - - - grantleetheme-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - library - Library for Grantlee theming support - Library for Grantlee theming support - mirrors://kde/stable/release-service/24.12.1/src/grantleetheme-24.12.1.tar.xz - - qt6-base-devel - boost-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - extra-cmake-modules-kf6 - - kguiaddons-kf6-devel - knewstuff-kf6-devel - kcolorscheme-kf6-devel - ktexttemplate-kf6-devel - - - - - - - - grantleetheme-kf6 - - qt6-base - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - knewstuff-kf6 - kguiaddons-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - - kwidgetsaddons-kf6 - kcolorscheme-kf6 - ktexttemplate-kf6 - - - /etc/xdg - /usr/lib - /usr/share/doc - /usr/mkspecs/ - /usr/bin - /usr/share/mime - /usr/share/icons - /usr/share/kservice-kf6s5 - /usr/share/kservice-kf6types5 - /usr/share/dbus-1 - /usr/share/config.kcfg - /usr/share/kf5 - /usr/share/config - /usr/share/akonadi - /usr/share - /usr/share/akonadicontact/grantleetheme/default - /usr/share/locale - - - - - grantleetheme-kf6-devel - Development package for grantleetheme-kf6 libraries - Contains development tools and header files for grantleetheme-kf6 - - qt6-base-devel - boost-devel - ki18n-kf6-devel - ktexttemplate-kf6-devel - grantleetheme-kf6 - - - /usr/lib/cmake - /usr/include - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/gwenview-kf6/actions.py b/desktop/kde6/applications/gwenview-kf6/actions.py deleted file mode 100755 index c231c81b84..0000000000 --- a/desktop/kde6/applications/gwenview-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*", "NEWS") diff --git a/desktop/kde6/applications/gwenview-kf6/pspec.xml b/desktop/kde6/applications/gwenview-kf6/pspec.xml deleted file mode 100755 index 34b0b5d101..0000000000 --- a/desktop/kde6/applications/gwenview-kf6/pspec.xml +++ /dev/null @@ -1,216 +0,0 @@ - - - - - gwenview-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - gwenview-kf6 - app:gui - library - desktop.kde6.graphics - An image viewer - gwenview-kf6 is an easy to use image viewer - mirrors://kde/stable/release-service/24.12.1/src/gwenview-24.12.1.tar.xz - - exiv2-devel - qt6-base-devel - qt6-wayland-devel - qt6-svg-devel - - qt6-phonon-devel - tiff-devel - purpose-kf6-devel - cfitsio-devel - - kdoctools-kf6-devel - kio-kf6-devel - plasma-activities-kf6-devel - kded-kf6-devel - - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - baloo-kf6-devel - libkdcraw-kf6-devel - libpng-devel - zlib-devel - mesa-devel - docbook-xsl - extra-cmake-modules-kf6 - lcms2-devel - libX11-devel - kparts-kf6-devel - tiff-devel - purpose-kf6-devel - cfitsio-devel - libraw-devel - kguiaddons-kf6-devel - kcolorpicker-qt6-devel - kimageannotator-qt6-devel - packagekit-devel - packagekit-qt6-devel - wayland-protocols-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - knotifications-kf6-devel - kwindowsystem-kf6-devel - - - - - gwenview-kf6 - - qt6-base - exiv2-libs - solid-kf6 - plasma-activities-kf6 - - libkdcraw-kf6 - kded-kf6 - tiff - purpose-kf6 - cfitsio - kio-kf6 - ki18n-kf6 - lcms2 - kparts-kf6 - libX11 - libgcc - libpng - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - kservice-kf6 - baloo-kf6 - kitemviews-kf6 - qt6-phonon - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 - libjpeg-turbo - - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kfilemetadata-kf6 - kguiaddons-kf6 - libraw - wayland-client - kcolorscheme-kf6 - kimageannotator-qt6 - wayland-protocols - qt6-wayland - - - /usr/lib - /usr/share/doc - /usr/bin - /usr/share - /usr/share/icons - /usr/share/applications - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/gwenview-kf6/translations.xml b/desktop/kde6/applications/gwenview-kf6/translations.xml deleted file mode 100755 index ece0b245c3..0000000000 --- a/desktop/kde6/applications/gwenview-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - gwenview-kf6 - Resim görüntüleyici - gwenview-kf6, kullanımı kolay bir resim görüntüleyicisidir. - - diff --git a/desktop/kde6/applications/incidenceeditor-kf6/actions.py b/desktop/kde6/applications/incidenceeditor-kf6/actions.py deleted file mode 100755 index 82e40ee4b1..0000000000 --- a/desktop/kde6/applications/incidenceeditor-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/incidenceeditor-kf6/files/qt5.patch b/desktop/kde6/applications/incidenceeditor-kf6/files/qt5.patch deleted file mode 100755 index f2b4677270..0000000000 --- a/desktop/kde6/applications/incidenceeditor-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:03:56.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-17 23:22:46.040447149 +0300 -@@ -30,7 +30,7 @@ - set(incidenceeditor-kf6_LIB_VERSION ${PIM_VERSION}) - set(AKONADI_MIMELIB_VERSION "5.7.0") - set(KDEPIM_LIB_VERSION "5.7.0") --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - set(kmime-kf6_LIB_VERSION "5.7.0") - set(kmailtransport-kf6_LIB_VERSION "5.7.0") - set(kldap-kf6_LIB_VERSION "5.7.0") diff --git a/desktop/kde6/applications/incidenceeditor-kf6/pspec.xml b/desktop/kde6/applications/incidenceeditor-kf6/pspec.xml deleted file mode 100755 index 603fffeec0..0000000000 --- a/desktop/kde6/applications/incidenceeditor-kf6/pspec.xml +++ /dev/null @@ -1,206 +0,0 @@ - - - - - incidenceeditor-kf6 - https://community.kde.org/KDE_PIM - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - KDE PIM incidence editor. - KDE PIM incidence editor. - http://download.kde.org/stable/release-service/24.12.1/src/incidenceeditor-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - akonadi-kf6-devel - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kcoreaddons-kf6-devel - kservice-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kdoctools-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kunitconversion-kf6-devel - boost-devel - kmime-kf6-devel - kldap-kf6-devel - cyrus-sasl-devel - calendarsupport-kf6-devel - kidentitymanagement-kf6-devel - akonadi-calendar-kf6-devel - kcalendarcore-kf6-devel - kcontacts-kf6-devel - eventviews-kf6-devel - kcalutils-kf6-devel - kdiagram-kf6-devel - kmailtransport-kf6-devel - libkdepim-kf6-devel - akonadi-mime-kf6-devel - akonadi-contacts-kf6-devel - pimcommon-kf6-devel - kimap-kf6-devel - kiconthemes-kf6-devel - - - - - - - - incidenceeditor-kf6 - KDE PIM incidence editor. - - kio-kf6 - ki18n-kf6 - kldap-kf6 - kmime-kf6 - kimap-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kdiagram-kf6 - kservice-kf6 - kcalutils-kf6 - kcontacts-kf6 - libkdepim-kf6 - pimcommon-kf6 - eventviews-kf6 - kcompletion-kf6 - kguiaddons-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - kpimtextedit-kf6 - ktextwidgets-kf6 - akonadi-mime-kf6 - kcalendarcore-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - kwidgetsaddons-kf6 - calendarsupport-kf6 - akonadi-contacts-kf6 - akonadi-calendar-kf6 - kidentitymanagement-kf6 - qt6-base - - - /etc/xdg - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - /usr/share/locale - - - - - incidenceeditor-kf6-devel - Development files for incidenceeditor-kf6. - - incidenceeditor-kf6 - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kaccounts-integration-kf6/actions.py b/desktop/kde6/applications/kaccounts-integration-kf6/actions.py deleted file mode 100755 index 0c9a319c4d..0000000000 --- a/desktop/kde6/applications/kaccounts-integration-kf6/actions.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*") diff --git a/desktop/kde6/applications/kaccounts-integration-kf6/pspec.xml b/desktop/kde6/applications/kaccounts-integration-kf6/pspec.xml deleted file mode 100755 index 4b8e05fd55..0000000000 --- a/desktop/kde6/applications/kaccounts-integration-kf6/pspec.xml +++ /dev/null @@ -1,171 +0,0 @@ - - - - - kaccounts-integration-kf6 - https://projects.kde.org/projects/kdereview/kaccounts-integration-kf6 - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - app - desktop.kde6.network - Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - mirrors://kde/stable/release-service/24.12.1/src/kaccounts-integration-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - kcmutils-kf6-devel - ki18n-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - libaccounts-qt6-devel - libaccounts-glib-devel - gettext-devel - kdoctools-kf6-devel - kdeclarative-kf6-devel - kio-kf6-devel - signon-ui - kconfig-kf6-devel - kwallet-kf6-devel - qcoro-qt6-devel - signon-plugin-oauth2-devel - signond-qt6-devel - - - - - kaccounts-integration-kf6 - - ki18n-kf6 - libgcc - intltool - signon-ui - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - kdeclarative-kf6 - kconfigwidgets-kf6 - libaccounts-qt6 - signon-plugin-oauth2 - qt6-declarative - kio-kf6 - kconfig-kf6 - kwallet-kf6 - qcoro-qt6 - signond-qt6 - - Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - - /usr/share - /usr/share/kservice-kf6s5 - /usr/share/doc - /usr/lib/qt6 - /usr/lib/libkaccounts6.so* - - - - - kaccounts-integration-kf6-devel - Development files for kaccounts-integration-kf6 - - kaccounts-integration-kf6 - signond-qt6-devel - libaccounts-qt6-devel - - - /usr/include - /usr/lib/cmake/KAccounts6 - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kaccounts-providers-kf6/actions.py b/desktop/kde6/applications/kaccounts-providers-kf6/actions.py deleted file mode 100755 index 2af1467f0e..0000000000 --- a/desktop/kde6/applications/kaccounts-providers-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kaccounts-providers-kf6/pspec.xml b/desktop/kde6/applications/kaccounts-providers-kf6/pspec.xml deleted file mode 100755 index 0d77d135a5..0000000000 --- a/desktop/kde6/applications/kaccounts-providers-kf6/pspec.xml +++ /dev/null @@ -1,149 +0,0 @@ - - - - - kaccounts-providers-kf6 - https://projects.kde.org/projects/playground/base/kde-accounts/kaccounts-providers-kf6 - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - app - desktop.kde6.network - Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - mirrors://kde/stable/release-service/24.12.1/src/kaccounts-providers-24.12.1.tar.xz - - extra-cmake-modules-kf6 - intltool - kaccounts-integration-kf6-devel - qt6-declarative-devel - qt6-webengine-devel - qt6-base-devel - kcoreaddons-kf6-devel - libaccounts-qt6-devel - libaccounts-glib-devel - kio-kf6-devel - ki18n-kf6-devel - kdeclarative-kf6-devel - kpackage-kf6-devel - signond-devel - signond-qt6-devel - qcoro-qt6-devel - - - - - kaccounts-providers-kf6 - - kaccounts-integration-kf6 - libaccounts-glib - libgcc - kio-kf6 - ki18n-kf6 - kpackage-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - signond-qt6 - qcoro-qt6 - qt6-declarative - qt6-webengine - qt6-base - - Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - - /etc - /usr/share - /usr/lib/qt6 - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kaddressbook-kf6/actions.py b/desktop/kde6/applications/kaddressbook-kf6/actions.py deleted file mode 100755 index dc7d4ed6e8..0000000000 --- a/desktop/kde6/applications/kaddressbook-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/kaddressbook-kf6/pspec.xml b/desktop/kde6/applications/kaddressbook-kf6/pspec.xml deleted file mode 100755 index 3e8a41bc0a..0000000000 --- a/desktop/kde6/applications/kaddressbook-kf6/pspec.xml +++ /dev/null @@ -1,187 +0,0 @@ - - - - - kaddressbook-kf6 - https://kontact-kf6.kde.org/ - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - KDE contact manager - kaddressbook-kf6 reborn to make your data available to all your applications - mirrors://kde/stable/release-service/24.12.1/src/kaddressbook-24.12.1.tar.xz - - - kimap-kf6-devel - kparts-kf6-devel - kcrash-kf6-devel - prison-kf6-devel - akonadi-kf6-devel - libkleo-kf6-devel - kcmutils-kf6-devel - qt6-base-devel - libkdepim-kf6-devel - pimcommon-kf6-devel - kldap-kf6-devel - kdoctools-kf6-devel - - mailcommon-kf6-devel - messagelib-kf6-devel - kdbusaddons-kf6-devel - cyrus-sasl-devel - kitemmodels-kf6-devel - - akonadi-mime-kf6-devel - kpimtextedit-kf6-devel - grantleetheme-kf6-devel - extra-cmake-modules-kf6 - akonadi-search-kf6-devel - kunitconversion-kf6-devel - kontactinterface-kf6-devel - akonadi-contacts-kf6-devel - kidentitymanagement-kf6-devel - kuserfeedback-kf6-devel - gpgme-devel - gpgme-qt6-devel - - - - - kaddressbook-kf6 - KDE contact manager - - ki18n-kf6 - kcrash-kf6 - kparts-kf6 - libgcc - akonadi-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcmutils-kf6 - qt6-base - kldap-kf6 - kcontacts-kf6 - libkdepim-kf6 - pimcommon-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - grantleetheme-kf6 - akonadi-search-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - akonadi-contacts-kf6 - kontactinterface-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - kaddressbook-kf6-devel - Development files for kaddressbook-kf6 - - kaddressbook-kf6 - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kaddressbook-kf6/translations.xml b/desktop/kde6/applications/kaddressbook-kf6/translations.xml deleted file mode 100644 index 840783f18e..0000000000 --- a/desktop/kde6/applications/kaddressbook-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kaddressbook-kf6 - Kişilerinizi kolayca yönetin - kaddressbook-kf6, kişilerinizi kolayca yönetmenizi sağlar. Bir e-posta gönderirken veya bir toplantı daveti oluştururken kolayca kişileri seçmenize olanak tanıyan kontact-kf6'ın geri kalanıyla derinlemesine entegre edilmiştir. - - diff --git a/desktop/kde6/applications/kalarm-kf6/actions.py b/desktop/kde6/applications/kalarm-kf6/actions.py deleted file mode 100755 index 1dc4ffb75a..0000000000 --- a/desktop/kde6/applications/kalarm-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("AUTHORS", "LICENSES/*", "README*") diff --git a/desktop/kde6/applications/kalarm-kf6/pspec.xml b/desktop/kde6/applications/kalarm-kf6/pspec.xml deleted file mode 100755 index 376624f138..0000000000 --- a/desktop/kde6/applications/kalarm-kf6/pspec.xml +++ /dev/null @@ -1,213 +0,0 @@ - - - - - kalarm-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - Personal alarm scheduler - kalarm-kf6 is a personal alarm message, audio, command and email scheduler - http://download.kde.org/stable/release-service/24.12.1/src/kalarm-24.12.1.tar.xz - - akonadi-contacts-kf6-devel - akonadi-kf6-devel - akonadi-mime-kf6-devel - extra-cmake-modules-kf6 - kauth-kf6-devel - vlc-libs - vlc-devel - kcalendarcore-kf6-devel - kcalutils-kf6-devel - kcmutils-kf6-devel - kcodecs-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6 - kdbusaddons-kf6-devel - kglobalaccel-kf6-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - kholidays-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kidentitymanagement-kf6-devel - kio-kf6-devel - kjobwidgets-kf6-devel - kmime-kf6-devel - knotifications-kf6-devel - kpimtextedit-kf6-devel - kservice-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - libX11-devel - libkdepim-kf6-devel - libxslt-devel - mailcommon-kf6-devel - pimcommon-kf6-devel - qt6-base-devel - qt6-5compat-devel - qt6-phonon-devel - kunitconversion-kf6-devel - kitemmodels-kf6-devel - kcontacts-kf6-devel - messagelib-kf6-devel - kimap-kf6-devel - cyrus-sasl-devel - libkleo-kf6-devel - gpgme-devel - kmailtransport-kf6-devel - libcanberra-devel - kidletime-kf6-devel - knotifyconfig-kf6-devel - kstatusnotifieritem-kf6-devel - - - - - kalarm-kf6 - Personal alarm scheduler - - kio-kf6 - kauth-kf6 - ki18n-kf6 - kmime-kf6 - libgcc - vlc-libs - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcalendarcore-kf6 - kservice-kf6 - kcalutils-kf6 - kcontacts-kf6 - kholidays-kf6 - libkdepim-kf6 - pimcommon-kf6 - kguiaddons-kf6 - qt6-5compat - qt6-phonon - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - akonadi-mime-kf6 - kpimtextedit-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - akonadi-contacts-kf6 - kglobalaccel-kf6 - kidentitymanagement-kf6 - qt6-base - kidletime-kf6 - knotifyconfig-kf6 - kstatusnotifieritem-kf6 - - - /etc/dbus-1 - /etc/xdg - /usr/lib - /usr/bin - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kalgebra-kf6/actions.py b/desktop/kde6/applications/kalgebra-kf6/actions.py deleted file mode 100755 index faed79af61..0000000000 --- a/desktop/kde6/applications/kalgebra-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING", "COPYING.DOC", "COPYING.LIB", "TODO") diff --git a/desktop/kde6/applications/kalgebra-kf6/pspec.xml b/desktop/kde6/applications/kalgebra-kf6/pspec.xml deleted file mode 100755 index e13c097b30..0000000000 --- a/desktop/kde6/applications/kalgebra-kf6/pspec.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - kalgebra-kf6 - https://www.kde.org/applications/education/kalgebra/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2+ - kalgebra-kf6 - app:gui - desktop.kde.edu - A graph calculator - kalgebra-kf6 is a fully featured calculator that lets you plot different types of 2D and 3D functions and to calculate easy and not so easy calculations, such as addition, trigonometric functions or derivatives. - mirrors://kde/stable/release-service/24.12.1/src/kalgebra-24.12.1.tar.xz - - mesa-devel - mesa-glu-devel - qt6-base-devel - qt6-declarative - - qt6-svg-devel - qt6-5compat-devel - analitza-kf6-devel - kdoctools-kf6-devel - ncurses-devel - readline-devel - gettext-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kio-kf6-devel - extra-cmake-modules-kf6 - qt6-webengine-devel - ffmpeg-devel - libXScrnSaver-devel - - - - - kalgebra-kf6 - - qt6-base - qt6-declarative - analitza-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - readline - kcoreaddons-kf6 - ki18n-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kio-kf6 - qt6-webengine - - - /usr/share/doc - /usr/bin - /usr/share - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kalgebra-kf6/translations.xml b/desktop/kde6/applications/kalgebra-kf6/translations.xml deleted file mode 100755 index bcfe4085d3..0000000000 --- a/desktop/kde6/applications/kalgebra-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kalgebra-kf6 - Bir grafiksel hesap makinesi - kalgebra-kf6, farklı farklı 2B ve 3B fonksiyonları çizmek, kolay ve o kadar da kolay olmayan trigonometrik veya türev gibi hesaplamaları yapmak için bir uygulamadır. - - diff --git a/desktop/kde6/applications/kalzium-kf6/actions.py b/desktop/kde6/applications/kalzium-kf6/actions.py deleted file mode 100644 index 938d767ac9..0000000000 --- a/desktop/kde6/applications/kalzium-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - #pisitools.dodoc("AUTHORS", "BUGS", "ChangeLog", "COPYING", "NEWS", "README") diff --git a/desktop/kde6/applications/kalzium-kf6/pspec.xml b/desktop/kde6/applications/kalzium-kf6/pspec.xml deleted file mode 100644 index 5b7844a0c7..0000000000 --- a/desktop/kde6/applications/kalzium-kf6/pspec.xml +++ /dev/null @@ -1,178 +0,0 @@ - - - - - kalzium-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - app:console - Periodic Table of Elements - Elementlerin periyodik tablosu - https://download.kde.org/stable/release-service/24.12.1/src/kalzium-24.12.1.tar.xz - - cmake - eigen3 - ocaml - kio-kf6-devel - ki18n-kf6-devel - karchive-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - qt6-svg-devel - qt6-base-devel - qt6-scxml-devel - qt6-5compat-devel - kitemmodels-kf6-devel - - kplotting-kf6-devel - kitemviews-kf6-devel - kdoctools-kf6-devel - - kcompletion-kf6-devel - kcoreaddons-kf6-devel - ktextwidgets-kf6-devel - - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kunitconversion-kf6-devel - - extra-cmake-modules-kf6 - - - - - kalzium-kf6 - - kio-kf6 - karchive-kf6 - ki18n-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - qt6-scxml - kplotting-kf6 - kitemviews-kf6 - qt6-5compat - kcompletion-kf6 - kcoreaddons-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kunitconversion-kf6 - - - /usr/bin - /etc - /usr/lib - /usr/share - /usr/share/locale - /usr/share/man - /usr/share/metainfo - /usr/share/doc - - - - - kalzium-kf6-devel - Development files for kalzium-kf6 - - kalzium-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kalzium-kf6/translations.xml b/desktop/kde6/applications/kalzium-kf6/translations.xml deleted file mode 100644 index e16adde1c7..0000000000 --- a/desktop/kde6/applications/kalzium-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kalzium-kf6 - Periodic Table of Elements - Elementlerin periyodik tablosu - - diff --git a/desktop/kde6/applications/kamera-kf6/actions.py b/desktop/kde6/applications/kamera-kf6/actions.py deleted file mode 100755 index 753d288f11..0000000000 --- a/desktop/kde6/applications/kamera-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README") diff --git a/desktop/kde6/applications/kamera-kf6/pspec.xml b/desktop/kde6/applications/kamera-kf6/pspec.xml deleted file mode 100755 index 3ae731ad8e..0000000000 --- a/desktop/kde6/applications/kamera-kf6/pspec.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - - - kamera-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde.graphics - Webcam support for KDE - kamera-kf6 is a plugin for KDE to use webcam. - mirrors://kde/stable/release-service/24.12.1/src/kamera-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-5compat-devel - kconfigwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcmutils-kf6-devel - kdoctools-kf6-devel - libgphoto2-devel - - - - - kamera-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kcmutils-kf6 - qt6-base - libgphoto2 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/lib - /usr/share/doc - /usr/share - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kamera-kf6/translations.xml b/desktop/kde6/applications/kamera-kf6/translations.xml deleted file mode 100755 index cbdeafc9e0..0000000000 --- a/desktop/kde6/applications/kamera-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kamera-kf6 - KDE için web kamera-kf6 desteği - kamera-kf6, KDE için bir web kamera-kf6 eklentisidir. - - diff --git a/desktop/kde6/applications/kanagram-kf6/actions.py b/desktop/kde6/applications/kanagram-kf6/actions.py deleted file mode 100755 index 409b8193bb..0000000000 --- a/desktop/kde6/applications/kanagram-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("ChangeLog", "COPYING", "COPYING.DOC", "TODO") diff --git a/desktop/kde6/applications/kanagram-kf6/pspec.xml b/desktop/kde6/applications/kanagram-kf6/pspec.xml deleted file mode 100755 index d3eb06f633..0000000000 --- a/desktop/kde6/applications/kanagram-kf6/pspec.xml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - kanagram-kf6 - https://www.kde.org/applications/education/kanagram/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kanagram-kf6 - app:gui - desktop.kde.edu - A letter order game - kanagram-kf6 is a game based on anagrams of words: the puzzle is solved when the letters of the scrambled word are put back in the correct order. There is no limit on either time taken, or the amount of attempts to solve the word. - mirrors://kde/stable/release-service/24.12.1/src/kanagram-24.12.1.tar.xz - - qt6-base-devel - qt6-declarative - kdoctools-kf6-devel - knewstuff-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kcrash-kf6-devel - sonnet-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kxmlgui-kf6 - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - libkeduvocdocument-kf6-devel - qt6-multimedia-devel - - - - - kanagram-kf6 - - ki18n-kf6 - libgcc - sonnet-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-base - knewstuff-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - qt6-multimedia - kconfigwidgets-kf6 - qt6-declarative - libkeduvocdocument-kf6 - - - /etc/xdg - /usr/share - /usr/bin - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kanagram-kf6/translations.xml b/desktop/kde6/applications/kanagram-kf6/translations.xml deleted file mode 100755 index 7df70caaec..0000000000 --- a/desktop/kde6/applications/kanagram-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kanagram-kf6 - Bir harf sıralama oyunu - kanagram-kf6, anagramlar üzerine bir oyundur. Dağınık yerleştirilmiş harfleri birleştirerek kelimeyi bulun. Zaman veya deneme sınırı yoktur. - - diff --git a/desktop/kde6/applications/kapman-kf6/actions.py b/desktop/kde6/applications/kapman-kf6/actions.py deleted file mode 100755 index fe3f301854..0000000000 --- a/desktop/kde6/applications/kapman-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import get - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kapman-kf6/pspec.xml b/desktop/kde6/applications/kapman-kf6/pspec.xml deleted file mode 100755 index 6a64f89547..0000000000 --- a/desktop/kde6/applications/kapman-kf6/pspec.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - kapman-kf6 - https://www.kde.org/applications/games/kapman/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kapman-kf6 - app:gui - desktop.kde.games - Pac-Man clone - kapman-kf6 is a clone of the well known game Pac-Man. You must go through the levels escaping ghosts in a maze. You lose a life when a ghost eats you, but you can eat the ghosts for a few seconds when eating an energizer. - mirrors://kde/stable/release-service/24.12.1/src/kapman-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kwindowsystem-kf6-devel - ki18n-kf6-devel - - kunitconversion-kf6-devel - kitemmodels-kf6-devel - - kconfigwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - - libkdegames-kf6-devel - qt6-declarative-devel - - - - - - kapman-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kapman-kf6/translations.xml b/desktop/kde6/applications/kapman-kf6/translations.xml deleted file mode 100755 index 3f2870927a..0000000000 --- a/desktop/kde6/applications/kapman-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kapman-kf6 - Pac-Man klonu - kapman-kf6 dünyaca ünlü Pac-Man'in bir türevidir. Labirent içinde hayaletlerle köşe kapmaca oynayarak bölümleri geçmeye çalıştığınız oyunda eğer hayaletlere yakalanırsanız bir hakkınızı kaybediyorsunuz. Eğer bir enerji nesnesi alırsanız bu kez siz bir kaç saniyeliğine hayaletleri yiyebiliyorsunuz. - - diff --git a/desktop/kde6/applications/kapptemplate-kf6/actions.py b/desktop/kde6/applications/kapptemplate-kf6/actions.py deleted file mode 100755 index a7464b1612..0000000000 --- a/desktop/kde6/applications/kapptemplate-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kapptemplate-kf6/pspec.xml b/desktop/kde6/applications/kapptemplate-kf6/pspec.xml deleted file mode 100755 index 12912fe946..0000000000 --- a/desktop/kde6/applications/kapptemplate-kf6/pspec.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - - - kapptemplate-kf6 - http://www.kde.org/ - - Pisi Linux Admins - admin@pisilinux.org - - GPLv2 - app:gui - desktop.kde.sdk - Application template generator - kapptemplate-kf6 is a shell script that will create the necessary framework to develop several types of applications, including applications based on the KDE development platform. - mirrors://kde/stable/release-service/24.12.1/src/kapptemplate-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - gettext - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - kcompletion-kf6-devel - karchive-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - kdoctools-kf6-devel - kirigami-addons-kf6 - - - - - kapptemplate-kf6 - - qt6-base - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - karchive-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kirigami-addons-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kapptemplate-kf6/translations.xml b/desktop/kde6/applications/kapptemplate-kf6/translations.xml deleted file mode 100755 index 51115aeee4..0000000000 --- a/desktop/kde6/applications/kapptemplate-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kapptemplate-kf6 - Uygulama şablon oluşturucu. - kapptemplate-kf6, çeşitli uygulamaları geliştirmek için gerekli olabilecek şablonlar oluşturmayı sağlar. - - diff --git a/desktop/kde6/applications/kate-kf6/actions.py b/desktop/kde6/applications/kate-kf6/actions.py deleted file mode 100755 index 1d0aa86785..0000000000 --- a/desktop/kde6/applications/kate-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - pisitools.ldflags.add("-Wl,-rpath,/usr/lib") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/applications/kate-kf6/files/36ede44f.patch b/desktop/kde6/applications/kate-kf6/files/36ede44f.patch deleted file mode 100644 index 7f03bb82b9..0000000000 --- a/desktop/kde6/applications/kate-kf6/files/36ede44f.patch +++ /dev/null @@ -1,153 +0,0 @@ -From 36ede44fc7bef479e94f76121309a900bee2b29f Mon Sep 17 00:00:00 2001 -From: Christoph Cullmann -Date: Mon, 16 May 2022 19:49:02 +0200 -Subject: [PATCH] Revert "Create filebrowser on demand" - -This reverts commit 7caed2681d18d9ea08c35f160e88fb44a2e52769. - -BUG: 453795 - -revert full lazy loading, doesn't work this way ---- - addons/filebrowser/kate-kf6filebrowser.cpp | 2 - - addons/filebrowser/kate-kf6filebrowserplugin.cpp | 41 ++++++-------------- - addons/filebrowser/kate-kf6filebrowserplugin.h | 14 +++---- - 3 files changed, 18 insertions(+), 39 deletions(-) - -diff --git a/addons/filebrowser/kate-kf6filebrowser.cpp b/addons/filebrowser/kate-kf6filebrowser.cpp -index 54c1fa1fb..a1e5e4eba 100644 ---- a/addons/filebrowser/kate-kf6filebrowser.cpp -+++ b/addons/filebrowser/kate-kf6filebrowser.cpp -@@ -115,8 +115,6 @@ kate-kf6FileBrowser::kate-kf6FileBrowser(ktexteditor-kf6::MainWindow *mainWindow, QWidget *p - connect(m_mainWindow, &ktexteditor-kf6::MainWindow::viewChanged, this, &kate-kf6FileBrowser::autoSyncFolder); - - connect(m_dirOperator, &KDirOperator::contextMenuAboutToShow, this, &kate-kf6FileBrowser::contextMenuAboutToShow); -- -- autoSyncFolder(); - } - - kate-kf6FileBrowser::~kate-kf6FileBrowser() -diff --git a/addons/filebrowser/kate-kf6filebrowserplugin.cpp b/addons/filebrowser/kate-kf6filebrowserplugin.cpp -index f03c78698..3e415b025 100644 ---- a/addons/filebrowser/kate-kf6filebrowserplugin.cpp -+++ b/addons/filebrowser/kate-kf6filebrowserplugin.cpp -@@ -52,10 +52,7 @@ ktexteditor-kf6::ConfigPage *kate-kf6FileBrowserPlugin::configPage(int number, QWidget * - if (number != 0) { - return nullptr; - } -- if (!m_views[0]->m_fileBrowser) { -- m_views[0]->createFileBrowser(true); -- } -- return new kate-kf6FileBrowserConfigPage(parent, m_views[0]->m_fileBrowser.get()); -+ return new kate-kf6FileBrowserConfigPage(parent, m_views[0]->m_fileBrowser); - } - // END kate-kf6FileBrowserPlugin - -@@ -67,50 +64,34 @@ kate-kf6FileBrowserPluginView::kate-kf6FileBrowserPluginView(ktexteditor-kf6::Plugin *plugin - ktexteditor-kf6::MainWindow::Left, - QIcon::fromTheme(QStringLiteral("document-open")), - i18n("Filesystem"))) -+ , m_fileBrowser(new kate-kf6FileBrowser(mainWindow, m_toolView)) - , m_mainWindow(mainWindow) - { - m_toolView->installEventFilter(this); -- connect(m_toolView.get(), SIGNAL(toolVisibleChanged(bool)), this, SLOT(createFileBrowser(bool))); - } - --void kate-kf6FileBrowserPluginView::readSessionConfig(const kconfig-kf6Group &config) -+kate-kf6FileBrowserPluginView::~kate-kf6FileBrowserPluginView() - { -- if (m_fileBrowser) { -- m_fileBrowser->readSessionConfig(config); -- } else { -- cg.reset(new kconfig-kf6Group(config)); -- } -+ // cleanup, kill toolview + console -+ delete m_fileBrowser->parentWidget(); - } - --void kate-kf6FileBrowserPluginView::writeSessionConfig(kconfig-kf6Group &config) -+void kate-kf6FileBrowserPluginView::readSessionConfig(const kconfig-kf6Group &config) - { -- if (m_fileBrowser) { -- m_fileBrowser->writeSessionConfig(config); -- } -+ m_fileBrowser->readSessionConfig(config); - } - --void kate-kf6FileBrowserPluginView::createFileBrowser(bool visible) -+void kate-kf6FileBrowserPluginView::writeSessionConfig(kconfig-kf6Group &config) - { -- if (!visible) { -- return; -- } -- -- // we must not have a filebrowser -- Q_ASSERT(!m_fileBrowser); -- -- disconnect(m_toolView.get(), SIGNAL(toolVisibleChanged(bool)), this, SLOT(createFileBrowser(bool))); -- m_fileBrowser = std::make_unique(m_mainWindow, m_toolView.get()); -- m_fileBrowser->readSessionConfig(*cg); -- // delete the config now -- cg.reset(); -+ m_fileBrowser->writeSessionConfig(config); - } - - bool kate-kf6FileBrowserPluginView::eventFilter(QObject *obj, QEvent *event) - { - if (event->type() == QEvent::KeyPress) { - QKeyEvent *ke = static_cast(event); -- if ((obj == m_toolView.get()) && (ke->key() == Qt::Key_Escape)) { -- m_mainWindow->hideToolView(m_toolView.get()); -+ if ((obj == m_toolView) && (ke->key() == Qt::Key_Escape)) { -+ m_mainWindow->hideToolView(m_toolView); - event->accept(); - return true; - } -diff --git a/addons/filebrowser/kate-kf6filebrowserplugin.h b/addons/filebrowser/kate-kf6filebrowserplugin.h -index 2517d3453..9fb6610c4 100644 ---- a/addons/filebrowser/kate-kf6filebrowserplugin.h -+++ b/addons/filebrowser/kate-kf6filebrowserplugin.h -@@ -11,15 +11,12 @@ - #ifndef kate-kf6_FILEBROWSER_PLUGIN_H - #define kate-kf6_FILEBROWSER_PLUGIN_H - --#include - #include - #include - #include - #include - #include - --#include -- - class kate-kf6FileBrowser; - class kate-kf6FileBrowserPluginView; - -@@ -56,16 +53,19 @@ public: - */ - kate-kf6FileBrowserPluginView(ktexteditor-kf6::Plugin *plugin, ktexteditor-kf6::MainWindow *mainWindow); - -+ /** -+ * Virtual destructor. -+ */ -+ ~kate-kf6FileBrowserPluginView() override; -+ - void readSessionConfig(const kconfig-kf6Group &config) override; - void writeSessionConfig(kconfig-kf6Group &config) override; - - private: - bool eventFilter(QObject *, QEvent *) override; -- Q_SLOT void createFileBrowser(bool visible); - -- std::unique_ptr m_toolView; -- std::unique_ptr m_fileBrowser = nullptr; -- std::unique_ptr cg; -+ QWidget *m_toolView; -+ kate-kf6FileBrowser *m_fileBrowser; - ktexteditor-kf6::MainWindow *m_mainWindow; - friend class kate-kf6FileBrowserPlugin; - }; --- -GitLab - diff --git a/desktop/kde6/applications/kate-kf6/files/e002696b.patch b/desktop/kde6/applications/kate-kf6/files/e002696b.patch deleted file mode 100644 index e8f1618dd3..0000000000 --- a/desktop/kde6/applications/kate-kf6/files/e002696b.patch +++ /dev/null @@ -1,38 +0,0 @@ -From e002696b0673dff7ec9584e00b1546d2f850121c Mon Sep 17 00:00:00 2001 -From: Christoph Cullmann -Date: Mon, 16 May 2022 19:47:04 +0200 -Subject: [PATCH] Revert "fix crash on file browser activation" - -This reverts commit a28624c877cfe6db6ae6ab257f95af36213b25e0. - -=> this fix is not enough, the kconfig-kf6Group is just not valid anymore here -in some cases - -BUG: 453795 ---- - addons/filebrowser/kate-kf6filebrowserplugin.cpp | 9 +++------ - 1 file changed, 3 insertions(+), 6 deletions(-) - -diff --git a/addons/filebrowser/kate-kf6filebrowserplugin.cpp b/addons/filebrowser/kate-kf6filebrowserplugin.cpp -index 6df25239a..f03c78698 100644 ---- a/addons/filebrowser/kate-kf6filebrowserplugin.cpp -+++ b/addons/filebrowser/kate-kf6filebrowserplugin.cpp -@@ -100,12 +100,9 @@ void kate-kf6FileBrowserPluginView::createFileBrowser(bool visible) - - disconnect(m_toolView.get(), SIGNAL(toolVisibleChanged(bool)), this, SLOT(createFileBrowser(bool))); - m_fileBrowser = std::make_unique(m_mainWindow, m_toolView.get()); -- -- // read config only if there yet, see bug 453234 -- if (cg) { -- m_fileBrowser->readSessionConfig(*cg); -- cg.reset(); -- } -+ m_fileBrowser->readSessionConfig(*cg); -+ // delete the config now -+ cg.reset(); - } - - bool kate-kf6FileBrowserPluginView::eventFilter(QObject *obj, QEvent *event) --- -GitLab - diff --git a/desktop/kde6/applications/kate-kf6/files/kate-17.04.0-allow-root.patch b/desktop/kde6/applications/kate-kf6/files/kate-17.04.0-allow-root.patch deleted file mode 100755 index be058b3078..0000000000 --- a/desktop/kde6/applications/kate-kf6/files/kate-17.04.0-allow-root.patch +++ /dev/null @@ -1,36 +0,0 @@ -diff -Nuar a/apps/kate/main.cpp b/apps/kate/main.cpp ---- a/apps/kate/main.cpp 2022-09-04 17:28:00.000000000 +0300 -+++ b/apps/kate/main.cpp 2022-09-24 14:34:46.081798927 +0300 -@@ -37,31 +37,9 @@ - - #include "SingleApplication/SingleApplication" - --#ifndef Q_OS_WIN --#include --#endif --#include -- - int main(int argc, char **argv) - { --#if !defined(Q_OS_WIN) && !defined(Q_OS_HAIKU) -- // Prohibit using sudo or kdesu-kf6 (but allow using the root user directly) -- if (getuid() == 0) { -- if (!qEnvironmentVariableIsEmpty("SUDO_USER")) { -- std::cout << "Running kate-kf6 with sudo can cause bugs and expose you to security vulnerabilities. " -- "Instead use kate-kf6 normally and you will be prompted for elevated privileges when " -- "saving documents if needed." -- << std::endl; -- return EXIT_FAILURE; -- } else if (!qEnvironmentVariableIsEmpty("kdesu-kf6_USER")) { -- std::cout << "Running kate-kf6 with kdesu-kf6 can cause bugs and expose you to security vulnerabilities. " -- "Instead use kate-kf6 normally and you will be prompted for elevated privileges when " -- "saving documents if needed." -- << std::endl; -- return EXIT_FAILURE; -- } -- } --#endif -+ - /** - * init resources from our static lib - */ diff --git a/desktop/kde6/applications/kate-kf6/files/kwrite-17.04.0-allow-root.patch b/desktop/kde6/applications/kate-kf6/files/kwrite-17.04.0-allow-root.patch deleted file mode 100755 index 24cbf07a88..0000000000 --- a/desktop/kde6/applications/kate-kf6/files/kwrite-17.04.0-allow-root.patch +++ /dev/null @@ -1,36 +0,0 @@ -diff -Nuar a/apps/kwrite/main.cpp b/apps/kwrite/main.cpp ---- a/apps/kwrite/main.cpp 2022-09-04 17:28:00.000000000 +0300 -+++ b/apps/kwrite/main.cpp 2022-09-24 14:35:55.673928905 +0300 -@@ -16,32 +16,9 @@ - #include - #include - --#ifndef Q_OS_WIN --#include --#endif -- --#include - - extern "C" Q_DECL_EXPORT int main(int argc, char **argv) - { --#if !defined(Q_OS_WIN) && !defined(Q_OS_HAIKU) -- // Prohibit using sudo or kdesu-kf6 (but allow using the root user directly) -- if (getuid() == 0) { -- if (!qEnvironmentVariableIsEmpty("SUDO_USER")) { -- std::cout << "Running KWrite with sudo can cause bugs and expose you to security vulnerabilities. " -- "Instead use KWrite normally and you will be prompted for elevated privileges when " -- "saving documents if needed." -- << std::endl; -- return EXIT_FAILURE; -- } else if (!qEnvironmentVariableIsEmpty("kdesu-kf6_USER")) { -- std::cout << "Running KWrite with kdesu-kf6 can cause bugs and expose you to security vulnerabilities. " -- "Instead use KWrite normally and you will be prompted for elevated privileges when " -- "saving documents if needed." -- << std::endl; -- return EXIT_FAILURE; -- } -- } --#endif - - #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) - /** diff --git a/desktop/kde6/applications/kate-kf6/files/org.kde.kate.desktop b/desktop/kde6/applications/kate-kf6/files/org.kde.kate.desktop deleted file mode 100755 index 8837d34e85..0000000000 --- a/desktop/kde6/applications/kate-kf6/files/org.kde.kate.desktop +++ /dev/null @@ -1,132 +0,0 @@ -[Desktop Entry] -GenericName=Advanced Text Editor -GenericName[ar]=محرر نصوص متقدّم -GenericName[ast]=Editor de testu avanzáu -GenericName[bg]=Усъвършенстван текстов редактор -GenericName[bs]=Napredni uređivač teksta -GenericName[ca]=Editor de text avançat -GenericName[ca@valencia]=Editor de text avançat -GenericName[cs]=Pokročilý textový editor -GenericName[da]=Avanceret teksteditor -GenericName[de]=Erweiterter Texteditor -GenericName[el]=Προχωρημένος επεξεργαστής κειμένου -GenericName[en_GB]=Advanced Text Editor -GenericName[es]=Editor de texto avanzado -GenericName[et]=Täiustatud tekstiredaktor -GenericName[eu]=Testu-editore aurreratua -GenericName[fi]=Kehittynyt tekstimuokkain -GenericName[fr]=Éditeur de texte avancé -GenericName[ga]=Ardeagarthóir Téacs -GenericName[gl]=Editor avanzado de textos -GenericName[he]=עורך טקסט מתקדם -GenericName[hr]=Napredni uređivač teksta -GenericName[hu]=Speciális szövegszerkesztő -GenericName[ia]=Editor avantiate de texto -GenericName[is]=Þróaður textaritill -GenericName[it]=Editor di testi avanzato -GenericName[ja]=高度なテキストエディタ -GenericName[kk]=Үздік мәтін редакторы -GenericName[km]=កម្មវិធី​និពន្ធ​អត្ថបទ​កម្រិត​ខ្ពស់ -GenericName[ko]=고급 텍스트 편집기 -GenericName[lt]=Sudėtingesnis teksto redaktorius -GenericName[lv]=Jaudīgs teksta redaktors -GenericName[mr]=प्रगत पाठ्य संपादक -GenericName[nb]=Avansert skriveprogram -GenericName[nds]=Verwiedert Texteditor -GenericName[ne]=उन्नत पाठ सम्पादक -GenericName[nl]=Geavanceerde teksteditor -GenericName[nn]=Avansert skriveprogram -GenericName[pa]=ਤਕਨੀਕੀ ਟੈਕਸਟ ਐਡੀਟਰ -GenericName[pl]=Zaawansowany edytor tekstu -GenericName[pt]=Editor de Texto Avançado -GenericName[pt_BR]=Editor de textos avançado -GenericName[ro]=Redactor de text avansat -GenericName[ru]=Улучшенный текстовый редактор -GenericName[si]=උසස් පෙළ සකසනය -GenericName[sk]=Pokročilý textový editor -GenericName[sl]=Napreden urejevalnik besedil -GenericName[sr]=Напредни уређивач текста -GenericName[sr@ijekavian]=Напредни уређивач текста -GenericName[sr@ijekavianlatin]=Napredni uređivač teksta -GenericName[sr@latin]=Napredni uređivač teksta -GenericName[sv]=Avancerad texteditor -GenericName[tg]=Таҳриргари матнии беҳтаршуда -GenericName[tr]=Gelişmiş Metin Düzenleyici -GenericName[ug]=ئالىي تېكىست تەھرىرلىگۈچ -GenericName[uk]=Потужний текстовий редактор -GenericName[vi]=Trình biên tập văn bản nâng cao -GenericName[x-test]=xxAdvanced Text Editorxx -GenericName[zh_CN]=高级文本编辑器 -GenericName[zh_TW]=進階文字編輯器 -Name=kate-kf6 -Name[ar]=كيت -Name[ast]=kate-kf6 -Name[be]=kate-kf6 -Name[bg]=kate-kf6 -Name[bs]=kate-kf6 -Name[ca]=kate-kf6 -Name[ca@valencia]=kate-kf6 -Name[cs]=kate-kf6 -Name[da]=kate-kf6 -Name[de]=kate-kf6 -Name[el]=kate-kf6 -Name[en_GB]=kate-kf6 -Name[eo]=kate-kf6 -Name[es]=kate-kf6 -Name[et]=kate-kf6 -Name[eu]=kate-kf6 -Name[fi]=kate-kf6 -Name[fr]=kate-kf6 -Name[ga]=kate-kf6 -Name[gl]=kate-kf6 -Name[he]=kate-kf6 -Name[hu]=kate-kf6 -Name[ia]=kate-kf6 -Name[it]=kate-kf6 -Name[ja]=kate-kf6 -Name[kk]=kate-kf6 -Name[km]=kate-kf6 -Name[ko]=kate-kf6 -Name[lt]=kate-kf6 -Name[lv]=kate-kf6 -Name[mr]=केट -Name[ms]=kate-kf6 -Name[nb]=kate-kf6 -Name[nds]=kate-kf6 -Name[ne]=केट -Name[nl]=kate-kf6 -Name[nn]=kate-kf6 -Name[pa]=ਕੇਟ -Name[pl]=kate-kf6 -Name[pt]=kate-kf6 -Name[pt_BR]=kate-kf6 -Name[ro]=kate-kf6 -Name[ru]=kate-kf6 -Name[si]=kate-kf6 -Name[sk]=kate-kf6 -Name[sl]=kate-kf6 -Name[sr]=Кејт -Name[sr@ijekavian]=Кејт -Name[sr@ijekavianlatin]=kate-kf6 -Name[sr@latin]=kate-kf6 -Name[sv]=kate-kf6 -Name[tg]=Кейт -Name[tr]=kate-kf6 -Name[ug]=kate-kf6 -Name[uk]=kate-kf6 -Name[vi]=kate-kf6 -Name[wa]=kate-kf6 -Name[x-test]=xxkate-kf6xx -Name[zh_CN]=kate-kf6 -Name[zh_TW]=kate-kf6 -MimeType=text/plain; -Exec=kate-kf6 -b %U -X-KDE-StartupNotify=false -X-KDE-HasTempFileOption=true -Icon=kate-kf6 -X-DocPath=kate/index.html -Type=Application -Terminal=false -InitialPreference=9 -X-DBUS-ServiceName=org.kde.kate-kf6 -Categories=Qt;KDE;Utility;TextEditor; diff --git a/desktop/kde6/applications/kate-kf6/pspec.xml b/desktop/kde6/applications/kate-kf6/pspec.xml deleted file mode 100755 index 3ea71f4bf5..0000000000 --- a/desktop/kde6/applications/kate-kf6/pspec.xml +++ /dev/null @@ -1,198 +0,0 @@ - - - - - kate-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - Advanced Text Editor - Plasma library and runtime components based upon KF5 and Qt5 - https://download.kde.org/stable/release-service/24.12.1/src/kate-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - - plasma-activities-kf6-devel - kconfig-kf6-devel - kcrash-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kjobwidgets-kf6-devel - kparts-kf6-devel - ktexteditor-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - knewstuff-kf6-devel - threadweaver-kf6-devel - kitemmodels-kf6-devel - libplasma-kf6-devel - syntax-highlighting-kf6-devel - kuserfeedback-kf6-devel - kwallet-kf6-devel - kguiaddons-kf6-devel - kdbusaddons-kf6-devel - - - - - - - - - - - kate-kf6 - - qt6-base - libgcc - libgit2 - knewstuff-kf6 - ki18n-kf6 - kconfig-kf6 - kded-kf6 - kguiaddons-kf6 - plasma-activities-kf6 - kjobwidgets-kf6 - kitemmodels-kf6 - kio-kf6 - kcrash-kf6 - kparts-kf6 - ktexteditor-kf6 - kwindowsystem-kf6 - kxmlgui-kf6 - libplasma-kf6 - kwallet-kf6 - kservice-kf6 - kbookmarks-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - threadweaver-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kuserfeedback-kf6 - syntax-highlighting-kf6 - kio-kf6 - kconfig-kf6 - kwallet-kf6 - kcolorscheme-kf6 - - - /usr/share - /etc/xdg - /usr/bin - /usr/lib/qt6 - /usr/lib - /usr/share/man - /usr/share/doc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/katomic-kf6/actions.py b/desktop/kde6/applications/katomic-kf6/actions.py deleted file mode 100755 index 96a00f0077..0000000000 --- a/desktop/kde6/applications/katomic-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import get - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/katomic-kf6/pspec.xml b/desktop/kde6/applications/katomic-kf6/pspec.xml deleted file mode 100755 index 7fa793ca96..0000000000 --- a/desktop/kde6/applications/katomic-kf6/pspec.xml +++ /dev/null @@ -1,154 +0,0 @@ - - - - - katomic-kf6 - https://www.kde.org/applications/games/katomic/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - katomic-kf6 - app:gui - desktop.kde.games - Sokoban like logic game - katomic-kf6 is both fun and educational game built around molecular geometry. - mirrors://kde/stable/release-service/24.12.1/src/katomic-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - knewstuff-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - - - kdoctools-kf6-devel - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - - - - - katomic-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - knewstuff-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/katomic-kf6/translations.xml b/desktop/kde6/applications/katomic-kf6/translations.xml deleted file mode 100755 index ce3d92d58b..0000000000 --- a/desktop/kde6/applications/katomic-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - katomic-kf6 - Sokoban benzeri mantık oyunu - katomic-kf6 moleküler geometri hakkında hem eğlenceli hem de eğitici bir oyundur. - - diff --git a/desktop/kde6/applications/kblackbox-kf6/actions.py b/desktop/kde6/applications/kblackbox-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/kblackbox-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kblackbox-kf6/pspec.xml b/desktop/kde6/applications/kblackbox-kf6/pspec.xml deleted file mode 100755 index a803bc953f..0000000000 --- a/desktop/kde6/applications/kblackbox-kf6/pspec.xml +++ /dev/null @@ -1,154 +0,0 @@ - - - - - kblackbox-kf6 - https://www.kde.org/applications/games/kblackbox/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kblackbox-kf6 - app:gui - desktop.kde.games - Blackbox logic game - kblackbox-kf6 is a game of hide and seek played on a grid of boxes. The computer has hidden several balls within this box. By shooting beams into the box and observing where they emerge it is possible to deduce the positions of the hidden balls. - mirrors://kde/stable/release-service/24.12.1/src/kblackbox-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-svg-devel - karchive-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - ki18n-kf6-devel - kcompletion-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - - kdoctools-kf6-devel - kitemmodels-kf6-devel - ktextwidgets-kf6-devel - kunitconversion-kf6-devel - - - - - kblackbox-kf6 - - ki18n-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - karchive-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kblackbox-kf6/translations.xml b/desktop/kde6/applications/kblackbox-kf6/translations.xml deleted file mode 100755 index 70fe62f914..0000000000 --- a/desktop/kde6/applications/kblackbox-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kblackbox-kf6 - Blackbox mantık oyunu - kblackbox-kf6 yan yana dizilmiş kutularla oynanan bir saklambaç oyunudur. Bilgisayarın sakladığı topları kutuları lazerle kontrol ederek bulabilirsiniz. - - diff --git a/desktop/kde6/applications/kblocks-kf6/actions.py b/desktop/kde6/applications/kblocks-kf6/actions.py deleted file mode 100755 index a2af670006..0000000000 --- a/desktop/kde6/applications/kblocks-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*", "README*") diff --git a/desktop/kde6/applications/kblocks-kf6/pspec.xml b/desktop/kde6/applications/kblocks-kf6/pspec.xml deleted file mode 100755 index f293ccc72a..0000000000 --- a/desktop/kde6/applications/kblocks-kf6/pspec.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - - - kblocks-kf6 - https://www.kde.org/applications/games/kblocks/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kblocks-kf6 - app:gui - desktop.kde.games - Falling blocks game - kblocks-kf6 is the classic falling blocks game. The idea is stack the falling blocks in a way that lines are completely filled. When a line is completed it is removed, and more space is available in the play area. When there is not enough space for blocks to fall, the game is over. - mirrors://kde/stable/release-service/24.12.1/src/kblocks-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-svg-devel - qt6-base-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - - kcrash-kf6-devel - kcompletion-kf6-devel - kdbusaddons-kf6-devel - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - - - - - - kblocks-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - qt6-phonon - kcoreaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kcrash-kf6 - kdbusaddons-kf6 - kcompletion-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kblocks-kf6/translations.xml b/desktop/kde6/applications/kblocks-kf6/translations.xml deleted file mode 100755 index 538bb76369..0000000000 --- a/desktop/kde6/applications/kblocks-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kblocks-kf6 - Tetris - kblocks-kf6 klasikleşmiş tetrisin bir yeniden yapımıdır. Oyunun amacı düşen parçaları en uygun şekilde dizmektir. Bir satır tamamen dolduktan sonra silinmektedir ve daha fazla oyun alanı açılmaktadır. Yeni parçaları koyacak yeriniz kalmadığında oyun bitmektedir. - - diff --git a/desktop/kde6/applications/kbounce-kf6/actions.py b/desktop/kde6/applications/kbounce-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/kbounce-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kbounce-kf6/pspec.xml b/desktop/kde6/applications/kbounce-kf6/pspec.xml deleted file mode 100755 index 9c2da9ac8a..0000000000 --- a/desktop/kde6/applications/kbounce-kf6/pspec.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - - - kbounce-kf6 - https://www.kde.org/applications/games/kbounce/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kbounce-kf6 - app:gui - desktop.kde.games - Ball bouncing game - kbounce-kf6 is a single player arcade game with the elements of puzzle. It is played on a field, surrounded by walls, with two or more balls that move about in the field bouncing off of walls. The player can build new walls, decreasing the size of the active field. The goal of the game is to fill at least 75% of the field and advance to the next level. - mirrors://kde/stable/release-service/24.12.1/src/kbounce-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kcompletion-kf6-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - - - kdoctools-kf6-devel - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - - - - - kbounce-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kbounce-kf6/translations.xml b/desktop/kde6/applications/kbounce-kf6/translations.xml deleted file mode 100755 index b463ecb108..0000000000 --- a/desktop/kde6/applications/kbounce-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kbounce-kf6 - Top zıplatma oyunu - kbounce-kf6, Volfied'in oynaniş tarzına benzeyen tek kişilik bir bulmaca - macera oyunudur. Oyuncu iki veya daha fazla topun oradan oraya zıpladığı duvarlarla kaplı bir alanda yeni duvarlar inşa ederek ve toplara yakalanmamaya çalışarak aktif alanın en azından %75'ini kapatmaya çalışmaktadır. - - diff --git a/desktop/kde6/applications/kbreakout-kf6/actions.py b/desktop/kde6/applications/kbreakout-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/kbreakout-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kbreakout-kf6/pspec.xml b/desktop/kde6/applications/kbreakout-kf6/pspec.xml deleted file mode 100755 index d23bb9849e..0000000000 --- a/desktop/kde6/applications/kbreakout-kf6/pspec.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - kbreakout-kf6 - https://www.kde.org/applications/games/kbreakout/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kbreakout-kf6 - app:gui - desktop.kde.games - Breakout like game - kbreakout-kf6 is a Breakout like game. The object of the game is to destroy as many bricks as possible without losing the ball. - mirrors://kde/stable/release-service/24.12.1/src/kbreakout-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kservice-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - libkdegames-kf6-devel - - - kdoctools-kf6-devel - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - - - - - kbreakout-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - - - /usr/share - /usr/share/doc - /usr/bin - /etc/xdg/kbreakout-kf6.categories - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kbreakout-kf6/translations.xml b/desktop/kde6/applications/kbreakout-kf6/translations.xml deleted file mode 100755 index 5651feecb0..0000000000 --- a/desktop/kde6/applications/kbreakout-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kbreakout-kf6 - Breakout benzeri oyun - kbreakout-kf6 bir Breakout türevidir. Oyunun amacı topları yere düşürmeden olabildiğince çok tuğlayı yok etmektir. - - diff --git a/desktop/kde6/applications/kbruch-kf6/actions.py b/desktop/kde6/applications/kbruch-kf6/actions.py deleted file mode 100755 index 0374af291e..0000000000 --- a/desktop/kde6/applications/kbruch-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kbruch-kf6/pspec.xml b/desktop/kde6/applications/kbruch-kf6/pspec.xml deleted file mode 100755 index 663fcc747c..0000000000 --- a/desktop/kde6/applications/kbruch-kf6/pspec.xml +++ /dev/null @@ -1,139 +0,0 @@ - - - - - kbruch-kf6 - https://www.kde.org/applications/education/kbruch/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kbruch-kf6 - app:gui - desktop.kde.edu - Practice calculating with fractions and percentages - kbruch-kf6 is a small program to practice calculating with fractions and percentages. Different exercises are provided for this purpose-kf6 and you can use the learning mode to practice with fractions. The program checks the user's input and gives feedback. - mirrors://kde/stable/release-service/24.12.1/src/kbruch-24.12.1.tar.xz - - qt6-base - kdoctools-kf6-devel - kconfig-kf6-devel - kcrash-kf6-devel - ki18n-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - extra-cmake-modules-kf6 - - - - - kbruch-kf6 - - qt6-base - kxmlgui-kf6 - kconfig-kf6 - kcrash-kf6 - ki18n-kf6 - libgcc - kwidgetsaddons-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - - - /usr/bin - /usr/share - /usr/share/man/man1 - /usr/share/doc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kbruch-kf6/translations.xml b/desktop/kde6/applications/kbruch-kf6/translations.xml deleted file mode 100755 index 700f11f0f1..0000000000 --- a/desktop/kde6/applications/kbruch-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kbruch-kf6 - Ondalık ve kesirli sayılarla pratik yapın - kbruch-kf6, ondalık ve kesirli sayılar üzerine işlemleri öğrenmeye ve egzersiz yapmaya yarayan bir uygulamadır. - - diff --git a/desktop/kde6/applications/kcalc-kf6/actions.py b/desktop/kde6/applications/kcalc-kf6/actions.py deleted file mode 100755 index 43c04d9cb8..0000000000 --- a/desktop/kde6/applications/kcalc-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kcalc-kf6/pspec.xml b/desktop/kde6/applications/kcalc-kf6/pspec.xml deleted file mode 100755 index d0178845e4..0000000000 --- a/desktop/kde6/applications/kcalc-kf6/pspec.xml +++ /dev/null @@ -1,146 +0,0 @@ - - - - - kcalc-kf6 - http://kde.org/applications/utilities/kcalc-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kcalc-kf6 - app:gui - desktop.kde6.utils - A scientific calculator - kcalc-kf6 is a calculator which offers many more mathematical functions than meet the eye on a first glance. - mirrors://kde/stable/release-service/24.12.1/src/kcalc-24.12.1.tar.xz - - qt6-base-devel - qt6-5compat-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - gmp-devel - cmake - mpfr-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kcrash-kf6-devel - knotifications-kf6-devel - kxmlgui-kf6-devel - mesa-devel - - - - - kcalc-kf6 - - qt6-base - gmp - ki18n-kf6 - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - kguiaddons-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - /usr/lib - /usr/share/doc - /usr/bin - /usr/share - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kcalc-kf6/translations.xml b/desktop/kde6/applications/kcalc-kf6/translations.xml deleted file mode 100755 index d7dfedeb22..0000000000 --- a/desktop/kde6/applications/kcalc-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kcalc-kf6 - Bir bilimsel hesap makinesi - kcalc-kf6, pek çok matematik fonksiyonu barındıran bir hesap makinesi uygulamasıdır. - - diff --git a/desktop/kde6/applications/kcalutils-kf6/actions.py b/desktop/kde6/applications/kcalutils-kf6/actions.py deleted file mode 100755 index c417edf426..0000000000 --- a/desktop/kde6/applications/kcalutils-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import get - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*") diff --git a/desktop/kde6/applications/kcalutils-kf6/files/qt5.patch b/desktop/kde6/applications/kcalutils-kf6/files/qt5.patch deleted file mode 100755 index 1c1e42fc7e..0000000000 --- a/desktop/kde6/applications/kcalutils-kf6/files/qt5.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -Nuar a/src/grantleeki18n-kf6localizer.cpp b/src/grantleeki18n-kf6localizer.cpp ---- a/src/grantleeki18n-kf6localizer.cpp 2017-12-04 13:20:01.000000000 +0300 -+++ b/src/grantleeki18n-kf6localizer.cpp 2017-12-16 18:18:43.000518179 +0300 -@@ -67,7 +67,9 @@ - break; - } - // fall-through -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - default: - qCWarning(kcalutils-kf6_LOG) << "Unknown type" << iter->typeName() << "(" << iter->type() << ")"; - break; diff --git a/desktop/kde6/applications/kcalutils-kf6/pspec.xml b/desktop/kde6/applications/kcalutils-kf6/pspec.xml deleted file mode 100755 index 9a56615e6c..0000000000 --- a/desktop/kde6/applications/kcalutils-kf6/pspec.xml +++ /dev/null @@ -1,169 +0,0 @@ - - - - - kcalutils-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:library - The KDE calendar utility library - Calendar utility library for KDE - mirrors://kde/stable/release-service/24.12.1/src/kcalutils-24.12.1.tar.xz - - qt6-base-devel - kcalendarcore-kf6-devel - kidentitymanagement-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - ki18n-kf6-devel - kcodecs-kf6-devel - kidentitymanagement-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kwidgetsaddons-kf6-devel - - kdoctools-kf6-devel - kiconthemes-kf6-devel - ktexttemplate-kf6-devel - extra-cmake-modules-kf6 - - - - - - - - kcalutils-kf6 - - qt6-base - kcalendarcore-kf6 - kidentitymanagement-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - - kcoreaddons-kf6 - kiconthemes-kf6 - kwidgetsaddons-kf6 - ktexttemplate-kf6 - - kidentitymanagement-kf6 - - - /etc/xdg - /usr/lib/qt6 - /usr/lib - /usr/share/doc - /usr/share/kcalendar - /usr/share/locale - /usr/share - - - - - kcalutils-kf6-devel - Development files for kcalutils-kf6 - - qt6-base-devel - kcalutils-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kcharselect-kf6/actions.py b/desktop/kde6/applications/kcharselect-kf6/actions.py deleted file mode 100755 index e0676cd5b1..0000000000 --- a/desktop/kde6/applications/kcharselect-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*") diff --git a/desktop/kde6/applications/kcharselect-kf6/pspec.xml b/desktop/kde6/applications/kcharselect-kf6/pspec.xml deleted file mode 100755 index d5b627076a..0000000000 --- a/desktop/kde6/applications/kcharselect-kf6/pspec.xml +++ /dev/null @@ -1,138 +0,0 @@ - - - - - kcharselect-kf6 - http://utils.kde.org/projects/kcharselect-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kcharselect-kf6 - app:gui - desktop.kde.utils - A character selector - kcharselect-kf6 is a tool to select special characters from all installed fonts and copy them into the clipboard. - mirrors://kde/stable/release-service/24.12.1/src/kcharselect-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kbookmarks-kf6-devel - cmake - extra-cmake-modules-kf6 - ki18n-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kcrash-kf6-devel - mesa-devel - - - - - kcharselect-kf6 - - qt6-base - kxmlgui-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kcrash-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share/doc - /usr/bin - /usr/share - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kcharselect-kf6/translations.xml b/desktop/kde6/applications/kcharselect-kf6/translations.xml deleted file mode 100755 index 8b15a0d042..0000000000 --- a/desktop/kde6/applications/kcharselect-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kcharselect-kf6 - Bir karakter seçici - kcharselect-kf6, tüm yüklü yazı tiplerinden özel karakterleri seçmek ve bunları panoya yapıştırmak için bir araçtır. - - diff --git a/desktop/kde6/applications/kcolorchooser-kf6/actions.py b/desktop/kde6/applications/kcolorchooser-kf6/actions.py deleted file mode 100755 index a29b3e347c..0000000000 --- a/desktop/kde6/applications/kcolorchooser-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING") diff --git a/desktop/kde6/applications/kcolorchooser-kf6/pspec.xml b/desktop/kde6/applications/kcolorchooser-kf6/pspec.xml deleted file mode 100755 index 14b4661c5f..0000000000 --- a/desktop/kde6/applications/kcolorchooser-kf6/pspec.xml +++ /dev/null @@ -1,133 +0,0 @@ - - - - - kcolorchooser-kf6 - http://www.kde.org/applications/graphics/kcolorchooser-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kcolorchooser-kf6 - app:gui - desktop.kde.graphics - A simple color chooser application - kcolorchooser-kf6 is a simple color chooser application. - mirrors://kde/stable/release-service/24.12.1/src/kcolorchooser-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - ki18n-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kiconthemes-kf6-devel - - - - - kcolorchooser-kf6 - - ki18n-kf6 - libgcc - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - - - /usr/bin - /usr/share/applications - /usr/share/icons - /usr/share/doc - /usr/share/metainfo - /usr/share/locale - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kcolorchooser-kf6/translations.xml b/desktop/kde6/applications/kcolorchooser-kf6/translations.xml deleted file mode 100755 index 163a8a161c..0000000000 --- a/desktop/kde6/applications/kcolorchooser-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kcolorchooser-kf6 - Basit bir renk seçme uygulaması - kcolorchooser-kf6, basit bir renk seçme uygulamasıdır. - - diff --git a/desktop/kde6/applications/kcron-kf6/actions.py b/desktop/kde6/applications/kcron-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/kcron-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kcron-kf6/pspec.xml b/desktop/kde6/applications/kcron-kf6/pspec.xml deleted file mode 100755 index 1911450faf..0000000000 --- a/desktop/kde6/applications/kcron-kf6/pspec.xml +++ /dev/null @@ -1,145 +0,0 @@ - - - - - kcron-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kcron-kf6 - app:gui - Graphical task scheduler - kcron-kf6 is a graphical frontend to the cron system, used to schedule regular tasks on a Unix system. - mirrors://kde/stable/release-service/24.12.1/src/kcron-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - ki18n-kf6-devel - kdoctools-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kcmutils-kf6-devel - kxmlgui-kf6-devel - kiconthemes-kf6-devel - kirigami-addons-kf6 - - - - - kcron-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kcmutils-kf6 - qt6-base - kcoreaddons-kf6 - kiconthemes-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kirigami-addons-kf6 - - - kdeadmin - - - kdeadmin - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kcron-kf6/translations.xml b/desktop/kde6/applications/kcron-kf6/translations.xml deleted file mode 100755 index e8ce9fcb85..0000000000 --- a/desktop/kde6/applications/kcron-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kcron-kf6 - Görev zamanlayıcı arayüzü. - kcron-kf6, cron görev zamanlayıcı altyapısının bir arayüzüdür. - - diff --git a/desktop/kde6/applications/kde-dev-scripts-kf6/actions.py b/desktop/kde6/applications/kde-dev-scripts-kf6/actions.py deleted file mode 100755 index 61e75111c9..0000000000 --- a/desktop/kde6/applications/kde-dev-scripts-kf6/actions.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*", "README") diff --git a/desktop/kde6/applications/kde-dev-scripts-kf6/pspec.xml b/desktop/kde6/applications/kde-dev-scripts-kf6/pspec.xml deleted file mode 100755 index 435602c75f..0000000000 --- a/desktop/kde6/applications/kde-dev-scripts-kf6/pspec.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - - kde-dev-scripts-kf6 - https://projects.kde.org/projects/kde/kdesdk/kde-dev-scripts-kf6 - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - app - desktop.kde.sdk - Scripts and setting files useful during development of KDE software - Scripts and setting files useful during development of KDE software - mirrors://kde/stable/release-service/24.12.1/src/kde-dev-scripts-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - docbook-xml - - - - - - kde-dev-scripts-kf6 - - qt6-base - kdoctools-kf6 - - - Scripts and setting files useful during development of KDE software - - /usr/bin - /usr/share - /usr/share/man - /usr/share/doc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kde-dev-scripts-kf6/translations.xml b/desktop/kde6/applications/kde-dev-scripts-kf6/translations.xml deleted file mode 100755 index 451b437343..0000000000 --- a/desktop/kde6/applications/kde-dev-scripts-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kdedev-scripts - Kdevelop betikleri. - Kdevelop betikleri. - - \ No newline at end of file diff --git a/desktop/kde6/applications/kdebugsettings-kf6/actions.py b/desktop/kde6/applications/kdebugsettings-kf6/actions.py deleted file mode 100755 index 82e40ee4b1..0000000000 --- a/desktop/kde6/applications/kdebugsettings-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kdebugsettings-kf6/pspec.xml b/desktop/kde6/applications/kdebugsettings-kf6/pspec.xml deleted file mode 100755 index 336bb519c1..0000000000 --- a/desktop/kde6/applications/kdebugsettings-kf6/pspec.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - kdebugsettings-kf6 - http://projects.kde.org/kdebugsettings-kf6 - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - app:gui - An application to enable/disable qCDebug - KDebug control module for KDE. It provides a graphical frontend for the kdebug daemon, which allow enabling or disabling particular debug areas/messages. - mirrors://kde/stable/release-service/24.12.1/src/kdebugsettings-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - kwidgetsaddons-kf6-devel - kitemviews-kf6-devel - kcompletion-kf6-devel - kio-kf6-devel - - - - - kdebugsettings-kf6 - An application to enable/disable qCDebug - - ki18n-kf6 - libgcc - kconfig-kf6 - qt6-base - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /etc - /usr/lib - /usr/share - /usr/share/applications - /usr/share/doc - /usr/share/locale - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdeconnect-kf6/actions.py b/desktop/kde6/applications/kdeconnect-kf6/actions.py deleted file mode 100644 index 7773462d88..0000000000 --- a/desktop/kde6/applications/kdeconnect-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - #pisitools.dosed("CMakeLists.txt", "5.64.0", "5.62.0") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/applications/kdeconnect-kf6/pspec.xml b/desktop/kde6/applications/kdeconnect-kf6/pspec.xml deleted file mode 100644 index 4c7dfb80d8..0000000000 --- a/desktop/kde6/applications/kdeconnect-kf6/pspec.xml +++ /dev/null @@ -1,205 +0,0 @@ - - - - - kdeconnect-kf6 - https://kdeconnect-kf6.kde.org/ - - Yusuf Aydemir - yusuf.aydemir@pisilinux.org - - GPLv2 - GPLv3 - desktop.kde6.applications - kdeconnect-kf6 - app:gui - Connect KDE with your smartphone - Connect KDE with your smartphone - https://download.kde.org/stable/release-service/24.12.1/src/kdeconnect-kde-24.12.1.tar.xz - - sshfs - dbus-devel - eudev-devel - kio-kf6-devel - ki18n-kf6-devel - solid-kf6-devel - kpeople-kf6-devel - kde-cli-tools-kf6 - libXtst-devel - kirigami-kf6-devel - qt6-base-devel - qt6-connectivity-devel - kcmutils-kf6-devel - kwayland-kf6-devel - qca2-qt6-devel - kdoctools-kf6-devel - libfakekey-devel - kdbusaddons-kf6-devel - kiconthemes-kf6-devel - kwindowsystem-kf6-devel - pulseaudio-qt6-devel - kirigami-addons-kf6 - extra-cmake-modules-kf6 - kconfigwidgets-kf6-devel - qt6-multimedia-devel - knotifications-kf6-devel - qt6-declarative-devel - qt6-5compat-devel - wayland-devel - wayland-server - wayland-client - wayland-cursor - qt6-wayland-devel - qqc2-desktop-style-kf6 - kpackage-kf6-devel - kguiaddons-kf6-devel - kstatusnotifieritem-kf6-devel - wayland-protocols-devel - plasma-wayland-protocols-kf6 - modemmanager-qt-kf6-devel - ModemManager-devel - - - - - kdeconnect-kf6 - - kio-kf6 - ki18n-kf6 - sshfs - solid-kf6 - libgcc - libX11 - libXtst - qt6-5compat - kconfig-kf6 - kpeople-kf6 - kcmutils-kf6 - kservice-kf6 - qca2-qt6 - qt6-base - kwayland-kf6 - kguiaddons-kf6 - libfakekey - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kwindowsystem-kf6 - pulseaudio-qt6 - kstatusnotifieritem-kf6 - qt6-multimedia - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - modemmanager-qt-kf6 - qt6-declarative - qt6-connectivity - qqc2-desktop-style-kf6 - - - /usr/bin - /etc - /usr/lib - /usr/include - /usr/share - /usr/share/locale - /usr/share/man - /usr/share/info - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-18 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdeconnect-kf6/translations.xml b/desktop/kde6/applications/kdeconnect-kf6/translations.xml deleted file mode 100644 index c863c2e7fd..0000000000 --- a/desktop/kde6/applications/kdeconnect-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kdeconnect-kf6 - Cihazlarınızı KDE ile birleştirin - Cihazlarınızı KDE ile birleştirin - - diff --git a/desktop/kde6/applications/kdeedu-data-kf6/actions.py b/desktop/kde6/applications/kdeedu-data-kf6/actions.py deleted file mode 100755 index d6c718fbd9..0000000000 --- a/desktop/kde6/applications/kdeedu-data-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING") diff --git a/desktop/kde6/applications/kdeedu-data-kf6/pspec.xml b/desktop/kde6/applications/kdeedu-data-kf6/pspec.xml deleted file mode 100755 index 01d09cf0d3..0000000000 --- a/desktop/kde6/applications/kdeedu-data-kf6/pspec.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - kdeedu-data-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:library - Common data for KDE Edu applications - Common data for KDE Edu applications. - mirrors://kde/stable/release-service/24.12.1/src/kdeedu-data-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - - - - - kdeedu-data-kf6 - - /usr/share - /usr/share/doc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdegraphics-mobipocket-kf6/actions.py b/desktop/kde6/applications/kdegraphics-mobipocket-kf6/actions.py deleted file mode 100644 index 5a49cd0a1a..0000000000 --- a/desktop/kde6/applications/kdegraphics-mobipocket-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING") diff --git a/desktop/kde6/applications/kdegraphics-mobipocket-kf6/pspec.xml b/desktop/kde6/applications/kdegraphics-mobipocket-kf6/pspec.xml deleted file mode 100644 index 8e1d2a8212..0000000000 --- a/desktop/kde6/applications/kdegraphics-mobipocket-kf6/pspec.xml +++ /dev/null @@ -1,139 +0,0 @@ - - - - - kdegraphics-mobipocket-kf6 - https://www.kde.org/applications/graphics/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - GPL - LGPL - kdegraphics-mobipocket-kf6 - A collection of plugins to handle mobipocket files - A collection of plugins to handle mobipocket files - http://download.kde.org/stable/release-service/24.12.1/src/kdegraphics-mobipocket-24.12.1.tar.xz - - extra-cmake-modules-kf6 - kio-kf6-devel - qt6-base-devel - qt6-5compat-devel - - - - - kdegraphics-mobipocket-kf6 - A collection of plugins to handle mobipocket files - - kio-kf6 - qt6-base - - - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - - kdegraphics-mobipocket-kf6-devel - Development headers for kdegraphics-mobipocket-kf6 - - kdegraphics-mobipocket-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdegraphics-mobipocket-kf6/translations.xml b/desktop/kde6/applications/kdegraphics-mobipocket-kf6/translations.xml deleted file mode 100644 index f2afebd269..0000000000 --- a/desktop/kde6/applications/kdegraphics-mobipocket-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kdegraphics-mobipocket-kf6 - A library to handle mobipocket files - A library to handle mobipocket files - - diff --git a/desktop/kde6/applications/kdegraphics-svgpart-kf6/actions.py b/desktop/kde6/applications/kdegraphics-svgpart-kf6/actions.py deleted file mode 100755 index 5a0b867eec..0000000000 --- a/desktop/kde6/applications/kdegraphics-svgpart-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kdegraphics-svgpart-kf6/pspec.xml b/desktop/kde6/applications/kdegraphics-svgpart-kf6/pspec.xml deleted file mode 100755 index 46f1241a8f..0000000000 --- a/desktop/kde6/applications/kdegraphics-svgpart-kf6/pspec.xml +++ /dev/null @@ -1,135 +0,0 @@ - - - - - kdegraphics-svgpart-kf6 - https://www.kde.org/applications/graphics/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - GPL - LGPL - kdegraphics-svgpart-kf6 - A KPart for viewing SVGs - A KPart for viewing SVGs - mirrors://kde/stable/release-service/24.12.1/src/svgpart-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - kcoreaddons-kf6-devel - kparts-kf6-devel - python-devel - qt6-base-devel - qt6-svg-devel - - - - - kdegraphics-svgpart-kf6 - A KPart for viewing SVGs - - kcoreaddons-kf6 - kparts-kf6 - qt6-base - qt6-svg - ki18n-kf6 - libgcc - kxmlgui-kf6 - kconfigwidgets-kf6 - - - /usr/share - /usr/lib/qt6 - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdegraphics-thumbnailers-kf6/actions.py b/desktop/kde6/applications/kdegraphics-thumbnailers-kf6/actions.py deleted file mode 100755 index a19e1bbe75..0000000000 --- a/desktop/kde6/applications/kdegraphics-thumbnailers-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*") diff --git a/desktop/kde6/applications/kdegraphics-thumbnailers-kf6/pspec.xml b/desktop/kde6/applications/kdegraphics-thumbnailers-kf6/pspec.xml deleted file mode 100755 index c5107859a8..0000000000 --- a/desktop/kde6/applications/kdegraphics-thumbnailers-kf6/pspec.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - - - kdegraphics-thumbnailers-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.graphics - KDE thumbnailer library - kdegraphics-thumbnailers-kf6 contains thumbnail-related libraries. - mirrors://kde/stable/release-service/24.12.1/src/kdegraphics-thumbnailers-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kio-kf6-devel - libkdcraw-kf6-devel - libkexiv2-kf6-devel - kdegraphics-mobipocket-kf6-devel - karchive-kf6-devel - - - - - kdegraphics-thumbnailers-kf6 - - kio-kf6 - libgcc - qt6-base - libkdcraw-kf6 - libkexiv2-kf6 - kdegraphics-mobipocket-kf6 - karchive-kf6 - - - /usr/lib - /usr/share/doc - /usr/share - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdegraphics-thumbnailers-kf6/translations.xml b/desktop/kde6/applications/kdegraphics-thumbnailers-kf6/translations.xml deleted file mode 100755 index 6a53f6dc7a..0000000000 --- a/desktop/kde6/applications/kdegraphics-thumbnailers-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kdegraphics-thumbnailers-kf6 - KDE önizleme kitaplıkları - kdegraphics-thumbnailers-kf6, önizleme kitaplıklarını içerir. - - diff --git a/desktop/kde6/applications/kdenetwork-filesharing-kf6/actions.py b/desktop/kde6/applications/kdenetwork-filesharing-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/kdenetwork-filesharing-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kdenetwork-filesharing-kf6/pspec.xml b/desktop/kde6/applications/kdenetwork-filesharing-kf6/pspec.xml deleted file mode 100755 index deca681ba1..0000000000 --- a/desktop/kde6/applications/kdenetwork-filesharing-kf6/pspec.xml +++ /dev/null @@ -1,147 +0,0 @@ - - - - - kdenetwork-filesharing-kf6 - http://www.kde.org/ - - Mathias Freire - mathiasfreire45@gmail.com - - GPLv2 - library - kdenetwork-filesharing-kf6 - Filesharing configuration modlue. - Filesharing configuration modlue. - mirrors://kde/stable/release-service/24.12.1/src/kdenetwork-filesharing-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kservice-kf6-devel - kdeclarative-kf6-devel - kwidgetsaddons-kf6-devel - samba-devel - qcoro-qt6-devel - - - - - kdenetwork-filesharing-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - qcoro-qt6-devel - qt6-base - qt6-declarative - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - kwidgetsaddons-kf6 - - - kdenetwork - - - kdenetwork - - - /usr/share - /usr/lib - /usr/share/doc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdenetwork-filesharing-kf6/translations.xml b/desktop/kde6/applications/kdenetwork-filesharing-kf6/translations.xml deleted file mode 100755 index f3aa1d19fd..0000000000 --- a/desktop/kde6/applications/kdenetwork-filesharing-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kdenetwork-filesharing-kf6 - Dosya paylaşım konfigürasyon modülü. - Dosya paylaşım konfigürasyon modülü. - - diff --git a/desktop/kde6/applications/kdenlive-kf6/actions.py b/desktop/kde6/applications/kdenlive-kf6/actions.py deleted file mode 100755 index d6c718fbd9..0000000000 --- a/desktop/kde6/applications/kdenlive-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING") diff --git a/desktop/kde6/applications/kdenlive-kf6/files/kdenlive-mlt6.patch b/desktop/kde6/applications/kdenlive-kf6/files/kdenlive-mlt6.patch deleted file mode 100644 index 0d415065e6..0000000000 --- a/desktop/kde6/applications/kdenlive-kf6/files/kdenlive-mlt6.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff --git a/src/mltconnection.cpp b/src/mltconnection.cpp -index 13d0e8d8c..2820c8f7c 100644 ---- a/src/mltconnection.cpp -+++ b/src/mltconnection.cpp -@@ -136,14 +136,14 @@ void MltConnection::locateMeltAndProfilesPath(const QString &mltPath) - #endif - QString meltPath; - if (qEnvironmentVariableIsSet("MLT_PREFIX")) { -- meltPath = qgetenv("MLT_PREFIX") + QStringLiteral("/bin/melt") + exeSuffix; -+ meltPath = qgetenv("MLT_PREFIX") + QStringLiteral("/bin/melt6") + exeSuffix; - } else { - meltPath = kdenlive-kf6Settings::rendererpath(); - } - if (!QFile::exists(meltPath)) { -- meltPath = QDir::cleanPath(profilePath + QStringLiteral("/../../../bin/melt")) + exeSuffix; -+ meltPath = QDir::cleanPath(profilePath + QStringLiteral("/../../../bin/melt6")) + exeSuffix; - if (!QFile::exists(meltPath)) { -- meltPath = QStandardPaths::findExecutable("melt"); -+ meltPath = QStandardPaths::findExecutable("melt6"); - if (meltPath.isEmpty()) { - meltPath = QStandardPaths::findExecutable("mlt-melt"); - } diff --git a/desktop/kde6/applications/kdenlive-kf6/pspec.xml b/desktop/kde6/applications/kdenlive-kf6/pspec.xml deleted file mode 100755 index 86c20e71f5..0000000000 --- a/desktop/kde6/applications/kdenlive-kf6/pspec.xml +++ /dev/null @@ -1,210 +0,0 @@ - - - - - kdenlive-kf6 - https://kdenlive-kf6.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - kdenlive-kf6 - desktop.kde.multimedia - A video editing GUI for KDE using the MLT video framework - kdenlive-kf6 provides dual video monitors, a multi-track timeline and clip list. Other features include customizable layout support, basic effects and transitions. - mirrors://kde/stable/release-service/24.12.1/src/kdenlive-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - ladspa-sdk-devel - qt6-svg-devel - karchive-kf6-devel - kbookmarks-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kdbusaddons-kf6-devel - kfilemetadata-kf6-devel - libv4l-devel - kio-kf6-devel - ffmpeg-devel - sdl-image-devel - kwidgetsaddons-kf6-devel - kplotting-kf6-devel - knotifyconfig-kf6-devel - knewstuff-kf6-devel - kxmlgui-kf6-devel - knotifications-kf6-devel - kguiaddons-kf6-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - kdoctools-kf6-devel - mlt-devel - purpose-kf6-devel - frei0r-plugins-devel - qt6-designer-devel - qt6-declarative-devel - qt6-multimedia-devel - qt6-webengine-devel - qt6-networkauth-devel - kdeclarative-kf6-devel - kcrash-kf6-devel - libmediainfo-devel - - - - - - - - kdenlive-kf6 - - kio-kf6 - mlt - cdrkit - ki18n-kf6 - solid-kf6 - kcrash-kf6 - libgcc - ffmpeg - kconfig-kf6 - kxmlgui-kf6 - kdeclarative-kf6 - qt6-svg - karchive-kf6 - kservice-kf6 - qt6-base - knewstuff-kf6 - kplotting-kf6 - sdl-image - dvdauthor - kbookmarks-kf6 - kguiaddons-kf6 - kitemviews-kf6 - ladspa-sdk - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 - kfilemetadata-kf6 - knotifyconfig-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - frei0r-plugins - purpose-kf6 - mediainfo - qt6-designer - qt6-declarative - qt6-multimedia - qt6-webengine - qt6-networkauth - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - /usr/share/man - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-17 - 24.08.2 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdenlive-kf6/translations.xml b/desktop/kde6/applications/kdenlive-kf6/translations.xml deleted file mode 100755 index f0a97ae269..0000000000 --- a/desktop/kde6/applications/kdenlive-kf6/translations.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - kdenlive-kf6 - MLT video yapısı kullanan, KDE için bir video düzenleme uygulaması - Nieliniowy edytor wideo - kdenlive-kf6, ikili video izleyicileri, çoklu parça zaman çizelgesi ve klip listesi sunmaktadır. Diğer özellikler arasında özelleştirilebilir düzenleme desteği, temel efektler ve geçişler sayılabilir. - kdenlive-kf6 est multi-piste, gère une liste de clips et gère les doubles moniteurs vidéos. Il fournit également entre autres un support de couches personnalisables ainsi que des effets et des transitions de base. - kdenlive-kf6 jest nieliniowym pakietem do edycji wideo obsługującym DV, HDC i wiele innych formatów. - - diff --git a/desktop/kde6/applications/kdepim-addons-kf6/actions.py b/desktop/kde6/applications/kdepim-addons-kf6/actions.py deleted file mode 100755 index 5a0b867eec..0000000000 --- a/desktop/kde6/applications/kdepim-addons-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kdepim-addons-kf6/pspec.xml b/desktop/kde6/applications/kdepim-addons-kf6/pspec.xml deleted file mode 100755 index 934fcd9c0b..0000000000 --- a/desktop/kde6/applications/kdepim-addons-kf6/pspec.xml +++ /dev/null @@ -1,259 +0,0 @@ - - - - - kdepim-addons-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - FDL - GPL - LGPL - Addons for the KDE PIM apllications - Addons for the KDE PIM apllications - mirrors://kde/stable/release-service/24.12.1/src/kdepim-addons-24.12.1.tar.xz - - akonadi-calendar-kf6-devel - akonadi-kf6-devel - kldap-kf6-devel - - akonadi-import-wizard-kf6-devel - boost-devel - calendarsupport-kf6-devel - cyrus-sasl-devel - eventviews-kf6-devel - extra-cmake-modules-kf6 - glibc-devel - grantleetheme-kf6-devel - incidenceeditor-kf6-devel - kholidays-kf6-devel - kcalutils-kf6-devel - kconfig-kf6-devel - kpkpass-kf6-devel - kitinerary-kf6-devel - kdeclarative-kf6-devel - - kdoctools-kf6-devel - ki18n-kf6-devel - ktnef-kf6-devel - kxmlgui-kf6-devel - libgravatar-kf6-devel - libical-devel - libkdepim-kf6-devel - libkgapi-kf6-devel - libkleo-kf6-devel - mailcommon-kf6-devel - mailimporter-kf6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - python-devel - qt6-base-devel - qt6-declarative-devel - qt6-webengine-devel - kio-kf6-devel - kmime-kf6-devel - kcodecs-kf6-devel - kcalendarcore-kf6-devel - kservice-kf6-devel - kcontacts-kf6-devel - kitemviews-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - akonadi-mime-kf6-devel - kpimtextedit-kf6-devel - ktextwidgets-kf6-devel - kconfigwidgets-kf6-devel - kmailtransport-kf6-devel - kwidgetsaddons-kf6-devel - akonadi-contacts-kf6-devel - - kidentitymanagement-kf6-devel - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - kimap-kf6-devel - gpgme-devel - gpgme-qt6-devel - kdiagram-kf6-devel - - libksieve-kf6-devel - prison-kf6-devel - syntax-highlighting-kf6-devel - kparts-kf6-devel - kaddressbook-kf6-devel - kontactinterface-kf6-devel - kguiaddons-kf6-devel - - - - - kdepim-addons-kf6 - Addons for the KDE PIM apllications - - akonadi-kf6 - akonadi-calendar-kf6 - - prison-kf6 - calendarsupport-kf6 - eventviews-kf6 - grantleetheme-kf6 - incidenceeditor-kf6 - kcalutils-kf6 - kholidays-kf6 - kconfig-kf6 - kpkpass-kf6 - kdeclarative-kf6 - gpgme-qt6 - kitinerary-kf6 - ki18n-kf6 - ktnef-kf6 - kxmlgui-kf6 - libgcc - libgravatar-kf6 - libkdepim-kf6 - libkleo-kf6 - mailcommon-kf6 - messagelib-kf6 - pimcommon-kf6 - qt6-base - qt6-declarative - qt6-webengine - kio-kf6 - kmime-kf6 - kcodecs-kf6 - kcalendarcore-kf6 - kservice-kf6 - kcontacts-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - akonadi-mime-kf6 - kpimtextedit-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - kwidgetsaddons-kf6 - akonadi-contacts-kf6 - kidentitymanagement-kf6 - gpgme - kjobwidgets-kf6 - - kimap-kf6 - libksieve-kf6 - kitemmodels-kf6 - mailimporter-kf6 - syntax-highlighting-kf6 - akonadi-import-wizard-kf6 - kontactinterface-kf6 - kaddressbook-kf6 - kguiaddons-kf6 - kldap-kf6 - - - kde-baseapps - - - kde-baseapps - - - /etc/xdg - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdepim-runtime-kf6/actions.py b/desktop/kde6/applications/kdepim-runtime-kf6/actions.py deleted file mode 100755 index 23b2227864..0000000000 --- a/desktop/kde6/applications/kdepim-runtime-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kdepim-runtime-kf6/files/2fd3604a.patch b/desktop/kde6/applications/kdepim-runtime-kf6/files/2fd3604a.patch deleted file mode 100644 index 4bc3bfba37..0000000000 --- a/desktop/kde6/applications/kdepim-runtime-kf6/files/2fd3604a.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 2fd3604ad6a9594b9dd8b0f1529f4f4589fe831f Mon Sep 17 00:00:00 2001 -From: Carl Schwan -Date: Tue, 19 Sep 2023 17:04:36 +0200 -Subject: [PATCH] Revert "Revert "Fix race condition when building"" - -This reverts commit d3f20b3dab530065f9cff9d73e4ca1076af55a29. - -(cherry picked from commit f9f262b9289f7b1c34e55205fa0c5cde915bc652) ---- - resources/google-groupware/CMakeLists.txt | 7 ++++--- - resources/google-groupware/googleresource.cpp | 1 - - 2 files changed, 4 insertions(+), 4 deletions(-) - -diff --git a/resources/google-groupware/CMakeLists.txt b/resources/google-groupware/CMakeLists.txt -index 2f2b46aded..0ac6f2db8e 100644 ---- a/resources/google-groupware/CMakeLists.txt -+++ b/resources/google-groupware/CMakeLists.txt -@@ -67,9 +67,6 @@ set(googleresource_SRCS - ${googleresource_common_SRCS} - ) - --ki18n-kf6_wrap_ui(googleresource_SRCS googlesettingswidget.ui) -- -- - add_executable(akonadi_google_resource ${googleresource_SRCS}) - if (COMPILE_WITH_UNITY_CMAKE_SUPPORT) - set_target_properties(akonadi_google_resource PROPERTIES UNITY_BUILD ON) -@@ -126,6 +123,7 @@ install( - kcoreaddons-kf6_add_plugin(googleconfig - INSTALL_NAMESPACE "pim${QT_MAJOR_VERSION}/akonadi/config" - ) -+ - target_sources(googleconfig - PRIVATE - googleconfig.cpp -@@ -133,6 +131,9 @@ PRIVATE - googlesettingswidget.h - ${googleresource_common_SRCS} - ) -+ -+ki18n-kf6_wrap_ui(googleconfig googlesettingswidget.ui) -+ - target_link_libraries(googleconfig - KPim${KF_MAJOR_VERSION}::AkonadiCore - KPim${KF_MAJOR_VERSION}::AkonadiCalendar -diff --git a/resources/google-groupware/googleresource.cpp b/resources/google-groupware/googleresource.cpp -index 47a7e0c8d5..d51c1e4a7c 100644 ---- a/resources/google-groupware/googleresource.cpp -+++ b/resources/google-groupware/googleresource.cpp -@@ -11,7 +11,6 @@ - #include "googleresourcestate.h" - #include "googlescopes.h" - #include "googlesettings.h" --#include "googlesettingswidget.h" - #include "settingsadaptor.h" - - #include "personhandler.h" --- -GitLab - diff --git a/desktop/kde6/applications/kdepim-runtime-kf6/files/c99afc75.patch b/desktop/kde6/applications/kdepim-runtime-kf6/files/c99afc75.patch deleted file mode 100644 index 6ebb69222c..0000000000 --- a/desktop/kde6/applications/kdepim-runtime-kf6/files/c99afc75.patch +++ /dev/null @@ -1,120 +0,0 @@ -From c99afc75a503fff6ca83df2f47a5d5d951579524 Mon Sep 17 00:00:00 2001 -From: Carl Schwan -Date: Tue, 19 Sep 2023 18:58:54 +0200 -Subject: [PATCH] Actually start job to read secret key - -BUG: 470820 -(cherry picked from commit 8393e92d56ecb31b2dd65d15d046f8e02565f5e3) ---- - resources/google-groupware/googleconfig.cpp | 8 +++++++- - resources/google-groupware/googlesettings.cpp | 15 +++++++++------ - .../google-groupware/googlesettingswidget.cpp | 3 +-- - 3 files changed, 17 insertions(+), 9 deletions(-) - -diff --git a/resources/google-groupware/googleconfig.cpp b/resources/google-groupware/googleconfig.cpp -index 2eb6ab2efa..1af177c81f 100644 ---- a/resources/google-groupware/googleconfig.cpp -+++ b/resources/google-groupware/googleconfig.cpp -@@ -6,6 +6,7 @@ - - #include - -+#include "googleresource_debug.h" - #include "googlesettings.h" - #include "googlesettingswidget.h" - -@@ -25,7 +26,12 @@ public: - void load() override - { - Akonadi::AgentConfigurationBase::load(); -- mWidget.loadSettings(); -+ mSettings.init(); -+ connect(&mSettings, &GoogleSettings::accountReady, this, [this](bool ready) { -+ if (ready) { -+ mWidget.loadSettings(); -+ } -+ }); - } - - Q_REQUIRED_RESULT bool save() const override -diff --git a/resources/google-groupware/googlesettings.cpp b/resources/google-groupware/googlesettings.cpp -index aa94cad1ab..23a9979895 100644 ---- a/resources/google-groupware/googlesettings.cpp -+++ b/resources/google-groupware/googlesettings.cpp -@@ -32,7 +32,6 @@ static const QString googleWalletFolder = QStringLiteral("Akonadi Google"); - GoogleSettings::GoogleSettings(const KSharedConfigPtr &config, Options options) - : SettingsBase(config) - { -- qDebug() << config; - if (options & Option::ExportToDBus) { - new SettingsAdaptor(this); - QDBusConnection::sessionBus().registerObject(QStringLiteral("/Settings"), -@@ -44,9 +43,11 @@ GoogleSettings::GoogleSettings(const KSharedConfigPtr &config, Options options) - void GoogleSettings::init() - { - // First read from QtKeyChain -- auto job = new QKeychain::ReadPasswordJob(googleWalletFolder); -+ auto job = new QKeychain::ReadPasswordJob(googleWalletFolder, this); -+ job->setKey(account()); - connect(job, &QKeychain::Job::finished, this, [this, job]() { - if (job->error() != QKeychain::Error::NoError) { -+ qCWarning(GOOGLE_LOG) << "Unable to read password" << job->error(); - Q_EMIT accountReady(false); - return; - } -@@ -54,18 +55,19 @@ void GoogleSettings::init() - // Found something with QtKeyChain - if (!account().isEmpty()) { - m_account = fetchAccountFromKeychain(account(), job); -+ m_isReady = true; -+ Q_EMIT accountReady(true); - } -- m_isReady = true; -- Q_EMIT accountReady(true); - }); -+ job->start(); - } - - KGAPI2::AccountPtr GoogleSettings::fetchAccountFromKeychain(const QString &accountName, QKeychain::ReadPasswordJob *job) - { - QMap map; - auto value = job->binaryData(); -- if (!value.isEmpty()) { -- qCDebug(GOOGLE_LOG) << "Account" << accountName << "not found in kwallet-kf6"; -+ if (value.isEmpty()) { -+ qCWarning(GOOGLE_LOG) << "Account" << accountName << "not found in kwallet-kf6"; - return {}; - } - -@@ -116,6 +118,7 @@ WritePasswordJob *GoogleSettings::storeAccount(AccountPtr account) - - connect(writeJob, &WritePasswordJob::finished, this, [this, writeJob]() { - if (writeJob->error()) { -+ qCWarning(GOOGLE_LOG) << "Unable to write password" << writeJob->error(); - return; - } - SettingsBase::setAccount(m_account->accountName()); -diff --git a/resources/google-groupware/googlesettingswidget.cpp b/resources/google-groupware/googlesettingswidget.cpp -index 2543c4c6b8..8e84cfbabd 100644 ---- a/resources/google-groupware/googlesettingswidget.cpp -+++ b/resources/google-groupware/googlesettingswidget.cpp -@@ -36,7 +36,6 @@ GoogleSettingsWidget::GoogleSettingsWidget(GoogleSettings &settings, const QStri - , m_settings(settings) - , m_identifier(identifier) - { -- qDebug() << m_settings.account(); - auto mainLayout = new QVBoxLayout(this); - - auto mainWidget = new QWidget(this); -@@ -83,7 +82,7 @@ bool GoogleSettingsWidget::handleError(KGAPI2::Job *job) - } - - if (job->error() == KGAPI2::Unauthorized) { -- qCDebug(GOOGLE_LOG) << job << job->errorString(); -+ qWarning() << job << job->errorString(); - const QList resourceScopes = googleScopes(); - for (const QUrl &scope : resourceScopes) { - if (!m_account->scopes().contains(scope)) { --- -GitLab - diff --git a/desktop/kde6/applications/kdepim-runtime-kf6/files/fb0d78fb.patch b/desktop/kde6/applications/kdepim-runtime-kf6/files/fb0d78fb.patch deleted file mode 100644 index c2b0f54fe1..0000000000 --- a/desktop/kde6/applications/kdepim-runtime-kf6/files/fb0d78fb.patch +++ /dev/null @@ -1,1302 +0,0 @@ -From fb0d78fb3bcfce5bd4ff7f51e4cd1405693e0275 Mon Sep 17 00:00:00 2001 -From: Carl Schwan -Date: Tue, 19 Sep 2023 17:04:13 +0200 -Subject: [PATCH] Revert "Revert "Use config plugin instead of out of process - config dialog"" - -This reverts commit f33496a346f49e95caaf7f664ef2f91e4b7f3ddb. - -(cherry picked from commit a17ef55dbe31e2020e96f66cd7021578ed8b5444) ---- - resources/google-groupware/CMakeLists.txt | 93 ++++-- - resources/google-groupware/googleconfig.cpp | 43 +++ - resources/google-groupware/googleconfig.json | 5 + - resources/google-groupware/googleresource.cpp | 95 ++---- - resources/google-groupware/googleresource.h | 4 +- - resources/google-groupware/googlescopes.cpp | 19 ++ - resources/google-groupware/googlescopes.h | 10 + - resources/google-groupware/googlesettings.cpp | 22 +- - resources/google-groupware/googlesettings.h | 11 +- - .../google-groupware/googlesettingsdialog.cpp | 305 ------------------ - .../google-groupware/googlesettingswidget.cpp | 288 +++++++++++++++++ - ...ettingsdialog.h => googlesettingswidget.h} | 29 +- - ...tingsdialog.ui => googlesettingswidget.ui} | 2 +- - resources/google-groupware/settingsbase.kcfg | 2 +- - 14 files changed, 505 insertions(+), 423 deletions(-) - create mode 100644 resources/google-groupware/googleconfig.cpp - create mode 100644 resources/google-groupware/googleconfig.json - create mode 100644 resources/google-groupware/googlescopes.cpp - create mode 100644 resources/google-groupware/googlescopes.h - delete mode 100644 resources/google-groupware/googlesettingsdialog.cpp - create mode 100644 resources/google-groupware/googlesettingswidget.cpp - rename resources/google-groupware/{googlesettingsdialog.h => googlesettingswidget.h} (53%) - rename resources/google-groupware/{googlesettingsdialog.ui => googlesettingswidget.ui} (99%) - -diff --git a/resources/google-groupware/CMakeLists.txt b/resources/google-groupware/CMakeLists.txt -index babf58a953..2f2b46aded 100644 ---- a/resources/google-groupware/CMakeLists.txt -+++ b/resources/google-groupware/CMakeLists.txt -@@ -1,67 +1,75 @@ - add_definitions(-DTRANSLATION_DOMAIN=\"akonadi_google_resource\") - --set(googleresource_SRCS -- googleresource.cpp -+set(googleresource_common_SRCS - googlesettings.cpp -- googlesettingsdialog.cpp -- defaultreminderattribute.cpp -- googleresourcestate.cpp -- generichandler.cpp -- calendarhandler.cpp -- taskhandler.cpp -- peopleconversionjob.cpp -- personhandler.cpp -- googleresource.h - googlesettings.h -- googlesettingsdialog.h -- defaultreminderattribute.h -- googleresourcestate.h -- generichandler.h -- calendarhandler.h -- taskhandler.h -- peopleconversionjob.h -- personhandler.h -- ) -+ googlescopes.h -+ googlescopes.cpp -+) - --ecm_qt_declare_logging_category(googleresource_SRCS -+ecm_qt_declare_logging_category(googleresource_common_SRCS - HEADER googleresource_debug.h - IDENTIFIER GOOGLE_LOG - CATEGORY_NAME org.kde.pim.google - DESCRIPTION "resource google (kdepim-runtime-kf6)" - EXPORT KDEPIMRUNTIME) --ecm_qt_declare_logging_category(googleresource_SRCS -+ecm_qt_declare_logging_category(googleresource_common_SRCS - HEADER googlecalendar_debug.h - IDENTIFIER GOOGLE_CALENDAR_LOG - CATEGORY_NAME org.kde.pim.google.calendar - DESCRIPTION "resource google calendar (kdepim-runtime-kf6)" - EXPORT KDEPIMRUNTIME) --ecm_qt_declare_logging_category(googleresource_SRCS -+ecm_qt_declare_logging_category(googleresource_common_SRCS - HEADER googletasks_debug.h - IDENTIFIER GOOGLE_TASKS_LOG - CATEGORY_NAME org.kde.pim.google.tasks - DESCRIPTION "resource google tasks (kdepim-runtime-kf6)" - EXPORT KDEPIMRUNTIME) --ecm_qt_declare_logging_category(googleresource_SRCS -+ecm_qt_declare_logging_category(googleresource_common_SRCS - HEADER googlepeople_debug.h - IDENTIFIER GOOGLE_PEOPLE_LOG - CATEGORY_NAME org.kde.pim.google.people - DESCRIPTION "resource google people (kdepim-runtime-kf6)" - EXPORT KDEPIMRUNTIME) - --ki18n-kf6_wrap_ui(googleresource_SRCS googlesettingsdialog.ui) - --kconfig-kf6_add_kcfg_files(googleresource_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/settingsbase.kcfgc) -+kconfig-kf6_add_kcfg_files(googleresource_common_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/settingsbase.kcfgc) - - kcfg_generate_dbus_interface( - ${CMAKE_CURRENT_SOURCE_DIR}/settingsbase.kcfg - org.kde.Akonadi.Google.Settings - ) - --qt_add_dbus_adaptor(googleresource_SRCS -+qt_add_dbus_adaptor(googleresource_common_SRCS - ${CMAKE_CURRENT_BINARY_DIR}/org.kde.Akonadi.Google.Settings.xml - ${CMAKE_CURRENT_SOURCE_DIR}/googlesettings.h GoogleSettings - ) - -+############################# Resource ################################# -+set(googleresource_SRCS -+ googleresource.cpp -+ defaultreminderattribute.cpp -+ googleresourcestate.cpp -+ generichandler.cpp -+ calendarhandler.cpp -+ taskhandler.cpp -+ peopleconversionjob.cpp -+ personhandler.cpp -+ googleresource.h -+ googlesettings.h -+ defaultreminderattribute.h -+ googleresourcestate.h -+ generichandler.h -+ calendarhandler.h -+ taskhandler.h -+ peopleconversionjob.h -+ personhandler.h -+ ${googleresource_common_SRCS} -+) -+ -+ki18n-kf6_wrap_ui(googleresource_SRCS googlesettingswidget.ui) -+ -+ - add_executable(akonadi_google_resource ${googleresource_SRCS}) - if (COMPILE_WITH_UNITY_CMAKE_SUPPORT) - set_target_properties(akonadi_google_resource PROPERTIES UNITY_BUILD ON) -@@ -112,3 +120,34 @@ install( - FILES akonadi_google_resource.notifyrc - DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR} - ) -+ -+################################ Config plugin ############################### -+ -+kcoreaddons-kf6_add_plugin(googleconfig -+ INSTALL_NAMESPACE "pim${QT_MAJOR_VERSION}/akonadi/config" -+) -+target_sources(googleconfig -+PRIVATE -+ googleconfig.cpp -+ googlesettingswidget.cpp -+ googlesettingswidget.h -+ ${googleresource_common_SRCS} -+) -+target_link_libraries(googleconfig -+ KPim${KF_MAJOR_VERSION}::AkonadiCore -+ KPim${KF_MAJOR_VERSION}::AkonadiCalendar -+ KPim${KF_MAJOR_VERSION}::AkonadiCore -+ KPim${KF_MAJOR_VERSION}::AkonadiAgentBase -+ KF${KF_MAJOR_VERSION}::CalendarCore -+ KF${KF_MAJOR_VERSION}::Contacts -+ KF${KF_MAJOR_VERSION}::Wallet -+ KF${KF_MAJOR_VERSION}::I18n -+ KF${KF_MAJOR_VERSION}::WindowSystem -+ KF${KF_MAJOR_VERSION}::TextWidgets -+ KF${KF_MAJOR_VERSION}::Notifications -+ KPim${KF_MAJOR_VERSION}::GAPICalendar -+ KPim${KF_MAJOR_VERSION}::GAPIPeople -+ KPim${KF_MAJOR_VERSION}::GAPICore -+ KPim${KF_MAJOR_VERSION}::GAPITasks -+ qt${KF_MAJOR_VERSION}keychain -+) -diff --git a/resources/google-groupware/googleconfig.cpp b/resources/google-groupware/googleconfig.cpp -new file mode 100644 -index 0000000000..2eb6ab2efa ---- /dev/null -+++ b/resources/google-groupware/googleconfig.cpp -@@ -0,0 +1,43 @@ -+/* -+ SPDX-FileCopyrightText: 2018 Daniel Vrátil -+ -+ SPDX-License-Identifier: LGPL-2.0-or-later -+*/ -+ -+#include -+ -+#include "googlesettings.h" -+#include "googlesettingswidget.h" -+ -+class GoogleConfig : public Akonadi::AgentConfigurationBase -+{ -+ Q_OBJECT -+ -+public: -+ explicit GoogleConfig(const KSharedConfigPtr &config, QWidget *parent, const QVariantList &list) -+ : Akonadi::AgentConfigurationBase(config, parent, list) -+ , mSettings(config, GoogleSettings::Option::NoOption) -+ , mWidget(mSettings, identifier(), parent) -+ { -+ connect(&mWidget, &GoogleSettingsWidget::okEnabled, this, &Akonadi::AgentConfigurationBase::enableOkButton); -+ } -+ -+ void load() override -+ { -+ Akonadi::AgentConfigurationBase::load(); -+ mWidget.loadSettings(); -+ } -+ -+ Q_REQUIRED_RESULT bool save() const override -+ { -+ const_cast(this)->mWidget.saveSettings(); -+ return Akonadi::AgentConfigurationBase::save(); -+ } -+ -+ GoogleSettings mSettings; -+ GoogleSettingsWidget mWidget; -+}; -+ -+AKONADI_AGENTCONFIG_FACTORY(GoogleConfigFactory, "googleconfig.json", GoogleConfig) -+ -+#include "googleconfig.moc" -diff --git a/resources/google-groupware/googleconfig.json b/resources/google-groupware/googleconfig.json -new file mode 100644 -index 0000000000..69c76f583f ---- /dev/null -+++ b/resources/google-groupware/googleconfig.json -@@ -0,0 +1,5 @@ -+{ -+ "X-Akonadi-PluginType": "AgentConfig", -+ "X-Akonadi-Library": "googleconfig", -+ "X-Akonadi-AgentConfig-Type": "akonadi_google_resource" -+} -\ No newline at end of file -diff --git a/resources/google-groupware/googleresource.cpp b/resources/google-groupware/googleresource.cpp -index b40f093dde..47a7e0c8d5 100644 ---- a/resources/google-groupware/googleresource.cpp -+++ b/resources/google-groupware/googleresource.cpp -@@ -9,8 +9,9 @@ - #include "googleresource.h" - #include "googleresource_debug.h" - #include "googleresourcestate.h" -+#include "googlescopes.h" - #include "googlesettings.h" --#include "googlesettingsdialog.h" -+#include "googlesettingswidget.h" - #include "settingsadaptor.h" - - #include "personhandler.h" -@@ -67,8 +68,11 @@ bool accountIsValid(const KGAPI2::AccountPtr &account) - GoogleResource::GoogleResource(const QString &id) - : ResourceBase(id) - , AgentBase::ObserverV3() -+ , m_settings(KSharedConfig::openConfig()) - , m_iface(new GoogleResourceState(this)) - { -+ m_settings.setResourceId(identifier()); -+ - AttributeFactory::registerAttribute(); - - connect(this, &GoogleResource::reloadConfiguration, this, &GoogleResource::reloadConfig); -@@ -83,9 +87,7 @@ GoogleResource::GoogleResource(const QString &id) - - Q_EMIT status(NotConfigured, i18n("Fetching password...")); - -- m_settings = new GoogleSettings(); -- m_settings->setWindowId(winIdForDialogs()); -- connect(m_settings, &GoogleSettings::accountReady, this, [this](bool ready) { -+ connect(&m_settings, &GoogleSettings::accountReady, this, [this](bool ready) { - if (accountId() > 0) { - return; - } -@@ -94,7 +96,7 @@ GoogleResource::GoogleResource(const QString &id) - return; - } - -- const auto account = m_settings->accountPtr(); -+ const auto account = m_settings.accountPtr(); - if (account.isNull()) { - Q_EMIT status(NotConfigured); - return; -@@ -107,18 +109,15 @@ GoogleResource::GoogleResource(const QString &id) - synchronize(); - } - }); -- m_settings->init(); -+ m_settings.init(); - - updateResourceName(); - -- m_freeBusyHandler = std::make_unique(m_iface, m_settings); -+ m_freeBusyHandler = std::make_unique(m_iface, &m_settings); - m_handlers.clear(); -- m_handlers.push_back(GenericHandler::Ptr(new CalendarHandler(m_iface, m_settings))); -- m_handlers.push_back(GenericHandler::Ptr(new PersonHandler(m_iface, m_settings))); -- m_handlers.push_back(GenericHandler::Ptr(new TaskHandler(m_iface, m_settings))); -- -- new SettingsAdaptor(m_settings); -- QDBusConnection::sessionBus().registerObject(QStringLiteral("/Settings"), m_settings, QDBusConnection::ExportAdaptors); -+ m_handlers.push_back(GenericHandler::Ptr(new CalendarHandler(m_iface, &m_settings))); -+ m_handlers.push_back(GenericHandler::Ptr(new PersonHandler(m_iface, &m_settings))); -+ m_handlers.push_back(GenericHandler::Ptr(new TaskHandler(m_iface, &m_settings))); - } - - GoogleResource::~GoogleResource() -@@ -128,7 +127,7 @@ GoogleResource::~GoogleResource() - - void GoogleResource::cleanup() - { -- m_settings->cleanup(); -+ m_settings.cleanup(); - ResourceBase::cleanup(); - } - -@@ -137,65 +136,30 @@ void GoogleResource::emitReadyStatus() - Q_EMIT status(Idle, i18nc("@info:status", "Ready")); - } - --void GoogleResource::configure(WId windowId) --{ -- if (!m_settings->isReady() || m_isConfiguring) { -- Q_EMIT configurationDialogAccepted(); -- return; -- } -- -- m_isConfiguring = true; -- -- QScopedPointer settingsDialog(new GoogleSettingsDialog(this, m_settings, windowId)); -- settingsDialog->setWindowIcon(QIcon::fromTheme(QStringLiteral("im-google"))); -- if (settingsDialog->exec() == QDialog::Accepted) { -- updateResourceName(); -- -- Q_EMIT configurationDialogAccepted(); -- -- if (m_settings->accountPtr().isNull()) { -- Q_EMIT status(NotConfigured, i18n("Configured account does not exist")); -- m_isConfiguring = false; -- return; -- } -- -- emitReadyStatus(); -- synchronize(); -- } else { -- updateResourceName(); -- -- Q_EMIT configurationDialogRejected(); -- } -- -- m_isConfiguring = false; --} -- - QList GoogleResource::scopes() const - { - // TODO: determine it based on what user wants? -- const QList scopes = { -- Account::accountInfoScopeUrl(), -- Account::calendarScopeUrl(), -- Account::peopleScopeUrl(), -- Account::tasksScopeUrl(), -- }; -- return scopes; -+ return googleScopes(); - } - - void GoogleResource::updateResourceName() - { -- const QString accountName = m_settings->account(); -+ const QString accountName = m_settings.account(); - setName(i18nc("%1 is account name (user@gmail.com)", "Google Groupware (%1)", accountName.isEmpty() ? i18n("not configured") : accountName)); - } - - void GoogleResource::reloadConfig() - { -- const AccountPtr account = m_settings->accountPtr(); -+ updateResourceName(); -+ -+ const AccountPtr account = m_settings.accountPtr(); - if (account.isNull() || account->accountName().isEmpty()) { - Q_EMIT status(NotConfigured, i18n("Configured account does not exist")); -- } else { -- emitReadyStatus(); -+ return; - } -+ -+ emitReadyStatus(); -+ synchronize(); - } - - bool GoogleResource::handleError(KGAPI2::Job *job, bool _cancelTask) -@@ -231,7 +195,7 @@ bool GoogleResource::handleError(KGAPI2::Job *job, bool _cancelTask) - - void GoogleResource::runAuthJob(const KGAPI2::AccountPtr &account, const QVariant &args) - { -- auto authJob = new AuthJob(account, m_settings->clientId(), m_settings->clientSecret(), this); -+ auto authJob = new AuthJob(account, m_settings.clientId(), m_settings.clientSecret(), this); - authJob->setProperty(JOB_PROPERTY, args); - connect(authJob, &AuthJob::finished, this, &GoogleResource::slotAuthJobFinished); - } -@@ -264,7 +228,7 @@ void GoogleResource::requestAuthenticationFromUser(const KGAPI2::AccountPtr &acc - - bool GoogleResource::canPerformTask() - { -- if (!m_settings->accountPtr() && accountId() == 0) { -+ if (!m_settings.accountPtr() && accountId() == 0) { - cancelTask(i18nc("@info:status", "Resource is not configured")); - Q_EMIT status(NotConfigured, i18nc("@info:status", "Resource is not configured")); - return false; -@@ -289,10 +253,11 @@ void GoogleResource::slotAuthJobFinished(KGAPI2::Job *job) - - auto authJob = qobject_cast(job); - AccountPtr account = authJob->account(); -- auto writeJob = m_settings->storeAccount(account); -+ auto writeJob = m_settings.storeAccount(account); - connect(writeJob, &WritePasswordJob::finished, this, [job, account, writeJob]() { - if (writeJob->error()) { - qCWarning(GOOGLE_LOG) << "Failed to store account's password in secret storage" << writeJob->errorString(); -+ return; - } - - auto otherJob = job->property(JOB_PROPERTY).value(); -@@ -375,22 +340,22 @@ void GoogleResource::retrieveCollections() - - setCollectionStreamingEnabled(true); - CachePolicy cachePolicy; -- if (m_settings->enableIntervalCheck()) { -+ if (m_settings.enableIntervalCheck()) { - cachePolicy.setInheritFromParent(false); -- cachePolicy.setIntervalCheckTime(m_settings->intervalCheckTime()); -+ cachePolicy.setIntervalCheckTime(m_settings.intervalCheckTime()); - } - - // Setting up root collection - m_rootCollection = Collection(); - m_rootCollection.setContentMimeTypes({Collection::mimeType(), Collection::virtualMimeType()}); - m_rootCollection.setRemoteId(ROOT_COLLECTION_REMOTEID); -- m_rootCollection.setName(m_settings->accountPtr()->accountName()); -+ m_rootCollection.setName(m_settings.accountPtr()->accountName()); - m_rootCollection.setParentCollection(Collection::root()); - m_rootCollection.setRights(Collection::CanCreateCollection); - m_rootCollection.setCachePolicy(cachePolicy); - - auto attr = m_rootCollection.attribute(Collection::AddIfMissing); -- attr->setDisplayName(m_settings->accountPtr()->accountName()); -+ attr->setDisplayName(m_settings.accountPtr()->accountName()); - attr->setIconName(QStringLiteral("im-google")); - - collectionsRetrieved({m_rootCollection}); -diff --git a/resources/google-groupware/googleresource.h b/resources/google-groupware/googleresource.h -index 4609572756..75708afca4 100644 ---- a/resources/google-groupware/googleresource.h -+++ b/resources/google-groupware/googleresource.h -@@ -14,6 +14,7 @@ - - #include "calendarhandler.h" - #include "generichandler.h" -+#include "googlesettings.h" - - #define JOB_PROPERTY "_KGAPI2Job" - -@@ -37,7 +38,6 @@ public: - - void cleanup() override; - public Q_SLOTS: -- void configure(WId windowId) override; - void reloadConfig(); - - protected: -@@ -83,7 +83,7 @@ protected Q_SLOTS: - - private: - bool m_isConfiguring = false; -- GoogleSettings *m_settings = nullptr; -+ GoogleSettings m_settings; - Akonadi::Collection m_rootCollection; - - GoogleResourceState *const m_iface; -diff --git a/resources/google-groupware/googlescopes.cpp b/resources/google-groupware/googlescopes.cpp -new file mode 100644 -index 0000000000..9e565f7e33 ---- /dev/null -+++ b/resources/google-groupware/googlescopes.cpp -@@ -0,0 +1,19 @@ -+// SPDX-FileCopyrightText: 2011 Daniel Vrátil -+// SPDX-FileCopyrightText: 2023 Carl Schwan -+// SPDX-License-Identifier: GPL-3.0-or-later -+ -+#include "googlescopes.h" -+#include -+ -+using namespace KGAPI2; -+ -+QList googleScopes() -+{ -+ // TODO: determine it based on what user wants? -+ return { -+ Account::accountInfoScopeUrl(), -+ Account::calendarScopeUrl(), -+ Account::peopleScopeUrl(), -+ Account::tasksScopeUrl(), -+ }; -+} -diff --git a/resources/google-groupware/googlescopes.h b/resources/google-groupware/googlescopes.h -new file mode 100644 -index 0000000000..33bf579a89 ---- /dev/null -+++ b/resources/google-groupware/googlescopes.h -@@ -0,0 +1,10 @@ -+/* -+ SPDX-FileCopyrightText: 2011 Daniel Vrátil -+ SPDX-FileCopyrightText: 2023 Carl Schwan -+ SPDX-License-Identifier: GPL-3.0-or-later -+*/ -+ -+#include -+#include -+ -+QList googleScopes(); -diff --git a/resources/google-groupware/googlesettings.cpp b/resources/google-groupware/googlesettings.cpp -index 6a1785fcf9..aa94cad1ab 100644 ---- a/resources/google-groupware/googlesettings.cpp -+++ b/resources/google-groupware/googlesettings.cpp -@@ -8,6 +8,8 @@ - - #include "googlesettings.h" - #include "googleresource_debug.h" -+#include "googlescopes.h" -+#include "settingsadaptor.h" - - #include - #include -@@ -27,8 +29,16 @@ using namespace KGAPI2; - - static const QString googleWalletFolder = QStringLiteral("Akonadi Google"); - --GoogleSettings::GoogleSettings() -+GoogleSettings::GoogleSettings(const KSharedConfigPtr &config, Options options) -+ : SettingsBase(config) - { -+ qDebug() << config; -+ if (options & Option::ExportToDBus) { -+ new SettingsAdaptor(this); -+ QDBusConnection::sessionBus().registerObject(QStringLiteral("/Settings"), -+ this, -+ QDBusConnection::ExportAdaptors | QDBusConnection::ExportScriptableContents); -+ } - } - - void GoogleSettings::init() -@@ -82,15 +92,17 @@ WritePasswordJob *GoogleSettings::storeAccount(AccountPtr account) - m_account = account; - - QStringList scopes; -- const QList urlScopes = m_account->scopes(); -+ const QList urlScopes = googleScopes(); - scopes.reserve(urlScopes.count()); - for (const QUrl &url : urlScopes) { - scopes << url.toString(); - } - -- const QMap map = {{QStringLiteral("accessToken"), m_account->accessToken()}, -- {QStringLiteral("refreshToken"), m_account->refreshToken()}, -- {QStringLiteral("scopes"), scopes.join(QLatin1Char(','))}}; -+ const QMap map = { -+ {QStringLiteral("accessToken"), m_account->accessToken()}, -+ {QStringLiteral("refreshToken"), m_account->refreshToken()}, -+ {QStringLiteral("scopes"), scopes.join(QLatin1Char(','))}, -+ }; - - // Legacy: store the map exactly like kwallet-kf6 is doing it - QByteArray mapData; -diff --git a/resources/google-groupware/googlesettings.h b/resources/google-groupware/googlesettings.h -index f689dc7748..0ec4c3c34e 100644 ---- a/resources/google-groupware/googlesettings.h -+++ b/resources/google-groupware/googlesettings.h -@@ -33,7 +33,14 @@ class GoogleSettings : public SettingsBase - Q_CLASSINFO("D-Bus Interface", "org.kde.Akonadi.Google.ExtendedSettings") - - public: -- GoogleSettings(); -+ enum class Option { -+ NoOption = 0, -+ ExportToDBus = 1, -+ }; -+ Q_DECLARE_FLAGS(Options, Option) -+ -+ explicit GoogleSettings(const KSharedConfigPtr &config, Options options = Option::ExportToDBus); -+ - void init(); - void setWindowId(WId id); - void setResourceId(const QString &resourceIdentifier); -@@ -50,9 +57,11 @@ public: - bool isReady() const; - QKeychain::WritePasswordJob *storeAccount(KGAPI2::AccountPtr account); - void cleanup(); -+ - Q_SIGNALS: - void accountReady(bool ready); - void accountChanged(); -+ void okEnabled(bool enabled); - - private: - void slotWalletOpened(bool success); -diff --git a/resources/google-groupware/googlesettingsdialog.cpp b/resources/google-groupware/googlesettingsdialog.cpp -deleted file mode 100644 -index d418652d6f..0000000000 ---- a/resources/google-groupware/googlesettingsdialog.cpp -+++ /dev/null -@@ -1,305 +0,0 @@ --/* -- SPDX-FileCopyrightText: 2013 Daniel Vrátil -- SPDX-FileCopyrightText: 2020 Igor Poboiko -- -- SPDX-License-Identifier: GPL-3.0-or-later --*/ -- --#include "googlesettingsdialog.h" --#include "googleresource.h" --#include "googleresource_debug.h" --#include "googlesettings.h" --#include "ui_googlesettingsdialog.h" -- --#include -- --#include --#include --#include --#include --#include --#include --#include --#include -- --#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) --#include --#else --#include --#endif -- --using namespace QKeychain; --using namespace KGAPI2; -- --GoogleSettingsDialog::GoogleSettingsDialog(GoogleResource *resource, GoogleSettings *settings, WId wId) -- : QDialog() -- , m_resource(resource) -- , m_settings(settings) -- , m_ui(new Ui::GoogleSettingsDialog) --{ -- if (wId) { -- setAttribute(Qt::WA_NativeWindow, true); -- kwindowsystem-kf6::setMainWindow(windowHandle(), wId); -- } -- auto mainLayout = new QVBoxLayout(this); -- -- auto mainWidget = new QWidget(this); -- mainLayout->addWidget(mainWidget); -- -- auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); -- QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); -- okButton->setDefault(true); -- okButton->setShortcut(Qt::CTRL | Qt::Key_Return); -- mainLayout->addWidget(buttonBox); -- -- m_ui->setupUi(mainWidget); -- -- m_ui->refreshSpinBox->setSuffix(ki18n-kf6p(" minute", " minutes")); -- m_ui->enableRefresh->setChecked(m_settings->enableIntervalCheck()); -- m_ui->refreshSpinBox->setEnabled(m_settings->enableIntervalCheck()); -- m_ui->refreshSpinBox->setValue(m_settings->intervalCheckTime()); -- -- m_ui->eventsLimitCombo->setMaximumDate(QDate::currentDate()); -- m_ui->eventsLimitCombo->setMinimumDate(QDate::fromString(QStringLiteral("2000-01-01"), Qt::ISODate)); -- m_ui->eventsLimitCombo->setOptions(KDateComboBox::EditDate | KDateComboBox::SelectDate | KDateComboBox::DatePicker | KDateComboBox::WarnOnInvalid); -- if (m_settings->eventsSince().isEmpty()) { -- const QString ds = QStringLiteral("%1-01-01").arg(QString::number(QDate::currentDate().year() - 3)); -- m_ui->eventsLimitCombo->setDate(QDate::fromString(ds, Qt::ISODate)); -- } else { -- m_ui->eventsLimitCombo->setDate(QDate::fromString(m_settings->eventsSince(), Qt::ISODate)); -- } -- -- connect(buttonBox, &QDialogButtonBox::accepted, this, &GoogleSettingsDialog::slotSaveSettings); -- connect(buttonBox, &QDialogButtonBox::rejected, this, &GoogleSettingsDialog::reject); -- connect(m_ui->reloadCalendarsBtn, &QPushButton::clicked, this, &GoogleSettingsDialog::slotReloadCalendars); -- connect(m_ui->reloadTaskListsBtn, &QPushButton::clicked, this, &GoogleSettingsDialog::slotReloadTaskLists); -- connect(m_ui->configureBtn, &QPushButton::clicked, this, &GoogleSettingsDialog::slotConfigure); -- if (m_settings->isReady()) { -- m_account = m_settings->accountPtr(); -- } -- connect(m_settings, &GoogleSettings::accountReady, this, [this](bool ready) { -- if (ready) { -- m_account = m_settings->accountPtr(); -- accountChanged(); -- } -- }); -- QMetaObject::invokeMethod(this, &GoogleSettingsDialog::accountChanged, Qt::QueuedConnection); --} -- --GoogleSettingsDialog::~GoogleSettingsDialog() --{ -- delete m_ui; --} -- --bool GoogleSettingsDialog::handleError(KGAPI2::Job *job) --{ -- if ((job->error() == KGAPI2::NoError) || (job->error() == KGAPI2::OK)) { -- return true; -- } -- -- if (job->error() == KGAPI2::Unauthorized) { -- qCDebug(GOOGLE_LOG) << job << job->errorString(); -- const QList resourceScopes = m_resource->scopes(); -- for (const QUrl &scope : resourceScopes) { -- if (!m_account->scopes().contains(scope)) { -- m_account->addScope(scope); -- } -- } -- -- auto authJob = new AuthJob(m_account, m_settings->clientId(), m_settings->clientSecret(), this); -- authJob->setProperty(JOB_PROPERTY, QVariant::fromValue(job)); -- connect(authJob, &AuthJob::finished, this, &GoogleSettingsDialog::slotAuthJobFinished); -- -- return false; -- } -- -- KMessageBox::error(this, job->errorString()); -- return false; --} -- --void GoogleSettingsDialog::accountChanged() --{ -- if (!m_account) { -- m_ui->accountLabel->setText(i18n("not configured")); -- m_ui->calendarsList->setDisabled(true); -- m_ui->reloadCalendarsBtn->setDisabled(true); -- m_ui->calendarsList->clear(); -- m_ui->taskListsList->setDisabled(true); -- m_ui->reloadTaskListsBtn->setDisabled(true); -- m_ui->taskListsList->clear(); -- return; -- } -- m_ui->accountLabel->setText(QStringLiteral("%1").arg(m_account->accountName())); -- slotReloadCalendars(); -- slotReloadTaskLists(); --} -- --void GoogleSettingsDialog::slotConfigure() --{ -- const QString username = m_account && !m_account->accountName().isEmpty() ? m_account->accountName() : QString(); -- m_account = AccountPtr(new Account()); -- const QList resourceScopes = m_resource->scopes(); -- for (const QUrl &scope : resourceScopes) { -- if (!m_account->scopes().contains(scope)) { -- m_account->addScope(scope); -- } -- } -- auto authJob = new AuthJob(m_account, m_settings->clientId(), m_settings->clientSecret()); -- authJob->setUsername(username); -- connect(authJob, &AuthJob::finished, this, &GoogleSettingsDialog::slotAuthJobFinished); --} -- --void GoogleSettingsDialog::slotAuthJobFinished(KGAPI2::Job *job) --{ -- auto authJob = qobject_cast(job); -- m_account = authJob->account(); -- if (authJob->error() != KGAPI2::NoError) { -- KMessageBox::error(this, authJob->errorString()); -- return; -- } -- accountChanged(); -- -- auto otherJob = job->property(JOB_PROPERTY).value(); -- if (otherJob) { -- otherJob->setAccount(m_account); -- otherJob->restart(); -- } --} -- --void GoogleSettingsDialog::slotSaveSettings() --{ -- auto reset = [this] { -- m_settings->setAccount({}); -- m_settings->setEnableIntervalCheck(m_ui->enableRefresh->isChecked()); -- m_settings->setIntervalCheckTime(m_ui->refreshSpinBox->value()); -- m_settings->setCalendars({}); -- m_settings->setTaskLists({}); -- m_settings->setEventsSince({}); -- m_settings->save(); -- }; -- -- if (!m_account) { -- reset(); -- return; -- } -- -- auto writeJob = m_settings->storeAccount(m_account); -- connect(writeJob, &WritePasswordJob::finished, this, [this, reset, writeJob]() { -- if (writeJob->error()) { -- qCWarning(GOOGLE_LOG) << "Failed to store account's password in secret storage" << writeJob->errorString(); -- reset(); -- return; -- } -- -- m_settings->setAccount(m_account->accountName()); -- m_settings->setEnableIntervalCheck(m_ui->enableRefresh->isChecked()); -- m_settings->setIntervalCheckTime(m_ui->refreshSpinBox->value()); -- -- QStringList calendars; -- for (int i = 0; i < m_ui->calendarsList->count(); i++) { -- QListWidgetItem *item = m_ui->calendarsList->item(i); -- -- if (item->checkState() == Qt::Checked) { -- calendars.append(item->data(Qt::UserRole).toString()); -- } -- } -- m_settings->setCalendars(calendars); -- -- if (m_ui->eventsLimitCombo->isValid()) { -- m_settings->setEventsSince(m_ui->eventsLimitCombo->date().toString(Qt::ISODate)); -- } -- -- QStringList taskLists; -- for (int i = 0; i < m_ui->taskListsList->count(); i++) { -- QListWidgetItem *item = m_ui->taskListsList->item(i); -- -- if (item->checkState() == Qt::Checked) { -- taskLists.append(item->data(Qt::UserRole).toString()); -- } -- } -- m_settings->setTaskLists(taskLists); -- m_settings->save(); -- -- accept(); -- }); --} -- --void GoogleSettingsDialog::slotReloadCalendars() --{ -- m_ui->calendarsList->setDisabled(true); -- m_ui->reloadCalendarsBtn->setDisabled(true); -- m_ui->calendarsList->clear(); -- -- if (!m_account) { -- return; -- } -- -- auto fetchJob = new CalendarFetchJob(m_account, this); -- connect(fetchJob, &CalendarFetchJob::finished, this, [this](KGAPI2::Job *job) { -- if (!handleError(job) || !m_account) { -- m_ui->calendarsList->setEnabled(false); -- m_ui->reloadCalendarsBtn->setEnabled(false); -- return; -- } -- -- const ObjectsList objects = qobject_cast(job)->items(); -- -- QStringList activeCalendars; -- if (m_account->accountName() == m_settings->account()) { -- activeCalendars = m_settings->calendars(); -- } -- m_ui->calendarsList->clear(); -- for (const ObjectPtr &object : objects) { -- const CalendarPtr calendar = object.dynamicCast(); -- -- auto item = new QListWidgetItem(calendar->title()); -- item->setData(Qt::UserRole, calendar->uid()); -- item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable); -- item->setCheckState((activeCalendars.isEmpty() || activeCalendars.contains(calendar->uid())) ? Qt::Checked : Qt::Unchecked); -- m_ui->calendarsList->addItem(item); -- } -- -- m_ui->calendarsList->setEnabled(true); -- m_ui->reloadCalendarsBtn->setEnabled(true); -- }); --} -- --void GoogleSettingsDialog::slotReloadTaskLists() --{ -- if (!m_account) { -- return; -- } -- -- m_ui->taskListsList->setDisabled(true); -- m_ui->reloadTaskListsBtn->setDisabled(true); -- m_ui->taskListsList->clear(); -- -- auto job = new TaskListFetchJob(m_account, this); -- connect(job, &TaskListFetchJob::finished, this, [this](KGAPI2::Job *job) { -- if (!handleError(job) || !m_account) { -- m_ui->taskListsList->setDisabled(true); -- m_ui->reloadTaskListsBtn->setDisabled(true); -- return; -- } -- -- const ObjectsList objects = qobject_cast(job)->items(); -- -- QStringList activeTaskLists; -- if (m_account->accountName() == m_settings->account()) { -- activeTaskLists = m_settings->taskLists(); -- } -- m_ui->taskListsList->clear(); -- for (const ObjectPtr &object : objects) { -- const TaskListPtr taskList = object.dynamicCast(); -- -- auto item = new QListWidgetItem(taskList->title()); -- item->setData(Qt::UserRole, taskList->uid()); -- item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable); -- item->setCheckState((activeTaskLists.isEmpty() || activeTaskLists.contains(taskList->uid())) ? Qt::Checked : Qt::Unchecked); -- m_ui->taskListsList->addItem(item); -- } -- -- m_ui->taskListsList->setEnabled(true); -- m_ui->reloadTaskListsBtn->setEnabled(true); -- }); --} -diff --git a/resources/google-groupware/googlesettingswidget.cpp b/resources/google-groupware/googlesettingswidget.cpp -new file mode 100644 -index 0000000000..2543c4c6b8 ---- /dev/null -+++ b/resources/google-groupware/googlesettingswidget.cpp -@@ -0,0 +1,288 @@ -+/* -+ SPDX-FileCopyrightText: 2013 Daniel Vrátil -+ SPDX-FileCopyrightText: 2020 Igor Poboiko -+ -+ SPDX-License-Identifier: GPL-3.0-or-later -+*/ -+ -+#include "googlesettingswidget.h" -+#include "googleresource.h" -+#include "googleresource_debug.h" -+#include "googlescopes.h" -+#include "googlesettings.h" -+ -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) -+#include -+#else -+#include -+#endif -+ -+using namespace QKeychain; -+using namespace KGAPI2; -+ -+GoogleSettingsWidget::GoogleSettingsWidget(GoogleSettings &settings, const QString &identifier, QWidget *parent) -+ : QWidget(parent) -+ , m_settings(settings) -+ , m_identifier(identifier) -+{ -+ qDebug() << m_settings.account(); -+ auto mainLayout = new QVBoxLayout(this); -+ -+ auto mainWidget = new QWidget(this); -+ mainLayout->addWidget(mainWidget); -+ setupUi(mainWidget); -+ -+ refreshSpinBox->setSuffix(ki18n-kf6p(" minute", " minutes")); -+ enableRefresh->setChecked(m_settings.enableIntervalCheck()); -+ refreshSpinBox->setEnabled(m_settings.enableIntervalCheck()); -+ refreshSpinBox->setValue(m_settings.intervalCheckTime()); -+ -+ eventsLimitCombo->setMaximumDate(QDate::currentDate()); -+ eventsLimitCombo->setMinimumDate(QDate::fromString(QStringLiteral("2000-01-01"), Qt::ISODate)); -+ eventsLimitCombo->setOptions(KDateComboBox::EditDate | KDateComboBox::SelectDate | KDateComboBox::DatePicker | KDateComboBox::WarnOnInvalid); -+ if (m_settings.eventsSince().isEmpty()) { -+ const QString ds = QStringLiteral("%1-01-01").arg(QString::number(QDate::currentDate().year() - 3)); -+ eventsLimitCombo->setDate(QDate::fromString(ds, Qt::ISODate)); -+ } else { -+ eventsLimitCombo->setDate(QDate::fromString(m_settings.eventsSince(), Qt::ISODate)); -+ } -+ connect(reloadCalendarsBtn, &QPushButton::clicked, this, &GoogleSettingsWidget::slotReloadCalendars); -+ connect(reloadTaskListsBtn, &QPushButton::clicked, this, &GoogleSettingsWidget::slotReloadTaskLists); -+ connect(configureBtn, &QPushButton::clicked, this, &GoogleSettingsWidget::loadSettings); -+ if (m_settings.isReady()) { -+ m_account = m_settings.accountPtr(); -+ } -+ connect(&m_settings, &GoogleSettings::accountReady, this, [this](bool ready) { -+ if (ready) { -+ m_account = m_settings.accountPtr(); -+ accountChanged(); -+ } -+ }); -+ QMetaObject::invokeMethod(this, &GoogleSettingsWidget::accountChanged, Qt::QueuedConnection); -+} -+ -+GoogleSettingsWidget::~GoogleSettingsWidget() -+{ -+} -+ -+bool GoogleSettingsWidget::handleError(KGAPI2::Job *job) -+{ -+ if ((job->error() == KGAPI2::NoError) || (job->error() == KGAPI2::OK)) { -+ return true; -+ } -+ -+ if (job->error() == KGAPI2::Unauthorized) { -+ qCDebug(GOOGLE_LOG) << job << job->errorString(); -+ const QList resourceScopes = googleScopes(); -+ for (const QUrl &scope : resourceScopes) { -+ if (!m_account->scopes().contains(scope)) { -+ m_account->addScope(scope); -+ } -+ } -+ -+ auto authJob = new AuthJob(m_account, m_settings.clientId(), m_settings.clientSecret(), this); -+ authJob->setProperty(JOB_PROPERTY, QVariant::fromValue(job)); -+ connect(authJob, &AuthJob::finished, this, &GoogleSettingsWidget::slotAuthJobFinished); -+ -+ return false; -+ } -+ -+ KMessageBox::error(this, job->errorString()); -+ return false; -+} -+ -+void GoogleSettingsWidget::accountChanged() -+{ -+ if (!m_account) { -+ accountLabel->setText(i18n("not configured")); -+ calendarsList->setDisabled(true); -+ reloadCalendarsBtn->setDisabled(true); -+ calendarsList->clear(); -+ taskListsList->setDisabled(true); -+ reloadTaskListsBtn->setDisabled(true); -+ taskListsList->clear(); -+ return; -+ } -+ accountLabel->setText(QStringLiteral("%1").arg(m_account->accountName())); -+ slotReloadCalendars(); -+ slotReloadTaskLists(); -+} -+ -+void GoogleSettingsWidget::loadSettings() -+{ -+ const QString username = m_account && !m_account->accountName().isEmpty() ? m_account->accountName() : QString(); -+ m_account = AccountPtr(new Account()); -+ const QList resourceScopes = googleScopes(); -+ for (const QUrl &scope : resourceScopes) { -+ if (!m_account->scopes().contains(scope)) { -+ m_account->addScope(scope); -+ } -+ } -+ auto authJob = new AuthJob(m_account, m_settings.clientId(), m_settings.clientSecret()); -+ authJob->setUsername(username); -+ connect(authJob, &AuthJob::finished, this, &GoogleSettingsWidget::slotAuthJobFinished); -+} -+ -+void GoogleSettingsWidget::slotAuthJobFinished(KGAPI2::Job *job) -+{ -+ auto authJob = qobject_cast(job); -+ m_account = authJob->account(); -+ if (authJob->error() != KGAPI2::NoError) { -+ KMessageBox::error(this, authJob->errorString()); -+ return; -+ } -+ accountChanged(); -+ -+ auto otherJob = job->property(JOB_PROPERTY).value(); -+ if (otherJob) { -+ otherJob->setAccount(m_account); -+ otherJob->restart(); -+ } -+} -+ -+void GoogleSettingsWidget::saveSettings() -+{ -+ auto reset = [this] { -+ m_settings.setAccount({}); -+ m_settings.setEnableIntervalCheck(enableRefresh->isChecked()); -+ m_settings.setIntervalCheckTime(refreshSpinBox->value()); -+ m_settings.setCalendars({}); -+ m_settings.setTaskLists({}); -+ m_settings.setEventsSince({}); -+ m_settings.save(); -+ }; -+ -+ if (!m_account) { -+ reset(); -+ return; -+ } -+ -+ auto writeJob = m_settings.storeAccount(m_account); -+ connect(writeJob, &WritePasswordJob::finished, this, [this, reset, writeJob]() { -+ if (writeJob->error()) { -+ qCWarning(GOOGLE_LOG) << "Failed to store account's password in secret storage" << writeJob->errorString(); -+ reset(); -+ return; -+ } -+ -+ m_settings.setAccount(m_account->accountName()); -+ m_settings.setEnableIntervalCheck(enableRefresh->isChecked()); -+ m_settings.setIntervalCheckTime(refreshSpinBox->value()); -+ -+ QStringList calendars; -+ for (int i = 0; i < calendarsList->count(); i++) { -+ QListWidgetItem *item = calendarsList->item(i); -+ -+ if (item->checkState() == Qt::Checked) { -+ calendars.append(item->data(Qt::UserRole).toString()); -+ } -+ } -+ m_settings.setCalendars(calendars); -+ -+ if (eventsLimitCombo->isValid()) { -+ m_settings.setEventsSince(eventsLimitCombo->date().toString(Qt::ISODate)); -+ } -+ -+ QStringList taskLists; -+ for (int i = 0; i < taskListsList->count(); i++) { -+ QListWidgetItem *item = taskListsList->item(i); -+ -+ if (item->checkState() == Qt::Checked) { -+ taskLists.append(item->data(Qt::UserRole).toString()); -+ } -+ } -+ m_settings.setTaskLists(taskLists); -+ m_settings.save(); -+ }); -+} -+ -+void GoogleSettingsWidget::slotReloadCalendars() -+{ -+ calendarsList->setDisabled(true); -+ reloadCalendarsBtn->setDisabled(true); -+ calendarsList->clear(); -+ -+ if (!m_account) { -+ return; -+ } -+ -+ auto fetchJob = new CalendarFetchJob(m_account, this); -+ connect(fetchJob, &CalendarFetchJob::finished, this, [this](KGAPI2::Job *job) { -+ if (!handleError(job) || !m_account) { -+ calendarsList->setEnabled(false); -+ reloadCalendarsBtn->setEnabled(false); -+ return; -+ } -+ -+ const ObjectsList objects = qobject_cast(job)->items(); -+ -+ QStringList activeCalendars; -+ if (m_account->accountName() == m_settings.account()) { -+ activeCalendars = m_settings.calendars(); -+ } -+ calendarsList->clear(); -+ for (const ObjectPtr &object : objects) { -+ const CalendarPtr calendar = object.dynamicCast(); -+ -+ auto item = new QListWidgetItem(calendar->title()); -+ item->setData(Qt::UserRole, calendar->uid()); -+ item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable); -+ item->setCheckState((activeCalendars.isEmpty() || activeCalendars.contains(calendar->uid())) ? Qt::Checked : Qt::Unchecked); -+ calendarsList->addItem(item); -+ } -+ -+ calendarsList->setEnabled(true); -+ reloadCalendarsBtn->setEnabled(true); -+ }); -+} -+ -+void GoogleSettingsWidget::slotReloadTaskLists() -+{ -+ if (!m_account) { -+ return; -+ } -+ -+ taskListsList->setDisabled(true); -+ reloadTaskListsBtn->setDisabled(true); -+ taskListsList->clear(); -+ -+ auto job = new TaskListFetchJob(m_account, this); -+ connect(job, &TaskListFetchJob::finished, this, [this](KGAPI2::Job *job) { -+ if (!handleError(job) || !m_account) { -+ taskListsList->setDisabled(true); -+ reloadTaskListsBtn->setDisabled(true); -+ return; -+ } -+ -+ const ObjectsList objects = qobject_cast(job)->items(); -+ -+ QStringList activeTaskLists; -+ if (m_account->accountName() == m_settings.account()) { -+ activeTaskLists = m_settings.taskLists(); -+ } -+ taskListsList->clear(); -+ for (const ObjectPtr &object : objects) { -+ const TaskListPtr taskList = object.dynamicCast(); -+ -+ auto item = new QListWidgetItem(taskList->title()); -+ item->setData(Qt::UserRole, taskList->uid()); -+ item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable); -+ item->setCheckState((activeTaskLists.isEmpty() || activeTaskLists.contains(taskList->uid())) ? Qt::Checked : Qt::Unchecked); -+ taskListsList->addItem(item); -+ } -+ -+ taskListsList->setEnabled(true); -+ reloadTaskListsBtn->setEnabled(true); -+ }); -+} -diff --git a/resources/google-groupware/googlesettingsdialog.h b/resources/google-groupware/googlesettingswidget.h -similarity index 53% -rename from resources/google-groupware/googlesettingsdialog.h -rename to resources/google-groupware/googlesettingswidget.h -index a7d6ca0c92..4226a39d2d 100644 ---- a/resources/google-groupware/googlesettingsdialog.h -+++ b/resources/google-groupware/googlesettingswidget.h -@@ -7,40 +7,37 @@ - - #pragma once - -+#include "googlesettings.h" -+#include "ui_googlesettingswidget.h" - #include --#include - --namespace Ui --{ --class GoogleSettingsDialog; --} - namespace KGAPI2 - { - class Job; - } --class GoogleResource; --class GoogleSettings; -- --class GoogleSettingsDialog : public QDialog -+class GoogleSettingsWidget : public QWidget, private Ui::GoogleSettingsWidget - { - Q_OBJECT - public: -- explicit GoogleSettingsDialog(GoogleResource *resource, GoogleSettings *settings, WId wId); -- ~GoogleSettingsDialog() override; -+ explicit GoogleSettingsWidget(GoogleSettings &settings, const QString &identifier, QWidget *parent); -+ ~GoogleSettingsWidget() override; -+ -+ void loadSettings(); -+ void saveSettings(); -+ -+Q_SIGNALS: -+ void okEnabled(bool enabled); - - protected: - bool handleError(KGAPI2::Job *job); - void accountChanged(); - - private: -- void slotConfigure(); - void slotAuthJobFinished(KGAPI2::Job *job); -- void slotSaveSettings(); - void slotReloadCalendars(); - void slotReloadTaskLists(); - -- GoogleResource *const m_resource; -- GoogleSettings *const m_settings; -- Ui::GoogleSettingsDialog *const m_ui; -+ GoogleSettings &m_settings; - KGAPI2::AccountPtr m_account; -+ const QString m_identifier; - }; -diff --git a/resources/google-groupware/googlesettingsdialog.ui b/resources/google-groupware/googlesettingswidget.ui -similarity index 99% -rename from resources/google-groupware/googlesettingsdialog.ui -rename to resources/google-groupware/googlesettingswidget.ui -index 9ff9bc93b4..75fdfd24f1 100644 ---- a/resources/google-groupware/googlesettingsdialog.ui -+++ b/resources/google-groupware/googlesettingswidget.ui -@@ -1,6 +1,6 @@ - - -- GoogleSettingsDialog -+ GoogleSettingsWidget - - - -diff --git a/resources/google-groupware/settingsbase.kcfg b/resources/google-groupware/settingsbase.kcfg -index ac58395d71..7dfe8dfe92 100644 ---- a/resources/google-groupware/settingsbase.kcfg -+++ b/resources/google-groupware/settingsbase.kcfg -@@ -4,7 +4,7 @@ - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0 - http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" > -- -+ - - - --- -GitLab - diff --git a/desktop/kde6/applications/kdepim-runtime-kf6/pspec.xml b/desktop/kde6/applications/kdepim-runtime-kf6/pspec.xml deleted file mode 100755 index f3465f0fe4..0000000000 --- a/desktop/kde6/applications/kdepim-runtime-kf6/pspec.xml +++ /dev/null @@ -1,228 +0,0 @@ - - - - - kdepim-runtime-kf6 - https://community.kde.org/KDE_PIM - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - kontact-kf6 - library - app:gui - kde6 PIM Runtime Environment - kdepim-runtime-kf6 contains kde6 PIM (Personal Information Management) runtime environment like akonadi agents. - mirrors://kde/stable/release-service/24.12.1/src/kdepim-runtime-24.12.1.tar.xz - - kdoctools-kf6-devel - boost-devel - shared-mime-info - akonadi-kf6-devel - akonadi-calendar-kf6-devel - akonadi-search-kf6-devel - kcmutils-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - knotifyconfig-kf6-devel - knotifications-kf6-devel - kmailtransport-kf6-devel - kidentitymanagement-kf6-devel - kalarm-kf6 - kcalutils-kf6-devel - kmbox-kf6-devel - kimap-kf6-devel - libkgapi-kf6-devel - kholidays-kf6-devel - ksyndication-kf6-devel - pimcommon-kf6-devel - cyrus-sasl-devel - qt6-declarative-devel - qt6-multimedia-devel - - - - qt6-webengine-devel - extra-cmake-modules-kf6 - - qt6-networkauth-devel - akonadi-mime-kf6-devel - - akonadi-contacts-kf6-devel - qt6-speech-devel - kdav-kf6-devel - ffmpeg-devel - kldap-kf6-devel - libkdepim-kf6-devel - libXScrnSaver-devel - qca2-qt6-devel - qt6-keychain-devel - - - - - - kdepim-runtime-kf6 - - akonadi-kf6 - libkgapi-kf6 - kio-kf6 - ki18n-kf6 - kimap-kf6 - kmbox-kf6 - kmime-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - kcalendarcore-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - kalarm-kf6 - kcalutils-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kitemmodels-kf6 - pimcommon-kf6 - kcontacts-kf6 - kjobwidgets-kf6 - knotifyconfig-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - ktextwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - qt6-speech - akonadi-calendar-kf6 - cyrus-sasl - akonadi-mime-kf6 - - qt6-webengine - qt6-networkauth - qt6-multimedia - akonadi-contacts-kf6 - kidentitymanagement-kf6 - kdav-kf6 - kldap-kf6 - libkdepim-kf6 - qt6-keychain - - - /etc/xdg - /usr/lib - /usr/bin - /usr/share - /usr/share/mime - /usr/share/kservice-kf6types5 - /usr/share/kservices6 - /usr/share/knotifications6 - /usr/share/icons - /usr/share/dbus-1 - /usr/share/akonadi - /usr/share/ontology - /usr/share/autostart - /usr/share/applications - /usr/share/doc - /usr/share/locale - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdepim-runtime-kf6/translations.xml b/desktop/kde6/applications/kdepim-runtime-kf6/translations.xml deleted file mode 100755 index 7eede31d12..0000000000 --- a/desktop/kde6/applications/kdepim-runtime-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kdepim-runtime-kf6 - kde6 PIM (Kişisel Bilgi Yönetimi) çalışma zamanı ortamı - kdepim-runtime-kf6, kdelibs kullanarak yazılmış olan Akonadi ajanları da dahil olmak üzere kde6 PIM (Personal Information Management - Kişisel Bilgi Yönetimi) çalışma zamanı ortamını içerir. - - diff --git a/desktop/kde6/applications/kdesdk-thumbnailers-kf6/actions.py b/desktop/kde6/applications/kdesdk-thumbnailers-kf6/actions.py deleted file mode 100755 index e4e5adbf7a..0000000000 --- a/desktop/kde6/applications/kdesdk-thumbnailers-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kdesdk-thumbnailers-kf6/pspec.xml b/desktop/kde6/applications/kdesdk-thumbnailers-kf6/pspec.xml deleted file mode 100755 index edb844e249..0000000000 --- a/desktop/kde6/applications/kdesdk-thumbnailers-kf6/pspec.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - - - kdesdk-thumbnailers-kf6 - http://www.kde.org/ - - Mathias Freire - mathiasfreire45@gmail.com - - GPLv2 - library - desktop.kde.sdk - kdesdk-thumbnailers-kf6 - Translation file thumbnail generators - Translation file thumbnail generators - mirrors://kde/stable/release-service/24.12.1/src/kdesdk-thumbnailers-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kconfig-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - gettext-devel - - - - - kdesdk-thumbnailers-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - gettext - kconfig-kf6 - qt6-base - kwidgetsaddons-kf6 - - - kdesdk - - - kdesdk - - - /usr/share/kservice-kf6s5 - /usr/share/config.kcfg - /usr/lib - /usr/share/doc - /usr/share/locale - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdf-kf6/actions.py b/desktop/kde6/applications/kdf-kf6/actions.py deleted file mode 100755 index 5a0b867eec..0000000000 --- a/desktop/kde6/applications/kdf-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kdf-kf6/pspec.xml b/desktop/kde6/applications/kdf-kf6/pspec.xml deleted file mode 100755 index a0b10584aa..0000000000 --- a/desktop/kde6/applications/kdf-kf6/pspec.xml +++ /dev/null @@ -1,148 +0,0 @@ - - - - - kdf-kf6 - https://utils.kde.org/projects/kdf/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - GPL - LGPL - kdf-kf6 - View Disk Usage - KDiskFree displays the available file devices (hard drive partitions, floppy and CD drives, etc.) along with information on their capacity, free space, type and mount point. It also allows you to mount and unmount drives and view them in a file manager. - http://download.kde.org/stable/release-service/24.12.1/src/kdf-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - kcmutils-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kstatusnotifieritem-kf6-devel - qt6-base-devel - qt6-5compat-devel - - - - kdf-kf6 - View Disk Usage - - kcmutils-kf6 - kconfigwidgets-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - knotifications-kf6 - kxmlgui-kf6 - qt6-base - kstatusnotifieritem-kf6 - qt6-5compat - - - /etc/xdg - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdiagram-kf6/actions.py b/desktop/kde6/applications/kdiagram-kf6/actions.py deleted file mode 100755 index d048b3d30b..0000000000 --- a/desktop/kde6/applications/kdiagram-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSE.GPL.txt") - diff --git a/desktop/kde6/applications/kdiagram-kf6/pspec.xml b/desktop/kde6/applications/kdiagram-kf6/pspec.xml deleted file mode 100755 index 446c1d99b1..0000000000 --- a/desktop/kde6/applications/kdiagram-kf6/pspec.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - kdiagram-kf6 - http://www.kde.org/ - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - Powerful libraries for creating business diagrams - Powerful libraries for creating business diagrams - https://download.kde.org/stable/kdiagram/3.0.1/kdiagram-3.0.1.tar.xz - - doxygen - extra-cmake-modules-kf6 - qt6-assistant-devel - qt6-base-devel - qt6-designer-devel - qt6-linguist - qt6-svg-devel - qt6-sql-sqlite - qt6-sql-mysql - qt6-sql-postgresql - qt6-sql-odbc - - - - - kdiagram-kf6 - Powerful libraries for creating business diagrams - - libgcc - qt6-base - qt6-svg - - - /usr/lib - /usr/lib/qt6 - /usr/share/locale - /usr/share/doc - - - - - kdiagram-kf6-devel - Development files for kdiagram-kf6 - - /usr/include - /usr/lib/cmake - - - kdiagram-kf6 - - - - - - 2025-01-10 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-12-15 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-11-07 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-07-04 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-06-27 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-23 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 3.0.1 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdialog-kf6/actions.py b/desktop/kde6/applications/kdialog-kf6/actions.py deleted file mode 100755 index 6d2ed1c73a..0000000000 --- a/desktop/kde6/applications/kdialog-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING.DOC", "README*", "LICENSES/*") diff --git a/desktop/kde6/applications/kdialog-kf6/pspec.xml b/desktop/kde6/applications/kdialog-kf6/pspec.xml deleted file mode 100755 index 02c34d651f..0000000000 --- a/desktop/kde6/applications/kdialog-kf6/pspec.xml +++ /dev/null @@ -1,162 +0,0 @@ - - - - - kdialog-kf6 - https://github.com/KDE/kdialog-kf6 - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - kdialog-kf6 - kdialog-kf6 allows you to display dialog boxes from shell scripts - The syntax is very much inspired from the "dialog" command - (which shows text mode dialogs). - mirrors://kde/stable/release-service/24.12.1/src/kdialog-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - - kio-kf6-devel - - kdoctools-kf6-devel - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - libICE-devel - libX11-devel - libXext-devel - python-devel - kdbusaddons-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - knotifications-kf6-devel - ktextwidgets-kf6-devel - qt6-base-devel - - - - - kdialog-kf6 - kdialog-kf6 allows you to display dialog boxes from shell scripts - - - kio-kf6 - qt6-base - ki18n-kf6 - libX11 - libgcc - kconfig-kf6 - kguiaddons-kf6 - kdbusaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - kde-baseapps - - - kde-baseapps - - - /usr/bin - /usr/share - /usr/share/doc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdiamond-kf6/actions.py b/desktop/kde6/applications/kdiamond-kf6/actions.py deleted file mode 100755 index 0374af291e..0000000000 --- a/desktop/kde6/applications/kdiamond-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kdiamond-kf6/pspec.xml b/desktop/kde6/applications/kdiamond-kf6/pspec.xml deleted file mode 100755 index cad3318ac1..0000000000 --- a/desktop/kde6/applications/kdiamond-kf6/pspec.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - kdiamond-kf6 - https://www.kde.org/applications/games/kdiamond/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kdiamond-kf6 - app:gui - desktop.kde.games - Three in a row game - kdiamond-kf6 is a single player puzzle game. The object of the game is to build lines of three similar diamonds. - mirrors://kde/stable/release-service/24.12.1/src/kdiamond-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - knotifications-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kcrash-kf6-devel - kcompletion-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - docbook-xsl - - - - - kdiamond-kf6 - - ki18n-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - knotifyconfig-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kdiamond-kf6/translations.xml b/desktop/kde6/applications/kdiamond-kf6/translations.xml deleted file mode 100755 index 63bad8722d..0000000000 --- a/desktop/kde6/applications/kdiamond-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kdiamond-kf6 - Bir satırda üç oyunu - kdiamond-kf6 benzer elmaslardan üç tanesinin yan yana getirilmesini konu edinen tek kişilik bir bulmaca oyunudur. - - diff --git a/desktop/kde6/applications/keditbookmarks-kf6/actions.py b/desktop/kde6/applications/keditbookmarks-kf6/actions.py deleted file mode 100755 index 915a9f6391..0000000000 --- a/desktop/kde6/applications/keditbookmarks-kf6/actions.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING.DOC", "COPYING", "TODO", "DESIGN") diff --git a/desktop/kde6/applications/keditbookmarks-kf6/pspec.xml b/desktop/kde6/applications/keditbookmarks-kf6/pspec.xml deleted file mode 100755 index 687d0ee578..0000000000 --- a/desktop/kde6/applications/keditbookmarks-kf6/pspec.xml +++ /dev/null @@ -1,153 +0,0 @@ - - - - - keditbookmarks-kf6 - https://github.com/KDE/keditbookmarks-kf6 - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - keditbookmarks-kf6 - Bookmark Organizer and Editor - Bookmark Organizer and Editor - mirrors://kde/stable/release-service/24.12.1/src/keditbookmarks-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - kbookmarks-kf6-devel - kcoreaddons-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kparts-kf6-devel - kwindowsystem-kf6-devel - python-devel - qt6-base-devel - - - - - keditbookmarks-kf6 - Bookmark Organizer and Editor - - kbookmarks-kf6 - ki18n-kf6 - kio-kf6 - kparts-kf6 - qt6-base - libgcc - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - kde-baseapps - - - kde-baseapps - - - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kfind-kf6/actions.py b/desktop/kde6/applications/kfind-kf6/actions.py deleted file mode 100755 index 27978bcc33..0000000000 --- a/desktop/kde6/applications/kfind-kf6/actions.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/applications/kfind-kf6/pspec.xml b/desktop/kde6/applications/kfind-kf6/pspec.xml deleted file mode 100755 index 1cce462cf2..0000000000 --- a/desktop/kde6/applications/kfind-kf6/pspec.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - kfind-kf6 - http://kde.org/applications/utilities/kfind/ - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde.utils - kfind-kf6 - Find Files/Folders - Find Files/Folders - - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - kio-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - karchive-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kdoctools-kf6-devel - python-devel - kfilemetadata-kf6-devel - qt6-base-devel - qt6-5compat-devel - - mirrors://kde/stable/release-service/24.12.1/src/kfind-24.12.1.tar.xz - - - kfind-kf6 - Find Files/Folders - - karchive-kf6 - qt6-5compat - libgcc - qt6-base - kio-kf6 - ki18n-kf6 - kwidgetsaddons-kf6 - kxmlgui-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kjobwidgets-kf6 - kconfigwidgets-kf6 - kfilemetadata-kf6 - kwidgetsaddons-kf6 - - - kde-baseapps - - - kde-baseapps - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - /usr/share/man/man1 - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kfourinline-kf6/actions.py b/desktop/kde6/applications/kfourinline-kf6/actions.py deleted file mode 100755 index 0374af291e..0000000000 --- a/desktop/kde6/applications/kfourinline-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kfourinline-kf6/pspec.xml b/desktop/kde6/applications/kfourinline-kf6/pspec.xml deleted file mode 100755 index 0829c93b6a..0000000000 --- a/desktop/kde6/applications/kfourinline-kf6/pspec.xml +++ /dev/null @@ -1,159 +0,0 @@ - - - - - kfourinline-kf6 - https://www.kde.org/applications/games/kfourinline/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kfourinline-kf6 - app:gui - desktop.kde.games - Four in a row board game - kfourinline-kf6 is a board game for two players based on the Connect-Four game. - mirrors://kde/stable/release-service/24.12.1/src/kfourinline-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kitemmodels-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kcompletion-kf6-devel - kxmlgui-kf6-devel - kdnssd-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - - - kdoctools-kf6-devel - - - kunitconversion-kf6-devel - libkdegames-kf6-devel - - - - - kfourinline-kf6 - - ki18n-kf6 - kdnssd-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kfourinline-kf6/translations.xml b/desktop/kde6/applications/kfourinline-kf6/translations.xml deleted file mode 100755 index 69594cf4e3..0000000000 --- a/desktop/kde6/applications/kfourinline-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kfourinline-kf6 - Bir satırda dört tahta oyunu - kfourinline-kf6 iki kişiyle oynanan Hedef 4 türevi bir oyundur. - - diff --git a/desktop/kde6/applications/kgeography-kf6/actions.py b/desktop/kde6/applications/kgeography-kf6/actions.py deleted file mode 100755 index 26abf8551a..0000000000 --- a/desktop/kde6/applications/kgeography-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("AUTHORS", "COPYING", "COPYING.DOC", "README", "TODO") diff --git a/desktop/kde6/applications/kgeography-kf6/pspec.xml b/desktop/kde6/applications/kgeography-kf6/pspec.xml deleted file mode 100755 index 7d3ff137c8..0000000000 --- a/desktop/kde6/applications/kgeography-kf6/pspec.xml +++ /dev/null @@ -1,143 +0,0 @@ - - - - - kgeography-kf6 - https://www.kde.org/applications/education/kgeography/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kgeography-kf6 - app:gui - desktop.kde.edu - kgeography-kf6 is a geography learning tool - kgeography-kf6 is a geography learning tool, which allows you to learn about the political divisions of some countries (divisions, capitals of those divisions and their associated flags if there are some). - https://download.kde.org/stable/release-service/24.12.1/src/kgeography-24.12.1.tar.xz - - qt6-base-devel - kconfig-kf6-devel - kcrash-kf6-devel - kdoctools-kf6-devel - kxmlgui-kf6-devel - kwidgetsaddons-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kservice-kf6-devel - kconfigwidgets-kf6-devel - extra-cmake-modules-kf6 - - - - - kgeography-kf6 - - qt6-base - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - kwidgetsaddons-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kitemviews-kf6 - kiconthemes-kf6 - kconfigwidgets-kf6 - - - /usr/bin - /usr/share - /usr/share/doc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kgeography-kf6/translations.xml b/desktop/kde6/applications/kgeography-kf6/translations.xml deleted file mode 100755 index 2e4b7574a2..0000000000 --- a/desktop/kde6/applications/kgeography-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kgeography-kf6 - Bir coğrafya uygulaması - kgeography-kf6, ülkeler hakkında çeşitli bilgiler sunan bir coğrafya uygulamasıdır. - - diff --git a/desktop/kde6/applications/kget-kf6/actions.py b/desktop/kde6/applications/kget-kf6/actions.py deleted file mode 100644 index c7c23ed633..0000000000 --- a/desktop/kde6/applications/kget-kf6/actions.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("AUTHORS", "COPYING*", "README") diff --git a/desktop/kde6/applications/kget-kf6/pspec.xml b/desktop/kde6/applications/kget-kf6/pspec.xml deleted file mode 100644 index bb6f5db8a4..0000000000 --- a/desktop/kde6/applications/kget-kf6/pspec.xml +++ /dev/null @@ -1,187 +0,0 @@ - - - - - kget-kf6 - https://apps.kde.org/kget-kf6 - - Mathias Freire - mathiasfreire45@gmail.com - - GPLv2 - app:gui - Download manager for KDE - kget-kf6 is an advanced download manager with support for Metalink and Bittorrent. - mirrors://kde/stable/release-service/24.12.1/src/kget-24.12.1.tar.xz - - kio-kf6-devel - gmp-devel - boost-devel - - ki18n-kf6-devel - gpgme-devel - kcrash-kf6-devel - kparts-kf6-devel - libmms-devel - qt6-sql-odbc - sqlite-devel - kconfig-kf6-devel - qt6-sql-mysql - kwallet-kf6-devel - kxmlgui-kf6-devel - qca2-qt6-devel - qt6-base-devel - qt6-sql-sqlite - kcmutils-kf6-devel - - libgcrypt-devel - gpgme-qt6-devel - kdoctools-kf6-devel - kitemviews-kf6-devel - kdbusaddons-kf6-devel - kiconthemes-kf6-devel - kcoreaddons-kf6-devel - libktorrent-kf6-devel - kcompletion-kf6-devel - qt6-sql-postgresql - ktextwidgets-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - knotifyconfig-kf6-devel - kwidgetsaddons-kf6-devel - kconfigwidgets-kf6-devel - knotifications-kf6-devel - kstatusnotifieritem-kf6-devel - plasma-workspace-kf6-devel - - - - - kget-kf6 - - kio-kf6 - gpgme - ki18n-kf6 - - kparts-kf6 - libgcc - libmms - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - qca2-qt6 - gpgme-qt6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - - libktorrent-kf6 - knotifyconfig-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kstatusnotifieritem-kf6 - plasma-workspace-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - /usr/share/locale - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kget-kf6/translations.xml b/desktop/kde6/applications/kget-kf6/translations.xml deleted file mode 100644 index 5aa08c9425..0000000000 --- a/desktop/kde6/applications/kget-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kget-kf6 - KDE için indirme yönetcisi. - kget-kf6, Metalink ve BitTorrent desteği olan bir indirme yöneticisidir. - - diff --git a/desktop/kde6/applications/kgpg-kf6/actions.py b/desktop/kde6/applications/kgpg-kf6/actions.py deleted file mode 100755 index 78e82bb57a..0000000000 --- a/desktop/kde6/applications/kgpg-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/kgpg-kf6/pspec.xml b/desktop/kde6/applications/kgpg-kf6/pspec.xml deleted file mode 100755 index 610f16eacd..0000000000 --- a/desktop/kde6/applications/kgpg-kf6/pspec.xml +++ /dev/null @@ -1,180 +0,0 @@ - - - - - kgpg-kf6 - http://kde.org/applications/utilities/kgpg/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - LGPL - GPL - A QtQuick plugin to render beautiful and interactive charts - kgpg-kf6 is a simple interface for GnuPG, a powerful encryption utility. - mirrors://kde/stable/release-service/24.12.1/src/kgpg-24.12.1.tar.xz - - akonadi-kf6-devel - boost-devel - akonadi-contacts-kf6-devel - gettext-devel - glibc-devel - gpgme-devel - karchive-kf6-devel - kcodecs-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kjobwidgets-kf6-devel - knotifications-kf6-devel - kservice-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kcalendarcore-kf6-devel - kcontacts-kf6-devel - ktexttemplate-kf6-devel - kstatusnotifieritem-kf6-devel - kunitconversion-kf6-devel - libical-devel - python-devel - libevent-devel - qt6-webengine-devel - qt6-base-devel - qt6-5compat-devel - extra-cmake-modules-kf6 - - - - kgpg-kf6 - A GnuPG frontend - - gpgme - boost - qt6-base - qt6-5compat - kio-kf6 - ki18n-kf6 - kcrash-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - karchive-kf6 - kcontacts-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - ktexttemplate-kf6 - kwidgetsaddons-kf6 - akonadi-contacts-kf6 - kstatusnotifieritem-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/khangman-kf6/actions.py b/desktop/kde6/applications/khangman-kf6/actions.py deleted file mode 100755 index fb92a5ae41..0000000000 --- a/desktop/kde6/applications/khangman-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("AUTHORS", "ChangeLog", "COPYING*", "README*", "TODO") diff --git a/desktop/kde6/applications/khangman-kf6/pspec.xml b/desktop/kde6/applications/khangman-kf6/pspec.xml deleted file mode 100755 index dba35869ec..0000000000 --- a/desktop/kde6/applications/khangman-kf6/pspec.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - - - khangman-kf6 - https://www.kde.org/applications/education/khangman/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - khangman-kf6 - app:gui - desktop.kde.edu - khangman-kf6 is a game for kids based on the well-known hangman game - khangman-kf6 is a game based on the well-known hangman game. It is aimed at children aged six and over. The game has several categories of words to play with, for example: Animals (animals words) and three difficulty categories: Easy, Medium and Hard. - mirrors://kde/stable/release-service/24.12.1/src/khangman-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kdeclarative-kf6-devel - knewstuff-kf6-devel - ki18n-kf6-devel - kcrash-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - knotifications-kf6-devel - kxmlgui-kf6-devel - kwidgetsaddons-kf6-devel - kio-kf6-devel - qt6-svg-devel - qt6-linguist - qt6-declarative-devel - libkeduvocdocument-kf6-devel - extra-cmake-modules-kf6 - - - - - khangman-kf6 - - qt6-base - kdeclarative-kf6 - knewstuff-kf6 - ki18n-kf6 - kwidgetsaddons-kf6 - kconfig-kf6 - kcoreaddons-kf6 - kxmlgui-kf6 - qt6-declarative - libkeduvocdocument-kf6 - libgcc - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/man - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/khangman-kf6/translations.xml b/desktop/kde6/applications/khangman-kf6/translations.xml deleted file mode 100755 index 436b324854..0000000000 --- a/desktop/kde6/applications/khangman-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - khangman-kf6 - Adam asmaca oyununun çocuklar için uyarlanmış, öğretici versiyonu - khangman-kf6, adam asmaca olarak bilinen oyunun 6 yaş ve üzeri için uyarlanmış bir uygulamasıdır. Oynamak için seçilebilecek değişik kate-kf6goriler ve 3 farklı zorluk seviyesi bulunuyor. - - diff --git a/desktop/kde6/applications/khelpcenter-kf6/actions.py b/desktop/kde6/applications/khelpcenter-kf6/actions.py deleted file mode 100755 index 9c39b55411..0000000000 --- a/desktop/kde6/applications/khelpcenter-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure("-DPhonon4Qt5_DIR=/usr/lib/qt6/cmake/phonon4qt5") - -def build(): - kde6.make() - -def install(): - kde6.install() - - #pisitools.removeDir("/usr/share/locale/") - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/khelpcenter-kf6/pspec.xml b/desktop/kde6/applications/khelpcenter-kf6/pspec.xml deleted file mode 100755 index ae8449a3f6..0000000000 --- a/desktop/kde6/applications/khelpcenter-kf6/pspec.xml +++ /dev/null @@ -1,166 +0,0 @@ - - - - - khelpcenter-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - khelpcenter-kf6 - KDE Help Center - KDE help center utility to read help documentation about various KDE applications. - mirrors://kde/stable/release-service/24.12.1/src/khelpcenter-24.12.1.tar.xz - - qt6-base-devel - qt6-webengine-devel - libxml2-devel - libdbusmenu-qt-devel - karchive-kf6-devel - kcmutils-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kbookmarks-kf6-devel - kcompletion-kf6-devel - kio-kf6-devel - kxmlgui-kf6-devel - ktexttemplate-kf6-devel - kwindowsystem-kf6-devel - - docbook-xsl - xapian-core-devel - - extra-cmake-modules-kf6 - - - - - khelpcenter-kf6 - - qt6-base - qt6-webengine - kio-kf6 - libgcc - libxml2 - karchive-kf6 - kbookmarks-kf6 - ki18n-kf6 - kparts-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcmutils-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - ktexttemplate-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - - - /etc/xdg - /usr/share - /usr/bin - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kidentitymanagement-kf6/actions.py b/desktop/kde6/applications/kidentitymanagement-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/kidentitymanagement-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kidentitymanagement-kf6/pspec.xml b/desktop/kde6/applications/kidentitymanagement-kf6/pspec.xml deleted file mode 100755 index 53b0e1c55f..0000000000 --- a/desktop/kde6/applications/kidentitymanagement-kf6/pspec.xml +++ /dev/null @@ -1,176 +0,0 @@ - - - - - kidentitymanagement-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:library - KDE PIM libraries - Library for the KDE-PIM(Personal-Infomation-Management - mirrors://kde/stable/release-service/24.12.1/src/kidentitymanagement-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kpimtextedit-kf6-devel - kio-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kitemmodels-kf6-devel - ktextaddons-kf6-devel - kpimtextedit-kf6-devel - kunitconversion-kf6-devel - kpimtextedit-kf6-devel - extra-cmake-modules-kf6 - python-devel - kiconthemes-kf6-devel - - kirigami-kf6-devel - kirigami-addons-kf6 - - - - - kidentitymanagement-kf6 - - qt6-base - kpimtextedit-kf6 - kio-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kiconthemes-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - ktextwidgets-kf6 - kwidgetsaddons-kf6 - kpimtextedit-kf6 - - ktextaddons-kf6 - kirigami-kf6 - kirigami-addons-kf6 - - - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - kidentitymanagement-kf6-devel - Development files for kidentitymanagement-kf6 - - qt6-base-devel - kpimtextedit-kf6-devel - ktextwidgets-kf6-devel - kidentitymanagement-kf6 - - - /etc/xdg - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kig-kf6/actions.py b/desktop/kde6/applications/kig-kf6/actions.py deleted file mode 100755 index 9c77d63c17..0000000000 --- a/desktop/kde6/applications/kig-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import kde5 - - -def setup(): - # kde6.configure() - kde5.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kig-kf6/pspec.xml b/desktop/kde6/applications/kig-kf6/pspec.xml deleted file mode 100755 index 38e5076876..0000000000 --- a/desktop/kde6/applications/kig-kf6/pspec.xml +++ /dev/null @@ -1,153 +0,0 @@ - - - - - kig-kf6 - https://www.kde.org/applications/education/kig/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kig-kf6 - app:gui - desktop.kde.edu - An interactive geometry application - kig-kf6 is an application for interactive geometry. - mirrors://kde/stable/release-service/24.12.1/src/kig-24.12.1.tar.xz - - extra-cmake-modules - qt5-base-devel - qt5-svg-devel - boost-devel - ktexteditor5-devel - kdoctools5-devel - kemoticons5-devel - kitemmodels5-devel - qt5-xmlpatterns-devel - gettext-devel - pkgconfig - kcrash5-devel - karchive5-devel - - - - - kig-kf6 - - qt5-base - boost-python3 - kcrash5 - ktexteditor5 - qt5-xmlpatterns - qt5-svg - ki18n5 - kparts5 - ktexteditor5 - kiconthemes5 - kconfigwidgets5 - karchive5 - kxmlgui5 - libgcc - kcompletion5 - kcoreaddons5 - kwidgetsaddons5 - kconfig5 - - - /usr/lib - /usr/lib/qt6 - /usr/share/man - /usr/share/doc - /usr/bin - /usr/share - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kig-kf6/translations.xml b/desktop/kde6/applications/kig-kf6/translations.xml deleted file mode 100755 index bf7b15fc16..0000000000 --- a/desktop/kde6/applications/kig-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kig-kf6 - Bir etkileşimli geometri uygulaması - kig-kf6, bir etkileşimli geometri uygulamasıdır. - - diff --git a/desktop/kde6/applications/killbots-kf6/actions.py b/desktop/kde6/applications/killbots-kf6/actions.py deleted file mode 100755 index 0374af291e..0000000000 --- a/desktop/kde6/applications/killbots-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/killbots-kf6/pspec.xml b/desktop/kde6/applications/killbots-kf6/pspec.xml deleted file mode 100755 index 708d5d7ea1..0000000000 --- a/desktop/kde6/applications/killbots-kf6/pspec.xml +++ /dev/null @@ -1,154 +0,0 @@ - - - - - killbots-kf6 - https://www.kde.org/applications/games/killbots/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - killbots-kf6 - app:gui - desktop.kde.games - Run for your life - killbots-kf6 is a simple game of evading killer robots. Who created the robots and why they have been programmed to destroy, no one knows. All that is known is that the robots are numerous and their sole objective is to destroy you. - mirrors://kde/stable/release-service/24.12.1/src/killbots-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - kcompletion-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - - - kdoctools-kf6-devel - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - - - - - killbots-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/killbots-kf6/translations.xml b/desktop/kde6/applications/killbots-kf6/translations.xml deleted file mode 100755 index 042eb42c5e..0000000000 --- a/desktop/kde6/applications/killbots-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - killbots-kf6 - Hayatta kalmak için kaçın - killbots-kf6 katil robotlardan kaçmaya çalıştığınız basit bir oyundur. Robotların kimin tarafından yaratıldığı veya neden yok etmek için programlandığı bilinmiyor. Tek gerçek şu ki bir çok robot var ve tek amaçları sizi yok etmek. - - diff --git a/desktop/kde6/applications/kimap-kf6/actions.py b/desktop/kde6/applications/kimap-kf6/actions.py deleted file mode 100755 index 490521a82c..0000000000 --- a/desktop/kde6/applications/kimap-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/applications/kimap-kf6/files/qt5.patch b/desktop/kde6/applications/kimap-kf6/files/qt5.patch deleted file mode 100755 index f77ed6019e..0000000000 --- a/desktop/kde6/applications/kimap-kf6/files/qt5.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -Nuar a/src/loginjob.cpp b/src/loginjob.cpp ---- a/src/loginjob.cpp 2017-12-04 13:20:25.000000000 +0300 -+++ b/src/loginjob.cpp 2017-12-16 15:57:30.307129526 +0300 -@@ -425,7 +425,9 @@ - case LoginJobPrivate::Authenticate: - sasl_dispose(&d->conn); //SASL authentication done - // Fall through -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - case LoginJobPrivate::Login: - d->saveServerGreeting(response); - emitResult(); //got an OK, command done diff --git a/desktop/kde6/applications/kimap-kf6/pspec.xml b/desktop/kde6/applications/kimap-kf6/pspec.xml deleted file mode 100755 index 69b632c64c..0000000000 --- a/desktop/kde6/applications/kimap-kf6/pspec.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - - - kimap-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - Job-based API for interacting with IMAP servers - API for interacting with IMAP servers - mirrors://kde/stable/release-service/24.12.1/src/kimap-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kmime-kf6-devel - boost-devel - kio-kf6-devel - ki18n-kf6-devel - kcoreaddons-kf6-devel - kitemmodels-kf6-devel - cyrus-sasl-devel - kunitconversion-kf6-devel - extra-cmake-modules-kf6 - - - - - - - - kimap-kf6 - - qt6-base - kmime-kf6 - kio-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - cyrus-sasl - kcoreaddons-kf6 - - - /etc/xdg - /usr/lib/qt6 - /usr/lib - /usr/share/doc - /usr/share/locale - /usr/share - - - - - kimap-kf6-devel - Development files for kimap-kf6 - - qt6-base-devel - kimap-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kio-admin-kf6/actions.py b/desktop/kde6/applications/kio-admin-kf6/actions.py deleted file mode 100644 index 0eef11c64c..0000000000 --- a/desktop/kde6/applications/kio-admin-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/applications/kio-admin-kf6/pspec.xml b/desktop/kde6/applications/kio-admin-kf6/pspec.xml deleted file mode 100644 index 38e6688a8c..0000000000 --- a/desktop/kde6/applications/kio-admin-kf6/pspec.xml +++ /dev/null @@ -1,138 +0,0 @@ - - - - - kio-admin-kf6 - https://invent.kde.org/system/kio-admin-kf6 - - PisiLinux Community - admins@pisilinux.org - - FDL - app - Manage files as administrator using the admin:// kio-kf6 protocol - kio-admin-kf6 - Admin:// kio-kf6 protokolünü kullanarak dosyaları yönetici olarak yönetin - https://download.kde.org/stable/release-service/24.12.1/src/kio-admin-24.12.1.tar.xz - - kio-kf6-devel - ki18n-kf6-devel - qt6-base-devel - polkit-qt6-devel - kcoreaddons-kf6-devel - extra-cmake-modules-kf6 - - - - - - kio-admin-kf6 - - kio-kf6 - ki18n-kf6 - qt6-base - polkit-qt6 - kcoreaddons-kf6 - - - /usr/lib - /usr/share/polkit-1 - /usr/share/dbus-1 - /usr/share/locale - /usr/share/metainfo - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kio-admin-kf6/translations.xml b/desktop/kde6/applications/kio-admin-kf6/translations.xml deleted file mode 100644 index 11e4b77d06..0000000000 --- a/desktop/kde6/applications/kio-admin-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kio-admin-kf6 - Manage files as administrator using the admin:// kio-kf6 protocol - Admin:// kio-kf6 protokolünü kullanarak dosyaları yönetici olarak yönetin - - diff --git a/desktop/kde6/applications/kio-extras-kf6/actions.py b/desktop/kde6/applications/kio-extras-kf6/actions.py deleted file mode 100755 index 8a12549365..0000000000 --- a/desktop/kde6/applications/kio-extras-kf6/actions.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - - -def setup(): - # shelltools.system("sed -e 's|KF6ActivitiesStats ${KF_MIN_VERSION}|KF6ActivitiesStats|' -i CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - # kio - pisitools.remove("/usr/share/applications/kcm_trash.desktop") - - pisitools.dodoc("DESIGN", "DEBUG.howto") diff --git a/desktop/kde6/applications/kio-extras-kf6/pspec.xml b/desktop/kde6/applications/kio-extras-kf6/pspec.xml deleted file mode 100755 index a9ec1f88e9..0000000000 --- a/desktop/kde6/applications/kio-extras-kf6/pspec.xml +++ /dev/null @@ -1,226 +0,0 @@ - - - - - kio-extras-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.network - Additional kio-kf6-slaves for kde6 applications - Additional kio-kf6-slaves for kde6 applications - mirrors://kde/stable/release-service/24.12.1/src/kio-extras-24.12.1.tar.xz - - qt6-phonon-devel - extra-cmake-modules-kf6 - karchive-kf6-devel - kbookmarks-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kdnssd-kf6-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kpty-kf6-devel - solid-kf6-devel - syntax-highlighting-kf6-devel - qt6-sql-postgresql - qt6-base-devel - qt6-sql-sqlite - qt6-sql-mysql - qt6-sql-odbc - qt6-svg-devel - qt6-5compat-devel - libssh - kded-kf6-devel - gperf - samba-devel - taglib-devel - libssh-devel - libmtp-devel - openexr-devel - plasma-activities-kf6-devel - qcoro-qt6-devel - kdsoap6-devel - libXcursor-devel - plasma-activities-stats-kf6-devel - libtirpc-devel - libappimage-devel - libkexiv2-kf6-devel - libplist-devel - kcmutils-kf6-devel - ktextwidgets-kf6-devel - libimobiledevice-devel - kdsoap-ws-discovery-client-devel - - - - - kio-extras-kf6 - - kio-kf6 - kpty-kf6 - qcoro-qt6 - ki18n-kf6 - samba - solid-kf6 - kdnssd-kf6 - kparts-kf6 - libgcc - libmtp - libssh - taglib - kdsoap6 - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - libtirpc - karchive-kf6 - kservice-kf6 - qt6-base - libXcursor - kbookmarks-kf6 - kguiaddons-kf6 - qt6-phonon - plasma-activities-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - openexr-libs - qt6-sql-odbc - qt6-sql-mysql - qt6-sql-sqlite - qt6-5compat - kconfigwidgets-kf6 - libappimage - plasma-activities-stats-kf6 - qt6-sql-postgresql - syntax-highlighting-kf6 - kded-kf6 - libplist - kcmutils-kf6 - ktextwidgets-kf6 - libimobiledevice - kwidgetsaddons-kf6 - kdsoap-ws-discovery-client - - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - kio-extras-kf6-devel - Development files for kio-extras-kf6 - - kio-extras-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kio-gdrive-kf6/actions.py b/desktop/kde6/applications/kio-gdrive-kf6/actions.py deleted file mode 100644 index 7fb2262b45..0000000000 --- a/desktop/kde6/applications/kio-gdrive-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("COPYING", "README.md") - diff --git a/desktop/kde6/applications/kio-gdrive-kf6/pspec.xml b/desktop/kde6/applications/kio-gdrive-kf6/pspec.xml deleted file mode 100644 index 26c9bbada1..0000000000 --- a/desktop/kde6/applications/kio-gdrive-kf6/pspec.xml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - kio-gdrive-kf6 - https://projects.kde.org/kio-gdrive-kf6 - - Stefan Gronewold - groni@pisilinux.org - - GPL - Provides support for secure credentials storage - kio-kf6 Slave to access Google Drive - mirrors://kde/stable/release-service/24.12.1/src/kio-gdrive-24.12.1.tar.xz - - intltool - kio-kf6-devel - ki18n-kf6-devel - - purpose-kf6-devel - libkgapi-kf6-devel - qt6-base-devel - - kdoctools-kf6-devel - kitemmodels-kf6-devel - kcoreaddons-kf6-devel - qt6-keychain-devel - extra-cmake-modules-kf6 - kaccounts-providers-kf6 - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - libaccounts-qt6-devel - kunitconversion-kf6-devel - libaccounts-glib-devel - kaccounts-integration-kf6-devel - - - - - kio-gdrive-kf6 - kio-kf6 Slave to access Google Drive - - kio-kf6 - ki18n-kf6 - libgcc - purpose-kf6 - libkgapi-kf6 - qt6-base - kcoreaddons-kf6 - qt6-keychain - knotifications-kf6 - kwidgetsaddons-kf6 - libaccounts-qt6 - kaccounts-providers-kf6 - kaccounts-integration-kf6 - - - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kio-gdrive-kf6/translations.xml b/desktop/kde6/applications/kio-gdrive-kf6/translations.xml deleted file mode 100644 index fb9e4a90fa..0000000000 --- a/desktop/kde6/applications/kio-gdrive-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kio-gdrive-kf6 - Google Drive'a erişmek için kio-kf6 Slave - Google Drive'a erişmek için kio-kf6 Slave - - diff --git a/desktop/kde6/applications/kio-zeroconf-kf6/actions.py b/desktop/kde6/applications/kio-zeroconf-kf6/actions.py deleted file mode 100644 index 9cb5146c65..0000000000 --- a/desktop/kde6/applications/kio-zeroconf-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kio-zeroconf-kf6/pspec.xml b/desktop/kde6/applications/kio-zeroconf-kf6/pspec.xml deleted file mode 100644 index 4cc9bd47a8..0000000000 --- a/desktop/kde6/applications/kio-zeroconf-kf6/pspec.xml +++ /dev/null @@ -1,143 +0,0 @@ - - - - - kio-zeroconf-kf6 - https://apps.kde.org/zeroconf_ioslave/ - - Pisi Linux Admins - admin@pisilinux.org - - FDL,GPL - app - Network Monitor for DNS-SD services (Zeroconf) - DNS-SD hizmetleri için Ağ İzleyicisi - https://download.kde.org/stable/release-service/24.12.1/src/kio-zeroconf-24.12.1.tar.xz - - kio-kf6-devel - ki18n-kf6-devel - kdnssd-kf6-devel - qt6-base-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - extra-cmake-modules-kf6 - - - - - - kio-zeroconf-kf6 - - zeroconf-ioslave - - - zeroconf-ioslave - - - kio-kf6 - ki18n-kf6 - kdnssd-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - - - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kio-zeroconf-kf6/translations.xml b/desktop/kde6/applications/kio-zeroconf-kf6/translations.xml deleted file mode 100644 index aafac92f82..0000000000 --- a/desktop/kde6/applications/kio-zeroconf-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - zeroconf-ioslave - Network Monitor for DNS-SD services (Zeroconf) - DNS-SD hizmetleri için Ağ İzleyicisi - - diff --git a/desktop/kde6/applications/kiriki-kf6/actions.py b/desktop/kde6/applications/kiriki-kf6/actions.py deleted file mode 100755 index d0b3123c8f..0000000000 --- a/desktop/kde6/applications/kiriki-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*") diff --git a/desktop/kde6/applications/kiriki-kf6/pspec.xml b/desktop/kde6/applications/kiriki-kf6/pspec.xml deleted file mode 100755 index 3a821ae774..0000000000 --- a/desktop/kde6/applications/kiriki-kf6/pspec.xml +++ /dev/null @@ -1,149 +0,0 @@ - - - - - kiriki-kf6 - https://www.kde.org/applications/games/kiriki/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kiriki-kf6 - app:gui - desktop.kde.games - Yahtzee like dice game - kiriki-kf6 is an addictive and fun dice game for KDE, designed to be played by as many as six players. - mirrors://kde/stable/release-service/24.12.1/src/kiriki-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - - - - kiriki-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kiriki-kf6/translations.xml b/desktop/kde6/applications/kiriki-kf6/translations.xml deleted file mode 100755 index 4e4dbad801..0000000000 --- a/desktop/kde6/applications/kiriki-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kiriki-kf6 - Yahtzee benzeri zar oyunu - kiriki-kf6 KDE için alışkanlık yapan ve eğlenceli bir zar oyunudur. Altı oyuncuya kadar birlikte oynanabilir. - - diff --git a/desktop/kde6/applications/kiten-kf6/actions.py b/desktop/kde6/applications/kiten-kf6/actions.py deleted file mode 100755 index 529afeb2ac..0000000000 --- a/desktop/kde6/applications/kiten-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("AUTHORS", "COPYING*", "README*") diff --git a/desktop/kde6/applications/kiten-kf6/pspec.xml b/desktop/kde6/applications/kiten-kf6/pspec.xml deleted file mode 100755 index 72f85e465c..0000000000 --- a/desktop/kde6/applications/kiten-kf6/pspec.xml +++ /dev/null @@ -1,167 +0,0 @@ - - - - - kiten-kf6 - https://www.kde.org/applications/education/kiten/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kiten-kf6>kiten-kf6 - app:gui - desktop.kde.edu - A Japanese reference/study tool - kiten-kf6 is a Japanese reference/study tool. - mirrors://kde/stable/release-service/24.12.1/src/kiten-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - karchive-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kdoctools-kf6-devel - gettext-devel - ki18n-kf6-devel - - kxmlgui-kf6-devel - kio-kf6-devel - kparts-kf6-devel - kcrash-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - - - - - kiten-kf6 - - qt6-base - karchive-kf6 - kcompletion-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kcoreaddons-kf6 - kdoctools-kf6 - gettext - ki18n-kf6 - - kxmlgui-kf6 - kio-kf6 - kparts-kf6 - libgcc - kcrash-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - /usr/lib - /usr/share/doc - /usr/bin - /usr/share - - - - - kiten-kf6-devel - Development files for kiten-kf6 - - kiten-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kiten-kf6/translations.xml b/desktop/kde6/applications/kiten-kf6/translations.xml deleted file mode 100755 index 09719af724..0000000000 --- a/desktop/kde6/applications/kiten-kf6/translations.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - kiten-kf6 - Japonca referans ve alıştırma uygulaması - kiten-kf6, Japonca referans ve alıştırma uygulamasıdır. - - - - kiten-kf6-devel - kiten-kf6 için geliştirme dosyaları - - diff --git a/desktop/kde6/applications/kitinerary-kf6/actions.py b/desktop/kde6/applications/kitinerary-kf6/actions.py deleted file mode 100755 index dd3d84e185..0000000000 --- a/desktop/kde6/applications/kitinerary-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*") diff --git a/desktop/kde6/applications/kitinerary-kf6/pspec.xml b/desktop/kde6/applications/kitinerary-kf6/pspec.xml deleted file mode 100755 index cec3b638bf..0000000000 --- a/desktop/kde6/applications/kitinerary-kf6/pspec.xml +++ /dev/null @@ -1,171 +0,0 @@ - - - - - kitinerary-kf6 - https://download.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - Data model and extraction system for travel reservation information - Seyahat rezervasyon bilgisi için veri modeli ve ekstraksiyon sistemi - https://download.kde.org/stable/release-service/24.12.1/src/kitinerary-24.12.1.tar.xz - - qt6-declarative-devel - qt6-base-devel - kcoreaddons-kf6-devel - poppler-cpp-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - libxml2-devel - kpkpass-kf6-devel - poppler-qt6-devel - ki18n-kf6-devel - kmime-kf6-devel - zlib-devel - kconfig-kf6-devel - kcodecs-kf6-devel - karchive-kf6-devel - extra-cmake-modules-kf6 - openssl-devel - zxing-cpp-devel - - - - - - kitinerary-kf6 - - zlib - ki18n-kf6 - kmime-kf6 - libgcc - kpkpass-kf6 - kcodecs-kf6 - poppler-qt6 - kcalendarcore-kf6 - kconfig-kf6 - kcontacts-kf6 - karchive-kf6 - libxml2 - openssl - zxing-cpp - qt6-base - qt6-declarative - - - /etc/xdg - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - - - kitinerary-kf6-devel - Development files for kitinerary-kf6 - - kitinerary-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kitinerary-kf6/translations.xml b/desktop/kde6/applications/kitinerary-kf6/translations.xml deleted file mode 100755 index fb7b95a3c5..0000000000 --- a/desktop/kde6/applications/kitinerary-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kitinerary-kf6 - Data model and extraction system for travel reservation information - Seyahat rezervasyon bilgisi için veri modeli ve ekstraksiyon sistemi - - diff --git a/desktop/kde6/applications/kjumpingcube-kf6/actions.py b/desktop/kde6/applications/kjumpingcube-kf6/actions.py deleted file mode 100755 index 0374af291e..0000000000 --- a/desktop/kde6/applications/kjumpingcube-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kjumpingcube-kf6/pspec.xml b/desktop/kde6/applications/kjumpingcube-kf6/pspec.xml deleted file mode 100755 index eb0b342dbc..0000000000 --- a/desktop/kde6/applications/kjumpingcube-kf6/pspec.xml +++ /dev/null @@ -1,153 +0,0 @@ - - - - - kjumpingcube-kf6 - https://www.kde.org/applications/games/kjumpingcube/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kjumpingcube-kf6 - app:gui - desktop.kde.games - Territory capture game - kjumpingcube-kf6 is a simple tactical game. - mirrors://kde/stable/release-service/24.12.1/src/kjumpingcube-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kitemmodels-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - knewstuff-kf6-devel - - kdoctools-kf6-devel - kunitconversion-kf6-devel - libkdegames-kf6-devel - - - - - kjumpingcube-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - kcoreaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - /etc/xdg/kjumpingcube-kf6.categories - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kjumpingcube-kf6/translations.xml b/desktop/kde6/applications/kjumpingcube-kf6/translations.xml deleted file mode 100755 index 863e5f80d7..0000000000 --- a/desktop/kde6/applications/kjumpingcube-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kjumpingcube-kf6 - Alan kapma oyunu - kjumpingcube-kf6 basit bir taktik oyunudur. - - diff --git a/desktop/kde6/applications/kldap-kf6/actions.py b/desktop/kde6/applications/kldap-kf6/actions.py deleted file mode 100755 index 120217881d..0000000000 --- a/desktop/kde6/applications/kldap-kf6/actions.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/applications/kldap-kf6/pspec.xml b/desktop/kde6/applications/kldap-kf6/pspec.xml deleted file mode 100755 index 85d15e8ab4..0000000000 --- a/desktop/kde6/applications/kldap-kf6/pspec.xml +++ /dev/null @@ -1,160 +0,0 @@ - - - - - kldap-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - LDAP access API for KDE - Allows LDAP accessing with a convenient Qt style C++ API. - mirrors://kde/stable/release-service/24.12.1/src/kldap-24.12.1.tar.xz - - qt6-base-devel - kcompletion-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kmbox-kf6-devel - kmime-kf6-devel - kwallet-kf6-devel - openldap-server - cyrus-sasl-devel - extra-cmake-modules-kf6 - qt6-keychain-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - - - - - kldap-kf6 - - qt6-base - kcompletion-kf6 - kwallet-kf6 - ki18n-kf6 - kio-kf6 - libgcc - cyrus-sasl - openldap-client - kwidgetsaddons-kf6 - qt6-keychain - kconfig-kf6 - kcoreaddons-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - kldap-kf6-devel - Development files for kdelibs4-support - - qt6-base-devel - kldap-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kleopatra-kf6/actions.py b/desktop/kde6/applications/kleopatra-kf6/actions.py deleted file mode 100755 index 8c7fdd8a05..0000000000 --- a/desktop/kde6/applications/kleopatra-kf6/actions.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kleopatra-kf6/files/qt5.patch b/desktop/kde6/applications/kleopatra-kf6/files/qt5.patch deleted file mode 100755 index df08582768..0000000000 --- a/desktop/kde6/applications/kleopatra-kf6/files/qt5.patch +++ /dev/null @@ -1,35 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:01:41.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 23:06:41.830377891 +0300 -@@ -12,7 +12,7 @@ - set(KF5_VERSION "5.39.0") - set(kmime-kf6_VERSION "5.7.0") - set(libkleo-kf6_VERSION "5.7.0") --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - set(GPGME_REQUIRED_VERSION "1.8.0") - - find_package(ECM ${KF5_VERSION} CONFIG REQUIRED) -diff -Nuar a/src/utils/systemtrayicon.cpp b/src/utils/systemtrayicon.cpp ---- a/src/utils/systemtrayicon.cpp 2017-12-06 14:46:42.000000000 +0300 -+++ b/src/utils/systemtrayicon.cpp 2017-12-16 23:14:33.923343827 +0300 -@@ -174,7 +174,9 @@ - case QEvent::Close: - doMainWindowClosed(static_cast(o)); - // fall through: -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - case QEvent::Show: - case QEvent::DeferredDelete: - QMetaObject::invokeMethod(this, "slotEnableDisableActions", Qt::QueuedConnection); -@@ -185,7 +187,9 @@ - case QEvent::Close: - doAttentionWindowClosed(static_cast(o)); - // fall through: -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - case QEvent::Show: - case QEvent::DeferredDelete: - QMetaObject::invokeMethod(this, "slotEnableDisableActions", Qt::QueuedConnection); diff --git a/desktop/kde6/applications/kleopatra-kf6/pspec.xml b/desktop/kde6/applications/kleopatra-kf6/pspec.xml deleted file mode 100755 index 2c904e7925..0000000000 --- a/desktop/kde6/applications/kleopatra-kf6/pspec.xml +++ /dev/null @@ -1,178 +0,0 @@ - - - kleopatra-kf6 - https://www.kde.org/applications/utilities/kleopatra/ - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - FDL-1.1 - LGPLv2 - app:gui - Certificate Manager and Unified Crypto GUI - kleopatra-kf6 is a certificate manager and a universal crypto GUI. It supports managing X.509 and OpenPGP certificates in the GpgSM keybox and retrieving certificates from LDAP servers. - mirrors://kde/stable/release-service/24.12.1/src/kleopatra-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - kguiaddons-kf6-devel - kdbusaddons-kf6-devel - kcmutils-kf6-devel - libkleo-kf6-devel - kdoctools-kf6-devel - - kmime-kf6-devel - mimetreeparser-devel - libassuan-devel - gpgme-devel - gpgme-qt6-devel - - kitemmodels-kf6-devel - ktextwidgets-kf6-devel - knotifications-kf6-devel - kstatusnotifieritem-kf6-devel - kidentitymanagement-kf6-devel - kmailtransport-kf6-devel - akonadi-mime-kf6-devel - akonadi-kf6-devel - - - - - - - - kleopatra-kf6 - Certificate Manager and Unified Crypto GUI - - gpgme - kio-kf6 - ki18n-kf6 - kmime-kf6 - libgcc - - kconfig-kf6 - kxmlgui-kf6 - libkleo-kf6 - kcmutils-kf6 - kguiaddons-kf6 - qt6-base - libassuan - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - libgpg-error - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - mimetreeparser - - - /usr/bin - /etc - /usr/lib - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/klettres-kf6/actions.py b/desktop/kde6/applications/klettres-kf6/actions.py deleted file mode 100755 index 05ac489b79..0000000000 --- a/desktop/kde6/applications/klettres-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("AUTHORS", "ChangeLog", "COPYING*", "README*", "TODO") diff --git a/desktop/kde6/applications/klettres-kf6/pspec.xml b/desktop/kde6/applications/klettres-kf6/pspec.xml deleted file mode 100755 index 7bee5f6144..0000000000 --- a/desktop/kde6/applications/klettres-kf6/pspec.xml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - klettres-kf6 - https://www.kde.org/applications/education/klettres/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - klettres-kf6 - app:gui - desktop.kde.edu - An alphabet learning application - klettres-kf6 is an application specially designed to help the user to learn alphabet in a new language and then to learn to read simple syllables. The user can be a young child aged from two and a half or an adult that wants to learn the basics of a foreign language. - mirrors://kde/stable/release-service/24.12.1/src/klettres-24.12.1.tar.xz - - qt6-base-devel - qt6-svg-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - kcompletion-kf6-devel - - kitemmodels-kf6-devel - ki18n-kf6-devel - knewstuff-kf6-devel - kwidgetsaddons-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - kcrash-kf6-devel - qt6-phonon-devel - kpackage-kf6-devel - - - - - klettres-kf6 - - qt6-base - qt6-svg - qt6-phonon - knewstuff-kf6 - ki18n-kf6 - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - libgcc - - - /usr/share/doc - /usr/bin - /usr/share - /etc/xdg - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/klettres-kf6/translations.xml b/desktop/kde6/applications/klettres-kf6/translations.xml deleted file mode 100755 index d21a24924e..0000000000 --- a/desktop/kde6/applications/klettres-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - klettres-kf6 - Alfabe öğrenme uygulaması - klettres-kf6, kullanıcının yeni bir alfabeyi ve basit sesli sözleri öğrenmesi için geliştirilmiş bir uygulamadır. İki buçuk yaşındaki bir çocuk için yararlı olabileceği gibi, yeni bir dil öğrenen yetişkinler için de yardımcı olabilir. - - diff --git a/desktop/kde6/applications/klickety-kf6/actions.py b/desktop/kde6/applications/klickety-kf6/actions.py deleted file mode 100755 index 0374af291e..0000000000 --- a/desktop/kde6/applications/klickety-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/klickety-kf6/pspec.xml b/desktop/kde6/applications/klickety-kf6/pspec.xml deleted file mode 100755 index f65576a3e1..0000000000 --- a/desktop/kde6/applications/klickety-kf6/pspec.xml +++ /dev/null @@ -1,158 +0,0 @@ - - - - - klickety-kf6 - http://games.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - klickety-kf6 - app:gui - desktop.kde.games - A kind of solitary game - klickety-kf6 is a kind of solitary game that takes place on a Tetris-like board. - mirrors://kde/stable/release-service/24.12.1/src/klickety-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - kdoctools-kf6-devel - knotifyconfig-kf6-devel - kdbusaddons-kf6-devel - knotifications-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - - - - klickety-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - knotifyconfig-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/share/applications - /usr/share/icons - /usr/share/kconf_update - /usr/share/klickety - /usr/share/knotifications-kf65 - /usr/share/metainfo - /usr/share/kxmlgui-kf65 - /usr/share/sounds - /usr/share/doc - /usr/share/locale - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/klickety-kf6/translations.xml b/desktop/kde6/applications/klickety-kf6/translations.xml deleted file mode 100755 index 411d15d4e8..0000000000 --- a/desktop/kde6/applications/klickety-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - klickety-kf6 - Bir tür soliter oyunu - klickety-kf6 Tetris gibi tahta üzerinde yer alan bir tür soliter oyunu - - diff --git a/desktop/kde6/applications/klines-kf6/actions.py b/desktop/kde6/applications/klines-kf6/actions.py deleted file mode 100755 index 0374af291e..0000000000 --- a/desktop/kde6/applications/klines-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/klines-kf6/pspec.xml b/desktop/kde6/applications/klines-kf6/pspec.xml deleted file mode 100755 index ce6890a3c3..0000000000 --- a/desktop/kde6/applications/klines-kf6/pspec.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - klines-kf6 - https://www.kde.org/applications/games/klines/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - klines-kf6 - app:gui - desktop.kde.games - Kolor Lines - Kolor Lines is a simple but highly addictive, one player game for KDE. Kolor Lines has been inspired by well known game of Color Lines. The goal of Kolor Lines is quite plain. The player has to move the colored balls around the game board, gathering them into the lines of the same color by five. - mirrors://kde/stable/release-service/24.12.1/src/klines-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kservice-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - libkdegames-kf6-devel - - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - - - - klines-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/klines-kf6/translations.xml b/desktop/kde6/applications/klines-kf6/translations.xml deleted file mode 100755 index 3b955b2145..0000000000 --- a/desktop/kde6/applications/klines-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - klines-kf6 - Renkli çizgiler - Kolor Lines basit ama bağımlılık yapıcı bir oyundur. Dünyaca ünlü Color Lines'tan esinlenilen oyunda amacınız aynı renkli toplardan beş tanesini yan yana getirmektir. - - diff --git a/desktop/kde6/applications/kmahjongg-kf6/actions.py b/desktop/kde6/applications/kmahjongg-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/kmahjongg-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kmahjongg-kf6/pspec.xml b/desktop/kde6/applications/kmahjongg-kf6/pspec.xml deleted file mode 100755 index 57d24eb5da..0000000000 --- a/desktop/kde6/applications/kmahjongg-kf6/pspec.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - - - kmahjongg-kf6 - https://www.kde.org/applications/games/kmahjongg/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kmahjongg-kf6 - app:gui - desktop.kde.games - Mahjongg Solitaire - kmahjongg-kf6 is a fun board game created after the famous oriental game of Mahjong. Unlike the original however, kmahjongg-kf6 is a tile matching game for one or two players, a variation usually known as Mahjong Solitaire. - mirrors://kde/stable/release-service/24.12.1/src/kmahjongg-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-svg-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - kdoctools-kf6-devel - kcompletion-kf6-devel - knewstuff-kf6-devel - kxmlgui-kf6-devel - libkdegames-kf6-devel - libkmahjongg-kf6-devel - kcompletion-kf6-devel - qt6-declarative-devel - - - - - kmahjongg-kf6 - - ki18n-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - libkmahjongg-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - /etc/xdg/kmahjongg-kf6.categories - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kmahjongg-kf6/translations.xml b/desktop/kde6/applications/kmahjongg-kf6/translations.xml deleted file mode 100755 index 042e049cfb..0000000000 --- a/desktop/kde6/applications/kmahjongg-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kmahjongg-kf6 - Mahjongg oyunu - Mahjong Solitaire oyununa benzer kmahjongg-kf6 bir veya iki oyuncunun birlekte oynayabileceği bir parça eşleştirme oyunudur. - - diff --git a/desktop/kde6/applications/kmail-account-wizard-kf6/actions.py b/desktop/kde6/applications/kmail-account-wizard-kf6/actions.py deleted file mode 100755 index dc7d4ed6e8..0000000000 --- a/desktop/kde6/applications/kmail-account-wizard-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/kmail-account-wizard-kf6/pspec.xml b/desktop/kde6/applications/kmail-account-wizard-kf6/pspec.xml deleted file mode 100755 index 1837de2365..0000000000 --- a/desktop/kde6/applications/kmail-account-wizard-kf6/pspec.xml +++ /dev/null @@ -1,175 +0,0 @@ - - - - - kmail-account-wizard-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - kmail-kf6 Account Wizard - kmail-kf6 Account Wizard - mirrors://kde/stable/release-service/24.12.1/src/kmail-account-wizard-24.12.1.tar.xz - - gpgme-devel - gpgme-qt6-devel - extra-cmake-modules-kf6 - kcmutils-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - prison-kf6-devel - akonadi-kf6-devel - akonadi-search-kf6-devel - grantleetheme-kf6-devel - kpimtextedit-kf6-devel - libkdepim-kf6-devel - libkleo-kf6-devel - pimcommon-kf6-devel - qt6-base-devel - knotifyconfig-kf6-devel - ktexteditor-kf6-devel - kitemmodels-kf6-devel - akonadi-contacts-kf6-devel - kidentitymanagement-kf6-devel - kldap-kf6-devel - cyrus-sasl-devel - kmailtransport-kf6-devel - akonadi-mime-kf6-devel - mailcommon-kf6-devel - messagelib-kf6-devel - kimap-kf6-devel - - knewstuff-kf6-devel - knotifications-kf6-devel - - - - kmail-account-wizard-kf6 - kmail-kf6 Account Wizard - - kio-kf6 - gpgme - ki18n-kf6 - kldap-kf6 - kmime-kf6 - - kcrash-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - libkleo-kf6 - kcmutils-kf6 - qt6-base - knewstuff-kf6 - libkdepim-kf6 - kitemviews-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - akonadi-mime-kf6 - kmailtransport-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kidentitymanagement-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kmail-kf6/actions.py b/desktop/kde6/applications/kmail-kf6/actions.py deleted file mode 100755 index dc7d4ed6e8..0000000000 --- a/desktop/kde6/applications/kmail-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/kmail-kf6/pspec.xml b/desktop/kde6/applications/kmail-kf6/pspec.xml deleted file mode 100644 index 2850be4c23..0000000000 --- a/desktop/kde6/applications/kmail-kf6/pspec.xml +++ /dev/null @@ -1,236 +0,0 @@ - - - - - kmail-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - KDE mail client - kmail-kf6 is the email component of kontact-kf6, the integrated personal information manager from KDE. - https://download.kde.org/stable/release-service/24.12.1/src/kmail-24.12.1.tar.xz - - gpgme-devel - extra-cmake-modules-kf6 - kbookmarks-kf6-devel - kcmutils-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - knotifications-kf6-devel - knotifyconfig-kf6-devel - kparts-kf6-devel - kservice-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - sonnet-kf6-devel - akonadi-contacts-kf6-devel - akonadi-kf6-devel - akonadi-mime-kf6-devel - akonadi-search-kf6-devel - kcalendarcore-kf6-devel - kcalutils-kf6-devel - kcontacts-kf6-devel - kidentitymanagement-kf6-devel - kldap-kf6-devel - kmailtransport-kf6-devel - kmime-kf6-devel - kpimtextedit-kf6-devel - ktnef-kf6-devel - libgravatar-kf6 - - libkleo-kf6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - qt6-base-devel - qt6-webengine-devel - kitemmodels-kf6-devel - kstatusnotifieritem-kf6-devel - - kunitconversion-kf6-devel - cyrus-sasl-devel - kontactinterface-kf6-devel - libksieve-kf6-devel - mailcommon-kf6-devel - kimap-kf6-devel - libgravatar-kf6-devel - libkdepim-kf6-devel - syntax-highlighting-kf6-devel - gpgme-qt6-devel - ffmpeg-devel - libXScrnSaver-devel - akonadi-calendar-kf6-devel - akonadi-import-wizard-kf6-devel - qt6-keychain-devel - kuserfeedback-kf6-devel - - - - - kmail-kf6 - KDE mail client - - kio-kf6 - gpgme - ki18n-kf6 - kmime-kf6 - ktnef-kf6 - kcrash-kf6 - kparts-kf6 - libgcc - sonnet-kf6 - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - libkleo-kf6 - kcalendarcore-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - kcalutils-kf6 - kcontacts-kf6 - libkdepim-kf6 - libksieve-kf6 - pimcommon-kf6 - kbookmarks-kf6 - kguiaddons-kf6 - kitemviews-kf6 - mailcommon-kf6 - messagelib-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - libgravatar-kf6 - akonadi-mime-kf6 - kpimtextedit-kf6 - ktextwidgets-kf6 - knotifyconfig-kf6 - kwindowsystem-kf6 - akonadi-search-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - akonadi-contacts-kf6 - kontactinterface-kf6 - akonadi-calendar-kf6 - kidentitymanagement-kf6 - kmail-account-wizard-kf6 - akonadi-import-wizard-kf6 - qt6-keychain - kstatusnotifieritem-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kmailtransport-kf6/actions.py b/desktop/kde6/applications/kmailtransport-kf6/actions.py deleted file mode 100755 index 4957fa16c6..0000000000 --- a/desktop/kde6/applications/kmailtransport-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("TODO", "DESIGN") diff --git a/desktop/kde6/applications/kmailtransport-kf6/pspec.xml b/desktop/kde6/applications/kmailtransport-kf6/pspec.xml deleted file mode 100755 index 67f2d081a8..0000000000 --- a/desktop/kde6/applications/kmailtransport-kf6/pspec.xml +++ /dev/null @@ -1,176 +0,0 @@ - - - - - kmailtransport-kf6 - https://kde.org/ - - PisiLinux Community - admins@pisilinux.org - - LGPLv2.1 - akonadi - library - Mail Transport Service - Mail Transport Service - mirrors://kde/stable/release-service/24.12.1/src/kmailtransport-24.12.1.tar.xz - - qt6-base-devel - - - kdoctools-kf6-devel - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - kcmutils-kf6-devel - kmime-kf6-devel - akonadi-mime-kf6-devel - akonadi-kf6-devel - cyrus-sasl-devel - extra-cmake-modules-kf6 - boost-devel - ksmtp-kf6-devel - kwallet-kf6-devel - libkgapi-kf6-devel - qt6-keychain-devel - - - - - kmailtransport-kf6 - app:console - - qt6-base - ki18n-kf6 - ksmtp-kf6 - kio-kf6 - libgcc - kmime-kf6 - kconfig-kf6 - kwallet-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - akonadi-kf6 - cyrus-sasl - akonadi-mime-kf6 - libkgapi-kf6 - qt6-keychain - - - /etc/xdg - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/kservice-kf6s5 - /usr/share/doc/ - /usr/share/config.kcfg - /usr/share/locale - - - - - kmailtransport-kf6-devel - Development files for akonadi - - kmailtransport-kf6 - kwallet-kf6-devel - qt6-base-devel - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kmbox-kf6/actions.py b/desktop/kde6/applications/kmbox-kf6/actions.py deleted file mode 100755 index 490521a82c..0000000000 --- a/desktop/kde6/applications/kmbox-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/applications/kmbox-kf6/files/qt5.patch b/desktop/kde6/applications/kmbox-kf6/files/qt5.patch deleted file mode 100755 index 913586ef6b..0000000000 --- a/desktop/kde6/applications/kmbox-kf6/files/qt5.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -Nuar a/src/mbox_p.cpp b/src/mbox_p.cpp ---- a/src/mbox_p.cpp 2017-12-04 13:20:23.000000000 +0300 -+++ b/src/mbox_p.cpp 2017-12-16 16:10:23.271073753 +0300 -@@ -157,7 +157,9 @@ - *d++ = '>'; - } - // fall through -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - default: - onlyAnglesAfterLF = false; - break; diff --git a/desktop/kde6/applications/kmbox-kf6/pspec.xml b/desktop/kde6/applications/kmbox-kf6/pspec.xml deleted file mode 100755 index 4246d61c53..0000000000 --- a/desktop/kde6/applications/kmbox-kf6/pspec.xml +++ /dev/null @@ -1,146 +0,0 @@ - - - - - kmbox-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - MBox library support. - MBox library support. - mirrors://kde/stable/release-service/24.12.1/src/kmbox-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - kmime-kf6-devel - boost-devel - kcodecs-kf6-devel - - - - - - - - kmbox-kf6 - - qt6-base - kmime-kf6 - libgcc - - - /usr/share - /usr/share/locale - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - kmbox-kf6-devel - Development files for kmbox-kf6 - - qt6-base-devel - kmbox-kf6 - - - /etc/xdg - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kmime-kf6/actions.py b/desktop/kde6/applications/kmime-kf6/actions.py deleted file mode 100755 index ad67dd1d10..0000000000 --- a/desktop/kde6/applications/kmime-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("TODO", "README*") diff --git a/desktop/kde6/applications/kmime-kf6/files/qt5.patch b/desktop/kde6/applications/kmime-kf6/files/qt5.patch deleted file mode 100755 index 63bf2d2d8a..0000000000 --- a/desktop/kde6/applications/kmime-kf6/files/qt5.patch +++ /dev/null @@ -1,53 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:01:51.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-19 10:32:32.933843067 +0300 -@@ -22,7 +22,7 @@ - - - set(kmime-kf6_LIB_VERSION ${PIM_VERSION}) --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Core) - - ecm_setup_version(PROJECT VARIABLE_PREFIX kmime-kf6 -diff -Nuar a/src/kmime-kf6_header_parsing.cpp b/src/kmime-kf6_header_parsing.cpp ---- a/src/kmime-kf6_header_parsing.cpp 2017-12-02 10:23:33.000000000 +0300 -+++ b/src/kmime-kf6_header_parsing.cpp 2017-12-19 10:34:03.406836539 +0300 -@@ -452,7 +452,9 @@ - scursor = oldscursor; - } - // fall through -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - } - default: - kmime-kf6_WARN_IF_8BIT(ch); -@@ -636,7 +638,9 @@ - // parse as atom: - scursor = oldscursor; - } -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - // fall though... - - default: //atom -diff -Nuar a/src/kmime-kf6_util.cpp b/src/kmime-kf6_util.cpp ---- a/src/kmime-kf6_util.cpp 2017-12-02 10:23:33.000000000 +0300 -+++ b/src/kmime-kf6_util.cpp 2017-12-19 10:35:44.306829259 +0300 -@@ -98,10 +98,14 @@ - switch (cf.type()) { - case CharFreq::SevenBitText: - allowed << Headers::CE7Bit; -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - case CharFreq::EightBitText: - allowed << Headers::CE8Bit; -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - case CharFreq::SevenBitData: - if (cf.printableRatio() > 5.0 / 6.0) { - // let n the length of data and p the number of printable chars. diff --git a/desktop/kde6/applications/kmime-kf6/pspec.xml b/desktop/kde6/applications/kmime-kf6/pspec.xml deleted file mode 100755 index 39a88a2ad2..0000000000 --- a/desktop/kde6/applications/kmime-kf6/pspec.xml +++ /dev/null @@ -1,148 +0,0 @@ - - - - - kmime-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - KDE library for handling mail messages and newsgroup articles. - kmime-kf6 library for handling mail messages and newsgroup articles. - mirrors://kde/stable/release-service/24.12.1/src/kmime-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - boost-devel - ki18n-kf6-devel - kcodecs-kf6-devel - kdoctools-kf6-devel - - - - - - - - - kmime-kf6 - - qt6-base - ki18n-kf6 - kcodecs-kf6 - libgcc - - - /usr/share - /usr/share/locale - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - kmime-kf6-devel - Development files for kmime-kf6 - - qt6-base-devel - kmime-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kmines-kf6/actions.py b/desktop/kde6/applications/kmines-kf6/actions.py deleted file mode 100755 index 0374af291e..0000000000 --- a/desktop/kde6/applications/kmines-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kmines-kf6/pspec.xml b/desktop/kde6/applications/kmines-kf6/pspec.xml deleted file mode 100755 index d95e102f82..0000000000 --- a/desktop/kde6/applications/kmines-kf6/pspec.xml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - kmines-kf6 - https://www.kde.org/applications/games/kmines/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kmines-kf6 - app:gui - desktop.kde.games - Minesweeper like game - kmines-kf6 is the classic Minesweeper game. The idea is to uncover all the squares without blowing up any mines. When a mine is blown up, the game is over. - mirrors://kde/stable/release-service/24.12.1/src/kmines-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - - - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - - - - kmines-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kmines-kf6/translations.xml b/desktop/kde6/applications/kmines-kf6/translations.xml deleted file mode 100755 index efb44d6d76..0000000000 --- a/desktop/kde6/applications/kmines-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kmines-kf6 - Mayın tarlası oyunu - kmines-kf6 klasik mayın tarlası oyununun bir türevidir. Oyunun amacı hiç bir mayına denk gelmemeye çalışarak kutuları açmaktır. Eğer bir mayın patlarsa oyun biter. - - diff --git a/desktop/kde6/applications/kmix-kf6/actions.py b/desktop/kde6/applications/kmix-kf6/actions.py deleted file mode 100755 index 028a4716c1..0000000000 --- a/desktop/kde6/applications/kmix-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import kde5 - -NoStrip=["/usr/share"] - -def setup(): - # kde6.configure("-Dkmix-kf6_KF5_BUILD=ON") - kde5.configure("-Dkmix-kf6_KF5_BUILD=ON") - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/applications/kmix-kf6/pspec.xml b/desktop/kde6/applications/kmix-kf6/pspec.xml deleted file mode 100755 index 77f92c14fe..0000000000 --- a/desktop/kde6/applications/kmix-kf6/pspec.xml +++ /dev/null @@ -1,196 +0,0 @@ - - - - - kmix-kf6 - http://kde.org/applications/multimedia/kmix/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kmix-kf6 - app:gui - desktop.kde.multimedia - kmix-kf6: KDE Digital Mixer - kmix-kf6: KDE Digital Mixer - mirrors://kde/stable/release-service/24.12.1/src/kmix-24.12.1.tar.xz - - qt6-base-devel - kdoctools-devel - ki18n-devel - kcmutils-devel - kitemmodels-devel - kunitconversion-devel - libcanberra-devel - glib2-devel - solid-devel - alsa-lib-devel - kxmlgui-devel - knotifications-devel - kglobalaccel-devel - libplasma-devel - extra-cmake-modules - kstatusnotifieritem-devel - - - - - - - kmix-kf6 - - qt6-base - alsa-lib - libcanberra - pulseaudio-libs - ki18n-kf6 - kconfig-kf6 - kxmlgui-kf6 - solid-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kglobalaccel-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - libgcc - libplasma-kf6 - kstatusnotifieritem-kf6 - - - - - /etc - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - /usr/include - /usr/bin - - - - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kmix-kf6/translations.xml b/desktop/kde6/applications/kmix-kf6/translations.xml deleted file mode 100755 index 0c118c6326..0000000000 --- a/desktop/kde6/applications/kmix-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kmix-kf6 - kmix-kf6: KDE için Dijital Mixer - kmix-kf6: KDE için Dijital Mixer. - - diff --git a/desktop/kde6/applications/kmplot-kf6/actions.py b/desktop/kde6/applications/kmplot-kf6/actions.py deleted file mode 100755 index 5a0b867eec..0000000000 --- a/desktop/kde6/applications/kmplot-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kmplot-kf6/files/kmplot-isnan.patch b/desktop/kde6/applications/kmplot-kf6/files/kmplot-isnan.patch deleted file mode 100755 index 39e7cf254f..0000000000 --- a/desktop/kde6/applications/kmplot-kf6/files/kmplot-isnan.patch +++ /dev/null @@ -1,42 +0,0 @@ ---- kmplot-kf6-15.12.3/kmplot/view.cpp.0 2016-03-11 21:19:48.011194225 +0000 -+++ kmplot-kf6-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/desktop/kde6/applications/kmplot-kf6/pspec.xml b/desktop/kde6/applications/kmplot-kf6/pspec.xml deleted file mode 100755 index 1107b0d63e..0000000000 --- a/desktop/kde6/applications/kmplot-kf6/pspec.xml +++ /dev/null @@ -1,149 +0,0 @@ - - - kmplot-kf6 - http://kde.org/applications/education/kmplot/ - - Stefan Gronewold (groni) - groni@pisilinux.org - - FDL - GPL - LGPL - desktop.kde.edu - Mathematical Function Plotter - kmplot-kf6 is a program to draw graphs, their integrals or derivatives. It supports different systems of coordinates like the Cartesian or the polar coordinate system. The graphs can be colorized and the view is scalable, so that you are able to zoom to the level you need. - mirrors://kde/stable/release-service/24.12.1/src/kmplot-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kunitconversion-kf6-devel - kparts-kf6-devel - kwidgetsaddons-kf6-devel - kitemmodels-kf6-devel - qt6-base-devel - qt6-svg-devel - - - - - - - - kmplot-kf6 - Mathematical Function Plotter - - ki18n-kf6 - kparts-kf6 - kwidgetsaddons-kf6 - qt6-base - qt6-svg - libgcc - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - - - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - /usr/share/man - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/knavalbattle-kf6/actions.py b/desktop/kde6/applications/knavalbattle-kf6/actions.py deleted file mode 100755 index d6d99f057d..0000000000 --- a/desktop/kde6/applications/knavalbattle-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("AUTHORS", "COPYING*", "README*") diff --git a/desktop/kde6/applications/knavalbattle-kf6/pspec.xml b/desktop/kde6/applications/knavalbattle-kf6/pspec.xml deleted file mode 100755 index fc7f3a36b4..0000000000 --- a/desktop/kde6/applications/knavalbattle-kf6/pspec.xml +++ /dev/null @@ -1,154 +0,0 @@ - - - - - knavalbattle-kf6 - https://www.kde.org/applications/games/knavalbattle/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - knavalbattle-kf6 - app:gui - desktop.kde.games - Naval Battle game - knavalbattle-kf6 is a Battle Ship game for KDE. Ships are placed on a board which represents the sea. Players try to hit each others ships in turns without knowing where they are placed. The first player to destroy all ships wins the game. - mirrors://kde/stable/release-service/24.12.1/src/knavalbattle-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcrash-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kdnssd-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - kdoctools-kf6-devel - ktextwidgets-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - - - - knavalbattle-kf6 - - ki18n-kf6 - kdnssd-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - ktextwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/share/applications - /usr/share/icons - /usr/share/kconf_update - /usr/share/knavalbattle - /usr/share/kservice-kf6s5 - /usr/share/kxmlgui-kf65 - /usr/share/doc - /usr/share/locale - /usr/share/qlogging-categories6 - /usr/share/metainfo/org.kde.knavalbattle.appdata.xml - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/knavalbattle-kf6/translations.xml b/desktop/kde6/applications/knavalbattle-kf6/translations.xml deleted file mode 100755 index 86b953a5a6..0000000000 --- a/desktop/kde6/applications/knavalbattle-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - knavalbattle-kf6 - Amiral Battı oyunu - KBattleship KDE için bir Amiral Battı oyunudur. Gemiler denizi temsil eden oyun tahtasına yerleştirilir ve oyuncular rakiplerinin gemilerinin yerleşimini tahmin ederek gemileri vurmaya çalışır. Rakibinin tüm gemilerini daha önce batıran oyuncu kazanır. - - diff --git a/desktop/kde6/applications/knetwalk-kf6/actions.py b/desktop/kde6/applications/knetwalk-kf6/actions.py deleted file mode 100755 index 0374af291e..0000000000 --- a/desktop/kde6/applications/knetwalk-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/knetwalk-kf6/pspec.xml b/desktop/kde6/applications/knetwalk-kf6/pspec.xml deleted file mode 100755 index 9814d84ca6..0000000000 --- a/desktop/kde6/applications/knetwalk-kf6/pspec.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - knetwalk-kf6 - https://www.kde.org/applications/games/knetwalk/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - knetwalk-kf6 - app:gui - desktop.kde.games - Network construction game - knetwalk-kf6 is a single player logic game. The object of the game is to start the LAN, connecting all the terminals to the server, in as few turns as possible. - mirrors://kde/stable/release-service/24.12.1/src/knetwalk-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - - - kdoctools-kf6-devel - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - ktextwidgets-kf6-devel - - - - - knetwalk-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - ktextwidgets-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/knetwalk-kf6/translations.xml b/desktop/kde6/applications/knetwalk-kf6/translations.xml deleted file mode 100755 index 646be62853..0000000000 --- a/desktop/kde6/applications/knetwalk-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - knetwalk-kf6 - Ağ yapılandırma oyunu - knetwalk-kf6 bir ağ kurma oyunudur. Dunucularla istemcileri mümkün olan en az kaynakla birleştirmeye çalışmak oyunun amacıdır. Bağımlılık yapması olasıdır. - - diff --git a/desktop/kde6/applications/kollision-kf6/actions.py b/desktop/kde6/applications/kollision-kf6/actions.py deleted file mode 100755 index 0374af291e..0000000000 --- a/desktop/kde6/applications/kollision-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kollision-kf6/pspec.xml b/desktop/kde6/applications/kollision-kf6/pspec.xml deleted file mode 100755 index 0713d4485d..0000000000 --- a/desktop/kde6/applications/kollision-kf6/pspec.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - - - kollision-kf6 - https://www.kde.org/applications/games/kollision/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kollision-kf6 - app:gui - desktop.kde.games - A simple ball dodging game - kollision-kf6 is ball dodging game. Click on the empty field to start a game: a blue ball immediately replaces your mouse cursor, and a number of red balls start to fade into the field. - mirrors://kde/stable/release-service/24.12.1/src/kollision-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - knewstuff-kf6-devel - libkdegames-kf6-devel - - - kdoctools-kf6-devel - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - - - - - kollision-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kollision-kf6/translations.xml b/desktop/kde6/applications/kollision-kf6/translations.xml deleted file mode 100755 index f100087b68..0000000000 --- a/desktop/kde6/applications/kollision-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kollision-kf6 - Basit bir top sıçratma oyunu - kollision-kf6 basit bir top sıçratma oyunudur. Boş bir alana fareyle tıkladığınızda oyun başlar ve fare imlecinizin yerini mavi bir top alır, ayrıca olayların gelişmesine vesile olacak kırmızı toplar da alandaki yerlerini alırlar. - - diff --git a/desktop/kde6/applications/kolourpaint-kf6/actions.py b/desktop/kde6/applications/kolourpaint-kf6/actions.py deleted file mode 100755 index 7af4014787..0000000000 --- a/desktop/kde6/applications/kolourpaint-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import shelltools -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("AUTHORS", "ChangeLog", "COPYING*", "NEWS", "README.md") diff --git a/desktop/kde6/applications/kolourpaint-kf6/pspec.xml b/desktop/kde6/applications/kolourpaint-kf6/pspec.xml deleted file mode 100755 index 43c2e8a591..0000000000 --- a/desktop/kde6/applications/kolourpaint-kf6/pspec.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - kolourpaint-kf6 - http://kde.org/applications/graphics/kolourpaint-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kolourpaint-kf6 - app:gui - desktop.kde.graphics - An easy to use paint program - kolourpaint-kf6 is a simple painting program to quickly create raster images. It is useful as a touch-up tool and simple image editing tasks. - mirrors://kde/stable/release-service/24.12.1/src/kolourpaint-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - libkexiv2-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kguiaddons-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - ktextwidgets-kf6-devel - kjobwidgets-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - libksane-kf6-devel - - - - - kolourpaint-kf6 - - ki18n-kf6 - kio-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - qt6-base - kguiaddons-kf6 - libksane-kf6 - kjobwidgets-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - - /usr/bin - /usr/lib - /usr/share/applications - /usr/share/doc - /usr/share/icons/hicolor - /usr/share/kolourpaint/icons/ - /usr/share/kolourpaint-kf6 - /usr/share/kxmlgui-kf6 - /usr/share/metainfo - /usr/share/locale/ - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kolourpaint-kf6/translations.xml b/desktop/kde6/applications/kolourpaint-kf6/translations.xml deleted file mode 100755 index 12c5eae006..0000000000 --- a/desktop/kde6/applications/kolourpaint-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kolourpaint-kf6 - Kullanımı kolay bir çizim programı - kolourpaint-kf6, kullanımı kolay bir çizim programıdır. - - diff --git a/desktop/kde6/applications/kompare-kf6/actions.py b/desktop/kde6/applications/kompare-kf6/actions.py deleted file mode 100755 index fe0af98402..0000000000 --- a/desktop/kde6/applications/kompare-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README") diff --git a/desktop/kde6/applications/kompare-kf6/pspec.xml b/desktop/kde6/applications/kompare-kf6/pspec.xml deleted file mode 100755 index e12ca6c317..0000000000 --- a/desktop/kde6/applications/kompare-kf6/pspec.xml +++ /dev/null @@ -1,188 +0,0 @@ - - - - - kompare-kf6 - http://www.kde.org/ - - Pisi Linux Admins - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.sdk - File difference viewer - Diff/Patch Frontend. - mirrors://kde/stable/release-service/24.12.1/src/kompare-24.12.1.tar.xz - - extra-cmake-modules-kf6 - kdoctools-kf6-devel - qt6-base-devel - gettext-devel - libkomparediff2-kf6-devel - kcoreaddons-kf6-devel - kcodecs-kf6-devel - kiconthemes-kf6-devel - kjobwidgets-kf6-devel - kconfig-kf6-devel - kparts-kf6-devel - ktexteditor-kf6-devel - kwidgetsaddons-kf6-devel - - - - - - - kompare-kf6 - - qt6-base - libkomparediff2-kf6 - kio-kf6 - ki18n-kf6 - kparts-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - ktexteditor-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - - - kdesdk - - - kdesdk - - - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - /usr/bin - /usr/include - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kompare-kf6/translations.xml b/desktop/kde6/applications/kompare-kf6/translations.xml deleted file mode 100755 index b21e017389..0000000000 --- a/desktop/kde6/applications/kompare-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kompare-kf6 - Dosya karşılaştırma göstericisi. - Dosya karşılaştırma göstericisi. - - diff --git a/desktop/kde6/applications/konqueror-kf6/actions.py b/desktop/kde6/applications/konqueror-kf6/actions.py deleted file mode 100755 index f89f7fbe6e..0000000000 --- a/desktop/kde6/applications/konqueror-kf6/actions.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure("-DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_INSTALL_LIBDIR=lib \ - -DBUILD_TESTING=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("AUTHORS", "ChangeLog") - diff --git a/desktop/kde6/applications/konqueror-kf6/files/konquerorkcfg.patch b/desktop/kde6/applications/konqueror-kf6/files/konquerorkcfg.patch deleted file mode 100755 index 11b32f9426..0000000000 --- a/desktop/kde6/applications/konqueror-kf6/files/konquerorkcfg.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/src/konqueror-kf6.kcfg b/src/konqueror-kf6.kcfg ---- a/src/konqueror-kf6.kcfg 2017-10-09 07:28:51.000000000 +0300 -+++ b/src/konqueror-kf6.kcfg 2017-11-08 17:00:31.437975291 +0300 -@@ -463,7 +463,7 @@ - - - -- true -+ false - - - diff --git a/desktop/kde6/applications/konqueror-kf6/pspec.xml b/desktop/kde6/applications/konqueror-kf6/pspec.xml deleted file mode 100755 index 48eb8ccab4..0000000000 --- a/desktop/kde6/applications/konqueror-kf6/pspec.xml +++ /dev/null @@ -1,229 +0,0 @@ - - - - - konqueror-kf6 - https://www.kde.org/applications/internet/konqueror/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - GPL - LGPL - konqueror-kf6 - KDE File Manager and Web Browser - konqueror-kf6 is KDE's Webbrowser and swiss-army-knife for any kind of file-management and file previewing. - mirrors://kde/stable/release-service/24.12.1/src/konqueror-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - plasma-activities-kf6-devel - karchive-kf6-devel - kbookmarks-kf6-devel - kcmutils-kf6-devel - kcrash-kf6-devel - kguiaddons-kf6-devel - kdesu-kf6-devel - kdoctools-kf6-devel - knotifications-kf6-devel - kiconthemes-kf6-devel - - kio-kf6-devel - kparts-kf6-devel - - - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kwidgetsaddons-kf6-devel - libICE-devel - libX11-devel - libXext-devel - python-devel - qt6-base-devel - qt6-declarative-devel - - qt6-webchannel-devel - qt6-webengine-devel - - tidy-devel - zlib-devel - libevent-devel - ffmpeg-devel - libXScrnSaver-devel - kwallet-kf6-devel - - - - - - - - - konqueror-kf6 - konqueror-kf6 - KDE File Manager and Web Browser - - kwallet-kf6 - karchive-kf6 - kbookmarks-kf6 - kcmutils-kf6 - kcrash-kf6 - kded-kf6 - - kdesu-kf6 - knotifications-kf6 - kiconthemes-kf6 - kguiaddons-kf6 - kio-kf6 - kparts-kf6 - kwidgetsaddons-kf6 - libX11 - libXext - libgcc - qt6-base - qt6-declarative - - qt6-webchannel - qt6-webengine - - zlib - tidy - ki18n-kf6 - sonnet-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kitemviews-kf6 - - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - - - kde-baseapps - - - kde-baseapps - - - /etc/xdg - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - - konqueror-kf6-devel - Development files for konqueror-kf6 - - qt6-base-devel - konqueror-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/konsole-kf6/actions.py b/desktop/kde6/applications/konsole-kf6/actions.py deleted file mode 100755 index fbc887dbd2..0000000000 --- a/desktop/kde6/applications/konsole-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*") diff --git a/desktop/kde6/applications/konsole-kf6/pspec.xml b/desktop/kde6/applications/konsole-kf6/pspec.xml deleted file mode 100755 index f2070c5d74..0000000000 --- a/desktop/kde6/applications/konsole-kf6/pspec.xml +++ /dev/null @@ -1,171 +0,0 @@ - - - - - konsole-kf6 - https://projects.kde.org/projects/kde/applications/dolphin-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - KDE konsole-kf6 - konsole-kf6 for kde6 - mirrors://kde/stable/release-service/24.12.1/src/konsole-24.12.1.tar.xz - - qt6-base-devel - qt6-5compat-devel - qt6-multimedia-devel - kpty-kf6-devel - kio-kf6-devel - kglobalaccel-kf6-devel - icu4c-devel - knotifyconfig-kf6-devel - kparts-kf6-devel - - - - kitemmodels-kf6-devel - kunitconversion-kf6-devel - docbook-xsl - extra-cmake-modules-kf6 - kdoctools-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - knewstuff-kf6-devel - kglobalacceld-devel - cmake - kguiaddons-kf6-devel - knotifications-kf6-devel - - - - - - - konsole-kf6 - - libgcc - qt6-base - qt6-5compat - qt6-multimedia - kiconthemes-kf6 - knotifyconfig-kf6 - knotifications-kf6 - kparts-kf6 - kpty-kf6 - kio-kf6 - ki18n-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kcrash-kf6 - kdbusaddons-kf6 - kbookmarks-kf6 - knewstuff-kf6 - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kglobalacceld - kglobalaccel-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/lib - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kontact-kf6/actions.py b/desktop/kde6/applications/kontact-kf6/actions.py deleted file mode 100755 index dc7d4ed6e8..0000000000 --- a/desktop/kde6/applications/kontact-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/kontact-kf6/pspec.xml b/desktop/kde6/applications/kontact-kf6/pspec.xml deleted file mode 100755 index 726077dfa3..0000000000 --- a/desktop/kde6/applications/kontact-kf6/pspec.xml +++ /dev/null @@ -1,172 +0,0 @@ - - - - - kontact-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPL2 - KDE Personal Information Manager - kontact-kf6 is the integrated Personal Information Manager of KDE, but can be used with other systems as well. -It supports email, address books, calendars, tasks, news feeds and much more. -http://download.kde.org/stable/release-service/24.12.1/src/kontact-24.12.1.tar.xz - - boost-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - kontactinterface-kf6-devel - mailcommon-kf6-devel - qt6-base-devel - qt6-webengine-devel - kdbusaddons-kf6-devel - kcmutils-kf6-devel - kpimtextedit-kf6-devel - akonadi-kf6-devel - kitemmodels-kf6-devel - kparts-kf6-devel - akonadi-mime-kf6-devel - messagelib-kf6-devel - kmime-kf6-devel - pimcommon-kf6-devel - kcontacts-kf6-devel - akonadi-contacts-kf6-devel - kimap-kf6-devel - cyrus-sasl-devel - kidentitymanagement-kf6-devel - libkleo-kf6-devel - gpgme-devel - - grantleetheme-kf6-devel - libkdepim-kf6-devel - ffmpeg-devel - libXScrnSaver-devel - kguiaddons-kf6-devel - - - - - kontact-kf6 - KDE Personal Information Manager - - kio-kf6 - ki18n-kf6 - kcrash-kf6 - kparts-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - libkdepim-kf6 - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - grantleetheme-kf6 - kwindowsystem-kf6 - qt6-webengine - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kontactinterface-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kontactinterface-kf6/actions.py b/desktop/kde6/applications/kontactinterface-kf6/actions.py deleted file mode 100755 index f600ff3d40..0000000000 --- a/desktop/kde6/applications/kontactinterface-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - #pisitools.dodoc("COPYING.LIB") diff --git a/desktop/kde6/applications/kontactinterface-kf6/pspec.xml b/desktop/kde6/applications/kontactinterface-kf6/pspec.xml deleted file mode 100755 index 8734516db9..0000000000 --- a/desktop/kde6/applications/kontactinterface-kf6/pspec.xml +++ /dev/null @@ -1,153 +0,0 @@ - - - - - kontactinterface-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:library - kontact-kf6 Plugin Interface Library - This library provides the glue necessary for application "Parts" to be embedded as a kontact-kf6 component (or plugin). - mirrors://kde/stable/release-service/24.12.1/src/kontactinterface-24.12.1.tar.xz - - qt6-base-devel - - kdoctools-kf6-devel - extra-cmake-modules-kf6 - kcoreaddons-kf6-devel - kparts-kf6-devel - kwindowsystem-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - kiconthemes-kf6-devel - - - - - kontactinterface-kf6 - - qt6-base - - kio-kf6 - kparts-kf6 - libgcc - kxmlgui-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kwindowsystem-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - kontactinterface-kf6-devel - Development files for kontactinterface-kf6 - - qt6-base-devel - kontactinterface-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/konversation-kf6/actions.py b/desktop/kde6/applications/konversation-kf6/actions.py deleted file mode 100755 index 87f24a366b..0000000000 --- a/desktop/kde6/applications/konversation-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure("-DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DLIB_INSTALL_DIR=lib \ - -DKDE_INSTALL_USE_QT_SYS_PATHS=ON") - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "AUTHORS", "README", "NEWS") diff --git a/desktop/kde6/applications/konversation-kf6/pspec.xml b/desktop/kde6/applications/konversation-kf6/pspec.xml deleted file mode 100755 index 332813c641..0000000000 --- a/desktop/kde6/applications/konversation-kf6/pspec.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - konversation-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - A user friendly IRC client for KDE - konversation-kf6 is a user-friendly Internet Relay Chat (IRC) client built on the KDE Platform. - https://download.kde.org/stable/release-service/24.12.1/src/konversation-24.12.1.tar.xz - - qt6-base-devel - qt6-5compat-devel - qt6-multimedia-devel - qt6-assistant-devel - qt6-qdbusviewer - qt6-phonon-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - kitemviews-kf6-devel - kbookmarks-kf6-devel - kconfig-kf6-devel - kcolorscheme-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kstatusnotifieritem-kf6-devel - knewstuff-kf6-devel - ki18n-kf6-devel - kidletime-kf6-devel - knotifyconfig-kf6-devel - kio-kf6-devel - kparts-kf6-devel - solid-kf6-devel - sonnet-kf6-devel - kwallet-kf6-devel - kwidgetsaddons-kf6-devel - kglobalaccel-kf6-devel - kdbusaddons-kf6-devel - knotifications-kf6-devel - kwindowsystem-kf6-devel - kiconthemes-kf6-devel - karchive-kf6-devel - qca2-qt6-devel - python3-devel - gettext-devel - docbook-xsl - kcrash-kf6-devel - - - - - - - - konversation-kf6 - - qt6-base - qt6-5compat - qt6-multimedia - qca2-qt6 - kidletime-kf6 - knewstuff-kf6 - knotifyconfig-kf6 - kparts-kf6 - kio-kf6 - kcrash-kf6 - libgcc - ki18n-kf6 - sonnet-kf6 - kcodecs-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - karchive-kf6 - kservice-kf6 - kbookmarks-kf6 - kitemviews-kf6 - qt6-phonon - kglobalaccel-kf6 - kcolorscheme-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kglobalaccel - kstatusnotifieritem-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/share - /usr/share/locale - /usr/share/doc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-22 - 24.08.1 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/korganizer-kf6/actions.py b/desktop/kde6/applications/korganizer-kf6/actions.py deleted file mode 100755 index dc7d4ed6e8..0000000000 --- a/desktop/kde6/applications/korganizer-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/korganizer-kf6/pspec.xml b/desktop/kde6/applications/korganizer-kf6/pspec.xml deleted file mode 100755 index 12b75e9ddf..0000000000 --- a/desktop/kde6/applications/korganizer-kf6/pspec.xml +++ /dev/null @@ -1,206 +0,0 @@ - - - - - korganizer-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - Calendar and scheduling Program - korganizer-kf6 is the calendar and scheduling component of kontact-kf6, the integrated personal information manager from KDE. - https://download.kde.org/stable/release-service/24.12.1/src/korganizer-24.12.1.tar.xz - - gpgme-devel - extra-cmake-modules-kf6 - kcmutils-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - prison-kf6-devel - akonadi-kf6-devel - akonadi-search-kf6-devel - grantleetheme-kf6-devel - kpimtextedit-kf6-devel - libkdepim-kf6-devel - libkleo-kf6-devel - pimcommon-kf6-devel - qt6-base-devel - kitemmodels-kf6-devel - akonadi-mime-kf6-devel - - - kunitconversion-kf6-devel - knewstuff-kf6-devel - akonadi-contacts-kf6-devel - kidentitymanagement-kf6-devel - kmailtransport-kf6-devel - cyrus-sasl-devel - kcalutils-kf6-devel - kholidays-kf6-devel - kldap-kf6-devel - akonadi-calendar-kf6-devel - kontactinterface-kf6-devel - - mailcommon-kf6-devel - messagelib-kf6-devel - kimap-kf6-devel - incidenceeditor-kf6-devel - eventviews-kf6-devel - calendarsupport-kf6-devel - kparts-kf6-devel - kuserfeedback-kf6-devel - knotifications-kf6-devel - qt6-phonon-devel - - - - - korganizer-kf6 - Calendar and scheduling Program - - kio-kf6 - ki18n-kf6 - kmime-kf6 - kcrash-kf6 - kparts-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcalendarcore-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - kcalutils-kf6 - kcontacts-kf6 - kholidays-kf6 - knewstuff-kf6 - libkdepim-kf6 - pimcommon-kf6 - eventviews-kf6 - kitemviews-kf6 - mailcommon-kf6 - qt6-phonon - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - akonadi-mime-kf6 - kpimtextedit-kf6 - - kwindowsystem-kf6 - akonadi-search-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - calendarsupport-kf6 - incidenceeditor-kf6 - akonadi-calendar-kf6 - akonadi-contacts-kf6 - - kontactinterface-kf6 - kidentitymanagement-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kpat-kf6/actions.py b/desktop/kde6/applications/kpat-kf6/actions.py deleted file mode 100755 index 5bda5f461b..0000000000 --- a/desktop/kde6/applications/kpat-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING", "COPYING.DOC") diff --git a/desktop/kde6/applications/kpat-kf6/pspec.xml b/desktop/kde6/applications/kpat-kf6/pspec.xml deleted file mode 100755 index b6c01d83ac..0000000000 --- a/desktop/kde6/applications/kpat-kf6/pspec.xml +++ /dev/null @@ -1,175 +0,0 @@ - - - - - kpat-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.games - Patience card game - To play kpat-kf6ience you need, as the name suggests, patience. For simple games, where the way the game goes depends only upon how the cards fall, your patience might be the only thing you need. - mirrors://kde/stable/release-service/24.12.1/src/kpat-24.12.1.tar.xz - - qt6-base-devel - qt6-declarative-devel - - qt6-phonon-devel - kdoctools-kf6-devel - cmake - gettext-devel - kio-kf6-devel - kpackage-kf6-devel - kitemviews-kf6-devel - kunitconversion-kf6-devel - - kiconthemes-kf6-devel - ktextwidgets-kf6-devel - kitemmodels-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - kdeclarative-kf6-devel - knewstuff-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - qt6-svg-devel - kguiaddons-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - shared-mime-info - extra-cmake-modules-kf6 - python3 - mesa-devel - - black-hole-solver-devel - freecell-solver-devel - - - - - kpat-kf6 - - qt6-base - - libkdegames-kf6 - knewstuff-kf6 - ki18n-kf6 - kio-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - freecell-solver - black-hole-solver - - - /etc/xdg - /usr/share - /usr/bin - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kpimtextedit-kf6/actions.py b/desktop/kde6/applications/kpimtextedit-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/kpimtextedit-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kpimtextedit-kf6/files/qt5.patch b/desktop/kde6/applications/kpimtextedit-kf6/files/qt5.patch deleted file mode 100755 index c5c20b5f3e..0000000000 --- a/desktop/kde6/applications/kpimtextedit-kf6/files/qt5.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:01:54.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 14:15:53.500569441 +0300 -@@ -36,7 +36,7 @@ - SOVERSION 5 - ) - --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED COMPONENTS Widgets) - find_package(Grantlee5 "5.1" CONFIG REQUIRED) - set_package_properties(Grantlee5 PROPERTIES -diff -Nuar a/src/composer-ng/richtextcomposerimages.cpp b/src/composer-ng/richtextcomposerimages.cpp ---- a/src/composer-ng/richtextcomposerimages.cpp 2017-12-02 14:51:13.000000000 +0300 -+++ b/src/composer-ng/richtextcomposerimages.cpp 2017-12-16 14:24:33.940531889 +0300 -@@ -193,7 +193,7 @@ - buffer.open(QIODevice::WriteOnly); - normalImage->image.save(&buffer, "PNG"); - -- qsrand(QDateTime::currentDateTimeUtc().toSecsSinceEpoch() + qHash(normalImage->name)); -+ qsrand(QDateTime::currentDateTimeUtc().toMSecsSinceEpoch() + qHash(normalImage->name)); - QSharedPointer embeddedImage(new EmbeddedImage()); - retImages.append(embeddedImage); - embeddedImage->image = kcodecs-kf6::Codec::codecForName("base64")->encode(buffer.buffer()); diff --git a/desktop/kde6/applications/kpimtextedit-kf6/pspec.xml b/desktop/kde6/applications/kpimtextedit-kf6/pspec.xml deleted file mode 100755 index 001d3c93a2..0000000000 --- a/desktop/kde6/applications/kpimtextedit-kf6/pspec.xml +++ /dev/null @@ -1,182 +0,0 @@ - - - - - kpimtextedit-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:gui - kpimtextedit-kf6 - A textedit with PIM-specific features. - Text Edit with KDE-PIM specific features. - mirrors://kde/stable/release-service/24.12.1/src/kpimtextedit-24.12.1.tar.xz - - qt6-base-devel - qt6-speech-devel - qt6-designer-devel - ki18n-kf6-devel - sonnet-kf6-devel - kcodecs-kf6-devel - syntax-highlighting-kf6-devel - kconfig-kf6-devel - kio-kf6-devel - kitemmodels-kf6-devel - - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - kunitconversion-kf6-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - - - ktextaddons-kf6-devel - kcolorscheme-kf6-devel - - - - - - - - kpimtextedit-kf6 - - qt6-base - qt6-speech - qt6-designer - ki18n-kf6 - kcodecs-kf6 - kio-kf6 - sonnet-kf6 - libgcc - - kcompletion-kf6 - ktextwidgets-kf6 - kwidgetsaddons-kf6 - - kconfig-kf6 - kxmlgui-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kconfigwidgets-kf6 - syntax-highlighting-kf6 - - ktextaddons-kf6 - kcolorscheme-kf6 - - - /etc/xdg - /usr/lib/qt6 - /usr/lib - /usr/share - /usr/share/doc - /usr/share/locale - - - - - kpimtextedit-kf6-devel - Development files for kpimtextedit-kf6 - - qt6-base-devel - kpimtextedit-kf6 - ktextwidgets-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kpkpass-kf6/actions.py b/desktop/kde6/applications/kpkpass-kf6/actions.py deleted file mode 100755 index dd3d84e185..0000000000 --- a/desktop/kde6/applications/kpkpass-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*") diff --git a/desktop/kde6/applications/kpkpass-kf6/pspec.xml b/desktop/kde6/applications/kpkpass-kf6/pspec.xml deleted file mode 100755 index b77f0f2b94..0000000000 --- a/desktop/kde6/applications/kpkpass-kf6/pspec.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - kpkpass-kf6 - https://download.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - Apple Wallet Pass reader - Apple Cüzdan Geçiş okuyucusu - https://download.kde.org/stable/release-service/24.12.1/src/kpkpass-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - karchive-kf6-devel - shared-mime-info - - - - - - kpkpass-kf6 - - libgcc - karchive-kf6 - qt6-base - - - - /etc/xdg - /usr/lib - /usr/share - /usr/share/doc - - - - - kpkpass-kf6-devel - Development files for kpkpass-kf6 - - kpkpass-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kpkpass-kf6/translations.xml b/desktop/kde6/applications/kpkpass-kf6/translations.xml deleted file mode 100755 index 439eb18b38..0000000000 --- a/desktop/kde6/applications/kpkpass-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kpkpass-kf6 - Apple Wallet Pass reader - Apple Cüzdan Geçiş okuyucusu - - diff --git a/desktop/kde6/applications/kpmcore-kf6/actions.py b/desktop/kde6/applications/kpmcore-kf6/actions.py deleted file mode 100755 index c22d6f53fd..0000000000 --- a/desktop/kde6/applications/kpmcore-kf6/actions.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import cmaketools -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools -from pisi.actionsapi import get - - -def setup(): - shelltools.makedirs("build") - shelltools.cd("build") - cmaketools.configure("-DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_INSTALL_LIBDIR=lib \ - -DBUILD_TESTING=OFF", sourceDir="..") - -def build(): - shelltools.cd("build") - cmaketools.make() - -def install(): - shelltools.cd("build") - cmaketools.rawInstall("DESTDIR=%s" % get.installDIR()) diff --git a/desktop/kde6/applications/kpmcore-kf6/pspec.xml b/desktop/kde6/applications/kpmcore-kf6/pspec.xml deleted file mode 100755 index 799a5511d4..0000000000 --- a/desktop/kde6/applications/kpmcore-kf6/pspec.xml +++ /dev/null @@ -1,196 +0,0 @@ - - - - - kpmcore-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - Library for managing partitions. - Library for managing partitions. - mirrors://kde/stable/release-service/24.12.1/src/kpmcore-24.12.1.tar.xz - - ntfs-3g - udftools - ntfsprogs - fatresize - - dosfstools - reiserfsprogs - smartmontools - xfsprogs-devel - qt6-base-devel - libatasmart-devel - extra-cmake-modules-kf6 - parted-devel - libutil-linux-devel - ki18n-kf6-devel - kio-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - kjobwidgets-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kdoctools-kf6-devel - kwidgetsaddons-kf6-devel - qca2-qt6-devel - polkit-devel - elogind-devel - polkit-qt6-devel - jfsutils - exfatprogs - f2fs-tools - nilfs-utils-devel - e2fsprogs-devel - - - - - kpmcore-kf6 - - kio-kf6 - ki18n-kf6 - kauth-kf6 - ntfs-3g - qca2-qt6 - fatresize - udftools - fatresize - ntfsprogs - - dosfstools - reiserfsprogs - smartmontools - xfsprogs - kwidgetsaddons-kf6 - libgcc - parted - kservice-kf6 - qt6-base - kcoreaddons-kf6 - kiconthemes-kf6 - libatasmart - libutil-linux - polkit-qt6 - jfsutils - exfatprogs - f2fs-tools - nilfs-utils - e2fsprogs - - - /usr/bin - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - - - kpmcore-kf6-devel - Development files for kpmcore-kf6 - - kpmcore-kf6 - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kqtquickcharts-kf6/actions.py b/desktop/kde6/applications/kqtquickcharts-kf6/actions.py deleted file mode 100755 index 2b2203d3db..0000000000 --- a/desktop/kde6/applications/kqtquickcharts-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde5 -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - # kde6.configure() - kde5.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("AUTHORS", "COPYING", "README.md") - diff --git a/desktop/kde6/applications/kqtquickcharts-kf6/pspec.xml b/desktop/kde6/applications/kqtquickcharts-kf6/pspec.xml deleted file mode 100755 index 5660cddb27..0000000000 --- a/desktop/kde6/applications/kqtquickcharts-kf6/pspec.xml +++ /dev/null @@ -1,146 +0,0 @@ - - - - - kqtquickcharts-kf6 - https://edu.kde.org/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - LGPL - GPL - A QtQuick plugin to render beautiful and interactive charts - A QtQuick plugin to render beautiful and interactive charts - mirrors://kde/stable/release-service/24.12.1/src/kqtquickcharts-24.12.1.tar.xz - - extra-cmake-modules-kf6 - glibc-devel - qt6-base-devel - qt6-declarative-devel - - qt5-base-devel - qt5-declarative-devel - - - - - kqtquickcharts-kf6 - A QtQuick plugin to render beautiful and interactive charts - - qt6-base - qt6-declarative - libgcc - - qt5-base - qt5-declarative - - - /usr/lib/qt6 - /usr/lib/qt5 - /usr/share/doc - - - - - kqtquickcharts-kf6-devel - Development files for kqtquickcharts-kf6 - - kqtquickcharts-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - diff --git a/desktop/kde6/applications/krdc-kf6/actions.py b/desktop/kde6/applications/krdc-kf6/actions.py deleted file mode 100755 index 85738d244a..0000000000 --- a/desktop/kde6/applications/krdc-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/krdc-kf6/pspec.xml b/desktop/kde6/applications/krdc-kf6/pspec.xml deleted file mode 100755 index 57f7320210..0000000000 --- a/desktop/kde6/applications/krdc-kf6/pspec.xml +++ /dev/null @@ -1,187 +0,0 @@ - - - - - krdc-kf6 - http://www.kde.org/applications/internet/krdc/ - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - app:gui - Remote Desktop Client - krdc-kf6 is a client application that allows you to view or even control the desktop session on another machine that is running a compatible server. VNC and RDP is supported. - mirrors://kde/stable/release-service/24.12.1/src/krdc-24.12.1.tar.xz - - qt6-base-devel - qt6-wayland-devel - extra-cmake-modules-kf6 - kio-kf6-devel - kconfig-kf6-devel - kcmutils-kf6-devel - kdnssd-kf6-devel - knotifyconfig-kf6-devel - knotifications-kf6-devel - kbookmarks-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kcompletion-kf6-devel - kwallet-kf6-devel - plasma-activities-kf6-devel - kstatusnotifieritem-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - libvncserver-devel - kdoctools-kf6-devel - kwindowsystem-kf6-devel - libssh-devel - freerdp2-devel - libvncserver-devel - - - - - krdc-kf6 - - kio-kf6 - ki18n-kf6 - kdnssd-kf6 - libgcc - libssh - freerdp2 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - qt6-wayland - kbookmarks-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - libvncserver - knotifyconfig-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwindowsystem-kf6 - kwidgetsaddons-kf6 - plasma-activities-kf6 - kstatusnotifieritem-kf6 - - - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share/applications - /usr/share/config.kcfg - /usr/share/krdc-kf6 - /usr/share/kxmlgui-kf65 - /usr/share/kservice-kf6s5 - /usr/share/metainfo - /usr/share/kservice-kf6types5 - /usr/share/qlogging-categories6 - /usr/share/mime/packages/org.kde.krdc-mime.xml - /usr/share/doc - /usr/share/locale - /usr/share/kio-kf6/servicemenus/smb2rdc.desktop - - - - - krdc-kf6-devel - - krdc-kf6 - - - /usr/include - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/krdc-kf6/translations.xml b/desktop/kde6/applications/krdc-kf6/translations.xml deleted file mode 100755 index 93261c5439..0000000000 --- a/desktop/kde6/applications/krdc-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - krdc-kf6 - Uzak masaüstü bağlantı istemcisi. - krdc-kf6, uzaktaki bir masaüstü oturumunu görüntülemenizi ve kontrol etmenizi sağlar. RDP kullanan Windows Terminal Sunucuları'na ve VNC/RFB kullanan diğer pek çok platforma bağlanabilirç - - diff --git a/desktop/kde6/applications/krfb-kf6/actions.py b/desktop/kde6/applications/krfb-kf6/actions.py deleted file mode 100755 index d15b968e27..0000000000 --- a/desktop/kde6/applications/krfb-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*", "README", "TODO", "AUTHORS", "NOTES") diff --git a/desktop/kde6/applications/krfb-kf6/pspec.xml b/desktop/kde6/applications/krfb-kf6/pspec.xml deleted file mode 100755 index 8b0c2b94b5..0000000000 --- a/desktop/kde6/applications/krfb-kf6/pspec.xml +++ /dev/null @@ -1,185 +0,0 @@ - - - - - krfb-kf6 - http://www.kde.org/applications/system/krfb/ - - Mathias Freire - mathiasfreire45@gmail.com - - GPLv2 - app:gui - Desktop sharing utility - KDE Desktop Sharing is a manager for easily sharing a desktop session with another system. The desktop session can be viewed or controlled remotely by any VNC or RFB client - mirrors://kde/stable/release-service/24.12.1/src/krfb-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-wayland-devel - ki18n-kf6-devel - kstatusnotifieritem-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdnssd-kf6-devel - kdoctools-kf6-devel - knotifications-kf6-devel - kwallet-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - libvncserver-devel - libX11-devel - libXdamage-devel - libxcb-devel - libXext-devel - libXtst-devel - kwindowsystem-kf6-devel - xcb-util-image-devel - kwayland-kf6-devel - kpipewire-kf6-devel - wayland-client - wayland-devel - pipewire-devel - plasma-wayland-protocols-kf6 - - - - - krfb-kf6 - - ki18n-kf6 - kdnssd-kf6 - libX11 - libxcb - libgcc - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - libXtst - kwayland-kf6 - kpipewire-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libvncserver - kstatusnotifieritem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwindowsystem-kf6 - kwidgetsaddons-kf6 - xcb-util-image - wayland-client - qt6-wayland - - - kdenetwork - - - kdenetwork - - - /usr/bin - /usr/lib - /usr/share/applications - /usr/share/krfb-kf6 - /usr/share/kservice-kf6types5 - /usr/share/icons - /usr/share/doc - /usr/share/locale - /usr/share/metainfo - /usr/share/qlogging-categories6/krfb.categories - /usr/share/krfb/krfb.notifyrc - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/krfb-kf6/translations.xml b/desktop/kde6/applications/krfb-kf6/translations.xml deleted file mode 100755 index 6d1ffd2187..0000000000 --- a/desktop/kde6/applications/krfb-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - krfb-kf6 - Masaüstü paylaşım araçları. - krfb-kf6, masaüstünü uzaktaki bilgisayarlarla kolaylıkla paylaşmaya olanak sağlar. - - diff --git a/desktop/kde6/applications/kross-interpreters-kf6/actions.py b/desktop/kde6/applications/kross-interpreters-kf6/actions.py deleted file mode 100755 index 1b5de4643d..0000000000 --- a/desktop/kde6/applications/kross-interpreters-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import kde5 - -def setup(): - # kde6.configure() - kde5.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING") diff --git a/desktop/kde6/applications/kross-interpreters-kf6/pspec.xml b/desktop/kde6/applications/kross-interpreters-kf6/pspec.xml deleted file mode 100755 index fa3b596bec..0000000000 --- a/desktop/kde6/applications/kross-interpreters-kf6/pspec.xml +++ /dev/null @@ -1,148 +0,0 @@ - - - - - kross-interpreters-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.bindings - kross-kf6 interpreter plugins for programming languages - Language interpreters to enable in-process scripting with kross-kf6. - mirrors://kde/stable/release-service/24.12.1/src/kross-interpreters-24.12.1.tar.xz - - - extra-cmake-modules-kf6 - - qt5-base-devel - kdoctools-devel - kross-devel - kdesignerplugin - kemoticons-devel - kitemmodels-devel - kinit-devel - kunitconversion-devel - python-devel - ruby-devel - - - - - kross-interpreters-kf6 - - - - qt5-base - libgcc - python - kross - ruby - - - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - kross-interpreters - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kruler-kf6/actions.py b/desktop/kde6/applications/kruler-kf6/actions.py deleted file mode 100755 index 6e49566179..0000000000 --- a/desktop/kde6/applications/kruler-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure("-DCMAKE_BUILD_TYPE=Release \ - -DBUILD_TESTING=OFF \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DKDE_INSTALL_USE_QT_SYS_PATHS=ON \ - -DECM_MKSPECS_INSTALL_DIR=/usr/lib/qt6/mkspecs/modules") - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/applications/kruler-kf6/pspec.xml b/desktop/kde6/applications/kruler-kf6/pspec.xml deleted file mode 100755 index 8dc1d7c34c..0000000000 --- a/desktop/kde6/applications/kruler-kf6/pspec.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - kruler-kf6 - http://www.kde.org/applications/graphics/kruler-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kruler-kf6 - app:gui - desktop.kde.graphics - A screen ruler and color measurement tool - kruler-kf6 is a screen ruler and color measurement tool. - mirrors://kde/stable/release-service/24.12.1/src/kruler-24.12.1.tar.xz - - qt6-base-devel - kstatusnotifieritem-kf6-devel - kdoctools-kf6-devel - kcrash-kf6-devel - cmake - extra-cmake-modules-kf6 - ki18n-kf6-devel - knotifications-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - python-devel - docbook-xsl - - - - - kruler-kf6 - - qt6-base - kxmlgui-kf6 - knotifications-kf6 - ki18n-kf6 - libgcc - libxcb - kcrash-kf6 - kconfig-kf6 - kcoreaddons-kf6 - kwindowsystem-kf6 - kstatusnotifieritem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share/doc - /usr/bin - /usr/share - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kruler-kf6/translations.xml b/desktop/kde6/applications/kruler-kf6/translations.xml deleted file mode 100755 index 716aaad65d..0000000000 --- a/desktop/kde6/applications/kruler-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kruler-kf6 - Ekran cetveli ve renk ölçüm aracı - kruler-kf6, bir ekran cetveli ve renk ölçüm aracıdır. - - diff --git a/desktop/kde6/applications/ksanecore-kf6/actions.py b/desktop/kde6/applications/ksanecore-kf6/actions.py deleted file mode 100644 index 0eef11c64c..0000000000 --- a/desktop/kde6/applications/ksanecore-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/applications/ksanecore-kf6/pspec.xml b/desktop/kde6/applications/ksanecore-kf6/pspec.xml deleted file mode 100644 index 29168ac12b..0000000000 --- a/desktop/kde6/applications/ksanecore-kf6/pspec.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - ksanecore-kf6 - https://www.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - FDL - app - Library providing logic to interface scanners - ksanecore-kf6 - Library providing logic to interface scanners - https://download.kde.org/stable/release-service/24.12.1/src/ksanecore-24.12.1.tar.xz - - ki18n-kf6-devel - qt6-base-devel - sane-backends-devel - extra-cmake-modules-kf6 - - - - - - ksanecore-kf6 - - ki18n-kf6 - qt6-base - sane-backends - - - /usr/lib - /usr/share/locale - /usr/share/doc - - - - - ksanecore-kf6-devel - Development files for ksanecore-kf6 - - ksanecore-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/ksanecore-kf6/translations.xml b/desktop/kde6/applications/ksanecore-kf6/translations.xml deleted file mode 100644 index 92fa8c7aa1..0000000000 --- a/desktop/kde6/applications/ksanecore-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - ksanecore-kf6 - Library providing logic to interface scanners - Library providing logic to interface scanners - - diff --git a/desktop/kde6/applications/kshisen-kf6/actions.py b/desktop/kde6/applications/kshisen-kf6/actions.py deleted file mode 100755 index 85738d244a..0000000000 --- a/desktop/kde6/applications/kshisen-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kshisen-kf6/pspec.xml b/desktop/kde6/applications/kshisen-kf6/pspec.xml deleted file mode 100755 index b4fecfd90c..0000000000 --- a/desktop/kde6/applications/kshisen-kf6/pspec.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - kshisen-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.games - Shisen-Sho Mahjongg like tile game - Shisen-Sho is a solitaire-like game played using the standard set of Mahjong tiles. Unlike Mahjong however, Shisen-Sho has only one layer of scrambled tiles. - mirrors://kde/stable/release-service/24.12.1/src/kshisen-24.12.1.tar.xz - - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcompletion-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kcoreaddons-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - libkdegames-kf6-devel - libkmahjongg-kf6-devel - knewstuff-kf6-devel - kdnssd-kf6-devel - kdeclarative-kf6-devel - kio-kf6-devel - - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - - - - kshisen-kf6 - - qt6-base - qt6-declarative - libgcc - ki18n-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kxmlgui-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - libkmahjongg-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kshisen-kf6/translation.xml b/desktop/kde6/applications/kshisen-kf6/translation.xml deleted file mode 100755 index 7c688b80e4..0000000000 --- a/desktop/kde6/applications/kshisen-kf6/translation.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kshisen-kf6 - Shisen-Sho Mahjongg benzeri bir oyun - Shisen-Sho standart Mahjong kartlarıyla oynanan bir kart oyunudur. Mahjong'dan farklı olarak Shisen-Sho'da kartlar tek sırada karıştırılır. - - diff --git a/desktop/kde6/applications/ksmtp-kf6/actions.py b/desktop/kde6/applications/ksmtp-kf6/actions.py deleted file mode 100755 index 9cb5146c65..0000000000 --- a/desktop/kde6/applications/ksmtp-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/ksmtp-kf6/pspec.xml b/desktop/kde6/applications/ksmtp-kf6/pspec.xml deleted file mode 100755 index dd7eac760c..0000000000 --- a/desktop/kde6/applications/ksmtp-kf6/pspec.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - ksmtp-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - Bir SMTP sunucusu yoluyla e-posta göndermek için işe dayalı kütüphane - Job-based library to send email through an SMTP server - https://download.kde.org/stable/release-service/24.12.1/src/ksmtp-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - kcoreaddons-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kmime-kf6-devel - cyrus-sasl-devel - - - - - - ksmtp-kf6 - - kio-kf6 - ki18n-kf6 - kmime-kf6 - libgcc - kcoreaddons-kf6 - cyrus-sasl - qt6-base - - - /etc/xdg - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - - ksmtp-kf6-devel - Development files for ksmtp-kf6 - - ksmtp-kf6 - - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/ksmtp-kf6/translations.xml b/desktop/kde6/applications/ksmtp-kf6/translations.xml deleted file mode 100755 index 3d25aec64b..0000000000 --- a/desktop/kde6/applications/ksmtp-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - ksmtp-kf6 - Bir SMTP sunucusu yoluyla e-posta göndermek için işe dayalı kütüphane - Job-based library to send email through an SMTP server - - diff --git a/desktop/kde6/applications/ksquares-kf6/actions.py b/desktop/kde6/applications/ksquares-kf6/actions.py deleted file mode 100755 index 0374af291e..0000000000 --- a/desktop/kde6/applications/ksquares-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/ksquares-kf6/pspec.xml b/desktop/kde6/applications/ksquares-kf6/pspec.xml deleted file mode 100755 index 33d1c8362b..0000000000 --- a/desktop/kde6/applications/ksquares-kf6/pspec.xml +++ /dev/null @@ -1,153 +0,0 @@ - - - - - ksquares-kf6 - https://www.kde.org/applications/games/ksquares/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - ksquares-kf6 - app:gui - desktop.kde.games - Connect the dots to create squares - ksquares-kf6 is a fun and exciting game that modeled after the well known pen and paper based game of Dots and Boxes. - mirrors://kde/stable/release-service/24.12.1/src/ksquares-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - - - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - - - - - ksquares-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/ksquares-kf6/translations.xml b/desktop/kde6/applications/ksquares-kf6/translations.xml deleted file mode 100755 index c4b5f01b1b..0000000000 --- a/desktop/kde6/applications/ksquares-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - ksquares-kf6 - Noktaları birleştirerek kare yapma oyunu - ksquares-kf6 sıkıcı derslerin kurtarıcısı, eğlenceli ve heyecanlı kare yapma oyununun KDE sürümüdür. - - diff --git a/desktop/kde6/applications/ksudoku-kf6/actions.py b/desktop/kde6/applications/ksudoku-kf6/actions.py deleted file mode 100644 index e5ce149ca4..0000000000 --- a/desktop/kde6/applications/ksudoku-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import shelltools -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import get - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/applications/ksudoku-kf6/pspec.xml b/desktop/kde6/applications/ksudoku-kf6/pspec.xml deleted file mode 100644 index 129aba40bc..0000000000 --- a/desktop/kde6/applications/ksudoku-kf6/pspec.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - - - ksudoku-kf6 - https://apps.kde.org/ksudoku-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - ksudoku-kf6 - app:gui - Sudoku game - ksudoku-kf6 is a logic-based symbol placement puzzle. - https://download.kde.org/stable/release-service/24.12.1/src/ksudoku-24.12.1.tar.xz - - cmake - kio-kf6-devel - ki18n-kf6-devel - kcrash-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - qt6-svg-devel - qt6-base-devel - mesa-glu-devel - karchive-kf6-devel - libglvnd-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - libkdegames-kf6-devel - kcoreaddons-kf6-devel - kjobwidgets-kf6-devel - kiconthemes-kf6-devel - extra-cmake-modules-kf6 - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - qt6-declarative-devel - - - - - ksudoku-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - mesa-glu - libglvnd - kguiaddons-kf6 - kjobwidgets-kf6 - kcoreaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib - /etc/xdg - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/ksudoku-kf6/translations.xml b/desktop/kde6/applications/ksudoku-kf6/translations.xml deleted file mode 100644 index bb88fb897f..0000000000 --- a/desktop/kde6/applications/ksudoku-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - ksudoku-kf6 - Sudoku oyunu - ksudoku-kf6 mantık temelli bir sembol yerleştirme oyunudur. - - diff --git a/desktop/kde6/applications/ksystemlog-kf6/actions.py b/desktop/kde6/applications/ksystemlog-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/ksystemlog-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/ksystemlog-kf6/pspec.xml b/desktop/kde6/applications/ksystemlog-kf6/pspec.xml deleted file mode 100755 index b3b6daff3b..0000000000 --- a/desktop/kde6/applications/ksystemlog-kf6/pspec.xml +++ /dev/null @@ -1,158 +0,0 @@ - - - - - ksystemlog-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - ksystemlog-kf6 - app:gui - System log viewer. - ksystemlog-kf6 show all logs of your system, grouped by General (Default system log, Authentication, Kernel, X.org...), and optional Services (Apache, Cups, etc, ...). - mirrors://kde/stable/release-service/24.12.1/src/ksystemlog-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-5compat-devel - kxmlgui-kf6-devel - kcoreaddons-kf6-devel - kwidgetsaddons-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kconfig-kf6-devel - karchive-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kcompletion-kf6-devel - ktextwidgets-kf6-devel - - - - - ksystemlog-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - karchive-kf6 - kservice-kf6 - qt6-base - qt6-5compat - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - kdeadmin - - - kdeadmin - - - /usr/bin - /usr/share - /usr/share/applications - /usr/share/kxmlgui-kf65 - /usr/share/doc - /usr/share/locale - - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/ksystemlog-kf6/translations.xml b/desktop/kde6/applications/ksystemlog-kf6/translations.xml deleted file mode 100755 index 6942393f0c..0000000000 --- a/desktop/kde6/applications/ksystemlog-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - ksystemlog-kf6 - Sistem kayıt görüntüleyicisi. - ksystemlog-kf6, sistemin bütün hata kayıtlarını (genel ve opsiyonel) görüntülemmeye yarayan bir uygulamadır. - - diff --git a/desktop/kde6/applications/kteatime-kf6/actions.py b/desktop/kde6/applications/kteatime-kf6/actions.py deleted file mode 100755 index ecf4131c19..0000000000 --- a/desktop/kde6/applications/kteatime-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - pisitools.dosed("CMakeLists.txt", "5.92.0", "5.110.0") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kteatime-kf6/pspec.xml b/desktop/kde6/applications/kteatime-kf6/pspec.xml deleted file mode 100755 index b7df4a67ec..0000000000 --- a/desktop/kde6/applications/kteatime-kf6/pspec.xml +++ /dev/null @@ -1,147 +0,0 @@ - - - - - kteatime-kf6 - http://www.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.utils - Timer for making tea. - kteatime-kf6 is a handy timer for steeping tea. No longer will you have to guess at how long it takes for your tea to be ready. - mirrors://kde/stable/release-service/24.12.1/src/kteatime-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kconfig-kf6-devel - kcrash-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - knotifyconfig-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kguiaddons-kf6-devel - - - - kteatime-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - knotifyconfig-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - - - kdetoys - - - kdetoys - - - /usr/bin - /usr/doc - /usr/share - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kteatime-kf6/translations.xml b/desktop/kde6/applications/kteatime-kf6/translations.xml deleted file mode 100755 index c3ef69726a..0000000000 --- a/desktop/kde6/applications/kteatime-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kteatime-kf6 - Çay yapma zamanlayıcısı. - kteatime-kf6 çay yapmak için kullanışlı bir uygulamadır. kteatime-kf6 ile çay demlemek için ne kadar beklemek gerektiğini düşünmenize gerek kalmaz. - - diff --git a/desktop/kde6/applications/ktimer-kf6/actions.py b/desktop/kde6/applications/ktimer-kf6/actions.py deleted file mode 100755 index 43c04d9cb8..0000000000 --- a/desktop/kde6/applications/ktimer-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/ktimer-kf6/pspec.xml b/desktop/kde6/applications/ktimer-kf6/pspec.xml deleted file mode 100755 index ee40a70252..0000000000 --- a/desktop/kde6/applications/ktimer-kf6/pspec.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - ktimer-kf6 - http://kde.org/applications/utilities/ktimer-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - ktimer-kf6 - app:gui - desktop.kde.utils - A countdown launcher - ktimer-kf6 is a little tool to execute programs after some time. It allows you to enter several tasks and to set a timer for each of them. The timers for each task can be started, stopped, changed, or looped. - mirrors://kde/stable/release-service/24.12.1/src/ktimer-24.12.1.tar.xz - - qt6-base-devel - qt6-5compat-devel - kdoctools-kf6-devel - kstatusnotifieritem-kf6-devel - cmake - extra-cmake-modules-kf6 - ki18n-kf6-devel - kwidgetsaddons-kf6-devel - kio-kf6-devel - kiconthemes-kf6-devel - kdbusaddons-kf6-devel - knotifications-kf6-devel - mesa-devel - - - - - ktimer-kf6 - - qt6-base - qt6-5compat - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kstatusnotifieritem-kf6 - - - /usr/share/doc - /usr/bin - /usr/share - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/ktimer-kf6/translations.xml b/desktop/kde6/applications/ktimer-kf6/translations.xml deleted file mode 100755 index 03c7d5d35d..0000000000 --- a/desktop/kde6/applications/ktimer-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - ktimer-kf6 - A countdown launcher - ktimer-kf6 is a little tool to execute programs after some time. It allows you to enter several tasks and to set a timer for each of them. The timers for each task can be started, stopped, changed, or looped. - - diff --git a/desktop/kde6/applications/ktnef-kf6/actions.py b/desktop/kde6/applications/ktnef-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/ktnef-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/ktnef-kf6/files/qt5.patch b/desktop/kde6/applications/ktnef-kf6/files/qt5.patch deleted file mode 100755 index f89f254b31..0000000000 --- a/desktop/kde6/applications/ktnef-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:01:55.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 22:11:14.110618003 +0300 -@@ -26,7 +26,7 @@ - set(CALENDARCORE_LIB_VERSION "5.7.0") - set(CALENDARUTILS_LIB_VERSION "5.7.0") - set(kcontacts-kf6_LIB_VERSION "5.7.0") --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - ecm_setup_version(PROJECT VARIABLE_PREFIX ktnef-kf6 - VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/ktnef-kf6_version.h" - PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5TnefConfigVersion.cmake" diff --git a/desktop/kde6/applications/ktnef-kf6/pspec.xml b/desktop/kde6/applications/ktnef-kf6/pspec.xml deleted file mode 100755 index 107be51d7f..0000000000 --- a/desktop/kde6/applications/ktnef-kf6/pspec.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - - - ktnef-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - API for handling TNEF data - The API permits access to the actual attachments, the message properties (TNEF/MAPI), and allows one to view/extract message formatted text in Rich Text Format format. - mirrors://kde/stable/release-service/24.12.1/src/ktnef-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - - - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - kcalendarcore-kf6-devel - kcalutils-kf6-devel - kcontacts-kf6-devel - - - - - - - - ktnef-kf6 - - qt6-base - kcalutils-kf6 - ki18n-kf6 - libgcc - kcalendarcore-kf6 - kcontacts-kf6 - - - - /usr/lib/qt6 - /usr/lib - /usr/share - /usr/share/doc - /usr/share/locale - - - - - ktnef-kf6-devel - Development files for ktnef-kf6 - - qt6-base-devel - ktnef-kf6 - - - /etc/xdg - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/ktorrent-kf6/actions.py b/desktop/kde6/applications/ktorrent-kf6/actions.py deleted file mode 100644 index a7464b1612..0000000000 --- a/desktop/kde6/applications/ktorrent-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/ktorrent-kf6/pspec.xml b/desktop/kde6/applications/ktorrent-kf6/pspec.xml deleted file mode 100644 index 3713d3a3e3..0000000000 --- a/desktop/kde6/applications/ktorrent-kf6/pspec.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - - - ktorrent-kf6 - https://apps.kde.org/ktorrent/ - - Kamil Atlı - suvari@pisilinux.org - - GPLv2 - app:gui - A powerful BitTorrent client for KDE - A powerful BitTorrent client for KDE - https://download.kde.org/stable/release-service/24.12.1/src/ktorrent-24.12.1.tar.xz - - doxygen - kio-kf6-devel - boost-devel - geoip-devel - ki18n-kf6-devel - kparts-kf6-devel - kdnssd-kf6-devel - taglib-devel - kcrash-kf6-devel - kxmlgui-kf6-devel - qt6-base-devel - qt6-5compat-devel - kcmutils-kf6-devel - karchive-kf6-devel - libgcrypt-devel - kdoctools-kf6-devel - kplotting-kf6-devel - qt6-phonon-devel - kiconthemes-kf6-devel - libktorrent-kf6-devel - kdbusaddons-kf6-devel - kcoreaddons-kf6-devel - kcompletion-kf6-devel - ktextwidgets-kf6-devel - ksyndication-kf6-devel - qt6-webengine-devel - knotifyconfig-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - kwidgetsaddons-kf6-devel - kconfigwidgets-kf6-devel - knotifications-kf6-devel - kstatusnotifieritem-kf6-devel - plasma-workspace-kf6-devel - - - - - ktorrent-kf6 - - kio-kf6 - boost - geoip - ki18n-kf6 - libgcc - kparts-kf6 - kdnssd-kf6 - taglib - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - karchive-kf6 - qt6-base - kcmutils-kf6 - libgcrypt - kplotting-kf6 - qt6-phonon - qt6-5compat - kiconthemes-kf6 - libktorrent-kf6 - kdbusaddons-kf6 - kcoreaddons-kf6 - kcompletion-kf6 - ktextwidgets-kf6 - ksyndication-kf6 - qt6-webengine - knotifyconfig-kf6 - kwindowsystem-kf6 - kwidgetsaddons-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kstatusnotifieritem-kf6 - plasma-workspace-kf6 - - - /usr/bin - /usr/share/icons - /usr/share/knotifications5 - /usr/share/applications - /usr/share/kxmlgu5/ktorrent - /usr/share/ktorrent/ - /usr/share/kxmlgui5/ - /usr/share/metainfo - /usr/lib/libktcore.so* - /usr/lib/qt6/plugins/ktorrent_plugins - /usr/share/doc - /usr/share/locale - /usr/share/knotifications6 - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/ktorrent-kf6/translations.xml b/desktop/kde6/applications/ktorrent-kf6/translations.xml deleted file mode 100644 index 609a7f96a1..0000000000 --- a/desktop/kde6/applications/ktorrent-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - ktorrent-kf6 - KDE için güçlü bir BitTorrent istemcisi - KDE için güçlü bir BitTorrent istemcisi - - diff --git a/desktop/kde6/applications/ktuberling-kf6/actions.py b/desktop/kde6/applications/ktuberling-kf6/actions.py deleted file mode 100755 index 82e40ee4b1..0000000000 --- a/desktop/kde6/applications/ktuberling-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/ktuberling-kf6/pspec.xml b/desktop/kde6/applications/ktuberling-kf6/pspec.xml deleted file mode 100755 index c75e312aac..0000000000 --- a/desktop/kde6/applications/ktuberling-kf6/pspec.xml +++ /dev/null @@ -1,163 +0,0 @@ - - - - - ktuberling-kf6 - http://kde.org/applications/games/ktuberling/ - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - A simple constructor game suitable for children and adults alike - ktuberling-kf6 a simple constructor game suitable for children and adults alike. The idea of the game is based around a once popular doll making concept. - mirrors://kde/stable/release-service/24.12.1/src/ktuberling-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - qt6-multimedia-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kitemmodels-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - knewstuff-kf6-devel - kdoctools-kf6-devel - kunitconversion-kf6-devel - libkdegames-kf6-devel - - - - - ktuberling-kf6 - A simple constructor game suitable for children and adults alike - - kio-kf6 - ki18n-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - qt6-multimedia - qt6-phonon - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - - /usr/bin - /usr/share/applications - /usr/share/icons - /usr/share/ktuberling - /usr/share/metainfo - /usr/share/kxmlgui-kf6 - /usr/share/doc - /usr/share/locale - /usr/share/qlogging-categories6 - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kturtle-kf6/actions.py b/desktop/kde6/applications/kturtle-kf6/actions.py deleted file mode 100755 index e9997cc361..0000000000 --- a/desktop/kde6/applications/kturtle-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*", "AUTHORS", "COPYING*") diff --git a/desktop/kde6/applications/kturtle-kf6/pspec.xml b/desktop/kde6/applications/kturtle-kf6/pspec.xml deleted file mode 100755 index 1e018fe525..0000000000 --- a/desktop/kde6/applications/kturtle-kf6/pspec.xml +++ /dev/null @@ -1,153 +0,0 @@ - - - - - kturtle-kf6 - http://edu.kde.org/applications/all/kturtle-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kturtle-kf6 - app:gui - desktop.kde.edu - An educational programming environment - kturtle-kf6 is an educational programming environment that aims to make learning how to program as easily as possible. To achieve this kturtle-kf6 makes all programming tools available from the user interface. The programming language used is TurtleScript which allows its commands to be translated. - mirrors://kde/stable/release-service/24.12.1/src/kturtle-24.12.1.tar.xz - - qt6-base-devel - qt6-svg-devel - qt6-5compat-devel - kdoctools-kf6-devel - - knewstuff-kf6-devel - extra-cmake-modules-kf6 - kio-kf6-devel - kcoreaddons-kf6-devel - ktextwidgets-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kconfig-kf6-devel - gettext-devel - - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - - - - - kturtle-kf6 - - qt6-base - qt6-svg - qt6-5compat - ki18n-kf6 - knewstuff-kf6 - libgcc - kcoreaddons-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kxmlgui-kf6 - kconfig-kf6 - - - - /etc/xdg - /usr/share/doc - /usr/bin - /usr/share - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kturtle-kf6/translations.xml b/desktop/kde6/applications/kturtle-kf6/translations.xml deleted file mode 100755 index e5aadca6fc..0000000000 --- a/desktop/kde6/applications/kturtle-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kturtle-kf6 - Öğrenim amaçlı programlama ortamı - kturtle-kf6, programlama öğrenmeyi olabildiğince kolaylaştırmak için tasarlanmış bir programlama uygulamasıdır. Bu amaçla tasarlanan arayüz tüm gerekli araçları kullanıcıya sunar. Ayrıca kullanılan programlama dili olan TurtleScript başka dillere çevrilebilen bir yapıya sahiptir. - - diff --git a/desktop/kde6/applications/kwalletmanager-kf6/actions.py b/desktop/kde6/applications/kwalletmanager-kf6/actions.py deleted file mode 100755 index 43c04d9cb8..0000000000 --- a/desktop/kde6/applications/kwalletmanager-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/kwalletmanager-kf6/pspec.xml b/desktop/kde6/applications/kwalletmanager-kf6/pspec.xml deleted file mode 100755 index b15ce01359..0000000000 --- a/desktop/kde6/applications/kwalletmanager-kf6/pspec.xml +++ /dev/null @@ -1,178 +0,0 @@ - - - - - kwalletmanager-kf6 - https://userbase.kde.org/KDE_Wallet_Manager - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - kwallet-kf6 - app:gui - desktop.kde.utils - A wallet management tool - kwalletmanager-kf6 is a tool to manage the passwords on your system. By using the KDE wallet subsystem it not only allows you to keep your own secrets but also to access and manage the passwords of every application that integrates with the wallet. - mirrors://kde/stable/release-service/24.12.1/src/kwalletmanager-24.12.1.tar.xz - - qt6-base - kdoctools-kf6-devel - cmake - extra-cmake-modules-kf6 - kcoreaddons-kf6-devel - kauth-kf6-devel - kwallet-kf6-devel - kservice-kf6-devel - kcmutils-kf6-devel - - kio-kf6-devel - karchive-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kdbusaddons-kf6-devel - mesa-devel - kwindowsystem-kf6-devel - kstatusnotifieritem-kf6-devel - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - knotifications-kf6-devel - - - - - kwalletmanager-kf6 - - qt6-base - kcmutils-kf6 - - kio-kf6 - kauth-kf6 - ki18n-kf6 - kio-kf6 - kjobwidgets-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - karchive-kf6 - kservice-kf6 - kitemviews-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kwindowsystem-kf6 - kstatusnotifieritem-kf6 - - - /etc/dbus-1/system.d/org.kde.kcontrol.kcmkwallet-kf65.conf - /etc/xdg - /usr/lib - /usr/lib/qt6 - /usr/share/doc - /usr/bin - /usr/share - /usr/share/icons - /usr/share/applications - /usr/share/polkit-1/actions/org.kde.kcontrol.kcmkwallet-kf65.policy - /usr/share/dbus-1/system-services/org.kde.kcontrol.kcmkwallet-kf65.service - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kwalletmanager-kf6/translations.xml b/desktop/kde6/applications/kwalletmanager-kf6/translations.xml deleted file mode 100755 index 686b01f8a5..0000000000 --- a/desktop/kde6/applications/kwalletmanager-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kwallet-kf6 - Bir cüzdan yönetim aracı - kwalletmanager-kf6, sisteminizdeki parolaları yönetmek için bir araçtır. - - diff --git a/desktop/kde6/applications/kwave-kf6/actions.py b/desktop/kde6/applications/kwave-kf6/actions.py deleted file mode 100755 index 65b856fda6..0000000000 --- a/desktop/kde6/applications/kwave-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import kde5 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("AUTHORS", "CHANGES", "LICENSES", "GNU-LICENSE", "README*") - diff --git a/desktop/kde6/applications/kwave-kf6/pspec.xml b/desktop/kde6/applications/kwave-kf6/pspec.xml deleted file mode 100755 index 3e306098b9..0000000000 --- a/desktop/kde6/applications/kwave-kf6/pspec.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - kwave-kf6 - http://kwave-kf6.sourceforge.net/ - - Stefan Gronewold - groni@pisilinux.org - - GPL - A sound editor for KDE - With kwave-kf6 you can record, play back, import and edit many sorts of audio files including multi channel files.kwave-kf6 includes some plugins to transform audio files in several ways and presents a graphical view with a complete zoom- and scroll capability. - http://download.kde.org/stable/release-service/24.12.1/src/kwave-24.12.1.tar.xz - - doxygen - kdoctools-devel - librsvg-devel - qt6-base-devel - qt6-multimedia-devel - kwidgetsaddons-devel - kxmlgui-devel - kio-devel - audiofile-devel - libsamplerate-devel - alsa-lib-devel - flac-devel - libopus-devel - libogg-devel - libvorbis-devel - fftw3-devel - id3lib-devel - libmad-devel - karchive-devel - ktextwidgets-devel - kiconthemes-devel - pulseaudio-libs-devel - extra-cmake-modules - - - - - kwave-kf6 - A sound editor for KDE - - kio-kf6 - flac - fftw3 - ki18n-kf6 - id3lib - libmad - kcrash-kf6 - karchive-kf6 - libgcc - libogg - kconfig-kf6 - kxmlgui-kf6 - libopus - alsa-lib - kservice-kf6 - qt6-base - audiofile - libvorbis - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - libsamplerate - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-multimedia - pulseaudio-libs - - - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/kwordquiz-kf6/actions.py b/desktop/kde6/applications/kwordquiz-kf6/actions.py deleted file mode 100755 index eaba135472..0000000000 --- a/desktop/kde6/applications/kwordquiz-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "AUTHORS", "README") diff --git a/desktop/kde6/applications/kwordquiz-kf6/pspec.xml b/desktop/kde6/applications/kwordquiz-kf6/pspec.xml deleted file mode 100755 index 82f357f3ab..0000000000 --- a/desktop/kde6/applications/kwordquiz-kf6/pspec.xml +++ /dev/null @@ -1,177 +0,0 @@ - - - - - kwordquiz-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.edu - kwordquiz-kf6 is a Flash Card Trainer - kwordquiz-kf6 is a tool that gives you a powerful way to master new vocabularies. It may be a language or any other kind of terminology.. - mirrors://kde/stable/release-service/24.12.1/src/kwordquiz-24.12.1.tar.xz - - qt6-svg-devel - qt6-base-devel - qt6-declarative-devel - qt6-multimedia-devel - gettext-devel - ki18n-kf6-devel - kcrash-kf6-devel - sonnet-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - kitemviews-kf6-devel - knotifyconfig-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - knotifications-kf6-devel - kxmlgui-kf6-devel - - kdeclarative-kf6-devel - kcoreaddons-kf6-devel - kwindowsystem-kf6-devel - kwidgetsaddons-kf6-devel - qt6-phonon-devel - libkeduvocdocument-kf6-devel - extra-cmake-modules-kf6 - - - cmake - - kitemmodels-kf6-devel - - kirigami-addons-kf6 - kirigami-kf6-devel - kunitconversion-kf6-devel - - - - - kwordquiz-kf6 - - qt6-svg - qt6-base - qt6-phonon - ki18n-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kguiaddons-kf6 - kiconthemes-kf6 - kitemviews-kf6 - knotifyconfig-kf6 - knewstuff-kf6 - knotifications-kf6 - kxmlgui-kf6 - libgcc - kcoreaddons-kf6 - kwindowsystem-kf6 - kwidgetsaddons-kf6 - libkeduvocdocument-kf6 - qt6-declarative - qt6-multimedia - - - /etc/xdg - /usr/bin - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libgravatar-kf6/actions.py b/desktop/kde6/applications/libgravatar-kf6/actions.py deleted file mode 100755 index a7464b1612..0000000000 --- a/desktop/kde6/applications/libgravatar-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/libgravatar-kf6/files/qt5.patch b/desktop/kde6/applications/libgravatar-kf6/files/qt5.patch deleted file mode 100755 index 6b9d1c1bac..0000000000 --- a/desktop/kde6/applications/libgravatar-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:04:01.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 23:53:34.310174957 +0300 -@@ -23,7 +23,7 @@ - include(ECMCoverageOption) - - --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - set(libgravatar-kf6_LIB_VERSION ${PIM_VERSION}) - set(pimcommon-kf6_LIB_VERSION "5.7.0") - find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Widgets Test Network) diff --git a/desktop/kde6/applications/libgravatar-kf6/pspec.xml b/desktop/kde6/applications/libgravatar-kf6/pspec.xml deleted file mode 100755 index cd270d9bef..0000000000 --- a/desktop/kde6/applications/libgravatar-kf6/pspec.xml +++ /dev/null @@ -1,188 +0,0 @@ - - - - - libgravatar-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - KDE PIM library providing Gravatar support - KDE PIM library providing Gravatar support - mirrors://kde/stable/release-service/24.12.1/src/libgravatar-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - pimcommon-kf6-devel - cmake - extra-cmake-modules-kf6 - openldap-client - cyrus-sasl-devel - kitemviews-kf6-devel - kio-kf6-devel - - - kdoctools-kf6-devel - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - - kcontacts-kf6-devel - kcalendarcore-kf6-devel - - - extra-cmake-modules-kf6 - - - - - kdoctools-kf6-devel - knewstuff-kf6-devel - kpimtextedit-kf6-devel - - - - boost-devel - - - - - - - - libgravatar-kf6 - - qt6-base - kxmlgui-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kservice-kf6 - kcoreaddons-kf6 - pimcommon-kf6 - ktextwidgets-kf6 - kwidgetsaddons-kf6 - - - - /usr/lib - /usr/bin - /usr/share - /usr/share/icons - /etc - - - - - libgravatar-kf6-devel - Development files for libgravatar-kf6 - - libgravatar-kf6 - qt6-base-devel - kxmlgui-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - - - /usr/include - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libkcddb-kf6/actions.py b/desktop/kde6/applications/libkcddb-kf6/actions.py deleted file mode 100755 index 7abfbf3b3e..0000000000 --- a/desktop/kde6/applications/libkcddb-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import shelltools -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("TODO") diff --git a/desktop/kde6/applications/libkcddb-kf6/pspec.xml b/desktop/kde6/applications/libkcddb-kf6/pspec.xml deleted file mode 100755 index 268ad14054..0000000000 --- a/desktop/kde6/applications/libkcddb-kf6/pspec.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - - - libkcddb-kf6 - https://projects.kde.org/projects/kde/kdemultimedia/audiocd-kio-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.multimedia - KDE library for CDDB (Compact Disc Database) - KDE library for CDDB (Compact Disc Database). - mirrors://kde/stable/release-service/24.12.1/src/libkcddb-24.12.1.tar.xz - - extra-cmake-modules-kf6 - musicbrainz5-devel - kdoctools-kf6-devel - kconfig-kf6-devel - kcodecs-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kcmutils-kf6-devel - qt6-base-devel - qt6-5compat-devel - kwidgetsaddons-kf6-devel - - - - - libkcddb-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kcmutils-kf6 - qt6-base - qt6-5compat - kcoreaddons-kf6 - musicbrainz5 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/kservice-kf6s5 - /usr/share/config.kcfg - /usr/lib - /usr/share/doc - /usr/include - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-25 - 24.08.3 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libkcddb-kf6/translations.xml b/desktop/kde6/applications/libkcddb-kf6/translations.xml deleted file mode 100755 index 0a869995e9..0000000000 --- a/desktop/kde6/applications/libkcddb-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - libkcddb-kf6 - CDDB için KDE kitaplığı (Compact Disc Database) - CDDB için KDE kitaplığı (Compact Disc Database). - - diff --git a/desktop/kde6/applications/libkcompactdisc-kf6/actions.py b/desktop/kde6/applications/libkcompactdisc-kf6/actions.py deleted file mode 100755 index 28bfc6c22a..0000000000 --- a/desktop/kde6/applications/libkcompactdisc-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING", "COPYING.LIB") diff --git a/desktop/kde6/applications/libkcompactdisc-kf6/pspec.xml b/desktop/kde6/applications/libkcompactdisc-kf6/pspec.xml deleted file mode 100755 index c92b17d34d..0000000000 --- a/desktop/kde6/applications/libkcompactdisc-kf6/pspec.xml +++ /dev/null @@ -1,158 +0,0 @@ - - - - - libkcompactdisc-kf6 - https://www.kde.org/applications/multimedia/ - - Stefan Gronewold - groni@pisilinux.org - - GPL - LGPL - FDL - library - A library for interfacing with CDs - A library for interfacing with CDs - - alsa-lib-devel - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - kcoreaddons-kf6-devel - - ki18n-kf6-devel - qt6-base-devel - solid-kf6-devel - - kdoctools-kf6-devel - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - qt6-phonon-devel - - mirrors://kde/stable/release-service/24.12.1/src/libkcompactdisc-24.12.1.tar.xz - - - - libkcompactdisc-kf6 - A library for interfacing with CDs - - alsa-lib - kcoreaddons-kf6 - - ki18n-kf6 - qt6-base - libgcc - qt6-phonon - solid-kf6 - - - /usr/lib - /usr/lib/qt6 - /usr/share/doc - /usr/share/locale - - - - - libkcompactdisc-kf6-devel - Development files for libkcompactdisc-kf6 - - libkcompactdisc-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libkdcraw-kf6/actions.py b/desktop/kde6/applications/libkdcraw-kf6/actions.py deleted file mode 100755 index 120217881d..0000000000 --- a/desktop/kde6/applications/libkdcraw-kf6/actions.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/applications/libkdcraw-kf6/pspec.xml b/desktop/kde6/applications/libkdcraw-kf6/pspec.xml deleted file mode 100755 index a318c070b7..0000000000 --- a/desktop/kde6/applications/libkdcraw-kf6/pspec.xml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - libkdcraw-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - libkdcraw-kf6 - desktop.kde6.graphics - A C++ interface around LibRaw library - libkdcraw-kf6 is a C++ interface around LibRaw library used to decode RAW picture files. - mirrors://kde/stable/release-service/24.12.1/src/libkdcraw-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - libraw-devel - kconfig-kf6-devel - ki18n-kf6-devel - cmake - extra-cmake-modules-kf6 - qca2-qt6-devel - - - - - libkdcraw-kf6 - - qt6-base - libraw - kconfig-kf6 - ki18n-kf6 - libgcc - - - /usr/lib - /usr/bin - /usr/share/icons - /usr/share/ - - - - - libkdcraw-kf6-devel - Development files for libkdcraw-kf6 - - libkdcraw-kf6 - qt6-base-devel - libraw-devel - kconfig-kf6-devel - ki18n-kf6-devel - - - /usr/include - /usr/lib/pkgconfig - /usr/share/apps/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libkdcraw-kf6/translations.xml b/desktop/kde6/applications/libkdcraw-kf6/translations.xml deleted file mode 100755 index 6358a5ae82..0000000000 --- a/desktop/kde6/applications/libkdcraw-kf6/translations.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - libkdcraw-kf6 - LibRaw kitaplığı için C++ arayüzü - libkdcraw-kf6, RAW resim dosyalarını çözmek için kullanılan LibRaW kitaplığının C++ arayüzüdür. - - - - libkdcraw-kf6-devel - libkdcraw-kf6 için geliştirme dosyaları - - diff --git a/desktop/kde6/applications/libkdegames-kf6/actions.py b/desktop/kde6/applications/libkdegames-kf6/actions.py deleted file mode 100755 index 40877119e1..0000000000 --- a/desktop/kde6/applications/libkdegames-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README") diff --git a/desktop/kde6/applications/libkdegames-kf6/pspec.xml b/desktop/kde6/applications/libkdegames-kf6/pspec.xml deleted file mode 100755 index a752e77615..0000000000 --- a/desktop/kde6/applications/libkdegames-kf6/pspec.xml +++ /dev/null @@ -1,185 +0,0 @@ - - - - - libkdegames-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.games - Common code and data for many KDE games - Common code and data for many KDE games - mirrors://kde/stable/release-service/24.12.1/src/libkdegames-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kdnssd-kf6-devel - openal-devel - cmake - extra-cmake-modules-kf6 - python3 - kdeclarative-kf6-devel - knewstuff-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - libgcc - kconfig-kf6-devel - kxmlgui-kf6-devel - qt6-svg-devel - karchive-kf6-devel - kguiaddons-kf6-devel - libsndfile-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - qt6-declarative-devel - mesa-devel - kitemmodels-kf6-devel - kglobalaccel-devel - ktextwidgets-kf6-devel - kunitconversion-kf6-devel - - - - - libkdegames-kf6 - - qt6-base - - kdnssd-kf6 - kdeclarative-kf6 - knewstuff-kf6 - kio-kf6 - ki18n-kf6 - libgcc - openal - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - karchive-kf6 - kguiaddons-kf6 - libsndfile - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kglobalaccel - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - - - /etc/xdg - /usr/share - /usr/bin - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - libkdegames-kf6-devel - Shared libraries for KDE games. - - libkdegames-kf6 - kcompletion-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libkdepim-kf6/actions.py b/desktop/kde6/applications/libkdepim-kf6/actions.py deleted file mode 100755 index 120217881d..0000000000 --- a/desktop/kde6/applications/libkdepim-kf6/actions.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/applications/libkdepim-kf6/files/qt5.patch b/desktop/kde6/applications/libkdepim-kf6/files/qt5.patch deleted file mode 100755 index e890147bb1..0000000000 --- a/desktop/kde6/applications/libkdepim-kf6/files/qt5.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:04:03.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 22:15:57.334597567 +0300 -@@ -25,7 +25,7 @@ - - set(libkdepim-kf6_LIB_VERSION ${PIM_VERSION}) - set(AKONADICONTACT_LIB_VERSION "5.7.0") --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - set(kldap-kf6_LIB_VERSION "5.7.0") - set(kcontacts-kf6_LIB_VERSION "5.7.0") - set(AKONADISEARCH_LIB_VERSION "5.7.0") -diff -Nuar a/src/libkdepim-kf6akonadi/addressline/addresslineedit/addresseelineedit_p.cpp b/src/libkdepim-kf6akonadi/addressline/addresslineedit/addresseelineedit_p.cpp ---- a/src/libkdepim-kf6akonadi/addressline/addresslineedit/addresseelineedit_p.cpp 2017-12-04 13:20:38.000000000 +0300 -+++ b/src/libkdepim-kf6akonadi/addressline/addresslineedit/addresseelineedit_p.cpp 2017-12-16 22:23:46.137563740 +0300 -@@ -498,7 +498,9 @@ - break; - } - //else: fall-through to the CompletionPopup case -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - - case kcompletion-kf6::CompletionPopup: - { diff --git a/desktop/kde6/applications/libkdepim-kf6/pspec.xml b/desktop/kde6/applications/libkdepim-kf6/pspec.xml deleted file mode 100755 index 826a3fd97f..0000000000 --- a/desktop/kde6/applications/libkdepim-kf6/pspec.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - - - libkdepim-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - Libraries for KDE PIM applications - Libraries for KDE PIM applications - mirrors://kde/stable/release-service/24.12.1/src/libkdepim-24.12.1.tar.xz - - qt6-base-devel - qt6-designer-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - akonadi-kf6-devel - kjobwidgets-kf6-devel - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - - - solid-kf6-devel - cmake - extra-cmake-modules-kf6 - boost-devel - kmime-kf6-devel - kcmutils-kf6-devel - kldap-kf6-devel - kio-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - cyrus-sasl-devel - kcontacts-kf6-devel - akonadi-contacts-kf6-devel - akonadi-search-kf6-devel - akonadi-mime-kf6-devel - - - - - - - - libkdepim-kf6 - - kio-kf6 - ki18n-kf6 - kldap-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kwallet-kf6 - kcmutils-kf6 - qt6-base - qt6-designer - kcontacts-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - akonadi-search-kf6 - akonadi-contacts-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/lib - /usr/bin - /usr/share - /usr/share/icons - /etc - - - - - libkdepim-kf6-devel - Development files for libkdepim-kf6 - - libkdepim-kf6 - qt6-base-devel - qt6-designer-devel - kxmlgui-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - - - /usr/include - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libkeduvocdocument-kf6/actions.py b/desktop/kde6/applications/libkeduvocdocument-kf6/actions.py deleted file mode 100755 index b29afbc032..0000000000 --- a/desktop/kde6/applications/libkeduvocdocument-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/libkeduvocdocument-kf6/pspec.xml b/desktop/kde6/applications/libkeduvocdocument-kf6/pspec.xml deleted file mode 100755 index ac9a03352e..0000000000 --- a/desktop/kde6/applications/libkeduvocdocument-kf6/pspec.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - - - libkeduvocdocument-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:library - Common libraries for KDE Edu applications - Libraries for KDE EDU applications. - mirrors://kde/stable/release-service/24.12.1/src/libkeduvocdocument-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - ki18n-kf6-devel - kio-kf6-devel - karchive-kf6-devel - mesa-devel - - - - - libkeduvocdocument-kf6 - - qt6-base - karchive-kf6 - libgcc - ki18n-kf6 - kio-kf6 - kcoreaddons-kf6 - - - /usr/lib - /usr/share/doc - /usr/share/locale - - - - - libkeduvocdocument-kf6-devel - Development files for libkeduvocdocument-kf6 - - libkeduvocdocument-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libkexiv2-kf6/actions.py b/desktop/kde6/applications/libkexiv2-kf6/actions.py deleted file mode 100755 index 120217881d..0000000000 --- a/desktop/kde6/applications/libkexiv2-kf6/actions.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/applications/libkexiv2-kf6/pspec.xml b/desktop/kde6/applications/libkexiv2-kf6/pspec.xml deleted file mode 100755 index b2906f9482..0000000000 --- a/desktop/kde6/applications/libkexiv2-kf6/pspec.xml +++ /dev/null @@ -1,138 +0,0 @@ - - - - - libkexiv2-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - An Exiv2 wrapper library - libkexiv2-kf6 is a wrapper around Exiv2 library to manipulate pictures metadata as EXIF/IPTC and XMP. - mirrors://kde/stable/release-service/24.12.1/src/libkexiv2-24.12.1.tar.xz - - extra-cmake-modules-kf6 - cmake - exiv2-devel - qt6-base-devel - qt6-5compat-devel - - - - - libkexiv2-kf6 - - qt6-base - qt6-5compat - exiv2-libs - libgcc - - - /usr/lib - /usr/bin - /usr/share/qlogging-categories6/libkexiv2.categories - - - - - libkexiv2-kf6-devel - Development files for libkexiv2-kf6 - - libkexiv2-kf6 - - - /usr/include - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libkexiv2-kf6/translations.xml b/desktop/kde6/applications/libkexiv2-kf6/translations.xml deleted file mode 100755 index 04c9ed5061..0000000000 --- a/desktop/kde6/applications/libkexiv2-kf6/translations.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - libkexiv2-kf6 - Exiv2 sarmalayıcı kitaplığı - libkexiv2-kf6, EXIF/IPTC ve XMP gibi resim meta bilgilerini düzenlemek için kullanılan Exiv2 kitaplığını sarmalayan bir kitaplıktır. - - - - libkexiv2-kf6-devel - libkexiv2-kf6 için geliştirme dosyaları - - diff --git a/desktop/kde6/applications/libkgapi-kf6/actions.py b/desktop/kde6/applications/libkgapi-kf6/actions.py deleted file mode 100755 index 3e854e14b4..0000000000 --- a/desktop/kde6/applications/libkgapi-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("AUTHORS", "README*") diff --git a/desktop/kde6/applications/libkgapi-kf6/files/DateTime.patch b/desktop/kde6/applications/libkgapi-kf6/files/DateTime.patch deleted file mode 100755 index 6a1473efe1..0000000000 --- a/desktop/kde6/applications/libkgapi-kf6/files/DateTime.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/src/core/utils.cpp b/src/core/utils.cpp -index 5346bd4..3ba7122 100644 ---- a/src/core/utils.cpp -+++ b/src/core/utils.cpp -@@ -44,8 +44,5 @@ QString Utils::bool2Str(bool val) - - QString Utils::ts2Str(quint64 ts) - { -- QDateTime dt; -- dt.setTime_t(ts); -- dt.setTimeSpec(Qt::UTC); -- return dt.toString(Qt::ISODate); -+ return QDateTime::fromTime_t(ts, Qt::UTC, 0).toString(Qt::ISODate); - } --- diff --git a/desktop/kde6/applications/libkgapi-kf6/files/latitudeservice.patch b/desktop/kde6/applications/libkgapi-kf6/files/latitudeservice.patch deleted file mode 100755 index ef8c318f8d..0000000000 --- a/desktop/kde6/applications/libkgapi-kf6/files/latitudeservice.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Nuar a/src/latitude/latitudeservice.h b/src/latitude/latitudeservice.h ---- a/src/latitude/latitudeservice.h 2017-12-07 14:46:25.000000000 +0300 -+++ b/src/latitude/latitudeservice.h 2017-12-17 20:58:53.474070032 +0300 -@@ -26,6 +26,7 @@ - #include "latitude.h" - #include "kgapilatitude_export.h" - -+#include - - namespace KGAPI2 - { diff --git a/desktop/kde6/applications/libkgapi-kf6/files/qt5.patch b/desktop/kde6/applications/libkgapi-kf6/files/qt5.patch deleted file mode 100755 index 7113089ed6..0000000000 --- a/desktop/kde6/applications/libkgapi-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:04:05.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 16:43:16.638931364 +0300 -@@ -34,7 +34,7 @@ - ) - - ############## Find Packages ############## --set(REQUIRED_QT_VERSION "6.6.3") -+set(REQUIRED_QT_VERSION "6.6.3") - find_package(Qt5 ${REQUIRED_QT_VERSION} REQUIRED COMPONENTS - Core - Network diff --git a/desktop/kde6/applications/libkgapi-kf6/pspec.xml b/desktop/kde6/applications/libkgapi-kf6/pspec.xml deleted file mode 100755 index a5374d01a0..0000000000 --- a/desktop/kde6/applications/libkgapi-kf6/pspec.xml +++ /dev/null @@ -1,173 +0,0 @@ - - - - - libkgapi-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:library - Google API library for KDE - A KDE-based library for accessing various Google services via their public API - https://download.kde.org/stable/release-service/24.12.1/src/libkgapi-24.12.1.tar.xz - - qt6-base-devel - kcoreaddons-kf6-devel - libical-devel - gettext-devel - extra-cmake-modules-kf6 - - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kcontacts-kf6-devel - kwindowsystem-kf6-devel - kio-kf6-devel - kcalendarcore-kf6-devel - kdoctools-kf6-devel - qt6-linguist - qt6-webengine-devel - ffmpeg-devel - libXScrnSaver-devel - cyrus-sasl-devel - kwallet-kf6-devel - - - - - - - - - libkgapi-kf6 - - qt6-base - kcalendarcore-kf6 - kcontacts-kf6 - kio-kf6 - libgcc - kwallet-kf6 - - kwindowsystem-kf6 - - qt6-webengine - - - /etc/xdg - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - libkgapi-kf6-devel - Development files for libkgapi-kf6 - - qt6-base-devel - kcalendarcore-kf6-devel - kcontacts-kf6-devel - kio-kf6-devel - - kwindowsystem-kf6-devel - - libkgapi-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libkleo-kf6/actions.py b/desktop/kde6/applications/libkleo-kf6/actions.py deleted file mode 100755 index d17d757166..0000000000 --- a/desktop/kde6/applications/libkleo-kf6/actions.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i -e '/find_package.*QGpgme/d' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/applications/libkleo-kf6/files/qt5.patch b/desktop/kde6/applications/libkleo-kf6/files/qt5.patch deleted file mode 100755 index c27143daa8..0000000000 --- a/desktop/kde6/applications/libkleo-kf6/files/qt5.patch +++ /dev/null @@ -1,38 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:04:08.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 22:30:39.116533942 +0300 -@@ -24,7 +24,7 @@ - - - set(libkleo-kf6_LIB_VERSION ${PIM_VERSION}) --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - set(KDEPIMTEXTEDIT_VERSION "5.7.0") - - find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Widgets) -diff -Nuar a/src/kleo/dn.cpp b/src/kleo/dn.cpp ---- a/src/kleo/dn.cpp 2017-12-04 13:20:17.000000000 +0300 -+++ b/src/kleo/dn.cpp 2017-12-16 22:35:27.941513102 +0300 -@@ -298,7 +298,9 @@ - case ';': - result += QLatin1Char('\\'); - // fall through -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - default: - result += ch; - } -diff -Nuar a/src/utils/formatting.cpp b/src/utils/formatting.cpp ---- a/src/utils/formatting.cpp 2017-12-04 13:20:17.000000000 +0300 -+++ b/src/utils/formatting.cpp 2017-12-16 22:40:08.089492888 +0300 -@@ -593,7 +593,9 @@ - return i18nc("good/valid signature", "good"); - } - } -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - // fall through: - case UserID::Signature::GeneralError: - return i18n("invalid"); diff --git a/desktop/kde6/applications/libkleo-kf6/pspec.xml b/desktop/kde6/applications/libkleo-kf6/pspec.xml deleted file mode 100755 index 891187d7e1..0000000000 --- a/desktop/kde6/applications/libkleo-kf6/pspec.xml +++ /dev/null @@ -1,220 +0,0 @@ - - - - - libkleo-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - library - KDE PIM cryptographic library - KDE PIM cryptographic library - mirrors://kde/stable/release-service/24.12.1/src/libkleo-24.12.1.tar.xz - - qt6-base-devel - boost-devel - gpgme-qt6-devel - - qt6-sql-sqlite - qt6-sql-mysql - qt6-sql-odbc - qt6-sql-postgresql - prison-kf6-devel - - qt6-phonon-devel - - libical-devel - - libgpg-error-devel - libxslt-devel - openldap-client - cyrus-sasl-devel - kitemviews-kf6-devel - kio-kf6-devel - - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - kcontacts-kf6-devel - kcalendarcore-kf6-devel - - extra-cmake-modules-kf6 - kpimtextedit-kf6-devel - - - - - - - - - libkleo-kf6 - - qt6-base - kio-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - - - kxmlgui-kf6 - kcalendarcore-kf6 - kcontacts-kf6 - kconfig-kf6 - libxml2 - kservice-kf6 - kguiaddons-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - qt6-phonon - prison-kf6 - - gpgme - gpgme-qt6 - kpimtextedit-kf6 - kwindowsystem-kf6 - cyrus-sasl - - - - /etc/xdg - /usr/lib - /usr/share/doc - /usr/mkspecs/ - /usr/bin - /usr/share/mime - /usr/share/icons - /usr/share/kservice-kf6s5 - /usr/share/kservice-kf6types5 - /usr/share/dbus-1 - /usr/share/config.kcfg - /usr/share/kf5 - /usr/share/config - /usr/share/akonadi - /usr/share/akonadicontact/grantleetheme/default - /usr/share/libkleopatra - /usr/share/KPim6Libkleo - /usr/share/locale - /usr/share/qlogging-categories6/libkleo.renamecategories - /usr/share/qlogging-categories6/libkleo.categories - - - - - libkleo-kf6-devel - Development package for libkleo-kf6 libraries - Contains development tools and header files for libkleo-kf6 - - qt6-base-devel - boost-devel - gpgme-devel - gpgme-qt6-devel - libkleo-kf6 - - - /usr/lib/cmake - /usr/include - /usr/lib/gpgmepp - /usr/share/kde4/apps/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libkmahjongg-kf6/actions.py b/desktop/kde6/applications/libkmahjongg-kf6/actions.py deleted file mode 100755 index 40877119e1..0000000000 --- a/desktop/kde6/applications/libkmahjongg-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README") diff --git a/desktop/kde6/applications/libkmahjongg-kf6/pspec.xml b/desktop/kde6/applications/libkmahjongg-kf6/pspec.xml deleted file mode 100755 index f5a4dd40a0..0000000000 --- a/desktop/kde6/applications/libkmahjongg-kf6/pspec.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - libkmahjongg-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:library - desktop.kde.games - Common code, backgrounds and tile sets for games using Mahjongg tiles - Common code, backgrounds and tile sets for games using Mahjongg tiles. - mirrors://kde/stable/release-service/24.12.1/src/libkmahjongg-24.12.1.tar.xz - - qt6-base-devel - qt6-svg-devel - extra-cmake-modules-kf6 - gettext-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcompletion-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kcoreaddons-kf6-devel - mesa-devel - - - - - libkmahjongg-kf6 - - qt6-base - qt6-svg - libgcc - ki18n-kf6 - kconfig-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/lib - /usr/share/doc - - - - libkmahjongg-kf6-devel - Development files for libkmahjongg-kf6 - - libkmahjongg-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libkomparediff2-kf6/actions.py b/desktop/kde6/applications/libkomparediff2-kf6/actions.py deleted file mode 100755 index 7ced3346be..0000000000 --- a/desktop/kde6/applications/libkomparediff2-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING") diff --git a/desktop/kde6/applications/libkomparediff2-kf6/pspec.xml b/desktop/kde6/applications/libkomparediff2-kf6/pspec.xml deleted file mode 100755 index 2ceeeba4a0..0000000000 --- a/desktop/kde6/applications/libkomparediff2-kf6/pspec.xml +++ /dev/null @@ -1,178 +0,0 @@ - - - - - libkomparediff2-kf6 - https://projects.kde.org/projects/kde/kdesdk/libkomparediff2-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde.sdk - Library to compare files and strings - Library to compare files and strings - mirrors://kde/stable/release-service/24.12.1/src/libkomparediff2-24.12.1.tar.xz - - qt6-base-devel - qt6-5compat-devel - extra-cmake-modules-kf6 - python3-devel - gettext-devel - kcoreaddons-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kparts-kf6-devel - - - - - - - libkomparediff2-kf6 - - qt6-base - qt6-5compat - kio-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - - - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - libkomparediff2-kf6-devel - Shared libraries for libkomparediff2-kf6. - - libkomparediff2-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libksane-kf6/actions.py b/desktop/kde6/applications/libksane-kf6/actions.py deleted file mode 100755 index ef25e7fccf..0000000000 --- a/desktop/kde6/applications/libksane-kf6/actions.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - - -from pisi.actionsapi import kde6 - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/applications/libksane-kf6/pspec.xml b/desktop/kde6/applications/libksane-kf6/pspec.xml deleted file mode 100755 index 0202106d54..0000000000 --- a/desktop/kde6/applications/libksane-kf6/pspec.xml +++ /dev/null @@ -1,148 +0,0 @@ - - - - - libksane-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde.graphics - SANE library interface for KDE - libksane-kf6 is a SANE library interface for KDE. - mirrors://kde/stable/release-service/24.12.1/src/libksane-24.12.1.tar.xz - - ki18n-kf6-devel - kwallet-kf6-devel - qt6-base-devel - ktextwidgets-kf6-devel - sane-backends-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - ksanecore-kf6-devel - - - - - libksane-kf6 - - ki18n-kf6 - kwallet-kf6 - libgcc - qt6-base - ktextwidgets-kf6 - sane-backends - kwidgetsaddons-kf6 - ksanecore-kf6 - - - /usr/lib - /usr/share/icons - /usr/share/locale - - - - - libksane-kf6-devel - Development files for libksane-kf6 - - libksane-kf6 - ksanecore-kf6-devel - - - /usr/lib/cmake - /usr/include - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libksane-kf6/translations.xml b/desktop/kde6/applications/libksane-kf6/translations.xml deleted file mode 100755 index 59692a0edd..0000000000 --- a/desktop/kde6/applications/libksane-kf6/translations.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - libksane-kf6 - KDE için SANE kitaplık arayüzü - libksane-kf6, KDE için bir SANE kitaplık arayüzüdür. - - - - libksane-kf6-devel - libksane-kf6 için geliştirme dosyaları - - diff --git a/desktop/kde6/applications/libksieve-kf6/actions.py b/desktop/kde6/applications/libksieve-kf6/actions.py deleted file mode 100755 index 82e40ee4b1..0000000000 --- a/desktop/kde6/applications/libksieve-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/libksieve-kf6/files/qt5.patch b/desktop/kde6/applications/libksieve-kf6/files/qt5.patch deleted file mode 100755 index 92cb97460c..0000000000 --- a/desktop/kde6/applications/libksieve-kf6/files/qt5.patch +++ /dev/null @@ -1,35 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:04:12.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 23:59:08.782150823 +0300 -@@ -26,7 +26,7 @@ - include(ECMCoverageOption) - - set(libksieve-kf6_LIB_VERSION ${PIM_VERSION}) --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - set(kmime-kf6_LIB_VERSION "5.7.0") - set(IDENTITYMANAGEMENT_LIB_VERSION "5.7.0") - set(kmailtransport-kf6_LIB_VERSION "5.7.0") -diff -Nuar a/src/parser/lexer.cpp b/src/parser/lexer.cpp ---- a/src/parser/lexer.cpp 2017-12-04 13:20:12.000000000 +0300 -+++ b/src/parser/lexer.cpp 2017-12-17 00:05:50.587121831 +0300 -@@ -294,7 +294,9 @@ - // and CRLF! That should be preserved somehow... - return MultiLineString; - } -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - default: // Identifier (first must not be 0-9, and can't (caught by Number above)) - if (!isIText(*mState.cursor)) { - makeError(Error::IllegalCharacter); -@@ -688,7 +690,9 @@ - if (atEnd()) { - break; - } -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - default: - if (!is8Bit(*mState.cursor)) { - result += QLatin1Char(*mState.cursor++); diff --git a/desktop/kde6/applications/libksieve-kf6/pspec.xml b/desktop/kde6/applications/libksieve-kf6/pspec.xml deleted file mode 100755 index dc7eb98c49..0000000000 --- a/desktop/kde6/applications/libksieve-kf6/pspec.xml +++ /dev/null @@ -1,196 +0,0 @@ - - - - - libksieve-kf6 - https://community.kde.org/KDE_PIM - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - KDE PIM library for managing sieves. - KDE PIM library for managing sieves. - mirrors://kde/stable/release-service/24.12.1/src/libksieve-24.12.1.tar.xz - - kio-kf6-devel - extra-cmake-modules-kf6 - qt6-base-devel - akonadi-kf6-devel - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kcoreaddons-kf6-devel - kservice-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - - kdoctools-kf6-devel - - - kunitconversion-kf6-devel - boost-devel - - pimcommon-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - kimap-kf6-devel - kmime-kf6-devel - cyrus-sasl-devel - knewstuff-kf6-devel - kidentitymanagement-kf6-devel - kmailtransport-kf6-devel - libkdepim-kf6-devel - qt6-webengine-devel - akonadi-contacts-kf6-devel - akonadi-mime-kf6-devel - kiconthemes-kf6-devel - karchive-kf6-devel - syntax-highlighting-kf6-devel - - - - - - - - libksieve-kf6 - KDE PIM library for managing sieves. - - kio-kf6 - ki18n-kf6 - kmime-kf6 - libgcc - sonnet-kf6 - akonadi-kf6 - kconfig-kf6 - karchive-kf6 - qt6-base - knewstuff-kf6 - libkdepim-kf6 - pimcommon-kf6 - cyrus-sasl - - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kpimtextedit-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kidentitymanagement-kf6 - syntax-highlighting-kf6 - qt6-webengine - - - /etc - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/sieve - /usr/share/doc/HTML - /usr/share/kservice-kf6s5 - /usr/share/locale - - - - - libksieve-kf6-devel - Development files for libksieve-kf6. - - libksieve-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libktorrent-kf6/actions.py b/desktop/kde6/applications/libktorrent-kf6/actions.py deleted file mode 100644 index 77092055ee..0000000000 --- a/desktop/kde6/applications/libktorrent-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("ChangeLog", "LICENSES/*") diff --git a/desktop/kde6/applications/libktorrent-kf6/pspec.xml b/desktop/kde6/applications/libktorrent-kf6/pspec.xml deleted file mode 100644 index 5a10d07a15..0000000000 --- a/desktop/kde6/applications/libktorrent-kf6/pspec.xml +++ /dev/null @@ -1,155 +0,0 @@ - - - - - libktorrent-kf6 - https://apps.kde.org/ktorrent/ - - Kamil Atlı - suvari@pisilinux.org - - GPLv2 - library - A BitTorrent protocol implementation - ktorrent-kf6 is a BitTorrent application by KDE which allows you to download files using the BitTorrent protocol. - https://download.kde.org/stable/release-service/24.12.1/src/libktorrent-24.12.1.tar.xz - - doxygen - gmp-devel - kio-kf6-devel - boost-devel - solid-kf6-devel - ki18n-kf6-devel - kcrash-kf6-devel - karchive-kf6-devel - qt6-base-devel - qt6-5compat-devel - qca2-qt6-devel - libgcrypt-devel - kcoreaddons-kf6-devel - extra-cmake-modules-kf6 - - - - - libktorrent-kf6 - - gmp - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - qt6-base - qt6-5compat - qca2-qt6 - karchive-kf6 - libgcrypt - kcoreaddons-kf6 - - - /usr/share/locale - /usr/lib/libKTorrent6.so* - /usr/share/doc - - - - - libktorrent-kf6-devel - libktorrent-kf6 development headers - - qt6-5compat-devel - libktorrent-kf6 - - - /usr/include - /usr/lib/cmake/KTorrent6 - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/libktorrent-kf6/translations.xml b/desktop/kde6/applications/libktorrent-kf6/translations.xml deleted file mode 100644 index c21480eec0..0000000000 --- a/desktop/kde6/applications/libktorrent-kf6/translations.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - libktorrent-kf6 - Bir BitTorrent protokol uygulaması - ktorrent-kf6, KDE'nin BitTorrent protokolünü kullanarak dosya indirmenize izin veren bir BitTorrent uygulamasıdır. - - - - libktorrent-kf6-devel - libktorrent-kf6 için geliştirme dosyaları - - diff --git a/desktop/kde6/applications/lokalize-kf6/actions.py b/desktop/kde6/applications/lokalize-kf6/actions.py deleted file mode 100755 index 7cb3af5553..0000000000 --- a/desktop/kde6/applications/lokalize-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import kde5 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - # kde5.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/lokalize-kf6/files/lokalize_build_with_hunspell1.6.patch b/desktop/kde6/applications/lokalize-kf6/files/lokalize_build_with_hunspell1.6.patch deleted file mode 100755 index e31249039d..0000000000 --- a/desktop/kde6/applications/lokalize-kf6/files/lokalize_build_with_hunspell1.6.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- lokalize-kf6-16.12.0/cmake/FindHUNSPELL.cmake.old 2016-12-23 16:15:35.394980599 -0600 -+++ lokalize-kf6-16.12.0/cmake/FindHUNSPELL.cmake 2016-12-23 16:16:02.782697414 -0600 -@@ -14,7 +14,7 @@ - - FIND_PATH(HUNSPELL_INCLUDE_DIR hunspell/hunspell.hxx ) - --FIND_LIBRARY(HUNSPELL_LIBRARIES NAMES hunspell-2.0 hunspell-1.5 hunspell-1.4 hunspell-1.3 hunspell-1.2) -+FIND_LIBRARY(HUNSPELL_LIBRARIES NAMES hunspell-2.0 hunspell-1.6 hunspell-1.5 hunspell-1.4 hunspell-1.3 hunspell-1.2) - - # handle the QUIETLY and REQUIRED arguments and set HUNSPELL_FOUND to TRUE if - # all listed variables are TRUE diff --git a/desktop/kde6/applications/lokalize-kf6/pspec.xml b/desktop/kde6/applications/lokalize-kf6/pspec.xml deleted file mode 100755 index d2b229f3cf..0000000000 --- a/desktop/kde6/applications/lokalize-kf6/pspec.xml +++ /dev/null @@ -1,215 +0,0 @@ - - - - - lokalize-kf6 - http://www.kde.org/ - - Pisi Linux Admins - admin@pisilinux.org - - GPLv2 - app:gui - desktop.kde.sdk - lokalize-kf6 is the localization tool for KDE and other open source software - lokalize-kf6 is also a general computer-aided translation system (CAT) with which you can translate OpenDocument files (*.odt). - mirrors://kde/stable/release-service/24.12.1/src/lokalize-24.12.1.tar.xz - - qt6-base-devel - hunspell-devel - kdoctools-devel - kio-devel - enchant-devel - kitemviews-devel - ki18n-devel - kparts-devel - sonnet-devel - kconfig-devel - kxmlgui-devel - kcompletion-devel - kcoreaddons-devel - kdbusaddons-devel - ktextwidgets-devel - kconfigwidgets-devel - knotifications-devel - kwidgetsaddons-devel - pkgconfig - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - extra-cmake-modules - - - - - - - - - - - lokalize-kf6 - - qt6-base - kio-kf6 - kitemviews-kf6 - ki18n-kf6 - kparts-kf6 - libgcc - sonnet-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - hunspell - - - - - - /etc/xdg - /usr/share - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-13 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/lokalize-kf6/translations.xml b/desktop/kde6/applications/lokalize-kf6/translations.xml deleted file mode 100755 index 63174b391d..0000000000 --- a/desktop/kde6/applications/lokalize-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - lokalize-kf6 - Uygulama yerelleştirme yardımcısı. - lokalize-kf6, uygulamalar için kolaylıkla yerelleştirme yapabileceğiniz bir programdır. - - diff --git a/desktop/kde6/applications/mailcommon-kf6/actions.py b/desktop/kde6/applications/mailcommon-kf6/actions.py deleted file mode 100755 index 6ef5f51338..0000000000 --- a/desktop/kde6/applications/mailcommon-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/mailcommon-kf6/pspec.xml b/desktop/kde6/applications/mailcommon-kf6/pspec.xml deleted file mode 100755 index e6966f144b..0000000000 --- a/desktop/kde6/applications/mailcommon-kf6/pspec.xml +++ /dev/null @@ -1,213 +0,0 @@ - - - - - mailcommon-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:library - KDE PIM library providing support for mail applications - KDE PIM library providing support for mail applications - mirrors://kde/stable/release-service/24.12.1/src/mailcommon-24.12.1.tar.xz - - qt6-base-devel - qt6-phonon-devel - extra-cmake-modules-kf6 - boost-devel - glibc-devel - libical-devel - gettext-devel - qt6-designer-devel - kdoctools-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - mailimporter-kf6-devel - messagelib-kf6-devel - libgravatar-kf6-devel - kidentitymanagement-kf6-devel - kmailtransport-kf6-devel - kmbox-kf6-devel - akonadi-kf6-devel - kjobwidgets-kf6-devel - solid-kf6-devel - kitemmodels-kf6-devel - kcompletion-kf6-devel - kiconthemes-kf6-devel - - kunitconversion-kf6-devel - kmime-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - - kpimtextedit-kf6-devel - kimap-kf6-devel - kldap-kf6-devel - grantleetheme-kf6-devel - pimcommon-kf6-devel - libkleo-kf6-devel - libkdepim-kf6-devel - gpgme-devel - gpgme-qt6-devel - akonadi-mime-kf6-devel - akonadi-contacts-kf6-devel - - openldap-client - cyrus-sasl-devel - syntax-highlighting-kf6-devel - karchive-kf6-devel - kguiaddons-kf6-devel - qt6-webengine-devel - - - - - mailcommon-kf6 - - qt6-base - qt6-webengine - akonadi-contacts-kf6 - libgcc - libkdepim-kf6 - akonadi-mime-kf6 - mailimporter-kf6 - kio-kf6 - ki18n-kf6 - kmime-kf6 - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - karchive-kf6 - kcontacts-kf6 - pimcommon-kf6 - kitemviews-kf6 - messagelib-kf6 - qt6-phonon - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kpimtextedit-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - kwidgetsaddons-kf6 - kidentitymanagement-kf6 - - - /etc - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - mailcommon-kf6-devel - Development files for mailcommon-kf6 - - qt6-webengine-devel - mailcommon-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/mailimporter-kf6/actions.py b/desktop/kde6/applications/mailimporter-kf6/actions.py deleted file mode 100755 index 6ef5f51338..0000000000 --- a/desktop/kde6/applications/mailimporter-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/mailimporter-kf6/files/qt5.patch b/desktop/kde6/applications/mailimporter-kf6/files/qt5.patch deleted file mode 100755 index 956d9aed84..0000000000 --- a/desktop/kde6/applications/mailimporter-kf6/files/qt5.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:04:19.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-17 00:13:48.399087354 +0300 -@@ -28,7 +28,7 @@ - - set(AKONADIMIME_LIB_VERSION "5.7.0") - set(KDEPIM_LIB_VERSION "5.7.0") --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - set(kmime-kf6_LIB_VERSION "5.7.0") - set(AKONADI_VERSION "5.7.0") - -diff -Nuar a/src/mailimporter/filters/filterlnotes.cpp b/src/mailimporter/filters/filterlnotes.cpp ---- a/src/mailimporter/filters/filterlnotes.cpp 2017-12-04 13:20:16.000000000 +0300 -+++ b/src/mailimporter/filters/filterlnotes.cpp 2017-12-17 00:18:28.129067170 +0300 -@@ -132,7 +132,9 @@ - tempfile->setAutoRemove(false); - tempfile->open(); - // fall through -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - // inside a message state - case 1: - if (ch == 0x0c) { diff --git a/desktop/kde6/applications/mailimporter-kf6/pspec.xml b/desktop/kde6/applications/mailimporter-kf6/pspec.xml deleted file mode 100755 index bb905bd90f..0000000000 --- a/desktop/kde6/applications/mailimporter-kf6/pspec.xml +++ /dev/null @@ -1,183 +0,0 @@ - - - - - mailimporter-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:library - Mail importer library - Mail importer library - mirrors://kde/stable/release-service/24.12.1/src/mailimporter-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - pimcommon-kf6-devel - cmake - extra-cmake-modules-kf6 - openldap-client - cyrus-sasl-devel - kitemviews-kf6-devel - kio-kf6-devel - - - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - kmime-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - kldap-kf6-devel - libkdepim-kf6-devel - - akonadi-search-kf6-devel - - - knewstuff-kf6-devel - kpimtextedit-kf6-devel - kimap-kf6-devel - akonadi-kf6-devel - boost-devel - karchive-kf6-devel - akonadi-mime-kf6-devel - akonadi-contacts-kf6-devel - - - - - - - - mailimporter-kf6 - - qt6-base - akonadi-mime-kf6 - libgcc - libkdepim-kf6 - ki18n-kf6 - kmime-kf6 - akonadi-kf6 - kconfig-kf6 - karchive-kf6 - kcoreaddons-kf6 - - - /etc - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - mailimporter-kf6-devel - Development files for mailimporter-kf6 - - mailimporter-kf6 - karchive-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/marble-kf6/actions.py b/desktop/kde6/applications/marble-kf6/actions.py deleted file mode 100755 index 15de630ede..0000000000 --- a/desktop/kde6/applications/marble-kf6/actions.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import kde5 - -def setup(): - kde6.configure("-DWITH_libshp=OFF \ - -DWITH_libgps=OFF \ - -DWITH_QextSerialPort=OFF \ - -DWITH_liblocation=OFF \ - -DBUILD_marble-kf6_TOOLS=YES \ - -DBUILD_TESTING=OFF \ - -DBUILD_marble-kf6_EXAMPLES=OFF \ - -DBUILD_marble-kf6_TESTS=OFF \ - -DMOBILE=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("BUGS", "ChangeLog", "CODING", "COPYING*", "CREDITS", "LICENSES/*", "MANIFESTO.txt", "USECASES") diff --git a/desktop/kde6/applications/marble-kf6/pspec.xml b/desktop/kde6/applications/marble-kf6/pspec.xml deleted file mode 100755 index 0cb530b824..0000000000 --- a/desktop/kde6/applications/marble-kf6/pspec.xml +++ /dev/null @@ -1,185 +0,0 @@ - - - - - marble-kf6 - http://edu.kde.org/applications/all/marble-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - marble-kf6 - app:gui - Virtual globe and eorld atlas - marble-kf6 is a virtual globe and world atlas that you can use to learn more about the Earth. - mirrors://kde/stable/release-service/24.12.1/src/marble-24.12.1.tar.xz - - qt6-base-devel - qt6-designer-devel - qt6-svg-devel - qt6-declarative-devel - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-odbc - qt6-sql-sqlite - qt6-linguist - qt6-webengine-devel - qt6-5compat-devel - kdoctools-devel - qt6-phonon-devel - kio-devel - quazip-devel - kwallet-devel - knewstuff-devel - kparts-devel - kcoreaddons-devel - ki18n-devel - kconfig-devel - krunner-devel - kservice-devel - libwlocate-devel - shared-mime-info - qt6-serialport-devel - plasma-desktop - extra-cmake-modules - - - - - marble-kf6 - - kio-kf6 - zlib - ki18n-kf6 - kcrash-kf6 - kparts-kf6 - libgcc - kconfig-kf6 - krunner-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - knewstuff-kf6 - libwlocate - qt6-phonon - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - qt6-serialport - - - /usr/lib - /usr/bin - /usr/share - /usr/share/appdata - /usr/share/applications - /usr/share/config.kcfg - /usr/share/doc - /usr/share/icons - /usr/share/kservice-kf6s5 - /usr/share/kxmlgui-kf65 - /usr/share/marble-kf6 - /etc/xdg - - - - - marble-kf6-devel - Development files for marble-kf6 - - marble-kf6 - - - /usr/include - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/marble-kf6/translations.xml b/desktop/kde6/applications/marble-kf6/translations.xml deleted file mode 100755 index 2df38d0a52..0000000000 --- a/desktop/kde6/applications/marble-kf6/translations.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - marble-kf6 - Sanal küre ve Dünya atlası - marble-kf6, sanal küre ve Dünya atlası uygulamasıdır. - - - - marble-kf6-devel - marble-kf6 için geliştirme dosyaları - - diff --git a/desktop/kde6/applications/messagelib-kf6/actions.py b/desktop/kde6/applications/messagelib-kf6/actions.py deleted file mode 100755 index 69d3bd86c4..0000000000 --- a/desktop/kde6/applications/messagelib-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import shelltools - -def setup(): - shelltools.system("sed -i -e '/find_package.*QGpgme/d' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/messagelib-kf6/pspec.xml b/desktop/kde6/applications/messagelib-kf6/pspec.xml deleted file mode 100755 index daf73ed1bd..0000000000 --- a/desktop/kde6/applications/messagelib-kf6/pspec.xml +++ /dev/null @@ -1,245 +0,0 @@ - - - - - messagelib-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:library - KDE PIM library providing support for mail applications - KDE PIM library providing support for mail applications - mirrors://kde/stable/release-service/24.12.1/src/messagelib-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - boost-devel - kdoctools-kf6-devel - mailimporter-kf6-devel - libgravatar-kf6-devel - kidentitymanagement-kf6-devel - kmailtransport-kf6-devel - kmbox-kf6-devel - akonadi-kf6-devel - solid-kf6-devel - kguiaddons-kf6-devel - kitemmodels-kf6-devel - - - - kunitconversion-kf6-devel - kmime-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - - - akonadi-search-kf6-devel - syntax-highlighting-kf6-devel - kpimtextedit-kf6-devel - kimap-kf6-devel - kldap-kf6-devel - grantleetheme-kf6-devel - pimcommon-kf6-devel - libkleo-kf6-devel - libkdepim-kf6-devel - gpgme-devel - gpgme-qt6-devel - - - qt6-declarative-devel - qt6-webengine-devel - qca2-qt6-devel - - akonadi-mime-kf6-devel - akonadi-contacts-kf6-devel - openldap-client - cyrus-sasl-devel - karchive-kf6-devel - kcodecs-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - kservice-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - sonnet-kf6-devel - knewstuff-kf6-devel - syntax-highlighting-kf6 - knotifications-kf6-devel - - - - - messagelib-kf6 - - qt6-base - qt6-webengine - - libgcc - libkdepim-kf6 - mailimporter-kf6 - kio-kf6 - ki18n-kf6 - kmbox-kf6 - kmime-kf6 - sonnet-kf6 - akonadi-kf6 - gpgme - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - libkleo-kf6 - karchive-kf6 - kguiaddons-kf6 - kcalendarcore-kf6 - kservice-kf6 - kcontacts-kf6 - - pimcommon-kf6 - akonadi-mime-kf6 - kitemviews-kf6 - - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - libgravatar-kf6 - - kpimtextedit-kf6 - ktextwidgets-kf6 - grantleetheme-kf6 - kwindowsystem-kf6 - akonadi-search-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - syntax-highlighting-kf6 - akonadi-contacts-kf6 - knewstuff-kf6 - kidentitymanagement-kf6 - qca2-qt6 - knotifications-kf6 - - - /etc - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - messagelib-kf6-devel - Development files for messagelib-kf6 - - messagelib-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/mimetreeparser/actions.py b/desktop/kde6/applications/mimetreeparser/actions.py deleted file mode 100644 index 0eef11c64c..0000000000 --- a/desktop/kde6/applications/mimetreeparser/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/applications/mimetreeparser/pspec.xml b/desktop/kde6/applications/mimetreeparser/pspec.xml deleted file mode 100644 index 9a3ae89a6a..0000000000 --- a/desktop/kde6/applications/mimetreeparser/pspec.xml +++ /dev/null @@ -1,163 +0,0 @@ - - - - - mimetreeparser - https://kontact.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - app - Parser for MIME trees - mimetreeparser - Parser for MIME trees - https://download.kde.org/stable/release-service/24.12.1/src/mimetreeparser-24.12.1.tar.xz - - gpgme-devel - qt6-base-devel - gpgme-qt6-devel - - ki18n-kf6-devel - kmbox-kf6-devel - kmime-kf6-devel - libkleo-kf6-devel - kcodecs-kf6-devel - qt6-declarative-devel - kcalendarcore-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - - - - - - mimetreeparser - - gpgme - qt6-base - gpgme-qt6 - ki18n-kf6 - kmbox-kf6 - kmime-kf6 - libkleo-kf6 - kcodecs-kf6 - qt6-declarative - kcalendarcore-kf6 - kwidgetsaddons-kf6 - - - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - - - mimetreeparser-devel - Development files for mimetreeparser - - kmbox-kf6-devel - mimetreeparser - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-05 - 24.02.0 - First release - PisiLinux Community - admins@pisilinux.org - - - diff --git a/desktop/kde6/applications/mimetreeparser/translations.xml b/desktop/kde6/applications/mimetreeparser/translations.xml deleted file mode 100644 index e9994aec9f..0000000000 --- a/desktop/kde6/applications/mimetreeparser/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - mimetreeparser - Parser for MIME trees - Parser for MIME trees - - diff --git a/desktop/kde6/applications/minuet-kf6/actions.py b/desktop/kde6/applications/minuet-kf6/actions.py deleted file mode 100755 index 676b7d139b..0000000000 --- a/desktop/kde6/applications/minuet-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*", "README*") diff --git a/desktop/kde6/applications/minuet-kf6/files/qtfix2.patch b/desktop/kde6/applications/minuet-kf6/files/qtfix2.patch deleted file mode 100755 index cddbbf5f67..0000000000 --- a/desktop/kde6/applications/minuet-kf6/files/qtfix2.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- qtfix.patch 2016-12-22 15:50:07.000000000 +0100 -+++ qtfix1.patch 2017-03-08 18:03:57.055106559 +0100 -@@ -5,8 +5,8 @@ - set (KDE_APPLICATIONS_VERSION "0.2.1") - - set(ECM_MIN_VERSION "5.15.0") ---set(QT_MIN_VERSION "5.7.0") --+set(QT_MIN_VERSION "5.6.2") -+-set(QT_MIN_VERSION "6.6.3") -++set(QT_MIN_VERSION "6.6.3") - set(KF5_MIN_VERSION "5.15.0") - - find_package(ECM ${ECM_MIN_VERSION} CONFIG REQUIRED) diff --git a/desktop/kde6/applications/minuet-kf6/files/qtfixc.patch b/desktop/kde6/applications/minuet-kf6/files/qtfixc.patch deleted file mode 100755 index 6f5ff7ce8c..0000000000 --- a/desktop/kde6/applications/minuet-kf6/files/qtfixc.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- qtfix.patch 2016-12-22 15:50:07.000000000 +0100 -+++ qtfixb.patch 2016-12-23 13:00:31.000000000 +0100 -@@ -4,9 +4,9 @@ - @@ -10,7 +10,7 @@ - set (KDE_APPLICATIONS_VERSION "0.2.1") - -- set(ECM_MIN_VERSION "5.15.0") -+ set(ECM_MIN_VERSION "5.29.0") - -set(QT_MIN_VERSION "5.7.0") - +set(QT_MIN_VERSION "5.6.2") -- set(KF5_MIN_VERSION "5.15.0") -+ set(KF5_MIN_VERSION "5.29.0") - - find_package(ECM ${ECM_MIN_VERSION} CONFIG REQUIRED) diff --git a/desktop/kde6/applications/minuet-kf6/pspec.xml b/desktop/kde6/applications/minuet-kf6/pspec.xml deleted file mode 100755 index 2336a06c08..0000000000 --- a/desktop/kde6/applications/minuet-kf6/pspec.xml +++ /dev/null @@ -1,167 +0,0 @@ - - - minuet-kf6 - https://minuet-kf6.kde.org - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:gui - A KDE Software for Music Education - Music education Free Software, thoughtfully designed to push your musical skills to the next level. Enhance your ability to recognize intervals, chords, rhythm, and scales while enjoying all the power of Free Software. - https://download.kde.org/stable/release-service/24.12.1/src/minuet-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-svg-devel - qt6-base-devel - qt6-declarative-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - kcrash-kf6-devel - kdoctools-kf6-devel - alsa-lib-devel - drumstick-devel - fluidsynth-devel - - - - - - - - minuet-kf6 - A KDE Software for Music Education - - kio-kf6 - ki18n-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - alsa-lib - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - drumstick-libs - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - fluidsynth - qt6-svg - qt6-declarative - - - /usr/bin - /usr/share - /usr/share/appdata - /usr/share/applications - /usr/share/doc - /usr/share/icons - /usr/share/kxmlgui-kf65 - /usr/share/minuet-kf6 - /usr/lib - - - - - minuet-kf6-devel - Development files for minuet-kf6 - - qt6-base-devel - minuet-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/okular-kf6/actions.py b/desktop/kde6/applications/okular-kf6/actions.py deleted file mode 100755 index dd226e08ab..0000000000 --- a/desktop/kde6/applications/okular-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - - -def setup(): - # shelltools.system("sed -i 's|5.92.0|5.245.0|g' CMakeLists.txt") - kde6.configure("-DKDEPIM_NO_TEXTTOSPEECH=TRUE") - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/okular-kf6/pspec.xml b/desktop/kde6/applications/okular-kf6/pspec.xml deleted file mode 100755 index 10532c2e6c..0000000000 --- a/desktop/kde6/applications/okular-kf6/pspec.xml +++ /dev/null @@ -1,226 +0,0 @@ - - - - - okular-kf6 - http://okular-kf6.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - okular-kf6 - library - desktop.kde6.graphics - A document viewer - okular-kf6 is a document viewer. - mirrors://kde/stable/release-service/24.12.1/src/okular-24.12.1.tar.xz - - qt6-base-devel - qt6-multimedia-devel - qt6-declarative-devel - qca2-qt6-devel - tiff-devel - purpose-kf6-devel - qt6-phonon-devel - qt6-speech-devel - poppler-qt6-devel - ebook-tools-devel - libkexiv2-kf6-devel - kdoctools-kf6-devel - threadweaver-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kbookmarks-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - plasma-activities-kf6-devel - libkscreen-kf6-devel - chmlib-devel - kjobwidgets-kf6-devel - libspectre-devel - djvu-devel - kpty-kf6-devel - kparts-kf6-devel - kdegraphics-mobipocket-kf6-devel - extra-cmake-modules-kf6 - kirigami-kf6-devel - libzip-devel - discount-devel - freetype-devel - qt6-svg-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - karchive-kf6-devel - kwallet-kf6-devel - openjpeg2-devel - libjpeg-turbo-devel - - - - - okular-kf6 - app:gui - - qt6-base - qca2-qt6 - tiff - kcrash-kf6 - libkexiv2-kf6 - poppler-qt6 - ebook-tools - libzip - discount - plasma-activities-kf6 - libjpeg-turbo - purpose-kf6 - kpty-kf6 - kio-kf6 - zlib - ki18n-kf6 - kparts-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - qt6-svg - freetype - karchive-kf6 - kservice-kf6 - ktextwidgets-kf6 - kbookmarks-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - threadweaver-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - qt6-multimedia - djvu - libspectre - qt6-phonon - chmlib - kjobwidgets-kf6 - qt6-speech - kdegraphics-mobipocket-kf6 - qt6-svg - - - /etc/xdg - /usr/lib - /usr/share/doc - /usr/share/man - /usr/bin - /usr/share - - - - - okular-kf6-devel - Development files for okular-kf6 - - okular-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/okular-kf6/translations.xml b/desktop/kde6/applications/okular-kf6/translations.xml deleted file mode 100755 index 7d9127f5af..0000000000 --- a/desktop/kde6/applications/okular-kf6/translations.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - okular-kf6 - Belge gösterici - okular-kf6 bir belge göstericidir. - - - - okular-kf6-devel - okular-kf6 için geliştirme dosyaları - - diff --git a/desktop/kde6/applications/parley-kf6/actions.py b/desktop/kde6/applications/parley-kf6/actions.py deleted file mode 100755 index 2faab7db6a..0000000000 --- a/desktop/kde6/applications/parley-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/parley-kf6/pspec.xml b/desktop/kde6/applications/parley-kf6/pspec.xml deleted file mode 100755 index 7e8a10eba9..0000000000 --- a/desktop/kde6/applications/parley-kf6/pspec.xml +++ /dev/null @@ -1,177 +0,0 @@ - - - - - parley-kf6 - http://edu.kde.org/applications/all/parley-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - parley-kf6 - app:gui - desktop.kde.edu - parley-kf6 is a program to help you memorize things. - parley-kf6 is a program to help you memorize things. parley-kf6 supports many language specific features but can be used for other learning tasks just as well. It uses the spaced repetition learning method, also known as flash cards. Creating new vocabulary collections with parley-kf6 is easy, but of course it is even better if you can use some of our premade files. Have a look at the KDE-Files.org page or use the "Download New Collections" feature directly in parley-kf6. - mirrors://kde/stable/release-service/24.12.1/src/parley-24.12.1.tar.xz - - qt6-base-devel - qt6-svg-devel - qt6-multimedia-devel - qt6-webengine-devel - libxslt-devel - libXrender-devel - libxml2-devel - libkeduvocdocument-kf6-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kcrash-kf6-devel - gettext-devel - ki18n-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - kcmutils-kf6-devel - kxmlgui-kf6-devel - sonnet-kf6-devel - kservice-kf6-devel - ktextwidgets-kf6-devel - kcompletion-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - knotifications-kf6-devel - - extra-cmake-modules-kf6 - ffmpeg-devel - libXScrnSaver-devel - - - - - parley-kf6 - - qt6-base - qt6-svg - qt6-multimedia - qt6-webengine - libxslt - libXrender - libxml2 - libkeduvocdocument-kf6 - kdoctools-kf6 - kcoreaddons-kf6 - kconfig-kf6 - kcrash-kf6 - gettext - ki18n-kf6 - kio-kf6 - knewstuff-kf6 - - kcmutils-kf6 - kxmlgui-kf6 - knotifications-kf6 - sonnet-kf6 - kservice-kf6 - libgcc - ktextwidgets-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/lib - /usr/share/doc - /usr/bin - /usr/share - /etc/xdg - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/parley-kf6/translations.xml b/desktop/kde6/applications/parley-kf6/translations.xml deleted file mode 100755 index e33cd8d432..0000000000 --- a/desktop/kde6/applications/parley-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - parley-kf6 - Tekrar yapmanıza yardım eden bir uygulama - parley-kf6 ile yeni öğrendiğiniz şeyleri belli zaman aralıklarıyla tekrar ederek uzun zamanlı hafızanızda yer etmelerini sağlayabilirsiniz. parley-kf6, flaş kart denilen tekniği kullanır. Dil öğrenimi için özelleşmiş yetenekleri olmasına karşın diğer konularda da kullanıma uygundur. Kartları hazırlamak epey kolay olmakla beraber kde-files.org adresinden ulaşabileceğiniz hazır kart setlerini de kullanabilirsiniz. - - diff --git a/desktop/kde6/applications/partitionmanager-kf6/actions.py b/desktop/kde6/applications/partitionmanager-kf6/actions.py deleted file mode 100755 index 7607087e91..0000000000 --- a/desktop/kde6/applications/partitionmanager-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*", "LICENSES/*") diff --git a/desktop/kde6/applications/partitionmanager-kf6/pspec.xml b/desktop/kde6/applications/partitionmanager-kf6/pspec.xml deleted file mode 100755 index 9e33f52aaa..0000000000 --- a/desktop/kde6/applications/partitionmanager-kf6/pspec.xml +++ /dev/null @@ -1,159 +0,0 @@ - - - - - partitionmanager-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - KDE Partition Manager is a utility program to help you manage the disk devices, partitions and file systems on your computer - It allows you to easily create, copy, move, delete, resize without losing data, backup and restore partitions.. - mirrors://kde/stable/release-service/24.12.1/src/partitionmanager-24.12.1.tar.xz - - qt6-base-devel - libatasmart-devel - extra-cmake-modules-kf6 - parted-devel - libutil-linux-devel - ki18n-kf6-devel - kio-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - kjobwidgets-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kdoctools-kf6-devel - kpmcore-kf6-devel - e2fsprogs-devel - kdbusaddons-kf6-devel - polkit-qt6-devel - elogind-devel - - - - - partitionmanager-kf6 - - qt6-base - libgcc - libutil-linux - kio-kf6 - ki18n-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kpmcore-kf6 - kcrash-kf6 - e2fsprogs - kdbusaddons-kf6 - polkit-qt6 - kwindowsystem-kf6 - - - /usr/bin - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/partitionmanager-kf6/translations.xml b/desktop/kde6/applications/partitionmanager-kf6/translations.xml deleted file mode 100755 index a009e69ea4..0000000000 --- a/desktop/kde6/applications/partitionmanager-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - partitionmanager-kf6 - KDE Disk Bölümü Yöneticisi - KDE Disk Bölümü Yöneticisi, disklerinizi, bölümlerinizi ve dosya sistemlerinizi yönetmenize izin verir. Birçok dosya sistemini (ext2/3/4, reiserfs, NTFS, FAT32 ve daha fazlası) desteklemenin yanı sıra, yeni bölüm oluşturabilir ya da var olan bir bölüm üzerinde boyutlandırma, kopyalama, taşıma, yedekleme ve geri yükleme işlemlerini yapabilir. - - diff --git a/desktop/kde6/applications/picmi-kf6/actions.py b/desktop/kde6/applications/picmi-kf6/actions.py deleted file mode 100755 index 0374af291e..0000000000 --- a/desktop/kde6/applications/picmi-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -NoStrip=["/usr/share/icons"] - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/picmi-kf6/pspec.xml b/desktop/kde6/applications/picmi-kf6/pspec.xml deleted file mode 100755 index 59d0096f1e..0000000000 --- a/desktop/kde6/applications/picmi-kf6/pspec.xml +++ /dev/null @@ -1,145 +0,0 @@ - - - - - picmi-kf6 - http://games.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - picmi-kf6 is a single player logic-based puzzle game - picmi-kf6 is a single player logic-based puzzle game. The goal is to color cells according to numbers given at the side of the board in order to uncover a hidden pattern or picture. - https://download.kde.org/stable/release-service/24.12.1/src/picmi-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-svg-devel - qt6-declarative-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - kxmlgui-kf6-devel - libkdegames-kf6-devel - - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - - - - picmi-kf6 - picmi-kf6 - - ki18n-kf6 - libgcc - kxmlgui-kf6 - qt6-svg - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/picmi-kf6/translations.xml b/desktop/kde6/applications/picmi-kf6/translations.xml deleted file mode 100755 index eaedb9897e..0000000000 --- a/desktop/kde6/applications/picmi-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - picmi-kf6 - Resim çizme bulmacası - picmi-kf6, tablonun kenarında verilen sayılar kadar tabla üzerinde nokta koyarak bir resim tamamlama bulmacasıdır. - - diff --git a/desktop/kde6/applications/pim-data-exporter-kf6/actions.py b/desktop/kde6/applications/pim-data-exporter-kf6/actions.py deleted file mode 100755 index dc7d4ed6e8..0000000000 --- a/desktop/kde6/applications/pim-data-exporter-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/pim-data-exporter-kf6/pspec.xml b/desktop/kde6/applications/pim-data-exporter-kf6/pspec.xml deleted file mode 100755 index 720a814ea6..0000000000 --- a/desktop/kde6/applications/pim-data-exporter-kf6/pspec.xml +++ /dev/null @@ -1,189 +0,0 @@ - - - - - pim-data-exporter-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - Import and export KDE PIM settings - Import and export KDE PIM settings - https://download.kde.org/stable/release-service/24.12.1/src/pim-data-exporter-24.12.1.tar.xz - - extra-cmake-modules-kf6 - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - akonadi-contacts-kf6-devel - akonadi-kf6-devel - akonadi-mime-kf6-devel - calendarsupport-kf6-devel - kalarm-kf6 - kcalendarcore-kf6-devel - kcontacts-kf6-devel - kmailtransport-kf6-devel - kpimtextedit-kf6-devel - - qt6-base-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - boost-devel - - kio-kf6-devel - ki18n-kf6-devel - kitemviews-kf6-devel - kunitconversion-kf6-devel - kmime-kf6-devel - kidentitymanagement-kf6-devel - akonadi-calendar-kf6-devel - kholidays-kf6-devel - mailcommon-kf6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - kimap-kf6-devel - cyrus-sasl-devel - libkleo-kf6-devel - gpgme-devel - gpgme-qt6-devel - libkdepim-kf6-devel - ffmpeg-devel - karchive-kf6-devel - - libXScrnSaver-devel - knotifications-kf6-devel - kuserfeedback-kf6-devel - kstatusnotifieritem-kf6-devel - - - - - pim-data-exporter-kf6 - Import and export KDE PIM settings - - kio-kf6 - ki18n-kf6 - kmime-kf6 - kcrash-kf6 - libgcc - akonadi-kf6 - kconfig-kf6 - kxmlgui-kf6 - karchive-kf6 - qt6-base - kalarm-kf6 - kcontacts-kf6 - libkdepim-kf6 - pimcommon-kf6 - kitemviews-kf6 - mailcommon-kf6 - messagelib-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kpimtextedit-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kstatusnotifieritem-kf6 - kidentitymanagement-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/pim-sieve-editor-kf6/actions.py b/desktop/kde6/applications/pim-sieve-editor-kf6/actions.py deleted file mode 100755 index dc7d4ed6e8..0000000000 --- a/desktop/kde6/applications/pim-sieve-editor-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - - pisitools.dodoc("LICENSES/*") - diff --git a/desktop/kde6/applications/pim-sieve-editor-kf6/pspec.xml b/desktop/kde6/applications/pim-sieve-editor-kf6/pspec.xml deleted file mode 100755 index 95a218f11c..0000000000 --- a/desktop/kde6/applications/pim-sieve-editor-kf6/pspec.xml +++ /dev/null @@ -1,160 +0,0 @@ - - - - - pim-sieve-editor-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - Mail sieve editor - Mail sieve editor - https://download.kde.org/stable/release-service/24.12.1/src/pim-sieve-editor-24.12.1.tar.xz - - extra-cmake-modules-kf6 - kbookmarks-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kmailtransport-kf6-devel - kpimtextedit-kf6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - qt6-base-devel - akonadi-mime-kf6-devel - akonadi-kf6-devel - kitemmodels-kf6-devel - kmime-kf6-devel - cyrus-sasl-devel - kcontacts-kf6-devel - akonadi-contacts-kf6-devel - kimap-kf6-devel - libksieve-kf6-devel - ffmpeg-devel - kuserfeedback-kf6-devel - libXScrnSaver-devel - qt6-keychain-devel - - - - - pim-sieve-editor-kf6 - Mail sieve editor - - ki18n-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - qt6-base - libksieve-kf6 - pimcommon-kf6 - kbookmarks-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-keychain - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/pimcommon-kf6/actions.py b/desktop/kde6/applications/pimcommon-kf6/actions.py deleted file mode 100755 index fb37aefcce..0000000000 --- a/desktop/kde6/applications/pimcommon-kf6/actions.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure("-DCMAKE_INSTALL_LIBDIR=lib \ - -DBUILD_TESTING=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/applications/pimcommon-kf6/files/qt5.patch b/desktop/kde6/applications/pimcommon-kf6/files/qt5.patch deleted file mode 100755 index 063e7fef18..0000000000 --- a/desktop/kde6/applications/pimcommon-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:04:46.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 23:24:11.263302169 +0300 -@@ -29,7 +29,7 @@ - set(pimcommon-kf6_LIB_VERSION ${PIM_VERSION}) - set(AKONADICONTACT_LIB_VERSION "5.7.0") - set(libkdepim-kf6_LIB_VERSION "5.7.0") --set(QT_REQUIRED_VERSION "6.6.3") -+set(QT_REQUIRED_VERSION "6.6.3") - set(kmime-kf6_LIB_VERSION "5.7.0") - set(kimap-kf6_LIB_VERSION "5.7.0") - set(kcontacts-kf6_LIB_VERSION "5.7.0") diff --git a/desktop/kde6/applications/pimcommon-kf6/pspec.xml b/desktop/kde6/applications/pimcommon-kf6/pspec.xml deleted file mode 100755 index fc7eaa54a5..0000000000 --- a/desktop/kde6/applications/pimcommon-kf6/pspec.xml +++ /dev/null @@ -1,234 +0,0 @@ - - - - - pimcommon-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - library - Common libraries for KDE PIM - Common libraries for KDE PIM - mirrors://kde/stable/release-service/24.12.1/src/pimcommon-24.12.1.tar.xz - - qt6-base-devel - boost-devel - gpgme-devel - qt6-sql-sqlite - qt6-sql-mysql - qt6-sql-odbc - qt6-sql-postgresql - prison-kf6-devel - kmbox-kf6-devel - qt6-phonon-devel - akonadi-kf6-devel - libical-devel - - libgpg-error-devel - libxslt-devel - openldap-client - cyrus-sasl-devel - kitemviews-kf6-devel - kio-kf6-devel - karchive-kf6-devel - kdoctools-kf6-devel - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - kmime-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - kldap-kf6-devel - libkdepim-kf6-devel - extra-cmake-modules-kf6 - - akonadi-contacts-kf6-devel - akonadi-search-kf6-devel - akonadi-mime-kf6-devel - - qt6-webengine-devel - - kdoctools-kf6-devel - knewstuff-kf6-devel - kpimtextedit-kf6-devel - kimap-kf6-devel - purpose-kf6-devel - ktextaddons-kf6-devel - - - - - - - - pimcommon-kf6 - - qt6-base - kio-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - kmime-kf6 - kldap-kf6 - kxmlgui-kf6 - kwallet-kf6 - karchive-kf6 - kjobwidgets-kf6 - qt6-webengine - kcalendarcore-kf6 - kcontacts-kf6 - kconfig-kf6 - libxml2 - kservice-kf6 - kguiaddons-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-phonon - prison-kf6 - akonadi-kf6 - libkdepim-kf6 - akonadi-contacts-kf6 - kdoctools-kf6 - knewstuff-kf6 - kpimtextedit-kf6 - - kimap-kf6 - cyrus-sasl - purpose-kf6 - ktextaddons-kf6 - - - /etc/xdg - /usr/lib - /usr/share/doc - /usr/mkspecs/ - /usr/bin - /usr/share/mime - /usr/share/icons - /usr/share/dbus-1 - /usr/share/config.kcfg - /usr/share/kf5 - /usr/share/config - /usr/share/akonadi - /usr/share/akonadicontact/grantleetheme/default - /usr/share/locale - /usr/share - - - - - pimcommon-kf6-devel - Development package for pimcommon-kf6 libraries - Contains development tools and header files for kdepim-common - - qt6-base-devel - boost-devel - ktextaddons-kf6-devel - pimcommon-kf6 - - - /usr/lib/cmake - /usr/include - /usr/lib/gpgmepp - /usr/share/kde4/apps/cmake - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/poxml-kf6/actions.py b/desktop/kde6/applications/poxml-kf6/actions.py deleted file mode 100755 index e9e08c819f..0000000000 --- a/desktop/kde6/applications/poxml-kf6/actions.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import kde5 - -NoStrip=["/usr/share"] - -def setup(): - kde6.configure() - # kde5.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*") diff --git a/desktop/kde6/applications/poxml-kf6/pspec.xml b/desktop/kde6/applications/poxml-kf6/pspec.xml deleted file mode 100755 index 8643a63738..0000000000 --- a/desktop/kde6/applications/poxml-kf6/pspec.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - - - poxml-kf6 - http://www.kde.org/ - - Mathias Freire - mathiasfreire45@gmail.com - - GPLv2 - app:gui - desktop.kde.sdk - Tools for translating DocBook XML files with Gettex - This is a collection of tools that facilitate translating DocBook XML files using Gettext message files (PO files). - https://download.kde.org/stable/release-service/24.12.1/src/poxml-24.12.1.tar.xz - - qt6-base-devel - gettext-devel - kdoctools-kf6-devel - docbook-xsl - extra-cmake-modules-kf6 - - - - - - - poxml-kf6 - - libgcc - gettext - qt6-base - - - - - kdesdk - - - kdesdk - - - /usr/bin - /usr/share/doc - /usr/share/man - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/poxml-kf6/translations.xml b/desktop/kde6/applications/poxml-kf6/translations.xml deleted file mode 100755 index f7bcb3faa3..0000000000 --- a/desktop/kde6/applications/poxml-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - poxml-kf6 - DocBook XML dosyalarını çevirme araçları. - poxml-kf6, DocBook XML dosyalarını (.po) Gettext yarımıyla çevirmeyi sağlayan bir programdır. - - diff --git a/desktop/kde6/applications/rocs-kf6/actions.py b/desktop/kde6/applications/rocs-kf6/actions.py deleted file mode 100755 index 3041ee41e3..0000000000 --- a/desktop/kde6/applications/rocs-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import kde5 - -def setup(): - # kde6.configure() - kde5.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/rocs-kf6/pspec.xml b/desktop/kde6/applications/rocs-kf6/pspec.xml deleted file mode 100755 index aa3f171f2b..0000000000 --- a/desktop/kde6/applications/rocs-kf6/pspec.xml +++ /dev/null @@ -1,220 +0,0 @@ - - - - - rocs-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.edu - rocs-kf6 Graph Theory - rocs-kf6 aims to be a Graph Theory IDE for helping professors to show the results of a graph algorithm and also helping students to do the algorithms. rocs-kf6 has a scripting module, done in Qt Script, that interacts with the drawn graph and every change in the graph with the script is reflected on the drawn one.. - mirrors://kde/stable/release-service/24.12.1/src/rocs-24.12.1.tar.xz - - - extra-cmake-modules-kf6 - - qt5-base-devel - qt5-declarative-devel - qt5-webkit-devel - qt5-base-devel - qt5-xmlpatterns-devel - qt5-script-devel - kdoctools-devel - kdeclarative-devel - ki18n-devel - gettext-devel - kitemviews-devel - ktexteditor-devel - kxmlgui-devel - kconfig-devel - karchive-devel - kcompletion-devel - kcoreaddons-devel - kconfigwidgets-devel - kwidgetsaddons-devel - qt5-location-devel - grantlee-qt5-devel - boost-devel - qt5-svg-devel - - - - - rocs-kf6 - - - - qt5-base - qt5-script - qt5-declarative - qt5-xmlpatterns - grantlee-qt5 - ktexteditor - kcrash - kparts - libgcc - ki18n - kconfig - karchive - kcompletion - kcoreaddons - ktextwidgets - kconfigwidgets - kwidgetsaddons - kxmlgui - kitemviews - - - /usr/bin - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - rocs - - - - - rocs-kf6-devel - Development files for rocs-kf6 - - rocs-kf6 - - - /usr/include - /usr/lib/cmake - - - rocs-devel - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/signon-kwallet-extension-kf6/actions.py b/desktop/kde6/applications/signon-kwallet-extension-kf6/actions.py deleted file mode 100755 index e84c895080..0000000000 --- a/desktop/kde6/applications/signon-kwallet-extension-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING") diff --git a/desktop/kde6/applications/signon-kwallet-extension-kf6/pspec.xml b/desktop/kde6/applications/signon-kwallet-extension-kf6/pspec.xml deleted file mode 100755 index 1a37b72049..0000000000 --- a/desktop/kde6/applications/signon-kwallet-extension-kf6/pspec.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - signon-kwallet-extension-kf6 - http://kde.org - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app - desktop.kde6.network - kwallet-kf6 signon extension - kwallet-kf6 signon extension - - extra-cmake-modules-kf6 - qt6-base-devel - kwallet-kf6-devel - signond-devel - - mirrors://kde/stable/release-service/24.12.1/src/signon-kwallet-extension-24.12.1.tar.xz - - - - signon-kwallet-extension-kf6 - kwallet-kf6 signon extension - - libgcc - signond - kwallet-kf6 - qt6-base - - - /usr/lib/signon - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/spectacle-kf6/actions.py b/desktop/kde6/applications/spectacle-kf6/actions.py deleted file mode 100755 index e869482cd0..0000000000 --- a/desktop/kde6/applications/spectacle-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/lib/systemd") - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/applications/spectacle-kf6/pspec.xml b/desktop/kde6/applications/spectacle-kf6/pspec.xml deleted file mode 100755 index 6bd4dcf697..0000000000 --- a/desktop/kde6/applications/spectacle-kf6/pspec.xml +++ /dev/null @@ -1,203 +0,0 @@ - - - - - spectacle-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde6.graphics - KDE screenshot capture utility - spectacle-kf6, a new screenshot application that aims to replace KSnapshot.. - mirrors://kde/stable/release-service/24.12.1/src/spectacle-24.12.1.tar.xz - - qt6-base-devel - qt6-wayland-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - kirigami-kf6-devel - kpipewire-kf6-devel - pipewire-devel - libxcb-devel - prison-kf6-devel - libkscreen-kf6-devel - xcb-util-devel - layer-shell-qt-kf6-devel - xcb-util-image-devel - xcb-util-cursor-devel - kxmlgui-kf6-devel - knewstuff-kf6-devel - kio-kf6-devel - purpose-kf6-devel - kwindowsystem-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kwidgetsaddons-kf6-devel - kdeclarative-kf6-devel - kwayland-kf6-devel - knotifications-kf6-devel - wayland-devel - wayland-client - kglobalaccel-kf6-devel - zxing-cpp-devel - opencv-devel - qt6-declarative-devel - qt6-svg-devel - kguiaddons-kf6-devel - kstatusnotifieritem-kf6-devel - plasma-wayland-protocols - - - - - spectacle-kf6 - - qt6-base - kio-kf6 - zxing-cpp - libkscreen-kf6 - purpose-kf6 - xcb-util-cursor - ki18n-kf6 - libgcc - prison-kf6 - kconfig-kf6 - kirigami-kf6 - kxmlgui-kf6 - knewstuff-kf6 - - pipewire - kpipewire-kf6 - kdeclarative-kf6 - kservice-kf6 - kcoreaddons-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kdbusaddons-kf6 - libxcb - xcb-util - kwayland-kf6 - layer-shell-qt-kf6 - xcb-util-image - qt6-declarative - qt6-wayland - qt6-svg - kglobalaccel-kf6 - kguiaddons-kf6 - kstatusnotifieritem-kf6 - - - ksnapshot - - - ksnapshot - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - /usr/lib - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/spectacle-kf6/translations.xml b/desktop/kde6/applications/spectacle-kf6/translations.xml deleted file mode 100755 index 0f6c593398..0000000000 --- a/desktop/kde6/applications/spectacle-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - spectacle-kf6 - Ekran görüntüsü yakalama aracı - spectacle-kf6 bir ekran görüntüsü yakalama aracıdır. - - diff --git a/desktop/kde6/applications/step-kf6/actions.py b/desktop/kde6/applications/step-kf6/actions.py deleted file mode 100755 index d0ef227a16..0000000000 --- a/desktop/kde6/applications/step-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6, shelltools - - -def setup(): - kde6.configure("-DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/python3") - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "ChangeLog", "AUTHORS", "README*", "DESIGN") diff --git a/desktop/kde6/applications/step-kf6/pspec.xml b/desktop/kde6/applications/step-kf6/pspec.xml deleted file mode 100755 index aa0bdbb0b1..0000000000 --- a/desktop/kde6/applications/step-kf6/pspec.xml +++ /dev/null @@ -1,164 +0,0 @@ - - - - - step-kf6 - http://kde.org/applications/education/step/ - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.edu - Interactive Physical Simulator - step-kf6 is an interactive physical simulator. It allows you to explore the physical world through simulations. - mirrors://kde/stable/release-service/24.12.1/src/step-24.12.1.tar.xz - - qt6-base-devel - - qt6-svg-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - mesa-devel - kconfig-kf6-devel - knewstuff-kf6-devel - kplotting-kf6-devel - eigen3 - pkgconfig - libqalculate-devel - cln-devel - kiconthemes-kf6-devel - ktextwidgets-kf6-devel - kio-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - qt6-linguist - gsl-devel - - - - - step-kf6 - - qt6-base - cln - gsl - kcrash-kf6 - knewstuff-kf6 - kplotting-kf6 - libqalculate - kparts-kf6 - kio-kf6 - libgcc - kiconthemes-kf6 - ktextwidgets-kf6 - kio-kf6 - ki18n-kf6 - kconfig-kf6 - kxmlgui-kf6 - kjobwidgets-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kservice-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/umbrello-kf6/actions.py b/desktop/kde6/applications/umbrello-kf6/actions.py deleted file mode 100755 index 2ef8b2024a..0000000000 --- a/desktop/kde6/applications/umbrello-kf6/actions.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import shelltools -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 -from pisi.actionsapi import kde5 -from pisi.actionsapi import get - -NoStrip=["/usr/share"] - -def setup(): - # kde6.configure() - kde5.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*", "AUTHORS", "CODING-STYLE", "ChangeLog", "README", "THANKS", "TODO") diff --git a/desktop/kde6/applications/umbrello-kf6/files/upstream.patch b/desktop/kde6/applications/umbrello-kf6/files/upstream.patch deleted file mode 100755 index fa05851179..0000000000 --- a/desktop/kde6/applications/umbrello-kf6/files/upstream.patch +++ /dev/null @@ -1,77852 +0,0 @@ -diff -Nuar umbrello-kf6-15.08.1.orig/CMakeLists.txt umbrello-kf6-15.08.1/CMakeLists.txt ---- umbrello-kf6-15.08.1.orig/CMakeLists.txt 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/CMakeLists.txt 2015-10-08 11:48:59.471089026 +0300 -@@ -6,8 +6,8 @@ - set (KDE_APPLICATIONS_VERSION_MICRO "1") - - set(umbrello-kf6_VERSION_MAJOR "2") --set(umbrello-kf6_VERSION_MINOR "17") --set(umbrello-kf6_VERSION_PATCH ${KDE_APPLICATIONS_VERSION_MICRO}) -+set(umbrello-kf6_VERSION_MINOR "18") -+set(umbrello-kf6_VERSION_PATCH "99") - - option(BUILD_KF5 "Build for KDE Frameworks 5" OFF) - -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/actor.cpp umbrello-kf6-15.08.1/umbrello/actor.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/actor.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/actor.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,67 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "actor.h" -- --/** -- * Constructs an Actor. -- * -- * @param name The name of the Actor. -- * @param id The unique id to assign to this Actor. -- */ --UMLActor::UMLActor(const QString & name, Uml::ID::Type id) -- : UMLCanvasObject(name, id) --{ -- init(); --} -- --/** -- * Standard destructor. -- */ --UMLActor::~UMLActor() --{ --} -- --/** -- * Initializes key variables of the class. -- */ --void UMLActor::init() --{ -- m_BaseType = UMLObject::ot_Actor; --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLActor::clone() const --{ -- UMLActor *clone = new UMLActor(); -- UMLObject::copyInto(clone); -- return clone; --} -- --/** -- * Creates the XMI element. -- */ --void UMLActor::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement actorElement = UMLObject::save(QLatin1String("UML:Actor"), qDoc); -- qElement.appendChild(actorElement); --} -- --/** -- * Loads the XMI element (empty). -- */ --bool UMLActor::load(QDomElement& element) --{ -- Q_UNUSED(element); -- return true; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/actor.h umbrello-kf6-15.08.1/umbrello/actor.h ---- umbrello-kf6-15.08.1.orig/umbrello/actor.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/actor.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,44 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ACTOR_H --#define ACTOR_H -- --#include "umlcanvasobject.h" -- --/** -- * This class contains the non-graphical information required for a UML Actor. -- * This class inherits from @ref UMLCanvasObject which contains most of the -- * information. -- * The @ref UMLDoc class creates instances of this type. -- * -- * @short Information for a non-graphical UML Actor. -- * @author Paul Hensgen -- * @see UMLCanvasObject -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLActor : public UMLCanvasObject --{ -- Q_OBJECT --public: -- explicit UMLActor(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -- virtual ~UMLActor(); -- -- virtual void init(); -- -- virtual UMLObject* clone() const; -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- --protected: -- bool load(QDomElement & element); --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/artifact.cpp umbrello-kf6-15.08.1/umbrello/artifact.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/artifact.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/artifact.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,90 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "artifact.h" --#include "association.h" --#include "clipboard/idchangelog.h" -- --#include -- --/** -- * Sets up an Artifact. -- * @param name The name of the Concept. -- * @param id The unique id of the Concept. -- */ --UMLArtifact::UMLArtifact(const QString & name, Uml::ID::Type id) -- : UMLPackage(name, id), -- m_drawAsType(defaultDraw) --{ -- m_BaseType = UMLObject::ot_Artifact; --} -- --/** -- * Standard deconstructor. -- */ --UMLArtifact::~UMLArtifact() --{ --} -- --/** -- * Make a clone of this object. -- * @return the cloned object -- */ --UMLObject* UMLArtifact::clone() const --{ -- UMLArtifact *clone = new UMLArtifact(); -- UMLObject::copyInto(clone); -- return clone; --} -- --/** -- * Creates the UML:Artifact element including its operations, -- * attributes and templates -- * @param qDoc the xml document -- * @param qElement the xml element -- */ --void UMLArtifact::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement artifactElement = UMLObject::save(QLatin1String("UML:Artifact"), qDoc); -- artifactElement.setAttribute(QLatin1String("drawas"), m_drawAsType); -- qElement.appendChild(artifactElement); --} -- --/** -- * Loads the UML:Artifact element including its operations, -- * attributes and templates. -- * @param element the xml element to load -- * @return the success status of the operation -- */ --bool UMLArtifact::load(QDomElement& element) --{ -- QString drawAs = element.attribute(QLatin1String("drawas"), QLatin1String("0")); -- m_drawAsType = (Draw_Type)drawAs.toInt(); -- return true; --} -- --/** -- * Sets m_drawAsType for which method to draw the artifact as. -- * @param type the draw type -- */ --void UMLArtifact::setDrawAsType(Draw_Type type) --{ -- m_drawAsType = type; --} -- --/** -- * Returns the value of m_drawAsType. -- * @return the value of the draw type attribute -- */ --UMLArtifact::Draw_Type UMLArtifact::getDrawAsType() --{ -- return m_drawAsType; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/artifact.h umbrello-kf6-15.08.1/umbrello/artifact.h ---- umbrello-kf6-15.08.1.orig/umbrello/artifact.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/artifact.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,66 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ARTIFACT_H --#define ARTIFACT_H -- --#include "package.h" -- --/** -- * This class contains the non-graphical information required for a UML -- * Artifact. -- * This class inherits from @ref UMLCanvasObject which contains most of the -- * information. -- * -- * @short Non-graphical information for a Artifact. -- * @author Jonathan Riddell -- * @see UMLCanvasObject -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLArtifact : public UMLPackage --{ -- Q_OBJECT --public: -- -- /** -- * Artifacts can be drawn using one of several icons. -- */ -- enum Draw_Type { -- defaultDraw, -- file, -- library, -- table -- }; -- -- explicit UMLArtifact(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -- virtual ~UMLArtifact(); -- -- virtual UMLObject* clone() const; -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- -- void setDrawAsType(Draw_Type type); -- -- Draw_Type getDrawAsType(); -- --protected: -- -- bool load(QDomElement & element); -- --private: -- -- /** -- * Artifacts can be drawn as one of several different icons, -- * this value choosing how to draw them. -- */ -- Draw_Type m_drawAsType; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/association.cpp umbrello-kf6-15.08.1/umbrello/association.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/association.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/association.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,742 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "association.h" -- --// app includes --#include "debug_utils.h" --#include "classifier.h" --#include "classpropertiesdialog.h" --#include "folder.h" --#include "uml.h" --#include "umldoc.h" --#include "umlrole.h" --#include "uniqueid.h" --#include "model_utils.h" --#include "cmds.h" -- --// kde includes --#include -- --// qt includes --#include --#include -- --using namespace Uml; -- --DEBUG_REGISTER(UMLAssociation) -- --/** -- * Sets up an association. -- * A new unique ID is assigned internally. -- * @param type The AssociationType::Enum to construct. -- * @param roleA Pointer to the UMLObject in role A. -- * @param roleB Pointer to the UMLObject in role B. -- */ --UMLAssociation::UMLAssociation(Uml::AssociationType::Enum type, -- UMLObject * roleA, UMLObject * roleB) -- : UMLObject(QString()) --{ -- init(type, roleA, roleB); -- -- m_pRole[RoleType::A]->setID(UniqueID::gen()); -- m_pRole[RoleType::B]->setID(UniqueID::gen()); --} -- --/** -- * Constructs an association - for loading only. -- * This constructor should not normally be used as it constructs -- * an incomplete association (i.e. the role objects are missing.) -- * @param type The AssociationType::Enum to construct. -- * Default: Unknown. -- */ --UMLAssociation::UMLAssociation(Uml::AssociationType::Enum type) -- : UMLObject(QString(), Uml::ID::Reserved) --{ -- init(type, NULL, NULL); --} -- --/** -- * Standard destructor. -- */ --UMLAssociation::~UMLAssociation() --{ -- if (m_pRole[RoleType::A] == NULL) { -- uError() << "UMLAssociation destructor: m_pRole[A] is NULL already"; -- } else { -- delete m_pRole[RoleType::A]; -- m_pRole[RoleType::A] = NULL; -- } -- if (m_pRole[RoleType::B] == NULL) { -- uError() << "UMLAssociation destructor: m_pRole[B] is NULL already"; -- } else { -- delete m_pRole[RoleType::B]; -- m_pRole[RoleType::B] = NULL; -- } --} -- --/** -- * Overloaded '==' operator -- */ --bool UMLAssociation::operator==(const UMLAssociation &rhs) const --{ -- if (this == &rhs) { -- return true; -- } -- return (UMLObject::operator== (rhs) && -- m_AssocType == rhs.m_AssocType && -- m_Name == rhs.m_Name && -- m_pRole[RoleType::A] == rhs.m_pRole[RoleType::A] && -- m_pRole[RoleType::B] == rhs.m_pRole[RoleType::B]); --} -- --/** -- * Returns the AssociationType::Enum of the UMLAssociation. -- * @return The AssociationType::Enum of the UMLAssociation. -- */ --Uml::AssociationType::Enum UMLAssociation::getAssocType() const --{ -- return m_AssocType; --} -- --/** -- * Returns a String representation of this UMLAssociation. -- */ --QString UMLAssociation::toString() const --{ -- QString string; -- if(m_pRole[RoleType::A]) -- { -- string += m_pRole[RoleType::A]->object()->name(); -- string += QLatin1Char(':'); -- string += m_pRole[RoleType::A]->name(); -- } -- string += QLatin1Char(':') + Uml::AssociationType::toStringI18n(m_AssocType) + QLatin1Char(':'); -- if(m_pRole[RoleType::B]) -- { -- string += m_pRole[RoleType::B]->object()->name(); -- string += QLatin1Char(':'); -- string += m_pRole[RoleType::B]->name(); -- } -- return string; --} -- --/** -- * Resolve types. Required when dealing with foreign XMI files. -- * Needs to be called after all UML objects are loaded from file. -- * Overrides the method from UMLObject. -- * Calls resolveRef() for each role. -- * @return True for success. -- */ --bool UMLAssociation::resolveRef() --{ -- bool successA = getUMLRole(RoleType::A)->resolveRef(); -- bool successB = getUMLRole(RoleType::B)->resolveRef(); -- if (successA && successB) { -- UMLObject *objA = getUMLRole(RoleType::A)->object(); -- UMLObject *objB = getUMLRole(RoleType::B)->object(); -- // Check if need to change the assoc type to Realization -- if (isRealization(objA, objB)) { -- m_AssocType = Uml::AssociationType::Realization; -- } -- m_pUMLPackage->addAssocToConcepts(this); -- return true; -- } -- return false; --} -- --/** -- * Creates the or XMI element -- * including its role objects. -- */ --void UMLAssociation::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- if (m_AssocType == Uml::AssociationType::Generalization) { -- QDomElement assocElement = UMLObject::save(QLatin1String("UML:Generalization"), qDoc); -- assocElement.setAttribute(QLatin1String("discriminator"), QString()); -- assocElement.setAttribute(QLatin1String("child"), Uml::ID::toString(getObjectId(RoleType::A))); -- assocElement.setAttribute(QLatin1String("parent"), Uml::ID::toString(getObjectId(RoleType::B))); -- qElement.appendChild(assocElement); -- return; -- } -- if (m_AssocType == Uml::AssociationType::Realization) { -- QDomElement assocElement = UMLObject::save(QLatin1String("UML:Abstraction"), qDoc); -- assocElement.setAttribute(QLatin1String("client"), Uml::ID::toString(getObjectId(RoleType::A))); -- assocElement.setAttribute(QLatin1String("supplier"), Uml::ID::toString(getObjectId(RoleType::B))); -- qElement.appendChild(assocElement); -- return; -- } -- if (m_AssocType == Uml::AssociationType::Dependency) { -- QDomElement assocElement = UMLObject::save(QLatin1String("UML:Dependency"), qDoc); -- assocElement.setAttribute(QLatin1String("client"), Uml::ID::toString(getObjectId(RoleType::A))); -- assocElement.setAttribute(QLatin1String("supplier"), Uml::ID::toString(getObjectId(RoleType::B))); -- qElement.appendChild(assocElement); -- return; -- } -- if (m_AssocType == Uml::AssociationType::Child2Category) { -- QDomElement assocElement = UMLObject::save(QLatin1String("UML:Child2Category"), qDoc); -- assocElement.setAttribute(QLatin1String("client"), Uml::ID::toString(getObjectId(RoleType::A))); -- assocElement.setAttribute(QLatin1String("supplier"), Uml::ID::toString(getObjectId(RoleType::B))); -- qElement.appendChild(assocElement); -- return; -- } -- if (m_AssocType == Uml::AssociationType::Category2Parent) { -- QDomElement assocElement = UMLObject::save(QLatin1String("UML:Category2Parent"), qDoc); -- assocElement.setAttribute(QLatin1String("client"), Uml::ID::toString(getObjectId(RoleType::A))); -- assocElement.setAttribute(QLatin1String("supplier"), Uml::ID::toString(getObjectId(RoleType::B))); -- qElement.appendChild(assocElement); -- return; -- } -- -- QDomElement associationElement = UMLObject::save(QLatin1String("UML:Association"), qDoc); -- QDomElement connElement = qDoc.createElement(QLatin1String("UML:Association.connection")); -- getUMLRole(RoleType::A)->saveToXMI (qDoc, connElement); -- getUMLRole(RoleType::B)->saveToXMI (qDoc, connElement); -- associationElement.appendChild (connElement); -- qElement.appendChild(associationElement); --} -- --bool UMLAssociation::showPropertiesDialog(QWidget *parent) --{ -- QPointer dlg = new ClassPropertiesDialog(parent, this, true); -- bool modified = false; -- if (dlg->exec()) { -- modified = true; -- } -- dlg->close(); -- delete dlg; -- return modified; --} -- --/** -- * Creates the or XMI element -- * including its role objects. -- */ --bool UMLAssociation::load(QDomElement & element) --{ -- if (id() == Uml::ID::None) -- return false; // old style XMI file. No real info in this association. -- -- UMLDoc * doc = UMLApp::app()->document(); -- UMLObject * obj[2] = { NULL, NULL }; -- if (m_AssocType == Uml::AssociationType::Generalization || -- m_AssocType == Uml::AssociationType::Realization || -- m_AssocType == Uml::AssociationType::Dependency || -- m_AssocType == Uml::AssociationType::Child2Category || -- m_AssocType == Uml::AssociationType::Category2Parent) { -- QString general = element.attribute(QLatin1String("general")); -- if (!general.isEmpty()) { -- UMLClassifier *owningClassifier = dynamic_cast(m_pUMLPackage); -- if (owningClassifier == NULL){ -- uWarning() << "Cannot load UML2 generalization: m_pUMLPackage is expected " -- << "to be the owning classifier (=client)"; -- return false; -- } -- m_pRole[RoleType::A]->setObject(owningClassifier); -- m_pRole[RoleType::B]->setSecondaryId(general); // defer resolution to resolveRef() -- owningClassifier->addAssociationEnd(this); -- m_pUMLPackage = m_pUMLPackage->umlPackage(); // reparent -- m_pUMLPackage->addObject(this); -- return true; -- } -- for (unsigned r = RoleType::A; r <= RoleType::B; ++r) { -- const QString fetch = (m_AssocType == Uml::AssociationType::Generalization ? -- r == RoleType::A ? QLatin1String("child") : QLatin1String("parent") -- : r == RoleType::A ? QLatin1String("client") : QLatin1String("supplier")); -- QString roleIdStr = element.attribute(fetch); -- if (roleIdStr.isEmpty()) { -- // Might be given as a child node instead - see below. -- continue; -- } -- -- // set umlobject of role if possible (else defer resolution) -- obj[r] = doc->findObjectById(Uml::ID::fromString(roleIdStr)); -- Uml::RoleType::Enum role = Uml::RoleType::fromInt(r); -- if (obj[r] == NULL) { -- m_pRole[role]->setSecondaryId(roleIdStr); // defer to resolveRef() -- } else { -- m_pRole[role]->setObject(obj[r]); -- if (m_pUMLPackage == NULL) { -- Uml::ModelType::Enum mt = Model_Utils::convert_OT_MT(obj[r]->baseType()); -- m_pUMLPackage = doc->rootFolder(mt); -- DEBUG(DBG_SRC) << "assoctype " << m_AssocType -- << ": setting model type " << Uml::ModelType::toString(mt); -- } -- } -- } -- if (obj[RoleType::A] == NULL || obj[RoleType::B] == NULL) { -- for (QDomNode node = element.firstChild(); !node.isNull(); -- node = node.nextSibling()) { -- if (node.isComment()) -- continue; -- QDomElement tempElement = node.toElement(); -- QString tag = tempElement.tagName(); -- if (Model_Utils::isCommonXMIAttribute(tag)) -- continue; -- // Permitted tag names: -- // roleA: "child" "subtype" "client" -- // roleB: "parent" "supertype" "supplier" -- QString idStr = tempElement.attribute(QLatin1String("xmi.id")); -- if (idStr.isEmpty()) -- idStr = tempElement.attribute(QLatin1String("xmi.idref")); -- if (idStr.isEmpty()) { -- QDomNode inner = node.firstChild(); -- QDomElement tmpElem = inner.toElement(); -- idStr = tmpElem.attribute(QLatin1String("xmi.id")); -- if (idStr.isEmpty()) -- idStr = tmpElem.attribute(QLatin1String("xmi.idref")); -- } -- if (idStr.isEmpty()) { -- uError() << "type " << m_AssocType -- << ", id " << Uml::ID::toString(id()) << ": " -- << "xmi id not given for " << tag; -- continue; -- } -- // Since we know for sure that we're dealing with a non -- // umbrello-kf6 file, use deferred resolution unconditionally. -- if (UMLDoc::tagEq(tag, QLatin1String("child")) || -- UMLDoc::tagEq(tag, QLatin1String("subtype")) || -- UMLDoc::tagEq(tag, QLatin1String("client"))) { -- getUMLRole(RoleType::A)->setSecondaryId(idStr); -- } else { -- getUMLRole(RoleType::B)->setSecondaryId(idStr); -- } -- } -- } -- -- // it is a realization if either endpoint is an interface -- if (isRealization(obj[RoleType::A], obj[RoleType::B])) { -- m_AssocType = Uml::AssociationType::Realization; -- } -- return true; -- } -- -- for (QDomNode node = element.firstChild(); !node.isNull(); -- node = node.nextSibling()) { -- // uml13.dtd compliant format (new style) -- if (node.isComment()) -- continue; -- QDomElement tempElement = node.toElement(); -- QString tag = tempElement.tagName(); -- if (Model_Utils::isCommonXMIAttribute(tag)) -- continue; -- if (!UMLDoc::tagEq(tag, QLatin1String("Association.connection")) && -- !UMLDoc::tagEq(tag, QLatin1String("Association.end")) && // Embarcadero's Describe -- !UMLDoc::tagEq(tag, QLatin1String("Namespace.ownedElement")) && -- !UMLDoc::tagEq(tag, QLatin1String("Namespace.contents"))) { -- uWarning() << "unknown child node " << tag; -- continue; -- } -- // Load role A. -- QDomNode nodeA = tempElement.firstChild(); -- while (nodeA.isComment()) -- nodeA = nodeA.nextSibling(); -- tempElement = nodeA.toElement(); -- if (tempElement.isNull()) { -- uWarning() << "UML:Association : element (A) is Null"; -- return false; -- } -- tag = tempElement.tagName(); -- if (UMLDoc::tagEq(tag, QLatin1String("NavigableEnd"))) { // Embarcadero's Describe -- m_AssocType = Uml::AssociationType::UniAssociation; -- } else if (!UMLDoc::tagEq(tag, QLatin1String("AssociationEndRole")) && -- !UMLDoc::tagEq(tag, QLatin1String("AssociationEnd"))) { -- uWarning() << "unknown child (A) tag " << tag; -- return false; -- } -- if (! getUMLRole(RoleType::A)->loadFromXMI(tempElement)) -- return false; -- // Load role B. -- QDomNode nodeB = nodeA.nextSibling(); -- while (nodeB.isComment()) -- nodeB = nodeB.nextSibling(); -- tempElement = nodeB.toElement(); -- if (tempElement.isNull()) { -- uWarning() << "UML:Association : element (B) is Null"; -- return false; -- } -- tag = tempElement.tagName(); -- if (UMLDoc::tagEq(tag, QLatin1String("NavigableEnd"))) { // Embarcadero's Describe -- m_AssocType = Uml::AssociationType::UniAssociation; -- } else if (!UMLDoc::tagEq(tag, QLatin1String("AssociationEndRole")) && -- !UMLDoc::tagEq(tag, QLatin1String("AssociationEnd"))) { -- uWarning() << "unknown child (B) tag " << tag; -- return false; -- } -- if (! getUMLRole(RoleType::B)->loadFromXMI(tempElement)) -- return false; -- -- if (m_pUMLPackage == NULL) { -- Uml::ModelType::Enum mt = Model_Utils::convert_OT_MT(getObject(RoleType::B)->baseType()); -- m_pUMLPackage = doc->rootFolder(mt); -- DEBUG(DBG_SRC) << "setting model type " << Uml::ModelType::toString(mt); -- } -- -- // setting the association type: -- // -- // In the old days, we could just record this on the association, -- // and be done with it. But thats not how the UML13.dtd does things. -- // As a result, we are checking roleA for information about the -- // parent association (!) which by this point in the parse, should -- // be set. However, the information that the roles are allowed to have -- // is not complete, so we need to finish the analysis here. -- -- // find self-associations -- if (m_AssocType == Uml::AssociationType::Association && getObjectId(RoleType::A) == getObjectId(RoleType::B)) -- m_AssocType = Uml::AssociationType::Association_Self; -- -- // fall-back default type -- if (m_AssocType == Uml::AssociationType::Unknown) { -- m_AssocType = Uml::AssociationType::Association; -- } -- -- return true; -- } -- -- // From here on it's old-style stuff. -- QString assocTypeStr = element.attribute(QLatin1String("assoctype"), QLatin1String("-1")); -- Uml::AssociationType::Enum assocType = Uml::AssociationType::Unknown; -- if (assocTypeStr[0] >= QLatin1Char('a') && assocTypeStr[0] <= QLatin1Char('z')) { -- // In an earlier version, the natural assoctype names were saved. -- const char *assocTypeString[] = { -- "generalization", // Uml::AssociationType::Generalization -- "aggregation", // Uml::AssociationType::Aggregation -- "dependency", // Uml::AssociationType::Dependency -- "association", // Uml::AssociationType::Association -- "associationself", // Uml::AssociationType::Association_Self -- "collmessage", // Uml::AssociationType::Coll_Message -- "seqmessage", // Uml::AssociationType::Seq_Message -- "collmessageself", // Uml::AssociationType::Coll_Message_Self -- "seqmessageself", // Uml::AssociationType::Seq_Message_Self -- "implementation", // Uml::AssociationType::Implementation -- "composition", // Uml::AssociationType::Composition -- "realization", // Uml::AssociationType::Realization -- "uniassociation", // Uml::AssociationType::UniAssociation -- "anchor", // Uml::AssociationType::Anchor -- "state", // Uml::AssociationType::State -- "activity", // Uml::AssociationType::Activity -- "exception", // Uml::AssociationType::Exception -- "category2parent" // Uml::AssociationType::Category2Parent -- "child2category" // Uml::AssociationType::Child2Category -- "relationship" // Uml::AssociationType::Relationship -- }; -- const int arraySize = sizeof(assocTypeString) / sizeof(char*); -- DEBUG(DBG_SRC) << "AssociationType string array size = " << arraySize; -- -- int index; -- for (index = 0; index < arraySize; ++index) -- if (assocTypeStr == QString::fromLatin1(assocTypeString[index])) -- break; -- if (index < arraySize) -- assocType = Uml::AssociationType::fromInt(index); -- } else { -- int assocTypeNum = assocTypeStr.toInt(); -- if (assocTypeNum < (int)Uml::AssociationType::Generalization || // first enum -- assocTypeNum >= (int)Uml::AssociationType::Reserved) { // last enum -- uWarning() << "bad assoctype of UML:AssociationType::Enum " << Uml::ID::toString(id()); -- return false; -- } -- assocType = Uml::AssociationType::fromInt(assocTypeNum); -- } -- setAssociationType(assocType); -- -- Uml::ID::Type roleAObjID = Uml::ID::fromString(element.attribute(QLatin1String("rolea"), QLatin1String("-1"))); -- Uml::ID::Type roleBObjID = Uml::ID::fromString(element.attribute(QLatin1String("roleb"), QLatin1String("-1"))); -- if (assocType == Uml::AssociationType::Aggregation || -- assocType == Uml::AssociationType::Composition) { -- // Flip roles to compensate for changed diamond logic in AssociationLine. -- // For further explanations see AssociationWidget::loadFromXMI. -- Uml::ID::Type tmp = roleAObjID; -- roleAObjID = roleBObjID; -- roleBObjID = tmp; -- } -- -- UMLObject * objA = doc->findObjectById(roleAObjID); -- UMLObject * objB = doc->findObjectById(roleBObjID); -- -- if(objA) -- getUMLRole(RoleType::A)->setObject(objA); -- else -- return false; -- -- if(objB) -- getUMLRole(RoleType::B)->setObject(objB); -- else -- return false; -- -- setMultiplicity(element.attribute(QLatin1String("multia")), RoleType::A); -- setMultiplicity(element.attribute(QLatin1String("multib")), RoleType::B); -- -- setRoleName(element.attribute(QLatin1String("namea")), RoleType::A); -- setRoleName(element.attribute(QLatin1String("nameb")), RoleType::B); -- -- setRoleDoc(element.attribute(QLatin1String("doca")), RoleType::A); -- setRoleDoc(element.attribute(QLatin1String("docb")), RoleType::B); -- -- // Visibility defaults to Public if it cant set it here.. -- QString visibilityA = element.attribute(QLatin1String("visibilitya"), QLatin1String("0")); -- QString visibilityB = element.attribute(QLatin1String("visibilityb"), QLatin1String("0")); -- int vis = visibilityA.toInt(); -- if (vis >= 200) // bkwd compat. -- vis -= 200; -- setVisibility((Uml::Visibility::Enum)vis, RoleType::A); -- vis = visibilityB.toInt(); -- if (vis >= 200) // bkwd compat. -- vis -= 200; -- setVisibility((Uml::Visibility::Enum)vis, RoleType::B); -- -- // Changeability defaults to Changeable if it cant set it here.. -- QString changeabilityA = element.attribute(QLatin1String("changeabilitya"), QLatin1String("0")); -- QString changeabilityB = element.attribute(QLatin1String("changeabilityb"), QLatin1String("0")); -- if (changeabilityA.toInt() > 0) -- setChangeability(Uml::Changeability::fromInt(changeabilityA.toInt()), RoleType::A); -- if (changeabilityB.toInt() > 0) -- setChangeability(Uml::Changeability::fromInt(changeabilityB.toInt()), RoleType::B); -- -- return true; --} -- --/** -- * Returns the UMLObject assigned to the given role. -- * @return Pointer to the UMLObject in the given role. -- */ --UMLObject* UMLAssociation::getObject(Uml::RoleType::Enum role) const --{ -- if (m_pRole[role] == NULL) -- return NULL; -- return m_pRole[role]->object(); --} -- --/** -- * Returns the ID of the UMLObject assigned to the given role. -- * Shorthand for getObject(role)->ID(). -- * @return ID of the UMLObject in the given role. -- */ --Uml::ID::Type UMLAssociation::getObjectId(Uml::RoleType::Enum role) const --{ -- UMLRole *roleObj = m_pRole[role]; -- if (roleObj == NULL) -- return Uml::ID::None; -- UMLObject *o = roleObj->object(); -- if (o == NULL) { -- QString auxID = roleObj->secondaryId(); -- if (auxID.isEmpty()) { -- uError() << "role " << role << ": getObject returns NULL"; -- return Uml::ID::None; -- } else { -- DEBUG(DBG_SRC) << "role " << role << ": using secondary ID " << auxID; -- return Uml::ID::fromString(auxID); -- } -- } -- return o->id(); --} -- --/** -- * Returns the ID of the UMLObject assigned to the given role. -- * CURRENTLY UNUSED. -- * @return ID of the UMLObject of the given role. -- */ --Uml::ID::Type UMLAssociation::getRoleId(RoleType::Enum role) const --{ -- return m_pRole[role]->id(); --} -- --/** -- * Returns the changeability. -- */ --Uml::Changeability::Enum UMLAssociation::changeability(Uml::RoleType::Enum role) const --{ -- return m_pRole[role]->changeability(); --} -- --/** -- * Returns the Visibility of the given role. -- * @return Visibility of the given role. -- */ --Uml::Visibility::Enum UMLAssociation::visibility(Uml::RoleType::Enum role) const --{ -- return m_pRole[role]->visibility(); --} -- --/** -- * Returns the multiplicity assigned to the given role. -- * @return The multiplicity assigned to the given role. -- */ --QString UMLAssociation::getMultiplicity(Uml::RoleType::Enum role) const --{ -- return m_pRole[role]->multiplicity(); --} -- --/** -- * Returns the name assigned to the role A. -- * @return The name assigned to the given role. -- */ --QString UMLAssociation::getRoleName(Uml::RoleType::Enum role) const --{ -- return m_pRole[role]->name(); --} -- --/** -- * Returns the documentation assigned to the given role. -- * @return Documentation text of given role. -- */ --QString UMLAssociation::getRoleDoc(Uml::RoleType::Enum role) const --{ -- return m_pRole[role]->doc(); --} -- --/** -- * Get the underlying UMLRole object for the given role. -- * @return Pointer to the UMLRole object for the given role. -- */ --UMLRole * UMLAssociation::getUMLRole(Uml::RoleType::Enum role) const --{ -- return m_pRole[role]; --} -- --/** -- * Set the attribute m_bOldLoadMode. -- * @param value the new value to set -- */ --void UMLAssociation::setOldLoadMode(bool value /* = true */) --{ -- m_bOldLoadMode = value; --} -- --/** -- * Return the backward compatibility flag for loading files. -- */ --bool UMLAssociation::getOldLoadMode() const --{ -- return m_bOldLoadMode; --} -- --/** -- * Sets the assocType of the UMLAssociation. -- * @param assocType The AssociationType::Enum of the UMLAssociation. -- */ --void UMLAssociation::setAssociationType(Uml::AssociationType::Enum assocType) --{ -- m_AssocType = assocType; -- if (m_AssocType == Uml::AssociationType::UniAssociation) -- { -- // In this case we need to auto-set the multiplicity/rolenames -- // of the roles --#ifdef VERBOSE_DEBUGGING -- DEBUG(DBG_SRC) << " A new uni-association has been created."; --#endif -- } -- UMLObject::emitModified(); --} -- --/** -- * Sets the UMLObject playing the given role in the association. -- * @param obj Pointer to the UMLObject of the given role. -- * @param role The Uml::RoleType::Enum played by the association -- */ --void UMLAssociation::setObject(UMLObject *obj, Uml::RoleType::Enum role) --{ -- m_pRole[role]->setObject(obj); --} -- --/** -- * Sets the visibility of the given role of the UMLAssociation. -- * @param value Visibility of role. -- * @param role The Uml::RoleType::Enum to which the visibility is being applied -- */ --void UMLAssociation::setVisibility(Visibility::Enum value, Uml::RoleType::Enum role) --{ -- m_pRole[role]->setVisibility(value); --} -- --/** -- * Sets the changeability of the given role of the UMLAssociation. -- * @param value Changeability_Type of the given role. -- * @param role The Uml::RoleType::Enum to which the changeability is being set -- */ --void UMLAssociation::setChangeability(Uml::Changeability::Enum value, Uml::RoleType::Enum role) --{ -- m_pRole[role]->setChangeability(value); --} -- --/** -- * Sets the multiplicity of the given role of the UMLAssociation. -- * @param multi The multiplicity of the given role. -- * @param role The Uml::RoleType::Enum to which the multiplicity is being applied -- */ --void UMLAssociation::setMultiplicity(const QString &multi, Uml::RoleType::Enum role) --{ -- if (m_pRole[role]->multiplicity() != multi) { -- UMLApp::app()->executeCommand(new CmdChangeMultiplicity(m_pRole[role], multi)); -- } --} -- --/** -- * Sets the name of the given role of the UMLAssociation. -- * @param roleName The name to set for the given role. -- * @param role The Uml::RoleType::Enum for which to set the name. -- */ --void UMLAssociation::setRoleName(const QString &roleName, Uml::RoleType::Enum role) --{ -- m_pRole[role]->setName(roleName); --} -- --/** -- * Sets the documentation on the given role in the association. -- * @param doc The string with the documentation. -- * @param role The Uml::RoleType::Enum to which the documentation is being applied -- */ --void UMLAssociation::setRoleDoc(const QString &doc, Uml::RoleType::Enum role) --{ -- m_pRole[role]->setDoc(doc); --} -- --/** -- * When the association type is "Generalization" and at least one of the -- * given objects an interface, then it is a "Realization". -- * @param objA UML object as role A -- * @param objB UML object as role B -- * @return flag whether association is a realization -- */ --bool UMLAssociation::isRealization(UMLObject* objA, UMLObject* objB) const --{ -- bool aIsInterface = false; -- if (objA && (objA->baseType() == UMLObject::ot_Interface)) { -- aIsInterface = true; -- } -- bool bIsInterface = false; -- if (objB && (objB->baseType() == UMLObject::ot_Interface)) { -- bIsInterface = true; -- } -- return (m_AssocType == Uml::AssociationType::Generalization) && -- (aIsInterface || bIsInterface); --} -- --/** -- * Common initializations at construction time. -- * @param type The AssociationType::Enum to represent. -- * @param roleAObj Pointer to the role A UMLObject. -- * @param roleBObj Pointer to the role B UMLObject. -- */ --void UMLAssociation::init(Uml::AssociationType::Enum type, UMLObject *roleAObj, UMLObject *roleBObj) --{ -- m_AssocType = type; -- m_BaseType = ot_Association; -- m_Name = QString(); -- m_bOldLoadMode = false; -- nrof_parent_widgets = -1; -- if (!UMLApp::app()->document()->loading()) { -- m_pUMLPackage = UMLApp::app()->document()->currentRoot(); -- } -- m_pRole[RoleType::A] = new UMLRole (this, roleAObj, RoleType::A); -- m_pRole[RoleType::B] = new UMLRole (this, roleBObj, RoleType::B); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/association.h umbrello-kf6-15.08.1/umbrello/association.h ---- umbrello-kf6-15.08.1.orig/umbrello/association.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/association.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,102 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ASSOCIATION_H --#define ASSOCIATION_H -- --#include "basictypes.h" --#include "umlobject.h" -- --#include --#include -- --class UMLRole; -- --/** -- * This class contains the non-graphic representation of an association. -- * An association can be a generalization, realization, simple association, -- * directed association, aggregation, or composition. -- * -- * @short Sets up association information. -- * @author Oliver Kellogg -- * @see UMLObject -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLAssociation : public UMLObject --{ -- Q_OBJECT -- friend class AssociationWidget; -- --public: -- UMLAssociation(Uml::AssociationType::Enum type, UMLObject *roleA, UMLObject *roleB); -- explicit UMLAssociation(Uml::AssociationType::Enum type = Uml::AssociationType::Unknown); -- -- virtual ~UMLAssociation(); -- -- bool operator==(const UMLAssociation &rhs) const; -- -- QString toString() const; -- -- UMLRole * getUMLRole(Uml::RoleType::Enum role) const; -- Uml::ID::Type getObjectId(Uml::RoleType::Enum role) const; -- Uml::ID::Type getRoleId(Uml::RoleType::Enum role) const; -- -- void setAssociationType(Uml::AssociationType::Enum assocType); -- Uml::AssociationType::Enum getAssocType() const; -- -- void setObject(UMLObject *obj, Uml::RoleType::Enum role); -- UMLObject* getObject(Uml::RoleType::Enum role) const; -- -- void setVisibility(Uml::Visibility::Enum value, Uml::RoleType::Enum role); -- Uml::Visibility::Enum visibility(Uml::RoleType::Enum role) const; -- -- void setChangeability(Uml::Changeability::Enum value, Uml::RoleType::Enum role); -- Uml::Changeability::Enum changeability(Uml::RoleType::Enum role) const; -- -- void setMultiplicity(const QString &multi, Uml::RoleType::Enum role); -- QString getMultiplicity(Uml::RoleType::Enum role) const; -- -- void setRoleName(const QString &roleName, Uml::RoleType::Enum role); -- QString getRoleName(Uml::RoleType::Enum role) const; -- -- void setRoleDoc(const QString &doc, Uml::RoleType::Enum role); -- QString getRoleDoc(Uml::RoleType::Enum role) const; -- -- void setOldLoadMode(bool value = true); -- bool getOldLoadMode() const; -- -- virtual UMLObject* clone() const { return NULL; } -- -- virtual bool resolveRef(); -- -- void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- -- virtual bool showPropertiesDialog(QWidget *parent = 0); -- --protected: -- -- bool load(QDomElement& element); -- -- // keep track of number of parent widgets -- int nrof_parent_widgets; -- -- void init(Uml::AssociationType::Enum type, UMLObject *roleAObj, UMLObject *roleBObj); -- -- UMLRole * m_pRole[2]; -- Uml::AssociationType::Enum m_AssocType; -- QString m_Name; -- bool m_bOldLoadMode; -- --private: -- -- bool isRealization(UMLObject* objA, UMLObject* objB) const; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/attribute.cpp umbrello-kf6-15.08.1/umbrello/attribute.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/attribute.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/attribute.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,424 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "attribute.h" -- --// app includes --#include "debug_utils.h" --#include "classifier.h" --#include "operation.h" --#include "umlobject.h" --#include "umldoc.h" --#include "uml.h" --#include "folder.h" --#include "umlattributedialog.h" --#include "object_factory.h" -- --/** -- * Sets up an attribute. -- * -- * @param parent The parent of this UMLAttribute. -- * @param name The name of this UMLAttribute. -- * @param id The unique id given to this UMLAttribute. -- * @param s The visibility of the UMLAttribute. -- * @param type The type of this UMLAttribute. -- * @param iv The initial value of the attribute. -- */ --UMLAttribute::UMLAttribute(UMLObject *parent, -- const QString& name, Uml::ID::Type id, -- Uml::Visibility::Enum s, -- UMLObject *type, const QString& iv) -- : UMLClassifierListItem(parent, name, id) --{ -- m_InitialValue = iv; -- m_BaseType = UMLObject::ot_Attribute; -- m_visibility = s; -- m_ParmKind = Uml::ParameterDirection::In; -- /* CHECK: Do we need this: -- if (type == NULL) { -- type = Object_Factory::createUMLObject(Uml::ot_Datatype, "undef"); -- } -- */ -- m_pSecondary = type; --} -- --/** -- * Sets up an attribute. -- * -- * @param parent The parent of this UMLAttribute. -- */ --UMLAttribute::UMLAttribute(UMLObject *parent) : UMLClassifierListItem(parent) --{ -- m_BaseType = UMLObject::ot_Attribute; -- m_visibility = Uml::Visibility::Private; -- m_ParmKind = Uml::ParameterDirection::In; --} -- --/** -- * Destructor. -- */ --UMLAttribute::~UMLAttribute() --{ --} -- --/** -- * Reimplementation of method from UMLObject is required as -- * an extra signal, attributeChanged(), is emitted. -- */ --void UMLAttribute::setName(const QString &name) --{ -- m_name = name; -- emit attributeChanged(); -- UMLObject::emitModified(); --} -- --/** -- * Reimplementation of method from UMLObject is required as -- * an extra signal, attributeChanged(), is emitted. -- */ --void UMLAttribute::setVisibility(Uml::Visibility::Enum s) --{ -- m_visibility = s; -- emit attributeChanged(); -- UMLObject::emitModified(); --} -- --/** -- * Returns The initial value of the UMLAttribute. -- * -- * @return The initial value of the Atrtibute. -- */ --QString UMLAttribute::getInitialValue() const --{ -- return m_InitialValue; --} -- --/** -- * Sets the initial value of the UMLAttribute. -- * -- * @param iv The initial value of the UMLAttribute. -- */ --void UMLAttribute::setInitialValue(const QString &iv) --{ -- if(m_InitialValue != iv) { -- m_InitialValue = iv; -- UMLObject::emitModified(); -- } --} -- --void UMLAttribute::setParmKind (Uml::ParameterDirection::Enum pk) --{ -- m_ParmKind = pk; --} -- --Uml::ParameterDirection::Enum UMLAttribute::getParmKind() const --{ -- return m_ParmKind; --} -- --/** -- * Returns a string representation of the UMLAttribute. -- * -- * @param sig If true will show the attribute type and initial value. -- * @return Returns a string representation of the UMLAttribute. -- */ --QString UMLAttribute::toString(Uml::SignatureType::Enum sig) --{ -- QString s; -- -- if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::NoSig) { -- s = Uml::Visibility::toString(m_visibility, true) + QLatin1Char(' '); -- } -- -- if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::SigNoVis) { -- // Determine whether the type name needs to be scoped. -- UMLObject *owningObject = static_cast(parent()); -- if (owningObject->baseType() == UMLObject::ot_Operation) { -- // The immediate parent() is the UMLOperation but we want -- // the UMLClassifier: -- owningObject = static_cast(owningObject->parent()); -- } -- UMLClassifier *ownParent = dynamic_cast(owningObject); -- if (ownParent == NULL) { -- uError() << "parent " << owningObject->name() -- << " is not a UMLClassifier"; -- return QString(); -- } -- QString typeName; -- UMLClassifier *type = UMLClassifierListItem::getType(); -- if (type) { -- UMLPackage *typeScope = type->umlPackage(); -- if (typeScope != ownParent && typeScope != ownParent->umlPackage()) -- typeName = type->fullyQualifiedName(); -- else -- typeName = type->name(); -- } -- // The default direction, "in", is not mentioned. -- // Perhaps we should include a pd_Unspecified in -- // Uml::ParameterDirection::Enum to have better control over this. -- if (m_ParmKind == Uml::ParameterDirection::InOut) -- s += QLatin1String("inout "); -- else if (m_ParmKind == Uml::ParameterDirection::Out) -- s += QLatin1String("out "); -- // Construct the attribute text. -- QString string = s + name() + QLatin1String(" : ") + typeName; -- if (m_InitialValue.length() > 0) -- string += QLatin1String(" = ") + m_InitialValue; -- return string; -- } -- return s + name(); --} -- --/** -- * Reimplement method from UMLObject. -- */ --QString UMLAttribute::getFullyQualifiedName(const QString& separator, -- bool includeRoot /* = false */) const --{ -- UMLOperation *op = NULL; -- UMLObject *owningObject = static_cast(parent()); -- if (owningObject->baseType() == UMLObject::ot_Operation) { -- op = static_cast(owningObject); -- owningObject = static_cast(owningObject->parent()); -- } -- UMLClassifier *ownParent = dynamic_cast(owningObject); -- if (ownParent == NULL) { -- uError() << name() << ": parent " << owningObject->name() -- << " is not a UMLClassifier"; -- return QString(); -- } -- QString tempSeparator = separator; -- if (tempSeparator.isEmpty()) -- tempSeparator = UMLApp::app()->activeLanguageScopeSeparator(); -- QString fqn = ownParent->fullyQualifiedName(tempSeparator, includeRoot); -- if (op) -- fqn.append(tempSeparator + op->name()); -- fqn.append(tempSeparator + name()); -- return fqn; --} -- --/** -- * Overloaded '==' operator -- */ --bool UMLAttribute::operator==(const UMLAttribute &rhs) const --{ -- if(this == &rhs) -- return true; -- -- if(!UMLObject::operator==(rhs)) -- return false; -- -- // The type name is the only distinguishing criterion. -- // (Some programming languages might support more, but others don't.) -- if (m_pSecondary != rhs.m_pSecondary) -- return false; -- -- return true; --} -- --/** -- * Copy the internal presentation of this object into the UMLAttribute -- * object. -- */ --void UMLAttribute::copyInto(UMLObject *lhs) const --{ -- UMLAttribute *target = static_cast(lhs); -- // call the parent first. -- UMLClassifierListItem::copyInto(target); -- -- // Copy all datamembers -- target->m_pSecondary = m_pSecondary; -- target->m_SecondaryId = m_SecondaryId; -- target->m_InitialValue = m_InitialValue; -- target->m_ParmKind = m_ParmKind; --} -- --/** -- * Make a clone of the UMLAttribute. -- */ --UMLObject* UMLAttribute::clone() const --{ -- //FIXME: The new attribute should be slaved to the NEW parent not the old. -- UMLAttribute *clone = new UMLAttribute(static_cast(parent())); -- copyInto(clone); -- -- return clone; --} -- --/** -- * Creates the XMI element. -- */ --void UMLAttribute::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement attributeElement = UMLObject::save(QLatin1String("UML:Attribute"), qDoc); -- if (m_pSecondary == NULL) { -- uDebug() << name() << ": m_pSecondary is NULL, m_SecondaryId is '" -- << m_SecondaryId << "'"; -- } else { -- attributeElement.setAttribute(QLatin1String("type"), Uml::ID::toString(m_pSecondary->id())); -- } -- if (! m_InitialValue.isEmpty()) -- attributeElement.setAttribute(QLatin1String("initialValue"), m_InitialValue); -- qElement.appendChild(attributeElement); --} -- --/** -- * Loads the XMI element. -- */ --bool UMLAttribute::load(QDomElement & element) --{ -- m_SecondaryId = element.attribute(QLatin1String("type")); -- // We use the m_SecondaryId as a temporary store for the xmi.id -- // of the attribute type model object. -- // It is resolved later on, when all classes have been loaded. -- // This deferred resolution is required because the xmi.id may -- // be a forward reference, i.e. it may identify a model object -- // that has not yet been loaded. -- if (m_SecondaryId.isEmpty()) { -- // Perhaps the type is stored in a child node: -- QDomNode node = element.firstChild(); -- while (!node.isNull()) { -- if (node.isComment()) { -- node = node.nextSibling(); -- continue; -- } -- QDomElement tempElement = node.toElement(); -- QString tag = tempElement.tagName(); -- if (!UMLDoc::tagEq(tag, QLatin1String("type"))) { -- node = node.nextSibling(); -- continue; -- } -- m_SecondaryId = Model_Utils::getXmiId(tempElement); -- if (m_SecondaryId.isEmpty()) -- m_SecondaryId = tempElement.attribute(QLatin1String("xmi.idref")); -- if (m_SecondaryId.isEmpty()) { -- QString href = tempElement.attribute(QLatin1String("href")); -- if (href.isEmpty()) { -- QDomNode inner = node.firstChild(); -- QDomElement tmpElem = inner.toElement(); -- m_SecondaryId = Model_Utils::getXmiId(tmpElem); -- if (m_SecondaryId.isEmpty()) -- m_SecondaryId = tmpElem.attribute(QLatin1String("xmi.idref")); -- } else { -- int hashpos = href.lastIndexOf(QChar(QLatin1Char('#'))); -- if (hashpos < 0) { -- uDebug() << name() << ": cannot find type " << href; -- } else { -- QString typeName = href.mid(hashpos + 1); -- UMLFolder *dtFolder = UMLApp::app()->document()->datatypeFolder(); -- m_pSecondary = Model_Utils::findUMLObject(dtFolder->containedObjects(), -- typeName, UMLObject::ot_Datatype); -- if (!m_pSecondary) { -- m_pSecondary = Object_Factory::createUMLObject(UMLObject::ot_Datatype, -- typeName, dtFolder); -- } -- } -- } -- } -- break; -- } -- if (m_SecondaryId.isEmpty()) { -- uDebug() << name() << ": cannot find type."; -- } -- } -- m_InitialValue = element.attribute(QLatin1String("initialValue")); -- if (m_InitialValue.isEmpty()) { -- // for backward compatibility -- m_InitialValue = element.attribute(QLatin1String("value")); -- } -- return true; --} -- --/** -- * Display the properties configuration dialog for the attribute. -- */ --bool UMLAttribute::showPropertiesDialog(QWidget* parent) --{ -- UMLAttributeDialog dialog(parent, this); -- return dialog.exec(); --} -- --/** -- * Puts in the param templateParamList all the template params that are in templateParam -- */ --void UMLAttribute::setTemplateParams(const QString& templateParam, UMLClassifierList &templateParamList) --{ -- if (templateParam.isEmpty()) -- return; -- QString type = templateParam.simplified(); -- -- int start = type.indexOf(QLatin1Char('<')); -- if (start >= 0) { -- int end = start; -- int count = 1; -- int len = type.length(); -- while (count != 0 && ++end < len) { -- QChar c = type.at(end); -- if (c == QLatin1Char('<')) { -- count++; -- } -- if (c == QLatin1Char('>')) { -- count--; -- } -- } -- if (count != 0) { -- //The template is ill-formated, let's quit -- return; -- } -- setTemplateParams(type.mid(start + 1, end - start - 1), templateParamList); -- setTemplateParams(type.left(start) + type.right(len - end - 1), templateParamList); -- } else { -- QStringList paramsList = type.split(QLatin1Char(',')); -- for (QStringList::Iterator it = paramsList.begin(); it != paramsList.end(); ++it) { -- QString param = *it; -- if (!param.isEmpty()) { -- UMLDoc *pDoc = UMLApp::app()->document(); -- UMLObject* obj = pDoc->findUMLObject(param); -- if (obj == NULL) { -- obj = pDoc->findUMLObject(param.remove(QLatin1Char(' '))); -- } -- if (obj != NULL) { -- //We want to list only the params that already exist in this document -- //If the param doesnt't already exist, we couldn't draw an association anyway -- UMLClassifier* tmpClassifier = static_cast(obj); -- if (templateParamList.indexOf(tmpClassifier) == -1) { -- templateParamList.append(tmpClassifier); -- } -- } -- } -- } -- } --} -- --/** -- * Returns all the template params (if any) that are in the type of this attribute -- */ --UMLClassifierList UMLAttribute::getTemplateParams() --{ -- UMLClassifierList templateParamList; -- QString type = getType()->name(); -- QString templateParam; -- // Handle C++/D/Java template/generic parameters -- const Uml::ProgrammingLanguage::Enum pl = UMLApp::app()->activeLanguage(); -- if (pl == Uml::ProgrammingLanguage::Cpp || -- pl == Uml::ProgrammingLanguage::Java || pl == Uml::ProgrammingLanguage::D) { -- int start = type.indexOf(QLatin1Char('<')); -- if (start >= 0) { -- int end = type.lastIndexOf(QLatin1Char('>')); -- if (end > start) { -- templateParam = type.mid(start + 1, end - start - 1); -- setTemplateParams(templateParam, templateParamList); -- } -- } -- } -- return templateParamList; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/attribute.h umbrello-kf6-15.08.1/umbrello/attribute.h ---- umbrello-kf6-15.08.1.orig/umbrello/attribute.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/attribute.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,84 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ATTRIBUTE_H --#define ATTRIBUTE_H -- --#include "basictypes.h" --#include "classifierlistitem.h" --#include "umlclassifierlist.h" -- --/** -- * This class is used to set up information for an attribute. This is like -- * a programming attribute. It has a type, name, visibility and initial value. -- * -- * @short Sets up attribute information. -- * @author Paul Hensgen -- * @see UMLObject -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLAttribute : public UMLClassifierListItem --{ -- Q_OBJECT --public: -- -- UMLAttribute(UMLObject *parent, const QString& name, -- Uml::ID::Type id = Uml::ID::None, -- Uml::Visibility::Enum s = Uml::Visibility::Private, -- UMLObject *type = 0, const QString& iv = QString()); -- explicit UMLAttribute(UMLObject *parent); -- -- bool operator==(const UMLAttribute &rhs) const; -- -- virtual ~UMLAttribute(); -- -- virtual void copyInto(UMLObject *lhs) const; -- -- void setName(const QString &name); -- -- void setVisibility(Uml::Visibility::Enum s); -- -- virtual UMLObject* clone() const; -- -- QString getInitialValue() const; -- void setInitialValue(const QString &iv); -- -- QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -- -- QString getFullyQualifiedName(const QString& separator = QString(), -- bool includeRoot = false) const; -- -- virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- -- virtual bool showPropertiesDialog(QWidget* parent = 0); -- -- void setParmKind(Uml::ParameterDirection::Enum pk); -- Uml::ParameterDirection::Enum getParmKind() const; -- -- virtual UMLClassifierList getTemplateParams(); -- --signals: -- -- void attributeChanged(); -- --protected: -- -- bool load(QDomElement & element); -- -- QString m_InitialValue; ///< text for the attribute's initial value. -- Uml::ParameterDirection::Enum m_ParmKind; -- --private: -- -- void setTemplateParams(const QString& templateParam, UMLClassifierList &templateParamList); -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/category.cpp umbrello-kf6-15.08.1/umbrello/category.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/category.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/category.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,101 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "category.h" -- --/** -- * Constructs a Category. -- * -- * @param name The name of the Category. -- * @param id The unique id to assign to this Category. -- */ --UMLCategory::UMLCategory(const QString & name, Uml::ID::Type id) -- : UMLCanvasObject(name, id) --{ -- init(); --} -- --/** -- * Standard destructor. -- */ --UMLCategory::~UMLCategory() --{ --} -- --/** -- * Initializes key variables of the class. -- */ --void UMLCategory::init() --{ -- m_BaseType = UMLObject::ot_Category; -- m_CategoryType = ct_Disjoint_Specialisation; --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLCategory::copyInto(UMLObject *lhs) const --{ -- UMLCategory *target = static_cast(lhs); -- -- // call the parent first -- UMLCanvasObject::copyInto(target); -- -- target->m_CategoryType = m_CategoryType; --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLCategory::clone() const --{ -- UMLCategory *clone = new UMLCategory(); -- copyInto(clone); -- return clone; --} -- --/** -- * Creates the XMI element. -- */ --void UMLCategory::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement categoryElement = UMLObject::save(QLatin1String("UML:Category"), qDoc); -- categoryElement.setAttribute(QLatin1String("categoryType"), (int)m_CategoryType); -- qElement.appendChild(categoryElement); --} -- --/** -- * Loads the XMI element (empty.) -- */ --bool UMLCategory::load(QDomElement& element) --{ -- m_CategoryType = (Category_Type)element.attribute(QLatin1String("categoryType"), -- QLatin1String("0")).toInt(); -- return true; --} -- --/** -- * Get the category type -- */ --UMLCategory::Category_Type UMLCategory::getType() --{ -- return m_CategoryType; --} -- --/** -- * Set the category type -- */ --void UMLCategory::setType(Category_Type type) --{ -- m_CategoryType = type; -- emitModified(); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/category.h umbrello-kf6-15.08.1/umbrello/category.h ---- umbrello-kf6-15.08.1.orig/umbrello/category.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/category.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,62 +0,0 @@ --/*************************************************************************** -- * * -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef CATEGORY_H --#define CATEGORY_H -- --#include "umlcanvasobject.h" -- --/** -- * This class contains the non-graphical information required for a UML Category. -- * This class inherits from @ref UMLCanvasObject which contains most of the -- * information. -- * The @ref UMLDoc class creates instances of this type. -- * -- * @short Information for a non-graphical UML Category. -- * @author Sharan Rao -- * @see UMLCanvasObject -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLCategory : public UMLCanvasObject { -- Q_OBJECT --public: -- -- enum Category_Type { -- ct_Disjoint_Specialisation, -- ct_Overlapping_Specialisation, -- ct_Union -- }; -- -- explicit UMLCategory(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -- ~UMLCategory(); -- -- virtual void init(); -- -- void copyInto(UMLObject *lhs) const; -- -- virtual UMLObject* clone() const; -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- -- UMLCategory::Category_Type getType(); -- -- void setType(Category_Type type); -- --protected: -- -- bool load(QDomElement & element); -- --private: -- -- Category_Type m_CategoryType; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/checkconstraint.cpp umbrello-kf6-15.08.1/umbrello/checkconstraint.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/checkconstraint.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/checkconstraint.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,160 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --//own header --#include "checkconstraint.h" -- --// app includes --#include "debug_utils.h" --#include "umlcheckconstraintdialog.h" -- --/** -- * Sets up a constraint. -- * -- * @param parent The parent of this UMLCheckConstraint. -- * @param name The name of this UMLCheckConstraint. -- * @param id The unique id given to this UMLCheckConstraint. -- */ --UMLCheckConstraint::UMLCheckConstraint(UMLObject *parent, -- const QString& name, Uml::ID::Type id) -- : UMLEntityConstraint(parent, name, id) --{ -- init(); --} -- --/** -- * Sets up a constraint. -- * -- * @param parent The parent of this UMLCheckConstraint. -- */ --UMLCheckConstraint::UMLCheckConstraint(UMLObject *parent) -- : UMLEntityConstraint(parent) --{ -- init(); --} -- --/** -- * Overloaded '==' operator. -- */ --bool UMLCheckConstraint::operator==(const UMLCheckConstraint &rhs) const --{ -- if (this == &rhs) -- return true; -- -- if (!UMLObject::operator==(rhs)) -- return false; -- -- return true; --} -- --/** -- * Destructor. -- */ --UMLCheckConstraint::~UMLCheckConstraint() --{ --} -- --/** -- * Copy the internal presentation of this object into the UMLCheckConstraint -- * object. -- */ --void UMLCheckConstraint::copyInto(UMLObject *lhs) const --{ -- UMLCheckConstraint *target = static_cast(lhs); -- -- // call the parent first. -- UMLEntityConstraint::copyInto(target); -- -- // Copy all datamembers -- target->m_CheckCondition = m_CheckCondition; --} -- --/** -- * Make a clone of the UMLCheckConstraint. -- */ --UMLObject* UMLCheckConstraint::clone() const --{ -- //FIXME: The new attribute should be slaved to the NEW parent not the old. -- UMLCheckConstraint *clone = new UMLCheckConstraint(static_cast(parent())); -- copyInto(clone); -- return clone; --} -- --/** -- * Returns a string representation of the UMLCheckConstraint. -- * -- * @param sig If true will show the attribute type and initial value. -- * @return Returns a string representation of the UMLAttribute. -- */ --QString UMLCheckConstraint::toString(Uml::SignatureType::Enum sig) --{ -- QString s; -- -- if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::SigNoVis) { -- s = name() ; -- } -- -- return s; --} -- --QString UMLCheckConstraint::getFullyQualifiedName(const QString& separator, -- bool includeRoot) const --{ -- Q_UNUSED(separator); Q_UNUSED(includeRoot); -- return this->name(); --} -- --/** -- * Creates the XMI element. -- */ --void UMLCheckConstraint::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement checkConstraintElement = UMLObject::save(QLatin1String("UML:CheckConstraint"), qDoc); -- -- QDomNode checkCondition = qDoc.createTextNode(m_CheckCondition); -- checkConstraintElement.appendChild(checkCondition); -- -- qElement.appendChild(checkConstraintElement); --} -- --/** -- * Display the properties configuration dialog for the attribute. -- */ --bool UMLCheckConstraint::showPropertiesDialog(QWidget* parent) --{ -- UMLCheckConstraintDialog dialog(parent, this); -- return dialog.exec(); --} -- --/** -- * Loads the XMI element. -- */ --bool UMLCheckConstraint::load(QDomElement & element) --{ -- QDomNode node = element.firstChild(); -- -- QDomText checkConstraintText = node.toText(); -- if (checkConstraintText.isNull()) -- m_CheckCondition = QString(); -- else -- m_CheckCondition = checkConstraintText.data(); -- -- return true; --} -- --/** -- * Initialises Check Constraint -- */ --void UMLCheckConstraint::init() --{ -- m_BaseType = UMLObject::ot_CheckConstraint; -- m_CheckCondition.clear(); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/checkconstraint.h umbrello-kf6-15.08.1/umbrello/checkconstraint.h ---- umbrello-kf6-15.08.1.orig/umbrello/checkconstraint.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/checkconstraint.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,71 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef CHECKCONSTRAINT_H --#define CHECKCONSTRAINT_H -- --#include "basictypes.h" --#include "entityconstraint.h" -- --/** -- * This class is used to set up information for a unique entity constraint. -- * -- * @short Sets up Check Constraint information for UMLEntities. -- * @author Sharan Rao -- * @see UMLObject UMLClassifierListItem UMLEntityConstraint -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLCheckConstraint : public UMLEntityConstraint --{ -- Q_OBJECT --public: -- -- UMLCheckConstraint(UMLObject *parent, const QString& name, -- Uml::ID::Type id = Uml::ID::None); -- explicit UMLCheckConstraint(UMLObject *parent); -- -- bool operator==(const UMLCheckConstraint &rhs) const; -- -- virtual ~UMLCheckConstraint(); -- -- virtual void copyInto(UMLObject *lhs) const; -- -- virtual UMLObject* clone() const; -- -- QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -- -- QString getFullyQualifiedName(const QString& separator = QString(), -- bool includeRoot = false) const; -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- -- virtual bool showPropertiesDialog(QWidget* parent = 0); -- -- QString getCheckCondition() const { -- return m_CheckCondition; -- } -- -- void setCheckCondition(const QString& condition) { -- m_CheckCondition = condition.trimmed(); -- } -- --protected: -- -- bool load(QDomElement & element); -- --private: -- -- void init(); -- -- QString m_CheckCondition; ///< the check condition -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/classifier.cpp umbrello-kf6-15.08.1/umbrello/classifier.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/classifier.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/classifier.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,1631 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ --#include "classifier.h" -- --// app includes --#include "association.h" --#include "debug_utils.h" --#include "umlassociationlist.h" --#include "operation.h" --#include "attribute.h" --#include "template.h" --#include "enumliteral.h" --#include "entityattribute.h" --#include "enum.h" --#include "entity.h" --#include "stereotype.h" --#include "umldoc.h" --#include "uml.h" --#include "uniqueid.h" --#include "object_factory.h" --#include "model_utils.h" --#include "idchangelog.h" --#include "umloperationdialog.h" --#include "umlattributedialog.h" --#include "umltemplatedialog.h" --#include "optionstate.h" --#include "icon_utils.h" -- --// kde includes --#include --#include -- --// qt includes --#include -- --using namespace Uml; -- --/** -- * @brief holds set of classifiers for recursive loop detection -- */ --class UMLClassifierSet: public QSet { --public: -- UMLClassifierSet() : level(0) -- { -- } -- int level; --}; -- --/** -- * Sets up a Classifier. -- * -- * @param name The name of the Concept. -- * @param id The unique id of the Concept. -- */ --UMLClassifier::UMLClassifier(const QString & name, Uml::ID::Type id) -- : UMLPackage(name, id) --{ -- m_BaseType = UMLObject::ot_Class; // default value -- m_pClassAssoc = NULL; -- m_isRef = false; --} -- --/** -- * Standard deconstructor. -- */ --UMLClassifier::~UMLClassifier() --{ --} -- --/** -- * Reimplementation of method from class UMLObject for controlling the -- * exact type of this classifier: class, interface, or datatype. -- * @param ot the base type to set -- */ --void UMLClassifier::setBaseType(UMLObject::ObjectType ot) --{ -- m_BaseType = ot; -- Icon_Utils::IconType newIcon; -- switch (ot) { -- case ot_Interface: -- UMLObject::setStereotypeCmd(QLatin1String("interface")); -- UMLObject::m_bAbstract = true; -- newIcon = Icon_Utils::it_Interface; -- break; -- case ot_Class: -- UMLObject::setStereotypeCmd(QString()); -- UMLObject::m_bAbstract = false; -- newIcon = Icon_Utils::it_Class; -- break; -- case ot_Datatype: -- UMLObject::setStereotypeCmd(QLatin1String("datatype")); -- UMLObject::m_bAbstract = false; -- newIcon = Icon_Utils::it_Datatype; -- break; -- case ot_Package: -- UMLObject::setStereotypeCmd(QLatin1String("package")); -- UMLObject::m_bAbstract = false; -- newIcon = Icon_Utils::it_Package; -- break; -- default: -- uError() << "cannot set to type " << ot; -- return; -- } -- Model_Utils::treeViewChangeIcon(this, newIcon); --} -- --/** -- * Returns true if this classifier represents an interface. -- */ --bool UMLClassifier::isInterface() const --{ -- return (m_BaseType == ot_Interface); --} -- --/** -- * Returns true if this classifier represents a datatype. -- */ --bool UMLClassifier::isDatatype() const --{ -- return (m_BaseType == ot_Datatype); --} -- --/** -- * Checks whether an operation is valid based on its signature - -- * An operation is "valid" if the operation's name and parameter list -- * are unique in the classifier. -- * -- * @param name Name of the operation to check. -- * @param opParams The operation's argument list. -- * @param exemptOp Pointer to the exempt method (optional.) -- * @return NULL if the signature is valid (ok), else return a pointer -- * to the existing UMLOperation that causes the conflict. -- */ --UMLOperation * UMLClassifier::checkOperationSignature( -- const QString& name, -- UMLAttributeList opParams, -- UMLOperation *exemptOp) --{ -- UMLOperationList list = findOperations(name); -- if (list.count() == 0) { -- return NULL; -- } -- const int inputParmCount = opParams.count(); -- -- // there is at least one operation with the same name... compare the parameter list -- foreach (UMLOperation* test, list) { -- if (test == exemptOp) { -- continue; -- } -- UMLAttributeList testParams = test->getParmList(); -- const int pCount = testParams.count(); -- if (pCount != inputParmCount) { -- continue; -- } -- int i = 0; -- while (i < pCount) { -- // The only criterion for equivalence is the parameter types. -- // (Default values are not considered.) -- if(testParams.at(i)->getTypeName() != opParams.at(i)->getTypeName()) -- break; -- i++; -- } -- if (i == pCount) { // all parameters matched->the signature is not unique -- return test; -- } -- } -- // we did not find an exact match, so the signature is unique (acceptable) -- return NULL; --} -- --/** -- * Find an operation of the given name and parameter signature. -- * -- * @param name The name of the operation to find. -- * @param params The parameter descriptors of the operation to find. -- * -- * @return The operation found. Will return 0 if none found. -- */ --UMLOperation* UMLClassifier::findOperation(const QString& name, -- Model_Utils::NameAndType_List params) --{ -- UMLOperationList list = findOperations(name); -- if (list.count() == 0) { -- return NULL; -- } -- // if there are operation(s) with the same name then compare the parameter list -- const int inputParmCount = params.count(); -- -- foreach (UMLOperation* test, list) { -- UMLAttributeList testParams = test->getParmList(); -- const int pCount = testParams.count(); -- if (inputParmCount == 0 && pCount == 0) -- return test; -- if (inputParmCount != pCount) -- continue; -- int i = 0; -- for (; i < pCount; ++i) { -- Model_Utils::NameAndType_ListIt nt(params.begin() + i); -- UMLClassifier *type = dynamic_cast((*nt).m_type); -- UMLClassifier *testType = testParams.at(i)->getType(); -- if (type == NULL && testType == NULL) { //no parameter type -- continue; -- } else if (type == NULL) { //template parameter -- if (testType->name() != QLatin1String("class")) -- break; -- } else if (type != testType) -- break; -- } -- if (i == pCount) -- return test; // all parameters matched -- } -- return 0; --} -- --/** -- * Creates an operation in the current document. -- * The new operation is initialized with name, id, etc. -- * If a method with the given profile already exists in the classifier, -- * no new method is created and the existing operation is returned. -- * If no name is provided, or if the params are NULL, an Operation -- * Dialog is shown to ask the user for a name and parameters. -- * The operation's signature is checked for validity within the parent -- * classifier. -- * -- * @param name The operation name (will be chosen internally if -- * none given.) -- * @param isExistingOp Optional pointer to bool. If supplied, the bool is -- * set to true if an existing operation is returned. -- * @param params Optional list of parameter names and types. -- * If supplied, new operation parameters are -- * constructed using this list. -- * @return The new operation, or NULL if the operation could not be -- * created because for example, the user canceled the dialog -- * or no appropriate name can be found. -- */ --UMLOperation* UMLClassifier::createOperation( -- const QString &name /*=QString()*/, -- bool *isExistingOp /*=NULL*/, -- Model_Utils::NameAndType_List *params /*=NULL*/) --{ -- bool nameNotSet = (name.isNull() || name.isEmpty()); -- if (! nameNotSet) { -- Model_Utils::NameAndType_List parList; -- if (params) -- parList = *params; -- UMLOperation* existingOp = findOperation(name, parList); -- if (existingOp != NULL) { -- if (isExistingOp != NULL) -- *isExistingOp = true; -- return existingOp; -- } -- } -- // we did not find an exact match, so the signature is unique -- UMLOperation *op = new UMLOperation(this, name); -- if (params) { -- for (Model_Utils::NameAndType_ListIt it = params->begin(); it != params->end(); ++it) { -- const Model_Utils::NameAndType &nt = *it; -- UMLAttribute *par = new UMLAttribute(op, nt.m_name, Uml::ID::None, Uml::Visibility::Private, -- nt.m_type, nt.m_initialValue); -- par->setParmKind(nt.m_direction); -- op->addParm(par); -- } -- } -- -- // Only show the operation dialog if no name was provided (allows quick-create -- // from listview) -- if (nameNotSet) { -- op->setName(uniqChildName(UMLObject::ot_Operation)); -- -- while (true) { -- QPointer operationDialog = new UMLOperationDialog(0, op); -- if(operationDialog->exec() != QDialog::Accepted) { -- delete op; -- delete operationDialog; -- return NULL; -- } else if (checkOperationSignature(op->name(), op->getParmList())) { -- KMessageBox::information(0, -- i18n("An operation with the same name and signature already exists. You cannot add it again.")); -- } else { -- break; -- } -- delete operationDialog; -- } -- } -- -- // operation name is ok, formally add it to the classifier -- if (! addOperation(op)) { -- delete op; -- return NULL; -- } -- -- UMLDoc *umldoc = UMLApp::app()->document(); -- umldoc->signalUMLObjectCreated(op); -- return op; --} -- --/** -- * Appends an operation to the classifier. -- * This function is mainly intended for the clipboard. -- * -- * @param op Pointer to the UMLOperation to add. -- * @param position Inserted at the given position. -- * @return True if the operation was added successfully. -- */ --bool UMLClassifier::addOperation(UMLOperation* op, int position) --{ -- Q_ASSERT(op); -- if (m_List.indexOf(op) != -1) { -- uDebug() << "findRef(" << op->name() << ") finds op (bad)"; -- return false; -- } -- if (checkOperationSignature(op->name(), op->getParmList())) { -- uDebug() << "checkOperationSignature(" << op->name() << ") op is non-unique"; -- return false; -- } -- -- if (position >= 0 && position <= m_List.count()) { -- uDebug() << op->name() << ": inserting at position " << position; -- m_List.insert(position, op); -- UMLClassifierListItemList itemList = getFilteredList(UMLObject::ot_Operation); -- QString buf; -- foreach (UMLClassifierListItem* currentAtt, itemList) { -- buf.append(QLatin1Char(' ') + currentAtt->name()); -- } -- uDebug() << " list after change: " << buf; -- } -- else { -- m_List.append(op); -- } -- emit operationAdded(op); -- UMLObject::emitModified(); -- connect(op, SIGNAL(modified()), this, SIGNAL(modified())); -- return true; --} -- --/** -- * Appends an operation to the classifier. -- * @see bool addOperation(UMLOperation* Op, int position = -1) -- * This function is mainly intended for the clipboard. -- * -- * @param op Pointer to the UMLOperation to add. -- * @param log Pointer to the IDChangeLog. -- * @return True if the operation was added successfully. -- */ --bool UMLClassifier::addOperation(UMLOperation* op, IDChangeLog* log) --{ -- if (addOperation(op, -1)) { -- return true; -- } -- else if (log) { -- log->removeChangeByNewID(op->id()); -- } -- return false; --} -- --/** -- * Remove an operation from the Classifier. -- * The operation is not deleted so the caller is responsible for what -- * happens to it after this. -- * -- * @param op The operation to remove. -- * @return Count of the remaining operations after removal, or -- * -1 if the given operation was not found. -- */ --int UMLClassifier::removeOperation(UMLOperation *op) --{ -- if (op == NULL) { -- uDebug() << "called on NULL op"; -- return -1; -- } -- if (!m_List.removeAll(op)) { -- uDebug() << "cannot find op " << op->name() << " in list"; -- return -1; -- } -- // disconnection needed. -- // note that we don't delete the operation, just remove it from the Classifier -- disconnect(op, SIGNAL(modified()), this, SIGNAL(modified())); -- emit operationRemoved(op); -- UMLObject::emitModified(); -- return m_List.count(); --} -- --/** -- * Create and add a just created template. -- * @param currentName the name of the template -- * @return the template or NULL -- */ --UMLObject* UMLClassifier::createTemplate(const QString& currentName /*= QString()*/) --{ -- QString name = currentName; -- bool goodName = !name.isEmpty(); -- if (!goodName) { -- name = uniqChildName(UMLObject::ot_Template); -- } -- UMLTemplate* newTemplate = new UMLTemplate(this, name); -- -- int button = QDialog::Accepted; -- -- while (button == QDialog::Accepted && !goodName) { -- QPointer templateDialog = new UMLTemplateDialog(0, newTemplate); -- button = templateDialog->exec(); -- name = newTemplate->name(); -- -- if (name.length() == 0) { -- KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -- } -- else if (findChildObject(name) != NULL) { -- KMessageBox::error(0, i18n("That name is already being used."), i18n("Not a Unique Name")); -- } -- else { -- goodName = true; -- } -- delete templateDialog; -- } -- -- if (button != QDialog::Accepted) { -- return NULL; -- } -- -- addTemplate(newTemplate); -- -- UMLDoc *umldoc = UMLApp::app()->document(); -- umldoc->signalUMLObjectCreated(newTemplate); -- return newTemplate; --} -- --/** -- * Returns the number of attributes for the class. -- * -- * @return The number of attributes for the class. -- */ --int UMLClassifier::attributes() --{ -- UMLClassifierListItemList atts = getFilteredList(UMLObject::ot_Attribute); -- return atts.count(); --} -- --/** -- * Returns the attributes for the specified scope. -- * @return List of true attributes for the class. -- */ --UMLAttributeList UMLClassifier::getAttributeList() const --{ -- UMLAttributeList attributeList; -- foreach (UMLObject* listItem, m_List) { -- uIgnoreZeroPointer(listItem); -- if (listItem->baseType() == UMLObject::ot_Attribute) { -- attributeList.append(static_cast(listItem)); -- } -- } -- return attributeList; --} -- --/** -- * Returns the attributes for the specified scope. -- * @param scope The scope of the attribute. -- * @return List of true attributes for the class. -- */ --UMLAttributeList UMLClassifier::getAttributeList(Visibility::Enum scope) const --{ -- UMLAttributeList list; -- if (!isInterface()) -- { -- UMLAttributeList atl = getAttributeList(); -- foreach(UMLAttribute* at, atl) -- { -- uIgnoreZeroPointer(at); -- if (! at->isStatic()) -- { -- if (scope == Uml::Visibility::Private) -- { -- if ((at->visibility() == Uml::Visibility::Private) || -- (at->visibility() == Uml::Visibility::Implementation)) -- { -- list.append(at); -- } -- } -- else if (scope == at->visibility()) -- { -- list.append(at); -- } -- } -- } -- } -- return list; --} -- --/** -- * Returns the static attributes for the specified scope. -- * -- * @param scope The scope of the attribute. -- * @return List of true attributes for the class. -- */ --UMLAttributeList UMLClassifier::getAttributeListStatic(Visibility::Enum scope) const --{ -- UMLAttributeList list; -- if (!isInterface()) -- { -- UMLAttributeList atl = getAttributeList(); -- foreach(UMLAttribute* at, atl) -- { -- uIgnoreZeroPointer(at); -- if (at->isStatic()) -- { -- if (scope == Uml::Visibility::Private) -- { -- if ((at->visibility() == Uml::Visibility::Private) || -- (at->visibility() == Uml::Visibility::Implementation)) -- { -- list.append(at); -- } -- } -- else if (scope == at->visibility()) -- { -- list.append(at); -- } -- } -- } -- } -- return list; --} -- --/** -- * Find a list of operations with the given name. -- * -- * @param n The name of the operation to find. -- * @return The list of objects found; will be empty if none found. -- */ --UMLOperationList UMLClassifier::findOperations(const QString &n) --{ -- const bool caseSensitive = UMLApp::app()->activeLanguageIsCaseSensitive(); -- UMLOperationList list; -- foreach (UMLObject* obj, m_List) { -- uIgnoreZeroPointer(obj); -- if (obj->baseType() != UMLObject::ot_Operation) -- continue; -- UMLOperation *op = static_cast(obj); -- if (caseSensitive) { -- if (obj->name() == n) -- list.append(op); -- } else if (obj->name().toLower() == n.toLower()) { -- list.append(op); -- } -- } -- return list; --} -- --/** -- * Find the child object by the given id. -- * @param id the id of the child object -- * @param considerAncestors flag whether the ancestors should be considered during search -- * @return the found child object or NULL -- */ --UMLObject* UMLClassifier::findChildObjectById(Uml::ID::Type id, bool considerAncestors /* =false */) --{ -- UMLObject *o = UMLCanvasObject::findChildObjectById(id); -- if (o) { -- return o; -- } -- if (considerAncestors) { -- UMLClassifierList ancestors = findSuperClassConcepts(); -- foreach (UMLClassifier *anc, ancestors) { -- UMLObject *o = anc->findChildObjectById(id); -- if (o) { -- return o; -- } -- } -- } -- return NULL; --} -- --/** -- * Returns a list of concepts which inherit from this concept. -- * -- * @param type The ClassifierType to seek. -- * @return List of UMLClassifiers that inherit from us. -- */ --UMLClassifierList UMLClassifier::findSubClassConcepts (ClassifierType type) --{ -- UMLClassifierList list = getSubClasses(); -- UMLAssociationList rlist = getRealizations(); -- -- UMLClassifierList inheritingConcepts; -- Uml::ID::Type myID = id(); -- foreach(UMLClassifier *c, list) { -- uIgnoreZeroPointer(c); -- if (type == ALL || (!c->isInterface() && type == CLASS) -- || (c->isInterface() && type == INTERFACE)) { -- inheritingConcepts.append(c); -- } -- } -- -- foreach (UMLAssociation *a, rlist) { -- uIgnoreZeroPointer(a); -- if (a->getObjectId(RoleType::A) != myID) -- { -- UMLObject* obj = a->getObject(RoleType::A); -- UMLClassifier *concept = dynamic_cast(obj); -- if (concept && (type == ALL || (!concept->isInterface() && type == CLASS) -- || (concept->isInterface() && type == INTERFACE)) -- && (inheritingConcepts.indexOf(concept) == -1)) -- { -- inheritingConcepts.append(concept); -- } -- } -- } -- -- return inheritingConcepts; --} -- --/** -- * Returns a list of concepts which this concept inherits from. -- * -- * @param type The ClassifierType to seek. -- * @return List of UMLClassifiers we inherit from. -- */ --UMLClassifierList UMLClassifier::findSuperClassConcepts (ClassifierType type) --{ -- UMLClassifierList list = getSuperClasses(); -- UMLAssociationList rlist = getRealizations(); -- -- UMLClassifierList parentConcepts; -- Uml::ID::Type myID = id(); -- foreach (UMLClassifier *concept, list) { -- uIgnoreZeroPointer(concept); -- if (type == ALL || (!concept->isInterface() && type == CLASS) -- || (concept->isInterface() && type == INTERFACE)) -- parentConcepts.append(concept); -- } -- -- foreach (UMLAssociation *a, rlist) { -- if (a->getObjectId(RoleType::A) == myID) -- { -- UMLObject* obj = a->getObject(RoleType::B); -- UMLClassifier *concept = dynamic_cast(obj); -- if (concept && (type == ALL || (!concept->isInterface() && type == CLASS) -- || (concept->isInterface() && type == INTERFACE)) -- && (parentConcepts.indexOf(concept) == -1)) -- parentConcepts.append(concept); -- } -- } -- -- return parentConcepts; --} -- --/** -- * Overloaded '==' operator. -- */ --bool UMLClassifier::operator==(const UMLClassifier & rhs) const --{ -- return UMLCanvasObject::operator==(rhs); --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLClassifier::copyInto(UMLObject *lhs) const --{ -- UMLClassifier *target = static_cast(lhs); -- UMLCanvasObject::copyInto(target); -- target->setBaseType(m_BaseType); -- // CHECK: association property m_pClassAssoc is not copied -- m_List.copyInto(&(target->m_List)); --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLClassifier::clone() const --{ -- UMLClassifier *clone = new UMLClassifier(); -- copyInto(clone); -- return clone; --} -- --/** -- * Needs to be called after all UML objects are loaded from file. -- * Calls the parent resolveRef(), and calls resolveRef() on all -- * UMLClassifierListItems. -- * Overrides the method from UMLObject. -- * -- * @return true for success. -- */ --bool UMLClassifier::resolveRef() --{ -- bool success = UMLPackage::resolveRef(); -- // Using reentrant iteration is a bare necessity here: -- foreach (UMLObject* obj, m_List) { -- uIgnoreZeroPointer(obj); -- /**** For reference, here is the non-reentrant iteration scheme - -- DO NOT USE THIS ! -- for (UMLObject *obj = m_List.first(); obj; obj = m_List.next()) -- { .... } -- ****/ -- if (obj->resolveRef()) { -- UMLClassifierListItem *cli = static_cast(obj); -- switch (cli->baseType()) { -- case UMLObject::ot_Attribute: -- emit attributeAdded(cli); -- break; -- case UMLObject::ot_Operation: -- emit operationAdded(cli); -- break; -- case UMLObject::ot_Template: -- emit templateAdded(cli); -- break; -- default: -- break; -- } -- } -- } -- return success; --} -- --/** -- * Reimplemented from UMLObject. -- */ --bool UMLClassifier::acceptAssociationType(AssociationType::Enum type) --{ -- switch(type) -- { -- case AssociationType::Generalization: -- case AssociationType::Aggregation: -- case AssociationType::Relationship: -- case AssociationType::Dependency: -- case AssociationType::Association: -- case AssociationType::Association_Self: -- case AssociationType::Containment: -- case AssociationType::Composition: -- case AssociationType::Realization: -- case AssociationType::UniAssociation: -- return true; -- default: -- return false; -- } -- return false; //shutup compiler warning --} -- --/** -- * Creates an attribute for the class. -- * -- * @param name An optional name, used by when creating through UMLListView -- * @param type An optional type, used by when creating through UMLListView -- * @param vis An optional visibility, used by when creating through UMLListView -- * @param init An optional initial value, used by when creating through UMLListView -- * @return The UMLAttribute created -- */ --UMLAttribute* UMLClassifier::createAttribute(const QString &name, -- UMLObject *type, -- Visibility::Enum vis, -- const QString &init) --{ -- Uml::ID::Type id = UniqueID::gen(); -- QString currentName; -- if (name.isNull()) { -- currentName = uniqChildName(UMLObject::ot_Attribute); -- } else { -- currentName = name; -- } -- UMLAttribute* newAttribute = new UMLAttribute(this, currentName, id, vis, type, init); -- -- int button = QDialog::Accepted; -- bool goodName = false; -- -- //check for name.isNull() stops dialog being shown -- //when creating attribute via list view -- while (button == QDialog::Accepted && !goodName && name.isNull()) { -- QPointer attributeDialog = new UMLAttributeDialog(0, newAttribute); -- button = attributeDialog->exec(); -- QString name = newAttribute->name(); -- -- if(name.length() == 0) { -- KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -- } else if (findChildObject(name) != NULL) { -- KMessageBox::error(0, i18n("That name is already being used."), i18n("Not a Unique Name")); -- } else { -- goodName = true; -- } -- delete attributeDialog; -- } -- -- if (button != QDialog::Accepted) { -- delete newAttribute; -- return NULL; -- } -- -- addAttribute(newAttribute); -- -- UMLDoc *umldoc = UMLApp::app()->document(); -- umldoc->signalUMLObjectCreated(newAttribute); -- return newAttribute; --} -- --/** -- * Creates and adds an attribute for the class. -- * -- * @param name an optional name, used by when creating through UMLListView -- * @param id an optional id -- * @return the UMLAttribute created and added -- */ -- --UMLAttribute* UMLClassifier::addAttribute(const QString &name, Uml::ID::Type id /* = Uml::id_None */) --{ -- foreach (UMLObject* obj, m_List) { -- uIgnoreZeroPointer(obj); -- if (obj->baseType() == UMLObject::ot_Attribute && obj->name() == name) -- return static_cast(obj); -- } -- Uml::Visibility::Enum scope = Settings::optionState().classState.defaultAttributeScope; -- UMLAttribute *a = new UMLAttribute(this, name, id, scope); -- m_List.append(a); -- emit attributeAdded(a); -- UMLObject::emitModified(); -- connect(a, SIGNAL(modified()), this, SIGNAL(modified())); -- return a; --} -- --/** -- * Adds an already created attribute. -- * The attribute object must not belong to any other concept. -- * -- * @param name the name of the attribute -- * @param type the type of the attribute -- * @param scope the visibility of the attribute -- * @return the just created and added attribute -- */ --UMLAttribute* UMLClassifier::addAttribute(const QString &name, UMLObject *type, Visibility::Enum scope) --{ -- UMLAttribute *a = new UMLAttribute(this); -- a->setName(name); -- a->setVisibility(scope); -- a->setID(UniqueID::gen()); -- if (type) { -- a->setType(type); -- } -- m_List.append(a); -- emit attributeAdded(a); -- UMLObject::emitModified(); -- connect(a, SIGNAL(modified()), this, SIGNAL(modified())); -- return a; --} -- --/** -- * Adds an already created attribute. -- * The attribute object must not belong to any other concept. -- * -- * @param att Pointer to the UMLAttribute. -- * @param log Pointer to the IDChangeLog (optional.) -- * @param position Position index for the insertion (optional.) -- * If the position is omitted, or if it is -- * negative or too large, the attribute is added -- * to the end of the list. -- * @return True if the attribute was successfully added. -- */ --bool UMLClassifier::addAttribute(UMLAttribute* att, IDChangeLog* log /* = 0 */, -- int position /* = -1 */) --{ -- Q_ASSERT(att); -- if (findChildObject(att->name()) == NULL) { -- att->setParent(this); -- if (position >= 0 && position < (int)m_List.count()) { -- m_List.insert(position, att); -- } -- else { -- m_List.append(att); -- } -- emit attributeAdded(att); -- UMLObject::emitModified(); -- connect(att, SIGNAL(modified()), this, SIGNAL(modified())); -- return true; -- } else if (log) { -- log->removeChangeByNewID(att->id()); -- delete att; -- } -- return false; --} -- --/** -- * Removes an attribute from the class. -- * -- * @param att The attribute to remove. -- * @return Count of the remaining attributes after removal. -- * Returns -1 if the given attribute was not found. -- */ --int UMLClassifier::removeAttribute(UMLAttribute* att) --{ -- if (!m_List.removeAll(att)) { -- uDebug() << "cannot find att given in list"; -- return -1; -- } -- emit attributeRemoved(att); -- UMLObject::emitModified(); -- // If we are deleting the object, then we don't need to disconnect..this is done auto-magically -- // for us by QObject. -b.t. -- // disconnect(att, SIGNAL(modified()), this, SIGNAL(modified())); -- delete att; -- return m_List.count(); --} -- --/** -- * Sets the UMLAssociation for which this class shall act as an -- * association class. -- */ --void UMLClassifier::setClassAssoc(UMLAssociation *assoc) --{ -- m_pClassAssoc = assoc; --} -- --/** -- * Returns the UMLAssociation for which this class acts as an -- * association class. Returns NULL if this class does not act -- * as an association class. -- */ --UMLAssociation *UMLClassifier::getClassAssoc() const --{ -- return m_pClassAssoc; --} -- --/** -- * Return true if this classifier has abstract operations. -- */ --bool UMLClassifier::hasAbstractOps () --{ -- UMLOperationList opl(getOpList()); -- foreach(UMLOperation *op, opl) { -- uIgnoreZeroPointer(op); -- if (op->isAbstract()) { -- return true; -- } -- } -- return false; --} -- --/** -- * Counts the number of operations in the Classifier. -- * -- * @return The number of operations for the Classifier. -- */ --int UMLClassifier::operations() --{ -- return getOpList().count(); --} -- -- --/** -- * Return a list of operations for the Classifier. -- * -- * @param includeInherited Includes operations from superclasses. -- * @param alreadyTraversed internal used object to avoid recursive loops -- * @return The list of operations for the Classifier. -- */ --UMLOperationList UMLClassifier::getOpList(bool includeInherited, UMLClassifierSet *alreadyTraversed) --{ -- UMLOperationList ops; -- foreach (UMLObject* li, m_List) { -- uIgnoreZeroPointer(li); -- if (li->baseType() == ot_Operation) { -- ops.append(static_cast(li)); -- } -- } -- if (includeInherited) { -- if (!alreadyTraversed) { -- alreadyTraversed = new UMLClassifierSet; -- } -- else -- alreadyTraversed->level++; -- -- if (!alreadyTraversed->contains(this)) -- *alreadyTraversed << this; -- -- // get a list of parents of this class -- UMLClassifierList parents = findSuperClassConcepts(); -- foreach(UMLClassifier *c, parents) { -- if (alreadyTraversed->contains(c)) { -- uError() << "class " << c->name() << " is starting a dependency loop!"; -- continue; -- } -- // get operations for each parent by recursive call -- UMLOperationList pops = c->getOpList(true, alreadyTraversed); -- // add these operations to operation list, but only if unique. -- foreach (UMLOperation *po, pops) { -- QString po_as_string(po->toString(Uml::SignatureType::SigNoVis)); -- bool breakFlag = false; -- foreach (UMLOperation* o, ops) { -- if (o->toString(Uml::SignatureType::SigNoVis) == po_as_string) { -- breakFlag = true; -- break; -- } -- } -- if (breakFlag == false) -- ops.append(po); -- } -- // remember this node -- *alreadyTraversed << c; -- } -- if (alreadyTraversed->level-- == 0) { -- delete alreadyTraversed; -- alreadyTraversed = 0; -- } -- } -- return ops; --} -- --/** -- * Returns the entries in m_List that are of the requested type. -- * If the requested type is UMLObject::ot_UMLObject then all entries -- * are returned. -- * @param ot the requested object type -- * @return The list of true operations for the Concept. -- */ --UMLClassifierListItemList UMLClassifier::getFilteredList(UMLObject::ObjectType ot) const --{ -- UMLClassifierListItemList resultList; -- foreach (UMLObject* o, m_List) { -- uIgnoreZeroPointer(o); -- if (!o || o->baseType() == UMLObject::ot_Association) { -- continue; -- } -- UMLClassifierListItem *listItem = static_cast(o); -- if (ot == UMLObject::ot_UMLObject || listItem->baseType() == ot) { -- resultList.append(listItem); -- } -- } -- return resultList; --} -- --/** -- * Adds an already created template. -- * The template object must not belong to any other concept. -- * -- * @param name the name of the template -- * @param id the id of the template -- * @return the added template -- */ --UMLTemplate* UMLClassifier::addTemplate(const QString &name, Uml::ID::Type id) --{ -- UMLTemplate *templt = findTemplate(name); -- if (templt) { -- return templt; -- } -- templt = new UMLTemplate(this, name, id); -- m_List.append(templt); -- emit templateAdded(templt); -- UMLObject::emitModified(); -- connect(templt, SIGNAL(modified()), this, SIGNAL(modified())); -- return templt; --} -- --/** -- * Adds an already created template. -- * The template object must not belong to any other concept. -- * -- * @param newTemplate Pointer to the UMLTemplate object to add. -- * @param log Pointer to the IDChangeLog. -- * @return True if the template was successfully added. -- */ --bool UMLClassifier::addTemplate(UMLTemplate* newTemplate, IDChangeLog* log /* = 0*/) --{ -- QString name = newTemplate->name(); -- if (findChildObject(name) == NULL) { -- newTemplate->setParent(this); -- m_List.append(newTemplate); -- emit templateAdded(newTemplate); -- UMLObject::emitModified(); -- connect(newTemplate, SIGNAL(modified()), this, SIGNAL(modified())); -- return true; -- } -- else if (log) { -- log->removeChangeByNewID(newTemplate->id()); -- delete newTemplate; -- } -- return false; --} -- --/** -- * Adds an template to the class. -- * The template object must not belong to any other class. -- * TODO: If the param IDChangeLog from the method above is not being used, -- * give position a default value of -1 and the method can replace the above one. -- * @param templt Pointer to the UMLTemplate to add. -- * @param position The position of the template in the list. -- * A value of -1 will add the template at the end. -- * @return True if the template was successfully added. -- */ --bool UMLClassifier::addTemplate(UMLTemplate* templt, int position) --{ -- Q_ASSERT(templt); -- QString name = templt->name(); -- if (findChildObject(name) == NULL) { -- templt->setParent(this); -- if (position >= 0 && position <= (int)m_List.count()) { -- m_List.insert(position, templt); -- } -- else { -- m_List.append(templt); -- } -- emit templateAdded(templt); -- UMLObject::emitModified(); -- connect(templt, SIGNAL(modified()), this, SIGNAL(modified())); -- return true; -- } -- //else -- return false; --} -- --/** -- * Removes a template from the class. -- * -- * @param umltemplate The template to remove. -- * @return Count of the remaining templates after removal. -- * Returns -1 if the given template was not found. -- */ --int UMLClassifier::removeTemplate(UMLTemplate* umltemplate) --{ -- if (!m_List.removeAll(umltemplate)) { -- uWarning() << "cannot find att given in list"; -- return -1; -- } -- emit templateRemoved(umltemplate); -- UMLObject::emitModified(); -- disconnect(umltemplate, SIGNAL(modified()), this, SIGNAL(modified())); -- return m_List.count(); --} -- --/** -- * Seeks the template parameter of the given name. -- * @param name the template name -- * @return the found template or 0 -- */ --UMLTemplate *UMLClassifier::findTemplate(const QString& name) --{ -- UMLTemplateList templParams = getTemplateList(); -- foreach (UMLTemplate *templt, templParams) { -- if (templt->name() == name) { -- return templt; -- } -- } -- return 0; --} -- --/** -- * Returns the number of templates for the class. -- * -- * @return The number of templates for the class. -- */ --int UMLClassifier::templates() --{ -- UMLClassifierListItemList tempList = getFilteredList(UMLObject::ot_Template); -- return tempList.count(); --} -- --/** -- * Returns the templates. -- * Same as UMLClassifier::getFilteredList(ot_Template) but -- * return type is a true UMLTemplateList. -- * -- * @return Pointer to the list of true templates for the class. -- */ --UMLTemplateList UMLClassifier::getTemplateList() const --{ -- UMLTemplateList templateList; -- foreach (UMLObject* listItem, m_List) { -- uIgnoreZeroPointer(listItem); -- if (listItem->baseType() == UMLObject::ot_Template) { -- templateList.append(static_cast(listItem)); -- } -- } -- return templateList; --} -- --/** -- * Take and return a subordinate item from this classifier. -- * Ownership of the item is passed to the caller. -- * -- * @param item Subordinate item to take. -- * @return Index in m_List of the item taken. -- * Return -1 if the item is not found in m_List. -- */ --int UMLClassifier::takeItem(UMLClassifierListItem *item) --{ -- QString buf; -- foreach (UMLObject* currentAtt, m_List) { -- uIgnoreZeroPointer(currentAtt); -- QString txt = currentAtt->name(); -- if (txt.isEmpty()) { -- txt = QLatin1String("Type-") + QString::number((int) currentAtt->baseType()); -- } -- buf.append(QLatin1Char(' ') + currentAtt->name()); -- } -- uDebug() << " UMLClassifier::takeItem (before): m_List is " << buf; -- -- int index = m_List.indexOf(item); -- if (index == -1) { -- return -1; -- } -- switch (item->baseType()) { -- case UMLObject::ot_Operation: { -- if (removeOperation(dynamic_cast(item)) < 0) { -- index = -1; -- } -- break; -- } -- case UMLObject::ot_Attribute: { -- UMLAttribute *retval = dynamic_cast(m_List.takeAt(index).data()); -- if (retval) { -- emit attributeRemoved(retval); -- UMLObject::emitModified(); -- } else { -- index = -1; -- } -- break; -- } -- case UMLObject::ot_Template: { -- UMLTemplate *templt = dynamic_cast(m_List.takeAt(index).data()); -- if (templt) { -- emit templateRemoved(templt); -- UMLObject::emitModified(); -- } else { -- index = -1; -- } -- break; -- } -- case UMLObject::ot_EnumLiteral: { -- UMLEnumLiteral *el = dynamic_cast(m_List.takeAt(index).data()); -- if (el) { -- UMLEnum *e = static_cast(this); -- e->signalEnumLiteralRemoved(el); -- UMLObject::emitModified(); -- } else { -- index = -1; -- } -- break; -- } -- case UMLObject::ot_EntityAttribute: { -- UMLEntityAttribute* el = dynamic_cast(m_List.takeAt(index).data()); -- if (el) { -- UMLEntity *e = static_cast(this); -- e->signalEntityAttributeRemoved(el); -- UMLObject::emitModified(); -- } else { -- index = -1; -- } -- break; -- } -- default: -- index = -1; -- break; -- } -- return index; --} -- --/** -- * Set the origin type (in case of e.g. typedef) -- * @param origType the origin type to set -- */ --void UMLClassifier::setOriginType(UMLClassifier *origType) --{ -- m_pSecondary = origType; --} -- --/** -- * Get the origin type (in case of e.g. typedef) -- * @return the origin type -- */ --UMLClassifier * UMLClassifier::originType() const --{ -- return dynamic_cast(m_pSecondary.data()); --} -- --/** -- * Set the m_isRef flag (true when dealing with a pointer type) -- * @param isRef the flag to set -- */ --void UMLClassifier::setIsReference(bool isRef) --{ -- m_isRef = isRef; --} -- --/** -- * Get the m_isRef flag. -- * @return true if is reference, otherwise false -- */ --bool UMLClassifier::isReference() const --{ -- return m_isRef; --} -- --/** -- * Return true if this classifier has associations. -- * @return true if classifier has associations -- */ --bool UMLClassifier::hasAssociations() --{ -- return getSpecificAssocs(AssociationType::Association).count() > 0 -- || getAggregations().count() > 0 -- || getCompositions().count() > 0 -- || getUniAssociationToBeImplemented().count() > 0; --} -- --/** -- * Return true if this classifier has attributes. -- */ --bool UMLClassifier::hasAttributes() --{ -- return getAttributeList(Uml::Visibility::Public).count() > 0 -- || getAttributeList(Uml::Visibility::Protected).count() > 0 -- || getAttributeList(Uml::Visibility::Private).count() > 0 -- || getAttributeListStatic(Uml::Visibility::Public).count() > 0 -- || getAttributeListStatic(Uml::Visibility::Protected).count() > 0 -- || getAttributeListStatic(Uml::Visibility::Private).count() > 0; --} -- --/** -- * Return true if this classifier has static attributes. -- */ --bool UMLClassifier::hasStaticAttributes() --{ -- return getAttributeListStatic(Uml::Visibility::Public).count() > 0 -- || getAttributeListStatic(Uml::Visibility::Protected).count() > 0 -- || getAttributeListStatic(Uml::Visibility::Private).count() > 0; --} -- --/** -- * Return true if this classifier has accessor methods. -- */ --bool UMLClassifier::hasAccessorMethods() --{ -- return hasAttributes() || hasAssociations(); --} -- --/** -- * Return true if this classifier has operation methods. -- */ --bool UMLClassifier::hasOperationMethods() --{ -- return getOpList().last() ? true : false; --} -- --/** -- * Return true if this classifier has methods. -- */ --bool UMLClassifier::hasMethods() --{ -- return hasOperationMethods() || hasAccessorMethods(); --} -- --// this is a bit too simplistic..some associations are for --// SINGLE objects, and WONT be declared as Vectors, so this --// is a bit overly inclusive (I guess that's better than the other way around) -- --/** -- * Return true if this classifier has vector fields. -- */ --bool UMLClassifier::hasVectorFields() --{ -- return hasAssociations(); --} -- --/** -- * Return the list of unidirectional association that should show up in the code -- */ --UMLAssociationList UMLClassifier::getUniAssociationToBeImplemented() --{ -- UMLAssociationList associations = getSpecificAssocs(AssociationType::UniAssociation); -- UMLAssociationList uniAssocListToBeImplemented; -- -- foreach (UMLAssociation *a, associations) { -- uIgnoreZeroPointer(a); -- if (a->getObjectId(RoleType::B) == id()) { -- continue; // we need to be at the A side -- } -- QString roleNameB = a->getRoleName(RoleType::B); -- if (!roleNameB.isEmpty()) { -- UMLAttributeList atl = getAttributeList(); -- bool found = false; -- //make sure that an attribute with the same name doesn't already exist -- foreach (UMLAttribute *at, atl) { -- uIgnoreZeroPointer(a); -- if (at->name() == roleNameB) { -- found = true; -- break; -- } -- } -- if (!found) { -- uniAssocListToBeImplemented.append(a); -- } -- } -- } -- return uniAssocListToBeImplemented; --} -- --/** -- * Creates XML tag , , or -- * depending on m_BaseType. -- * Saves possible template parameters, generalizations, attributes, -- * operations, and contained objects to the given QDomElement. -- */ --void UMLClassifier::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QString tag; -- switch (m_BaseType) { -- case UMLObject::ot_Class: -- tag = QLatin1String("UML:Class"); -- break; -- case UMLObject::ot_Interface: -- tag = QLatin1String("UML:Interface"); -- break; -- case UMLObject::ot_Datatype: -- tag = QLatin1String("UML:DataType"); -- break; -- case UMLObject::ot_Package: -- UMLPackage::saveToXMI(qDoc, qElement); -- return; -- break; -- default: -- uError() << "internal error: basetype is " << m_BaseType; -- return; -- } -- QDomElement classifierElement = UMLObject::save(tag, qDoc); -- if (m_BaseType == UMLObject::ot_Datatype && m_pSecondary != NULL) -- classifierElement.setAttribute(QLatin1String("elementReference"), -- Uml::ID::toString(m_pSecondary->id())); -- -- //save templates -- UMLClassifierListItemList list = getFilteredList(UMLObject::ot_Template); -- if (list.count()) { -- QDomElement tmplElement = qDoc.createElement(QLatin1String("UML:ModelElement.templateParameter")); -- foreach (UMLClassifierListItem *tmpl, list) { -- tmpl->saveToXMI(qDoc, tmplElement); -- } -- classifierElement.appendChild(tmplElement); -- } -- -- //save generalizations (we are the subclass, the other end is the superclass) -- UMLAssociationList generalizations = getSpecificAssocs(AssociationType::Generalization); -- if (generalizations.count()) { -- QDomElement genElement = qDoc.createElement(QLatin1String("UML:GeneralizableElement.generalization")); -- foreach (UMLAssociation *a, generalizations) { -- // We are the subclass if we are at the role A end. -- if (m_nId != a->getObjectId(RoleType::A)) { -- continue; -- } -- QDomElement gElem = qDoc.createElement(QLatin1String("UML:Generalization")); -- gElem.setAttribute(QLatin1String("xmi.idref"), Uml::ID::toString(a->id())); -- genElement.appendChild(gElem); -- } -- if (genElement.hasChildNodes()) { -- classifierElement.appendChild(genElement); -- } -- } -- -- // save attributes -- QDomElement featureElement = qDoc.createElement(QLatin1String("UML:Classifier.feature")); -- UMLClassifierListItemList attList = getFilteredList(UMLObject::ot_Attribute); -- foreach (UMLClassifierListItem *pAtt, attList) { -- pAtt->saveToXMI(qDoc, featureElement); -- } -- -- // save operations -- UMLOperationList opList = getOpList(); -- foreach (UMLOperation *pOp, opList) { -- pOp->saveToXMI(qDoc, featureElement); -- } -- if (featureElement.hasChildNodes()) { -- classifierElement.appendChild(featureElement); -- } -- -- // save contained objects -- if (m_objects.count()) { -- QDomElement ownedElement = qDoc.createElement(QLatin1String("UML:Namespace.ownedElement")); -- foreach (UMLObject* obj, m_objects) { -- uIgnoreZeroPointer(obj); -- obj->saveToXMI (qDoc, ownedElement); -- } -- classifierElement.appendChild(ownedElement); -- } -- qElement.appendChild(classifierElement); --} -- --/** -- * Create a new ClassifierListObject (attribute, operation, template) -- * according to the given XMI tag. -- * Returns NULL if the string given does not contain one of the tags -- * , , or . -- * Used by the clipboard for paste operation. -- */ --UMLClassifierListItem* UMLClassifier::makeChildObject(const QString& xmiTag) --{ -- UMLClassifierListItem* pObject = NULL; -- if (UMLDoc::tagEq(xmiTag, QLatin1String("Operation")) || -- UMLDoc::tagEq(xmiTag, QLatin1String("ownedOperation"))) { -- pObject = new UMLOperation(this); -- } else if (UMLDoc::tagEq(xmiTag, QLatin1String("Attribute")) || -- UMLDoc::tagEq(xmiTag, QLatin1String("ownedAttribute"))) { -- if (baseType() != UMLObject::ot_Class) -- return NULL; -- pObject = new UMLAttribute(this); -- } else if (UMLDoc::tagEq(xmiTag, QLatin1String("TemplateParameter"))) { -- pObject = new UMLTemplate(this); -- } -- return pObject; --} -- --/** -- * Auxiliary to loadFromXMI: -- * The loading of operations is implemented here. -- * Calls loadSpecialized() for any other tag. -- * Child classes can override the loadSpecialized method -- * to load its additional tags. -- */ --bool UMLClassifier::load(QDomElement& element) --{ -- UMLClassifierListItem *child = NULL; -- m_SecondaryId = element.attribute(QLatin1String("elementReference")); -- if (!m_SecondaryId.isEmpty()) { -- // @todo We do not currently support composition. -- m_isRef = true; -- } -- bool totalSuccess = true; -- for (QDomNode node = element.firstChild(); !node.isNull(); -- node = node.nextSibling()) { -- if (node.isComment()) -- continue; -- element = node.toElement(); -- QString tag = element.tagName(); -- QString stereotype = element.attribute(QLatin1String("stereotype")); -- if (UMLDoc::tagEq(tag, QLatin1String("ModelElement.templateParameter")) || -- UMLDoc::tagEq(tag, QLatin1String("Classifier.feature")) || -- UMLDoc::tagEq(tag, QLatin1String("Namespace.ownedElement")) || -- UMLDoc::tagEq(tag, QLatin1String("Element.ownedElement")) || // Embarcadero's Describe -- UMLDoc::tagEq(tag, QLatin1String("Namespace.contents"))) { -- load(element); -- // Not evaluating the return value from load() -- // because we want a best effort. -- -- } else if ((child = makeChildObject(tag)) != NULL) { -- if (child->loadFromXMI(element)) { -- switch (child->baseType()) { -- case UMLObject::ot_Template: -- addTemplate(static_cast(child)); -- break; -- case UMLObject::ot_Operation: -- if (! addOperation(static_cast(child))) { -- uError() << "error from addOperation(op)"; -- delete child; -- totalSuccess = false; -- } -- break; -- case UMLObject::ot_Attribute: -- addAttribute(static_cast(child)); -- break; -- default: -- break; -- } -- } else { -- uWarning() << "failed to load " << tag; -- delete child; -- totalSuccess = false; -- } -- } else if (!Model_Utils::isCommonXMIAttribute(tag)) { -- UMLObject *pObject = Object_Factory::makeObjectFromXMI(tag, stereotype); -- if (pObject == NULL) { -- // Not setting totalSuccess to false -- // because we want a best effort. -- continue; -- } -- pObject->setUMLPackage(this); -- if (! pObject->loadFromXMI(element)) { -- removeObject(pObject); -- delete pObject; -- totalSuccess = false; -- } -- } -- } -- return totalSuccess; --} -- --/* --UMLClassifierList UMLClassifier::getPlainAssocChildClassifierList() --{ -- UMLAssociationList plainAssociations = getSpecificAssocs(Uml::AssociationType::Association); -- return findAssocClassifierObjsInRoles(&plainAssociations); --} -- --UMLClassifierList UMLClassifier::getAggregateChildClassifierList() --{ -- UMLAssociationList aggregations = getAggregations(); -- return findAssocClassifierObjsInRoles(&aggregations); --} -- --UMLClassifierList UMLClassifier::getCompositionChildClassifierList() --{ -- UMLAssociationList compositions = getCompositions(); -- return findAssocClassifierObjsInRoles(&compositions); --} -- --UMLClassifierList UMLClassifier::findAssocClassifierObjsInRoles (UMLAssociationList * list) --{ -- UMLClassifierList classifiers; -- -- for (UMLAssociationListIt alit(*list); alit.hasNext(); ) { -- UMLAssociation* a = alit.next(); -- // DON'T accept a classifier IF the association role is empty, by -- // convention, that means to ignore the classifier on that end of -- // the association. -- // We also ignore classifiers which are the same as the current one -- // (e.g. id matches), we only want the "other" classifiers -- if (a->getObjectId(RoleType::A) == id() && !a->getRoleName(RoleType::B).isEmpty()) { -- UMLClassifier *c = dynamic_cast(a->getObject(RoleType::B)); -- if(c) -- classifiers.append(c); -- } else if (a->getObjectId(RoleType::B) == id() && !a->getRoleName(RoleType::A).isEmpty()) { -- UMLClassifier *c = dynamic_cast(a->getObject(RoleType::A)); -- if(c) -- classifiers.append(c); -- } -- } -- -- return classifiers; --} --*/ -- -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/classifier.h umbrello-kf6-15.08.1/umbrello/classifier.h ---- umbrello-kf6-15.08.1.orig/umbrello/classifier.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/classifier.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,199 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ --#ifndef CLASSIFIER_H --#define CLASSIFIER_H -- --#include "package.h" --#include "umlattributelist.h" --#include "umloperationlist.h" --#include "umlclassifierlistitemlist.h" --#include "classifierlistitem.h" --#include "umltemplatelist.h" --#include "model_utils.h" -- --// forward declarations --class UMLAssociation; --class IDChangeLog; --class UMLClassifierSet; -- --/** -- * This class defines the non-graphical information required for a -- * UML Classifier (ie a class or interface). -- * This class inherits from @ref UMLPackage which allows classifiers -- * to also act as namespaces, i.e. it allows classifiers to nest. -- * -- * NOTE: There is a unit test available for this class. -- * Please, use and adapt it when necessary. -- * -- * @short Information for a non-graphical Concept/Class. -- * @author Paul Hensgen -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLClassifier : public UMLPackage --{ -- Q_OBJECT --public: -- -- /** -- * Enumeration identifying the type of classifier. -- */ -- enum ClassifierType { ALL = 0, CLASS, INTERFACE, DATATYPE }; -- -- explicit UMLClassifier(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -- virtual ~UMLClassifier(); -- -- bool operator==(const UMLClassifier & rhs) const; -- -- virtual void copyInto(UMLObject *lhs) const; -- -- UMLObject* clone() const; -- -- virtual UMLAttribute* createAttribute(const QString &name = QString(), -- UMLObject *type = 0, -- Uml::Visibility::Enum vis = Uml::Visibility::Private, -- const QString &init = QString()); -- -- UMLAttribute* addAttribute(const QString &name, Uml::ID::Type id = Uml::ID::None); -- UMLAttribute* addAttribute(const QString &name, UMLObject *type, Uml::Visibility::Enum scope); -- -- bool addAttribute(UMLAttribute* att, IDChangeLog* log = 0, -- int position = -1); -- -- int removeAttribute(UMLAttribute *att); -- -- int attributes() ; -- -- UMLAttributeList getAttributeList() const; -- UMLAttributeList getAttributeList(Uml::Visibility::Enum scope) const; -- UMLAttributeList getAttributeListStatic(Uml::Visibility::Enum scope) const; -- -- UMLOperation* createOperation(const QString &name = QString(), -- bool *isExistingOp = NULL, -- Model_Utils::NameAndType_List *params = NULL); -- -- bool addOperation(UMLOperation* op, int position = -1); -- bool addOperation(UMLOperation* op, IDChangeLog* log); -- -- UMLOperation * checkOperationSignature(const QString& name, -- UMLAttributeList opParams, -- UMLOperation *exemptOp = NULL); -- -- int removeOperation(UMLOperation *op); -- -- int operations(); -- -- UMLOperationList getOpList(bool includeInherited = false, UMLClassifierSet *alreadyTraversed = 0); -- -- UMLObject* createTemplate(const QString& name = QString()); -- -- UMLTemplate* addTemplate(const QString &name, Uml::ID::Type id = Uml::ID::None); -- -- bool addTemplate(UMLTemplate* newTemplate, IDChangeLog* log = 0); -- bool addTemplate(UMLTemplate* templt, int position); -- -- int removeTemplate(UMLTemplate* umltemplate); -- -- UMLTemplate *findTemplate(const QString& name); -- -- int templates(); -- -- UMLTemplateList getTemplateList() const; -- -- int takeItem(UMLClassifierListItem* item); -- -- virtual UMLClassifierListItemList getFilteredList(UMLObject::ObjectType ot) const; -- -- virtual bool resolveRef(); -- -- UMLOperationList findOperations(const QString &n); -- -- virtual UMLObject* findChildObjectById(Uml::ID::Type id, bool considerAncestors = false); -- -- UMLOperation* findOperation(const QString& name, -- Model_Utils::NameAndType_List params); -- -- UMLClassifierList findSuperClassConcepts(ClassifierType type = ALL); -- -- UMLClassifierList findSubClassConcepts(ClassifierType type = ALL); -- -- virtual bool acceptAssociationType(Uml::AssociationType::Enum type); -- -- void setClassAssoc(UMLAssociation *assoc); -- UMLAssociation *getClassAssoc() const; -- -- void setBaseType(UMLObject::ObjectType ot); -- -- bool isInterface() const; -- -- bool isDatatype() const; -- -- void setOriginType(UMLClassifier *origType); -- UMLClassifier * originType() const; -- -- void setIsReference(bool isRef = true); -- bool isReference() const; -- -- bool hasAbstractOps(); -- bool hasAssociations(); -- bool hasAttributes(); -- bool hasStaticAttributes(); -- bool hasMethods(); -- bool hasAccessorMethods(); -- bool hasOperationMethods(); -- bool hasVectorFields(); -- -- /** -- * utility functions to allow easy determination of what classifiers -- * are "owned" by the current one via named association type (e.g. -- * plain, aggregate or compositions). -- */ --// UMLClassifierList getPlainAssocChildClassifierList(); --// UMLClassifierList getAggregateChildClassifierList(); --// UMLClassifierList getCompositionChildClassifierList(); -- -- virtual UMLClassifierListItem* makeChildObject(const QString& xmiTag); -- -- virtual UMLAssociationList getUniAssociationToBeImplemented(); -- --signals: -- -- void operationAdded(UMLClassifierListItem *); -- void operationRemoved(UMLClassifierListItem *); -- -- void templateAdded(UMLClassifierListItem*); -- void templateRemoved(UMLClassifierListItem*); -- -- // only applies when (m_Type == ot_Class) -- void attributeAdded(UMLClassifierListItem*); -- void attributeRemoved(UMLClassifierListItem*); -- --private: -- -- UMLAssociation *m_pClassAssoc; -- -- bool m_isRef; -- -- /** -- * Utility method called by "get*ChildClassfierList()" methods. It basically -- * finds all the classifiers named in each association in the given association list -- * which aren't the current one. Useful for finding which classifiers are "owned" by the -- * current one via declared associations such as in aggregations/compositions. -- */ --// UMLClassifierList findAssocClassifierObjsInRoles (UMLAssociationList * list); -- --protected: -- -- void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- -- virtual bool load(QDomElement& element); -- --}; -- --#endif // CLASSIFIER_H -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/classifierlistitem.cpp umbrello-kf6-15.08.1/umbrello/classifierlistitem.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/classifierlistitem.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/classifierlistitem.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,159 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "classifierlistitem.h" -- --// local includes --#include "debug_utils.h" --#include "classifier.h" --#include "model_utils.h" --#include "object_factory.h" --#include "uml.h" --#include "umldoc.h" -- --// kde includes --#include -- --/** -- * Constructor. -- * -- * @param parent The parent to this operation. -- * At first sight it would appear that the type of the -- * parent should be UMLClassifier. However, the class -- * UMLAttribute is also used for the parameters of -- * operations, and in this case the UMLOperation is the -- * parent. -- * @param name The name of the operation. -- * @param id The id of the operation. -- */ --UMLClassifierListItem::UMLClassifierListItem(UMLObject *parent, -- const QString& name, Uml::ID::Type id) -- : UMLObject(parent, name, id) --{ -- UMLObject *parentObj = const_cast(parent); -- UMLClassifier *pc = dynamic_cast(parentObj); -- if (pc) -- UMLObject::setUMLPackage(pc); --} -- --/** -- * Constructor. -- * -- * @param parent The parent to this operation. -- * At first sight it would appear that the type of the -- * parent should be UMLClassifier. However, the class -- * UMLAttribute is also used for the parameters of -- * operations, and in this case the UMLOperation is the -- * parent. -- */ --UMLClassifierListItem::UMLClassifierListItem(UMLObject *parent) -- : UMLObject(parent) --{ -- UMLObject *parentObj = const_cast(parent); -- UMLClassifier *pc = dynamic_cast(parentObj); -- if (pc) -- UMLObject::setUMLPackage(pc); --} -- --/** -- * Destructor. Empty. -- */ --UMLClassifierListItem::~UMLClassifierListItem() --{ --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLClassifierListItem::copyInto(UMLObject *lhs) const --{ -- // Call the parent. -- UMLObject::copyInto(lhs); --} -- --/** -- * Returns a string representation of the list item. -- * -- * @param sig What type of operation string to show. -- * @return The string representation of the operation. -- */ --QString UMLClassifierListItem::toString(Uml::SignatureType::Enum sig) --{ -- Q_UNUSED(sig); -- return name(); --} -- --/** -- * Returns the type of the UMLClassifierListItem. -- * -- * @return The type of the UMLClassifierListItem. -- */ --UMLClassifier * UMLClassifierListItem::getType() const --{ -- return dynamic_cast(m_pSecondary.data()); --} -- --/** -- * Returns the type name of the UMLClassifierListItem. -- * -- * @return The type name of the UMLClassifierListItem. -- */ --QString UMLClassifierListItem::getTypeName() const --{ -- if (m_pSecondary == NULL) -- return m_SecondaryId; -- const UMLPackage *typePkg = m_pSecondary->umlPackage(); -- if (typePkg != NULL && typePkg != m_pUMLPackage) -- return m_pSecondary->fullyQualifiedName(); -- return m_pSecondary->name(); --} -- --/** -- * Sets the type of the UMLAttribute. -- * -- * @param type Pointer to the UMLObject of the type. -- */ --void UMLClassifierListItem::setType(UMLObject *type) --{ -- if (m_pSecondary != type) { -- m_pSecondary = type; -- UMLObject::emitModified(); -- } --} -- --/** -- * Sets the type name of the UMLClassifierListItem. -- * DEPRECATED - use setType() instead. -- * -- * @param type The type name of the UMLClassifierListItem. -- */ --void UMLClassifierListItem::setTypeName(const QString &type) --{ -- if (type.isEmpty() || type == QLatin1String("void")) { -- m_pSecondary = NULL; -- m_SecondaryId.clear(); -- return; -- } -- UMLDoc *pDoc = UMLApp::app()->document(); -- m_pSecondary = pDoc->findUMLObject(type); -- if (m_pSecondary == NULL) { -- // Make data type for easily identified cases -- if (Model_Utils::isCommonDataType(type) || type.contains(QLatin1Char('*'))) { -- m_pSecondary = Object_Factory::createUMLObject(UMLObject::ot_Datatype, type); -- uDebug() << "created datatype for " << type; -- } else { -- m_SecondaryId = type; -- } -- } -- UMLObject::emitModified(); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/classifierlistitem.h umbrello-kf6-15.08.1/umbrello/classifierlistitem.h ---- umbrello-kf6-15.08.1.orig/umbrello/classifierlistitem.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/classifierlistitem.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,58 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef CLASSIFIERLISTITEM_H --#define CLASSIFIERLISTITEM_H -- --#include "umlobject.h" -- --// forward declaration --class UMLClassifier; -- --/** -- * Classifiers (classes, interfaces) have lists of operations, -- * attributes, templates and others. This is a base class for -- * the items in this list. This abstraction should remove -- * duplication of dialogs and allow for stereotypes in lists. -- * -- * @short A base class for classifier list items (e.g. attributes) -- * @author Jonathan Riddell -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLClassifierListItem : public UMLObject --{ -- Q_OBJECT --public: -- -- UMLClassifierListItem(UMLObject *parent, -- const QString& name, -- Uml::ID::Type id = Uml::ID::None); -- explicit UMLClassifierListItem(UMLObject *parent); -- virtual ~UMLClassifierListItem(); -- -- virtual void setType(UMLObject *type); -- UMLClassifier * getType() const; -- -- void setTypeName(const QString &type); -- virtual QString getTypeName() const; -- -- virtual QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -- -- virtual void copyInto(UMLObject *lhs) const; -- -- /** -- * The abstract method UMLObject::clone() must be implemented -- * by the classes inheriting from UMLClassifierListItem. -- */ -- virtual UMLObject* clone() const = 0; -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/CMakeLists.txt umbrello-kf6-15.08.1/umbrello/CMakeLists.txt ---- umbrello-kf6-15.08.1.orig/umbrello/CMakeLists.txt 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/CMakeLists.txt 2015-10-08 11:48:59.486089026 +0300 -@@ -56,7 +56,8 @@ - ${CMAKE_CURRENT_SOURCE_DIR}/docgenerators/ - ${CMAKE_CURRENT_SOURCE_DIR}/finder/ - ${CMAKE_CURRENT_SOURCE_DIR}/refactoring/ -- ${CMAKE_CURRENT_SOURCE_DIR}/widgets/ -+ ${CMAKE_CURRENT_SOURCE_DIR}/umlmodel/ -+ ${CMAKE_CURRENT_SOURCE_DIR}/umlwidgets/ - ${CMAKE_SOURCE_DIR}/lib/cppparser/ - ${CMAKE_SOURCE_DIR}/lib/interfaces/ - ) -@@ -343,47 +344,47 @@ - cmds/widget/cmd_setTxt.cpp - ) - --set(libwidgets_SRCS -- widgets/activitywidget.cpp -- widgets/actorwidget.cpp -- widgets/artifactwidget.cpp -- widgets/associationline.cpp -- widgets/associationwidget.cpp -- widgets/boxwidget.cpp -- widgets/categorywidget.cpp -- widgets/classifierwidget.cpp -- widgets/combinedfragmentwidget.cpp -- widgets/componentwidget.cpp -- widgets/datatypewidget.cpp -- widgets/entitywidget.cpp -- widgets/enumwidget.cpp -- widgets/floatingdashlinewidget.cpp -- widgets/floatingtextwidget.cpp -- widgets/forkjoinwidget.cpp -- widgets/layoutgrid.cpp -- widgets/linkwidget.cpp -- widgets/messagewidget.cpp -- widgets/nodewidget.cpp -- widgets/notewidget.cpp -- widgets/objectnodewidget.cpp -- widgets/objectwidget.cpp -- widgets/packagewidget.cpp -- widgets/pinportbase.cpp -- widgets/pinwidget.cpp -- widgets/portwidget.cpp -- widgets/preconditionwidget.cpp -- widgets/regionwidget.cpp -- widgets/seqlinewidget.cpp -- widgets/signalwidget.cpp -- widgets/statewidget.cpp -- widgets/toolbarstateonewidget.cpp -- widgets/umlwidget.cpp -- widgets/usecasewidget.cpp -- widgets/widget_factory.cpp -- widgets/widget_utils.cpp -- widgets/widgetbase.cpp -- widgets/widgetlist_utils.cpp -- widgets/statusbartoolbutton.cpp -+set(libumlwidgets_SRCS -+ umlwidgets/activitywidget.cpp -+ umlwidgets/actorwidget.cpp -+ umlwidgets/artifactwidget.cpp -+ umlwidgets/associationline.cpp -+ umlwidgets/associationwidget.cpp -+ umlwidgets/boxwidget.cpp -+ umlwidgets/categorywidget.cpp -+ umlwidgets/classifierwidget.cpp -+ umlwidgets/combinedfragmentwidget.cpp -+ umlwidgets/componentwidget.cpp -+ umlwidgets/datatypewidget.cpp -+ umlwidgets/entitywidget.cpp -+ umlwidgets/enumwidget.cpp -+ umlwidgets/floatingdashlinewidget.cpp -+ umlwidgets/floatingtextwidget.cpp -+ umlwidgets/forkjoinwidget.cpp -+ umlwidgets/layoutgrid.cpp -+ umlwidgets/linkwidget.cpp -+ umlwidgets/messagewidget.cpp -+ umlwidgets/nodewidget.cpp -+ umlwidgets/notewidget.cpp -+ umlwidgets/objectnodewidget.cpp -+ umlwidgets/objectwidget.cpp -+ umlwidgets/packagewidget.cpp -+ umlwidgets/pinportbase.cpp -+ umlwidgets/pinwidget.cpp -+ umlwidgets/portwidget.cpp -+ umlwidgets/preconditionwidget.cpp -+ umlwidgets/regionwidget.cpp -+ umlwidgets/seqlinewidget.cpp -+ umlwidgets/signalwidget.cpp -+ umlwidgets/statewidget.cpp -+ umlwidgets/toolbarstateonewidget.cpp -+ umlwidgets/umlwidget.cpp -+ umlwidgets/usecasewidget.cpp -+ umlwidgets/widget_factory.cpp -+ umlwidgets/widget_utils.cpp -+ umlwidgets/widgetbase.cpp -+ umlwidgets/widgetlist_utils.cpp -+ umlwidgets/statusbartoolbutton.cpp - ) - - set(libfinder_SRCS -@@ -394,47 +395,60 @@ - finder/umlscenefinder.cpp - ) - --########### next target ############### -+set(libuml_SRCS -+ umlmodel/actor.cpp -+ umlmodel/artifact.cpp -+ umlmodel/association.cpp -+ umlmodel/attribute.cpp -+ umlmodel/category.cpp -+ umlmodel/checkconstraint.cpp -+ umlmodel/classifier.cpp -+ umlmodel/classifierlistitem.cpp -+ umlmodel/component.cpp -+ umlmodel/entity.cpp -+ umlmodel/entityattribute.cpp -+ umlmodel/entityconstraint.cpp -+ umlmodel/enum.cpp -+ umlmodel/enumliteral.cpp -+ umlmodel/folder.cpp -+ umlmodel/foreignkeyconstraint.cpp -+ umlmodel/node.cpp -+ umlmodel/operation.cpp -+ umlmodel/package.cpp -+ umlmodel/port.cpp -+ umlmodel/stereotype.cpp -+ umlmodel/template.cpp -+ umlmodel/umlattributelist.cpp -+ umlmodel/umlcanvasobject.cpp -+ umlmodel/umlclassifierlistitemlist.cpp -+ umlmodel/umlentityattributelist.cpp -+ umlmodel/umlentityconstraintlist.cpp -+ umlmodel/umlobject.cpp -+ umlmodel/umlobjectlist.cpp -+ umlmodel/umlrole.cpp -+ umlmodel/usecase.cpp -+ umlmodel/uniqueconstraint.cpp -+) - - set(umbrello-kf6base_SRCS -- actor.cpp -- artifact.cpp -- association.cpp - assocrules.cpp -- attribute.cpp - basictypes.cpp - birdview.cpp -- category.cpp -- checkconstraint.cpp -- classifier.cpp -- classifierlistitem.cpp - cmdlineexportallviewsevent.cpp -- component.cpp - docwindow.cpp - dotgenerator.cpp -- entity.cpp -- entityattribute.cpp -- entityconstraint.cpp -- enum.cpp -- enumliteral.cpp -- folder.cpp -- foreignkeyconstraint.cpp - icon_utils.cpp - import_argo.cpp - import_rose.cpp - layoutgenerator.cpp - listpopupmenu.cpp - model_utils.cpp -- node.cpp - object_factory.cpp -- operation.cpp - optionstate.cpp -- package.cpp - petalnode.cpp - petaltree2uml.cpp -- port.cpp -- stereotype.cpp -- template.cpp -+ stereotypeswindow.cpp -+ stereotypesmodel.cpp - toolbarstatearrow.cpp - toolbarstateassociation.cpp - toolbarstate.cpp -@@ -443,26 +457,16 @@ - toolbarstateother.cpp - toolbarstatepool.cpp - umlappprivate.cpp -- umlattributelist.cpp -- umlcanvasobject.cpp -- umlclassifierlistitemlist.cpp - uml.cpp - umldoc.cpp -- umlentityattributelist.cpp -- umlentityconstraintlist.cpp - umllistview.cpp - umllistviewitem.cpp -- umlobject.cpp -- umlobjectlist.cpp -- umlrole.cpp - umlscene.cpp - umlview.cpp - umlviewimageexporterall.cpp - umlviewimageexporter.cpp - umlviewimageexportermodel.cpp -- uniqueconstraint.cpp - uniqueid.cpp -- usecase.cpp - worktoolbar.cpp - ) - -@@ -482,7 +486,8 @@ - ${libcodegenerator_SRCS} - ${libdocgenerator_SRCS} - ${libcmds_SRCS} -- ${libwidgets_SRCS} -+ ${libuml_SRCS} -+ ${libumlwidgets_SRCS} - ${umbrello-kf6base_SRCS} - ) - -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/component.cpp umbrello-kf6-15.08.1/umbrello/component.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/component.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/component.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,127 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "component.h" --// app includes --#include "association.h" --#include "debug_utils.h" --#include "object_factory.h" --#include "model_utils.h" --#include "clipboard/idchangelog.h" --#include "umldoc.h" --// kde includes --#include -- --/** -- * Sets up a Component. -- * @param name The name of the Concept. -- * @param id The unique id of the Concept. -- */ --UMLComponent::UMLComponent(const QString & name, Uml::ID::Type id) -- : UMLPackage(name, id), -- m_executable(false) --{ -- m_BaseType = UMLObject::ot_Component; --} -- --/** -- * Destructor. -- */ --UMLComponent::~UMLComponent() --{ --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLComponent::clone() const --{ -- UMLComponent *clone = new UMLComponent(); -- UMLObject::copyInto(clone); -- return clone; --} -- --/** -- * Creates the UML:Component element including its operations, -- * attributes and templates -- */ --void UMLComponent::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement componentElement = UMLObject::save(QLatin1String("UML:Component"), qDoc); -- componentElement.setAttribute(QLatin1String("executable"), m_executable); -- // Save contained components if any. -- if (m_objects.count()) { -- QDomElement ownedElement = qDoc.createElement(QLatin1String("UML:Namespace.ownedElement")); -- for (UMLObjectListIt objectsIt(m_objects); objectsIt.hasNext();) { -- UMLObject* obj = objectsIt.next(); -- uIgnoreZeroPointer(obj); -- obj->saveToXMI (qDoc, ownedElement); -- } -- componentElement.appendChild(ownedElement); -- } -- qElement.appendChild(componentElement); --} -- --/** -- * Loads the UML:Component element including its ports et al. -- */ --bool UMLComponent::load(QDomElement& element) --{ -- QString executable = element.attribute(QLatin1String("executable"), QLatin1String("0")); -- m_executable = (bool)executable.toInt(); -- for (QDomNode node = element.firstChild(); !node.isNull(); -- node = node.nextSibling()) { -- if (node.isComment()) -- continue; -- QDomElement tempElement = node.toElement(); -- QString type = tempElement.tagName(); -- if (Model_Utils::isCommonXMIAttribute(type)) -- continue; -- if (UMLDoc::tagEq(type, QLatin1String("Namespace.ownedElement")) || -- UMLDoc::tagEq(type, QLatin1String("Namespace.contents"))) { -- //CHECK: umbrello-kf6 currently assumes that nested elements -- // are ownedElements anyway. -- // Therefore these tags are not further interpreted. -- if (! load(tempElement)) -- return false; -- continue; -- } -- UMLObject *pObject = Object_Factory::makeObjectFromXMI(type); -- if (!pObject) { -- uWarning() << "Unknown type of umlobject to create: " << type; -- continue; -- } -- pObject->setUMLPackage(this); -- if (pObject->loadFromXMI(tempElement)) { -- addObject(pObject); -- } else { -- delete pObject; -- } -- } -- return true; --} -- --/** -- * Sets m_executable. -- */ --void UMLComponent::setExecutable(bool executable) --{ -- m_executable = executable; --} -- --/** -- * Returns the value of m_executable. -- */ --bool UMLComponent::getExecutable() --{ -- return m_executable; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/component.h umbrello-kf6-15.08.1/umbrello/component.h ---- umbrello-kf6-15.08.1.orig/umbrello/component.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/component.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,48 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef COMPONENT_H --#define COMPONENT_H -- --#include "package.h" -- --/** -- * This class contains the non-graphical information required for a -- * UML Component. -- * This class inherits from @ref UMLPackage which contains most -- * of the information. -- * -- * @short Non-graphical information for a Component. -- * @author Jonathan Riddell -- * @see UMLCanvasObject -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLComponent : public UMLPackage --{ -- Q_OBJECT --public: -- explicit UMLComponent(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -- virtual ~UMLComponent(); -- -- virtual UMLObject* clone() const; -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- -- void setExecutable(bool executable); -- bool getExecutable(); -- --protected: -- bool load(QDomElement & element); -- --private: -- bool m_executable; ///< holds whether this is an executable component or not --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/dialogs/notedialog.cpp umbrello-kf6-15.08.1/umbrello/dialogs/notedialog.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/dialogs/notedialog.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/dialogs/notedialog.cpp 2015-10-08 11:48:59.497089026 +0300 -@@ -36,6 +36,7 @@ - QVBoxLayout *layout = new QVBoxLayout(frame); - layout->addWidget(m_docWidget, 10); - setMinimumSize(600, 250); -+ m_docWidget->setFocus(); - } - - /** -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/dialogs/widgets/documentationwidget.cpp umbrello-kf6-15.08.1/umbrello/dialogs/widgets/documentationwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/dialogs/widgets/documentationwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/dialogs/widgets/documentationwidget.cpp 2015-10-08 11:48:59.499089026 +0300 -@@ -67,6 +67,8 @@ - m_editField->setLineWrapMode(QTextEdit::WidgetWidth); - m_editField->setWordWrapMode(QTextOption::WordWrap); - m_editField->setText(text); -+ setFocusProxy(m_editField); -+ - QHBoxLayout *layout = new QHBoxLayout(m_box); - layout->addWidget(m_editField); - layout->setMargin(fontMetrics().height()); -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/docwindow.cpp umbrello-kf6-15.08.1/umbrello/docwindow.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/docwindow.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/docwindow.cpp 2015-10-08 11:48:59.499089026 +0300 -@@ -91,6 +91,7 @@ - statusLayout->addWidget(m_modifiedWidget, 0, 5, 1, 1); - m_docTE = new KTextEdit(this); - m_docTE->setText(QString()); -+ setFocusProxy(m_docTE); - //m_docTE->setWordWrapMode(QTextEdit::WidgetWidth); - QVBoxLayout* docLayout = new QVBoxLayout(this); - docLayout->addLayout(statusLayout); -@@ -461,5 +462,6 @@ - tab->setCurrentIndex(i); - } - } -+ m_docTE->setFocus(); - } - -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/entityattribute.cpp umbrello-kf6-15.08.1/umbrello/entityattribute.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/entityattribute.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/entityattribute.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,280 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "entityattribute.h" -- --// app includes --#include "debug_utils.h" --//#include "umlcanvasobject.h" --#include "umldoc.h" --#include "uml.h" --#include "umlentityattributedialog.h" --#include "object_factory.h" -- --// qt includes --#include -- --/** -- * Sets up an entityattribute. -- * @param parent The parent of this UMLEntityAttribute. -- * @param name The name of this UMLEntityAttribute. -- * @param id The unique id given to this UMLEntityAttribute. -- * @param s The visibility of the UMLEntityAttribute. -- * @param type The type of this UMLEntityAttribute. -- * @param iv The initial value of the entityattribute. -- */ --UMLEntityAttribute::UMLEntityAttribute(UMLObject *parent, const QString& name, -- Uml::ID::Type id, Uml::Visibility::Enum s, -- UMLObject *type, const QString& iv) -- : UMLAttribute(parent, name, id, s, type, iv) --{ -- init(); -- if (m_pSecondary) { -- m_pSecondary->setBaseType(UMLObject::ot_Entity); -- } --} -- --/** -- * Sets up an entityattribute. -- * @param parent The parent of this UMLEntityAttribute. -- */ --UMLEntityAttribute::UMLEntityAttribute(UMLObject *parent) -- : UMLAttribute(parent) --{ -- init(); --} -- --/** -- * Destructor. -- */ --UMLEntityAttribute::~UMLEntityAttribute() --{ --} -- --/** -- * Initialize members of this class. -- * Auxiliary method used by constructors. -- */ --void UMLEntityAttribute::init() --{ -- m_BaseType = UMLObject::ot_EntityAttribute; -- m_indexType = UMLEntityAttribute::None; -- m_autoIncrement = false; -- m_null = false; --} -- --/** -- * Returns the value of the UMLEntityAttribute's attributes property. -- * @return The value of the UMLEntityAttribute's attributes property. -- */ --QString UMLEntityAttribute::getAttributes() const --{ -- return m_attributes; --} -- --/** -- * Sets the UMLEntityAttribute's attributes property. -- * @param attributes The new value for the attributes property. -- */ --void UMLEntityAttribute::setAttributes(const QString& attributes) --{ -- m_attributes = attributes; --} -- --/** -- * Returns the UMLEntityAttribute's length/values property. -- * @return The new value of the length/values property. -- */ --QString UMLEntityAttribute::getValues() const --{ -- return m_values; --} -- --/** -- * Sets the UMLEntityAttribute's length/values property. -- * @param values The new value of the length/values property. -- */ --void UMLEntityAttribute::setValues(const QString& values) --{ -- m_values = values; --} -- --/** -- * Returns the UMLEntityAttribute's auto_increment boolean -- * @return The UMLEntityAttribute's auto_increment boolean -- */ --bool UMLEntityAttribute::getAutoIncrement() const --{ -- return m_autoIncrement; --} -- --/** -- * Sets the UMLEntityAttribute's auto_increment boolean -- * @param autoIncrement The UMLEntityAttribute's auto_increment boolean -- */ --void UMLEntityAttribute::setAutoIncrement(const bool autoIncrement) --{ -- m_autoIncrement = autoIncrement; --} -- --/** -- * Returns the UMLEntityAttribute's index type property. -- * @return The value of the UMLEntityAttribute's index type property. -- */ --UMLEntityAttribute::DBIndex_Type UMLEntityAttribute::indexType() const --{ -- return m_indexType; --} -- --/** -- * Sets the initial value of the UMLEntityAttribute's index type property. -- * @param indexType The initial value of the UMLEntityAttribute's index type property. -- */ --void UMLEntityAttribute::setIndexType(const UMLEntityAttribute::DBIndex_Type indexType) --{ -- m_indexType = indexType; --} -- --/** -- * Returns the UMLEntityAttribute's allow null value. -- * @return The UMLEntityAttribute's allow null value. -- */ --bool UMLEntityAttribute::getNull() const --{ -- return m_null; --} -- --/** -- * Sets the initial value of the UMLEntityAttribute's allow null value. -- * @param nullIn The initial value of the UMLEntityAttribute's allow null value. -- */ --void UMLEntityAttribute::setNull(const bool nullIn) --{ -- m_null = nullIn; --} -- --/** -- * Returns a string representation of the UMLEntityAttribute. -- * @param sig If true will show the entityattribute type and initial value. -- * @return Returns a string representation of the UMLEntityAttribute. -- */ --QString UMLEntityAttribute::toString(Uml::SignatureType::Enum sig) --{ -- QString s; -- //FIXME -- -- if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::NoSig) { -- s = Uml::Visibility::toString(m_visibility, true) + QLatin1Char(' '); -- } -- -- if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::SigNoVis) { -- QString string = s + name() + QLatin1String(" : ") + getTypeName(); -- if(m_InitialValue.length() > 0) -- string += QLatin1String(" = ") + m_InitialValue; -- return string; -- } else -- return s + name(); --} -- --/** -- * Overloaded '==' operator -- */ --bool UMLEntityAttribute::operator==(const UMLEntityAttribute &rhs) const --{ -- if(this == &rhs) -- return true; -- -- if(!UMLObject::operator==(rhs)) -- return false; -- -- // The type name is the only distinguishing criterion. -- // (Some programming languages might support more, but others don't.) -- if (m_pSecondary != rhs.m_pSecondary) -- return false; -- -- return true; --} -- --/** -- * Copy the internal presentation of this object into the UMLEntityAttribute -- * object. -- */ --void UMLEntityAttribute::copyInto(UMLObject *lhs) const --{ -- UMLEntityAttribute *target = static_cast(lhs); -- -- // call the parent first. -- UMLClassifierListItem::copyInto(target); -- -- // Copy all datamembers -- target->m_pSecondary = m_pSecondary; -- target->m_SecondaryId = m_SecondaryId; -- target->m_InitialValue = m_InitialValue; -- target->m_ParmKind = m_ParmKind; --} -- --/** -- * Make a clone of the UMLEntityAttribute. -- */ --UMLObject* UMLEntityAttribute::clone() const --{ -- UMLEntityAttribute* clone = new UMLEntityAttribute((UMLEntityAttribute*)parent()); -- copyInto(clone); -- -- return clone; --} -- --/** -- * Creates the XMI element. -- */ --void UMLEntityAttribute::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement entityattributeElement = UMLObject::save(QLatin1String("UML:EntityAttribute"), qDoc); -- if (m_pSecondary == NULL) { -- uDebug() << name() << ": m_pSecondary is NULL, using local name " << m_SecondaryId; -- entityattributeElement.setAttribute(QLatin1String("type"), m_SecondaryId); -- } else { -- entityattributeElement.setAttribute(QLatin1String("type"), Uml::ID::toString(m_pSecondary->id())); -- } -- entityattributeElement.setAttribute(QLatin1String("initialValue"), m_InitialValue); -- entityattributeElement.setAttribute(QLatin1String("dbindex_type"), m_indexType); -- entityattributeElement.setAttribute(QLatin1String("values"), m_values); -- entityattributeElement.setAttribute(QLatin1String("attributes"), m_attributes); -- entityattributeElement.setAttribute(QLatin1String("auto_increment"), m_autoIncrement); -- entityattributeElement.setAttribute(QLatin1String("allow_null"), m_null); -- qElement.appendChild(entityattributeElement); --} -- --/** -- * Loads the XMI element. -- */ --bool UMLEntityAttribute::load(QDomElement & element) --{ -- if (! UMLAttribute::load(element)) -- return false; -- int indexType = element.attribute(QLatin1String("dbindex_type"), QLatin1String("1100")).toInt(); -- m_indexType = (UMLEntityAttribute::DBIndex_Type)indexType; -- m_values = element.attribute(QLatin1String("values")); -- m_attributes = element.attribute(QLatin1String("attributes")); -- m_autoIncrement = (bool)element.attribute(QLatin1String("auto_increment")).toInt(); -- m_null = (bool)element.attribute(QLatin1String("allow_null")).toInt(); -- return true; --} -- --/** -- * Display the properties configuration dialog for the entityattribute. -- */ --bool UMLEntityAttribute::showPropertiesDialog(QWidget* parent) --{ -- UMLEntityAttributeDialog dialog(parent, this); -- return dialog.exec(); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/entityattribute.h umbrello-kf6-15.08.1/umbrello/entityattribute.h ---- umbrello-kf6-15.08.1.orig/umbrello/entityattribute.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/entityattribute.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,85 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ENTITYATTRIBUTE_H --#define ENTITYATTRIBUTE_H -- --#include "attribute.h" --#include "basictypes.h" -- --/** -- * This class is used to set up information for an entityattribute. This is a database field -- * It has a type, name, index type and default value. -- * -- * @short Sets up entityattribute information. -- * @author Jonathan Riddell -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLEntityAttribute : public UMLAttribute --{ -- Q_OBJECT -- Q_ENUMS(DBIndex_Type) --public: -- enum DBIndex_Type -- { -- None = 1100, -- Primary, -- Index, -- Unique -- }; -- -- UMLEntityAttribute(UMLObject* parent, const QString& name, -- Uml::ID::Type id = Uml::ID::None, -- Uml::Visibility::Enum s = Uml::Visibility::Private, -- UMLObject *type = 0, const QString& iv = QString()); -- explicit UMLEntityAttribute(UMLObject* parent); -- virtual ~UMLEntityAttribute(); -- -- bool operator==(const UMLEntityAttribute& rhs) const; -- -- virtual void copyInto(UMLObject *lhs) const; -- -- virtual UMLObject* clone() const; -- -- void setAttributes(const QString& attributes); -- QString getAttributes() const; -- -- void setIndexType(const DBIndex_Type indexType); -- DBIndex_Type indexType() const; -- -- void setValues(const QString& values); -- QString getValues() const; -- -- void setAutoIncrement(const bool autoIncrement); -- bool getAutoIncrement() const; -- -- void setNull(const bool null); -- bool getNull() const; -- -- QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -- -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- -- virtual bool showPropertiesDialog(QWidget* parent = 0); -- --protected: -- void init(); -- -- bool load(QDomElement& element); -- --private: -- DBIndex_Type m_indexType; -- QString m_values; -- QString m_attributes; -- bool m_autoIncrement; -- bool m_null; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/entityconstraint.cpp umbrello-kf6-15.08.1/umbrello/entityconstraint.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/entityconstraint.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/entityconstraint.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,76 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --//own header --#include "entityconstraint.h" -- --// app includes --#include "umlobject.h" --#include "umldoc.h" --#include "uml.h" -- --// qt includes --#include -- --/** -- * Sets up a constraint. -- * @param parent The parent of this UMLEntityConstraint. -- * @param name The name of this UMLEntityConstraint. -- * @param id The unique id given to this UMLEntityConstraint. -- */ --UMLEntityConstraint::UMLEntityConstraint(UMLObject *parent, -- const QString& name, Uml::ID::Type id) -- : UMLClassifierListItem(parent, name, id) --{ -- m_BaseType = UMLObject::ot_EntityConstraint; --} -- --/** -- * Sets up a constraint. -- * @param parent The parent of this UMLEntityConstraint. -- */ --UMLEntityConstraint::UMLEntityConstraint(UMLObject *parent) -- : UMLClassifierListItem(parent) --{ -- m_BaseType = UMLObject::ot_EntityConstraint; --} -- --/** -- * Overloaded '==' operator -- */ --bool UMLEntityConstraint::operator==(const UMLEntityConstraint &rhs) const --{ -- if(this == &rhs) -- return true; -- -- if(!UMLObject::operator==(rhs)) -- return false; -- -- return true; --} -- --/** -- * destructor. -- */ --UMLEntityConstraint::~UMLEntityConstraint() --{ --} -- --/** -- * Copy the internal presentation of this object into the UMLEntityConstraint -- * object. -- */ --void UMLEntityConstraint::copyInto(UMLObject *lhs) const --{ -- // call the parent first. -- UMLClassifierListItem::copyInto(lhs); --} -- -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/entityconstraint.h umbrello-kf6-15.08.1/umbrello/entityconstraint.h ---- umbrello-kf6-15.08.1.orig/umbrello/entityconstraint.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/entityconstraint.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,49 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ENTITYCONSTRAINT_H --#define ENTITYCONSTRAINT_H -- --#include "basictypes.h" --#include "classifierlistitem.h" --#include "umlclassifierlist.h" -- --/** -- * This class is used to set up information for a entity constraint. -- * -- * @short Sets up entity constraint information. -- * @author Sharan Rao -- * @see UMLObject UMLClassifierListItem -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLEntityConstraint : public UMLClassifierListItem --{ -- Q_OBJECT -- --public: -- UMLEntityConstraint(UMLObject *parent, const QString& name, -- Uml::ID::Type id = Uml::ID::None); -- -- explicit UMLEntityConstraint(UMLObject *parent); -- -- bool operator==(const UMLEntityConstraint &rhs) const; -- -- virtual ~UMLEntityConstraint(); -- -- virtual void copyInto(UMLObject *lhs) const; -- -- /** -- * Make a clone of the UMLEntityConstraint. -- */ -- virtual UMLObject* clone() const = 0; -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/entity.cpp umbrello-kf6-15.08.1/umbrello/entity.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/entity.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/entity.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,719 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "entity.h" -- --// app includes --#include "debug_utils.h" --#include "entityattribute.h" --#include "uniqueconstraint.h" --#include "foreignkeyconstraint.h" --#include "checkconstraint.h" --#include "umldoc.h" --#include "uml.h" --#include "uniqueid.h" --#include "umlentityattributelist.h" --#include "umlentityconstraintlist.h" --#include "idchangelog.h" --#include "umlentityattributedialog.h" --#include "umluniqueconstraintdialog.h" --#include "umlforeignkeyconstraintdialog.h" --#include "umlcheckconstraintdialog.h" -- --// kde includes --#include --#include -- --// qt includes --#include -- --/** -- * Constructor. -- */ --UMLEntity::UMLEntity(const QString& name, Uml::ID::Type id) -- : UMLClassifier(name, id), -- m_PrimaryKey(0) --{ -- m_BaseType = UMLObject::ot_Entity; -- connect(this, SIGNAL(entityAttributeRemoved(UMLClassifierListItem*)), -- this, SLOT(slotEntityAttributeRemoved(UMLClassifierListItem*))); --} -- --/** -- * Standard destructor. -- */ --UMLEntity::~UMLEntity() --{ -- m_List.clear(); --} -- --/** -- * Overloaded '==' operator. -- */ --bool UMLEntity::operator==(const UMLEntity& rhs) const --{ -- return UMLClassifier::operator==(rhs); --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLEntity::copyInto(UMLObject *lhs) const --{ -- UMLEntity *target = static_cast(lhs); -- -- // call base class copy function -- UMLClassifier::copyInto(target); -- -- // copy local data items -- target->m_PrimaryKey = m_PrimaryKey; --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLEntity::clone() const --{ -- UMLEntity* clone = new UMLEntity(); -- copyInto(clone); -- -- return clone; --} -- --/** -- * Create an UMLAttribute. -- * @param name an optional name for the attribute -- * @param type an optional type object for the attribute -- * @param vis the visibility of the attribute -- * @param iv the initial value for the attribute -- * @return the just created attribute or null -- */ --UMLAttribute* UMLEntity::createAttribute(const QString &name /*= QString()*/, UMLObject *type /*= 0*/, -- Uml::Visibility::Enum vis /* = Uml::Visibility::Private*/, -- const QString& iv /* = QString()*/) --{ -- Uml::ID::Type id = UniqueID::gen(); -- QString currentName; -- if (name.isNull()) { -- currentName = uniqChildName(UMLObject::ot_EntityAttribute); -- } else { -- currentName = name; -- } -- -- UMLEntityAttribute* newAttribute = new UMLEntityAttribute(this, currentName, id, vis, type, iv); -- -- int button = QDialog::Accepted; -- bool goodName = false; -- -- //check for name.isNull() stops dialog being shown -- //when creating attribute via list view -- while (button == QDialog::Accepted && !goodName && name.isNull()) { -- QPointer dialog = new UMLEntityAttributeDialog(0, newAttribute); -- button = dialog->exec(); -- QString name = newAttribute->name(); -- -- if (name.length() == 0) { -- KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -- } else if (findChildObject(name) != NULL) { -- KMessageBox::error(0, i18n("That name is already being used."), i18n("Not a Unique Name")); -- } else { -- goodName = true; -- } -- delete dialog; -- } -- -- if (button != QDialog::Accepted) { -- delete newAttribute; -- return 0; -- } -- -- addEntityAttribute(newAttribute); -- -- UMLDoc *umldoc = UMLApp::app()->document(); -- umldoc->signalUMLObjectCreated(newAttribute); -- return newAttribute; --} -- --/** -- * Creates a Unique Constraint for this Entity. -- * @param name an optional name -- * @return the UniqueConstraint created -- */ --UMLUniqueConstraint* UMLEntity::createUniqueConstraint(const QString &name) --{ -- Uml::ID::Type id = UniqueID::gen(); -- QString currentName; -- if (name.isNull()) { -- -- /** -- * @todo check parameter -- */ -- currentName = uniqChildName(UMLObject::ot_UniqueConstraint); -- } else { -- currentName = name; -- } -- -- UMLUniqueConstraint* newUniqueConstraint = new UMLUniqueConstraint(this, currentName, id); -- -- int button = QDialog::Accepted; -- bool goodName = false; -- -- //check for name.isNull() stops dialog being shown -- //when creating attribute via list view -- while (button == QDialog::Accepted && !goodName && name.isNull()) { -- QPointer dialog = new UMLUniqueConstraintDialog(0, newUniqueConstraint); -- button = dialog->exec(); -- QString name = newUniqueConstraint->name(); -- -- if (name.length() == 0) { -- KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -- } else if (findChildObject(name) != NULL) { -- KMessageBox::error(0, i18n("That name is already being used."), i18n("Not a Unique Name")); -- } else { -- goodName = true; -- } -- delete dialog; -- } -- -- if (button != QDialog::Accepted) { -- delete newUniqueConstraint; -- return NULL; -- } -- -- addConstraint(newUniqueConstraint); -- -- UMLDoc *umldoc = UMLApp::app()->document(); -- umldoc->signalUMLObjectCreated(newUniqueConstraint); -- emitModified(); -- return newUniqueConstraint; --} -- --/** -- * Creates a Foreign Key Constraint for this Entity. -- * @param name an optional name -- * @return the ForeignKeyConstraint created -- */ --UMLForeignKeyConstraint* UMLEntity::createForeignKeyConstraint(const QString &name) --{ -- Uml::ID::Type id = UniqueID::gen(); -- QString currentName; -- if (name.isNull()) { -- currentName = uniqChildName(UMLObject::ot_ForeignKeyConstraint); -- } else { -- currentName = name; -- } -- -- UMLForeignKeyConstraint* newForeignKeyConstraint = new UMLForeignKeyConstraint(this, currentName, id); -- -- int button = QDialog::Accepted; -- bool goodName = false; -- -- //check for name.isNull() stops dialog being shown -- //when creating attribute via list view -- while (button == QDialog::Accepted && !goodName && name.isNull()) { -- QPointer dialog = new UMLForeignKeyConstraintDialog(0, newForeignKeyConstraint); -- button = dialog->exec(); -- QString name = newForeignKeyConstraint->name(); -- -- if (name.length() == 0) { -- KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -- } else if (findChildObject(name) != NULL) { -- KMessageBox::error(0, i18n("That name is already being used."), i18n("Not a Unique Name")); -- } else { -- goodName = true; -- } -- delete dialog; -- } -- -- if (button != QDialog::Accepted) { -- return NULL; -- } -- -- addConstraint(newForeignKeyConstraint); -- -- UMLDoc *umldoc = UMLApp::app()->document(); -- umldoc->signalUMLObjectCreated(newForeignKeyConstraint); -- emitModified(); -- return newForeignKeyConstraint; --} -- --/** -- * Creates a Check Constraint for this Entity. -- * @param name an optional name -- * @return the CheckConstraint created -- */ --UMLCheckConstraint* UMLEntity::createCheckConstraint(const QString &name) --{ -- Uml::ID::Type id = UniqueID::gen(); -- QString currentName; -- if (name.isNull()) { -- currentName = uniqChildName(UMLObject::ot_CheckConstraint); -- } else { -- currentName = name; -- } -- -- UMLCheckConstraint* newCheckConstraint = new UMLCheckConstraint(this, currentName, id); -- -- int button = QDialog::Accepted; -- bool goodName = false; -- -- //check for name.isNull() stops dialog being shown -- //when creating attribute via list view -- while (button == QDialog::Accepted && !goodName && name.isNull()) { -- QPointer dialog = new UMLCheckConstraintDialog(0, newCheckConstraint); -- button = dialog->exec(); -- QString name = newCheckConstraint->name(); -- -- if (name.length() == 0) { -- KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -- } else if (findChildObject(name) != NULL) { -- KMessageBox::error(0, i18n("That name is already being used."), i18n("Not a Unique Name")); -- } else { -- goodName = true; -- } -- delete dialog; -- } -- -- if (button != QDialog::Accepted) { -- return NULL; -- } -- -- addConstraint(newCheckConstraint); -- -- UMLDoc *umldoc = UMLApp::app()->document(); -- umldoc->signalUMLObjectCreated(newCheckConstraint); -- emitModified(); -- return newCheckConstraint; --} -- --/** -- * Adds an entityAttribute. -- * The entityAttribute object must not belong to any other concept. -- * @param name name of the UMLEntityAttribute -- * @param id id of the UMLEntityAttribute -- * @return True if the entityAttribute was successfully added. -- */ --UMLObject* UMLEntity::addEntityAttribute(const QString& name, Uml::ID::Type id) --{ -- UMLEntityAttribute* literal = new UMLEntityAttribute(this, name, id); -- m_List.append(literal); -- emit entityAttributeAdded(literal); -- UMLObject::emitModified(); -- connect(literal, SIGNAL(modified()), this, SIGNAL(modified())); -- return literal; --} -- --/** -- * Adds an already created entityAttribute. -- * The entityAttribute object must not belong to any other concept. -- * @param att Pointer to the UMLEntityAttribute. -- * @param log Pointer to the IDChangeLog. -- * @return True if the entityAttribute was successfully added. -- */ --bool UMLEntity::addEntityAttribute(UMLEntityAttribute* att, IDChangeLog* log /* = 0*/) --{ -- QString name = (QString)att->name(); -- if (findChildObject(name) == NULL) { -- att->setParent(this); -- m_List.append(att); -- emit entityAttributeAdded(att); -- UMLObject::emitModified(); -- connect(att, SIGNAL(modified()), this, SIGNAL(modified())); -- return true; -- } else if (log) { -- log->removeChangeByNewID(att->id()); -- delete att; -- } -- return false; --} -- --/** -- * Adds an entityAttribute to the entity, at the given position. -- * If position is negative or too large, the entityAttribute is added -- * to the end of the list. -- * TODO: give default value -1 to position (append) - now it conflicts with the method above.. -- * @param att Pointer to the UMLEntityAttribute. -- * @param position Position index for the insertion. -- * @return True if the entityAttribute was successfully added. -- */ --bool UMLEntity::addEntityAttribute(UMLEntityAttribute* att, int position) --{ -- Q_ASSERT(att); -- QString name = (QString)att->name(); -- if (findChildObject(name) == NULL) { -- att->setParent(this); -- if (position >= 0 && position <= (int)m_List.count()) { -- m_List.insert(position, att); -- } else { -- m_List.append(att); -- } -- emit entityAttributeAdded(att); -- UMLObject::emitModified(); -- connect(att, SIGNAL(modified()), this, SIGNAL(modified())); -- return true; -- } -- return false; --} -- --/** -- * Removes an entityAttribute from the class. -- * @param att The entityAttribute to remove. -- * @return Count of the remaining entityAttributes after removal. -- * Returns -1 if the given entityAttribute was not found. -- */ --int UMLEntity::removeEntityAttribute(UMLClassifierListItem* att) --{ -- if (!m_List.removeAll((UMLEntityAttribute*)att)) { -- uDebug() << "cannot find att given in list"; -- return -1; -- } -- emit entityAttributeRemoved(att); -- UMLObject::emitModified(); -- // If we are deleting the object, then we don't need to disconnect..this is done auto-magically -- // for us by QObject. -b.t. -- // disconnect(att, SIGNAL(modified()), this, SIGNAL(modified())); -- delete att; -- return m_List.count(); --} -- --/** -- * Returns the number of entityAttributes for the class. -- * @return The number of entityAttributes for the class. -- */ --int UMLEntity::entityAttributes() --{ -- UMLClassifierListItemList entityAttributes = getFilteredList(UMLObject::ot_EntityAttribute); -- return entityAttributes.count(); --} -- --/** -- * Emit the entityAttributeRemoved signal. -- */ --void UMLEntity::signalEntityAttributeRemoved(UMLClassifierListItem *eattr) --{ -- emit entityAttributeRemoved(eattr); --} -- --/** -- * Resolve the types referenced by our UMLEntityAttributes. -- * Reimplements the method from UMLClassifier. -- */ --bool UMLEntity::resolveRef() --{ -- bool success = UMLClassifier::resolveRef(); -- for (UMLObjectListIt oit(m_List); oit.hasNext();) { -- UMLObject* obj = oit.next(); -- if (obj->resolveRef()) { -- UMLClassifierListItem *cli = static_cast(obj); -- switch (cli->baseType()) { -- case UMLObject::ot_EntityAttribute: -- emit entityAttributeAdded(cli); -- break; -- case UMLObject::ot_UniqueConstraint: -- case UMLObject::ot_ForeignKeyConstraint: -- emit entityConstraintAdded(cli); -- break; -- default: -- break; -- } -- } -- } -- return success; --} -- --/** -- * Creates the element including its entityliterals. -- */ --void UMLEntity::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement entityElement = UMLObject::save(QLatin1String("UML:Entity"), qDoc); -- //save operations -- UMLClassifierListItemList entityAttributes = getFilteredList(UMLObject::ot_EntityAttribute); -- UMLClassifierListItem* pEntityAttribute = 0; -- foreach (pEntityAttribute, entityAttributes) { -- pEntityAttribute->saveToXMI(qDoc, entityElement); -- } -- -- UMLClassifierListItemList entityConstraints = getFilteredList(UMLObject::ot_EntityConstraint); -- foreach(UMLClassifierListItem* cli, entityConstraints) { -- cli->saveToXMI(qDoc, entityElement); -- } -- -- qElement.appendChild(entityElement); --} -- --/** -- * Loads the element including its entityAttributes. -- */ --bool UMLEntity::load(QDomElement& element) --{ -- QDomNode node = element.firstChild(); -- while(!node.isNull()) { -- if (node.isComment()) { -- node = node.nextSibling(); -- continue; -- } -- QDomElement tempElement = node.toElement(); -- QString tag = tempElement.tagName(); -- if (UMLDoc::tagEq(tag, QLatin1String("EntityAttribute"))) { // for backward compatibility -- UMLEntityAttribute* pEntityAttribute = new UMLEntityAttribute(this); -- if(!pEntityAttribute->loadFromXMI(tempElement)) { -- return false; -- } -- m_List.append(pEntityAttribute); -- } else if (UMLDoc::tagEq(tag, QLatin1String("UniqueConstraint"))) { -- UMLUniqueConstraint* pUniqueConstraint = new UMLUniqueConstraint(this); -- if (!pUniqueConstraint->loadFromXMI(tempElement)) { -- return false; -- } -- addConstraint(pUniqueConstraint); -- } else if (UMLDoc::tagEq(tag, QLatin1String("ForeignKeyConstraint"))) { -- UMLForeignKeyConstraint* pForeignKeyConstraint = new UMLForeignKeyConstraint(this); -- if (!pForeignKeyConstraint->loadFromXMI(tempElement)) { -- return false; -- } -- -- addConstraint(pForeignKeyConstraint); -- } else if (UMLDoc::tagEq(tag, QLatin1String("CheckConstraint"))) { -- -- UMLCheckConstraint* pCheckConstraint = new UMLCheckConstraint(this); -- if (!pCheckConstraint->loadFromXMI(tempElement)) { -- return false; -- } -- -- addConstraint(pCheckConstraint); -- } else if (tag == QLatin1String("stereotype")) { -- uDebug() << name() << ": losing old-format stereotype."; -- } else { -- uWarning() << "unknown child type in UMLEntity::load"; -- } -- node = node.nextSibling(); -- }//end while -- return true; --} -- --/** -- * Sets the UniqueConstraint passed as the Primary Key of this Entity -- * If the UniqueConstraint exists, then it is made a primary key -- * Else the UniqueConstraint is added and set as PrimaryKey -- * @param uconstr The Unique Constraint that is to be set as Primary Key -- * @return true if Primary key could be set successfully -- */ --bool UMLEntity::setAsPrimaryKey(UMLUniqueConstraint* uconstr) --{ -- if (uconstr == NULL) { -- uDebug() << "NULL value passed. To unset a Primary Key use " -- << "unsetPrimaryKey()"; -- return false; -- } -- -- if (static_cast(uconstr->parent()) != this) { -- -- uDebug() << "Parent of " << uconstr->name() -- << " does not match with current entity"; -- return false; -- } -- -- // check if this constraint already exists as a unique constraint for this entity -- UMLUniqueConstraint* uuc = static_cast(findChildObjectById(uconstr->id())); -- if (uuc == NULL) { -- addConstraint(uconstr); -- uuc = uconstr; -- } -- -- UMLUniqueConstraint* oldPrimaryKey = m_PrimaryKey; -- -- m_PrimaryKey = uuc; -- -- if (oldPrimaryKey != NULL) -- oldPrimaryKey->emitModified(); -- -- uuc->emitModified(); -- emitModified(); -- return true; --} -- --/** -- * Unset a Primary Key Constraint if it exists, else does nothing -- * This function will make the primary key into just another UniqueConstraint -- * if it exists -- */ --void UMLEntity::unsetPrimaryKey() --{ -- m_PrimaryKey = 0; --} -- --/** -- * Checks if This UMLEntity has a primary key set. -- * @return true if a Primary Key Exists for this UMLEntity -- */ --bool UMLEntity::hasPrimaryKey() const --{ -- if (m_PrimaryKey) { -- return true; -- } -- -- return false; --} -- --/** -- * Adds a Constraint to this UMLEntity. -- * To set a UMLUniqueConstraint as Primary Key use setAsPrimaryKey. -- * @param constr The UMLEntityConstraint that is to be added -- * @return true if the constraint could be added successfully -- */ --bool UMLEntity::addConstraint(UMLEntityConstraint* constr) --{ -- if (findChildObjectById(constr->id()) != NULL) { -- uDebug() << "Constraint with id " << Uml::ID::toString(constr->id()) -- << " already exists "; -- return false; -- } -- -- m_List.append(constr); -- -- emit entityConstraintAdded(constr); -- UMLObject::emitModified(); -- connect(constr, SIGNAL(modified()), this, SIGNAL(modified())); -- -- return true; --} -- --/** -- * Removes an existing constraint from this UMLEntity. -- * If the Contraint is a Primary Key, this Entity will no longer have a PrimaryKey. -- * @param constr the constraint to be removed -- * @return true if the constraint could be removed successfully -- */ --bool UMLEntity::removeConstraint(UMLEntityConstraint* constr) --{ -- if (findChildObjectById(constr->id()) == NULL) { -- uDebug() << "Constraint with id " << Uml::ID::toString(constr->id()) -- << " does not exist "; -- return false; -- } -- -- if (m_PrimaryKey == constr) { -- unsetPrimaryKey(); -- } -- -- m_List.removeAll(constr); -- -- emit entityConstraintRemoved(constr); -- UMLObject::emitModified(); -- -- delete constr; -- return true; --} -- --/** -- * Slot for entity attribute removed. -- */ --void UMLEntity::slotEntityAttributeRemoved(UMLClassifierListItem* cli) --{ -- // this function does some cleanjobs related to this entity when the attribute is -- // removed, like, removing the attribute from all constraints -- -- UMLEntityAttribute* entAtt = static_cast(cli); -- if (cli) { -- UMLClassifierListItemList ual = this->getFilteredList(UMLObject::ot_UniqueConstraint); -- -- foreach(UMLClassifierListItem* ucli, ual) { -- UMLUniqueConstraint* uuc = static_cast(ucli); -- if (uuc->hasEntityAttribute(entAtt)) { -- uuc->removeEntityAttribute(entAtt); -- } -- } -- } -- --} -- --/** -- * Reimplementation of getFilteredList to support ot=UMLObject::ot_EntityConstraint. -- */ --UMLClassifierListItemList UMLEntity::getFilteredList(UMLObject::ObjectType ot) const --{ -- if (ot == UMLObject::ot_EntityConstraint) { -- UMLClassifierListItemList ucList, fcList, ccList, rcList; -- ucList = UMLClassifier::getFilteredList(UMLObject::ot_UniqueConstraint); -- fcList = UMLClassifier::getFilteredList(UMLObject::ot_ForeignKeyConstraint); -- ccList = UMLClassifier::getFilteredList(UMLObject::ot_CheckConstraint); -- -- // append the lists to rcList -- // first the Unique Constraints -- foreach(UMLClassifierListItem* ucli, ucList) { -- rcList.append(ucli); -- } -- -- // then the Foreign Key Constraints -- foreach(UMLClassifierListItem* ucli, fcList) { -- rcList.append(ucli); -- } -- -- foreach(UMLClassifierListItem* ucli, ccList) { -- rcList.append(ucli); -- } -- -- return rcList; -- } else { -- return UMLClassifier::getFilteredList(ot); -- } --} -- --/** -- * Checks if a given Unique Constraint is primary key of this entity -- * @param uConstr a Unique Constraint -- * @return bool true if passed parameter is a primary key of this entity -- */ --bool UMLEntity::isPrimaryKey(UMLUniqueConstraint* uConstr) const --{ -- if (uConstr == m_PrimaryKey) { -- return true; -- } -- -- return false; --} -- --/** -- * Returns the Entity Attributes. -- * Same as getFilteredList(UMLObject::ot_EntityAttribute). -- */ --UMLEntityAttributeList UMLEntity::getEntityAttributes() const --{ -- UMLEntityAttributeList entityAttributeList; -- for (UMLObjectListIt lit(m_List); lit.hasNext();) { -- UMLObject *listItem = lit.next(); -- if (listItem->baseType() == UMLObject::ot_EntityAttribute) { -- entityAttributeList.append(static_cast(listItem)); -- } -- } -- return entityAttributeList; --} -- -- --/** -- * Create a new ClassifierListObject (entityattribute) -- * according to the given XMI tag. -- * Returns NULL if the string given does not contain one of the tags -- * -- * Used by the clipboard for paste operation. -- * Reimplemented from UMLClassifier for UMLEntity -- */ --UMLClassifierListItem* UMLEntity::makeChildObject(const QString& xmiTag) --{ -- UMLClassifierListItem* pObject = NULL; -- if (UMLDoc::tagEq(xmiTag, QLatin1String("EntityAttribute"))) { -- pObject = new UMLEntityAttribute(this); -- } -- return pObject; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/entity.h umbrello-kf6-15.08.1/umbrello/entity.h ---- umbrello-kf6-15.08.1.orig/umbrello/entity.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/entity.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,108 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ENTITY_H --#define ENTITY_H -- --#include "classifier.h" -- --// forward declarations --class UMLEntityAttribute; --class UMLEntityConstraint; --class UMLUniqueConstraint; --class UMLForeignKeyConstraint; --class UMLCheckConstraint; --class UMLEntityAttributeList; -- --/** -- * This class contains the non-graphical information required for a UML -- * Entity. -- * This class inherits from @ref UMLClassifier which contains most of the -- * information. -- * -- * @short Non-graphical Information for an Entity. -- * @author Jonathan Riddell -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLEntity : public UMLClassifier --{ -- Q_OBJECT --public: -- explicit UMLEntity(const QString& name = QString(), Uml::ID::Type id = Uml::ID::None); -- virtual ~UMLEntity(); -- -- bool operator==(const UMLEntity& rhs) const; -- -- virtual void copyInto(UMLObject *lhs) const; -- -- virtual UMLObject* clone() const; -- -- virtual UMLAttribute* createAttribute(const QString &name = QString(), -- UMLObject *type = 0, Uml::Visibility::Enum vis = Uml::Visibility::Private, -- const QString &init = QString()); -- -- UMLUniqueConstraint* createUniqueConstraint(const QString &name = QString()); -- UMLForeignKeyConstraint* createForeignKeyConstraint(const QString &name = QString()); -- UMLCheckConstraint* createCheckConstraint(const QString &name = QString()); -- -- UMLObject* addEntityAttribute(const QString &name, Uml::ID::Type id = Uml::ID::None); -- bool addEntityAttribute(UMLEntityAttribute* att, IDChangeLog* log = 0); -- bool addEntityAttribute(UMLEntityAttribute* att, int position); -- -- int removeEntityAttribute(UMLClassifierListItem* att); -- -- void signalEntityAttributeRemoved(UMLClassifierListItem *eattr); -- -- int entityAttributes() ; -- -- bool setAsPrimaryKey(UMLUniqueConstraint* uconstr); -- void unsetPrimaryKey(); -- bool hasPrimaryKey() const; -- bool isPrimaryKey(UMLUniqueConstraint* uConstr) const; -- -- bool addConstraint(UMLEntityConstraint* constr); -- bool removeConstraint(UMLEntityConstraint* constr); -- -- virtual bool resolveRef(); -- -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- -- UMLClassifierListItemList getFilteredList(UMLObject::ObjectType ot) const; -- -- UMLEntityAttributeList getEntityAttributes() const; -- -- virtual UMLClassifierListItem* makeChildObject(const QString& xmiTag); -- --private slots: -- void slotEntityAttributeRemoved(UMLClassifierListItem*); -- --signals: -- void entityAttributeAdded(UMLClassifierListItem*); -- void entityAttributeRemoved(UMLClassifierListItem*); -- void entityConstraintAdded(UMLClassifierListItem*); -- void entityConstraintRemoved(UMLClassifierListItem*); -- --protected: -- bool load(QDomElement& element); -- --private: -- -- /** -- * Primary Key of this Entity -- * This is a pointer kept for easy access to the primary key, and to distinguish it -- * from all other UniqueConstraints. It is also there in m_List (inherited from -- * UMLCanvasObject) -- */ -- UMLUniqueConstraint* m_PrimaryKey; -- --}; -- --#endif // ENTITY_H -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/enum.cpp umbrello-kf6-15.08.1/umbrello/enum.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/enum.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/enum.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,302 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "enum.h" -- --// app includes --#include "debug_utils.h" --#include "enumliteral.h" --#include "umldoc.h" --#include "uml.h" --#include "uniqueid.h" --#include "idchangelog.h" -- --// kde includes --#include --#include -- --/** -- * Sets up an enum. -- * @param name The name of the Enum. -- * @param id The unique id of the Enum. -- */ --UMLEnum::UMLEnum(const QString& name, Uml::ID::Type id) : UMLClassifier(name, id) --{ -- init(); --} -- --/** -- * Standard destructor. -- */ --UMLEnum::~UMLEnum() --{ -- m_List.clear(); --} -- --/** -- * Overloaded '==' operator. -- */ --bool UMLEnum::operator==(const UMLEnum & rhs) const --{ -- return UMLClassifier::operator==(rhs); --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLEnum::copyInto(UMLObject *lhs) const --{ -- UMLClassifier::copyInto(lhs); --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLEnum::clone() const --{ -- UMLEnum *clone = new UMLEnum(); -- copyInto(clone); -- -- return clone; --} -- --/** -- * Initializes key variables of the class. -- */ --void UMLEnum::init() --{ -- m_BaseType = UMLObject::ot_Enum; -- setStereotypeCmd(QLatin1String("enum")); --} -- --/** -- * Creates a literal for the enum. -- * @return The UMLEnum created -- */ --UMLObject* UMLEnum::createEnumLiteral(const QString& name) --{ -- Uml::ID::Type id = UniqueID::gen(); -- QString currentName; -- if (name.isNull()) { -- currentName = uniqChildName(UMLObject::ot_EnumLiteral); -- } else { -- currentName = name; -- } -- -- UMLEnumLiteral* newEnumLiteral = new UMLEnumLiteral(this, currentName); -- -- bool ok = true; -- bool goodName = false; -- -- //check for name.isNull() stops dialog being shown -- //when creating enum literal via list view -- while (ok && !goodName && name.isNull()) { -- ok = newEnumLiteral->showPropertiesDialog(UMLApp::app()); -- QString name = newEnumLiteral->name(); -- -- if(name.length() == 0) { -- KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -- } else { -- goodName = true; -- } -- } -- -- if (!ok) { -- delete newEnumLiteral; -- return NULL; -- } -- -- addEnumLiteral(newEnumLiteral); -- -- UMLDoc *umldoc = UMLApp::app()->document(); -- umldoc->signalUMLObjectCreated(newEnumLiteral); -- return newEnumLiteral; --} -- --/** -- * Adds an enumliteral to the enum. -- * @param name The name of the enumliteral. -- * @param id The id of the enumliteral (optional.) -- * If omitted a new ID is assigned internally. -- * @return Pointer to the UMLEnumliteral created. -- */ --UMLObject* UMLEnum::addEnumLiteral(const QString &name, Uml::ID::Type id) --{ -- UMLObject *el = UMLCanvasObject::findChildObject(name); -- if (el != NULL) { -- uDebug() << name << " is already present"; -- return el; -- } -- UMLEnumLiteral* literal = new UMLEnumLiteral(this, name, id); -- m_List.append(literal); -- UMLObject::emitModified(); -- emit enumLiteralAdded(literal); -- connect(literal, SIGNAL(modified()), this, SIGNAL(modified())); -- return literal; --} -- --/** -- * Adds an already created enumliteral. -- * The enumliteral object must not belong to any other concept. -- * @param literal Pointer to the UMLEnumLiteral. -- * @param Log Pointer to the IDChangeLog. -- * @return True if the enumliteral was successfully added. -- */ --bool UMLEnum::addEnumLiteral(UMLEnumLiteral* literal, IDChangeLog* Log /* = 0*/) --{ -- QString name = (QString)literal->name(); -- if (findChildObject(name) == NULL) { -- literal->setParent(this); -- m_List.append(literal); -- UMLObject::emitModified(); -- emit enumLiteralAdded(literal); -- connect(literal, SIGNAL(modified()), this, SIGNAL(modified())); -- return true; -- } else if (Log) { -- Log->removeChangeByNewID(literal->id()); -- delete literal; -- } -- return false; --} -- --/** -- * Adds an enumliteral to the enum, at the given position. -- * If position is negative or too large, the enumliteral is added -- * to the end of the list. -- * TODO: give default value -1 to position (append) - now it conflicts with the method above.. -- * @param literal Pointer to the UMLEnumLiteral. -- * @param position Position index for the insertion. -- * @return True if the enumliteral was successfully added. -- */ --bool UMLEnum::addEnumLiteral(UMLEnumLiteral* literal, int position) --{ -- Q_ASSERT(literal); -- QString name = (QString)literal->name(); -- if (findChildObject(name) == NULL) { -- literal->setParent(this); -- if (position >= 0 && position <= (int)m_List.count()) { -- m_List.insert(position, literal); -- } else { -- m_List.append(literal); -- } -- UMLObject::emitModified(); -- emit enumLiteralAdded(literal); -- connect(literal, SIGNAL(modified()), this, SIGNAL(modified())); -- return true; -- } -- return false; --} -- --/** -- * Removes an enumliteral from the class. -- * @param literal The enumliteral to remove. -- * @return Count of the remaining enumliterals after removal. -- * Returns -1 if the given enumliteral was not found. -- */ --int UMLEnum::removeEnumLiteral(UMLEnumLiteral* literal) --{ -- if (!m_List.removeAll(literal)) { -- uDebug() << "cannot find att given in list"; -- return -1; -- } -- emit enumLiteralRemoved(literal); -- UMLObject::emitModified(); -- // If we are deleting the object, then we don't need to disconnect..this is done auto-magically -- // for us by QObject. -b.t. -- // disconnect(a, SIGNAL(modified()), this, SIGNAL(modified())); -- delete literal; -- return m_List.count(); --} -- --/** -- * Returns the number of enumliterals for the class. -- * @return The number of enumliterals for the class. -- */ --int UMLEnum::enumLiterals() --{ -- return m_List.count(); --} -- --/** -- * Emit the enumLiteralRemoved signal. -- */ --void UMLEnum::signalEnumLiteralRemoved(UMLClassifierListItem *elit) --{ -- emit enumLiteralRemoved(elit); --} -- --/** -- * Creates the element including its enumliterals. -- */ --void UMLEnum::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement enumElement = UMLObject::save(QLatin1String("UML:Enumeration"), qDoc); -- // save enum literals -- UMLClassifierListItemList enumLiterals = getFilteredList(UMLObject::ot_EnumLiteral); -- foreach (UMLClassifierListItem* pEnumLiteral, enumLiterals) { -- pEnumLiteral->saveToXMI(qDoc, enumElement); -- } -- qElement.appendChild(enumElement); --} -- --/** -- * Loads the element including its enumliterals. -- */ --bool UMLEnum::load(QDomElement& element) --{ -- QDomNode node = element.firstChild(); -- while(!node.isNull()) { -- if (node.isComment()) { -- node = node.nextSibling(); -- continue; -- } -- QDomElement tempElement = node.toElement(); -- QString tag = tempElement.tagName(); -- if (UMLDoc::tagEq(tag, QLatin1String("EnumerationLiteral")) || -- UMLDoc::tagEq(tag, QLatin1String("ownedLiteral")) || -- UMLDoc::tagEq(tag, QLatin1String("EnumLiteral"))) { // for backward compatibility -- UMLEnumLiteral* pEnumLiteral = new UMLEnumLiteral(this); -- if(!pEnumLiteral->loadFromXMI(tempElement)) { -- return false; -- } -- m_List.append(pEnumLiteral); -- } else if (UMLDoc::tagEq(tag, QLatin1String("Enumeration.literal"))) { // Embarcadero's Describe -- if (! load(tempElement)) -- return false; -- } else if (tag == QLatin1String("stereotype")) { -- uDebug() << name() << ": losing old-format stereotype."; -- } else { -- uWarning() << "unknown child type: " << tag; -- } -- node = node.nextSibling(); -- }//end while -- return true; --} -- --/** -- * Create a new ClassifierListObject (enumLiteral) -- * according to the given XMI tag. -- * Returns NULL if the string given does not contain one of the tags -- * -- * Used by the clipboard for paste operation. -- * Reimplemented from UMLClassifier for UMLEnum -- */ --UMLClassifierListItem* UMLEnum::makeChildObject(const QString& xmiTag) --{ -- UMLClassifierListItem* pObject = NULL; -- if (UMLDoc::tagEq(xmiTag, QLatin1String("EnumerationLiteral")) || -- UMLDoc::tagEq(xmiTag, QLatin1String("EnumLiteral"))) { -- pObject = new UMLEnumLiteral(this); -- } -- return pObject; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/enum.h umbrello-kf6-15.08.1/umbrello/enum.h ---- umbrello-kf6-15.08.1.orig/umbrello/enum.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/enum.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,72 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ENUM_H --#define ENUM_H -- --#include "classifier.h" -- --class UMLEnumLiteral; -- --/** -- * This class contains the non-graphical information required for a UML -- * Enum. -- * This class inherits from @ref UMLClassifier which contains most of the -- * information. -- * -- * @short Non-graphical Information for an Enum. -- * @author Jonathan Riddell -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLEnum : public UMLClassifier --{ -- Q_OBJECT --public: -- explicit UMLEnum(const QString& name = QString(), Uml::ID::Type id = Uml::ID::None); -- -- virtual ~UMLEnum(); -- -- bool operator==(const UMLEnum& rhs) const; -- -- virtual void copyInto(UMLObject *lhs) const; -- -- virtual UMLObject* clone() const; -- -- UMLObject* createEnumLiteral(const QString& name = QString()); -- -- UMLObject* addEnumLiteral(const QString &name, Uml::ID::Type id = Uml::ID::None); -- -- bool addEnumLiteral(UMLEnumLiteral* literal, IDChangeLog* Log = 0); -- bool addEnumLiteral(UMLEnumLiteral* literal, int position); -- -- int removeEnumLiteral(UMLEnumLiteral* literal); -- -- int enumLiterals(); -- -- void signalEnumLiteralRemoved(UMLClassifierListItem *elit); -- -- virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- -- virtual UMLClassifierListItem* makeChildObject(const QString& xmiTag); -- --signals: -- void enumLiteralAdded(UMLClassifierListItem*); -- void enumLiteralRemoved(UMLClassifierListItem*); -- --protected: -- bool load(QDomElement & element); -- --private: -- void init(); -- --}; -- --#endif // ENUM_H -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/enumliteral.cpp umbrello-kf6-15.08.1/umbrello/enumliteral.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/enumliteral.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/enumliteral.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,126 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "enumliteral.h" -- --// kde includes --#if QT_VERSION < 0x050000 --#include --#endif --#include -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#endif -- --/** -- * Sets up an enum literal. -- * @param parent The parent of this UMLEnumLiteral. -- * @param name The name of this UMLEnumLiteral. -- * @param id The unique id given to this UMLEnumLiteral. -- */ --UMLEnumLiteral::UMLEnumLiteral(UMLObject *parent, -- const QString& name, Uml::ID::Type id) -- : UMLClassifierListItem(parent, name, id) --{ -- m_BaseType = UMLObject::ot_EnumLiteral; --} -- --/** -- * Sets up an enum literal. -- * @param parent The parent of this UMLEnumLiteral. -- */ --UMLEnumLiteral::UMLEnumLiteral(UMLObject *parent) -- : UMLClassifierListItem(parent) --{ -- m_BaseType = UMLObject::ot_EnumLiteral; --} -- --/** -- * Destructor. -- */ --UMLEnumLiteral::~UMLEnumLiteral() --{ --} -- --/** -- * Overloaded '==' operator -- */ --bool UMLEnumLiteral::operator==(const UMLEnumLiteral& rhs) const --{ -- if (this == &rhs) { -- return true; -- } -- if (!UMLObject::operator==(rhs)) { -- return false; -- } -- return true; --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLEnumLiteral::copyInto(UMLObject *lhs) const --{ -- UMLClassifierListItem::copyInto(lhs); --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLEnumLiteral::clone() const --{ -- UMLEnumLiteral *clone = new UMLEnumLiteral((UMLObject *) parent()); -- copyInto(clone); -- -- return clone; --} -- --/** -- * Creates the XMI element. -- */ --void UMLEnumLiteral::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement attributeElement = UMLObject::save(QLatin1String("UML:EnumerationLiteral"), qDoc); -- qElement.appendChild(attributeElement); --} -- --/** -- * Loads the XMI element (empty.) -- */ --bool UMLEnumLiteral::load(QDomElement& element) --{ -- Q_UNUSED(element); -- return true; --} -- --/** -- * Display the properties configuration dialog for the enum literal. -- */ --bool UMLEnumLiteral::showPropertiesDialog(QWidget* parent) --{ -- bool ok; --#if QT_VERSION >= 0x050000 -- QString enumName = QInputDialog::getText(parent, -- i18nc("enum name", "Name"), i18n("Enter name:"), -- QLineEdit::Normal, -- name(), &ok); --#else -- QString enumName = KInputDialog::getText(i18nc("enum name", "Name"), i18n("Enter name:"), name(), &ok, parent); --#endif -- if (ok && !enumName.isEmpty()) { -- setName(enumName); -- return true; -- } else { -- return false; -- } --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/enumliteral.h umbrello-kf6-15.08.1/umbrello/enumliteral.h ---- umbrello-kf6-15.08.1.orig/umbrello/enumliteral.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/enumliteral.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,49 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ENUMLITERAL_H --#define ENUMLITERAL_H -- --#include "classifierlistitem.h" -- --/** -- * This class is used to set up information for an enum literal. Enum -- * literals are the values that enums can be set to. -- * -- * @short Sets up attribute information. -- * @author Paul Hensgen -- * @see UMLObject -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLEnumLiteral : public UMLClassifierListItem --{ --public: -- UMLEnumLiteral(UMLObject* parent, -- const QString& name, Uml::ID::Type id = Uml::ID::None); -- explicit UMLEnumLiteral(UMLObject* parent); -- -- bool operator==(const UMLEnumLiteral &rhs) const; -- -- virtual void copyInto(UMLObject *lhs) const; -- -- virtual UMLObject* clone() const; -- -- virtual ~UMLEnumLiteral(); -- -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- -- virtual bool showPropertiesDialog(QWidget* parent = 0); -- --protected: -- bool load(QDomElement& element); -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/folder.cpp umbrello-kf6-15.08.1/umbrello/folder.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/folder.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/folder.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,558 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2006-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "folder.h" -- --// app includes --#include "debug_utils.h" --#include "model_utils.h" --#include "object_factory.h" --#include "optionstate.h" --#include "uml.h" --#include "umldoc.h" --#include "umlscene.h" --#include "umlview.h" -- --// kde includes --#include --#include -- --// qt includes --#include -- --/** -- * Sets up a Folder. -- * @param name The name of the Folder. -- * @param id The unique id of the Folder. A new ID will be generated -- * if this argument is left away. -- */ --UMLFolder::UMLFolder(const QString & name, Uml::ID::Type id) -- : UMLPackage(name, id) --{ -- m_BaseType = UMLObject::ot_Folder; -- UMLObject::setStereotypeCmd(QLatin1String("folder")); --} -- --/** -- * Empty destructor. -- */ --UMLFolder::~UMLFolder() --{ -- qDeleteAll(m_diagrams); -- m_diagrams.clear(); --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLFolder::clone() const --{ -- UMLFolder *clone = new UMLFolder(); -- UMLObject::copyInto(clone); -- return clone; --} -- --/** -- * Set the localized name of this folder. -- * This is set for the predefined root views (Logical, -- * UseCase, Component, Deployment, EntityRelationship, -- * and the Datatypes folder inside the Logical View.) -- */ --void UMLFolder::setLocalName(const QString& localName) --{ -- m_localName = localName; --} -- --/** -- * Return the localized name of this folder. -- * Only useful for the predefined root folders. -- */ --QString UMLFolder::localName() const --{ -- return m_localName; --} -- --/** -- * Add a view to the diagram list. -- */ --void UMLFolder::addView(UMLView *view) --{ -- m_diagrams.append(view); --} -- --/** -- * Remove a view from the diagram list. -- */ --void UMLFolder::removeView(UMLView *view) --{ -- m_diagrams.removeAll(view); -- delete view; --} -- --/** -- * Append the views in this folder to the given diagram list. -- * @param viewList The UMLViewList to which to append the diagrams. -- * @param includeNested Whether to include diagrams from nested folders -- * (default: true.) -- */ --void UMLFolder::appendViews(UMLViewList& viewList, bool includeNested) --{ -- if (includeNested) { -- foreach (UMLObject* o, m_objects) { -- uIgnoreZeroPointer(o); -- if (o->baseType() == UMLObject::ot_Folder) { -- UMLFolder *f = static_cast(o); -- f->appendViews(viewList); -- } -- } -- } -- foreach (UMLView* v, m_diagrams) { -- viewList.append(v); -- } --} -- --/** -- * Acivate the views in this folder. -- * "Activation": Some widgets require adjustments after loading from file, -- * those are done here. -- */ --void UMLFolder::activateViews() --{ -- foreach (UMLObject* o, m_objects) { -- uIgnoreZeroPointer(o); -- if (o->baseType() == UMLObject::ot_Folder) { -- UMLFolder *f = static_cast(o); -- f->activateViews(); -- } -- } -- -- foreach (UMLView* v, m_diagrams) { -- v->umlScene()->activateAfterLoad(); -- } -- // Make sure we have a treeview item for each diagram. -- // It may happen that we are missing them after switching off tabbed widgets. -- Settings::OptionState optionState = Settings::optionState(); -- if (optionState.generalState.tabdiagrams) { -- return; -- } -- Model_Utils::treeViewAddViews(m_diagrams); --} -- --/** -- * Seek a view of the given ID in this folder. -- * @param id ID of the view to find. -- * @return Pointer to the view if found, NULL if no view found. -- */ --UMLView *UMLFolder::findView(Uml::ID::Type id) --{ -- foreach (UMLView* v, m_diagrams) { -- if (v->umlScene()->ID() == id) { -- return v; -- } -- } -- -- UMLView* v = 0; -- UMLPackageList packages; -- appendPackages(packages); -- foreach (UMLPackage *o, packages) { -- if (o->baseType() != UMLObject::ot_Folder) { -- continue; -- } -- UMLFolder *f = static_cast(o); -- v = f->findView(id); -- if (v) { -- break; -- } -- } -- return v; --} -- --/** -- * Seek a view by the type and name given. -- * @param type The type of view to find. -- * @param name The name of the view to find. -- * @param searchAllScopes Search in all subfolders (default: true.) -- * @return Pointer to the view found, or NULL if not found. -- */ --UMLView *UMLFolder::findView(Uml::DiagramType::Enum type, const QString &name, bool searchAllScopes) --{ -- foreach (UMLView* v, m_diagrams) { -- if (v->umlScene()->type() == type && v->umlScene()->name() == name) { -- return v; -- } -- } -- -- UMLView* v = 0; -- if (searchAllScopes) { -- foreach (UMLObject* o, m_objects) { -- uIgnoreZeroPointer(o); -- if (o->baseType() != UMLObject::ot_Folder) { -- continue; -- } -- UMLFolder *f = static_cast(o); -- v = f->findView(type, name, searchAllScopes); -- if (v) { -- break; -- } -- } -- } -- return v; --} -- --/** -- * Set the options for the views in this folder. -- */ --void UMLFolder::setViewOptions(const Settings::OptionState& optionState) --{ -- // for each view update settings -- foreach (UMLView* v, m_diagrams) { -- v->umlScene()->setOptionState(optionState); -- } --} -- --/** -- * Remove all views in this folder. -- */ --void UMLFolder::removeAllViews() --{ -- foreach (UMLObject* o, m_objects) { -- uIgnoreZeroPointer(o); -- if (o->baseType() != UMLObject::ot_Folder) -- continue; -- UMLFolder *f = static_cast(o); -- f->removeAllViews(); -- } -- -- foreach (UMLView* v, m_diagrams) { -- // TODO ------------------ check this code - bad: calling back to UMLDoc::removeView() -- v->umlScene()->removeAllAssociations(); // note : It may not be apparent, but when we remove all associations -- // from a view, it also causes any UMLAssociations that lack parent -- // association widgets (but once had them) to remove themselves from -- // this document. -- uDebug() << "removing " << v->umlScene()->name(); -- UMLApp::app()->document()->removeView(v, false); -- } -- -- qDeleteAll(m_diagrams); -- m_diagrams.clear(); --} -- --/** -- * Set the folder file name for a separate submodel. -- */ --void UMLFolder::setFolderFile(const QString& fileName) --{ -- m_folderFile = fileName; --} -- --/** -- * Get the folder file name for a separate submodel. -- */ --QString UMLFolder::folderFile() const --{ -- return m_folderFile; --} -- --/** -- * Auxiliary to saveToXMI(): Save the contained objects and diagrams. -- * Can be used regardless of whether saving to the main model file -- * or to an external folder file (see m_folderFile.) -- */ --void UMLFolder::saveContents(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement ownedElement = qDoc.createElement(QLatin1String("UML:Namespace.ownedElement")); -- UMLObject *obj = 0; -- // Save contained objects if any. -- for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -- obj = oit.next(); -- uIgnoreZeroPointer(obj); -- obj->saveToXMI (qDoc, ownedElement); -- } -- // Save asscociations if any. -- for (UMLObjectListIt ait(m_List); ait.hasNext();) { -- obj = ait.next(); -- obj->saveToXMI (qDoc, ownedElement); -- } -- qElement.appendChild(ownedElement); -- // Save diagrams to `extension'. -- if (m_diagrams.count()) { -- QDomElement diagramsElement = qDoc.createElement(QLatin1String("diagrams")); -- -- foreach (UMLView* pView, m_diagrams) { -- pView->umlScene()->saveToXMI(qDoc, diagramsElement); -- } -- QDomElement extension = qDoc.createElement(QLatin1String("XMI.extension")); -- extension.setAttribute(QLatin1String("xmi.extender"), QLatin1String("umbrello-kf6")); -- extension.appendChild(diagramsElement); -- qElement.appendChild(extension); -- } --} -- --/** -- * Auxiliary to saveToXMI(): Creates a element when saving -- * a predefined modelview, or a element when saving a -- * user created folder. Invokes saveContents() with the newly created -- * element. -- */ --void UMLFolder::save(QDomDocument& qDoc, QDomElement& qElement) --{ -- UMLDoc *umldoc = UMLApp::app()->document(); -- QString elementName(QLatin1String("UML:Package")); -- const Uml::ModelType::Enum mt = umldoc->rootFolderType(this); -- if (mt != Uml::ModelType::N_MODELTYPES) { -- elementName = QLatin1String("UML:Model"); -- } -- QDomElement folderElement = UMLObject::save(elementName, qDoc); -- saveContents(qDoc, folderElement); -- qElement.appendChild(folderElement); --} -- --/** -- * Creates a UML:Model or UML:Package element: -- * UML:Model is created for the predefined fixed folders, -- * UML:Package with stereotype "folder" is created for all else. -- */ --void UMLFolder::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- if (m_folderFile.isEmpty()) { -- save(qDoc, qElement); -- return; -- } -- // See if we can create the external file. -- // If not then internalize the folder. -- UMLDoc *umldoc = UMLApp::app()->document(); --#if QT_VERSION >= 0x050000 -- QString fileName = umldoc->url().adjusted(QUrl::RemoveFilename).path() + m_folderFile; --#else -- QString fileName = umldoc->url().directory() + QLatin1Char('/') + m_folderFile; --#endif -- QFile file(fileName); -- if (!file.open(QIODevice::WriteOnly)) { -- uError() << m_folderFile << QLatin1String(": ") -- << "cannot create file, contents will be saved in main model file"; -- m_folderFile.clear(); -- save(qDoc, qElement); -- return; -- } -- // Okay, external file is writable. Wrap up main file. -- QDomElement folderElement = UMLObject::save(QLatin1String("UML:Package"), qDoc); -- QDomElement extension = qDoc.createElement(QLatin1String("XMI.extension")); -- extension.setAttribute(QLatin1String("xmi.extender"), QLatin1String("umbrello-kf6")); -- QDomElement fileElement = qDoc.createElement(QLatin1String("external_file")); -- fileElement.setAttribute(QLatin1String("name"), m_folderFile); -- extension.appendChild(fileElement); -- folderElement.appendChild(extension); -- qElement.appendChild(folderElement); -- -- // Save folder to external file. -- QDomDocument folderDoc; -- QDomElement folderRoot; -- QDomProcessingInstruction xmlHeading = -- folderDoc.createProcessingInstruction(QLatin1String("xml"), -- QString::fromLatin1("version=\"1.0\" encoding=\"UTF-8\"")); -- folderDoc.appendChild(xmlHeading); -- folderRoot = folderDoc.createElement(QLatin1String("external_file")); -- folderRoot.setAttribute(QLatin1String("name"), name()); -- folderRoot.setAttribute(QLatin1String("filename"), m_folderFile); -- folderRoot.setAttribute(QLatin1String("mainModel"), umldoc->url().fileName()); -- folderRoot.setAttribute(QLatin1String("parentId"), Uml::ID::toString(m_pUMLPackage->id())); -- folderRoot.setAttribute(QLatin1String("parent"), m_pUMLPackage->fullyQualifiedName(QLatin1String("::"), true)); -- saveContents(folderDoc, folderRoot); -- folderDoc.appendChild(folderRoot); -- QTextStream stream(&file); -- stream.setCodec("UTF-8"); -- stream << folderDoc.toString(); -- file.close(); --} -- --/** -- * Auxiliary to load(): -- * Load the diagrams from the "diagrams" in the -- */ --bool UMLFolder::loadDiagramsFromXMI(QDomNode& diagrams) --{ -- const Settings::OptionState optionState = Settings::optionState(); -- UMLDoc *umldoc = UMLApp::app()->document(); -- bool totalSuccess = true; -- for (QDomElement diagram = diagrams.toElement(); !diagram.isNull(); -- diagrams = diagrams.nextSibling(), diagram = diagrams.toElement()) { -- QString tag = diagram.tagName(); -- if (tag != QLatin1String("diagram")) { -- uDebug() << "ignoring " << tag << " in "; -- continue; -- } -- UMLView * pView = new UMLView(this); -- pView->umlScene()->setOptionState(optionState); -- if (pView->umlScene()->loadFromXMI(diagram)) { -- pView->hide(); -- umldoc->addView(pView); -- } else { -- delete pView; -- totalSuccess = false; -- } -- } -- return totalSuccess; --} -- --/** -- * Folders in the listview can be marked such that their contents -- * are saved to a separate file. -- * This method loads the separate folder file. -- * CAVEAT: This is not XMI standard compliant. -- * If standard compliance is an issue then avoid folder files. -- * @param path Fully qualified file name, i.e. absolute directory -- * plus file name. -- * @return True for success. -- */ --bool UMLFolder::loadFolderFile(const QString& path) --{ -- QFile file(path); -- if (!file.exists()) { -- KMessageBox::error(0, i18n("The folderfile %1 does not exist.", path), i18n("Load Error")); -- return false; -- } -- if (!file.open(QIODevice::ReadOnly)) { -- KMessageBox::error(0, i18n("The folderfile %1 cannot be opened.", path), i18n("Load Error")); -- return false; -- } -- QTextStream stream(&file); -- QString data = stream.readAll(); -- file.close(); -- QDomDocument doc; -- QString error; -- int line; -- if (!doc.setContent(data, false, &error, &line)) { -- uError() << "Cannot set content:" << error << " line:" << line; -- return false; -- } -- QDomNode rootNode = doc.firstChild(); -- while (rootNode.isComment() || rootNode.isProcessingInstruction()) { -- rootNode = rootNode.nextSibling(); -- } -- if (rootNode.isNull()) { -- uError() << "Root node is Null"; -- return false; -- } -- QDomElement element = rootNode.toElement(); -- QString type = element.tagName(); -- if (type != QLatin1String("external_file")) { -- uError() << "Root node has unknown type " << type; -- return false; -- } -- return load(element); --} -- --/** -- * Loads the owned elements of the . -- */ --bool UMLFolder::load(QDomElement& element) --{ -- UMLDoc *umldoc = UMLApp::app()->document(); -- bool totalSuccess = true; -- for (QDomNode node = element.firstChild(); !node.isNull(); -- node = node.nextSibling()) { -- if (node.isComment()) -- continue; -- QDomElement tempElement = node.toElement(); -- QString type = tempElement.tagName(); -- if (Model_Utils::isCommonXMIAttribute(type)) -- continue; -- if (UMLDoc::tagEq(type, QLatin1String("Namespace.ownedElement")) || -- UMLDoc::tagEq(type, QLatin1String("Namespace.contents"))) { -- //CHECK: umbrello-kf6 currently assumes that nested elements -- // are ownedElements anyway. -- // Therefore these tags are not further interpreted. -- if (! load(tempElement)) { -- uDebug() << "An error happened while loading the " << type -- << " of the " << name(); -- totalSuccess = false; -- } -- continue; -- } else if (UMLDoc::tagEq(type, QLatin1String("packagedElement")) || -- UMLDoc::tagEq(type, QLatin1String("ownedElement"))) { -- type = tempElement.attribute(QLatin1String("xmi:type")); -- } else if (type == QLatin1String("XMI.extension")) { -- for (QDomNode xtnode = node.firstChild(); !xtnode.isNull(); -- xtnode = xtnode.nextSibling()) { -- QDomElement el = xtnode.toElement(); -- const QString xtag = el.tagName(); -- if (xtag == QLatin1String("diagrams")) { -- QDomNode diagramNode = xtnode.firstChild(); -- if (!loadDiagramsFromXMI(diagramNode)) -- totalSuccess = false; -- } else if (xtag == QLatin1String("external_file")) { --#if QT_VERSION >= 0x050000 -- const QString rootDir(umldoc->url().adjusted(QUrl::RemoveFilename).path()); --#else -- const QString rootDir(umldoc->url().directory()); --#endif -- QString fileName = el.attribute(QLatin1String("name")); -- const QString path(rootDir + QLatin1Char('/') + fileName); -- if (loadFolderFile(path)) -- m_folderFile = fileName; -- } else { -- uDebug() << name() << ": ignoring XMI.extension " << xtag; -- continue; -- } -- } -- continue; -- } -- // Do not re-create the predefined Datatypes folder in the Logical View, -- // it already exists. -- UMLFolder *logicalView = umldoc->rootFolder(Uml::ModelType::Logical); -- if (this == logicalView && UMLDoc::tagEq(type, QLatin1String("Package"))) { -- QString thisName = tempElement.attribute(QLatin1String("name")); -- if (thisName == QLatin1String("Datatypes")) { -- UMLFolder *datatypeFolder = umldoc->datatypeFolder(); -- if (!datatypeFolder->loadFromXMI(tempElement)) -- totalSuccess = false; -- continue; -- } -- } -- UMLObject *pObject = 0; -- // Avoid duplicate creation of forward declared object -- QString idStr = Model_Utils::getXmiId(tempElement); -- if (!idStr.isEmpty()) { -- Uml::ID::Type id = Uml::ID::fromString(idStr); -- pObject = umldoc->findObjectById(id); -- if (pObject) { -- uDebug() << "object " << idStr << "already exists"; -- } -- } -- if (pObject == 0) { -- QString stereoID = tempElement.attribute(QLatin1String("stereotype")); -- pObject = Object_Factory::makeObjectFromXMI(type, stereoID); -- if (!pObject) { -- uWarning() << "Unknown type of umlobject to create: " << type; -- continue; -- } -- } -- pObject->setUMLPackage(this); -- if (!pObject->loadFromXMI(tempElement)) { -- removeObject(pObject); -- delete pObject; -- totalSuccess = false; -- } -- } -- return totalSuccess; --} -- --/** -- * Overloading operator for debugging output. -- */ --QDebug operator<<(QDebug out, const UMLFolder& item) --{ -- out.nospace() << "UMLFolder: localName=" << item.m_localName -- << ", folderFile=" << item.m_folderFile -- << ", diagrams=" << item.m_diagrams.count(); -- return out.space(); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/folder.h umbrello-kf6-15.08.1/umbrello/folder.h ---- umbrello-kf6-15.08.1.orig/umbrello/folder.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/folder.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,92 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2006-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLFOLDER_H --#define UMLFOLDER_H -- --#include "package.h" --#include "umlviewlist.h" --#include "optionstate.h" -- --/** -- * This class manages the UMLObjects and UMLViews of a Folder. -- * This class inherits from UMLPackage which contains most -- * of the information. -- * -- * The UMLDoc class allocates a fixed instance of this class for -- * each of the predefined Logical, UseCase, Component, Deployment, and -- * Entity-Relationship folders. Further instances are created on demand -- * for user folders. -- * -- * @short Non-graphical management of objects and diagrams of a Folder -- * @author Oliver Kellogg -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- * -- * TODO: This whole class needs a relook regarding view/scene. -- */ --class UMLFolder : public UMLPackage --{ -- Q_OBJECT --public: -- explicit UMLFolder(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -- virtual ~UMLFolder(); -- -- virtual UMLObject* clone() const; -- -- void setLocalName(const QString& localName); -- QString localName() const; -- -- void addView(UMLView *view); -- -- void removeView(UMLView *view); -- -- void appendViews(UMLViewList& viewList, bool includeNested = true); -- -- void activateViews(); -- -- UMLView* findView(Uml::ID::Type id); -- UMLView* findView(Uml::DiagramType::Enum type, const QString &name, bool searchAllScopes = true); -- -- void setViewOptions(const Settings::OptionState& optionState); -- -- void removeAllViews(); -- -- void setFolderFile(const QString& fileName); -- QString folderFile() const; -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- -- friend QDebug operator<<(QDebug out, const UMLFolder& item); -- --protected: -- void saveContents(QDomDocument& qDoc, QDomElement& qElement); -- -- void save(QDomDocument& qDoc, QDomElement& qElement); -- -- bool loadDiagramsFromXMI(QDomNode& diagrams); -- -- bool loadFolderFile(const QString& path); -- -- bool load(QDomElement & element); -- --private: -- QString m_localName; ///< i18n name, only used for predefined root folders -- /** -- * If m_folderFile is not empty then it contains a file name to which -- * this folder is saved. -- * In this case the folder file acts as a physically separate submodel. -- * What is saved in the main model is not the folder contents but a -- * reference to the folder file. -- */ -- QString m_folderFile; -- UMLViewList m_diagrams; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/foreignkeyconstraint.cpp umbrello-kf6-15.08.1/umbrello/foreignkeyconstraint.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/foreignkeyconstraint.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/foreignkeyconstraint.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,444 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --//own header --#include "foreignkeyconstraint.h" -- --// app includes --#include "debug_utils.h" --#include "entity.h" --#include "entityattribute.h" --#include "umlobject.h" --#include "umldoc.h" --#include "uml.h" --#include "umlforeignkeyconstraintdialog.h" --#include "object_factory.h" -- --/** -- * Sets up a constraint. -- * @param parent The parent of this UMLForeignKeyConstraint. -- * @param name The name of this UMLForeignKeyConstraint. -- * @param id The unique id given to this UMLForeignKeyConstraint. -- */ --UMLForeignKeyConstraint::UMLForeignKeyConstraint(UMLObject *parent, -- const QString& name, Uml::ID::Type id) -- : UMLEntityConstraint(parent, name, id) --{ -- init(); --} -- --/** -- * Sets up a constraint. -- * @param parent The parent of this UMLForeignKeyConstraint. -- */ --UMLForeignKeyConstraint::UMLForeignKeyConstraint(UMLObject *parent) -- : UMLEntityConstraint(parent) --{ -- init(); --} -- --/** -- * Initialisation of common variables -- */ --void UMLForeignKeyConstraint::init() --{ -- // initialise attributes -- m_BaseType = UMLObject::ot_ForeignKeyConstraint; -- -- // should be NULL actually -- // self referencing assigned to protect default behaviour -- m_ReferencedEntity = static_cast(parent()); -- -- m_UpdateAction = uda_NoAction; -- m_DeleteAction = uda_NoAction; -- -- // connecte signals and slots -- connect(this, SIGNAL(sigReferencedEntityChanged()), this, SLOT(slotReferencedEntityChanged())); --} -- --/** -- * Overloaded '==' operator -- */ --bool UMLForeignKeyConstraint::operator==(const UMLForeignKeyConstraint &rhs) const --{ -- if(this == &rhs) -- return true; -- -- if(!UMLObject::operator==(rhs)) -- return false; -- -- return true; --} -- --/** -- * Destructor. -- */ --UMLForeignKeyConstraint::~UMLForeignKeyConstraint() --{ --} -- --/** -- * Copy the internal presentation of this object into the UMLForeignKeyConstraint -- * object. -- */ --void UMLForeignKeyConstraint::copyInto(UMLObject *lhs) const --{ -- UMLForeignKeyConstraint *target = static_cast(lhs); -- -- // call the parent first. -- UMLEntityConstraint::copyInto(target); -- -- // Copy all datamembers -- target->m_ReferencedEntity = m_ReferencedEntity; -- target->m_AttributeMap = m_AttributeMap; -- target->m_DeleteAction = m_DeleteAction; -- target->m_UpdateAction = m_UpdateAction; --} -- --/** -- * Make a clone of the UMLForeignKeyConstraint. -- */ --UMLObject* UMLForeignKeyConstraint::clone() const --{ -- //FIXME: The new attribute should be slaved to the NEW parent not the old. -- UMLForeignKeyConstraint *clone = new UMLForeignKeyConstraint(static_cast(parent())); -- copyInto(clone); -- return clone; --} -- --/** -- * Returns a string representation of the UMLForeignKeyConstraint. -- * @param sig If true will show the attribute type and initial value. -- * @return Returns a string representation of the UMLAttribute. -- */ --QString UMLForeignKeyConstraint::toString(Uml::SignatureType::Enum sig) --{ -- QString s; -- -- if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::SigNoVis) { -- s = name() + QLatin1Char(':'); -- s += QLatin1String(" Foreign Key ("); -- QList keys = m_AttributeMap.keys(); -- bool first = true; -- foreach(UMLEntityAttribute* key, keys) { -- if (first) { -- first = false; -- } else -- s += QLatin1Char(','); -- s += key->name(); -- } -- s += QLatin1Char(')'); -- } -- -- return s; --} -- --/** -- * Creates the XMI element. -- */ --void UMLForeignKeyConstraint::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement foreignKeyConstraintElement = UMLObject::save(QLatin1String("UML:ForeignKeyConstraint"), qDoc); -- -- foreignKeyConstraintElement.setAttribute(QLatin1String("referencedEntity"), Uml::ID::toString(m_ReferencedEntity->id())); -- -- int updateAction = (int)m_UpdateAction; -- int deleteAction = (int)m_DeleteAction; -- -- foreignKeyConstraintElement.setAttribute(QLatin1String("updateAction"), updateAction); -- foreignKeyConstraintElement.setAttribute(QLatin1String("deleteAction"), deleteAction); -- -- QMap::iterator i; -- for (i = m_AttributeMap.begin(); i!= m_AttributeMap.end() ; ++i) { -- QDomElement mapElement = qDoc.createElement(QLatin1String("AttributeMap")); -- mapElement.setAttribute(QLatin1String("key"), Uml::ID::toString((i.key())->id())); -- mapElement.setAttribute(QLatin1String("value"), Uml::ID::toString((i.value())->id())); -- foreignKeyConstraintElement.appendChild(mapElement); -- } -- -- qElement.appendChild(foreignKeyConstraintElement); --} -- --/** -- * Display the properties configuration dialog for the attribute. -- */ --bool UMLForeignKeyConstraint::showPropertiesDialog(QWidget* parent) --{ -- UMLForeignKeyConstraintDialog dialog(parent, this); -- return dialog.exec(); --} -- --/** -- * Adds the attribute pair to the attributeMap -- * @param pAttr The Attribute of the Parent Entity -- * @param rAttr The Attribute of the Referenced Entity -- * @return true if the attribute pair could be added successfully -- */ --bool UMLForeignKeyConstraint::addEntityAttributePair(UMLEntityAttribute* pAttr, UMLEntityAttribute* rAttr) --{ -- UMLEntity *owningParent = dynamic_cast(parent()); -- -- if (pAttr == NULL || rAttr == NULL) { -- uError() << "null values passed to function"; -- return false; -- } -- // check for sanity of pAttr (parent entity attribute) -- if (owningParent == NULL) { -- uError() << name() << ": parent is not a UMLEntity"; -- return false; -- } -- -- if (owningParent->findChildObjectById(pAttr->id()) == NULL) { -- uError() << " parent " << owningParent->name() -- << " does not contain attribute " << pAttr->name(); -- return false; -- } -- -- //check for sanity of rAttr (referenced entity attribute) -- if (m_ReferencedEntity != NULL) { -- if (m_ReferencedEntity->findChildObjectById(rAttr->id()) == NULL) { -- uError() << " parent " << m_ReferencedEntity->name() -- << " does not contain attribute " << rAttr->name(); -- return false; -- } -- } else { -- uError() << "Referenced Table Not set. Not Adding Pair "; -- return false; -- } -- -- // check if key takes part in some mapping -- if (m_AttributeMap.contains(pAttr) == true) -- return false; -- -- // check if value takes part in some mapping (no direct function) -- foreach(UMLEntityAttribute* attr, m_AttributeMap.values()) { -- if (rAttr == attr) -- return false; -- } -- -- // passed all checks, insert now -- m_AttributeMap.insert(pAttr, rAttr); -- -- QMap::iterator i; -- for (i = m_AttributeMap.begin(); i != m_AttributeMap.end(); ++i) -- uDebug() << i.key()->name() << QLatin1String(" ") << i.key()->baseType() -- << QLatin1String(" ") << i.value()->name() << QLatin1String(" ") << i.value()->baseType(); -- -- return true; --} -- --/** -- * Removes an Attribute pair -- * @param pAttr The Attribute of the Parent Entity in the map. This attribute is the -- key of the map. -- * @return true of the attribute pair could be removed successfully -- */ --bool UMLForeignKeyConstraint::removeEntityAttributePair(UMLEntityAttribute* /*key*/ pAttr) --{ -- bool state = m_AttributeMap.remove(pAttr); -- -- return state; --} -- --/** -- * Check if a attribute pair already exists -- * @param pAttr The Attribute of the Parent Entity -- * @param rAttr The Attribute of the Referenced Entity -- * @return true if the attribute pair could be found. -- */ --bool UMLForeignKeyConstraint::hasEntityAttributePair(UMLEntityAttribute* pAttr, UMLEntityAttribute* rAttr) const --{ -- if (m_AttributeMap.contains(pAttr)) { -- if (m_AttributeMap.value(pAttr) == rAttr) { -- return true; -- } -- } -- -- return false; --} -- --/** -- * Loads the XMI element. -- */ --bool UMLForeignKeyConstraint::load(QDomElement & element) --{ -- UMLDoc* doc = UMLApp::app()->document(); -- -- Uml::ID::Type referencedEntityId = Uml::ID::fromString(element.attribute(QLatin1String("referencedEntity"))); -- -- UMLObject* obj = doc->findObjectById(referencedEntityId); -- m_ReferencedEntity = static_cast(obj); -- -- if (m_ReferencedEntity == NULL) { -- // save for resolving later -- m_pReferencedEntityID = referencedEntityId; -- } -- -- m_UpdateAction = (UpdateDeleteAction)element.attribute(QLatin1String("updateAction")).toInt(); -- m_DeleteAction = (UpdateDeleteAction)element.attribute(QLatin1String("deleteAction")).toInt(); -- -- QDomNode node = element.firstChild(); -- while (!node.isNull()) { -- if (node.isComment()) { -- node = node.nextSibling(); -- continue; -- } -- QDomElement tempElement = node.toElement(); -- QString tag = tempElement.tagName(); -- if (UMLDoc::tagEq(tag, QLatin1String("AttributeMap"))) { -- -- QString xmiKey = tempElement.attribute(QLatin1String("key")); -- QString xmiValue = tempElement.attribute(QLatin1String("value")); -- Uml::ID::Type keyId = Uml::ID::fromString(xmiKey); -- Uml::ID::Type valueId = Uml::ID::fromString(xmiValue); -- -- UMLEntity* parentEntity = static_cast(parent()); -- UMLObject* keyObj = parentEntity->findChildObjectById(keyId); -- UMLEntityAttribute* key = static_cast(keyObj); -- -- if (keyObj == NULL) { -- uWarning() << "unable to resolve foreign key referencing attribute " << xmiKey; -- } else if (m_ReferencedEntity == NULL) { -- // if referenced entity is null, then we won't find its attributes even -- // save for resolving later -- m_pEntityAttributeIDMap.insert(key, valueId); -- } else { -- UMLObject* valueObj = m_ReferencedEntity->findChildObjectById(valueId); -- if (valueObj == NULL) { -- uWarning() << "unable to resolve foreign key referenced attribute" << xmiValue; -- } else { -- m_AttributeMap[key] = static_cast(valueObj); -- } -- } -- -- } else { -- uWarning() << "unknown child type in UMLForeignKeyConstraint::load"; -- } -- -- node = node.nextSibling(); -- } -- -- return true; --} -- --/** -- * Set the Referenced Entity. -- * @param ent The Entity to Reference -- */ --void UMLForeignKeyConstraint::setReferencedEntity(UMLEntity* ent) --{ -- if (ent == m_ReferencedEntity) -- return; -- -- m_ReferencedEntity = ent; -- -- emit sigReferencedEntityChanged(); --} -- --/** -- * Get the Referenced Entity. -- * @return the UML entity object -- */ --UMLEntity* UMLForeignKeyConstraint::getReferencedEntity() const --{ -- return m_ReferencedEntity; --} -- --/** -- * Slot for referenced entity changed. -- */ --void UMLForeignKeyConstraint::slotReferencedEntityChanged() --{ -- // clear all mappings -- m_AttributeMap.clear(); --} -- --/** -- * Clears all mappings between local and referenced attributes -- */ --void UMLForeignKeyConstraint::clearMappings() --{ -- m_AttributeMap.clear(); --} -- --/** -- * Remimplementation from base classes -- * Used to resolve forward references to referenced entities in xmi -- */ --bool UMLForeignKeyConstraint::resolveRef() --{ -- // resolve referenced entity first -- UMLDoc* doc = UMLApp::app()->document(); -- -- bool success = true; -- -- //resolve the referenced entity -- if (!Uml::ID::toString(m_pReferencedEntityID).isEmpty()) { -- UMLObject* obj = doc->findObjectById(m_pReferencedEntityID); -- m_ReferencedEntity = static_cast(obj); -- if (m_ReferencedEntity == NULL) { -- success = false; -- } -- } -- -- QMap::iterator i; -- for (i = m_pEntityAttributeIDMap.begin(); i!= m_pEntityAttributeIDMap.end() ; ++i) { -- if (!Uml::ID::toString(i.value()).isEmpty()) { -- UMLObject* obj = doc->findObjectById(i.value()); -- m_AttributeMap[i.key()] = static_cast(obj); -- if (m_AttributeMap[i.key()] == NULL) { -- success = false; -- } -- } -- } -- -- return success; --} -- --/** -- * Retrieve all Pairs of Attributes. -- */ --QMap UMLForeignKeyConstraint::getEntityAttributePairs() --{ -- return m_AttributeMap; --} -- --/** -- * Get the Delete Action. -- */ --UMLForeignKeyConstraint::UpdateDeleteAction UMLForeignKeyConstraint::getDeleteAction() const --{ -- return m_DeleteAction; --} -- --/** -- * Get the Update Action. -- */ --UMLForeignKeyConstraint::UpdateDeleteAction UMLForeignKeyConstraint::getUpdateAction() const --{ -- return m_UpdateAction; --} -- --/** -- * Set the Delete Action to the specified UpdateDeleteAction. -- */ --void UMLForeignKeyConstraint::setDeleteAction(UpdateDeleteAction uda) --{ -- m_DeleteAction = uda; --} -- --/** -- * Set the Update Action to the specified UpdateDeleteAction -- */ --void UMLForeignKeyConstraint::setUpdateAction(UpdateDeleteAction uda) --{ -- m_UpdateAction = uda; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/foreignkeyconstraint.h umbrello-kf6-15.08.1/umbrello/foreignkeyconstraint.h ---- umbrello-kf6-15.08.1.orig/umbrello/foreignkeyconstraint.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/foreignkeyconstraint.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,120 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef FOREIGNKEYCONSTRAINT_H --#define FOREIGNKEYCONSTRAINT_H -- --// appl includes --#include "basictypes.h" --#include "entityconstraint.h" -- --// qt includes --#include -- --//forward declarations --class UMLEntityAttribute; --class UMLEntity; -- --/** -- * This class is used to set up information for a foreign key entity constraint. -- * @short Sets up Foreign Key entity constraint information. -- * @author Sharan Rao -- * @see UMLObject UMLClassifierListItem UMLEntityConstraint -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLForeignKeyConstraint : public UMLEntityConstraint --{ -- Q_OBJECT -- --public: -- -- /** -- * Update/Delete Action: Action to be taken on Update or Delete of a referenced attribute -- * is either, No Action, Restrict, Cascade, Set NULL, Set Default. -- */ -- enum UpdateDeleteAction { uda_NoAction = 0, -- uda_Restrict, -- uda_Cascade, -- uda_SetNull, -- uda_SetDefault }; -- -- UMLForeignKeyConstraint(UMLObject *parent, const QString& name, -- Uml::ID::Type id = Uml::ID::None); -- explicit UMLForeignKeyConstraint(UMLObject *parent); -- -- bool operator==(const UMLForeignKeyConstraint &rhs) const; -- -- virtual ~UMLForeignKeyConstraint(); -- -- virtual void copyInto(UMLObject *lhs) const; -- -- virtual UMLObject* clone() const; -- -- QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -- -- void setReferencedEntity(UMLEntity* ent); -- UMLEntity* getReferencedEntity() const; -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- -- virtual bool showPropertiesDialog(QWidget* parent = 0); -- -- bool addEntityAttributePair(UMLEntityAttribute* pAttr, UMLEntityAttribute* rAttr); -- -- bool removeEntityAttributePair(UMLEntityAttribute* /*key*/ pAttr); -- -- bool hasEntityAttributePair(UMLEntityAttribute* pAttr, UMLEntityAttribute* rAttr) const; -- -- QMap getEntityAttributePairs(); -- -- void setDeleteAction(UpdateDeleteAction uda); -- UpdateDeleteAction getDeleteAction() const; -- -- void setUpdateAction(UpdateDeleteAction uda); -- UpdateDeleteAction getUpdateAction() const; -- -- void clearMappings(); -- -- bool resolveRef(); -- --signals: -- void sigReferencedEntityChanged(); -- --private slots: -- void slotReferencedEntityChanged(); -- --protected: -- bool load(QDomElement & element); -- --private: -- -- Uml::ID::Type m_pReferencedEntityID; ///< Used to resolve forward references to UMLEntity. -- -- /** -- * Used to resolve forward references to UMLEntityAttributes -- * Key -> The local attribute -- * Value -> Id of the attribute it is mapping to -- */ -- QMap m_pEntityAttributeIDMap; -- -- void init(); -- -- UMLEntity* m_ReferencedEntity; ///< The UMLEntity that this foreign key references. -- -- /** -- * Stores the Mapping of attributes between parent table and referenced table -- */ -- QMap m_AttributeMap; -- -- UpdateDeleteAction m_UpdateAction; ///< What to do on Update of referenced attributes. -- UpdateDeleteAction m_DeleteAction; ///< What to do on Deletion of referenced attributes. --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/listpopupmenu.cpp umbrello-kf6-15.08.1/umbrello/listpopupmenu.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/listpopupmenu.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/listpopupmenu.cpp 2015-10-08 11:48:59.500089026 +0300 -@@ -1195,7 +1195,6 @@ - void ListPopupMenu::makeClassifierShowPopup(ClassifierWidget *c) - { - WidgetBase::WidgetType type = c->baseType(); -- ClassifierWidget *cls = NULL; - - #if QT_VERSION >= 0x050000 - QMenu* show = new QMenu(i18n("Show"), this); -@@ -1208,9 +1207,8 @@ - setActionChecked(mt_Show_Documentation, c->visualProperty(ClassifierWidget::ShowDocumentation)); - #endif - if (type == WidgetBase::wt_Class) { -- cls = static_cast(c); - insert(mt_Show_Attributes, show, i18n("Attributes"), CHECKABLE); -- setActionChecked(mt_Show_Attributes, cls->visualProperty(ClassifierWidget::ShowAttributes)); -+ setActionChecked(mt_Show_Attributes, c->visualProperty(ClassifierWidget::ShowAttributes)); - } - insert(mt_Show_Operations, show, i18n("Operations"), CHECKABLE); - setActionChecked(mt_Show_Operations, c->visualProperty(ClassifierWidget::ShowOperations)); -@@ -1224,16 +1222,14 @@ - setActionChecked(mt_Show_Operation_Signature, sig); - if (type == WidgetBase::wt_Class) { - insert(mt_Show_Attribute_Signature, show, i18n("Attribute Signature"), CHECKABLE); -- sig = (cls->attributeSignature() == Uml::SignatureType::SigNoVis || -- cls->attributeSignature() == Uml::SignatureType::ShowSig); -+ sig = (c->attributeSignature() == Uml::SignatureType::SigNoVis || -+ c->attributeSignature() == Uml::SignatureType::ShowSig); - setActionChecked(mt_Show_Attribute_Signature, sig); - } - insert(mt_Show_Packages, show, i18n("Package"), CHECKABLE); - setActionChecked(mt_Show_Packages, c->visualProperty(ClassifierWidget::ShowPackage)); -- if (type == WidgetBase::wt_Class) { -- insert(mt_Show_Stereotypes, show, i18n("Stereotype"), CHECKABLE); -- setActionChecked(mt_Show_Stereotypes, cls->visualProperty(ClassifierWidget::ShowStereotype)); -- } -+ insert(mt_Show_Stereotypes, show, i18n("Stereotype"), CHECKABLE); -+ setActionChecked(mt_Show_Stereotypes, c->visualProperty(ClassifierWidget::ShowStereotype)); - addMenu(show); - } - -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/node.cpp umbrello-kf6-15.08.1/umbrello/node.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/node.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/node.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,68 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "node.h" -- --#include -- --/** -- * Sets up a Node. -- * -- * @param name The name of the Concept. -- * @param id The unique id of the Concept. -- */ --UMLNode::UMLNode(const QString & name, Uml::ID::Type id) -- : UMLCanvasObject(name, id) --{ -- init(); --} -- --/** -- * Destructor. -- */ --UMLNode::~UMLNode() --{ --} -- --/** -- * Initializes key variables of the class. -- */ --void UMLNode::init() --{ -- m_BaseType = UMLObject::ot_Node; --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLNode::clone() const --{ -- UMLNode *clone = new UMLNode(); -- UMLObject::copyInto(clone); -- return clone; --} -- --/** -- * Creates the XMI element. -- */ --void UMLNode::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement nodeElement = UMLObject::save(QLatin1String("UML:Node"), qDoc); -- qElement.appendChild(nodeElement); --} -- --/** -- * Loads the XMI element (empty.) -- */ --bool UMLNode::load(QDomElement&) --{ -- return true; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/node.h umbrello-kf6-15.08.1/umbrello/node.h ---- umbrello-kf6-15.08.1.orig/umbrello/node.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/node.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,46 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef NODE_H --#define NODE_H -- --#include "umlcanvasobject.h" -- --/** -- * This class contains the non-graphical information required for a UML Node. -- * This class inherits from @ref UMLCanvasObject which contains most of the -- * information. -- * -- * @short Non-graphical information for a Node. -- * @author Jonathan Riddell -- * @see UMLCanvasObject -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLNode : public UMLCanvasObject --{ -- Q_OBJECT --public: -- -- explicit UMLNode(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -- virtual ~UMLNode(); -- -- virtual void init(); -- -- virtual UMLObject* clone() const; -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- --protected: -- -- bool load(QDomElement & element); -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/operation.cpp umbrello-kf6-15.08.1/umbrello/operation.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/operation.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/operation.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,611 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "operation.h" -- --// app includes --#include "attribute.h" --#include "classifier.h" --#include "model_utils.h" --#include "debug_utils.h" --#include "uml.h" --#include "umldoc.h" --#include "uniqueid.h" --#include "umloperationdialog.h" --#include "codegenerator.h" --#include "codedocument.h" --#include "codeblock.h" -- --// kde includes --#include -- --// qt includes --#include -- --/** -- * Constructs an UMLOperation. -- * Not intended for general use: The operation is not tied in with -- * umbrello-kf6's Qt signalling for object creation. -- * If you want to create an Operation use the method in UMLDoc instead. -- * -- * @param parent the parent to this operation -- * @param name the name of the operation -- * @param id the id of the operation -- * @param s the visibility of the operation -- * @param rt the return type of the operation -- */ --UMLOperation::UMLOperation(UMLClassifier *parent, const QString& name, -- Uml::ID::Type id, Uml::Visibility::Enum s, UMLObject *rt) -- : UMLClassifierListItem(parent, name, id) --{ -- if (rt) -- m_returnId = UniqueID::gen(); -- else -- m_returnId = Uml::ID::None; -- m_pSecondary = rt; -- m_visibility = s; -- m_BaseType = UMLObject::ot_Operation; -- m_bConst = false; -- m_Code.clear(); --} -- --/** -- * Constructs an UMLOperation. -- * Not intended for general use: The operation is not tied in with -- * umbrello-kf6's Qt signalling for object creation. -- * If you want to create an Operation use the method in UMLDoc instead. -- * -- * @param parent the parent to this operation -- */ --UMLOperation::UMLOperation(UMLClassifier * parent) -- : UMLClassifierListItem (parent) --{ -- m_BaseType = UMLObject::ot_Operation; -- m_bConst = false; -- m_Code.clear(); --} -- --/** -- * Destructor. -- */ --UMLOperation::~UMLOperation() --{ --} -- --/** -- * Reimplement method from UMLClassifierListItem. -- * -- * @param type pointer to the type object -- */ --void UMLOperation::setType(UMLObject* type) --{ -- UMLClassifierListItem::setType(type); -- if (m_returnId == Uml::ID::None) -- m_returnId = UniqueID::gen(); --} -- --/** -- * Move a parameter one position to the left. -- * -- * @param a the parameter to move -- */ --void UMLOperation::moveParmLeft(UMLAttribute * a) --{ -- if (a == NULL) { -- uDebug() << "called on NULL attribute"; -- return; -- } -- uDebug() << "called for " << a->name(); -- disconnect(a, SIGNAL(modified()), this, SIGNAL(modified())); -- int idx; -- if ((idx=m_List.indexOf(a)) == -1) { -- uDebug() << "Error move parm left " << a->name(); -- return; -- } -- if (idx == 0) -- return; -- m_List.removeAll(a); -- m_List.insert(idx-1, a); --} -- --/** -- * Move a parameter one position to the right. -- * -- * @param a the parameter to move -- */ --void UMLOperation::moveParmRight(UMLAttribute * a) --{ -- if (a == NULL) { -- uDebug() << "called on NULL attribute"; -- return; -- } -- uDebug() << "called for " << a->name(); -- disconnect(a, SIGNAL(modified()), this, SIGNAL(modified())); -- int idx; -- if ((idx=m_List.indexOf(a)) == -1) { -- uDebug() << "Error move parm right " << a->name(); -- return; -- } -- int count = m_List.count(); -- if (idx == count-1) -- return; -- m_List.removeAll(a); -- m_List.insert(idx+1, a); --} -- --/** -- * Remove a parameter from the operation. -- * -- * @param a the parameter to remove -- * @param emitModifiedSignal whether to emit the "modified" signal -- * which creates an entry in the Undo stack for the -- * removal, default: true -- */ --void UMLOperation::removeParm(UMLAttribute * a, bool emitModifiedSignal /* =true */) --{ -- if (a == NULL) { -- uDebug() << "called on NULL attribute"; -- return; -- } -- uDebug() << "called for " << a->name(); -- disconnect(a, SIGNAL(modified()), this, SIGNAL(modified())); -- if(!m_List.removeAll(a)) -- uDebug() << "Error removing parm " << a->name(); -- -- if (emitModifiedSignal) -- emit modified(); --} -- --/** -- * Returns a list of parameters. -- * -- * @return a list of the parameters in the operation -- */ --UMLAttributeList UMLOperation::getParmList() const --{ -- return m_List; --} -- --/** -- * Finds a parameter of the operation. -- * -- * @param name the parameter name to search for -- * @return the found parameter, 0 if not found -- */ --UMLAttribute* UMLOperation::findParm(const QString &name) --{ -- UMLAttribute * obj=0; -- foreach (obj, m_List) { -- if (obj->name() == name) -- return obj; -- } -- return 0; --} -- --/** -- * Returns a string representation of the operation. -- * -- * @param sig what type of operation string to show -- * @return the string representation of the operation -- */ --QString UMLOperation::toString(Uml::SignatureType::Enum sig) --{ -- QString s; -- -- if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::NoSig) -- s = Uml::Visibility::toString(m_visibility, true) + QLatin1Char(' '); -- -- s += name(); -- Uml::ProgrammingLanguage::Enum pl = UMLApp::app()->activeLanguage(); -- bool parameterlessOpNeedsParentheses = -- (pl != Uml::ProgrammingLanguage::Pascal && pl != Uml::ProgrammingLanguage::Ada); -- -- if (sig == Uml::SignatureType::NoSig || sig == Uml::SignatureType::NoSigNoVis) { -- if (parameterlessOpNeedsParentheses) -- s.append(QLatin1String("()")); -- return s; -- } -- int last = m_List.count(); -- if (last) { -- s.append(QLatin1String("(")); -- int i = 0; -- foreach (UMLAttribute *param, m_List) { -- i++; -- s.append(param->toString(Uml::SignatureType::SigNoVis)); -- if (i < last) -- s.append(QLatin1String(", ")); -- } -- s.append(QLatin1String(")")); -- } else if (parameterlessOpNeedsParentheses) { -- s.append(QLatin1String("()")); -- } -- UMLClassifier *ownParent = static_cast(parent()); -- QString returnType; -- UMLClassifier *retType = UMLClassifierListItem::getType(); -- if (retType) { -- UMLPackage *retVisibility = retType->umlPackage(); -- if (retVisibility != ownParent && retVisibility != ownParent->umlPackage()) -- returnType = retType->fullyQualifiedName(); -- else -- returnType = retType->name(); -- } -- if (returnType.length() > 0 && returnType != QLatin1String("void")) { -- s.append(QLatin1String(" : ")); -- -- if (returnType.startsWith(QLatin1String(QLatin1String("virtual ")))) { -- s += returnType.mid(8); -- } else { -- s += returnType; -- } -- } -- return s; --} -- --/** -- * Add a parameter to the operation. -- * -- * @param parameter the parameter to add -- * @param position the position in the parameter list. -- * If position = -1 the parameter will be -- * appended to the list. -- */ --void UMLOperation::addParm(UMLAttribute *parameter, int position) --{ -- if(position >= 0 && position <= (int)m_List.count()) -- m_List.insert(position, parameter); -- else -- m_List.append(parameter); -- UMLObject::emitModified(); -- connect(parameter, SIGNAL(modified()), this, SIGNAL(modified())); --} -- --/** -- * Returns an unused parameter name for a new parameter. -- */ --QString UMLOperation::getUniqueParameterName() --{ -- QString currentName = i18n("new_parameter"); -- QString name = currentName; -- for (int number = 1; findParm(name); ++number) { -- name = currentName + QLatin1Char('_') + QString::number(number); -- } -- return name; --} -- --/** -- * Overloaded '==' operator. -- */ --bool UMLOperation::operator==(const UMLOperation & rhs) const --{ -- if (this == &rhs) -- return true; -- -- if (!UMLObject::operator==(rhs)) -- return false; -- -- if (getTypeName() != rhs.getTypeName()) -- return false; -- -- if (m_List.count() != rhs.m_List.count()) -- return false; -- -- if (!(m_List == rhs.m_List)) -- return false; -- -- return true; --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLOperation::copyInto(UMLObject *lhs) const --{ -- UMLOperation *target = static_cast(lhs); -- -- UMLClassifierListItem::copyInto(target); -- -- m_List.copyInto(&(target->m_List)); --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLOperation::clone() const --{ -- //FIXME: The new operation should be slaved to the NEW parent not the old. -- UMLOperation *clone = new UMLOperation(static_cast(parent())); -- copyInto(clone); -- -- return clone; --} -- --/** -- * Calls resolveRef() on all parameters. -- * Needs to be called after all UML objects are loaded from file. -- * -- * @return true for success -- */ --bool UMLOperation::resolveRef() --{ -- bool overallSuccess = UMLObject::resolveRef(); -- // See remark on iteration style in UMLClassifier::resolveRef() -- foreach (UMLAttribute* pAtt, m_List) { -- if (! pAtt->resolveRef()) -- overallSuccess = false; -- } -- return overallSuccess; --} -- --/** -- * Returns whether this operation is a constructor. -- * -- * @return true if this operation is a constructor -- */ --bool UMLOperation::isConstructorOperation() --{ -- // if an operation has the stereotype constructor -- // return true -- if (stereotype() == QLatin1String("constructor")) -- return true; -- -- UMLClassifier * c = static_cast(this->parent()); -- QString cName = c->name(); -- QString opName = name(); -- // It's a constructor operation if the operation name -- // matches that of the parent classifier. -- return (cName == opName); --} -- --/** -- * Returns whether this operation is a destructor. -- * -- * @return true if this operation is a destructor -- */ --bool UMLOperation::isDestructorOperation() --{ -- if (stereotype() == QLatin1String("destructor")) -- return true; -- UMLClassifier * c = static_cast(this->parent()); -- -- QString cName = c->name(); -- QString opName = name(); -- // Special support for C++ syntax: -- // It's a destructor operation if the operation name begins -- // with "~" followed by the name of the parent classifier. -- if (! opName.startsWith(QLatin1Char('~'))) -- return false; -- opName.remove(QRegExp(QLatin1String("^~\\s*"))); -- return (cName == opName); --} -- --/** -- * Shortcut for (isConstructorOperation() || isDestructorOperation()). -- * -- * @return true if this operation is a constructor or destructor -- */ --bool UMLOperation::isLifeOperation() --{ -- return (isConstructorOperation() || isDestructorOperation()); --} -- --/** -- * Sets whether this operation is a query (C++ "const"). -- */ --void UMLOperation::setConst(bool b) --{ -- m_bConst = b; --} -- --/** -- * Returns whether this operation is a query (C++ "const"). -- */ --bool UMLOperation::getConst() const --{ -- return m_bConst; --} -- --/** -- * Display the properties configuration dialog for the template. -- * -- * @param parent the parent for the dialog -- */ --bool UMLOperation::showPropertiesDialog(QWidget* parent) --{ -- UMLOperationDialog dialog(parent, this); -- return dialog.exec(); --} -- --/** -- * Sets the source code for this operation. -- * -- * @param code the body of this operation -- */ --void UMLOperation::setSourceCode(const QString& code) --{ -- m_Code = code; --} -- --/** -- * Returns the source code for this operation. -- */ --QString UMLOperation::getSourceCode() const --{ -- return m_Code; --} -- --/** -- * Saves to the XMI element. -- */ --void UMLOperation::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement operationElement = UMLObject::save(QLatin1String("UML:Operation"), qDoc); -- operationElement.setAttribute(QLatin1String("isQuery"), m_bConst ? QLatin1String("true") : QLatin1String("false")); -- QDomElement featureElement = qDoc.createElement(QLatin1String("UML:BehavioralFeature.parameter")); -- if (m_pSecondary) { -- QDomElement retElement = qDoc.createElement(QLatin1String("UML:Parameter")); -- if (m_returnId == Uml::ID::None) { -- uDebug() << name() << ": m_returnId is not set, setting it now."; -- m_returnId = UniqueID::gen(); -- } -- retElement.setAttribute(QLatin1String("xmi.id"), Uml::ID::toString(m_returnId)); -- retElement.setAttribute(QLatin1String("type"), Uml::ID::toString(m_pSecondary->id())); -- retElement.setAttribute(QLatin1String("kind"), QLatin1String("return")); -- featureElement.appendChild(retElement); -- } else { -- uDebug() << "m_SecondaryId is " << m_SecondaryId; -- } -- -- //save each attribute here, type different -- foreach(UMLAttribute* pAtt, m_List) { -- QDomElement attElement = pAtt->UMLObject::save(QLatin1String("UML:Parameter"), qDoc); -- UMLClassifier *attrType = pAtt->getType(); -- if (attrType) { -- attElement.setAttribute(QLatin1String("type"), Uml::ID::toString(attrType->id())); -- } else { -- attElement.setAttribute(QLatin1String("type"), pAtt->getTypeName()); -- } -- attElement.setAttribute(QLatin1String("value"), pAtt->getInitialValue()); -- -- Uml::ParameterDirection::Enum kind = pAtt->getParmKind(); -- if (kind == Uml::ParameterDirection::Out) -- attElement.setAttribute(QLatin1String("kind"), QLatin1String("out")); -- else if (kind == Uml::ParameterDirection::InOut) -- attElement.setAttribute(QLatin1String("kind"), QLatin1String("inout")); -- // The default for the parameter kind is "in". -- -- featureElement.appendChild(attElement); -- } -- if (featureElement.hasChildNodes()) { -- operationElement.appendChild(featureElement); -- } -- qElement.appendChild(operationElement); --} -- --/** -- * Loads a XMI element. -- */ --bool UMLOperation::load(QDomElement & element) --{ -- m_SecondaryId = element.attribute(QLatin1String("type")); -- QString isQuery = element.attribute(QLatin1String("isQuery")); -- if (!isQuery.isEmpty()) { -- // We need this extra test for isEmpty() because load() might have been -- // called again by the processing for BehavioralFeature.parameter (see below) -- m_bConst = (isQuery == QLatin1String("true")); -- } -- QDomNode node = element.firstChild(); -- if (node.isComment()) -- node = node.nextSibling(); -- QDomElement attElement = node.toElement(); -- while (!attElement.isNull()) { -- QString tag = attElement.tagName(); -- if (UMLDoc::tagEq(tag, QLatin1String("BehavioralFeature.parameter")) || -- UMLDoc::tagEq(tag, QLatin1String("Element.ownedElement"))) { // Embarcadero's Describe -- if (! load(attElement)) -- return false; -- } else if (UMLDoc::tagEq(tag, QLatin1String("Parameter"))) { -- QString kind = attElement.attribute(QLatin1String("kind")); -- if (kind.isEmpty()) { -- kind = attElement.attribute(QLatin1String("direction")); // Embarcadero's Describe -- if (kind.isEmpty()) { -- // Perhaps the kind is stored in a child node: -- for (QDomNode n = attElement.firstChild(); !n.isNull(); n = n.nextSibling()) { -- if (n.isComment()) -- continue; -- QDomElement tempElement = n.toElement(); -- QString tag = tempElement.tagName(); -- if (!UMLDoc::tagEq(tag, QLatin1String("kind"))) -- continue; -- kind = tempElement.attribute(QLatin1String("xmi.value")); -- break; -- } -- } -- if (kind.isEmpty()) { -- kind = QLatin1String("in"); -- } -- } -- if (kind == QLatin1String("return") || -- kind == QLatin1String("result")) { // Embarcadero's Describe -- QString returnId = Model_Utils::getXmiId(attElement); -- if (!returnId.isEmpty()) -- m_returnId = Uml::ID::fromString(returnId); -- m_SecondaryId = attElement.attribute(QLatin1String("type")); -- if (m_SecondaryId.isEmpty()) { -- // Perhaps the type is stored in a child node: -- QDomNode node = attElement.firstChild(); -- while (!node.isNull()) { -- if (node.isComment()) { -- node = node.nextSibling(); -- continue; -- } -- QDomElement tempElement = node.toElement(); -- QString tag = tempElement.tagName(); -- if (!UMLDoc::tagEq(tag, QLatin1String("type"))) { -- node = node.nextSibling(); -- continue; -- } -- m_SecondaryId = Model_Utils::getXmiId(tempElement); -- if (m_SecondaryId.isEmpty()) -- m_SecondaryId = tempElement.attribute(QLatin1String("xmi.idref")); -- if (m_SecondaryId.isEmpty()) { -- QDomNode inner = node.firstChild(); -- QDomElement tmpElem = inner.toElement(); -- m_SecondaryId = Model_Utils::getXmiId(tmpElem); -- if (m_SecondaryId.isEmpty()) -- m_SecondaryId = tmpElem.attribute(QLatin1String("xmi.idref")); -- } -- break; -- } -- if (m_SecondaryId.isEmpty()) { -- uError() << name() << ": cannot find return type."; -- } -- } -- // Use deferred xmi.id resolution. -- m_pSecondary = NULL; -- } else { -- UMLAttribute * pAtt = new UMLAttribute(this); -- if(!pAtt->loadFromXMI(attElement)) { -- delete pAtt; -- return false; -- } -- if (kind == QLatin1String("out")) -- pAtt->setParmKind(Uml::ParameterDirection::Out); -- else if (kind == QLatin1String("inout")) -- pAtt->setParmKind(Uml::ParameterDirection::InOut); -- else -- pAtt->setParmKind(Uml::ParameterDirection::In); -- m_List.append(pAtt); -- } -- } -- node = node.nextSibling(); -- if (node.isComment()) -- node = node.nextSibling(); -- attElement = node.toElement(); -- -- // loading the source code which was entered in the 'classpropdlg' dialog is not done -- // with the following code, because there is no CodeDocument. -- /* -- CodeGenerator* codegen = UMLApp::app()->getGenerator(); -- if (codegen) { -- uDebug() << "CodeDocument searching with id=" << Uml::ID::toString(UMLObject::ID()); -- CodeDocument* codeDoc = codegen->findCodeDocumentByID(Uml::ID::toString(UMLObject::ID())); -- if (codeDoc) { -- uDebug() << "CodeDocument found:\n" << codeDoc; -- } -- } -- */ -- // it is done in the code generators by calling CodeGenerator::loadFromXMI(...). -- -- }//end while -- return true; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/operation.h umbrello-kf6-15.08.1/umbrello/operation.h ---- umbrello-kf6-15.08.1.orig/umbrello/operation.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/operation.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,84 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef OPERATION_H --#define OPERATION_H -- --#include "umlattributelist.h" --#include "classifierlistitem.h" -- --class UMLClassifier; -- --/** -- * This class represents an operation in the UML model. -- * -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLOperation : public UMLClassifierListItem --{ -- Q_OBJECT --public: -- UMLOperation(UMLClassifier * parent, const QString& name, -- Uml::ID::Type id = Uml::ID::None, -- Uml::Visibility::Enum s = Uml::Visibility::Public, -- UMLObject *rt = 0); -- explicit UMLOperation(UMLClassifier * parent); -- virtual ~UMLOperation(); -- -- bool operator==(const UMLOperation & rhs) const; -- -- virtual void copyInto(UMLObject *lhs) const; -- -- virtual UMLObject* clone() const; -- -- void setType(UMLObject* type); -- -- void moveParmLeft(UMLAttribute *a); -- void moveParmRight(UMLAttribute *a); -- -- void removeParm(UMLAttribute *a, bool emitModifiedSignal = true); -- -- UMLAttributeList getParmList() const; -- -- UMLAttribute * findParm(const QString &name); -- -- QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -- -- void addParm(UMLAttribute *parameter, int position = -1); -- -- bool resolveRef(); -- -- QString getUniqueParameterName(); -- -- virtual bool showPropertiesDialog(QWidget* parent = 0); -- -- bool isConstructorOperation(); -- bool isDestructorOperation(); -- bool isLifeOperation(); -- -- void setConst(bool b); -- bool getConst() const; -- -- void setSourceCode(const QString& code); -- QString getSourceCode() const; -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- --protected: -- bool load(QDomElement & element); -- --private: -- Uml::ID::Type m_returnId; ///< Holds the xmi.id of the -- UMLAttributeList m_List; ///< Parameter list -- bool m_bConst; ///< Holds the isQuery attribute of the -- QString m_Code; ///< Holds the entered source code --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/org.kde.umbrello-kf6.appdata.xml umbrello-kf6-15.08.1/umbrello/org.kde.umbrello-kf6.appdata.xml ---- umbrello-kf6-15.08.1.orig/umbrello/org.kde.umbrello-kf6.appdata.xml 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/org.kde.umbrello-kf6.appdata.xml 2015-10-08 11:48:59.501089026 +0300 -@@ -0,0 +1,136 @@ -+ -+ -+ org.kde.umbrello-kf6.desktop -+ CC0-1.0 -+ GPL-2.0+ -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ umbrello-kf6 -+ xxumbrello-kf6xx -+ UML Modeller -+ Modelador UML -+ UML modelář -+ UML-Modeller -+ UML Modeller -+ Modelador UML -+ UML-i modelleerimise rakendus -+ UML-mallinnusohjelma -+ Modelador de UML -+ Modellatore UML -+ UML-modeller -+ Program do modelowania UML -+ Modelador de UML -+ Modelador de UML -+ Modelár UML -+ Modelirnik UML -+ UML-modellering -+ Засіб моделювання UML -+ xxUML Modellerxx -+ -+

-+ umbrello-kf6 is a Unified Modelling Language (UML) modelling tool and code generator. -+ It can create diagrams of software and other systems in the industry-standard UML format, and can also generate code from UML diagrams -+ in a variety of programming languages. -+

-+

L'umbrello-kf6 és una eina de modelatge de Llenguatge Unificat de Modelatge (UML) i generador de codi. Pot crear diagrames de programari i altres sistemes en el format UML estàndard de la indústria, i també pot generar codi des de diagrames UML en diversos llenguatges de programació.

-+

umbrello-kf6 is a Unified Modelling Language (UML) modelling tool and code generator. It can create diagrams of software and other systems in the industry-standard UML format, and can also generate code from UML diagrams in a variety of programming languages.

-+

umbrello-kf6 es una herramienta de modelado y de generación de código para el lenguaje unificado de modelado (UML). Puede crear diagramas de software y de otros sistemas en el formato estándar de la industria UML, además de generar código a partir de diagramas UML en diversos lenguajes de programación.

-+

umbrello-kf6 on unifitseeritud modelleerimiskeele UML modelleerimistööriist ja koodi genereerija. See võib luua tarkvara ja muude süsteemide skeeme standardses UML-vormingus, samuti genereerida UML-skeemide põhjal koodi mitmes programmeerimiskeeles.

-+

umbrello-kf6 on UML-mallinnusohjelma. umbrello-kf6lla voi luoda kaavioita ohjelmistoista ja muista järjestelmistä käyttäen standardia UML-muotoa. Sillä voi myös luoda koodin UML-kaavioiden perusteella useille ohjelmointikielille.

-+

umbrello-kf6 é unha ferramenta de modelaxe e xerador de código baseado na linguaxe de modelaxe UML. Pode crear diagramas de software e doutros sistemas usando o formato estándar da industria, UML, e pode tamén xerar código a partir de diagramas UML en varios linguaxes de programación.

-+

umbrello-kf6 è uno strumento per diagrammi UML e un generatore di codice. Può creare diagrammi di software e altri sistemi nello standard industriale UML, e può anche generare codice partendo dai diagrammi UML in diversi linguaggi di programmazione.

-+

umbrello-kf6 is een Unified Modelling Language (UML) hulpmiddel voor modellering en generator van code. Het kan diagrammen van software en andere systemen maken in het industrie-standaard UML-formaat en kan ook code genereren uit UML diagrammen in een verscheidenheid van programmeertalen.

-+

umbrello-kf6 jest Unified Modelling Language (UML) (z ang. Językiem do Jednolitego Modelowania) i generatorem kodu. Może tworzyć diagramy oprogramowania i innych systemów w formacie standardu przemysłowego UML, a także generować kod z diagramów UML w wielu językach programowania.

-+

O umbrello-kf6 é uma ferramenta de modelação em UML (Unified Modelling Language) e gerador de código. Poderá criar diagramas de aplicações e outros sistemas, usando o formato-padrão da indústria UML, podendo também gerar código a partir de diagramas UML, numa grande variedade de linguagens de programação.

-+

umbrello-kf6 é uma ferramenta de modelação de UML (Unified Modelling Language) e gerador de código. Ele pode criar diagramas de softwares e outros sistemas, usando o formato de UML padrão da indústria, assim como gerar código a partir de diagramas UML, em uma grande variedade de linguagens de programação.

-+

umbrello-kf6 je nástroj na modelovania v UML a generátor kódu. Dokáže vytvárať diagramy softvéru a iných systémov v priemyselnom štandarde UML a tiež generovať kód z UML diagramov v množstve programovacích jazykov.

-+

umbrello-kf6 je orodje za modeliranje v poenotenem jeziku za modeliranje (UML) in ustvarjalnik kode. Ustvari lahko diagrame programov in drugih sistemov v industrijski standardizirani obliki UML, iz diagramov UML pa lahko ustvari tudi kodo v različnih programskih jezikih.

-+

umbrello-kf6 är ett modelleringsverktyg för Unified Modelling Language och kodgenerator. Det kan skapa diagram av programvara och andra system med industristandardformatet UML, och kan också skapa kod från UML-diagram på ett antal olika programspråk.

-+

umbrello-kf6 — засіб моделювання уніфікованою мовою моделювання (UML) та інструмент для створення шаблонів коду. Програма здатна створювати діаграми систем програмного забезпечення та інших систем у стандартному форматі UML та реалізовувати діаграми UML у програмному коді багатьма мовами програмування.

-+

xxumbrello-kf6 is a Unified Modelling Language (UML) modelling tool and code generator. It can create diagrams of software and other systems in the industry-standard UML format, and can also generate code from UML diagrams in a variety of programming languages.xx

-+

Features:

-+

Característiques:

-+

Vlastnosti:

-+

Funktionen:

-+

Features:

-+

Funciones:

-+

Omadused:

-+

Ominaisuuksia:

-+

Funcionalidades:

-+

Funzionalità:

-+

Kenmerken:

-+

Możliwości:

-+

Funcionalidades:

-+

Funcionalidades:

-+

Funkcie:

-+

Zmožnosti:

-+

Funktioner:

-+

Можливості:

-+

xxFeatures:xx

-+
    -+
  • Supported formats: XMI
  • -+
  • Formats acceptats: XMI
  • -+
  • Podporované formáty: XMI
  • -+
  • Unterstützte Formate: XMI
  • -+
  • Supported formats: XMI
  • -+
  • Formatos permitidos: XMI
  • -+
  • Toetatud vormingud: XMI
  • -+
  • Tukee XMI-tiedostomuotoa
  • -+
  • Formatos compatíbeis: XMI.
  • -+
  • Formati supportati: XMI
  • -+
  • Ondersteunde formaten: XMI
  • -+
  • Obsługiwane formaty: XMI
  • -+
  • Formatos suportados: XMI
  • -+
  • Formatos suportados: XMI
  • -+
  • Podporované formáty: XMI
  • -+
  • Podprte oblike: XMI
  • -+
  • Format som stöds: XMI
  • -+
  • Підтримувані формати: XMI
  • -+
  • xxSupported formats: XMIxx
  • -+
  • Several type of diagrams supported: use case, class, sequence, collaboration, state, activity, component, deployment, entity relationship
  • -+
  • Es permeten diversos tipus de diagrames: cas d'ús, classe, seqüència, col·laboració, estat, activitat, component, desplegament, entitat relació
  • -+
  • Several type of diagrams supported: use case, class, sequence, collaboration, state, activity, component, deployment, entity relationship
  • -+
  • Permite usar varios tipos de diagramas: casos de uso, clase, secuencia, colaboración, estado, actividad, componente, despliegue y relación de entidades
  • -+
  • Toetatud on mitut tüüpi skeemid: kasutus, klass, järgnevus, koostöö, olek, tegevus, komponent, evitus, olem-seos
  • -+
  • Tukee monenlaisia kaavioita: käyttötapauskaavio, luokkakaavio, sekvenssikaavio, yhteistyökaavio, tilakaavio, aktiviteettikaavio, komponenttikaavio, sijoittelukaavio, käsitekaavio
  • -+
  • Permite traballar con varios tipos de diagramas: caso de uso, clase, secuencia, colaboración, estado, actividade, compoñente, distribución, e entidade-relación.
  • -+
  • Diversi tipi di diagrammi supportati: casi d'uso, classe, sequenza, collaborazione, stato, attività, componente, dispiegamento, relazione tra entità
  • -+
  • Verschillende typen diagrammen worden ondersteund: use case, klassen, volgorde, samenwerking, status, activiteit, component, deployment, relaties tussen eenheden
  • -+
  • Kilka obsługiwanych rodzajów diagramów: przypadki użycia, klasy, sekwencje, kolaboracje, stany, aktywności, składniki, zastosowanie, współzależności obiektów
  • -+
  • Diversos tipos de diagramas suportados: casos de uso, classe, sequência, colaboração, estado, actividade, componente, entrada em produção, entidade-associação
  • -+
  • Há suporte para diversos tipos de diagramas: casos de uso, classe, sequência, colaboração, estado, atividade, componente, distribuição, relacionamento de entidade
  • -+
  • Podporovaných je niekoľko typov diagramov: prípady použitia, triedy, sekvencie, stavy, aktivity, nasadenie, vzžahy entít
  • -+
  • Podprte so številne vrste diagramov: primer uporabe, razred, zaporedje, sodelovanje, stanje, dejavnost, sestavni del, namestitev, odvisnost entitete
  • -+
  • Flera diagramtyper stöds: användningsfall, klass, sekvens, samarbete, tillstånd, aktivitet, komponent, utplacering, objektsamband
  • -+
  • Підтримка декількох типів діаграм: випадків використання, класів, послідовності, співпраці, станів, компонент, розміщення та взаємозв’язку компонентів.
  • -+
  • xxSeveral type of diagrams supported: use case, class, sequence, collaboration, state, activity, component, deployment, entity relationshipxx
  • -+
-+
-+ http://umbrello-kf6.kde.org -+ https://bugs.kde.org/enter_bug.cgi?format=guided&product=umbrello-kf6 -+ http://docs.kde.org/stable/en/kdesdk/umbrello/index.html -+ -+ -+ http://kde.org/images/screenshots/umbrello-kf6.png -+ -+ -+ KDE -+ -+ umbrello-kf6 -+ -+
-diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/package.cpp umbrello-kf6-15.08.1/umbrello/package.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/package.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/package.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,461 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header file --#include "package.h" -- --// local includes --#include "debug_utils.h" --#include "dialog_utils.h" --#include "uml.h" --#include "umldoc.h" --#include "classifier.h" --#include "association.h" --#include "entity.h" --#include "object_factory.h" --#include "model_utils.h" -- --// kde includes --#if QT_VERSION < 0x050000 --#include --#endif --#include --#include -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#endif -- --using namespace Uml; -- --/** -- * Sets up a Package. -- * @param name The name of the Concept. -- * @param id The unique id of the Concept. -- */ --UMLPackage::UMLPackage(const QString & name, Uml::ID::Type id) -- : UMLCanvasObject(name, id) --{ -- m_BaseType = ot_Package; --} -- --/** -- * Destructor. -- */ --UMLPackage::~UMLPackage() --{ --} -- --/** -- * Copy the internal presentation of this object into the new object. -- */ --void UMLPackage::copyInto(UMLObject *lhs) const --{ -- UMLPackage *target = static_cast(lhs); -- -- UMLCanvasObject::copyInto(target); -- -- m_objects.copyInto(&(target->m_objects)); --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLPackage::clone() const --{ -- UMLPackage *clone = new UMLPackage(); -- copyInto(clone); -- -- return clone; --} -- --/** -- * Adds an existing association to the matching concept in the list of concepts. -- * The selection of the matching concept depends on the association type: -- * For generalizations, the assoc is added to the concept that matches role A. -- * For aggregations and compositions, the assoc is added to the concept -- * that matches role B. -- * @param assoc the association to add -- */ --void UMLPackage::addAssocToConcepts(UMLAssociation* assoc) --{ -- if (! AssociationType::hasUMLRepresentation(assoc->getAssocType())) -- return; -- Uml::ID::Type AId = assoc->getObjectId(Uml::RoleType::A); -- Uml::ID::Type BId = assoc->getObjectId(Uml::RoleType::B); -- UMLObject *o = NULL; -- for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -- o = oit.next(); -- UMLCanvasObject *c = dynamic_cast(o); -- if (c == NULL) -- continue; -- if (AId == c->id() || (BId == c->id())) { -- if (c->hasAssociation(assoc)) -- uDebug() << c->name() << " already has association id=" << Uml::ID::toString(assoc->id()); -- else -- c->addAssociationEnd(assoc); -- } -- UMLPackage *pkg = dynamic_cast(c); -- if (pkg) -- pkg->addAssocToConcepts(assoc); -- } --} -- --/** -- * Remove the association from the participating concepts. -- * @param assoc the association to remove -- */ --void UMLPackage::removeAssocFromConcepts(UMLAssociation *assoc) --{ -- UMLObject *o = 0; -- for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -- o = oit.next(); -- UMLCanvasObject *c = dynamic_cast(o); -- if (c) { -- if (c->hasAssociation(assoc)) -- c->removeAssociationEnd(assoc); -- UMLPackage *pkg = dynamic_cast(c); -- if (pkg) -- pkg->removeAssocFromConcepts(assoc); -- } -- } --} -- --/** -- * Adds an object in this package. -- * -- * @param pObject Pointer to the UMLObject to add. -- * @return True if the object was actually added. -- */ --bool UMLPackage::addObject(UMLObject *pObject) --{ -- if (pObject == NULL) { -- uError() << "is called with a NULL object"; -- return false; -- } -- if (pObject == this) { -- uError() << "adding myself as child is not allowed"; -- return false; -- } -- -- if (m_objects.indexOf(pObject) != -1) { -- uDebug() << pObject->name() << " is already there"; -- return false; -- } -- if (pObject->baseType() == UMLObject::ot_Association) { -- UMLAssociation *assoc = static_cast(pObject); -- // Adding the UMLAssociation at the participating concepts is done -- // again later (in UMLAssociation::resolveRef()) if they are not yet -- // known right here. -- if (assoc->getObject(Uml::RoleType::A) && assoc->getObject(Uml::RoleType::B)) { -- UMLPackage *pkg = pObject->umlPackage(); -- if (pkg != this) { -- uError() << "UMLPackage " << name() << " addObject: " -- << "assoc's UMLPackage is " << pkg->name(); -- } -- addAssocToConcepts(assoc); -- } -- } -- else { -- QString name = pObject->name(); -- QString oldName = name; -- while (findObject(name) != NULL) { -- QString prevName = name; -- name = Model_Utils::uniqObjectName(pObject->baseType(), this); -- bool ok = Dialog_Utils::askName(i18nc("object name", "Name"), -- i18n("An object with the name %1\nalready exists in the package %2.\nPlease enter a new name:", prevName, this->name()), -- name); -- if (!ok) { -- name = oldName; -- continue; -- } -- if (name.length() == 0) { -- KMessageBox::error(0, i18n("That is an invalid name."), -- i18n("Invalid Name")); -- continue; -- } -- } -- if (oldName != name) { -- pObject->setName(name); -- } -- } -- m_objects.append(pObject); -- return true; --} -- --/** -- * Removes an object from this package. -- * Does not physically delete the object. -- * -- * @param pObject Pointer to the UMLObject to be removed. -- */ --void UMLPackage::removeObject(UMLObject *pObject) --{ -- if (pObject->baseType() == UMLObject::ot_Association) { -- UMLObject *o = const_cast(pObject); -- UMLAssociation *assoc = static_cast(o); -- removeAssocFromConcepts(assoc); -- } -- if (m_objects.indexOf(pObject) == -1) -- uDebug() << name() << " removeObject: object with id=" -- << Uml::ID::toString(pObject->id()) << "not found."; -- else -- m_objects.removeAll(pObject); --} -- --/** -- * Removes all objects from this package. -- * Inner containers (e.g. nested packages) are removed recursively. -- */ --void UMLPackage::removeAllObjects() --{ -- UMLCanvasObject::removeAllChildObjects(); -- UMLObject *o = NULL; -- -- while (!m_objects.isEmpty() && (o = m_objects.first()) != NULL) { -- UMLPackage *pkg = dynamic_cast(o); -- if (pkg) -- pkg->removeAllObjects(); -- removeObject(o); -- delete o; -- } --} -- --/** -- * Returns the list of objects contained in this package. -- */ --UMLObjectList UMLPackage::containedObjects() --{ -- return m_objects; --} -- --/** -- * Find the object of the given name in the list of contained objects. -- * -- * @param name The name to seek. -- * @return Pointer to the UMLObject found or NULL if not found. -- */ --UMLObject * UMLPackage::findObject(const QString &name) --{ -- const bool caseSensitive = UMLApp::app()->activeLanguageIsCaseSensitive(); -- for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -- UMLObject *obj = oit.next(); -- if (!obj) -- continue; -- if (caseSensitive) { -- if (obj->name() == name) -- return obj; -- } else if (obj->name().toLower() == name.toLower()) { -- return obj; -- } -- } -- return NULL; --} -- --/** -- * Find the object of the given ID in the list of contained objects. -- * -- * @param id The ID to seek. -- * @return Pointer to the UMLObject found or NULL if not found. -- */ --UMLObject * UMLPackage::findObjectById(Uml::ID::Type id) --{ -- return Model_Utils::findObjectInList(id, m_objects); --} -- --/** -- * Append all packages from this package (and those from nested packages) -- * to the given UMLPackageList. -- * -- * @param packages The list to append to -- * @param includeNested Whether to include the packages from nested packages -- * (default:true) -- */ --void UMLPackage::appendPackages(UMLPackageList& packages, bool includeNested) --{ -- for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -- UMLObject *o = oit.next(); -- uIgnoreZeroPointer(o); -- ObjectType ot = o->baseType(); -- if (ot == ot_Package || ot == ot_Folder) { -- packages.append(static_cast(o)); -- if (includeNested) { -- UMLPackage *inner = static_cast(o); -- inner->appendPackages(packages); -- } -- } -- } --} -- --/** -- * Append all classifiers from this package (and those from -- * nested packages) to the given UMLClassifierList. -- * -- * @param classifiers The list to append to. -- * @param includeNested Whether to include the classifiers from -- * nested packages (default: true.) -- */ --void UMLPackage::appendClassifiers(UMLClassifierList& classifiers, -- bool includeNested /* = true */) --{ -- for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -- UMLObject *o = oit.next(); -- uIgnoreZeroPointer(o); -- ObjectType ot = o->baseType(); -- if (ot == ot_Class || ot == ot_Interface || -- ot == ot_Datatype || ot == ot_Enum || ot == ot_Entity) { -- classifiers.append((UMLClassifier *)o); -- } else if (includeNested && (ot == ot_Package || ot == ot_Folder)) { -- UMLPackage *inner = static_cast(o); -- inner->appendClassifiers(classifiers); -- } -- } --} -- --/** -- * Append all entities from this package (and those -- * from nested packages) to the given UMLEntityList. -- * -- * @param entities The list to append to. -- * @param includeNested Whether to include the entities from -- * nested packages (default: true.) -- */ --void UMLPackage::appendEntities(UMLEntityList& entities, -- bool includeNested /* = true */) --{ -- for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -- UMLObject *o = oit.next(); -- uIgnoreZeroPointer(o); -- ObjectType ot = o->baseType(); -- if (ot == ot_Entity) { -- UMLEntity *c = static_cast(o); -- entities.append(c); -- } else if (includeNested && (ot == ot_Package || ot == ot_Folder)) { -- UMLPackage *inner = static_cast(o); -- inner->appendEntities(entities); -- } -- } --} -- --/** -- * Append all classes and interfaces from this package (and those -- * from nested packages) to the given UMLClassifierList. -- * -- * @param classifiers The list to append to. -- * @param includeNested Whether to include the classifiers from -- * nested packages (default: true.) -- */ --void UMLPackage::appendClassesAndInterfaces(UMLClassifierList& classifiers, -- bool includeNested /* = true */) --{ -- for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -- UMLObject *o = oit.next(); -- uIgnoreZeroPointer(o); -- ObjectType ot = o->baseType(); -- if (ot == ot_Class || ot == ot_Interface) { -- UMLClassifier *c = static_cast(o); -- classifiers.append(c); -- } else if (includeNested && (ot == ot_Package || ot == ot_Folder)) { -- UMLPackage *inner = static_cast(o); -- inner->appendClassesAndInterfaces(classifiers); -- } -- } --} -- --/** -- * Resolve types. Required when dealing with foreign XMI files. -- * Needs to be called after all UML objects are loaded from file. -- * Overrides the method from UMLObject. -- * Calls resolveRef() on each contained object. -- * -- * @return True for overall success. -- */ --bool UMLPackage::resolveRef() --{ -- bool overallSuccess = UMLCanvasObject::resolveRef(); -- for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -- UMLObject *obj = oit.next(); -- uIgnoreZeroPointer(obj); -- if (! obj->resolveRef()) { -- UMLObject::ObjectType ot = obj->baseType(); -- if (ot != UMLObject::ot_Package && ot != UMLObject::ot_Folder) -- m_objects.removeAll(obj); -- overallSuccess = false; -- } -- } -- return overallSuccess; --} -- --/** -- * Creates the XMI element. -- */ --void UMLPackage::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement packageElement = UMLObject::save(QLatin1String("UML:Package"), qDoc); -- QDomElement ownedElement = qDoc.createElement(QLatin1String("UML:Namespace.ownedElement")); -- UMLObject *obj = NULL; -- // save classifiers etc. -- for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -- obj = oit.next(); -- uIgnoreZeroPointer(obj); -- obj->saveToXMI (qDoc, ownedElement); -- } -- // save associations -- for (UMLObjectListIt ait(m_List); ait.hasNext();) { -- obj = ait.next(); -- obj->saveToXMI (qDoc, ownedElement); -- } -- -- packageElement.appendChild(ownedElement); -- qElement.appendChild(packageElement); --} -- --/** -- * Loads the XMI element. -- * Auxiliary to UMLObject::loadFromXMI. -- */ --bool UMLPackage::load(QDomElement& element) --{ -- for (QDomNode node = element.firstChild(); !node.isNull(); -- node = node.nextSibling()) { -- if (node.isComment()) -- continue; -- QDomElement tempElement = node.toElement(); -- QString type = tempElement.tagName(); -- if (Model_Utils::isCommonXMIAttribute(type)) -- continue; -- if (UMLDoc::tagEq(type, QLatin1String("Namespace.ownedElement")) || -- UMLDoc::tagEq(type, QLatin1String("Element.ownedElement")) || // Embarcadero's Describe -- UMLDoc::tagEq(type, QLatin1String("Namespace.contents"))) { -- //CHECK: umbrello-kf6 currently assumes that nested elements -- // are ownedElements anyway. -- // Therefore these tags are not further interpreted. -- if (! load(tempElement)) -- return false; -- continue; -- } else if (UMLDoc::tagEq(type, QLatin1String("packagedElement")) || -- UMLDoc::tagEq(type, QLatin1String("ownedElement"))) { -- type = tempElement.attribute(QLatin1String("xmi:type")); -- } -- UMLObject *pObject = Object_Factory::makeObjectFromXMI(type); -- if(!pObject) { -- uWarning() << "Unknown type of umlobject to create: " << type; -- continue; -- } -- pObject->setUMLPackage(this); -- if (!pObject->loadFromXMI(tempElement)) { -- removeObject(pObject); -- delete pObject; -- } -- } -- return true; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/package.h umbrello-kf6-15.08.1/umbrello/package.h ---- umbrello-kf6-15.08.1.orig/umbrello/package.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/package.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,79 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef PACKAGE_H --#define PACKAGE_H -- --#include "umlcanvasobject.h" --#include "umlclassifierlist.h" --#include "umlentitylist.h" -- --// forward declarations --class UMLAssociation; -- --/** -- * This class contains the non-graphical information required for a UML -- * Package. -- * This class inherits from @ref UMLCanvasObject which contains most of the -- * information. -- * -- * @short Non-graphical information for a Package. -- * @author Jonathan Riddell -- * @see UMLCanvasObject -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLPackage : public UMLCanvasObject --{ -- Q_OBJECT --public: -- explicit UMLPackage(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -- virtual ~UMLPackage(); -- -- virtual void copyInto(UMLObject *lhs) const; -- -- virtual UMLObject* clone() const; -- -- bool addObject(UMLObject *pObject); -- void removeObject(UMLObject *pObject); -- -- virtual void removeAllObjects(); -- -- UMLObjectList containedObjects(); -- -- void addAssocToConcepts(UMLAssociation* assoc); -- void removeAssocFromConcepts(UMLAssociation *assoc); -- -- UMLObject * findObject(const QString &name); -- UMLObject * findObjectById(Uml::ID::Type id); -- -- void appendPackages(UMLPackageList& packages, bool includeNested = true); -- void appendClassifiers(UMLClassifierList& classifiers, -- bool includeNested = true); -- void appendClassesAndInterfaces(UMLClassifierList& classifiers, -- bool includeNested = true); -- void appendEntities(UMLEntityList& entities, -- bool includeNested = true); -- -- virtual bool resolveRef(); -- -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- --protected: -- virtual bool load(QDomElement& element); -- -- /** -- * References to the objects contained in this package. -- * The UMLPackage is the owner of the objects. -- */ -- UMLObjectList m_objects; -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/port.cpp umbrello-kf6-15.08.1/umbrello/port.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/port.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/port.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,68 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "port.h" -- --#include -- --/** -- * Sets up a Port. -- * -- * @param name The name of the Concept. -- * @param id The unique id of the Concept. -- */ --UMLPort::UMLPort(const QString & name, Uml::ID::Type id) -- : UMLCanvasObject(name, id) --{ -- init(); --} -- --/** -- * Destructor. -- */ --UMLPort::~UMLPort() --{ --} -- --/** -- * Initializes key variables of the class. -- */ --void UMLPort::init() --{ -- m_BaseType = UMLObject::ot_Port; --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLPort::clone() const --{ -- UMLPort *clone = new UMLPort(); -- UMLObject::copyInto(clone); -- return clone; --} -- --/** -- * Creates the XMI element. -- */ --void UMLPort::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement portElement = UMLObject::save(QLatin1String("UML:Port"), qDoc); -- qElement.appendChild(portElement); --} -- --/** -- * Loads the XMI element (empty.) -- */ --bool UMLPort::load(QDomElement&) --{ -- return true; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/port.h umbrello-kf6-15.08.1/umbrello/port.h ---- umbrello-kf6-15.08.1.orig/umbrello/port.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/port.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,46 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef PORT_H --#define PORT_H -- --#include "umlcanvasobject.h" -- --/** -- * This class contains the non-graphical information required for a UML Port. -- * This class inherits from @ref UMLCanvasObject which contains most of the -- * information. -- * -- * @short Non-graphical information for a Port. -- * @author Oliver Kellogg -- * @see UMLCanvasObject -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLPort : public UMLCanvasObject --{ -- Q_OBJECT --public: -- -- explicit UMLPort(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -- virtual ~UMLPort(); -- -- virtual void init(); -- -- virtual UMLObject* clone() const; -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- --protected: -- -- bool load(QDomElement & element); -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/stereotype.cpp umbrello-kf6-15.08.1/umbrello/stereotype.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/stereotype.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/stereotype.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,164 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "stereotype.h" -- --// local includes --#include "debug_utils.h" --#include "umldoc.h" --#include "uml.h" -- --// kde includes --#if QT_VERSION < 0x050000 --#include --#endif --#include -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#endif -- --/** -- * Sets up a stereotype. -- * -- * @param name The name of this UMLStereotype. -- * @param id The unique id given to this UMLStereotype. -- */ --UMLStereotype::UMLStereotype(const QString &name, Uml::ID::Type id /* = Uml::id_None */) -- : UMLObject(name, id) --{ -- m_BaseType = UMLObject::ot_Stereotype; -- UMLStereotype * existing = UMLApp::app()->document()->findStereotype(name); -- if (existing) { -- uError() << "UMLStereotype constructor: " << name << " already exists"; -- } -- m_refCount = 0; --} -- --/** -- * Sets up a stereotype. -- */ --UMLStereotype::UMLStereotype() -- : UMLObject() --{ -- m_BaseType = UMLObject::ot_Stereotype; -- m_refCount = 0; --} -- --/** -- * Destructor. -- */ --UMLStereotype::~UMLStereotype() --{ --} -- --/** -- * Overloaded '==' operator. -- */ --bool UMLStereotype::operator==(const UMLStereotype &rhs) const --{ -- if (this == &rhs) { -- return true; -- } -- -- if (!UMLObject::operator==(rhs)) { -- return false; -- } -- -- return true; --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLStereotype::copyInto(UMLObject *lhs) const --{ -- UMLObject::copyInto(lhs); --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLStereotype::clone() const --{ -- UMLStereotype *clone = new UMLStereotype(); -- copyInto(clone); -- -- return clone; --} -- --/** -- * Saves to the XMI element. -- */ --void UMLStereotype::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- //FIXME: uml13.dtd compliance -- QDomElement stereotypeElement = UMLObject::save(QLatin1String("UML:Stereotype"), qDoc); -- qElement.appendChild(stereotypeElement); --} -- --/** -- * Display the properties configuration dialog for the stereotype -- * (just a line edit). -- */ --bool UMLStereotype::showPropertiesDialog(QWidget* parent) --{ -- bool ok; --#if QT_VERSION >= 0x050000 -- QString stereoTypeName = QInputDialog::getText(parent, -- i18n("Stereotype"), i18n("Enter name:"), -- QLineEdit::Normal, -- name(), &ok); --#else -- QString stereoTypeName = KInputDialog::getText(i18n("Stereotype"), i18n("Enter name:"), name(), &ok, parent); --#endif -- if (ok) { -- setName(stereoTypeName); -- } -- return ok; --} -- --/** -- * Increments the reference count for this stereotype. -- */ --void UMLStereotype::incrRefCount() --{ -- m_refCount++; --} -- --/** -- * Decrements the reference count for this stereotype. -- */ --void UMLStereotype::decrRefCount() --{ -- m_refCount--; --} -- --/** -- * Returns the reference count for this stereotype. -- */ --int UMLStereotype::refCount() const --{ -- return m_refCount; --} -- --/** -- * Returns the name as string -- */ --QString UMLStereotype::name(bool includeAdornments) const --{ -- if (includeAdornments) -- return QString::fromUtf8("«") + UMLObject::name() + QString::fromUtf8("»"); -- else -- return UMLObject::name(); --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/stereotype.h umbrello-kf6-15.08.1/umbrello/stereotype.h ---- umbrello-kf6-15.08.1.orig/umbrello/stereotype.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/stereotype.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,71 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef STEREOTYPE_H --#define STEREOTYPE_H -- --#include "umlobject.h" -- --/** -- * This class is used to set up information for a stereotype. -- * Stereotypes are used essentially as properties of -- * attributes and operations etc. -- * -- * Each stereotype object is reference counted, i.e. client code -- * manages it such that it comes into existence as soon as there is -- * at least one user, and ceases existing when the number of users -- * drops to 0. -- * m_refCount reflects the number of users. It is externally managed, -- * i.e. client code must take care to call incrRefCount() and -- * decrRefCount() as appropriate. -- * -- * The one and only owner of all stereotypes is the UMLDoc, and the -- * ownership is specially managed (umlPackage() returns NULL for a -- * UMLStereotype.) The reason for this special treatment is that -- * class UMLDoc does not inherit from class UMLPackage, and therefore -- * setUMLPackage() cannot be used for stereotypes. -- * -- * @short Sets up stereotype information. -- * @author Jonathan Riddell -- * @author Oliver Kellogg -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLStereotype : public UMLObject --{ -- Q_OBJECT --public: -- explicit UMLStereotype(const QString &name, Uml::ID::Type id = Uml::ID::None); -- UMLStereotype(); -- -- virtual ~UMLStereotype(); -- -- bool operator==(const UMLStereotype &rhs) const; -- -- virtual void copyInto(UMLObject *lhs) const; -- -- virtual UMLObject* clone() const; -- -- void incrRefCount(); -- void decrRefCount(); -- -- int refCount() const; -- -- QString name(bool includeAdornments=false) const; -- -- void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- -- virtual bool showPropertiesDialog(QWidget* parent); -- --protected: -- int m_refCount; -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/stereotypesmodel.cpp umbrello-kf6-15.08.1/umbrello/stereotypesmodel.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/stereotypesmodel.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/stereotypesmodel.cpp 2015-10-08 11:48:59.505089026 +0300 -@@ -0,0 +1,121 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2015 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "stereotypesmodel.h" -+ -+// app includes -+#include "stereotype.h" -+#include "uml.h" -+#include "umldoc.h" -+ -+// kde includes -+#include -+ -+// qt includes -+#include -+ -+StereotypesModel::StereotypesModel(UMLStereotypeList *stereotypes) -+ : m_count(0), -+ m_stereotypes(stereotypes) -+{ -+} -+ -+int StereotypesModel::rowCount(const QModelIndex &parent) const -+{ -+ Q_UNUSED(parent); -+ -+ int count = m_stereotypes->count(); -+ return count; -+} -+ -+int StereotypesModel::columnCount(const QModelIndex &parent) const -+{ -+ Q_UNUSED(parent); -+ -+ return 2; -+} -+ -+QVariant StereotypesModel::headerData(int section, Qt::Orientation orientation, int role) const -+{ -+ if (section < 0) -+ return QVariant(); -+ -+ if (role != Qt::DisplayRole) -+ return QVariant(); -+ -+ if (orientation == Qt::Vertical) -+ return section + 1; -+ if (section == 0) -+ return QVariant(i18n("Name")); -+ else if (section == 1) -+ return QVariant(i18n("Usage")); -+ else return QVariant(); -+} -+ -+QVariant StereotypesModel::data(const QModelIndex & index, int role) const -+{ -+ if (role == Qt::UserRole && index.column() == 0) { -+ QVariant v; -+ v.setValue(m_stereotypes->at(index.row())); -+ return v; -+ } -+ -+ if (role != Qt::DisplayRole) -+ return QVariant(); -+ -+ int cCount = columnCount(index); -+ if (index.column() >= cCount) -+ return QVariant(); -+ -+ UMLStereotype *s = m_stereotypes->at(index.row()); -+ if (cCount == 1) { -+ QString a = s->name() + QString(QLatin1String(" (%1)")).arg(s->refCount()); -+ return a; -+ } -+ -+ // table view -+ if (index.column() == 0) -+ return s->name(); -+ else -+ return s->refCount(); -+} -+ -+bool StereotypesModel::addStereotype(UMLStereotype *stereotype) -+{ -+ if (m_stereotypes->contains(stereotype)) -+ return false; -+ int index = m_stereotypes->count(); -+ beginInsertRows(QModelIndex(), index, index); -+ m_stereotypes->append(stereotype); -+ endInsertRows(); -+ return true; -+} -+ -+bool StereotypesModel::removeStereotype(UMLStereotype *stereotype) -+{ -+ if (!m_stereotypes->contains(stereotype)) -+ return false; -+ int index = m_stereotypes->indexOf(stereotype); -+ beginRemoveRows(QModelIndex(), index, index); -+ m_stereotypes->removeAll(stereotype); -+ endRemoveRows(); -+ return true; -+} -+ -+void StereotypesModel::emitDataChanged(const QModelIndex &index) -+{ -+ emit dataChanged(index, index); -+} -+ -+void StereotypesModel::emitDataChanged(int index) -+{ -+ QModelIndex mi = createIndex(index,0); -+ emit dataChanged(mi, mi); -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/stereotypesmodel.h umbrello-kf6-15.08.1/umbrello/stereotypesmodel.h ---- umbrello-kf6-15.08.1.orig/umbrello/stereotypesmodel.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/stereotypesmodel.h 2015-10-08 11:48:59.505089026 +0300 -@@ -0,0 +1,47 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2015 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef STEREOTYPESMODEL_H -+#define STEREOTYPESMODEL_H -+ -+// app includes -+#include "umlstereotypelist.h" -+ -+// qt includes -+#include -+ -+class UMLStereotype; -+ -+Q_DECLARE_METATYPE(UMLStereotype*); -+ -+class StereotypesModel : public QAbstractTableModel -+{ -+ Q_OBJECT -+public: -+ StereotypesModel(UMLStereotypeList *stereotypes); -+ -+ int rowCount(const QModelIndex &parent) const; -+ int columnCount(const QModelIndex &parent) const; -+ -+ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; -+ QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; -+ -+ bool addStereotype(UMLStereotype *stereotype); -+ bool removeStereotype(UMLStereotype *stereotype); -+ -+ void emitDataChanged(const QModelIndex &index); -+ void emitDataChanged(int index); -+ -+protected: -+ int m_count; -+ UMLStereotypeList *m_stereotypes; -+}; -+ -+#endif // STEREOTYPESMODEL_H -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/stereotypeswindow.cpp umbrello-kf6-15.08.1/umbrello/stereotypeswindow.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/stereotypeswindow.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/stereotypeswindow.cpp 2015-10-08 11:48:59.506089026 +0300 -@@ -0,0 +1,72 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2015 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "stereotypeswindow.h" -+ -+// app includes -+#include "stereotype.h" -+#include "stereotypesmodel.h" -+#include "uml.h" -+#include "umldoc.h" -+ -+// kde includes -+#include -+ -+// qt includes -+#include -+#include -+#include -+#include -+ -+StereotypesWindow::StereotypesWindow(QWidget *parent) -+ : QDockWidget(i18n("&Stereotypes"), parent) -+{ -+ setObjectName(QLatin1String("StereotypesWindow")); -+ -+ QSortFilterProxyModel *proxy = new QSortFilterProxyModel; -+ proxy->setSourceModel(UMLApp::app()->document()->stereotypesModel()); -+ proxy->setSortCaseSensitivity(Qt::CaseInsensitive); -+ m_stereotypesTree = new QTableView; -+ m_stereotypesTree->setModel(proxy); -+ m_stereotypesTree->setSortingEnabled(true); -+ m_stereotypesTree->verticalHeader()->setDefaultSectionSize(20); -+ m_stereotypesTree->verticalHeader()->setVisible(false); -+#if QT_VERSION >= 0x050000 -+ m_stereotypesTree->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); -+#else -+ m_stereotypesTree->horizontalHeader()->setResizeMode(QHeaderView::Stretch); -+#endif -+ setWidget(m_stereotypesTree); -+ -+ connect(m_stereotypesTree, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotStereotypesDoubleClicked(QModelIndex))); -+} -+ -+StereotypesWindow::~StereotypesWindow() -+{ -+ delete m_stereotypesTree; -+} -+ -+void StereotypesWindow::modified() -+{ -+ UMLStereotype *o = static_cast(QObject::sender()); -+ if (!o) -+ return; -+ int index = UMLApp::app()->document()->stereotypes().indexOf(o); -+ UMLApp::app()->document()->stereotypesModel()->emitDataChanged(index); -+} -+ -+void StereotypesWindow::slotStereotypesDoubleClicked(QModelIndex index) -+{ -+ QVariant v = UMLApp::app()->document()->stereotypesModel()->data(index, Qt::UserRole); -+ if (v.canConvert()) { -+ UMLStereotype *s = v.value(); -+ s->showPropertiesDialog(this); -+ } -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/stereotypeswindow.h umbrello-kf6-15.08.1/umbrello/stereotypeswindow.h ---- umbrello-kf6-15.08.1.orig/umbrello/stereotypeswindow.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/stereotypeswindow.h 2015-10-08 11:48:59.506089026 +0300 -@@ -0,0 +1,38 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2015 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef STEREOTYPESWINDOW_H -+#define STEREOTYPESWINDOW_H -+ -+#include -+#include -+ -+class QTableView; -+ -+class StereotypesWindow : public QDockWidget -+{ -+ Q_OBJECT -+public: -+ explicit StereotypesWindow(QWidget *parent = 0); -+ ~StereotypesWindow(); -+ -+signals: -+ -+public slots: -+ void modified(); -+ -+protected slots: -+ void slotStereotypesDoubleClicked(QModelIndex index); -+ -+protected: -+ QTableView *m_stereotypesTree; -+}; -+ -+#endif // STEREOTYPESWINDOW_H -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/template.cpp umbrello-kf6-15.08.1/umbrello/template.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/template.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/template.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,146 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "template.h" -- --// app includes --#include "debug_utils.h" --#include "uml.h" --#include "umldoc.h" --#include "umltemplatedialog.h" -- --/** -- * Sets up a template. -- * -- * @param parent The parent of this UMLTemplate (i.e. its concept). -- * @param name The name of this UMLTemplate. -- * @param id The unique id given to this UMLTemplate. -- * @param type The type of this UMLTemplate. -- */ --UMLTemplate::UMLTemplate(UMLObject *parent, const QString& name, -- Uml::ID::Type id, const QString& type) -- : UMLClassifierListItem(parent, name, id) --{ -- setTypeName(type); -- m_BaseType = UMLObject::ot_Template; --} -- --/** -- * Sets up a template. -- * -- * @param parent The parent of this UMLTemplate (i.e. its concept). -- */ --UMLTemplate::UMLTemplate(UMLObject *parent) -- : UMLClassifierListItem(parent) --{ -- m_BaseType = UMLObject::ot_Template; --} -- --/** -- * Destructor. -- */ --UMLTemplate::~UMLTemplate() --{ --} -- --QString UMLTemplate::toString(Uml::SignatureType::Enum sig) --{ -- Q_UNUSED(sig); -- if (m_pSecondary == NULL || m_pSecondary->name() == QLatin1String("class")) { -- return name(); -- } else { -- return name() + QLatin1String(" : ") + m_pSecondary->name(); -- } --} -- --/** -- * Overrides method from UMLClassifierListItem. -- * Returns the type name of the UMLTemplate. -- * If the template parameter is a class, there is no separate -- * type object. In this case, getTypeName() returns "class". -- * -- * @return The type name of the UMLClassifierListItem. -- */ --QString UMLTemplate::getTypeName() const --{ -- if (m_pSecondary == NULL) -- return QLatin1String("class"); -- return m_pSecondary->name(); --} -- --/** -- * Overloaded '==' operator. -- */ --bool UMLTemplate::operator==(const UMLTemplate &rhs) const --{ -- if (this == &rhs) { -- return true; -- } -- if (!UMLObject::operator==(rhs)) { -- return false; -- } -- if (m_pSecondary != rhs.m_pSecondary) { -- return false; -- } -- return true; --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLTemplate::copyInto(UMLObject *lhs) const --{ -- UMLClassifierListItem::copyInto(lhs); --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLTemplate::clone() const --{ -- UMLTemplate *clone = new UMLTemplate((UMLTemplate*) parent()); -- copyInto(clone); -- -- return clone; --} -- --/** -- * Writes the XMI element. -- */ --void UMLTemplate::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- //FIXME: uml13.dtd compliance -- QDomElement attributeElement = UMLObject::save(QLatin1String("UML:TemplateParameter"), qDoc); -- if (m_pSecondary) -- attributeElement.setAttribute(QLatin1String("type"), Uml::ID::toString(m_pSecondary->id())); -- qElement.appendChild(attributeElement); --} -- --/** -- * Loads the XMI element. -- */ --bool UMLTemplate::load(QDomElement& element) --{ -- m_SecondaryId = element.attribute(QLatin1String("type")); -- return true; --} -- --/** -- * Display the properties configuration dialog for the template. -- * -- * @return Success status. -- */ --bool UMLTemplate::showPropertiesDialog(QWidget* parent) --{ -- UMLTemplateDialog dialog(parent, this); -- return dialog.exec(); --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/template.h umbrello-kf6-15.08.1/umbrello/template.h ---- umbrello-kf6-15.08.1.orig/umbrello/template.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/template.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,57 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef TEMPLATE_H --#define TEMPLATE_H -- --#include "classifierlistitem.h" -- --/** -- * This class holds information used by template classes, called -- * paramaterised class in UML and a generic in Java. It has a -- * type (usually just "class") and name. -- * -- * @short Sets up template information. -- * @author Jonathan Riddell -- * @see UMLObject -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLTemplate : public UMLClassifierListItem --{ --public: -- -- UMLTemplate(UMLObject *parent, const QString& name, -- Uml::ID::Type id = Uml::ID::None, const QString& type = QLatin1String("class")); -- -- explicit UMLTemplate(UMLObject *parent); -- -- bool operator==(const UMLTemplate &rhs) const; -- -- virtual void copyInto(UMLObject *lhs) const; -- -- virtual UMLObject* clone() const; -- -- virtual ~UMLTemplate(); -- -- QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -- -- virtual QString getTypeName() const; -- -- virtual bool showPropertiesDialog(QWidget* parent); -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- --protected: -- -- bool load(QDomElement & element); -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umbrello-kf6ui.rc umbrello-kf6-15.08.1/umbrello/umbrello-kf6ui.rc ---- umbrello-kf6-15.08.1.orig/umbrello/umbrello-kf6ui.rc 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umbrello-kf6ui.rc 2015-10-08 11:48:59.506089026 +0300 -@@ -85,6 +85,7 @@ - - - -+ - - - -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlappprivate.h umbrello-kf6-15.08.1/umbrello/umlappprivate.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlappprivate.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlappprivate.h 2015-10-08 11:48:59.506089026 +0300 -@@ -15,8 +15,11 @@ - #include "finddialog.h" - #include "findresults.h" - #include "uml.h" -+#include "stereotypeswindow.h" - - // kde includes -+#include -+#include - #include - #include - #include -@@ -43,16 +46,18 @@ - { - Q_OBJECT - public: -- QWidget *parent; -+ UMLApp *parent; - FindDialog findDialog; - FindResults findResults; - QListWidget *logWindow; ///< Logging window. -+ KToggleAction *viewStereotypesWindow; -+ StereotypesWindow *stereotypesWindow; - - ktexteditor-kf6::Editor *editor; - ktexteditor-kf6::View *view; - ktexteditor-kf6::Document *document; - -- explicit UMLAppPrivate(QWidget *_parent) -+ explicit UMLAppPrivate(UMLApp *_parent) - : parent(_parent), - findDialog(_parent), - view(0), -@@ -101,6 +106,18 @@ - delete dialog; - delete document; - } -+ -+ void createStereotypesWindow() -+ { -+ // create the tree viewer -+ stereotypesWindow = new StereotypesWindow(parent); -+ parent->addDockWidget(Qt::LeftDockWidgetArea, stereotypesWindow); -+ -+ viewStereotypesWindow = parent->actionCollection()->add(QLatin1String("view_stereotypes_window")); -+ viewStereotypesWindow->setText(i18n("Stereotypes")); -+ connect(viewStereotypesWindow, SIGNAL(triggered(bool)), stereotypesWindow, SLOT(setVisible(bool))); -+ } -+ - }; - - #endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlassociationlist.h umbrello-kf6-15.08.1/umbrello/umlassociationlist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlassociationlist.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlassociationlist.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,23 +0,0 @@ --/*************************************************************************** -- * * -- * 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. * -- * * -- * copyright (C) 2004-2007 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLASSOCIATIONLIST_H --#define UMLASSOCIATIONLIST_H -- --#include -- --// forward declaration --class UMLAssociation; -- --typedef QList UMLAssociationList; --typedef QListIterator UMLAssociationListIt; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlattributelist.cpp umbrello-kf6-15.08.1/umbrello/umlattributelist.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlattributelist.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlattributelist.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,61 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "umlattributelist.h" -- --#include "attribute.h" -- --#include -- --UMLAttributeList::UMLAttributeList() --{ --} -- --UMLAttributeList::UMLAttributeList(const UMLAttributeList& other) -- : QList(other) --{ --} -- --UMLAttributeList::~UMLAttributeList() --{ --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLAttributeList::copyInto(UMLAttributeList *rhs) const --{ -- // Don't copy yourself. -- if (rhs == this) return; -- -- rhs->clear(); -- -- // Suffering from const; we shall not modify our object. -- UMLAttributeList *tmp = new UMLAttributeList(*this); -- -- UMLAttribute *item; -- for (UMLAttributeListIt ait(*tmp); ait.hasNext() ;) -- { -- item = ait.next(); -- rhs->append((UMLAttribute*)item->clone()); -- } -- delete tmp; --} -- --/** -- * Make a clone of this object. -- */ --UMLAttributeList* UMLAttributeList::clone() const --{ -- UMLAttributeList *clone = new UMLAttributeList(); -- copyInto(clone); -- return clone; --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlattributelist.h umbrello-kf6-15.08.1/umbrello/umlattributelist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlattributelist.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlattributelist.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,42 +0,0 @@ --/*************************************************************************** -- * * -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLATTRIBUTELIST_H --#define UMLATTRIBUTELIST_H -- --#include -- --#include "attribute.h" -- --//typedef QPtrList UMLAttributeList; --typedef QListIterator UMLAttributeListIt; -- --/** -- * This sub-class adds copyInto and clone to the QPtrList -- * base class. -- */ --class UMLAttributeList : public QList --{ --public: -- -- UMLAttributeList(); -- -- UMLAttributeList(const UMLAttributeList&); -- -- virtual ~UMLAttributeList(); -- -- virtual void copyInto(UMLAttributeList *rhs) const; -- -- virtual UMLAttributeList* clone() const; --}; -- -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlcanvasobject.cpp umbrello-kf6-15.08.1/umbrello/umlcanvasobject.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlcanvasobject.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlcanvasobject.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,464 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "umlcanvasobject.h" -- --// local includes --#include "debug_utils.h" --#include "uml.h" --#include "umldoc.h" --#include "classifier.h" --#include "association.h" --#include "attribute.h" --#include "operation.h" --#include "template.h" --#include "stereotype.h" --#include "idchangelog.h" -- --// kde includes --#include -- --DEBUG_REGISTER_DISABLED(UMLCanvasObject) -- --/** -- * Sets up a UMLCanvasObject. -- * -- * @param name The name of the Concept. -- * @param id The unique id of the Concept. -- */ --UMLCanvasObject::UMLCanvasObject(const QString & name, Uml::ID::Type id) -- : UMLObject(name, id) --{ --} -- --/** -- * Standard deconstructor. -- */ --UMLCanvasObject::~UMLCanvasObject() --{ -- //removeAllAssociations(); -- // No! This is way too late to do that. -- // It should have been called explicitly before destructing the -- // UMLCanvasObject. -- if (associations()) -- DEBUG(DBG_SRC) << "UMLCanvasObject destructor: FIXME: there are still associations()"; --} -- --/** -- * Return the subset of m_List that matches the given type. -- * -- * @param assocType The AssociationType::Enum to match. -- * @return The list of associations that match assocType. -- */ --UMLAssociationList UMLCanvasObject::getSpecificAssocs(Uml::AssociationType::Enum assocType) --{ -- UMLAssociationList list; -- UMLObject *o = NULL; -- for (UMLObjectListIt oit(m_List); oit.hasNext();) { -- o = oit.next(); -- uIgnoreZeroPointer(o); -- if (o->baseType() != UMLObject::ot_Association) -- continue; -- UMLAssociation *a = static_cast(o); -- if (a->getAssocType() == assocType) -- list.append(a); -- } -- return list; --} -- --/** -- * Adds an association end to m_List. -- * -- * @param assoc The association to add. -- * @todo change param type to UMLRole -- */ --bool UMLCanvasObject::addAssociationEnd(UMLAssociation* assoc) --{ -- Q_ASSERT(assoc); -- // add association only if not already present in list -- if (!hasAssociation(assoc)) -- { -- m_List.append(assoc); -- -- // Don't emit signals during load from XMI -- UMLObject::emitModified(); -- emit sigAssociationEndAdded(assoc); -- return true; -- } -- return false; --} -- --/** -- * Determine if this canvasobject has the given association. -- * -- * @param assoc The association to check. -- */ --bool UMLCanvasObject::hasAssociation(UMLAssociation* assoc) --{ -- uint cnt = m_List.count(assoc); -- DEBUG(DBG_SRC) << "count is " << cnt; -- return (cnt > 0); --} -- --/** -- * Remove an association end from the CanvasObject. -- * -- * @param assoc The association to remove. -- * @todo change param type to UMLRole -- */ --int UMLCanvasObject::removeAssociationEnd(UMLAssociation * assoc) --{ -- if (!hasAssociation(assoc) || !m_List.removeAll(assoc)) { -- DEBUG(DBG_SRC) << "cannot find given assoc " << assoc << " in list"; -- return -1; -- } -- UMLApp::app()->document()->removeAssociation(assoc, false); -- UMLObject::emitModified(); -- emit sigAssociationEndRemoved(assoc); -- return m_List.count(); --} -- --/** -- * Remove all association ends from the CanvasObject. -- */ --void UMLCanvasObject::removeAllAssociationEnds() --{ -- for (int i = 0; i < m_List.count(); i++) { -- UMLObject *o = m_List.at(i); -- uIgnoreZeroPointer(o); -- if (o->baseType() != UMLObject::ot_Association) { -- continue; -- } -- UMLAssociation *assoc = static_cast(o); -- //umldoc->slotRemoveUMLObject(assoc); -- UMLObject* objA = assoc->getObject(Uml::RoleType::A); -- UMLObject* objB = assoc->getObject(Uml::RoleType::B); -- UMLCanvasObject *roleAObj = dynamic_cast(objA); -- if (roleAObj) { -- roleAObj->removeAssociationEnd(assoc); -- } else if (objA) { -- DEBUG(DBG_SRC) << name() << ": objA " << objA->name() << " is not a UMLCanvasObject"; -- } else -- DEBUG(DBG_SRC) << name() << "): objA is NULL"; -- UMLCanvasObject *roleBObj = dynamic_cast(objB); -- if (roleBObj) { -- roleBObj->removeAssociationEnd(assoc); -- } else if (objB) { -- DEBUG(DBG_SRC) << name() << "): objB " << objB->name() << " is not a UMLCanvasObject"; -- } else -- DEBUG(DBG_SRC) << name() << "): objB is NULL"; -- } --} -- --/** -- * Remove all child objects. -- * Just clear list, objects must be deleted where they were created -- * (or we have bad crashes). -- */ --void UMLCanvasObject::removeAllChildObjects() --{ -- if (!m_List.isEmpty()) { -- removeAllAssociationEnds(); -- m_List.clear(); -- } --} -- --/** -- * Returns a name for the new association, operation, template -- * or attribute appended with a number if the default name is -- * taken e.g. new_association, new_association_1 etc. -- * -- * @param type The object type for which to make a name. -- * @param prefix Optional prefix to use for the name. -- * If not given then uniqChildName() will choose the prefix -- * internally based on the object type. -- * @return Unique name string for the ObjectType given. -- */ --QString UMLCanvasObject::uniqChildName(const UMLObject::ObjectType type, -- const QString &prefix /* = QString() */) --{ -- QString currentName; -- currentName = prefix; -- if (currentName.isEmpty()) { -- switch (type) { -- case UMLObject::ot_Association: -- currentName = i18n("new_association"); -- break; -- case UMLObject::ot_Attribute: -- currentName = i18n("new_attribute"); -- break; -- case UMLObject::ot_Template: -- currentName = i18n("new_template"); -- break; -- case UMLObject::ot_Operation: -- currentName = i18n("new_operation"); -- break; -- case UMLObject::ot_EnumLiteral: -- currentName = i18n("new_literal"); -- break; -- case UMLObject::ot_EntityAttribute: -- currentName = i18n("new_field"); -- break; -- case UMLObject::ot_UniqueConstraint: -- currentName = i18n("new_unique_constraint"); -- break; -- case UMLObject::ot_ForeignKeyConstraint: -- currentName = i18n("new_fkey_constraint"); -- break; -- case UMLObject::ot_CheckConstraint: -- currentName = i18n("new_check_constraint"); -- break; -- default: -- uWarning() << "uniqChildName() called for unknown child type " << UMLObject::toString(type); -- return QLatin1String("ERROR_in_UMLCanvasObject_uniqChildName"); -- } -- } -- -- QString name = currentName; -- for (int number = 1; findChildObject(name); ++number) { -- name = currentName + QLatin1Char('_') + QString::number(number); -- } -- return name; --} -- --/** -- * Find a child object with the given name. -- * -- * @param n The name of the object to find. -- * @param t The type to find (optional.) If not given then -- * any object type will match. -- * @return Pointer to the object found; NULL if none found. -- */ --UMLObject * UMLCanvasObject::findChildObject(const QString &n, UMLObject::ObjectType t) --{ -- const bool caseSensitive = UMLApp::app()->activeLanguageIsCaseSensitive(); -- UMLObject *obj = NULL; -- for (UMLObjectListIt oit(m_List); oit.hasNext();) { -- obj = oit.next(); -- uIgnoreZeroPointer(obj); -- if (t != UMLObject::ot_UMLObject && obj->baseType() != t) -- continue; -- if (caseSensitive) { -- if (obj->name() == n) -- return obj; -- } else if (obj->name().toLower() == n.toLower()) { -- return obj; -- } -- } -- return NULL; --} -- --/** -- * Find an association. -- * -- * @param id The id of the object to find. -- * @param considerAncestors boolean switch to consider ancestors while searching -- * @return Pointer to the object found (NULL if not found.) -- */ --UMLObject* UMLCanvasObject::findChildObjectById(Uml::ID::Type id, bool considerAncestors) --{ -- Q_UNUSED(considerAncestors); -- UMLObject *o = NULL; -- for (UMLObjectListIt oit(m_List); oit.hasNext();) { -- o = oit.next(); -- uIgnoreZeroPointer(o); -- if (o->id() == id) -- return o; -- } -- return 0; --} -- --/** -- * Overloaded '==' operator -- */ --bool UMLCanvasObject::operator==(const UMLCanvasObject& rhs) const --{ -- if (this == &rhs) { -- return true; -- } -- if (!UMLObject::operator==(rhs)) { -- return false; -- } -- if (m_List.count() != rhs.m_List.count()) { -- return false; -- } -- if (&m_List != &(rhs.m_List)) { -- return false; -- } -- return true; --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLCanvasObject::copyInto(UMLObject *lhs) const --{ -- UMLObject::copyInto(lhs); -- -- // TODO Associations are not copied at the moment. This because -- // the duplicate function (on umlwidgets) do not copy the associations. -- // -- //target->m_List = m_List; --} -- --/** -- * Returns the number of associations for the CanvasObject. -- * This is the sum of the aggregations and compositions. -- * -- * @return The number of associations for the Concept. -- */ --int UMLCanvasObject::associations() --{ -- int count = 0; -- UMLObject *obj = NULL; -- for (UMLObjectListIt oit(m_List); oit.hasNext();) { -- obj = oit.next(); -- uIgnoreZeroPointer(obj); -- if (obj->baseType() == UMLObject::ot_Association) -- count++; -- } -- return count; --} -- --/** -- * Return the list of associations for the CanvasObject. -- * -- * @return The list of associations for the CanvasObject. -- */ --UMLAssociationList UMLCanvasObject::getAssociations() --{ -- UMLAssociationList assocs; -- UMLObject *o = NULL; -- for (UMLObjectListIt oit(m_List); oit.hasNext() ;) { -- o = oit.next(); -- uIgnoreZeroPointer(o); -- if (o->baseType() != UMLObject::ot_Association) -- continue; -- UMLAssociation *assoc = static_cast(o); -- assocs.append(assoc); -- } -- return assocs; --} -- --/** -- * Return a list of the superclasses of this concept. -- * TODO: This overlaps with UMLClassifier::findSuperClassConcepts(), -- * see if we can merge the two. -- * -- * @param withRealizations include realizations in the returned list (default=yes) -- * @return The list of superclasses for the concept. -- */ --UMLClassifierList UMLCanvasObject::getSuperClasses(bool withRealizations) --{ -- UMLClassifierList list; -- UMLAssociationList assocs = getAssociations(); -- foreach (UMLAssociation* a, assocs) { -- uIgnoreZeroPointer(a); -- if ((a->getAssocType() != Uml::AssociationType::Generalization && -- a->getAssocType() != Uml::AssociationType::Realization) || -- (!withRealizations && a->getAssocType() == Uml::AssociationType::Realization) || -- a->getObjectId(Uml::RoleType::A) != id()) -- continue; -- UMLClassifier *c = dynamic_cast(a->getObject(Uml::RoleType::B)); -- if (c) -- list.append(c); -- else -- DEBUG(DBG_SRC) << name() << ": generalization's other end is not a " -- << "UMLClassifier (id= " << Uml::ID::toString(a->getObjectId(Uml::RoleType::B)) << ")"; -- } -- return list; --} -- --/** -- * Return a list of the classes that inherit from this concept. -- * TODO: This overlaps with UMLClassifier::findSubClassConcepts(), -- * see if we can merge the two. -- * -- * @return The list of classes inheriting from the concept. -- */ --UMLClassifierList UMLCanvasObject::getSubClasses() --{ -- UMLClassifierList list; -- UMLAssociationList assocs = getAssociations(); -- foreach (UMLAssociation* a, assocs) { -- uIgnoreZeroPointer(a); -- if ((a->getAssocType() != Uml::AssociationType::Generalization && -- a->getAssocType() != Uml::AssociationType::Realization) || -- a->getObjectId(Uml::RoleType::B) != id()) -- continue; -- UMLClassifier *c = dynamic_cast(a->getObject(Uml::RoleType::A)); -- if (c) -- list.append(c); -- else -- DEBUG(DBG_SRC) << "specialization's other end is not a UMLClassifier" -- << " (id=" << Uml::ID::toString(a->getObjectId(Uml::RoleType::A)) << ")"; -- } -- return list; --} -- --/** -- * Shorthand for getSpecificAssocs(Uml::at_Realization) -- * -- * @return The list of realizations for the Concept. -- */ --UMLAssociationList UMLCanvasObject::getRealizations() --{ -- return getSpecificAssocs(Uml::AssociationType::Realization); --} -- --/** -- * Shorthand for getSpecificAssocs(Uml::at_Aggregation) -- * -- * @return The list of aggregations for the Concept. -- */ --UMLAssociationList UMLCanvasObject::getAggregations() --{ -- return getSpecificAssocs(Uml::AssociationType::Aggregation); --} -- --/** -- * Shorthand for getSpecificAssocs(Uml::at_Composition) -- * -- * @return The list of compositions for the Concept. -- */ --UMLAssociationList UMLCanvasObject::getCompositions() --{ -- return getSpecificAssocs(Uml::AssociationType::Composition); --} -- --/** -- * Shorthand for getSpecificAssocs(Uml::at_Relationship) -- * -- * @return The list of relationships for the entity. -- */ --UMLAssociationList UMLCanvasObject::getRelationships() --{ -- return getSpecificAssocs(Uml::AssociationType::Relationship); --} -- --/** -- * Reimplementation of UMLObject method. -- */ --bool UMLCanvasObject::resolveRef() --{ -- bool overallSuccess = UMLObject::resolveRef(); -- for (UMLObjectListIt ait(m_List); ait.hasNext();) { -- UMLObject *obj = ait.next(); -- uIgnoreZeroPointer(obj); -- if (! obj->resolveRef()) { -- m_List.removeAll(obj); -- overallSuccess = false; -- } -- } -- return overallSuccess; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlcanvasobject.h umbrello-kf6-15.08.1/umbrello/umlcanvasobject.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlcanvasobject.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlcanvasobject.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,108 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef CANVASOBJECT_H --#define CANVASOBJECT_H -- --#include "umlobject.h" --#include "umlobjectlist.h" --#include "umlclassifierlist.h" --#include "umlassociationlist.h" -- --/** -- * This class contains the non-graphical information required for UMLObjects -- * which appear as moveable widgets on the scene. -- * -- * This class inherits from @ref UMLObject which contains most of the -- * information. -- * It is not instantiated itself, it's just used as a super class for -- * actual model objects. -- * -- * @short Non-graphical information for a UMLCanvasObject. -- * @author Jonathan Riddell -- * @see UMLObject -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLCanvasObject : public UMLObject --{ -- Q_OBJECT -- --public: -- explicit UMLCanvasObject(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -- virtual ~UMLCanvasObject(); -- -- bool operator==(const UMLCanvasObject& rhs) const; -- -- virtual void copyInto(UMLObject *lhs) const; -- -- // The abstract method UMLObject::clone() is implemented -- // in the classes inheriting from UMLCanvasObject. -- -- bool addAssociationEnd(UMLAssociation* assoc); -- -- bool hasAssociation(UMLAssociation* assoc); -- -- int removeAssociationEnd(UMLAssociation *assoc); -- -- void removeAllAssociationEnds(); -- -- int associations(); -- -- UMLAssociationList getAssociations(); -- -- UMLAssociationList getSpecificAssocs(Uml::AssociationType::Enum assocType); -- -- UMLClassifierList getSuperClasses(bool withRealizations = true); -- UMLClassifierList getSubClasses(); -- -- virtual UMLAssociationList getRealizations(); -- -- UMLAssociationList getAggregations(); -- UMLAssociationList getCompositions(); -- UMLAssociationList getRelationships(); -- -- virtual UMLObject *findChildObject(const QString &n, -- UMLObject::ObjectType t = UMLObject::ot_UMLObject); -- virtual UMLObject *findChildObjectById(Uml::ID::Type id, bool considerAncestors = false); -- -- virtual QString uniqChildName(const UMLObject::ObjectType type, -- const QString &prefix = QString()); -- -- virtual void removeAllChildObjects(); -- -- UMLObjectList subordinates() const { -- return m_List; -- } -- -- virtual bool resolveRef(); -- -- // The abstract method UMLObject::saveToXMI() is implemented -- // in the classes inheriting from UMLCanvasObject. -- --protected: -- -- /** -- * List of all the associations in this object. -- * Inheriting classes add more types of objects that are possible in this list; -- * for example, UMLClassifier adds operations, attributes, and templates. -- * -- * @todo Only a pointer to the appropriate assocation end object -- * (UMLRole) should be saved here, not the entire UMLAssociation. -- */ -- UMLObjectList m_List; -- --signals: -- -- void sigAssociationEndAdded(UMLAssociation * assoc); -- void sigAssociationEndRemoved(UMLAssociation * assoc); -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlclassifierlist.h umbrello-kf6-15.08.1/umbrello/umlclassifierlist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlclassifierlist.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlclassifierlist.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,22 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2010 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLCLASSIFIERLIST_H --#define UMLCLASSIFIERLIST_H -- --#include -- --// forward declaration --class UMLClassifier; -- --typedef QList UMLClassifierList; --typedef QListIterator UMLClassifierListIt; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlclassifierlistitemlist.cpp umbrello-kf6-15.08.1/umbrello/umlclassifierlistitemlist.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlclassifierlistitemlist.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlclassifierlistitemlist.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,60 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "umlclassifierlistitemlist.h" -- --#include "classifierlistitem.h" -- --#include -- --UMLClassifierListItemList::UMLClassifierListItemList() --{ --} -- --UMLClassifierListItemList::UMLClassifierListItemList(const UMLClassifierListItemList& other) -- : QList(other) --{ --} -- --UMLClassifierListItemList::~UMLClassifierListItemList() --{ --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLClassifierListItemList::copyInto(UMLClassifierListItemList *rhs) const --{ -- // Prevent copying to yourself. (Can cause serious injuries) -- if (rhs == this) return; -- -- rhs->clear(); -- -- // Suffering from const; we shall not modify our object. -- UMLClassifierListItemList *tmp = new UMLClassifierListItemList(*this); -- -- UMLClassifierListItem *item; -- for (UMLClassifierListItemListIt clit(*tmp); clit.hasNext() ;) { -- item = clit.next(); -- rhs->append((UMLClassifierListItem*)item->clone()); -- } -- delete tmp; --} -- --/** -- * Make a clone of this object. -- */ --UMLClassifierListItemList* UMLClassifierListItemList::clone() const --{ -- UMLClassifierListItemList *clone = new UMLClassifierListItemList(); -- copyInto(clone); -- return clone; --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlclassifierlistitemlist.h umbrello-kf6-15.08.1/umbrello/umlclassifierlistitemlist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlclassifierlistitemlist.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlclassifierlistitemlist.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,41 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLCLASSIFIERLISTITEMLIST_H --#define UMLCLASSIFIERLISTITEMLIST_H -- --#include -- --// forward declaration --class UMLClassifierListItem; -- --//typedef QPtrList UMLClassifierListItemList; --typedef QListIterator UMLClassifierListItemListIt; -- --/** -- * This sub-class adds copyInto and clone to the QPtrList -- * base class. -- */ --class UMLClassifierListItemList : public QList --{ --public: -- -- UMLClassifierListItemList(); -- UMLClassifierListItemList(const UMLClassifierListItemList& other); -- -- virtual ~UMLClassifierListItemList(); -- -- virtual void copyInto (UMLClassifierListItemList *rhs) const; -- -- virtual UMLClassifierListItemList* clone() const; -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/uml.cpp umbrello-kf6-15.08.1/umbrello/uml.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/uml.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/uml.cpp 2015-10-08 11:48:59.506089026 +0300 -@@ -240,15 +240,15 @@ - delete m_clipTimer; - delete m_copyTimer; - delete m_commoncodegenpolicy; -- delete m_d; -- delete m_doc; - delete m_imageExporterAll; -- delete m_listView; - delete m_printer; - delete m_policyext; - delete m_pUndoStack; - delete m_refactoringAssist; - delete m_xhtmlGenerator; -+ delete m_listView; -+ delete m_doc; -+ delete m_d; - } - - /** -@@ -918,6 +918,8 @@ - widget->setLayout(m_layout); - setCentralWidget(widget); - -+ m_d->createStereotypesWindow(); -+ - // create the tree viewer - m_listDock = new QDockWidget(i18n("&Tree View"), this); - m_listDock->setObjectName(QLatin1String("TreeViewDock")); -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umldoc.cpp umbrello-kf6-15.08.1/umbrello/umldoc.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umldoc.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umldoc.cpp 2015-10-08 11:48:59.506089026 +0300 -@@ -44,6 +44,7 @@ - #include "umlscene.h" - #include "version.h" - #include "worktoolbar.h" -+#include "stereotypesmodel.h" - - // kde includes - #include -@@ -113,7 +114,8 @@ - m_nViewID(Uml::ID::None), - m_bTypesAreResolved(true), - m_pCurrentRoot(0), -- m_bClosing(false) -+ m_bClosing(false), -+ m_stereotypesModel(new StereotypesModel(&m_stereoList)) - { - for (int i = 0; i < Uml::ModelType::N_MODELTYPES; ++i) - m_root[i] = 0; -@@ -190,6 +192,7 @@ - } - delete m_pChangeLog; - qDeleteAll(m_stereoList); -+ delete m_stereotypesModel; - } - - /** -@@ -402,18 +405,19 @@ - // @fixme With advanced code generation enabled, this crashes. - removeAllObjects(); - -+ // Remove any stereotypes. -+ if (stereotypes().count() > 0) { -+ foreach(UMLStereotype *s, stereotypes()) { -+ m_stereotypesModel->removeStereotype(s); -+ delete s; -+ } -+ m_stereoList.clear(); -+ } -+ - // Restore the datatype folder, it has been deleted above. - createDatatypeFolder(); - // this creates to much items only Logical View should be created - listView->init(); -- /* Remove any stereotypes. -- if (m_stereoList.count() > 0) { -- UMLStereotype *s; -- for (UMLStereotypeListIt sit(m_stereoList); (s = sit.current()) != 0; ++sit) -- delete s; -- m_stereoList.clear(); -- } -- */ - } - m_bClosing = false; - } -@@ -1268,9 +1272,8 @@ - */ - void UMLDoc::addStereotype(UMLStereotype *s) - { -- if (! m_stereoList.contains(s)) { -- m_stereoList.append(s); -- } -+ if (m_stereotypesModel->addStereotype(s)) -+ emit sigObjectCreated(s); - } - - /** -@@ -1279,9 +1282,8 @@ - */ - void UMLDoc::removeStereotype(UMLStereotype *s) - { -- if (m_stereoList.contains(s)) { -- m_stereoList.removeAll(s); -- } -+ if (m_stereotypesModel->removeStereotype(s)) -+ emit sigObjectRemoved(s); - } - - /** -@@ -2444,6 +2446,11 @@ - qApp->processEvents(); // give UI events a chance - } - -+StereotypesModel *UMLDoc::stereotypesModel() -+{ -+ return m_stereotypesModel; -+} -+ - /** - * Ensures the XMI file is a valid UML file. - * Currently only checks for metamodel=UML. -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umldoc.h umbrello-kf6-15.08.1/umbrello/umldoc.h ---- umbrello-kf6-15.08.1.orig/umbrello/umldoc.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umldoc.h 2015-10-08 11:48:59.506089026 +0300 -@@ -48,6 +48,7 @@ - class QPrinter; - - class IDChangeLog; -+class StereotypesModel; - class UMLPackage; - class UMLFolder; - class DiagramPrintPage; -@@ -233,6 +234,8 @@ - - void resolveTypes(); - -+ StereotypesModel *stereotypesModel(); -+ - private: - void initSaveTimer(); - void createDatatypeFolder(); -@@ -308,6 +311,8 @@ - */ - bool m_bClosing; - -+ StereotypesModel *m_stereotypesModel; -+ - public slots: - void slotRemoveUMLObject(UMLObject*o); - void slotAutoSave(); -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlentityattributelist.cpp umbrello-kf6-15.08.1/umbrello/umlentityattributelist.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlentityattributelist.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlentityattributelist.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,60 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "umlentityattributelist.h" -- --#include "entityattribute.h" -- --#include -- --UMLEntityAttributeList::UMLEntityAttributeList() --{ --} -- --UMLEntityAttributeList::UMLEntityAttributeList(const UMLEntityAttributeList& other) -- : QList(other) --{ --} -- --UMLEntityAttributeList::~UMLEntityAttributeList() --{ --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLEntityAttributeList::copyInto(UMLEntityAttributeList* rhs) const --{ -- // Don't copy yourself. -- if (rhs == this) return; -- -- rhs->clear(); -- -- // Suffering from const; we shall not modify our object. -- UMLEntityAttributeList* tmp = new UMLEntityAttributeList(*this); -- -- UMLEntityAttribute* item; -- for (UMLEntityAttributeListIt eait(*tmp); eait.hasNext() ;) { -- item = eait.next(); -- rhs->append((UMLEntityAttribute*)item->clone()); -- } -- delete tmp; --} -- --/** -- * Make a clone of this object. -- */ --UMLEntityAttributeList* UMLEntityAttributeList::clone() const --{ -- UMLEntityAttributeList *clone = new UMLEntityAttributeList(); -- copyInto(clone); -- return clone; --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlentityattributelist.h umbrello-kf6-15.08.1/umbrello/umlentityattributelist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlentityattributelist.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlentityattributelist.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,41 +0,0 @@ --/*************************************************************************** -- * * -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLENTITYATTRIBUTELIST_H --#define UMLENTITYATTRIBUTELIST_H -- --#include --#include "entityattribute.h" -- --//typedef QPtrList UMLEntityAttributeList; --typedef QListIterator UMLEntityAttributeListIt; -- --/** -- * This sub-class adds copyInto and clone to the QPtrList -- * base class. -- */ --class UMLEntityAttributeList : public QList --{ --public: -- -- UMLEntityAttributeList(); -- -- UMLEntityAttributeList(const UMLEntityAttributeList&); -- -- virtual ~UMLEntityAttributeList(); -- -- virtual void copyInto (UMLEntityAttributeList* rhs) const; -- -- virtual UMLEntityAttributeList* clone() const; --}; -- -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlentityconstraintlist.cpp umbrello-kf6-15.08.1/umbrello/umlentityconstraintlist.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlentityconstraintlist.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlentityconstraintlist.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,60 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "umlentityconstraintlist.h" -- --#include "entityconstraint.h" -- --#include -- --UMLEntityConstraintList::UMLEntityConstraintList() --{ --} -- --UMLEntityConstraintList::UMLEntityConstraintList(const UMLEntityConstraintList& other) -- : QList(other) --{ --} -- --UMLEntityConstraintList::~UMLEntityConstraintList() --{ --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLEntityConstraintList::copyInto(UMLEntityConstraintList* rhs) const --{ -- // Don't copy yourself. -- if (rhs == this) return; -- -- rhs->clear(); -- -- // Suffering from const; we shall not modify our object. -- UMLEntityConstraintList* tmp = new UMLEntityConstraintList(*this); -- -- UMLEntityConstraint* item; -- for (UMLEntityConstraintListIt ecit(*tmp); ecit.hasNext() ;) { -- item = ecit.next(); -- rhs->append((UMLEntityConstraint*)item->clone()); -- } -- delete tmp; --} -- --/** -- * Make a clone of this object. -- */ --UMLEntityConstraintList* UMLEntityConstraintList::clone() const --{ -- UMLEntityConstraintList *clone = new UMLEntityConstraintList(); -- copyInto(clone); -- return clone; --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlentityconstraintlist.h umbrello-kf6-15.08.1/umbrello/umlentityconstraintlist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlentityconstraintlist.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlentityconstraintlist.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,43 +0,0 @@ --/*************************************************************************** -- * * -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLENTITYCONSTRAINTLIST_H --#define UMLENTITYCONSTRAINTLIST_H -- --#include -- --// forward declaration --class UMLEntityConstraint; -- -- --typedef QListIterator UMLEntityConstraintListIt; -- --/** -- * This sub-class adds copyInto and clone to the QPtrList -- * base class. -- */ --class UMLEntityConstraintList : public QList --{ --public: -- -- UMLEntityConstraintList(); -- -- UMLEntityConstraintList(const UMLEntityConstraintList&); -- -- virtual ~UMLEntityConstraintList(); -- -- virtual void copyInto (UMLEntityConstraintList* rhs) const; -- -- virtual UMLEntityConstraintList* clone() const; --}; -- -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlentitylist.h umbrello-kf6-15.08.1/umbrello/umlentitylist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlentitylist.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlentitylist.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,22 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2010 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLENTITYLIST_H --#define UMLENTITYLIST_H -- --#include -- --// forward declaration --class UMLEntity; -- --typedef QList UMLEntityList; --typedef QListIterator UMLEntityListIt; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlenumliterallist.h umbrello-kf6-15.08.1/umbrello/umlenumliterallist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlenumliterallist.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlenumliterallist.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,23 +0,0 @@ --/*************************************************************************** -- * * -- * 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. * -- * * -- * copyright (C) 2004-2007 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLENUMLITERALLIST_H --#define UMLENUMLITERALLIST_H -- --#include -- --// forward declaration --class UMLEnumLiteral; -- --typedef QList UMLEnumLiteralList; --typedef QListIterator UMLEnumLiteralListIt; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umllistview.cpp umbrello-kf6-15.08.1/umbrello/umllistview.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umllistview.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umllistview.cpp 2015-10-08 11:48:59.506089026 +0300 -@@ -2161,6 +2161,11 @@ - QString name = classifier->uniqChildName(objectType); - UMLObject* object = Object_Factory::createChildObject(classifier, objectType, name); - -+ if (object == 0) { -+ // creation was cancelled by the user -+ return; -+ } -+ - // Handle primary key constraints (mark the unique constraint as PK on - // the parent entity) - if (type == UMLListViewItem::lvt_PrimaryKeyConstraint) { -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/actor.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/actor.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/actor.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/actor.cpp 2015-10-08 11:48:59.506089026 +0300 -@@ -0,0 +1,67 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "actor.h" -+ -+/** -+ * Constructs an Actor. -+ * -+ * @param name The name of the Actor. -+ * @param id The unique id to assign to this Actor. -+ */ -+UMLActor::UMLActor(const QString & name, Uml::ID::Type id) -+ : UMLCanvasObject(name, id) -+{ -+ init(); -+} -+ -+/** -+ * Standard destructor. -+ */ -+UMLActor::~UMLActor() -+{ -+} -+ -+/** -+ * Initializes key variables of the class. -+ */ -+void UMLActor::init() -+{ -+ m_BaseType = UMLObject::ot_Actor; -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLActor::clone() const -+{ -+ UMLActor *clone = new UMLActor(); -+ UMLObject::copyInto(clone); -+ return clone; -+} -+ -+/** -+ * Creates the XMI element. -+ */ -+void UMLActor::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement actorElement = UMLObject::save(QLatin1String("UML:Actor"), qDoc); -+ qElement.appendChild(actorElement); -+} -+ -+/** -+ * Loads the XMI element (empty). -+ */ -+bool UMLActor::load(QDomElement& element) -+{ -+ Q_UNUSED(element); -+ return true; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/actor.h umbrello-kf6-15.08.1/umbrello/umlmodel/actor.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/actor.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/actor.h 2015-10-08 11:48:59.506089026 +0300 -@@ -0,0 +1,44 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ACTOR_H -+#define ACTOR_H -+ -+#include "umlcanvasobject.h" -+ -+/** -+ * This class contains the non-graphical information required for a UML Actor. -+ * This class inherits from @ref UMLCanvasObject which contains most of the -+ * information. -+ * The @ref UMLDoc class creates instances of this type. -+ * -+ * @short Information for a non-graphical UML Actor. -+ * @author Paul Hensgen -+ * @see UMLCanvasObject -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLActor : public UMLCanvasObject -+{ -+ Q_OBJECT -+public: -+ explicit UMLActor(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -+ virtual ~UMLActor(); -+ -+ virtual void init(); -+ -+ virtual UMLObject* clone() const; -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+protected: -+ bool load(QDomElement & element); -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/artifact.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/artifact.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/artifact.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/artifact.cpp 2015-10-08 11:48:59.506089026 +0300 -@@ -0,0 +1,90 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "artifact.h" -+#include "association.h" -+#include "clipboard/idchangelog.h" -+ -+#include -+ -+/** -+ * Sets up an Artifact. -+ * @param name The name of the Concept. -+ * @param id The unique id of the Concept. -+ */ -+UMLArtifact::UMLArtifact(const QString & name, Uml::ID::Type id) -+ : UMLPackage(name, id), -+ m_drawAsType(defaultDraw) -+{ -+ m_BaseType = UMLObject::ot_Artifact; -+} -+ -+/** -+ * Standard deconstructor. -+ */ -+UMLArtifact::~UMLArtifact() -+{ -+} -+ -+/** -+ * Make a clone of this object. -+ * @return the cloned object -+ */ -+UMLObject* UMLArtifact::clone() const -+{ -+ UMLArtifact *clone = new UMLArtifact(); -+ UMLObject::copyInto(clone); -+ return clone; -+} -+ -+/** -+ * Creates the UML:Artifact element including its operations, -+ * attributes and templates -+ * @param qDoc the xml document -+ * @param qElement the xml element -+ */ -+void UMLArtifact::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement artifactElement = UMLObject::save(QLatin1String("UML:Artifact"), qDoc); -+ artifactElement.setAttribute(QLatin1String("drawas"), m_drawAsType); -+ qElement.appendChild(artifactElement); -+} -+ -+/** -+ * Loads the UML:Artifact element including its operations, -+ * attributes and templates. -+ * @param element the xml element to load -+ * @return the success status of the operation -+ */ -+bool UMLArtifact::load(QDomElement& element) -+{ -+ QString drawAs = element.attribute(QLatin1String("drawas"), QLatin1String("0")); -+ m_drawAsType = (Draw_Type)drawAs.toInt(); -+ return true; -+} -+ -+/** -+ * Sets m_drawAsType for which method to draw the artifact as. -+ * @param type the draw type -+ */ -+void UMLArtifact::setDrawAsType(Draw_Type type) -+{ -+ m_drawAsType = type; -+} -+ -+/** -+ * Returns the value of m_drawAsType. -+ * @return the value of the draw type attribute -+ */ -+UMLArtifact::Draw_Type UMLArtifact::getDrawAsType() -+{ -+ return m_drawAsType; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/artifact.h umbrello-kf6-15.08.1/umbrello/umlmodel/artifact.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/artifact.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/artifact.h 2015-10-08 11:48:59.506089026 +0300 -@@ -0,0 +1,66 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ARTIFACT_H -+#define ARTIFACT_H -+ -+#include "package.h" -+ -+/** -+ * This class contains the non-graphical information required for a UML -+ * Artifact. -+ * This class inherits from @ref UMLCanvasObject which contains most of the -+ * information. -+ * -+ * @short Non-graphical information for a Artifact. -+ * @author Jonathan Riddell -+ * @see UMLCanvasObject -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLArtifact : public UMLPackage -+{ -+ Q_OBJECT -+public: -+ -+ /** -+ * Artifacts can be drawn using one of several icons. -+ */ -+ enum Draw_Type { -+ defaultDraw, -+ file, -+ library, -+ table -+ }; -+ -+ explicit UMLArtifact(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -+ virtual ~UMLArtifact(); -+ -+ virtual UMLObject* clone() const; -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+ void setDrawAsType(Draw_Type type); -+ -+ Draw_Type getDrawAsType(); -+ -+protected: -+ -+ bool load(QDomElement & element); -+ -+private: -+ -+ /** -+ * Artifacts can be drawn as one of several different icons, -+ * this value choosing how to draw them. -+ */ -+ Draw_Type m_drawAsType; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/association.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/association.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/association.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/association.cpp 2015-10-08 11:48:59.506089026 +0300 -@@ -0,0 +1,742 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "association.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "classifier.h" -+#include "classpropertiesdialog.h" -+#include "folder.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlrole.h" -+#include "uniqueid.h" -+#include "model_utils.h" -+#include "cmds.h" -+ -+// kde includes -+#include -+ -+// qt includes -+#include -+#include -+ -+using namespace Uml; -+ -+DEBUG_REGISTER(UMLAssociation) -+ -+/** -+ * Sets up an association. -+ * A new unique ID is assigned internally. -+ * @param type The AssociationType::Enum to construct. -+ * @param roleA Pointer to the UMLObject in role A. -+ * @param roleB Pointer to the UMLObject in role B. -+ */ -+UMLAssociation::UMLAssociation(Uml::AssociationType::Enum type, -+ UMLObject * roleA, UMLObject * roleB) -+ : UMLObject(QString()) -+{ -+ init(type, roleA, roleB); -+ -+ m_pRole[RoleType::A]->setID(UniqueID::gen()); -+ m_pRole[RoleType::B]->setID(UniqueID::gen()); -+} -+ -+/** -+ * Constructs an association - for loading only. -+ * This constructor should not normally be used as it constructs -+ * an incomplete association (i.e. the role objects are missing.) -+ * @param type The AssociationType::Enum to construct. -+ * Default: Unknown. -+ */ -+UMLAssociation::UMLAssociation(Uml::AssociationType::Enum type) -+ : UMLObject(QString(), Uml::ID::Reserved) -+{ -+ init(type, NULL, NULL); -+} -+ -+/** -+ * Standard destructor. -+ */ -+UMLAssociation::~UMLAssociation() -+{ -+ if (m_pRole[RoleType::A] == NULL) { -+ uError() << "UMLAssociation destructor: m_pRole[A] is NULL already"; -+ } else { -+ delete m_pRole[RoleType::A]; -+ m_pRole[RoleType::A] = NULL; -+ } -+ if (m_pRole[RoleType::B] == NULL) { -+ uError() << "UMLAssociation destructor: m_pRole[B] is NULL already"; -+ } else { -+ delete m_pRole[RoleType::B]; -+ m_pRole[RoleType::B] = NULL; -+ } -+} -+ -+/** -+ * Overloaded '==' operator -+ */ -+bool UMLAssociation::operator==(const UMLAssociation &rhs) const -+{ -+ if (this == &rhs) { -+ return true; -+ } -+ return (UMLObject::operator== (rhs) && -+ m_AssocType == rhs.m_AssocType && -+ m_Name == rhs.m_Name && -+ m_pRole[RoleType::A] == rhs.m_pRole[RoleType::A] && -+ m_pRole[RoleType::B] == rhs.m_pRole[RoleType::B]); -+} -+ -+/** -+ * Returns the AssociationType::Enum of the UMLAssociation. -+ * @return The AssociationType::Enum of the UMLAssociation. -+ */ -+Uml::AssociationType::Enum UMLAssociation::getAssocType() const -+{ -+ return m_AssocType; -+} -+ -+/** -+ * Returns a String representation of this UMLAssociation. -+ */ -+QString UMLAssociation::toString() const -+{ -+ QString string; -+ if(m_pRole[RoleType::A]) -+ { -+ string += m_pRole[RoleType::A]->object()->name(); -+ string += QLatin1Char(':'); -+ string += m_pRole[RoleType::A]->name(); -+ } -+ string += QLatin1Char(':') + Uml::AssociationType::toStringI18n(m_AssocType) + QLatin1Char(':'); -+ if(m_pRole[RoleType::B]) -+ { -+ string += m_pRole[RoleType::B]->object()->name(); -+ string += QLatin1Char(':'); -+ string += m_pRole[RoleType::B]->name(); -+ } -+ return string; -+} -+ -+/** -+ * Resolve types. Required when dealing with foreign XMI files. -+ * Needs to be called after all UML objects are loaded from file. -+ * Overrides the method from UMLObject. -+ * Calls resolveRef() for each role. -+ * @return True for success. -+ */ -+bool UMLAssociation::resolveRef() -+{ -+ bool successA = getUMLRole(RoleType::A)->resolveRef(); -+ bool successB = getUMLRole(RoleType::B)->resolveRef(); -+ if (successA && successB) { -+ UMLObject *objA = getUMLRole(RoleType::A)->object(); -+ UMLObject *objB = getUMLRole(RoleType::B)->object(); -+ // Check if need to change the assoc type to Realization -+ if (isRealization(objA, objB)) { -+ m_AssocType = Uml::AssociationType::Realization; -+ } -+ m_pUMLPackage->addAssocToConcepts(this); -+ return true; -+ } -+ return false; -+} -+ -+/** -+ * Creates the or XMI element -+ * including its role objects. -+ */ -+void UMLAssociation::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ if (m_AssocType == Uml::AssociationType::Generalization) { -+ QDomElement assocElement = UMLObject::save(QLatin1String("UML:Generalization"), qDoc); -+ assocElement.setAttribute(QLatin1String("discriminator"), QString()); -+ assocElement.setAttribute(QLatin1String("child"), Uml::ID::toString(getObjectId(RoleType::A))); -+ assocElement.setAttribute(QLatin1String("parent"), Uml::ID::toString(getObjectId(RoleType::B))); -+ qElement.appendChild(assocElement); -+ return; -+ } -+ if (m_AssocType == Uml::AssociationType::Realization) { -+ QDomElement assocElement = UMLObject::save(QLatin1String("UML:Abstraction"), qDoc); -+ assocElement.setAttribute(QLatin1String("client"), Uml::ID::toString(getObjectId(RoleType::A))); -+ assocElement.setAttribute(QLatin1String("supplier"), Uml::ID::toString(getObjectId(RoleType::B))); -+ qElement.appendChild(assocElement); -+ return; -+ } -+ if (m_AssocType == Uml::AssociationType::Dependency) { -+ QDomElement assocElement = UMLObject::save(QLatin1String("UML:Dependency"), qDoc); -+ assocElement.setAttribute(QLatin1String("client"), Uml::ID::toString(getObjectId(RoleType::A))); -+ assocElement.setAttribute(QLatin1String("supplier"), Uml::ID::toString(getObjectId(RoleType::B))); -+ qElement.appendChild(assocElement); -+ return; -+ } -+ if (m_AssocType == Uml::AssociationType::Child2Category) { -+ QDomElement assocElement = UMLObject::save(QLatin1String("UML:Child2Category"), qDoc); -+ assocElement.setAttribute(QLatin1String("client"), Uml::ID::toString(getObjectId(RoleType::A))); -+ assocElement.setAttribute(QLatin1String("supplier"), Uml::ID::toString(getObjectId(RoleType::B))); -+ qElement.appendChild(assocElement); -+ return; -+ } -+ if (m_AssocType == Uml::AssociationType::Category2Parent) { -+ QDomElement assocElement = UMLObject::save(QLatin1String("UML:Category2Parent"), qDoc); -+ assocElement.setAttribute(QLatin1String("client"), Uml::ID::toString(getObjectId(RoleType::A))); -+ assocElement.setAttribute(QLatin1String("supplier"), Uml::ID::toString(getObjectId(RoleType::B))); -+ qElement.appendChild(assocElement); -+ return; -+ } -+ -+ QDomElement associationElement = UMLObject::save(QLatin1String("UML:Association"), qDoc); -+ QDomElement connElement = qDoc.createElement(QLatin1String("UML:Association.connection")); -+ getUMLRole(RoleType::A)->saveToXMI (qDoc, connElement); -+ getUMLRole(RoleType::B)->saveToXMI (qDoc, connElement); -+ associationElement.appendChild (connElement); -+ qElement.appendChild(associationElement); -+} -+ -+bool UMLAssociation::showPropertiesDialog(QWidget *parent) -+{ -+ QPointer dlg = new ClassPropertiesDialog(parent, this, true); -+ bool modified = false; -+ if (dlg->exec()) { -+ modified = true; -+ } -+ dlg->close(); -+ delete dlg; -+ return modified; -+} -+ -+/** -+ * Creates the or XMI element -+ * including its role objects. -+ */ -+bool UMLAssociation::load(QDomElement & element) -+{ -+ if (id() == Uml::ID::None) -+ return false; // old style XMI file. No real info in this association. -+ -+ UMLDoc * doc = UMLApp::app()->document(); -+ UMLObject * obj[2] = { NULL, NULL }; -+ if (m_AssocType == Uml::AssociationType::Generalization || -+ m_AssocType == Uml::AssociationType::Realization || -+ m_AssocType == Uml::AssociationType::Dependency || -+ m_AssocType == Uml::AssociationType::Child2Category || -+ m_AssocType == Uml::AssociationType::Category2Parent) { -+ QString general = element.attribute(QLatin1String("general")); -+ if (!general.isEmpty()) { -+ UMLClassifier *owningClassifier = dynamic_cast(m_pUMLPackage); -+ if (owningClassifier == NULL){ -+ uWarning() << "Cannot load UML2 generalization: m_pUMLPackage is expected " -+ << "to be the owning classifier (=client)"; -+ return false; -+ } -+ m_pRole[RoleType::A]->setObject(owningClassifier); -+ m_pRole[RoleType::B]->setSecondaryId(general); // defer resolution to resolveRef() -+ owningClassifier->addAssociationEnd(this); -+ m_pUMLPackage = m_pUMLPackage->umlPackage(); // reparent -+ m_pUMLPackage->addObject(this); -+ return true; -+ } -+ for (unsigned r = RoleType::A; r <= RoleType::B; ++r) { -+ const QString fetch = (m_AssocType == Uml::AssociationType::Generalization ? -+ r == RoleType::A ? QLatin1String("child") : QLatin1String("parent") -+ : r == RoleType::A ? QLatin1String("client") : QLatin1String("supplier")); -+ QString roleIdStr = element.attribute(fetch); -+ if (roleIdStr.isEmpty()) { -+ // Might be given as a child node instead - see below. -+ continue; -+ } -+ -+ // set umlobject of role if possible (else defer resolution) -+ obj[r] = doc->findObjectById(Uml::ID::fromString(roleIdStr)); -+ Uml::RoleType::Enum role = Uml::RoleType::fromInt(r); -+ if (obj[r] == NULL) { -+ m_pRole[role]->setSecondaryId(roleIdStr); // defer to resolveRef() -+ } else { -+ m_pRole[role]->setObject(obj[r]); -+ if (m_pUMLPackage == NULL) { -+ Uml::ModelType::Enum mt = Model_Utils::convert_OT_MT(obj[r]->baseType()); -+ m_pUMLPackage = doc->rootFolder(mt); -+ DEBUG(DBG_SRC) << "assoctype " << m_AssocType -+ << ": setting model type " << Uml::ModelType::toString(mt); -+ } -+ } -+ } -+ if (obj[RoleType::A] == NULL || obj[RoleType::B] == NULL) { -+ for (QDomNode node = element.firstChild(); !node.isNull(); -+ node = node.nextSibling()) { -+ if (node.isComment()) -+ continue; -+ QDomElement tempElement = node.toElement(); -+ QString tag = tempElement.tagName(); -+ if (Model_Utils::isCommonXMIAttribute(tag)) -+ continue; -+ // Permitted tag names: -+ // roleA: "child" "subtype" "client" -+ // roleB: "parent" "supertype" "supplier" -+ QString idStr = tempElement.attribute(QLatin1String("xmi.id")); -+ if (idStr.isEmpty()) -+ idStr = tempElement.attribute(QLatin1String("xmi.idref")); -+ if (idStr.isEmpty()) { -+ QDomNode inner = node.firstChild(); -+ QDomElement tmpElem = inner.toElement(); -+ idStr = tmpElem.attribute(QLatin1String("xmi.id")); -+ if (idStr.isEmpty()) -+ idStr = tmpElem.attribute(QLatin1String("xmi.idref")); -+ } -+ if (idStr.isEmpty()) { -+ uError() << "type " << m_AssocType -+ << ", id " << Uml::ID::toString(id()) << ": " -+ << "xmi id not given for " << tag; -+ continue; -+ } -+ // Since we know for sure that we're dealing with a non -+ // umbrello-kf6 file, use deferred resolution unconditionally. -+ if (UMLDoc::tagEq(tag, QLatin1String("child")) || -+ UMLDoc::tagEq(tag, QLatin1String("subtype")) || -+ UMLDoc::tagEq(tag, QLatin1String("client"))) { -+ getUMLRole(RoleType::A)->setSecondaryId(idStr); -+ } else { -+ getUMLRole(RoleType::B)->setSecondaryId(idStr); -+ } -+ } -+ } -+ -+ // it is a realization if either endpoint is an interface -+ if (isRealization(obj[RoleType::A], obj[RoleType::B])) { -+ m_AssocType = Uml::AssociationType::Realization; -+ } -+ return true; -+ } -+ -+ for (QDomNode node = element.firstChild(); !node.isNull(); -+ node = node.nextSibling()) { -+ // uml13.dtd compliant format (new style) -+ if (node.isComment()) -+ continue; -+ QDomElement tempElement = node.toElement(); -+ QString tag = tempElement.tagName(); -+ if (Model_Utils::isCommonXMIAttribute(tag)) -+ continue; -+ if (!UMLDoc::tagEq(tag, QLatin1String("Association.connection")) && -+ !UMLDoc::tagEq(tag, QLatin1String("Association.end")) && // Embarcadero's Describe -+ !UMLDoc::tagEq(tag, QLatin1String("Namespace.ownedElement")) && -+ !UMLDoc::tagEq(tag, QLatin1String("Namespace.contents"))) { -+ uWarning() << "unknown child node " << tag; -+ continue; -+ } -+ // Load role A. -+ QDomNode nodeA = tempElement.firstChild(); -+ while (nodeA.isComment()) -+ nodeA = nodeA.nextSibling(); -+ tempElement = nodeA.toElement(); -+ if (tempElement.isNull()) { -+ uWarning() << "UML:Association : element (A) is Null"; -+ return false; -+ } -+ tag = tempElement.tagName(); -+ if (UMLDoc::tagEq(tag, QLatin1String("NavigableEnd"))) { // Embarcadero's Describe -+ m_AssocType = Uml::AssociationType::UniAssociation; -+ } else if (!UMLDoc::tagEq(tag, QLatin1String("AssociationEndRole")) && -+ !UMLDoc::tagEq(tag, QLatin1String("AssociationEnd"))) { -+ uWarning() << "unknown child (A) tag " << tag; -+ return false; -+ } -+ if (! getUMLRole(RoleType::A)->loadFromXMI(tempElement)) -+ return false; -+ // Load role B. -+ QDomNode nodeB = nodeA.nextSibling(); -+ while (nodeB.isComment()) -+ nodeB = nodeB.nextSibling(); -+ tempElement = nodeB.toElement(); -+ if (tempElement.isNull()) { -+ uWarning() << "UML:Association : element (B) is Null"; -+ return false; -+ } -+ tag = tempElement.tagName(); -+ if (UMLDoc::tagEq(tag, QLatin1String("NavigableEnd"))) { // Embarcadero's Describe -+ m_AssocType = Uml::AssociationType::UniAssociation; -+ } else if (!UMLDoc::tagEq(tag, QLatin1String("AssociationEndRole")) && -+ !UMLDoc::tagEq(tag, QLatin1String("AssociationEnd"))) { -+ uWarning() << "unknown child (B) tag " << tag; -+ return false; -+ } -+ if (! getUMLRole(RoleType::B)->loadFromXMI(tempElement)) -+ return false; -+ -+ if (m_pUMLPackage == NULL) { -+ Uml::ModelType::Enum mt = Model_Utils::convert_OT_MT(getObject(RoleType::B)->baseType()); -+ m_pUMLPackage = doc->rootFolder(mt); -+ DEBUG(DBG_SRC) << "setting model type " << Uml::ModelType::toString(mt); -+ } -+ -+ // setting the association type: -+ // -+ // In the old days, we could just record this on the association, -+ // and be done with it. But thats not how the UML13.dtd does things. -+ // As a result, we are checking roleA for information about the -+ // parent association (!) which by this point in the parse, should -+ // be set. However, the information that the roles are allowed to have -+ // is not complete, so we need to finish the analysis here. -+ -+ // find self-associations -+ if (m_AssocType == Uml::AssociationType::Association && getObjectId(RoleType::A) == getObjectId(RoleType::B)) -+ m_AssocType = Uml::AssociationType::Association_Self; -+ -+ // fall-back default type -+ if (m_AssocType == Uml::AssociationType::Unknown) { -+ m_AssocType = Uml::AssociationType::Association; -+ } -+ -+ return true; -+ } -+ -+ // From here on it's old-style stuff. -+ QString assocTypeStr = element.attribute(QLatin1String("assoctype"), QLatin1String("-1")); -+ Uml::AssociationType::Enum assocType = Uml::AssociationType::Unknown; -+ if (assocTypeStr[0] >= QLatin1Char('a') && assocTypeStr[0] <= QLatin1Char('z')) { -+ // In an earlier version, the natural assoctype names were saved. -+ const char *assocTypeString[] = { -+ "generalization", // Uml::AssociationType::Generalization -+ "aggregation", // Uml::AssociationType::Aggregation -+ "dependency", // Uml::AssociationType::Dependency -+ "association", // Uml::AssociationType::Association -+ "associationself", // Uml::AssociationType::Association_Self -+ "collmessage", // Uml::AssociationType::Coll_Message -+ "seqmessage", // Uml::AssociationType::Seq_Message -+ "collmessageself", // Uml::AssociationType::Coll_Message_Self -+ "seqmessageself", // Uml::AssociationType::Seq_Message_Self -+ "implementation", // Uml::AssociationType::Implementation -+ "composition", // Uml::AssociationType::Composition -+ "realization", // Uml::AssociationType::Realization -+ "uniassociation", // Uml::AssociationType::UniAssociation -+ "anchor", // Uml::AssociationType::Anchor -+ "state", // Uml::AssociationType::State -+ "activity", // Uml::AssociationType::Activity -+ "exception", // Uml::AssociationType::Exception -+ "category2parent" // Uml::AssociationType::Category2Parent -+ "child2category" // Uml::AssociationType::Child2Category -+ "relationship" // Uml::AssociationType::Relationship -+ }; -+ const int arraySize = sizeof(assocTypeString) / sizeof(char*); -+ DEBUG(DBG_SRC) << "AssociationType string array size = " << arraySize; -+ -+ int index; -+ for (index = 0; index < arraySize; ++index) -+ if (assocTypeStr == QString::fromLatin1(assocTypeString[index])) -+ break; -+ if (index < arraySize) -+ assocType = Uml::AssociationType::fromInt(index); -+ } else { -+ int assocTypeNum = assocTypeStr.toInt(); -+ if (assocTypeNum < (int)Uml::AssociationType::Generalization || // first enum -+ assocTypeNum >= (int)Uml::AssociationType::Reserved) { // last enum -+ uWarning() << "bad assoctype of UML:AssociationType::Enum " << Uml::ID::toString(id()); -+ return false; -+ } -+ assocType = Uml::AssociationType::fromInt(assocTypeNum); -+ } -+ setAssociationType(assocType); -+ -+ Uml::ID::Type roleAObjID = Uml::ID::fromString(element.attribute(QLatin1String("rolea"), QLatin1String("-1"))); -+ Uml::ID::Type roleBObjID = Uml::ID::fromString(element.attribute(QLatin1String("roleb"), QLatin1String("-1"))); -+ if (assocType == Uml::AssociationType::Aggregation || -+ assocType == Uml::AssociationType::Composition) { -+ // Flip roles to compensate for changed diamond logic in AssociationLine. -+ // For further explanations see AssociationWidget::loadFromXMI. -+ Uml::ID::Type tmp = roleAObjID; -+ roleAObjID = roleBObjID; -+ roleBObjID = tmp; -+ } -+ -+ UMLObject * objA = doc->findObjectById(roleAObjID); -+ UMLObject * objB = doc->findObjectById(roleBObjID); -+ -+ if(objA) -+ getUMLRole(RoleType::A)->setObject(objA); -+ else -+ return false; -+ -+ if(objB) -+ getUMLRole(RoleType::B)->setObject(objB); -+ else -+ return false; -+ -+ setMultiplicity(element.attribute(QLatin1String("multia")), RoleType::A); -+ setMultiplicity(element.attribute(QLatin1String("multib")), RoleType::B); -+ -+ setRoleName(element.attribute(QLatin1String("namea")), RoleType::A); -+ setRoleName(element.attribute(QLatin1String("nameb")), RoleType::B); -+ -+ setRoleDoc(element.attribute(QLatin1String("doca")), RoleType::A); -+ setRoleDoc(element.attribute(QLatin1String("docb")), RoleType::B); -+ -+ // Visibility defaults to Public if it cant set it here.. -+ QString visibilityA = element.attribute(QLatin1String("visibilitya"), QLatin1String("0")); -+ QString visibilityB = element.attribute(QLatin1String("visibilityb"), QLatin1String("0")); -+ int vis = visibilityA.toInt(); -+ if (vis >= 200) // bkwd compat. -+ vis -= 200; -+ setVisibility((Uml::Visibility::Enum)vis, RoleType::A); -+ vis = visibilityB.toInt(); -+ if (vis >= 200) // bkwd compat. -+ vis -= 200; -+ setVisibility((Uml::Visibility::Enum)vis, RoleType::B); -+ -+ // Changeability defaults to Changeable if it cant set it here.. -+ QString changeabilityA = element.attribute(QLatin1String("changeabilitya"), QLatin1String("0")); -+ QString changeabilityB = element.attribute(QLatin1String("changeabilityb"), QLatin1String("0")); -+ if (changeabilityA.toInt() > 0) -+ setChangeability(Uml::Changeability::fromInt(changeabilityA.toInt()), RoleType::A); -+ if (changeabilityB.toInt() > 0) -+ setChangeability(Uml::Changeability::fromInt(changeabilityB.toInt()), RoleType::B); -+ -+ return true; -+} -+ -+/** -+ * Returns the UMLObject assigned to the given role. -+ * @return Pointer to the UMLObject in the given role. -+ */ -+UMLObject* UMLAssociation::getObject(Uml::RoleType::Enum role) const -+{ -+ if (m_pRole[role] == NULL) -+ return NULL; -+ return m_pRole[role]->object(); -+} -+ -+/** -+ * Returns the ID of the UMLObject assigned to the given role. -+ * Shorthand for getObject(role)->ID(). -+ * @return ID of the UMLObject in the given role. -+ */ -+Uml::ID::Type UMLAssociation::getObjectId(Uml::RoleType::Enum role) const -+{ -+ UMLRole *roleObj = m_pRole[role]; -+ if (roleObj == NULL) -+ return Uml::ID::None; -+ UMLObject *o = roleObj->object(); -+ if (o == NULL) { -+ QString auxID = roleObj->secondaryId(); -+ if (auxID.isEmpty()) { -+ uError() << "role " << role << ": getObject returns NULL"; -+ return Uml::ID::None; -+ } else { -+ DEBUG(DBG_SRC) << "role " << role << ": using secondary ID " << auxID; -+ return Uml::ID::fromString(auxID); -+ } -+ } -+ return o->id(); -+} -+ -+/** -+ * Returns the ID of the UMLObject assigned to the given role. -+ * CURRENTLY UNUSED. -+ * @return ID of the UMLObject of the given role. -+ */ -+Uml::ID::Type UMLAssociation::getRoleId(RoleType::Enum role) const -+{ -+ return m_pRole[role]->id(); -+} -+ -+/** -+ * Returns the changeability. -+ */ -+Uml::Changeability::Enum UMLAssociation::changeability(Uml::RoleType::Enum role) const -+{ -+ return m_pRole[role]->changeability(); -+} -+ -+/** -+ * Returns the Visibility of the given role. -+ * @return Visibility of the given role. -+ */ -+Uml::Visibility::Enum UMLAssociation::visibility(Uml::RoleType::Enum role) const -+{ -+ return m_pRole[role]->visibility(); -+} -+ -+/** -+ * Returns the multiplicity assigned to the given role. -+ * @return The multiplicity assigned to the given role. -+ */ -+QString UMLAssociation::getMultiplicity(Uml::RoleType::Enum role) const -+{ -+ return m_pRole[role]->multiplicity(); -+} -+ -+/** -+ * Returns the name assigned to the role A. -+ * @return The name assigned to the given role. -+ */ -+QString UMLAssociation::getRoleName(Uml::RoleType::Enum role) const -+{ -+ return m_pRole[role]->name(); -+} -+ -+/** -+ * Returns the documentation assigned to the given role. -+ * @return Documentation text of given role. -+ */ -+QString UMLAssociation::getRoleDoc(Uml::RoleType::Enum role) const -+{ -+ return m_pRole[role]->doc(); -+} -+ -+/** -+ * Get the underlying UMLRole object for the given role. -+ * @return Pointer to the UMLRole object for the given role. -+ */ -+UMLRole * UMLAssociation::getUMLRole(Uml::RoleType::Enum role) const -+{ -+ return m_pRole[role]; -+} -+ -+/** -+ * Set the attribute m_bOldLoadMode. -+ * @param value the new value to set -+ */ -+void UMLAssociation::setOldLoadMode(bool value /* = true */) -+{ -+ m_bOldLoadMode = value; -+} -+ -+/** -+ * Return the backward compatibility flag for loading files. -+ */ -+bool UMLAssociation::getOldLoadMode() const -+{ -+ return m_bOldLoadMode; -+} -+ -+/** -+ * Sets the assocType of the UMLAssociation. -+ * @param assocType The AssociationType::Enum of the UMLAssociation. -+ */ -+void UMLAssociation::setAssociationType(Uml::AssociationType::Enum assocType) -+{ -+ m_AssocType = assocType; -+ if (m_AssocType == Uml::AssociationType::UniAssociation) -+ { -+ // In this case we need to auto-set the multiplicity/rolenames -+ // of the roles -+#ifdef VERBOSE_DEBUGGING -+ DEBUG(DBG_SRC) << " A new uni-association has been created."; -+#endif -+ } -+ UMLObject::emitModified(); -+} -+ -+/** -+ * Sets the UMLObject playing the given role in the association. -+ * @param obj Pointer to the UMLObject of the given role. -+ * @param role The Uml::RoleType::Enum played by the association -+ */ -+void UMLAssociation::setObject(UMLObject *obj, Uml::RoleType::Enum role) -+{ -+ m_pRole[role]->setObject(obj); -+} -+ -+/** -+ * Sets the visibility of the given role of the UMLAssociation. -+ * @param value Visibility of role. -+ * @param role The Uml::RoleType::Enum to which the visibility is being applied -+ */ -+void UMLAssociation::setVisibility(Visibility::Enum value, Uml::RoleType::Enum role) -+{ -+ m_pRole[role]->setVisibility(value); -+} -+ -+/** -+ * Sets the changeability of the given role of the UMLAssociation. -+ * @param value Changeability_Type of the given role. -+ * @param role The Uml::RoleType::Enum to which the changeability is being set -+ */ -+void UMLAssociation::setChangeability(Uml::Changeability::Enum value, Uml::RoleType::Enum role) -+{ -+ m_pRole[role]->setChangeability(value); -+} -+ -+/** -+ * Sets the multiplicity of the given role of the UMLAssociation. -+ * @param multi The multiplicity of the given role. -+ * @param role The Uml::RoleType::Enum to which the multiplicity is being applied -+ */ -+void UMLAssociation::setMultiplicity(const QString &multi, Uml::RoleType::Enum role) -+{ -+ if (m_pRole[role]->multiplicity() != multi) { -+ UMLApp::app()->executeCommand(new CmdChangeMultiplicity(m_pRole[role], multi)); -+ } -+} -+ -+/** -+ * Sets the name of the given role of the UMLAssociation. -+ * @param roleName The name to set for the given role. -+ * @param role The Uml::RoleType::Enum for which to set the name. -+ */ -+void UMLAssociation::setRoleName(const QString &roleName, Uml::RoleType::Enum role) -+{ -+ m_pRole[role]->setName(roleName); -+} -+ -+/** -+ * Sets the documentation on the given role in the association. -+ * @param doc The string with the documentation. -+ * @param role The Uml::RoleType::Enum to which the documentation is being applied -+ */ -+void UMLAssociation::setRoleDoc(const QString &doc, Uml::RoleType::Enum role) -+{ -+ m_pRole[role]->setDoc(doc); -+} -+ -+/** -+ * When the association type is "Generalization" and at least one of the -+ * given objects an interface, then it is a "Realization". -+ * @param objA UML object as role A -+ * @param objB UML object as role B -+ * @return flag whether association is a realization -+ */ -+bool UMLAssociation::isRealization(UMLObject* objA, UMLObject* objB) const -+{ -+ bool aIsInterface = false; -+ if (objA && (objA->baseType() == UMLObject::ot_Interface)) { -+ aIsInterface = true; -+ } -+ bool bIsInterface = false; -+ if (objB && (objB->baseType() == UMLObject::ot_Interface)) { -+ bIsInterface = true; -+ } -+ return (m_AssocType == Uml::AssociationType::Generalization) && -+ (aIsInterface || bIsInterface); -+} -+ -+/** -+ * Common initializations at construction time. -+ * @param type The AssociationType::Enum to represent. -+ * @param roleAObj Pointer to the role A UMLObject. -+ * @param roleBObj Pointer to the role B UMLObject. -+ */ -+void UMLAssociation::init(Uml::AssociationType::Enum type, UMLObject *roleAObj, UMLObject *roleBObj) -+{ -+ m_AssocType = type; -+ m_BaseType = ot_Association; -+ m_Name = QString(); -+ m_bOldLoadMode = false; -+ nrof_parent_widgets = -1; -+ if (!UMLApp::app()->document()->loading()) { -+ m_pUMLPackage = UMLApp::app()->document()->currentRoot(); -+ } -+ m_pRole[RoleType::A] = new UMLRole (this, roleAObj, RoleType::A); -+ m_pRole[RoleType::B] = new UMLRole (this, roleBObj, RoleType::B); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/association.h umbrello-kf6-15.08.1/umbrello/umlmodel/association.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/association.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/association.h 2015-10-08 11:48:59.506089026 +0300 -@@ -0,0 +1,102 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ASSOCIATION_H -+#define ASSOCIATION_H -+ -+#include "basictypes.h" -+#include "umlobject.h" -+ -+#include -+#include -+ -+class UMLRole; -+ -+/** -+ * This class contains the non-graphic representation of an association. -+ * An association can be a generalization, realization, simple association, -+ * directed association, aggregation, or composition. -+ * -+ * @short Sets up association information. -+ * @author Oliver Kellogg -+ * @see UMLObject -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLAssociation : public UMLObject -+{ -+ Q_OBJECT -+ friend class AssociationWidget; -+ -+public: -+ UMLAssociation(Uml::AssociationType::Enum type, UMLObject *roleA, UMLObject *roleB); -+ explicit UMLAssociation(Uml::AssociationType::Enum type = Uml::AssociationType::Unknown); -+ -+ virtual ~UMLAssociation(); -+ -+ bool operator==(const UMLAssociation &rhs) const; -+ -+ QString toString() const; -+ -+ UMLRole * getUMLRole(Uml::RoleType::Enum role) const; -+ Uml::ID::Type getObjectId(Uml::RoleType::Enum role) const; -+ Uml::ID::Type getRoleId(Uml::RoleType::Enum role) const; -+ -+ void setAssociationType(Uml::AssociationType::Enum assocType); -+ Uml::AssociationType::Enum getAssocType() const; -+ -+ void setObject(UMLObject *obj, Uml::RoleType::Enum role); -+ UMLObject* getObject(Uml::RoleType::Enum role) const; -+ -+ void setVisibility(Uml::Visibility::Enum value, Uml::RoleType::Enum role); -+ Uml::Visibility::Enum visibility(Uml::RoleType::Enum role) const; -+ -+ void setChangeability(Uml::Changeability::Enum value, Uml::RoleType::Enum role); -+ Uml::Changeability::Enum changeability(Uml::RoleType::Enum role) const; -+ -+ void setMultiplicity(const QString &multi, Uml::RoleType::Enum role); -+ QString getMultiplicity(Uml::RoleType::Enum role) const; -+ -+ void setRoleName(const QString &roleName, Uml::RoleType::Enum role); -+ QString getRoleName(Uml::RoleType::Enum role) const; -+ -+ void setRoleDoc(const QString &doc, Uml::RoleType::Enum role); -+ QString getRoleDoc(Uml::RoleType::Enum role) const; -+ -+ void setOldLoadMode(bool value = true); -+ bool getOldLoadMode() const; -+ -+ virtual UMLObject* clone() const { return NULL; } -+ -+ virtual bool resolveRef(); -+ -+ void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+ virtual bool showPropertiesDialog(QWidget *parent = 0); -+ -+protected: -+ -+ bool load(QDomElement& element); -+ -+ // keep track of number of parent widgets -+ int nrof_parent_widgets; -+ -+ void init(Uml::AssociationType::Enum type, UMLObject *roleAObj, UMLObject *roleBObj); -+ -+ UMLRole * m_pRole[2]; -+ Uml::AssociationType::Enum m_AssocType; -+ QString m_Name; -+ bool m_bOldLoadMode; -+ -+private: -+ -+ bool isRealization(UMLObject* objA, UMLObject* objB) const; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/attribute.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/attribute.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/attribute.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/attribute.cpp 2015-10-08 11:48:59.506089026 +0300 -@@ -0,0 +1,424 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "attribute.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "classifier.h" -+#include "operation.h" -+#include "umlobject.h" -+#include "umldoc.h" -+#include "uml.h" -+#include "folder.h" -+#include "umlattributedialog.h" -+#include "object_factory.h" -+ -+/** -+ * Sets up an attribute. -+ * -+ * @param parent The parent of this UMLAttribute. -+ * @param name The name of this UMLAttribute. -+ * @param id The unique id given to this UMLAttribute. -+ * @param s The visibility of the UMLAttribute. -+ * @param type The type of this UMLAttribute. -+ * @param iv The initial value of the attribute. -+ */ -+UMLAttribute::UMLAttribute(UMLObject *parent, -+ const QString& name, Uml::ID::Type id, -+ Uml::Visibility::Enum s, -+ UMLObject *type, const QString& iv) -+ : UMLClassifierListItem(parent, name, id) -+{ -+ m_InitialValue = iv; -+ m_BaseType = UMLObject::ot_Attribute; -+ m_visibility = s; -+ m_ParmKind = Uml::ParameterDirection::In; -+ /* CHECK: Do we need this: -+ if (type == NULL) { -+ type = Object_Factory::createUMLObject(Uml::ot_Datatype, "undef"); -+ } -+ */ -+ m_pSecondary = type; -+} -+ -+/** -+ * Sets up an attribute. -+ * -+ * @param parent The parent of this UMLAttribute. -+ */ -+UMLAttribute::UMLAttribute(UMLObject *parent) : UMLClassifierListItem(parent) -+{ -+ m_BaseType = UMLObject::ot_Attribute; -+ m_visibility = Uml::Visibility::Private; -+ m_ParmKind = Uml::ParameterDirection::In; -+} -+ -+/** -+ * Destructor. -+ */ -+UMLAttribute::~UMLAttribute() -+{ -+} -+ -+/** -+ * Reimplementation of method from UMLObject is required as -+ * an extra signal, attributeChanged(), is emitted. -+ */ -+void UMLAttribute::setName(const QString &name) -+{ -+ m_name = name; -+ emit attributeChanged(); -+ UMLObject::emitModified(); -+} -+ -+/** -+ * Reimplementation of method from UMLObject is required as -+ * an extra signal, attributeChanged(), is emitted. -+ */ -+void UMLAttribute::setVisibility(Uml::Visibility::Enum s) -+{ -+ m_visibility = s; -+ emit attributeChanged(); -+ UMLObject::emitModified(); -+} -+ -+/** -+ * Returns The initial value of the UMLAttribute. -+ * -+ * @return The initial value of the Atrtibute. -+ */ -+QString UMLAttribute::getInitialValue() const -+{ -+ return m_InitialValue; -+} -+ -+/** -+ * Sets the initial value of the UMLAttribute. -+ * -+ * @param iv The initial value of the UMLAttribute. -+ */ -+void UMLAttribute::setInitialValue(const QString &iv) -+{ -+ if(m_InitialValue != iv) { -+ m_InitialValue = iv; -+ UMLObject::emitModified(); -+ } -+} -+ -+void UMLAttribute::setParmKind (Uml::ParameterDirection::Enum pk) -+{ -+ m_ParmKind = pk; -+} -+ -+Uml::ParameterDirection::Enum UMLAttribute::getParmKind() const -+{ -+ return m_ParmKind; -+} -+ -+/** -+ * Returns a string representation of the UMLAttribute. -+ * -+ * @param sig If true will show the attribute type and initial value. -+ * @return Returns a string representation of the UMLAttribute. -+ */ -+QString UMLAttribute::toString(Uml::SignatureType::Enum sig) -+{ -+ QString s; -+ -+ if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::NoSig) { -+ s = Uml::Visibility::toString(m_visibility, true) + QLatin1Char(' '); -+ } -+ -+ if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::SigNoVis) { -+ // Determine whether the type name needs to be scoped. -+ UMLObject *owningObject = static_cast(parent()); -+ if (owningObject->baseType() == UMLObject::ot_Operation) { -+ // The immediate parent() is the UMLOperation but we want -+ // the UMLClassifier: -+ owningObject = static_cast(owningObject->parent()); -+ } -+ UMLClassifier *ownParent = dynamic_cast(owningObject); -+ if (ownParent == NULL) { -+ uError() << "parent " << owningObject->name() -+ << " is not a UMLClassifier"; -+ return QString(); -+ } -+ QString typeName; -+ UMLClassifier *type = UMLClassifierListItem::getType(); -+ if (type) { -+ UMLPackage *typeScope = type->umlPackage(); -+ if (typeScope != ownParent && typeScope != ownParent->umlPackage()) -+ typeName = type->fullyQualifiedName(); -+ else -+ typeName = type->name(); -+ } -+ // The default direction, "in", is not mentioned. -+ // Perhaps we should include a pd_Unspecified in -+ // Uml::ParameterDirection::Enum to have better control over this. -+ if (m_ParmKind == Uml::ParameterDirection::InOut) -+ s += QLatin1String("inout "); -+ else if (m_ParmKind == Uml::ParameterDirection::Out) -+ s += QLatin1String("out "); -+ // Construct the attribute text. -+ QString string = s + name() + QLatin1String(" : ") + typeName; -+ if (m_InitialValue.length() > 0) -+ string += QLatin1String(" = ") + m_InitialValue; -+ return string; -+ } -+ return s + name(); -+} -+ -+/** -+ * Reimplement method from UMLObject. -+ */ -+QString UMLAttribute::getFullyQualifiedName(const QString& separator, -+ bool includeRoot /* = false */) const -+{ -+ UMLOperation *op = NULL; -+ UMLObject *owningObject = static_cast(parent()); -+ if (owningObject->baseType() == UMLObject::ot_Operation) { -+ op = static_cast(owningObject); -+ owningObject = static_cast(owningObject->parent()); -+ } -+ UMLClassifier *ownParent = dynamic_cast(owningObject); -+ if (ownParent == NULL) { -+ uError() << name() << ": parent " << owningObject->name() -+ << " is not a UMLClassifier"; -+ return QString(); -+ } -+ QString tempSeparator = separator; -+ if (tempSeparator.isEmpty()) -+ tempSeparator = UMLApp::app()->activeLanguageScopeSeparator(); -+ QString fqn = ownParent->fullyQualifiedName(tempSeparator, includeRoot); -+ if (op) -+ fqn.append(tempSeparator + op->name()); -+ fqn.append(tempSeparator + name()); -+ return fqn; -+} -+ -+/** -+ * Overloaded '==' operator -+ */ -+bool UMLAttribute::operator==(const UMLAttribute &rhs) const -+{ -+ if(this == &rhs) -+ return true; -+ -+ if(!UMLObject::operator==(rhs)) -+ return false; -+ -+ // The type name is the only distinguishing criterion. -+ // (Some programming languages might support more, but others don't.) -+ if (m_pSecondary != rhs.m_pSecondary) -+ return false; -+ -+ return true; -+} -+ -+/** -+ * Copy the internal presentation of this object into the UMLAttribute -+ * object. -+ */ -+void UMLAttribute::copyInto(UMLObject *lhs) const -+{ -+ UMLAttribute *target = static_cast(lhs); -+ // call the parent first. -+ UMLClassifierListItem::copyInto(target); -+ -+ // Copy all datamembers -+ target->m_pSecondary = m_pSecondary; -+ target->m_SecondaryId = m_SecondaryId; -+ target->m_InitialValue = m_InitialValue; -+ target->m_ParmKind = m_ParmKind; -+} -+ -+/** -+ * Make a clone of the UMLAttribute. -+ */ -+UMLObject* UMLAttribute::clone() const -+{ -+ //FIXME: The new attribute should be slaved to the NEW parent not the old. -+ UMLAttribute *clone = new UMLAttribute(static_cast(parent())); -+ copyInto(clone); -+ -+ return clone; -+} -+ -+/** -+ * Creates the XMI element. -+ */ -+void UMLAttribute::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement attributeElement = UMLObject::save(QLatin1String("UML:Attribute"), qDoc); -+ if (m_pSecondary == NULL) { -+ uDebug() << name() << ": m_pSecondary is NULL, m_SecondaryId is '" -+ << m_SecondaryId << "'"; -+ } else { -+ attributeElement.setAttribute(QLatin1String("type"), Uml::ID::toString(m_pSecondary->id())); -+ } -+ if (! m_InitialValue.isEmpty()) -+ attributeElement.setAttribute(QLatin1String("initialValue"), m_InitialValue); -+ qElement.appendChild(attributeElement); -+} -+ -+/** -+ * Loads the XMI element. -+ */ -+bool UMLAttribute::load(QDomElement & element) -+{ -+ m_SecondaryId = element.attribute(QLatin1String("type")); -+ // We use the m_SecondaryId as a temporary store for the xmi.id -+ // of the attribute type model object. -+ // It is resolved later on, when all classes have been loaded. -+ // This deferred resolution is required because the xmi.id may -+ // be a forward reference, i.e. it may identify a model object -+ // that has not yet been loaded. -+ if (m_SecondaryId.isEmpty()) { -+ // Perhaps the type is stored in a child node: -+ QDomNode node = element.firstChild(); -+ while (!node.isNull()) { -+ if (node.isComment()) { -+ node = node.nextSibling(); -+ continue; -+ } -+ QDomElement tempElement = node.toElement(); -+ QString tag = tempElement.tagName(); -+ if (!UMLDoc::tagEq(tag, QLatin1String("type"))) { -+ node = node.nextSibling(); -+ continue; -+ } -+ m_SecondaryId = Model_Utils::getXmiId(tempElement); -+ if (m_SecondaryId.isEmpty()) -+ m_SecondaryId = tempElement.attribute(QLatin1String("xmi.idref")); -+ if (m_SecondaryId.isEmpty()) { -+ QString href = tempElement.attribute(QLatin1String("href")); -+ if (href.isEmpty()) { -+ QDomNode inner = node.firstChild(); -+ QDomElement tmpElem = inner.toElement(); -+ m_SecondaryId = Model_Utils::getXmiId(tmpElem); -+ if (m_SecondaryId.isEmpty()) -+ m_SecondaryId = tmpElem.attribute(QLatin1String("xmi.idref")); -+ } else { -+ int hashpos = href.lastIndexOf(QChar(QLatin1Char('#'))); -+ if (hashpos < 0) { -+ uDebug() << name() << ": cannot find type " << href; -+ } else { -+ QString typeName = href.mid(hashpos + 1); -+ UMLFolder *dtFolder = UMLApp::app()->document()->datatypeFolder(); -+ m_pSecondary = Model_Utils::findUMLObject(dtFolder->containedObjects(), -+ typeName, UMLObject::ot_Datatype); -+ if (!m_pSecondary) { -+ m_pSecondary = Object_Factory::createUMLObject(UMLObject::ot_Datatype, -+ typeName, dtFolder); -+ } -+ } -+ } -+ } -+ break; -+ } -+ if (m_SecondaryId.isEmpty()) { -+ uDebug() << name() << ": cannot find type."; -+ } -+ } -+ m_InitialValue = element.attribute(QLatin1String("initialValue")); -+ if (m_InitialValue.isEmpty()) { -+ // for backward compatibility -+ m_InitialValue = element.attribute(QLatin1String("value")); -+ } -+ return true; -+} -+ -+/** -+ * Display the properties configuration dialog for the attribute. -+ */ -+bool UMLAttribute::showPropertiesDialog(QWidget* parent) -+{ -+ UMLAttributeDialog dialog(parent, this); -+ return dialog.exec(); -+} -+ -+/** -+ * Puts in the param templateParamList all the template params that are in templateParam -+ */ -+void UMLAttribute::setTemplateParams(const QString& templateParam, UMLClassifierList &templateParamList) -+{ -+ if (templateParam.isEmpty()) -+ return; -+ QString type = templateParam.simplified(); -+ -+ int start = type.indexOf(QLatin1Char('<')); -+ if (start >= 0) { -+ int end = start; -+ int count = 1; -+ int len = type.length(); -+ while (count != 0 && ++end < len) { -+ QChar c = type.at(end); -+ if (c == QLatin1Char('<')) { -+ count++; -+ } -+ if (c == QLatin1Char('>')) { -+ count--; -+ } -+ } -+ if (count != 0) { -+ //The template is ill-formated, let's quit -+ return; -+ } -+ setTemplateParams(type.mid(start + 1, end - start - 1), templateParamList); -+ setTemplateParams(type.left(start) + type.right(len - end - 1), templateParamList); -+ } else { -+ QStringList paramsList = type.split(QLatin1Char(',')); -+ for (QStringList::Iterator it = paramsList.begin(); it != paramsList.end(); ++it) { -+ QString param = *it; -+ if (!param.isEmpty()) { -+ UMLDoc *pDoc = UMLApp::app()->document(); -+ UMLObject* obj = pDoc->findUMLObject(param); -+ if (obj == NULL) { -+ obj = pDoc->findUMLObject(param.remove(QLatin1Char(' '))); -+ } -+ if (obj != NULL) { -+ //We want to list only the params that already exist in this document -+ //If the param doesnt't already exist, we couldn't draw an association anyway -+ UMLClassifier* tmpClassifier = static_cast(obj); -+ if (templateParamList.indexOf(tmpClassifier) == -1) { -+ templateParamList.append(tmpClassifier); -+ } -+ } -+ } -+ } -+ } -+} -+ -+/** -+ * Returns all the template params (if any) that are in the type of this attribute -+ */ -+UMLClassifierList UMLAttribute::getTemplateParams() -+{ -+ UMLClassifierList templateParamList; -+ QString type = getType()->name(); -+ QString templateParam; -+ // Handle C++/D/Java template/generic parameters -+ const Uml::ProgrammingLanguage::Enum pl = UMLApp::app()->activeLanguage(); -+ if (pl == Uml::ProgrammingLanguage::Cpp || -+ pl == Uml::ProgrammingLanguage::Java || pl == Uml::ProgrammingLanguage::D) { -+ int start = type.indexOf(QLatin1Char('<')); -+ if (start >= 0) { -+ int end = type.lastIndexOf(QLatin1Char('>')); -+ if (end > start) { -+ templateParam = type.mid(start + 1, end - start - 1); -+ setTemplateParams(templateParam, templateParamList); -+ } -+ } -+ } -+ return templateParamList; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/attribute.h umbrello-kf6-15.08.1/umbrello/umlmodel/attribute.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/attribute.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/attribute.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,84 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ATTRIBUTE_H -+#define ATTRIBUTE_H -+ -+#include "basictypes.h" -+#include "classifierlistitem.h" -+#include "umlclassifierlist.h" -+ -+/** -+ * This class is used to set up information for an attribute. This is like -+ * a programming attribute. It has a type, name, visibility and initial value. -+ * -+ * @short Sets up attribute information. -+ * @author Paul Hensgen -+ * @see UMLObject -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLAttribute : public UMLClassifierListItem -+{ -+ Q_OBJECT -+public: -+ -+ UMLAttribute(UMLObject *parent, const QString& name, -+ Uml::ID::Type id = Uml::ID::None, -+ Uml::Visibility::Enum s = Uml::Visibility::Private, -+ UMLObject *type = 0, const QString& iv = QString()); -+ explicit UMLAttribute(UMLObject *parent); -+ -+ bool operator==(const UMLAttribute &rhs) const; -+ -+ virtual ~UMLAttribute(); -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ void setName(const QString &name); -+ -+ void setVisibility(Uml::Visibility::Enum s); -+ -+ virtual UMLObject* clone() const; -+ -+ QString getInitialValue() const; -+ void setInitialValue(const QString &iv); -+ -+ QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -+ -+ QString getFullyQualifiedName(const QString& separator = QString(), -+ bool includeRoot = false) const; -+ -+ virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+ virtual bool showPropertiesDialog(QWidget* parent = 0); -+ -+ void setParmKind(Uml::ParameterDirection::Enum pk); -+ Uml::ParameterDirection::Enum getParmKind() const; -+ -+ virtual UMLClassifierList getTemplateParams(); -+ -+signals: -+ -+ void attributeChanged(); -+ -+protected: -+ -+ bool load(QDomElement & element); -+ -+ QString m_InitialValue; ///< text for the attribute's initial value. -+ Uml::ParameterDirection::Enum m_ParmKind; -+ -+private: -+ -+ void setTemplateParams(const QString& templateParam, UMLClassifierList &templateParamList); -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/category.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/category.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/category.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/category.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,101 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "category.h" -+ -+/** -+ * Constructs a Category. -+ * -+ * @param name The name of the Category. -+ * @param id The unique id to assign to this Category. -+ */ -+UMLCategory::UMLCategory(const QString & name, Uml::ID::Type id) -+ : UMLCanvasObject(name, id) -+{ -+ init(); -+} -+ -+/** -+ * Standard destructor. -+ */ -+UMLCategory::~UMLCategory() -+{ -+} -+ -+/** -+ * Initializes key variables of the class. -+ */ -+void UMLCategory::init() -+{ -+ m_BaseType = UMLObject::ot_Category; -+ m_CategoryType = ct_Disjoint_Specialisation; -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLCategory::copyInto(UMLObject *lhs) const -+{ -+ UMLCategory *target = static_cast(lhs); -+ -+ // call the parent first -+ UMLCanvasObject::copyInto(target); -+ -+ target->m_CategoryType = m_CategoryType; -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLCategory::clone() const -+{ -+ UMLCategory *clone = new UMLCategory(); -+ copyInto(clone); -+ return clone; -+} -+ -+/** -+ * Creates the XMI element. -+ */ -+void UMLCategory::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement categoryElement = UMLObject::save(QLatin1String("UML:Category"), qDoc); -+ categoryElement.setAttribute(QLatin1String("categoryType"), (int)m_CategoryType); -+ qElement.appendChild(categoryElement); -+} -+ -+/** -+ * Loads the XMI element (empty.) -+ */ -+bool UMLCategory::load(QDomElement& element) -+{ -+ m_CategoryType = (Category_Type)element.attribute(QLatin1String("categoryType"), -+ QLatin1String("0")).toInt(); -+ return true; -+} -+ -+/** -+ * Get the category type -+ */ -+UMLCategory::Category_Type UMLCategory::getType() -+{ -+ return m_CategoryType; -+} -+ -+/** -+ * Set the category type -+ */ -+void UMLCategory::setType(Category_Type type) -+{ -+ m_CategoryType = type; -+ emitModified(); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/category.h umbrello-kf6-15.08.1/umbrello/umlmodel/category.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/category.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/category.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,62 @@ -+/*************************************************************************** -+ * * -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef CATEGORY_H -+#define CATEGORY_H -+ -+#include "umlcanvasobject.h" -+ -+/** -+ * This class contains the non-graphical information required for a UML Category. -+ * This class inherits from @ref UMLCanvasObject which contains most of the -+ * information. -+ * The @ref UMLDoc class creates instances of this type. -+ * -+ * @short Information for a non-graphical UML Category. -+ * @author Sharan Rao -+ * @see UMLCanvasObject -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLCategory : public UMLCanvasObject { -+ Q_OBJECT -+public: -+ -+ enum Category_Type { -+ ct_Disjoint_Specialisation, -+ ct_Overlapping_Specialisation, -+ ct_Union -+ }; -+ -+ explicit UMLCategory(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -+ ~UMLCategory(); -+ -+ virtual void init(); -+ -+ void copyInto(UMLObject *lhs) const; -+ -+ virtual UMLObject* clone() const; -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+ UMLCategory::Category_Type getType(); -+ -+ void setType(Category_Type type); -+ -+protected: -+ -+ bool load(QDomElement & element); -+ -+private: -+ -+ Category_Type m_CategoryType; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/checkconstraint.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/checkconstraint.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/checkconstraint.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/checkconstraint.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,160 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+//own header -+#include "checkconstraint.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "umlcheckconstraintdialog.h" -+ -+/** -+ * Sets up a constraint. -+ * -+ * @param parent The parent of this UMLCheckConstraint. -+ * @param name The name of this UMLCheckConstraint. -+ * @param id The unique id given to this UMLCheckConstraint. -+ */ -+UMLCheckConstraint::UMLCheckConstraint(UMLObject *parent, -+ const QString& name, Uml::ID::Type id) -+ : UMLEntityConstraint(parent, name, id) -+{ -+ init(); -+} -+ -+/** -+ * Sets up a constraint. -+ * -+ * @param parent The parent of this UMLCheckConstraint. -+ */ -+UMLCheckConstraint::UMLCheckConstraint(UMLObject *parent) -+ : UMLEntityConstraint(parent) -+{ -+ init(); -+} -+ -+/** -+ * Overloaded '==' operator. -+ */ -+bool UMLCheckConstraint::operator==(const UMLCheckConstraint &rhs) const -+{ -+ if (this == &rhs) -+ return true; -+ -+ if (!UMLObject::operator==(rhs)) -+ return false; -+ -+ return true; -+} -+ -+/** -+ * Destructor. -+ */ -+UMLCheckConstraint::~UMLCheckConstraint() -+{ -+} -+ -+/** -+ * Copy the internal presentation of this object into the UMLCheckConstraint -+ * object. -+ */ -+void UMLCheckConstraint::copyInto(UMLObject *lhs) const -+{ -+ UMLCheckConstraint *target = static_cast(lhs); -+ -+ // call the parent first. -+ UMLEntityConstraint::copyInto(target); -+ -+ // Copy all datamembers -+ target->m_CheckCondition = m_CheckCondition; -+} -+ -+/** -+ * Make a clone of the UMLCheckConstraint. -+ */ -+UMLObject* UMLCheckConstraint::clone() const -+{ -+ //FIXME: The new attribute should be slaved to the NEW parent not the old. -+ UMLCheckConstraint *clone = new UMLCheckConstraint(static_cast(parent())); -+ copyInto(clone); -+ return clone; -+} -+ -+/** -+ * Returns a string representation of the UMLCheckConstraint. -+ * -+ * @param sig If true will show the attribute type and initial value. -+ * @return Returns a string representation of the UMLAttribute. -+ */ -+QString UMLCheckConstraint::toString(Uml::SignatureType::Enum sig) -+{ -+ QString s; -+ -+ if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::SigNoVis) { -+ s = name() ; -+ } -+ -+ return s; -+} -+ -+QString UMLCheckConstraint::getFullyQualifiedName(const QString& separator, -+ bool includeRoot) const -+{ -+ Q_UNUSED(separator); Q_UNUSED(includeRoot); -+ return this->name(); -+} -+ -+/** -+ * Creates the XMI element. -+ */ -+void UMLCheckConstraint::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement checkConstraintElement = UMLObject::save(QLatin1String("UML:CheckConstraint"), qDoc); -+ -+ QDomNode checkCondition = qDoc.createTextNode(m_CheckCondition); -+ checkConstraintElement.appendChild(checkCondition); -+ -+ qElement.appendChild(checkConstraintElement); -+} -+ -+/** -+ * Display the properties configuration dialog for the attribute. -+ */ -+bool UMLCheckConstraint::showPropertiesDialog(QWidget* parent) -+{ -+ UMLCheckConstraintDialog dialog(parent, this); -+ return dialog.exec(); -+} -+ -+/** -+ * Loads the XMI element. -+ */ -+bool UMLCheckConstraint::load(QDomElement & element) -+{ -+ QDomNode node = element.firstChild(); -+ -+ QDomText checkConstraintText = node.toText(); -+ if (checkConstraintText.isNull()) -+ m_CheckCondition = QString(); -+ else -+ m_CheckCondition = checkConstraintText.data(); -+ -+ return true; -+} -+ -+/** -+ * Initialises Check Constraint -+ */ -+void UMLCheckConstraint::init() -+{ -+ m_BaseType = UMLObject::ot_CheckConstraint; -+ m_CheckCondition.clear(); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/checkconstraint.h umbrello-kf6-15.08.1/umbrello/umlmodel/checkconstraint.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/checkconstraint.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/checkconstraint.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,71 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef CHECKCONSTRAINT_H -+#define CHECKCONSTRAINT_H -+ -+#include "basictypes.h" -+#include "entityconstraint.h" -+ -+/** -+ * This class is used to set up information for a unique entity constraint. -+ * -+ * @short Sets up Check Constraint information for UMLEntities. -+ * @author Sharan Rao -+ * @see UMLObject UMLClassifierListItem UMLEntityConstraint -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLCheckConstraint : public UMLEntityConstraint -+{ -+ Q_OBJECT -+public: -+ -+ UMLCheckConstraint(UMLObject *parent, const QString& name, -+ Uml::ID::Type id = Uml::ID::None); -+ explicit UMLCheckConstraint(UMLObject *parent); -+ -+ bool operator==(const UMLCheckConstraint &rhs) const; -+ -+ virtual ~UMLCheckConstraint(); -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ virtual UMLObject* clone() const; -+ -+ QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -+ -+ QString getFullyQualifiedName(const QString& separator = QString(), -+ bool includeRoot = false) const; -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+ virtual bool showPropertiesDialog(QWidget* parent = 0); -+ -+ QString getCheckCondition() const { -+ return m_CheckCondition; -+ } -+ -+ void setCheckCondition(const QString& condition) { -+ m_CheckCondition = condition.trimmed(); -+ } -+ -+protected: -+ -+ bool load(QDomElement & element); -+ -+private: -+ -+ void init(); -+ -+ QString m_CheckCondition; ///< the check condition -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/classifier.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/classifier.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/classifier.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/classifier.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,1631 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+#include "classifier.h" -+ -+// app includes -+#include "association.h" -+#include "debug_utils.h" -+#include "umlassociationlist.h" -+#include "operation.h" -+#include "attribute.h" -+#include "template.h" -+#include "enumliteral.h" -+#include "entityattribute.h" -+#include "enum.h" -+#include "entity.h" -+#include "stereotype.h" -+#include "umldoc.h" -+#include "uml.h" -+#include "uniqueid.h" -+#include "object_factory.h" -+#include "model_utils.h" -+#include "idchangelog.h" -+#include "umloperationdialog.h" -+#include "umlattributedialog.h" -+#include "umltemplatedialog.h" -+#include "optionstate.h" -+#include "icon_utils.h" -+ -+// kde includes -+#include -+#include -+ -+// qt includes -+#include -+ -+using namespace Uml; -+ -+/** -+ * @brief holds set of classifiers for recursive loop detection -+ */ -+class UMLClassifierSet: public QSet { -+public: -+ UMLClassifierSet() : level(0) -+ { -+ } -+ int level; -+}; -+ -+/** -+ * Sets up a Classifier. -+ * -+ * @param name The name of the Concept. -+ * @param id The unique id of the Concept. -+ */ -+UMLClassifier::UMLClassifier(const QString & name, Uml::ID::Type id) -+ : UMLPackage(name, id) -+{ -+ m_BaseType = UMLObject::ot_Class; // default value -+ m_pClassAssoc = NULL; -+ m_isRef = false; -+} -+ -+/** -+ * Standard deconstructor. -+ */ -+UMLClassifier::~UMLClassifier() -+{ -+} -+ -+/** -+ * Reimplementation of method from class UMLObject for controlling the -+ * exact type of this classifier: class, interface, or datatype. -+ * @param ot the base type to set -+ */ -+void UMLClassifier::setBaseType(UMLObject::ObjectType ot) -+{ -+ m_BaseType = ot; -+ Icon_Utils::IconType newIcon; -+ switch (ot) { -+ case ot_Interface: -+ UMLObject::setStereotypeCmd(QLatin1String("interface")); -+ UMLObject::m_bAbstract = true; -+ newIcon = Icon_Utils::it_Interface; -+ break; -+ case ot_Class: -+ UMLObject::setStereotypeCmd(QString()); -+ UMLObject::m_bAbstract = false; -+ newIcon = Icon_Utils::it_Class; -+ break; -+ case ot_Datatype: -+ UMLObject::setStereotypeCmd(QLatin1String("datatype")); -+ UMLObject::m_bAbstract = false; -+ newIcon = Icon_Utils::it_Datatype; -+ break; -+ case ot_Package: -+ UMLObject::setStereotypeCmd(QString()); -+ UMLObject::m_bAbstract = false; -+ newIcon = Icon_Utils::it_Package; -+ break; -+ default: -+ uError() << "cannot set to type " << ot; -+ return; -+ } -+ Model_Utils::treeViewChangeIcon(this, newIcon); -+} -+ -+/** -+ * Returns true if this classifier represents an interface. -+ */ -+bool UMLClassifier::isInterface() const -+{ -+ return (m_BaseType == ot_Interface); -+} -+ -+/** -+ * Returns true if this classifier represents a datatype. -+ */ -+bool UMLClassifier::isDatatype() const -+{ -+ return (m_BaseType == ot_Datatype); -+} -+ -+/** -+ * Checks whether an operation is valid based on its signature - -+ * An operation is "valid" if the operation's name and parameter list -+ * are unique in the classifier. -+ * -+ * @param name Name of the operation to check. -+ * @param opParams The operation's argument list. -+ * @param exemptOp Pointer to the exempt method (optional.) -+ * @return NULL if the signature is valid (ok), else return a pointer -+ * to the existing UMLOperation that causes the conflict. -+ */ -+UMLOperation * UMLClassifier::checkOperationSignature( -+ const QString& name, -+ UMLAttributeList opParams, -+ UMLOperation *exemptOp) -+{ -+ UMLOperationList list = findOperations(name); -+ if (list.count() == 0) { -+ return NULL; -+ } -+ const int inputParmCount = opParams.count(); -+ -+ // there is at least one operation with the same name... compare the parameter list -+ foreach (UMLOperation* test, list) { -+ if (test == exemptOp) { -+ continue; -+ } -+ UMLAttributeList testParams = test->getParmList(); -+ const int pCount = testParams.count(); -+ if (pCount != inputParmCount) { -+ continue; -+ } -+ int i = 0; -+ while (i < pCount) { -+ // The only criterion for equivalence is the parameter types. -+ // (Default values are not considered.) -+ if(testParams.at(i)->getTypeName() != opParams.at(i)->getTypeName()) -+ break; -+ i++; -+ } -+ if (i == pCount) { // all parameters matched->the signature is not unique -+ return test; -+ } -+ } -+ // we did not find an exact match, so the signature is unique (acceptable) -+ return NULL; -+} -+ -+/** -+ * Find an operation of the given name and parameter signature. -+ * -+ * @param name The name of the operation to find. -+ * @param params The parameter descriptors of the operation to find. -+ * -+ * @return The operation found. Will return 0 if none found. -+ */ -+UMLOperation* UMLClassifier::findOperation(const QString& name, -+ Model_Utils::NameAndType_List params) -+{ -+ UMLOperationList list = findOperations(name); -+ if (list.count() == 0) { -+ return NULL; -+ } -+ // if there are operation(s) with the same name then compare the parameter list -+ const int inputParmCount = params.count(); -+ -+ foreach (UMLOperation* test, list) { -+ UMLAttributeList testParams = test->getParmList(); -+ const int pCount = testParams.count(); -+ if (inputParmCount == 0 && pCount == 0) -+ return test; -+ if (inputParmCount != pCount) -+ continue; -+ int i = 0; -+ for (; i < pCount; ++i) { -+ Model_Utils::NameAndType_ListIt nt(params.begin() + i); -+ UMLClassifier *type = dynamic_cast((*nt).m_type); -+ UMLClassifier *testType = testParams.at(i)->getType(); -+ if (type == NULL && testType == NULL) { //no parameter type -+ continue; -+ } else if (type == NULL) { //template parameter -+ if (testType->name() != QLatin1String("class")) -+ break; -+ } else if (type != testType) -+ break; -+ } -+ if (i == pCount) -+ return test; // all parameters matched -+ } -+ return 0; -+} -+ -+/** -+ * Creates an operation in the current document. -+ * The new operation is initialized with name, id, etc. -+ * If a method with the given profile already exists in the classifier, -+ * no new method is created and the existing operation is returned. -+ * If no name is provided, or if the params are NULL, an Operation -+ * Dialog is shown to ask the user for a name and parameters. -+ * The operation's signature is checked for validity within the parent -+ * classifier. -+ * -+ * @param name The operation name (will be chosen internally if -+ * none given.) -+ * @param isExistingOp Optional pointer to bool. If supplied, the bool is -+ * set to true if an existing operation is returned. -+ * @param params Optional list of parameter names and types. -+ * If supplied, new operation parameters are -+ * constructed using this list. -+ * @return The new operation, or NULL if the operation could not be -+ * created because for example, the user canceled the dialog -+ * or no appropriate name can be found. -+ */ -+UMLOperation* UMLClassifier::createOperation( -+ const QString &name /*=QString()*/, -+ bool *isExistingOp /*=NULL*/, -+ Model_Utils::NameAndType_List *params /*=NULL*/) -+{ -+ bool nameNotSet = (name.isNull() || name.isEmpty()); -+ if (! nameNotSet) { -+ Model_Utils::NameAndType_List parList; -+ if (params) -+ parList = *params; -+ UMLOperation* existingOp = findOperation(name, parList); -+ if (existingOp != NULL) { -+ if (isExistingOp != NULL) -+ *isExistingOp = true; -+ return existingOp; -+ } -+ } -+ // we did not find an exact match, so the signature is unique -+ UMLOperation *op = new UMLOperation(this, name); -+ if (params) { -+ for (Model_Utils::NameAndType_ListIt it = params->begin(); it != params->end(); ++it) { -+ const Model_Utils::NameAndType &nt = *it; -+ UMLAttribute *par = new UMLAttribute(op, nt.m_name, Uml::ID::None, Uml::Visibility::Private, -+ nt.m_type, nt.m_initialValue); -+ par->setParmKind(nt.m_direction); -+ op->addParm(par); -+ } -+ } -+ -+ // Only show the operation dialog if no name was provided (allows quick-create -+ // from listview) -+ if (nameNotSet) { -+ op->setName(uniqChildName(UMLObject::ot_Operation)); -+ -+ while (true) { -+ QPointer operationDialog = new UMLOperationDialog(0, op); -+ if(operationDialog->exec() != QDialog::Accepted) { -+ delete op; -+ delete operationDialog; -+ return NULL; -+ } else if (checkOperationSignature(op->name(), op->getParmList())) { -+ KMessageBox::information(0, -+ i18n("An operation with the same name and signature already exists. You cannot add it again.")); -+ } else { -+ break; -+ } -+ delete operationDialog; -+ } -+ } -+ -+ // operation name is ok, formally add it to the classifier -+ if (! addOperation(op)) { -+ delete op; -+ return NULL; -+ } -+ -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ umldoc->signalUMLObjectCreated(op); -+ return op; -+} -+ -+/** -+ * Appends an operation to the classifier. -+ * This function is mainly intended for the clipboard. -+ * -+ * @param op Pointer to the UMLOperation to add. -+ * @param position Inserted at the given position. -+ * @return True if the operation was added successfully. -+ */ -+bool UMLClassifier::addOperation(UMLOperation* op, int position) -+{ -+ Q_ASSERT(op); -+ if (m_List.indexOf(op) != -1) { -+ uDebug() << "findRef(" << op->name() << ") finds op (bad)"; -+ return false; -+ } -+ if (checkOperationSignature(op->name(), op->getParmList())) { -+ uDebug() << "checkOperationSignature(" << op->name() << ") op is non-unique"; -+ return false; -+ } -+ -+ if (position >= 0 && position <= m_List.count()) { -+ uDebug() << op->name() << ": inserting at position " << position; -+ m_List.insert(position, op); -+ UMLClassifierListItemList itemList = getFilteredList(UMLObject::ot_Operation); -+ QString buf; -+ foreach (UMLClassifierListItem* currentAtt, itemList) { -+ buf.append(QLatin1Char(' ') + currentAtt->name()); -+ } -+ uDebug() << " list after change: " << buf; -+ } -+ else { -+ m_List.append(op); -+ } -+ emit operationAdded(op); -+ UMLObject::emitModified(); -+ connect(op, SIGNAL(modified()), this, SIGNAL(modified())); -+ return true; -+} -+ -+/** -+ * Appends an operation to the classifier. -+ * @see bool addOperation(UMLOperation* Op, int position = -1) -+ * This function is mainly intended for the clipboard. -+ * -+ * @param op Pointer to the UMLOperation to add. -+ * @param log Pointer to the IDChangeLog. -+ * @return True if the operation was added successfully. -+ */ -+bool UMLClassifier::addOperation(UMLOperation* op, IDChangeLog* log) -+{ -+ if (addOperation(op, -1)) { -+ return true; -+ } -+ else if (log) { -+ log->removeChangeByNewID(op->id()); -+ } -+ return false; -+} -+ -+/** -+ * Remove an operation from the Classifier. -+ * The operation is not deleted so the caller is responsible for what -+ * happens to it after this. -+ * -+ * @param op The operation to remove. -+ * @return Count of the remaining operations after removal, or -+ * -1 if the given operation was not found. -+ */ -+int UMLClassifier::removeOperation(UMLOperation *op) -+{ -+ if (op == NULL) { -+ uDebug() << "called on NULL op"; -+ return -1; -+ } -+ if (!m_List.removeAll(op)) { -+ uDebug() << "cannot find op " << op->name() << " in list"; -+ return -1; -+ } -+ // disconnection needed. -+ // note that we don't delete the operation, just remove it from the Classifier -+ disconnect(op, SIGNAL(modified()), this, SIGNAL(modified())); -+ emit operationRemoved(op); -+ UMLObject::emitModified(); -+ return m_List.count(); -+} -+ -+/** -+ * Create and add a just created template. -+ * @param currentName the name of the template -+ * @return the template or NULL -+ */ -+UMLObject* UMLClassifier::createTemplate(const QString& currentName /*= QString()*/) -+{ -+ QString name = currentName; -+ bool goodName = !name.isEmpty(); -+ if (!goodName) { -+ name = uniqChildName(UMLObject::ot_Template); -+ } -+ UMLTemplate* newTemplate = new UMLTemplate(this, name); -+ -+ int button = QDialog::Accepted; -+ -+ while (button == QDialog::Accepted && !goodName) { -+ QPointer templateDialog = new UMLTemplateDialog(0, newTemplate); -+ button = templateDialog->exec(); -+ name = newTemplate->name(); -+ -+ if (name.length() == 0) { -+ KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -+ } -+ else if (findChildObject(name) != NULL) { -+ KMessageBox::error(0, i18n("That name is already being used."), i18n("Not a Unique Name")); -+ } -+ else { -+ goodName = true; -+ } -+ delete templateDialog; -+ } -+ -+ if (button != QDialog::Accepted) { -+ return NULL; -+ } -+ -+ addTemplate(newTemplate); -+ -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ umldoc->signalUMLObjectCreated(newTemplate); -+ return newTemplate; -+} -+ -+/** -+ * Returns the number of attributes for the class. -+ * -+ * @return The number of attributes for the class. -+ */ -+int UMLClassifier::attributes() -+{ -+ UMLClassifierListItemList atts = getFilteredList(UMLObject::ot_Attribute); -+ return atts.count(); -+} -+ -+/** -+ * Returns the attributes for the specified scope. -+ * @return List of true attributes for the class. -+ */ -+UMLAttributeList UMLClassifier::getAttributeList() const -+{ -+ UMLAttributeList attributeList; -+ foreach (UMLObject* listItem, m_List) { -+ uIgnoreZeroPointer(listItem); -+ if (listItem->baseType() == UMLObject::ot_Attribute) { -+ attributeList.append(static_cast(listItem)); -+ } -+ } -+ return attributeList; -+} -+ -+/** -+ * Returns the attributes for the specified scope. -+ * @param scope The scope of the attribute. -+ * @return List of true attributes for the class. -+ */ -+UMLAttributeList UMLClassifier::getAttributeList(Visibility::Enum scope) const -+{ -+ UMLAttributeList list; -+ if (!isInterface()) -+ { -+ UMLAttributeList atl = getAttributeList(); -+ foreach(UMLAttribute* at, atl) -+ { -+ uIgnoreZeroPointer(at); -+ if (! at->isStatic()) -+ { -+ if (scope == Uml::Visibility::Private) -+ { -+ if ((at->visibility() == Uml::Visibility::Private) || -+ (at->visibility() == Uml::Visibility::Implementation)) -+ { -+ list.append(at); -+ } -+ } -+ else if (scope == at->visibility()) -+ { -+ list.append(at); -+ } -+ } -+ } -+ } -+ return list; -+} -+ -+/** -+ * Returns the static attributes for the specified scope. -+ * -+ * @param scope The scope of the attribute. -+ * @return List of true attributes for the class. -+ */ -+UMLAttributeList UMLClassifier::getAttributeListStatic(Visibility::Enum scope) const -+{ -+ UMLAttributeList list; -+ if (!isInterface()) -+ { -+ UMLAttributeList atl = getAttributeList(); -+ foreach(UMLAttribute* at, atl) -+ { -+ uIgnoreZeroPointer(at); -+ if (at->isStatic()) -+ { -+ if (scope == Uml::Visibility::Private) -+ { -+ if ((at->visibility() == Uml::Visibility::Private) || -+ (at->visibility() == Uml::Visibility::Implementation)) -+ { -+ list.append(at); -+ } -+ } -+ else if (scope == at->visibility()) -+ { -+ list.append(at); -+ } -+ } -+ } -+ } -+ return list; -+} -+ -+/** -+ * Find a list of operations with the given name. -+ * -+ * @param n The name of the operation to find. -+ * @return The list of objects found; will be empty if none found. -+ */ -+UMLOperationList UMLClassifier::findOperations(const QString &n) -+{ -+ const bool caseSensitive = UMLApp::app()->activeLanguageIsCaseSensitive(); -+ UMLOperationList list; -+ foreach (UMLObject* obj, m_List) { -+ uIgnoreZeroPointer(obj); -+ if (obj->baseType() != UMLObject::ot_Operation) -+ continue; -+ UMLOperation *op = static_cast(obj); -+ if (caseSensitive) { -+ if (obj->name() == n) -+ list.append(op); -+ } else if (obj->name().toLower() == n.toLower()) { -+ list.append(op); -+ } -+ } -+ return list; -+} -+ -+/** -+ * Find the child object by the given id. -+ * @param id the id of the child object -+ * @param considerAncestors flag whether the ancestors should be considered during search -+ * @return the found child object or NULL -+ */ -+UMLObject* UMLClassifier::findChildObjectById(Uml::ID::Type id, bool considerAncestors /* =false */) -+{ -+ UMLObject *o = UMLCanvasObject::findChildObjectById(id); -+ if (o) { -+ return o; -+ } -+ if (considerAncestors) { -+ UMLClassifierList ancestors = findSuperClassConcepts(); -+ foreach (UMLClassifier *anc, ancestors) { -+ UMLObject *o = anc->findChildObjectById(id); -+ if (o) { -+ return o; -+ } -+ } -+ } -+ return NULL; -+} -+ -+/** -+ * Returns a list of concepts which inherit from this concept. -+ * -+ * @param type The ClassifierType to seek. -+ * @return List of UMLClassifiers that inherit from us. -+ */ -+UMLClassifierList UMLClassifier::findSubClassConcepts (ClassifierType type) -+{ -+ UMLClassifierList list = getSubClasses(); -+ UMLAssociationList rlist = getRealizations(); -+ -+ UMLClassifierList inheritingConcepts; -+ Uml::ID::Type myID = id(); -+ foreach(UMLClassifier *c, list) { -+ uIgnoreZeroPointer(c); -+ if (type == ALL || (!c->isInterface() && type == CLASS) -+ || (c->isInterface() && type == INTERFACE)) { -+ inheritingConcepts.append(c); -+ } -+ } -+ -+ foreach (UMLAssociation *a, rlist) { -+ uIgnoreZeroPointer(a); -+ if (a->getObjectId(RoleType::A) != myID) -+ { -+ UMLObject* obj = a->getObject(RoleType::A); -+ UMLClassifier *concept = dynamic_cast(obj); -+ if (concept && (type == ALL || (!concept->isInterface() && type == CLASS) -+ || (concept->isInterface() && type == INTERFACE)) -+ && (inheritingConcepts.indexOf(concept) == -1)) -+ { -+ inheritingConcepts.append(concept); -+ } -+ } -+ } -+ -+ return inheritingConcepts; -+} -+ -+/** -+ * Returns a list of concepts which this concept inherits from. -+ * -+ * @param type The ClassifierType to seek. -+ * @return List of UMLClassifiers we inherit from. -+ */ -+UMLClassifierList UMLClassifier::findSuperClassConcepts (ClassifierType type) -+{ -+ UMLClassifierList list = getSuperClasses(); -+ UMLAssociationList rlist = getRealizations(); -+ -+ UMLClassifierList parentConcepts; -+ Uml::ID::Type myID = id(); -+ foreach (UMLClassifier *concept, list) { -+ uIgnoreZeroPointer(concept); -+ if (type == ALL || (!concept->isInterface() && type == CLASS) -+ || (concept->isInterface() && type == INTERFACE)) -+ parentConcepts.append(concept); -+ } -+ -+ foreach (UMLAssociation *a, rlist) { -+ if (a->getObjectId(RoleType::A) == myID) -+ { -+ UMLObject* obj = a->getObject(RoleType::B); -+ UMLClassifier *concept = dynamic_cast(obj); -+ if (concept && (type == ALL || (!concept->isInterface() && type == CLASS) -+ || (concept->isInterface() && type == INTERFACE)) -+ && (parentConcepts.indexOf(concept) == -1)) -+ parentConcepts.append(concept); -+ } -+ } -+ -+ return parentConcepts; -+} -+ -+/** -+ * Overloaded '==' operator. -+ */ -+bool UMLClassifier::operator==(const UMLClassifier & rhs) const -+{ -+ return UMLCanvasObject::operator==(rhs); -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLClassifier::copyInto(UMLObject *lhs) const -+{ -+ UMLClassifier *target = static_cast(lhs); -+ UMLCanvasObject::copyInto(target); -+ target->setBaseType(m_BaseType); -+ // CHECK: association property m_pClassAssoc is not copied -+ m_List.copyInto(&(target->m_List)); -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLClassifier::clone() const -+{ -+ UMLClassifier *clone = new UMLClassifier(); -+ copyInto(clone); -+ return clone; -+} -+ -+/** -+ * Needs to be called after all UML objects are loaded from file. -+ * Calls the parent resolveRef(), and calls resolveRef() on all -+ * UMLClassifierListItems. -+ * Overrides the method from UMLObject. -+ * -+ * @return true for success. -+ */ -+bool UMLClassifier::resolveRef() -+{ -+ bool success = UMLPackage::resolveRef(); -+ // Using reentrant iteration is a bare necessity here: -+ foreach (UMLObject* obj, m_List) { -+ uIgnoreZeroPointer(obj); -+ /**** For reference, here is the non-reentrant iteration scheme - -+ DO NOT USE THIS ! -+ for (UMLObject *obj = m_List.first(); obj; obj = m_List.next()) -+ { .... } -+ ****/ -+ if (obj->resolveRef()) { -+ UMLClassifierListItem *cli = static_cast(obj); -+ switch (cli->baseType()) { -+ case UMLObject::ot_Attribute: -+ emit attributeAdded(cli); -+ break; -+ case UMLObject::ot_Operation: -+ emit operationAdded(cli); -+ break; -+ case UMLObject::ot_Template: -+ emit templateAdded(cli); -+ break; -+ default: -+ break; -+ } -+ } -+ } -+ return success; -+} -+ -+/** -+ * Reimplemented from UMLObject. -+ */ -+bool UMLClassifier::acceptAssociationType(AssociationType::Enum type) -+{ -+ switch(type) -+ { -+ case AssociationType::Generalization: -+ case AssociationType::Aggregation: -+ case AssociationType::Relationship: -+ case AssociationType::Dependency: -+ case AssociationType::Association: -+ case AssociationType::Association_Self: -+ case AssociationType::Containment: -+ case AssociationType::Composition: -+ case AssociationType::Realization: -+ case AssociationType::UniAssociation: -+ return true; -+ default: -+ return false; -+ } -+ return false; //shutup compiler warning -+} -+ -+/** -+ * Creates an attribute for the class. -+ * -+ * @param name An optional name, used by when creating through UMLListView -+ * @param type An optional type, used by when creating through UMLListView -+ * @param vis An optional visibility, used by when creating through UMLListView -+ * @param init An optional initial value, used by when creating through UMLListView -+ * @return The UMLAttribute created -+ */ -+UMLAttribute* UMLClassifier::createAttribute(const QString &name, -+ UMLObject *type, -+ Visibility::Enum vis, -+ const QString &init) -+{ -+ Uml::ID::Type id = UniqueID::gen(); -+ QString currentName; -+ if (name.isNull()) { -+ currentName = uniqChildName(UMLObject::ot_Attribute); -+ } else { -+ currentName = name; -+ } -+ UMLAttribute* newAttribute = new UMLAttribute(this, currentName, id, vis, type, init); -+ -+ int button = QDialog::Accepted; -+ bool goodName = false; -+ -+ //check for name.isNull() stops dialog being shown -+ //when creating attribute via list view -+ while (button == QDialog::Accepted && !goodName && name.isNull()) { -+ QPointer attributeDialog = new UMLAttributeDialog(0, newAttribute); -+ button = attributeDialog->exec(); -+ QString name = newAttribute->name(); -+ -+ if(name.length() == 0) { -+ KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -+ } else if (findChildObject(name) != NULL) { -+ KMessageBox::error(0, i18n("That name is already being used."), i18n("Not a Unique Name")); -+ } else { -+ goodName = true; -+ } -+ delete attributeDialog; -+ } -+ -+ if (button != QDialog::Accepted) { -+ delete newAttribute; -+ return NULL; -+ } -+ -+ addAttribute(newAttribute); -+ -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ umldoc->signalUMLObjectCreated(newAttribute); -+ return newAttribute; -+} -+ -+/** -+ * Creates and adds an attribute for the class. -+ * -+ * @param name an optional name, used by when creating through UMLListView -+ * @param id an optional id -+ * @return the UMLAttribute created and added -+ */ -+ -+UMLAttribute* UMLClassifier::addAttribute(const QString &name, Uml::ID::Type id /* = Uml::id_None */) -+{ -+ foreach (UMLObject* obj, m_List) { -+ uIgnoreZeroPointer(obj); -+ if (obj->baseType() == UMLObject::ot_Attribute && obj->name() == name) -+ return static_cast(obj); -+ } -+ Uml::Visibility::Enum scope = Settings::optionState().classState.defaultAttributeScope; -+ UMLAttribute *a = new UMLAttribute(this, name, id, scope); -+ m_List.append(a); -+ emit attributeAdded(a); -+ UMLObject::emitModified(); -+ connect(a, SIGNAL(modified()), this, SIGNAL(modified())); -+ return a; -+} -+ -+/** -+ * Adds an already created attribute. -+ * The attribute object must not belong to any other concept. -+ * -+ * @param name the name of the attribute -+ * @param type the type of the attribute -+ * @param scope the visibility of the attribute -+ * @return the just created and added attribute -+ */ -+UMLAttribute* UMLClassifier::addAttribute(const QString &name, UMLObject *type, Visibility::Enum scope) -+{ -+ UMLAttribute *a = new UMLAttribute(this); -+ a->setName(name); -+ a->setVisibility(scope); -+ a->setID(UniqueID::gen()); -+ if (type) { -+ a->setType(type); -+ } -+ m_List.append(a); -+ emit attributeAdded(a); -+ UMLObject::emitModified(); -+ connect(a, SIGNAL(modified()), this, SIGNAL(modified())); -+ return a; -+} -+ -+/** -+ * Adds an already created attribute. -+ * The attribute object must not belong to any other concept. -+ * -+ * @param att Pointer to the UMLAttribute. -+ * @param log Pointer to the IDChangeLog (optional.) -+ * @param position Position index for the insertion (optional.) -+ * If the position is omitted, or if it is -+ * negative or too large, the attribute is added -+ * to the end of the list. -+ * @return True if the attribute was successfully added. -+ */ -+bool UMLClassifier::addAttribute(UMLAttribute* att, IDChangeLog* log /* = 0 */, -+ int position /* = -1 */) -+{ -+ Q_ASSERT(att); -+ if (findChildObject(att->name()) == NULL) { -+ att->setParent(this); -+ if (position >= 0 && position < (int)m_List.count()) { -+ m_List.insert(position, att); -+ } -+ else { -+ m_List.append(att); -+ } -+ emit attributeAdded(att); -+ UMLObject::emitModified(); -+ connect(att, SIGNAL(modified()), this, SIGNAL(modified())); -+ return true; -+ } else if (log) { -+ log->removeChangeByNewID(att->id()); -+ delete att; -+ } -+ return false; -+} -+ -+/** -+ * Removes an attribute from the class. -+ * -+ * @param att The attribute to remove. -+ * @return Count of the remaining attributes after removal. -+ * Returns -1 if the given attribute was not found. -+ */ -+int UMLClassifier::removeAttribute(UMLAttribute* att) -+{ -+ if (!m_List.removeAll(att)) { -+ uDebug() << "cannot find att given in list"; -+ return -1; -+ } -+ emit attributeRemoved(att); -+ UMLObject::emitModified(); -+ // If we are deleting the object, then we don't need to disconnect..this is done auto-magically -+ // for us by QObject. -b.t. -+ // disconnect(att, SIGNAL(modified()), this, SIGNAL(modified())); -+ delete att; -+ return m_List.count(); -+} -+ -+/** -+ * Sets the UMLAssociation for which this class shall act as an -+ * association class. -+ */ -+void UMLClassifier::setClassAssoc(UMLAssociation *assoc) -+{ -+ m_pClassAssoc = assoc; -+} -+ -+/** -+ * Returns the UMLAssociation for which this class acts as an -+ * association class. Returns NULL if this class does not act -+ * as an association class. -+ */ -+UMLAssociation *UMLClassifier::getClassAssoc() const -+{ -+ return m_pClassAssoc; -+} -+ -+/** -+ * Return true if this classifier has abstract operations. -+ */ -+bool UMLClassifier::hasAbstractOps () -+{ -+ UMLOperationList opl(getOpList()); -+ foreach(UMLOperation *op, opl) { -+ uIgnoreZeroPointer(op); -+ if (op->isAbstract()) { -+ return true; -+ } -+ } -+ return false; -+} -+ -+/** -+ * Counts the number of operations in the Classifier. -+ * -+ * @return The number of operations for the Classifier. -+ */ -+int UMLClassifier::operations() -+{ -+ return getOpList().count(); -+} -+ -+ -+/** -+ * Return a list of operations for the Classifier. -+ * -+ * @param includeInherited Includes operations from superclasses. -+ * @param alreadyTraversed internal used object to avoid recursive loops -+ * @return The list of operations for the Classifier. -+ */ -+UMLOperationList UMLClassifier::getOpList(bool includeInherited, UMLClassifierSet *alreadyTraversed) -+{ -+ UMLOperationList ops; -+ foreach (UMLObject* li, m_List) { -+ uIgnoreZeroPointer(li); -+ if (li->baseType() == ot_Operation) { -+ ops.append(static_cast(li)); -+ } -+ } -+ if (includeInherited) { -+ if (!alreadyTraversed) { -+ alreadyTraversed = new UMLClassifierSet; -+ } -+ else -+ alreadyTraversed->level++; -+ -+ if (!alreadyTraversed->contains(this)) -+ *alreadyTraversed << this; -+ -+ // get a list of parents of this class -+ UMLClassifierList parents = findSuperClassConcepts(); -+ foreach(UMLClassifier *c, parents) { -+ if (alreadyTraversed->contains(c)) { -+ uError() << "class " << c->name() << " is starting a dependency loop!"; -+ continue; -+ } -+ // get operations for each parent by recursive call -+ UMLOperationList pops = c->getOpList(true, alreadyTraversed); -+ // add these operations to operation list, but only if unique. -+ foreach (UMLOperation *po, pops) { -+ QString po_as_string(po->toString(Uml::SignatureType::SigNoVis)); -+ bool breakFlag = false; -+ foreach (UMLOperation* o, ops) { -+ if (o->toString(Uml::SignatureType::SigNoVis) == po_as_string) { -+ breakFlag = true; -+ break; -+ } -+ } -+ if (breakFlag == false) -+ ops.append(po); -+ } -+ // remember this node -+ *alreadyTraversed << c; -+ } -+ if (alreadyTraversed->level-- == 0) { -+ delete alreadyTraversed; -+ alreadyTraversed = 0; -+ } -+ } -+ return ops; -+} -+ -+/** -+ * Returns the entries in m_List that are of the requested type. -+ * If the requested type is UMLObject::ot_UMLObject then all entries -+ * are returned. -+ * @param ot the requested object type -+ * @return The list of true operations for the Concept. -+ */ -+UMLClassifierListItemList UMLClassifier::getFilteredList(UMLObject::ObjectType ot) const -+{ -+ UMLClassifierListItemList resultList; -+ foreach (UMLObject* o, m_List) { -+ uIgnoreZeroPointer(o); -+ if (!o || o->baseType() == UMLObject::ot_Association) { -+ continue; -+ } -+ UMLClassifierListItem *listItem = static_cast(o); -+ if (ot == UMLObject::ot_UMLObject || listItem->baseType() == ot) { -+ resultList.append(listItem); -+ } -+ } -+ return resultList; -+} -+ -+/** -+ * Adds an already created template. -+ * The template object must not belong to any other concept. -+ * -+ * @param name the name of the template -+ * @param id the id of the template -+ * @return the added template -+ */ -+UMLTemplate* UMLClassifier::addTemplate(const QString &name, Uml::ID::Type id) -+{ -+ UMLTemplate *templt = findTemplate(name); -+ if (templt) { -+ return templt; -+ } -+ templt = new UMLTemplate(this, name, id); -+ m_List.append(templt); -+ emit templateAdded(templt); -+ UMLObject::emitModified(); -+ connect(templt, SIGNAL(modified()), this, SIGNAL(modified())); -+ return templt; -+} -+ -+/** -+ * Adds an already created template. -+ * The template object must not belong to any other concept. -+ * -+ * @param newTemplate Pointer to the UMLTemplate object to add. -+ * @param log Pointer to the IDChangeLog. -+ * @return True if the template was successfully added. -+ */ -+bool UMLClassifier::addTemplate(UMLTemplate* newTemplate, IDChangeLog* log /* = 0*/) -+{ -+ QString name = newTemplate->name(); -+ if (findChildObject(name) == NULL) { -+ newTemplate->setParent(this); -+ m_List.append(newTemplate); -+ emit templateAdded(newTemplate); -+ UMLObject::emitModified(); -+ connect(newTemplate, SIGNAL(modified()), this, SIGNAL(modified())); -+ return true; -+ } -+ else if (log) { -+ log->removeChangeByNewID(newTemplate->id()); -+ delete newTemplate; -+ } -+ return false; -+} -+ -+/** -+ * Adds an template to the class. -+ * The template object must not belong to any other class. -+ * TODO: If the param IDChangeLog from the method above is not being used, -+ * give position a default value of -1 and the method can replace the above one. -+ * @param templt Pointer to the UMLTemplate to add. -+ * @param position The position of the template in the list. -+ * A value of -1 will add the template at the end. -+ * @return True if the template was successfully added. -+ */ -+bool UMLClassifier::addTemplate(UMLTemplate* templt, int position) -+{ -+ Q_ASSERT(templt); -+ QString name = templt->name(); -+ if (findChildObject(name) == NULL) { -+ templt->setParent(this); -+ if (position >= 0 && position <= (int)m_List.count()) { -+ m_List.insert(position, templt); -+ } -+ else { -+ m_List.append(templt); -+ } -+ emit templateAdded(templt); -+ UMLObject::emitModified(); -+ connect(templt, SIGNAL(modified()), this, SIGNAL(modified())); -+ return true; -+ } -+ //else -+ return false; -+} -+ -+/** -+ * Removes a template from the class. -+ * -+ * @param umltemplate The template to remove. -+ * @return Count of the remaining templates after removal. -+ * Returns -1 if the given template was not found. -+ */ -+int UMLClassifier::removeTemplate(UMLTemplate* umltemplate) -+{ -+ if (!m_List.removeAll(umltemplate)) { -+ uWarning() << "cannot find att given in list"; -+ return -1; -+ } -+ emit templateRemoved(umltemplate); -+ UMLObject::emitModified(); -+ disconnect(umltemplate, SIGNAL(modified()), this, SIGNAL(modified())); -+ return m_List.count(); -+} -+ -+/** -+ * Seeks the template parameter of the given name. -+ * @param name the template name -+ * @return the found template or 0 -+ */ -+UMLTemplate *UMLClassifier::findTemplate(const QString& name) -+{ -+ UMLTemplateList templParams = getTemplateList(); -+ foreach (UMLTemplate *templt, templParams) { -+ if (templt->name() == name) { -+ return templt; -+ } -+ } -+ return 0; -+} -+ -+/** -+ * Returns the number of templates for the class. -+ * -+ * @return The number of templates for the class. -+ */ -+int UMLClassifier::templates() -+{ -+ UMLClassifierListItemList tempList = getFilteredList(UMLObject::ot_Template); -+ return tempList.count(); -+} -+ -+/** -+ * Returns the templates. -+ * Same as UMLClassifier::getFilteredList(ot_Template) but -+ * return type is a true UMLTemplateList. -+ * -+ * @return Pointer to the list of true templates for the class. -+ */ -+UMLTemplateList UMLClassifier::getTemplateList() const -+{ -+ UMLTemplateList templateList; -+ foreach (UMLObject* listItem, m_List) { -+ uIgnoreZeroPointer(listItem); -+ if (listItem->baseType() == UMLObject::ot_Template) { -+ templateList.append(static_cast(listItem)); -+ } -+ } -+ return templateList; -+} -+ -+/** -+ * Take and return a subordinate item from this classifier. -+ * Ownership of the item is passed to the caller. -+ * -+ * @param item Subordinate item to take. -+ * @return Index in m_List of the item taken. -+ * Return -1 if the item is not found in m_List. -+ */ -+int UMLClassifier::takeItem(UMLClassifierListItem *item) -+{ -+ QString buf; -+ foreach (UMLObject* currentAtt, m_List) { -+ uIgnoreZeroPointer(currentAtt); -+ QString txt = currentAtt->name(); -+ if (txt.isEmpty()) { -+ txt = QLatin1String("Type-") + QString::number((int) currentAtt->baseType()); -+ } -+ buf.append(QLatin1Char(' ') + currentAtt->name()); -+ } -+ uDebug() << " UMLClassifier::takeItem (before): m_List is " << buf; -+ -+ int index = m_List.indexOf(item); -+ if (index == -1) { -+ return -1; -+ } -+ switch (item->baseType()) { -+ case UMLObject::ot_Operation: { -+ if (removeOperation(dynamic_cast(item)) < 0) { -+ index = -1; -+ } -+ break; -+ } -+ case UMLObject::ot_Attribute: { -+ UMLAttribute *retval = dynamic_cast(m_List.takeAt(index).data()); -+ if (retval) { -+ emit attributeRemoved(retval); -+ UMLObject::emitModified(); -+ } else { -+ index = -1; -+ } -+ break; -+ } -+ case UMLObject::ot_Template: { -+ UMLTemplate *templt = dynamic_cast(m_List.takeAt(index).data()); -+ if (templt) { -+ emit templateRemoved(templt); -+ UMLObject::emitModified(); -+ } else { -+ index = -1; -+ } -+ break; -+ } -+ case UMLObject::ot_EnumLiteral: { -+ UMLEnumLiteral *el = dynamic_cast(m_List.takeAt(index).data()); -+ if (el) { -+ UMLEnum *e = static_cast(this); -+ e->signalEnumLiteralRemoved(el); -+ UMLObject::emitModified(); -+ } else { -+ index = -1; -+ } -+ break; -+ } -+ case UMLObject::ot_EntityAttribute: { -+ UMLEntityAttribute* el = dynamic_cast(m_List.takeAt(index).data()); -+ if (el) { -+ UMLEntity *e = static_cast(this); -+ e->signalEntityAttributeRemoved(el); -+ UMLObject::emitModified(); -+ } else { -+ index = -1; -+ } -+ break; -+ } -+ default: -+ index = -1; -+ break; -+ } -+ return index; -+} -+ -+/** -+ * Set the origin type (in case of e.g. typedef) -+ * @param origType the origin type to set -+ */ -+void UMLClassifier::setOriginType(UMLClassifier *origType) -+{ -+ m_pSecondary = origType; -+} -+ -+/** -+ * Get the origin type (in case of e.g. typedef) -+ * @return the origin type -+ */ -+UMLClassifier * UMLClassifier::originType() const -+{ -+ return dynamic_cast(m_pSecondary.data()); -+} -+ -+/** -+ * Set the m_isRef flag (true when dealing with a pointer type) -+ * @param isRef the flag to set -+ */ -+void UMLClassifier::setIsReference(bool isRef) -+{ -+ m_isRef = isRef; -+} -+ -+/** -+ * Get the m_isRef flag. -+ * @return true if is reference, otherwise false -+ */ -+bool UMLClassifier::isReference() const -+{ -+ return m_isRef; -+} -+ -+/** -+ * Return true if this classifier has associations. -+ * @return true if classifier has associations -+ */ -+bool UMLClassifier::hasAssociations() -+{ -+ return getSpecificAssocs(AssociationType::Association).count() > 0 -+ || getAggregations().count() > 0 -+ || getCompositions().count() > 0 -+ || getUniAssociationToBeImplemented().count() > 0; -+} -+ -+/** -+ * Return true if this classifier has attributes. -+ */ -+bool UMLClassifier::hasAttributes() -+{ -+ return getAttributeList(Uml::Visibility::Public).count() > 0 -+ || getAttributeList(Uml::Visibility::Protected).count() > 0 -+ || getAttributeList(Uml::Visibility::Private).count() > 0 -+ || getAttributeListStatic(Uml::Visibility::Public).count() > 0 -+ || getAttributeListStatic(Uml::Visibility::Protected).count() > 0 -+ || getAttributeListStatic(Uml::Visibility::Private).count() > 0; -+} -+ -+/** -+ * Return true if this classifier has static attributes. -+ */ -+bool UMLClassifier::hasStaticAttributes() -+{ -+ return getAttributeListStatic(Uml::Visibility::Public).count() > 0 -+ || getAttributeListStatic(Uml::Visibility::Protected).count() > 0 -+ || getAttributeListStatic(Uml::Visibility::Private).count() > 0; -+} -+ -+/** -+ * Return true if this classifier has accessor methods. -+ */ -+bool UMLClassifier::hasAccessorMethods() -+{ -+ return hasAttributes() || hasAssociations(); -+} -+ -+/** -+ * Return true if this classifier has operation methods. -+ */ -+bool UMLClassifier::hasOperationMethods() -+{ -+ return getOpList().last() ? true : false; -+} -+ -+/** -+ * Return true if this classifier has methods. -+ */ -+bool UMLClassifier::hasMethods() -+{ -+ return hasOperationMethods() || hasAccessorMethods(); -+} -+ -+// this is a bit too simplistic..some associations are for -+// SINGLE objects, and WONT be declared as Vectors, so this -+// is a bit overly inclusive (I guess that's better than the other way around) -+ -+/** -+ * Return true if this classifier has vector fields. -+ */ -+bool UMLClassifier::hasVectorFields() -+{ -+ return hasAssociations(); -+} -+ -+/** -+ * Return the list of unidirectional association that should show up in the code -+ */ -+UMLAssociationList UMLClassifier::getUniAssociationToBeImplemented() -+{ -+ UMLAssociationList associations = getSpecificAssocs(AssociationType::UniAssociation); -+ UMLAssociationList uniAssocListToBeImplemented; -+ -+ foreach (UMLAssociation *a, associations) { -+ uIgnoreZeroPointer(a); -+ if (a->getObjectId(RoleType::B) == id()) { -+ continue; // we need to be at the A side -+ } -+ QString roleNameB = a->getRoleName(RoleType::B); -+ if (!roleNameB.isEmpty()) { -+ UMLAttributeList atl = getAttributeList(); -+ bool found = false; -+ //make sure that an attribute with the same name doesn't already exist -+ foreach (UMLAttribute *at, atl) { -+ uIgnoreZeroPointer(a); -+ if (at->name() == roleNameB) { -+ found = true; -+ break; -+ } -+ } -+ if (!found) { -+ uniAssocListToBeImplemented.append(a); -+ } -+ } -+ } -+ return uniAssocListToBeImplemented; -+} -+ -+/** -+ * Creates XML tag , , or -+ * depending on m_BaseType. -+ * Saves possible template parameters, generalizations, attributes, -+ * operations, and contained objects to the given QDomElement. -+ */ -+void UMLClassifier::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QString tag; -+ switch (m_BaseType) { -+ case UMLObject::ot_Class: -+ tag = QLatin1String("UML:Class"); -+ break; -+ case UMLObject::ot_Interface: -+ tag = QLatin1String("UML:Interface"); -+ break; -+ case UMLObject::ot_Datatype: -+ tag = QLatin1String("UML:DataType"); -+ break; -+ case UMLObject::ot_Package: -+ UMLPackage::saveToXMI(qDoc, qElement); -+ return; -+ break; -+ default: -+ uError() << "internal error: basetype is " << m_BaseType; -+ return; -+ } -+ QDomElement classifierElement = UMLObject::save(tag, qDoc); -+ if (m_BaseType == UMLObject::ot_Datatype && m_pSecondary != NULL) -+ classifierElement.setAttribute(QLatin1String("elementReference"), -+ Uml::ID::toString(m_pSecondary->id())); -+ -+ //save templates -+ UMLClassifierListItemList list = getFilteredList(UMLObject::ot_Template); -+ if (list.count()) { -+ QDomElement tmplElement = qDoc.createElement(QLatin1String("UML:ModelElement.templateParameter")); -+ foreach (UMLClassifierListItem *tmpl, list) { -+ tmpl->saveToXMI(qDoc, tmplElement); -+ } -+ classifierElement.appendChild(tmplElement); -+ } -+ -+ //save generalizations (we are the subclass, the other end is the superclass) -+ UMLAssociationList generalizations = getSpecificAssocs(AssociationType::Generalization); -+ if (generalizations.count()) { -+ QDomElement genElement = qDoc.createElement(QLatin1String("UML:GeneralizableElement.generalization")); -+ foreach (UMLAssociation *a, generalizations) { -+ // We are the subclass if we are at the role A end. -+ if (m_nId != a->getObjectId(RoleType::A)) { -+ continue; -+ } -+ QDomElement gElem = qDoc.createElement(QLatin1String("UML:Generalization")); -+ gElem.setAttribute(QLatin1String("xmi.idref"), Uml::ID::toString(a->id())); -+ genElement.appendChild(gElem); -+ } -+ if (genElement.hasChildNodes()) { -+ classifierElement.appendChild(genElement); -+ } -+ } -+ -+ // save attributes -+ QDomElement featureElement = qDoc.createElement(QLatin1String("UML:Classifier.feature")); -+ UMLClassifierListItemList attList = getFilteredList(UMLObject::ot_Attribute); -+ foreach (UMLClassifierListItem *pAtt, attList) { -+ pAtt->saveToXMI(qDoc, featureElement); -+ } -+ -+ // save operations -+ UMLOperationList opList = getOpList(); -+ foreach (UMLOperation *pOp, opList) { -+ pOp->saveToXMI(qDoc, featureElement); -+ } -+ if (featureElement.hasChildNodes()) { -+ classifierElement.appendChild(featureElement); -+ } -+ -+ // save contained objects -+ if (m_objects.count()) { -+ QDomElement ownedElement = qDoc.createElement(QLatin1String("UML:Namespace.ownedElement")); -+ foreach (UMLObject* obj, m_objects) { -+ uIgnoreZeroPointer(obj); -+ obj->saveToXMI (qDoc, ownedElement); -+ } -+ classifierElement.appendChild(ownedElement); -+ } -+ qElement.appendChild(classifierElement); -+} -+ -+/** -+ * Create a new ClassifierListObject (attribute, operation, template) -+ * according to the given XMI tag. -+ * Returns NULL if the string given does not contain one of the tags -+ * , , or . -+ * Used by the clipboard for paste operation. -+ */ -+UMLClassifierListItem* UMLClassifier::makeChildObject(const QString& xmiTag) -+{ -+ UMLClassifierListItem* pObject = NULL; -+ if (UMLDoc::tagEq(xmiTag, QLatin1String("Operation")) || -+ UMLDoc::tagEq(xmiTag, QLatin1String("ownedOperation"))) { -+ pObject = new UMLOperation(this); -+ } else if (UMLDoc::tagEq(xmiTag, QLatin1String("Attribute")) || -+ UMLDoc::tagEq(xmiTag, QLatin1String("ownedAttribute"))) { -+ if (baseType() != UMLObject::ot_Class) -+ return NULL; -+ pObject = new UMLAttribute(this); -+ } else if (UMLDoc::tagEq(xmiTag, QLatin1String("TemplateParameter"))) { -+ pObject = new UMLTemplate(this); -+ } -+ return pObject; -+} -+ -+/** -+ * Auxiliary to loadFromXMI: -+ * The loading of operations is implemented here. -+ * Calls loadSpecialized() for any other tag. -+ * Child classes can override the loadSpecialized method -+ * to load its additional tags. -+ */ -+bool UMLClassifier::load(QDomElement& element) -+{ -+ UMLClassifierListItem *child = NULL; -+ m_SecondaryId = element.attribute(QLatin1String("elementReference")); -+ if (!m_SecondaryId.isEmpty()) { -+ // @todo We do not currently support composition. -+ m_isRef = true; -+ } -+ bool totalSuccess = true; -+ for (QDomNode node = element.firstChild(); !node.isNull(); -+ node = node.nextSibling()) { -+ if (node.isComment()) -+ continue; -+ element = node.toElement(); -+ QString tag = element.tagName(); -+ QString stereotype = element.attribute(QLatin1String("stereotype")); -+ if (UMLDoc::tagEq(tag, QLatin1String("ModelElement.templateParameter")) || -+ UMLDoc::tagEq(tag, QLatin1String("Classifier.feature")) || -+ UMLDoc::tagEq(tag, QLatin1String("Namespace.ownedElement")) || -+ UMLDoc::tagEq(tag, QLatin1String("Element.ownedElement")) || // Embarcadero's Describe -+ UMLDoc::tagEq(tag, QLatin1String("Namespace.contents"))) { -+ load(element); -+ // Not evaluating the return value from load() -+ // because we want a best effort. -+ -+ } else if ((child = makeChildObject(tag)) != NULL) { -+ if (child->loadFromXMI(element)) { -+ switch (child->baseType()) { -+ case UMLObject::ot_Template: -+ addTemplate(static_cast(child)); -+ break; -+ case UMLObject::ot_Operation: -+ if (! addOperation(static_cast(child))) { -+ uError() << "error from addOperation(op)"; -+ delete child; -+ totalSuccess = false; -+ } -+ break; -+ case UMLObject::ot_Attribute: -+ addAttribute(static_cast(child)); -+ break; -+ default: -+ break; -+ } -+ } else { -+ uWarning() << "failed to load " << tag; -+ delete child; -+ totalSuccess = false; -+ } -+ } else if (!Model_Utils::isCommonXMIAttribute(tag)) { -+ UMLObject *pObject = Object_Factory::makeObjectFromXMI(tag, stereotype); -+ if (pObject == NULL) { -+ // Not setting totalSuccess to false -+ // because we want a best effort. -+ continue; -+ } -+ pObject->setUMLPackage(this); -+ if (! pObject->loadFromXMI(element)) { -+ removeObject(pObject); -+ delete pObject; -+ totalSuccess = false; -+ } -+ } -+ } -+ return totalSuccess; -+} -+ -+/* -+UMLClassifierList UMLClassifier::getPlainAssocChildClassifierList() -+{ -+ UMLAssociationList plainAssociations = getSpecificAssocs(Uml::AssociationType::Association); -+ return findAssocClassifierObjsInRoles(&plainAssociations); -+} -+ -+UMLClassifierList UMLClassifier::getAggregateChildClassifierList() -+{ -+ UMLAssociationList aggregations = getAggregations(); -+ return findAssocClassifierObjsInRoles(&aggregations); -+} -+ -+UMLClassifierList UMLClassifier::getCompositionChildClassifierList() -+{ -+ UMLAssociationList compositions = getCompositions(); -+ return findAssocClassifierObjsInRoles(&compositions); -+} -+ -+UMLClassifierList UMLClassifier::findAssocClassifierObjsInRoles (UMLAssociationList * list) -+{ -+ UMLClassifierList classifiers; -+ -+ for (UMLAssociationListIt alit(*list); alit.hasNext(); ) { -+ UMLAssociation* a = alit.next(); -+ // DON'T accept a classifier IF the association role is empty, by -+ // convention, that means to ignore the classifier on that end of -+ // the association. -+ // We also ignore classifiers which are the same as the current one -+ // (e.g. id matches), we only want the "other" classifiers -+ if (a->getObjectId(RoleType::A) == id() && !a->getRoleName(RoleType::B).isEmpty()) { -+ UMLClassifier *c = dynamic_cast(a->getObject(RoleType::B)); -+ if(c) -+ classifiers.append(c); -+ } else if (a->getObjectId(RoleType::B) == id() && !a->getRoleName(RoleType::A).isEmpty()) { -+ UMLClassifier *c = dynamic_cast(a->getObject(RoleType::A)); -+ if(c) -+ classifiers.append(c); -+ } -+ } -+ -+ return classifiers; -+} -+*/ -+ -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/classifier.h umbrello-kf6-15.08.1/umbrello/umlmodel/classifier.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/classifier.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/classifier.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,199 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+#ifndef CLASSIFIER_H -+#define CLASSIFIER_H -+ -+#include "package.h" -+#include "umlattributelist.h" -+#include "umloperationlist.h" -+#include "umlclassifierlistitemlist.h" -+#include "classifierlistitem.h" -+#include "umltemplatelist.h" -+#include "model_utils.h" -+ -+// forward declarations -+class UMLAssociation; -+class IDChangeLog; -+class UMLClassifierSet; -+ -+/** -+ * This class defines the non-graphical information required for a -+ * UML Classifier (ie a class or interface). -+ * This class inherits from @ref UMLPackage which allows classifiers -+ * to also act as namespaces, i.e. it allows classifiers to nest. -+ * -+ * NOTE: There is a unit test available for this class. -+ * Please, use and adapt it when necessary. -+ * -+ * @short Information for a non-graphical Concept/Class. -+ * @author Paul Hensgen -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLClassifier : public UMLPackage -+{ -+ Q_OBJECT -+public: -+ -+ /** -+ * Enumeration identifying the type of classifier. -+ */ -+ enum ClassifierType { ALL = 0, CLASS, INTERFACE, DATATYPE }; -+ -+ explicit UMLClassifier(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -+ virtual ~UMLClassifier(); -+ -+ bool operator==(const UMLClassifier & rhs) const; -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ UMLObject* clone() const; -+ -+ virtual UMLAttribute* createAttribute(const QString &name = QString(), -+ UMLObject *type = 0, -+ Uml::Visibility::Enum vis = Uml::Visibility::Private, -+ const QString &init = QString()); -+ -+ UMLAttribute* addAttribute(const QString &name, Uml::ID::Type id = Uml::ID::None); -+ UMLAttribute* addAttribute(const QString &name, UMLObject *type, Uml::Visibility::Enum scope); -+ -+ bool addAttribute(UMLAttribute* att, IDChangeLog* log = 0, -+ int position = -1); -+ -+ int removeAttribute(UMLAttribute *att); -+ -+ int attributes() ; -+ -+ UMLAttributeList getAttributeList() const; -+ UMLAttributeList getAttributeList(Uml::Visibility::Enum scope) const; -+ UMLAttributeList getAttributeListStatic(Uml::Visibility::Enum scope) const; -+ -+ UMLOperation* createOperation(const QString &name = QString(), -+ bool *isExistingOp = NULL, -+ Model_Utils::NameAndType_List *params = NULL); -+ -+ bool addOperation(UMLOperation* op, int position = -1); -+ bool addOperation(UMLOperation* op, IDChangeLog* log); -+ -+ UMLOperation * checkOperationSignature(const QString& name, -+ UMLAttributeList opParams, -+ UMLOperation *exemptOp = NULL); -+ -+ int removeOperation(UMLOperation *op); -+ -+ int operations(); -+ -+ UMLOperationList getOpList(bool includeInherited = false, UMLClassifierSet *alreadyTraversed = 0); -+ -+ UMLObject* createTemplate(const QString& name = QString()); -+ -+ UMLTemplate* addTemplate(const QString &name, Uml::ID::Type id = Uml::ID::None); -+ -+ bool addTemplate(UMLTemplate* newTemplate, IDChangeLog* log = 0); -+ bool addTemplate(UMLTemplate* templt, int position); -+ -+ int removeTemplate(UMLTemplate* umltemplate); -+ -+ UMLTemplate *findTemplate(const QString& name); -+ -+ int templates(); -+ -+ UMLTemplateList getTemplateList() const; -+ -+ int takeItem(UMLClassifierListItem* item); -+ -+ virtual UMLClassifierListItemList getFilteredList(UMLObject::ObjectType ot) const; -+ -+ virtual bool resolveRef(); -+ -+ UMLOperationList findOperations(const QString &n); -+ -+ virtual UMLObject* findChildObjectById(Uml::ID::Type id, bool considerAncestors = false); -+ -+ UMLOperation* findOperation(const QString& name, -+ Model_Utils::NameAndType_List params); -+ -+ UMLClassifierList findSuperClassConcepts(ClassifierType type = ALL); -+ -+ UMLClassifierList findSubClassConcepts(ClassifierType type = ALL); -+ -+ virtual bool acceptAssociationType(Uml::AssociationType::Enum type); -+ -+ void setClassAssoc(UMLAssociation *assoc); -+ UMLAssociation *getClassAssoc() const; -+ -+ void setBaseType(UMLObject::ObjectType ot); -+ -+ bool isInterface() const; -+ -+ bool isDatatype() const; -+ -+ void setOriginType(UMLClassifier *origType); -+ UMLClassifier * originType() const; -+ -+ void setIsReference(bool isRef = true); -+ bool isReference() const; -+ -+ bool hasAbstractOps(); -+ bool hasAssociations(); -+ bool hasAttributes(); -+ bool hasStaticAttributes(); -+ bool hasMethods(); -+ bool hasAccessorMethods(); -+ bool hasOperationMethods(); -+ bool hasVectorFields(); -+ -+ /** -+ * utility functions to allow easy determination of what classifiers -+ * are "owned" by the current one via named association type (e.g. -+ * plain, aggregate or compositions). -+ */ -+// UMLClassifierList getPlainAssocChildClassifierList(); -+// UMLClassifierList getAggregateChildClassifierList(); -+// UMLClassifierList getCompositionChildClassifierList(); -+ -+ virtual UMLClassifierListItem* makeChildObject(const QString& xmiTag); -+ -+ virtual UMLAssociationList getUniAssociationToBeImplemented(); -+ -+signals: -+ -+ void operationAdded(UMLClassifierListItem *); -+ void operationRemoved(UMLClassifierListItem *); -+ -+ void templateAdded(UMLClassifierListItem*); -+ void templateRemoved(UMLClassifierListItem*); -+ -+ // only applies when (m_Type == ot_Class) -+ void attributeAdded(UMLClassifierListItem*); -+ void attributeRemoved(UMLClassifierListItem*); -+ -+private: -+ -+ UMLAssociation *m_pClassAssoc; -+ -+ bool m_isRef; -+ -+ /** -+ * Utility method called by "get*ChildClassfierList()" methods. It basically -+ * finds all the classifiers named in each association in the given association list -+ * which aren't the current one. Useful for finding which classifiers are "owned" by the -+ * current one via declared associations such as in aggregations/compositions. -+ */ -+// UMLClassifierList findAssocClassifierObjsInRoles (UMLAssociationList * list); -+ -+protected: -+ -+ void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+ virtual bool load(QDomElement& element); -+ -+}; -+ -+#endif // CLASSIFIER_H -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/classifierlistitem.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/classifierlistitem.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/classifierlistitem.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/classifierlistitem.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,159 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "classifierlistitem.h" -+ -+// local includes -+#include "debug_utils.h" -+#include "classifier.h" -+#include "model_utils.h" -+#include "object_factory.h" -+#include "uml.h" -+#include "umldoc.h" -+ -+// kde includes -+#include -+ -+/** -+ * Constructor. -+ * -+ * @param parent The parent to this operation. -+ * At first sight it would appear that the type of the -+ * parent should be UMLClassifier. However, the class -+ * UMLAttribute is also used for the parameters of -+ * operations, and in this case the UMLOperation is the -+ * parent. -+ * @param name The name of the operation. -+ * @param id The id of the operation. -+ */ -+UMLClassifierListItem::UMLClassifierListItem(UMLObject *parent, -+ const QString& name, Uml::ID::Type id) -+ : UMLObject(parent, name, id) -+{ -+ UMLObject *parentObj = const_cast(parent); -+ UMLClassifier *pc = dynamic_cast(parentObj); -+ if (pc) -+ UMLObject::setUMLPackage(pc); -+} -+ -+/** -+ * Constructor. -+ * -+ * @param parent The parent to this operation. -+ * At first sight it would appear that the type of the -+ * parent should be UMLClassifier. However, the class -+ * UMLAttribute is also used for the parameters of -+ * operations, and in this case the UMLOperation is the -+ * parent. -+ */ -+UMLClassifierListItem::UMLClassifierListItem(UMLObject *parent) -+ : UMLObject(parent) -+{ -+ UMLObject *parentObj = const_cast(parent); -+ UMLClassifier *pc = dynamic_cast(parentObj); -+ if (pc) -+ UMLObject::setUMLPackage(pc); -+} -+ -+/** -+ * Destructor. Empty. -+ */ -+UMLClassifierListItem::~UMLClassifierListItem() -+{ -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLClassifierListItem::copyInto(UMLObject *lhs) const -+{ -+ // Call the parent. -+ UMLObject::copyInto(lhs); -+} -+ -+/** -+ * Returns a string representation of the list item. -+ * -+ * @param sig What type of operation string to show. -+ * @return The string representation of the operation. -+ */ -+QString UMLClassifierListItem::toString(Uml::SignatureType::Enum sig) -+{ -+ Q_UNUSED(sig); -+ return name(); -+} -+ -+/** -+ * Returns the type of the UMLClassifierListItem. -+ * -+ * @return The type of the UMLClassifierListItem. -+ */ -+UMLClassifier * UMLClassifierListItem::getType() const -+{ -+ return dynamic_cast(m_pSecondary.data()); -+} -+ -+/** -+ * Returns the type name of the UMLClassifierListItem. -+ * -+ * @return The type name of the UMLClassifierListItem. -+ */ -+QString UMLClassifierListItem::getTypeName() const -+{ -+ if (m_pSecondary == NULL) -+ return m_SecondaryId; -+ const UMLPackage *typePkg = m_pSecondary->umlPackage(); -+ if (typePkg != NULL && typePkg != m_pUMLPackage) -+ return m_pSecondary->fullyQualifiedName(); -+ return m_pSecondary->name(); -+} -+ -+/** -+ * Sets the type of the UMLAttribute. -+ * -+ * @param type Pointer to the UMLObject of the type. -+ */ -+void UMLClassifierListItem::setType(UMLObject *type) -+{ -+ if (m_pSecondary != type) { -+ m_pSecondary = type; -+ UMLObject::emitModified(); -+ } -+} -+ -+/** -+ * Sets the type name of the UMLClassifierListItem. -+ * DEPRECATED - use setType() instead. -+ * -+ * @param type The type name of the UMLClassifierListItem. -+ */ -+void UMLClassifierListItem::setTypeName(const QString &type) -+{ -+ if (type.isEmpty() || type == QLatin1String("void")) { -+ m_pSecondary = NULL; -+ m_SecondaryId.clear(); -+ return; -+ } -+ UMLDoc *pDoc = UMLApp::app()->document(); -+ m_pSecondary = pDoc->findUMLObject(type); -+ if (m_pSecondary == NULL) { -+ // Make data type for easily identified cases -+ if (Model_Utils::isCommonDataType(type) || type.contains(QLatin1Char('*'))) { -+ m_pSecondary = Object_Factory::createUMLObject(UMLObject::ot_Datatype, type); -+ uDebug() << "created datatype for " << type; -+ } else { -+ m_SecondaryId = type; -+ } -+ } -+ UMLObject::emitModified(); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/classifierlistitem.h umbrello-kf6-15.08.1/umbrello/umlmodel/classifierlistitem.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/classifierlistitem.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/classifierlistitem.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,58 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef CLASSIFIERLISTITEM_H -+#define CLASSIFIERLISTITEM_H -+ -+#include "umlobject.h" -+ -+// forward declaration -+class UMLClassifier; -+ -+/** -+ * Classifiers (classes, interfaces) have lists of operations, -+ * attributes, templates and others. This is a base class for -+ * the items in this list. This abstraction should remove -+ * duplication of dialogs and allow for stereotypes in lists. -+ * -+ * @short A base class for classifier list items (e.g. attributes) -+ * @author Jonathan Riddell -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLClassifierListItem : public UMLObject -+{ -+ Q_OBJECT -+public: -+ -+ UMLClassifierListItem(UMLObject *parent, -+ const QString& name, -+ Uml::ID::Type id = Uml::ID::None); -+ explicit UMLClassifierListItem(UMLObject *parent); -+ virtual ~UMLClassifierListItem(); -+ -+ virtual void setType(UMLObject *type); -+ UMLClassifier * getType() const; -+ -+ void setTypeName(const QString &type); -+ virtual QString getTypeName() const; -+ -+ virtual QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ /** -+ * The abstract method UMLObject::clone() must be implemented -+ * by the classes inheriting from UMLClassifierListItem. -+ */ -+ virtual UMLObject* clone() const = 0; -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/component.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/component.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/component.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/component.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,127 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "component.h" -+// app includes -+#include "association.h" -+#include "debug_utils.h" -+#include "object_factory.h" -+#include "model_utils.h" -+#include "clipboard/idchangelog.h" -+#include "umldoc.h" -+// kde includes -+#include -+ -+/** -+ * Sets up a Component. -+ * @param name The name of the Concept. -+ * @param id The unique id of the Concept. -+ */ -+UMLComponent::UMLComponent(const QString & name, Uml::ID::Type id) -+ : UMLPackage(name, id), -+ m_executable(false) -+{ -+ m_BaseType = UMLObject::ot_Component; -+} -+ -+/** -+ * Destructor. -+ */ -+UMLComponent::~UMLComponent() -+{ -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLComponent::clone() const -+{ -+ UMLComponent *clone = new UMLComponent(); -+ UMLObject::copyInto(clone); -+ return clone; -+} -+ -+/** -+ * Creates the UML:Component element including its operations, -+ * attributes and templates -+ */ -+void UMLComponent::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement componentElement = UMLObject::save(QLatin1String("UML:Component"), qDoc); -+ componentElement.setAttribute(QLatin1String("executable"), m_executable); -+ // Save contained components if any. -+ if (m_objects.count()) { -+ QDomElement ownedElement = qDoc.createElement(QLatin1String("UML:Namespace.ownedElement")); -+ for (UMLObjectListIt objectsIt(m_objects); objectsIt.hasNext();) { -+ UMLObject* obj = objectsIt.next(); -+ uIgnoreZeroPointer(obj); -+ obj->saveToXMI (qDoc, ownedElement); -+ } -+ componentElement.appendChild(ownedElement); -+ } -+ qElement.appendChild(componentElement); -+} -+ -+/** -+ * Loads the UML:Component element including its ports et al. -+ */ -+bool UMLComponent::load(QDomElement& element) -+{ -+ QString executable = element.attribute(QLatin1String("executable"), QLatin1String("0")); -+ m_executable = (bool)executable.toInt(); -+ for (QDomNode node = element.firstChild(); !node.isNull(); -+ node = node.nextSibling()) { -+ if (node.isComment()) -+ continue; -+ QDomElement tempElement = node.toElement(); -+ QString type = tempElement.tagName(); -+ if (Model_Utils::isCommonXMIAttribute(type)) -+ continue; -+ if (UMLDoc::tagEq(type, QLatin1String("Namespace.ownedElement")) || -+ UMLDoc::tagEq(type, QLatin1String("Namespace.contents"))) { -+ //CHECK: umbrello-kf6 currently assumes that nested elements -+ // are ownedElements anyway. -+ // Therefore these tags are not further interpreted. -+ if (! load(tempElement)) -+ return false; -+ continue; -+ } -+ UMLObject *pObject = Object_Factory::makeObjectFromXMI(type); -+ if (!pObject) { -+ uWarning() << "Unknown type of umlobject to create: " << type; -+ continue; -+ } -+ pObject->setUMLPackage(this); -+ if (pObject->loadFromXMI(tempElement)) { -+ addObject(pObject); -+ } else { -+ delete pObject; -+ } -+ } -+ return true; -+} -+ -+/** -+ * Sets m_executable. -+ */ -+void UMLComponent::setExecutable(bool executable) -+{ -+ m_executable = executable; -+} -+ -+/** -+ * Returns the value of m_executable. -+ */ -+bool UMLComponent::getExecutable() -+{ -+ return m_executable; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/component.h umbrello-kf6-15.08.1/umbrello/umlmodel/component.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/component.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/component.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,48 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef COMPONENT_H -+#define COMPONENT_H -+ -+#include "package.h" -+ -+/** -+ * This class contains the non-graphical information required for a -+ * UML Component. -+ * This class inherits from @ref UMLPackage which contains most -+ * of the information. -+ * -+ * @short Non-graphical information for a Component. -+ * @author Jonathan Riddell -+ * @see UMLCanvasObject -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLComponent : public UMLPackage -+{ -+ Q_OBJECT -+public: -+ explicit UMLComponent(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -+ virtual ~UMLComponent(); -+ -+ virtual UMLObject* clone() const; -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+ void setExecutable(bool executable); -+ bool getExecutable(); -+ -+protected: -+ bool load(QDomElement & element); -+ -+private: -+ bool m_executable; ///< holds whether this is an executable component or not -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/entityattribute.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/entityattribute.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/entityattribute.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/entityattribute.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,280 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "entityattribute.h" -+ -+// app includes -+#include "debug_utils.h" -+//#include "umlcanvasobject.h" -+#include "umldoc.h" -+#include "uml.h" -+#include "umlentityattributedialog.h" -+#include "object_factory.h" -+ -+// qt includes -+#include -+ -+/** -+ * Sets up an entityattribute. -+ * @param parent The parent of this UMLEntityAttribute. -+ * @param name The name of this UMLEntityAttribute. -+ * @param id The unique id given to this UMLEntityAttribute. -+ * @param s The visibility of the UMLEntityAttribute. -+ * @param type The type of this UMLEntityAttribute. -+ * @param iv The initial value of the entityattribute. -+ */ -+UMLEntityAttribute::UMLEntityAttribute(UMLObject *parent, const QString& name, -+ Uml::ID::Type id, Uml::Visibility::Enum s, -+ UMLObject *type, const QString& iv) -+ : UMLAttribute(parent, name, id, s, type, iv) -+{ -+ init(); -+ if (m_pSecondary) { -+ m_pSecondary->setBaseType(UMLObject::ot_Entity); -+ } -+} -+ -+/** -+ * Sets up an entityattribute. -+ * @param parent The parent of this UMLEntityAttribute. -+ */ -+UMLEntityAttribute::UMLEntityAttribute(UMLObject *parent) -+ : UMLAttribute(parent) -+{ -+ init(); -+} -+ -+/** -+ * Destructor. -+ */ -+UMLEntityAttribute::~UMLEntityAttribute() -+{ -+} -+ -+/** -+ * Initialize members of this class. -+ * Auxiliary method used by constructors. -+ */ -+void UMLEntityAttribute::init() -+{ -+ m_BaseType = UMLObject::ot_EntityAttribute; -+ m_indexType = UMLEntityAttribute::None; -+ m_autoIncrement = false; -+ m_null = false; -+} -+ -+/** -+ * Returns the value of the UMLEntityAttribute's attributes property. -+ * @return The value of the UMLEntityAttribute's attributes property. -+ */ -+QString UMLEntityAttribute::getAttributes() const -+{ -+ return m_attributes; -+} -+ -+/** -+ * Sets the UMLEntityAttribute's attributes property. -+ * @param attributes The new value for the attributes property. -+ */ -+void UMLEntityAttribute::setAttributes(const QString& attributes) -+{ -+ m_attributes = attributes; -+} -+ -+/** -+ * Returns the UMLEntityAttribute's length/values property. -+ * @return The new value of the length/values property. -+ */ -+QString UMLEntityAttribute::getValues() const -+{ -+ return m_values; -+} -+ -+/** -+ * Sets the UMLEntityAttribute's length/values property. -+ * @param values The new value of the length/values property. -+ */ -+void UMLEntityAttribute::setValues(const QString& values) -+{ -+ m_values = values; -+} -+ -+/** -+ * Returns the UMLEntityAttribute's auto_increment boolean -+ * @return The UMLEntityAttribute's auto_increment boolean -+ */ -+bool UMLEntityAttribute::getAutoIncrement() const -+{ -+ return m_autoIncrement; -+} -+ -+/** -+ * Sets the UMLEntityAttribute's auto_increment boolean -+ * @param autoIncrement The UMLEntityAttribute's auto_increment boolean -+ */ -+void UMLEntityAttribute::setAutoIncrement(const bool autoIncrement) -+{ -+ m_autoIncrement = autoIncrement; -+} -+ -+/** -+ * Returns the UMLEntityAttribute's index type property. -+ * @return The value of the UMLEntityAttribute's index type property. -+ */ -+UMLEntityAttribute::DBIndex_Type UMLEntityAttribute::indexType() const -+{ -+ return m_indexType; -+} -+ -+/** -+ * Sets the initial value of the UMLEntityAttribute's index type property. -+ * @param indexType The initial value of the UMLEntityAttribute's index type property. -+ */ -+void UMLEntityAttribute::setIndexType(const UMLEntityAttribute::DBIndex_Type indexType) -+{ -+ m_indexType = indexType; -+} -+ -+/** -+ * Returns the UMLEntityAttribute's allow null value. -+ * @return The UMLEntityAttribute's allow null value. -+ */ -+bool UMLEntityAttribute::getNull() const -+{ -+ return m_null; -+} -+ -+/** -+ * Sets the initial value of the UMLEntityAttribute's allow null value. -+ * @param nullIn The initial value of the UMLEntityAttribute's allow null value. -+ */ -+void UMLEntityAttribute::setNull(const bool nullIn) -+{ -+ m_null = nullIn; -+} -+ -+/** -+ * Returns a string representation of the UMLEntityAttribute. -+ * @param sig If true will show the entityattribute type and initial value. -+ * @return Returns a string representation of the UMLEntityAttribute. -+ */ -+QString UMLEntityAttribute::toString(Uml::SignatureType::Enum sig) -+{ -+ QString s; -+ //FIXME -+ -+ if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::NoSig) { -+ s = Uml::Visibility::toString(m_visibility, true) + QLatin1Char(' '); -+ } -+ -+ if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::SigNoVis) { -+ QString string = s + name() + QLatin1String(" : ") + getTypeName(); -+ if(m_InitialValue.length() > 0) -+ string += QLatin1String(" = ") + m_InitialValue; -+ return string; -+ } else -+ return s + name(); -+} -+ -+/** -+ * Overloaded '==' operator -+ */ -+bool UMLEntityAttribute::operator==(const UMLEntityAttribute &rhs) const -+{ -+ if(this == &rhs) -+ return true; -+ -+ if(!UMLObject::operator==(rhs)) -+ return false; -+ -+ // The type name is the only distinguishing criterion. -+ // (Some programming languages might support more, but others don't.) -+ if (m_pSecondary != rhs.m_pSecondary) -+ return false; -+ -+ return true; -+} -+ -+/** -+ * Copy the internal presentation of this object into the UMLEntityAttribute -+ * object. -+ */ -+void UMLEntityAttribute::copyInto(UMLObject *lhs) const -+{ -+ UMLEntityAttribute *target = static_cast(lhs); -+ -+ // call the parent first. -+ UMLClassifierListItem::copyInto(target); -+ -+ // Copy all datamembers -+ target->m_pSecondary = m_pSecondary; -+ target->m_SecondaryId = m_SecondaryId; -+ target->m_InitialValue = m_InitialValue; -+ target->m_ParmKind = m_ParmKind; -+} -+ -+/** -+ * Make a clone of the UMLEntityAttribute. -+ */ -+UMLObject* UMLEntityAttribute::clone() const -+{ -+ UMLEntityAttribute* clone = new UMLEntityAttribute((UMLEntityAttribute*)parent()); -+ copyInto(clone); -+ -+ return clone; -+} -+ -+/** -+ * Creates the XMI element. -+ */ -+void UMLEntityAttribute::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement entityattributeElement = UMLObject::save(QLatin1String("UML:EntityAttribute"), qDoc); -+ if (m_pSecondary == NULL) { -+ uDebug() << name() << ": m_pSecondary is NULL, using local name " << m_SecondaryId; -+ entityattributeElement.setAttribute(QLatin1String("type"), m_SecondaryId); -+ } else { -+ entityattributeElement.setAttribute(QLatin1String("type"), Uml::ID::toString(m_pSecondary->id())); -+ } -+ entityattributeElement.setAttribute(QLatin1String("initialValue"), m_InitialValue); -+ entityattributeElement.setAttribute(QLatin1String("dbindex_type"), m_indexType); -+ entityattributeElement.setAttribute(QLatin1String("values"), m_values); -+ entityattributeElement.setAttribute(QLatin1String("attributes"), m_attributes); -+ entityattributeElement.setAttribute(QLatin1String("auto_increment"), m_autoIncrement); -+ entityattributeElement.setAttribute(QLatin1String("allow_null"), m_null); -+ qElement.appendChild(entityattributeElement); -+} -+ -+/** -+ * Loads the XMI element. -+ */ -+bool UMLEntityAttribute::load(QDomElement & element) -+{ -+ if (! UMLAttribute::load(element)) -+ return false; -+ int indexType = element.attribute(QLatin1String("dbindex_type"), QLatin1String("1100")).toInt(); -+ m_indexType = (UMLEntityAttribute::DBIndex_Type)indexType; -+ m_values = element.attribute(QLatin1String("values")); -+ m_attributes = element.attribute(QLatin1String("attributes")); -+ m_autoIncrement = (bool)element.attribute(QLatin1String("auto_increment")).toInt(); -+ m_null = (bool)element.attribute(QLatin1String("allow_null")).toInt(); -+ return true; -+} -+ -+/** -+ * Display the properties configuration dialog for the entityattribute. -+ */ -+bool UMLEntityAttribute::showPropertiesDialog(QWidget* parent) -+{ -+ UMLEntityAttributeDialog dialog(parent, this); -+ return dialog.exec(); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/entityattribute.h umbrello-kf6-15.08.1/umbrello/umlmodel/entityattribute.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/entityattribute.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/entityattribute.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,85 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ENTITYATTRIBUTE_H -+#define ENTITYATTRIBUTE_H -+ -+#include "attribute.h" -+#include "basictypes.h" -+ -+/** -+ * This class is used to set up information for an entityattribute. This is a database field -+ * It has a type, name, index type and default value. -+ * -+ * @short Sets up entityattribute information. -+ * @author Jonathan Riddell -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLEntityAttribute : public UMLAttribute -+{ -+ Q_OBJECT -+ Q_ENUMS(DBIndex_Type) -+public: -+ enum DBIndex_Type -+ { -+ None = 1100, -+ Primary, -+ Index, -+ Unique -+ }; -+ -+ UMLEntityAttribute(UMLObject* parent, const QString& name, -+ Uml::ID::Type id = Uml::ID::None, -+ Uml::Visibility::Enum s = Uml::Visibility::Private, -+ UMLObject *type = 0, const QString& iv = QString()); -+ explicit UMLEntityAttribute(UMLObject* parent); -+ virtual ~UMLEntityAttribute(); -+ -+ bool operator==(const UMLEntityAttribute& rhs) const; -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ virtual UMLObject* clone() const; -+ -+ void setAttributes(const QString& attributes); -+ QString getAttributes() const; -+ -+ void setIndexType(const DBIndex_Type indexType); -+ DBIndex_Type indexType() const; -+ -+ void setValues(const QString& values); -+ QString getValues() const; -+ -+ void setAutoIncrement(const bool autoIncrement); -+ bool getAutoIncrement() const; -+ -+ void setNull(const bool null); -+ bool getNull() const; -+ -+ QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -+ -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+ virtual bool showPropertiesDialog(QWidget* parent = 0); -+ -+protected: -+ void init(); -+ -+ bool load(QDomElement& element); -+ -+private: -+ DBIndex_Type m_indexType; -+ QString m_values; -+ QString m_attributes; -+ bool m_autoIncrement; -+ bool m_null; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/entityconstraint.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/entityconstraint.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/entityconstraint.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/entityconstraint.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,76 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+//own header -+#include "entityconstraint.h" -+ -+// app includes -+#include "umlobject.h" -+#include "umldoc.h" -+#include "uml.h" -+ -+// qt includes -+#include -+ -+/** -+ * Sets up a constraint. -+ * @param parent The parent of this UMLEntityConstraint. -+ * @param name The name of this UMLEntityConstraint. -+ * @param id The unique id given to this UMLEntityConstraint. -+ */ -+UMLEntityConstraint::UMLEntityConstraint(UMLObject *parent, -+ const QString& name, Uml::ID::Type id) -+ : UMLClassifierListItem(parent, name, id) -+{ -+ m_BaseType = UMLObject::ot_EntityConstraint; -+} -+ -+/** -+ * Sets up a constraint. -+ * @param parent The parent of this UMLEntityConstraint. -+ */ -+UMLEntityConstraint::UMLEntityConstraint(UMLObject *parent) -+ : UMLClassifierListItem(parent) -+{ -+ m_BaseType = UMLObject::ot_EntityConstraint; -+} -+ -+/** -+ * Overloaded '==' operator -+ */ -+bool UMLEntityConstraint::operator==(const UMLEntityConstraint &rhs) const -+{ -+ if(this == &rhs) -+ return true; -+ -+ if(!UMLObject::operator==(rhs)) -+ return false; -+ -+ return true; -+} -+ -+/** -+ * destructor. -+ */ -+UMLEntityConstraint::~UMLEntityConstraint() -+{ -+} -+ -+/** -+ * Copy the internal presentation of this object into the UMLEntityConstraint -+ * object. -+ */ -+void UMLEntityConstraint::copyInto(UMLObject *lhs) const -+{ -+ // call the parent first. -+ UMLClassifierListItem::copyInto(lhs); -+} -+ -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/entityconstraint.h umbrello-kf6-15.08.1/umbrello/umlmodel/entityconstraint.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/entityconstraint.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/entityconstraint.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,49 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ENTITYCONSTRAINT_H -+#define ENTITYCONSTRAINT_H -+ -+#include "basictypes.h" -+#include "classifierlistitem.h" -+#include "umlclassifierlist.h" -+ -+/** -+ * This class is used to set up information for a entity constraint. -+ * -+ * @short Sets up entity constraint information. -+ * @author Sharan Rao -+ * @see UMLObject UMLClassifierListItem -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLEntityConstraint : public UMLClassifierListItem -+{ -+ Q_OBJECT -+ -+public: -+ UMLEntityConstraint(UMLObject *parent, const QString& name, -+ Uml::ID::Type id = Uml::ID::None); -+ -+ explicit UMLEntityConstraint(UMLObject *parent); -+ -+ bool operator==(const UMLEntityConstraint &rhs) const; -+ -+ virtual ~UMLEntityConstraint(); -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ /** -+ * Make a clone of the UMLEntityConstraint. -+ */ -+ virtual UMLObject* clone() const = 0; -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/entity.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/entity.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/entity.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/entity.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,719 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "entity.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "entityattribute.h" -+#include "uniqueconstraint.h" -+#include "foreignkeyconstraint.h" -+#include "checkconstraint.h" -+#include "umldoc.h" -+#include "uml.h" -+#include "uniqueid.h" -+#include "umlentityattributelist.h" -+#include "umlentityconstraintlist.h" -+#include "idchangelog.h" -+#include "umlentityattributedialog.h" -+#include "umluniqueconstraintdialog.h" -+#include "umlforeignkeyconstraintdialog.h" -+#include "umlcheckconstraintdialog.h" -+ -+// kde includes -+#include -+#include -+ -+// qt includes -+#include -+ -+/** -+ * Constructor. -+ */ -+UMLEntity::UMLEntity(const QString& name, Uml::ID::Type id) -+ : UMLClassifier(name, id), -+ m_PrimaryKey(0) -+{ -+ m_BaseType = UMLObject::ot_Entity; -+ connect(this, SIGNAL(entityAttributeRemoved(UMLClassifierListItem*)), -+ this, SLOT(slotEntityAttributeRemoved(UMLClassifierListItem*))); -+} -+ -+/** -+ * Standard destructor. -+ */ -+UMLEntity::~UMLEntity() -+{ -+ m_List.clear(); -+} -+ -+/** -+ * Overloaded '==' operator. -+ */ -+bool UMLEntity::operator==(const UMLEntity& rhs) const -+{ -+ return UMLClassifier::operator==(rhs); -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLEntity::copyInto(UMLObject *lhs) const -+{ -+ UMLEntity *target = static_cast(lhs); -+ -+ // call base class copy function -+ UMLClassifier::copyInto(target); -+ -+ // copy local data items -+ target->m_PrimaryKey = m_PrimaryKey; -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLEntity::clone() const -+{ -+ UMLEntity* clone = new UMLEntity(); -+ copyInto(clone); -+ -+ return clone; -+} -+ -+/** -+ * Create an UMLAttribute. -+ * @param name an optional name for the attribute -+ * @param type an optional type object for the attribute -+ * @param vis the visibility of the attribute -+ * @param iv the initial value for the attribute -+ * @return the just created attribute or null -+ */ -+UMLAttribute* UMLEntity::createAttribute(const QString &name /*= QString()*/, UMLObject *type /*= 0*/, -+ Uml::Visibility::Enum vis /* = Uml::Visibility::Private*/, -+ const QString& iv /* = QString()*/) -+{ -+ Uml::ID::Type id = UniqueID::gen(); -+ QString currentName; -+ if (name.isNull()) { -+ currentName = uniqChildName(UMLObject::ot_EntityAttribute); -+ } else { -+ currentName = name; -+ } -+ -+ UMLEntityAttribute* newAttribute = new UMLEntityAttribute(this, currentName, id, vis, type, iv); -+ -+ int button = QDialog::Accepted; -+ bool goodName = false; -+ -+ //check for name.isNull() stops dialog being shown -+ //when creating attribute via list view -+ while (button == QDialog::Accepted && !goodName && name.isNull()) { -+ QPointer dialog = new UMLEntityAttributeDialog(0, newAttribute); -+ button = dialog->exec(); -+ QString name = newAttribute->name(); -+ -+ if (name.length() == 0) { -+ KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -+ } else if (findChildObject(name) != NULL) { -+ KMessageBox::error(0, i18n("That name is already being used."), i18n("Not a Unique Name")); -+ } else { -+ goodName = true; -+ } -+ delete dialog; -+ } -+ -+ if (button != QDialog::Accepted) { -+ delete newAttribute; -+ return 0; -+ } -+ -+ addEntityAttribute(newAttribute); -+ -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ umldoc->signalUMLObjectCreated(newAttribute); -+ return newAttribute; -+} -+ -+/** -+ * Creates a Unique Constraint for this Entity. -+ * @param name an optional name -+ * @return the UniqueConstraint created -+ */ -+UMLUniqueConstraint* UMLEntity::createUniqueConstraint(const QString &name) -+{ -+ Uml::ID::Type id = UniqueID::gen(); -+ QString currentName; -+ if (name.isNull()) { -+ -+ /** -+ * @todo check parameter -+ */ -+ currentName = uniqChildName(UMLObject::ot_UniqueConstraint); -+ } else { -+ currentName = name; -+ } -+ -+ UMLUniqueConstraint* newUniqueConstraint = new UMLUniqueConstraint(this, currentName, id); -+ -+ int button = QDialog::Accepted; -+ bool goodName = false; -+ -+ //check for name.isNull() stops dialog being shown -+ //when creating attribute via list view -+ while (button == QDialog::Accepted && !goodName && name.isNull()) { -+ QPointer dialog = new UMLUniqueConstraintDialog(0, newUniqueConstraint); -+ button = dialog->exec(); -+ QString name = newUniqueConstraint->name(); -+ -+ if (name.length() == 0) { -+ KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -+ } else if (findChildObject(name) != NULL) { -+ KMessageBox::error(0, i18n("That name is already being used."), i18n("Not a Unique Name")); -+ } else { -+ goodName = true; -+ } -+ delete dialog; -+ } -+ -+ if (button != QDialog::Accepted) { -+ delete newUniqueConstraint; -+ return NULL; -+ } -+ -+ addConstraint(newUniqueConstraint); -+ -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ umldoc->signalUMLObjectCreated(newUniqueConstraint); -+ emitModified(); -+ return newUniqueConstraint; -+} -+ -+/** -+ * Creates a Foreign Key Constraint for this Entity. -+ * @param name an optional name -+ * @return the ForeignKeyConstraint created -+ */ -+UMLForeignKeyConstraint* UMLEntity::createForeignKeyConstraint(const QString &name) -+{ -+ Uml::ID::Type id = UniqueID::gen(); -+ QString currentName; -+ if (name.isNull()) { -+ currentName = uniqChildName(UMLObject::ot_ForeignKeyConstraint); -+ } else { -+ currentName = name; -+ } -+ -+ UMLForeignKeyConstraint* newForeignKeyConstraint = new UMLForeignKeyConstraint(this, currentName, id); -+ -+ int button = QDialog::Accepted; -+ bool goodName = false; -+ -+ //check for name.isNull() stops dialog being shown -+ //when creating attribute via list view -+ while (button == QDialog::Accepted && !goodName && name.isNull()) { -+ QPointer dialog = new UMLForeignKeyConstraintDialog(0, newForeignKeyConstraint); -+ button = dialog->exec(); -+ QString name = newForeignKeyConstraint->name(); -+ -+ if (name.length() == 0) { -+ KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -+ } else if (findChildObject(name) != NULL) { -+ KMessageBox::error(0, i18n("That name is already being used."), i18n("Not a Unique Name")); -+ } else { -+ goodName = true; -+ } -+ delete dialog; -+ } -+ -+ if (button != QDialog::Accepted) { -+ return NULL; -+ } -+ -+ addConstraint(newForeignKeyConstraint); -+ -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ umldoc->signalUMLObjectCreated(newForeignKeyConstraint); -+ emitModified(); -+ return newForeignKeyConstraint; -+} -+ -+/** -+ * Creates a Check Constraint for this Entity. -+ * @param name an optional name -+ * @return the CheckConstraint created -+ */ -+UMLCheckConstraint* UMLEntity::createCheckConstraint(const QString &name) -+{ -+ Uml::ID::Type id = UniqueID::gen(); -+ QString currentName; -+ if (name.isNull()) { -+ currentName = uniqChildName(UMLObject::ot_CheckConstraint); -+ } else { -+ currentName = name; -+ } -+ -+ UMLCheckConstraint* newCheckConstraint = new UMLCheckConstraint(this, currentName, id); -+ -+ int button = QDialog::Accepted; -+ bool goodName = false; -+ -+ //check for name.isNull() stops dialog being shown -+ //when creating attribute via list view -+ while (button == QDialog::Accepted && !goodName && name.isNull()) { -+ QPointer dialog = new UMLCheckConstraintDialog(0, newCheckConstraint); -+ button = dialog->exec(); -+ QString name = newCheckConstraint->name(); -+ -+ if (name.length() == 0) { -+ KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -+ } else if (findChildObject(name) != NULL) { -+ KMessageBox::error(0, i18n("That name is already being used."), i18n("Not a Unique Name")); -+ } else { -+ goodName = true; -+ } -+ delete dialog; -+ } -+ -+ if (button != QDialog::Accepted) { -+ return NULL; -+ } -+ -+ addConstraint(newCheckConstraint); -+ -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ umldoc->signalUMLObjectCreated(newCheckConstraint); -+ emitModified(); -+ return newCheckConstraint; -+} -+ -+/** -+ * Adds an entityAttribute. -+ * The entityAttribute object must not belong to any other concept. -+ * @param name name of the UMLEntityAttribute -+ * @param id id of the UMLEntityAttribute -+ * @return True if the entityAttribute was successfully added. -+ */ -+UMLObject* UMLEntity::addEntityAttribute(const QString& name, Uml::ID::Type id) -+{ -+ UMLEntityAttribute* literal = new UMLEntityAttribute(this, name, id); -+ m_List.append(literal); -+ emit entityAttributeAdded(literal); -+ UMLObject::emitModified(); -+ connect(literal, SIGNAL(modified()), this, SIGNAL(modified())); -+ return literal; -+} -+ -+/** -+ * Adds an already created entityAttribute. -+ * The entityAttribute object must not belong to any other concept. -+ * @param att Pointer to the UMLEntityAttribute. -+ * @param log Pointer to the IDChangeLog. -+ * @return True if the entityAttribute was successfully added. -+ */ -+bool UMLEntity::addEntityAttribute(UMLEntityAttribute* att, IDChangeLog* log /* = 0*/) -+{ -+ QString name = (QString)att->name(); -+ if (findChildObject(name) == NULL) { -+ att->setParent(this); -+ m_List.append(att); -+ emit entityAttributeAdded(att); -+ UMLObject::emitModified(); -+ connect(att, SIGNAL(modified()), this, SIGNAL(modified())); -+ return true; -+ } else if (log) { -+ log->removeChangeByNewID(att->id()); -+ delete att; -+ } -+ return false; -+} -+ -+/** -+ * Adds an entityAttribute to the entity, at the given position. -+ * If position is negative or too large, the entityAttribute is added -+ * to the end of the list. -+ * TODO: give default value -1 to position (append) - now it conflicts with the method above.. -+ * @param att Pointer to the UMLEntityAttribute. -+ * @param position Position index for the insertion. -+ * @return True if the entityAttribute was successfully added. -+ */ -+bool UMLEntity::addEntityAttribute(UMLEntityAttribute* att, int position) -+{ -+ Q_ASSERT(att); -+ QString name = (QString)att->name(); -+ if (findChildObject(name) == NULL) { -+ att->setParent(this); -+ if (position >= 0 && position <= (int)m_List.count()) { -+ m_List.insert(position, att); -+ } else { -+ m_List.append(att); -+ } -+ emit entityAttributeAdded(att); -+ UMLObject::emitModified(); -+ connect(att, SIGNAL(modified()), this, SIGNAL(modified())); -+ return true; -+ } -+ return false; -+} -+ -+/** -+ * Removes an entityAttribute from the class. -+ * @param att The entityAttribute to remove. -+ * @return Count of the remaining entityAttributes after removal. -+ * Returns -1 if the given entityAttribute was not found. -+ */ -+int UMLEntity::removeEntityAttribute(UMLClassifierListItem* att) -+{ -+ if (!m_List.removeAll((UMLEntityAttribute*)att)) { -+ uDebug() << "cannot find att given in list"; -+ return -1; -+ } -+ emit entityAttributeRemoved(att); -+ UMLObject::emitModified(); -+ // If we are deleting the object, then we don't need to disconnect..this is done auto-magically -+ // for us by QObject. -b.t. -+ // disconnect(att, SIGNAL(modified()), this, SIGNAL(modified())); -+ delete att; -+ return m_List.count(); -+} -+ -+/** -+ * Returns the number of entityAttributes for the class. -+ * @return The number of entityAttributes for the class. -+ */ -+int UMLEntity::entityAttributes() -+{ -+ UMLClassifierListItemList entityAttributes = getFilteredList(UMLObject::ot_EntityAttribute); -+ return entityAttributes.count(); -+} -+ -+/** -+ * Emit the entityAttributeRemoved signal. -+ */ -+void UMLEntity::signalEntityAttributeRemoved(UMLClassifierListItem *eattr) -+{ -+ emit entityAttributeRemoved(eattr); -+} -+ -+/** -+ * Resolve the types referenced by our UMLEntityAttributes. -+ * Reimplements the method from UMLClassifier. -+ */ -+bool UMLEntity::resolveRef() -+{ -+ bool success = UMLClassifier::resolveRef(); -+ for (UMLObjectListIt oit(m_List); oit.hasNext();) { -+ UMLObject* obj = oit.next(); -+ if (obj->resolveRef()) { -+ UMLClassifierListItem *cli = static_cast(obj); -+ switch (cli->baseType()) { -+ case UMLObject::ot_EntityAttribute: -+ emit entityAttributeAdded(cli); -+ break; -+ case UMLObject::ot_UniqueConstraint: -+ case UMLObject::ot_ForeignKeyConstraint: -+ emit entityConstraintAdded(cli); -+ break; -+ default: -+ break; -+ } -+ } -+ } -+ return success; -+} -+ -+/** -+ * Creates the element including its entityliterals. -+ */ -+void UMLEntity::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement entityElement = UMLObject::save(QLatin1String("UML:Entity"), qDoc); -+ //save operations -+ UMLClassifierListItemList entityAttributes = getFilteredList(UMLObject::ot_EntityAttribute); -+ UMLClassifierListItem* pEntityAttribute = 0; -+ foreach (pEntityAttribute, entityAttributes) { -+ pEntityAttribute->saveToXMI(qDoc, entityElement); -+ } -+ -+ UMLClassifierListItemList entityConstraints = getFilteredList(UMLObject::ot_EntityConstraint); -+ foreach(UMLClassifierListItem* cli, entityConstraints) { -+ cli->saveToXMI(qDoc, entityElement); -+ } -+ -+ qElement.appendChild(entityElement); -+} -+ -+/** -+ * Loads the element including its entityAttributes. -+ */ -+bool UMLEntity::load(QDomElement& element) -+{ -+ QDomNode node = element.firstChild(); -+ while(!node.isNull()) { -+ if (node.isComment()) { -+ node = node.nextSibling(); -+ continue; -+ } -+ QDomElement tempElement = node.toElement(); -+ QString tag = tempElement.tagName(); -+ if (UMLDoc::tagEq(tag, QLatin1String("EntityAttribute"))) { // for backward compatibility -+ UMLEntityAttribute* pEntityAttribute = new UMLEntityAttribute(this); -+ if(!pEntityAttribute->loadFromXMI(tempElement)) { -+ return false; -+ } -+ m_List.append(pEntityAttribute); -+ } else if (UMLDoc::tagEq(tag, QLatin1String("UniqueConstraint"))) { -+ UMLUniqueConstraint* pUniqueConstraint = new UMLUniqueConstraint(this); -+ if (!pUniqueConstraint->loadFromXMI(tempElement)) { -+ return false; -+ } -+ addConstraint(pUniqueConstraint); -+ } else if (UMLDoc::tagEq(tag, QLatin1String("ForeignKeyConstraint"))) { -+ UMLForeignKeyConstraint* pForeignKeyConstraint = new UMLForeignKeyConstraint(this); -+ if (!pForeignKeyConstraint->loadFromXMI(tempElement)) { -+ return false; -+ } -+ -+ addConstraint(pForeignKeyConstraint); -+ } else if (UMLDoc::tagEq(tag, QLatin1String("CheckConstraint"))) { -+ -+ UMLCheckConstraint* pCheckConstraint = new UMLCheckConstraint(this); -+ if (!pCheckConstraint->loadFromXMI(tempElement)) { -+ return false; -+ } -+ -+ addConstraint(pCheckConstraint); -+ } else if (tag == QLatin1String("stereotype")) { -+ uDebug() << name() << ": losing old-format stereotype."; -+ } else { -+ uWarning() << "unknown child type in UMLEntity::load"; -+ } -+ node = node.nextSibling(); -+ }//end while -+ return true; -+} -+ -+/** -+ * Sets the UniqueConstraint passed as the Primary Key of this Entity -+ * If the UniqueConstraint exists, then it is made a primary key -+ * Else the UniqueConstraint is added and set as PrimaryKey -+ * @param uconstr The Unique Constraint that is to be set as Primary Key -+ * @return true if Primary key could be set successfully -+ */ -+bool UMLEntity::setAsPrimaryKey(UMLUniqueConstraint* uconstr) -+{ -+ if (uconstr == NULL) { -+ uDebug() << "NULL value passed. To unset a Primary Key use " -+ << "unsetPrimaryKey()"; -+ return false; -+ } -+ -+ if (static_cast(uconstr->parent()) != this) { -+ -+ uDebug() << "Parent of " << uconstr->name() -+ << " does not match with current entity"; -+ return false; -+ } -+ -+ // check if this constraint already exists as a unique constraint for this entity -+ UMLUniqueConstraint* uuc = static_cast(findChildObjectById(uconstr->id())); -+ if (uuc == NULL) { -+ addConstraint(uconstr); -+ uuc = uconstr; -+ } -+ -+ UMLUniqueConstraint* oldPrimaryKey = m_PrimaryKey; -+ -+ m_PrimaryKey = uuc; -+ -+ if (oldPrimaryKey != NULL) -+ oldPrimaryKey->emitModified(); -+ -+ uuc->emitModified(); -+ emitModified(); -+ return true; -+} -+ -+/** -+ * Unset a Primary Key Constraint if it exists, else does nothing -+ * This function will make the primary key into just another UniqueConstraint -+ * if it exists -+ */ -+void UMLEntity::unsetPrimaryKey() -+{ -+ m_PrimaryKey = 0; -+} -+ -+/** -+ * Checks if This UMLEntity has a primary key set. -+ * @return true if a Primary Key Exists for this UMLEntity -+ */ -+bool UMLEntity::hasPrimaryKey() const -+{ -+ if (m_PrimaryKey) { -+ return true; -+ } -+ -+ return false; -+} -+ -+/** -+ * Adds a Constraint to this UMLEntity. -+ * To set a UMLUniqueConstraint as Primary Key use setAsPrimaryKey. -+ * @param constr The UMLEntityConstraint that is to be added -+ * @return true if the constraint could be added successfully -+ */ -+bool UMLEntity::addConstraint(UMLEntityConstraint* constr) -+{ -+ if (findChildObjectById(constr->id()) != NULL) { -+ uDebug() << "Constraint with id " << Uml::ID::toString(constr->id()) -+ << " already exists "; -+ return false; -+ } -+ -+ m_List.append(constr); -+ -+ emit entityConstraintAdded(constr); -+ UMLObject::emitModified(); -+ connect(constr, SIGNAL(modified()), this, SIGNAL(modified())); -+ -+ return true; -+} -+ -+/** -+ * Removes an existing constraint from this UMLEntity. -+ * If the Contraint is a Primary Key, this Entity will no longer have a PrimaryKey. -+ * @param constr the constraint to be removed -+ * @return true if the constraint could be removed successfully -+ */ -+bool UMLEntity::removeConstraint(UMLEntityConstraint* constr) -+{ -+ if (findChildObjectById(constr->id()) == NULL) { -+ uDebug() << "Constraint with id " << Uml::ID::toString(constr->id()) -+ << " does not exist "; -+ return false; -+ } -+ -+ if (m_PrimaryKey == constr) { -+ unsetPrimaryKey(); -+ } -+ -+ m_List.removeAll(constr); -+ -+ emit entityConstraintRemoved(constr); -+ UMLObject::emitModified(); -+ -+ delete constr; -+ return true; -+} -+ -+/** -+ * Slot for entity attribute removed. -+ */ -+void UMLEntity::slotEntityAttributeRemoved(UMLClassifierListItem* cli) -+{ -+ // this function does some cleanjobs related to this entity when the attribute is -+ // removed, like, removing the attribute from all constraints -+ -+ UMLEntityAttribute* entAtt = static_cast(cli); -+ if (cli) { -+ UMLClassifierListItemList ual = this->getFilteredList(UMLObject::ot_UniqueConstraint); -+ -+ foreach(UMLClassifierListItem* ucli, ual) { -+ UMLUniqueConstraint* uuc = static_cast(ucli); -+ if (uuc->hasEntityAttribute(entAtt)) { -+ uuc->removeEntityAttribute(entAtt); -+ } -+ } -+ } -+ -+} -+ -+/** -+ * Reimplementation of getFilteredList to support ot=UMLObject::ot_EntityConstraint. -+ */ -+UMLClassifierListItemList UMLEntity::getFilteredList(UMLObject::ObjectType ot) const -+{ -+ if (ot == UMLObject::ot_EntityConstraint) { -+ UMLClassifierListItemList ucList, fcList, ccList, rcList; -+ ucList = UMLClassifier::getFilteredList(UMLObject::ot_UniqueConstraint); -+ fcList = UMLClassifier::getFilteredList(UMLObject::ot_ForeignKeyConstraint); -+ ccList = UMLClassifier::getFilteredList(UMLObject::ot_CheckConstraint); -+ -+ // append the lists to rcList -+ // first the Unique Constraints -+ foreach(UMLClassifierListItem* ucli, ucList) { -+ rcList.append(ucli); -+ } -+ -+ // then the Foreign Key Constraints -+ foreach(UMLClassifierListItem* ucli, fcList) { -+ rcList.append(ucli); -+ } -+ -+ foreach(UMLClassifierListItem* ucli, ccList) { -+ rcList.append(ucli); -+ } -+ -+ return rcList; -+ } else { -+ return UMLClassifier::getFilteredList(ot); -+ } -+} -+ -+/** -+ * Checks if a given Unique Constraint is primary key of this entity -+ * @param uConstr a Unique Constraint -+ * @return bool true if passed parameter is a primary key of this entity -+ */ -+bool UMLEntity::isPrimaryKey(UMLUniqueConstraint* uConstr) const -+{ -+ if (uConstr == m_PrimaryKey) { -+ return true; -+ } -+ -+ return false; -+} -+ -+/** -+ * Returns the Entity Attributes. -+ * Same as getFilteredList(UMLObject::ot_EntityAttribute). -+ */ -+UMLEntityAttributeList UMLEntity::getEntityAttributes() const -+{ -+ UMLEntityAttributeList entityAttributeList; -+ for (UMLObjectListIt lit(m_List); lit.hasNext();) { -+ UMLObject *listItem = lit.next(); -+ if (listItem->baseType() == UMLObject::ot_EntityAttribute) { -+ entityAttributeList.append(static_cast(listItem)); -+ } -+ } -+ return entityAttributeList; -+} -+ -+ -+/** -+ * Create a new ClassifierListObject (entityattribute) -+ * according to the given XMI tag. -+ * Returns NULL if the string given does not contain one of the tags -+ * -+ * Used by the clipboard for paste operation. -+ * Reimplemented from UMLClassifier for UMLEntity -+ */ -+UMLClassifierListItem* UMLEntity::makeChildObject(const QString& xmiTag) -+{ -+ UMLClassifierListItem* pObject = NULL; -+ if (UMLDoc::tagEq(xmiTag, QLatin1String("EntityAttribute"))) { -+ pObject = new UMLEntityAttribute(this); -+ } -+ return pObject; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/entity.h umbrello-kf6-15.08.1/umbrello/umlmodel/entity.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/entity.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/entity.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,108 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ENTITY_H -+#define ENTITY_H -+ -+#include "classifier.h" -+ -+// forward declarations -+class UMLEntityAttribute; -+class UMLEntityConstraint; -+class UMLUniqueConstraint; -+class UMLForeignKeyConstraint; -+class UMLCheckConstraint; -+class UMLEntityAttributeList; -+ -+/** -+ * This class contains the non-graphical information required for a UML -+ * Entity. -+ * This class inherits from @ref UMLClassifier which contains most of the -+ * information. -+ * -+ * @short Non-graphical Information for an Entity. -+ * @author Jonathan Riddell -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLEntity : public UMLClassifier -+{ -+ Q_OBJECT -+public: -+ explicit UMLEntity(const QString& name = QString(), Uml::ID::Type id = Uml::ID::None); -+ virtual ~UMLEntity(); -+ -+ bool operator==(const UMLEntity& rhs) const; -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ virtual UMLObject* clone() const; -+ -+ virtual UMLAttribute* createAttribute(const QString &name = QString(), -+ UMLObject *type = 0, Uml::Visibility::Enum vis = Uml::Visibility::Private, -+ const QString &init = QString()); -+ -+ UMLUniqueConstraint* createUniqueConstraint(const QString &name = QString()); -+ UMLForeignKeyConstraint* createForeignKeyConstraint(const QString &name = QString()); -+ UMLCheckConstraint* createCheckConstraint(const QString &name = QString()); -+ -+ UMLObject* addEntityAttribute(const QString &name, Uml::ID::Type id = Uml::ID::None); -+ bool addEntityAttribute(UMLEntityAttribute* att, IDChangeLog* log = 0); -+ bool addEntityAttribute(UMLEntityAttribute* att, int position); -+ -+ int removeEntityAttribute(UMLClassifierListItem* att); -+ -+ void signalEntityAttributeRemoved(UMLClassifierListItem *eattr); -+ -+ int entityAttributes() ; -+ -+ bool setAsPrimaryKey(UMLUniqueConstraint* uconstr); -+ void unsetPrimaryKey(); -+ bool hasPrimaryKey() const; -+ bool isPrimaryKey(UMLUniqueConstraint* uConstr) const; -+ -+ bool addConstraint(UMLEntityConstraint* constr); -+ bool removeConstraint(UMLEntityConstraint* constr); -+ -+ virtual bool resolveRef(); -+ -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+ UMLClassifierListItemList getFilteredList(UMLObject::ObjectType ot) const; -+ -+ UMLEntityAttributeList getEntityAttributes() const; -+ -+ virtual UMLClassifierListItem* makeChildObject(const QString& xmiTag); -+ -+private slots: -+ void slotEntityAttributeRemoved(UMLClassifierListItem*); -+ -+signals: -+ void entityAttributeAdded(UMLClassifierListItem*); -+ void entityAttributeRemoved(UMLClassifierListItem*); -+ void entityConstraintAdded(UMLClassifierListItem*); -+ void entityConstraintRemoved(UMLClassifierListItem*); -+ -+protected: -+ bool load(QDomElement& element); -+ -+private: -+ -+ /** -+ * Primary Key of this Entity -+ * This is a pointer kept for easy access to the primary key, and to distinguish it -+ * from all other UniqueConstraints. It is also there in m_List (inherited from -+ * UMLCanvasObject) -+ */ -+ UMLUniqueConstraint* m_PrimaryKey; -+ -+}; -+ -+#endif // ENTITY_H -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/enum.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/enum.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/enum.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/enum.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,302 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "enum.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "enumliteral.h" -+#include "umldoc.h" -+#include "uml.h" -+#include "uniqueid.h" -+#include "idchangelog.h" -+ -+// kde includes -+#include -+#include -+ -+/** -+ * Sets up an enum. -+ * @param name The name of the Enum. -+ * @param id The unique id of the Enum. -+ */ -+UMLEnum::UMLEnum(const QString& name, Uml::ID::Type id) : UMLClassifier(name, id) -+{ -+ init(); -+} -+ -+/** -+ * Standard destructor. -+ */ -+UMLEnum::~UMLEnum() -+{ -+ m_List.clear(); -+} -+ -+/** -+ * Overloaded '==' operator. -+ */ -+bool UMLEnum::operator==(const UMLEnum & rhs) const -+{ -+ return UMLClassifier::operator==(rhs); -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLEnum::copyInto(UMLObject *lhs) const -+{ -+ UMLClassifier::copyInto(lhs); -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLEnum::clone() const -+{ -+ UMLEnum *clone = new UMLEnum(); -+ copyInto(clone); -+ -+ return clone; -+} -+ -+/** -+ * Initializes key variables of the class. -+ */ -+void UMLEnum::init() -+{ -+ m_BaseType = UMLObject::ot_Enum; -+ setStereotypeCmd(QLatin1String("enum")); -+} -+ -+/** -+ * Creates a literal for the enum. -+ * @return The UMLEnum created -+ */ -+UMLObject* UMLEnum::createEnumLiteral(const QString& name) -+{ -+ Uml::ID::Type id = UniqueID::gen(); -+ QString currentName; -+ if (name.isNull()) { -+ currentName = uniqChildName(UMLObject::ot_EnumLiteral); -+ } else { -+ currentName = name; -+ } -+ -+ UMLEnumLiteral* newEnumLiteral = new UMLEnumLiteral(this, currentName); -+ -+ bool ok = true; -+ bool goodName = false; -+ -+ //check for name.isNull() stops dialog being shown -+ //when creating enum literal via list view -+ while (ok && !goodName && name.isNull()) { -+ ok = newEnumLiteral->showPropertiesDialog(UMLApp::app()); -+ QString name = newEnumLiteral->name(); -+ -+ if(name.length() == 0) { -+ KMessageBox::error(0, i18n("That is an invalid name."), i18n("Invalid Name")); -+ } else { -+ goodName = true; -+ } -+ } -+ -+ if (!ok) { -+ delete newEnumLiteral; -+ return NULL; -+ } -+ -+ addEnumLiteral(newEnumLiteral); -+ -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ umldoc->signalUMLObjectCreated(newEnumLiteral); -+ return newEnumLiteral; -+} -+ -+/** -+ * Adds an enumliteral to the enum. -+ * @param name The name of the enumliteral. -+ * @param id The id of the enumliteral (optional.) -+ * If omitted a new ID is assigned internally. -+ * @return Pointer to the UMLEnumliteral created. -+ */ -+UMLObject* UMLEnum::addEnumLiteral(const QString &name, Uml::ID::Type id) -+{ -+ UMLObject *el = UMLCanvasObject::findChildObject(name); -+ if (el != NULL) { -+ uDebug() << name << " is already present"; -+ return el; -+ } -+ UMLEnumLiteral* literal = new UMLEnumLiteral(this, name, id); -+ m_List.append(literal); -+ UMLObject::emitModified(); -+ emit enumLiteralAdded(literal); -+ connect(literal, SIGNAL(modified()), this, SIGNAL(modified())); -+ return literal; -+} -+ -+/** -+ * Adds an already created enumliteral. -+ * The enumliteral object must not belong to any other concept. -+ * @param literal Pointer to the UMLEnumLiteral. -+ * @param Log Pointer to the IDChangeLog. -+ * @return True if the enumliteral was successfully added. -+ */ -+bool UMLEnum::addEnumLiteral(UMLEnumLiteral* literal, IDChangeLog* Log /* = 0*/) -+{ -+ QString name = (QString)literal->name(); -+ if (findChildObject(name) == NULL) { -+ literal->setParent(this); -+ m_List.append(literal); -+ UMLObject::emitModified(); -+ emit enumLiteralAdded(literal); -+ connect(literal, SIGNAL(modified()), this, SIGNAL(modified())); -+ return true; -+ } else if (Log) { -+ Log->removeChangeByNewID(literal->id()); -+ delete literal; -+ } -+ return false; -+} -+ -+/** -+ * Adds an enumliteral to the enum, at the given position. -+ * If position is negative or too large, the enumliteral is added -+ * to the end of the list. -+ * TODO: give default value -1 to position (append) - now it conflicts with the method above.. -+ * @param literal Pointer to the UMLEnumLiteral. -+ * @param position Position index for the insertion. -+ * @return True if the enumliteral was successfully added. -+ */ -+bool UMLEnum::addEnumLiteral(UMLEnumLiteral* literal, int position) -+{ -+ Q_ASSERT(literal); -+ QString name = (QString)literal->name(); -+ if (findChildObject(name) == NULL) { -+ literal->setParent(this); -+ if (position >= 0 && position <= (int)m_List.count()) { -+ m_List.insert(position, literal); -+ } else { -+ m_List.append(literal); -+ } -+ UMLObject::emitModified(); -+ emit enumLiteralAdded(literal); -+ connect(literal, SIGNAL(modified()), this, SIGNAL(modified())); -+ return true; -+ } -+ return false; -+} -+ -+/** -+ * Removes an enumliteral from the class. -+ * @param literal The enumliteral to remove. -+ * @return Count of the remaining enumliterals after removal. -+ * Returns -1 if the given enumliteral was not found. -+ */ -+int UMLEnum::removeEnumLiteral(UMLEnumLiteral* literal) -+{ -+ if (!m_List.removeAll(literal)) { -+ uDebug() << "cannot find att given in list"; -+ return -1; -+ } -+ emit enumLiteralRemoved(literal); -+ UMLObject::emitModified(); -+ // If we are deleting the object, then we don't need to disconnect..this is done auto-magically -+ // for us by QObject. -b.t. -+ // disconnect(a, SIGNAL(modified()), this, SIGNAL(modified())); -+ delete literal; -+ return m_List.count(); -+} -+ -+/** -+ * Returns the number of enumliterals for the class. -+ * @return The number of enumliterals for the class. -+ */ -+int UMLEnum::enumLiterals() -+{ -+ return m_List.count(); -+} -+ -+/** -+ * Emit the enumLiteralRemoved signal. -+ */ -+void UMLEnum::signalEnumLiteralRemoved(UMLClassifierListItem *elit) -+{ -+ emit enumLiteralRemoved(elit); -+} -+ -+/** -+ * Creates the element including its enumliterals. -+ */ -+void UMLEnum::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement enumElement = UMLObject::save(QLatin1String("UML:Enumeration"), qDoc); -+ // save enum literals -+ UMLClassifierListItemList enumLiterals = getFilteredList(UMLObject::ot_EnumLiteral); -+ foreach (UMLClassifierListItem* pEnumLiteral, enumLiterals) { -+ pEnumLiteral->saveToXMI(qDoc, enumElement); -+ } -+ qElement.appendChild(enumElement); -+} -+ -+/** -+ * Loads the element including its enumliterals. -+ */ -+bool UMLEnum::load(QDomElement& element) -+{ -+ QDomNode node = element.firstChild(); -+ while(!node.isNull()) { -+ if (node.isComment()) { -+ node = node.nextSibling(); -+ continue; -+ } -+ QDomElement tempElement = node.toElement(); -+ QString tag = tempElement.tagName(); -+ if (UMLDoc::tagEq(tag, QLatin1String("EnumerationLiteral")) || -+ UMLDoc::tagEq(tag, QLatin1String("ownedLiteral")) || -+ UMLDoc::tagEq(tag, QLatin1String("EnumLiteral"))) { // for backward compatibility -+ UMLEnumLiteral* pEnumLiteral = new UMLEnumLiteral(this); -+ if(!pEnumLiteral->loadFromXMI(tempElement)) { -+ return false; -+ } -+ m_List.append(pEnumLiteral); -+ } else if (UMLDoc::tagEq(tag, QLatin1String("Enumeration.literal"))) { // Embarcadero's Describe -+ if (! load(tempElement)) -+ return false; -+ } else if (tag == QLatin1String("stereotype")) { -+ uDebug() << name() << ": losing old-format stereotype."; -+ } else { -+ uWarning() << "unknown child type: " << tag; -+ } -+ node = node.nextSibling(); -+ }//end while -+ return true; -+} -+ -+/** -+ * Create a new ClassifierListObject (enumLiteral) -+ * according to the given XMI tag. -+ * Returns NULL if the string given does not contain one of the tags -+ * -+ * Used by the clipboard for paste operation. -+ * Reimplemented from UMLClassifier for UMLEnum -+ */ -+UMLClassifierListItem* UMLEnum::makeChildObject(const QString& xmiTag) -+{ -+ UMLClassifierListItem* pObject = NULL; -+ if (UMLDoc::tagEq(xmiTag, QLatin1String("EnumerationLiteral")) || -+ UMLDoc::tagEq(xmiTag, QLatin1String("EnumLiteral"))) { -+ pObject = new UMLEnumLiteral(this); -+ } -+ return pObject; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/enum.h umbrello-kf6-15.08.1/umbrello/umlmodel/enum.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/enum.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/enum.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,72 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ENUM_H -+#define ENUM_H -+ -+#include "classifier.h" -+ -+class UMLEnumLiteral; -+ -+/** -+ * This class contains the non-graphical information required for a UML -+ * Enum. -+ * This class inherits from @ref UMLClassifier which contains most of the -+ * information. -+ * -+ * @short Non-graphical Information for an Enum. -+ * @author Jonathan Riddell -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLEnum : public UMLClassifier -+{ -+ Q_OBJECT -+public: -+ explicit UMLEnum(const QString& name = QString(), Uml::ID::Type id = Uml::ID::None); -+ -+ virtual ~UMLEnum(); -+ -+ bool operator==(const UMLEnum& rhs) const; -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ virtual UMLObject* clone() const; -+ -+ UMLObject* createEnumLiteral(const QString& name = QString()); -+ -+ UMLObject* addEnumLiteral(const QString &name, Uml::ID::Type id = Uml::ID::None); -+ -+ bool addEnumLiteral(UMLEnumLiteral* literal, IDChangeLog* Log = 0); -+ bool addEnumLiteral(UMLEnumLiteral* literal, int position); -+ -+ int removeEnumLiteral(UMLEnumLiteral* literal); -+ -+ int enumLiterals(); -+ -+ void signalEnumLiteralRemoved(UMLClassifierListItem *elit); -+ -+ virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+ virtual UMLClassifierListItem* makeChildObject(const QString& xmiTag); -+ -+signals: -+ void enumLiteralAdded(UMLClassifierListItem*); -+ void enumLiteralRemoved(UMLClassifierListItem*); -+ -+protected: -+ bool load(QDomElement & element); -+ -+private: -+ void init(); -+ -+}; -+ -+#endif // ENUM_H -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/enumliteral.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/enumliteral.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/enumliteral.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/enumliteral.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,126 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "enumliteral.h" -+ -+// kde includes -+#if QT_VERSION < 0x050000 -+#include -+#endif -+#include -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+ -+/** -+ * Sets up an enum literal. -+ * @param parent The parent of this UMLEnumLiteral. -+ * @param name The name of this UMLEnumLiteral. -+ * @param id The unique id given to this UMLEnumLiteral. -+ */ -+UMLEnumLiteral::UMLEnumLiteral(UMLObject *parent, -+ const QString& name, Uml::ID::Type id) -+ : UMLClassifierListItem(parent, name, id) -+{ -+ m_BaseType = UMLObject::ot_EnumLiteral; -+} -+ -+/** -+ * Sets up an enum literal. -+ * @param parent The parent of this UMLEnumLiteral. -+ */ -+UMLEnumLiteral::UMLEnumLiteral(UMLObject *parent) -+ : UMLClassifierListItem(parent) -+{ -+ m_BaseType = UMLObject::ot_EnumLiteral; -+} -+ -+/** -+ * Destructor. -+ */ -+UMLEnumLiteral::~UMLEnumLiteral() -+{ -+} -+ -+/** -+ * Overloaded '==' operator -+ */ -+bool UMLEnumLiteral::operator==(const UMLEnumLiteral& rhs) const -+{ -+ if (this == &rhs) { -+ return true; -+ } -+ if (!UMLObject::operator==(rhs)) { -+ return false; -+ } -+ return true; -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLEnumLiteral::copyInto(UMLObject *lhs) const -+{ -+ UMLClassifierListItem::copyInto(lhs); -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLEnumLiteral::clone() const -+{ -+ UMLEnumLiteral *clone = new UMLEnumLiteral((UMLObject *) parent()); -+ copyInto(clone); -+ -+ return clone; -+} -+ -+/** -+ * Creates the XMI element. -+ */ -+void UMLEnumLiteral::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement attributeElement = UMLObject::save(QLatin1String("UML:EnumerationLiteral"), qDoc); -+ qElement.appendChild(attributeElement); -+} -+ -+/** -+ * Loads the XMI element (empty.) -+ */ -+bool UMLEnumLiteral::load(QDomElement& element) -+{ -+ Q_UNUSED(element); -+ return true; -+} -+ -+/** -+ * Display the properties configuration dialog for the enum literal. -+ */ -+bool UMLEnumLiteral::showPropertiesDialog(QWidget* parent) -+{ -+ bool ok; -+#if QT_VERSION >= 0x050000 -+ QString enumName = QInputDialog::getText(parent, -+ i18nc("enum name", "Name"), i18n("Enter name:"), -+ QLineEdit::Normal, -+ name(), &ok); -+#else -+ QString enumName = KInputDialog::getText(i18nc("enum name", "Name"), i18n("Enter name:"), name(), &ok, parent); -+#endif -+ if (ok && !enumName.isEmpty()) { -+ setName(enumName); -+ return true; -+ } else { -+ return false; -+ } -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/enumliteral.h umbrello-kf6-15.08.1/umbrello/umlmodel/enumliteral.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/enumliteral.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/enumliteral.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,49 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ENUMLITERAL_H -+#define ENUMLITERAL_H -+ -+#include "classifierlistitem.h" -+ -+/** -+ * This class is used to set up information for an enum literal. Enum -+ * literals are the values that enums can be set to. -+ * -+ * @short Sets up attribute information. -+ * @author Paul Hensgen -+ * @see UMLObject -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLEnumLiteral : public UMLClassifierListItem -+{ -+public: -+ UMLEnumLiteral(UMLObject* parent, -+ const QString& name, Uml::ID::Type id = Uml::ID::None); -+ explicit UMLEnumLiteral(UMLObject* parent); -+ -+ bool operator==(const UMLEnumLiteral &rhs) const; -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ virtual UMLObject* clone() const; -+ -+ virtual ~UMLEnumLiteral(); -+ -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+ virtual bool showPropertiesDialog(QWidget* parent = 0); -+ -+protected: -+ bool load(QDomElement& element); -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/folder.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/folder.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/folder.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/folder.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,558 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2006-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "folder.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "model_utils.h" -+#include "object_factory.h" -+#include "optionstate.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "umlview.h" -+ -+// kde includes -+#include -+#include -+ -+// qt includes -+#include -+ -+/** -+ * Sets up a Folder. -+ * @param name The name of the Folder. -+ * @param id The unique id of the Folder. A new ID will be generated -+ * if this argument is left away. -+ */ -+UMLFolder::UMLFolder(const QString & name, Uml::ID::Type id) -+ : UMLPackage(name, id) -+{ -+ m_BaseType = UMLObject::ot_Folder; -+ UMLObject::setStereotypeCmd(QLatin1String("folder")); -+} -+ -+/** -+ * Empty destructor. -+ */ -+UMLFolder::~UMLFolder() -+{ -+ qDeleteAll(m_diagrams); -+ m_diagrams.clear(); -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLFolder::clone() const -+{ -+ UMLFolder *clone = new UMLFolder(); -+ UMLObject::copyInto(clone); -+ return clone; -+} -+ -+/** -+ * Set the localized name of this folder. -+ * This is set for the predefined root views (Logical, -+ * UseCase, Component, Deployment, EntityRelationship, -+ * and the Datatypes folder inside the Logical View.) -+ */ -+void UMLFolder::setLocalName(const QString& localName) -+{ -+ m_localName = localName; -+} -+ -+/** -+ * Return the localized name of this folder. -+ * Only useful for the predefined root folders. -+ */ -+QString UMLFolder::localName() const -+{ -+ return m_localName; -+} -+ -+/** -+ * Add a view to the diagram list. -+ */ -+void UMLFolder::addView(UMLView *view) -+{ -+ m_diagrams.append(view); -+} -+ -+/** -+ * Remove a view from the diagram list. -+ */ -+void UMLFolder::removeView(UMLView *view) -+{ -+ m_diagrams.removeAll(view); -+ delete view; -+} -+ -+/** -+ * Append the views in this folder to the given diagram list. -+ * @param viewList The UMLViewList to which to append the diagrams. -+ * @param includeNested Whether to include diagrams from nested folders -+ * (default: true.) -+ */ -+void UMLFolder::appendViews(UMLViewList& viewList, bool includeNested) -+{ -+ if (includeNested) { -+ foreach (UMLObject* o, m_objects) { -+ uIgnoreZeroPointer(o); -+ if (o->baseType() == UMLObject::ot_Folder) { -+ UMLFolder *f = static_cast(o); -+ f->appendViews(viewList); -+ } -+ } -+ } -+ foreach (UMLView* v, m_diagrams) { -+ viewList.append(v); -+ } -+} -+ -+/** -+ * Acivate the views in this folder. -+ * "Activation": Some widgets require adjustments after loading from file, -+ * those are done here. -+ */ -+void UMLFolder::activateViews() -+{ -+ foreach (UMLObject* o, m_objects) { -+ uIgnoreZeroPointer(o); -+ if (o->baseType() == UMLObject::ot_Folder) { -+ UMLFolder *f = static_cast(o); -+ f->activateViews(); -+ } -+ } -+ -+ foreach (UMLView* v, m_diagrams) { -+ v->umlScene()->activateAfterLoad(); -+ } -+ // Make sure we have a treeview item for each diagram. -+ // It may happen that we are missing them after switching off tabbed widgets. -+ Settings::OptionState optionState = Settings::optionState(); -+ if (optionState.generalState.tabdiagrams) { -+ return; -+ } -+ Model_Utils::treeViewAddViews(m_diagrams); -+} -+ -+/** -+ * Seek a view of the given ID in this folder. -+ * @param id ID of the view to find. -+ * @return Pointer to the view if found, NULL if no view found. -+ */ -+UMLView *UMLFolder::findView(Uml::ID::Type id) -+{ -+ foreach (UMLView* v, m_diagrams) { -+ if (v->umlScene()->ID() == id) { -+ return v; -+ } -+ } -+ -+ UMLView* v = 0; -+ UMLPackageList packages; -+ appendPackages(packages); -+ foreach (UMLPackage *o, packages) { -+ if (o->baseType() != UMLObject::ot_Folder) { -+ continue; -+ } -+ UMLFolder *f = static_cast(o); -+ v = f->findView(id); -+ if (v) { -+ break; -+ } -+ } -+ return v; -+} -+ -+/** -+ * Seek a view by the type and name given. -+ * @param type The type of view to find. -+ * @param name The name of the view to find. -+ * @param searchAllScopes Search in all subfolders (default: true.) -+ * @return Pointer to the view found, or NULL if not found. -+ */ -+UMLView *UMLFolder::findView(Uml::DiagramType::Enum type, const QString &name, bool searchAllScopes) -+{ -+ foreach (UMLView* v, m_diagrams) { -+ if (v->umlScene()->type() == type && v->umlScene()->name() == name) { -+ return v; -+ } -+ } -+ -+ UMLView* v = 0; -+ if (searchAllScopes) { -+ foreach (UMLObject* o, m_objects) { -+ uIgnoreZeroPointer(o); -+ if (o->baseType() != UMLObject::ot_Folder) { -+ continue; -+ } -+ UMLFolder *f = static_cast(o); -+ v = f->findView(type, name, searchAllScopes); -+ if (v) { -+ break; -+ } -+ } -+ } -+ return v; -+} -+ -+/** -+ * Set the options for the views in this folder. -+ */ -+void UMLFolder::setViewOptions(const Settings::OptionState& optionState) -+{ -+ // for each view update settings -+ foreach (UMLView* v, m_diagrams) { -+ v->umlScene()->setOptionState(optionState); -+ } -+} -+ -+/** -+ * Remove all views in this folder. -+ */ -+void UMLFolder::removeAllViews() -+{ -+ foreach (UMLObject* o, m_objects) { -+ uIgnoreZeroPointer(o); -+ if (o->baseType() != UMLObject::ot_Folder) -+ continue; -+ UMLFolder *f = static_cast(o); -+ f->removeAllViews(); -+ } -+ -+ foreach (UMLView* v, m_diagrams) { -+ // TODO ------------------ check this code - bad: calling back to UMLDoc::removeView() -+ v->umlScene()->removeAllAssociations(); // note : It may not be apparent, but when we remove all associations -+ // from a view, it also causes any UMLAssociations that lack parent -+ // association widgets (but once had them) to remove themselves from -+ // this document. -+ uDebug() << "removing " << v->umlScene()->name(); -+ UMLApp::app()->document()->removeView(v, false); -+ } -+ -+ qDeleteAll(m_diagrams); -+ m_diagrams.clear(); -+} -+ -+/** -+ * Set the folder file name for a separate submodel. -+ */ -+void UMLFolder::setFolderFile(const QString& fileName) -+{ -+ m_folderFile = fileName; -+} -+ -+/** -+ * Get the folder file name for a separate submodel. -+ */ -+QString UMLFolder::folderFile() const -+{ -+ return m_folderFile; -+} -+ -+/** -+ * Auxiliary to saveToXMI(): Save the contained objects and diagrams. -+ * Can be used regardless of whether saving to the main model file -+ * or to an external folder file (see m_folderFile.) -+ */ -+void UMLFolder::saveContents(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement ownedElement = qDoc.createElement(QLatin1String("UML:Namespace.ownedElement")); -+ UMLObject *obj = 0; -+ // Save contained objects if any. -+ for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -+ obj = oit.next(); -+ uIgnoreZeroPointer(obj); -+ obj->saveToXMI (qDoc, ownedElement); -+ } -+ // Save asscociations if any. -+ for (UMLObjectListIt ait(m_List); ait.hasNext();) { -+ obj = ait.next(); -+ obj->saveToXMI (qDoc, ownedElement); -+ } -+ qElement.appendChild(ownedElement); -+ // Save diagrams to `extension'. -+ if (m_diagrams.count()) { -+ QDomElement diagramsElement = qDoc.createElement(QLatin1String("diagrams")); -+ -+ foreach (UMLView* pView, m_diagrams) { -+ pView->umlScene()->saveToXMI(qDoc, diagramsElement); -+ } -+ QDomElement extension = qDoc.createElement(QLatin1String("XMI.extension")); -+ extension.setAttribute(QLatin1String("xmi.extender"), QLatin1String("umbrello-kf6")); -+ extension.appendChild(diagramsElement); -+ qElement.appendChild(extension); -+ } -+} -+ -+/** -+ * Auxiliary to saveToXMI(): Creates a element when saving -+ * a predefined modelview, or a element when saving a -+ * user created folder. Invokes saveContents() with the newly created -+ * element. -+ */ -+void UMLFolder::save(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ QString elementName(QLatin1String("UML:Package")); -+ const Uml::ModelType::Enum mt = umldoc->rootFolderType(this); -+ if (mt != Uml::ModelType::N_MODELTYPES) { -+ elementName = QLatin1String("UML:Model"); -+ } -+ QDomElement folderElement = UMLObject::save(elementName, qDoc); -+ saveContents(qDoc, folderElement); -+ qElement.appendChild(folderElement); -+} -+ -+/** -+ * Creates a UML:Model or UML:Package element: -+ * UML:Model is created for the predefined fixed folders, -+ * UML:Package with stereotype "folder" is created for all else. -+ */ -+void UMLFolder::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ if (m_folderFile.isEmpty()) { -+ save(qDoc, qElement); -+ return; -+ } -+ // See if we can create the external file. -+ // If not then internalize the folder. -+ UMLDoc *umldoc = UMLApp::app()->document(); -+#if QT_VERSION >= 0x050000 -+ QString fileName = umldoc->url().adjusted(QUrl::RemoveFilename).path() + m_folderFile; -+#else -+ QString fileName = umldoc->url().directory() + QLatin1Char('/') + m_folderFile; -+#endif -+ QFile file(fileName); -+ if (!file.open(QIODevice::WriteOnly)) { -+ uError() << m_folderFile << QLatin1String(": ") -+ << "cannot create file, contents will be saved in main model file"; -+ m_folderFile.clear(); -+ save(qDoc, qElement); -+ return; -+ } -+ // Okay, external file is writable. Wrap up main file. -+ QDomElement folderElement = UMLObject::save(QLatin1String("UML:Package"), qDoc); -+ QDomElement extension = qDoc.createElement(QLatin1String("XMI.extension")); -+ extension.setAttribute(QLatin1String("xmi.extender"), QLatin1String("umbrello-kf6")); -+ QDomElement fileElement = qDoc.createElement(QLatin1String("external_file")); -+ fileElement.setAttribute(QLatin1String("name"), m_folderFile); -+ extension.appendChild(fileElement); -+ folderElement.appendChild(extension); -+ qElement.appendChild(folderElement); -+ -+ // Save folder to external file. -+ QDomDocument folderDoc; -+ QDomElement folderRoot; -+ QDomProcessingInstruction xmlHeading = -+ folderDoc.createProcessingInstruction(QLatin1String("xml"), -+ QString::fromLatin1("version=\"1.0\" encoding=\"UTF-8\"")); -+ folderDoc.appendChild(xmlHeading); -+ folderRoot = folderDoc.createElement(QLatin1String("external_file")); -+ folderRoot.setAttribute(QLatin1String("name"), name()); -+ folderRoot.setAttribute(QLatin1String("filename"), m_folderFile); -+ folderRoot.setAttribute(QLatin1String("mainModel"), umldoc->url().fileName()); -+ folderRoot.setAttribute(QLatin1String("parentId"), Uml::ID::toString(m_pUMLPackage->id())); -+ folderRoot.setAttribute(QLatin1String("parent"), m_pUMLPackage->fullyQualifiedName(QLatin1String("::"), true)); -+ saveContents(folderDoc, folderRoot); -+ folderDoc.appendChild(folderRoot); -+ QTextStream stream(&file); -+ stream.setCodec("UTF-8"); -+ stream << folderDoc.toString(); -+ file.close(); -+} -+ -+/** -+ * Auxiliary to load(): -+ * Load the diagrams from the "diagrams" in the -+ */ -+bool UMLFolder::loadDiagramsFromXMI(QDomNode& diagrams) -+{ -+ const Settings::OptionState optionState = Settings::optionState(); -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ bool totalSuccess = true; -+ for (QDomElement diagram = diagrams.toElement(); !diagram.isNull(); -+ diagrams = diagrams.nextSibling(), diagram = diagrams.toElement()) { -+ QString tag = diagram.tagName(); -+ if (tag != QLatin1String("diagram")) { -+ uDebug() << "ignoring " << tag << " in "; -+ continue; -+ } -+ UMLView * pView = new UMLView(this); -+ pView->umlScene()->setOptionState(optionState); -+ if (pView->umlScene()->loadFromXMI(diagram)) { -+ pView->hide(); -+ umldoc->addView(pView); -+ } else { -+ delete pView; -+ totalSuccess = false; -+ } -+ } -+ return totalSuccess; -+} -+ -+/** -+ * Folders in the listview can be marked such that their contents -+ * are saved to a separate file. -+ * This method loads the separate folder file. -+ * CAVEAT: This is not XMI standard compliant. -+ * If standard compliance is an issue then avoid folder files. -+ * @param path Fully qualified file name, i.e. absolute directory -+ * plus file name. -+ * @return True for success. -+ */ -+bool UMLFolder::loadFolderFile(const QString& path) -+{ -+ QFile file(path); -+ if (!file.exists()) { -+ KMessageBox::error(0, i18n("The folderfile %1 does not exist.", path), i18n("Load Error")); -+ return false; -+ } -+ if (!file.open(QIODevice::ReadOnly)) { -+ KMessageBox::error(0, i18n("The folderfile %1 cannot be opened.", path), i18n("Load Error")); -+ return false; -+ } -+ QTextStream stream(&file); -+ QString data = stream.readAll(); -+ file.close(); -+ QDomDocument doc; -+ QString error; -+ int line; -+ if (!doc.setContent(data, false, &error, &line)) { -+ uError() << "Cannot set content:" << error << " line:" << line; -+ return false; -+ } -+ QDomNode rootNode = doc.firstChild(); -+ while (rootNode.isComment() || rootNode.isProcessingInstruction()) { -+ rootNode = rootNode.nextSibling(); -+ } -+ if (rootNode.isNull()) { -+ uError() << "Root node is Null"; -+ return false; -+ } -+ QDomElement element = rootNode.toElement(); -+ QString type = element.tagName(); -+ if (type != QLatin1String("external_file")) { -+ uError() << "Root node has unknown type " << type; -+ return false; -+ } -+ return load(element); -+} -+ -+/** -+ * Loads the owned elements of the . -+ */ -+bool UMLFolder::load(QDomElement& element) -+{ -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ bool totalSuccess = true; -+ for (QDomNode node = element.firstChild(); !node.isNull(); -+ node = node.nextSibling()) { -+ if (node.isComment()) -+ continue; -+ QDomElement tempElement = node.toElement(); -+ QString type = tempElement.tagName(); -+ if (Model_Utils::isCommonXMIAttribute(type)) -+ continue; -+ if (UMLDoc::tagEq(type, QLatin1String("Namespace.ownedElement")) || -+ UMLDoc::tagEq(type, QLatin1String("Namespace.contents"))) { -+ //CHECK: umbrello-kf6 currently assumes that nested elements -+ // are ownedElements anyway. -+ // Therefore these tags are not further interpreted. -+ if (! load(tempElement)) { -+ uDebug() << "An error happened while loading the " << type -+ << " of the " << name(); -+ totalSuccess = false; -+ } -+ continue; -+ } else if (UMLDoc::tagEq(type, QLatin1String("packagedElement")) || -+ UMLDoc::tagEq(type, QLatin1String("ownedElement"))) { -+ type = tempElement.attribute(QLatin1String("xmi:type")); -+ } else if (type == QLatin1String("XMI.extension")) { -+ for (QDomNode xtnode = node.firstChild(); !xtnode.isNull(); -+ xtnode = xtnode.nextSibling()) { -+ QDomElement el = xtnode.toElement(); -+ const QString xtag = el.tagName(); -+ if (xtag == QLatin1String("diagrams")) { -+ QDomNode diagramNode = xtnode.firstChild(); -+ if (!loadDiagramsFromXMI(diagramNode)) -+ totalSuccess = false; -+ } else if (xtag == QLatin1String("external_file")) { -+#if QT_VERSION >= 0x050000 -+ const QString rootDir(umldoc->url().adjusted(QUrl::RemoveFilename).path()); -+#else -+ const QString rootDir(umldoc->url().directory()); -+#endif -+ QString fileName = el.attribute(QLatin1String("name")); -+ const QString path(rootDir + QLatin1Char('/') + fileName); -+ if (loadFolderFile(path)) -+ m_folderFile = fileName; -+ } else { -+ uDebug() << name() << ": ignoring XMI.extension " << xtag; -+ continue; -+ } -+ } -+ continue; -+ } -+ // Do not re-create the predefined Datatypes folder in the Logical View, -+ // it already exists. -+ UMLFolder *logicalView = umldoc->rootFolder(Uml::ModelType::Logical); -+ if (this == logicalView && UMLDoc::tagEq(type, QLatin1String("Package"))) { -+ QString thisName = tempElement.attribute(QLatin1String("name")); -+ if (thisName == QLatin1String("Datatypes")) { -+ UMLFolder *datatypeFolder = umldoc->datatypeFolder(); -+ if (!datatypeFolder->loadFromXMI(tempElement)) -+ totalSuccess = false; -+ continue; -+ } -+ } -+ UMLObject *pObject = 0; -+ // Avoid duplicate creation of forward declared object -+ QString idStr = Model_Utils::getXmiId(tempElement); -+ if (!idStr.isEmpty()) { -+ Uml::ID::Type id = Uml::ID::fromString(idStr); -+ pObject = umldoc->findObjectById(id); -+ if (pObject) { -+ uDebug() << "object " << idStr << "already exists"; -+ } -+ } -+ if (pObject == 0) { -+ QString stereoID = tempElement.attribute(QLatin1String("stereotype")); -+ pObject = Object_Factory::makeObjectFromXMI(type, stereoID); -+ if (!pObject) { -+ uWarning() << "Unknown type of umlobject to create: " << type; -+ continue; -+ } -+ } -+ pObject->setUMLPackage(this); -+ if (!pObject->loadFromXMI(tempElement)) { -+ removeObject(pObject); -+ delete pObject; -+ totalSuccess = false; -+ } -+ } -+ return totalSuccess; -+} -+ -+/** -+ * Overloading operator for debugging output. -+ */ -+QDebug operator<<(QDebug out, const UMLFolder& item) -+{ -+ out.nospace() << "UMLFolder: localName=" << item.m_localName -+ << ", folderFile=" << item.m_folderFile -+ << ", diagrams=" << item.m_diagrams.count(); -+ return out.space(); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/folder.h umbrello-kf6-15.08.1/umbrello/umlmodel/folder.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/folder.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/folder.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,92 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2006-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLFOLDER_H -+#define UMLFOLDER_H -+ -+#include "package.h" -+#include "umlviewlist.h" -+#include "optionstate.h" -+ -+/** -+ * This class manages the UMLObjects and UMLViews of a Folder. -+ * This class inherits from UMLPackage which contains most -+ * of the information. -+ * -+ * The UMLDoc class allocates a fixed instance of this class for -+ * each of the predefined Logical, UseCase, Component, Deployment, and -+ * Entity-Relationship folders. Further instances are created on demand -+ * for user folders. -+ * -+ * @short Non-graphical management of objects and diagrams of a Folder -+ * @author Oliver Kellogg -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ * -+ * TODO: This whole class needs a relook regarding view/scene. -+ */ -+class UMLFolder : public UMLPackage -+{ -+ Q_OBJECT -+public: -+ explicit UMLFolder(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -+ virtual ~UMLFolder(); -+ -+ virtual UMLObject* clone() const; -+ -+ void setLocalName(const QString& localName); -+ QString localName() const; -+ -+ void addView(UMLView *view); -+ -+ void removeView(UMLView *view); -+ -+ void appendViews(UMLViewList& viewList, bool includeNested = true); -+ -+ void activateViews(); -+ -+ UMLView* findView(Uml::ID::Type id); -+ UMLView* findView(Uml::DiagramType::Enum type, const QString &name, bool searchAllScopes = true); -+ -+ void setViewOptions(const Settings::OptionState& optionState); -+ -+ void removeAllViews(); -+ -+ void setFolderFile(const QString& fileName); -+ QString folderFile() const; -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+ friend QDebug operator<<(QDebug out, const UMLFolder& item); -+ -+protected: -+ void saveContents(QDomDocument& qDoc, QDomElement& qElement); -+ -+ void save(QDomDocument& qDoc, QDomElement& qElement); -+ -+ bool loadDiagramsFromXMI(QDomNode& diagrams); -+ -+ bool loadFolderFile(const QString& path); -+ -+ bool load(QDomElement & element); -+ -+private: -+ QString m_localName; ///< i18n name, only used for predefined root folders -+ /** -+ * If m_folderFile is not empty then it contains a file name to which -+ * this folder is saved. -+ * In this case the folder file acts as a physically separate submodel. -+ * What is saved in the main model is not the folder contents but a -+ * reference to the folder file. -+ */ -+ QString m_folderFile; -+ UMLViewList m_diagrams; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/foreignkeyconstraint.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/foreignkeyconstraint.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/foreignkeyconstraint.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/foreignkeyconstraint.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,444 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+//own header -+#include "foreignkeyconstraint.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "entity.h" -+#include "entityattribute.h" -+#include "umlobject.h" -+#include "umldoc.h" -+#include "uml.h" -+#include "umlforeignkeyconstraintdialog.h" -+#include "object_factory.h" -+ -+/** -+ * Sets up a constraint. -+ * @param parent The parent of this UMLForeignKeyConstraint. -+ * @param name The name of this UMLForeignKeyConstraint. -+ * @param id The unique id given to this UMLForeignKeyConstraint. -+ */ -+UMLForeignKeyConstraint::UMLForeignKeyConstraint(UMLObject *parent, -+ const QString& name, Uml::ID::Type id) -+ : UMLEntityConstraint(parent, name, id) -+{ -+ init(); -+} -+ -+/** -+ * Sets up a constraint. -+ * @param parent The parent of this UMLForeignKeyConstraint. -+ */ -+UMLForeignKeyConstraint::UMLForeignKeyConstraint(UMLObject *parent) -+ : UMLEntityConstraint(parent) -+{ -+ init(); -+} -+ -+/** -+ * Initialisation of common variables -+ */ -+void UMLForeignKeyConstraint::init() -+{ -+ // initialise attributes -+ m_BaseType = UMLObject::ot_ForeignKeyConstraint; -+ -+ // should be NULL actually -+ // self referencing assigned to protect default behaviour -+ m_ReferencedEntity = static_cast(parent()); -+ -+ m_UpdateAction = uda_NoAction; -+ m_DeleteAction = uda_NoAction; -+ -+ // connecte signals and slots -+ connect(this, SIGNAL(sigReferencedEntityChanged()), this, SLOT(slotReferencedEntityChanged())); -+} -+ -+/** -+ * Overloaded '==' operator -+ */ -+bool UMLForeignKeyConstraint::operator==(const UMLForeignKeyConstraint &rhs) const -+{ -+ if(this == &rhs) -+ return true; -+ -+ if(!UMLObject::operator==(rhs)) -+ return false; -+ -+ return true; -+} -+ -+/** -+ * Destructor. -+ */ -+UMLForeignKeyConstraint::~UMLForeignKeyConstraint() -+{ -+} -+ -+/** -+ * Copy the internal presentation of this object into the UMLForeignKeyConstraint -+ * object. -+ */ -+void UMLForeignKeyConstraint::copyInto(UMLObject *lhs) const -+{ -+ UMLForeignKeyConstraint *target = static_cast(lhs); -+ -+ // call the parent first. -+ UMLEntityConstraint::copyInto(target); -+ -+ // Copy all datamembers -+ target->m_ReferencedEntity = m_ReferencedEntity; -+ target->m_AttributeMap = m_AttributeMap; -+ target->m_DeleteAction = m_DeleteAction; -+ target->m_UpdateAction = m_UpdateAction; -+} -+ -+/** -+ * Make a clone of the UMLForeignKeyConstraint. -+ */ -+UMLObject* UMLForeignKeyConstraint::clone() const -+{ -+ //FIXME: The new attribute should be slaved to the NEW parent not the old. -+ UMLForeignKeyConstraint *clone = new UMLForeignKeyConstraint(static_cast(parent())); -+ copyInto(clone); -+ return clone; -+} -+ -+/** -+ * Returns a string representation of the UMLForeignKeyConstraint. -+ * @param sig If true will show the attribute type and initial value. -+ * @return Returns a string representation of the UMLAttribute. -+ */ -+QString UMLForeignKeyConstraint::toString(Uml::SignatureType::Enum sig) -+{ -+ QString s; -+ -+ if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::SigNoVis) { -+ s = name() + QLatin1Char(':'); -+ s += QLatin1String(" Foreign Key ("); -+ QList keys = m_AttributeMap.keys(); -+ bool first = true; -+ foreach(UMLEntityAttribute* key, keys) { -+ if (first) { -+ first = false; -+ } else -+ s += QLatin1Char(','); -+ s += key->name(); -+ } -+ s += QLatin1Char(')'); -+ } -+ -+ return s; -+} -+ -+/** -+ * Creates the XMI element. -+ */ -+void UMLForeignKeyConstraint::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement foreignKeyConstraintElement = UMLObject::save(QLatin1String("UML:ForeignKeyConstraint"), qDoc); -+ -+ foreignKeyConstraintElement.setAttribute(QLatin1String("referencedEntity"), Uml::ID::toString(m_ReferencedEntity->id())); -+ -+ int updateAction = (int)m_UpdateAction; -+ int deleteAction = (int)m_DeleteAction; -+ -+ foreignKeyConstraintElement.setAttribute(QLatin1String("updateAction"), updateAction); -+ foreignKeyConstraintElement.setAttribute(QLatin1String("deleteAction"), deleteAction); -+ -+ QMap::iterator i; -+ for (i = m_AttributeMap.begin(); i!= m_AttributeMap.end() ; ++i) { -+ QDomElement mapElement = qDoc.createElement(QLatin1String("AttributeMap")); -+ mapElement.setAttribute(QLatin1String("key"), Uml::ID::toString((i.key())->id())); -+ mapElement.setAttribute(QLatin1String("value"), Uml::ID::toString((i.value())->id())); -+ foreignKeyConstraintElement.appendChild(mapElement); -+ } -+ -+ qElement.appendChild(foreignKeyConstraintElement); -+} -+ -+/** -+ * Display the properties configuration dialog for the attribute. -+ */ -+bool UMLForeignKeyConstraint::showPropertiesDialog(QWidget* parent) -+{ -+ UMLForeignKeyConstraintDialog dialog(parent, this); -+ return dialog.exec(); -+} -+ -+/** -+ * Adds the attribute pair to the attributeMap -+ * @param pAttr The Attribute of the Parent Entity -+ * @param rAttr The Attribute of the Referenced Entity -+ * @return true if the attribute pair could be added successfully -+ */ -+bool UMLForeignKeyConstraint::addEntityAttributePair(UMLEntityAttribute* pAttr, UMLEntityAttribute* rAttr) -+{ -+ UMLEntity *owningParent = dynamic_cast(parent()); -+ -+ if (pAttr == NULL || rAttr == NULL) { -+ uError() << "null values passed to function"; -+ return false; -+ } -+ // check for sanity of pAttr (parent entity attribute) -+ if (owningParent == NULL) { -+ uError() << name() << ": parent is not a UMLEntity"; -+ return false; -+ } -+ -+ if (owningParent->findChildObjectById(pAttr->id()) == NULL) { -+ uError() << " parent " << owningParent->name() -+ << " does not contain attribute " << pAttr->name(); -+ return false; -+ } -+ -+ //check for sanity of rAttr (referenced entity attribute) -+ if (m_ReferencedEntity != NULL) { -+ if (m_ReferencedEntity->findChildObjectById(rAttr->id()) == NULL) { -+ uError() << " parent " << m_ReferencedEntity->name() -+ << " does not contain attribute " << rAttr->name(); -+ return false; -+ } -+ } else { -+ uError() << "Referenced Table Not set. Not Adding Pair "; -+ return false; -+ } -+ -+ // check if key takes part in some mapping -+ if (m_AttributeMap.contains(pAttr) == true) -+ return false; -+ -+ // check if value takes part in some mapping (no direct function) -+ foreach(UMLEntityAttribute* attr, m_AttributeMap.values()) { -+ if (rAttr == attr) -+ return false; -+ } -+ -+ // passed all checks, insert now -+ m_AttributeMap.insert(pAttr, rAttr); -+ -+ QMap::iterator i; -+ for (i = m_AttributeMap.begin(); i != m_AttributeMap.end(); ++i) -+ uDebug() << i.key()->name() << QLatin1String(" ") << i.key()->baseType() -+ << QLatin1String(" ") << i.value()->name() << QLatin1String(" ") << i.value()->baseType(); -+ -+ return true; -+} -+ -+/** -+ * Removes an Attribute pair -+ * @param pAttr The Attribute of the Parent Entity in the map. This attribute is the -+ key of the map. -+ * @return true of the attribute pair could be removed successfully -+ */ -+bool UMLForeignKeyConstraint::removeEntityAttributePair(UMLEntityAttribute* /*key*/ pAttr) -+{ -+ bool state = m_AttributeMap.remove(pAttr); -+ -+ return state; -+} -+ -+/** -+ * Check if a attribute pair already exists -+ * @param pAttr The Attribute of the Parent Entity -+ * @param rAttr The Attribute of the Referenced Entity -+ * @return true if the attribute pair could be found. -+ */ -+bool UMLForeignKeyConstraint::hasEntityAttributePair(UMLEntityAttribute* pAttr, UMLEntityAttribute* rAttr) const -+{ -+ if (m_AttributeMap.contains(pAttr)) { -+ if (m_AttributeMap.value(pAttr) == rAttr) { -+ return true; -+ } -+ } -+ -+ return false; -+} -+ -+/** -+ * Loads the XMI element. -+ */ -+bool UMLForeignKeyConstraint::load(QDomElement & element) -+{ -+ UMLDoc* doc = UMLApp::app()->document(); -+ -+ Uml::ID::Type referencedEntityId = Uml::ID::fromString(element.attribute(QLatin1String("referencedEntity"))); -+ -+ UMLObject* obj = doc->findObjectById(referencedEntityId); -+ m_ReferencedEntity = static_cast(obj); -+ -+ if (m_ReferencedEntity == NULL) { -+ // save for resolving later -+ m_pReferencedEntityID = referencedEntityId; -+ } -+ -+ m_UpdateAction = (UpdateDeleteAction)element.attribute(QLatin1String("updateAction")).toInt(); -+ m_DeleteAction = (UpdateDeleteAction)element.attribute(QLatin1String("deleteAction")).toInt(); -+ -+ QDomNode node = element.firstChild(); -+ while (!node.isNull()) { -+ if (node.isComment()) { -+ node = node.nextSibling(); -+ continue; -+ } -+ QDomElement tempElement = node.toElement(); -+ QString tag = tempElement.tagName(); -+ if (UMLDoc::tagEq(tag, QLatin1String("AttributeMap"))) { -+ -+ QString xmiKey = tempElement.attribute(QLatin1String("key")); -+ QString xmiValue = tempElement.attribute(QLatin1String("value")); -+ Uml::ID::Type keyId = Uml::ID::fromString(xmiKey); -+ Uml::ID::Type valueId = Uml::ID::fromString(xmiValue); -+ -+ UMLEntity* parentEntity = static_cast(parent()); -+ UMLObject* keyObj = parentEntity->findChildObjectById(keyId); -+ UMLEntityAttribute* key = static_cast(keyObj); -+ -+ if (keyObj == NULL) { -+ uWarning() << "unable to resolve foreign key referencing attribute " << xmiKey; -+ } else if (m_ReferencedEntity == NULL) { -+ // if referenced entity is null, then we won't find its attributes even -+ // save for resolving later -+ m_pEntityAttributeIDMap.insert(key, valueId); -+ } else { -+ UMLObject* valueObj = m_ReferencedEntity->findChildObjectById(valueId); -+ if (valueObj == NULL) { -+ uWarning() << "unable to resolve foreign key referenced attribute" << xmiValue; -+ } else { -+ m_AttributeMap[key] = static_cast(valueObj); -+ } -+ } -+ -+ } else { -+ uWarning() << "unknown child type in UMLForeignKeyConstraint::load"; -+ } -+ -+ node = node.nextSibling(); -+ } -+ -+ return true; -+} -+ -+/** -+ * Set the Referenced Entity. -+ * @param ent The Entity to Reference -+ */ -+void UMLForeignKeyConstraint::setReferencedEntity(UMLEntity* ent) -+{ -+ if (ent == m_ReferencedEntity) -+ return; -+ -+ m_ReferencedEntity = ent; -+ -+ emit sigReferencedEntityChanged(); -+} -+ -+/** -+ * Get the Referenced Entity. -+ * @return the UML entity object -+ */ -+UMLEntity* UMLForeignKeyConstraint::getReferencedEntity() const -+{ -+ return m_ReferencedEntity; -+} -+ -+/** -+ * Slot for referenced entity changed. -+ */ -+void UMLForeignKeyConstraint::slotReferencedEntityChanged() -+{ -+ // clear all mappings -+ m_AttributeMap.clear(); -+} -+ -+/** -+ * Clears all mappings between local and referenced attributes -+ */ -+void UMLForeignKeyConstraint::clearMappings() -+{ -+ m_AttributeMap.clear(); -+} -+ -+/** -+ * Remimplementation from base classes -+ * Used to resolve forward references to referenced entities in xmi -+ */ -+bool UMLForeignKeyConstraint::resolveRef() -+{ -+ // resolve referenced entity first -+ UMLDoc* doc = UMLApp::app()->document(); -+ -+ bool success = true; -+ -+ //resolve the referenced entity -+ if (!Uml::ID::toString(m_pReferencedEntityID).isEmpty()) { -+ UMLObject* obj = doc->findObjectById(m_pReferencedEntityID); -+ m_ReferencedEntity = static_cast(obj); -+ if (m_ReferencedEntity == NULL) { -+ success = false; -+ } -+ } -+ -+ QMap::iterator i; -+ for (i = m_pEntityAttributeIDMap.begin(); i!= m_pEntityAttributeIDMap.end() ; ++i) { -+ if (!Uml::ID::toString(i.value()).isEmpty()) { -+ UMLObject* obj = doc->findObjectById(i.value()); -+ m_AttributeMap[i.key()] = static_cast(obj); -+ if (m_AttributeMap[i.key()] == NULL) { -+ success = false; -+ } -+ } -+ } -+ -+ return success; -+} -+ -+/** -+ * Retrieve all Pairs of Attributes. -+ */ -+QMap UMLForeignKeyConstraint::getEntityAttributePairs() -+{ -+ return m_AttributeMap; -+} -+ -+/** -+ * Get the Delete Action. -+ */ -+UMLForeignKeyConstraint::UpdateDeleteAction UMLForeignKeyConstraint::getDeleteAction() const -+{ -+ return m_DeleteAction; -+} -+ -+/** -+ * Get the Update Action. -+ */ -+UMLForeignKeyConstraint::UpdateDeleteAction UMLForeignKeyConstraint::getUpdateAction() const -+{ -+ return m_UpdateAction; -+} -+ -+/** -+ * Set the Delete Action to the specified UpdateDeleteAction. -+ */ -+void UMLForeignKeyConstraint::setDeleteAction(UpdateDeleteAction uda) -+{ -+ m_DeleteAction = uda; -+} -+ -+/** -+ * Set the Update Action to the specified UpdateDeleteAction -+ */ -+void UMLForeignKeyConstraint::setUpdateAction(UpdateDeleteAction uda) -+{ -+ m_UpdateAction = uda; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/foreignkeyconstraint.h umbrello-kf6-15.08.1/umbrello/umlmodel/foreignkeyconstraint.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/foreignkeyconstraint.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/foreignkeyconstraint.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,120 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef FOREIGNKEYCONSTRAINT_H -+#define FOREIGNKEYCONSTRAINT_H -+ -+// appl includes -+#include "basictypes.h" -+#include "entityconstraint.h" -+ -+// qt includes -+#include -+ -+//forward declarations -+class UMLEntityAttribute; -+class UMLEntity; -+ -+/** -+ * This class is used to set up information for a foreign key entity constraint. -+ * @short Sets up Foreign Key entity constraint information. -+ * @author Sharan Rao -+ * @see UMLObject UMLClassifierListItem UMLEntityConstraint -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLForeignKeyConstraint : public UMLEntityConstraint -+{ -+ Q_OBJECT -+ -+public: -+ -+ /** -+ * Update/Delete Action: Action to be taken on Update or Delete of a referenced attribute -+ * is either, No Action, Restrict, Cascade, Set NULL, Set Default. -+ */ -+ enum UpdateDeleteAction { uda_NoAction = 0, -+ uda_Restrict, -+ uda_Cascade, -+ uda_SetNull, -+ uda_SetDefault }; -+ -+ UMLForeignKeyConstraint(UMLObject *parent, const QString& name, -+ Uml::ID::Type id = Uml::ID::None); -+ explicit UMLForeignKeyConstraint(UMLObject *parent); -+ -+ bool operator==(const UMLForeignKeyConstraint &rhs) const; -+ -+ virtual ~UMLForeignKeyConstraint(); -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ virtual UMLObject* clone() const; -+ -+ QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -+ -+ void setReferencedEntity(UMLEntity* ent); -+ UMLEntity* getReferencedEntity() const; -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+ virtual bool showPropertiesDialog(QWidget* parent = 0); -+ -+ bool addEntityAttributePair(UMLEntityAttribute* pAttr, UMLEntityAttribute* rAttr); -+ -+ bool removeEntityAttributePair(UMLEntityAttribute* /*key*/ pAttr); -+ -+ bool hasEntityAttributePair(UMLEntityAttribute* pAttr, UMLEntityAttribute* rAttr) const; -+ -+ QMap getEntityAttributePairs(); -+ -+ void setDeleteAction(UpdateDeleteAction uda); -+ UpdateDeleteAction getDeleteAction() const; -+ -+ void setUpdateAction(UpdateDeleteAction uda); -+ UpdateDeleteAction getUpdateAction() const; -+ -+ void clearMappings(); -+ -+ bool resolveRef(); -+ -+signals: -+ void sigReferencedEntityChanged(); -+ -+private slots: -+ void slotReferencedEntityChanged(); -+ -+protected: -+ bool load(QDomElement & element); -+ -+private: -+ -+ Uml::ID::Type m_pReferencedEntityID; ///< Used to resolve forward references to UMLEntity. -+ -+ /** -+ * Used to resolve forward references to UMLEntityAttributes -+ * Key -> The local attribute -+ * Value -> Id of the attribute it is mapping to -+ */ -+ QMap m_pEntityAttributeIDMap; -+ -+ void init(); -+ -+ UMLEntity* m_ReferencedEntity; ///< The UMLEntity that this foreign key references. -+ -+ /** -+ * Stores the Mapping of attributes between parent table and referenced table -+ */ -+ QMap m_AttributeMap; -+ -+ UpdateDeleteAction m_UpdateAction; ///< What to do on Update of referenced attributes. -+ UpdateDeleteAction m_DeleteAction; ///< What to do on Deletion of referenced attributes. -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/node.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/node.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/node.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/node.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,68 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "node.h" -+ -+#include -+ -+/** -+ * Sets up a Node. -+ * -+ * @param name The name of the Concept. -+ * @param id The unique id of the Concept. -+ */ -+UMLNode::UMLNode(const QString & name, Uml::ID::Type id) -+ : UMLCanvasObject(name, id) -+{ -+ init(); -+} -+ -+/** -+ * Destructor. -+ */ -+UMLNode::~UMLNode() -+{ -+} -+ -+/** -+ * Initializes key variables of the class. -+ */ -+void UMLNode::init() -+{ -+ m_BaseType = UMLObject::ot_Node; -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLNode::clone() const -+{ -+ UMLNode *clone = new UMLNode(); -+ UMLObject::copyInto(clone); -+ return clone; -+} -+ -+/** -+ * Creates the XMI element. -+ */ -+void UMLNode::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement nodeElement = UMLObject::save(QLatin1String("UML:Node"), qDoc); -+ qElement.appendChild(nodeElement); -+} -+ -+/** -+ * Loads the XMI element (empty.) -+ */ -+bool UMLNode::load(QDomElement&) -+{ -+ return true; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/node.h umbrello-kf6-15.08.1/umbrello/umlmodel/node.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/node.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/node.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,46 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef NODE_H -+#define NODE_H -+ -+#include "umlcanvasobject.h" -+ -+/** -+ * This class contains the non-graphical information required for a UML Node. -+ * This class inherits from @ref UMLCanvasObject which contains most of the -+ * information. -+ * -+ * @short Non-graphical information for a Node. -+ * @author Jonathan Riddell -+ * @see UMLCanvasObject -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLNode : public UMLCanvasObject -+{ -+ Q_OBJECT -+public: -+ -+ explicit UMLNode(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -+ virtual ~UMLNode(); -+ -+ virtual void init(); -+ -+ virtual UMLObject* clone() const; -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+protected: -+ -+ bool load(QDomElement & element); -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/operation.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/operation.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/operation.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/operation.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,611 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "operation.h" -+ -+// app includes -+#include "attribute.h" -+#include "classifier.h" -+#include "model_utils.h" -+#include "debug_utils.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "uniqueid.h" -+#include "umloperationdialog.h" -+#include "codegenerator.h" -+#include "codedocument.h" -+#include "codeblock.h" -+ -+// kde includes -+#include -+ -+// qt includes -+#include -+ -+/** -+ * Constructs an UMLOperation. -+ * Not intended for general use: The operation is not tied in with -+ * umbrello-kf6's Qt signalling for object creation. -+ * If you want to create an Operation use the method in UMLDoc instead. -+ * -+ * @param parent the parent to this operation -+ * @param name the name of the operation -+ * @param id the id of the operation -+ * @param s the visibility of the operation -+ * @param rt the return type of the operation -+ */ -+UMLOperation::UMLOperation(UMLClassifier *parent, const QString& name, -+ Uml::ID::Type id, Uml::Visibility::Enum s, UMLObject *rt) -+ : UMLClassifierListItem(parent, name, id) -+{ -+ if (rt) -+ m_returnId = UniqueID::gen(); -+ else -+ m_returnId = Uml::ID::None; -+ m_pSecondary = rt; -+ m_visibility = s; -+ m_BaseType = UMLObject::ot_Operation; -+ m_bConst = false; -+ m_Code.clear(); -+} -+ -+/** -+ * Constructs an UMLOperation. -+ * Not intended for general use: The operation is not tied in with -+ * umbrello-kf6's Qt signalling for object creation. -+ * If you want to create an Operation use the method in UMLDoc instead. -+ * -+ * @param parent the parent to this operation -+ */ -+UMLOperation::UMLOperation(UMLClassifier * parent) -+ : UMLClassifierListItem (parent) -+{ -+ m_BaseType = UMLObject::ot_Operation; -+ m_bConst = false; -+ m_Code.clear(); -+} -+ -+/** -+ * Destructor. -+ */ -+UMLOperation::~UMLOperation() -+{ -+} -+ -+/** -+ * Reimplement method from UMLClassifierListItem. -+ * -+ * @param type pointer to the type object -+ */ -+void UMLOperation::setType(UMLObject* type) -+{ -+ UMLClassifierListItem::setType(type); -+ if (m_returnId == Uml::ID::None) -+ m_returnId = UniqueID::gen(); -+} -+ -+/** -+ * Move a parameter one position to the left. -+ * -+ * @param a the parameter to move -+ */ -+void UMLOperation::moveParmLeft(UMLAttribute * a) -+{ -+ if (a == NULL) { -+ uDebug() << "called on NULL attribute"; -+ return; -+ } -+ uDebug() << "called for " << a->name(); -+ disconnect(a, SIGNAL(modified()), this, SIGNAL(modified())); -+ int idx; -+ if ((idx=m_List.indexOf(a)) == -1) { -+ uDebug() << "Error move parm left " << a->name(); -+ return; -+ } -+ if (idx == 0) -+ return; -+ m_List.removeAll(a); -+ m_List.insert(idx-1, a); -+} -+ -+/** -+ * Move a parameter one position to the right. -+ * -+ * @param a the parameter to move -+ */ -+void UMLOperation::moveParmRight(UMLAttribute * a) -+{ -+ if (a == NULL) { -+ uDebug() << "called on NULL attribute"; -+ return; -+ } -+ uDebug() << "called for " << a->name(); -+ disconnect(a, SIGNAL(modified()), this, SIGNAL(modified())); -+ int idx; -+ if ((idx=m_List.indexOf(a)) == -1) { -+ uDebug() << "Error move parm right " << a->name(); -+ return; -+ } -+ int count = m_List.count(); -+ if (idx == count-1) -+ return; -+ m_List.removeAll(a); -+ m_List.insert(idx+1, a); -+} -+ -+/** -+ * Remove a parameter from the operation. -+ * -+ * @param a the parameter to remove -+ * @param emitModifiedSignal whether to emit the "modified" signal -+ * which creates an entry in the Undo stack for the -+ * removal, default: true -+ */ -+void UMLOperation::removeParm(UMLAttribute * a, bool emitModifiedSignal /* =true */) -+{ -+ if (a == NULL) { -+ uDebug() << "called on NULL attribute"; -+ return; -+ } -+ uDebug() << "called for " << a->name(); -+ disconnect(a, SIGNAL(modified()), this, SIGNAL(modified())); -+ if(!m_List.removeAll(a)) -+ uDebug() << "Error removing parm " << a->name(); -+ -+ if (emitModifiedSignal) -+ emit modified(); -+} -+ -+/** -+ * Returns a list of parameters. -+ * -+ * @return a list of the parameters in the operation -+ */ -+UMLAttributeList UMLOperation::getParmList() const -+{ -+ return m_List; -+} -+ -+/** -+ * Finds a parameter of the operation. -+ * -+ * @param name the parameter name to search for -+ * @return the found parameter, 0 if not found -+ */ -+UMLAttribute* UMLOperation::findParm(const QString &name) -+{ -+ UMLAttribute * obj=0; -+ foreach (obj, m_List) { -+ if (obj->name() == name) -+ return obj; -+ } -+ return 0; -+} -+ -+/** -+ * Returns a string representation of the operation. -+ * -+ * @param sig what type of operation string to show -+ * @return the string representation of the operation -+ */ -+QString UMLOperation::toString(Uml::SignatureType::Enum sig) -+{ -+ QString s; -+ -+ if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::NoSig) -+ s = Uml::Visibility::toString(m_visibility, true) + QLatin1Char(' '); -+ -+ s += name(); -+ Uml::ProgrammingLanguage::Enum pl = UMLApp::app()->activeLanguage(); -+ bool parameterlessOpNeedsParentheses = -+ (pl != Uml::ProgrammingLanguage::Pascal && pl != Uml::ProgrammingLanguage::Ada); -+ -+ if (sig == Uml::SignatureType::NoSig || sig == Uml::SignatureType::NoSigNoVis) { -+ if (parameterlessOpNeedsParentheses) -+ s.append(QLatin1String("()")); -+ return s; -+ } -+ int last = m_List.count(); -+ if (last) { -+ s.append(QLatin1String("(")); -+ int i = 0; -+ foreach (UMLAttribute *param, m_List) { -+ i++; -+ s.append(param->toString(Uml::SignatureType::SigNoVis)); -+ if (i < last) -+ s.append(QLatin1String(", ")); -+ } -+ s.append(QLatin1String(")")); -+ } else if (parameterlessOpNeedsParentheses) { -+ s.append(QLatin1String("()")); -+ } -+ UMLClassifier *ownParent = static_cast(parent()); -+ QString returnType; -+ UMLClassifier *retType = UMLClassifierListItem::getType(); -+ if (retType) { -+ UMLPackage *retVisibility = retType->umlPackage(); -+ if (retVisibility != ownParent && retVisibility != ownParent->umlPackage()) -+ returnType = retType->fullyQualifiedName(); -+ else -+ returnType = retType->name(); -+ } -+ if (returnType.length() > 0 && returnType != QLatin1String("void")) { -+ s.append(QLatin1String(" : ")); -+ -+ if (returnType.startsWith(QLatin1String(QLatin1String("virtual ")))) { -+ s += returnType.mid(8); -+ } else { -+ s += returnType; -+ } -+ } -+ return s; -+} -+ -+/** -+ * Add a parameter to the operation. -+ * -+ * @param parameter the parameter to add -+ * @param position the position in the parameter list. -+ * If position = -1 the parameter will be -+ * appended to the list. -+ */ -+void UMLOperation::addParm(UMLAttribute *parameter, int position) -+{ -+ if(position >= 0 && position <= (int)m_List.count()) -+ m_List.insert(position, parameter); -+ else -+ m_List.append(parameter); -+ UMLObject::emitModified(); -+ connect(parameter, SIGNAL(modified()), this, SIGNAL(modified())); -+} -+ -+/** -+ * Returns an unused parameter name for a new parameter. -+ */ -+QString UMLOperation::getUniqueParameterName() -+{ -+ QString currentName = i18n("new_parameter"); -+ QString name = currentName; -+ for (int number = 1; findParm(name); ++number) { -+ name = currentName + QLatin1Char('_') + QString::number(number); -+ } -+ return name; -+} -+ -+/** -+ * Overloaded '==' operator. -+ */ -+bool UMLOperation::operator==(const UMLOperation & rhs) const -+{ -+ if (this == &rhs) -+ return true; -+ -+ if (!UMLObject::operator==(rhs)) -+ return false; -+ -+ if (getTypeName() != rhs.getTypeName()) -+ return false; -+ -+ if (m_List.count() != rhs.m_List.count()) -+ return false; -+ -+ if (!(m_List == rhs.m_List)) -+ return false; -+ -+ return true; -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLOperation::copyInto(UMLObject *lhs) const -+{ -+ UMLOperation *target = static_cast(lhs); -+ -+ UMLClassifierListItem::copyInto(target); -+ -+ m_List.copyInto(&(target->m_List)); -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLOperation::clone() const -+{ -+ //FIXME: The new operation should be slaved to the NEW parent not the old. -+ UMLOperation *clone = new UMLOperation(static_cast(parent())); -+ copyInto(clone); -+ -+ return clone; -+} -+ -+/** -+ * Calls resolveRef() on all parameters. -+ * Needs to be called after all UML objects are loaded from file. -+ * -+ * @return true for success -+ */ -+bool UMLOperation::resolveRef() -+{ -+ bool overallSuccess = UMLObject::resolveRef(); -+ // See remark on iteration style in UMLClassifier::resolveRef() -+ foreach (UMLAttribute* pAtt, m_List) { -+ if (! pAtt->resolveRef()) -+ overallSuccess = false; -+ } -+ return overallSuccess; -+} -+ -+/** -+ * Returns whether this operation is a constructor. -+ * -+ * @return true if this operation is a constructor -+ */ -+bool UMLOperation::isConstructorOperation() -+{ -+ // if an operation has the stereotype constructor -+ // return true -+ if (stereotype() == QLatin1String("constructor")) -+ return true; -+ -+ UMLClassifier * c = static_cast(this->parent()); -+ QString cName = c->name(); -+ QString opName = name(); -+ // It's a constructor operation if the operation name -+ // matches that of the parent classifier. -+ return (cName == opName); -+} -+ -+/** -+ * Returns whether this operation is a destructor. -+ * -+ * @return true if this operation is a destructor -+ */ -+bool UMLOperation::isDestructorOperation() -+{ -+ if (stereotype() == QLatin1String("destructor")) -+ return true; -+ UMLClassifier * c = static_cast(this->parent()); -+ -+ QString cName = c->name(); -+ QString opName = name(); -+ // Special support for C++ syntax: -+ // It's a destructor operation if the operation name begins -+ // with "~" followed by the name of the parent classifier. -+ if (! opName.startsWith(QLatin1Char('~'))) -+ return false; -+ opName.remove(QRegExp(QLatin1String("^~\\s*"))); -+ return (cName == opName); -+} -+ -+/** -+ * Shortcut for (isConstructorOperation() || isDestructorOperation()). -+ * -+ * @return true if this operation is a constructor or destructor -+ */ -+bool UMLOperation::isLifeOperation() -+{ -+ return (isConstructorOperation() || isDestructorOperation()); -+} -+ -+/** -+ * Sets whether this operation is a query (C++ "const"). -+ */ -+void UMLOperation::setConst(bool b) -+{ -+ m_bConst = b; -+} -+ -+/** -+ * Returns whether this operation is a query (C++ "const"). -+ */ -+bool UMLOperation::getConst() const -+{ -+ return m_bConst; -+} -+ -+/** -+ * Display the properties configuration dialog for the template. -+ * -+ * @param parent the parent for the dialog -+ */ -+bool UMLOperation::showPropertiesDialog(QWidget* parent) -+{ -+ UMLOperationDialog dialog(parent, this); -+ return dialog.exec(); -+} -+ -+/** -+ * Sets the source code for this operation. -+ * -+ * @param code the body of this operation -+ */ -+void UMLOperation::setSourceCode(const QString& code) -+{ -+ m_Code = code; -+} -+ -+/** -+ * Returns the source code for this operation. -+ */ -+QString UMLOperation::getSourceCode() const -+{ -+ return m_Code; -+} -+ -+/** -+ * Saves to the XMI element. -+ */ -+void UMLOperation::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement operationElement = UMLObject::save(QLatin1String("UML:Operation"), qDoc); -+ operationElement.setAttribute(QLatin1String("isQuery"), m_bConst ? QLatin1String("true") : QLatin1String("false")); -+ QDomElement featureElement = qDoc.createElement(QLatin1String("UML:BehavioralFeature.parameter")); -+ if (m_pSecondary) { -+ QDomElement retElement = qDoc.createElement(QLatin1String("UML:Parameter")); -+ if (m_returnId == Uml::ID::None) { -+ uDebug() << name() << ": m_returnId is not set, setting it now."; -+ m_returnId = UniqueID::gen(); -+ } -+ retElement.setAttribute(QLatin1String("xmi.id"), Uml::ID::toString(m_returnId)); -+ retElement.setAttribute(QLatin1String("type"), Uml::ID::toString(m_pSecondary->id())); -+ retElement.setAttribute(QLatin1String("kind"), QLatin1String("return")); -+ featureElement.appendChild(retElement); -+ } else { -+ uDebug() << "m_SecondaryId is " << m_SecondaryId; -+ } -+ -+ //save each attribute here, type different -+ foreach(UMLAttribute* pAtt, m_List) { -+ QDomElement attElement = pAtt->UMLObject::save(QLatin1String("UML:Parameter"), qDoc); -+ UMLClassifier *attrType = pAtt->getType(); -+ if (attrType) { -+ attElement.setAttribute(QLatin1String("type"), Uml::ID::toString(attrType->id())); -+ } else { -+ attElement.setAttribute(QLatin1String("type"), pAtt->getTypeName()); -+ } -+ attElement.setAttribute(QLatin1String("value"), pAtt->getInitialValue()); -+ -+ Uml::ParameterDirection::Enum kind = pAtt->getParmKind(); -+ if (kind == Uml::ParameterDirection::Out) -+ attElement.setAttribute(QLatin1String("kind"), QLatin1String("out")); -+ else if (kind == Uml::ParameterDirection::InOut) -+ attElement.setAttribute(QLatin1String("kind"), QLatin1String("inout")); -+ // The default for the parameter kind is "in". -+ -+ featureElement.appendChild(attElement); -+ } -+ if (featureElement.hasChildNodes()) { -+ operationElement.appendChild(featureElement); -+ } -+ qElement.appendChild(operationElement); -+} -+ -+/** -+ * Loads a XMI element. -+ */ -+bool UMLOperation::load(QDomElement & element) -+{ -+ m_SecondaryId = element.attribute(QLatin1String("type")); -+ QString isQuery = element.attribute(QLatin1String("isQuery")); -+ if (!isQuery.isEmpty()) { -+ // We need this extra test for isEmpty() because load() might have been -+ // called again by the processing for BehavioralFeature.parameter (see below) -+ m_bConst = (isQuery == QLatin1String("true")); -+ } -+ QDomNode node = element.firstChild(); -+ if (node.isComment()) -+ node = node.nextSibling(); -+ QDomElement attElement = node.toElement(); -+ while (!attElement.isNull()) { -+ QString tag = attElement.tagName(); -+ if (UMLDoc::tagEq(tag, QLatin1String("BehavioralFeature.parameter")) || -+ UMLDoc::tagEq(tag, QLatin1String("Element.ownedElement"))) { // Embarcadero's Describe -+ if (! load(attElement)) -+ return false; -+ } else if (UMLDoc::tagEq(tag, QLatin1String("Parameter"))) { -+ QString kind = attElement.attribute(QLatin1String("kind")); -+ if (kind.isEmpty()) { -+ kind = attElement.attribute(QLatin1String("direction")); // Embarcadero's Describe -+ if (kind.isEmpty()) { -+ // Perhaps the kind is stored in a child node: -+ for (QDomNode n = attElement.firstChild(); !n.isNull(); n = n.nextSibling()) { -+ if (n.isComment()) -+ continue; -+ QDomElement tempElement = n.toElement(); -+ QString tag = tempElement.tagName(); -+ if (!UMLDoc::tagEq(tag, QLatin1String("kind"))) -+ continue; -+ kind = tempElement.attribute(QLatin1String("xmi.value")); -+ break; -+ } -+ } -+ if (kind.isEmpty()) { -+ kind = QLatin1String("in"); -+ } -+ } -+ if (kind == QLatin1String("return") || -+ kind == QLatin1String("result")) { // Embarcadero's Describe -+ QString returnId = Model_Utils::getXmiId(attElement); -+ if (!returnId.isEmpty()) -+ m_returnId = Uml::ID::fromString(returnId); -+ m_SecondaryId = attElement.attribute(QLatin1String("type")); -+ if (m_SecondaryId.isEmpty()) { -+ // Perhaps the type is stored in a child node: -+ QDomNode node = attElement.firstChild(); -+ while (!node.isNull()) { -+ if (node.isComment()) { -+ node = node.nextSibling(); -+ continue; -+ } -+ QDomElement tempElement = node.toElement(); -+ QString tag = tempElement.tagName(); -+ if (!UMLDoc::tagEq(tag, QLatin1String("type"))) { -+ node = node.nextSibling(); -+ continue; -+ } -+ m_SecondaryId = Model_Utils::getXmiId(tempElement); -+ if (m_SecondaryId.isEmpty()) -+ m_SecondaryId = tempElement.attribute(QLatin1String("xmi.idref")); -+ if (m_SecondaryId.isEmpty()) { -+ QDomNode inner = node.firstChild(); -+ QDomElement tmpElem = inner.toElement(); -+ m_SecondaryId = Model_Utils::getXmiId(tmpElem); -+ if (m_SecondaryId.isEmpty()) -+ m_SecondaryId = tmpElem.attribute(QLatin1String("xmi.idref")); -+ } -+ break; -+ } -+ if (m_SecondaryId.isEmpty()) { -+ uError() << name() << ": cannot find return type."; -+ } -+ } -+ // Use deferred xmi.id resolution. -+ m_pSecondary = NULL; -+ } else { -+ UMLAttribute * pAtt = new UMLAttribute(this); -+ if(!pAtt->loadFromXMI(attElement)) { -+ delete pAtt; -+ return false; -+ } -+ if (kind == QLatin1String("out")) -+ pAtt->setParmKind(Uml::ParameterDirection::Out); -+ else if (kind == QLatin1String("inout")) -+ pAtt->setParmKind(Uml::ParameterDirection::InOut); -+ else -+ pAtt->setParmKind(Uml::ParameterDirection::In); -+ m_List.append(pAtt); -+ } -+ } -+ node = node.nextSibling(); -+ if (node.isComment()) -+ node = node.nextSibling(); -+ attElement = node.toElement(); -+ -+ // loading the source code which was entered in the 'classpropdlg' dialog is not done -+ // with the following code, because there is no CodeDocument. -+ /* -+ CodeGenerator* codegen = UMLApp::app()->getGenerator(); -+ if (codegen) { -+ uDebug() << "CodeDocument searching with id=" << Uml::ID::toString(UMLObject::ID()); -+ CodeDocument* codeDoc = codegen->findCodeDocumentByID(Uml::ID::toString(UMLObject::ID())); -+ if (codeDoc) { -+ uDebug() << "CodeDocument found:\n" << codeDoc; -+ } -+ } -+ */ -+ // it is done in the code generators by calling CodeGenerator::loadFromXMI(...). -+ -+ }//end while -+ return true; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/operation.h umbrello-kf6-15.08.1/umbrello/umlmodel/operation.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/operation.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/operation.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,84 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef OPERATION_H -+#define OPERATION_H -+ -+#include "umlattributelist.h" -+#include "classifierlistitem.h" -+ -+class UMLClassifier; -+ -+/** -+ * This class represents an operation in the UML model. -+ * -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLOperation : public UMLClassifierListItem -+{ -+ Q_OBJECT -+public: -+ UMLOperation(UMLClassifier * parent, const QString& name, -+ Uml::ID::Type id = Uml::ID::None, -+ Uml::Visibility::Enum s = Uml::Visibility::Public, -+ UMLObject *rt = 0); -+ explicit UMLOperation(UMLClassifier * parent); -+ virtual ~UMLOperation(); -+ -+ bool operator==(const UMLOperation & rhs) const; -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ virtual UMLObject* clone() const; -+ -+ void setType(UMLObject* type); -+ -+ void moveParmLeft(UMLAttribute *a); -+ void moveParmRight(UMLAttribute *a); -+ -+ void removeParm(UMLAttribute *a, bool emitModifiedSignal = true); -+ -+ UMLAttributeList getParmList() const; -+ -+ UMLAttribute * findParm(const QString &name); -+ -+ QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -+ -+ void addParm(UMLAttribute *parameter, int position = -1); -+ -+ bool resolveRef(); -+ -+ QString getUniqueParameterName(); -+ -+ virtual bool showPropertiesDialog(QWidget* parent = 0); -+ -+ bool isConstructorOperation(); -+ bool isDestructorOperation(); -+ bool isLifeOperation(); -+ -+ void setConst(bool b); -+ bool getConst() const; -+ -+ void setSourceCode(const QString& code); -+ QString getSourceCode() const; -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+protected: -+ bool load(QDomElement & element); -+ -+private: -+ Uml::ID::Type m_returnId; ///< Holds the xmi.id of the -+ UMLAttributeList m_List; ///< Parameter list -+ bool m_bConst; ///< Holds the isQuery attribute of the -+ QString m_Code; ///< Holds the entered source code -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/package.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/package.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/package.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/package.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,461 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header file -+#include "package.h" -+ -+// local includes -+#include "debug_utils.h" -+#include "dialog_utils.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "classifier.h" -+#include "association.h" -+#include "entity.h" -+#include "object_factory.h" -+#include "model_utils.h" -+ -+// kde includes -+#if QT_VERSION < 0x050000 -+#include -+#endif -+#include -+#include -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+ -+using namespace Uml; -+ -+/** -+ * Sets up a Package. -+ * @param name The name of the Concept. -+ * @param id The unique id of the Concept. -+ */ -+UMLPackage::UMLPackage(const QString & name, Uml::ID::Type id) -+ : UMLCanvasObject(name, id) -+{ -+ m_BaseType = ot_Package; -+} -+ -+/** -+ * Destructor. -+ */ -+UMLPackage::~UMLPackage() -+{ -+} -+ -+/** -+ * Copy the internal presentation of this object into the new object. -+ */ -+void UMLPackage::copyInto(UMLObject *lhs) const -+{ -+ UMLPackage *target = static_cast(lhs); -+ -+ UMLCanvasObject::copyInto(target); -+ -+ m_objects.copyInto(&(target->m_objects)); -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLPackage::clone() const -+{ -+ UMLPackage *clone = new UMLPackage(); -+ copyInto(clone); -+ -+ return clone; -+} -+ -+/** -+ * Adds an existing association to the matching concept in the list of concepts. -+ * The selection of the matching concept depends on the association type: -+ * For generalizations, the assoc is added to the concept that matches role A. -+ * For aggregations and compositions, the assoc is added to the concept -+ * that matches role B. -+ * @param assoc the association to add -+ */ -+void UMLPackage::addAssocToConcepts(UMLAssociation* assoc) -+{ -+ if (! AssociationType::hasUMLRepresentation(assoc->getAssocType())) -+ return; -+ Uml::ID::Type AId = assoc->getObjectId(Uml::RoleType::A); -+ Uml::ID::Type BId = assoc->getObjectId(Uml::RoleType::B); -+ UMLObject *o = NULL; -+ for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -+ o = oit.next(); -+ UMLCanvasObject *c = dynamic_cast(o); -+ if (c == NULL) -+ continue; -+ if (AId == c->id() || (BId == c->id())) { -+ if (c->hasAssociation(assoc)) -+ uDebug() << c->name() << " already has association id=" << Uml::ID::toString(assoc->id()); -+ else -+ c->addAssociationEnd(assoc); -+ } -+ UMLPackage *pkg = dynamic_cast(c); -+ if (pkg) -+ pkg->addAssocToConcepts(assoc); -+ } -+} -+ -+/** -+ * Remove the association from the participating concepts. -+ * @param assoc the association to remove -+ */ -+void UMLPackage::removeAssocFromConcepts(UMLAssociation *assoc) -+{ -+ UMLObject *o = 0; -+ for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -+ o = oit.next(); -+ UMLCanvasObject *c = dynamic_cast(o); -+ if (c) { -+ if (c->hasAssociation(assoc)) -+ c->removeAssociationEnd(assoc); -+ UMLPackage *pkg = dynamic_cast(c); -+ if (pkg) -+ pkg->removeAssocFromConcepts(assoc); -+ } -+ } -+} -+ -+/** -+ * Adds an object in this package. -+ * -+ * @param pObject Pointer to the UMLObject to add. -+ * @return True if the object was actually added. -+ */ -+bool UMLPackage::addObject(UMLObject *pObject) -+{ -+ if (pObject == NULL) { -+ uError() << "is called with a NULL object"; -+ return false; -+ } -+ if (pObject == this) { -+ uError() << "adding myself as child is not allowed"; -+ return false; -+ } -+ -+ if (m_objects.indexOf(pObject) != -1) { -+ uDebug() << pObject->name() << " is already there"; -+ return false; -+ } -+ if (pObject->baseType() == UMLObject::ot_Association) { -+ UMLAssociation *assoc = static_cast(pObject); -+ // Adding the UMLAssociation at the participating concepts is done -+ // again later (in UMLAssociation::resolveRef()) if they are not yet -+ // known right here. -+ if (assoc->getObject(Uml::RoleType::A) && assoc->getObject(Uml::RoleType::B)) { -+ UMLPackage *pkg = pObject->umlPackage(); -+ if (pkg != this) { -+ uError() << "UMLPackage " << name() << " addObject: " -+ << "assoc's UMLPackage is " << pkg->name(); -+ } -+ addAssocToConcepts(assoc); -+ } -+ } -+ else { -+ QString name = pObject->name(); -+ QString oldName = name; -+ while (findObject(name) != NULL) { -+ QString prevName = name; -+ name = Model_Utils::uniqObjectName(pObject->baseType(), this); -+ bool ok = Dialog_Utils::askName(i18nc("object name", "Name"), -+ i18n("An object with the name %1\nalready exists in the package %2.\nPlease enter a new name:", prevName, this->name()), -+ name); -+ if (!ok) { -+ name = oldName; -+ continue; -+ } -+ if (name.length() == 0) { -+ KMessageBox::error(0, i18n("That is an invalid name."), -+ i18n("Invalid Name")); -+ continue; -+ } -+ } -+ if (oldName != name) { -+ pObject->setName(name); -+ } -+ } -+ m_objects.append(pObject); -+ return true; -+} -+ -+/** -+ * Removes an object from this package. -+ * Does not physically delete the object. -+ * -+ * @param pObject Pointer to the UMLObject to be removed. -+ */ -+void UMLPackage::removeObject(UMLObject *pObject) -+{ -+ if (pObject->baseType() == UMLObject::ot_Association) { -+ UMLObject *o = const_cast(pObject); -+ UMLAssociation *assoc = static_cast(o); -+ removeAssocFromConcepts(assoc); -+ } -+ if (m_objects.indexOf(pObject) == -1) -+ uDebug() << name() << " removeObject: object with id=" -+ << Uml::ID::toString(pObject->id()) << "not found."; -+ else -+ m_objects.removeAll(pObject); -+} -+ -+/** -+ * Removes all objects from this package. -+ * Inner containers (e.g. nested packages) are removed recursively. -+ */ -+void UMLPackage::removeAllObjects() -+{ -+ UMLCanvasObject::removeAllChildObjects(); -+ UMLObject *o = NULL; -+ -+ while (!m_objects.isEmpty() && (o = m_objects.first()) != NULL) { -+ UMLPackage *pkg = dynamic_cast(o); -+ if (pkg) -+ pkg->removeAllObjects(); -+ removeObject(o); -+ delete o; -+ } -+} -+ -+/** -+ * Returns the list of objects contained in this package. -+ */ -+UMLObjectList UMLPackage::containedObjects() -+{ -+ return m_objects; -+} -+ -+/** -+ * Find the object of the given name in the list of contained objects. -+ * -+ * @param name The name to seek. -+ * @return Pointer to the UMLObject found or NULL if not found. -+ */ -+UMLObject * UMLPackage::findObject(const QString &name) -+{ -+ const bool caseSensitive = UMLApp::app()->activeLanguageIsCaseSensitive(); -+ for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -+ UMLObject *obj = oit.next(); -+ if (!obj) -+ continue; -+ if (caseSensitive) { -+ if (obj->name() == name) -+ return obj; -+ } else if (obj->name().toLower() == name.toLower()) { -+ return obj; -+ } -+ } -+ return NULL; -+} -+ -+/** -+ * Find the object of the given ID in the list of contained objects. -+ * -+ * @param id The ID to seek. -+ * @return Pointer to the UMLObject found or NULL if not found. -+ */ -+UMLObject * UMLPackage::findObjectById(Uml::ID::Type id) -+{ -+ return Model_Utils::findObjectInList(id, m_objects); -+} -+ -+/** -+ * Append all packages from this package (and those from nested packages) -+ * to the given UMLPackageList. -+ * -+ * @param packages The list to append to -+ * @param includeNested Whether to include the packages from nested packages -+ * (default:true) -+ */ -+void UMLPackage::appendPackages(UMLPackageList& packages, bool includeNested) -+{ -+ for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -+ UMLObject *o = oit.next(); -+ uIgnoreZeroPointer(o); -+ ObjectType ot = o->baseType(); -+ if (ot == ot_Package || ot == ot_Folder) { -+ packages.append(static_cast(o)); -+ if (includeNested) { -+ UMLPackage *inner = static_cast(o); -+ inner->appendPackages(packages); -+ } -+ } -+ } -+} -+ -+/** -+ * Append all classifiers from this package (and those from -+ * nested packages) to the given UMLClassifierList. -+ * -+ * @param classifiers The list to append to. -+ * @param includeNested Whether to include the classifiers from -+ * nested packages (default: true.) -+ */ -+void UMLPackage::appendClassifiers(UMLClassifierList& classifiers, -+ bool includeNested /* = true */) -+{ -+ for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -+ UMLObject *o = oit.next(); -+ uIgnoreZeroPointer(o); -+ ObjectType ot = o->baseType(); -+ if (ot == ot_Class || ot == ot_Interface || -+ ot == ot_Datatype || ot == ot_Enum || ot == ot_Entity) { -+ classifiers.append((UMLClassifier *)o); -+ } else if (includeNested && (ot == ot_Package || ot == ot_Folder)) { -+ UMLPackage *inner = static_cast(o); -+ inner->appendClassifiers(classifiers); -+ } -+ } -+} -+ -+/** -+ * Append all entities from this package (and those -+ * from nested packages) to the given UMLEntityList. -+ * -+ * @param entities The list to append to. -+ * @param includeNested Whether to include the entities from -+ * nested packages (default: true.) -+ */ -+void UMLPackage::appendEntities(UMLEntityList& entities, -+ bool includeNested /* = true */) -+{ -+ for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -+ UMLObject *o = oit.next(); -+ uIgnoreZeroPointer(o); -+ ObjectType ot = o->baseType(); -+ if (ot == ot_Entity) { -+ UMLEntity *c = static_cast(o); -+ entities.append(c); -+ } else if (includeNested && (ot == ot_Package || ot == ot_Folder)) { -+ UMLPackage *inner = static_cast(o); -+ inner->appendEntities(entities); -+ } -+ } -+} -+ -+/** -+ * Append all classes and interfaces from this package (and those -+ * from nested packages) to the given UMLClassifierList. -+ * -+ * @param classifiers The list to append to. -+ * @param includeNested Whether to include the classifiers from -+ * nested packages (default: true.) -+ */ -+void UMLPackage::appendClassesAndInterfaces(UMLClassifierList& classifiers, -+ bool includeNested /* = true */) -+{ -+ for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -+ UMLObject *o = oit.next(); -+ uIgnoreZeroPointer(o); -+ ObjectType ot = o->baseType(); -+ if (ot == ot_Class || ot == ot_Interface) { -+ UMLClassifier *c = static_cast(o); -+ classifiers.append(c); -+ } else if (includeNested && (ot == ot_Package || ot == ot_Folder)) { -+ UMLPackage *inner = static_cast(o); -+ inner->appendClassesAndInterfaces(classifiers); -+ } -+ } -+} -+ -+/** -+ * Resolve types. Required when dealing with foreign XMI files. -+ * Needs to be called after all UML objects are loaded from file. -+ * Overrides the method from UMLObject. -+ * Calls resolveRef() on each contained object. -+ * -+ * @return True for overall success. -+ */ -+bool UMLPackage::resolveRef() -+{ -+ bool overallSuccess = UMLCanvasObject::resolveRef(); -+ for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -+ UMLObject *obj = oit.next(); -+ uIgnoreZeroPointer(obj); -+ if (! obj->resolveRef()) { -+ UMLObject::ObjectType ot = obj->baseType(); -+ if (ot != UMLObject::ot_Package && ot != UMLObject::ot_Folder) -+ m_objects.removeAll(obj); -+ overallSuccess = false; -+ } -+ } -+ return overallSuccess; -+} -+ -+/** -+ * Creates the XMI element. -+ */ -+void UMLPackage::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement packageElement = UMLObject::save(QLatin1String("UML:Package"), qDoc); -+ QDomElement ownedElement = qDoc.createElement(QLatin1String("UML:Namespace.ownedElement")); -+ UMLObject *obj = NULL; -+ // save classifiers etc. -+ for (UMLObjectListIt oit(m_objects); oit.hasNext();) { -+ obj = oit.next(); -+ uIgnoreZeroPointer(obj); -+ obj->saveToXMI (qDoc, ownedElement); -+ } -+ // save associations -+ for (UMLObjectListIt ait(m_List); ait.hasNext();) { -+ obj = ait.next(); -+ obj->saveToXMI (qDoc, ownedElement); -+ } -+ -+ packageElement.appendChild(ownedElement); -+ qElement.appendChild(packageElement); -+} -+ -+/** -+ * Loads the XMI element. -+ * Auxiliary to UMLObject::loadFromXMI. -+ */ -+bool UMLPackage::load(QDomElement& element) -+{ -+ for (QDomNode node = element.firstChild(); !node.isNull(); -+ node = node.nextSibling()) { -+ if (node.isComment()) -+ continue; -+ QDomElement tempElement = node.toElement(); -+ QString type = tempElement.tagName(); -+ if (Model_Utils::isCommonXMIAttribute(type)) -+ continue; -+ if (UMLDoc::tagEq(type, QLatin1String("Namespace.ownedElement")) || -+ UMLDoc::tagEq(type, QLatin1String("Element.ownedElement")) || // Embarcadero's Describe -+ UMLDoc::tagEq(type, QLatin1String("Namespace.contents"))) { -+ //CHECK: umbrello-kf6 currently assumes that nested elements -+ // are ownedElements anyway. -+ // Therefore these tags are not further interpreted. -+ if (! load(tempElement)) -+ return false; -+ continue; -+ } else if (UMLDoc::tagEq(type, QLatin1String("packagedElement")) || -+ UMLDoc::tagEq(type, QLatin1String("ownedElement"))) { -+ type = tempElement.attribute(QLatin1String("xmi:type")); -+ } -+ UMLObject *pObject = Object_Factory::makeObjectFromXMI(type); -+ if(!pObject) { -+ uWarning() << "Unknown type of umlobject to create: " << type; -+ continue; -+ } -+ pObject->setUMLPackage(this); -+ if (!pObject->loadFromXMI(tempElement)) { -+ removeObject(pObject); -+ delete pObject; -+ } -+ } -+ return true; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/package.h umbrello-kf6-15.08.1/umbrello/umlmodel/package.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/package.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/package.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,79 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef PACKAGE_H -+#define PACKAGE_H -+ -+#include "umlcanvasobject.h" -+#include "umlclassifierlist.h" -+#include "umlentitylist.h" -+ -+// forward declarations -+class UMLAssociation; -+ -+/** -+ * This class contains the non-graphical information required for a UML -+ * Package. -+ * This class inherits from @ref UMLCanvasObject which contains most of the -+ * information. -+ * -+ * @short Non-graphical information for a Package. -+ * @author Jonathan Riddell -+ * @see UMLCanvasObject -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLPackage : public UMLCanvasObject -+{ -+ Q_OBJECT -+public: -+ explicit UMLPackage(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -+ virtual ~UMLPackage(); -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ virtual UMLObject* clone() const; -+ -+ bool addObject(UMLObject *pObject); -+ void removeObject(UMLObject *pObject); -+ -+ virtual void removeAllObjects(); -+ -+ UMLObjectList containedObjects(); -+ -+ void addAssocToConcepts(UMLAssociation* assoc); -+ void removeAssocFromConcepts(UMLAssociation *assoc); -+ -+ UMLObject * findObject(const QString &name); -+ UMLObject * findObjectById(Uml::ID::Type id); -+ -+ void appendPackages(UMLPackageList& packages, bool includeNested = true); -+ void appendClassifiers(UMLClassifierList& classifiers, -+ bool includeNested = true); -+ void appendClassesAndInterfaces(UMLClassifierList& classifiers, -+ bool includeNested = true); -+ void appendEntities(UMLEntityList& entities, -+ bool includeNested = true); -+ -+ virtual bool resolveRef(); -+ -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+protected: -+ virtual bool load(QDomElement& element); -+ -+ /** -+ * References to the objects contained in this package. -+ * The UMLPackage is the owner of the objects. -+ */ -+ UMLObjectList m_objects; -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/port.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/port.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/port.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/port.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,68 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "port.h" -+ -+#include -+ -+/** -+ * Sets up a Port. -+ * -+ * @param name The name of the Concept. -+ * @param id The unique id of the Concept. -+ */ -+UMLPort::UMLPort(const QString & name, Uml::ID::Type id) -+ : UMLCanvasObject(name, id) -+{ -+ init(); -+} -+ -+/** -+ * Destructor. -+ */ -+UMLPort::~UMLPort() -+{ -+} -+ -+/** -+ * Initializes key variables of the class. -+ */ -+void UMLPort::init() -+{ -+ m_BaseType = UMLObject::ot_Port; -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLPort::clone() const -+{ -+ UMLPort *clone = new UMLPort(); -+ UMLObject::copyInto(clone); -+ return clone; -+} -+ -+/** -+ * Creates the XMI element. -+ */ -+void UMLPort::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement portElement = UMLObject::save(QLatin1String("UML:Port"), qDoc); -+ qElement.appendChild(portElement); -+} -+ -+/** -+ * Loads the XMI element (empty.) -+ */ -+bool UMLPort::load(QDomElement&) -+{ -+ return true; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/port.h umbrello-kf6-15.08.1/umbrello/umlmodel/port.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/port.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/port.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,46 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef PORT_H -+#define PORT_H -+ -+#include "umlcanvasobject.h" -+ -+/** -+ * This class contains the non-graphical information required for a UML Port. -+ * This class inherits from @ref UMLCanvasObject which contains most of the -+ * information. -+ * -+ * @short Non-graphical information for a Port. -+ * @author Oliver Kellogg -+ * @see UMLCanvasObject -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLPort : public UMLCanvasObject -+{ -+ Q_OBJECT -+public: -+ -+ explicit UMLPort(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -+ virtual ~UMLPort(); -+ -+ virtual void init(); -+ -+ virtual UMLObject* clone() const; -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+protected: -+ -+ bool load(QDomElement & element); -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/stereotype.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/stereotype.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/stereotype.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/stereotype.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,165 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "stereotype.h" -+ -+// local includes -+#include "debug_utils.h" -+#include "umldoc.h" -+#include "uml.h" -+ -+// kde includes -+#if QT_VERSION < 0x050000 -+#include -+#endif -+#include -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+ -+/** -+ * Sets up a stereotype. -+ * -+ * @param name The name of this UMLStereotype. -+ * @param id The unique id given to this UMLStereotype. -+ */ -+UMLStereotype::UMLStereotype(const QString &name, Uml::ID::Type id /* = Uml::id_None */) -+ : UMLObject(name, id) -+{ -+ m_BaseType = UMLObject::ot_Stereotype; -+ UMLStereotype * existing = UMLApp::app()->document()->findStereotype(name); -+ if (existing) { -+ uError() << "UMLStereotype constructor: " << name << " already exists"; -+ } -+ m_refCount = 0; -+} -+ -+/** -+ * Sets up a stereotype. -+ */ -+UMLStereotype::UMLStereotype() -+ : UMLObject() -+{ -+ m_BaseType = UMLObject::ot_Stereotype; -+ m_refCount = 0; -+} -+ -+/** -+ * Destructor. -+ */ -+UMLStereotype::~UMLStereotype() -+{ -+ //Q_ASSERT(m_refCount == 0); -+} -+ -+/** -+ * Overloaded '==' operator. -+ */ -+bool UMLStereotype::operator==(const UMLStereotype &rhs) const -+{ -+ if (this == &rhs) { -+ return true; -+ } -+ -+ if (!UMLObject::operator==(rhs)) { -+ return false; -+ } -+ -+ return true; -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLStereotype::copyInto(UMLObject *lhs) const -+{ -+ UMLObject::copyInto(lhs); -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLStereotype::clone() const -+{ -+ UMLStereotype *clone = new UMLStereotype(); -+ copyInto(clone); -+ -+ return clone; -+} -+ -+/** -+ * Saves to the XMI element. -+ */ -+void UMLStereotype::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ //FIXME: uml13.dtd compliance -+ QDomElement stereotypeElement = UMLObject::save(QLatin1String("UML:Stereotype"), qDoc); -+ qElement.appendChild(stereotypeElement); -+} -+ -+/** -+ * Display the properties configuration dialog for the stereotype -+ * (just a line edit). -+ */ -+bool UMLStereotype::showPropertiesDialog(QWidget* parent) -+{ -+ bool ok; -+#if QT_VERSION >= 0x050000 -+ QString stereoTypeName = QInputDialog::getText(parent, -+ i18n("Stereotype"), i18n("Enter name:"), -+ QLineEdit::Normal, -+ name(), &ok); -+#else -+ QString stereoTypeName = KInputDialog::getText(i18n("Stereotype"), i18n("Enter name:"), name(), &ok, parent); -+#endif -+ if (ok) { -+ setName(stereoTypeName); -+ } -+ return ok; -+} -+ -+/** -+ * Increments the reference count for this stereotype. -+ */ -+void UMLStereotype::incrRefCount() -+{ -+ m_refCount++; -+} -+ -+/** -+ * Decrements the reference count for this stereotype. -+ */ -+void UMLStereotype::decrRefCount() -+{ -+ m_refCount--; -+} -+ -+/** -+ * Returns the reference count for this stereotype. -+ */ -+int UMLStereotype::refCount() const -+{ -+ return m_refCount; -+} -+ -+/** -+ * Returns the name as string -+ */ -+QString UMLStereotype::name(bool includeAdornments) const -+{ -+ if (includeAdornments) -+ return QString::fromUtf8("«") + UMLObject::name() + QString::fromUtf8("»"); -+ else -+ return UMLObject::name(); -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/stereotype.h umbrello-kf6-15.08.1/umbrello/umlmodel/stereotype.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/stereotype.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/stereotype.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,71 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef STEREOTYPE_H -+#define STEREOTYPE_H -+ -+#include "umlobject.h" -+ -+/** -+ * This class is used to set up information for a stereotype. -+ * Stereotypes are used essentially as properties of -+ * attributes and operations etc. -+ * -+ * Each stereotype object is reference counted, i.e. client code -+ * manages it such that it comes into existence as soon as there is -+ * at least one user, and ceases existing when the number of users -+ * drops to 0. -+ * m_refCount reflects the number of users. It is externally managed, -+ * i.e. client code must take care to call incrRefCount() and -+ * decrRefCount() as appropriate. -+ * -+ * The one and only owner of all stereotypes is the UMLDoc, and the -+ * ownership is specially managed (umlPackage() returns NULL for a -+ * UMLStereotype.) The reason for this special treatment is that -+ * class UMLDoc does not inherit from class UMLPackage, and therefore -+ * setUMLPackage() cannot be used for stereotypes. -+ * -+ * @short Sets up stereotype information. -+ * @author Jonathan Riddell -+ * @author Oliver Kellogg -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLStereotype : public UMLObject -+{ -+ Q_OBJECT -+public: -+ explicit UMLStereotype(const QString &name, Uml::ID::Type id = Uml::ID::None); -+ UMLStereotype(); -+ -+ virtual ~UMLStereotype(); -+ -+ bool operator==(const UMLStereotype &rhs) const; -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ virtual UMLObject* clone() const; -+ -+ void incrRefCount(); -+ void decrRefCount(); -+ -+ int refCount() const; -+ -+ QString name(bool includeAdornments=false) const; -+ -+ void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+ virtual bool showPropertiesDialog(QWidget* parent); -+ -+protected: -+ int m_refCount; -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/template.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/template.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/template.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/template.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,146 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "template.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umltemplatedialog.h" -+ -+/** -+ * Sets up a template. -+ * -+ * @param parent The parent of this UMLTemplate (i.e. its concept). -+ * @param name The name of this UMLTemplate. -+ * @param id The unique id given to this UMLTemplate. -+ * @param type The type of this UMLTemplate. -+ */ -+UMLTemplate::UMLTemplate(UMLObject *parent, const QString& name, -+ Uml::ID::Type id, const QString& type) -+ : UMLClassifierListItem(parent, name, id) -+{ -+ setTypeName(type); -+ m_BaseType = UMLObject::ot_Template; -+} -+ -+/** -+ * Sets up a template. -+ * -+ * @param parent The parent of this UMLTemplate (i.e. its concept). -+ */ -+UMLTemplate::UMLTemplate(UMLObject *parent) -+ : UMLClassifierListItem(parent) -+{ -+ m_BaseType = UMLObject::ot_Template; -+} -+ -+/** -+ * Destructor. -+ */ -+UMLTemplate::~UMLTemplate() -+{ -+} -+ -+QString UMLTemplate::toString(Uml::SignatureType::Enum sig) -+{ -+ Q_UNUSED(sig); -+ if (m_pSecondary == NULL || m_pSecondary->name() == QLatin1String("class")) { -+ return name(); -+ } else { -+ return name() + QLatin1String(" : ") + m_pSecondary->name(); -+ } -+} -+ -+/** -+ * Overrides method from UMLClassifierListItem. -+ * Returns the type name of the UMLTemplate. -+ * If the template parameter is a class, there is no separate -+ * type object. In this case, getTypeName() returns "class". -+ * -+ * @return The type name of the UMLClassifierListItem. -+ */ -+QString UMLTemplate::getTypeName() const -+{ -+ if (m_pSecondary == NULL) -+ return QLatin1String("class"); -+ return m_pSecondary->name(); -+} -+ -+/** -+ * Overloaded '==' operator. -+ */ -+bool UMLTemplate::operator==(const UMLTemplate &rhs) const -+{ -+ if (this == &rhs) { -+ return true; -+ } -+ if (!UMLObject::operator==(rhs)) { -+ return false; -+ } -+ if (m_pSecondary != rhs.m_pSecondary) { -+ return false; -+ } -+ return true; -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLTemplate::copyInto(UMLObject *lhs) const -+{ -+ UMLClassifierListItem::copyInto(lhs); -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLTemplate::clone() const -+{ -+ UMLTemplate *clone = new UMLTemplate((UMLTemplate*) parent()); -+ copyInto(clone); -+ -+ return clone; -+} -+ -+/** -+ * Writes the XMI element. -+ */ -+void UMLTemplate::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ //FIXME: uml13.dtd compliance -+ QDomElement attributeElement = UMLObject::save(QLatin1String("UML:TemplateParameter"), qDoc); -+ if (m_pSecondary) -+ attributeElement.setAttribute(QLatin1String("type"), Uml::ID::toString(m_pSecondary->id())); -+ qElement.appendChild(attributeElement); -+} -+ -+/** -+ * Loads the XMI element. -+ */ -+bool UMLTemplate::load(QDomElement& element) -+{ -+ m_SecondaryId = element.attribute(QLatin1String("type")); -+ return true; -+} -+ -+/** -+ * Display the properties configuration dialog for the template. -+ * -+ * @return Success status. -+ */ -+bool UMLTemplate::showPropertiesDialog(QWidget* parent) -+{ -+ UMLTemplateDialog dialog(parent, this); -+ return dialog.exec(); -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/template.h umbrello-kf6-15.08.1/umbrello/umlmodel/template.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/template.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/template.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,57 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef TEMPLATE_H -+#define TEMPLATE_H -+ -+#include "classifierlistitem.h" -+ -+/** -+ * This class holds information used by template classes, called -+ * paramaterised class in UML and a generic in Java. It has a -+ * type (usually just "class") and name. -+ * -+ * @short Sets up template information. -+ * @author Jonathan Riddell -+ * @see UMLObject -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLTemplate : public UMLClassifierListItem -+{ -+public: -+ -+ UMLTemplate(UMLObject *parent, const QString& name, -+ Uml::ID::Type id = Uml::ID::None, const QString& type = QLatin1String("class")); -+ -+ explicit UMLTemplate(UMLObject *parent); -+ -+ bool operator==(const UMLTemplate &rhs) const; -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ virtual UMLObject* clone() const; -+ -+ virtual ~UMLTemplate(); -+ -+ QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -+ -+ virtual QString getTypeName() const; -+ -+ virtual bool showPropertiesDialog(QWidget* parent); -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+protected: -+ -+ bool load(QDomElement & element); -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlassociationlist.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlassociationlist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlassociationlist.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlassociationlist.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,23 @@ -+/*************************************************************************** -+ * * -+ * 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. * -+ * * -+ * copyright (C) 2004-2007 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLASSOCIATIONLIST_H -+#define UMLASSOCIATIONLIST_H -+ -+#include -+ -+// forward declaration -+class UMLAssociation; -+ -+typedef QList UMLAssociationList; -+typedef QListIterator UMLAssociationListIt; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlattributelist.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/umlattributelist.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlattributelist.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlattributelist.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,61 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "umlattributelist.h" -+ -+#include "attribute.h" -+ -+#include -+ -+UMLAttributeList::UMLAttributeList() -+{ -+} -+ -+UMLAttributeList::UMLAttributeList(const UMLAttributeList& other) -+ : QList(other) -+{ -+} -+ -+UMLAttributeList::~UMLAttributeList() -+{ -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLAttributeList::copyInto(UMLAttributeList *rhs) const -+{ -+ // Don't copy yourself. -+ if (rhs == this) return; -+ -+ rhs->clear(); -+ -+ // Suffering from const; we shall not modify our object. -+ UMLAttributeList *tmp = new UMLAttributeList(*this); -+ -+ UMLAttribute *item; -+ for (UMLAttributeListIt ait(*tmp); ait.hasNext() ;) -+ { -+ item = ait.next(); -+ rhs->append((UMLAttribute*)item->clone()); -+ } -+ delete tmp; -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLAttributeList* UMLAttributeList::clone() const -+{ -+ UMLAttributeList *clone = new UMLAttributeList(); -+ copyInto(clone); -+ return clone; -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlattributelist.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlattributelist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlattributelist.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlattributelist.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,42 @@ -+/*************************************************************************** -+ * * -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLATTRIBUTELIST_H -+#define UMLATTRIBUTELIST_H -+ -+#include -+ -+#include "attribute.h" -+ -+//typedef QPtrList UMLAttributeList; -+typedef QListIterator UMLAttributeListIt; -+ -+/** -+ * This sub-class adds copyInto and clone to the QPtrList -+ * base class. -+ */ -+class UMLAttributeList : public QList -+{ -+public: -+ -+ UMLAttributeList(); -+ -+ UMLAttributeList(const UMLAttributeList&); -+ -+ virtual ~UMLAttributeList(); -+ -+ virtual void copyInto(UMLAttributeList *rhs) const; -+ -+ virtual UMLAttributeList* clone() const; -+}; -+ -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlcanvasobject.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/umlcanvasobject.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlcanvasobject.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlcanvasobject.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,464 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "umlcanvasobject.h" -+ -+// local includes -+#include "debug_utils.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "classifier.h" -+#include "association.h" -+#include "attribute.h" -+#include "operation.h" -+#include "template.h" -+#include "stereotype.h" -+#include "idchangelog.h" -+ -+// kde includes -+#include -+ -+DEBUG_REGISTER_DISABLED(UMLCanvasObject) -+ -+/** -+ * Sets up a UMLCanvasObject. -+ * -+ * @param name The name of the Concept. -+ * @param id The unique id of the Concept. -+ */ -+UMLCanvasObject::UMLCanvasObject(const QString & name, Uml::ID::Type id) -+ : UMLObject(name, id) -+{ -+} -+ -+/** -+ * Standard deconstructor. -+ */ -+UMLCanvasObject::~UMLCanvasObject() -+{ -+ //removeAllAssociations(); -+ // No! This is way too late to do that. -+ // It should have been called explicitly before destructing the -+ // UMLCanvasObject. -+ if (associations()) -+ DEBUG(DBG_SRC) << "UMLCanvasObject destructor: FIXME: there are still associations()"; -+} -+ -+/** -+ * Return the subset of m_List that matches the given type. -+ * -+ * @param assocType The AssociationType::Enum to match. -+ * @return The list of associations that match assocType. -+ */ -+UMLAssociationList UMLCanvasObject::getSpecificAssocs(Uml::AssociationType::Enum assocType) -+{ -+ UMLAssociationList list; -+ UMLObject *o = NULL; -+ for (UMLObjectListIt oit(m_List); oit.hasNext();) { -+ o = oit.next(); -+ uIgnoreZeroPointer(o); -+ if (o->baseType() != UMLObject::ot_Association) -+ continue; -+ UMLAssociation *a = static_cast(o); -+ if (a->getAssocType() == assocType) -+ list.append(a); -+ } -+ return list; -+} -+ -+/** -+ * Adds an association end to m_List. -+ * -+ * @param assoc The association to add. -+ * @todo change param type to UMLRole -+ */ -+bool UMLCanvasObject::addAssociationEnd(UMLAssociation* assoc) -+{ -+ Q_ASSERT(assoc); -+ // add association only if not already present in list -+ if (!hasAssociation(assoc)) -+ { -+ m_List.append(assoc); -+ -+ // Don't emit signals during load from XMI -+ UMLObject::emitModified(); -+ emit sigAssociationEndAdded(assoc); -+ return true; -+ } -+ return false; -+} -+ -+/** -+ * Determine if this canvasobject has the given association. -+ * -+ * @param assoc The association to check. -+ */ -+bool UMLCanvasObject::hasAssociation(UMLAssociation* assoc) -+{ -+ uint cnt = m_List.count(assoc); -+ DEBUG(DBG_SRC) << "count is " << cnt; -+ return (cnt > 0); -+} -+ -+/** -+ * Remove an association end from the CanvasObject. -+ * -+ * @param assoc The association to remove. -+ * @todo change param type to UMLRole -+ */ -+int UMLCanvasObject::removeAssociationEnd(UMLAssociation * assoc) -+{ -+ if (!hasAssociation(assoc) || !m_List.removeAll(assoc)) { -+ DEBUG(DBG_SRC) << "cannot find given assoc " << assoc << " in list"; -+ return -1; -+ } -+ UMLApp::app()->document()->removeAssociation(assoc, false); -+ UMLObject::emitModified(); -+ emit sigAssociationEndRemoved(assoc); -+ return m_List.count(); -+} -+ -+/** -+ * Remove all association ends from the CanvasObject. -+ */ -+void UMLCanvasObject::removeAllAssociationEnds() -+{ -+ for (int i = 0; i < m_List.count(); i++) { -+ UMLObject *o = m_List.at(i); -+ uIgnoreZeroPointer(o); -+ if (o->baseType() != UMLObject::ot_Association) { -+ continue; -+ } -+ UMLAssociation *assoc = static_cast(o); -+ //umldoc->slotRemoveUMLObject(assoc); -+ UMLObject* objA = assoc->getObject(Uml::RoleType::A); -+ UMLObject* objB = assoc->getObject(Uml::RoleType::B); -+ UMLCanvasObject *roleAObj = dynamic_cast(objA); -+ if (roleAObj) { -+ roleAObj->removeAssociationEnd(assoc); -+ } else if (objA) { -+ DEBUG(DBG_SRC) << name() << ": objA " << objA->name() << " is not a UMLCanvasObject"; -+ } else -+ DEBUG(DBG_SRC) << name() << "): objA is NULL"; -+ UMLCanvasObject *roleBObj = dynamic_cast(objB); -+ if (roleBObj) { -+ roleBObj->removeAssociationEnd(assoc); -+ } else if (objB) { -+ DEBUG(DBG_SRC) << name() << "): objB " << objB->name() << " is not a UMLCanvasObject"; -+ } else -+ DEBUG(DBG_SRC) << name() << "): objB is NULL"; -+ } -+} -+ -+/** -+ * Remove all child objects. -+ * Just clear list, objects must be deleted where they were created -+ * (or we have bad crashes). -+ */ -+void UMLCanvasObject::removeAllChildObjects() -+{ -+ if (!m_List.isEmpty()) { -+ removeAllAssociationEnds(); -+ m_List.clear(); -+ } -+} -+ -+/** -+ * Returns a name for the new association, operation, template -+ * or attribute appended with a number if the default name is -+ * taken e.g. new_association, new_association_1 etc. -+ * -+ * @param type The object type for which to make a name. -+ * @param prefix Optional prefix to use for the name. -+ * If not given then uniqChildName() will choose the prefix -+ * internally based on the object type. -+ * @return Unique name string for the ObjectType given. -+ */ -+QString UMLCanvasObject::uniqChildName(const UMLObject::ObjectType type, -+ const QString &prefix /* = QString() */) -+{ -+ QString currentName; -+ currentName = prefix; -+ if (currentName.isEmpty()) { -+ switch (type) { -+ case UMLObject::ot_Association: -+ currentName = i18n("new_association"); -+ break; -+ case UMLObject::ot_Attribute: -+ currentName = i18n("new_attribute"); -+ break; -+ case UMLObject::ot_Template: -+ currentName = i18n("new_template"); -+ break; -+ case UMLObject::ot_Operation: -+ currentName = i18n("new_operation"); -+ break; -+ case UMLObject::ot_EnumLiteral: -+ currentName = i18n("new_literal"); -+ break; -+ case UMLObject::ot_EntityAttribute: -+ currentName = i18n("new_field"); -+ break; -+ case UMLObject::ot_UniqueConstraint: -+ currentName = i18n("new_unique_constraint"); -+ break; -+ case UMLObject::ot_ForeignKeyConstraint: -+ currentName = i18n("new_fkey_constraint"); -+ break; -+ case UMLObject::ot_CheckConstraint: -+ currentName = i18n("new_check_constraint"); -+ break; -+ default: -+ uWarning() << "uniqChildName() called for unknown child type " << UMLObject::toString(type); -+ return QLatin1String("ERROR_in_UMLCanvasObject_uniqChildName"); -+ } -+ } -+ -+ QString name = currentName; -+ for (int number = 1; findChildObject(name); ++number) { -+ name = currentName + QLatin1Char('_') + QString::number(number); -+ } -+ return name; -+} -+ -+/** -+ * Find a child object with the given name. -+ * -+ * @param n The name of the object to find. -+ * @param t The type to find (optional.) If not given then -+ * any object type will match. -+ * @return Pointer to the object found; NULL if none found. -+ */ -+UMLObject * UMLCanvasObject::findChildObject(const QString &n, UMLObject::ObjectType t) -+{ -+ const bool caseSensitive = UMLApp::app()->activeLanguageIsCaseSensitive(); -+ UMLObject *obj = NULL; -+ for (UMLObjectListIt oit(m_List); oit.hasNext();) { -+ obj = oit.next(); -+ uIgnoreZeroPointer(obj); -+ if (t != UMLObject::ot_UMLObject && obj->baseType() != t) -+ continue; -+ if (caseSensitive) { -+ if (obj->name() == n) -+ return obj; -+ } else if (obj->name().toLower() == n.toLower()) { -+ return obj; -+ } -+ } -+ return NULL; -+} -+ -+/** -+ * Find an association. -+ * -+ * @param id The id of the object to find. -+ * @param considerAncestors boolean switch to consider ancestors while searching -+ * @return Pointer to the object found (NULL if not found.) -+ */ -+UMLObject* UMLCanvasObject::findChildObjectById(Uml::ID::Type id, bool considerAncestors) -+{ -+ Q_UNUSED(considerAncestors); -+ UMLObject *o = NULL; -+ for (UMLObjectListIt oit(m_List); oit.hasNext();) { -+ o = oit.next(); -+ uIgnoreZeroPointer(o); -+ if (o->id() == id) -+ return o; -+ } -+ return 0; -+} -+ -+/** -+ * Overloaded '==' operator -+ */ -+bool UMLCanvasObject::operator==(const UMLCanvasObject& rhs) const -+{ -+ if (this == &rhs) { -+ return true; -+ } -+ if (!UMLObject::operator==(rhs)) { -+ return false; -+ } -+ if (m_List.count() != rhs.m_List.count()) { -+ return false; -+ } -+ if (&m_List != &(rhs.m_List)) { -+ return false; -+ } -+ return true; -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLCanvasObject::copyInto(UMLObject *lhs) const -+{ -+ UMLObject::copyInto(lhs); -+ -+ // TODO Associations are not copied at the moment. This because -+ // the duplicate function (on umlwidgets) do not copy the associations. -+ // -+ //target->m_List = m_List; -+} -+ -+/** -+ * Returns the number of associations for the CanvasObject. -+ * This is the sum of the aggregations and compositions. -+ * -+ * @return The number of associations for the Concept. -+ */ -+int UMLCanvasObject::associations() -+{ -+ int count = 0; -+ UMLObject *obj = NULL; -+ for (UMLObjectListIt oit(m_List); oit.hasNext();) { -+ obj = oit.next(); -+ uIgnoreZeroPointer(obj); -+ if (obj->baseType() == UMLObject::ot_Association) -+ count++; -+ } -+ return count; -+} -+ -+/** -+ * Return the list of associations for the CanvasObject. -+ * -+ * @return The list of associations for the CanvasObject. -+ */ -+UMLAssociationList UMLCanvasObject::getAssociations() -+{ -+ UMLAssociationList assocs; -+ UMLObject *o = NULL; -+ for (UMLObjectListIt oit(m_List); oit.hasNext() ;) { -+ o = oit.next(); -+ uIgnoreZeroPointer(o); -+ if (o->baseType() != UMLObject::ot_Association) -+ continue; -+ UMLAssociation *assoc = static_cast(o); -+ assocs.append(assoc); -+ } -+ return assocs; -+} -+ -+/** -+ * Return a list of the superclasses of this concept. -+ * TODO: This overlaps with UMLClassifier::findSuperClassConcepts(), -+ * see if we can merge the two. -+ * -+ * @param withRealizations include realizations in the returned list (default=yes) -+ * @return The list of superclasses for the concept. -+ */ -+UMLClassifierList UMLCanvasObject::getSuperClasses(bool withRealizations) -+{ -+ UMLClassifierList list; -+ UMLAssociationList assocs = getAssociations(); -+ foreach (UMLAssociation* a, assocs) { -+ uIgnoreZeroPointer(a); -+ if ((a->getAssocType() != Uml::AssociationType::Generalization && -+ a->getAssocType() != Uml::AssociationType::Realization) || -+ (!withRealizations && a->getAssocType() == Uml::AssociationType::Realization) || -+ a->getObjectId(Uml::RoleType::A) != id()) -+ continue; -+ UMLClassifier *c = dynamic_cast(a->getObject(Uml::RoleType::B)); -+ if (c) -+ list.append(c); -+ else -+ DEBUG(DBG_SRC) << name() << ": generalization's other end is not a " -+ << "UMLClassifier (id= " << Uml::ID::toString(a->getObjectId(Uml::RoleType::B)) << ")"; -+ } -+ return list; -+} -+ -+/** -+ * Return a list of the classes that inherit from this concept. -+ * TODO: This overlaps with UMLClassifier::findSubClassConcepts(), -+ * see if we can merge the two. -+ * -+ * @return The list of classes inheriting from the concept. -+ */ -+UMLClassifierList UMLCanvasObject::getSubClasses() -+{ -+ UMLClassifierList list; -+ UMLAssociationList assocs = getAssociations(); -+ foreach (UMLAssociation* a, assocs) { -+ uIgnoreZeroPointer(a); -+ if ((a->getAssocType() != Uml::AssociationType::Generalization && -+ a->getAssocType() != Uml::AssociationType::Realization) || -+ a->getObjectId(Uml::RoleType::B) != id()) -+ continue; -+ UMLClassifier *c = dynamic_cast(a->getObject(Uml::RoleType::A)); -+ if (c) -+ list.append(c); -+ else -+ DEBUG(DBG_SRC) << "specialization's other end is not a UMLClassifier" -+ << " (id=" << Uml::ID::toString(a->getObjectId(Uml::RoleType::A)) << ")"; -+ } -+ return list; -+} -+ -+/** -+ * Shorthand for getSpecificAssocs(Uml::at_Realization) -+ * -+ * @return The list of realizations for the Concept. -+ */ -+UMLAssociationList UMLCanvasObject::getRealizations() -+{ -+ return getSpecificAssocs(Uml::AssociationType::Realization); -+} -+ -+/** -+ * Shorthand for getSpecificAssocs(Uml::at_Aggregation) -+ * -+ * @return The list of aggregations for the Concept. -+ */ -+UMLAssociationList UMLCanvasObject::getAggregations() -+{ -+ return getSpecificAssocs(Uml::AssociationType::Aggregation); -+} -+ -+/** -+ * Shorthand for getSpecificAssocs(Uml::at_Composition) -+ * -+ * @return The list of compositions for the Concept. -+ */ -+UMLAssociationList UMLCanvasObject::getCompositions() -+{ -+ return getSpecificAssocs(Uml::AssociationType::Composition); -+} -+ -+/** -+ * Shorthand for getSpecificAssocs(Uml::at_Relationship) -+ * -+ * @return The list of relationships for the entity. -+ */ -+UMLAssociationList UMLCanvasObject::getRelationships() -+{ -+ return getSpecificAssocs(Uml::AssociationType::Relationship); -+} -+ -+/** -+ * Reimplementation of UMLObject method. -+ */ -+bool UMLCanvasObject::resolveRef() -+{ -+ bool overallSuccess = UMLObject::resolveRef(); -+ for (UMLObjectListIt ait(m_List); ait.hasNext();) { -+ UMLObject *obj = ait.next(); -+ uIgnoreZeroPointer(obj); -+ if (! obj->resolveRef()) { -+ m_List.removeAll(obj); -+ overallSuccess = false; -+ } -+ } -+ return overallSuccess; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlcanvasobject.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlcanvasobject.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlcanvasobject.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlcanvasobject.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,108 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef CANVASOBJECT_H -+#define CANVASOBJECT_H -+ -+#include "umlobject.h" -+#include "umlobjectlist.h" -+#include "umlclassifierlist.h" -+#include "umlassociationlist.h" -+ -+/** -+ * This class contains the non-graphical information required for UMLObjects -+ * which appear as moveable widgets on the scene. -+ * -+ * This class inherits from @ref UMLObject which contains most of the -+ * information. -+ * It is not instantiated itself, it's just used as a super class for -+ * actual model objects. -+ * -+ * @short Non-graphical information for a UMLCanvasObject. -+ * @author Jonathan Riddell -+ * @see UMLObject -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLCanvasObject : public UMLObject -+{ -+ Q_OBJECT -+ -+public: -+ explicit UMLCanvasObject(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -+ virtual ~UMLCanvasObject(); -+ -+ bool operator==(const UMLCanvasObject& rhs) const; -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ // The abstract method UMLObject::clone() is implemented -+ // in the classes inheriting from UMLCanvasObject. -+ -+ bool addAssociationEnd(UMLAssociation* assoc); -+ -+ bool hasAssociation(UMLAssociation* assoc); -+ -+ int removeAssociationEnd(UMLAssociation *assoc); -+ -+ void removeAllAssociationEnds(); -+ -+ int associations(); -+ -+ UMLAssociationList getAssociations(); -+ -+ UMLAssociationList getSpecificAssocs(Uml::AssociationType::Enum assocType); -+ -+ UMLClassifierList getSuperClasses(bool withRealizations = true); -+ UMLClassifierList getSubClasses(); -+ -+ virtual UMLAssociationList getRealizations(); -+ -+ UMLAssociationList getAggregations(); -+ UMLAssociationList getCompositions(); -+ UMLAssociationList getRelationships(); -+ -+ virtual UMLObject *findChildObject(const QString &n, -+ UMLObject::ObjectType t = UMLObject::ot_UMLObject); -+ virtual UMLObject *findChildObjectById(Uml::ID::Type id, bool considerAncestors = false); -+ -+ virtual QString uniqChildName(const UMLObject::ObjectType type, -+ const QString &prefix = QString()); -+ -+ virtual void removeAllChildObjects(); -+ -+ UMLObjectList subordinates() const { -+ return m_List; -+ } -+ -+ virtual bool resolveRef(); -+ -+ // The abstract method UMLObject::saveToXMI() is implemented -+ // in the classes inheriting from UMLCanvasObject. -+ -+protected: -+ -+ /** -+ * List of all the associations in this object. -+ * Inheriting classes add more types of objects that are possible in this list; -+ * for example, UMLClassifier adds operations, attributes, and templates. -+ * -+ * @todo Only a pointer to the appropriate assocation end object -+ * (UMLRole) should be saved here, not the entire UMLAssociation. -+ */ -+ UMLObjectList m_List; -+ -+signals: -+ -+ void sigAssociationEndAdded(UMLAssociation * assoc); -+ void sigAssociationEndRemoved(UMLAssociation * assoc); -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlclassifierlist.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlclassifierlist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlclassifierlist.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlclassifierlist.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,22 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2010 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLCLASSIFIERLIST_H -+#define UMLCLASSIFIERLIST_H -+ -+#include -+ -+// forward declaration -+class UMLClassifier; -+ -+typedef QList UMLClassifierList; -+typedef QListIterator UMLClassifierListIt; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlclassifierlistitemlist.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/umlclassifierlistitemlist.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlclassifierlistitemlist.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlclassifierlistitemlist.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,60 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "umlclassifierlistitemlist.h" -+ -+#include "classifierlistitem.h" -+ -+#include -+ -+UMLClassifierListItemList::UMLClassifierListItemList() -+{ -+} -+ -+UMLClassifierListItemList::UMLClassifierListItemList(const UMLClassifierListItemList& other) -+ : QList(other) -+{ -+} -+ -+UMLClassifierListItemList::~UMLClassifierListItemList() -+{ -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLClassifierListItemList::copyInto(UMLClassifierListItemList *rhs) const -+{ -+ // Prevent copying to yourself. (Can cause serious injuries) -+ if (rhs == this) return; -+ -+ rhs->clear(); -+ -+ // Suffering from const; we shall not modify our object. -+ UMLClassifierListItemList *tmp = new UMLClassifierListItemList(*this); -+ -+ UMLClassifierListItem *item; -+ for (UMLClassifierListItemListIt clit(*tmp); clit.hasNext() ;) { -+ item = clit.next(); -+ rhs->append((UMLClassifierListItem*)item->clone()); -+ } -+ delete tmp; -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLClassifierListItemList* UMLClassifierListItemList::clone() const -+{ -+ UMLClassifierListItemList *clone = new UMLClassifierListItemList(); -+ copyInto(clone); -+ return clone; -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlclassifierlistitemlist.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlclassifierlistitemlist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlclassifierlistitemlist.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlclassifierlistitemlist.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,41 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLCLASSIFIERLISTITEMLIST_H -+#define UMLCLASSIFIERLISTITEMLIST_H -+ -+#include -+ -+// forward declaration -+class UMLClassifierListItem; -+ -+//typedef QPtrList UMLClassifierListItemList; -+typedef QListIterator UMLClassifierListItemListIt; -+ -+/** -+ * This sub-class adds copyInto and clone to the QPtrList -+ * base class. -+ */ -+class UMLClassifierListItemList : public QList -+{ -+public: -+ -+ UMLClassifierListItemList(); -+ UMLClassifierListItemList(const UMLClassifierListItemList& other); -+ -+ virtual ~UMLClassifierListItemList(); -+ -+ virtual void copyInto (UMLClassifierListItemList *rhs) const; -+ -+ virtual UMLClassifierListItemList* clone() const; -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlentityattributelist.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/umlentityattributelist.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlentityattributelist.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlentityattributelist.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,60 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "umlentityattributelist.h" -+ -+#include "entityattribute.h" -+ -+#include -+ -+UMLEntityAttributeList::UMLEntityAttributeList() -+{ -+} -+ -+UMLEntityAttributeList::UMLEntityAttributeList(const UMLEntityAttributeList& other) -+ : QList(other) -+{ -+} -+ -+UMLEntityAttributeList::~UMLEntityAttributeList() -+{ -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLEntityAttributeList::copyInto(UMLEntityAttributeList* rhs) const -+{ -+ // Don't copy yourself. -+ if (rhs == this) return; -+ -+ rhs->clear(); -+ -+ // Suffering from const; we shall not modify our object. -+ UMLEntityAttributeList* tmp = new UMLEntityAttributeList(*this); -+ -+ UMLEntityAttribute* item; -+ for (UMLEntityAttributeListIt eait(*tmp); eait.hasNext() ;) { -+ item = eait.next(); -+ rhs->append((UMLEntityAttribute*)item->clone()); -+ } -+ delete tmp; -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLEntityAttributeList* UMLEntityAttributeList::clone() const -+{ -+ UMLEntityAttributeList *clone = new UMLEntityAttributeList(); -+ copyInto(clone); -+ return clone; -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlentityattributelist.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlentityattributelist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlentityattributelist.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlentityattributelist.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,41 @@ -+/*************************************************************************** -+ * * -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLENTITYATTRIBUTELIST_H -+#define UMLENTITYATTRIBUTELIST_H -+ -+#include -+#include "entityattribute.h" -+ -+//typedef QPtrList UMLEntityAttributeList; -+typedef QListIterator UMLEntityAttributeListIt; -+ -+/** -+ * This sub-class adds copyInto and clone to the QPtrList -+ * base class. -+ */ -+class UMLEntityAttributeList : public QList -+{ -+public: -+ -+ UMLEntityAttributeList(); -+ -+ UMLEntityAttributeList(const UMLEntityAttributeList&); -+ -+ virtual ~UMLEntityAttributeList(); -+ -+ virtual void copyInto (UMLEntityAttributeList* rhs) const; -+ -+ virtual UMLEntityAttributeList* clone() const; -+}; -+ -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlentityconstraintlist.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/umlentityconstraintlist.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlentityconstraintlist.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlentityconstraintlist.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,60 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "umlentityconstraintlist.h" -+ -+#include "entityconstraint.h" -+ -+#include -+ -+UMLEntityConstraintList::UMLEntityConstraintList() -+{ -+} -+ -+UMLEntityConstraintList::UMLEntityConstraintList(const UMLEntityConstraintList& other) -+ : QList(other) -+{ -+} -+ -+UMLEntityConstraintList::~UMLEntityConstraintList() -+{ -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLEntityConstraintList::copyInto(UMLEntityConstraintList* rhs) const -+{ -+ // Don't copy yourself. -+ if (rhs == this) return; -+ -+ rhs->clear(); -+ -+ // Suffering from const; we shall not modify our object. -+ UMLEntityConstraintList* tmp = new UMLEntityConstraintList(*this); -+ -+ UMLEntityConstraint* item; -+ for (UMLEntityConstraintListIt ecit(*tmp); ecit.hasNext() ;) { -+ item = ecit.next(); -+ rhs->append((UMLEntityConstraint*)item->clone()); -+ } -+ delete tmp; -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLEntityConstraintList* UMLEntityConstraintList::clone() const -+{ -+ UMLEntityConstraintList *clone = new UMLEntityConstraintList(); -+ copyInto(clone); -+ return clone; -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlentityconstraintlist.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlentityconstraintlist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlentityconstraintlist.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlentityconstraintlist.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,43 @@ -+/*************************************************************************** -+ * * -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLENTITYCONSTRAINTLIST_H -+#define UMLENTITYCONSTRAINTLIST_H -+ -+#include -+ -+// forward declaration -+class UMLEntityConstraint; -+ -+ -+typedef QListIterator UMLEntityConstraintListIt; -+ -+/** -+ * This sub-class adds copyInto and clone to the QPtrList -+ * base class. -+ */ -+class UMLEntityConstraintList : public QList -+{ -+public: -+ -+ UMLEntityConstraintList(); -+ -+ UMLEntityConstraintList(const UMLEntityConstraintList&); -+ -+ virtual ~UMLEntityConstraintList(); -+ -+ virtual void copyInto (UMLEntityConstraintList* rhs) const; -+ -+ virtual UMLEntityConstraintList* clone() const; -+}; -+ -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlentitylist.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlentitylist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlentitylist.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlentitylist.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,22 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2010 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLENTITYLIST_H -+#define UMLENTITYLIST_H -+ -+#include -+ -+// forward declaration -+class UMLEntity; -+ -+typedef QList UMLEntityList; -+typedef QListIterator UMLEntityListIt; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlenumliterallist.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlenumliterallist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlenumliterallist.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlenumliterallist.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,23 @@ -+/*************************************************************************** -+ * * -+ * 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. * -+ * * -+ * copyright (C) 2004-2007 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLENUMLITERALLIST_H -+#define UMLENUMLITERALLIST_H -+ -+#include -+ -+// forward declaration -+class UMLEnumLiteral; -+ -+typedef QList UMLEnumLiteralList; -+typedef QListIterator UMLEnumLiteralListIt; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlobject.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/umlobject.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlobject.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlobject.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,1157 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "umlobject.h" -+ -+// app includes -+#include "classpropertiesdialog.h" -+#include "debug_utils.h" -+#include "enumliteral.h" -+#include "uniqueid.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umllistview.h" -+#include "package.h" -+#include "folder.h" -+#include "stereotype.h" -+#include "object_factory.h" -+#include "model_utils.h" -+#include "import_utils.h" -+#include "docwindow.h" -+#include "cmds.h" -+ -+// kde includes -+#include -+ -+// qt includes -+#include -+#include -+ -+using namespace Uml; -+ -+DEBUG_REGISTER_DISABLED(UMLObject) -+ -+/** -+ * Creates a UMLObject. -+ * @param other object to created from -+ */ -+UMLObject::UMLObject(const UMLObject &other) -+ : QObject(other.parent()) -+{ -+ other.copyInto(this); -+} -+ -+/** -+ * Creates a UMLObject. -+ * @param parent The parent of the object. -+ * @param name The name of the object. -+ * @param id The ID of the object (optional.) If omitted -+ * then a new ID will be assigned internally. -+ */ -+UMLObject::UMLObject(UMLObject* parent, const QString& name, ID::Type id) -+ : QObject(parent), -+ m_nId(id), -+ m_name(name) -+{ -+ init(); -+ if (id == Uml::ID::None) -+ m_nId = UniqueID::gen(); -+} -+ -+/** -+ * Creates a UMLObject. -+ * @param name The name of the object. -+ * @param id The ID of the object (optional.) If omitted -+ * then a new ID will be assigned internally. -+ */ -+UMLObject::UMLObject(const QString& name, ID::Type id) -+ : QObject(UMLApp::app()->document()), -+ m_nId(id), -+ m_name(name) -+{ -+ init(); -+ if (id == Uml::ID::None) -+ m_nId = UniqueID::gen(); -+} -+ -+/** -+ * Creates a UMLObject. -+ * @param parent The parent of the object. -+ */ -+UMLObject::UMLObject(UMLObject * parent) -+ : QObject(parent), -+ m_nId(Uml::ID::None), -+ m_name(QString()) -+{ -+ init(); -+} -+ -+/** -+ * Standard destructor. -+ */ -+UMLObject::~UMLObject() -+{ -+ // unref stereotype -+ setUMLStereotype(0); -+ if (m_pSecondary && m_pSecondary->baseType() == ot_Stereotype) { -+ UMLStereotype* stereotype = dynamic_cast(m_pSecondary.data()); -+ if (stereotype) -+ stereotype->decrRefCount(); -+ } -+} -+ -+/** -+ * Initializes key variables of the class. -+ */ -+void UMLObject::init() -+{ -+ setObjectName(QLatin1String("UMLObject")); -+ m_BaseType = ot_UMLObject; -+ m_pUMLPackage = 0; -+ m_visibility = Uml::Visibility::Public; -+ m_pStereotype = 0; -+ m_Doc.clear(); -+ m_bAbstract = false; -+ m_bStatic = false; -+ m_bCreationWasSignalled = false; -+ m_pSecondary = 0; -+} -+ -+/** -+ * Display the properties configuration dialog for the object. -+ * -+ * @param parent The parent widget. -+ * @return True for success of this operation. -+ */ -+bool UMLObject::showPropertiesDialog(QWidget *parent) -+{ -+ DocWindow *docwindow = UMLApp::app()->docWindow(); -+ docwindow->updateDocumentation(false); -+ QPointer dlg = new ClassPropertiesDialog(parent, this, false); -+ bool modified = false; -+ if (dlg->exec()) { -+ docwindow->showDocumentation(this, true); -+ UMLApp::app()->document()->setModified(true); -+ modified = true; -+ } -+ dlg->close(); -+ delete dlg; -+ return modified; -+} -+ -+/** -+ * This should be reimplemented by subclasses if they wish to -+ * accept certain types of associations. Note that this only -+ * tells if this UMLObject can accept the association -+ * type. When creating an association another check is made to -+ * see if the association is valid. For example a UMLClass -+ * (UMLClassifier) can accept generalizations and should -+ * return true. If while creating a generalization the -+ * superclass is already subclassed from this, the association -+ * is not valid and will not be created. The default accepts -+ * nothing (returns false) -+ */ -+bool UMLObject::acceptAssociationType(Uml::AssociationType::Enum type) -+{ -+ Q_UNUSED(type); -+ // A UMLObject accepts nothing. This should be reimplemented by the subclasses -+ return false; -+} -+ -+/** -+ * Assigns a new Id to the object -+ */ -+void UMLObject::setID(ID::Type NewID) -+{ -+ m_nId = NewID; -+ emitModified(); -+} -+ -+/** -+ * Set the UMLObject's name -+ */ -+void UMLObject::setName(const QString &strName) -+{ -+ if (name() != strName) { -+ UMLApp::app()->executeCommand(new Uml::CmdRenameUMLObject(this, strName)); -+ } -+} -+ -+/** -+ * Method used by setName: it is called by cmdSetName, Don't use it! -+ */ -+void UMLObject::setNameCmd(const QString &strName) -+{ -+ m_name = strName; -+ emitModified(); -+} -+ -+/** -+ * Returns a copy of m_name -+ */ -+QString UMLObject::name() const -+{ -+ return m_name; -+} -+ -+/** -+ * Returns the fully qualified name, i.e. all package prefixes and then m_name. -+ * -+ * @param separator The separator string to use (optional.) -+ * If not given then the separator is chosen according -+ * to the currently selected active programming language -+ * of import and code generation. -+ * @param includeRoot Whether to prefix the root folder name to the FQN. -+ * See UMLDoc::getRootFolder(). Default: false. -+ * @return The fully qualified name of this UMLObject. -+ */ -+QString UMLObject::fullyQualifiedName(const QString& separator, -+ bool includeRoot /* = false */) const -+{ -+ QString fqn; -+ if (m_pUMLPackage && m_pUMLPackage != this) { -+ bool skipPackage = false; -+ if (!includeRoot) { -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ if (umldoc->rootFolderType(m_pUMLPackage) != Uml::ModelType::N_MODELTYPES || -+ m_pUMLPackage == umldoc->datatypeFolder()) -+ skipPackage = true; -+ } -+ if (!skipPackage) { -+ QString tempSeparator = separator; -+ if (tempSeparator.isEmpty()) -+ tempSeparator = UMLApp::app()->activeLanguageScopeSeparator(); -+ fqn = m_pUMLPackage->fullyQualifiedName(tempSeparator, includeRoot); -+ fqn.append(tempSeparator); -+ } -+ } -+ fqn.append(m_name); -+ return fqn; -+} -+ -+/** -+ * Overloaded '==' operator -+ */ -+bool UMLObject::operator==(const UMLObject & rhs) const -+{ -+ if (this == &rhs) -+ return true; -+ -+ //don't compare IDs, these are program specific and -+ //don't mean the objects are the same -+ //***** CHECK: Who put in this comment? What was the reason? -+ //***** Currently some operator== in umbrello-kf6 compare the IDs -+ //***** while others don't. -+ -+ if (m_name != rhs.m_name) -+ return false; -+ -+ // Packages create different namespaces, therefore they should be -+ // part of the equality test. -+ if (m_pUMLPackage != rhs.m_pUMLPackage) -+ return false; -+ -+ // Making the type part of an object's identity has its problems: -+ // Not all programming languages support declarations of the same -+ // name but different type. -+ // In such cases, the code generator is responsible for generating -+ // the appropriate error message. -+ if (m_BaseType != rhs.m_BaseType) -+ return false; -+ -+ // The documentation should not be part of the equality test. -+ // If two objects are the same but differ only in their documentation, -+ // what does that mean? -+ //if(m_Doc != rhs.m_Doc) -+ // return false; -+ -+ // The visibility should not be part of the equality test. -+ // What does it mean if two objects are the same but differ in their -+ // visibility? - I'm not aware of any programming language that would -+ // support that. -+ //if(m_visibility != rhs.m_visibility) -+ // return false; -+ -+ // See comments above -+ //if(m_pStereotype != rhs.m_pStereotype) -+ // return false; -+ -+ // See comments above -+ //if(m_bAbstract != rhs.m_bAbstract) -+ // return false; -+ -+ // See comments above -+ //if(m_bStatic != rhs.m_bStatic) -+ // return false; -+ -+ return true; -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLObject::copyInto(UMLObject *lhs) const -+{ -+ // Data members with copy constructor -+ lhs->m_Doc = m_Doc; -+ lhs->m_pStereotype = m_pStereotype; -+ if (lhs->m_pStereotype) -+ lhs->m_pStereotype->incrRefCount(); -+ lhs->m_bAbstract = m_bAbstract; -+ lhs->m_bStatic = m_bStatic; -+ lhs->m_BaseType = m_BaseType; -+ lhs->m_visibility = m_visibility; -+ lhs->m_pUMLPackage = m_pUMLPackage; -+ -+ // We don't want the same name existing twice. -+ lhs->m_name = Model_Utils::uniqObjectName(m_BaseType, m_pUMLPackage, m_name); -+ -+ // Create a new ID. -+ lhs->m_nId = UniqueID::gen(); -+ -+ // Hope that the parent from QObject is okay. -+ if (lhs->parent() != parent()) -+ uDebug() << "copyInto has a wrong parent"; -+} -+ -+UMLObject *UMLObject::clone() const -+{ -+ UMLObject *clone = new UMLObject; -+ UMLObject::copyInto(clone); -+ return clone; -+} -+ -+/** -+ * Returns the abstract state of the object. -+ */ -+bool UMLObject::isAbstract() const -+{ -+ return m_bAbstract; -+} -+ -+/** -+ * Sets the paste state of the object. -+ */ -+void UMLObject::setAbstract(bool bAbstract) -+{ -+ m_bAbstract = bAbstract; -+ emitModified(); -+} -+ -+/** -+ * Returns true if this UMLObject has classifier scope, -+ * otherwise false (the default). -+ */ -+bool UMLObject::isStatic() const -+{ -+ return m_bStatic; -+} -+ -+/** -+ * Sets the value for m_bStatic. -+ */ -+void UMLObject::setStatic(bool bStatic) -+{ -+ m_bStatic = bStatic; -+ emitModified(); -+} -+ -+/** -+ * Forces the emission of the modified signal. Useful when -+ * updating several attributes at a time: you can block the -+ * signals, update all atts, and then force the signal. -+ */ -+void UMLObject::emitModified() -+{ -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ if (!umldoc->loading() && !umldoc->closing()) -+ emit modified(); -+} -+ -+/** -+ * Returns the type of the object. -+ * -+ * @return Returns the type of the object. -+ */ -+UMLObject::ObjectType UMLObject::baseType() const -+{ -+ return m_BaseType; -+} -+ -+/** -+ * @return The type used for rtti as string. -+ */ -+QLatin1String UMLObject::baseTypeStr() const -+{ -+ return QLatin1String(ENUM_NAME(UMLObject, ObjectType, m_BaseType)); -+} -+ -+/** -+ * Set the type of the object. -+ * -+ * @param ot The ObjectType to set. -+ */ -+void UMLObject::setBaseType(ObjectType ot) -+{ -+ m_BaseType = ot; -+} -+ -+/** -+ * Returns the ID of the object. -+ * -+ * @return Returns the ID of the object. -+ */ -+ID::Type UMLObject::id() const -+{ -+ return m_nId; -+} -+ -+/** -+ * Returns the documentation for the object. -+ * -+ * @return Returns the documentation for the object. -+ */ -+QString UMLObject::doc() const -+{ -+ return m_Doc; -+} -+ -+/** -+ * Returns state of documentation for the object. -+ * -+ * @return false if documentation is empty -+ */ -+bool UMLObject::hasDoc() const -+{ -+ return !m_Doc.isEmpty(); -+} -+ -+/** -+ * Sets the documentation for the object. -+ * -+ * @param d The documentation for the object. -+ */ -+void UMLObject::setDoc(const QString &d) -+{ -+ m_Doc = d; -+ //emit modified(); No, this is done centrally at DocWindow::updateDocumentation() -+} -+ -+/** -+ * Returns the visibility of the object. -+ * -+ * @return Returns the visibility of the object. -+ */ -+Visibility::Enum UMLObject::visibility() const -+{ -+ return m_visibility; -+} -+ -+/** -+ * Sets the visibility of the object. -+ * -+ * @param visibility The visibility of the object. -+ */ -+void UMLObject::setVisibility(Visibility::Enum visibility) -+{ -+ if (m_visibility != visibility) { -+ UMLApp::app()->executeCommand(new CmdSetVisibility(this, visibility)); -+ } -+} -+ -+/** -+ * Method used by setVisibility: it is called by cmdSetVisibility, Don't use it! -+ */ -+void UMLObject::setVisibilityCmd(Visibility::Enum visibility) -+{ -+ m_visibility = visibility; -+ emitModified(); -+} -+ -+/** -+ * Sets the class' UMLStereotype. Adjusts the reference counts -+ * at the previously set stereotype and at the new stereotype. -+ * If the previously set UMLStereotype's reference count drops -+ * to zero then the UMLStereotype is removed at the UMLDoc and -+ * it is then physically deleted. -+ * -+ * @param stereo Sets the classes UMLStereotype. -+ */ -+void UMLObject::setUMLStereotype(UMLStereotype *stereo) -+{ -+ if (stereo == m_pStereotype) -+ return; -+ if (stereo) { -+ stereo->incrRefCount(); -+ } -+ if (m_pStereotype) { -+ m_pStereotype->decrRefCount(); -+ if (m_pStereotype->refCount() == 0) { -+ UMLDoc *pDoc = UMLApp::app()->document(); -+ pDoc->removeStereotype(m_pStereotype); -+ delete m_pStereotype; -+ } -+ } -+ m_pStereotype = stereo; -+ // TODO: don't emit modified() if predefined folder -+ emitModified(); -+} -+ -+/** -+ * Sets the classes stereotype name. -+ * Internally uses setUMLStereotype(). -+ * -+ * @param name Sets the classes stereotype name. -+ */ -+void UMLObject::setStereotype(const QString &name) -+{ -+ if (name != stereotype()) { -+ UMLApp::app()->executeCommand(new CmdSetStereotype(this, name)); -+ } -+} -+ -+void UMLObject::setStereotypeCmd(const QString& name) -+{ -+ if (name.isEmpty()) { -+ setUMLStereotype(NULL); -+ return; -+ } -+ UMLDoc *pDoc = UMLApp::app()->document(); -+ UMLStereotype *s = pDoc->findOrCreateStereotype(name); -+ setUMLStereotype(s); -+} -+ -+/** -+ * Sets the UMLPackage in which this class is located. -+ * -+ * @param pPkg Pointer to the class' UMLPackage. -+ */ -+bool UMLObject::setUMLPackage(UMLPackage* pPkg) -+{ -+ if (pPkg == this) { -+ uDebug() << "setting parent to myself is not allowed"; -+ return false; -+ } -+ -+ if (pPkg == NULL) { -+ // Allow setting to NULL for stereotypes -+ m_pUMLPackage = pPkg; -+ return true; -+ } -+ -+ if (pPkg->umlPackage() == this) { -+ uDebug() << "setting parent to an object of which I'm already the parent is not allowed"; -+ return false; -+ } -+ -+ m_pUMLPackage = pPkg; -+ emitModified(); -+ return true; -+} -+ -+/** -+ * Returns the classes UMLStereotype object. -+ * -+ * @return Returns the classes UMLStereotype object. -+ */ -+UMLStereotype * UMLObject::umlStereotype() -+{ -+ return m_pStereotype; -+} -+ -+/** -+ * Returns the stereotype. -+ */ -+QString UMLObject::stereotype(bool includeAdornments /* = false */) const -+{ -+ if (m_pStereotype == NULL) -+ return QString(); -+ return m_pStereotype->name(includeAdornments); -+} -+ -+/** -+ * Return the package(s) in which this UMLObject is contained -+ * as a text. -+ * -+ * @param separator Separator string for joining together the -+ * individual package prefixes (optional.) -+ * If no separator is given then the separator -+ * of the currently selected language is used. -+ * @param includeRoot Whether to prefix the root folder name. -+ * Default: false. -+ * @return The UMLObject's enclosing package(s) as a text. -+ */ -+QString UMLObject::package(const QString& separator, bool includeRoot) -+{ -+ QString tempSeparator = separator; -+ if (tempSeparator.isEmpty()) -+ tempSeparator = UMLApp::app()->activeLanguageScopeSeparator(); -+ QString fqn = fullyQualifiedName(tempSeparator, includeRoot); -+ if (!fqn.contains(tempSeparator)) -+ return QString(); -+ QString scope = fqn.left(fqn.length() - tempSeparator.length() - m_name.length()); -+ return scope; -+} -+ -+/** -+ * Return a list of the packages in which this class is embedded. -+ * The outermost package is first in the list. -+ * -+ * @param includeRoot Whether to prefix the root folder name. -+ * Default: false. -+ * @return UMLPackageList of the containing packages. -+ */ -+UMLPackageList UMLObject::packages(bool includeRoot) const -+{ -+ UMLPackageList pkgList; -+ UMLPackage* pkg = m_pUMLPackage; -+ while (pkg != NULL) { -+ pkgList.prepend(pkg); -+ pkg = pkg->umlPackage(); -+ } -+ if (!includeRoot) -+ pkgList.removeFirst(); -+ return pkgList; -+} -+ -+/** -+ * Returns the UMLPackage that this class is located in. -+ * -+ * @return Pointer to the UMLPackage of this class. -+ */ -+UMLPackage* UMLObject::umlPackage() -+{ -+ return m_pUMLPackage; -+} -+ -+/** -+ * Return secondary ID. Required by resolveRef(). -+ */ -+QString UMLObject::secondaryId() const -+{ -+ return m_SecondaryId; -+} -+ -+/** -+ * Set the secondary ID. -+ * Currently only required by petalTree2Uml(); all other setting of the -+ * m_SecondaryID is internal to the UMLObject class hierarchy. -+ */ -+void UMLObject::setSecondaryId(const QString& id) -+{ -+ m_SecondaryId = id; -+} -+ -+/** -+ * Return secondary ID fallback. -+ * Required by resolveRef() for imported model files. -+ */ -+QString UMLObject::secondaryFallback() const -+{ -+ return m_SecondaryFallback; -+} -+ -+/** -+ * Set the secondary ID fallback. -+ * Currently only used by petalTree2Uml(). -+ */ -+void UMLObject::setSecondaryFallback(const QString& id) -+{ -+ m_SecondaryFallback = id; -+} -+ -+/** -+ * Calls UMLDoc::signalUMLObjectCreated() if m_BaseType affords -+ * doing so. -+ */ -+void UMLObject::maybeSignalObjectCreated() -+{ -+ if (!m_bCreationWasSignalled && -+ m_BaseType != ot_Stereotype && -+ m_BaseType != ot_Association && -+ m_BaseType != ot_Role) { -+ m_bCreationWasSignalled = true; -+ UMLDoc* umldoc = UMLApp::app()->document(); -+ umldoc->signalUMLObjectCreated(this); -+ } -+} -+ -+/** -+ * Resolve referenced objects (if any.) -+ * Needs to be called after all UML objects are loaded from file. -+ * This needs to be done after all model objects are loaded because -+ * some of the xmi.id's might be forward references, i.e. they may -+ * identify model objects which were not yet loaded at the point of -+ * reference. -+ * The default implementation attempts resolution of the m_SecondaryId. -+ * -+ * @return True for success. -+ */ -+bool UMLObject::resolveRef() -+{ -+ if (m_pSecondary || (m_SecondaryId.isEmpty() && m_SecondaryFallback.isEmpty())) { -+ maybeSignalObjectCreated(); -+ return true; -+ } -+#ifdef VERBOSE_DEBUGGING -+ uDebug() << m_name << ": m_SecondaryId is " << m_SecondaryId; -+#endif -+ UMLDoc *pDoc = UMLApp::app()->document(); -+ // In the new, XMI standard compliant save format, -+ // the type is the xmi.id of a UMLClassifier. -+ if (! m_SecondaryId.isEmpty()) { -+ m_pSecondary = pDoc->findObjectById(Uml::ID::fromString(m_SecondaryId)); -+ if (m_pSecondary != NULL) { -+ if (m_pSecondary->baseType() == ot_Stereotype) { -+ if (m_pStereotype) -+ m_pStereotype->decrRefCount(); -+ m_pStereotype = dynamic_cast(m_pSecondary.data()); -+ m_pStereotype->incrRefCount(); -+ m_pSecondary = NULL; -+ } -+ m_SecondaryId = QString(); -+ maybeSignalObjectCreated(); -+ return true; -+ } -+ if (m_SecondaryFallback.isEmpty()) { -+ uDebug() << "object with xmi.id=" << m_SecondaryId << " not found, setting to undef"; -+ UMLFolder *datatypes = pDoc->datatypeFolder(); -+ m_pSecondary = Object_Factory::createUMLObject(ot_Datatype, QLatin1String("undef"), datatypes, false); -+ return true; -+ } -+ } -+ if (m_SecondaryFallback.isEmpty()) { -+ uError() << m_name << ": cannot find type with id " << m_SecondaryId; -+ return false; -+ } -+#ifdef VERBOSE_DEBUGGING -+ uDebug() << m_name << ": could not resolve secondary ID " << m_SecondaryId -+ << ", using secondary fallback " << m_SecondaryFallback; -+#endif -+ m_SecondaryId = m_SecondaryFallback; -+ // Assume we're dealing with the older umbrello-kf6 format where -+ // the type name was saved in the "type" attribute rather -+ // than the xmi.id of the model object of the attribute type. -+ m_pSecondary = pDoc->findUMLObject(m_SecondaryId, ot_UMLObject, this); -+ if (m_pSecondary) { -+ m_SecondaryId = QString(); -+ maybeSignalObjectCreated(); -+ return true; -+ } -+ // Work around Object_Factory::createUMLObject()'s incapability -+ // of on-the-fly scope creation: -+ if (m_SecondaryId.contains(QLatin1String("::"))) { -+ // TODO: Merge Import_Utils::createUMLObject() into Object_Factory::createUMLObject() -+ m_pSecondary = Import_Utils::createUMLObject(ot_UMLObject, m_SecondaryId, m_pUMLPackage); -+ if (m_pSecondary) { -+ if (Import_Utils::newUMLObjectWasCreated()) { -+ maybeSignalObjectCreated(); -+ qApp->processEvents(); -+ uDebug() << "Import_Utils::createUMLObject() created a new type for " -+ << m_SecondaryId; -+ } else { -+ uDebug() << "Import_Utils::createUMLObject() returned an existing type for " -+ << m_SecondaryId; -+ } -+ m_SecondaryId = QString(); -+ return true; -+ } -+ uError() << "Import_Utils::createUMLObject() failed to create a new type for " -+ << m_SecondaryId; -+ return false; -+ } -+ uDebug() << "Creating new type for " << m_SecondaryId; -+ // This is very C++ specific - we rely on some '*' or -+ // '&' to decide it's a ref type. Plus, we don't recognize -+ // typedefs of ref types. -+ bool isReferenceType = (m_SecondaryId.contains(QLatin1Char('*')) || -+ m_SecondaryId.contains(QLatin1Char('&'))); -+ ObjectType ot = ot_Class; -+ if (isReferenceType) { -+ ot = ot_Datatype; -+ } else { -+ if (Model_Utils::isCommonDataType(m_SecondaryId)) -+ ot = ot_Datatype; -+ } -+ m_pSecondary = Object_Factory::createUMLObject(ot, m_SecondaryId, NULL); -+ if (m_pSecondary == NULL) -+ return false; -+ m_SecondaryId = QString(); -+ maybeSignalObjectCreated(); -+ //qApp->processEvents(); -+ return true; -+} -+ -+void UMLObject::saveToXMI(QDomDocument &qDoc, QDomElement &qElement) -+{ -+ Q_UNUSED(qDoc); Q_UNUSED(qElement); -+} -+ -+/** -+ * Auxiliary to saveToXMI. -+ * Create a QDomElement with the given tag, and save the XMI attributes -+ * that are common to all child classes to the newly created element. -+ * This method does not need to be overridden by child classes. -+ */ -+QDomElement UMLObject::save(const QString &tag, QDomDocument & qDoc) -+{ -+ /* -+ Call as the first action of saveToXMI() in child class: -+ This creates the QDomElement with which to work. -+ */ -+ QDomElement qElement = qDoc.createElement(tag); -+ qElement.setAttribute(QLatin1String("isSpecification"), QLatin1String("false")); -+ if (m_BaseType != ot_Association && -+ m_BaseType != ot_Role && -+ m_BaseType != ot_Attribute) { -+ qElement.setAttribute(QLatin1String("isLeaf"), QLatin1String("false")); -+ qElement.setAttribute(QLatin1String("isRoot"), QLatin1String("false")); -+ if (m_bAbstract) -+ qElement.setAttribute(QLatin1String("isAbstract"), QLatin1String("true")); -+ else -+ qElement.setAttribute(QLatin1String("isAbstract"), QLatin1String("false")); -+ } -+ qElement.setAttribute(QLatin1String("xmi.id"), Uml::ID::toString(m_nId)); -+ qElement.setAttribute(QLatin1String("name"), m_name); -+ if (m_BaseType != ot_Operation && -+ m_BaseType != ot_Role && -+ m_BaseType != ot_Attribute) { -+ Uml::ID::Type nmSpc; -+ if (m_pUMLPackage) -+ nmSpc = m_pUMLPackage->id(); -+ else -+ nmSpc = UMLApp::app()->document()->modelID(); -+ qElement.setAttribute(QLatin1String("namespace"), Uml::ID::toString(nmSpc)); -+ } -+ if (! m_Doc.isEmpty()) -+ qElement.setAttribute(QLatin1String("comment"), m_Doc); //CHECK: uml13.dtd compliance -+#ifdef XMI_FLAT_PACKAGES -+ if (m_pUMLPackage) //FIXME: uml13.dtd compliance -+ qElement.setAttribute(QLatin1String("package"), m_pUMLPackage->ID()); -+#endif -+ QString visibility = Uml::Visibility::toString(m_visibility, false); -+ qElement.setAttribute(QLatin1String("visibility"), visibility); -+ if (m_pStereotype != NULL) -+ qElement.setAttribute(QLatin1String("stereotype"), Uml::ID::toString(m_pStereotype->id())); -+ if (m_bStatic) -+ qElement.setAttribute(QLatin1String("ownerScope"), QLatin1String("classifier")); -+ /* else -+ qElement.setAttribute("ownerScope", "instance"); -+ *** ownerScope defaults to instance if not set **********/ -+ return qElement; -+} -+ -+/** -+ * Auxiliary to loadFromXMI. -+ * This method is usually overridden by child classes. -+ * It is responsible for loading the specific XMI structure -+ * of the child class. -+ */ -+bool UMLObject::load(QDomElement&) -+{ -+ // This body is not usually executed because child classes -+ // overwrite the load method. -+ return true; -+} -+ -+/** -+ * Analyzes the given QDomElement for a reference to a stereotype. -+ * -+ * @param element QDomElement to analyze. -+ * @return True if a stereotype reference was found, else false. -+ */ -+bool UMLObject::loadStereotype(QDomElement & element) -+{ -+ QString tag = element.tagName(); -+ if (!UMLDoc::tagEq(tag, QLatin1String("stereotype"))) -+ return false; -+ QString stereo = element.attribute(QLatin1String("xmi.value")); -+ if (stereo.isEmpty() && element.hasChildNodes()) { -+ /* like so: -+ -+ -+ -+ */ -+ QDomNode stereoNode = element.firstChild(); -+ QDomElement stereoElem = stereoNode.toElement(); -+ tag = stereoElem.tagName(); -+ if (UMLDoc::tagEq(tag, QLatin1String("Stereotype"))) { -+ stereo = stereoElem.attribute(QLatin1String("xmi.idref")); -+ } -+ } -+ if (stereo.isEmpty()) -+ return false; -+ Uml::ID::Type stereoID = Uml::ID::fromString(stereo); -+ UMLDoc *pDoc = UMLApp::app()->document(); -+ if (m_pStereotype) -+ m_pStereotype->decrRefCount(); -+ m_pStereotype = pDoc->findStereotypeById(stereoID); -+ if (m_pStereotype) -+ m_pStereotype->incrRefCount(); -+ else -+ m_SecondaryId = stereo; // leave it to resolveRef() -+ return true; -+} -+ -+/** -+ * This method loads the generic parts of the XMI common to most model -+ * classes. It is not usually reimplemented by child classes. -+ * Instead, it invokes the load() method which implements the loading -+ * of the specifics of each child class. -+ * -+ * @param element The QDomElement from which to load. -+ */ -+bool UMLObject::loadFromXMI(QDomElement & element) -+{ -+ UMLDoc* umldoc = UMLApp::app()->document(); -+ if (umldoc == 0) { -+ uError() << "umldoc is NULL"; -+ return false; -+ } -+ // Read the name first so that if we encounter a problem, the error -+ // message can say the name. -+ m_name = element.attribute(QLatin1String("name")); -+ QString id = Model_Utils::getXmiId(element); -+ if (id.isEmpty() || id == QLatin1String("-1")) { -+ // Before version 1.4, umbrello-kf6 did not save the xmi.id of UMLRole objects. -+ // Some tools (such as Embarcadero's) do not have an xmi.id on all attributes. -+ m_nId = UniqueID::gen(); -+ uWarning() << m_name << ": xmi.id not present, generating a new one"; -+ } else { -+ Uml::ID::Type nId = Uml::ID::fromString(id); -+ if (m_BaseType == ot_Role) { -+ // Some older umbrello-kf6 versions had a problem with xmi.id's -+ // of other objects being reused for the UMLRole, see e.g. -+ // attachment 21179 at http://bugs.kde.org/147988 . -+ // If the xmi.id is already being used then we generate a new one. -+ UMLObject *o = umldoc->findObjectById(nId); -+ if (o) { -+ uError() << "loadFromXMI(UMLRole): id " << id -+ << " is already in use!!! Please fix your XMI file."; -+ } -+ } -+ m_nId = nId; -+ } -+ -+ if (element.hasAttribute(QLatin1String("documentation"))) // for bkwd compat. -+ m_Doc = element.attribute(QLatin1String("documentation")); -+ else -+ m_Doc = element.attribute(QLatin1String("comment")); //CHECK: need a UML:Comment? -+ -+ m_visibility = Uml::Visibility::Public; -+ if (element.hasAttribute(QLatin1String("scope"))) { // for bkwd compat. -+ QString scope = element.attribute(QLatin1String("scope")); -+ if (scope == QLatin1String("instance_level")) // nsuml compat. -+ m_bStatic = false; -+ else if (scope == QLatin1String("classifier_level")) // nsuml compat. -+ m_bStatic = true; -+ else { -+ int nScope = scope.toInt(); -+ switch (nScope) { -+ case 200: -+ m_visibility = Uml::Visibility::Public; -+ break; -+ case 201: -+ m_visibility = Uml::Visibility::Private; -+ break; -+ case 202: -+ m_visibility = Uml::Visibility::Protected; -+ break; -+ default: -+ uError() << m_name << ": illegal scope " << nScope; -+ } -+ } -+ } else { -+ QString visibility = element.attribute(QLatin1String("visibility"), QLatin1String("public")); -+ if (visibility == QLatin1String("private") -+ || visibility == QLatin1String("private_vis")) // for compatibility with other programs -+ m_visibility = Uml::Visibility::Private; -+ else if (visibility == QLatin1String("protected") -+ || visibility == QLatin1String("protected_vis")) // for compatibility with other programs -+ m_visibility = Uml::Visibility::Protected; -+ else if (visibility == QLatin1String("implementation")) -+ m_visibility = Uml::Visibility::Implementation; -+ } -+ -+ QString stereo = element.attribute(QLatin1String("stereotype")); -+ if (!stereo.isEmpty()) { -+ Uml::ID::Type stereoID = Uml::ID::fromString(stereo); -+ if (m_pStereotype) -+ m_pStereotype->decrRefCount(); -+ m_pStereotype = umldoc->findStereotypeById(stereoID); -+ if (m_pStereotype) { -+ m_pStereotype->incrRefCount(); -+ } else { -+ uDebug() << m_name << ": UMLStereotype " << Uml::ID::toString(stereoID) -+ << " not found, creating now."; -+ setStereotypeCmd(stereo); -+ } -+ } -+ -+ if (element.hasAttribute(QLatin1String("abstract"))) { // for bkwd compat. -+ QString abstract = element.attribute(QLatin1String("abstract"), QLatin1String("0")); -+ m_bAbstract = (bool)abstract.toInt(); -+ } else { -+ QString isAbstract = element.attribute(QLatin1String("isAbstract"), QLatin1String("false")); -+ m_bAbstract = (isAbstract == QLatin1String("true")); -+ } -+ -+ if (element.hasAttribute(QLatin1String("static"))) { // for bkwd compat. -+ QString staticScope = element.attribute(QLatin1String("static"), QLatin1String("0")); -+ m_bStatic = (bool)staticScope.toInt(); -+ } else { -+ QString ownerScope = element.attribute(QLatin1String("ownerScope"), QLatin1String("instance")); -+ m_bStatic = (ownerScope == QLatin1String("classifier")); -+ } -+ -+ // If the node has child nodes, check whether attributes can be -+ // extracted from them. -+ if (element.hasChildNodes()) { -+ QDomNode node = element.firstChild(); -+ if (node.isComment()) -+ node = node.nextSibling(); -+ QDomElement elem = node.toElement(); -+ while (!elem.isNull()) { -+ QString tag = elem.tagName(); -+ if (UMLDoc::tagEq(tag, QLatin1String("name"))) { -+ m_name = elem.attribute(QLatin1String("xmi.value")); -+ if (m_name.isEmpty()) -+ m_name = elem.text(); -+ } else if (UMLDoc::tagEq(tag, QLatin1String("visibility"))) { -+ QString vis = elem.attribute(QLatin1String("xmi.value")); -+ if (vis.isEmpty()) -+ vis = elem.text(); -+ if (vis == QLatin1String("private") || vis == QLatin1String("private_vis")) -+ m_visibility = Uml::Visibility::Private; -+ else if (vis == QLatin1String("protected") || vis == QLatin1String("protected_vis")) -+ m_visibility = Uml::Visibility::Protected; -+ else if (vis == QLatin1String("implementation")) -+ m_visibility = Uml::Visibility::Implementation; -+ } else if (UMLDoc::tagEq(tag, QLatin1String("isAbstract"))) { -+ QString isAbstract = elem.attribute(QLatin1String("xmi.value")); -+ if (isAbstract.isEmpty()) -+ isAbstract = elem.text(); -+ m_bAbstract = (isAbstract == QLatin1String("true")); -+ } else if (UMLDoc::tagEq(tag, QLatin1String("ownerScope"))) { -+ QString ownerScope = elem.attribute(QLatin1String("xmi.value")); -+ if (ownerScope.isEmpty()) -+ ownerScope = elem.text(); -+ m_bStatic = (ownerScope == QLatin1String("classifier")); -+ } else { -+ loadStereotype(elem); -+ } -+ node = node.nextSibling(); -+ if (node.isComment()) -+ node = node.nextSibling(); -+ elem = node.toElement(); -+ } -+ } -+ -+ // Operations, attributes, enum literals, templates, stereotypes, -+ // and association role objects get added and signaled elsewhere. -+ if (m_BaseType != ot_Operation && m_BaseType != ot_Attribute && -+ m_BaseType != ot_EnumLiteral && m_BaseType != ot_EntityAttribute && -+ m_BaseType != ot_Template && m_BaseType != ot_Stereotype && -+ m_BaseType != ot_Role && m_BaseType != ot_UniqueConstraint && -+ m_BaseType != ot_ForeignKeyConstraint && m_BaseType != ot_CheckConstraint) { -+ if (m_pUMLPackage) { -+ m_pUMLPackage->addObject(this); -+ } else if (umldoc->rootFolderType(this) == Uml::ModelType::N_MODELTYPES) { -+ // m_pUMLPackage is not set on the root folders. -+ uDebug() << m_name << ": m_pUMLPackage is not set"; -+ } -+ } -+ return load(element); -+} -+ -+/** -+ * Helper function for debug output. -+ * Returns the given enum value as string. -+ * @param ot ObjectType of which a string representation is wanted -+ * @return the ObjectType as string -+ */ -+QString UMLObject::toString(ObjectType ot) -+{ -+ return QLatin1String(ENUM_NAME(UMLObject, ObjectType, ot)); -+} -+ -+/** -+ * Returns the given object type value as localized string. -+ * @param ot ObjectType of which a string representation is wanted -+ * @return the ObjectType as localized string -+ */ -+QString UMLObject::toI18nString(ObjectType t) -+{ -+ QString name; -+ -+ switch (t) { -+ case UMLObject::ot_Actor: -+ name = i18n("Actor &name:"); -+ break; -+ case UMLObject::ot_Artifact: -+ name = i18n("Artifact &name:"); -+ break; -+ case UMLObject::ot_Class: -+ name = i18n("Class &name:"); -+ break; -+ case UMLObject::ot_Component: -+ name = i18n("Component &name:"); -+ break; -+ case UMLObject::ot_Datatype: -+ name = i18n("Datatype &name:"); -+ break; -+ case UMLObject::ot_Entity: -+ name = i18n("Entity &name:"); -+ break; -+ case UMLObject::ot_Enum: -+ name = i18n("Enum &name:"); -+ break; -+ case UMLObject::ot_Folder: -+ name = i18n("Folder &name:"); -+ break; -+ case UMLObject::ot_Interface: -+ name = i18n("Interface &name:"); -+ break; -+ case UMLObject::ot_Node: -+ name = i18n("Node &name:"); -+ break; -+ case UMLObject::ot_Package: -+ name = i18n("Package &name:"); -+ break; -+ case UMLObject::ot_Port: -+ name = i18n("Port &name:"); -+ break; -+ case UMLObject::ot_Stereotype: -+ name = i18n("Stereotype &name:"); -+ break; -+ case UMLObject::ot_UseCase: -+ name = i18n("Use case &name:"); -+ break; -+ default: -+ name = QLatin1String(" &name:"); -+ uWarning() << "unknown object type"; -+ break; -+ } -+ return name; -+} -+ -+/** -+ * Print UML Object to debug output stream, so it can be used like -+ * uDebug() << "This object shouldn't be here: " << illegalObject; -+ */ -+QDebug operator<<(QDebug out, const UMLObject& obj) -+{ -+ out.nospace() << "UMLObject: name= " << obj.name() -+ << ", type= " << UMLObject::toString(obj.m_BaseType); -+ return out.space(); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlobject.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlobject.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlobject.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlobject.h 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,198 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLOBJECT_H -+#define UMLOBJECT_H -+ -+#include "basictypes.h" -+#include "umlpackagelist.h" -+ -+//qt includes -+#include -+#include -+#include -+#include -+#include -+ -+class UMLStereotype; -+ -+/** -+ * This class is the non-graphical version of @ref UMLWidget. These are -+ * created and maintained in the class @ref UMLDoc. This class holds all -+ * the generic information needed for all UML objects. -+ * -+ * @ref clone needs to be implemented by each child class. -+ * -+ * @ref saveToXMI saves the XMI attributes of each specific model class. -+ * It needs to be implemented by each child class. -+ * For creating the QDomElement and saving the common XMI parts, -+ * it can use the save() method. -+ * -+ * @short The base class for UML objects. -+ * @author Paul Hensgen -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLObject : public QObject -+{ -+ Q_OBJECT -+ Q_ENUMS(ObjectType) -+ -+public: -+ enum ObjectType -+ { -+ ot_Unknown = -1, -+ ot_UMLObject = 100, -+ ot_Actor, -+ ot_UseCase, -+ ot_Package, -+ ot_Interface, -+ ot_Datatype, -+ ot_Enum, -+ ot_Class, -+ ot_Association, -+ ot_Attribute, -+ ot_Operation, -+ ot_EnumLiteral, -+ ot_Template, -+ ot_Component, -+ ot_Artifact, -+ ot_Node, -+ ot_Stereotype, -+ ot_Role, -+ ot_Entity, -+ ot_EntityAttribute, -+ ot_Folder, -+ ot_EntityConstraint, -+ ot_UniqueConstraint, -+ ot_ForeignKeyConstraint, -+ ot_CheckConstraint, -+ ot_Category, -+ ot_Port -+ }; -+ -+ static QString toString(ObjectType ot); -+ static QString toI18nString(ObjectType t); -+ -+ explicit UMLObject(const UMLObject& other); -+ explicit UMLObject(UMLObject* parent, const QString& name, Uml::ID::Type id = Uml::ID::None); -+ explicit UMLObject(UMLObject* parent); -+ explicit UMLObject(const QString& name = QString(), Uml::ID::Type id = Uml::ID::None); -+ virtual ~UMLObject(); -+ -+ bool operator==(const UMLObject & rhs) const; -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ virtual UMLObject* clone() const; -+ -+ virtual void setBaseType(ObjectType ot); -+ ObjectType baseType() const; -+ QLatin1String baseTypeStr() const; -+ -+ virtual void setID(Uml::ID::Type NewID); -+ virtual Uml::ID::Type id() const; -+ -+ QString doc() const; -+ bool hasDoc() const; -+ void setDoc(const QString &d); -+ -+ void setVisibility(Uml::Visibility::Enum visibility); -+ void setVisibilityCmd(Uml::Visibility::Enum visibility); -+ Uml::Visibility::Enum visibility() const; -+ -+ void setStereotype(const QString &_name); -+ void setStereotypeCmd(const QString &_name); -+ QString stereotype(bool includeAdornments = false) const; -+ -+ void setUMLStereotype(UMLStereotype *stereo); -+ UMLStereotype *umlStereotype(); -+ -+ QString package(const QString& separator = QString(), -+ bool includeRoot = false); -+ -+ bool setUMLPackage(UMLPackage* pPkg); -+ UMLPackage* umlPackage(); -+ -+ UMLPackageList packages(bool includeRoot = false) const; -+ -+ virtual void setName(const QString &strName); -+ void setNameCmd(const QString &strName) ; -+ QString name() const; -+ -+ virtual QString fullyQualifiedName(const QString& separator = QString(), -+ bool includeRoot = false) const; -+ -+ void setAbstract(bool bAbstract); -+ bool isAbstract() const; -+ -+ virtual bool showPropertiesDialog(QWidget* parent = 0); -+ -+ virtual bool resolveRef(); -+ -+ virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ virtual bool loadFromXMI(QDomElement & element); -+ -+ bool loadStereotype(QDomElement & element); -+ -+ void setStatic(bool bStatic); -+ bool isStatic() const; -+ -+ virtual bool acceptAssociationType(Uml::AssociationType::Enum); //:TODO: check if this is really needed here -+ -+ void setSecondaryId(const QString& id); -+ QString secondaryId() const; -+ -+ void setSecondaryFallback(const QString& id); -+ QString secondaryFallback() const; -+ -+ QDomElement save(const QString &tag, QDomDocument & qDoc); -+ -+ friend QDebug operator<< (QDebug out, const UMLObject& obj); -+ -+public slots: -+ void emitModified(); -+ -+signals: -+ void modified(); -+ -+protected: -+ void init(); -+ -+ void maybeSignalObjectCreated(); -+ -+ virtual bool load(QDomElement& element); -+ -+ Uml::ID::Type m_nId; ///< object's id -+ QString m_Doc; ///< object's documentation -+ UMLPackage* m_pUMLPackage; ///< package the object belongs to if applicable -+ QPointer m_pStereotype; ///< stereotype of the object if applicable -+ QString m_name; ///< objects name -+ ObjectType m_BaseType; ///< objects type -+ Uml::Visibility::Enum m_visibility; ///< objects visibility -+ bool m_bAbstract; ///< state of whether the object is abstract or not -+ bool m_bStatic; ///< flag for instance scope -+ bool m_bInPaste; ///< caller sets this true when in paste operation -+ bool m_bCreationWasSignalled; ///< auxiliary to maybeSignalObjectCreated() -+ QPointer m_pSecondary; ///< pointer to an associated object -+ ///< Only a few of the classes inheriting from UMLObject use this. -+ ///< However, it needs to be here because of inheritance graph -+ ///< disjunctness. -+ QString m_SecondaryId; ///< xmi.id of the secondary object for intermediate use during -+ ///< loading. The secondary ID is resolved to the m_pSecondary -+ ///< in the course of resolveRef() at the end of loading. -+ QString m_SecondaryFallback; ///< Last-chance backup for when m_SecondaryId is not found. -+ ///< Used by Rose import: MDL files specify both a "quidu" -+ ///< (which corresponds to m_SecondaryId) and the human readable -+ ///< fully qualified target name of a reference. -+ ///< In case the quidu is not found, the human readable name is -+ ///< used which we store in m_SecondaryFallback. -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlobjectlist.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/umlobjectlist.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlobjectlist.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlobjectlist.cpp 2015-10-08 11:48:59.507089026 +0300 -@@ -0,0 +1,53 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "umlobjectlist.h" -+#include "umlobject.h" -+ -+UMLObjectList::UMLObjectList() -+{ -+} -+ -+UMLObjectList::~UMLObjectList() -+{ -+} -+ -+/** -+ * Copy the internal presentation of this object into the new -+ * object. -+ */ -+void UMLObjectList::copyInto(UMLObjectList *rhs) const -+{ -+ // Don't copy yourself. -+ if (rhs == this) return; -+ -+ rhs->clear(); -+ -+ // Suffering from const; we shall not modify our object. -+ UMLObjectList *tmp = new UMLObjectList(*this); -+ -+ UMLObject *item = NULL; -+ for (UMLObjectListIt oit(*tmp); oit.hasNext() ;) -+ { -+ item = oit.next(); -+ rhs->append(item->clone()); -+ } -+ delete tmp; -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObjectList* UMLObjectList::clone() const -+{ -+ UMLObjectList *clone = new UMLObjectList(); -+ copyInto(clone); -+ return clone; -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlobjectlist.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlobjectlist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlobjectlist.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlobjectlist.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,40 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2001 Gustavo Madrigal gmadrigal@nextphere.com * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLOBJECTLIST_H -+#define UMLOBJECTLIST_H -+ -+#include -+#include -+ -+// forward declarations -+class UMLObject; -+ -+typedef QListIterator > -+UMLObjectListIt; -+ -+/** -+ * This sub-class adds copyInto and clone to the QList -+ * base class. -+ */ -+class UMLObjectList : public QList > -+{ -+public: -+ -+ UMLObjectList(); -+ virtual ~UMLObjectList(); -+ -+ virtual void copyInto(UMLObjectList *rhs) const; -+ -+ virtual UMLObjectList* clone() const; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umloperationlist.h umbrello-kf6-15.08.1/umbrello/umlmodel/umloperationlist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umloperationlist.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umloperationlist.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,23 @@ -+/*************************************************************************** -+ * * -+ * 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. * -+ * * -+ * copyright (C) 2003-2007 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLOPERATIONLIST_H -+#define UMLOPERATIONLIST_H -+ -+#include -+ -+// forward declaration -+class UMLOperation; -+ -+typedef QList UMLOperationList; -+typedef QListIterator UMLOperationListIt; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlpackagelist.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlpackagelist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlpackagelist.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlpackagelist.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,22 @@ -+/*************************************************************************** -+ * * -+ * 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. * -+ * * -+ * copyright (C) 2003-2007 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLPACKAGELIST_H -+#define UMLPACKAGELIST_H -+ -+#include -+ -+class UMLPackage; -+ -+typedef QList UMLPackageList; -+typedef QListIterator UMLPackageListIt; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlrole.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/umlrole.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlrole.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlrole.cpp 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,415 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "umlrole.h" -+ -+// local includes -+#include "association.h" -+#include "debug_utils.h" -+#include "umldoc.h" -+#include "umlroledialog.h" -+#include "uml.h" -+ -+// qt includes -+#include -+#include -+ -+/** -+ * Sets up an association. -+ * -+ * @param parent The parent (association) of this UMLRole. -+ * @param parentObj The Parent UML Object of this UMLRole -+ * @param role The Uml::RoleType::Enum of this UMLRole -+ */ -+UMLRole::UMLRole(UMLAssociation * parent, UMLObject * parentObj, Uml::RoleType::Enum role) -+ : UMLObject(const_cast(parent)), -+ m_pAssoc(parent), -+ m_role(role), -+ m_Multi(QString()), -+ m_Changeability(Uml::Changeability::Changeable) -+{ -+ m_BaseType = UMLObject::ot_Role; -+ m_name.clear(); -+ m_pSecondary = parentObj; -+ -+ // connect this up to parent -+ connect(this, SIGNAL(modified()), parent, SIGNAL(modified())); -+} -+ -+/** -+ * Standard destructor. -+ */ -+UMLRole::~UMLRole() -+{ -+} -+ -+/** -+ * Overloaded '==' operator. -+ */ -+bool UMLRole::operator==(const UMLRole &rhs) const -+{ -+ if (this == &rhs) { -+ return true; -+ } -+ return (UMLObject::operator==(rhs) && -+ m_Changeability == rhs.m_Changeability && -+ m_Multi == rhs.m_Multi && -+ m_name == rhs.m_name -+ ); -+} -+ -+UMLAssociation * UMLRole::parentAssociation() const -+{ -+ return m_pAssoc; -+} -+ -+/** -+ * Returns the UMLObject assigned to the role. -+ * @return Pointer to the UMLObject in role. -+ */ -+UMLObject* UMLRole::object() const -+{ -+ return m_pSecondary; -+} -+ -+/** -+ * Returns the Changeablity of the role. -+ * -+ * @return Changeability of role. -+ */ -+Uml::Changeability::Enum UMLRole::changeability() const -+{ -+ return m_Changeability; -+} -+ -+/** -+ * Returns the multiplicity assigned to the role. -+ * -+ * @return The multiplicity assigned to the role. -+ */ -+QString UMLRole::multiplicity() const -+{ -+ return m_Multi; -+} -+ -+/** -+ * Sets the UMLObject playing the role in the association. -+ * -+ * @param obj Pointer to the UMLObject of role. -+ */ -+void UMLRole::setObject(UMLObject *obj) -+{ -+ // because we will get the id of this role from the parent -+ // object, we CANT allow UMLRoles to take other UMLRoles as -+ // parent objects. In fact, there is probably good reason -+ // to only take UMLClassifiers here, but I'll leave it more open -+ // for the time being. -b.t. -+ if (obj && dynamic_cast(obj)) { -+ uError() << "UMLRole(" << Uml::ID::toString(m_nId) << ") cannot setObject() to another UMLRole(" -+ << Uml::ID::toString(obj->id()) << ")"; -+ return; -+ } -+ -+ m_pSecondary = obj; -+ UMLObject::emitModified(); -+} -+ -+/** -+ * Sets the changeability of the role. -+ * -+ * @param value Changeability::Enum of role. -+ */ -+void UMLRole::setChangeability(Uml::Changeability::Enum value) -+{ -+ m_Changeability = value; -+ UMLObject::emitModified(); -+} -+ -+/** -+ * Sets the multiplicity of the role. -+ * -+ * @param multi The multiplicity of role. -+ */ -+void UMLRole::setMultiplicity(const QString &multi) -+{ -+ m_Multi = multi; -+ UMLObject::emitModified(); -+} -+ -+/** -+ * Get the 'id' of the role (NOT the parent object). This could be -+ * either Uml::RoleType::A or Uml::RoleType::B. Yes, it would be better if we -+ * could get along without this, but we need it to distinguish saved -+ * umlrole objects in the XMI for 'self' associations where both roles -+ * will point to the same underlying UMLObject. -+ */ -+Uml::RoleType::Enum UMLRole::role() const -+{ -+ return m_role; -+} -+ -+/** -+ * Creates the XMI element. -+ */ -+void UMLRole::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement roleElement = UMLObject::save(QLatin1String("UML:AssociationEnd"), qDoc); -+ if (m_pSecondary) -+ roleElement.setAttribute(QLatin1String("type"), Uml::ID::toString(m_pSecondary->id())); -+ else -+ uError() << "id " << Uml::ID::toString(m_nId) << ": m_pSecondary is NULL"; -+ if (!m_Multi.isEmpty()) -+ roleElement.setAttribute(QLatin1String("multiplicity"), m_Multi); -+ if (m_role == Uml::RoleType::A) { // role aggregation based on parent type -+ // role A -+ switch (m_pAssoc->getAssocType()) { -+ case Uml::AssociationType::Composition: -+ roleElement.setAttribute(QLatin1String("aggregation"), QLatin1String("composite")); -+ break; -+ case Uml::AssociationType::Aggregation: -+ roleElement.setAttribute(QLatin1String("aggregation"), QLatin1String("aggregate")); -+ break; -+ default: -+ roleElement.setAttribute(QLatin1String("aggregation"), QLatin1String("none")); -+ break; -+ } -+ if (m_pAssoc->getAssocType() == Uml::AssociationType::UniAssociation) { -+ // Normally the isNavigable attribute is "true". -+ // We set it to false on role A to indicate that -+ // role B gets an explicit arrowhead. -+ roleElement.setAttribute(QLatin1String("isNavigable"), QLatin1String("false")); -+ } else { -+ roleElement.setAttribute(QLatin1String("isNavigable"), QLatin1String("true")); -+ } -+ } else { -+ roleElement.setAttribute(QLatin1String("aggregation"), QLatin1String("none")); -+ roleElement.setAttribute(QLatin1String("isNavigable"), QLatin1String("true")); -+ //FIXME obviously this isn't standard XMI -+ if (m_pAssoc->getAssocType() == Uml::AssociationType::Relationship) { -+ roleElement.setAttribute(QLatin1String("relationship"), QLatin1String("true")); -+ } -+ } -+ -+ roleElement.setAttribute(QLatin1String("visibility"), Uml::Visibility::toString(visibility(), false)); -+ -+ switch (m_Changeability) { -+ case Uml::Changeability::Frozen: -+ roleElement.setAttribute(QLatin1String("changeability"), QLatin1String("frozen")); -+ break; -+ case Uml::Changeability::AddOnly: -+ roleElement.setAttribute(QLatin1String("changeability"), QLatin1String("addOnly")); -+ break; -+ case Uml::Changeability::Changeable: -+ roleElement.setAttribute(QLatin1String("changeability"), QLatin1String("changeable")); -+ break; -+ } -+ qElement.appendChild(roleElement); -+} -+ -+/** -+ * Display the properties configuration dialog for the object. -+ * -+ * @param parent The parent widget. -+ * @return True for success of this operation. -+ */ -+bool UMLRole::showPropertiesDialog(QWidget *parent) -+{ -+ QPointer dlg = new UMLRoleDialog(parent, this); -+ bool modified = false; -+ if (dlg->exec() == QDialog::Accepted) { -+ modified = true; -+ } -+ delete dlg; -+ return modified; -+} -+ -+/** -+ * Loads the XMI element. -+ * Auxiliary to UMLObject::loadFromXMI. -+ */ -+bool UMLRole::load(QDomElement & element) -+{ -+ UMLDoc * doc = UMLApp::app()->document(); -+ QString type = element.attribute(QLatin1String("type")); -+ if (!type.isEmpty()) { -+ if (!m_SecondaryId.isEmpty()) -+ uWarning() << "overwriting old m_SecondaryId \"" << m_SecondaryId -+ << " with new value \"" << type << "\""; -+ m_SecondaryId = type; -+ } -+ // Inspect child nodes - for multiplicity (and type if not set above.) -+ for (QDomNode node = element.firstChild(); !node.isNull(); node = node.nextSibling()) { -+ if (node.isComment()) -+ continue; -+ QDomElement tempElement = node.toElement(); -+ QString tag = tempElement.tagName(); -+ if (UMLDoc::tagEq(tag, QLatin1String("name"))) { -+ m_name = tempElement.text(); -+ } else if (UMLDoc::tagEq(tag, QLatin1String("AssociationEnd.multiplicity"))) { -+ /* -+ * There are different ways in which the multiplicity might be given: -+ * - direct value in the tag, -+ * - attributes "lower" and "upper" of a subordinate , -+ * - direct value in subordinate and -+ * tags -+ */ -+ QDomNode n = tempElement.firstChild(); -+ if (node.isNull() || tempElement.isNull() || n.isNull() || -+ n.toElement().isNull()) { -+ m_Multi = tempElement.text().trimmed(); -+ continue; -+ } -+ tempElement = n.toElement(); -+ tag = tempElement.tagName(); -+ if (!UMLDoc::tagEq(tag, QLatin1String("Multiplicity"))) { -+ m_Multi = tempElement.text().trimmed(); -+ continue; -+ } -+ n = tempElement.firstChild(); -+ tempElement = n.toElement(); -+ tag = tempElement.tagName(); -+ if (!UMLDoc::tagEq(tag, QLatin1String("Multiplicity.range"))) { -+ m_Multi = tempElement.text().trimmed(); -+ continue; -+ } -+ n = tempElement.firstChild(); -+ tempElement = n.toElement(); -+ tag = tempElement.tagName(); -+ if (!UMLDoc::tagEq(tag, QLatin1String("MultiplicityRange"))) { -+ m_Multi = tempElement.text().trimmed(); -+ continue; -+ } -+ QString multiUpper; -+ if (tempElement.hasAttribute(QLatin1String("lower"))) { -+ m_Multi = tempElement.attribute(QLatin1String("lower")); -+ multiUpper = tempElement.attribute(QLatin1String("upper")); -+ if (!multiUpper.isEmpty()) { -+ if (!m_Multi.isEmpty()) -+ m_Multi.append(QLatin1String("..")); -+ m_Multi.append(multiUpper); -+ } -+ continue; -+ } -+ n = tempElement.firstChild(); -+ while (!n.isNull()) { -+ tempElement = n.toElement(); -+ tag = tempElement.tagName(); -+ if (UMLDoc::tagEq(tag, QLatin1String("MultiplicityRange.lower"))) { -+ m_Multi = tempElement.text(); -+ } else if (UMLDoc::tagEq(tag, QLatin1String("MultiplicityRange.upper"))) { -+ multiUpper = tempElement.text(); -+ } -+ n = n.nextSibling(); -+ } -+ if (!multiUpper.isEmpty()) { -+ if (!m_Multi.isEmpty()) -+ m_Multi.append(QLatin1String("..")); -+ m_Multi.append(multiUpper); -+ } -+ } else if (m_SecondaryId.isEmpty() && -+ (UMLDoc::tagEq(tag, QLatin1String("type")) || -+ UMLDoc::tagEq(tag, QLatin1String("participant")))) { -+ m_SecondaryId = tempElement.attribute(QLatin1String("xmi.id")); -+ if (m_SecondaryId.isEmpty()) -+ m_SecondaryId = tempElement.attribute(QLatin1String("xmi.idref")); -+ if (m_SecondaryId.isEmpty()) { -+ QDomNode inner = tempElement.firstChild(); -+ QDomElement innerElem = inner.toElement(); -+ m_SecondaryId = innerElem.attribute(QLatin1String("xmi.id")); -+ if (m_SecondaryId.isEmpty()) -+ m_SecondaryId = innerElem.attribute(QLatin1String("xmi.idref")); -+ } -+ } -+ } -+ if (!m_Multi.isEmpty()) -+ uDebug() << name() << ": m_Multi is " << m_Multi; -+ if (m_SecondaryId.isEmpty()) { -+ uError() << name() << ": type not given or illegal"; -+ return false; -+ } -+ UMLObject * obj; -+ obj = doc->findObjectById(Uml::ID::fromString(m_SecondaryId)); -+ if (obj) { -+ m_pSecondary = obj; -+ m_SecondaryId = QString(); -+ } -+ -+ // block signals to prevent needless updating -+ blockSignals(true); -+ // Here comes the handling of the association type. -+ // This is open for discussion - I'm pretty sure there are better ways.. -+ -+ // Yeah, for one, setting the *parent* object parameters from here is sucky -+ // as hell. Why are we using roleA to store what is essentially a parent (association) -+ // parameter, eh? The UML13.dtd is pretty silly, but since that is what -+ // is driving us to that point, we have to go with it. Some analysis of -+ // the component roles/linked items needs to be done in order to get things -+ // right. *sigh* -b.t. -+ -+ // Setting association type from the role (A) -+ // Determination of the "aggregation" attribute used to be done only -+ // when (m_role == Uml::RoleType::A) but some XMI writers (e.g. StarUML) place -+ // the aggregation attribute at role B. -+ // The role end with the aggregation unequal to "none" wins. -+ QString aggregation = element.attribute(QLatin1String("aggregation"), QLatin1String("none")); -+ if (aggregation == QLatin1String("composite")) -+ m_pAssoc->setAssociationType(Uml::AssociationType::Composition); -+ else if (aggregation == QLatin1String("shared") // UML1.3 -+ || aggregation == QLatin1String("aggregate")) // UML1.4 -+ m_pAssoc->setAssociationType(Uml::AssociationType::Aggregation); -+ -+ if (!element.hasAttribute(QLatin1String("isNavigable"))) { -+ // Backward compatibility mode: In umbrello-kf6 version 1.3.x the -+ // logic for saving the isNavigable flag was wrong. -+ // May happen on loading role A. -+ m_pAssoc->setOldLoadMode(true); -+ } else if (m_pAssoc->getOldLoadMode() == true) { -+ // Here is the original logic: -+ // "Role B: -+ // If isNavigable is not given, we make no change to the -+ // association type. -+ // If isNavigable is given, and is "true", then we assume that -+ // the association's other end (role A) is not navigable, and -+ // therefore we change the association type to UniAssociation. -+ // The case that isNavigable is given as "false" is ignored. -+ // Combined with the association type logic for role A, this -+ // allows us to support at_Association and at_UniAssociation." -+ if (element.attribute(QLatin1String("isNavigable")) == QLatin1String("true")) -+ m_pAssoc->setAssociationType(Uml::AssociationType::UniAssociation); -+ } else if (element.attribute(QLatin1String("isNavigable")) == QLatin1String("false")) { -+ m_pAssoc->setAssociationType(Uml::AssociationType::UniAssociation); -+ } -+ -+ //FIXME not standard XMI -+ if (element.hasAttribute(QLatin1String("relationship"))) { -+ if (element.attribute(QLatin1String("relationship")) == QLatin1String("true")) { -+ m_pAssoc->setAssociationType(Uml::AssociationType::Relationship); -+ } -+ } -+ -+ if (m_Multi.isEmpty()) -+ m_Multi = element.attribute(QLatin1String("multiplicity")); -+ -+ // Changeability defaults to Changeable if it cant set it here.. -+ m_Changeability = Uml::Changeability::Changeable; -+ QString changeability = element.attribute(QLatin1String("changeability")); -+ if (changeability.isEmpty()) -+ element.attribute(QLatin1String("changeable")); // for backward compatibility -+ if (changeability == QLatin1String("frozen")) -+ m_Changeability = Uml::Changeability::Frozen; -+ else if (changeability == QLatin1String("addOnly")) -+ m_Changeability = Uml::Changeability::AddOnly; -+ -+ // finished config, now unblock -+ blockSignals(false); -+ return true; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlrole.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlrole.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlrole.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlrole.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,65 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLROLE_H -+#define UMLROLE_H -+ -+#include "umlobject.h" -+ -+class UMLAssociation; -+ -+/** -+ * This class contains the non-graphic representation of an association role. -+ * -+ * @author Brian Thomas -+ * @see UMLObject -+ */ -+class UMLRole : public UMLObject -+{ -+ Q_OBJECT -+public: -+ -+ UMLRole(UMLAssociation * parent, UMLObject * parentUMLObject, Uml::RoleType::Enum role); -+ virtual ~UMLRole(); -+ -+ bool operator==(const UMLRole & rhs) const; -+ -+ void setObject(UMLObject *obj); -+ UMLObject* object() const; -+ -+ void setChangeability(Uml::Changeability::Enum value); -+ Uml::Changeability::Enum changeability() const; -+ -+ void setMultiplicity(const QString &multi); -+ QString multiplicity() const; -+ -+ UMLAssociation * parentAssociation() const; -+ -+ Uml::RoleType::Enum role() const; -+ -+ UMLObject* clone() const { return NULL; } -+ -+ void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+ virtual bool showPropertiesDialog(QWidget *parent = 0); -+ -+protected: -+ -+ bool load(QDomElement& element); -+ -+private: -+ -+ UMLAssociation * m_pAssoc; -+ Uml::RoleType::Enum m_role; -+ QString m_Multi; -+ Uml::Changeability::Enum m_Changeability; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlstereotypelist.h umbrello-kf6-15.08.1/umbrello/umlmodel/umlstereotypelist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umlstereotypelist.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umlstereotypelist.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,22 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2012 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLSTEREOTYPELIST_H -+#define UMLSTEREOTYPELIST_H -+ -+#include -+ -+// forward declaration -+class UMLStereotype; -+ -+typedef QList UMLStereotypeList; -+typedef QListIterator UMLStereotypeListIt; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umltemplatelist.h umbrello-kf6-15.08.1/umbrello/umlmodel/umltemplatelist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/umltemplatelist.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/umltemplatelist.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,23 @@ -+/*************************************************************************** -+ * * -+ * 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. * -+ * * -+ * copyright (C) 2004-2007 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLTEMPLATELIST_H -+#define UMLTEMPLATELIST_H -+ -+#include -+ -+// forward declaration -+class UMLTemplate; -+ -+typedef QList UMLTemplateList; -+typedef QListIterator UMLTemplateListIt; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/uniqueconstraint.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/uniqueconstraint.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/uniqueconstraint.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/uniqueconstraint.cpp 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,325 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+//own header -+#include "uniqueconstraint.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "entity.h" -+#include "entityattribute.h" -+#include "umldoc.h" -+#include "uml.h" -+#include "umlattributedialog.h" -+#include "umluniqueconstraintdialog.h" -+#include "object_factory.h" -+ -+/** -+ * Sets up a constraint. -+ * -+ * @param parent The parent of this UMLUniqueConstraint. -+ * @param name The name of this UMLUniqueConstraint. -+ * @param id The unique id given to this UMLUniqueConstraint. -+ */ -+UMLUniqueConstraint::UMLUniqueConstraint(UMLObject *parent, const QString& name, Uml::ID::Type id) -+ : UMLEntityConstraint(parent, name, id) -+{ -+ init(); -+} -+ -+/** -+ * Sets up a constraint. -+ * -+ * @param parent The parent of this UMLUniqueConstraint. -+ */ -+UMLUniqueConstraint::UMLUniqueConstraint(UMLObject *parent) -+ : UMLEntityConstraint(parent) -+{ -+ init(); -+} -+ -+/** -+ * Overloaded '==' operator -+ */ -+bool UMLUniqueConstraint::operator==(const UMLUniqueConstraint &rhs) const -+{ -+ if(this == &rhs) -+ return true; -+ -+ if(!UMLObject::operator==(rhs)) -+ return false; -+ -+ return true; -+} -+ -+/** -+ * Destructor. -+ */ -+UMLUniqueConstraint::~UMLUniqueConstraint() -+{ -+} -+ -+/** -+ * Copy the internal presentation of this object into the UMLUniqueConstraint -+ * object. -+ */ -+void UMLUniqueConstraint::copyInto(UMLObject *lhs) const -+{ -+ UMLUniqueConstraint *target = static_cast(lhs); -+ -+ // call the parent first. -+ UMLEntityConstraint::copyInto(target); -+ -+ // Copy all datamembers -+ target->m_EntityAttributeList.clear(); -+ bool valid = true; -+ foreach(UMLEntityAttribute* attr, m_EntityAttributeList) { -+ if (!valid) -+ break; -+ valid = target->addEntityAttribute(attr); -+ } -+ -+ if (!valid) { -+ target->m_EntityAttributeList.clear(); -+ uDebug() <<"Copying Attributes Failed : Target list cleared instead"; -+ } -+} -+ -+/** -+ * Make a clone of the UMLUniqueConstraint. -+ */ -+UMLObject* UMLUniqueConstraint::clone() const -+{ -+ //FIXME: The new attribute should be slaved to the NEW parent not the old. -+ UMLUniqueConstraint *clone = new UMLUniqueConstraint(static_cast(parent())); -+ copyInto(clone); -+ return clone; -+} -+ -+/** -+ * Returns a string representation of the UMLUniqueConstraint. -+ * -+ * @param sig If true will show the attribute type and initial value. -+ * @return Returns a string representation of the UMLAttribute. -+ */ -+QString UMLUniqueConstraint::toString(Uml::SignatureType::Enum sig) -+{ -+ QString s; -+ -+ if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::SigNoVis) { -+ s = name() + QLatin1Char(':'); -+ -+ if (static_cast(parent())->isPrimaryKey(this)) { -+ s += QLatin1String("Primary Key ("); -+ } else { -+ s += QLatin1String("Unique ("); -+ } -+ -+ bool first = true; -+ foreach(UMLEntityAttribute* att, m_EntityAttributeList) { -+ if (first) { -+ first = false; -+ } else -+ s += QLatin1Char(','); -+ s += att->name(); -+ } -+ s += QLatin1Char(')') ; -+ } -+ -+ return s; -+} -+ -+QString UMLUniqueConstraint::getFullyQualifiedName(const QString& separator, -+ bool includeRoot) const -+{ -+ Q_UNUSED(separator); Q_UNUSED(includeRoot); -+ return this->name(); -+} -+ -+/** -+ * Creates the XMI element. -+ */ -+void UMLUniqueConstraint::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement uniqueConstraintElement = UMLObject::save(QLatin1String("UML:UniqueConstraint"), qDoc); -+ -+ UMLEntity* parentEnt = static_cast(parent()); -+ if (parentEnt->isPrimaryKey(this)) { -+ uniqueConstraintElement.setAttribute(QLatin1String("isPrimary"), QLatin1String("1")); -+ } else { -+ uniqueConstraintElement.setAttribute(QLatin1String("isPrimary"), QLatin1String("0")); -+ } -+ -+ foreach(UMLEntityAttribute* att, m_EntityAttributeList) { -+ att->saveToXMI(qDoc, uniqueConstraintElement); -+ } -+ -+ qElement.appendChild(uniqueConstraintElement); -+} -+ -+/** -+ * Display the properties configuration dialog for the attribute. -+ */ -+bool UMLUniqueConstraint::showPropertiesDialog(QWidget* parent) -+{ -+ UMLUniqueConstraintDialog dialog(parent, this); -+ return dialog.exec(); -+} -+ -+/** -+ * Loads the XMI element. -+ */ -+bool UMLUniqueConstraint::load(QDomElement & element) -+{ -+ int isPrimary = element.attribute(QLatin1String("isPrimary"), QLatin1String("0")).toInt(); -+ UMLEntity* parentEnt = static_cast(parent()); -+ -+ if (isPrimary == 1) { -+ parentEnt->setAsPrimaryKey(this); -+ } -+ -+ QDomNode node = element.firstChild(); -+ while (!node.isNull()) { -+ if (node.isComment()) { -+ node = node.nextSibling(); -+ continue; -+ } -+ QDomElement tempElement = node.toElement(); -+ QString tag = tempElement.tagName(); -+ if (UMLDoc::tagEq(tag, QLatin1String("EntityAttribute"))) { -+ -+ QString attName = tempElement.attribute(QLatin1String("name")); -+ UMLObject* obj = parentEnt->findChildObject(attName); -+ -+ UMLEntityAttribute* entAtt = static_cast(obj); -+ if (entAtt == NULL) -+ continue; -+ -+ m_EntityAttributeList.append(entAtt); -+ -+ } else { -+ uWarning() << "unknown child type in UMLUniqueConstraint::load"; -+ } -+ -+ node = node.nextSibling(); -+ } -+ -+ return true; -+} -+ -+ -+/** -+ * Check if a entity attribute is present in m_entityAttributeList -+ * -+ * @param attr The Entity Attribute to check for existence in list -+ * @return true if it exists in the list, else false -+ */ -+bool UMLUniqueConstraint::hasEntityAttribute(UMLEntityAttribute* attr) -+{ -+ if (m_EntityAttributeList.indexOf(attr) == -1) { -+ //not present -+ return false; -+ } -+ -+ // else present -+ return true; -+} -+ -+/** -+ * Adds a UMLEntityAttribute to the list. -+ * The UMLEntityAttribute should already exist and should -+ * belong to the parent UMLEntity. -+ * -+ * @param attr The UMLEntityAttribute to add -+ * @return false if it failed to add, else true -+ */ -+bool UMLUniqueConstraint::addEntityAttribute(UMLEntityAttribute* attr) -+{ -+ UMLEntity *owningParent = dynamic_cast(parent()); -+ -+ if (hasEntityAttribute(attr)) { -+ uDebug() << "Unique Constraint already contains" << attr->name(); -+ return false; -+ -+ } -+ if (owningParent == NULL) { -+ uError() << name() << ": parent is not a UMLEntity"; -+ return false; -+ } -+ -+ if (owningParent->findChildObjectById(attr->id()) == NULL) { -+ uError() -+ << " parent " << owningParent->name() -+ << " does not contain attribute " << attr->name(); -+ return false; -+ } -+ -+ //else add the attribute to the Entity Attribute List -+ m_EntityAttributeList.append(attr); -+ -+ return true; -+} -+ -+/** -+ * Removes a UMLEntityAttribute from the list -+ * -+ * @param attr The UMLEntityAttribute to remove from list -+ * @return false if it failed to remove the attribute from the list -+ */ -+bool UMLUniqueConstraint::removeEntityAttribute(UMLEntityAttribute* attr) -+{ -+ UMLEntity *owningParent = dynamic_cast(parent()); -+ -+ if (owningParent == NULL) { -+ uError() << name() << ": parent is not a UMLEntity"; -+ return false; -+ } -+ -+ /* -+ * The attribute may already be removed from the Entity when this function -+ * is called. So checking this is not right -+ * -+ * if (owningParent->findChildObjectById(attr->ID()) == NULL) { -+ * uError() -+ * << " parent " << owningParent->getName() -+ * << " does not contain attribute " << attr->getName(); -+ * return false; -+ * } -+ */ -+ -+ //else remove the attribute from the Entity Attribute List -+ if (m_EntityAttributeList.removeAll(attr)) { -+ return true; -+ } -+ -+ return false; -+} -+ -+/** -+ * Get the Entity Attributes List. -+ */ -+UMLEntityAttributeList UMLUniqueConstraint::getEntityAttributeList() const -+{ -+ return m_EntityAttributeList; -+} -+ -+void UMLUniqueConstraint::init() -+{ -+ m_BaseType = UMLObject::ot_UniqueConstraint; -+} -+ -+/** -+ * Clear the list of attributes contained in this UniqueConstraint -+ */ -+void UMLUniqueConstraint::clearAttributeList() -+{ -+ m_EntityAttributeList.clear(); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/uniqueconstraint.h umbrello-kf6-15.08.1/umbrello/umlmodel/uniqueconstraint.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/uniqueconstraint.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/uniqueconstraint.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,77 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UNIQUECONSTRAINT_H -+#define UNIQUECONSTRAINT_H -+ -+#include "basictypes.h" -+#include "classifierlistitem.h" -+#include "entityconstraint.h" -+#include "umlclassifierlist.h" -+#include "umlentityattributelist.h" -+ -+/** -+ * This class is used to set up information for a unique entity constraint. -+ * -+ * @short Sets up Unique entity constraint information. -+ * @author Sharan Rao -+ * @see UMLObject UMLClassifierListItem UMLEntityConstraint -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLUniqueConstraint : public UMLEntityConstraint -+{ -+public: -+ -+ UMLUniqueConstraint(UMLObject *parent, const QString& name, -+ Uml::ID::Type id = Uml::ID::None); -+ explicit UMLUniqueConstraint(UMLObject *parent); -+ virtual ~UMLUniqueConstraint(); -+ -+ bool operator==(const UMLUniqueConstraint &rhs) const; -+ -+ virtual void copyInto(UMLObject *lhs) const; -+ -+ virtual UMLObject* clone() const; -+ -+ QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -+ -+ QString getFullyQualifiedName(const QString& separator = QString(), -+ bool includeRoot = false) const; -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+ virtual bool showPropertiesDialog(QWidget* parent = 0); -+ -+ bool hasEntityAttribute(UMLEntityAttribute* attr); -+ -+ bool addEntityAttribute(UMLEntityAttribute* attr); -+ -+ bool removeEntityAttribute(UMLEntityAttribute* attr); -+ -+ UMLEntityAttributeList getEntityAttributeList() const; -+ -+ void clearAttributeList(); -+ -+protected: -+ -+ bool load(QDomElement & element); -+ -+private: -+ -+ void init(); -+ -+ /** -+ * The list of entity attributes that together make up the unique constraint. -+ */ -+ UMLEntityAttributeList m_EntityAttributeList; -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/usecase.cpp umbrello-kf6-15.08.1/umbrello/umlmodel/usecase.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/usecase.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/usecase.cpp 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,67 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "usecase.h" -+ -+/** -+ * Creates a UseCase object -+ * -+ * @param name The name of the object. -+ * @param id The id of the object. -+ */ -+UMLUseCase::UMLUseCase(const QString & name, Uml::ID::Type id) -+ : UMLCanvasObject(name, id) -+{ -+ init(); -+} -+ -+/** -+ * Standard decstructor. -+ */ -+UMLUseCase::~UMLUseCase() -+{ -+} -+ -+/** -+ * Initializes key variables of the class. -+ */ -+void UMLUseCase::init() -+{ -+ m_BaseType = UMLObject::ot_UseCase; -+} -+ -+/** -+ * Make a clone of this object. -+ */ -+UMLObject* UMLUseCase::clone() const -+{ -+ UMLUseCase *clone = new UMLUseCase(); -+ UMLObject::copyInto(clone); -+ return clone; -+} -+ -+/** -+ * Creates the element. -+ */ -+void UMLUseCase::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement usecaseElement = UMLObject::save(QLatin1String("UML:UseCase"), qDoc); -+ qElement.appendChild(usecaseElement); -+} -+ -+/** -+ * Loads the element (TODO). -+ */ -+bool UMLUseCase::load(QDomElement&) -+{ -+ return true; -+} -+ -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlmodel/usecase.h umbrello-kf6-15.08.1/umbrello/umlmodel/usecase.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlmodel/usecase.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlmodel/usecase.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,40 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef USECASE_H -+#define USECASE_H -+ -+#include "umlcanvasobject.h" -+ -+/** -+ * This class contains the non-graphical information required for a UML UseCase. -+ * This class inherits from @ref UMLCanvasObject which contains most of the information. -+ * -+ * @short Information for a non-graphical UML UseCase. -+ * @author Paul Hensgen -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLUseCase : public UMLCanvasObject -+{ -+public: -+ explicit UMLUseCase(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -+ ~UMLUseCase(); -+ -+ virtual void init(); -+ -+ virtual UMLObject* clone() const; -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+protected: -+ bool load(QDomElement & element); -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlobject.cpp umbrello-kf6-15.08.1/umbrello/umlobject.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlobject.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlobject.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,1142 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "umlobject.h" -- --// app includes --#include "classpropertiesdialog.h" --#include "debug_utils.h" --#include "enumliteral.h" --#include "uniqueid.h" --#include "uml.h" --#include "umldoc.h" --#include "umllistview.h" --#include "package.h" --#include "folder.h" --#include "stereotype.h" --#include "object_factory.h" --#include "model_utils.h" --#include "import_utils.h" --#include "docwindow.h" --#include "cmds.h" -- --// kde includes --#include -- --// qt includes --#include --#include -- --using namespace Uml; -- --DEBUG_REGISTER_DISABLED(UMLObject) -- --/** -- * Creates a UMLObject. -- * @param other object to created from -- */ --UMLObject::UMLObject(const UMLObject &other) -- : QObject(other.parent()) --{ -- other.copyInto(this); --} -- --/** -- * Creates a UMLObject. -- * @param parent The parent of the object. -- * @param name The name of the object. -- * @param id The ID of the object (optional.) If omitted -- * then a new ID will be assigned internally. -- */ --UMLObject::UMLObject(UMLObject* parent, const QString& name, ID::Type id) -- : QObject(parent), -- m_nId(id), -- m_name(name) --{ -- init(); -- if (id == Uml::ID::None) -- m_nId = UniqueID::gen(); --} -- --/** -- * Creates a UMLObject. -- * @param name The name of the object. -- * @param id The ID of the object (optional.) If omitted -- * then a new ID will be assigned internally. -- */ --UMLObject::UMLObject(const QString& name, ID::Type id) -- : QObject(UMLApp::app()->document()), -- m_nId(id), -- m_name(name) --{ -- init(); -- if (id == Uml::ID::None) -- m_nId = UniqueID::gen(); --} -- --/** -- * Creates a UMLObject. -- * @param parent The parent of the object. -- */ --UMLObject::UMLObject(UMLObject * parent) -- : QObject(parent), -- m_nId(Uml::ID::None), -- m_name(QString()) --{ -- init(); --} -- --/** -- * Standard destructor. -- */ --UMLObject::~UMLObject() --{ --} -- --/** -- * Initializes key variables of the class. -- */ --void UMLObject::init() --{ -- setObjectName(QLatin1String("UMLObject")); -- m_BaseType = ot_UMLObject; -- m_pUMLPackage = 0; -- m_visibility = Uml::Visibility::Public; -- m_pStereotype = 0; -- m_Doc.clear(); -- m_bAbstract = false; -- m_bStatic = false; -- m_bCreationWasSignalled = false; -- m_pSecondary = 0; --} -- --/** -- * Display the properties configuration dialog for the object. -- * -- * @param parent The parent widget. -- * @return True for success of this operation. -- */ --bool UMLObject::showPropertiesDialog(QWidget *parent) --{ -- DocWindow *docwindow = UMLApp::app()->docWindow(); -- docwindow->updateDocumentation(false); -- QPointer dlg = new ClassPropertiesDialog(parent, this, false); -- bool modified = false; -- if (dlg->exec()) { -- docwindow->showDocumentation(this, true); -- UMLApp::app()->document()->setModified(true); -- modified = true; -- } -- dlg->close(); -- delete dlg; -- return modified; --} -- --/** -- * This should be reimplemented by subclasses if they wish to -- * accept certain types of associations. Note that this only -- * tells if this UMLObject can accept the association -- * type. When creating an association another check is made to -- * see if the association is valid. For example a UMLClass -- * (UMLClassifier) can accept generalizations and should -- * return true. If while creating a generalization the -- * superclass is already subclassed from this, the association -- * is not valid and will not be created. The default accepts -- * nothing (returns false) -- */ --bool UMLObject::acceptAssociationType(Uml::AssociationType::Enum type) --{ -- Q_UNUSED(type); -- // A UMLObject accepts nothing. This should be reimplemented by the subclasses -- return false; --} -- --/** -- * Assigns a new Id to the object -- */ --void UMLObject::setID(ID::Type NewID) --{ -- m_nId = NewID; -- emitModified(); --} -- --/** -- * Set the UMLObject's name -- */ --void UMLObject::setName(const QString &strName) --{ -- if (name() != strName) { -- UMLApp::app()->executeCommand(new Uml::CmdRenameUMLObject(this, strName)); -- } --} -- --/** -- * Method used by setName: it is called by cmdSetName, Don't use it! -- */ --void UMLObject::setNameCmd(const QString &strName) --{ -- m_name = strName; -- emitModified(); --} -- --/** -- * Returns a copy of m_name -- */ --QString UMLObject::name() const --{ -- return m_name; --} -- --/** -- * Returns the fully qualified name, i.e. all package prefixes and then m_name. -- * -- * @param separator The separator string to use (optional.) -- * If not given then the separator is chosen according -- * to the currently selected active programming language -- * of import and code generation. -- * @param includeRoot Whether to prefix the root folder name to the FQN. -- * See UMLDoc::getRootFolder(). Default: false. -- * @return The fully qualified name of this UMLObject. -- */ --QString UMLObject::fullyQualifiedName(const QString& separator, -- bool includeRoot /* = false */) const --{ -- QString fqn; -- if (m_pUMLPackage && m_pUMLPackage != this) { -- bool skipPackage = false; -- if (!includeRoot) { -- UMLDoc *umldoc = UMLApp::app()->document(); -- if (umldoc->rootFolderType(m_pUMLPackage) != Uml::ModelType::N_MODELTYPES || -- m_pUMLPackage == umldoc->datatypeFolder()) -- skipPackage = true; -- } -- if (!skipPackage) { -- QString tempSeparator = separator; -- if (tempSeparator.isEmpty()) -- tempSeparator = UMLApp::app()->activeLanguageScopeSeparator(); -- fqn = m_pUMLPackage->fullyQualifiedName(tempSeparator, includeRoot); -- fqn.append(tempSeparator); -- } -- } -- fqn.append(m_name); -- return fqn; --} -- --/** -- * Overloaded '==' operator -- */ --bool UMLObject::operator==(const UMLObject & rhs) const --{ -- if (this == &rhs) -- return true; -- -- //don't compare IDs, these are program specific and -- //don't mean the objects are the same -- //***** CHECK: Who put in this comment? What was the reason? -- //***** Currently some operator== in umbrello-kf6 compare the IDs -- //***** while others don't. -- -- if (m_name != rhs.m_name) -- return false; -- -- // Packages create different namespaces, therefore they should be -- // part of the equality test. -- if (m_pUMLPackage != rhs.m_pUMLPackage) -- return false; -- -- // Making the type part of an object's identity has its problems: -- // Not all programming languages support declarations of the same -- // name but different type. -- // In such cases, the code generator is responsible for generating -- // the appropriate error message. -- if (m_BaseType != rhs.m_BaseType) -- return false; -- -- // The documentation should not be part of the equality test. -- // If two objects are the same but differ only in their documentation, -- // what does that mean? -- //if(m_Doc != rhs.m_Doc) -- // return false; -- -- // The visibility should not be part of the equality test. -- // What does it mean if two objects are the same but differ in their -- // visibility? - I'm not aware of any programming language that would -- // support that. -- //if(m_visibility != rhs.m_visibility) -- // return false; -- -- // See comments above -- //if(m_pStereotype != rhs.m_pStereotype) -- // return false; -- -- // See comments above -- //if(m_bAbstract != rhs.m_bAbstract) -- // return false; -- -- // See comments above -- //if(m_bStatic != rhs.m_bStatic) -- // return false; -- -- return true; --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLObject::copyInto(UMLObject *lhs) const --{ -- // Data members with copy constructor -- lhs->m_Doc = m_Doc; -- lhs->m_pStereotype = m_pStereotype; -- lhs->m_bAbstract = m_bAbstract; -- lhs->m_bStatic = m_bStatic; -- lhs->m_BaseType = m_BaseType; -- lhs->m_visibility = m_visibility; -- lhs->m_pUMLPackage = m_pUMLPackage; -- -- // We don't want the same name existing twice. -- lhs->m_name = Model_Utils::uniqObjectName(m_BaseType, m_pUMLPackage, m_name); -- -- // Create a new ID. -- lhs->m_nId = UniqueID::gen(); -- -- // Hope that the parent from QObject is okay. -- if (lhs->parent() != parent()) -- uDebug() << "copyInto has a wrong parent"; --} -- --UMLObject *UMLObject::clone() const --{ -- UMLObject *clone = new UMLObject; -- UMLObject::copyInto(clone); -- return clone; --} -- --/** -- * Returns the abstract state of the object. -- */ --bool UMLObject::isAbstract() const --{ -- return m_bAbstract; --} -- --/** -- * Sets the paste state of the object. -- */ --void UMLObject::setAbstract(bool bAbstract) --{ -- m_bAbstract = bAbstract; -- emitModified(); --} -- --/** -- * Returns true if this UMLObject has classifier scope, -- * otherwise false (the default). -- */ --bool UMLObject::isStatic() const --{ -- return m_bStatic; --} -- --/** -- * Sets the value for m_bStatic. -- */ --void UMLObject::setStatic(bool bStatic) --{ -- m_bStatic = bStatic; -- emitModified(); --} -- --/** -- * Forces the emission of the modified signal. Useful when -- * updating several attributes at a time: you can block the -- * signals, update all atts, and then force the signal. -- */ --void UMLObject::emitModified() --{ -- UMLDoc *umldoc = UMLApp::app()->document(); -- if (!umldoc->loading() && !umldoc->closing()) -- emit modified(); --} -- --/** -- * Returns the type of the object. -- * -- * @return Returns the type of the object. -- */ --UMLObject::ObjectType UMLObject::baseType() const --{ -- return m_BaseType; --} -- --/** -- * @return The type used for rtti as string. -- */ --QLatin1String UMLObject::baseTypeStr() const --{ -- return QLatin1String(ENUM_NAME(UMLObject, ObjectType, m_BaseType)); --} -- --/** -- * Set the type of the object. -- * -- * @param ot The ObjectType to set. -- */ --void UMLObject::setBaseType(ObjectType ot) --{ -- m_BaseType = ot; --} -- --/** -- * Returns the ID of the object. -- * -- * @return Returns the ID of the object. -- */ --ID::Type UMLObject::id() const --{ -- return m_nId; --} -- --/** -- * Returns the documentation for the object. -- * -- * @return Returns the documentation for the object. -- */ --QString UMLObject::doc() const --{ -- return m_Doc; --} -- --/** -- * Returns state of documentation for the object. -- * -- * @return false if documentation is empty -- */ --bool UMLObject::hasDoc() const --{ -- return !m_Doc.isEmpty(); --} -- --/** -- * Sets the documentation for the object. -- * -- * @param d The documentation for the object. -- */ --void UMLObject::setDoc(const QString &d) --{ -- m_Doc = d; -- //emit modified(); No, this is done centrally at DocWindow::updateDocumentation() --} -- --/** -- * Returns the visibility of the object. -- * -- * @return Returns the visibility of the object. -- */ --Visibility::Enum UMLObject::visibility() const --{ -- return m_visibility; --} -- --/** -- * Sets the visibility of the object. -- * -- * @param visibility The visibility of the object. -- */ --void UMLObject::setVisibility(Visibility::Enum visibility) --{ -- if (m_visibility != visibility) { -- UMLApp::app()->executeCommand(new CmdSetVisibility(this, visibility)); -- } --} -- --/** -- * Method used by setVisibility: it is called by cmdSetVisibility, Don't use it! -- */ --void UMLObject::setVisibilityCmd(Visibility::Enum visibility) --{ -- m_visibility = visibility; -- emitModified(); --} -- --/** -- * Sets the class' UMLStereotype. Adjusts the reference counts -- * at the previously set stereotype and at the new stereotype. -- * If the previously set UMLStereotype's reference count drops -- * to zero then the UMLStereotype is removed at the UMLDoc and -- * it is then physically deleted. -- * -- * @param stereo Sets the classes UMLStereotype. -- */ --void UMLObject::setUMLStereotype(UMLStereotype *stereo) --{ -- if (stereo == m_pStereotype) -- return; -- if (stereo) { -- stereo->incrRefCount(); -- } -- if (m_pStereotype) { -- m_pStereotype->decrRefCount(); -- if (m_pStereotype->refCount() == 0) { -- UMLDoc *pDoc = UMLApp::app()->document(); -- pDoc->removeStereotype(m_pStereotype); -- delete m_pStereotype; -- } -- } -- m_pStereotype = stereo; -- // TODO: don't emit modified() if predefined folder -- emitModified(); --} -- --/** -- * Sets the classes stereotype name. -- * Internally uses setUMLStereotype(). -- * -- * @param name Sets the classes stereotype name. -- */ --void UMLObject::setStereotype(const QString &name) --{ -- if (name != stereotype()) { -- UMLApp::app()->executeCommand(new CmdSetStereotype(this, name)); -- } --} -- --void UMLObject::setStereotypeCmd(const QString& name) --{ -- if (name.isEmpty()) { -- setUMLStereotype(NULL); -- return; -- } -- UMLDoc *pDoc = UMLApp::app()->document(); -- UMLStereotype *s = pDoc->findOrCreateStereotype(name); -- setUMLStereotype(s); --} -- --/** -- * Sets the UMLPackage in which this class is located. -- * -- * @param pPkg Pointer to the class' UMLPackage. -- */ --bool UMLObject::setUMLPackage(UMLPackage* pPkg) --{ -- if (pPkg == this) { -- uDebug() << "setting parent to myself is not allowed"; -- return false; -- } -- -- if (pPkg == NULL) { -- // Allow setting to NULL for stereotypes -- m_pUMLPackage = pPkg; -- return true; -- } -- -- if (pPkg->umlPackage() == this) { -- uDebug() << "setting parent to an object of which I'm already the parent is not allowed"; -- return false; -- } -- -- m_pUMLPackage = pPkg; -- emitModified(); -- return true; --} -- --/** -- * Returns the classes UMLStereotype object. -- * -- * @return Returns the classes UMLStereotype object. -- */ --UMLStereotype * UMLObject::umlStereotype() --{ -- return m_pStereotype; --} -- --/** -- * Returns the stereotype. -- */ --QString UMLObject::stereotype(bool includeAdornments /* = false */) const --{ -- if (m_pStereotype == NULL) -- return QString(); -- return m_pStereotype->name(includeAdornments); --} -- --/** -- * Return the package(s) in which this UMLObject is contained -- * as a text. -- * -- * @param separator Separator string for joining together the -- * individual package prefixes (optional.) -- * If no separator is given then the separator -- * of the currently selected language is used. -- * @param includeRoot Whether to prefix the root folder name. -- * Default: false. -- * @return The UMLObject's enclosing package(s) as a text. -- */ --QString UMLObject::package(const QString& separator, bool includeRoot) --{ -- QString tempSeparator = separator; -- if (tempSeparator.isEmpty()) -- tempSeparator = UMLApp::app()->activeLanguageScopeSeparator(); -- QString fqn = fullyQualifiedName(tempSeparator, includeRoot); -- if (!fqn.contains(tempSeparator)) -- return QString(); -- QString scope = fqn.left(fqn.length() - tempSeparator.length() - m_name.length()); -- return scope; --} -- --/** -- * Return a list of the packages in which this class is embedded. -- * The outermost package is first in the list. -- * -- * @param includeRoot Whether to prefix the root folder name. -- * Default: false. -- * @return UMLPackageList of the containing packages. -- */ --UMLPackageList UMLObject::packages(bool includeRoot) const --{ -- UMLPackageList pkgList; -- UMLPackage* pkg = m_pUMLPackage; -- while (pkg != NULL) { -- pkgList.prepend(pkg); -- pkg = pkg->umlPackage(); -- } -- if (!includeRoot) -- pkgList.removeFirst(); -- return pkgList; --} -- --/** -- * Returns the UMLPackage that this class is located in. -- * -- * @return Pointer to the UMLPackage of this class. -- */ --UMLPackage* UMLObject::umlPackage() --{ -- return m_pUMLPackage; --} -- --/** -- * Return secondary ID. Required by resolveRef(). -- */ --QString UMLObject::secondaryId() const --{ -- return m_SecondaryId; --} -- --/** -- * Set the secondary ID. -- * Currently only required by petalTree2Uml(); all other setting of the -- * m_SecondaryID is internal to the UMLObject class hierarchy. -- */ --void UMLObject::setSecondaryId(const QString& id) --{ -- m_SecondaryId = id; --} -- --/** -- * Return secondary ID fallback. -- * Required by resolveRef() for imported model files. -- */ --QString UMLObject::secondaryFallback() const --{ -- return m_SecondaryFallback; --} -- --/** -- * Set the secondary ID fallback. -- * Currently only used by petalTree2Uml(). -- */ --void UMLObject::setSecondaryFallback(const QString& id) --{ -- m_SecondaryFallback = id; --} -- --/** -- * Calls UMLDoc::signalUMLObjectCreated() if m_BaseType affords -- * doing so. -- */ --void UMLObject::maybeSignalObjectCreated() --{ -- if (!m_bCreationWasSignalled && -- m_BaseType != ot_Stereotype && -- m_BaseType != ot_Association && -- m_BaseType != ot_Role) { -- m_bCreationWasSignalled = true; -- UMLDoc* umldoc = UMLApp::app()->document(); -- umldoc->signalUMLObjectCreated(this); -- } --} -- --/** -- * Resolve referenced objects (if any.) -- * Needs to be called after all UML objects are loaded from file. -- * This needs to be done after all model objects are loaded because -- * some of the xmi.id's might be forward references, i.e. they may -- * identify model objects which were not yet loaded at the point of -- * reference. -- * The default implementation attempts resolution of the m_SecondaryId. -- * -- * @return True for success. -- */ --bool UMLObject::resolveRef() --{ -- if (m_pSecondary || (m_SecondaryId.isEmpty() && m_SecondaryFallback.isEmpty())) { -- maybeSignalObjectCreated(); -- return true; -- } --#ifdef VERBOSE_DEBUGGING -- uDebug() << m_name << ": m_SecondaryId is " << m_SecondaryId; --#endif -- UMLDoc *pDoc = UMLApp::app()->document(); -- // In the new, XMI standard compliant save format, -- // the type is the xmi.id of a UMLClassifier. -- if (! m_SecondaryId.isEmpty()) { -- m_pSecondary = pDoc->findObjectById(Uml::ID::fromString(m_SecondaryId)); -- if (m_pSecondary != NULL) { -- if (m_pSecondary->baseType() == ot_Stereotype) { -- m_pStereotype = dynamic_cast(m_pSecondary.data()); -- m_pStereotype->incrRefCount(); -- m_pSecondary = NULL; -- } -- m_SecondaryId = QString(); -- maybeSignalObjectCreated(); -- return true; -- } -- if (m_SecondaryFallback.isEmpty()) { -- uDebug() << "object with xmi.id=" << m_SecondaryId << " not found, setting to undef"; -- UMLFolder *datatypes = pDoc->datatypeFolder(); -- m_pSecondary = Object_Factory::createUMLObject(ot_Datatype, QLatin1String("undef"), datatypes, false); -- return true; -- } -- } -- if (m_SecondaryFallback.isEmpty()) { -- uError() << m_name << ": cannot find type with id " << m_SecondaryId; -- return false; -- } --#ifdef VERBOSE_DEBUGGING -- uDebug() << m_name << ": could not resolve secondary ID " << m_SecondaryId -- << ", using secondary fallback " << m_SecondaryFallback; --#endif -- m_SecondaryId = m_SecondaryFallback; -- // Assume we're dealing with the older umbrello-kf6 format where -- // the type name was saved in the "type" attribute rather -- // than the xmi.id of the model object of the attribute type. -- m_pSecondary = pDoc->findUMLObject(m_SecondaryId, ot_UMLObject, this); -- if (m_pSecondary) { -- m_SecondaryId = QString(); -- maybeSignalObjectCreated(); -- return true; -- } -- // Work around Object_Factory::createUMLObject()'s incapability -- // of on-the-fly scope creation: -- if (m_SecondaryId.contains(QLatin1String("::"))) { -- // TODO: Merge Import_Utils::createUMLObject() into Object_Factory::createUMLObject() -- m_pSecondary = Import_Utils::createUMLObject(ot_UMLObject, m_SecondaryId, m_pUMLPackage); -- if (m_pSecondary) { -- if (Import_Utils::newUMLObjectWasCreated()) { -- maybeSignalObjectCreated(); -- qApp->processEvents(); -- uDebug() << "Import_Utils::createUMLObject() created a new type for " -- << m_SecondaryId; -- } else { -- uDebug() << "Import_Utils::createUMLObject() returned an existing type for " -- << m_SecondaryId; -- } -- m_SecondaryId = QString(); -- return true; -- } -- uError() << "Import_Utils::createUMLObject() failed to create a new type for " -- << m_SecondaryId; -- return false; -- } -- uDebug() << "Creating new type for " << m_SecondaryId; -- // This is very C++ specific - we rely on some '*' or -- // '&' to decide it's a ref type. Plus, we don't recognize -- // typedefs of ref types. -- bool isReferenceType = (m_SecondaryId.contains(QLatin1Char('*')) || -- m_SecondaryId.contains(QLatin1Char('&'))); -- ObjectType ot = ot_Class; -- if (isReferenceType) { -- ot = ot_Datatype; -- } else { -- if (Model_Utils::isCommonDataType(m_SecondaryId)) -- ot = ot_Datatype; -- } -- m_pSecondary = Object_Factory::createUMLObject(ot, m_SecondaryId, NULL); -- if (m_pSecondary == NULL) -- return false; -- m_SecondaryId = QString(); -- maybeSignalObjectCreated(); -- //qApp->processEvents(); -- return true; --} -- --void UMLObject::saveToXMI(QDomDocument &qDoc, QDomElement &qElement) --{ -- Q_UNUSED(qDoc); Q_UNUSED(qElement); --} -- --/** -- * Auxiliary to saveToXMI. -- * Create a QDomElement with the given tag, and save the XMI attributes -- * that are common to all child classes to the newly created element. -- * This method does not need to be overridden by child classes. -- */ --QDomElement UMLObject::save(const QString &tag, QDomDocument & qDoc) --{ -- /* -- Call as the first action of saveToXMI() in child class: -- This creates the QDomElement with which to work. -- */ -- QDomElement qElement = qDoc.createElement(tag); -- qElement.setAttribute(QLatin1String("isSpecification"), QLatin1String("false")); -- if (m_BaseType != ot_Association && -- m_BaseType != ot_Role && -- m_BaseType != ot_Attribute) { -- qElement.setAttribute(QLatin1String("isLeaf"), QLatin1String("false")); -- qElement.setAttribute(QLatin1String("isRoot"), QLatin1String("false")); -- if (m_bAbstract) -- qElement.setAttribute(QLatin1String("isAbstract"), QLatin1String("true")); -- else -- qElement.setAttribute(QLatin1String("isAbstract"), QLatin1String("false")); -- } -- qElement.setAttribute(QLatin1String("xmi.id"), Uml::ID::toString(m_nId)); -- qElement.setAttribute(QLatin1String("name"), m_name); -- if (m_BaseType != ot_Operation && -- m_BaseType != ot_Role && -- m_BaseType != ot_Attribute) { -- Uml::ID::Type nmSpc; -- if (m_pUMLPackage) -- nmSpc = m_pUMLPackage->id(); -- else -- nmSpc = UMLApp::app()->document()->modelID(); -- qElement.setAttribute(QLatin1String("namespace"), Uml::ID::toString(nmSpc)); -- } -- if (! m_Doc.isEmpty()) -- qElement.setAttribute(QLatin1String("comment"), m_Doc); //CHECK: uml13.dtd compliance --#ifdef XMI_FLAT_PACKAGES -- if (m_pUMLPackage) //FIXME: uml13.dtd compliance -- qElement.setAttribute(QLatin1String("package"), m_pUMLPackage->ID()); --#endif -- QString visibility = Uml::Visibility::toString(m_visibility, false); -- qElement.setAttribute(QLatin1String("visibility"), visibility); -- if (m_pStereotype != NULL) -- qElement.setAttribute(QLatin1String("stereotype"), Uml::ID::toString(m_pStereotype->id())); -- if (m_bStatic) -- qElement.setAttribute(QLatin1String("ownerScope"), QLatin1String("classifier")); -- /* else -- qElement.setAttribute("ownerScope", "instance"); -- *** ownerScope defaults to instance if not set **********/ -- return qElement; --} -- --/** -- * Auxiliary to loadFromXMI. -- * This method is usually overridden by child classes. -- * It is responsible for loading the specific XMI structure -- * of the child class. -- */ --bool UMLObject::load(QDomElement&) --{ -- // This body is not usually executed because child classes -- // overwrite the load method. -- return true; --} -- --/** -- * Analyzes the given QDomElement for a reference to a stereotype. -- * -- * @param element QDomElement to analyze. -- * @return True if a stereotype reference was found, else false. -- */ --bool UMLObject::loadStereotype(QDomElement & element) --{ -- QString tag = element.tagName(); -- if (!UMLDoc::tagEq(tag, QLatin1String("stereotype"))) -- return false; -- QString stereo = element.attribute(QLatin1String("xmi.value")); -- if (stereo.isEmpty() && element.hasChildNodes()) { -- /* like so: -- -- -- -- */ -- QDomNode stereoNode = element.firstChild(); -- QDomElement stereoElem = stereoNode.toElement(); -- tag = stereoElem.tagName(); -- if (UMLDoc::tagEq(tag, QLatin1String("Stereotype"))) { -- stereo = stereoElem.attribute(QLatin1String("xmi.idref")); -- } -- } -- if (stereo.isEmpty()) -- return false; -- Uml::ID::Type stereoID = Uml::ID::fromString(stereo); -- UMLDoc *pDoc = UMLApp::app()->document(); -- m_pStereotype = pDoc->findStereotypeById(stereoID); -- if (m_pStereotype) -- m_pStereotype->incrRefCount(); -- else -- m_SecondaryId = stereo; // leave it to resolveRef() -- return true; --} -- --/** -- * This method loads the generic parts of the XMI common to most model -- * classes. It is not usually reimplemented by child classes. -- * Instead, it invokes the load() method which implements the loading -- * of the specifics of each child class. -- * -- * @param element The QDomElement from which to load. -- */ --bool UMLObject::loadFromXMI(QDomElement & element) --{ -- UMLDoc* umldoc = UMLApp::app()->document(); -- if (umldoc == 0) { -- uError() << "umldoc is NULL"; -- return false; -- } -- // Read the name first so that if we encounter a problem, the error -- // message can say the name. -- m_name = element.attribute(QLatin1String("name")); -- QString id = Model_Utils::getXmiId(element); -- if (id.isEmpty() || id == QLatin1String("-1")) { -- // Before version 1.4, umbrello-kf6 did not save the xmi.id of UMLRole objects. -- // Some tools (such as Embarcadero's) do not have an xmi.id on all attributes. -- m_nId = UniqueID::gen(); -- uWarning() << m_name << ": xmi.id not present, generating a new one"; -- } else { -- Uml::ID::Type nId = Uml::ID::fromString(id); -- if (m_BaseType == ot_Role) { -- // Some older umbrello-kf6 versions had a problem with xmi.id's -- // of other objects being reused for the UMLRole, see e.g. -- // attachment 21179 at http://bugs.kde.org/147988 . -- // If the xmi.id is already being used then we generate a new one. -- UMLObject *o = umldoc->findObjectById(nId); -- if (o) { -- uError() << "loadFromXMI(UMLRole): id " << id -- << " is already in use!!! Please fix your XMI file."; -- } -- } -- m_nId = nId; -- } -- -- if (element.hasAttribute(QLatin1String("documentation"))) // for bkwd compat. -- m_Doc = element.attribute(QLatin1String("documentation")); -- else -- m_Doc = element.attribute(QLatin1String("comment")); //CHECK: need a UML:Comment? -- -- m_visibility = Uml::Visibility::Public; -- if (element.hasAttribute(QLatin1String("scope"))) { // for bkwd compat. -- QString scope = element.attribute(QLatin1String("scope")); -- if (scope == QLatin1String("instance_level")) // nsuml compat. -- m_bStatic = false; -- else if (scope == QLatin1String("classifier_level")) // nsuml compat. -- m_bStatic = true; -- else { -- int nScope = scope.toInt(); -- switch (nScope) { -- case 200: -- m_visibility = Uml::Visibility::Public; -- break; -- case 201: -- m_visibility = Uml::Visibility::Private; -- break; -- case 202: -- m_visibility = Uml::Visibility::Protected; -- break; -- default: -- uError() << m_name << ": illegal scope " << nScope; -- } -- } -- } else { -- QString visibility = element.attribute(QLatin1String("visibility"), QLatin1String("public")); -- if (visibility == QLatin1String("private") -- || visibility == QLatin1String("private_vis")) // for compatibility with other programs -- m_visibility = Uml::Visibility::Private; -- else if (visibility == QLatin1String("protected") -- || visibility == QLatin1String("protected_vis")) // for compatibility with other programs -- m_visibility = Uml::Visibility::Protected; -- else if (visibility == QLatin1String("implementation")) -- m_visibility = Uml::Visibility::Implementation; -- } -- -- QString stereo = element.attribute(QLatin1String("stereotype")); -- if (!stereo.isEmpty()) { -- Uml::ID::Type stereoID = Uml::ID::fromString(stereo); -- m_pStereotype = umldoc->findStereotypeById(stereoID); -- if (m_pStereotype) { -- m_pStereotype->incrRefCount(); -- } else { -- uDebug() << m_name << ": UMLStereotype " << Uml::ID::toString(stereoID) -- << " not found, creating now."; -- setStereotypeCmd(stereo); -- } -- } -- -- if (element.hasAttribute(QLatin1String("abstract"))) { // for bkwd compat. -- QString abstract = element.attribute(QLatin1String("abstract"), QLatin1String("0")); -- m_bAbstract = (bool)abstract.toInt(); -- } else { -- QString isAbstract = element.attribute(QLatin1String("isAbstract"), QLatin1String("false")); -- m_bAbstract = (isAbstract == QLatin1String("true")); -- } -- -- if (element.hasAttribute(QLatin1String("static"))) { // for bkwd compat. -- QString staticScope = element.attribute(QLatin1String("static"), QLatin1String("0")); -- m_bStatic = (bool)staticScope.toInt(); -- } else { -- QString ownerScope = element.attribute(QLatin1String("ownerScope"), QLatin1String("instance")); -- m_bStatic = (ownerScope == QLatin1String("classifier")); -- } -- -- // If the node has child nodes, check whether attributes can be -- // extracted from them. -- if (element.hasChildNodes()) { -- QDomNode node = element.firstChild(); -- if (node.isComment()) -- node = node.nextSibling(); -- QDomElement elem = node.toElement(); -- while (!elem.isNull()) { -- QString tag = elem.tagName(); -- if (UMLDoc::tagEq(tag, QLatin1String("name"))) { -- m_name = elem.attribute(QLatin1String("xmi.value")); -- if (m_name.isEmpty()) -- m_name = elem.text(); -- } else if (UMLDoc::tagEq(tag, QLatin1String("visibility"))) { -- QString vis = elem.attribute(QLatin1String("xmi.value")); -- if (vis.isEmpty()) -- vis = elem.text(); -- if (vis == QLatin1String("private") || vis == QLatin1String("private_vis")) -- m_visibility = Uml::Visibility::Private; -- else if (vis == QLatin1String("protected") || vis == QLatin1String("protected_vis")) -- m_visibility = Uml::Visibility::Protected; -- else if (vis == QLatin1String("implementation")) -- m_visibility = Uml::Visibility::Implementation; -- } else if (UMLDoc::tagEq(tag, QLatin1String("isAbstract"))) { -- QString isAbstract = elem.attribute(QLatin1String("xmi.value")); -- if (isAbstract.isEmpty()) -- isAbstract = elem.text(); -- m_bAbstract = (isAbstract == QLatin1String("true")); -- } else if (UMLDoc::tagEq(tag, QLatin1String("ownerScope"))) { -- QString ownerScope = elem.attribute(QLatin1String("xmi.value")); -- if (ownerScope.isEmpty()) -- ownerScope = elem.text(); -- m_bStatic = (ownerScope == QLatin1String("classifier")); -- } else { -- loadStereotype(elem); -- } -- node = node.nextSibling(); -- if (node.isComment()) -- node = node.nextSibling(); -- elem = node.toElement(); -- } -- } -- -- // Operations, attributes, enum literals, templates, stereotypes, -- // and association role objects get added and signaled elsewhere. -- if (m_BaseType != ot_Operation && m_BaseType != ot_Attribute && -- m_BaseType != ot_EnumLiteral && m_BaseType != ot_EntityAttribute && -- m_BaseType != ot_Template && m_BaseType != ot_Stereotype && -- m_BaseType != ot_Role && m_BaseType != ot_UniqueConstraint && -- m_BaseType != ot_ForeignKeyConstraint && m_BaseType != ot_CheckConstraint) { -- if (m_pUMLPackage) { -- m_pUMLPackage->addObject(this); -- } else if (umldoc->rootFolderType(this) == Uml::ModelType::N_MODELTYPES) { -- // m_pUMLPackage is not set on the root folders. -- uDebug() << m_name << ": m_pUMLPackage is not set"; -- } -- } -- return load(element); --} -- --/** -- * Helper function for debug output. -- * Returns the given enum value as string. -- * @param ot ObjectType of which a string representation is wanted -- * @return the ObjectType as string -- */ --QString UMLObject::toString(ObjectType ot) --{ -- return QLatin1String(ENUM_NAME(UMLObject, ObjectType, ot)); --} -- --/** -- * Returns the given object type value as localized string. -- * @param ot ObjectType of which a string representation is wanted -- * @return the ObjectType as localized string -- */ --QString UMLObject::toI18nString(ObjectType t) --{ -- QString name; -- -- switch (t) { -- case UMLObject::ot_Actor: -- name = i18n("Actor &name:"); -- break; -- case UMLObject::ot_Artifact: -- name = i18n("Artifact &name:"); -- break; -- case UMLObject::ot_Class: -- name = i18n("Class &name:"); -- break; -- case UMLObject::ot_Component: -- name = i18n("Component &name:"); -- break; -- case UMLObject::ot_Datatype: -- name = i18n("Datatype &name:"); -- break; -- case UMLObject::ot_Entity: -- name = i18n("Entity &name:"); -- break; -- case UMLObject::ot_Enum: -- name = i18n("Enum &name:"); -- break; -- case UMLObject::ot_Folder: -- name = i18n("Folder &name:"); -- break; -- case UMLObject::ot_Interface: -- name = i18n("Interface &name:"); -- break; -- case UMLObject::ot_Node: -- name = i18n("Node &name:"); -- break; -- case UMLObject::ot_Package: -- name = i18n("Package &name:"); -- break; -- case UMLObject::ot_Port: -- name = i18n("Port &name:"); -- break; -- case UMLObject::ot_Stereotype: -- name = i18n("Stereotype &name:"); -- break; -- case UMLObject::ot_UseCase: -- name = i18n("Use case &name:"); -- break; -- default: -- name = QLatin1String(" &name:"); -- uWarning() << "unknown object type"; -- break; -- } -- return name; --} -- --/** -- * Print UML Object to debug output stream, so it can be used like -- * uDebug() << "This object shouldn't be here: " << illegalObject; -- */ --QDebug operator<<(QDebug out, const UMLObject& obj) --{ -- out.nospace() << "UMLObject: name= " << obj.name() -- << ", type= " << UMLObject::toString(obj.m_BaseType); -- return out.space(); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlobject.h umbrello-kf6-15.08.1/umbrello/umlobject.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlobject.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlobject.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,198 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLOBJECT_H --#define UMLOBJECT_H -- --#include "basictypes.h" --#include "umlpackagelist.h" -- --//qt includes --#include --#include --#include --#include --#include -- --class UMLStereotype; -- --/** -- * This class is the non-graphical version of @ref UMLWidget. These are -- * created and maintained in the class @ref UMLDoc. This class holds all -- * the generic information needed for all UML objects. -- * -- * @ref clone needs to be implemented by each child class. -- * -- * @ref saveToXMI saves the XMI attributes of each specific model class. -- * It needs to be implemented by each child class. -- * For creating the QDomElement and saving the common XMI parts, -- * it can use the save() method. -- * -- * @short The base class for UML objects. -- * @author Paul Hensgen -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLObject : public QObject --{ -- Q_OBJECT -- Q_ENUMS(ObjectType) -- --public: -- enum ObjectType -- { -- ot_Unknown = -1, -- ot_UMLObject = 100, -- ot_Actor, -- ot_UseCase, -- ot_Package, -- ot_Interface, -- ot_Datatype, -- ot_Enum, -- ot_Class, -- ot_Association, -- ot_Attribute, -- ot_Operation, -- ot_EnumLiteral, -- ot_Template, -- ot_Component, -- ot_Artifact, -- ot_Node, -- ot_Stereotype, -- ot_Role, -- ot_Entity, -- ot_EntityAttribute, -- ot_Folder, -- ot_EntityConstraint, -- ot_UniqueConstraint, -- ot_ForeignKeyConstraint, -- ot_CheckConstraint, -- ot_Category, -- ot_Port -- }; -- -- static QString toString(ObjectType ot); -- static QString toI18nString(ObjectType t); -- -- explicit UMLObject(const UMLObject& other); -- explicit UMLObject(UMLObject* parent, const QString& name, Uml::ID::Type id = Uml::ID::None); -- explicit UMLObject(UMLObject* parent); -- explicit UMLObject(const QString& name = QString(), Uml::ID::Type id = Uml::ID::None); -- virtual ~UMLObject(); -- -- bool operator==(const UMLObject & rhs) const; -- -- virtual void copyInto(UMLObject *lhs) const; -- -- virtual UMLObject* clone() const; -- -- virtual void setBaseType(ObjectType ot); -- ObjectType baseType() const; -- QLatin1String baseTypeStr() const; -- -- virtual void setID(Uml::ID::Type NewID); -- virtual Uml::ID::Type id() const; -- -- QString doc() const; -- bool hasDoc() const; -- void setDoc(const QString &d); -- -- void setVisibility(Uml::Visibility::Enum visibility); -- void setVisibilityCmd(Uml::Visibility::Enum visibility); -- Uml::Visibility::Enum visibility() const; -- -- void setStereotype(const QString &_name); -- void setStereotypeCmd(const QString &_name); -- QString stereotype(bool includeAdornments = false) const; -- -- void setUMLStereotype(UMLStereotype *stereo); -- UMLStereotype *umlStereotype(); -- -- QString package(const QString& separator = QString(), -- bool includeRoot = false); -- -- bool setUMLPackage(UMLPackage* pPkg); -- UMLPackage* umlPackage(); -- -- UMLPackageList packages(bool includeRoot = false) const; -- -- virtual void setName(const QString &strName); -- void setNameCmd(const QString &strName) ; -- QString name() const; -- -- virtual QString fullyQualifiedName(const QString& separator = QString(), -- bool includeRoot = false) const; -- -- void setAbstract(bool bAbstract); -- bool isAbstract() const; -- -- virtual bool showPropertiesDialog(QWidget* parent = 0); -- -- virtual bool resolveRef(); -- -- virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- virtual bool loadFromXMI(QDomElement & element); -- -- bool loadStereotype(QDomElement & element); -- -- void setStatic(bool bStatic); -- bool isStatic() const; -- -- virtual bool acceptAssociationType(Uml::AssociationType::Enum); //:TODO: check if this is really needed here -- -- void setSecondaryId(const QString& id); -- QString secondaryId() const; -- -- void setSecondaryFallback(const QString& id); -- QString secondaryFallback() const; -- -- QDomElement save(const QString &tag, QDomDocument & qDoc); -- -- friend QDebug operator<< (QDebug out, const UMLObject& obj); -- --public slots: -- void emitModified(); -- --signals: -- void modified(); -- --protected: -- void init(); -- -- void maybeSignalObjectCreated(); -- -- virtual bool load(QDomElement& element); -- -- Uml::ID::Type m_nId; ///< object's id -- QString m_Doc; ///< object's documentation -- UMLPackage* m_pUMLPackage; ///< package the object belongs to if applicable -- UMLStereotype* m_pStereotype; ///< stereotype of the object if applicable -- QString m_name; ///< objects name -- ObjectType m_BaseType; ///< objects type -- Uml::Visibility::Enum m_visibility; ///< objects visibility -- bool m_bAbstract; ///< state of whether the object is abstract or not -- bool m_bStatic; ///< flag for instance scope -- bool m_bInPaste; ///< caller sets this true when in paste operation -- bool m_bCreationWasSignalled; ///< auxiliary to maybeSignalObjectCreated() -- QPointer m_pSecondary; ///< pointer to an associated object -- ///< Only a few of the classes inheriting from UMLObject use this. -- ///< However, it needs to be here because of inheritance graph -- ///< disjunctness. -- QString m_SecondaryId; ///< xmi.id of the secondary object for intermediate use during -- ///< loading. The secondary ID is resolved to the m_pSecondary -- ///< in the course of resolveRef() at the end of loading. -- QString m_SecondaryFallback; ///< Last-chance backup for when m_SecondaryId is not found. -- ///< Used by Rose import: MDL files specify both a "quidu" -- ///< (which corresponds to m_SecondaryId) and the human readable -- ///< fully qualified target name of a reference. -- ///< In case the quidu is not found, the human readable name is -- ///< used which we store in m_SecondaryFallback. --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlobjectlist.cpp umbrello-kf6-15.08.1/umbrello/umlobjectlist.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlobjectlist.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlobjectlist.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,53 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "umlobjectlist.h" --#include "umlobject.h" -- --UMLObjectList::UMLObjectList() --{ --} -- --UMLObjectList::~UMLObjectList() --{ --} -- --/** -- * Copy the internal presentation of this object into the new -- * object. -- */ --void UMLObjectList::copyInto(UMLObjectList *rhs) const --{ -- // Don't copy yourself. -- if (rhs == this) return; -- -- rhs->clear(); -- -- // Suffering from const; we shall not modify our object. -- UMLObjectList *tmp = new UMLObjectList(*this); -- -- UMLObject *item = NULL; -- for (UMLObjectListIt oit(*tmp); oit.hasNext() ;) -- { -- item = oit.next(); -- rhs->append(item->clone()); -- } -- delete tmp; --} -- --/** -- * Make a clone of this object. -- */ --UMLObjectList* UMLObjectList::clone() const --{ -- UMLObjectList *clone = new UMLObjectList(); -- copyInto(clone); -- return clone; --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlobjectlist.h umbrello-kf6-15.08.1/umbrello/umlobjectlist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlobjectlist.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlobjectlist.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,40 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2001 Gustavo Madrigal gmadrigal@nextphere.com * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLOBJECTLIST_H --#define UMLOBJECTLIST_H -- --#include --#include -- --// forward declarations --class UMLObject; -- --typedef QListIterator > --UMLObjectListIt; -- --/** -- * This sub-class adds copyInto and clone to the QList -- * base class. -- */ --class UMLObjectList : public QList > --{ --public: -- -- UMLObjectList(); -- virtual ~UMLObjectList(); -- -- virtual void copyInto(UMLObjectList *rhs) const; -- -- virtual UMLObjectList* clone() const; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umloperationlist.h umbrello-kf6-15.08.1/umbrello/umloperationlist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umloperationlist.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umloperationlist.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,23 +0,0 @@ --/*************************************************************************** -- * * -- * 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. * -- * * -- * copyright (C) 2003-2007 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLOPERATIONLIST_H --#define UMLOPERATIONLIST_H -- --#include -- --// forward declaration --class UMLOperation; -- --typedef QList UMLOperationList; --typedef QListIterator UMLOperationListIt; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlpackagelist.h umbrello-kf6-15.08.1/umbrello/umlpackagelist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlpackagelist.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlpackagelist.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,22 +0,0 @@ --/*************************************************************************** -- * * -- * 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. * -- * * -- * copyright (C) 2003-2007 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLPACKAGELIST_H --#define UMLPACKAGELIST_H -- --#include -- --class UMLPackage; -- --typedef QList UMLPackageList; --typedef QListIterator UMLPackageListIt; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlrole.cpp umbrello-kf6-15.08.1/umbrello/umlrole.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlrole.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlrole.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,415 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "umlrole.h" -- --// local includes --#include "association.h" --#include "debug_utils.h" --#include "umldoc.h" --#include "umlroledialog.h" --#include "uml.h" -- --// qt includes --#include --#include -- --/** -- * Sets up an association. -- * -- * @param parent The parent (association) of this UMLRole. -- * @param parentObj The Parent UML Object of this UMLRole -- * @param role The Uml::RoleType::Enum of this UMLRole -- */ --UMLRole::UMLRole(UMLAssociation * parent, UMLObject * parentObj, Uml::RoleType::Enum role) -- : UMLObject(const_cast(parent)), -- m_pAssoc(parent), -- m_role(role), -- m_Multi(QString()), -- m_Changeability(Uml::Changeability::Changeable) --{ -- m_BaseType = UMLObject::ot_Role; -- m_name.clear(); -- m_pSecondary = parentObj; -- -- // connect this up to parent -- connect(this, SIGNAL(modified()), parent, SIGNAL(modified())); --} -- --/** -- * Standard destructor. -- */ --UMLRole::~UMLRole() --{ --} -- --/** -- * Overloaded '==' operator. -- */ --bool UMLRole::operator==(const UMLRole &rhs) const --{ -- if (this == &rhs) { -- return true; -- } -- return (UMLObject::operator==(rhs) && -- m_Changeability == rhs.m_Changeability && -- m_Multi == rhs.m_Multi && -- m_name == rhs.m_name -- ); --} -- --UMLAssociation * UMLRole::parentAssociation() const --{ -- return m_pAssoc; --} -- --/** -- * Returns the UMLObject assigned to the role. -- * @return Pointer to the UMLObject in role. -- */ --UMLObject* UMLRole::object() const --{ -- return m_pSecondary; --} -- --/** -- * Returns the Changeablity of the role. -- * -- * @return Changeability of role. -- */ --Uml::Changeability::Enum UMLRole::changeability() const --{ -- return m_Changeability; --} -- --/** -- * Returns the multiplicity assigned to the role. -- * -- * @return The multiplicity assigned to the role. -- */ --QString UMLRole::multiplicity() const --{ -- return m_Multi; --} -- --/** -- * Sets the UMLObject playing the role in the association. -- * -- * @param obj Pointer to the UMLObject of role. -- */ --void UMLRole::setObject(UMLObject *obj) --{ -- // because we will get the id of this role from the parent -- // object, we CANT allow UMLRoles to take other UMLRoles as -- // parent objects. In fact, there is probably good reason -- // to only take UMLClassifiers here, but I'll leave it more open -- // for the time being. -b.t. -- if (obj && dynamic_cast(obj)) { -- uError() << "UMLRole(" << Uml::ID::toString(m_nId) << ") cannot setObject() to another UMLRole(" -- << Uml::ID::toString(obj->id()) << ")"; -- return; -- } -- -- m_pSecondary = obj; -- UMLObject::emitModified(); --} -- --/** -- * Sets the changeability of the role. -- * -- * @param value Changeability::Enum of role. -- */ --void UMLRole::setChangeability(Uml::Changeability::Enum value) --{ -- m_Changeability = value; -- UMLObject::emitModified(); --} -- --/** -- * Sets the multiplicity of the role. -- * -- * @param multi The multiplicity of role. -- */ --void UMLRole::setMultiplicity(const QString &multi) --{ -- m_Multi = multi; -- UMLObject::emitModified(); --} -- --/** -- * Get the 'id' of the role (NOT the parent object). This could be -- * either Uml::RoleType::A or Uml::RoleType::B. Yes, it would be better if we -- * could get along without this, but we need it to distinguish saved -- * umlrole objects in the XMI for 'self' associations where both roles -- * will point to the same underlying UMLObject. -- */ --Uml::RoleType::Enum UMLRole::role() const --{ -- return m_role; --} -- --/** -- * Creates the XMI element. -- */ --void UMLRole::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement roleElement = UMLObject::save(QLatin1String("UML:AssociationEnd"), qDoc); -- if (m_pSecondary) -- roleElement.setAttribute(QLatin1String("type"), Uml::ID::toString(m_pSecondary->id())); -- else -- uError() << "id " << Uml::ID::toString(m_nId) << ": m_pSecondary is NULL"; -- if (!m_Multi.isEmpty()) -- roleElement.setAttribute(QLatin1String("multiplicity"), m_Multi); -- if (m_role == Uml::RoleType::A) { // role aggregation based on parent type -- // role A -- switch (m_pAssoc->getAssocType()) { -- case Uml::AssociationType::Composition: -- roleElement.setAttribute(QLatin1String("aggregation"), QLatin1String("composite")); -- break; -- case Uml::AssociationType::Aggregation: -- roleElement.setAttribute(QLatin1String("aggregation"), QLatin1String("aggregate")); -- break; -- default: -- roleElement.setAttribute(QLatin1String("aggregation"), QLatin1String("none")); -- break; -- } -- if (m_pAssoc->getAssocType() == Uml::AssociationType::UniAssociation) { -- // Normally the isNavigable attribute is "true". -- // We set it to false on role A to indicate that -- // role B gets an explicit arrowhead. -- roleElement.setAttribute(QLatin1String("isNavigable"), QLatin1String("false")); -- } else { -- roleElement.setAttribute(QLatin1String("isNavigable"), QLatin1String("true")); -- } -- } else { -- roleElement.setAttribute(QLatin1String("aggregation"), QLatin1String("none")); -- roleElement.setAttribute(QLatin1String("isNavigable"), QLatin1String("true")); -- //FIXME obviously this isn't standard XMI -- if (m_pAssoc->getAssocType() == Uml::AssociationType::Relationship) { -- roleElement.setAttribute(QLatin1String("relationship"), QLatin1String("true")); -- } -- } -- -- roleElement.setAttribute(QLatin1String("visibility"), Uml::Visibility::toString(visibility(), false)); -- -- switch (m_Changeability) { -- case Uml::Changeability::Frozen: -- roleElement.setAttribute(QLatin1String("changeability"), QLatin1String("frozen")); -- break; -- case Uml::Changeability::AddOnly: -- roleElement.setAttribute(QLatin1String("changeability"), QLatin1String("addOnly")); -- break; -- case Uml::Changeability::Changeable: -- roleElement.setAttribute(QLatin1String("changeability"), QLatin1String("changeable")); -- break; -- } -- qElement.appendChild(roleElement); --} -- --/** -- * Display the properties configuration dialog for the object. -- * -- * @param parent The parent widget. -- * @return True for success of this operation. -- */ --bool UMLRole::showPropertiesDialog(QWidget *parent) --{ -- QPointer dlg = new UMLRoleDialog(parent, this); -- bool modified = false; -- if (dlg->exec() == QDialog::Accepted) { -- modified = true; -- } -- delete dlg; -- return modified; --} -- --/** -- * Loads the XMI element. -- * Auxiliary to UMLObject::loadFromXMI. -- */ --bool UMLRole::load(QDomElement & element) --{ -- UMLDoc * doc = UMLApp::app()->document(); -- QString type = element.attribute(QLatin1String("type")); -- if (!type.isEmpty()) { -- if (!m_SecondaryId.isEmpty()) -- uWarning() << "overwriting old m_SecondaryId \"" << m_SecondaryId -- << " with new value \"" << type << "\""; -- m_SecondaryId = type; -- } -- // Inspect child nodes - for multiplicity (and type if not set above.) -- for (QDomNode node = element.firstChild(); !node.isNull(); node = node.nextSibling()) { -- if (node.isComment()) -- continue; -- QDomElement tempElement = node.toElement(); -- QString tag = tempElement.tagName(); -- if (UMLDoc::tagEq(tag, QLatin1String("name"))) { -- m_name = tempElement.text(); -- } else if (UMLDoc::tagEq(tag, QLatin1String("AssociationEnd.multiplicity"))) { -- /* -- * There are different ways in which the multiplicity might be given: -- * - direct value in the tag, -- * - attributes "lower" and "upper" of a subordinate , -- * - direct value in subordinate and -- * tags -- */ -- QDomNode n = tempElement.firstChild(); -- if (node.isNull() || tempElement.isNull() || n.isNull() || -- n.toElement().isNull()) { -- m_Multi = tempElement.text().trimmed(); -- continue; -- } -- tempElement = n.toElement(); -- tag = tempElement.tagName(); -- if (!UMLDoc::tagEq(tag, QLatin1String("Multiplicity"))) { -- m_Multi = tempElement.text().trimmed(); -- continue; -- } -- n = tempElement.firstChild(); -- tempElement = n.toElement(); -- tag = tempElement.tagName(); -- if (!UMLDoc::tagEq(tag, QLatin1String("Multiplicity.range"))) { -- m_Multi = tempElement.text().trimmed(); -- continue; -- } -- n = tempElement.firstChild(); -- tempElement = n.toElement(); -- tag = tempElement.tagName(); -- if (!UMLDoc::tagEq(tag, QLatin1String("MultiplicityRange"))) { -- m_Multi = tempElement.text().trimmed(); -- continue; -- } -- QString multiUpper; -- if (tempElement.hasAttribute(QLatin1String("lower"))) { -- m_Multi = tempElement.attribute(QLatin1String("lower")); -- multiUpper = tempElement.attribute(QLatin1String("upper")); -- if (!multiUpper.isEmpty()) { -- if (!m_Multi.isEmpty()) -- m_Multi.append(QLatin1String("..")); -- m_Multi.append(multiUpper); -- } -- continue; -- } -- n = tempElement.firstChild(); -- while (!n.isNull()) { -- tempElement = n.toElement(); -- tag = tempElement.tagName(); -- if (UMLDoc::tagEq(tag, QLatin1String("MultiplicityRange.lower"))) { -- m_Multi = tempElement.text(); -- } else if (UMLDoc::tagEq(tag, QLatin1String("MultiplicityRange.upper"))) { -- multiUpper = tempElement.text(); -- } -- n = n.nextSibling(); -- } -- if (!multiUpper.isEmpty()) { -- if (!m_Multi.isEmpty()) -- m_Multi.append(QLatin1String("..")); -- m_Multi.append(multiUpper); -- } -- } else if (m_SecondaryId.isEmpty() && -- (UMLDoc::tagEq(tag, QLatin1String("type")) || -- UMLDoc::tagEq(tag, QLatin1String("participant")))) { -- m_SecondaryId = tempElement.attribute(QLatin1String("xmi.id")); -- if (m_SecondaryId.isEmpty()) -- m_SecondaryId = tempElement.attribute(QLatin1String("xmi.idref")); -- if (m_SecondaryId.isEmpty()) { -- QDomNode inner = tempElement.firstChild(); -- QDomElement innerElem = inner.toElement(); -- m_SecondaryId = innerElem.attribute(QLatin1String("xmi.id")); -- if (m_SecondaryId.isEmpty()) -- m_SecondaryId = innerElem.attribute(QLatin1String("xmi.idref")); -- } -- } -- } -- if (!m_Multi.isEmpty()) -- uDebug() << name() << ": m_Multi is " << m_Multi; -- if (m_SecondaryId.isEmpty()) { -- uError() << name() << ": type not given or illegal"; -- return false; -- } -- UMLObject * obj; -- obj = doc->findObjectById(Uml::ID::fromString(m_SecondaryId)); -- if (obj) { -- m_pSecondary = obj; -- m_SecondaryId = QString(); -- } -- -- // block signals to prevent needless updating -- blockSignals(true); -- // Here comes the handling of the association type. -- // This is open for discussion - I'm pretty sure there are better ways.. -- -- // Yeah, for one, setting the *parent* object parameters from here is sucky -- // as hell. Why are we using roleA to store what is essentially a parent (association) -- // parameter, eh? The UML13.dtd is pretty silly, but since that is what -- // is driving us to that point, we have to go with it. Some analysis of -- // the component roles/linked items needs to be done in order to get things -- // right. *sigh* -b.t. -- -- // Setting association type from the role (A) -- // Determination of the "aggregation" attribute used to be done only -- // when (m_role == Uml::RoleType::A) but some XMI writers (e.g. StarUML) place -- // the aggregation attribute at role B. -- // The role end with the aggregation unequal to "none" wins. -- QString aggregation = element.attribute(QLatin1String("aggregation"), QLatin1String("none")); -- if (aggregation == QLatin1String("composite")) -- m_pAssoc->setAssociationType(Uml::AssociationType::Composition); -- else if (aggregation == QLatin1String("shared") // UML1.3 -- || aggregation == QLatin1String("aggregate")) // UML1.4 -- m_pAssoc->setAssociationType(Uml::AssociationType::Aggregation); -- -- if (!element.hasAttribute(QLatin1String("isNavigable"))) { -- // Backward compatibility mode: In umbrello-kf6 version 1.3.x the -- // logic for saving the isNavigable flag was wrong. -- // May happen on loading role A. -- m_pAssoc->setOldLoadMode(true); -- } else if (m_pAssoc->getOldLoadMode() == true) { -- // Here is the original logic: -- // "Role B: -- // If isNavigable is not given, we make no change to the -- // association type. -- // If isNavigable is given, and is "true", then we assume that -- // the association's other end (role A) is not navigable, and -- // therefore we change the association type to UniAssociation. -- // The case that isNavigable is given as "false" is ignored. -- // Combined with the association type logic for role A, this -- // allows us to support at_Association and at_UniAssociation." -- if (element.attribute(QLatin1String("isNavigable")) == QLatin1String("true")) -- m_pAssoc->setAssociationType(Uml::AssociationType::UniAssociation); -- } else if (element.attribute(QLatin1String("isNavigable")) == QLatin1String("false")) { -- m_pAssoc->setAssociationType(Uml::AssociationType::UniAssociation); -- } -- -- //FIXME not standard XMI -- if (element.hasAttribute(QLatin1String("relationship"))) { -- if (element.attribute(QLatin1String("relationship")) == QLatin1String("true")) { -- m_pAssoc->setAssociationType(Uml::AssociationType::Relationship); -- } -- } -- -- if (m_Multi.isEmpty()) -- m_Multi = element.attribute(QLatin1String("multiplicity")); -- -- // Changeability defaults to Changeable if it cant set it here.. -- m_Changeability = Uml::Changeability::Changeable; -- QString changeability = element.attribute(QLatin1String("changeability")); -- if (changeability.isEmpty()) -- element.attribute(QLatin1String("changeable")); // for backward compatibility -- if (changeability == QLatin1String("frozen")) -- m_Changeability = Uml::Changeability::Frozen; -- else if (changeability == QLatin1String("addOnly")) -- m_Changeability = Uml::Changeability::AddOnly; -- -- // finished config, now unblock -- blockSignals(false); -- return true; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlrole.h umbrello-kf6-15.08.1/umbrello/umlrole.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlrole.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlrole.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,65 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLROLE_H --#define UMLROLE_H -- --#include "umlobject.h" -- --class UMLAssociation; -- --/** -- * This class contains the non-graphic representation of an association role. -- * -- * @author Brian Thomas -- * @see UMLObject -- */ --class UMLRole : public UMLObject --{ -- Q_OBJECT --public: -- -- UMLRole(UMLAssociation * parent, UMLObject * parentUMLObject, Uml::RoleType::Enum role); -- virtual ~UMLRole(); -- -- bool operator==(const UMLRole & rhs) const; -- -- void setObject(UMLObject *obj); -- UMLObject* object() const; -- -- void setChangeability(Uml::Changeability::Enum value); -- Uml::Changeability::Enum changeability() const; -- -- void setMultiplicity(const QString &multi); -- QString multiplicity() const; -- -- UMLAssociation * parentAssociation() const; -- -- Uml::RoleType::Enum role() const; -- -- UMLObject* clone() const { return NULL; } -- -- void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- -- virtual bool showPropertiesDialog(QWidget *parent = 0); -- --protected: -- -- bool load(QDomElement& element); -- --private: -- -- UMLAssociation * m_pAssoc; -- Uml::RoleType::Enum m_role; -- QString m_Multi; -- Uml::Changeability::Enum m_Changeability; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlstereotypelist.h umbrello-kf6-15.08.1/umbrello/umlstereotypelist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlstereotypelist.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umlstereotypelist.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,22 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2012 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLSTEREOTYPELIST_H --#define UMLSTEREOTYPELIST_H -- --#include -- --// forward declaration --class UMLStereotype; -- --typedef QList UMLStereotypeList; --typedef QListIterator UMLStereotypeListIt; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umltemplatelist.h umbrello-kf6-15.08.1/umbrello/umltemplatelist.h ---- umbrello-kf6-15.08.1.orig/umbrello/umltemplatelist.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/umltemplatelist.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,23 +0,0 @@ --/*************************************************************************** -- * * -- * 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. * -- * * -- * copyright (C) 2004-2007 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLTEMPLATELIST_H --#define UMLTEMPLATELIST_H -- --#include -- --// forward declaration --class UMLTemplate; -- --typedef QList UMLTemplateList; --typedef QListIterator UMLTemplateListIt; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/activitywidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/activitywidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/activitywidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/activitywidget.cpp 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,457 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "activitywidget.h" -+ -+// app includes -+#include "activitydialog.h" -+#include "debug_utils.h" -+#include "docwindow.h" -+#include "listpopupmenu.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "umlview.h" -+ -+// kde includes -+#include -+#if QT_VERSION < 0x050000 -+#include -+#endif -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+#include -+/** -+ * Creates a Activity widget. -+ * -+ * @param scene The parent of the widget. -+ * @param activityType The type of activity. -+ * @param id The ID to assign (-1 will prompt a new ID.) -+ */ -+ActivityWidget::ActivityWidget(UMLScene * scene, ActivityType activityType, Uml::ID::Type id) -+ : UMLWidget(scene, WidgetBase::wt_Activity, id), -+ m_activityType(activityType) -+{ -+ // set non zero size to avoid crash on painting -+ setSize(1, 1); -+} -+ -+/** -+ * Destructor. -+ */ -+ActivityWidget::~ActivityWidget() -+{ -+} -+ -+/** -+ * Returns the type of activity. -+ */ -+ActivityWidget::ActivityType ActivityWidget::activityType() const -+{ -+ return m_activityType; -+} -+ -+/** -+ * Returns the type string of activity. -+ */ -+QString ActivityWidget::activityTypeStr() const -+{ -+ return QLatin1String(ENUM_NAME(ActivityWidget, ActivityType, m_activityType)); -+} -+ -+/** -+ * Sets the type of activity. -+ */ -+void ActivityWidget::setActivityType(ActivityType activityType) -+{ -+ m_activityType = activityType; -+ updateGeometry(); -+ UMLWidget::m_resizable = true; -+} -+ -+/** -+ * Determines whether a toolbar button represents an Activity. -+ * CHECK: currently unused - can this be removed? -+ * -+ * @param tbb The toolbar button enum input value. -+ * @param resultType The ActivityType corresponding to tbb. -+ * This is only set if tbb is an Activity. -+ * @return True if tbb represents an Activity. -+ */ -+bool ActivityWidget::isActivity(WorkToolBar::ToolBar_Buttons tbb, -+ ActivityType& resultType) -+{ -+ bool status = true; -+ switch (tbb) { -+ case WorkToolBar::tbb_Initial_Activity: -+ resultType = Initial; -+ break; -+ case WorkToolBar::tbb_Activity: -+ resultType = Normal; -+ break; -+ case WorkToolBar::tbb_End_Activity: -+ resultType = End; -+ break; -+ case WorkToolBar::tbb_Final_Activity: -+ resultType = Final; -+ break; -+ case WorkToolBar::tbb_Branch: -+ resultType = Branch; -+ break; -+ default: -+ status = false; -+ break; -+ } -+ return status; -+} -+ -+/** -+ * This method get the name of the preText attribute. -+ */ -+QString ActivityWidget::preconditionText() const -+{ -+ return m_preconditionText; -+} -+ -+/** -+ * This method set the name of the preText attribute -+ */ -+void ActivityWidget::setPreconditionText(const QString& aPreText) -+{ -+ m_preconditionText = aPreText; -+ updateGeometry(); -+ adjustAssocs(x(), y()); -+} -+ -+/** -+ * This method get the name of the postText attribute. -+ */ -+QString ActivityWidget::postconditionText() const -+{ -+ return m_postconditionText; -+} -+ -+/** -+ * This method set the name of the postText attribute -+ */ -+void ActivityWidget::setPostconditionText(const QString& aPostText) -+{ -+ m_postconditionText = aPostText; -+ updateGeometry(); -+ adjustAssocs(x(), y()); -+} -+ -+/** -+ * Reimplemented from UMLWidget::showPropertiesDialog to show a -+ * properties dialog for an ActivityWidget. -+ */ -+void ActivityWidget::showPropertiesDialog() -+{ -+ UMLApp::app()->docWindow()->updateDocumentation(false); -+ -+ QPointer dialog = new ActivityDialog(umlScene()->activeView(), this); -+ if (dialog->exec() && dialog->getChangesMade()) { -+ UMLApp::app()->docWindow()->showDocumentation(this, true); -+ UMLApp::app()->document()->setModified(true); -+ } -+ delete dialog; -+} -+ -+/** -+ * Overrides the standard paint event. -+ */ -+void ActivityWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ int w = width(); -+ int h = height(); -+ -+ // Only for the final activity -+ float x; -+ float y; -+ QPen pen = painter->pen(); -+ -+ switch (m_activityType) -+ { -+ case Normal: -+ UMLWidget::setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) { -+ painter->setBrush(UMLWidget::fillColor()); -+ } -+ { -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ int textStartY = (h / 2) - (fontHeight / 2); -+ painter->drawRoundRect(0, 0, w, h, (h * 60) / w, 60); -+ painter->setPen(textColor()); -+ painter->setFont(UMLWidget::font()); -+ painter->drawText(ACTIVITY_MARGIN, textStartY, -+ w - ACTIVITY_MARGIN * 2, fontHeight, Qt::AlignCenter, name()); -+ } -+ break; -+ -+ case Initial: -+ painter->setPen(QPen(WidgetBase::lineColor(), 1)); -+ painter->setBrush(WidgetBase::lineColor()); -+ painter->drawEllipse(0, 0, w, h); -+ break; -+ -+ case Final: -+ UMLWidget::setPenFromSettings(painter); -+ painter->setBrush(Qt::white); -+ pen.setWidth(2); -+ pen.setColor (Qt::red); -+ painter->setPen(pen); -+ painter->drawEllipse(0, 0, w, h); -+ x = w/2 ; -+ y = h/2 ; -+ { -+ const float w2 = 0.7071 * (float)w / 2.0; -+ painter->drawLine((int)(x - w2 + 1), (int)(y - w2 + 1), (int)(x + w2), (int)(y + w2)); -+ painter->drawLine((int)(x + w2 - 1), (int)(y - w2 + 1), (int)(x - w2), (int)(y + w2)); -+ } -+ break; -+ -+ case End: -+ painter->setPen(QPen(WidgetBase::lineColor(), 1)); -+ painter->setBrush(WidgetBase::lineColor()); -+ painter->drawEllipse(0, 0, w, h); -+ painter->setBrush(Qt::white); -+ painter->drawEllipse(1, 1, w - 2, h - 2); -+ painter->setBrush(WidgetBase::lineColor()); -+ painter->drawEllipse(3, 3, w - 6, h - 6); -+ break; -+ -+ case Branch: -+ UMLWidget::setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) { -+ painter->setBrush(UMLWidget::fillColor()); -+ } -+ { -+ QPolygon array(4); -+ array[ 0 ] = QPoint(w / 2, 0); -+ array[ 1 ] = QPoint(w, h / 2); -+ array[ 2 ] = QPoint(w / 2, h); -+ array[ 3 ] = QPoint(0, h / 2); -+ painter->drawPolygon(array); -+ painter->drawPolyline(array); -+ } -+ break; -+ -+ case Invok: -+ UMLWidget::setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) { -+ painter->setBrush(UMLWidget::fillColor()); -+ } -+ { -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ int textStartY = (h / 2) - (fontHeight / 2); -+ painter->drawRoundRect(0, 0, w, h, (h * 60) / w, 60); -+ painter->setPen(textColor()); -+ painter->setFont(UMLWidget::font()); -+ painter->drawText(ACTIVITY_MARGIN, textStartY, -+ w - ACTIVITY_MARGIN * 2, fontHeight, Qt::AlignCenter, name()); -+ -+ } -+ x = w - (w/5); -+ y = h - (h/3); -+ -+ painter->drawLine((int)x, (int) y, (int)x, (int)(y + 20)); -+ painter->drawLine((int)(x - 10), (int)(y + 10), (int)(x + 10), (int)(y + 10)); -+ painter->drawLine((int)(x - 10), (int)(y + 10), (int)(x - 10), (int)(y + 20)); -+ painter->drawLine((int)(x + 10), (int)(y + 10), (int)(x + 10), (int)(y + 20)); -+ break; -+ -+ case Param: -+ UMLWidget::setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) { -+ painter->setBrush(UMLWidget::fillColor()); -+ } -+ { -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ QString preCond= QLatin1String("<> ") + preconditionText(); -+ QString postCond= QLatin1String("<> ") + postconditionText(); -+ //int textStartY = (h / 2) - (fontHeight / 2); -+ painter->drawRoundRect(0, 0, w, h, (h * 60) / w, 60); -+ painter->setPen(textColor()); -+ painter->setFont(UMLWidget::font()); -+ painter->drawText(ACTIVITY_MARGIN, fontHeight + 10, -+ w - ACTIVITY_MARGIN * 2, fontHeight, Qt::AlignCenter, preCond); -+ painter->drawText(ACTIVITY_MARGIN, fontHeight * 2 + 10, -+ w - ACTIVITY_MARGIN * 2, fontHeight, Qt::AlignCenter, postCond); -+ painter->drawText(ACTIVITY_MARGIN, (fontHeight / 2), -+ w - ACTIVITY_MARGIN * 2, fontHeight, Qt::AlignCenter, name()); -+ } -+ -+ break; -+ } -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Overridden from UMLWidget due to emission of signal sigActMoved() -+ */ -+void ActivityWidget::moveWidgetBy(qreal diffX, qreal diffY) -+{ -+ UMLWidget::moveWidgetBy(diffX, diffY); -+ emit sigActMoved(diffX, diffY); -+} -+ -+/** -+ * Loads the widget from the "activitywidget" XMI element. -+ */ -+bool ActivityWidget::loadFromXMI(QDomElement& qElement) -+{ -+ if(!UMLWidget::loadFromXMI(qElement)) -+ return false; -+ setName(qElement.attribute(QLatin1String("activityname"))); -+ setDocumentation(qElement.attribute(QLatin1String("documentation"))); -+ setPreconditionText(qElement.attribute(QLatin1String("precondition"))); -+ setPostconditionText(qElement.attribute(QLatin1String("postcondition"))); -+ -+ QString type = qElement.attribute(QLatin1String("activitytype"), QLatin1String("1")); -+ setActivityType((ActivityType)type.toInt()); -+ -+ return true; -+} -+ -+/** -+ * Saves the widget to the "activitywidget" XMI element. -+ */ -+void ActivityWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement activityElement = qDoc.createElement(QLatin1String("activitywidget")); -+ UMLWidget::saveToXMI(qDoc, activityElement); -+ activityElement.setAttribute(QLatin1String("activityname"), name()); -+ activityElement.setAttribute(QLatin1String("documentation"), documentation()); -+ activityElement.setAttribute(QLatin1String("precondition"), preconditionText()); -+ activityElement.setAttribute(QLatin1String("postcondition"), postconditionText()); -+ activityElement.setAttribute(QLatin1String("activitytype"), m_activityType); -+ qElement.appendChild(activityElement); -+} -+ -+/** -+ * Overrides Method from UMLWidget. -+ */ -+void ActivityWidget::constrain(qreal& width, qreal& height) -+{ -+ if (m_activityType == Normal || m_activityType == Invok || m_activityType == Param) { -+ UMLWidget::constrain(width, height); -+ return; -+ } -+ -+ if (width > height) -+ width = height; -+ else if (height > width) -+ height = width; -+ -+ UMLWidget::constrain(width, height); -+} -+ -+/** -+ * Captures any popup menu signals for menus it created. -+ */ -+void ActivityWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ -+ switch(sel) { -+ case ListPopupMenu::mt_Rename: -+ { -+ bool ok = false; -+ QString n = name(); -+#if QT_VERSION >= 0x050000 -+ n = QInputDialog::getText(Q_NULLPTR, -+ i18n("Enter Activity Name"), -+ i18n("Enter the name of the new activity:"), -+ QLineEdit::Normal, -+ n, &ok); -+#else -+ n = KInputDialog::getText(i18n("Enter Activity Name"), -+ i18n("Enter the name of the new activity:"), -+ n, &ok); -+#endif -+ if (ok && !n.isEmpty()) { -+ setName(n); -+ } -+ } -+ break; -+ -+ case ListPopupMenu::mt_Properties: -+ showPropertiesDialog(); -+ break; -+ -+ default: -+ UMLWidget::slotMenuSelection(action); -+ } -+} -+ -+/** -+ * Overrides method from UMLWidget -+ */ -+QSizeF ActivityWidget::minimumSize() const -+{ -+ if (m_activityType == Normal || m_activityType == Invok || m_activityType == Param) { -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ -+ int textWidth = fm.width(name()); -+ int height = fontHeight; -+ height = height > ACTIVITY_HEIGHT ? height : ACTIVITY_HEIGHT; -+ height += ACTIVITY_MARGIN * 2; -+ -+ textWidth = textWidth > ACTIVITY_WIDTH ? textWidth : ACTIVITY_WIDTH; -+ -+ if (m_activityType == Invok) { -+ height += 40; -+ } else if (m_activityType == Param) { -+ QString maxSize; -+ -+ maxSize = name().length() > postconditionText().length() ? name() : postconditionText(); -+ maxSize = maxSize.length() > preconditionText().length() ? maxSize : preconditionText(); -+ -+ textWidth = fm.width(maxSize); -+ textWidth = textWidth + 50; -+ height += 100; -+ } -+ -+ int width = textWidth > ACTIVITY_WIDTH ? textWidth : ACTIVITY_WIDTH; -+ -+ width += ACTIVITY_MARGIN * 4; -+ return QSizeF(width, height); -+ } -+ else if (m_activityType == Branch) { -+ return QSizeF(20, 20); -+ } -+ return QSizeF(15, 15); -+} -+ -+/** -+ * Overrides method from UMLWidget -+ */ -+QSizeF ActivityWidget::maximumSize() -+{ -+ if (m_activityType == Normal || m_activityType == Invok || m_activityType == Param) { -+ return UMLWidget::maximumSize(); -+ } -+ if (m_activityType == Branch) { -+ return QSizeF(50, 50); -+ } -+ return QSizeF(30, 30); -+} -+ -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/activitywidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/activitywidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/activitywidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/activitywidget.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,98 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ACTIVITYWIDGET_H -+#define ACTIVITYWIDGET_H -+ -+#include "umlwidget.h" -+#include "worktoolbar.h" -+ -+#define ACTIVITY_MARGIN 5 -+#define ACTIVITY_WIDTH 30 -+#define ACTIVITY_HEIGHT 10 -+ -+/** -+ * This class is the graphical version of a UML Activity. A ActivityWidget is created -+ * by a @ref UMLView. An ActivityWidget belongs to only one @ref UMLView instance. -+ * When the @ref UMLView instance that this class belongs to, it will be automatically deleted. -+ * -+ * The ActivityWidget class inherits from the @ref UMLWidget class which adds most of the functionality -+ * to this class. -+ * -+ * @short A graphical version of a UML Activity. -+ * @author Paul Hensgen -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class ActivityWidget : public UMLWidget -+{ -+ Q_OBJECT -+ Q_ENUMS(ActivityType) -+public: -+ enum ActivityType -+ { -+ Initial = 0, -+ Normal, -+ End, -+ Final, -+ Branch, -+ Invok, -+ Param -+ }; -+ -+ explicit ActivityWidget(UMLScene * scene, ActivityType activityType = Normal, Uml::ID::Type id = Uml::ID::None); -+ virtual ~ActivityWidget(); -+ -+ ActivityType activityType() const; -+ QString activityTypeStr() const; -+ void setActivityType(ActivityType activityType); -+ -+ static bool isActivity(WorkToolBar::ToolBar_Buttons tbb, -+ ActivityType& resultType); -+ -+ QString preconditionText() const; -+ void setPreconditionText(const QString&); -+ -+ QString postconditionText() const; -+ void setPostconditionText(const QString&); -+ -+ virtual void showPropertiesDialog(); -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ virtual void moveWidgetBy(qreal diffX, qreal diffY); -+ -+ virtual bool loadFromXMI(QDomElement & qElement); -+ virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+ void constrain(qreal& width, qreal& height); -+ -+signals: -+ /** -+ * Emitted when the activity widget is moved. -+ * Provides the delta X and delta Y amount by which the widget was moved -+ * relative to the previous position. -+ * Slots into PinWidget::slotActMoved() -+ * @param diffX The difference between previous and new X value. -+ * @param diffY The difference between previous and new Y value. -+ */ -+ void sigActMoved(qreal diffX, qreal diffY); -+ -+public Q_SLOTS: -+ virtual void slotMenuSelection(QAction* action); -+ -+protected: -+ virtual QSizeF minimumSize() const; -+ virtual QSizeF maximumSize(); -+ -+ ActivityType m_activityType; ///< Type of activity. -+ -+ QString m_preconditionText; -+ QString m_postconditionText; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/actorwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/actorwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/actorwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/actorwidget.cpp 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,104 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header file -+#include "actorwidget.h" -+ -+// local includes -+#include "actor.h" -+#include "umlview.h" -+ -+/** -+ * Constructs an ActorWidget. -+ * -+ * @param scene The parent of this ActorWidget. -+ * @param a The Actor class this ActorWidget will display. -+ */ -+ActorWidget::ActorWidget(UMLScene * scene, UMLActor *a) -+ : UMLWidget(scene, WidgetBase::wt_Actor, a) -+{ -+ setFixedAspectRatio(true); -+} -+ -+/** -+ * Destructor. -+ */ -+ActorWidget::~ActorWidget() -+{ -+} -+ -+/** -+ * Overrides the standard paint event. -+ */ -+void ActorWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ UMLWidget::setPenFromSettings(painter); -+ if(UMLWidget::useFillColor()) -+ painter->setBrush(UMLWidget::fillColor()); -+ const int w = width(); -+ const int h = height(); -+ painter->setFont(UMLWidget::font()); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ bool drawStereotype = umlObject() && !umlObject()->stereotype().isEmpty(); -+ const int a_height = h - (drawStereotype ? 2 * fontHeight : fontHeight) - A_MARGIN; -+ const int h2 = a_height / 2; -+ const int a_width = (h2); -+ const int middleX = w / 2; -+ const int thirdY = a_height / 3; -+ -+ //draw actor -+ painter->drawEllipse(middleX - a_width / 2, 0, a_width, thirdY); //head -+ painter->drawLine(middleX, thirdY, -+ middleX, thirdY * 2); //body -+ painter->drawLine(middleX, 2 * thirdY, -+ middleX - a_width / 2, a_height); //left leg -+ painter->drawLine(middleX, 2 * thirdY, -+ middleX + a_width / 2, a_height); //right leg -+ painter->drawLine(middleX - a_width / 2, thirdY + thirdY / 2, -+ middleX + a_width / 2, thirdY + thirdY / 2); //arms -+ //draw text -+ painter->setPen(textColor()); -+ if (drawStereotype) -+ painter->drawText(A_MARGIN, h - 2 * fontHeight, w - A_MARGIN * 2, fontHeight, Qt::AlignCenter, umlObject()->stereotype(true)); -+ painter->drawText(A_MARGIN, h - fontHeight, -+ w - A_MARGIN * 2, fontHeight, Qt::AlignCenter, name()); -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Saves the widget to the "actorwidget" XMI element. -+ * Note: For loading from XMI, the inherited parent method is used. -+ */ -+void ActorWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement actorElement = qDoc.createElement(QLatin1String("actorwidget")); -+ UMLWidget::saveToXMI(qDoc, actorElement); -+ qElement.appendChild(actorElement); -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF ActorWidget::minimumSize() const -+{ -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ const int textWidth = fm.width(name()); -+ bool drawStereotype = umlObject() && !umlObject()->stereotype().isEmpty(); -+ int width = textWidth > A_WIDTH ? textWidth : A_WIDTH; -+ int height = A_HEIGHT + (drawStereotype ? 2 * fontHeight : fontHeight) + A_MARGIN; -+ width += A_MARGIN * 2; -+ return QSizeF(width, height); -+} -+ -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/actorwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/actorwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/actorwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/actorwidget.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,55 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ACTORWIDGET_H -+#define ACTORWIDGET_H -+ -+#include "umlwidget.h" -+ -+#define A_WIDTH 20 -+#define A_HEIGHT 40 -+#define A_MARGIN 5 -+ -+class UMLActor; -+ -+/** -+ * This class is the graphical version of a UML Actor. -+ * An ActorWidget is created by a @ref UMLView. An ActorWidget belongs to only -+ * one @ref UMLView instance. -+ * When the @ref UMLView instance that this class belongs to is destroyed, the -+ * ActorWidget will be automatically deleted. -+ * -+ * If the UMLActor class that this ActorWidget is displaying is deleted, the -+ * @ref UMLView will make sure that this instance is also deleted. -+ * -+ * The ActorWidget class inherits from the @ref UMLWidget class -+ * which adds most of the functionality to this class. -+ * -+ * @short A graphical version of a UML Actor. -+ * @author Paul Hensgen -+ * @see UMLWidget -+ * @see UMLView -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class ActorWidget : public UMLWidget -+{ -+public: -+ ActorWidget(UMLScene * scene, UMLActor *o); -+ virtual ~ActorWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+protected: -+ QSizeF minimumSize() const; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/artifactwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/artifactwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/artifactwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/artifactwidget.cpp 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,293 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "artifactwidget.h" -+ -+// app includes -+#include "artifact.h" -+#include "debug_utils.h" -+#include "umlscene.h" -+#include "umlview.h" -+ -+/** -+ * Constructs a ArtifactWidget. -+ * -+ * @param scene The parent of this ArtifactWidget. -+ * @param a The Artifact this widget will be representing. -+ */ -+ArtifactWidget::ArtifactWidget(UMLScene *scene, UMLArtifact *a) -+ : UMLWidget(scene, WidgetBase::wt_Artifact, a) -+{ -+ setSize(100, 30); -+} -+ -+/** -+ * Destructor. -+ */ -+ArtifactWidget::~ArtifactWidget() -+{ -+} -+ -+/** -+ * Reimplemented to paint the articraft widget. Some part of specific -+ * drawing is delegeted to private method like drawAsFile.. -+ */ -+void ArtifactWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ UMLWidget::setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) { -+ painter->setBrush(UMLWidget::fillColor()); -+ } else { -+ painter->setBrush(m_scene->backgroundColor()); -+ } -+ -+ if (umlObject()) { -+ UMLArtifact *umlart = static_cast(m_umlObject); -+ UMLArtifact::Draw_Type drawType = umlart->getDrawAsType(); -+ switch (drawType) { -+ case UMLArtifact::defaultDraw: -+ paintAsNormal(painter, option); -+ break; -+ case UMLArtifact::file: -+ paintAsFile(painter, option); -+ break; -+ case UMLArtifact::library: -+ paintAsLibrary(painter, option); -+ break; -+ case UMLArtifact::table: -+ paintAsTable(painter, option); -+ break; -+ default: -+ uWarning() << "Artifact drawn as unknown type"; -+ break; -+ } -+ } -+ else { -+ uWarning() << "Cannot draw as there is no UMLArtifact for this widget."; -+ } -+} -+ -+/** -+ * Reimplemented from WidgetBase::saveToXMI to save the widget to -+ * the "artifactwidget" XMI element. -+ */ -+void ArtifactWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement conceptElement = qDoc.createElement(QLatin1String("artifactwidget")); -+ UMLWidget::saveToXMI(qDoc, conceptElement); -+ qElement.appendChild(conceptElement); -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF ArtifactWidget::minimumSize() const -+{ -+ if (!m_umlObject) { -+ return UMLWidget::minimumSize(); -+ } -+ UMLArtifact *umlart = static_cast(m_umlObject); -+ if (umlart->getDrawAsType() == UMLArtifact::defaultDraw) { -+ return calculateNormalSize(); -+ } else { -+ return calculateIconSize(); -+ } -+} -+ -+/** -+ * calculates the size when drawing as an icon (it's the same size for all icons) -+ */ -+QSize ArtifactWidget::calculateIconSize() const -+{ -+ const QFontMetrics &fm = getFontMetrics(FT_BOLD_ITALIC); -+ const int fontHeight = fm.lineSpacing(); -+ -+ int width = fm.width(m_umlObject->name()); -+ -+ width = width<50 ? 50 : width; -+ -+ int height = 50 + fontHeight; -+ -+ return QSize(width, height); -+} -+ -+/** -+ * calculates the size for drawing as a box -+ */ -+QSize ArtifactWidget::calculateNormalSize() const -+{ -+ const QFontMetrics &fm = getFontMetrics(FT_BOLD_ITALIC); -+ const int fontHeight = fm.lineSpacing(); -+ -+ int width = fm.width(m_umlObject->name()); -+ -+ int tempWidth = 0; -+ if(!m_umlObject->stereotype().isEmpty()) { -+ tempWidth = fm.width(m_umlObject->stereotype(true)); -+ } -+ width = tempWidth>width ? tempWidth : width; -+ width += ARTIFACT_MARGIN * 2; -+ -+ int height = (2*fontHeight) + (ARTIFACT_MARGIN * 2); -+ -+ return QSize(width, height); -+} -+ -+/** -+ * draw as a file icon -+ */ -+void ArtifactWidget::paintAsFile(QPainter *painter, const QStyleOptionGraphicsItem *option) -+{ -+ const int w = width(); -+ const int h = height(); -+ QFont font = UMLWidget::font(); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ -+ int startX = (w/2) - 25; -+ int iconHeight = h - fontHeight; -+ QPolygon pointArray(5); -+ pointArray.setPoint(0, startX, 0); -+ pointArray.setPoint(1, startX + 40, 0); -+ pointArray.setPoint(2, startX + 50, 10); -+ pointArray.setPoint(3, startX + 50, iconHeight); -+ pointArray.setPoint(4, startX, iconHeight); -+ painter->drawPolygon(pointArray); -+ -+ painter->drawLine(startX + 40, 0, startX + 40, 10); -+ painter->drawLine(startX + 40, 10, startX + 50, 10); -+ painter->drawLine(startX + 40, 0, startX + 50, 10); -+ -+ painter->setPen(textColor()); -+ painter->setFont(font); -+ -+ painter->drawText(0, h - fontHeight, -+ w, fontHeight, Qt::AlignCenter, name()); -+ -+ UMLWidget::paint(painter, option); -+} -+ -+/** -+ * draw as a library file icon -+ */ -+void ArtifactWidget::paintAsLibrary(QPainter *painter, const QStyleOptionGraphicsItem *option) -+{ -+ //FIXME this should have gears on it -+ const int w = width(); -+ const int h = height(); -+ const QFont font = UMLWidget::font(); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ -+ const int startX = (w/2) - 25; -+ const int iconHeight = h - fontHeight; -+ QPolygon pointArray(5); -+ pointArray.setPoint(0, startX, 0); -+ pointArray.setPoint(1, startX + 40, 0); -+ pointArray.setPoint(2, startX + 50, 10); -+ pointArray.setPoint(3, startX + 50, iconHeight); -+ pointArray.setPoint(4, startX, iconHeight); -+ painter->drawPolygon(pointArray); -+ -+ painter->drawLine(startX + 40, 0, startX + 40, 10); -+ painter->drawLine(startX + 40, 10, startX + 50, 10); -+ painter->drawLine(startX + 40, 0, startX + 50, 10); -+ -+ painter->setPen(textColor()); -+ painter->setFont(font); -+ -+ painter->drawText(0, h - fontHeight, -+ w, fontHeight, Qt::AlignCenter, name()); -+ -+ UMLWidget::paint(painter, option); -+} -+ -+/** -+ * draw as a database table icon -+ */ -+void ArtifactWidget::paintAsTable(QPainter *painter, const QStyleOptionGraphicsItem *option) -+{ -+ const int w = width(); -+ const int h = height(); -+ const QFont font = UMLWidget::font(); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ -+ const int startX = (w/2) - 25; -+ const int iconHeight = h - fontHeight; -+ -+ painter->drawRect(startX, 0, 50, h - fontHeight + 1); -+ painter->drawLine(startX + 20, 0, startX + 20, iconHeight); -+ painter->drawLine(startX + 30, 0, startX + 30, iconHeight); -+ painter->drawLine(startX + 40, 0, startX + 40, iconHeight); -+ painter->drawLine(startX, (iconHeight/2), startX + 49, (iconHeight/2)); -+ painter->drawLine(startX, (iconHeight/2) + (iconHeight/4), -+ startX + 49, (iconHeight/2) + (iconHeight/4)); -+ -+ QPen thickerPen = painter->pen(); -+ thickerPen.setWidth(2); -+ painter->setPen(thickerPen); -+ painter->drawLine(startX + 10, 0, startX + 10, iconHeight); -+ painter->drawLine(startX, (iconHeight/4), startX + 50, (iconHeight/4)); -+ -+ painter->setPen(textColor()); -+ painter->setFont(font); -+ -+ painter->drawText(0, h - fontHeight, -+ w, fontHeight, Qt::AlignCenter, name()); -+ -+ UMLWidget::paint(painter, option); -+} -+ -+/** -+ * draw as a box -+ */ -+void ArtifactWidget::paintAsNormal(QPainter *painter, const QStyleOptionGraphicsItem *option) -+{ -+ int w = width(); -+ int h = height(); -+ QFont font = UMLWidget::font(); -+ font.setBold(true); -+ const QFontMetrics &fm = getFontMetrics(FT_BOLD); -+ const int fontHeight = fm.lineSpacing(); -+ QString stereotype = m_umlObject->stereotype(); -+ -+ painter->drawRect(0, 0, w, h); -+ -+ painter->setPen(textColor()); -+ painter->setFont(font); -+ -+ if (!stereotype.isEmpty()) { -+ painter->drawText(ARTIFACT_MARGIN, (h/2) - fontHeight, -+ w, fontHeight, Qt::AlignCenter, m_umlObject->stereotype(true)); -+ } -+ -+ int lines; -+ if (!stereotype.isEmpty()) { -+ lines = 2; -+ } else { -+ lines = 1; -+ } -+ -+ if (lines == 1) { -+ painter->drawText(0, (h/2) - (fontHeight/2), -+ w, fontHeight, Qt::AlignCenter, name()); -+ } else { -+ painter->drawText(0, (h/2), -+ w, fontHeight, Qt::AlignCenter, name()); -+ } -+ -+ UMLWidget::paint(painter, option); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/artifactwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/artifactwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/artifactwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/artifactwidget.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,55 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ARTIFACTWIDGET_H -+#define ARTIFACTWIDGET_H -+ -+#include "umlwidget.h" -+ -+class UMLScene; -+class UMLArtifact; -+ -+#define ARTIFACT_MARGIN 5 -+ -+/** -+ * Defines a graphical version of the @ref UMLArtifact. -+ * Most of the functionality will come from the @ref UMLWidget class. -+ * -+ * @short A graphical version of a Artifact. -+ * @author Jonathan Riddell -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class ArtifactWidget : public UMLWidget -+{ -+public: -+ ArtifactWidget(UMLScene *scene, UMLArtifact *a); -+ virtual ~ArtifactWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ // Note: For loading from XMI, the inherited parent method is used. -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+protected: -+ QSizeF minimumSize() const; -+ -+private: -+ void paintAsFile(QPainter *painter, const QStyleOptionGraphicsItem *option); -+ void paintAsLibrary(QPainter *painter, const QStyleOptionGraphicsItem *option); -+ void paintAsTable(QPainter *painter, const QStyleOptionGraphicsItem *option); -+ void paintAsNormal(QPainter *painter, const QStyleOptionGraphicsItem *option); -+ -+ QSize calculateIconSize() const; -+ QSize calculateNormalSize() const; -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/associationline.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/associationline.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/associationline.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/associationline.cpp 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,1404 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "associationline.h" -+ -+// application includes -+#include "associationwidget.h" -+#include "debug_utils.h" -+#include "umlwidget.h" -+ -+// qt includes -+#include -+#include -+ -+// system includes -+#include -+#include -+ -+DEBUG_REGISTER_DISABLED(AssociationLine) -+ -+// Initialize static variables. -+const qreal AssociationLine::Delta = 5; -+const qreal AssociationLine::SelectedPointDiameter = 4; -+const qreal AssociationLine::SelfAssociationMinimumHeight = 30; -+ -+/** -+ * Constructor. -+ * Constructs an AssociationLine item with its parent being \a parent. -+ */ -+AssociationLine::AssociationLine(AssociationWidget *association) -+ : QGraphicsObject(association), -+ m_associationWidget(association), -+ m_activePointIndex(-1), -+ m_activeSegmentIndex(-1), -+ m_startSymbol(0), -+ m_endSymbol(0), -+ m_subsetSymbol(0), -+ m_collaborationLineItem(0), -+ m_collaborationLineHead(0), -+ m_layout(Polyline) -+{ -+ Q_ASSERT(association); -+ setFlag(QGraphicsLineItem::ItemIsSelectable); -+ setAcceptHoverEvents(true); -+ setZValue(3); -+} -+ -+/** -+ * Destructor. -+ */ -+AssociationLine::~AssociationLine() -+{ -+} -+ -+/** -+ * Returns the point at the point index. -+ * @return point at given index -+ */ -+QPointF AssociationLine::point(int index) const -+{ -+ if ((index < 0) | (index >= m_points.size())) { -+ uWarning() << "Index " << index << " out of range [0.." << m_points.size() - 1 << "]."; -+ return QPointF(-1.0, -1.0); -+ } -+ return m_points.at(index); -+} -+ -+/** -+ * Sets the point value at given index to \a point. -+ */ -+bool AssociationLine::setPoint(int index, const QPointF &point) -+{ -+ if ((index < 0) | (index >= m_points.size())) { -+ uWarning() << "Index " << index << " out of range [0.." << m_points.size() - 1 << "]."; -+ return false; -+ } -+ if (m_points.at(index) == point) { -+ return false; // nothing to change -+ } -+ prepareGeometryChange(); -+ m_points[index] = point; -+ alignSymbols(); -+ return true; -+} -+ -+/** -+ * Shortcut for point(0). -+ */ -+QPointF AssociationLine::startPoint() const -+{ -+ return m_points.at(0); -+} -+ -+/** -+ * Shortcut for end point. -+ */ -+QPointF AssociationLine::endPoint() const -+{ -+ return m_points.at(m_points.size()-1); -+} -+ -+/** -+ * Inserts the passed in \a point at the \a index passed in and -+ * recalculates the bounding rect. -+ */ -+void AssociationLine::insertPoint(int index, const QPointF &point) -+{ -+ prepareGeometryChange(); -+ m_points.insert(index, point); -+ alignSymbols(); -+} -+ -+/** -+ * Removes the point at \a index passed in. -+ * @see removeNonEndPoint -+ */ -+void AssociationLine::removePoint(int index) -+{ -+ prepareGeometryChange(); -+ m_points.remove(index); -+ alignSymbols(); -+} -+ -+/** -+ * Returns the amount of POINTS on the line. -+ * Includes start and end points. -+ * @return number of points in the AssociationLine -+ */ -+int AssociationLine::count() const -+{ -+ return m_points.size(); -+} -+ -+/** -+ * Removes all the points and signals a geometry update. -+ */ -+void AssociationLine::cleanup() -+{ -+ if (!m_points.isEmpty()) { -+ prepareGeometryChange(); -+ m_points.clear(); -+ alignSymbols(); -+ } -+} -+ -+/** -+ * This method optimizes the number of points in the -+ * AssociationLine. This can be used to reduce the clutter caused -+ * due to too many points. -+ * TODO: Use delta comparison 'closestPointIndex' instead of exact comparison. -+ * TODO: Not used anywhere. -+ */ -+void AssociationLine::optimizeLinePoints() -+{ -+ int i = 1; -+ prepareGeometryChange(); -+ while (i < m_points.size()) { -+ if (m_points.at(i) == m_points.at(i-1)) { -+ m_points.remove(i); -+ } -+ else { -+ ++i; -+ } -+ } -+ alignSymbols(); -+} -+ -+/** -+ * Return index of point closer a given delta. -+ * -+ * @param point The point which is to be tested for closeness. -+ * @param delta The distance the point should be closer to. -+ * -+ * @retval "Index" of the first line point closer to the \a point passed. -+ * @retval -1 If no line point is closer to passed in \a point. -+ */ -+int AssociationLine::closestPointIndex(const QPointF &point, qreal delta) const -+{ -+ for(int i = 0; i < m_points.size(); ++i) { -+ const QPointF& linePoint = m_points.at(i); -+ // Apply distance formula to see point closeness. -+ qreal deltaXSquare = (point.x() - linePoint.x()) * (point.x() - linePoint.x()); -+ qreal deltaYSquare = (point.y() - linePoint.y()) * (point.y() - linePoint.y()); -+ -+ qreal lhs = deltaXSquare + deltaYSquare; -+ qreal rhs = delta * delta; -+ -+ if (lhs <= rhs) { -+ return i; -+ } -+ } -+ return -1; -+} -+ -+/** -+ * Return index of closest segment. -+ * -+ * @param point The point which is to be tested for closeness. -+ * -+ * @return Index of the line segment closest to the \a point passed; -+ * -1 if no line segment is closer to passed in \a point. -+ */ -+int AssociationLine::closestSegmentIndex(const QPointF &point, qreal delta) const -+{ -+ QPainterPathStroker stroker; -+ stroker.setWidth(delta); -+ -+ for(int i = 1; i < m_points.size(); ++i) { -+ QLineF segment(m_points[i-1], m_points[i]); -+ -+ QPainterPath path; -+ path.moveTo(segment.p1()); -+ path.lineTo(segment.p2()); -+ -+ path = stroker.createStroke(path); -+ -+ if (path.contains(point)) { -+ return i-1; -+ } -+ } -+ return -1; -+} -+ -+/** -+ * Retval True If point at \a index is start or end. -+ */ -+bool AssociationLine::isEndPointIndex(int index) const -+{ -+ const int size = m_points.size(); -+ Q_ASSERT(index >= 0 && index < size); -+ -+ return (index == 0 || index == (size - 1)); -+} -+ -+/** -+ * Retval True If segment at \a index is start or end. -+ */ -+bool AssociationLine::isEndSegmentIndex(int index) const -+{ -+ // num of seg = num of points - 1 -+ const int size = m_points.size() - 1; -+ Q_ASSERT(index >= 0 && index < size); -+ -+ return (index == 0 || index == (size - 1)); -+} -+ -+/** -+ * Sets the start and end points. -+ */ -+bool AssociationLine::setEndPoints(const QPointF &start, const QPointF &end) -+{ -+ const int size = m_points.size(); -+ -+ prepareGeometryChange(); -+ -+ if (size == 0) { -+ m_points.insert(0, start); -+ m_points.insert(1, end); -+ } -+ else if (size == 1) { -+ m_points[0] = start; -+ m_points.insert(1, end); -+ } -+ else { -+ m_points[0] = start; -+ m_points[size-1] = end; -+ } -+ -+ alignSymbols(); -+ return true; -+} -+ -+/** -+ * Debug helper method to write out the points. -+ */ -+void AssociationLine::dumpPoints() -+{ -+ for (int i = 1; i < m_points.size(); ++i) { -+ QPointF p = m_points.at(i); -+ DEBUG(DBG_SRC) << i << ". point x:" << p.x() << " / y:" << p.y(); -+ } -+} -+ -+/** -+ * Loads AssociationLine information saved in \a qElement XMI element. -+ */ -+bool AssociationLine::loadFromXMI(QDomElement &qElement) -+{ -+ QString layout = qElement.attribute(QLatin1String("layout"), QLatin1String("polyline")); -+ m_layout = fromString(layout); -+ -+ QDomNode node = qElement.firstChild(); -+ -+ m_points.clear(); -+ -+ QDomElement startElement = node.toElement(); -+ if(startElement.isNull() || startElement.tagName() != QLatin1String("startpoint")) { -+ return false; -+ } -+ QString x = startElement.attribute(QLatin1String("startx"), QLatin1String("0")); -+ qreal nX = x.toFloat(); -+ QString y = startElement.attribute(QLatin1String("starty"), QLatin1String("0")); -+ qreal nY = y.toFloat(); -+ QPointF startPoint(nX, nY); -+ -+ node = startElement.nextSibling(); -+ QDomElement endElement = node.toElement(); -+ if(endElement.isNull() || endElement.tagName() != QLatin1String("endpoint")) { -+ return false; -+ } -+ x = endElement.attribute(QLatin1String("endx"), QLatin1String("0")); -+ nX = x.toFloat(); -+ y = endElement.attribute(QLatin1String("endy"), QLatin1String("0")); -+ nY = y.toFloat(); -+ QPointF endPoint(nX, nY); -+ setEndPoints(startPoint, endPoint); -+ QPointF point; -+ node = endElement.nextSibling(); -+ QDomElement element = node.toElement(); -+ int i = 1; -+ while(!element.isNull()) { -+ if(element.tagName() == QLatin1String("point")) { -+ x = element.attribute(QLatin1String("x"), QLatin1String("0")); -+ y = element.attribute(QLatin1String("y"), QLatin1String("0")); -+ point.setX(x.toFloat()); -+ point.setY(y.toFloat()); -+ insertPoint(i++, point); -+ } -+ node = element.nextSibling(); -+ element = node.toElement(); -+ } -+ -+ return true; -+} -+ -+/** -+ * Saves association line information into XMI element named "linepath". -+ * @note Stored as linepath for backwared compatibility -+ */ -+void AssociationLine::saveToXMI(QDomDocument &qDoc, QDomElement &qElement) -+{ -+ QPointF point = m_associationWidget->mapToScene(startPoint()); -+ QDomElement lineElement = qDoc.createElement(QLatin1String("linepath")); -+ lineElement.setAttribute(QLatin1String("layout"), toString(m_layout)); -+ QDomElement startElement = qDoc.createElement(QLatin1String("startpoint")); -+ startElement.setAttribute(QLatin1String("startx"), point.x()); -+ startElement.setAttribute(QLatin1String("starty"), point.y()); -+ lineElement.appendChild(startElement); -+ QDomElement endElement = qDoc.createElement(QLatin1String("endpoint")); -+ point = m_associationWidget->mapToScene(endPoint()); -+ endElement.setAttribute(QLatin1String("endx"), point.x()); -+ endElement.setAttribute(QLatin1String("endy"), point.y()); -+ lineElement.appendChild(endElement); -+ for(int i = 1; i < count()-1; ++i) { -+ QDomElement pointElement = qDoc.createElement(QLatin1String("point")); -+ point = m_associationWidget->mapToScene(this->point(i)); -+ pointElement.setAttribute(QLatin1String("x"), point.x()); -+ pointElement.setAttribute(QLatin1String("y"), point.y()); -+ lineElement.appendChild(pointElement); -+ } -+ qElement.appendChild(lineElement); -+} -+ -+/** -+ * Returns the type of brush to use depending on the type of Association. -+ */ -+QBrush AssociationLine::brush() const -+{ -+ QBrush brush(Qt::solid-kf6Pattern); -+ Uml::AssociationType::Enum type = m_associationWidget->associationType(); -+ if (type == Uml::AssociationType::Aggregation || -+ type == Uml::AssociationType::Generalization || -+ type == Uml::AssociationType::Realization) { -+ brush.setColor(Qt::white); -+ } -+ if (type == Uml::AssociationType::Composition) { -+ brush.setColor(m_associationWidget->lineColor()); -+ } -+ return brush; -+} -+ -+/** -+ * Returns the type of pen to use depending on the type of Association. -+ */ -+QPen AssociationLine::pen() const -+{ -+ QPen pen(m_associationWidget->lineColor(), -+ m_associationWidget->lineWidth(), -+ Qt::solid-kf6Line, -+ Qt::RoundCap, -+ Qt::RoundJoin); -+ Uml::AssociationType::Enum type = m_associationWidget->associationType(); -+ if (type == Uml::AssociationType::Dependency || -+ type == Uml::AssociationType::Realization || -+ type == Uml::AssociationType::Anchor) { -+ pen.setStyle(Qt::DashLine); -+ } -+ return pen; -+} -+ -+/** -+ * This method simply ensures presence of two points and -+ * adds the needed points for self associations. -+ */ -+void AssociationLine::calculateInitialEndPoints() -+{ -+ if (m_associationWidget->isSelf() && count() < 4) { -+ for (int i = count(); i < 4; ++i) { -+ insertPoint(i, QPointF()); -+ } -+ UMLWidget *wid = m_associationWidget->widgetForRole(Uml::RoleType::B); -+ if (!wid) { -+ uError() << "AssociationWidget is partially constructed." -+ "UMLWidget for role B is null."; -+ return; -+ } -+ const QRectF rect = m_associationWidget->mapFromScene( -+ mapToScene(wid->rect()).boundingRect()).boundingRect(); -+ -+ qreal l = rect.left() + .25 * rect.width(); -+ qreal r = rect.left() + .75 * rect.width(); -+ bool drawAbove = rect.top() >= SelfAssociationMinimumHeight; -+ qreal y = drawAbove ? rect.top() : rect.bottom(); -+ qreal yOffset = SelfAssociationMinimumHeight; -+ if (drawAbove) { -+ yOffset *= -1.0; -+ } -+ -+ setPoint(0, QPointF(l, y)); -+ setPoint(1, QPointF(l, y + yOffset)); -+ setPoint(2, QPointF(r, y + yOffset)); -+ setPoint(3, QPointF(r, y)); -+ } else if (!m_associationWidget->isSelf() && count() < 2) { -+ setEndPoints(QPointF(), QPointF()); -+ } -+} -+ -+/** -+ * This method creates, deletes symbols and collaboration lines based on -+ * m_associationWidget->associationType(). -+ * -+ * Call this method when associationType of m_associationWidget changes. -+ */ -+void AssociationLine::reconstructSymbols() -+{ -+ switch( m_associationWidget->associationType() ) { -+ case Uml::AssociationType::State: -+ case Uml::AssociationType::Activity: -+ case Uml::AssociationType::Exception: -+ case Uml::AssociationType::UniAssociation: -+ case Uml::AssociationType::Dependency: -+ setStartSymbol(Symbol::None); -+ setEndSymbol(Symbol::OpenArrow); -+ removeSubsetSymbol(); -+ removeCollaborationLine(); -+ break; -+ -+ case Uml::AssociationType::Relationship: -+ setStartSymbol(Symbol::None); -+ setEndSymbol(Symbol::CrowFeet); -+ removeSubsetSymbol(); -+ removeCollaborationLine(); -+ break; -+ -+ case Uml::AssociationType::Generalization: -+ case Uml::AssociationType::Realization: -+ setStartSymbol(Symbol::None); -+ setEndSymbol(Symbol::ClosedArrow); -+ removeSubsetSymbol(); -+ removeCollaborationLine(); -+ break; -+ -+ case Uml::AssociationType::Composition: -+ case Uml::AssociationType::Aggregation: -+ setStartSymbol(Symbol::Diamond); -+ setEndSymbol(Symbol::None); -+ removeSubsetSymbol(); -+ removeCollaborationLine(); -+ break; -+ -+ case Uml::AssociationType::Containment: -+ setStartSymbol(Symbol::Circle); -+ setEndSymbol(Symbol::None); -+ removeSubsetSymbol(); -+ removeCollaborationLine(); -+ break; -+ -+ case Uml::AssociationType::Child2Category: -+ setStartSymbol(Symbol::None); -+ setEndSymbol(Symbol::None); -+ createSubsetSymbol(); -+ removeCollaborationLine(); -+ break; -+ -+ case Uml::AssociationType::Coll_Message_Synchronous: -+ case Uml::AssociationType::Coll_Message_Asynchronous: -+ case Uml::AssociationType::Coll_Message_Self: -+ setStartSymbol(Symbol::None); -+ setEndSymbol(Symbol::None); -+ removeSubsetSymbol(); -+ createCollaborationLine(); -+ break; -+ -+ default: -+ break; -+ } -+ alignSymbols(); -+} -+ -+/** -+ * Sets the Symbol to appear at the first line segment to \a symbol. -+ * -+ * If symbol == Symbol::None , then it deletes the symbol item. -+ */ -+void AssociationLine::setStartSymbol(Symbol::SymbolType symbolType) -+{ -+ Q_ASSERT(symbolType != Symbol::Count); -+ if (symbolType == Symbol::None) { -+ delete m_startSymbol; -+ m_startSymbol = 0; -+ return; -+ } -+ -+ if (m_startSymbol) { -+ m_startSymbol->setSymbolType(symbolType); -+ } -+ else { -+ m_startSymbol = new Symbol(symbolType, m_associationWidget); -+ } -+ m_startSymbol->setPen(pen()); -+ m_startSymbol->setBrush(brush()); -+} -+ -+/** -+ * Sets the Symbol to appear at the last line segment to \a symbol. -+ * -+ * If symbol == Symbol::None , then it deletes the symbol item. -+ */ -+void AssociationLine::setEndSymbol(Symbol::SymbolType symbolType) -+{ -+ Q_ASSERT(symbolType != Symbol::Count); -+ if (symbolType == Symbol::None) { -+ delete m_endSymbol; -+ m_endSymbol = 0; -+ return; -+ } -+ -+ if (m_endSymbol) { -+ m_endSymbol->setSymbolType(symbolType); -+ } -+ else { -+ m_endSymbol = new Symbol(symbolType, m_associationWidget); -+ } -+ m_endSymbol->setPen(pen()); -+ m_endSymbol->setBrush(brush()); -+} -+ -+/** -+ * Constructs a new subset symbol. -+ */ -+void AssociationLine::createSubsetSymbol() -+{ -+ delete m_subsetSymbol; // recreate -+ m_subsetSymbol = new Symbol(Symbol::Subset, m_associationWidget); -+ m_subsetSymbol->setPen(pen()); -+ m_subsetSymbol->setBrush(brush()); -+} -+ -+/** -+ * Removes the subset symbol if it existed by deleting appropriate items. -+ */ -+void AssociationLine::removeSubsetSymbol() -+{ -+ delete m_subsetSymbol; -+ m_subsetSymbol = 0; -+} -+ -+/** -+ * Constructs the open arrow symbol and arrow line, that would represent Collaboration line. -+ */ -+void AssociationLine::createCollaborationLine() -+{ -+ const QPen p = pen(); -+ -+ // recreate -+ delete m_collaborationLineItem; -+ delete m_collaborationLineHead; -+ -+ m_collaborationLineItem = new QGraphicsLineItem(m_associationWidget); -+ m_collaborationLineItem->setPen(p); -+ -+ if (m_associationWidget->associationType() == Uml::AssociationType::Coll_Message_Synchronous) { -+ m_collaborationLineHead = new Symbol(Symbol::ClosedArrow, m_associationWidget); -+ m_collaborationLineHead->setBrush(p.color()); -+ } -+ else -+ m_collaborationLineHead = new Symbol(Symbol::OpenArrow, m_associationWidget); -+ m_collaborationLineHead->setPen(p); -+} -+ -+/** -+ * Removes collaboration line by deleting the head and line item. -+ */ -+void AssociationLine::removeCollaborationLine() -+{ -+ delete m_collaborationLineItem; -+ m_collaborationLineItem = 0; -+ -+ delete m_collaborationLineHead; -+ m_collaborationLineHead = 0; -+} -+ -+/** -+ * This method aligns both the \b "start" and \b "end" symbols to -+ * the current angles of the \b "first" and the \b "last" line -+ * segment respectively. -+ */ -+void AssociationLine::alignSymbols() -+{ -+ const int sz = m_points.size(); -+ if (sz < 2) { -+ // cannot align if there is no line (one line = 2 points) -+ return; -+ } -+ -+ QList polygons = path().toSubpathPolygons(); -+ -+ if (m_startSymbol) { -+ QPolygonF firstLine = polygons.first(); -+ QLineF segment(firstLine.at(1), firstLine.at(0)); -+ m_startSymbol->alignTo(segment); -+ } -+ -+ if (m_endSymbol) { -+ QPolygonF lastLine = polygons.last(); -+ int maxIndex = lastLine.size(); -+ QLineF segment(lastLine.at(maxIndex-2), lastLine.at(maxIndex-1)); -+ m_endSymbol->alignTo(segment); -+ } -+ -+ if (m_subsetSymbol) { -+ QPointF p1 = path().pointAtPercent(0.4); -+ QPointF p2 = path().pointAtPercent(0.5); -+ QLineF segment(p1, p2); -+ m_subsetSymbol->alignTo(segment); -+ } -+ -+ if (m_collaborationLineItem) { -+ const qreal distance = 10; -+ const int midSegmentIndex = (sz - 1) / 2; -+ -+ const QPointF a = m_points.at(midSegmentIndex); -+ const QPointF b = m_points.at(midSegmentIndex + 1); -+ -+ if (a == b) -+ return; -+ -+ const QPointF p1 = (a + b) / 2.0; -+ const QPointF p2 = (p1 + b) / 2.0; -+ -+ // Reversed line as we want normal in opposite direction. -+ QLineF segment(p2, p1); -+ QLineF normal = segment.normalVector().unitVector(); -+ normal.setLength(distance); -+ -+ QLineF actualLine; -+ actualLine.setP2(normal.p2()); -+ -+ normal.translate(p1 - p2); -+ actualLine.setP1(normal.p2()); -+ -+ m_collaborationLineItem->setLine(actualLine); -+ m_collaborationLineHead->alignTo(actualLine); -+ } -+} -+ -+/** -+ * @return The path of the AssociationLine. -+ */ -+QPainterPath AssociationLine::path() const -+{ -+ if (m_points.count() > 0) { -+ QPainterPath path; -+ switch (m_layout) { -+ case Direct: -+ path.moveTo(m_points.first()); -+ path.lineTo(m_points.last()); -+ break; -+ -+ case Spline: -+ path = createBezierCurve(m_points); -+ break; -+ -+ case Orthogonal: -+ path = createOrthogonalPath(m_points); -+ break; -+ -+ case Polyline: -+ default: -+ QPolygonF polygon(m_points); -+ path.addPolygon(polygon); -+ break; -+ } -+ return path; -+ } -+ else { -+ return QPainterPath(); -+ } -+} -+ -+/** -+ * The points are used for the bounding rect. The reason is, -+ * that for splines the control points are further away from the path. -+ * @return The bounding rectangle for the AssociationLine. -+ */ -+QRectF AssociationLine::boundingRect() const -+{ -+ QPolygonF polygon(m_points); -+ QRectF rect = polygon.boundingRect(); -+ const qreal margin(5.0); -+ rect.adjust(-margin, -margin, margin, margin); -+ return rect; -+} -+ -+/** -+ * @return The shape of the AssociationLine. -+ */ -+QPainterPath AssociationLine::shape() const -+{ -+ QPainterPathStroker stroker; -+ stroker.setWidth(qMax(2*SelectedPointDiameter, pen().widthF()) + 2.0); // allow delta region -+ stroker.setCapStyle(Qt::FlatCap); -+ return stroker.createStroke(path()); -+} -+ -+/** -+ * Convert enum LayoutType to string. -+ */ -+QString AssociationLine::toString(LayoutType layout) -+{ -+ return QLatin1String(ENUM_NAME(AssociationLine, LayoutType, layout)); -+} -+ -+/** -+ * Convert string to enum LayoutType. -+ */ -+AssociationLine::LayoutType AssociationLine::fromString(const QString &layout) -+{ -+ if (layout == QLatin1String("Direct")) -+ return Direct; -+ if (layout == QLatin1String("Spline")) -+ return Spline; -+ if (layout == QLatin1String("Orthogonal")) -+ return Orthogonal; -+ return Polyline; -+} -+ -+/** -+ * Return the layout type of the association line. -+ * @return the currently used layout -+ */ -+AssociationLine::LayoutType AssociationLine::layout() const -+{ -+ return m_layout; -+} -+ -+/** -+ * Set the layout type of the association line. -+ * @param layout the desired layout to set -+ */ -+void AssociationLine::setLayout(LayoutType layout) -+{ -+ prepareGeometryChange(); -+ m_layout = layout; -+ DEBUG(DBG_SRC) << "new layout = " << toString(m_layout); -+ if (m_layout == Spline) { -+ createSplinePoints(); -+ } -+ alignSymbols(); -+} -+ -+/** -+ * For a cubic Bezier curve at least four points are needed. -+ * If there are less, the missing points will be created. -+ * Note: Implementation is only for two points. -+ */ -+void AssociationLine::createSplinePoints() -+{ -+ if (m_points.size() == 2) { // create two points -+ QPointF p1 = m_points.first(); // start point -+ QPointF p2 = m_points.last(); // end point -+ qreal dx = p2.x() - p1.x(); -+ qreal dy = p2.y() - p1.y(); -+ qreal oneThirdX = 0.33 * dx; -+ qreal oneThirdY = 0.33 * dy; -+ QPointF c1(p1.x() + oneThirdX, // control point 1 -+ p1.y() - oneThirdY); -+ QPointF c2(p2.x() - oneThirdX, // control point 2 -+ p2.y() + oneThirdY); -+ insertPoint(1, c1); -+ insertPoint(2, c2); -+ } -+ if (m_points.size() == 3) { // create one point -+ // insertPoint(1 or 2, ); -+ // Note: For now we use a quadratic Bezier curve in createBezierCurve(...). -+ } -+} -+ -+/** -+ * Returns a Bézier path from given points. -+ * @param points points which define the Bézier curve -+ * @return cubic Bézier spline -+ */ -+QPainterPath AssociationLine::createBezierCurve(QVector points) -+{ -+ QPainterPath path; -+ if (points.size() > 3) { // cubic Bezier curve(s) -+ path.moveTo(points.at(0)); -+ int i = 1; -+ while (i + 2 < points.size()) { -+ path.cubicTo(points.at(i), points.at(i+1), points.at(i+2)); -+ i += 3; -+ } -+ while (i < points.size()) { // draw a line if points are not modulo 3 -+ path.lineTo(points.at(i)); -+ ++i; -+ } -+ } -+ else { -+ if (points.size() == 3) { // quadratic Bezier curve -+ path.moveTo(points.at(0)); -+ path.quadTo(points.at(1), points.at(2)); -+ } -+ else { // should not be reached -+ QPolygonF polygon(points); -+ path.addPolygon(polygon); -+ } -+ } -+ return path; -+} -+ -+/** -+ * Returns an orthogonal path constructed of vertical and horizontal segments -+ * through the given points. -+ * @param points base points for the path -+ * @return orthogonal path -+ */ -+QPainterPath AssociationLine::createOrthogonalPath(QVector points) -+{ -+ QPainterPath path; -+ if (points.size() > 1) { -+ QPointF start = points.first(); -+ QPointF end = points.last(); -+ qreal deltaX = fabs(start.x() - end.x()); -+ qreal deltaY = fabs(start.y() - end.y()); -+ // DEBUG("AssociationLine") << "start=" << start << " / end=" << end -+ // << " / deltaX=" << deltaX << " / deltaY=" << deltaY; -+ QVector vector; -+ for (int i = 0; i < points.size() - 1; ++i) { -+ QPointF curr = points.at(i); -+ QPointF next = points.at(i+1); -+ QPointF center = (next + curr)/2.0; -+ -+ vector.append(curr); -+ if (deltaX < deltaY) { -+ // go vertical first -+ vector.append(QPointF(curr.x(), center.y())); -+ vector.append(QPointF(next.x(), center.y())); -+ } -+ else { -+ // go horizontal first -+ vector.append(QPointF(center.x(), curr.y())); -+ vector.append(QPointF(center.x(), next.y())); -+ } -+ vector.append(next); -+ } -+ -+ QPolygonF rectLine(vector); -+ path.addPolygon(rectLine); -+ } -+ else { -+ QPolygonF polygon(points); -+ path.addPolygon(polygon); -+ } -+ return path; -+} -+ -+/** -+ * Reimplemented from QGraphicsItem::paint. -+ * Draws the AssociationLine and also takes care of highlighting active point or line. -+ */ -+void AssociationLine::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) -+{ -+ Q_UNUSED(widget) -+ QPen _pen = pen(); -+ const QColor orig = _pen.color().lighter(); -+ QColor invertedColor(orig.green(), orig.blue(), orig.red()); -+ if (invertedColor == _pen.color()) { -+ // Ensure different color. -+ invertedColor.setRed((invertedColor.red() + 50) % 256); -+ } -+ invertedColor.setAlpha(150); -+ -+ int sz = m_points.size(); -+ if (sz < 1) { -+ // not enough points - do nothing -+ return; -+ } -+ -+ QPointF savedStart = m_points.first(); -+ QPointF savedEnd = m_points.last(); -+ -+ // modify the m_points array not to include the Symbol, the value depends on Symbol -+ if (m_startSymbol) { -+ QPointF newStart = m_startSymbol->mapToParent(m_startSymbol->symbolEndPoints().first); -+ m_points[0] = newStart; -+ } -+ -+ if (m_endSymbol) { -+ QPointF newEnd = m_endSymbol->mapToParent(m_endSymbol->symbolEndPoints().first); -+ m_points[sz - 1] = newEnd; -+ } -+ -+ painter->setPen(_pen); -+ painter->setBrush(Qt::NoBrush); -+ painter->drawPath(path()); -+ -+ if (option->state & QStyle::State_Selected) { -+ // make the association broader in the selected state -+ QPainterPathStroker stroker; -+ stroker.setWidth(3.0); -+ QPainterPath outline = stroker.createStroke(path()); -+ QColor shadowColor(Qt::lightGray); -+ shadowColor.setAlpha(80); -+ QBrush shadowBrush(shadowColor); -+ painter->setBrush(shadowBrush); -+ painter->setPen(Qt::NoPen); -+ painter->drawPath(outline); -+ -+ // set color for selected painting -+ _pen.setColor(Qt::blue); -+ QRectF circle(0, 0, SelectedPointDiameter, SelectedPointDiameter); -+ painter->setBrush(_pen.color()); -+ painter->setPen(Qt::NoPen); -+ -+ // draw points -+ circle.moveCenter(savedStart); -+ painter->drawRect(circle); -+ for (int i = 1; i < sz-1; ++i) { -+ if (i != m_activePointIndex) { -+ circle.moveCenter(m_points.at(i)); -+ painter->drawRect(circle); -+ } -+ } -+ circle.moveCenter(savedEnd); -+ painter->drawRect(circle); -+ -+ if (m_activePointIndex != -1) { -+ painter->setBrush(invertedColor); -+ painter->setPen(Qt::NoPen); -+ circle.setWidth(1.5*SelectedPointDiameter); -+ circle.setHeight(1.5*SelectedPointDiameter); -+ circle.moveCenter(m_points.at(m_activePointIndex)); -+ painter->drawEllipse(circle); -+ } -+ else if (m_activeSegmentIndex != -1) { -+ if (m_layout == Polyline) { -+ painter->setPen(QPen(invertedColor, _pen.widthF() + 1)); -+ painter->setBrush(Qt::NoBrush); -+ -+ QLineF segmentLine(m_points[m_activeSegmentIndex], m_points[m_activeSegmentIndex + 1]); -+ painter->drawLine(segmentLine); -+ } -+ } -+ // debug info -+ if (Tracer::instance()->isEnabled(QString::fromLatin1(metaObject()->className()))) { -+ painter->setPen(Qt::green); -+ painter->setBrush(Qt::NoBrush); -+ painter->drawPath(shape()); -+ painter->setPen(Qt::red); -+ painter->drawRect(boundingRect()); -+ // origin -+ painter->drawLine(-10, 0, 10, 0); -+ painter->drawLine(0, -10, 0, 10); -+ } -+ -+ } -+ -+ // now restore the points array -+ m_points[0] = savedStart; -+ m_points[sz - 1] = savedEnd; -+} -+ -+/** -+ * Determines the active point or segment, the latter being given more priority. -+ */ -+void AssociationLine::mousePressEvent(QGraphicsSceneMouseEvent *event) -+{ -+ DEBUG(DBG_SRC) << "at " << event->scenePos(); -+ if (event->buttons() & Qt::LeftButton) { -+ m_activePointIndex = closestPointIndex(event->scenePos()); -+ if (m_activePointIndex != -1 && isEndPointIndex(m_activePointIndex)) { -+ // end points are not drawn and hence not active -+ m_activePointIndex = -1; -+ } -+ // calculate only if active point index is -1 -+ m_activeSegmentIndex = (m_activePointIndex != -1) ? -1 : closestSegmentIndex(event->scenePos()); -+ } -+ else if (event->buttons() & Qt::RightButton) { -+ DEBUG(DBG_SRC) << "call context menu of association widget at " << event->scenePos(); -+ } -+ else { -+ m_activePointIndex = -1; -+ m_activeSegmentIndex = -1; -+ } -+} -+ -+/** -+ * Moves the point or line if active. -+ */ -+void AssociationLine::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -+{ -+ UMLScene* scene = m_associationWidget->umlScene(); -+ -+ QPointF oldPos = event->scenePos(); -+ QPointF newPos( -+ scene->snappedX(oldPos.x()), -+ scene->snappedY(oldPos.y()) -+ ); -+ -+ // Prevent the moving vertex from disappearing underneath a widget -+ // (else there's no way to get it back.) -+ UMLWidget *onW = scene->widgetAt(newPos); -+ if (onW && onW->baseType() != WidgetBase::wt_Box) { // boxes are transparent -+ const qreal pX = newPos.x(); -+ const qreal pY = newPos.y(); -+ const qreal wX = onW->x(); -+ const qreal wY = onW->y(); -+ const qreal wWidth = onW->width(); -+ const qreal wHeight = onW->height(); -+ if (pX > wX && pX < wX + wWidth) { -+ const qreal midX = wX + wWidth / 2.0; -+ if (pX <= midX) -+ newPos.setX(wX); -+ else -+ newPos.setX(wX + wWidth); -+ } -+ if (pY > wY && pY < wY + wHeight) { -+ const qreal midY = wY + wHeight / 2.0; -+ if (pY <= midY) -+ newPos.setY(wY); -+ else -+ newPos.setY(wY + wHeight); -+ } -+ } -+ -+ if (m_activePointIndex != -1) { -+ // Move a single point (snap behaviour) -+ setPoint(m_activePointIndex, newPos); -+ } -+ else if (m_activeSegmentIndex != -1 && !isEndSegmentIndex(m_activeSegmentIndex)) { -+ // Move a segment (between two points, snap behaviour not implemented) -+ QPointF delta = event->scenePos() - event->lastScenePos(); -+ setPoint(m_activeSegmentIndex, m_points[m_activeSegmentIndex] + delta); -+ setPoint(m_activeSegmentIndex + 1, m_points[m_activeSegmentIndex + 1] + delta); -+ } -+} -+ -+/** -+ * Reset active indices and also push undo command. -+ */ -+void AssociationLine::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -+{ -+ if (event->buttons() & Qt::LeftButton) { -+ m_activeSegmentIndex = -1; -+ m_activePointIndex = -1; -+ } -+} -+ -+/** -+ * Calculates the "to be highlighted" point and segment indicies -+ * and updates if necessary. -+ */ -+void AssociationLine::hoverEnterEvent(QGraphicsSceneHoverEvent *event) -+{ -+ DEBUG(DBG_SRC) << "at " << event->scenePos(); -+ int oldPointIndex = m_activePointIndex; -+ int oldSegmentIndex = m_activeSegmentIndex; -+ -+ m_activePointIndex = closestPointIndex(event->scenePos()); -+ // End points are not drawn and hence not active. -+ if (m_activePointIndex != -1 && isEndPointIndex(m_activePointIndex)) { -+ m_activePointIndex = -1; -+ } -+ // Activate segment index only if point index is -1 -+ m_activeSegmentIndex = (m_activePointIndex != -1) ? -1 : closestSegmentIndex(event->scenePos()); -+ -+ bool isChanged = (oldSegmentIndex != m_activeSegmentIndex || oldPointIndex != m_activePointIndex); -+ if (isChanged) { -+ m_associationWidget->update(); -+ } -+} -+ -+/** -+ * Calculates the "to be highlighted" point and segment indicies -+ * and updates if necessary. -+ */ -+void AssociationLine::hoverMoveEvent(QGraphicsSceneHoverEvent *event) -+{ -+ int oldPointIndex = m_activePointIndex; -+ int oldSegmentIndex = m_activeSegmentIndex; -+ -+ m_activePointIndex = closestPointIndex(event->scenePos()); -+ // End points are not drawn and hence not active. -+ if (m_activePointIndex != -1 && isEndPointIndex(m_activePointIndex)) { -+ m_activePointIndex = -1; -+ } -+ // Activate segment index only if point index is -1 -+ m_activeSegmentIndex = (m_activePointIndex != -1) ? -1 : closestSegmentIndex(event->scenePos()); -+ -+ bool isChanged = (oldSegmentIndex != m_activeSegmentIndex || oldPointIndex != m_activePointIndex); -+ if (isChanged) { -+ m_associationWidget->update(); -+ } -+} -+ -+/** -+ * Reset active indicies and updates. -+ */ -+void AssociationLine::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) -+{ -+ DEBUG(DBG_SRC) << "at " << event->scenePos(); -+ //Q_UNUSED(event) -+ m_activePointIndex = -1; -+ m_activeSegmentIndex = -1; -+ m_associationWidget->update(); -+} -+ -+//----------------------------------------------------------------------------- -+ -+/** -+ * SymbolEndPoints: -+ * The first point is where the AssociationLine's visible line is -+ * supposed to end. -+ * The second points is where the actual symbol part is to appear. -+ */ -+Symbol::SymbolProperty Symbol::symbolTable[Count] = -+{ -+ { -+ QRectF(-6, 0, 12, 10), QPainterPath(), QLineF(0, 0, 0, 10), -+ SymbolEndPoints(QPointF(0, 10), QPointF(0, 10)) -+ }, -+ { -+ QRectF(-6, 0, 12, 10), QPainterPath(), QLineF(0, 0, 0, 10), -+ SymbolEndPoints(QPointF(0, 0), QPointF(0, 10)) -+ }, -+ { -+ QRectF(-6, 0, 12, 10), QPainterPath(), QLineF(0, 0, 0, 10), -+ SymbolEndPoints(QPointF(0, 10), QPointF(0, 10)) -+ }, -+ { -+ QRectF(-5, -10, 10, 20), QPainterPath(), QLineF(0, -10, 0, 10), -+ SymbolEndPoints(QPointF(0, -10), QPointF(0, 10)) -+ }, -+ { -+ QRectF(-15, -10, 30, 20), QPainterPath(), QLineF(-10, 0, 0, 0), -+ SymbolEndPoints(QPointF(0, 0), QPointF(0, 0)) -+ }, -+ { -+ QRectF(-8, -8, 16, 16), QPainterPath(), QLineF(0, -8, 0, 8), -+ SymbolEndPoints(QPointF(0, -8), QPointF(0, 8)) -+ } -+ -+}; -+ -+/** -+ * @internal A convenience method to setup shapes of all symbols. -+ */ -+void Symbol::setupSymbolTable() -+{ -+ SymbolProperty &openArrow = symbolTable[OpenArrow]; -+ if (openArrow.shape.isEmpty()) { -+ QRectF rect = openArrow.boundRect; -+ // Defines a 'V' shape arrow fitting in the bound rect. -+ openArrow.shape.moveTo(rect.topLeft()); -+ openArrow.shape.lineTo(rect.center().x(), rect.bottom()); -+ openArrow.shape.lineTo(rect.topRight()); -+ } -+ -+ SymbolProperty &closedArrow = symbolTable[ClosedArrow]; -+ if (closedArrow.shape.isEmpty()) { -+ QRectF rect = closedArrow.boundRect; -+ // Defines a 'V' shape arrow fitting in the bound rect. -+ closedArrow.shape.moveTo(rect.topLeft()); -+ closedArrow.shape.lineTo(rect.center().x(), rect.bottom()); -+ closedArrow.shape.lineTo(rect.topRight()); -+ closedArrow.shape.lineTo(rect.topLeft()); -+ } -+ -+ SymbolProperty &crowFeet = symbolTable[CrowFeet]; -+ if (crowFeet.shape.isEmpty()) { -+ QRectF rect = crowFeet.boundRect; -+ // Defines a crowFeet fitting in the bound rect. -+ QPointF topMid(rect.center().x(), rect.top()); -+ -+ // left leg -+ crowFeet.shape.moveTo(rect.bottomLeft()); -+ crowFeet.shape.lineTo(topMid); -+ -+ // middle leg -+ crowFeet.shape.moveTo(rect.center().x(), rect.bottom()); -+ crowFeet.shape.lineTo(topMid); -+ -+ // right leg -+ crowFeet.shape.moveTo(rect.bottomRight()); -+ crowFeet.shape.lineTo(topMid); -+ } -+ -+ SymbolProperty &diamond = symbolTable[Diamond]; -+ if (diamond.shape.isEmpty()) { -+ QRectF rect = diamond.boundRect; -+ // Defines a 'diamond' shape fitting in the bound rect. -+ diamond.shape.moveTo(rect.center().x(), rect.top()); -+ diamond.shape.lineTo(rect.left(), rect.center().y()); -+ diamond.shape.lineTo(rect.center().x(), rect.bottom()); -+ diamond.shape.lineTo(rect.right(), rect.center().y()); -+ diamond.shape.lineTo(rect.center().x(), rect.top()); -+ } -+ -+ SymbolProperty &subset = symbolTable[Subset]; -+ if (subset.shape.isEmpty()) { -+ QRectF rect = subset.boundRect; -+ // Defines an arc fitting in bound rect. -+ qreal start = 90, span = 180; -+ subset.shape.arcMoveTo(rect, start); -+ subset.shape.arcTo(rect, start, span); -+ } -+ -+ SymbolProperty &circle = symbolTable[Circle]; -+ if (circle.shape.isEmpty()) { -+ QRectF rect = circle.boundRect; -+ // Defines a circle with a horizontal-vertical cross lines. -+ circle.shape.addEllipse(rect); -+ -+ circle.shape.moveTo(rect.center().x(), rect.top()); -+ circle.shape.lineTo(rect.center().x(), rect.bottom()); -+ -+ circle.shape.moveTo(rect.left(), rect.center().y()); -+ circle.shape.lineTo(rect.right(), rect.center().y()); -+ } -+ -+} -+ -+/** -+ * Constructs a Symbol with current symbol being \a symbol and -+ * parented to \a parent. -+ */ -+Symbol::Symbol(SymbolType symbolType, QGraphicsItem *parent) -+ : QGraphicsItem(parent), -+ m_symbolType(symbolType) -+{ -+ // ensure SymbolTable is validly initialized -+ setupSymbolTable(); -+} -+ -+/** -+ * Destructor. -+ */ -+Symbol::~Symbol() -+{ -+} -+ -+/** -+ * @return The current symbol being represented. -+ */ -+Symbol::SymbolType Symbol::symbolType() const -+{ -+ return m_symbolType; -+} -+ -+/** -+ * Sets the current symbol type to \a symbol and updates the geometry. -+ */ -+void Symbol::setSymbolType(SymbolType symbolType) -+{ -+ prepareGeometryChange(); // calls update implicitly -+ m_symbolType = symbolType; -+} -+ -+/** -+ * Draws the current symbol using the QPainterPath stored for the current -+ * symbol. -+ */ -+void Symbol::paint(QPainter *painter, const QStyleOptionGraphicsItem * option, QWidget * widget) -+{ -+ Q_UNUSED(option) Q_UNUSED(widget) -+ painter->setPen(m_pen); -+ switch (m_symbolType) { -+ case ClosedArrow: -+ case CrowFeet: -+ case Diamond: -+ painter->setBrush(m_brush); -+ break; -+ default: -+ break; -+ } -+ painter->drawPath(Symbol::symbolTable[m_symbolType].shape); -+} -+ -+/** -+ * @return The bound rectangle for this based on current symbol. -+ */ -+QRectF Symbol::boundingRect() const -+{ -+ const qreal adj = .5 * m_pen.widthF(); -+ return Symbol::symbolTable[m_symbolType].boundRect. -+ adjusted(-adj, -adj, adj, adj); -+} -+ -+/** -+ * @return The path for this based on current symbol. -+ */ -+QPainterPath Symbol::shape() const -+{ -+ QPainterPath path; -+ path.addRect(boundingRect()); -+ return path; -+} -+ -+/** -+ * This method aligns *this* Symbol to the line being -+ * passed. That is, it ensures that the axis of this symbol aligns -+ * exactly with the \a "to" line passed. -+ * -+ * Also this item is moved such that the second end point of the -+ * SymbolEndPoints for the current symbol *collides* with the second end -+ * point of \a "to" line. -+ */ -+void Symbol::alignTo(const QLineF& to) -+{ -+ QLineF toMapped(mapFromParent(to.p1()), mapFromParent(to.p2())); -+ -+ QLineF origAxis = Symbol::symbolTable[m_symbolType].axisLine; -+ QLineF translatedAxis = origAxis.translated(toMapped.p2() - origAxis.p2()); -+ -+ qreal angle = translatedAxis.angleTo(toMapped); -+ setRotation(rotation() - angle); -+ -+ QPointF delta = to.p2() - mapToParent(symbolEndPoints().second); -+ moveBy(delta.x(), delta.y()); -+} -+ -+/** -+ * @return The end points for the symbol. -+ */ -+Symbol::SymbolEndPoints Symbol::symbolEndPoints() const -+{ -+ return Symbol::symbolTable[m_symbolType].endPoints; -+} -+ -+/** -+ * @return The pen used to draw symbol. -+ */ -+QPen Symbol::pen() const -+{ -+ return m_pen; -+} -+ -+/** -+ * Sets the pen used to draw the symbol. -+ */ -+void Symbol::setPen(const QPen& pen) -+{ -+ prepareGeometryChange(); -+ m_pen = pen; -+ if (m_symbolType == ClosedArrow) -+ m_pen.setStyle(Qt::solid-kf6Line); -+} -+ -+/** -+ * @return The brush used to fill symbol. -+ */ -+QBrush Symbol::brush() const -+{ -+ return m_brush; -+} -+ -+/** -+ * Sets the brush used to fill symbol. -+ */ -+void Symbol::setBrush(const QBrush &brush) -+{ -+ m_brush = brush; -+ update(); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/associationline.h umbrello-kf6-15.08.1/umbrello/umlwidgets/associationline.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/associationline.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/associationline.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,207 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ASSOCIATIONLINE_H -+#define ASSOCIATIONLINE_H -+ -+#include "basictypes.h" -+ -+#include -+#include -+#include -+#include -+ -+// forward declarations -+class AssociationWidget; -+class QDomDocument; -+class QDomElement; -+class QPainter; -+ -+/** -+ * This class provides with various symbols that can be embedded in -+ * AssociationLine. It also provides with convenience methods to align -+ * the symbol to AssociationLine. -+ */ -+class Symbol : public QGraphicsItem -+{ -+ public: -+ typedef QPair SymbolEndPoints; -+ -+ /** -+ * This enumeration lists all the symbols that can be used as -+ * embedded on AssociationLine. -+ */ -+ enum SymbolType { -+ None = -1, -+ OpenArrow, -+ ClosedArrow, -+ CrowFeet, -+ Diamond, -+ Subset, -+ Circle, -+ Count -+ }; -+ -+ explicit Symbol(SymbolType symbolType, QGraphicsItem *parent = 0); -+ virtual ~Symbol(); -+ -+ SymbolType symbolType() const; -+ void setSymbolType(SymbolType symbolType); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); -+ -+ virtual QRectF boundingRect() const; -+ virtual QPainterPath shape() const; -+ -+ void alignTo(const QLineF& line); -+ SymbolEndPoints symbolEndPoints() const; -+ -+ QPen pen() const; -+ void setPen(const QPen &pen); -+ -+ QBrush brush() const; -+ void setBrush(const QBrush& brush); -+ -+ private: -+ QPen m_pen; ///< pen used to draw Symbol -+ QBrush m_brush; ///< brush used to fill Symbol -+ SymbolType m_symbolType; ///< current symbol being represented by this item -+ -+ /// A structure to hold a table of values for all symbols. -+ struct SymbolProperty { -+ QRectF boundRect; -+ QPainterPath shape; -+ QLineF axisLine; -+ SymbolEndPoints endPoints; -+ }; -+ -+ static SymbolProperty symbolTable[Symbol::Count]; ///< a table which stores all symbol properties -+ static void setupSymbolTable(); -+}; -+ -+/** -+ * A convenience class that encapsulates geometry management, handles -+ * mouse and hover events, embeds and aligns symbols and finally draws the -+ * lines and points. -+ * Context menu events are handled in AssociationWidget. -+ * -+ * This class is infact a draw and event handling proxy for -+ * AssociationWidget. -+ * -+ * @note m_activePointIndex and m_activeSegmentIndex can't be -+ * active at same time! -+ * -+ * @author Gopala Krishna -+ * @author Andi Fischer -+ * Bugs and comments to uml-devel@lists.sf.net or http://bugs.kde.org -+ */ -+class AssociationLine : public QGraphicsObject -+{ -+ Q_OBJECT -+ Q_ENUMS(LayoutType) -+public: -+ enum LayoutType { -+ Direct = 1, -+ Orthogonal, -+ Polyline, -+ Spline -+ }; -+ -+ static QString toString(LayoutType layout); -+ static LayoutType fromString(const QString& layout); -+ -+ explicit AssociationLine(AssociationWidget *association); -+ virtual ~AssociationLine(); -+ -+ QPointF point(int index) const; -+ bool setPoint(int index, const QPointF& point); -+ QPointF startPoint() const; -+ QPointF endPoint() const; -+ -+ void insertPoint(int index, const QPointF& point); -+ void removePoint(int index); -+ -+ int count() const; -+ void cleanup(); -+ -+ void optimizeLinePoints(); -+ -+ int closestPointIndex(const QPointF& point, qreal delta = Delta) const; -+ int closestSegmentIndex(const QPointF& point, qreal delta = Delta) const; -+ -+ bool isEndPointIndex(int index) const; -+ bool isEndSegmentIndex(int index) const; -+ -+ bool setEndPoints(const QPointF &start, const QPointF &end); -+ -+ void dumpPoints(); -+ -+ bool loadFromXMI(QDomElement &qElement); -+ void saveToXMI(QDomDocument &qDoc, QDomElement &qElement); -+ -+ QBrush brush() const; -+ QPen pen() const; -+ -+ virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget); -+ -+ QPainterPath path() const; -+ -+ QRectF boundingRect() const; -+ QPainterPath shape() const; -+ -+ LayoutType layout() const; -+ void setLayout(LayoutType layout); -+ -+ void mousePressEvent(QGraphicsSceneMouseEvent *event); -+ void mouseMoveEvent(QGraphicsSceneMouseEvent *event); -+ void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); -+ -+ void hoverEnterEvent(QGraphicsSceneHoverEvent *event); -+ void hoverMoveEvent(QGraphicsSceneHoverEvent *event); -+ void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); -+ -+ void calculateInitialEndPoints(); -+ -+ void reconstructSymbols(); -+ -+private: -+ void setStartSymbol(Symbol::SymbolType symbolType); -+ void setEndSymbol(Symbol::SymbolType symbolType); -+ -+ void createSubsetSymbol(); -+ void removeSubsetSymbol(); -+ -+ void createCollaborationLine(); -+ void removeCollaborationLine(); -+ -+ void alignSymbols(); -+ -+ void createSplinePoints(); -+ -+ AssociationWidget *m_associationWidget; ///< association widget for which this line represents -+ QVector m_points; ///< points representing the association line -+ int m_activePointIndex; ///< index of active point which can be dragged to modify association line -+ int m_activeSegmentIndex; ///< index of active segment -+ Symbol *m_startSymbol; ///< symbol drawn at the end of "first" line segment -+ Symbol *m_endSymbol; ///< symbol drawn at the end of "last" line segment -+ Symbol *m_subsetSymbol; ///< subset symbol -+ QGraphicsLineItem *m_collaborationLineItem; ///< parallel arrow line drawn in case of collaboration message -+ Symbol *m_collaborationLineHead; ///< arrow head drawn at end of m_collaborationLineItem -+ LayoutType m_layout; -+ -+ static QPainterPath createBezierCurve(QVector points); -+ static QPainterPath createOrthogonalPath(QVector points); -+ -+ static const qreal Delta; ///< default delta for fuzzy recognition of points closer to point -+ static const qreal SelectedPointDiameter; ///< radius of circles drawn to show "selection" -+ static const qreal SelfAssociationMinimumHeight; ///< minimum height for self association's loop -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/associationwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/associationwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/associationwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/associationwidget.cpp 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,4407 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "associationwidget.h" -+ -+// app includes -+#include "association.h" -+#include "associationline.h" -+#include "associationpropertiesdialog.h" -+#include "assocrules.h" -+#include "attribute.h" -+#include "classifier.h" -+#include "classifierwidget.h" -+#include "debug_utils.h" -+#include "docwindow.h" -+#include "entity.h" -+#include "floatingtextwidget.h" -+#include "listpopupmenu.h" -+#include "messagewidget.h" -+#include "objectwidget.h" -+#include "operation.h" -+#include "optionstate.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "umlview.h" -+#include "umlwidget.h" -+#include "widget_utils.h" -+ -+// kde includes -+#if QT_VERSION < 0x050000 -+#include -+#include -+#include -+#endif -+#include -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#include -+#include -+#endif -+#include -+#include -+#include -+#include -+ -+// system includes -+#include -+ -+#define DBG_AW() DEBUG(QLatin1String("AssociationWidget")) -+DEBUG_REGISTER_DISABLED(AssociationWidget) -+ -+using namespace Uml; -+ -+/** -+ * Constructor is private because the static create() methods shall -+ * be used for constructing AssociationWidgets. -+ * -+ * @param scene The parent view of this widget. -+ */ -+AssociationWidget::AssociationWidget(UMLScene *scene) -+ : WidgetBase(scene, WidgetBase::wt_Association), -+ m_positions_len(0), -+ m_activated(false), -+ m_unNameLineSegment(-1), -+ m_nLinePathSegmentIndex(-1), -+ m_pAssocClassLine(0), -+ m_pAssocClassLineSel0(0), -+ m_pAssocClassLineSel1(0), -+ m_associationLine(new AssociationLine(this)), -+ m_associationClass(0), -+ m_associationType(Uml::AssociationType::Association), -+ m_nameWidget(0) -+{ -+ // floating text widgets objects owned by this association -+ m_role[RoleType::A].changeabilityWidget = 0; -+ m_role[RoleType::B].changeabilityWidget = 0; -+ m_role[RoleType::A].multiplicityWidget = 0; -+ m_role[RoleType::B].multiplicityWidget = 0; -+ m_role[RoleType::A].roleWidget = 0; -+ m_role[RoleType::B].roleWidget = 0; -+ m_role[RoleType::A].umlWidget = 0; -+ m_role[RoleType::B].umlWidget = 0; -+ -+ // associationwidget attributes -+ m_role[RoleType::A].m_WidgetRegion = Uml::Region::Error; -+ m_role[RoleType::B].m_WidgetRegion = Uml::Region::Error; -+ m_role[RoleType::A].m_nIndex = 0; -+ m_role[RoleType::B].m_nIndex = 0; -+ m_role[RoleType::A].m_nTotalCount = 0; -+ m_role[RoleType::B].m_nTotalCount = 0; -+ m_role[RoleType::A].visibility = Uml::Visibility::Public; -+ m_role[RoleType::B].visibility = Uml::Visibility::Public; -+ m_role[RoleType::A].changeability = Uml::Changeability::Changeable; -+ m_role[RoleType::B].changeability = Uml::Changeability::Changeable; -+ -+ setFlag(QGraphicsLineItem::ItemIsSelectable); -+ setAcceptHoverEvents(true); -+} -+ -+/** -+ * This constructor is really only for loading from XMI, otherwise it -+ * should not be allowed as it creates an incomplete associationwidget. -+ * -+ * @param scene The parent view of this widget. -+ */ -+AssociationWidget* AssociationWidget::create(UMLScene *scene) -+{ -+ AssociationWidget* instance = new AssociationWidget(scene); -+ return instance; -+} -+ -+/** -+ * Preferred constructor (static factory method.) -+ * -+ * @param scene The parent view of this widget. -+ * @param pWidgetA Pointer to the role A widget for the association. -+ * @param assocType The AssociationType::Enum for this association. -+ * @param pWidgetB Pointer to the role B widget for the association. -+ * @param umlobject Pointer to the underlying UMLObject (if applicable.) -+ */ -+AssociationWidget* AssociationWidget::create -+ (UMLScene *scene, UMLWidget* pWidgetA, -+ Uml::AssociationType::Enum assocType, UMLWidget* pWidgetB, -+ UMLObject *umlobject /* = NULL */) -+{ -+ AssociationWidget* instance = new AssociationWidget(scene); -+ if (umlobject) { -+ instance->setUMLObject(umlobject); -+ } else { -+ // set up UMLAssociation obj if assoc is represented and both roles are UML objects -+ if (Uml::AssociationType::hasUMLRepresentation(assocType)) { -+ UMLObject* umlRoleA = pWidgetA->umlObject(); -+ UMLObject* umlRoleB = pWidgetB->umlObject(); -+ if (umlRoleA != NULL && umlRoleB != NULL) { -+ bool swap; -+ -+ // This is not correct. We could very easily have more than one -+ // of the same type of association between the same two objects. -+ // Just create the association. This search should have been -+ // done BEFORE creation of the widget, if it mattered to the code. -+ // But lets leave check in here for the time being so that debugging -+ // output is shown, in case there is a collision with code elsewhere. -+ UMLDoc *doc = UMLApp::app()->document(); -+ UMLAssociation *myAssoc = doc->findAssociation(assocType, umlRoleA, umlRoleB, &swap); -+ if (myAssoc != NULL) { -+ switch (assocType) { -+ case Uml::AssociationType::Generalization: -+ case Uml::AssociationType::Dependency: -+ case Uml::AssociationType::Association_Self: -+ case Uml::AssociationType::Coll_Message_Self: -+ case Uml::AssociationType::Seq_Message_Self: -+ case Uml::AssociationType::Containment: -+ case Uml::AssociationType::Realization: -+ DBG_AW() << "Ignoring second construction of same assoctype " -+ << assocType << " between " << umlRoleA->name() -+ << " and " << umlRoleB->name(); -+ break; -+ default: -+ DBG_AW() << "constructing a similar or exact same assoctype " -+ << assocType << " between " << umlRoleA->name() << " and " -+ << umlRoleB->name() << "as an already existing assoc (swap=" -+ << swap << ")"; -+ // now, just create a new association anyways -+ myAssoc = NULL; -+ break; -+ } -+ } -+ if (myAssoc == NULL) { -+ myAssoc = new UMLAssociation(assocType, umlRoleA, umlRoleB); -+ // CHECK: myAssoc is not yet inserted at any parent UMLPackage - -+ // need to check carefully that all callers do this, lest it be -+ // orphaned. -+ // ToolBarStateAssociation::addAssociationInViewAndDoc() is -+ // okay in this regard. -+ } -+ instance->setUMLAssociation(myAssoc); -+ } -+ } -+ } -+ -+ instance->setWidgetForRole(pWidgetA, RoleType::A); -+ instance->setWidgetForRole(pWidgetB, RoleType::B); -+ -+ instance->setAssociationType(assocType); -+ -+ instance->calculateEndingPoints(); -+ -+ instance->associationLine()->calculateInitialEndPoints(); -+ instance->associationLine()->reconstructSymbols(); -+ -+ //The AssociationWidget is set to Activated because it already has its side widgets -+ instance->setActivated(true); -+ -+ // sync UML meta-data to settings here -+ instance->mergeAssociationDataIntoUMLRepresentation(); -+ -+ // Collaboration messages need a name label because it's that -+ // which lets operator== distinguish them, which in turn -+ // permits us to have more than one message between two objects. -+ if (instance->isCollaboration()) { -+ // Create a temporary name to bring on setName() -+ int collabID = instance->m_scene->generateCollaborationId(); -+ instance->setName(QLatin1Char('m') + QString::number(collabID)); -+ } -+ -+ return instance; -+} -+ -+/** -+ * Destructor. -+ */ -+AssociationWidget::~AssociationWidget() -+{ -+ delete m_associationLine; -+} -+ -+/** -+ * Overriding the method from WidgetBase because we need to do -+ * something extra in case this AssociationWidget represents -+ * an attribute of a classifier. -+ */ -+void AssociationWidget::setUMLObject(UMLObject *obj) -+{ -+ WidgetBase::setUMLObject(obj); -+ if (obj == NULL) -+ return; -+ UMLClassifier *klass = NULL; -+ UMLAttribute *attr = NULL; -+ UMLEntity *ent = NULL; -+ const UMLObject::ObjectType ot = obj->baseType(); -+ switch (ot) { -+ case UMLObject::ot_Association: -+ setUMLAssociation(dynamic_cast(obj)); -+ break; -+ case UMLObject::ot_Operation: -+ setOperation(dynamic_cast(obj)); -+ break; -+ case UMLObject::ot_Attribute: -+ klass = static_cast(obj->parent()); -+ connect(klass, SIGNAL(attributeRemoved(UMLClassifierListItem*)), -+ this, SLOT(slotClassifierListItemRemoved(UMLClassifierListItem*))); -+ attr = static_cast(obj); -+ connect(attr, SIGNAL(attributeChanged()), this, SLOT(slotAttributeChanged())); -+ break; -+ case UMLObject::ot_EntityAttribute: -+ ent = static_cast(obj->parent()); -+ connect(ent, SIGNAL(entityAttributeRemoved(UMLClassifierListItem*)), -+ this, SLOT(slotClassifierListItemRemoved(UMLClassifierListItem*))); -+ break; -+ case UMLObject::ot_ForeignKeyConstraint: -+ ent = static_cast(obj->parent()); -+ connect(ent, SIGNAL(entityConstraintRemoved(UMLClassifierListItem*)), -+ this, SLOT(slotClassifierListItemRemoved(UMLClassifierListItem*))); -+ break; -+ default: -+ uError() << "cannot associate UMLObject of type " << UMLObject::toString(ot); -+ break; -+ } -+} -+ -+/** -+ * Set all 'owned' child widgets to this font. -+ */ -+void AssociationWidget::lwSetFont (QFont font) -+{ -+ if (m_nameWidget) { -+ m_nameWidget->setFont(font); -+ } -+ if (m_role[RoleType::A].roleWidget) { -+ m_role[RoleType::A].roleWidget->setFont(font); -+ } -+ if (m_role[RoleType::B].roleWidget) { -+ m_role[RoleType::B].roleWidget->setFont(font); -+ } -+ if (m_role[RoleType::A].multiplicityWidget) { -+ m_role[RoleType::A].multiplicityWidget->setFont(font); -+ } -+ if (m_role[RoleType::B].multiplicityWidget) { -+ m_role[RoleType::B].multiplicityWidget->setFont(font); -+ } -+ if (m_role[RoleType::A].changeabilityWidget) -+ m_role[RoleType::A].changeabilityWidget->setFont(font); -+ if (m_role[RoleType::B].changeabilityWidget) -+ m_role[RoleType::B].changeabilityWidget->setFont(font); -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ * @todo Move to LinkWidget. -+ */ -+UMLClassifier *AssociationWidget::operationOwner() -+{ -+ Uml::RoleType::Enum role = (isCollaboration() ? Uml::RoleType::B : Uml::RoleType::A); -+ UMLObject *o = widgetForRole(role)->umlObject(); -+ if (!o) { -+ return 0; -+ } -+ UMLClassifier *c = dynamic_cast(o); -+ if (!c) { -+ uError() << "widgetForRole(" << role << ") is not a classifier"; -+ } -+ return c; -+} -+ -+/** -+ * Implements operation from LinkWidget. -+ * Motivated by FloatingTextWidget. -+ */ -+UMLOperation *AssociationWidget::operation() -+{ -+ return dynamic_cast(m_umlObject); -+} -+ -+/** -+ * Implements operation from LinkWidget. -+ * Motivated by FloatingTextWidget. -+ */ -+void AssociationWidget::setOperation(UMLOperation *op) -+{ -+ if (m_umlObject) -+ disconnect(m_umlObject, SIGNAL(modified()), m_nameWidget, SLOT(setMessageText())); -+ m_umlObject = op; -+ if (m_umlObject) -+ connect(m_umlObject, SIGNAL(modified()), m_nameWidget, SLOT(setMessageText())); -+ if (m_nameWidget) -+ m_nameWidget->setMessageText(); -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ */ -+QString AssociationWidget::customOpText() -+{ -+ return name(); -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ */ -+void AssociationWidget::setCustomOpText(const QString &opText) -+{ -+ setName(opText); -+} -+ -+/** -+ * Calls setTextPosition on all the labels. -+ * Overrides operation from LinkWidget. -+ */ -+void AssociationWidget::resetTextPositions() -+{ -+ if (m_role[RoleType::A].multiplicityWidget) { -+ setTextPosition(TextRole::MultiA); -+ } -+ if (m_role[RoleType::B].multiplicityWidget) { -+ setTextPosition(Uml::TextRole::MultiB); -+ } -+ if (m_role[RoleType::A].changeabilityWidget) { -+ setTextPosition(Uml::TextRole::ChangeA); -+ } -+ if (m_role[RoleType::B].changeabilityWidget) { -+ setTextPosition(Uml::TextRole::ChangeB); -+ } -+ if (m_nameWidget) { -+ setTextPosition(Uml::TextRole::Name); -+ } -+ if (m_role[RoleType::A].roleWidget) { -+ setTextPosition(Uml::TextRole::RoleAName); -+ } -+ if (m_role[RoleType::B].roleWidget) { -+ setTextPosition(Uml::TextRole::RoleBName); -+ } -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ * -+ * @param ft The text widget which to update. -+ */ -+void AssociationWidget::setMessageText(FloatingTextWidget *ft) -+{ -+ if (isCollaboration()) { -+ ft->setSequenceNumber(m_SequenceNumber); -+ if (m_umlObject != NULL) { -+ ft->setText(operationText(m_scene)); -+ } else { -+ ft->setText(name()); -+ } -+ } else { -+ ft->setText(name()); -+ } -+} -+ -+/** -+ * Sets the text of the given FloatingTextWidget. -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ */ -+void AssociationWidget::setText(FloatingTextWidget *ft, const QString &text) -+{ -+ Uml::TextRole::Enum role = ft->textRole(); -+ switch (role) { -+ case Uml::TextRole::Name: -+ setName(text); -+ break; -+ case Uml::TextRole::RoleAName: -+ setRoleName(text, RoleType::A); -+ break; -+ case Uml::TextRole::RoleBName: -+ setRoleName(text, RoleType::B); -+ break; -+ case Uml::TextRole::MultiA: -+ setMultiplicity(text, RoleType::A); -+ break; -+ case Uml::TextRole::MultiB: -+ setMultiplicity(text, RoleType::B); -+ break; -+ default: -+ uWarning() << "Unhandled TextRole: " << Uml::TextRole::toString(role); -+ break; -+ } -+} -+ -+/** -+ * Shows the association properties dialog and updates the -+ * corresponding texts if its execution is successful. -+ */ -+void AssociationWidget::showPropertiesDialog() -+{ -+ UMLApp::app()->docWindow()->updateDocumentation(); -+ QPointer dlg = new AssociationPropertiesDialog(static_cast(m_scene->activeView()), this); -+ if (dlg->exec()) { -+ //rules built into these functions to stop updating incorrect values -+ setName(name()); -+ -+ setRoleName(roleName(RoleType::A), RoleType::A); -+ setRoleName(roleName(RoleType::B), RoleType::B); -+ -+ setDocumentation(documentation()); -+ -+ setRoleDocumentation(roleDocumentation(RoleType::A), RoleType::A); -+ setRoleDocumentation(roleDocumentation(RoleType::B), RoleType::B); -+ -+ setMultiplicity(multiplicity(RoleType::A), RoleType::A); -+ setMultiplicity(multiplicity(RoleType::B), RoleType::B); -+ -+ setVisibility(visibility(RoleType::A), RoleType::A); -+ setVisibility(visibility(RoleType::B), RoleType::B); -+ -+ setChangeability(changeability(RoleType::A), RoleType::A); -+ setChangeability(changeability(RoleType::B), RoleType::B); -+ -+ UMLApp::app()->docWindow()->showDocumentation(this, true); -+ } -+ delete dlg; -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ * -+ * @param op Return this AssociationWidget's operation string. -+ */ -+QString AssociationWidget::lwOperationText() -+{ -+ return name(); -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ * -+ * @return classifier -+ */ -+UMLClassifier* AssociationWidget::lwClassifier() -+{ -+ UMLObject *o = widgetForRole(RoleType::B)->umlObject(); -+ UMLClassifier *c = dynamic_cast(o); -+ return c; -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ * -+ * @param op The new operation string to set. -+ */ -+void AssociationWidget::setOperationText(const QString &op) -+{ -+ if (!op.isEmpty()) { -+ setName(op); -+ } -+} -+ -+/** -+ * Calculates the m_unNameLineSegment value according to the new -+ * NameText topleft corner PT. -+ * It iterates through all AssociationLine's segments and for each one -+ * calculates the sum of PT's distance to the start point + PT's -+ * distance to the end point. The segment with the smallest sum will -+ * be the RoleTextSegment (if this segment moves then the RoleText -+ * will move with it). It sets m_unNameLineSegment to the start point -+ * of the chosen segment. -+ * -+ * Overrides operation from LinkWidget (i.e. this method is also -+ * required by FloatingTextWidget.) -+ */ -+void AssociationWidget::calculateNameTextSegment() -+{ -+ if (!m_nameWidget) { -+ return; -+ } -+ //changed to use the middle of the text -+ //i think this will give a better result. -+ //never know what sort of lines people come up with -+ //and text could be long to give a false reading -+ qreal xt = m_nameWidget->x(); -+ qreal yt = m_nameWidget->y(); -+ xt += m_nameWidget->width() / 2; -+ yt += m_nameWidget->height() / 2; -+ int size = m_associationLine->count(); -+ //sum of length(PTP1) and length(PTP2) -+ qreal total_length = 0; -+ qreal smallest_length = 0; -+ for (int i = 0; i < size - 1; ++i) { -+ QPointF pi = m_associationLine->point( i ); -+ QPointF pj = m_associationLine->point( i+1 ); -+ qreal xtiDiff = xt - pi.x(); -+ qreal xtjDiff = xt - pj.x(); -+ qreal ytiDiff = yt - pi.y(); -+ qreal ytjDiff = yt - pj.y(); -+ total_length = sqrt( double(xtiDiff * xtiDiff + ytiDiff * ytiDiff) ) -+ + sqrt( double(xtjDiff * xtjDiff + ytjDiff * ytjDiff) ); -+ //this gives the closest point -+ if (total_length < smallest_length || i == 0) { -+ smallest_length = total_length; -+ m_unNameLineSegment = i; -+ } -+ } -+} -+ -+/** -+ * Returns the UMLAssociation representation of this object. -+ * -+ * @return Pointer to the UMLAssociation that is represented by -+ * this AsociationWidget. -+ */ -+UMLAssociation* AssociationWidget::association() const -+{ -+ if (m_umlObject == NULL || m_umlObject->baseType() != UMLObject::ot_Association) -+ return NULL; -+ return static_cast(m_umlObject); -+} -+ -+/** -+ * Returns the UMLAttribute representation of this object. -+ * -+ * @return Pointer to the UMLAttribute that is represented by -+ * this AsociationWidget. -+ */ -+UMLAttribute* AssociationWidget::attribute() const -+{ -+ if (m_umlObject == NULL) -+ return NULL; -+ UMLObject::ObjectType ot = m_umlObject->baseType(); -+ if (ot != UMLObject::ot_Attribute && ot != UMLObject::ot_EntityAttribute) -+ return NULL; -+ return static_cast(m_umlObject); -+} -+ -+#if 0 //:TODO: -+/** -+ * Overrides the assignment operator. -+ */ -+AssociationWidget& AssociationWidget::operator=(const AssociationWidget& other) -+{ -+ *m_associationLine = *other.m_associationLine; -+ -+ if (other.m_nameWidget) { -+ m_nameWidget = new FloatingTextWidget(m_scene); -+ *m_nameWidget = *(other.m_nameWidget); -+ } else { -+ m_nameWidget = NULL; -+ } -+ -+ for (unsigned r = (unsigned)A; r <= (unsigned)B; ++r) { -+ WidgetRole& lhs = m_role[r]; -+ const WidgetRole& rhs = other.m_role[r]; -+ lhs.m_nIndex = rhs.m_nIndex; -+ lhs.m_nTotalCount = rhs.m_nTotalCount; -+ -+ if (rhs.multiplicityWidget) { -+ lhs.multiplicityWidget = new FloatingTextWidget(m_scene); -+ *(lhs.multiplicityWidget) = *(rhs.multiplicityWidget); -+ } else { -+ lhs.multiplicityWidget = NULL; -+ } -+ -+ if (rhs.roleWidget) { -+ lhs.roleWidget = new FloatingTextWidget(m_scene); -+ *(lhs.roleWidget) = *(rhs.roleWidget); -+ } else { -+ lhs.roleWidget = NULL; -+ } -+ -+ if (rhs.changeabilityWidget) { -+ lhs.changeabilityWidget = new FloatingTextWidget(m_scene); -+ *(lhs.changeabilityWidget) = *(rhs.changeabilityWidget); -+ } else { -+ lhs.changeabilityWidget = NULL; -+ } -+ -+ lhs.umlWidget = rhs.umlWidget; -+ lhs.m_WidgetRegion = rhs.m_WidgetRegion; -+ } -+ -+ m_activated = other.m_activated; -+ m_unNameLineSegment = other.m_unNameLineSegment; -+ m_pMenu = other.m_pMenu; -+ setUMLAssociation(other.association()); -+ setSelected(other.isSelected()); -+ -+ return *this; -+} -+#endif //:TODO: -+ -+/** -+ * Overrides the equality test operator. -+ */ -+bool AssociationWidget::operator==(const AssociationWidget& other) const -+{ -+ if (this == &other) -+ return true; -+ -+ // if no model representation exists, then the widgets are not equal -+ if (association() == NULL && other.association() == NULL) -+ return false; -+ -+ if (!m_umlObject || !other.m_umlObject ) { -+ if (!other.m_umlObject && m_umlObject) -+ return false; -+ if (other.m_umlObject && !m_umlObject) -+ return false; -+ -+ } else if (m_umlObject != other.m_umlObject) -+ return false; -+ -+ if (associationType() != other.associationType()) -+ return false; -+ -+ if (widgetIDForRole(RoleType::A) != other.widgetIDForRole(RoleType::A)) -+ return false; -+ -+ if (widgetIDForRole(RoleType::B) != other.widgetIDForRole(RoleType::B)) -+ return false; -+ -+ if (widgetForRole(RoleType::A)->baseType() == WidgetBase::wt_Object && -+ other.widgetForRole(RoleType::A)->baseType() == WidgetBase::wt_Object) { -+ ObjectWidget *ownA = static_cast(widgetForRole(RoleType::A)); -+ ObjectWidget *otherA = static_cast(other.widgetForRole(RoleType::A)); -+ if (ownA->localID() != otherA->localID()) -+ return false; -+ } -+ -+ if (widgetForRole(RoleType::B)->baseType() == WidgetBase::wt_Object && -+ other.widgetForRole(RoleType::B)->baseType() == WidgetBase::wt_Object) { -+ ObjectWidget *ownB = static_cast(widgetForRole(RoleType::B)); -+ ObjectWidget *otherB = static_cast(other.widgetForRole(RoleType::B)); -+ if (ownB->localID() != otherB->localID()) -+ return false; -+ } -+ -+ // Two objects in a collaboration can have multiple messages between each other. -+ // Here we depend on the messages having names, and the names must be different. -+ // That is the reason why collaboration messages have strange initial names like -+ // "m29997" or similar. -+ return (name() == other.name()); -+} -+ -+/** -+ * Overrides the != operator. -+ */ -+bool AssociationWidget::operator!=(AssociationWidget& other) const -+{ -+ return !(*this == other); -+} -+ -+/** -+ * Returns a pointer to the association widget's line path. -+ */ -+AssociationLine* AssociationWidget::associationLine() const -+{ -+ return m_associationLine; -+} -+ -+/** -+ * Activates the AssociationWidget after a load. -+ * -+ * @return true for success -+ */ -+bool AssociationWidget::activate() -+{ -+ if (m_umlObject == NULL && -+ AssociationType::hasUMLRepresentation(m_associationType)) { -+ UMLObject *myObj = umlDoc()->findObjectById(m_nId); -+ if (myObj == NULL) { -+ uError() << "cannot find UMLObject " << Uml::ID::toString(m_nId); -+ return false; -+ } else { -+ const UMLObject::ObjectType ot = myObj->baseType(); -+ if (ot == UMLObject::ot_Association) { -+ UMLAssociation * myAssoc = static_cast(myObj); -+ setUMLAssociation(myAssoc); -+ } else { -+ setUMLObject(myObj); -+ setAssociationType(m_associationType); -+ } -+ } -+ } -+ -+ if (m_activated) -+ return true; -+ -+ Uml::AssociationType::Enum type = associationType(); -+ -+ if (m_role[RoleType::A].umlWidget == NULL) -+ setWidgetForRole(m_scene->findWidget(widgetIDForRole(RoleType::A)), RoleType::A); -+ if (m_role[RoleType::B].umlWidget == NULL) -+ setWidgetForRole(m_scene->findWidget(widgetIDForRole(RoleType::B)), RoleType::B); -+ -+ if (!m_role[RoleType::A].umlWidget || !m_role[RoleType::B].umlWidget) { -+ DEBUG(DBG_SRC) << "Cannot make association!"; -+ return false; -+ } -+ -+ calculateEndingPoints(); -+ -+ if (AssocRules::allowRole(type)) { -+ for (unsigned r = RoleType::A; r <= RoleType::B; ++r) { -+ WidgetRole& robj = m_role[r]; -+ if (robj.roleWidget == NULL) -+ continue; -+ robj.roleWidget->setLink(this); -+ TextRole::Enum tr = (r == RoleType::A ? TextRole::RoleAName : TextRole::RoleBName); -+ robj.roleWidget->setTextRole(tr); -+ Uml::Visibility::Enum vis = visibility(Uml::RoleType::fromInt(r)); -+ robj.roleWidget->setPreText(Uml::Visibility::toString(vis, true)); -+ -+ if (FloatingTextWidget::isTextValid(robj.roleWidget->text())) -+ robj.roleWidget->show(); -+ else -+ robj.roleWidget->hide(); -+ if (m_scene->type() == DiagramType::Collaboration) -+ robj.roleWidget->setUMLObject(robj.umlWidget->umlObject()); -+ robj.roleWidget->activate(); -+ } -+ } -+ -+ if (m_nameWidget != NULL) { -+ m_nameWidget->setLink(this); -+ m_nameWidget->setTextRole(calculateNameType(TextRole::Name)); -+ -+ if (FloatingTextWidget::isTextValid(m_nameWidget->text())) { -+ m_nameWidget->show(); -+ } else { -+ m_nameWidget->hide(); -+ } -+ m_nameWidget->activate(); -+ calculateNameTextSegment(); -+ } -+ -+ for (unsigned r = RoleType::A; r <= RoleType::B; ++r) { -+ WidgetRole& robj = m_role[r]; -+ -+ FloatingTextWidget* pMulti = robj.multiplicityWidget; -+ if (pMulti != NULL && -+ AssocRules::allowMultiplicity(type, robj.umlWidget->baseType())) { -+ pMulti->setLink(this); -+ TextRole::Enum tr = (r == RoleType::A ? TextRole::MultiA : TextRole::MultiB); -+ pMulti->setTextRole(tr); -+ if (FloatingTextWidget::isTextValid(pMulti->text())) -+ pMulti->show(); -+ else -+ pMulti->hide(); -+ pMulti->activate(); -+ } -+ -+ FloatingTextWidget* pChangeWidget = robj.changeabilityWidget; -+ if (pChangeWidget != NULL) { -+ pChangeWidget->setLink(this); -+ TextRole::Enum tr = (r == RoleType::A ? TextRole::ChangeA : TextRole::ChangeB); -+ pChangeWidget->setTextRole(tr); -+ if (FloatingTextWidget::isTextValid(pChangeWidget->text())) -+ pChangeWidget->show(); -+ else -+ pChangeWidget->hide (); -+ pChangeWidget->activate(); -+ } -+ } -+ -+ // Prepare the association class line if needed. -+ if (m_associationClass && !m_pAssocClassLine) { -+ createAssocClassLine(); -+ } -+ -+ m_activated = true; -+ return true; -+} -+ -+/** -+ * Set the widget of the given role. -+ * Add this AssociationWidget at the widget. -+ * If this AssociationWidget has an underlying UMLAssociation then set -+ * the widget's underlying UMLObject at the UMLAssociation's role object. -+ * -+ * @param widget Pointer to the UMLWidget. -+ * @param role Role for which to set the widget. -+ */ -+void AssociationWidget::setWidgetForRole(UMLWidget* widget, Uml::RoleType::Enum role) -+{ -+ m_role[role].umlWidget = widget; -+ if (widget) { -+ m_role[role].umlWidget->addAssoc(this); -+ if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) -+ association()->setObject(widget->umlObject(), role); -+ } -+} -+ -+/** -+ * Return the multiplicity FloatingTextWidget widget of the given role. -+ * -+ * @return Pointer to the multiplicity FloatingTextWidget object. -+ */ -+FloatingTextWidget* AssociationWidget::multiplicityWidget(Uml::RoleType::Enum role) const -+{ -+ return m_role[role].multiplicityWidget; -+} -+ -+/** -+ * Read property of FloatingTextWidget* m_nameWidget. -+ * -+ * @return Pointer to the FloatingTextWidget name widget. -+ */ -+FloatingTextWidget* AssociationWidget::nameWidget() const -+{ -+ return m_nameWidget; -+} -+ -+/** -+ * Return the given role's FloatingTextWidget object. -+ * -+ * @return Pointer to the role's FloatingTextWidget widget. -+ */ -+FloatingTextWidget* AssociationWidget::roleWidget(Uml::RoleType::Enum role) const -+{ -+ return m_role[role].roleWidget; -+} -+ -+/** -+ * Return the given role's changeability FloatingTextWidget widget. -+ */ -+FloatingTextWidget* AssociationWidget::changeabilityWidget(Uml::RoleType::Enum role) const -+{ -+ return m_role[role].changeabilityWidget; -+} -+ -+/** -+ * Return the FloatingTextWidget object indicated by the given TextRole::Enum. -+ * -+ * @return Pointer to the text role's FloatingTextWidget widget. -+ */ -+FloatingTextWidget* AssociationWidget::textWidgetByRole(Uml::TextRole::Enum tr) const -+{ -+ switch (tr) { -+ case Uml::TextRole::MultiA: -+ return m_role[RoleType::A].multiplicityWidget; -+ case Uml::TextRole::MultiB: -+ return m_role[RoleType::B].multiplicityWidget; -+ case Uml::TextRole::Name: -+ case Uml::TextRole::Coll_Message: -+ return m_nameWidget; -+ case Uml::TextRole::RoleAName: -+ return m_role[RoleType::A].roleWidget; -+ case Uml::TextRole::RoleBName: -+ return m_role[RoleType::B].roleWidget; -+ case Uml::TextRole::ChangeA: -+ return m_role[RoleType::A].changeabilityWidget; -+ case Uml::TextRole::ChangeB: -+ return m_role[RoleType::B].changeabilityWidget; -+ default: -+ break; -+ } -+ return NULL; -+} -+ -+/** -+ * Returns the m_nameWidget's text. -+ * -+ * @return Text of the FloatingTextWidget name widget. -+ */ -+QString AssociationWidget::name() const -+{ -+ if (m_nameWidget == NULL) -+ return QString(); -+ return m_nameWidget->text(); -+} -+ -+/** -+ * Sets the text in the FloatingTextWidget widget representing the Name -+ * of this association. -+ */ -+void AssociationWidget::setName(const QString &strName) -+{ -+ // set attribute of UMLAssociation associated with this associationwidget -+ UMLAssociation *umla = association(); -+ if (umla) -+ umla->setName(strName); -+ -+ bool newLabel = false; -+ if (!m_nameWidget) { -+ // Don't construct the FloatingTextWidget if the string is empty. -+ if (! FloatingTextWidget::isTextValid(strName)) -+ return; -+ -+ newLabel = true; -+ m_nameWidget = new FloatingTextWidget(m_scene, calculateNameType(Uml::TextRole::Name), strName); -+ m_nameWidget->setParentItem(this); -+ m_nameWidget->setLink(this); -+ } else { -+ m_nameWidget->setText(strName); -+ if (! FloatingTextWidget::isTextValid(strName)) { -+ //m_nameWidget->hide(); -+ m_scene->removeWidget(m_nameWidget); -+ m_nameWidget = NULL; -+ return; -+ } -+ } -+ -+ setTextPosition(Uml::TextRole::Name); -+ if (newLabel) { -+ m_nameWidget->setActivated(); -+ m_scene->addFloatingTextWidget(m_nameWidget); -+ } -+ -+ m_nameWidget->show(); -+} -+ -+void AssociationWidget::setStereotype(const QString &stereo) { -+ UMLAssociation *umlassoc = association(); -+ if (umlassoc) { -+ umlassoc->setStereotype(stereo); -+ if (m_nameWidget) { -+ m_nameWidget->setText(umlassoc->stereotype(true)); -+ } else { -+ uDebug() << "not setting " << stereo << " because m_nameWidget is NULL"; -+ } -+ } else { -+ uDebug() << "not setting " << stereo << " because association is NULL"; -+ } -+} -+ -+/** -+ * Return the given role's FloatingTextWidget widget text. -+ * -+ * @return The name set at the FloatingTextWidget. -+ */ -+QString AssociationWidget::roleName(Uml::RoleType::Enum role) const -+{ -+ if (m_role[role].roleWidget == NULL) -+ return QString(); -+ return m_role[role].roleWidget->text(); -+} -+ -+/** -+ * Sets the text to the FloatingTextWidget that display the Role text of this -+ * association. -+ * For this function to work properly, the associated widget -+ * should already be set. -+ */ -+void AssociationWidget::setRoleName(const QString &strRole, Uml::RoleType::Enum role) -+{ -+ Uml::AssociationType::Enum type = associationType(); -+ //if the association is not supposed to have a Role FloatingTextWidget -+ if (!AssocRules::allowRole(type)) { -+ return; -+ } -+ -+ TextRole::Enum tr = (role == RoleType::A ? TextRole::RoleAName : TextRole::RoleBName); -+ setFloatingText(tr, strRole, m_role[role].roleWidget); -+ if (m_role[role].roleWidget) { -+ Uml::Visibility::Enum vis = visibility(role); -+ if (FloatingTextWidget::isTextValid(m_role[role].roleWidget->text())) { -+ m_role[role].roleWidget->setPreText(Uml::Visibility::toString(vis, true)); -+ //m_role[role].roleWidget->show(); -+ } else { -+ m_role[role].roleWidget->setPreText(QString()); -+ //m_role[role].roleWidget->hide(); -+ } -+ } -+ -+ // set attribute of UMLAssociation associated with this associationwidget -+ if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) -+ association()->setRoleName(strRole, role); -+} -+ -+/** -+ * Set the documentation on the given role. -+ */ -+void AssociationWidget::setRoleDocumentation(const QString &doc, Uml::RoleType::Enum role) -+{ -+ if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) -+ association()->setRoleDoc(doc, role); -+ else -+ m_role[role].roleDocumentation = doc; -+} -+ -+/** -+ * Returns the given role's documentation. -+ */ -+QString AssociationWidget::roleDocumentation(Uml::RoleType::Enum role) const -+{ -+ if (m_umlObject == NULL || m_umlObject->baseType() != UMLObject::ot_Association) -+ return QString(); -+ UMLAssociation *umla = static_cast(m_umlObject); -+ return umla->getRoleDoc(role); -+} -+ -+/** -+ * Change, create, or delete the FloatingTextWidget indicated by the given TextRole::Enum. -+ * -+ * @param tr TextRole::Enum of the FloatingTextWidget to change or create. -+ * @param text Text string that controls the action: -+ * If empty and ft is NULL then setFloatingText() is a no-op. -+ * If empty and ft is non-NULL then the existing ft is deleted. -+ * If non-empty and ft is NULL then a new FloatingTextWidget is created -+ * and returned in ft with the text set. -+ * If non-empty and ft is non-NULL then the existing ft text is modified. -+ * @param ft Reference to the pointer to FloatingTextWidget to change or create. -+ * On creation/deletion, the pointer value will be changed. -+ */ -+void AssociationWidget::setFloatingText(Uml::TextRole::Enum role, -+ const QString &text, -+ FloatingTextWidget* &ft) -+{ -+ if (! FloatingTextWidget::isTextValid(text)) { -+ if (ft) { -+ // Remove preexisting FloatingTextWidget -+ m_scene->removeWidget(ft); // physically deletes ft -+ ft = NULL; -+ } -+ return; -+ } -+ -+ if (ft == NULL) { -+ ft = new FloatingTextWidget(m_scene, role, text); -+ ft->setParentItem(this); -+ ft->setLink(this); -+ ft->activate(); -+ setTextPosition(role); -+ m_scene->addFloatingTextWidget(ft); -+ } else { -+ bool newLabel = ft->text().isEmpty(); -+ ft->setText(text); -+ if (newLabel) -+ setTextPosition(role); -+ } -+ -+ ft->show(); -+} -+ -+/** -+ * Return the given role's multiplicity text. -+ * -+ * @return Text of the given role's multiplicity widget. -+ */ -+QString AssociationWidget::multiplicity(Uml::RoleType::Enum role) const -+{ -+ if (m_role[role].multiplicityWidget == NULL) -+ return QString(); -+ return m_role[role].multiplicityWidget->text(); -+} -+ -+/** -+ * Sets the text in the FloatingTextWidget representing the multiplicity -+ * at the given side of the association. -+ */ -+void AssociationWidget::setMultiplicity(const QString& text, Uml::RoleType::Enum role) -+{ -+ TextRole::Enum tr = (role == RoleType::A ? TextRole::MultiA : TextRole::MultiB); -+ -+ setFloatingText(tr, text, m_role[role].multiplicityWidget); -+ -+ if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) -+ association()->setMultiplicity(text, role); -+} -+ -+/** -+ * Gets the visibility on the given role of the association. -+ */ -+Visibility::Enum AssociationWidget::visibility(Uml::RoleType::Enum role) const -+{ -+ const UMLAssociation *assoc = association(); -+ if (assoc) -+ return assoc->visibility(role); -+ const UMLAttribute *attr = attribute(); -+ if (attr) -+ return attr->visibility(); -+ return m_role[role].visibility; -+} -+ -+/** -+ * Sets the visibility on the given role of the association. -+ */ -+void AssociationWidget::setVisibility(Visibility::Enum value, Uml::RoleType::Enum role) -+{ -+ if (value == visibility(role)) { -+ return; -+ } -+ if (m_umlObject) { -+ // update our model object -+ const UMLObject::ObjectType ot = m_umlObject->baseType(); -+ if (ot == UMLObject::ot_Association) -+ association()->setVisibility(value, role); -+ else if (ot == UMLObject::ot_Attribute) -+ attribute()->setVisibility(value); -+ } -+ m_role[role].visibility = value; -+ // update role pre-text attribute as appropriate -+ if (m_role[role].roleWidget) { -+ QString scopeString = Visibility::toString(value, true); -+ m_role[role].roleWidget->setPreText(scopeString); -+ } -+} -+ -+/** -+ * Gets the changeability on the given end of the Association. -+ */ -+Uml::Changeability::Enum AssociationWidget::changeability(Uml::RoleType::Enum role) const -+{ -+ if (m_umlObject == NULL || m_umlObject->baseType() != UMLObject::ot_Association) -+ return m_role[role].changeability; -+ UMLAssociation *umla = static_cast(m_umlObject); -+ return umla->changeability(role); -+} -+ -+/** -+ * Sets the changeability on the given end of the Association. -+ */ -+void AssociationWidget::setChangeability(Uml::Changeability::Enum value, Uml::RoleType::Enum role) -+{ -+ if (value == changeability(role)) -+ return; -+ QString changeString = Uml::Changeability::toString(value); -+ if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) // update our model object -+ association()->setChangeability(value, role); -+ m_role[role].changeability = value; -+ // update our string representation -+ setChangeWidget(changeString, role); -+} -+ -+/** -+ * For internal purpose-kf6s only. -+ * Other classes/users should use setChangeability() instead. -+ */ -+void AssociationWidget::setChangeWidget(const QString &strChangeWidget, Uml::RoleType::Enum role) -+{ -+ bool newLabel = false; -+ TextRole::Enum tr = (role == RoleType::A ? TextRole::ChangeA : TextRole::ChangeB); -+ -+ if (!m_role[role].changeabilityWidget) { -+ // Don't construct the FloatingTextWidget if the string is empty. -+ if (strChangeWidget.isEmpty()) -+ return; -+ -+ newLabel = true; -+ m_role[role].changeabilityWidget = new FloatingTextWidget(m_scene, tr, strChangeWidget); -+ m_role[role].changeabilityWidget->setParentItem(this); -+ m_role[role].changeabilityWidget->setLink(this); -+ m_scene->addFloatingTextWidget(m_role[role].changeabilityWidget); -+ m_role[role].changeabilityWidget->setPreText(QLatin1String("{")); // all types have this -+ m_role[role].changeabilityWidget->setPostText(QLatin1String("}")); // all types have this -+ } else { -+ if (m_role[role].changeabilityWidget->text().isEmpty()) { -+ newLabel = true; -+ } -+ m_role[role].changeabilityWidget->setText(strChangeWidget); -+ } -+ m_role[role].changeabilityWidget->setActivated(); -+ -+ if (newLabel) { -+ setTextPosition(tr); -+ } -+ -+ if (FloatingTextWidget::isTextValid(m_role[role].changeabilityWidget->text())) -+ m_role[role].changeabilityWidget->show(); -+ else -+ m_role[role].changeabilityWidget->hide(); -+} -+ -+/** -+ * Returns true if the line path starts at the given widget. -+ */ -+bool AssociationWidget::linePathStartsAt(const UMLWidget* widget) -+{ -+//:TODO: -+// QPointF lpStart = m_associationLine->point(0); -+// int startX = lpStart.x(); -+// int startY = lpStart.y(); -+// int wX = widget->x(); -+// int wY = widget->y(); -+// int wWidth = widget->width(); -+// int wHeight = widget->height(); -+// bool result = (startX >= wX && startX <= wX + wWidth && -+// startY >= wY && startY <= wY + wHeight); -+// return result; -+ bool result = widget->contains(m_associationLine->point(0)); -+ DEBUG(DBG_SRC) << "widget=" << widget->name() << " / result=" << result; -+ return result; -+} -+ -+/** -+ * This function calculates which role should be set for the m_nameWidget FloatingTextWidget. -+ */ -+Uml::TextRole::Enum AssociationWidget::calculateNameType(Uml::TextRole::Enum defaultRole) -+{ -+ TextRole::Enum result = defaultRole; -+ if (m_scene->type() == DiagramType::Collaboration) { -+ if (m_role[RoleType::A].umlWidget == m_role[RoleType::B].umlWidget) { -+ result = TextRole::Coll_Message;//for now same as other Coll_Message -+ } else { -+ result = TextRole::Coll_Message; -+ } -+ } else if (m_scene->type() == DiagramType::Sequence) { -+ if (m_role[RoleType::A].umlWidget == m_role[RoleType::B].umlWidget) { -+ result = TextRole::Seq_Message_Self; -+ } else { -+ result = TextRole::Seq_Message; -+ } -+ } -+ -+ return result; -+} -+ -+/** -+ * Gets the given role widget. -+ * -+ * @return Pointer to the role's UMLWidget. -+ */ -+UMLWidget* AssociationWidget::widgetForRole(Uml::RoleType::Enum role) const -+{ -+ return m_role[role].umlWidget; -+} -+ -+/** -+ * Sets the associated widgets. -+ * -+ * @param widgetA Pointer the role A widget for the association. -+ * @param assocType The AssociationType::Enum for this association. -+ * @param widgetB Pointer the role B widget for the association. -+ */ -+bool AssociationWidget::setWidgets(UMLWidget* widgetA, -+ Uml::AssociationType::Enum assocType, -+ UMLWidget* widgetB) -+{ -+ //if the association already has a WidgetB or WidgetA associated, then -+ //it cannot be changed to other widget, that would require a deletion -+ //of the association and the creation of a new one -+ if ((m_role[RoleType::A].umlWidget && (m_role[RoleType::A].umlWidget != widgetA)) || -+ (m_role[RoleType::B].umlWidget && (m_role[RoleType::B].umlWidget != widgetB))) { -+ return false; -+ } -+ setWidgetForRole(widgetA, RoleType::A); -+ setAssociationType(assocType); -+ setWidgetForRole(widgetB, RoleType::B); -+ -+ calculateEndingPoints(); -+ return true; -+} -+ -+/** -+ * CleansUp all the association's data in the related widgets. -+ */ -+void AssociationWidget::cleanup() -+{ -+ //let any other associations know we are going so they can tidy their positions up -+ if (m_role[RoleType::A].m_nTotalCount > 2) -+ updateAssociations(m_role[RoleType::A].m_nTotalCount - 1, m_role[RoleType::A].m_WidgetRegion, RoleType::A); -+ if (m_role[RoleType::B].m_nTotalCount > 2) -+ updateAssociations(m_role[RoleType::B].m_nTotalCount - 1, m_role[RoleType::B].m_WidgetRegion, RoleType::B); -+ -+ for (unsigned r = RoleType::A; r <= RoleType::B; ++r) { -+ WidgetRole& robj = m_role[r]; -+ -+ if (robj.umlWidget) { -+ robj.umlWidget->removeAssoc(this); -+ robj.umlWidget = 0; -+ } -+ if (robj.roleWidget) { -+ m_scene->removeWidget(robj.roleWidget); -+ robj.roleWidget = 0; -+ } -+ if (robj.multiplicityWidget) { -+ m_scene->removeWidget(robj.multiplicityWidget); -+ robj.multiplicityWidget = 0; -+ } -+ if (robj.changeabilityWidget) { -+ m_scene->removeWidget(robj.changeabilityWidget); -+ robj.changeabilityWidget = 0; -+ } -+ } -+ -+ if (m_nameWidget) { -+ m_scene->removeWidget(m_nameWidget); -+ m_nameWidget = 0; -+ } -+ -+ if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) { -+ /* -+ We do not remove the UMLAssociation from the document. -+ Why? - Well, for example we might be in the middle of -+ a cut/paste. If the UMLAssociation is removed by the cut -+ then upon pasteing we have a problem. -+ This is not quite clean yet - there should be a way to -+ explicitly delete a UMLAssociation. The Right Thing would -+ be to have a ListView representation for UMLAssociation. -+ ` -+ IF we are cut n pasting, why are we handling this association as a pointer? -+ We should be using the XMI representation for a cut and paste. This -+ allows us to be clean here, AND a choice of recreating the object -+ w/ same id IF its a "cut", or a new object if its a "copy" operation -+ (in which case we wouldnt be here, in cleanup()). -+ */ -+ setUMLAssociation(0); -+ } -+ -+ m_associationLine->cleanup(); -+ removeAssocClassLine(); -+} -+ -+/** -+ * @brief Return state if the assocation line point in the near of the last context -+ * menu event position is addable or not. -+ * A point is addable if the association is not an Exception and there is no point in the near. -+ * -+ * @return true if point is addable -+ */ -+bool AssociationWidget::isPointAddable() -+{ -+ if (!isSelected() || associationType() == Uml::AssociationType::Exception) -+ return false; -+ int i = m_associationLine->closestPointIndex(m_eventScenePos); -+ return i == -1; -+} -+ -+/** -+ * @brief Return state if the assocation line point in the near of the last context -+ * menu event position is removable or not. -+ * A point is removable if the association is not an Exception and is not the start or end point. -+ * -+ * @return true if point is removable -+ */ -+bool AssociationWidget::isPointRemovable() -+{ -+ if (!isSelected() || associationType() == Uml::AssociationType::Exception || m_associationLine->count() <= 2) -+ return false; -+ int i = m_associationLine->closestPointIndex(m_eventScenePos); -+ return i > 0 && i < m_associationLine->count() - 1; -+} -+ -+/** -+ * Set our internal umlAssociation. -+ */ -+void AssociationWidget::setUMLAssociation (UMLAssociation * assoc) -+{ -+ if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) { -+ UMLAssociation *umla = association(); -+ -+ // safety check. Did some num-nuts try to set the existing -+ // association again? If so, just bail here -+ if (umla == assoc) -+ return; -+ -+ //umla->disconnect(this); //Qt does disconnect automatically upon destruction. -+ umla->nrof_parent_widgets--; -+ -+ // ANSWER: This is the wrong treatment of cut and paste. Associations that -+ // are being cut/n pasted should be serialized to XMI, then reconstituted -+ // (IF a paste operation) rather than passing around object pointers. Its -+ // just too hard otherwise to prevent problems in the code. Bottom line: we need to -+ // delete orphaned associations or we well get code crashes and memory leaks. -+ if (umla->nrof_parent_widgets <= 0) { -+ //umla->deleteLater(); -+ } -+ -+ m_umlObject = NULL; -+ } -+ -+ if (assoc) { -+ m_umlObject = assoc; -+ -+ // move counter to "0" from "-1" (which means, no assocwidgets) -+ if (assoc->nrof_parent_widgets < 0) -+ assoc->nrof_parent_widgets = 0; -+ -+ assoc->nrof_parent_widgets++; -+ connect(assoc, SIGNAL(modified()), this, SLOT(syncToModel())); -+ } -+ -+} -+ -+/** -+ * Returns true if the Widget is either at the starting or ending side of the association. -+ */ -+bool AssociationWidget::containsAsEndpoint(UMLWidget* widget) -+{ -+ return (widget == m_role[RoleType::A].umlWidget || widget == m_role[RoleType::B].umlWidget); -+} -+ -+/** -+ * Returns true if this AssociationWidget represents a collaboration message. -+ */ -+bool AssociationWidget::isCollaboration() const -+{ -+ Uml::AssociationType::Enum at = associationType(); -+ return (at == AssociationType::Coll_Message_Synchronous -+ || at == AssociationType::Coll_Message_Asynchronous -+ || at == AssociationType::Coll_Message_Self); -+} -+ -+/** -+ * Returns true if this AssociationWidget represents a self message. -+ */ -+bool AssociationWidget::isSelf() const -+{ -+ return widgetForRole(Uml::RoleType::A) == widgetForRole(Uml::RoleType::B); -+} -+ -+/** -+ * Gets the association's type. -+ * -+ * @return This AssociationWidget's AssociationType::Enum. -+ */ -+Uml::AssociationType::Enum AssociationWidget::associationType() const -+{ -+ if (m_umlObject == NULL || m_umlObject->baseType() != UMLObject::ot_Association) -+ return m_associationType; -+ UMLAssociation *umla = static_cast(m_umlObject); -+ return umla->getAssocType(); -+} -+ -+/** -+ * Sets the association's type. -+ * -+ * @param type The AssociationType::Enum to set. -+ */ -+void AssociationWidget::setAssociationType(Uml::AssociationType::Enum type) -+{ -+ if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) { -+ association()->setAssociationType(type); -+ } -+ m_associationType = type; -+ // If the association new type is not supposed to have Multiplicity -+ // FloatingTexts and a Role FloatingTextWidget then set the texts -+ // to empty. -+ // NB We do not physically delete the floatingtext widgets here because -+ // those widgets are also stored in the UMLView::m_WidgetList. -+ if (!AssocRules::allowMultiplicity(type, widgetForRole(RoleType::A)->baseType())) { -+ if (m_role[RoleType::A].multiplicityWidget) { -+ m_role[RoleType::A].multiplicityWidget->setName(QString()); -+ } -+ if (m_role[RoleType::B].multiplicityWidget) { -+ m_role[RoleType::B].multiplicityWidget->setName(QString()); -+ } -+ } -+ if (!AssocRules::allowRole(type)) { -+ if (m_role[RoleType::A].roleWidget) { -+ m_role[RoleType::A].roleWidget->setName(QString()); -+ } -+ if (m_role[RoleType::B].roleWidget) { -+ m_role[RoleType::B].roleWidget->setName(QString()); -+ } -+ setRoleDocumentation(QString(), RoleType::A); -+ setRoleDocumentation(QString(), RoleType::B); -+ } -+ m_associationLine->reconstructSymbols(); -+} -+ -+/** -+ * Gets the ID of the given role widget. -+ */ -+Uml::ID::Type AssociationWidget::widgetIDForRole(Uml::RoleType::Enum role) const -+{ -+ if (m_role[role].umlWidget == NULL) { -+ if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) { -+ UMLAssociation *umla = static_cast(m_umlObject); -+ return umla->getObjectId(role); -+ } -+ uError() << "umlWidget is NULL"; -+ return Uml::ID::None; -+ } -+ if (m_role[role].umlWidget->baseType() == WidgetBase::wt_Object) -+ return static_cast(m_role[role].umlWidget)->localID(); -+ Uml::ID::Type id = m_role[role].umlWidget->id(); -+ return id; -+} -+ -+/** -+ * Gets the local ID of the given role widget. -+ */ -+Uml::ID::Type AssociationWidget::widgetLocalIDForRole(Uml::RoleType::Enum role) const -+{ -+ if (m_role[role].umlWidget == NULL) { -+ if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) { -+ UMLAssociation *umla = static_cast(m_umlObject); -+ return umla->getObjectId(role); -+ } -+ uError() << "umlWidget is NULL"; -+ return Uml::ID::None; -+ } -+ if (m_role[role].umlWidget->baseType() == WidgetBase::wt_Object) -+ return static_cast(m_role[role].umlWidget)->localID(); -+ Uml::ID::Type id = m_role[role].umlWidget->localID(); -+ return id; -+} -+ -+/** -+ * Returns a QString Object representing this AssociationWidget. -+ */ -+QString AssociationWidget::toString() const -+{ -+ QString string; -+ static const QChar colon(QLatin1Char(':')); -+ -+ if (widgetForRole(RoleType::A)) { -+ string = widgetForRole(RoleType::A)->name(); -+ } -+ string.append(colon); -+ -+ if (m_role[RoleType::A].roleWidget) { -+ string += m_role[RoleType::A].roleWidget->text(); -+ } -+ string.append(colon); -+ string.append(Uml::AssociationType::toStringI18n(associationType())); -+ string.append(colon); -+ -+ if (widgetForRole(RoleType::B)) { -+ string += widgetForRole(RoleType::B)->name(); -+ } -+ -+ string.append(colon); -+ if (m_role[RoleType::B].roleWidget) { -+ string += m_role[RoleType::B].roleWidget->text(); -+ } -+ -+ return string; -+} -+ -+/** -+ * Adds a break point (if left mouse button). -+ */ -+void AssociationWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) -+{ -+ if (event->button() == Qt::LeftButton) { -+ uDebug() << "widget = " << name() << " / type = " << baseTypeStr(); -+ showPropertiesDialog(); -+ event->accept(); -+ } -+} -+ -+/** -+ * Overrides moveEvent. -+ */ -+void AssociationWidget::moveEvent(QGraphicsSceneMouseEvent *me) -+{ -+ // 2004-04-30: Achim Spangler -+ // Simple Approach to block moveEvent during load of XMI -+ /// @todo avoid trigger of this event during load -+ -+ if (umlDoc()->loading()) { -+ // hmmh - change of position during load of XMI -+ // -> there is something wrong -+ // -> avoid movement during opening -+ // -> print warn and stay at old position -+ uWarning() << "called during load of XMI for ViewType: " -+ << m_scene->type() << ", and BaseType: " << baseType(); -+ return; -+ } -+ /*to be here a line segment has moved. -+ we need to see if the three text widgets needs to be moved. -+ there are a few things to check first though: -+ -+ 1) Do they exist -+ 2) does it need to move: -+ 2a) for the multi widgets only move if they changed region, otherwise they are close enough -+ 2b) for role name move if the segment it is on moves. -+ */ -+ //first see if either the first or last segments moved, else no need to recalculate their point positions -+ -+ QPointF oldNamePoint = calculateTextPosition(TextRole::Name); -+ QPointF oldMultiAPoint = calculateTextPosition(TextRole::MultiA); -+ QPointF oldMultiBPoint = calculateTextPosition(TextRole::MultiB); -+ QPointF oldChangeAPoint = calculateTextPosition(TextRole::ChangeA); -+ QPointF oldChangeBPoint = calculateTextPosition(TextRole::ChangeB); -+ QPointF oldRoleAPoint = calculateTextPosition(TextRole::RoleAName); -+ QPointF oldRoleBPoint = calculateTextPosition(TextRole::RoleBName); -+ -+ int movingPoint = m_associationLine->closestPointIndex(me->scenePos()); -+ if (movingPoint != -1) -+ m_associationLine->setPoint(movingPoint, me->scenePos()); -+ int pos = m_associationLine->count() - 1;//set to last point for widget b -+ -+ if ( movingPoint == 1 || (movingPoint == pos-1) ) { -+ calculateEndingPoints(); -+ } -+ if (m_role[RoleType::A].changeabilityWidget && (movingPoint == 1)) { -+ setTextPositionRelatively(TextRole::ChangeA, oldChangeAPoint); -+ } -+ if (m_role[RoleType::B].changeabilityWidget && (movingPoint == 1)) { -+ setTextPositionRelatively(TextRole::ChangeB, oldChangeBPoint); -+ } -+ if (m_role[RoleType::A].multiplicityWidget && (movingPoint == 1)) { -+ setTextPositionRelatively(TextRole::MultiA, oldMultiAPoint); -+ } -+ if (m_role[RoleType::B].multiplicityWidget && (movingPoint == pos-1)) { -+ setTextPositionRelatively(TextRole::MultiB, oldMultiBPoint); -+ } -+ -+ if (m_nameWidget) { -+ if (movingPoint == m_unNameLineSegment || -+ movingPoint - 1 == m_unNameLineSegment) { -+ setTextPositionRelatively(TextRole::Name, oldNamePoint); -+ } -+ } -+ -+ if (m_role[RoleType::A].roleWidget) { -+ setTextPositionRelatively(TextRole::RoleAName, oldRoleAPoint); -+ } -+ if (m_role[RoleType::B].roleWidget) { -+ setTextPositionRelatively(TextRole::RoleBName, oldRoleBPoint); -+ } -+ -+ if (m_pAssocClassLine) { -+ computeAssocClassLine(); -+ } -+} -+ -+/** -+ * Calculates and sets the first and last point in the Association's AssociationLine. -+ * Each point is a middle point of its respecting UMLWidget's Bounding rectangle -+ * or a corner of it. -+ * This method picks which sides to use for the association. -+ */ -+void AssociationWidget::calculateEndingPoints() -+{ -+ /* -+ * For each UMLWidget the diagram is divided in four regions by its diagonals -+ * as indicated below -+ * Region 2 -+ * \ / -+ * \ / -+ * +--------+ -+ * | \ / | -+ * Region 1 | >< | Region 3 -+ * | / \ | -+ * +--------+ -+ * / \ -+ * / \ -+ * Region 4 -+ * -+ * Each diagonal is defined by two corners of the bounding rectangle -+ * -+ * To calculate the first point in the AssociationLine we have to find out in which -+ * Region (defined by WidgetA's diagonals) is WidgetB's center -+ * (let's call it Region M.) After that the first point will be the middle -+ * point of the rectangle's side contained in Region M. -+ * -+ * To calculate the last point in the AssociationLine we repeat the above but -+ * in the opposite direction (from widgetB to WidgetA) -+ */ -+ -+ UMLWidget *pWidgetA = m_role[RoleType::A].umlWidget; -+ UMLWidget *pWidgetB = m_role[RoleType::B].umlWidget; -+ if (!pWidgetA || !pWidgetB) { -+ uWarning() << "Returning - one of the role widgets is not set."; -+ return; -+ } -+ -+ int size = m_associationLine->count(); -+ if (size < 2) { -+ QPointF pA = pWidgetA->pos(); -+ QPointF pB = pWidgetB->pos(); -+ QPolygonF polyA = pWidgetA->shape().toFillPolygon().translated(pA); -+ QPolygonF polyB = pWidgetB->shape().toFillPolygon().translated(pB); -+ QLineF nearestPoints = Widget_Utils::closestPoints(polyA, polyB); -+ if (nearestPoints.isNull()) { -+ uError() << "Widget_Utils::closestPoints failed, falling back to simple widget positions"; -+ } else { -+ pA = nearestPoints.p1(); -+ pB = nearestPoints.p2(); -+ } -+ m_associationLine->setEndPoints(pA, pB); -+ } -+ -+ // See if an association to self. -+ // See if it needs to be set up before we continue: -+ // If self association/message and doesn't have the minimum 4 points -+ // then create it. Make sure no points are out of bounds of viewing area. -+ // This only happens on first time through that we are worried about. -+ if (isSelf() && size < 4) { -+ createPointsSelfAssociation(); -+ return; -+ } -+ -+ if (associationType() == AssociationType::Exception && size < 4) { -+ createPointsException(); -+ updatePointsException(); -+ return; -+ } -+ -+ // If the line has more than one segment change the values to calculate -+ // from widget to point 1. -+ qreal xB = pWidgetB->x() + pWidgetB->width() / 2; -+ qreal yB = pWidgetB->y() + pWidgetB->height() / 2; -+ if (size > 2) { -+ QPointF p = m_associationLine->point(1); -+ xB = p.x(); -+ yB = p.y(); -+ } -+ doUpdates(QPointF(xB, yB), RoleType::A); -+ -+ // Now do the same for widgetB. -+ // If the line has more than one segment change the values to calculate -+ // from widgetB to the last point away from it. -+ qreal xA = pWidgetA->x() + pWidgetA->width() / 2; -+ qreal yA = pWidgetA->y() + pWidgetA->height() / 2; -+ if (size > 2 ) { -+ QPointF p = m_associationLine->point(size - 2); -+ xA = p.x(); -+ yA = p.y(); -+ } -+ doUpdates(QPointF(xA, yA), RoleType::B); -+ -+ computeAssocClassLine(); -+} -+ -+/** -+ * Used by @ref calculateEndingPoints. -+ */ -+void AssociationWidget::doUpdates(const QPointF &otherP, RoleType::Enum role) -+{ -+ // Find widget region. -+ Uml::Region::Enum oldRegion = m_role[role].m_WidgetRegion; -+ UMLWidget *pWidget = m_role[role].umlWidget; -+ QRectF rc(pWidget->x(), pWidget->y(), -+ pWidget->width(), pWidget->height()); -+ Uml::Region::Enum region = m_role[role].m_WidgetRegion; // alias for brevity -+ region = findPointRegion(rc, otherP); -+ // Move some regions to the standard ones. -+ switch( region ) { -+ case Uml::Region::NorthWest: -+ region = Uml::Region::North; -+ break; -+ case Uml::Region::NorthEast: -+ region = Uml::Region::East; -+ break; -+ case Uml::Region::SouthEast: -+ region = Uml::Region::South; -+ break; -+ case Uml::Region::SouthWest: -+ case Uml::Region::Center: -+ region = Uml::Region::West; -+ break; -+ default: -+ break; -+ } -+ int regionCount = getRegionCount(region, role) + 2; //+2 = (1 for this one and one to halve it) -+ int totalCount = m_role[role].m_nTotalCount; -+ if (oldRegion != region) { -+ updateRegionLineCount(regionCount - 1, regionCount, region, role); -+ updateAssociations(totalCount - 1, oldRegion, role); -+ } else if (totalCount != regionCount) { -+ updateRegionLineCount(regionCount - 1, regionCount, region, role); -+ } else { -+ updateRegionLineCount(m_role[role].m_nIndex, totalCount, region, role); -+ } -+ updateAssociations(regionCount, region, role); -+} -+ -+/** -+ * Read property of bool m_activated. -+ */ -+bool AssociationWidget::isActivated() const -+{ -+ return m_activated; -+} -+ -+/** -+ * Set the m_activated flag of a widget but does not perform the Activate method. -+ */ -+void AssociationWidget::setActivated(bool active) -+{ -+ m_activated = active; -+} -+ -+/** -+ * Synchronize this widget from the UMLAssociation. -+ */ -+void AssociationWidget::syncToModel() -+{ -+ UMLAssociation *uml = association(); -+ -+ if (uml == NULL) { -+ UMLAttribute *attr = attribute(); -+ if (attr == NULL) -+ return; -+ setVisibility(attr->visibility(), RoleType::B); -+ setRoleName(attr->name(), RoleType::B); -+ return; -+ } -+ // block signals until finished -+ uml->blockSignals(true); -+ -+ setName(uml->name()); -+ setRoleName(uml->getRoleName(RoleType::A), RoleType::A); -+ setRoleName(uml->getRoleName(RoleType::B), RoleType::B); -+ setVisibility(uml->visibility(RoleType::A), RoleType::A); -+ setVisibility(uml->visibility(RoleType::B), RoleType::B); -+ setChangeability(uml->changeability(RoleType::A), RoleType::A); -+ setChangeability(uml->changeability(RoleType::B), RoleType::B); -+ setMultiplicity(uml->getMultiplicity(RoleType::A), RoleType::A); -+ setMultiplicity(uml->getMultiplicity(RoleType::B), RoleType::B); -+ -+ uml->blockSignals(false); -+} -+ -+/** -+ * Merges/syncs the association widget data into UML object -+ * representation. -+ * This will synchronize UMLAssociation w/ this new Widget -+ * CHECK: Can we get rid of this. -+ */ -+void AssociationWidget::mergeAssociationDataIntoUMLRepresentation() -+{ -+ UMLAssociation *umlassoc = association(); -+ UMLAttribute *umlattr = attribute(); -+ if (umlassoc == NULL && umlattr == NULL) -+ return; -+ -+ // block emit modified signal, or we get a horrible loop -+ m_umlObject->blockSignals(true); -+ -+ // would be desirable to do the following -+ // so that we can be sure its back to initial state -+ // in case we missed something here. -+ //uml->init(); -+ -+ // floating text widgets -+ FloatingTextWidget *text = nameWidget(); -+ if (text) -+ m_umlObject->setName(text->text()); -+ -+ text = roleWidget(RoleType::A); -+ if (text && umlassoc) -+ umlassoc->setRoleName(text->text(), RoleType::A); -+ -+ text = roleWidget(RoleType::B); -+ if (text) { -+ if (umlassoc) -+ umlassoc->setRoleName(text->text(), RoleType::B); -+ else if (umlattr) -+ umlattr->setName(text->text()); -+ } -+ -+ text = multiplicityWidget(RoleType::A); -+ if (text && umlassoc) -+ umlassoc->setMultiplicity(text->text(), RoleType::A); -+ -+ text = multiplicityWidget(RoleType::B); -+ if (text && umlassoc) -+ umlassoc->setMultiplicity(text->text(), RoleType::B); -+ -+ // unblock -+ m_umlObject->blockSignals(false); -+} -+ -+/** -+ * Auxiliary method for widgetMoved(): -+ * Saves all ideally computed floatingtext positions before doing any -+ * kind of change. This is necessary because a single invocation of -+ * calculateEndingPoints() modifies the AssociationLine ending points on ALL -+ * AssociationWidgets. This means that if we don't save the old ideal -+ * positions then they are irretrievably lost as soon as -+ * calculateEndingPoints() is invoked. -+ */ -+void AssociationWidget::saveIdealTextPositions() -+{ -+ m_oldNamePoint = calculateTextPosition(TextRole::Name); -+ m_oldMultiAPoint = calculateTextPosition(TextRole::MultiA); -+ m_oldMultiBPoint = calculateTextPosition(TextRole::MultiB); -+ m_oldChangeAPoint = calculateTextPosition(TextRole::ChangeA); -+ m_oldChangeBPoint = calculateTextPosition(TextRole::ChangeB); -+ m_oldRoleAPoint = calculateTextPosition(TextRole::RoleAName); -+ m_oldRoleBPoint = calculateTextPosition(TextRole::RoleBName); -+} -+ -+/** -+ * Adjusts the ending point of the association that connects to Widget. -+ */ -+void AssociationWidget::widgetMoved(UMLWidget* widget, qreal dx, qreal dy) -+{ -+ Q_UNUSED(dx); Q_UNUSED(dy); -+ -+ // Simple Approach to block moveEvent during load of XMI -+ /// @todo avoid trigger of this event during load -+ if (umlDoc()->loading()) { -+ // change of position during load of XMI -+ // -> there is something wrong -+ // -> avoid movement during opening -+ // -> print warn and stay at old position -+ DEBUG(DBG_SRC) << "called during load of XMI for ViewType: " << m_scene->type() -+ << ", and BaseType: " << baseTypeStr(); -+ return; -+ } -+ -+ DEBUG(DBG_SRC) << "association type=" << Uml::AssociationType::toString(associationType()); -+ if (associationType() == AssociationType::Exception) { -+ updatePointsException(); -+ setTextPosition(TextRole::Name); -+ } -+ else { -+ calculateEndingPoints(); -+ computeAssocClassLine(); -+ } -+ -+ // Assoc to self - move all points: -+ if (isSelf()) { -+ updatePointsSelfAssociation(); -+ -+ if (m_nameWidget && !m_nameWidget->isSelected()) { -+ setTextPositionRelatively(TextRole::Name, m_oldNamePoint); -+ } -+ -+ }//end if widgetA = widgetB -+ else if (m_role[RoleType::A].umlWidget == widget) { -+ if (m_nameWidget && m_unNameLineSegment == 0 && !m_nameWidget->isSelected() ) { -+ //only calculate position and move text if the segment it is on is moving -+ setTextPositionRelatively(TextRole::Name, m_oldNamePoint); -+ } -+ }//end if widgetA moved -+ else if (m_role[RoleType::B].umlWidget == widget) { -+ const int size = m_associationLine->count(); -+ if (m_nameWidget && (m_unNameLineSegment == size-2) && !m_nameWidget->isSelected() ) { -+ //only calculate position and move text if the segment it is on is moving -+ setTextPositionRelatively(TextRole::Name, m_oldNamePoint); -+ } -+ }//end if widgetB moved -+ -+ if (m_role[RoleType::A].roleWidget && !m_role[RoleType::A].roleWidget->isSelected()) { -+ setTextPositionRelatively(TextRole::RoleAName, m_oldRoleAPoint); -+ } -+ if (m_role[RoleType::B].roleWidget && !m_role[RoleType::B].roleWidget->isSelected()) { -+ setTextPositionRelatively(TextRole::RoleBName, m_oldRoleBPoint); -+ } -+ if (m_role[RoleType::A].multiplicityWidget && !m_role[RoleType::A].multiplicityWidget->isSelected()) { -+ setTextPositionRelatively(TextRole::MultiA, m_oldMultiAPoint); -+ } -+ if (m_role[RoleType::B].multiplicityWidget && !m_role[RoleType::B].multiplicityWidget->isSelected()) { -+ setTextPositionRelatively(TextRole::MultiB, m_oldMultiBPoint); -+ } -+ if (m_role[RoleType::A].changeabilityWidget && !m_role[RoleType::A].changeabilityWidget->isSelected()) { -+ setTextPositionRelatively(TextRole::ChangeA, m_oldChangeAPoint); -+ } -+ if (m_role[RoleType::B].changeabilityWidget && !m_role[RoleType::B].changeabilityWidget->isSelected()) { -+ setTextPositionRelatively(TextRole::ChangeB, m_oldChangeBPoint); -+ } -+} -+ -+/** -+ * Creates the points of the self association. -+ * Method called when a widget end points are calculated by calculateEndingPoints(). -+ */ -+void AssociationWidget::createPointsSelfAssociation() -+{ -+ UMLWidget *pWidgetA = m_role[RoleType::A].umlWidget; -+ -+ const int DISTANCE = 50; -+ qreal x = pWidgetA->x(); -+ qreal y = pWidgetA->y(); -+ qreal h = pWidgetA->height(); -+ qreal w = pWidgetA->width(); -+ // see if above widget ok to start -+ if (y - DISTANCE > 0) { -+ m_associationLine->setEndPoints(QPointF(x + w / 4, y) , QPointF(x + w * 3 / 4, y)); -+ m_associationLine->insertPoint(1, QPointF(x + w / 4, y - DISTANCE)); -+ m_associationLine->insertPoint(2, QPointF(x + w * 3 / 4, y - DISTANCE)); -+ m_role[RoleType::A].m_WidgetRegion = m_role[RoleType::B].m_WidgetRegion = Uml::Region::North; -+ } else { -+ m_associationLine->setEndPoints(QPointF(x + w / 4, y + h), QPointF(x + w * 3 / 4, y + h)); -+ m_associationLine->insertPoint(1, QPointF(x + w / 4, y + h + DISTANCE)); -+ m_associationLine->insertPoint(2, QPointF(x + w * 3 / 4, y + h + DISTANCE)); -+ m_role[RoleType::A].m_WidgetRegion = m_role[RoleType::B].m_WidgetRegion = Uml::Region::South; -+ } -+} -+ -+/** -+ * Adjusts the points of the self association. -+ * Method called when a widget was moved by widgetMoved(widget, x, y). -+ */ -+void AssociationWidget::updatePointsSelfAssociation() -+{ -+ UMLWidget *pWidgetA = m_role[RoleType::A].umlWidget; -+ -+ const int DISTANCE = 50; -+ qreal x = pWidgetA->x(); -+ qreal y = pWidgetA->y(); -+ qreal h = pWidgetA->height(); -+ qreal w = pWidgetA->width(); -+ // see if above widget ok to start -+ if (y - DISTANCE > 0) { -+ m_associationLine->setEndPoints(QPointF(x + w / 4, y) , QPointF(x + w * 3 / 4, y)); -+ m_associationLine->setPoint(1, QPointF(x + w / 4, y - DISTANCE)); -+ m_associationLine->setPoint(2, QPointF(x + w * 3 / 4, y - DISTANCE)); -+ m_role[RoleType::A].m_WidgetRegion = m_role[RoleType::B].m_WidgetRegion = Uml::Region::North; -+ } else { -+ m_associationLine->setEndPoints(QPointF(x + w / 4, y + h), QPointF(x + w * 3 / 4, y + h)); -+ m_associationLine->setPoint(1, QPointF(x + w / 4, y + h + DISTANCE)); -+ m_associationLine->setPoint(2, QPointF(x + w * 3 / 4, y + h + DISTANCE)); -+ m_role[RoleType::A].m_WidgetRegion = m_role[RoleType::B].m_WidgetRegion = Uml::Region::South; -+ } -+} -+ -+/** -+ * Creates the points of the association exception. -+ * Method called when a widget end points are calculated by calculateEndingPoints(). -+ */ -+void AssociationWidget::createPointsException() -+{ -+ UMLWidget *pWidgetA = m_role[RoleType::A].umlWidget; -+ UMLWidget *pWidgetB = m_role[RoleType::B].umlWidget; -+ -+ qreal xa = pWidgetA->x(); -+ qreal ya = pWidgetA->y(); -+ qreal ha = pWidgetA->height(); -+ qreal wa = pWidgetA->width(); -+ -+ qreal xb = pWidgetB->x(); -+ qreal yb = pWidgetB->y(); -+ qreal hb = pWidgetB->height(); -+ //qreal wb = pWidgetB->width(); -+ -+ m_associationLine->setEndPoints(QPointF(xa + wa , ya + ha/2) , QPointF(xb , yb + hb/2)); -+ m_associationLine->insertPoint(1, QPointF(xa + wa , ya + ha/2)); -+ m_associationLine->insertPoint(2, QPointF(xb , yb + hb/2)); -+} -+ -+/** -+ * Adjusts the points of the association exception. -+ * Method called when a widget was moved by widgetMoved(widget, x, y). -+ */ -+void AssociationWidget::updatePointsException() -+{ -+ UMLWidget *pWidgetA = m_role[RoleType::A].umlWidget; -+ UMLWidget *pWidgetB = m_role[RoleType::B].umlWidget; -+ -+ qreal xa = pWidgetA->x(); -+ qreal ya = pWidgetA->y(); -+ qreal ha = pWidgetA->height(); -+ qreal wa = pWidgetA->width(); -+ -+ qreal xb = pWidgetB->x(); -+ qreal yb = pWidgetB->y(); -+ qreal hb = pWidgetB->height(); -+ qreal wb = pWidgetB->width(); -+ qreal xmil, ymil; -+ qreal xdeb, ydeb; -+ qreal xfin, yfin; -+ qreal ESPACEX, ESPACEY; -+ QPointF p1; -+ QPointF p2; -+ //calcul des coordonnées au milieu de la flèche eclair -+ if (xb - xa - wa >= 45) { -+ ESPACEX = 0; -+ xdeb = xa + wa; -+ xfin = xb; -+ } else if (xa - xb - wb > 45) { -+ ESPACEX = 0; -+ xdeb = xa; -+ xfin = xb + wb; -+ } else { -+ ESPACEX = 15; -+ xdeb = xa + wa/2; -+ xfin = xb + wb/2; -+ } -+ -+ xmil = xdeb + (xfin - xdeb)/2; -+ -+ if (yb - ya - ha >= 45) { -+ ESPACEY = 0; -+ ydeb = ya + ha; -+ yfin = yb; -+ } else if (ya - yb - hb > 45) { -+ ESPACEY = 0; -+ ydeb = ya; -+ yfin = yb + hb; -+ } else { -+ ESPACEY = 15; -+ ydeb = ya + ha/2; -+ yfin = yb + hb/2; -+ } -+ -+ ymil = ydeb + (yfin - ydeb)/2; -+ -+ p1.setX(xmil + (xfin - xmil)*1/2); p1.setY(ymil + (yfin - ymil)*1/3); -+ p2.setX(xmil - (xmil - xdeb)*1/2); p2.setY(ymil - (ymil - ydeb)*1/3); -+ -+ if (abs(p1.x() - p2.x()) <= 10) -+ ESPACEX = 15; -+ if (abs(p1.y() - p2.y()) <= 10) -+ ESPACEY = 15; -+ -+ m_associationLine->setEndPoints(QPointF(xdeb, ydeb), QPointF(xfin, yfin)); -+ m_associationLine->setPoint(1, QPointF(p1.x() + ESPACEX, p1.y() + ESPACEY)); -+ m_associationLine->setPoint(2, QPointF(p2.x() - ESPACEX, p2.y() - ESPACEY)); -+ -+ m_role[RoleType::A].m_WidgetRegion = m_role[RoleType::B].m_WidgetRegion = Uml::Region::North; -+} -+ -+/** -+ * Finds out which region of rectangle 'rect' contains the point 'pos' and returns the region -+ * number: -+ * 1 = Region 1 -+ * 2 = Region 2 -+ * 3 = Region 3 -+ * 4 = Region 4 -+ * 5 = On diagonal 2 between Region 1 and 2 -+ * 6 = On diagonal 1 between Region 2 and 3 -+ * 7 = On diagonal 2 between Region 3 and 4 -+ * 8 = On diagonal 1 between Region 4 and 1 -+ * 9 = On diagonal 1 and On diagonal 2 (the center) -+ */ -+Uml::Region::Enum AssociationWidget::findPointRegion(const QRectF& rect, const QPointF &pos) -+{ -+ qreal w = rect.width(); -+ qreal h = rect.height(); -+ qreal x = rect.x(); -+ qreal y = rect.y(); -+ qreal slope2 = w / h; -+ qreal slope1 = slope2 *(-1.0); -+ qreal b1 = x + w - (slope1 * y); -+ qreal b2 = x - (slope2 * y); -+ -+ qreal eval1 = slope1 * pos.y() + b1; -+ qreal eval2 = slope2 * pos.y() + b2; -+ -+ Uml::Region::Enum result = Uml::Region::Error; -+ //if inside region 1 -+ if (eval1 > pos.x() && eval2 > pos.x()) { -+ result = Uml::Region::West; -+ } -+ //if inside region 2 -+ else if (eval1 > pos.x() && eval2 < pos.x()) { -+ result = Uml::Region::North; -+ } -+ //if inside region 3 -+ else if (eval1 < pos.x() && eval2 < pos.x()) { -+ result = Uml::Region::East; -+ } -+ //if inside region 4 -+ else if (eval1 < pos.x() && eval2 > pos.x()) { -+ result = Uml::Region::South; -+ } -+ //if inside region 5 -+ else if (eval1 == pos.x() && eval2 < pos.x()) { -+ result = Uml::Region::NorthWest; -+ } -+ //if inside region 6 -+ else if (eval1 < pos.x() && eval2 == pos.x()) { -+ result = Uml::Region::NorthEast; -+ } -+ //if inside region 7 -+ else if (eval1 == pos.x() && eval2 > pos.x()) { -+ result = Uml::Region::SouthEast; -+ } -+ //if inside region 8 -+ else if (eval1 > pos.x() && eval2 == pos.x()) { -+ result = Uml::Region::SouthWest; -+ } -+ //if inside region 9 -+ else if (eval1 == pos.x() && eval2 == pos.x()) { -+ result = Uml::Region::Center; -+ } -+ return result; -+} -+ -+/** -+ * Returns a point with interchanged X and Y coordinates. -+ */ -+QPointF AssociationWidget::swapXY(const QPointF &p) -+{ -+ QPointF swapped( p.y(), p.x() ); -+ return swapped; -+} -+ -+#if 0 // not used at the moment -+/** -+ * Calculates which point of segment P1P2 has a distance equal to -+ * Distance from P1. -+ * Let's say such point is PX, the distance from P1 to PX must be equal -+ * to Distance and if PX is not a point of the segment P1P2 then the -+ * function returns (-1, -1). -+ */ -+QPointF AssociationWidget::calculatePointAtDistance(const QPointF &P1, const QPointF &P2, float Distance) -+{ -+ /* -+ the distance D between points (x1, y1) and (x3, y3) has the following formula: -+ --- ------------------------------ -+ D = \ / 2 2 -+ \ / (x3 - x1) + (y3 - y1) -+ -+ D, x1 and y1 are known and the point (x3, y3) is inside line (x1, y1)(x2, y2), so if the -+ that line has the formula y = mx + b -+ then y3 = m*x3 + b -+ -+ 2 2 2 -+ D = (x3 - x1) + (y3 - y1) -+ -+ 2 2 2 2 2 -+ D = x3 - 2*x3*x1 + x1 + y3 - 2*y3*y1 + y1 -+ -+ 2 2 2 2 2 -+ D - x1 - y1 = x3 - 2*x3*x1 + y3 - 2*y3*y1 -+ -+ 2 2 2 2 2 -+ D - x1 - y1 = x3 - 2*x3*x1 + (m*x3 + b) - 2*(m*x3 + b)*y1 -+ -+ 2 2 2 2 2 2 -+ D - x1 - y1 + 2*b*y1 - b = (m + 1)*x3 + (-2*x1 + 2*m*b -2*m*y1)*x3 -+ -+ 2 2 2 2 -+ C = - D + x1 + y1 - 2*b*y1 + b -+ -+ -+ 2 -+ A = (m + 1) -+ -+ B = (-2*x1 + 2*m*b -2*m*y1) -+ -+ and we have -+ 2 -+ A * x3 + B * x3 - C = 0 -+ -+ --------------- -+ -B + --- / 2 -+ \/ B - 4*A*C -+ sol_1 = -------------------------------- -+ 2*A -+ -+ -+ --------------- -+ -B - --- / 2 -+ \/ B - 4*A*C -+ sol_2 = -------------------------------- -+ 2*A -+ -+ -+ then in the distance formula we have only one variable x3 and that is easy -+ to calculate -+ */ -+ int x1 = P1.y(); -+ int y1 = P1.x(); -+ int x2 = P2.y(); -+ int y2 = P2.x(); -+ -+ if (x2 == x1) { -+ return QPointF(x1, y1 + (int)Distance); -+ } -+ float slope = ((float)y2 - (float)y1) / ((float)x2 - (float)x1); -+ float b = (y1 - slope*x1); -+ float A = (slope * slope) + 1; -+ float B = (2*slope*b) - (2*x1) - (2*slope*y1); -+ float C = (b*b) - (Distance*Distance) + (x1*x1) + (y1*y1) - (2*b*y1); -+ float t = B*B - 4*A*C; -+ -+ if (t < 0) { -+ return QPointF(-1, -1); -+ } -+ float sol_1 = ((-1* B) + sqrt(t)) / (2*A); -+ float sol_2 = ((-1*B) - sqrt(t)) / (2*A); -+ -+ if (sol_1 < 0.0 && sol_2 < 0.0) { -+ return QPointF(-1, -1); -+ } -+ QPointF sol1Point((int)(slope*sol_1 + b), (int)(sol_1)); -+ QPointF sol2Point((int)(slope*sol_2 + b), (int)(sol_2)); -+ if (sol_1 < 0 && sol_2 >=0) { -+ if (x2 > x1) { -+ if (x1 <= sol_2 && sol_2 <= x2) -+ return sol2Point; -+ } else { -+ if (x2 <= sol_2 && sol_2 <= x1) -+ return sol2Point; -+ } -+ } else if (sol_1 >= 0 && sol_2 < 0) { -+ if (x2 > x1) { -+ if (x1 <= sol_1 && sol_1 <= x2) -+ return sol1Point; -+ } else { -+ if (x2 <= sol_1 && sol_1 <= x1) -+ return sol1Point; -+ } -+ } else { -+ if (x2 > x1) { -+ if (x1 <= sol_1 && sol_1 <= x2) -+ return sol1Point; -+ if (x1 <= sol_2 && sol_2 <= x2) -+ return sol2Point; -+ } else { -+ if (x2 <= sol_1 && sol_1 <= x1) -+ return sol1Point; -+ if (x2 <= sol_2 && sol_2 <= x1) -+ return sol2Point; -+ } -+ } -+ return QPointF(-1, -1); -+} -+ -+/** -+ * Calculates which point of a perpendicular line to segment P1P2 that contains P2 -+ * has a distance equal to Distance from P2, -+ * Lets say such point is P3, the distance from P2 to P3 must be equal to Distance -+ */ -+QPointF AssociationWidget::calculatePointAtDistanceOnPerpendicular(const QPointF &P1, const QPointF &P2, float Distance) -+{ -+ /* -+ the distance D between points (x2, y2) and (x3, y3) has the following formula: -+ -+ --- ------------------------------ -+ D = \ / 2 2 -+ \ / (x3 - x2) + (y3 - y2) -+ -+ D, x2 and y2 are known and line P2P3 is perpendicular to line (x1, y1)(x2, y2), so if the -+ line P1P2 has the formula y = m*x + b, -+ then (x1 - x2) -+ m = -----------, because it is perpendicular to line P1P2 -+ (y2 - y1) -+ -+ also y2 = m*x2 + b -+ => b = y2 - m*x2 -+ -+ then P3 = (x3, m*x3 + b) -+ -+ 2 2 2 -+ D = (x3 - x2) + (y3 - y2) -+ -+ 2 2 2 2 2 -+ D = x3 - 2*x3*x2 + x2 + y3 - 2*y3*y2 + y2 -+ -+ 2 2 2 2 2 -+ D - x2 - y2 = x3 - 2*x3*x2 + y3 - 2*y3*y2 -+ -+ -+ -+ 2 2 2 2 2 -+ D - x2 - y2 = x3 - 2*x3*x2 + (m*x3 + b) - 2*(m*x3 + b)*y2 -+ -+ 2 2 2 2 2 2 -+ D - x2 - y2 + 2*b*y2 - b = (m + 1)*x3 + (-2*x2 + 2*m*b -2*m*y2)*x3 -+ -+ 2 2 2 2 -+ C = - D + x2 + y2 - 2*b*y2 + b -+ -+ 2 -+ A = (m + 1) -+ -+ B = (-2*x2 + 2*m*b -2*m*y2) -+ -+ and we have -+ 2 -+ A * x3 + B * x3 - C = 0 -+ -+ -+ --------------- -+ --- / 2 -+ -B + \/ B - 4*A*C -+ sol_1 = -------------------------------- -+ 2*A -+ -+ -+ --------------- -+ --- / 2 -+ -B - \/ B - 4*A*C -+ sol_2 = -------------------------------- -+ 2*A -+ -+ then in the distance formula we have only one variable x3 and that is easy -+ to calculate -+ */ -+ if (P1.x() == P2.x()) { -+ return QPointF((int)(P2.x() + Distance), P2.y()); -+ } -+ const int x1 = P1.y(); -+ const int y1 = P1.x(); -+ const int x2 = P2.y(); -+ const int y2 = P2.x(); -+ -+ float slope = ((float)x1 - (float)x2) / ((float)y2 - (float)y1); -+ float b = (y2 - slope*x2); -+ float A = (slope * slope) + 1; -+ float B = (2*slope*b) - (2*x2) - (2*slope*y2); -+ float C = (b*b) - (Distance*Distance) + (x2*x2) + (y2*y2) - (2*b*y2); -+ float t = B*B - 4*A*C; -+ if (t < 0) { -+ return QPointF(-1, -1); -+ } -+ float sol_1 = ((-1* B) + sqrt(t)) / (2*A); -+ -+ float sol_2 = ((-1*B) - sqrt(t)) / (2*A); -+ -+ if (sol_1 < 0 && sol_2 < 0) { -+ return QPointF(-1, -1); -+ } -+ QPointF sol1Point((int)(slope*sol_1 + b), (int)sol_1); -+ QPointF sol2Point((int)(slope*sol_2 + b), (int)sol_2); -+ if (sol_1 < 0 && sol_2 >=0) { -+ return sol2Point; -+ } else if (sol_1 >= 0 && sol_2 < 0) { -+ return sol1Point; -+ } else { // Choose one solution, either will work fine -+ if (slope >= 0) { -+ if (sol_1 <= sol_2) -+ return sol2Point; -+ else -+ return sol1Point; -+ } else { -+ if (sol_1 <= sol_2) -+ return sol1Point; -+ else -+ return sol2Point; -+ } -+ -+ } -+ return QPointF(-1, -1); // never reached, just keep compilers happy -+} -+ -+/** -+ * Calculates the intersection (PS) between line P1P2 and a perpendicular line containing -+ * P3, the result is returned in ResultingPoint. and result value represents the distance -+ * between ResultingPoint and P3; if this value is negative an error ocurred. -+ */ -+float AssociationWidget::perpendicularProjection(const QPointF& P1, const QPointF& P2, const QPointF& P3, -+ QPointF& ResultingPoint) -+{ -+ //line P1P2 is Line 1 = y=slope1*x + b1 -+ -+ //line P3PS is Line 1 = y=slope2*x + b2 -+ -+ float slope2 = 0; -+ float slope1 = 0; -+ float sx = 0, sy = 0; -+ int y2 = P2.x(); -+ int y1 = P1.x(); -+ int x2 = P2.y(); -+ int x1 = P1.y(); -+ int y3 = P3.x(); -+ int x3 = P3.y(); -+ float distance = 0; -+ float b1 = 0; -+ -+ float b2 = 0; -+ -+ if (x2 == x1) { -+ sx = x2; -+ sy = y3; -+ } else if (y2 == y1) { -+ sy = y2; -+ sx = x3; -+ } else { -+ slope1 = (y2 - y1)/ (x2 - x1); -+ slope2 = (x1 - x2)/ (y2 - y1); -+ b1 = y2 - (slope1 * x2); -+ b2 = y3 - (slope2 * x3); -+ sx = (b2 - b1) / (slope1 - slope2); -+ sy = slope1*sx + b1; -+ } -+ distance = (int)(sqrt(((x3 - sx)*(x3 - sx)) + ((y3 - sy)*(y3 - sy)))); -+ -+ ResultingPoint.setX((int)sy); -+ ResultingPoint.setY((int)sx); -+ -+ return distance; -+} -+#endif -+ -+/** -+ * Calculates the position of the text widget depending on the role -+ * that widget is playing. -+ * Returns the point at which to put the widget. -+ */ -+QPointF AssociationWidget::calculateTextPosition(Uml::TextRole::Enum role) -+{ -+ const int SPACE = 2; -+ QPointF p(-1, -1), q(-1, -1); -+ -+ // used to find out if association end point (p) -+ // is at top or bottom edge of widget. -+ -+ if (role == TextRole::MultiA || role == TextRole::ChangeA || role == TextRole::RoleAName) { -+ p = m_associationLine->point(0); -+ q = m_associationLine->point(1); -+ } else if (role == TextRole::MultiB || role == TextRole::ChangeB || role == TextRole::RoleBName) { -+ const int lastSegment = m_associationLine->count() - 1; -+ p = m_associationLine->point(lastSegment); -+ q = m_associationLine->point(lastSegment - 1); -+ } else if (role != TextRole::Name) { -+ uError() << "called with unsupported TextRole::Enum " << role; -+ return QPointF(-1, -1); -+ } -+ -+ FloatingTextWidget *text = textWidgetByRole(role); -+ int textW = 0, textH = 0; -+ if (text) { -+ textW = text->width(); -+ textH = text->height(); -+ } -+ -+ qreal x = 0.0, y = 0.0; -+ -+ if (role == TextRole::MultiA || role == TextRole::MultiB) { -+ const bool isHorizontal = (p.y() == q.y()); -+ const int atBottom = p.y() + SPACE; -+ const int atTop = p.y() - SPACE - textH; -+ const int atLeft = p.x() - SPACE - textW; -+ const int atRight = p.x() + SPACE; -+ y = (p.y() > q.y()) == isHorizontal ? atBottom : atTop; -+ x = (p.x() < q.x()) == isHorizontal ? atRight : atLeft; -+ -+ } else if (role == TextRole::ChangeA || role == TextRole::ChangeB) { -+ -+ if (p.y() > q.y()) -+ y = p.y() - SPACE - (textH * 2); -+ else -+ y = p.y() + SPACE + textH; -+ -+ if (p.x() < q.x()) -+ x = p.x() + SPACE; -+ else -+ x = p.x() - SPACE - textW; -+ -+ } else if (role == TextRole::RoleAName || role == TextRole::RoleBName) { -+ -+ if (p.y() > q.y()) -+ y = p.y() - SPACE - textH; -+ else -+ y = p.y() + SPACE; -+ -+ if (p.x() < q.x()) -+ x = p.x() + SPACE; -+ else -+ x = p.x() - SPACE - textW; -+ -+ } else if (role == TextRole::Name) { -+ -+ calculateNameTextSegment(); -+ if (m_unNameLineSegment == -1) { -+ uWarning() << "TODO:negative line segment index"; -+ m_unNameLineSegment = 0; -+ } -+ x = ( m_associationLine->point(m_unNameLineSegment).x() + -+ m_associationLine->point(m_unNameLineSegment + 1).x() ) / 2; -+ y = ( m_associationLine->point(m_unNameLineSegment).y() + -+ m_associationLine->point(m_unNameLineSegment + 1).y() ) / 2; -+ } -+ -+ if (text) { -+ constrainTextPos(x, y, textW, textH, role); -+ } -+ p = QPointF( x, y ); -+ return p; -+} -+ -+/** -+ * Return the mid point between p0 and p1 -+ */ -+QPointF AssociationWidget::midPoint(const QPointF& p0, const QPointF& p1) -+{ -+ QPointF midP; -+ if (p0.x() < p1.x()) -+ midP.setX(p0.x() + (p1.x() - p0.x()) / 2); -+ else -+ midP.setX(p1.x() + (p0.x() - p1.x()) / 2); -+ if (p0.y() < p1.y()) -+ midP.setY(p0.y() + (p1.y() - p0.y()) / 2); -+ else -+ midP.setY(p1.y() + (p0.y() - p1.y()) / 2); -+ return midP; -+} -+ -+/** -+ * Constrains the FloatingTextWidget X and Y values supplied. -+ * Implements the abstract operation from LinkWidget. -+ * -+ * @param textX Candidate X value (may be modified by the constraint.) -+ * @param textY Candidate Y value (may be modified by the constraint.) -+ * @param textWidth Width of the text. -+ * @param textHeight Height of the text. -+ * @param tr Uml::Text_Role of the text. -+ */ -+void AssociationWidget::constrainTextPos(qreal &textX, qreal &textY, -+ qreal textWidth, qreal textHeight, -+ Uml::TextRole::Enum tr) -+{ -+ const int textCenterX = textX + textWidth / 2; -+ const int textCenterY = textY + textHeight / 2; -+ const int lastSegment = m_associationLine->count() - 1; -+ QPointF p0, p1; -+ switch (tr) { -+ case TextRole::RoleAName: -+ case TextRole::MultiA: -+ case TextRole::ChangeA: -+ p0 = m_associationLine->point(0); -+ p1 = m_associationLine->point(1); -+ // If we are dealing with a single line then tie the -+ // role label to the proper half of the line, i.e. -+ // the role label must be closer to the "other" -+ // role object. -+ if (lastSegment == 1) -+ p1 = midPoint(p0, p1); -+ break; -+ case TextRole::RoleBName: -+ case TextRole::MultiB: -+ case TextRole::ChangeB: -+ p0 = m_associationLine->point(lastSegment - 1); -+ p1 = m_associationLine->point(lastSegment); -+ if (lastSegment == 1) -+ p0 = midPoint(p0, p1); -+ break; -+ case TextRole::Name: -+ case TextRole::Coll_Message: // CHECK: collab.msg texts seem to be TextRole::Name -+ case TextRole::State: // CHECK: is this used? -+ // Find the linepath segment to which the (textX, textY) is closest -+ // and constrain to the corridor of that segment (see farther below) -+ { -+ int minDistSquare = 100000; // utopian initial value -+ int lpIndex = 0; -+ for (int i = 0; i < lastSegment; ++i) { -+ p0 = m_associationLine->point(i); -+ p1 = m_associationLine->point(i + 1); -+ QPointF midP = midPoint(p0, p1); -+ const int deltaX = textCenterX - midP.x(); -+ const int deltaY = textCenterY - midP.y(); -+ const int cSquare = deltaX * deltaX + deltaY * deltaY; -+ if (cSquare < minDistSquare) { -+ minDistSquare = cSquare; -+ lpIndex = i; -+ } -+ } -+ p0 = m_associationLine->point(lpIndex); -+ p1 = m_associationLine->point(lpIndex + 1); -+ } -+ break; -+ default: -+ uError() << "unexpected TextRole::Enum " << tr; -+ return; -+ break; -+ } -+ /* Constraint: -+ The midpoint between p0 and p1 is taken to be the center of a circle -+ with radius D/2 where D is the distance between p0 and p1. -+ The text center needs to be within this circle else it is constrained -+ to the nearest point on the circle. -+ */ -+ p0 = swapXY(p0); // go to the natural coordinate system -+ p1 = swapXY(p1); // with (0,0) in the lower left corner -+ QPointF midP = midPoint(p0, p1); -+ // If (textX,textY) is not inside the circle around midP then -+ // constrain (textX,textY) to the nearest point on that circle. -+ const int x0 = p0.x(); -+ const int y0 = p0.y(); -+ const int x1 = p1.x(); -+ const int y1 = p1.y(); -+ double r = sqrt((double)((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0))) / 2; -+ if (textWidth > r) -+ r = textWidth; -+ // swap textCenter{X,Y} to convert from Qt coord.system. -+ const QPointF origTextCenter(textCenterY, textCenterX); -+ const int relX = abs(origTextCenter.x() - midP.x()); -+ const int relY = abs(origTextCenter.y() - midP.y()); -+ const double negativeWhenInsideCircle = relX * relX + relY * relY - r * r; -+ if (negativeWhenInsideCircle <= 0.0) { -+ return; -+ } -+ /* -+ The original constraint was to snap the text position to the -+ midpoint but that creates unpleasant visual jitter: -+ textX = midP.y() - textWidth / 2; // go back to Qt coord.sys. -+ textY = midP.x() - textHeight / 2; // go back to Qt coord.sys. -+ -+ Rather, we project the text position onto the closest point -+ on the circle: -+ -+ Circle equation: -+ relX^2 + relY^2 - r^2 = 0, or in other words -+ relY^2 = r^2 - relX^2, or -+ relY = sqrt(r^2 - relX^2) -+ Line equation: -+ relY = a * relX + b -+ We can omit "b" because relX and relY are already relative to -+ the circle origin, therefore we can also write: -+ a = relY / relX -+ To obtain the point of intersection between the circle of radius r -+ and the line connecting the circle origin with the point (relX, relY), -+ we equate the relY: -+ a * x = sqrt(r^2 - x^2), or in other words -+ a^2 * x^2 = r^2 - x^2, or -+ x^2 * (a^2 + 1) = r^2, or -+ x^2 = r^2 / (a^2 + 1), or -+ x = sqrt(r^2 / (a^2 + 1)) -+ and then -+ y = a * x -+ The resulting x and y are relative to the circle origin so we just add -+ the circle origin (X, Y) to obtain the constrained (textX, textY). -+ */ -+ // Handle the special case, relX = 0. -+ if (relX == 0) { -+ if (origTextCenter.y() > midP.y()) -+ textX = midP.y() + (int)r; // go back to Qt coord.sys. -+ else -+ textX = midP.y() - (int)r; // go back to Qt coord.sys. -+ textX -= textWidth / 2; -+ return; -+ } -+ const double a = (double)relY / (double)relX; -+ const double x = sqrt(r*r / (a*a + 1)); -+ const double y = a * x; -+ if (origTextCenter.x() > midP.x()) -+ textY = midP.x() + (int)x; // go back to Qt coord.sys. -+ else -+ textY = midP.x() - (int)x; // go back to Qt coord.sys. -+ textY -= textHeight / 2; -+ if (origTextCenter.y() > midP.y()) -+ textX = midP.y() + (int)y; // go back to Qt coord.sys. -+ else -+ textX = midP.y() - (int)y; // go back to Qt coord.sys. -+ textX -= textWidth / 2; -+} -+ -+/** -+ * Puts the text widget with the given role at the given position. -+ * This method calls @ref calculateTextPostion to get the needed position. -+ * I.e. the line segment it is on has moved and it should move the same -+ * amount as the line. -+ */ -+void AssociationWidget::setTextPosition(Uml::TextRole::Enum role) -+{ -+ bool startMove = false; -+ if (m_role[RoleType::A].multiplicityWidget && m_role[RoleType::A].multiplicityWidget->getStartMove()) -+ startMove = true; -+ else if (m_role[RoleType::B].multiplicityWidget && m_role[RoleType::B].multiplicityWidget->getStartMove()) -+ startMove = true; -+ else if (m_role[RoleType::A].changeabilityWidget && m_role[RoleType::A].changeabilityWidget->getStartMove()) -+ startMove = true; -+ else if (m_role[RoleType::B].changeabilityWidget && m_role[RoleType::B].changeabilityWidget->getStartMove()) -+ startMove = true; -+ else if (m_role[RoleType::A].roleWidget && m_role[RoleType::A].roleWidget->getStartMove()) -+ startMove = true; -+ else if (m_role[RoleType::B].roleWidget && m_role[RoleType::B].roleWidget->getStartMove()) -+ startMove = true; -+ else if (m_nameWidget && m_nameWidget->getStartMove()) -+ startMove = true; -+ if (startMove) { -+ return; -+ } -+ FloatingTextWidget *ft = textWidgetByRole(role); -+ if (ft == NULL) -+ return; -+ QPointF pos = calculateTextPosition(role); -+ ft->setX(pos.x()); -+ ft->setY(pos.y()); -+} -+ -+/** -+ * Moves the text widget with the given role by the difference between -+ * the two points. -+ */ -+void AssociationWidget::setTextPositionRelatively(Uml::TextRole::Enum role, const QPointF &oldPosition) -+{ -+ bool startMove = false; -+ if (m_role[RoleType::A].multiplicityWidget && m_role[RoleType::A].multiplicityWidget->getStartMove()) -+ startMove = true; -+ else if (m_role[RoleType::B].multiplicityWidget && m_role[RoleType::B].multiplicityWidget->getStartMove()) -+ startMove = true; -+ else if (m_role[RoleType::A].changeabilityWidget && m_role[RoleType::A].changeabilityWidget->getStartMove()) -+ startMove = true; -+ else if (m_role[RoleType::B].changeabilityWidget && m_role[RoleType::B].changeabilityWidget->getStartMove()) -+ startMove = true; -+ else if (m_role[RoleType::A].roleWidget && m_role[RoleType::A].roleWidget->getStartMove()) -+ startMove = true; -+ else if (m_role[RoleType::B].roleWidget && m_role[RoleType::B].roleWidget->getStartMove()) -+ startMove = true; -+ else if (m_nameWidget && m_nameWidget->getStartMove()) -+ startMove = true; -+ -+ if (startMove) { -+ return; -+ } -+ FloatingTextWidget *ft = textWidgetByRole(role); -+ if (ft == NULL) -+ return; -+ qreal ftX = ft->x(); -+ qreal ftY = ft->y(); -+ -+ QPointF pos = calculateTextPosition(role); -+ int relX = pos.x() - oldPosition.x(); -+ int relY = pos.y() - oldPosition.y(); -+ qreal ftNewX = ftX + relX; -+ qreal ftNewY = ftY + relY; -+ -+ bool oldIgnoreSnapToGrid = ft->getIgnoreSnapToGrid(); -+ ft->setIgnoreSnapToGrid(true); -+ ft->setX(ftNewX); -+ ft->setY(ftNewY); -+ ft->setIgnoreSnapToGrid(oldIgnoreSnapToGrid); -+} -+ -+/** -+ * Remove dashed connecting line for association class. -+ */ -+void AssociationWidget::removeAssocClassLine() -+{ -+ delete m_pAssocClassLineSel0; -+ m_pAssocClassLineSel0 = 0; -+ delete m_pAssocClassLineSel1; -+ m_pAssocClassLineSel1 = 0; -+ delete m_pAssocClassLine; -+ m_pAssocClassLine = 0; -+ if (m_associationClass) { -+ m_associationClass->setClassAssociationWidget(0); -+ m_associationClass = 0; -+ } -+} -+ -+/** -+ * Creates the association class connecting line. -+ */ -+void AssociationWidget::createAssocClassLine() -+{ -+ if (m_pAssocClassLine == NULL) { -+ m_pAssocClassLine = new QGraphicsLineItem(this); -+ } -+ QPen pen(lineColor(), lineWidth(), Qt::DashLine); -+ m_pAssocClassLine->setPen(pen); -+ // decoration points -+ m_pAssocClassLineSel0 = Widget_Utils::decoratePoint(m_pAssocClassLine->line().p1(), -+ m_pAssocClassLine); -+ m_pAssocClassLineSel1 = Widget_Utils::decoratePoint(m_pAssocClassLine->line().p2(), -+ m_pAssocClassLine); -+ computeAssocClassLine(); -+ selectAssocClassLine(false); -+} -+ -+/** -+ * Creates the association class connecting line using the specified -+ * ClassifierWidget. -+ * -+ * @param classifier The ClassifierWidget to use. -+ * @param linePathSegmentIndex The index of the segment where the -+ * association class is created. -+ */ -+void AssociationWidget::createAssocClassLine(ClassifierWidget* classifier, -+ int linePathSegmentIndex) -+{ -+ m_nLinePathSegmentIndex = linePathSegmentIndex; -+ -+ if (m_nLinePathSegmentIndex < 0) { -+ return; -+ } -+ -+ m_associationClass = classifier; -+ m_associationClass->setClassAssociationWidget(this); -+ m_associationClass->addAssoc(this); // to get widgetMoved(...) for association classes -+ -+ createAssocClassLine(); -+} -+ -+/** -+ * Compute the end points of m_pAssocClassLine in case this -+ * association has an attached association class. -+ * TODO: The decoration points make no sense for now, because they are not movable. -+ */ -+void AssociationWidget::computeAssocClassLine() -+{ -+ if (m_associationClass == NULL || m_pAssocClassLine == NULL) { -+ return; -+ } -+ if (m_nLinePathSegmentIndex < 0) { -+ uError() << "m_nLinePathSegmentIndex is not set"; -+ return; -+ } -+ -+ QPointF segStart = m_associationLine->point(m_nLinePathSegmentIndex); -+ QPointF segEnd = m_associationLine->point(m_nLinePathSegmentIndex + 1); -+ const qreal midSegX = segStart.x() + (segEnd.x() - segStart.x()) / 2.0; -+ const qreal midSegY = segStart.y() + (segEnd.y() - segStart.y()) / 2.0; -+ QPointF segmentMidPoint(midSegX, midSegY); -+ -+ QLineF possibleAssocLine = QLineF(segmentMidPoint, -+ m_associationClass->mapRectToScene(m_associationClass->rect()).center()); -+ QPointF intersectionPoint; -+ QLineF::IntersectType type = intersect(m_associationClass->mapRectToScene(m_associationClass->boundingRect()), -+ possibleAssocLine, -+ &intersectionPoint); -+ // DEBUG(DBG_SRC) << "intersect type=" << type << " / point=" << intersectionPoint; -+ -+ if (type == QLineF::BoundedIntersection) { -+ m_pAssocClassLine->setLine(midSegX, midSegY, -+ intersectionPoint.x(), intersectionPoint.y()); -+ -+ if (m_pAssocClassLineSel0 && m_pAssocClassLineSel1) { -+ m_pAssocClassLineSel0->setPos(m_pAssocClassLine->line().p1()); -+ m_pAssocClassLineSel1->setPos(m_pAssocClassLine->line().p2()); -+ } -+ } -+} -+ -+/** -+ * Renders the association class connecting line selected. -+ */ -+void AssociationWidget::selectAssocClassLine(bool sel) -+{ -+ if (m_pAssocClassLineSel0 && m_pAssocClassLineSel1) { -+ m_pAssocClassLineSel0->setVisible(sel); -+ m_pAssocClassLineSel1->setVisible(sel); -+ } -+} -+ -+/** -+ * Sets the association to be selected. -+ */ -+void AssociationWidget::mousePressEvent(QGraphicsSceneMouseEvent * me) -+{ -+ // clear other selected stuff on the screen of ShiftKey -+ if (me->modifiers() != Qt::ShiftModifier) { -+ m_scene->clearSelected(); -+ } -+ -+ if (me->button() == Qt::LeftButton && me->modifiers() == Qt::ControlModifier) { -+ if (checkRemovePoint(me->scenePos())) -+ return; -+ } -+ -+ // make sure we should be here depending on the button -+ if (me->button() != Qt::RightButton && me->button() != Qt::LeftButton) { -+ return; -+ } -+ QPointF mep = me->scenePos(); -+ // see if `mep' is on the connecting line to the association class -+ if (onAssocClassLine(mep)) { -+ setSelected(true); -+ selectAssocClassLine(); -+ return; -+ } -+ setSelected(!isSelected()); -+ associationLine()->mousePressEvent(me); -+} -+ -+/** -+ * Displays the right mouse buttom menu if right button is pressed. -+ */ -+void AssociationWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent * me) -+{ -+ associationLine()->mouseReleaseEvent(me); -+} -+ -+/** -+ * Handles the selection from the popup menu. -+ */ -+void AssociationWidget::slotMenuSelection(QAction* action) -+{ -+ QString oldText, newText; -+ QRegExpValidator v(QRegExp(QLatin1String(".*")), 0); -+ Uml::AssociationType::Enum atype = associationType(); -+ Uml::RoleType::Enum r = RoleType::B; -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ DEBUG(DBG_SRC) << "menu selection = " << ListPopupMenu::toString(sel); -+ -+ // if it's a collaboration message we now just use the code in floatingtextwidget -+ // this means there's some redundant code below but that's better than duplicated code -+ if (isCollaboration() && sel != ListPopupMenu::mt_Delete) { -+ m_nameWidget->slotMenuSelection(action); -+ return; -+ } -+ -+ switch(sel) { -+ case ListPopupMenu::mt_Properties: -+ if (atype == AssociationType::Seq_Message || atype == AssociationType::Seq_Message_Self) { -+ // show op dlg for seq. diagram here -+ // don't worry about here, I don't think it can get here as -+ // line is widget on seq. diagram -+ // here just in case - remove later after testing -+ DEBUG(DBG_SRC) << "mt_Properties: assoctype is " << atype; -+ } else { //standard assoc dialog -+ UMLApp::app()->docWindow()->updateDocumentation(false); -+ showPropertiesDialog(); -+ } -+ break; -+ -+ case ListPopupMenu::mt_Add_Point: -+ checkAddPoint(m_eventScenePos); -+ break; -+ -+ case ListPopupMenu::mt_Delete_Point: -+ checkRemovePoint(m_eventScenePos); -+ break; -+ -+ case ListPopupMenu::mt_Delete: -+ if (m_pAssocClassLineSel0) -+ removeAssocClassLine(); -+ else if (association()) -+ m_scene->removeAssocInViewAndDoc(this); -+ else -+ m_scene->removeAssoc(this); -+ break; -+ -+ case ListPopupMenu::mt_Rename_MultiA: -+ r = RoleType::A; // fall through -+ case ListPopupMenu::mt_Rename_MultiB: -+ if (m_role[r].multiplicityWidget) -+ oldText = m_role[r].multiplicityWidget->text(); -+ else -+ oldText = QString(); -+#if QT_VERSION >= 0x050000 -+ newText = QInputDialog::getText(m_scene->activeView(), -+ i18n("Multiplicity"), -+ i18n("Enter multiplicity:"), -+ QLineEdit::Normal, -+ oldText, NULL); -+#else -+ newText = KInputDialog::getText(i18n("Multiplicity"), -+ i18n("Enter multiplicity:"), -+ oldText, NULL, m_scene->activeView(), &v); -+#endif -+ if (newText != oldText) { -+ if (FloatingTextWidget::isTextValid(newText)) { -+ setMultiplicity(newText, r); -+ } else { -+ m_scene->removeWidget(m_role[r].multiplicityWidget); -+ m_role[r].multiplicityWidget = NULL; -+ } -+ } -+ break; -+ -+ case ListPopupMenu::mt_Rename_Name: -+ if (m_nameWidget) -+ oldText = m_nameWidget->text(); -+ else -+ oldText = QString(); -+#if QT_VERSION >= 0x050000 -+ newText = QInputDialog::getText(m_scene->activeView(), -+ i18n("Association Name"), -+ i18n("Enter association name:"), -+ QLineEdit::Normal, -+ oldText, NULL); -+#else -+ newText = KInputDialog::getText(i18n("Association Name"), -+ i18n("Enter association name:"), -+ oldText, NULL, m_scene->activeView(), &v); -+#endif -+ if (newText != oldText) { -+ if (FloatingTextWidget::isTextValid(newText)) { -+ setName(newText); -+ } else if (m_nameWidget) { -+ m_scene->removeWidget(m_nameWidget); -+ m_nameWidget = NULL; -+ } -+ } -+ break; -+ -+ case ListPopupMenu::mt_Rename_RoleAName: -+ r = RoleType::A; // fall through -+ case ListPopupMenu::mt_Rename_RoleBName: -+ if (m_role[r].roleWidget) -+ oldText = m_role[r].roleWidget->text(); -+ else -+ oldText = QString(); -+#if QT_VERSION >= 0x050000 -+ newText = QInputDialog::getText(m_scene->activeView(), -+ i18n("Role Name"), -+ i18n("Enter role name:"), -+ QLineEdit::Normal, -+ oldText, NULL); -+#else -+ newText = KInputDialog::getText(i18n("Role Name"), -+ i18n("Enter role name:"), -+ oldText, NULL, m_scene->activeView(), &v); -+#endif -+ if (newText != oldText) { -+ if (FloatingTextWidget::isTextValid(newText)) { -+ setRoleName(newText, r); -+ } else { -+ m_scene->removeWidget(m_role[r].roleWidget); -+ m_role[r].roleWidget = NULL; -+ } -+ } -+ break; -+ -+ case ListPopupMenu::mt_Change_Font: -+ { -+#if QT_VERSION >= 0x050000 -+ bool ok = false; -+ QFont fnt = QFontDialog::getFont(&ok, font(), m_scene->activeView()); -+ if (ok) -+#else -+ QFont fnt = font(); -+ if (KFontDialog::getFont(fnt, KFontChooser::NoDisplayFlags, m_scene->activeView())) -+#endif -+ lwSetFont(fnt); -+ } -+ break; -+ -+ case ListPopupMenu::mt_Line_Color: -+ { -+#if QT_VERSION >= 0x050000 -+ QColor newColor = QColorDialog::getColor(lineColor()); -+ if (newColor != lineColor()) { -+#else -+ QColor newColor; -+ if (KColorDialog::getColor(newColor)) { -+#endif -+ m_scene->selectionSetLineColor(newColor); -+ umlDoc()->setModified(true); -+ } -+ } -+ break; -+ -+ case ListPopupMenu::mt_Cut: -+ m_scene->setStartedCut(); -+ UMLApp::app()->slotEditCut(); -+ break; -+ -+ case ListPopupMenu::mt_Copy: -+ UMLApp::app()->slotEditCopy(); -+ break; -+ -+ case ListPopupMenu::mt_Paste: -+ UMLApp::app()->slotEditPaste(); -+ break; -+ -+ case ListPopupMenu::mt_Reset_Label_Positions: -+ resetTextPositions(); -+ break; -+ -+ case ListPopupMenu::mt_LayoutDirect: -+ m_associationLine->setLayout(AssociationLine::Direct); -+ break; -+ case ListPopupMenu::mt_LayoutSpline: -+ m_associationLine->setLayout(AssociationLine::Spline); -+ break; -+ case ListPopupMenu::mt_LayoutOrthogonal: -+ m_associationLine->setLayout(AssociationLine::Orthogonal); -+ break; -+ case ListPopupMenu::mt_LayoutPolyline: -+ m_associationLine->setLayout(AssociationLine::Polyline); -+ break; -+ -+ default: -+ DEBUG(DBG_SRC) << "MenuType " << ListPopupMenu::toString(sel) << " not implemented"; -+ break; -+ }//end switch -+} -+ -+/** -+ * Return the first font found being used by any child widget. (They -+ * could be different fonts, so this is a slightly misleading method.) -+ */ -+QFont AssociationWidget::font() const -+{ -+ //:TODO: find a general font for the association -+ QFont font; -+ -+ if (m_role[RoleType::A].roleWidget) -+ font = m_role[RoleType::A].roleWidget->font(); -+ else if (m_role[RoleType::B].roleWidget) -+ font = m_role[RoleType::B].roleWidget->font(); -+ else if (m_role[RoleType::A].multiplicityWidget) -+ font = m_role[RoleType::A].multiplicityWidget->font(); -+ else if (m_role[RoleType::B].multiplicityWidget) -+ font = m_role[RoleType::B].multiplicityWidget->font(); -+ else if (m_role[RoleType::A].changeabilityWidget) -+ font = m_role[RoleType::A].changeabilityWidget->font(); -+ else if (m_role[RoleType::B].changeabilityWidget) -+ font = m_role[RoleType::B].changeabilityWidget->font(); -+ else if (m_nameWidget) -+ font = m_nameWidget->font(); -+ else -+ font = m_role[RoleType::A].umlWidget->font(); -+ -+ return font; -+} -+ -+/** -+ * Set all 'owned' child widgets to this text color. -+ */ -+void AssociationWidget::setTextColor(const QColor &color) -+{ -+ WidgetBase::setTextColor(color); -+ if (m_nameWidget) { -+ m_nameWidget->setTextColor(color); -+ } -+ if (m_role[RoleType::A].roleWidget) { -+ m_role[RoleType::A].roleWidget->setTextColor(color); -+ } -+ if (m_role[RoleType::B].roleWidget) { -+ m_role[RoleType::B].roleWidget->setTextColor(color); -+ } -+ if (m_role[RoleType::A].multiplicityWidget) { -+ m_role[RoleType::A].multiplicityWidget->setTextColor(color); -+ } -+ if (m_role[RoleType::B].multiplicityWidget) { -+ m_role[RoleType::B].multiplicityWidget->setTextColor(color); -+ } -+ if (m_role[RoleType::A].changeabilityWidget) -+ m_role[RoleType::A].changeabilityWidget->setTextColor(color); -+ if (m_role[RoleType::B].changeabilityWidget) -+ m_role[RoleType::B].changeabilityWidget->setTextColor(color); -+} -+ -+bool AssociationWidget::checkAddPoint(const QPointF &scenePos) -+{ -+ if (associationType() == AssociationType::Exception) { -+ return false; -+ } -+ -+ // if there is no point around the mouse pointer, we insert a new one -+ if (m_associationLine->closestPointIndex(scenePos) < 0) { -+ int i = m_associationLine->closestSegmentIndex(scenePos); -+ if (i < 0) { -+ DEBUG(DBG_SRC) << "no closest segment found!"; -+ return false; -+ } -+ m_associationLine->insertPoint(i + 1, scenePos); -+ if (m_nLinePathSegmentIndex == i) { -+ QPointF segStart = m_associationLine->point(i); -+ QPointF segEnd = m_associationLine->point(i + 2); -+ const int midSegX = segStart.x() + (segEnd.x() - segStart.x()) / 2; -+ const int midSegY = segStart.y() + (segEnd.y() - segStart.y()) / 2; -+ /* -+ DEBUG(DBG_SRC) << "segStart=" << segStart << ", segEnd=" << segEnd -+ << ", midSeg=(" << midSegX << "," << midSegY -+ << "), mp=" << mp; -+ */ -+ if (midSegX > scenePos.x() || midSegY < scenePos.y()) { -+ m_nLinePathSegmentIndex++; -+ DEBUG(DBG_SRC) << "setting m_nLinePathSegmentIndex to " -+ << m_nLinePathSegmentIndex; -+ computeAssocClassLine(); -+ } -+ m_associationLine->update(); -+ calculateNameTextSegment(); -+ umlDoc()->setModified(true); -+ setSelected(true); -+ } -+ return true; -+ } -+ else { -+ DEBUG(DBG_SRC) << "found point already close enough!"; -+ return false; -+ } -+} -+ -+/** -+ * Remove point close to the given point and redraw the association. -+ * @param scenePos point which should be removed -+ * @return success status of the remove action -+ */ -+bool AssociationWidget::checkRemovePoint(const QPointF &scenePos) -+{ -+ int i = m_associationLine->closestPointIndex(scenePos); -+ if (i == -1) -+ return false; -+ -+ m_associationLine->setSelected(false); -+ -+ // there was a point so we remove the point -+ m_associationLine->removePoint(i); -+ -+ // Maybe reattach association class connecting line -+ // to different association linepath segment. -+ const int numberOfLines = m_associationLine->count() - 1; -+ if (m_nLinePathSegmentIndex >= numberOfLines) { -+ m_nLinePathSegmentIndex = numberOfLines - 1; -+ } -+ calculateEndingPoints(); -+ -+ // select the line path -+ m_associationLine->setSelected(true); -+ -+ m_associationLine->update(); -+ -+ calculateNameTextSegment(); -+ umlDoc()->setModified(true); -+ return true; -+} -+ -+/** -+ * Moves the break point being dragged. -+ */ -+void AssociationWidget::mouseMoveEvent(QGraphicsSceneMouseEvent* me) -+{ -+ if (me->buttons() != Qt::LeftButton) { -+ return; -+ } -+ -+ setSelected(true); -+ -+ associationLine()->mouseMoveEvent(me); -+ moveEvent(me); -+ m_scene->resizeSceneToItems(); -+} -+ -+/** -+ * Returns the Region the widget to line intersection is for the given -+ * widget in this Association. If the given widget is not in the -+ * Association then Region::Error is returned. -+ * Used by @ref calculateEndingPoints to work these positions out for -+ * another Association - since the number of Associations on the same -+ * region for the same widget will mean the lines will need to be -+ * spread out across the region. -+ */ -+//Uml::Region::Enum AssociationWidget::getWidgetRegion(AssociationWidget * widget) const -+//{ -+// if (widget->widgetForRole(RoleType::A) == m_role[RoleType::A].umlWidget) -+// return m_role[RoleType::A].m_WidgetRegion; -+// if (widget->widgetForRole(RoleType::B) == m_role[RoleType::B].umlWidget) -+// return m_role[RoleType::B].m_WidgetRegion; -+// return Uml::Region::Error; -+//} -+ -+/** -+ * Returns the number of lines there are on the given region for -+ * either widget A or B of the association. -+ */ -+int AssociationWidget::getRegionCount(Uml::Region::Enum region, Uml::RoleType::Enum role) -+{ -+ if ((region == Uml::Region::Error) | (umlScene() == NULL)) { -+ return 0; -+ } -+ int widgetCount = 0; -+ AssociationWidgetList list = m_scene->associationList(); -+ foreach (AssociationWidget* assocwidget, list) { -+ //don't count this association -+ if (assocwidget == this) -+ continue; -+ const WidgetRole& otherA = assocwidget->m_role[RoleType::A]; -+ const WidgetRole& otherB = assocwidget->m_role[RoleType::B]; -+ const UMLWidget *a = otherA.umlWidget; -+ const UMLWidget *b = otherB.umlWidget; -+ /* -+ //don't count associations to self if both of their end points are on the same region -+ //they are different and placement won't interfere with them -+ if (a == b && otherA.m_WidgetRegion == otherB.m_WidgetRegion) -+ continue; -+ */ -+ if (m_role[role].umlWidget == a && region == otherA.m_WidgetRegion) -+ widgetCount++; -+ else if (m_role[role].umlWidget == b && region == otherB.m_WidgetRegion) -+ widgetCount++; -+ }//end foreach -+ return widgetCount; -+} -+ -+/** -+ * Find the border point of the given rect when a line is drawn from the -+ * given point to the rect. -+ * @param rect rect of a classifier -+ * @param line a line to the rect -+ * @param intersectionPoint the intercept point on the border of the rect -+ * @return the type of the intersection @ref QLineF::IntersectType -+ */ -+QLineF::IntersectType AssociationWidget::intersect(const QRectF &rect, const QLineF &line, -+ QPointF* intersectionPoint) -+{ -+ QList lines; -+ lines << QLineF(rect.topLeft(), rect.topRight()); -+ lines << QLineF(rect.topRight(), rect.bottomRight()); -+ lines << QLineF(rect.bottomRight(), rect.bottomLeft()); -+ lines << QLineF(rect.bottomLeft(), rect.topLeft()); -+ foreach (const QLineF& rectLine, lines) { -+ QLineF::IntersectType type = rectLine.intersect(line, intersectionPoint); -+ if (type == QLineF::BoundedIntersection) { -+ return type; -+ } -+ } -+ return QLineF::NoIntersection; -+} -+ -+/** -+ * Given a rectangle and a point, findInterceptOnEdge computes the -+ * connecting line between the middle point of the rectangle and -+ * the point, and returns the intercept of this line with the -+ * the edge of the rectangle identified by `region'. -+ * When the region is North or South, the X value is returned (Y is -+ * constant.) -+ * When the region is East or West, the Y value is returned (X is -+ * constant.) -+ * @todo This is buggy. Try replacing by intersect() -+ */ -+qreal AssociationWidget::findInterceptOnEdge(const QRectF &rect, -+ Uml::Region::Enum region, -+ const QPointF &point) -+{ -+ // The Qt coordinate system has (0, 0) in the top left corner. -+ // In order to go to the regular XY coordinate system with (0, 0) -+ // in the bottom left corner, we swap the X and Y axis. -+ // That's why the following assignments look twisted. -+ const qreal rectHalfWidth = rect.height() / 2.0; -+ const qreal rectHalfHeight = rect.width() / 2.0; -+ const qreal rectMidX = rect.y() + rectHalfWidth; -+ const qreal rectMidY = rect.x() + rectHalfHeight; -+ const qreal dX = rectMidX - point.y(); -+ const qreal dY = rectMidY - point.x(); -+ switch (region) { -+ case Uml::Region::West: -+ region = Uml::Region::South; -+ break; -+ case Uml::Region::North: -+ region = Uml::Region::West; -+ break; -+ case Uml::Region::East: -+ region = Uml::Region::North; -+ break; -+ case Uml::Region::South: -+ region = Uml::Region::East; -+ break; -+ default: -+ break; -+ } -+ // Now we have regular coordinates with the point (0, 0) in the -+ // bottom left corner. -+ if (region == Uml::Region::North || region == Uml::Region::South) { -+ if (dX == 0) -+ return rectMidY; -+ // should be rectMidX, but we go back to Qt coord.sys. -+ if (dY == 0) { -+ uError() << "usage error: " << "North/South (dY == 0)"; -+ return -1.0; -+ } -+ const qreal m = dY / dX; -+ qreal relativeX; -+ if (region == Uml::Region::North) -+ relativeX = rectHalfHeight / m; -+ else -+ relativeX = -rectHalfHeight / m; -+ return (rectMidY + relativeX); -+ // should be rectMidX, but we go back to Qt coord.sys. -+ } else { -+ if (dY == 0) -+ return rectMidX; -+ // should be rectMidY, but we go back to Qt coord.sys. -+ if (dX == 0) { -+ uError() << "usage error: " << "East/West (dX == 0)"; -+ return -1.0; -+ } -+ const qreal m = dY / dX; -+ qreal relativeY = m * rectHalfWidth; -+ if (region == Uml::Region::West) -+ relativeY = -relativeY; -+ return (rectMidX + relativeY); -+ // should be rectMidY, but we go back to Qt coord.sys. -+ } -+} -+ -+/** -+ * Auxiliary method for updateAssociations(): -+ * Put position into m_positions and assoc into m_ordered at the -+ * correct index. -+ * m_positions and m_ordered move in parallel and are sorted by -+ * ascending position. -+ */ -+void AssociationWidget::insertIntoLists(qreal position, const AssociationWidget* assoc) -+{ -+ bool did_insertion = false; -+ for (int index = 0; index < m_positions_len; ++index) { -+ if (position < m_positions[index]) { -+ for (int moveback = m_positions_len; moveback > index; moveback--) -+ m_positions[moveback] = m_positions[moveback - 1]; -+ m_positions[index] = position; -+ m_ordered.insert(index, const_cast(assoc)); -+ did_insertion = true; -+ break; -+ } -+ } -+ if (! did_insertion) { -+ m_positions[m_positions_len] = position; -+ m_ordered.append(const_cast(assoc)); -+ } -+ m_positions_len++; -+} -+ -+/** -+ * Tells all the other view associations the new count for the -+ * given widget on a certain region. And also what index they should be. -+ */ -+void AssociationWidget::updateAssociations(int totalCount, -+ Uml::Region::Enum region, -+ Uml::RoleType::Enum role) -+{ -+ if ((region == Uml::Region::Error) | (umlScene() == NULL)) { -+ return; -+ } -+ AssociationWidgetList list = m_scene->associationList(); -+ -+ UMLWidget *ownWidget = m_role[role].umlWidget; -+ m_positions_len = 0; -+ m_ordered.clear(); -+ // we order the AssociationWidget list by region and x/y value -+ foreach (AssociationWidget* assocwidget, list) { -+ WidgetRole *roleA = &assocwidget->m_role[RoleType::A]; -+ WidgetRole *roleB = &assocwidget->m_role[RoleType::B]; -+ UMLWidget *wA = roleA->umlWidget; -+ UMLWidget *wB = roleB->umlWidget; -+ // Skip self associations. -+ if (wA == wB) -+ continue; -+ // Now we must find out with which end the assocwidget connects -+ // to the input widget (ownWidget). -+ bool inWidgetARegion = (ownWidget == wA && -+ region == roleA->m_WidgetRegion); -+ bool inWidgetBRegion = (ownWidget == wB && -+ region == roleB->m_WidgetRegion); -+ if (!inWidgetARegion && !inWidgetBRegion) -+ continue; -+ // Determine intercept position on the edge indicated by `region'. -+ UMLWidget * otherWidget = (inWidgetARegion ? wB : wA); -+ AssociationLine *linepath = assocwidget->associationLine(); -+ QPointF refpoint; -+ if (assocwidget->linePathStartsAt(otherWidget)) -+ refpoint = linepath->point(linepath->count() - 2); -+ else -+ refpoint = linepath->point(1); -+ // The point is authoritative if we're called for the second time -+ // (i.e. role==B) or it is a waypoint on the line path. -+ bool pointIsAuthoritative = (role == RoleType::B || linepath->count() > 2); -+ if (! pointIsAuthoritative) { -+ // If the point is not authoritative then we use the other -+ // widget's center. -+ refpoint.setX(otherWidget->x() + otherWidget->width() / 2); -+ refpoint.setY(otherWidget->y() + otherWidget->height() / 2); -+ } -+ qreal intercept = findInterceptOnEdge(ownWidget->rect(), region, refpoint); -+ if (intercept < 0) { -+ DEBUG(DBG_SRC) << "error from findInterceptOnEdge for" -+ << " assocType=" << assocwidget->associationType() -+ << " ownWidget=" << ownWidget->name() -+ << " otherWidget=" << otherWidget->name(); -+ continue; -+ } -+ insertIntoLists(intercept, assocwidget); -+ } // while ((assocwidget = assoc_it.current())) -+ -+ // we now have an ordered list and we only have to call updateRegionLineCount -+ int index = 1; -+ foreach (AssociationWidget* assocwidget, m_ordered ) { -+ if (ownWidget == assocwidget->widgetForRole(RoleType::A)) { -+ assocwidget->updateRegionLineCount(index++, totalCount, region, RoleType::A); -+ } else if (ownWidget == assocwidget->widgetForRole(RoleType::B)) { -+ assocwidget->updateRegionLineCount(index++, totalCount, region, RoleType::B); -+ } -+ } // for (assocwidget = ordered.first(); ...) -+} -+ -+/** -+ * Called to tell the association that another association has added -+ * a line to the region of one of its widgets. The widget is identified -+ * by its role (A or B). -+ * -+ * Called by @ref updateAssociations which is called by -+ * @ref calculateEndingPoints when required. -+ */ -+void AssociationWidget::updateRegionLineCount(int index, int totalCount, -+ Uml::Region::Enum region, -+ Uml::RoleType::Enum role) -+{ -+ if ((region == Uml::Region::Error) | (umlScene() == NULL)) { -+ return; -+ } -+ // If the association is to self and the line ends are on the same region then -+ // use a different calculation. -+ if (isSelf() && -+ m_role[RoleType::A].m_WidgetRegion == m_role[RoleType::B].m_WidgetRegion) { -+ UMLWidget * pWidget = m_role[RoleType::A].umlWidget; -+ qreal x = pWidget->x(); -+ qreal y = pWidget->y(); -+ qreal wh = pWidget->height(); -+ qreal ww = pWidget->width(); -+ int size = m_associationLine->count(); -+ // See if above widget ok to place assoc. -+ switch( m_role[RoleType::A].m_WidgetRegion ) { -+ case Uml::Region::North: -+ m_associationLine->setPoint( 0, QPointF( x + ( ww / 4 ), y ) ); -+ m_associationLine->setPoint( size - 1, QPointF(x + ( ww * 3 / 4 ), y ) ); -+ break; -+ -+ case Uml::Region::South: -+ m_associationLine->setPoint( 0, QPointF( x + ( ww / 4 ), y + wh ) ); -+ m_associationLine->setPoint( size - 1, QPointF( x + ( ww * 3 / 4 ), y + wh ) ); -+ break; -+ -+ case Uml::Region::East: -+ m_associationLine->setPoint( 0, QPointF( x + ww, y + ( wh / 4 ) ) ); -+ m_associationLine->setPoint( size - 1, QPointF( x + ww, y + ( wh * 3 / 4 ) ) ); -+ break; -+ -+ case Uml::Region::West: -+ m_associationLine->setPoint( 0, QPointF( x, y + ( wh / 4 ) ) ); -+ m_associationLine->setPoint( size - 1, QPointF( x, y + ( wh * 3 / 4 ) ) ); -+ break; -+ default: -+ break; -+ }//end switch -+ -+ return; -+ } -+ -+ WidgetRole& robj = m_role[role]; -+ UMLWidget * pWidget = robj.umlWidget; -+ -+ robj.m_nIndex = index; -+ robj.m_nTotalCount = totalCount; -+ qreal x = pWidget->x(); -+ qreal y = pWidget->y(); -+ qreal ww = pWidget->width(); -+ qreal wh = pWidget->height(); -+ const bool angular = Settings::optionState().generalState.angularlines; -+ qreal ch = 0; -+ qreal cw = 0; -+ if (angular) { -+ uint nind = (role == RoleType::A ? 1 : m_associationLine->count() - 2); -+ QPointF neighbour = m_associationLine->point(nind); -+ if (neighbour.x() < x) -+ cw = 0; -+ else if (neighbour.x() > x + ww) -+ cw = 0 + ww; -+ else -+ cw = neighbour.x() - x; -+ if (neighbour.y() < y) -+ ch = 0; -+ else if (neighbour.y() > y + wh) -+ ch = 0 + wh; -+ else -+ ch = neighbour.y() - y; -+ } else { -+ ch = wh * index / totalCount; -+ cw = ww * index / totalCount; -+ } -+ -+ qreal newX = x + cw; -+ qreal newY = y + ch; -+ -+ QPointF pt; -+ if (angular) { -+ pt = QPointF(newX, newY); -+ } else { -+ UMLWidget *pWidgetA = m_role[RoleType::A].umlWidget; -+ UMLWidget *pWidgetB = m_role[RoleType::B].umlWidget; -+ QList polyListA = pWidgetA->shape().toSubpathPolygons(); -+ QPolygonF polyA = polyListA.at(0); -+ if (polyListA.size() > 1) { -+ for (int i = 1; i < polyListA.size(); i++) { -+ polyA = polyA.united(polyListA.at(i)); -+ } -+ } -+ polyA = polyA.translated(pWidgetA->pos()); -+ QList polyListB = pWidgetB->shape().toSubpathPolygons(); -+ QPolygonF polyB = polyListB.at(0); -+ if (polyListB.size() > 1) { -+ for (int i = 1; i < polyListB.size(); i++) { -+ polyB = polyB.united(polyListB.at(i)); -+ } -+ } -+ polyB = polyB.translated(pWidgetB->pos()); -+ QLineF nearestPoints = Widget_Utils::closestPoints(polyA, polyB); -+ if (nearestPoints.isNull()) { -+ uError() << "Widget_Utils::closestPoints failed, falling back to simple widget positions"; -+ switch(region) { -+ case Uml::Region::West: -+ pt.setX(x); -+ pt.setY(newY); -+ break; -+ case Uml::Region::North: -+ pt.setX(newX); -+ pt.setY(y); -+ break; -+ case Uml::Region::East: -+ pt.setX(x + ww); -+ pt.setY(newY); -+ break; -+ case Uml::Region::South: -+ pt.setX(newX); -+ pt.setY(y + wh); -+ break; -+ case Uml::Region::Center: -+ pt.setX(x + ww / 2); -+ pt.setY(y + wh / 2); -+ break; -+ default: -+ break; -+ } -+ } else { -+ if (role == RoleType::A) -+ pt = nearestPoints.p1(); -+ else -+ pt = nearestPoints.p2(); -+ } -+ } -+ if (role == RoleType::A) { -+ m_associationLine->setPoint(0, pt); -+ } -+ else { -+ m_associationLine->setPoint(m_associationLine->count() - 1, pt); -+ } -+} -+ -+/** -+ * Sets the state of whether the widget is selected. -+ * -+ * @param _select The state of whether the widget is selected. -+ */ -+void AssociationWidget::setSelected(bool _select /* = true */) -+{ -+ WidgetBase::setSelected(_select); -+ if ( m_nameWidget) -+ m_nameWidget->setSelected( _select ); -+ if ( m_role[RoleType::A].roleWidget ) -+ m_role[RoleType::A].roleWidget->setSelected( _select ); -+ if ( m_role[RoleType::B].roleWidget ) -+ m_role[RoleType::B].roleWidget->setSelected( _select ); -+ if ( m_role[RoleType::A].multiplicityWidget ) -+ m_role[RoleType::A].multiplicityWidget->setSelected( _select ); -+ if ( m_role[RoleType::B].multiplicityWidget ) -+ m_role[RoleType::B].multiplicityWidget->setSelected( _select ); -+ if ( m_role[RoleType::A].changeabilityWidget) -+ m_role[RoleType::A].changeabilityWidget->setSelected( _select ); -+ if ( m_role[RoleType::B].changeabilityWidget) -+ m_role[RoleType::B].changeabilityWidget->setSelected( _select ); -+ -+ // Update the docwindow for this association. -+ // This is done last because each of the above setSelected calls -+ // overwrites the docwindow, but we want the main association doc -+ // to win. -+ if (_select) { -+ if (m_scene->selectedCount() == 0) -+ UMLApp::app()->docWindow()->showDocumentation(this, false); -+ } else -+ UMLApp::app()->docWindow()->updateDocumentation(true); -+ -+ m_associationLine->setSelected(_select); -+ if (! _select) { -+ // For now, if _select is true we don't make the assoc class line -+ // selected. But that's certainly open for discussion. -+ // At any rate, we need to deselect the assoc class line -+ // if _select is false. -+ selectAssocClassLine(false); -+ } -+ UMLApp::app()->document()->writeToStatusBar(_select ? i18n("Press Ctrl with left mouse click to delete a point") : QString()); -+} -+ -+/** -+ * Reimplement method from WidgetBase in order to check owned floating texts. -+ * -+ * @param p Point to be checked. -+ * -+ * @return m_nameWidget if m_nameWidget is non NULL and m_nameWidget->onWidget(p) returns non NULL; -+ * m_role[0].(multiplicity|changeability|role)Widget if the resp. widget is non NULL and -+ * its onWidget(p) returns non NULL; -+ * m_role[1].(multiplicity|changeability|role)Widget if the resp. widget is non NULL and -+ * its onWidget(p) returns non NULL; -+ * else NULL. -+ */ -+UMLWidget* AssociationWidget::onWidget(const QPointF &p) -+{ -+ if (m_nameWidget && m_nameWidget->onWidget(p)) { -+ return m_nameWidget; -+ } -+ for (int i = 0; i <= 1; i++) { -+ const WidgetRole& r = m_role[i]; -+ if (r.multiplicityWidget && r.multiplicityWidget->onWidget(p)) -+ return r.multiplicityWidget; -+ if (r.changeabilityWidget && r.changeabilityWidget->onWidget(p)) -+ return r.changeabilityWidget; -+ if (r.roleWidget && r.roleWidget->onWidget(p)) -+ return r.roleWidget; -+ } -+ return NULL; -+} -+ -+/** -+ * Returns true if the given point is on the connecting line to -+ * the association class. Returns false if there is no association -+ * class attached, or if the given point is not on the connecting -+ * line. -+ */ -+bool AssociationWidget::onAssocClassLine(const QPointF &point) -+{ -+ bool onLine = false; -+ if (m_pAssocClassLine) { -+//:TODO: -+// const QPointF mapped = m_pAssocClassLine->mapFromParent(point); -+// bool onLine = m_pAssocClassLine->contains(mapped); -+// return onLine; -+ UMLSceneItemList list = m_scene->collisions(point); -+ UMLSceneItemList::iterator end(list.end()); -+ for (UMLSceneItemList::iterator item_it(list.begin()); item_it != end; ++item_it) { -+ if (*item_it == m_pAssocClassLine) { -+ onLine = true; -+ break; -+ } -+ } -+ } -+ DEBUG(DBG_SRC) << onLine; -+ return onLine; -+} -+ -+/** -+ * Returns true if the given point is on the association line. -+ * A circle (rectangle) around the point is used to obtain more tolerance. -+ * @param point the point to check -+ * @return flag whether point is on association line -+ */ -+bool AssociationWidget::onAssociation(const QPointF& point) -+{ -+ // check the path -+ const qreal diameter(4.0); -+ QPainterPath path = m_associationLine->shape(); -+ if (path.contains(point)) { -+ DEBUG(DBG_SRC) << "on path"; -+ return true; -+ } -+ // check also the points -+ if (m_associationLine->layout() == AssociationLine::Spline) { -+ if (m_associationLine->closestPointIndex(point, diameter) > -1) { -+ DEBUG(DBG_SRC) << "on spline point"; -+ return true; -+ } -+ } -+ return onAssocClassLine(point); -+} -+ -+/** -+ * Set all association points to x coordinate. -+ */ -+void AssociationWidget::setXEntireAssoc(qreal x) -+{ -+ for (int i = 0; i < m_associationLine->count(); ++i) { -+ QPointF p = m_associationLine->point(i); -+ p.setX(x); -+ m_associationLine->setPoint(i, p); -+ } -+} -+ -+/** -+ * Set all association points to y coordinate. -+ */ -+void AssociationWidget::setYEntireAssoc(qreal y) -+{ -+ for (int i = 0; i < m_associationLine->count(); ++i) { -+ QPointF p = m_associationLine->point(i); -+ p.setY(y); -+ m_associationLine->setPoint(i, p); -+ } -+} -+ -+/** -+ * Moves all the mid points (all expcept start /end) by the given amount. -+ */ -+void AssociationWidget::moveMidPointsBy(qreal x, qreal y) -+{ -+ int pos = m_associationLine->count() - 1; -+ for (int i = 1; i < (int)pos; ++i) { -+ QPointF p = m_associationLine->point( i ); -+ qreal newX = p.x() + x; -+ qreal newY = p.y() + y; -+ p.setX( newX ); -+ p.setY( newY ); -+ m_associationLine->setPoint( i, p ); -+ } -+} -+ -+/** -+ * Moves the entire association by the given offset. -+ */ -+void AssociationWidget::moveEntireAssoc(qreal x, qreal y) -+{ -+ //TODO: ADD SUPPORT FOR ASSOC. ON SEQ. DIAGRAMS WHEN NOTES BACK IN. -+ moveMidPointsBy(x, y); -+ calculateEndingPoints(); -+ calculateNameTextSegment(); -+ resetTextPositions(); -+} -+ -+/** -+ * Returns the bounding rectangle of all segments of the association. -+ */ -+QRectF AssociationWidget::boundingRect() const -+{ -+ return m_associationLine->boundingRect(); -+} -+ -+/** -+ * Returns the shape of all segments of the association. -+ */ -+QPainterPath AssociationWidget::shape() const -+{ -+ return m_associationLine->shape(); -+} -+ -+/** -+ * Connected to UMLClassifier::attributeRemoved() or UMLEntity::constraintRemoved() -+ * in case this AssociationWidget is linked to a clasifier list item -+ * (an attribute or a foreign key constraint) -+ * -+ * @param obj The UMLClassifierListItem removed. -+ */ -+void AssociationWidget::slotClassifierListItemRemoved(UMLClassifierListItem* obj) -+{ -+ if (obj != m_umlObject) { -+ DEBUG(DBG_SRC) << "obj=" << obj << ": m_umlObject=" << m_umlObject; -+ return; -+ } -+ m_umlObject = 0; -+ m_scene->removeAssoc(this); -+} -+ -+/** -+ * Connected to UMLObject::modified() in case this -+ * AssociationWidget is linked to a classifer's attribute type. -+ */ -+void AssociationWidget::slotAttributeChanged() -+{ -+ UMLAttribute *attr = attribute(); -+ if (attr == NULL) { -+ uError() << "attribute() returns NULL"; -+ return; -+ } -+ setVisibility(attr->visibility(), RoleType::B); -+ setRoleName(attr->name(), RoleType::B); -+} -+ -+void AssociationWidget::clipSize() -+{ -+ if (m_nameWidget) -+ m_nameWidget->clipSize(); -+ -+ if (m_role[RoleType::A].multiplicityWidget) -+ m_role[RoleType::A].multiplicityWidget->clipSize(); -+ -+ if (m_role[RoleType::B].multiplicityWidget) -+ m_role[RoleType::B].multiplicityWidget->clipSize(); -+ -+ if (m_role[RoleType::A].roleWidget) -+ m_role[RoleType::A].roleWidget->clipSize(); -+ -+ if (m_role[RoleType::B].roleWidget) -+ m_role[RoleType::B].roleWidget->clipSize(); -+ -+ if (m_role[RoleType::A].changeabilityWidget) -+ m_role[RoleType::A].changeabilityWidget->clipSize(); -+ -+ if (m_role[RoleType::B].changeabilityWidget) -+ m_role[RoleType::B].changeabilityWidget->clipSize(); -+ -+ if (m_associationClass) -+ m_associationClass->clipSize(); -+} -+ -+/** -+ * Event handler for context menu events, called from the line segments. -+ */ -+void AssociationWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) -+{ -+ const Uml::AssociationType::Enum type = associationType(); -+ ListPopupMenu::MenuType menuType = ListPopupMenu::mt_Association_Selected; -+ if ((type == Uml::AssociationType::Anchor) || -+ onAssocClassLine(event->scenePos())) { -+ menuType = ListPopupMenu::mt_Anchor; -+ } else if (isCollaboration()) { -+ menuType = ListPopupMenu::mt_Collaboration_Message; -+ } else if (!association()) { -+ menuType = ListPopupMenu::mt_AttributeAssociation; -+ } else if (AssocRules::allowRole(type)) { -+ menuType = ListPopupMenu::mt_FullAssociation; -+ } -+ -+ event->accept(); -+ DEBUG(DBG_SRC) << "menue type = " << ListPopupMenu::toString(menuType) -+ << " / association = " << Uml::AssociationType::toString(type); -+ -+ UMLScene *scene = umlScene(); -+ QWidget *parent = 0; -+ if (scene) { -+ parent = scene->activeView(); -+ } -+ -+ if (!isSelected() && scene && !scene->selectedItems().isEmpty()) { -+ Qt::KeyboardModifiers forSelection = (Qt::ControlModifier | Qt::ShiftModifier); -+ if ((event->modifiers() & forSelection) == 0) { -+ scene->clearSelection(); -+ } -+ } -+ setSelected(true); -+ m_eventScenePos = event->scenePos(); -+ ListPopupMenu popup(parent, menuType, this); -+ QAction *triggered = popup.exec(event->screenPos()); -+ ListPopupMenu *parentMenu = ListPopupMenu::menuFromAction(triggered); -+ -+ if (!parentMenu) { -+ uWarning() << "Action's data field does not contain ListPopupMenu pointer"; -+ return; -+ } -+ -+ WidgetBase *ownerWidget = parentMenu->ownerWidget(); -+ // assert because logic is based on only WidgetBase being the owner of -+ // ListPopupMenu actions executed in this context menu. -+ Q_ASSERT_X(ownerWidget != 0, "AssociationWidget::contextMenuEvent", -+ "ownerWidget is null which means action belonging to UMLView, UMLScene" -+ " or UMLObject is the one triggered in ListPopupMenu"); -+ -+ ownerWidget->slotMenuSelection(triggered); -+} -+ -+/** -+ * Reimplemented event handler for hover enter events. -+ */ -+void AssociationWidget::hoverEnterEvent(QGraphicsSceneHoverEvent *event) -+{ -+ associationLine()->hoverEnterEvent(event); -+} -+ -+/** -+ * Reimplemented event handler for hover leave events. -+ */ -+void AssociationWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) -+{ -+ associationLine()->hoverLeaveEvent(event); -+} -+ -+/** -+ * Reimplemented event handler for hover move events. -+ */ -+void AssociationWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event) -+{ -+ associationLine()->hoverMoveEvent(event); -+} -+ -+/** -+ * Saves this widget to the "assocwidget" XMI element. -+ */ -+void AssociationWidget::saveToXMI(QDomDocument &qDoc, QDomElement &qElement) -+{ -+ QDomElement assocElement = qDoc.createElement(QLatin1String("assocwidget")); -+ -+ WidgetBase::saveToXMI(qDoc, assocElement); -+ LinkWidget::saveToXMI(qDoc, assocElement); -+ if (m_umlObject) { -+ assocElement.setAttribute(QLatin1String("xmi.id"), Uml::ID::toString(m_umlObject->id())); -+ } -+ assocElement.setAttribute(QLatin1String("type"), associationType()); -+ if (!association()) { -+ assocElement.setAttribute(QLatin1String("visibilityA"), visibility(RoleType::A)); -+ assocElement.setAttribute(QLatin1String("visibilityB"), visibility(RoleType::B)); -+ assocElement.setAttribute(QLatin1String("changeabilityA"), changeability(RoleType::A)); -+ assocElement.setAttribute(QLatin1String("changeabilityB"), changeability(RoleType::B)); -+ if (m_umlObject == NULL) { -+ assocElement.setAttribute(QLatin1String("roleAdoc"), roleDocumentation(RoleType::A)); -+ assocElement.setAttribute(QLatin1String("roleBdoc"), roleDocumentation(RoleType::B)); -+ assocElement.setAttribute(QLatin1String("documentation"), documentation()); -+ } -+ } -+ assocElement.setAttribute(QLatin1String("widgetaid"), Uml::ID::toString(widgetIDForRole(RoleType::A))); -+ assocElement.setAttribute(QLatin1String("widgetbid"), Uml::ID::toString(widgetIDForRole(RoleType::B))); -+ assocElement.setAttribute(QLatin1String("indexa"), m_role[RoleType::A].m_nIndex); -+ assocElement.setAttribute(QLatin1String("indexb"), m_role[RoleType::B].m_nIndex); -+ assocElement.setAttribute(QLatin1String("totalcounta"), m_role[RoleType::A].m_nTotalCount); -+ assocElement.setAttribute(QLatin1String("totalcountb"), m_role[RoleType::B].m_nTotalCount); -+ m_associationLine->saveToXMI(qDoc, assocElement); -+ -+ if (m_nameWidget) { -+ m_nameWidget->saveToXMI(qDoc, assocElement); -+ } -+ -+ if (multiplicityWidget(RoleType::A)) { -+ multiplicityWidget(RoleType::A)->saveToXMI(qDoc, assocElement); -+ } -+ -+ if (multiplicityWidget(RoleType::B)) { -+ multiplicityWidget(RoleType::B)->saveToXMI(qDoc, assocElement); -+ } -+ -+ if (roleWidget(RoleType::A)) { -+ roleWidget(RoleType::A)->saveToXMI(qDoc, assocElement); -+ } -+ -+ if (roleWidget(RoleType::B)) { -+ roleWidget(RoleType::B)->saveToXMI(qDoc, assocElement); -+ } -+ -+ if (changeabilityWidget(RoleType::A)) { -+ changeabilityWidget(RoleType::A)->saveToXMI(qDoc, assocElement); -+ } -+ -+ if (changeabilityWidget(RoleType::B)) { -+ changeabilityWidget(RoleType::B)->saveToXMI(qDoc, assocElement); -+ } -+ -+ if (m_associationClass) { -+ QString acid = Uml::ID::toString(m_associationClass->id()); -+ assocElement.setAttribute(QLatin1String("assocclass"), acid); -+ assocElement.setAttribute(QLatin1String("aclsegindex"), m_nLinePathSegmentIndex); -+ } -+ -+ qElement.appendChild(assocElement); -+} -+ -+/** -+ * Uses the supplied widgetList for resolving -+ * the role A and role B widgets. (The other loadFromXMI() queries -+ * the UMLView for these widgets.) -+ * Required for clipboard operations. -+ */ -+bool AssociationWidget::loadFromXMI(QDomElement& qElement, -+ const UMLWidgetList& widgets, -+ const MessageWidgetList* messages) -+{ -+ if (!WidgetBase::loadFromXMI(qElement)) { -+ return false; -+ } -+ -+ if (!LinkWidget::loadFromXMI(qElement)) { -+ return false; -+ } -+ -+ // load child widgets first -+ QString widgetaid = qElement.attribute(QLatin1String("widgetaid"), QLatin1String("-1")); -+ QString widgetbid = qElement.attribute(QLatin1String("widgetbid"), QLatin1String("-1")); -+ Uml::ID::Type aId = Uml::ID::fromString(widgetaid); -+ Uml::ID::Type bId = Uml::ID::fromString(widgetbid); -+ UMLWidget *pWidgetA = Widget_Utils::findWidget(aId, widgets, messages); -+ if (!pWidgetA) { -+ uError() << "cannot find widget for roleA id " << Uml::ID::toString(aId); -+ return false; -+ } -+ UMLWidget *pWidgetB = Widget_Utils::findWidget(bId, widgets, messages); -+ if (!pWidgetB) { -+ uError() << "cannot find widget for roleB id " << Uml::ID::toString(bId); -+ return false; -+ } -+ setWidgetForRole(pWidgetA, RoleType::A); -+ setWidgetForRole(pWidgetB, RoleType::B); -+ -+ QString type = qElement.attribute(QLatin1String("type"), QLatin1String("-1")); -+ Uml::AssociationType::Enum aType = Uml::AssociationType::fromInt(type.toInt()); -+ -+ QString id = qElement.attribute(QLatin1String("xmi.id"), QLatin1String("-1")); -+ bool oldStyleLoad = false; -+ if (id == QLatin1String("-1")) { -+ // xmi.id not present, ergo either a pure widget association, -+ // or old (pre-1.2) style: -+ // Everything is loaded from the AssociationWidget. -+ // UMLAssociation may or may not be saved - if it is, it's a dummy. -+ // Create the UMLAssociation if both roles are UML objects; -+ // else load the info locally. -+ -+ if (Uml::AssociationType::hasUMLRepresentation(aType)) { -+ // lack of an association in our widget AND presence of -+ // both uml objects for each role clearly identifies this -+ // as reading in an old-school file. Note it as such, and -+ // create, and add, the UMLAssociation for this widget. -+ // Remove this special code when backwards compatibility -+ // with older files isn't important anymore. -b.t. -+ UMLObject* umlRoleA = pWidgetA->umlObject(); -+ UMLObject* umlRoleB = pWidgetB->umlObject(); -+ if (!m_umlObject && umlRoleA && umlRoleB) { -+ oldStyleLoad = true; // flag for further special config below -+ if (aType == AssociationType::Aggregation || aType == AssociationType::Composition) { -+ uWarning()<<" Old Style save file? swapping roles on association widget"<umlObject(); -+ umlRoleB = pWidgetB->umlObject(); -+ } -+ -+ setUMLAssociation(umlDoc()->createUMLAssociation(umlRoleA, umlRoleB, aType)); -+ } -+ } -+ -+ setDocumentation(qElement.attribute(QLatin1String("documentation"))); -+ setRoleDocumentation(qElement.attribute(QLatin1String("roleAdoc")), RoleType::A); -+ setRoleDocumentation(qElement.attribute(QLatin1String("roleBdoc")), RoleType::B); -+ -+ // visibility defaults to Public if it cant set it here.. -+ QString visibilityA = qElement.attribute(QLatin1String("visibilityA"), QLatin1String("0")); -+ int vis = visibilityA.toInt(); -+ if (vis >= 200) { // bkwd compat. -+ vis -= 200; -+ } -+ setVisibility((Uml::Visibility::Enum)vis, RoleType::A); -+ -+ QString visibilityB = qElement.attribute(QLatin1String("visibilityB"), QLatin1String("0")); -+ vis = visibilityB.toInt(); -+ if (vis >= 200) { // bkwd compat. -+ vis -= 200; -+ } -+ setVisibility((Uml::Visibility::Enum)vis, RoleType::B); -+ -+ // Changeability defaults to "Changeable" if it cant set it here.. -+ QString changeabilityA = qElement.attribute(QLatin1String("changeabilityA"), QLatin1String("0")); -+ if (changeabilityA.toInt() > 0) -+ setChangeability(Uml::Changeability::fromInt(changeabilityA.toInt()), RoleType::A); -+ -+ QString changeabilityB = qElement.attribute(QLatin1String("changeabilityB"), QLatin1String("0")); -+ if (changeabilityB.toInt() > 0) -+ setChangeability(Uml::Changeability::fromInt(changeabilityB.toInt()), RoleType::B); -+ -+ } else { -+ -+ // we should disconnect any prior association (can this happen??) -+ if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) { -+ UMLAssociation *umla = association(); -+ umla->disconnect(this); -+ umla->nrof_parent_widgets--; -+ } -+ -+ // New style: The xmi.id is a reference to the UMLAssociation. -+ // If the UMLObject is not found right now, we try again later -+ // during the type resolution pass - see activate(). -+ m_nId = Uml::ID::fromString(id); -+ UMLObject *myObj = umlDoc()->findObjectById(m_nId); -+ if (myObj) { -+ const UMLObject::ObjectType ot = myObj->baseType(); -+ if (ot != UMLObject::ot_Association) { -+ setUMLObject(myObj); -+ } else { -+ UMLAssociation * myAssoc = static_cast(myObj); -+ setUMLAssociation(myAssoc); -+ if (type == QLatin1String("-1")) -+ aType = myAssoc->getAssocType(); -+ } -+ } -+ } -+ -+ setAssociationType(aType); -+ -+ QString indexa = qElement.attribute(QLatin1String("indexa"), QLatin1String("0")); -+ QString indexb = qElement.attribute(QLatin1String("indexb"), QLatin1String("0")); -+ QString totalcounta = qElement.attribute(QLatin1String("totalcounta"), QLatin1String("0")); -+ QString totalcountb = qElement.attribute(QLatin1String("totalcountb"), QLatin1String("0")); -+ m_role[RoleType::A].m_nIndex = indexa.toInt(); -+ m_role[RoleType::B].m_nIndex = indexb.toInt(); -+ m_role[RoleType::A].m_nTotalCount = totalcounta.toInt(); -+ m_role[RoleType::B].m_nTotalCount = totalcountb.toInt(); -+ -+ QString assocclassid = qElement.attribute(QLatin1String("assocclass")); -+ if (! assocclassid.isEmpty()) { -+ Uml::ID::Type acid = Uml::ID::fromString(assocclassid); -+ UMLWidget *w = Widget_Utils::findWidget(acid, widgets); -+ if (w) { -+ ClassifierWidget* aclWidget = static_cast(w); -+ QString aclSegIndex = qElement.attribute(QLatin1String("aclsegindex"), QLatin1String("0")); -+ createAssocClassLine(aclWidget, aclSegIndex.toInt()); -+ } else { -+ uError() << "cannot find assocclass " << assocclassid; -+ } -+ } -+ -+ //now load child elements -+ QDomNode node = qElement.firstChild(); -+ QDomElement element = node.toElement(); -+ while (!element.isNull()) { -+ QString tag = element.tagName(); -+ if (tag == QLatin1String("linepath")) { -+ if (!m_associationLine->loadFromXMI(element)) { -+ return false; -+ } -+ } else if (tag == QLatin1String("floatingtext") || -+ tag == QLatin1String("UML:FloatingTextWidget")) { // for bkwd compatibility -+ QString r = element.attribute(QLatin1String("role"), QLatin1String("-1")); -+ if (r == QLatin1String("-1")) -+ return false; -+ Uml::TextRole::Enum role = Uml::TextRole::fromInt(r.toInt()); -+ FloatingTextWidget *ft = new FloatingTextWidget(m_scene, role, QString(), Uml::ID::Reserved); -+ if (! ft->loadFromXMI(element)) { -+ // Most likely cause: The FloatingTextWidget is empty. -+ delete ft; -+ node = element.nextSibling(); -+ element = node.toElement(); -+ continue; -+ } -+ // always need this -+ ft->setParentItem(this); -+ ft->setLink(this); -+ ft->setSequenceNumber(m_SequenceNumber); -+ ft->setFontCmd(ft->font()); -+ -+ switch(role) { -+ case Uml::TextRole::MultiA: -+ m_role[RoleType::A].multiplicityWidget = ft; -+ if (oldStyleLoad) -+ setMultiplicity(m_role[RoleType::A].multiplicityWidget->text(), RoleType::A); -+ break; -+ -+ case Uml::TextRole::MultiB: -+ m_role[RoleType::B].multiplicityWidget = ft; -+ if (oldStyleLoad) -+ setMultiplicity(m_role[RoleType::B].multiplicityWidget->text(), RoleType::B); -+ break; -+ -+ case Uml::TextRole::ChangeA: -+ m_role[RoleType::A].changeabilityWidget = ft; -+ break; -+ -+ case Uml::TextRole::ChangeB: -+ m_role[RoleType::B].changeabilityWidget = ft; -+ break; -+ -+ case Uml::TextRole::Name: -+ m_nameWidget = ft; -+ if (oldStyleLoad) -+ setName(m_nameWidget->text()); -+ break; -+ -+ case Uml::TextRole::Coll_Message: -+ case Uml::TextRole::Coll_Message_Self: -+ m_nameWidget = ft; -+ ft->setLink(this); -+ ft->setActivated(); -+ if (FloatingTextWidget::isTextValid(ft->text())) -+ ft->show(); -+ else -+ ft->hide(); -+ break; -+ -+ case Uml::TextRole::RoleAName: -+ m_role[RoleType::A].roleWidget = ft; -+ setRoleName(ft->text(), RoleType::A); -+ break; -+ case Uml::TextRole::RoleBName: -+ m_role[RoleType::B].roleWidget = ft; -+ setRoleName(ft->text(), RoleType::B); -+ break; -+ default: -+ DEBUG(DBG_SRC) << "unexpected FloatingTextWidget (TextRole::Enum " << role << ")"; -+ delete ft; -+ break; -+ } -+ } -+ node = element.nextSibling(); -+ element = node.toElement(); -+ } -+ -+ return true; -+} -+ -+/** -+ * Queries the UMLView for resolving the role A and role B widgets. -+ * .... -+ */ -+bool AssociationWidget::loadFromXMI(QDomElement& qElement) -+{ -+ UMLScene *scene = umlScene(); -+ if (scene) { -+ const UMLWidgetList& widgetList = scene->widgetList(); -+ const MessageWidgetList& messageList = scene->messageList(); -+ return loadFromXMI(qElement, widgetList, &messageList); -+ } -+ else { -+ DEBUG(DBG_SRC) << "This isn't on UMLScene yet, so can neither fetch" -+ "messages nor widgets on umlscene"; -+ return false; -+ } -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/associationwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/associationwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/associationwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/associationwidget.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,328 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ASSOCIATIONWIDGET_H -+#define ASSOCIATIONWIDGET_H -+ -+#include "associationwidgetlist.h" -+#include "linkwidget.h" -+#include "messagewidgetlist.h" -+#include "umlwidgetlist.h" -+#include "widgetbase.h" -+ -+class AssociationLine; -+class ClassifierWidget; -+class UMLScene; -+class UMLAssociation; -+class UMLAttribute; -+class UMLClassifierListItem; -+class UMLOperation; -+ -+/** -+ * This class represents an association inside a diagram. -+ * -+ * Constructor is made non accessible: -+ * Users shall use the static create() methods for constructing AssociationWidgets. -+ * -+ * Associations exist not only between UML objects. For example, when a Note is -+ * attached to a UML object, the Note itself is not a UML object. -+ * This class supports both kinds of associations. An association where one or -+ * both roles are not a UML object is called a "pure widget association". -+ * -+ * An AssociationWidget where both roles are UML objects has a corresponding -+ * UMLAssociation. The UMLAssociation can be retrieved using the getAssociation -+ * method. -+ * A pure widget association does not have a corresponding UMLAssociation. -+ * The getAssociation method returns NULL in this case. -+ * -+ * @author Gustavo Madrigal -+ * @author Gopala Krishna -+ * @short This class represents an association inside a diagram. -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class AssociationWidget : public WidgetBase, public LinkWidget -+{ -+ Q_OBJECT -+public: -+ static AssociationWidget* create(UMLScene *scene); -+ static AssociationWidget* create -+ (UMLScene *scene, UMLWidget* WidgetA, -+ Uml::AssociationType::Enum assocType, UMLWidget* WidgetB, -+ UMLObject *umlobject = NULL); -+ -+ virtual ~AssociationWidget(); -+ -+ virtual void setUMLObject(UMLObject *obj); -+ -+ //---------- LinkWidget Interface methods implementation from now on. -+ -+ virtual void lwSetFont(QFont font); -+ virtual UMLClassifier *operationOwner(); -+ -+ virtual UMLOperation *operation(); -+ virtual void setOperation(UMLOperation *op); -+ -+ virtual QString customOpText(); -+ virtual void setCustomOpText(const QString &opText); -+ -+ virtual void resetTextPositions(); -+ -+ virtual void setMessageText(FloatingTextWidget *ft); -+ virtual void setText(FloatingTextWidget *ft, const QString &newText); -+ -+ virtual void showPropertiesDialog(); -+ -+ virtual QString lwOperationText(); -+ virtual UMLClassifier *lwClassifier(); -+ virtual void setOperationText(const QString &op); -+ -+ virtual void constrainTextPos(qreal &textX, qreal &textY, -+ qreal textWidth, qreal textHeight, -+ Uml::TextRole::Enum tr); -+ -+ virtual void calculateNameTextSegment(); -+ -+ //---------- End LinkWidget Interface methods implementation. -+ -+ UMLAssociation* association() const; -+ UMLAttribute* attribute() const; -+ -+// AssociationWidget& operator=(const AssociationWidget& other); -+ bool operator==(const AssociationWidget& other) const; -+ bool operator!=(AssociationWidget& other) const; -+ -+ FloatingTextWidget* textWidgetByRole(Uml::TextRole::Enum tr) const; -+ -+ FloatingTextWidget* nameWidget() const; -+ QString name() const; -+ void setName(const QString &strRole); -+ void setStereotype(const QString &stereo); -+ -+ FloatingTextWidget* roleWidget(Uml::RoleType::Enum role) const; -+ QString roleName(Uml::RoleType::Enum role) const; -+ void setRoleName(const QString &strRole, Uml::RoleType::Enum role); -+ -+ QString roleDocumentation(Uml::RoleType::Enum role) const; -+ void setRoleDocumentation(const QString& doc, Uml::RoleType::Enum role); -+ -+ FloatingTextWidget* multiplicityWidget(Uml::RoleType::Enum role) const; -+ QString multiplicity(Uml::RoleType::Enum role) const; -+ void setMultiplicity(const QString& text, Uml::RoleType::Enum role); -+ -+ Uml::Visibility::Enum visibility(Uml::RoleType::Enum role) const; -+ void setVisibility(Uml::Visibility::Enum value, Uml::RoleType::Enum role); -+ -+ FloatingTextWidget* changeabilityWidget(Uml::RoleType::Enum role) const; -+ Uml::Changeability::Enum changeability(Uml::RoleType::Enum role) const; -+ void setChangeability(Uml::Changeability::Enum value, Uml::RoleType::Enum role); -+ -+ Uml::ID::Type widgetIDForRole(Uml::RoleType::Enum role) const; -+ Uml::ID::Type widgetLocalIDForRole(Uml::RoleType::Enum role) const; -+ UMLWidget* widgetForRole(Uml::RoleType::Enum role) const; -+ void setWidgetForRole(UMLWidget* widget, Uml::RoleType::Enum role); -+ -+ bool setWidgets(UMLWidget* widgetA, Uml::AssociationType::Enum assocType, UMLWidget* widgetB); -+ -+ bool containsAsEndpoint(UMLWidget* widget); -+ -+ Uml::AssociationType::Enum associationType() const; -+ void setAssociationType(Uml::AssociationType::Enum type); -+ -+ bool isCollaboration() const; -+ bool isSelf() const; -+ -+ QString toString() const; -+ -+ bool isActivated() const; -+ void setActivated(bool active); -+ -+ AssociationLine* associationLine() const; -+ -+ virtual bool activate(); -+ virtual QRectF boundingRect() const; -+ virtual QPainterPath shape() const; -+ -+ void widgetMoved(UMLWidget* widget, qreal x, qreal y); -+ -+ void saveIdealTextPositions(); -+ -+ UMLWidget* onWidget(const QPointF &p); -+ bool onAssociation(const QPointF& point); -+ bool onAssocClassLine(const QPointF& point); -+ -+ void createAssocClassLine(); -+ void createAssocClassLine(ClassifierWidget* classifierWidget, -+ int linePathSegmentIndex); -+ -+ void selectAssocClassLine(bool sel = true); -+ void removeAssocClassLine(); -+ void computeAssocClassLine(); -+ -+ void setXEntireAssoc(qreal x); -+ void setYEntireAssoc(qreal y); -+ -+ void moveMidPointsBy(qreal x, qreal y); -+ void moveEntireAssoc(qreal x, qreal y); -+ -+ QFont font() const; -+ -+ virtual void setTextColor(const QColor &color); -+ -+ void calculateEndingPoints(); -+ -+ void clipSize(); -+ -+ bool loadFromXMI(QDomElement& qElement, const UMLWidgetList& widgets, -+ const MessageWidgetList* messages); -+ virtual bool loadFromXMI(QDomElement& qElement); -+ virtual void saveToXMI(QDomDocument &qDoc, QDomElement &qElement); -+ -+ void cleanup(); -+ -+ bool isPointAddable(); -+ bool isPointRemovable(); -+ -+ //:TODO: the following four methods should be protected -+ virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); -+ virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); -+ virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); -+ virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); -+ -+ virtual void setSelected(bool _select); -+public Q_SLOTS: //:TODO: all virtual? -+ virtual void slotMenuSelection(QAction* action); -+ void slotClassifierListItemRemoved(UMLClassifierListItem* obj); -+ void slotAttributeChanged(); -+ -+ void syncToModel(); -+ -+protected: -+ virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); -+ -+ virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event); -+ virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); -+ virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event); -+ -+private: -+ QPointF calculateTextPosition(Uml::TextRole::Enum role); -+ void setTextPosition(Uml::TextRole::Enum role); -+ void setTextPositionRelatively(Uml::TextRole::Enum role, const QPointF &oldPosition); -+ void setFloatingText(Uml::TextRole::Enum role, const QString& text, FloatingTextWidget* &ft); -+ -+ AssociationWidget(UMLScene *scene); -+ -+ void setUMLAssociation(UMLAssociation * assoc); -+ -+ void mergeAssociationDataIntoUMLRepresentation(); -+ -+ static Uml::Region::Enum findPointRegion(const QRectF& rect, const QPointF& pos); -+ static qreal findInterceptOnEdge(const QRectF &rect, Uml::Region::Enum region, const QPointF &point); -+ static QLineF::IntersectType intersect(const QRectF &rect, const QLineF &line, -+ QPointF* intersectionPoint); -+ -+ void moveEvent(QGraphicsSceneMouseEvent *me); -+ -+ Uml::TextRole::Enum calculateNameType(Uml::TextRole::Enum defaultRoleType); -+ -+ static QPointF swapXY(const QPointF &p); -+ -+ // not used at the moment -+ // static QPointF calculatePointAtDistance(const QPointF &P1, const QPointF &P2, float Distance); -+ // static QPointF calculatePointAtDistanceOnPerpendicular(const QPointF &P1, const QPointF &P2, float Distance); -+ // static float perpendicularProjection(const QPointF& P1, const QPointF& P2, const QPointF& P3, QPointF& ResultingPoint); -+ -+ static QPointF midPoint(const QPointF& p0, const QPointF& p1); -+ -+ void createPointsSelfAssociation(); -+ void updatePointsSelfAssociation(); -+ void createPointsException(); -+ void updatePointsException(); -+ -+ /** -+ * The WidgetRole struct gathers all information pertaining to the role. -+ * The AssociationWidget class contains two WidgetRole objects, one for each -+ * side of the association (A and B). -+ */ -+ struct WidgetRole { -+ -+ FloatingTextWidget* multiplicityWidget; ///< information regarding multiplicity -+ FloatingTextWidget* changeabilityWidget; ///< information regarding changeability -+ FloatingTextWidget* roleWidget; ///< role's label of this association -+ -+ UMLWidget* umlWidget; ///< UMLWidget at this role's side of this association -+ -+ Uml::Region::Enum m_WidgetRegion; ///< region of this role's widget -+ -+ int m_nIndex; ///< the index of where the line is on the region for this role -+ int m_nTotalCount; ///< total amount of associations on the region this role's line is on -+ -+ // The following items are only used if m_pObject is not set. -+ Uml::Visibility::Enum visibility; -+ Uml::Changeability::Enum changeability; -+ QString roleDocumentation; -+ -+ }; -+ -+ void updateRegionLineCount(int index, int totalCount, -+ Uml::Region::Enum region, Uml::RoleType::Enum role); -+ -+ void updateAssociations(int totalCount, Uml::Region::Enum region, Uml::RoleType::Enum role); -+ -+ int getRegionCount(Uml::Region::Enum region, Uml::RoleType::Enum role); -+ -+ void doUpdates(const QPointF &otherP, Uml::RoleType::Enum role); -+ -+ void setChangeWidget(const QString &strChangeWidget, Uml::RoleType::Enum role); -+ -+ bool checkAddPoint(const QPointF &scenePos); -+ bool checkRemovePoint(const QPointF &scenePos); -+ -+ bool linePathStartsAt(const UMLWidget* widget); -+ -+ void insertIntoLists(qreal position, const AssociationWidget* assoc); -+ -+ qreal m_positions[100]; ///< auxiliary variable for updateAssociations() -+ int m_positions_len; ///< auxiliary variable for updateAssociations() -+ AssociationWidgetList m_ordered; ///< auxiliary variable for updateAssociations() -+ -+ bool m_activated; ///< flag which is true if the activate method has been called for this class instance -+ -+ /** -+ * When the association has a Role Floating Text this text should move -+ * when the AssociationLine moves but only if the closest segment to the -+ * role text moves. -+ * This segment is: -+ * m_associationLine[m_unNameLineSegment] -- m_associationLine[m_unNameLineSegment+1] -+ */ -+ int m_unNameLineSegment; -+ -+ QPointF m_oldNamePoint; ///< Position of name floatingtext saved by saveIdealTextPositions() -+ QPointF m_oldMultiAPoint; ///< Position of role A multiplicity floatingtext saved by saveIdealTextPositions() -+ QPointF m_oldMultiBPoint; ///< Position of role B multiplicity floatingtext saved by saveIdealTextPositions() -+ QPointF m_oldChangeAPoint; ///< Position of role A changeability floatingtext saved by saveIdealTextPositions() -+ QPointF m_oldChangeBPoint; ///< Position of role B changeability floatingtext saved by saveIdealTextPositions() -+ QPointF m_oldRoleAPoint; ///< Position of role A name floatingtext saved by saveIdealTextPositions() -+ QPointF m_oldRoleBPoint; ///< Position of role B name floatingtext saved by saveIdealTextPositions() -+ -+ int m_nLinePathSegmentIndex; ///< anchor for m_pAssocClassLine -+ QGraphicsLineItem *m_pAssocClassLine; ///< used for connecting assoc. class -+ QGraphicsRectItem *m_pAssocClassLineSel0; ///< selection decoration for the start point of the assoc. class line -+ QGraphicsRectItem *m_pAssocClassLineSel1; ///< selection decoration for the end point of the assoc. class line -+ -+ AssociationLine *m_associationLine; ///< the definition points for the association line -+ ClassifierWidget *m_associationClass; ///< used if we have an assoc. class -+ Uml::AssociationType::Enum m_associationType; ///< is only used if m_pObject is not set -+ WidgetRole m_role[2]; -+ FloatingTextWidget* m_nameWidget; ///< displays the name of this association -+ QPointF m_eventScenePos; ///< holds scene pos of contextMenuEvent() -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/boxwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/boxwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/boxwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/boxwidget.cpp 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,79 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "boxwidget.h" -+ -+// app includes -+#include "uml.h" -+#include "umldoc.h" -+ -+// qt includes -+#include -+ -+/** -+ * Constructs a BoxWidget. -+ * -+ * @param scene The parent to this widget. -+ * @param id The ID to assign (-1 will prompt a new ID.) -+ * @param type The WidgetType (wt_Box.) -+ */ -+BoxWidget::BoxWidget(UMLScene * scene, Uml::ID::Type id, WidgetType type) -+ : UMLWidget(scene, type, id) -+{ -+ setSize(100, 80); -+ m_usesDiagramLineColor = false; // boxes be black -+ m_lineColor = QColor("black"); -+ setZValue(-10); -+} -+ -+/** -+ * Destructor. -+ */ -+BoxWidget::~BoxWidget() -+{ -+} -+ -+/** -+ * Draws a rectangle. -+ */ -+void BoxWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ setPenFromSettings(painter); -+ painter->drawRect(0, 0, width(), height()); -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Saves the widget to the "boxwidget" XMI element. -+ * Note: For loading from XMI, the inherited parent method is used. -+ */ -+void BoxWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement boxElement = qDoc.createElement(QLatin1String("boxwidget")); -+ UMLWidget::saveToXMI(qDoc, boxElement); -+ qElement.appendChild(boxElement); -+} -+ -+/** -+ * Show a properties dialog for a BoxWidget. -+ */ -+void BoxWidget::showPropertiesDialog() -+{ -+ QColor newColor = QColorDialog::getColor(lineColor()); // krazy:exclude=qclasses -+ if (newColor != lineColor()) { -+ setLineColor(newColor); -+ setUsesDiagramLineColor(false); -+ umlDoc()->setModified(true); -+ } -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/boxwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/boxwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/boxwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/boxwidget.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,39 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef BOXWIDGET_H -+#define BOXWIDGET_H -+ -+//app includes -+#include "umlwidget.h" -+ -+/** -+ * Displays a rectangular box. -+ * These widgets are diagram specific. They will still need a unique id -+ * from the @ref UMLDoc class for deletion and other purpose-kf6s. -+ * -+ * @short Displays a box. -+ * @author Jonathan Riddell -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class BoxWidget : public UMLWidget -+{ -+public: -+ explicit BoxWidget(UMLScene * scene, Uml::ID::Type id = Uml::ID::None, WidgetType type = WidgetBase::wt_Box); -+ virtual ~BoxWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+ virtual void showPropertiesDialog(); -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/categorywidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/categorywidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/categorywidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/categorywidget.cpp 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,148 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header file -+#include "categorywidget.h" -+ -+// local includes -+#include "category.h" -+#include "debug_utils.h" -+#include "umlview.h" -+#include "listpopupmenu.h" -+ -+// qt includes -+#include -+ -+/** -+ * Creates a Category widget. -+ * -+ * @param scene The parent of the widget. -+ * @param o The UMLCategory to represent. -+ */ -+CategoryWidget::CategoryWidget(UMLScene * scene, UMLCategory *o) -+ : UMLWidget(scene, WidgetBase::wt_Category, o) -+{ -+ m_fixedAspectRatio = true; -+} -+ -+/** -+ * Destructor. -+ */ -+CategoryWidget::~CategoryWidget() -+{ -+} -+ -+/** -+ * Overrides the standard paint event. -+ */ -+void CategoryWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ UMLWidget::setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) -+ painter->setBrush(UMLWidget::fillColor()); -+ QFont font = UMLWidget::font(); -+ font.setUnderline(false); -+ font.setBold(false); -+ font.setItalic(m_umlObject->isAbstract()); -+ painter->setFont(font); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ // the height is our radius -+ const int h = height(); -+ const int w = width(); -+ const int r = h > w ? h : w; -+ -+ //int middleX = w / 2; -+ const int textStartY = (r / 2) - (fontHeight / 2); -+ -+ // draw a circle -+ painter->drawEllipse(0, 0, r, r); -+ painter->setPen(textColor()); -+ -+ QString letterType(QLatin1Char('D')); -+ switch(static_cast(m_umlObject)->getType()) { -+ case UMLCategory::ct_Disjoint_Specialisation: -+ letterType = QLatin1Char('D'); -+ break; -+ case UMLCategory::ct_Overlapping_Specialisation: -+ letterType = QLatin1Char('O'); -+ break; -+ case UMLCategory::ct_Union: -+ letterType = QLatin1Char('U'); -+ break; -+ default: -+ break; -+ } -+ -+ painter->drawText(UC_MARGIN, textStartY, r - UC_MARGIN * 2, fontHeight, Qt::AlignCenter, letterType); -+ UMLWidget::setPenFromSettings(painter); -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF CategoryWidget::minimumSize() const -+{ -+ const UMLWidget::FontType ft = (m_umlObject->isAbstract() ? FT_BOLD_ITALIC : FT_BOLD); -+ const QFontMetrics &fm = UMLWidget::getFontMetrics(ft); -+ const int fontHeight = fm.lineSpacing(); -+ int radius = UC_RADIUS + fontHeight + UC_MARGIN; -+ -+ return QSizeF(radius, radius); -+} -+ -+/** -+ * Saves this Category to file. -+ */ -+void CategoryWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement categoryElement = qDoc.createElement(QLatin1String("categorywidget")); -+ UMLWidget::saveToXMI(qDoc, categoryElement); -+ qElement.appendChild(categoryElement); -+} -+ -+/** -+ * Will be called when a menu selection has been made from the -+ * popup menu. -+ * -+ * @param action The action that has been selected. -+ */ -+void CategoryWidget::slotMenuSelection(QAction* action) -+{ -+ UMLCategory* catObj = static_cast(umlObject()); -+ if (!catObj) { -+ uWarning() << "No UMLCategory for this widget."; -+ return; -+ } -+ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch(sel) { -+ case ListPopupMenu::mt_DisjointSpecialisation: -+ catObj->setType(UMLCategory::ct_Disjoint_Specialisation); -+ break; -+ -+ case ListPopupMenu::mt_OverlappingSpecialisation: -+ catObj->setType(UMLCategory::ct_Overlapping_Specialisation); -+ break; -+ -+ case ListPopupMenu::mt_Union: -+ catObj->setType(UMLCategory::ct_Union); -+ break; -+ -+ default: -+ UMLWidget::slotMenuSelection(action); -+ } -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/categorywidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/categorywidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/categorywidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/categorywidget.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,56 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef CATEGORYWIDGET_H -+#define CATEGORYWIDGET_H -+ -+#include "umlwidget.h" -+ -+#define UC_MARGIN 5 -+#define UC_RADIUS 30 -+ -+class UMLCategory; -+ -+/** -+ * This class is the graphical version of a UMLCategory. A CategoryWidget is created -+ * by a @ref UMLView. An CategoryWidget belongs to only one @ref UMLView instance. -+ * When the @ref UMLView instance that this class belongs to, it will be automatically deleted. -+ * -+ * If the Category class that this CategoryWidget is displaying is deleted, the @ref UMLView will -+ * make sure that this instance is also deleted. -+ * -+ * The CategoryWidget class inherits from the @ref UMLWidget class which adds most of the functionality -+ * to this class. -+ * -+ * @short A graphical version of a UMLCategory. -+ * @author Sharan Rao -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class CategoryWidget : public UMLWidget -+{ -+ Q_OBJECT -+public: -+ CategoryWidget(UMLScene * scene, UMLCategory *o); -+ virtual ~CategoryWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ // For loading we can use the loadFromXMI() inherited from UMLWidget. -+ -+protected: -+ QSizeF minimumSize() const; -+ -+public slots: -+ void slotMenuSelection(QAction* action); -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/classifierwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/classifierwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/classifierwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/classifierwidget.cpp 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,1426 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "classifierwidget.h" -+ -+// app includes -+#include "floatingtextwidget.h" -+#include "associationwidget.h" -+#include "associationline.h" -+#include "classifier.h" -+#include "cmds.h" -+#include "debug_utils.h" -+#include "listpopupmenu.h" -+#include "object_factory.h" -+#include "operation.h" -+#include "template.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlview.h" -+ -+#define PACKAGE_MARGIN 5 -+ -+// qt includes -+#include -+ -+DEBUG_REGISTER_DISABLED(ClassifierWidget) -+ -+const int ClassifierWidget::MARGIN = 5; -+const int ClassifierWidget::CIRCLE_SIZE = 30; -+const int ClassifierWidget::SOCKET_INCREMENT = 10; -+ -+/** -+ * Constructs a ClassifierWidget. -+ * -+ * @param scene The parent of this ClassifierWidget. -+ * @param c The UMLClassifier to represent. -+ */ -+ClassifierWidget::ClassifierWidget(UMLScene * scene, UMLClassifier *c) -+ : UMLWidget(scene, WidgetBase::wt_Class, c), -+ m_pAssocWidget(0), m_pInterfaceName(0) -+{ -+ const Settings::OptionState& ops = m_scene->optionState(); -+ setVisualPropertyCmd(ShowVisibility, ops.classState.showVisibility); -+ setVisualPropertyCmd(ShowOperations, ops.classState.showOps); -+ setVisualPropertyCmd(ShowPublicOnly, ops.classState.showPublicOnly); -+ setVisualPropertyCmd(ShowPackage, ops.classState.showPackage); -+ m_attributeSignature = Uml::SignatureType::ShowSig; -+ /*:TODO: -+ setVisualProperty(ShowOperationSignature, ops.classState.showOpSig); -+ Cannot do that because we get "pure virtual method called". Open code: -+ */ -+ if(!ops.classState.showOpSig) { -+ if (visualProperty(ShowVisibility)) -+ m_operationSignature = Uml::SignatureType::NoSig; -+ else -+ m_operationSignature = Uml::SignatureType::NoSigNoVis; -+ -+ } else if (visualProperty(ShowVisibility)) -+ m_operationSignature = Uml::SignatureType::ShowSig; -+ else -+ m_operationSignature = Uml::SignatureType::SigNoVis; -+ -+ setVisualPropertyCmd(ShowAttributes, ops.classState.showAtts); -+ setVisualPropertyCmd(ShowStereotype, ops.classState.showStereoType); -+ setVisualPropertyCmd(DrawAsCircle, false); -+ -+ setShowAttSigs(ops.classState.showAttSig); -+ -+ if (c && c->isInterface()) { -+ m_baseType = WidgetBase::wt_Interface; -+ m_visualProperties = ShowOperations | ShowVisibility | ShowStereotype; -+ setShowStereotype(true); -+ updateSignatureTypes(); -+ } -+} -+ -+/** -+ * Constructs a ClassifierWidget. -+ * -+ * @param scene The parent of this ClassifierWidget. -+ * @param c The UMLClassifier to represent. -+ */ -+ClassifierWidget::ClassifierWidget(UMLScene * scene, UMLPackage *o) -+ : UMLWidget(scene, WidgetBase::wt_Package, o), -+ m_pAssocWidget(0), -+ m_pInterfaceName(0) -+{ -+ const Settings::OptionState& ops = m_scene->optionState(); -+ setVisualPropertyCmd(ShowVisibility, ops.classState.showVisibility); -+ setVisualPropertyCmd(ShowOperations, ops.classState.showOps); -+ setVisualPropertyCmd(ShowPublicOnly, ops.classState.showPublicOnly); -+ setVisualPropertyCmd(ShowPackage, ops.classState.showPackage); -+ m_attributeSignature = Uml::SignatureType::ShowSig; -+ -+ if(!ops.classState.showOpSig) { -+ if (visualProperty(ShowVisibility)) -+ m_operationSignature = Uml::SignatureType::NoSig; -+ else -+ m_operationSignature = Uml::SignatureType::NoSigNoVis; -+ -+ } else if (visualProperty(ShowVisibility)) -+ m_operationSignature = Uml::SignatureType::ShowSig; -+ else -+ m_operationSignature = Uml::SignatureType::SigNoVis; -+ -+ setVisualPropertyCmd(ShowAttributes, ops.classState.showAtts); -+ setVisualPropertyCmd(ShowStereotype, ops.classState.showStereoType); -+ setVisualPropertyCmd(DrawAsPackage, true); -+ -+ setShowAttSigs(ops.classState.showAttSig); -+} -+ -+/** -+ * Destructor. -+ */ -+ClassifierWidget::~ClassifierWidget() -+{ -+ if (m_pAssocWidget) -+ m_pAssocWidget->removeAssocClassLine(); -+ if (m_pInterfaceName) { -+ delete m_pInterfaceName; -+ m_pInterfaceName = 0; -+ } -+} -+ -+/** -+ * Return the UMLClassifier which this ClassifierWidget -+ * represents. -+ */ -+UMLClassifier *ClassifierWidget::classifier() const -+{ -+ return dynamic_cast(m_umlObject); -+} -+ -+/** -+ * @return the visual properties -+ */ -+ClassifierWidget::VisualProperties ClassifierWidget::visualProperties() const -+{ -+ return m_visualProperties; -+} -+ -+/** -+ * Set an OR combination of properties stored in \a properties on this -+ * widget. -+ */ -+void ClassifierWidget::setVisualProperties(VisualProperties properties) -+{ -+ // Don't do anything if the argument is equal to current status. -+ if (quint32(m_visualProperties) == quint32(properties)) { -+ return; -+ } -+ -+ m_visualProperties = properties; -+ updateSignatureTypes(); -+} -+ -+/** -+ * @return The status of the property passed in. -+ * -+ * @note Use @ref attributeSignature() and @ref -+ * operationSignature() to get signature status. This -+ * method only indicates whether signature is visible or not. -+ */ -+bool ClassifierWidget::visualProperty(VisualProperty property) const -+{ -+ if (property == ShowAttributeSignature) { -+ return (m_attributeSignature == Uml::SignatureType::ShowSig -+ || m_attributeSignature == Uml::SignatureType::SigNoVis); -+ } -+ -+ else if(property == ShowOperationSignature) { -+ return (m_operationSignature == Uml::SignatureType::ShowSig -+ || m_operationSignature == Uml::SignatureType::SigNoVis); -+ } -+ -+ return m_visualProperties.testFlag(property); -+} -+ -+/** -+ * A convenient method to set and reset individual VisualProperty -+ * -+ * Undo command. -+ * -+ * @param property The property to be set/reset. -+ * @param enable True/false to set/reset. (default = true) -+ * -+ * @note This method handles ShowAttributeSignature and -+ * ShowOperationSignature specially. -+ */ -+void ClassifierWidget::setVisualProperty(VisualProperty property, bool enable) -+{ -+ if (visualProperty(property) != enable) { -+ UMLApp::app()->executeCommand(new Uml::CmdChangeVisualProperty(this, property, enable)); -+ } -+} -+ -+/** -+ * A convenient method to set and reset individual VisualProperty -+ * -+ * @param property The property to be set/reset. -+ * @param enable True/false to set/reset. (default = true) -+ * -+ * @note This method handles ShowAttributeSignature and -+ * ShowOperationSignature specially. -+ */ -+void ClassifierWidget::setVisualPropertyCmd(VisualProperty property, bool enable) -+{ -+ // Handle ShowAttributeSignature and ShowOperationSignature -+ // specially. -+ -+ if (property == ShowAttributeSignature) { -+ if (!enable) { -+ m_attributeSignature = visualProperty(ShowVisibility) ? -+ Uml::SignatureType::NoSig : Uml::SignatureType::NoSigNoVis; -+ } else { -+ m_attributeSignature = visualProperty(ShowVisibility) ? -+ Uml::SignatureType::ShowSig : Uml::SignatureType::SigNoVis; -+ } -+ //:TODO: updateTextItemGroups(); -+ updateSignatureTypes(); -+ } -+ -+ else if (property == ShowOperationSignature) { -+ if (!enable) { -+ m_operationSignature = visualProperty(ShowVisibility) ? -+ Uml::SignatureType::NoSig : Uml::SignatureType::NoSigNoVis; -+ } else { -+ m_operationSignature = visualProperty(ShowVisibility) ? -+ Uml::SignatureType::ShowSig : Uml::SignatureType::SigNoVis; -+ } -+ //:TODO: updateTextItemGroups(); -+ updateSignatureTypes(); -+ } -+ -+ else if (property == ShowStereotype) { -+ // Now just update flag and use base method for actual work. -+ if (enable) { -+ m_visualProperties |= property; -+ } else { -+ m_visualProperties &= ~property; -+ } -+ setShowStereotype(enable); -+ } -+ -+ else if (property == DrawAsCircle) { -+ // Don't do anything if the flag status is same. -+ if (visualProperty(property) == enable) -+ return; -+ if (enable) { -+ m_visualProperties |= property; -+ } else { -+ m_visualProperties &= ~property; -+ } -+ setDrawAsCircle(enable); -+ } -+ -+ // Some other flag. -+ else { -+ // Don't do anything if the flag status is same. -+ if (visualProperty(property) == enable) { -+ return; -+ } -+ -+ // Call setVisualProperties appropriately based on enbable. -+ if (enable) { -+ setVisualProperties(visualProperties() | property); -+ } else { -+ setVisualProperties(visualProperties() & ~property); -+ } -+ } -+} -+ -+/** -+ * A convenient method to toggle individual VisualProperty of this -+ * widget. -+ * -+ * @param property The property to be toggled. -+ * -+ * @note This method handles ShowAttributeSignature and -+ * ShowOperationSignature specially. -+ */ -+void ClassifierWidget::toggleVisualProperty(VisualProperty property) -+{ -+ bool oppositeStatus; -+ if (property == ShowOperationSignature) { -+ oppositeStatus = !(m_operationSignature == Uml::SignatureType::ShowSig -+ || m_operationSignature == Uml::SignatureType::SigNoVis); -+ } -+ else if (property == ShowAttributeSignature) { -+ oppositeStatus = !(m_attributeSignature == Uml::SignatureType::ShowSig -+ || m_attributeSignature == Uml::SignatureType::SigNoVis); -+ } -+ else { -+ oppositeStatus = !visualProperty(property); -+ } -+ -+ DEBUG(DBG_SRC) << "VisualProperty: " << property << " to opposite status " << oppositeStatus; -+ setVisualProperty(property, oppositeStatus); -+} -+ -+/** -+ * Updates m_operationSignature to match m_showVisibility. -+ */ -+void ClassifierWidget::updateSignatureTypes() -+{ -+ //turn on scope -+ if (visualProperty(ShowVisibility)) { -+ if (m_operationSignature == Uml::SignatureType::NoSigNoVis) { -+ m_operationSignature = Uml::SignatureType::NoSig; -+ } else if (m_operationSignature == Uml::SignatureType::SigNoVis) { -+ m_operationSignature = Uml::SignatureType::ShowSig; -+ } -+ } -+ //turn off scope -+ else { -+ if (m_operationSignature == Uml::SignatureType::ShowSig) { -+ m_operationSignature = Uml::SignatureType::SigNoVis; -+ } else if (m_operationSignature == Uml::SignatureType::NoSig) { -+ m_operationSignature = Uml::SignatureType::NoSigNoVis; -+ } -+ } -+ if (visualProperty(ShowVisibility)) { -+ if (m_attributeSignature == Uml::SignatureType::NoSigNoVis) -+ m_attributeSignature = Uml::SignatureType::NoSig; -+ else if (m_attributeSignature == Uml::SignatureType::SigNoVis) -+ m_attributeSignature = Uml::SignatureType::ShowSig; -+ } else { -+ if (m_attributeSignature == Uml::SignatureType::ShowSig) -+ m_attributeSignature = Uml::SignatureType::SigNoVis; -+ else if(m_attributeSignature == Uml::SignatureType::NoSig) -+ m_attributeSignature = Uml::SignatureType::NoSigNoVis; -+ } -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Returns whether to show attribute signatures. -+ * Only applies when m_umlObject->getBaseType() is ot_Class. -+ * -+ * @return Status of how attribute signatures are shown. -+ */ -+Uml::SignatureType::Enum ClassifierWidget::attributeSignature() const -+{ -+ return m_attributeSignature; -+} -+ -+/** -+ * Sets the type of signature to display for an attribute. -+ * Only applies when m_umlObject->getBaseType() is ot_Class. -+ * -+ * @param sig Type of signature to display for an attribute. -+ */ -+void ClassifierWidget::setAttributeSignature(Uml::SignatureType::Enum sig) -+{ -+ m_attributeSignature = sig; -+ updateSignatureTypes(); -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * @return The Uml::SignatureType::Enum value for the operations. -+ */ -+Uml::SignatureType::Enum ClassifierWidget::operationSignature() const -+{ -+ return m_operationSignature; -+} -+ -+/** -+ * Set the type of signature to display for an Operation -+ * -+ * @param sig Type of signature to display for an operation. -+ */ -+void ClassifierWidget::setOperationSignature(Uml::SignatureType::Enum sig) -+{ -+ m_operationSignature = sig; -+ updateSignatureTypes(); -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Sets whether to show attribute signature -+ * Only applies when m_umlObject->getBaseType() is ot_Class. -+ * -+ * @param _status True if attribute signatures shall be shown. -+ */ -+void ClassifierWidget::setShowAttSigs(bool _status) -+{ -+ if(!_status) { -+ if (visualProperty(ShowVisibility)) -+ m_attributeSignature = Uml::SignatureType::NoSig; -+ else -+ m_attributeSignature = Uml::SignatureType::NoSigNoVis; -+ } -+ else if (visualProperty(ShowVisibility)) -+ m_attributeSignature = Uml::SignatureType::ShowSig; -+ else -+ m_attributeSignature = Uml::SignatureType::SigNoVis; -+ if (UMLApp::app()->document()->loading()) -+ return; -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Toggles whether to show attribute signatures. -+ * Only applies when m_umlObject->getBaseType() is ot_Class. -+ */ -+void ClassifierWidget::toggleShowAttSigs() -+{ -+ if (m_attributeSignature == Uml::SignatureType::ShowSig || -+ m_attributeSignature == Uml::SignatureType::SigNoVis) { -+ if (visualProperty(ShowVisibility)) { -+ m_attributeSignature = Uml::SignatureType::NoSig; -+ } else { -+ m_attributeSignature = Uml::SignatureType::NoSigNoVis; -+ } -+ } else if (visualProperty(ShowVisibility)) { -+ m_attributeSignature = Uml::SignatureType::ShowSig; -+ } else { -+ m_attributeSignature = Uml::SignatureType::SigNoVis; -+ } -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Return the number of displayed members of the given ObjectType. -+ * Takes into consideration m_showPublicOnly but not other settings. -+ */ -+int ClassifierWidget::displayedMembers(UMLObject::ObjectType ot) const -+{ -+ int count = 0; -+ UMLClassifier *umlc = this->classifier(); -+ if (!umlc) -+ return count; -+ UMLClassifierListItemList list = umlc->getFilteredList(ot); -+ foreach (UMLClassifierListItem *m, list) { -+ if (!(visualProperty(ShowPublicOnly) && m->visibility() != Uml::Visibility::Public)) -+ count++; -+ } -+ return count; -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF ClassifierWidget::minimumSize() const -+{ -+ return calculateSize(); -+} -+ -+/** -+ * Calculate content related size of widget. -+ * Overrides method from UMLWidget. -+ */ -+QSizeF ClassifierWidget::calculateSize(bool withExtensions /* = true */) const -+{ -+ if (!m_umlObject) { -+ return UMLWidget::minimumSize(); -+ } -+ if (m_umlObject->baseType() == UMLObject::ot_Package) { -+ return calculateAsPackageSize(); -+ } -+ UMLClassifier *umlc = this->classifier(); -+ if (!umlc) { -+ uError() << "Internal error - classifier() returns NULL"; -+ return UMLWidget::minimumSize(); -+ } -+ if (umlc->isInterface() && visualProperty(DrawAsCircle)) { -+ return calculateAsCircleSize(); -+ } -+ -+ const bool showNameOnly = !visualProperty(ShowAttributes) && -+ !visualProperty(ShowOperations) && -+ !visualProperty(ShowDocumentation); -+ -+ const QFontMetrics &fm = getFontMetrics(UMLWidget::FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ // width is the width of the longest 'word' -+ int width = 0, height = 0; -+ // consider stereotype -+ if (visualProperty(ShowStereotype) && !m_umlObject->stereotype().isEmpty()) { -+ height += fontHeight; -+ // ... width -+ const QFontMetrics &bfm = UMLWidget::getFontMetrics(UMLWidget::FT_BOLD); -+ const int stereoWidth = bfm.size(0, m_umlObject->stereotype(true)).width(); -+ if (stereoWidth > width) -+ width = stereoWidth; -+ } else if (showNameOnly) { -+ height += MARGIN; -+ } -+ -+ // consider name -+ height += fontHeight; -+ // ... width -+ QString displayedName; -+ if (visualProperty(ShowPackage)) -+ displayedName = m_umlObject->fullyQualifiedName(); -+ else -+ displayedName = m_umlObject->name(); -+ const UMLWidget::FontType nft = (m_umlObject->isAbstract() ? FT_BOLD_ITALIC : FT_BOLD); -+ const int nameWidth = UMLWidget::getFontMetrics(nft).size(0, displayedName).width(); -+ if (nameWidth > width) -+ width = nameWidth; -+ -+#ifdef ENABLE_WIDGET_SHOW_DOC -+ // consider documentation -+ if (visualProperty(ShowDocumentation)) { -+ if (!documentation().isEmpty()) { -+ QRect brect = fm.boundingRect(QRect(0, 0, this->width()-2*MARGIN, this->height()-height), Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, documentation()); -+ height += brect.height(); -+ if (!visualProperty(ShowOperations) && !visualProperty(ShowAttributes)) { -+ if (brect.width() >= width) -+ width = brect.width(); -+ } -+ } -+ else -+ height += fontHeight / 2; -+ } -+#endif -+ -+ // consider attributes -+ if (visualProperty(ShowAttributes)) { -+ const int numAtts = displayedAttributes(); -+ if (numAtts > 0) { -+ height += fontHeight * numAtts; -+ // calculate width of the attributes -+ UMLClassifierListItemList list = umlc->getFilteredList(UMLObject::ot_Attribute); -+ foreach (UMLClassifierListItem *a, list) { -+ if (visualProperty(ShowPublicOnly) && a->visibility() != Uml::Visibility::Public) -+ continue; -+ const int attWidth = fm.size(0, a->toString(m_attributeSignature)).width(); -+ if (attWidth > width) -+ width = attWidth; -+ } -+ } -+ else -+ height += fontHeight / 2; -+ } -+ -+ // consider operations -+ if (visualProperty(ShowOperations)) { -+ const int numOps = displayedOperations(); -+ if (numOps > 0) { -+ height += numOps * fontHeight; -+ // ... width -+ UMLOperationList list(umlc->getOpList()); -+ foreach (UMLOperation* op, list) { -+ if (visualProperty(ShowPublicOnly) && op->visibility() != Uml::Visibility::Public) -+ continue; -+ const QString displayedOp = op->toString(m_operationSignature); -+ UMLWidget::FontType oft; -+ oft = (op->isAbstract() ? UMLWidget::FT_ITALIC : UMLWidget::FT_NORMAL); -+ const int w = UMLWidget::getFontMetrics(oft).size(0, displayedOp).width(); -+ if (w > width) -+ width = w; -+ } -+ } -+ else -+ height += fontHeight / 2; -+ } -+ -+ if (withExtensions) { -+ // consider template box _as last_ ! -+ QSize templatesBoxSize = calculateTemplatesBoxSize(); -+ if (templatesBoxSize.width() != 0) { -+ // add width to largest 'word' -+ width += templatesBoxSize.width() / 2; -+ } -+ if (templatesBoxSize.height() != 0) { -+ height += templatesBoxSize.height() - MARGIN; -+ } -+ } -+ -+ // allow for height margin -+ if (showNameOnly) { -+ height += MARGIN; -+ } -+ -+ // allow for width margin -+ width += MARGIN * 2; -+ -+ return QSizeF(width, height); -+} -+ -+/** -+ * Calculcates the size of the templates box in the top left -+ * if it exists, returns QSize(0, 0) if it doesn't. -+ * -+ * @return QSize of the templates flap. -+ */ -+QSize ClassifierWidget::calculateTemplatesBoxSize() const -+{ -+ if (!classifier()) -+ return QSize(0, 0); -+ UMLTemplateList list = classifier()->getTemplateList(); -+ int count = list.count(); -+ if (count == 0) { -+ return QSize(0, 0); -+ } -+ -+ QFont font = UMLWidget::font(); -+ font.setItalic(false); -+ font.setUnderline(false); -+ font.setBold(false); -+ const QFontMetrics fm(font); -+ -+ int width = 0; -+ int height = count * fm.lineSpacing() + (MARGIN*2); -+ -+ foreach (UMLTemplate *t, list) { -+ int textWidth = fm.size(0, t->toString()).width(); -+ if (textWidth > width) -+ width = textWidth; -+ } -+ -+ width += (MARGIN*2); -+ return QSize(width, height); -+} -+ -+/** -+ * Return the number of displayed attributes. -+ */ -+int ClassifierWidget::displayedAttributes() const -+{ -+ if (!visualProperty(ShowAttributes)) -+ return 0; -+ return displayedMembers(UMLObject::ot_Attribute); -+} -+ -+/** -+ * Return the number of displayed operations. -+ */ -+int ClassifierWidget::displayedOperations() const -+{ -+ if (!visualProperty(ShowOperations)) -+ return 0; -+ return displayedMembers(UMLObject::ot_Operation); -+} -+ -+/** -+ * Set the AssociationWidget when this ClassWidget acts as -+ * an association class. -+ */ -+void ClassifierWidget::setClassAssociationWidget(AssociationWidget *assocwidget) -+{ -+ if (!classifier()) { -+ uError() << "Class association cannot be applied to package"; -+ return; -+ } -+ m_pAssocWidget = assocwidget; -+ UMLAssociation *umlassoc = NULL; -+ if (assocwidget) -+ umlassoc = assocwidget->association(); -+ classifier()->setClassAssoc(umlassoc); -+} -+ -+/** -+ * Return the AssociationWidget when this classifier acts as -+ * an association class (else return NULL.) -+ */ -+AssociationWidget *ClassifierWidget::classAssociationWidget() const -+{ -+ return m_pAssocWidget; -+} -+ -+/** -+ * Overrides standard method. -+ * Auxiliary to reimplementations in the derived classes. -+ */ -+void ClassifierWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) -+ painter->setBrush(UMLWidget::fillColor()); -+ else { -+ painter->setBrush(m_scene->backgroundColor()); -+ } -+ if (m_umlObject->baseType() == UMLObject::ot_Package) { -+ drawAsPackage(painter, option); -+ UMLWidget::paint(painter, option, widget); -+ return; -+ } -+ UMLClassifier *umlc = this->classifier(); -+ if (!umlc) { -+ uError() << "Internal error - classifier() returns NULL"; -+ return; -+ } -+ if (umlc->isInterface() && visualProperty(DrawAsCircle)) { -+ drawAsCircle(painter, option); -+ UMLWidget::paint(painter, option, widget); -+ return; -+ } -+ -+ // Draw the bounding rectangle -+ QSize templatesBoxSize = calculateTemplatesBoxSize(); -+ int bodyOffsetY = 0; -+ if (templatesBoxSize.height() > 0) -+ bodyOffsetY += templatesBoxSize.height() - MARGIN; -+ int w = width(); -+ if (templatesBoxSize.width() > 0) -+ w -= templatesBoxSize.width() / 2; -+ int h = height(); -+ if (templatesBoxSize.height() > 0) -+ h -= templatesBoxSize.height() - MARGIN; -+ painter->drawRect(0, bodyOffsetY, w, h); -+ -+ QFont font = UMLWidget::font(); -+ font.setUnderline(false); -+ font.setItalic(false); -+ const QFontMetrics &fm = UMLWidget::getFontMetrics(UMLWidget::FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ -+ //If there are any templates then draw them -+ UMLTemplateList tlist = umlc->getTemplateList(); -+ if (tlist.count() > 0) { -+ setPenFromSettings(painter); -+ QPen pen = painter->pen(); -+ pen.setStyle(Qt::DotLine); -+ painter->setPen(pen); -+ painter->drawRect(width() - templatesBoxSize.width(), 0, -+ templatesBoxSize.width(), templatesBoxSize.height()); -+ painter->setPen(QPen(textColor())); -+ font.setBold(false); -+ painter->setFont(font); -+ const int x = width() - templatesBoxSize.width() + MARGIN; -+ int y = MARGIN; -+ foreach (UMLTemplate *t, tlist) { -+ QString text = t->toString(); -+ painter->drawText(x, y, fm.size(0, text).width(), fontHeight, Qt::AlignVCenter, text); -+ y += fontHeight; -+ } -+ } -+ -+ const int textX = MARGIN; -+ const int textWidth = w - MARGIN * 2; -+ -+ painter->setPen(QPen(textColor())); -+ -+ // draw stereotype -+ font.setBold(true); -+ const bool showNameOnly = !visualProperty(ShowAttributes) && -+ !visualProperty(ShowOperations) && -+ !visualProperty(ShowDocumentation); -+ -+ int nameHeight = fontHeight; -+ if (visualProperty(ShowStereotype) && !m_umlObject->stereotype().isEmpty()) { -+ painter->setFont(font); -+ painter->drawText(textX, bodyOffsetY, textWidth, fontHeight, Qt::AlignCenter, m_umlObject->stereotype(true)); -+ bodyOffsetY += fontHeight; -+ } else if (showNameOnly) { -+ nameHeight = h; -+ } -+ -+ // draw name -+ QString name; -+ if (visualProperty(ShowPackage)) { -+ name = m_umlObject->fullyQualifiedName(); -+ } else { -+ name = this->name(); -+ } -+ font.setItalic(m_umlObject->isAbstract()); -+ painter->setFont(font); -+ painter->drawText(textX, bodyOffsetY, textWidth, nameHeight, Qt::AlignCenter, name); -+ bodyOffsetY += fontHeight; -+ font.setBold(false); -+ font.setItalic(false); -+ painter->setFont(font); -+ -+#ifdef ENABLE_WIDGET_SHOW_DOC -+ // draw documentation -+ if (visualProperty(ShowDocumentation)) { -+ setPenFromSettings(painter); -+ painter->drawLine(0, bodyOffsetY, w, bodyOffsetY); -+ painter->setPen(textColor()); -+ -+ if (!documentation().isEmpty()) { -+ QRect brect = fm.boundingRect(QRect(0, 0, w-2*MARGIN, h-bodyOffsetY), Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, documentation()); -+ if (brect.width() > width() + 2*MARGIN) -+ brect.setWidth(width()-2*MARGIN); -+ brect.adjust(textX, bodyOffsetY, textX, bodyOffsetY); -+ painter->drawText(brect, Qt::AlignCenter | Qt::TextWordWrap, documentation()); -+ bodyOffsetY += brect.height(); -+ } -+ else -+ bodyOffsetY += fontHeight / 2; -+ } -+#endif -+ // draw attributes -+ if (visualProperty(ShowAttributes)) { -+ // draw dividing line between doc/name and attributes -+ setPenFromSettings(painter); -+ painter->drawLine(0, bodyOffsetY, w, bodyOffsetY); -+ painter->setPen(textColor()); -+ -+ const int numAtts = displayedAttributes(); -+ if (numAtts > 0) { -+ drawMembers(painter, UMLObject::ot_Attribute, m_attributeSignature, textX, -+ bodyOffsetY, fontHeight); -+ bodyOffsetY += fontHeight * numAtts; -+ } -+ else -+ bodyOffsetY += fontHeight / 2; -+ } -+ -+ // draw operations -+ if (visualProperty(ShowOperations)) { -+ // draw dividing line between attributes and operations -+ setPenFromSettings(painter); -+ painter->drawLine(0, bodyOffsetY, w, bodyOffsetY); -+ painter->setPen(QPen(textColor())); -+ -+ const int numOps = displayedOperations(); -+ if (numOps >= 0) { -+ drawMembers(painter, UMLObject::ot_Operation, m_operationSignature, textX, -+ bodyOffsetY, fontHeight); -+ } -+ } -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * @return The shape of the ClassifierWidget. -+ */ -+QPainterPath ClassifierWidget::shape() const -+{ -+ QPainterPath path; -+ if (classifier() && classifier()->isInterface() && visualProperty(DrawAsCircle)) { -+ path.addEllipse(rect()); -+ return path; -+ } -+#ifdef ENABLE_WIDGET_SHOW_DOC -+ QSizeF mainSize = rect().size(); -+#else -+ QSizeF mainSize = calculateSize(false); -+#endif -+ QSize templatesBoxSize = calculateTemplatesBoxSize(); -+ qreal mainY = 0.0; -+ if (templatesBoxSize.height() > 0) { -+ mainY += templatesBoxSize.height() - MARGIN; -+ path.addRect(QRectF(mainSize.width() - templatesBoxSize.width() / 2, 0.0, -+ templatesBoxSize.width(), templatesBoxSize.height())); -+ } -+ path.addRect(QRectF(0.0, mainY, mainSize.width(), mainSize.height())); -+ return path; -+} -+ -+/** -+ * Draws the interface as a circle. -+ * Only applies when m_umlObject->getBaseType() is ot_Interface. -+ */ -+void ClassifierWidget::drawAsCircle(QPainter *painter, const QStyleOptionGraphicsItem *option) -+{ -+ const int w = width(); -+ -+ if (m_Assocs.size() > 1) { -+ painter->drawEllipse(w/2 - CIRCLE_SIZE/2, SOCKET_INCREMENT / 2, CIRCLE_SIZE, CIRCLE_SIZE); -+ // Draw socket for required interface. -+ const qreal angleSpan = 180; // 360.0 / (m_Assocs.size() + 1.0); -+ const int arcDiameter = CIRCLE_SIZE + SOCKET_INCREMENT; -+ QRect requireArc(w/2 - arcDiameter/2, 0, arcDiameter, arcDiameter); -+ const QPointF center(x() + w/2, y() + arcDiameter/2); -+ const qreal cX = center.x(); -+ const qreal cY = center.y(); -+ foreach (AssociationWidget *aw, m_Assocs) { -+ const Uml::AssociationType::Enum aType = aw->associationType(); -+ if (aType == Uml::AssociationType::UniAssociation || -+ aType == Uml::AssociationType::Association) // provider -+ continue; -+ UMLWidget *otherEnd = aw->widgetForRole(Uml::RoleType::A); -+ const WidgetBase::WidgetType oType = otherEnd->baseType(); -+ if (oType != WidgetBase::wt_Component && oType != WidgetBase::wt_Port) -+ continue; -+ -+ AssociationLine *assocLine = aw->associationLine(); -+ const QPointF p(assocLine->endPoint()); -+ const qreal tolerance = 18.0; -+ bool drawArc = true; -+ qreal midAngle; -+ if (p.x() < cX - tolerance) { -+ if (p.y() < cY - tolerance) -+ midAngle = 135; -+ else if (p.y() > cY + tolerance) -+ midAngle = 225; -+ else -+ midAngle = 180; -+ } else if (p.x() > cX + tolerance) { -+ if (p.y() < cY - tolerance) -+ midAngle = 45; -+ else if (p.y() > cY + tolerance) -+ midAngle = 315; -+ else -+ midAngle = 0; -+ } else { -+ if (p.y() < cY - tolerance) -+ midAngle = 90; -+ else if (p.y() > cY + tolerance) -+ midAngle = 270; -+ else -+ drawArc = false; -+ } -+ if (drawArc) { -+ // uDebug() << "number of assocs: " << m_Assocs.size() -+ // << ", p: " << p << ", center: " << center -+ // << ", midAngle: " << midAngle << ", angleSpan: " << angleSpan; -+ painter->drawArc(requireArc, 16 * (midAngle - angleSpan/2), 16 * angleSpan); -+ } else { -+ uError() << "socket: assocLine endPoint " << p -+ << " too close to own center" << center; -+ } -+ } -+ } -+ else -+ painter->drawEllipse(w/2 - CIRCLE_SIZE/2, 0, CIRCLE_SIZE, CIRCLE_SIZE); -+ -+ UMLWidget::paint(painter, option); -+} -+ -+/** -+ * Calculates the size of the object when drawn as a circle. -+ * Only applies when m_umlObject->getBaseType() is ot_Interface. -+ */ -+QSize ClassifierWidget::calculateAsCircleSize() const -+{ -+ int circleSize = CIRCLE_SIZE; -+ if (m_Assocs.size() > 1) -+ circleSize += SOCKET_INCREMENT; -+ return QSize(circleSize, circleSize); -+} -+ -+void ClassifierWidget::drawAsPackage(QPainter *painter, const QStyleOptionGraphicsItem *option) -+{ -+ Q_UNUSED(option); -+ -+ int w = width(); -+ int h = height(); -+ QFont font = UMLWidget::font(); -+ font.setBold(true); -+ //FIXME italic is true when a package is first created until you click elsewhere, not sure why -+ font.setItalic(false); -+ const QFontMetrics &fm = getFontMetrics(FT_BOLD); -+ const int fontHeight = fm.lineSpacing(); -+ -+ painter->drawRect(0, 0, 50, fontHeight); -+ if (m_umlObject->stereotype() == QLatin1String("subsystem")) { -+ const int fHalf = fontHeight / 2; -+ const int symY = fHalf; -+ const int symX = 38; -+ painter->drawLine(symX, symY, symX, symY + fHalf - 2); // left leg -+ painter->drawLine(symX + 8, symY, symX + 8, symY + fHalf - 2); // right leg -+ painter->drawLine(symX, symY, symX + 8, symY); // waist -+ painter->drawLine(symX + 4, symY, symX + 4, symY - fHalf + 2); // head -+ } -+ painter->drawRect(0, fontHeight - 1, w, h - fontHeight); -+ -+ painter->setPen(textColor()); -+ painter->setFont(font); -+ -+ int lines = 1; -+ QString stereotype = m_umlObject->stereotype(); -+ if (!stereotype.isEmpty()) { -+ painter->drawText(0, fontHeight + PACKAGE_MARGIN, -+ w, fontHeight, Qt::AlignCenter, m_umlObject->stereotype(true)); -+ lines = 2; -+ } -+ -+ painter->drawText(0, (fontHeight*lines) + PACKAGE_MARGIN, -+ w, fontHeight, Qt::AlignCenter, name()); -+} -+ -+QSize ClassifierWidget::calculateAsPackageSize() const -+{ -+ const QFontMetrics &fm = getFontMetrics(FT_BOLD_ITALIC); -+ const int fontHeight = fm.lineSpacing(); -+ -+ int lines = 1; -+ -+ int width = fm.width(m_umlObject->name()); -+ -+ int tempWidth = 0; -+ if (!m_umlObject->stereotype().isEmpty()) { -+ tempWidth = fm.width(m_umlObject->stereotype(true)); -+ lines = 2; -+ } -+ if (tempWidth > width) -+ width = tempWidth; -+ width += PACKAGE_MARGIN * 2; -+ if (width < 70) -+ width = 70; // minumin width of 70 -+ -+ int height = (lines*fontHeight) + fontHeight + (PACKAGE_MARGIN * 2); -+ -+ return QSize(width, height); -+} -+ -+/** -+ * Auxiliary method for draw() of child classes: -+ * Draw the attributes or operations. -+ * -+ * @param p QPainter to paint to. -+ * @param ot Object type to draw, either ot_Attribute or ot_Operation. -+ * @param sigType Governs details of the member display. -+ * @param x X coordinate at which to draw the texts. -+ * @param y Y coordinate at which text drawing commences. -+ * @param fontHeight The font height. -+ */ -+void ClassifierWidget::drawMembers(QPainter * painter, UMLObject::ObjectType ot, Uml::SignatureType::Enum sigType, -+ int x, int y, int fontHeight) -+{ -+ UMLClassifier *umlc = classifier(); -+ if (!umlc) { -+ return; -+ } -+ QFont f = UMLWidget::font(); -+ f.setBold(false); -+ UMLClassifierListItemList list = umlc->getFilteredList(ot); -+ painter->setClipping(true); -+ painter->setClipRect(rect()); -+ foreach (UMLClassifierListItem *obj, list) { -+ if (visualProperty(ShowPublicOnly) && obj->visibility() != Uml::Visibility::Public) -+ continue; -+ QString text = obj->toString(sigType); -+ f.setItalic(obj->isAbstract()); -+ f.setUnderline(obj->isStatic()); -+ painter->setFont(f); -+ QFontMetrics fontMetrics(f); -+ painter->drawText(x, y, fontMetrics.size(0, text).width(), fontHeight, Qt::AlignVCenter, text); -+ f.setItalic(false); -+ f.setUnderline(false); -+ painter->setFont(f); -+ y += fontHeight; -+ } -+ painter->setClipping(false); -+} -+ -+/** -+ * Override method from UMLWidget in order to additionally check m_pInterfaceName. -+ * -+ * @param p Point to be checked. -+ * -+ * @return 'this' if UMLWidget::onWidget(p) returns non NULL; -+ * m_pInterfaceName if m_pName is non NULL and -+ * m_pInterfaceName->onWidget(p) returns non NULL; else NULL. -+ */ -+UMLWidget* ClassifierWidget::onWidget(const QPointF &p) -+{ -+ if (UMLWidget::onWidget(p) != NULL) -+ return this; -+ if (getDrawAsCircle() && m_pInterfaceName) { -+ uDebug() << "floatingtext: " << m_pInterfaceName->text(); -+ return m_pInterfaceName->onWidget(p); -+ } -+ return NULL; -+} -+ -+/** -+ * Reimplement function from UMLWidget. -+ */ -+UMLWidget* ClassifierWidget::widgetWithID(Uml::ID::Type id) -+{ -+ if (UMLWidget::widgetWithID(id)) -+ return this; -+ if (getDrawAsCircle() && m_pInterfaceName && m_pInterfaceName->widgetWithID(id)) -+ return m_pInterfaceName; -+ return NULL; -+} -+ -+void ClassifierWidget::setDocumentation(const QString &doc) -+{ -+ WidgetBase::setDocumentation(doc); -+ updateGeometry(); -+} -+ -+/** -+ * Sets whether to draw as circle. -+ * Only applies when m_umlObject->getBaseType() is ot_Interface. -+ * -+ * @param drawAsCircle True if widget shall be drawn as circle. -+ */ -+void ClassifierWidget::setDrawAsCircle(bool drawAsCircle) -+{ -+ setVisualPropertyCmd(DrawAsCircle, drawAsCircle); -+ const int circleSize = CIRCLE_SIZE + SOCKET_INCREMENT; -+ if (drawAsCircle) { -+ setX(x() + (width()/2 - circleSize/2)); -+ setY(y() + (height()/2 - circleSize/2)); -+ setSize(circleSize, circleSize); -+ if (m_pInterfaceName) { -+ m_pInterfaceName->show(); -+ } else { -+ m_pInterfaceName = new FloatingTextWidget(m_scene, Uml::TextRole::Floating, name()); -+ m_pInterfaceName->setParentItem(this); -+ m_pInterfaceName->setText(name()); // to get geometry update -+ m_pInterfaceName->setX(circleSize/2 - m_pInterfaceName->width() / 2); -+ m_pInterfaceName->setY(circleSize + SOCKET_INCREMENT); -+ } -+ m_resizable = false; -+ } else { -+ setSize(ClassifierWidget::minimumSize()); -+ setX(x() - (width()/2 - circleSize/2)); -+ setY(y() - (height()/2 - circleSize/2)); -+ if (m_pInterfaceName) -+ m_pInterfaceName->hide(); -+ m_resizable = true; -+ } -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Returns whether to draw as circle. -+ * Only applies when m_umlObject->getBaseType() is ot_Interface. -+ * -+ * @return True if widget is drawn as circle. -+ */ -+bool ClassifierWidget::getDrawAsCircle() const -+{ -+ return visualProperty(DrawAsCircle); -+} -+ -+/** -+ * Toggles whether to draw as circle. -+ * Only applies when m_umlObject->getBaseType() is ot_Interface. -+ */ -+void ClassifierWidget::toggleDrawAsCircle() -+{ -+ toggleVisualProperty(DrawAsCircle); -+ updateSignatureTypes(); -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Changes this classifier from an interface to a class. -+ * Attributes and stereotype visibility is got from the view OptionState. -+ * This widget is also updated. -+ */ -+void ClassifierWidget::changeToClass() -+{ -+ m_baseType = WidgetBase::wt_Class; -+ m_umlObject->setBaseType(UMLObject::ot_Class); -+ setVisualPropertyCmd(DrawAsCircle, false); -+ const Settings::OptionState& ops = m_scene->optionState(); -+ setVisualProperty(ShowAttributes, ops.classState.showAtts); -+ setVisualProperty(ShowStereotype, ops.classState.showStereoType); -+ -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Changes this classifier from a class to an interface. -+ * Attributes are hidden and stereotype is shown. -+ * This widget is also updated. -+ */ -+void ClassifierWidget::changeToInterface() -+{ -+ m_baseType = WidgetBase::wt_Interface; -+ m_umlObject->setBaseType(UMLObject::ot_Interface); -+ -+ setVisualProperty(ShowAttributes, false); -+ setVisualProperty(ShowStereotype, true); -+ -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Changes this classifier from an "class-or-package" to a package. -+ * This widget is also updated. -+ */ -+void ClassifierWidget::changeToPackage() -+{ -+ m_baseType = WidgetBase::wt_Package; -+ m_umlObject->setBaseType(UMLObject::ot_Package); -+ -+ setVisualProperty(ShowAttributes, false); -+ setVisualProperty(ShowStereotype, true); -+ -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Extends base method to adjust also the association of a class -+ * association. -+ * Executes the base method and then, if file isn't loading and the -+ * classifier acts as a class association, the association position is -+ * updated. -+ * TODO: This is never called. -+ * -+ * param x The x-coordinate. -+ * param y The y-coordinate. -+ */ -+//void ClassifierWidget::adjustAssociations(int x, int y) -+//{ -+// DEBUG(DBG_SRC) << "x=" << x << " / y=" << y; -+// UMLWidget::adjustAssocs(x, y); -+ -+// if (m_doc->loading() || m_pAssocWidget == 0) { -+// return; -+// } -+ -+// //:TODO: the following is also called from UMLWidgetr::ajdustAssocs(...) -+// // and then AssociationWidget::widgetMoved(...) -+// //m_pAssocWidget->computeAssocClassLine(); -+//} -+ -+/** -+ * Loads the "classwidget" or "interfacewidget" XML element. -+ */ -+bool ClassifierWidget::loadFromXMI(QDomElement & qElement) -+{ -+ if (!UMLWidget::loadFromXMI(qElement)) { -+ return false; -+ } -+ -+ QString showatts = qElement.attribute(QLatin1String("showattributes"), QLatin1String("0")); -+ QString showops = qElement.attribute(QLatin1String("showoperations"), QLatin1String("1")); -+ QString showpubliconly = qElement.attribute(QLatin1String("showpubliconly"), QLatin1String("0")); -+ QString showattsigs = qElement.attribute(QLatin1String("showattsigs"), QLatin1String("600")); -+ QString showopsigs = qElement.attribute(QLatin1String("showopsigs"), QLatin1String("600")); -+ QString showpackage = qElement.attribute(QLatin1String("showpackage"), QLatin1String("0")); -+ QString showscope = qElement.attribute(QLatin1String("showscope"), QLatin1String("0")); -+ QString drawascircle = qElement.attribute(QLatin1String("drawascircle"), QLatin1String("0")); -+#ifdef ENABLE_WIDGET_SHOW_DOC -+ QString showDocumentation = qElement.attribute(QLatin1String("showdocumentation"), QLatin1String("0")); -+#endif -+ -+ setVisualPropertyCmd(ShowAttributes, (bool)showatts.toInt()); -+ setVisualPropertyCmd(ShowOperations, (bool)showops.toInt()); -+ setVisualPropertyCmd(ShowPublicOnly, (bool)showpubliconly.toInt()); -+ setVisualPropertyCmd(ShowPackage, (bool)showpackage.toInt()); -+ setVisualPropertyCmd(ShowVisibility, (bool)showscope.toInt()); -+ setVisualPropertyCmd(DrawAsCircle, (bool)drawascircle.toInt()); -+#ifdef ENABLE_WIDGET_SHOW_DOC -+ setVisualPropertyCmd(ShowDocumentation, (bool)showDocumentation.toInt()); -+#endif -+ -+ m_attributeSignature = Uml::SignatureType::fromInt(showattsigs.toInt()); -+ m_operationSignature = Uml::SignatureType::fromInt(showopsigs.toInt()); -+ -+ if (!getDrawAsCircle()) -+ return true; -+ -+ // Optional child element: floatingtext -+ QDomNode node = qElement.firstChild(); -+ QDomElement element = node.toElement(); -+ if (!element.isNull()) { -+ QString tag = element.tagName(); -+ if (tag == QLatin1String("floatingtext")) { -+ if (m_pInterfaceName == NULL) { -+ m_pInterfaceName = new FloatingTextWidget(m_scene, -+ Uml::TextRole::Floating, -+ name(), Uml::ID::Reserved); -+ m_pInterfaceName->setParentItem(this); -+ } -+ if (!m_pInterfaceName->loadFromXMI(element)) { -+ // Most likely cause: The FloatingTextWidget is empty. -+ delete m_pInterfaceName; -+ m_pInterfaceName = NULL; -+ } else { -+ m_pInterfaceName->activate(); -+ m_pInterfaceName->update(); -+ } -+ } else { -+ uError() << "unknown tag " << tag; -+ } -+ } -+ -+ return true; -+} -+ -+/** -+ * Creates the "classwidget" or "interfacewidget" XML element. -+ */ -+void ClassifierWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement conceptElement; -+ UMLClassifier *umlc = classifier(); -+ if (umlObject() && umlObject()->baseType() == UMLObject::ot_Package) { -+ conceptElement = qDoc.createElement(QLatin1String("packagewidget")); -+ UMLWidget::saveToXMI(qDoc, conceptElement); -+ qElement.appendChild(conceptElement); -+ return; -+ } -+ else if (umlc && umlc->isInterface()) -+ conceptElement = qDoc.createElement(QLatin1String("interfacewidget")); -+ else -+ conceptElement = qDoc.createElement(QLatin1String("classwidget")); -+ UMLWidget::saveToXMI(qDoc, conceptElement); -+ conceptElement.setAttribute(QLatin1String("showoperations"), visualProperty(ShowOperations)); -+ conceptElement.setAttribute(QLatin1String("showpubliconly"), visualProperty(ShowPublicOnly)); -+ conceptElement.setAttribute(QLatin1String("showopsigs"), m_operationSignature); -+ conceptElement.setAttribute(QLatin1String("showpackage"), visualProperty(ShowPackage)); -+ conceptElement.setAttribute(QLatin1String("showscope"), visualProperty(ShowVisibility)); -+ conceptElement.setAttribute(QLatin1String("showattributes"), visualProperty(ShowAttributes)); -+ conceptElement.setAttribute(QLatin1String("showattsigs"), m_attributeSignature); -+#ifdef ENABLE_WIDGET_SHOW_DOC -+ conceptElement.setAttribute(QLatin1String("showdocumentation"),visualProperty(ShowDocumentation)); -+#endif -+ if (umlc && (umlc->isInterface() || umlc->isAbstract())) { -+ conceptElement.setAttribute(QLatin1String("drawascircle"), visualProperty(DrawAsCircle)); -+ if (visualProperty(DrawAsCircle) && m_pInterfaceName) { -+ m_pInterfaceName->saveToXMI(qDoc, conceptElement); -+ } -+ } -+ qElement.appendChild(conceptElement); -+} -+ -+/** -+ * Will be called when a menu selection has been made from the -+ * popup menu. -+ * -+ * @param action The action that has been selected. -+ */ -+void ClassifierWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch (sel) { -+ case ListPopupMenu::mt_Attribute: -+ case ListPopupMenu::mt_Operation: -+ case ListPopupMenu::mt_Template: -+ { -+ UMLObject::ObjectType ot = ListPopupMenu::convert_MT_OT(sel); -+ UMLClassifier *umlc = classifier(); -+ if (!umlc) { -+ uError() << "Internal error - classifier() returns NULL"; -+ return; -+ } -+ if (Object_Factory::createChildObject(umlc, ot)) { -+ updateGeometry(); -+ update(); -+ UMLApp::app()->document()->setModified(); -+ } -+ break; -+ } -+ case ListPopupMenu::mt_Show_Operations: -+ toggleVisualProperty(ShowOperations); -+ break; -+ -+ case ListPopupMenu::mt_Show_Attributes: -+ toggleVisualProperty(ShowAttributes); -+ break; -+ -+ case ListPopupMenu::mt_Show_Documentation: -+ toggleVisualProperty(ShowDocumentation); -+ break; -+ -+ case ListPopupMenu::mt_Show_Public_Only: -+ toggleVisualProperty(ShowPublicOnly); -+ break; -+ -+ case ListPopupMenu::mt_Show_Operation_Signature: -+ toggleVisualProperty(ShowOperationSignature); -+ break; -+ -+ case ListPopupMenu::mt_Show_Attribute_Signature: -+ toggleVisualProperty(ShowAttributeSignature); -+ break; -+ -+ case ListPopupMenu::mt_Visibility: -+ toggleVisualProperty(ShowVisibility); -+ break; -+ -+ case ListPopupMenu::mt_Show_Packages: -+ toggleVisualProperty(ShowPackage); -+ break; -+ -+ case ListPopupMenu::mt_Show_Stereotypes: -+ toggleVisualProperty(ShowStereotype); -+ break; -+ -+ case ListPopupMenu::mt_DrawAsCircle: -+ toggleVisualProperty(DrawAsCircle); -+ break; -+ -+ case ListPopupMenu::mt_ChangeToClass: -+ changeToClass(); -+ break; -+ -+ case ListPopupMenu::mt_ChangeToInterface: -+ changeToInterface(); -+ break; -+ -+ case ListPopupMenu::mt_ChangeToPackage: -+ changeToPackage(); -+ break; -+ -+ default: -+ UMLWidget::slotMenuSelection(action); -+ break; -+ } -+} -+ -+/** -+ * Slot to show/hide attributes based on \a state. -+ */ -+void ClassifierWidget::slotShowAttributes(bool state) -+{ -+ setVisualProperty(ShowAttributes, state); -+} -+ -+/** -+ * Slot to show/hide operations based on \a state. -+ */ -+void ClassifierWidget::slotShowOperations(bool state) -+{ -+ setVisualProperty(ShowOperations, state); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/classifierwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/classifierwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/classifierwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/classifierwidget.h 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,146 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef CLASSIFIERWIDGET_H -+#define CLASSIFIERWIDGET_H -+ -+#include "basictypes.h" -+#include "umlobject.h" -+#include "umlwidget.h" -+ -+class AssociationWidget; -+class FloatingTextWidget; -+class QPainter; -+class UMLClassifier; -+ -+/** -+ * @short Common implementation for class widget and interface widget -+ * -+ * @author Oliver Kellogg -+ * @author Gopala Krishna -+ * -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class ClassifierWidget : public UMLWidget -+{ -+ Q_OBJECT -+ Q_ENUMS(VisualProperty) -+public: -+ /** -+ * This enumeration lists the visual properties that can be easily -+ * set, reset and toggled and all these operate on an integer -+ * which stores all the flag status. -+ */ -+ enum VisualProperty { -+ ShowStereotype = 0x1, -+ ShowOperations = 0x2, -+ ShowPublicOnly = 0x4, -+ ShowVisibility = 0x8, -+ ShowPackage = 0x10, -+ ShowAttributes = 0x20, -+ DrawAsCircle = 0x40, -+ ShowOperationSignature = 0x60, ///< only in setter -+ ShowAttributeSignature = 0x80, ///< only in setter -+ DrawAsPackage = 0x100, -+ ShowDocumentation = 0x200, -+ }; -+ -+ Q_DECLARE_FLAGS(VisualProperties, VisualProperty) -+ -+ ClassifierWidget(UMLScene * scene, UMLClassifier * o); -+ ClassifierWidget(UMLScene * scene, UMLPackage * o); -+ virtual ~ClassifierWidget(); -+ -+ UMLClassifier *classifier() const; -+ -+ VisualProperties visualProperties() const; -+ void setVisualProperties(VisualProperties properties); -+ -+ bool visualProperty(VisualProperty property) const; -+ void setVisualProperty(VisualProperty property, bool enable = true); -+ void setVisualPropertyCmd(VisualProperty property, bool enable = true); -+ void toggleVisualProperty(VisualProperty property); -+ -+ int displayedAttributes() const; -+ int displayedOperations() const; -+ -+ Uml::SignatureType::Enum attributeSignature() const; -+ void setAttributeSignature(Uml::SignatureType::Enum sig); -+ -+ Uml::SignatureType::Enum operationSignature() const; -+ void setOperationSignature(Uml::SignatureType::Enum sig); -+ -+ void setShowAttSigs(bool _show); -+ void toggleShowAttSigs(); -+ -+ bool getDrawAsCircle() const; -+ void setDrawAsCircle(bool drawAsCircle); -+ void toggleDrawAsCircle(); -+ -+ void changeToClass(); -+ void changeToInterface(); -+ void changeToPackage(); -+ -+ AssociationWidget *classAssociationWidget() const; -+ void setClassAssociationWidget(AssociationWidget *assocwidget); -+// virtual void adjustAssociations(int x, int y); -+ -+ UMLWidget* onWidget(const QPointF& p); -+ UMLWidget* widgetWithID(Uml::ID::Type id); -+ -+ virtual void setDocumentation(const QString& doc); -+ -+ QSizeF calculateSize(bool withExtensions = true) const; -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ virtual QPainterPath shape() const; -+ -+ virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ virtual bool loadFromXMI(QDomElement & qElement); -+ -+public Q_SLOTS: -+ virtual void slotMenuSelection(QAction* action); -+ -+private Q_SLOTS: -+ void slotShowAttributes(bool state); -+ void slotShowOperations(bool state); -+ -+private: -+ void updateSignatureTypes(); -+ QSize calculateTemplatesBoxSize() const; -+ -+ QSizeF minimumSize() const; -+ -+ void drawAsCircle(QPainter *p, const QStyleOptionGraphicsItem *option); -+ QSize calculateAsCircleSize() const; -+ -+ void drawAsPackage(QPainter *painter, const QStyleOptionGraphicsItem *option); -+ QSize calculateAsPackageSize() const; -+ -+ int displayedMembers(UMLObject::ObjectType ot) const; -+ void drawMembers(QPainter *painter, UMLObject::ObjectType ot, Uml::SignatureType::Enum sigType, -+ int x, int y, int fontHeight); -+ -+ static const int MARGIN; ///< text width margin -+ static const int CIRCLE_SIZE; ///< size of circle when interface is rendered as such -+ static const int SOCKET_INCREMENT; ///< augmentation of circle for socket (required interface) -+ -+ VisualProperties m_visualProperties; -+ Uml::SignatureType::Enum m_attributeSignature; ///< Loaded/saved item. -+ Uml::SignatureType::Enum m_operationSignature; ///< Loaded/saved item. -+ AssociationWidget *m_pAssocWidget; ///< related AssociationWidget in case this classifier acts as an association class -+ FloatingTextWidget *m_pInterfaceName; ///< Separate widget for name in case of interface drawn as circle -+ -+}; -+ -+Q_DECLARE_OPERATORS_FOR_FLAGS(ClassifierWidget::VisualProperties) -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/combinedfragmentwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/combinedfragmentwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/combinedfragmentwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/combinedfragmentwidget.cpp 2015-10-08 11:48:59.508089026 +0300 -@@ -0,0 +1,477 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "combinedfragmentwidget.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "dialog_utils.h" -+#include "listpopupmenu.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "umlview.h" -+ -+// kde includes -+#include -+#if QT_VERSION < 0x050000 -+#include -+#endif -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+#include -+#include -+ -+/** -+ * Creates a Combined Fragment widget. -+ * -+ * @param scene The parent of the widget. -+ * @param combinedfragmentType The type of combined fragment. -+ * @param id The ID to assign (-1 will prompt a new ID.) -+ */ -+CombinedFragmentWidget::CombinedFragmentWidget(UMLScene * scene, CombinedFragmentType combinedfragmentType, Uml::ID::Type id) -+ : UMLWidget(scene, WidgetBase::wt_CombinedFragment, id) -+{ -+ setCombinedFragmentType(combinedfragmentType); -+} -+ -+/** -+ * Destructor. -+ */ -+CombinedFragmentWidget::~CombinedFragmentWidget() -+{ -+ for (QList::iterator it=m_dashLines.begin() ; it!=m_dashLines.end() ; ++it) { -+ delete(*it); -+ } -+} -+ -+/** -+ * Overrides the standard paint event. -+ */ -+void CombinedFragmentWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ int w = width(); -+ int h = height(); -+ int line_width = 45; -+ int old_Y; -+ -+ setPenFromSettings(painter); -+ -+ if (m_CombinedFragment == Ref) { -+ if (UMLWidget::useFillColor()) { -+ painter->setBrush(UMLWidget::fillColor()); -+ } -+ } -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ const QString combined_fragment_value = name(); -+ int textStartY = (h / 2) - (fontHeight / 2); -+ painter->drawRect(0, 0, w, h); -+ -+ painter->setPen(textColor()); -+ painter->setFont(UMLWidget::font()); -+ QString temp = QLatin1String("loop"); -+ -+ switch (m_CombinedFragment) -+ { -+ case Ref : -+ painter->drawText(COMBINED_FRAGMENT_MARGIN, textStartY, w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignCenter, combined_fragment_value); -+ painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("ref")); -+ break; -+ -+ case Opt : -+ painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -+ w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("opt")); -+ break; -+ -+ case Break : -+ painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -+ w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("break")); -+ break; -+ -+ case Loop : -+ if (combined_fragment_value != QLatin1String("-")) -+ { -+ temp += QLatin1String(" [") + combined_fragment_value + QLatin1Char(']'); -+ line_width += (combined_fragment_value.size() + 2) * 8; -+ } -+ painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, temp); -+ -+ break; -+ -+ case Neg : -+ painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -+ w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("neg")); -+ break; -+ -+ case Crit : -+ painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -+ w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("critical")); -+ break; -+ -+ case Ass : -+ painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -+ w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("assert")); -+ break; -+ -+ case Alt : -+ if (combined_fragment_value != QLatin1String("-")) -+ { -+ temp = QLatin1Char('[') + combined_fragment_value + QLatin1Char(']'); -+ painter->drawText(COMBINED_FRAGMENT_MARGIN, 20, w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, temp); -+ if (m_dashLines.size() == 1 && m_dashLines.first()->y() < y() + 20 + fontHeight) -+ m_dashLines.first()->setY(y() + h/2); -+ } -+ painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -+ w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("alt")); -+ // dash lines -+ //m_dashLines.first()->paint(painter); -+ // TODO: move to UMLWidget::calculateSize api -+ for (QList::iterator it=m_dashLines.begin() ; it!=m_dashLines.end() ; ++it) { -+ (*it)->setX(x()); -+ old_Y = (*it)->getYMin(); -+ (*it)->setYMin(y()); -+ (*it)->setYMax(y() + height()); -+ (*it)->setY(y() + (*it)->y() - old_Y); -+ (*it)->setSize(w, (*it)->height()); -+ (*it)->setLineColor(lineColor()); -+ (*it)->setLineWidth(lineWidth()); -+ } -+ -+ break; -+ -+ case Par : -+ painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -+ w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("parallel")); -+ // dash lines -+ if (m_dashLines.size() != 0) { -+ //m_dashLines.first()->paint(painter); -+ // TODO: move to UMLWidget::calculateSize api -+ for (QList::iterator it=m_dashLines.begin() ; it!=m_dashLines.end() ; ++it) { -+ (*it)->setX(x()); -+ old_Y = (*it)->getYMin(); -+ (*it)->setYMin(y()); -+ (*it)->setYMax(y() + height()); -+ (*it)->setY(y() + (*it)->y() - old_Y); -+ (*it)->setSize(w, (*it)->height()); -+ (*it)->setLineColor(lineColor()); -+ (*it)->setLineWidth(lineWidth()); -+ } -+ } -+ break; -+ -+ default : break; -+ } -+ -+ setPenFromSettings(painter); -+ painter->drawLine(0, 20, line_width, 20); -+ painter->drawLine(line_width, 20, line_width + 10, 10); -+ painter->drawLine(line_width + 10, 10, line_width + 10, 0); -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF CombinedFragmentWidget::minimumSize() const -+{ -+ int width = 10, height = 10; -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ const int textWidth = fm.width(name()); -+ height = fontHeight; -+ width = textWidth + 60 > COMBINED_FRAGMENT_WIDTH ? textWidth + 60: COMBINED_FRAGMENT_WIDTH; -+ if (m_CombinedFragment == Loop) -+ width += int((float)textWidth * 0.4f); -+ if (m_CombinedFragment == Alt) -+ height += fontHeight + 40; -+ height = height > COMBINED_FRAGMENT_HEIGHT ? height : COMBINED_FRAGMENT_HEIGHT; -+ width += COMBINED_FRAGMENT_MARGIN * 2; -+ height += COMBINED_FRAGMENT_MARGIN * 2; -+ -+ return QSizeF(width, height); -+} -+ -+/** -+ * Returns the type of combined fragment. -+ */ -+CombinedFragmentWidget::CombinedFragmentType CombinedFragmentWidget::combinedFragmentType() const -+{ -+ return m_CombinedFragment; -+} -+ -+/** -+ * Sets the type of combined fragment. -+ */ -+void CombinedFragmentWidget::setCombinedFragmentType(CombinedFragmentType combinedfragmentType) -+{ -+ m_CombinedFragment = combinedfragmentType; -+ UMLWidget::m_resizable = true ; //(m_CombinedFragment == Normal); -+ // creates a dash line if the combined fragment type is alternative or parallel -+ if (m_CombinedFragment == Alt && m_dashLines.isEmpty()) -+ { -+ m_dashLines.push_back(new FloatingDashLineWidget(m_scene, Uml::ID::None, this)); -+ if (m_CombinedFragment == Alt) -+ { -+ m_dashLines.back()->setText(QLatin1String("else")); -+ } -+ // TODO: move to UMLWidget::calculateSize api -+ m_dashLines.back()->setX(x()); -+ m_dashLines.back()->setYMin(y()); -+ m_dashLines.back()->setYMax(y() + height()); -+ m_dashLines.back()->setY(y() + height()/2); -+ m_dashLines.back()->setSize(width(), m_dashLines.back()->height()); -+ m_scene->widgetList().append(m_dashLines.back()); -+ } -+} -+ -+/** -+ * Returns the type of combined fragment. -+ */ -+CombinedFragmentWidget::CombinedFragmentType CombinedFragmentWidget::combinedFragmentType(const QString& type) const -+{ -+ if (type == QLatin1String("Reference")) -+ return (CombinedFragmentWidget::Ref); -+ if (type == QLatin1String("Option")) -+ return (CombinedFragmentWidget::Opt); -+ if (type == QLatin1String("Break")) -+ return (CombinedFragmentWidget::Break); -+ if (type == QLatin1String("Loop")) -+ return (CombinedFragmentWidget::Loop); -+ if (type == QLatin1String("Negative")) -+ return (CombinedFragmentWidget::Neg); -+ if (type == QLatin1String("Critical")) -+ return (CombinedFragmentWidget::Crit); -+ if (type == QLatin1String("Assertion")) -+ return (CombinedFragmentWidget::Ass); -+ if (type == QLatin1String("Alternative")) -+ return (CombinedFragmentWidget::Alt); -+ if (type == QLatin1String("Parallel")) -+ return (CombinedFragmentWidget::Par); -+ // Shouldn't happen -+ Q_ASSERT(0); -+ return (CombinedFragmentWidget::Ref); -+} -+ -+/** -+ * Sets the type of combined fragment. -+ */ -+void CombinedFragmentWidget::setCombinedFragmentType(const QString& combinedfragmentType) -+{ -+ setCombinedFragmentType(combinedFragmentType(combinedfragmentType)); -+} -+ -+/** -+ * ... -+ */ -+void CombinedFragmentWidget::askNameForWidgetType(UMLWidget* &targetWidget, const QString& dialogTitle, -+ const QString& dialogPrompt, const QString& defaultName) -+{ -+ Q_UNUSED(defaultName); -+ bool pressedOK = false; -+ const QStringList list = QStringList() -+ << QLatin1String("Reference") -+ << QLatin1String("Option") -+ << QLatin1String("Break") -+ << QLatin1String("Loop") -+ << QLatin1String("Negative") -+ << QLatin1String("Critical") -+ << QLatin1String("Assertion") -+ << QLatin1String("Alternative") -+ << QLatin1String("Parallel") ; -+#if QT_VERSION >= 0x050000 -+ QPointer inputDlg = new QInputDialog(); -+ inputDlg->setComboBoxItems(list); -+ inputDlg->setOptions(QInputDialog::UseListViewForComboBoxItems); -+ inputDlg->setWindowTitle(dialogTitle); -+ inputDlg->setLabelText(dialogPrompt); -+ pressedOK = inputDlg->exec(); -+ QStringList result; -+ result.append(inputDlg->textValue()); -+ delete inputDlg; -+#else -+ const QStringList select = list; -+ QStringList result = KInputDialog::getItemList (dialogTitle, dialogPrompt, list, select, false, &pressedOK, UMLApp::app()); -+#endif -+ if (pressedOK) { -+ QString type = result.join(QString()); -+ dynamic_cast(targetWidget)->setCombinedFragmentType(type); -+ if (type == QLatin1String("Reference")) -+ Dialog_Utils::askNameForWidget(targetWidget, i18n("Enter the name of the diagram referenced"), i18n("Enter the name of the diagram referenced"), i18n("Diagram name")); -+ else if (type == QLatin1String(QLatin1String("Loop"))) -+ Dialog_Utils::askNameForWidget(targetWidget, i18n("Enter the guard of the loop"), i18n("Enter the guard of the loop"), i18n("-")); -+ else if (type == QLatin1String("Alternative")) -+ Dialog_Utils::askNameForWidget(targetWidget, i18n("Enter the first alternative name"), i18n("Enter the first alternative name"), i18n("-")); -+ } else { -+ targetWidget->cleanup(); -+ delete targetWidget; -+ targetWidget = NULL; -+ } -+} -+ -+/** -+ * Saves the widget to the "combinedFragmentwidget" XMI element. -+ */ -+void CombinedFragmentWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement combinedFragmentElement = qDoc.createElement(QLatin1String("combinedFragmentwidget")); -+ UMLWidget::saveToXMI(qDoc, combinedFragmentElement); -+ combinedFragmentElement.setAttribute(QLatin1String("combinedFragmentname"), m_Text); -+ combinedFragmentElement.setAttribute(QLatin1String("documentation"), m_Doc); -+ combinedFragmentElement.setAttribute(QLatin1String("CombinedFragmenttype"), m_CombinedFragment); -+ -+ // save the corresponding floating dash lines -+ for (QList::iterator it = m_dashLines.begin() ; it != m_dashLines.end() ; ++it) { -+ (*it)-> saveToXMI(qDoc, combinedFragmentElement); -+ } -+ -+ qElement.appendChild(combinedFragmentElement); -+} -+ -+/** -+ * Loads the widget from the "CombinedFragmentwidget" XMI element. -+ */ -+bool CombinedFragmentWidget::loadFromXMI(QDomElement & qElement) -+{ -+ if (!UMLWidget::loadFromXMI(qElement)) -+ return false; -+ m_Text = qElement.attribute(QLatin1String("combinedFragmentname")); -+ m_Doc = qElement.attribute(QLatin1String("documentation")); -+ QString type = qElement.attribute(QLatin1String("CombinedFragmenttype")); -+ -+ //now load child elements -+ QDomNode node = qElement.firstChild(); -+ QDomElement element = node.toElement(); -+ while (!element.isNull()) { -+ QString tag = element.tagName(); -+ if (tag == QLatin1String("floatingdashlinewidget")) { -+ FloatingDashLineWidget * fdlwidget = new FloatingDashLineWidget(m_scene, Uml::ID::None, this); -+ m_dashLines.push_back(fdlwidget); -+ if (!fdlwidget->loadFromXMI(element)) { -+ // Most likely cause: The FloatingTextWidget is empty. -+ delete m_dashLines.back(); -+ return false; -+ } -+ else { -+ m_scene->widgetList().append(fdlwidget); -+ fdlwidget->clipSize(); -+ } -+ } else { -+ uError() << "unknown tag " << tag; -+ } -+ node = node.nextSibling(); -+ element = node.toElement(); -+ } -+ // m_dashLines = listline; -+ setCombinedFragmentType((CombinedFragmentType)type.toInt()); -+ -+ return true; -+} -+ -+void CombinedFragmentWidget::removeDashLine(FloatingDashLineWidget *line) -+{ -+ if (m_dashLines.contains(line)) -+ m_dashLines.removeOne(line); -+} -+ -+/** -+ * Overrides the function from UMLWidget. Deletes all FloatingDashLineWidgets -+ * that are associated with this instance. -+ */ -+void CombinedFragmentWidget::cleanup() -+{ -+ foreach (FloatingDashLineWidget* w, m_dashLines) -+ { -+ if (!w->isSelected()) { -+ // no need to make this undoable, since the dashlines will be -+ // reconstructed when deleting the combined fragment is undone. -+ umlScene()->removeWidgetCmd(w); -+ } -+ } -+} -+ -+/** -+ * Overrides the function from UMLWidget. -+ * -+ * @param action The command to be executed. -+ */ -+void CombinedFragmentWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch (sel) { -+ // for alternative or parallel combined fragments -+ case ListPopupMenu::mt_AddInteractionOperand: -+ m_dashLines.push_back(new FloatingDashLineWidget(m_scene, Uml::ID::None, this)); -+ if (m_CombinedFragment == Alt) -+ { -+ m_dashLines.back()->setText(QLatin1String("else")); -+ } -+ // TODO: move to UMLWidget::calculateSize api -+ m_dashLines.back()->setX(x()); -+ m_dashLines.back()->setYMin(y()); -+ m_dashLines.back()->setYMax(y() + height()); -+ m_dashLines.back()->setY(y() + height() / 2); -+ m_dashLines.back()->setSize(width(), m_dashLines.back()->height()); -+ m_scene->setupNewWidget(m_dashLines.back()); -+ break; -+ -+ case ListPopupMenu::mt_Rename: -+ { -+ bool ok = false; -+ QString name = m_Text; -+ -+#if QT_VERSION >= 0x050000 -+ if (m_CombinedFragment == Alt) { -+ name = QInputDialog::getText(Q_NULLPTR, -+ i18n("Enter first alternative"), i18n("Enter first alternative :"), -+ QLineEdit::Normal, -+ m_Text, &ok); -+ } -+ else if (m_CombinedFragment == Ref) { -+ name = QInputDialog::getText(Q_NULLPTR, -+ i18n("Enter referenced diagram name"), i18n("Enter referenced diagram name :"), -+ QLineEdit::Normal, -+ m_Text, &ok); -+ } -+ else if (m_CombinedFragment == Loop) { -+ name = QInputDialog::getText(Q_NULLPTR, -+ i18n("Enter the guard of the loop"), i18n("Enter the guard of the loop:"), -+ QLineEdit::Normal, -+ m_Text, &ok); -+ } -+#else -+ if (m_CombinedFragment == Alt) { -+ name = KInputDialog::getText(i18n("Enter first alternative"), i18n("Enter first alternative :"), m_Text, &ok); -+ } -+ else if (m_CombinedFragment == Ref) { -+ name = KInputDialog::getText(i18n("Enter referenced diagram name"), i18n("Enter referenced diagram name :"), m_Text, &ok); -+ } -+ else if (m_CombinedFragment == Loop) { -+ name = KInputDialog::getText(i18n("Enter the guard of the loop"), i18n("Enter the guard of the loop:"), m_Text, &ok); -+ } -+#endif -+ if (ok && name.length() > 0) -+ m_Text = name; -+ } -+ break; -+ -+ default: -+ UMLWidget::slotMenuSelection(action); -+ } -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/combinedfragmentwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/combinedfragmentwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/combinedfragmentwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/combinedfragmentwidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,91 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef COMBINEDFRAGMENTWIDGET_H -+#define COMBINEDFRAGMENTWIDGET_H -+ -+#include "umlwidget.h" -+#include "worktoolbar.h" -+#include "floatingdashlinewidget.h" -+ -+#include -+ -+#define COMBINED_FRAGMENT_MARGIN 5 -+#define COMBINED_FRAGMENT_WIDTH 100 -+#define COMBINED_FRAGMENT_HEIGHT 50 -+ -+/** -+ * This class is the graphical version of a UML combined fragment. A combinedfragmentWidget is created -+ * by a @ref UMLView. An combinedfragmentWidget belongs to only one @ref UMLView instance. -+ * When the @ref UMLView instance that this class belongs to, it will be automatically deleted. -+ * -+ * The combinedfragmentWidget class inherits from the @ref UMLWidget class which adds most of the functionality -+ * to this class. -+ * -+ * @short A graphical version of a UML combined fragment. -+ * @author Hassan KOUCH -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class CombinedFragmentWidget : public UMLWidget -+{ -+ Q_OBJECT -+ -+public: -+ enum CombinedFragmentType -+ { -+ Ref = 0, -+ Opt, -+ Break, -+ Loop, -+ Neg, -+ Crit, -+ Ass, -+ Alt, -+ Par -+ }; -+ -+ explicit CombinedFragmentWidget(UMLScene * scene, -+ CombinedFragmentType combinedfragmentType = Ref, -+ Uml::ID::Type id = Uml::ID::None); -+ virtual ~CombinedFragmentWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ CombinedFragmentType combinedFragmentType() const; -+ CombinedFragmentType combinedFragmentType(const QString& combinedfragmentType) const; -+ void setCombinedFragmentType(CombinedFragmentType combinedfragmentType); -+ void setCombinedFragmentType(const QString& combinedfragmentType); -+ -+ void askNameForWidgetType(UMLWidget* &targetWidget, const QString& dialogTitle, -+ const QString& dialogPrompt, const QString& defaultName); -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ bool loadFromXMI(QDomElement & qElement); -+ void removeDashLine(FloatingDashLineWidget *line); -+ -+ virtual void cleanup(); -+ -+public slots: -+ void slotMenuSelection(QAction* action); -+ -+ -+protected: -+ QSizeF minimumSize() const; -+ -+ /// Type of CombinedFragment. -+ CombinedFragmentType m_CombinedFragment; -+ -+private: -+ /// Dash lines of an alternative or parallel combined fragment -+ QList m_dashLines ; -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/componentwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/componentwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/componentwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/componentwidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,207 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "componentwidget.h" -+ -+// app includes -+#include "component.h" -+#include "debug_utils.h" -+#include "umlscene.h" -+#include "umlview.h" -+#include "optionstate.h" -+#include "umldoc.h" -+#include "package.h" -+#include "portwidget.h" -+ -+/** -+ * Constructs a ComponentWidget. -+ * -+ * @param scene The parent of this ComponentWidget. -+ * @param c The UMLComponent this will be representing. -+ */ -+ComponentWidget::ComponentWidget(UMLScene * scene, UMLComponent *c) -+ : UMLWidget(scene, WidgetBase::wt_Component, c) -+{ -+ setSize(100, 30); -+ //set defaults from m_scene -+ if (m_scene) { -+ //check to see if correct -+ const Settings::OptionState& ops = m_scene->optionState(); -+ m_showStereotype = ops.classState.showStereoType; -+ } -+} -+ -+/** -+ * Destructor. -+ */ -+ComponentWidget::~ComponentWidget() -+{ -+} -+ -+/** -+ * Reimplemented from UMLWidget::paint to paint component -+ * widget. -+ */ -+void ComponentWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ UMLComponent *umlcomp = static_cast(m_umlObject); -+ if (umlcomp == NULL) -+ return; -+ setPenFromSettings(painter); -+ QPen origPen = painter->pen(); -+ QPen pen = origPen; -+ if (umlcomp->getExecutable()) { -+ pen.setWidth(origPen.width() + 2); -+ painter->setPen(pen); -+ } -+ if (UMLWidget::useFillColor()) { -+ painter->setBrush(UMLWidget::fillColor()); -+ } else { -+ painter->setBrush(m_scene->backgroundColor()); -+ } -+ -+ const int w = width(); -+ const int h = height(); -+ const int halfHeight = h / 2; -+ int textXOffset = 0; -+ QFont font = UMLWidget::font(); -+ font.setBold(true); -+ const QFontMetrics &fm = getFontMetrics(FT_BOLD); -+ const int fontHeight = fm.lineSpacing(); -+ QString nameStr = name(); -+ const QString stereotype = m_umlObject->stereotype(); -+ -+ if (Settings::optionState().generalState.uml2) { -+ painter->drawRect(0, 0, w, h); -+ // draw small component symbol in upper right corner -+ painter->setPen(origPen); -+ painter->drawRect(w - 17, 5, 11, 13); -+ painter->drawRect(w - 19, 7, 2, 2); -+ painter->drawRect(w - 19, 11, 2, 2); -+ painter->setPen(pen); -+ } else { -+ painter->drawRect(2*COMPONENT_MARGIN, 0, w - 2*COMPONENT_MARGIN, h); -+ painter->drawRect(0, halfHeight - fontHeight/2 - fontHeight, COMPONENT_MARGIN*4, fontHeight); -+ painter->drawRect(0, halfHeight + fontHeight/2, COMPONENT_MARGIN*4, fontHeight); -+ textXOffset = COMPONENT_MARGIN * 4; -+ } -+ -+ painter->setPen(textColor()); -+ painter->setFont(font); -+ -+ int lines = 1; -+ -+ if (!stereotype.isEmpty()) { -+ painter->drawText(textXOffset, halfHeight - fontHeight, -+ w - textXOffset, fontHeight, Qt::AlignCenter, -+ m_umlObject->stereotype(true)); -+ lines = 2; -+ } -+ -+ if (UMLWidget::isInstance()) { -+ font.setUnderline(true); -+ painter->setFont(font); -+ nameStr = UMLWidget::instanceName() + QLatin1String(" : ") + nameStr; -+ } -+ -+ if (lines == 1) { -+ painter->drawText(textXOffset, halfHeight - (fontHeight/2), -+ w - textXOffset, fontHeight, Qt::AlignCenter, nameStr); -+ } else { -+ painter->drawText(textXOffset, halfHeight, -+ w - textXOffset, fontHeight, Qt::AlignCenter, nameStr); -+ } -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Overridden from UMLWidget due to emission of signal sigCompMoved() -+ */ -+void ComponentWidget::moveWidgetBy(qreal diffX, qreal diffY) -+{ -+ UMLWidget::moveWidgetBy(diffX, diffY); -+ emit sigCompMoved(diffX, diffY); -+} -+ -+/** -+ * Override method from UMLWidget for adjustment of attached PortWidgets. -+ */ -+void ComponentWidget::adjustAssocs(qreal dx, qreal dy) -+{ -+ if (m_doc->loading()) { -+ // don't recalculate the assocs during load of XMI -+ // -> return immediately without action -+ return; -+ } -+ UMLWidget::adjustAssocs(dx, dy); -+ UMLPackage *comp = static_cast(m_umlObject); -+ foreach (UMLObject *o, comp->containedObjects()) { -+ uIgnoreZeroPointer(o); -+ if (o->baseType() != UMLObject::ot_Port) -+ continue; -+ UMLWidget *portW = m_scene->widgetOnDiagram(o->id()); -+ if (portW) -+ portW->adjustAssocs(dx, dy); -+ } -+} -+ -+/** -+ * Saves to the "componentwidget" XMI element. -+ */ -+void ComponentWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement conceptElement = qDoc.createElement(QLatin1String("componentwidget")); -+ UMLWidget::saveToXMI(qDoc, conceptElement); -+ qElement.appendChild(conceptElement); -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF ComponentWidget::minimumSize() const -+{ -+ if (!m_umlObject) { -+ return QSizeF(70, 70); -+ } -+ const QFontMetrics &fm = getFontMetrics(FT_BOLD_ITALIC); -+ const int fontHeight = fm.lineSpacing(); -+ -+ QString name = m_umlObject->name(); -+ if (UMLWidget::isInstance()) { -+ name = UMLWidget::instanceName() + QLatin1String(" : ") + name; -+ } -+ -+ int width = fm.width(name); -+ -+ int stereoWidth = 0; -+ if (!m_umlObject->stereotype().isEmpty()) { -+ stereoWidth = fm.width(m_umlObject->stereotype(true)); -+ } -+ if (stereoWidth > width) -+ width = stereoWidth; -+ width += COMPONENT_MARGIN * 6; -+ width = 70>width ? 70 : width; //minumin width of 70 -+ -+ int height = (2*fontHeight) + (COMPONENT_MARGIN * 3); -+ -+ UMLComponent *umlcomp = static_cast(m_umlObject); -+ if (umlcomp && umlcomp->getExecutable()) { -+ width += 2; -+ height += 2; -+ } -+ -+ return QSizeF(width, height); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/componentwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/componentwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/componentwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/componentwidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,58 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef COMPONENTWIDGET_H -+#define COMPONENTWIDGET_H -+ -+#include "umlwidget.h" -+ -+class UMLComponent; -+ -+#define COMPONENT_MARGIN 10 -+ -+/** -+ * Defines a graphical version of the Component. Most of the functionality -+ * will come from the @ref UMLComponent class. -+ * -+ * @short A graphical version of a Component. -+ * @author Jonathan Riddell -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class ComponentWidget : public UMLWidget -+{ -+ Q_OBJECT -+public: -+ ComponentWidget(UMLScene * scene, UMLComponent *c); -+ virtual ~ComponentWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ virtual void moveWidgetBy(qreal diffX, qreal diffY); -+ virtual void adjustAssocs(qreal dx, qreal dy); -+ -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+signals: -+ /** -+ * Emitted when the component widget is moved. -+ * Provides the delta X and delta Y amount by which the widget was moved -+ * relative to the previous position. -+ * Slots into PortWidget::slotCompMoved() -+ * @param diffX The difference between previous and new X value. -+ * @param diffY The difference between previous and new Y value. -+ */ -+ void sigCompMoved(qreal diffX, qreal diffY); -+ -+protected: -+ QSizeF minimumSize() const; -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/datatypewidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/datatypewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/datatypewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/datatypewidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,129 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "datatypewidget.h" -+ -+// app includes -+#include "classifier.h" -+#include "classifierlistitem.h" -+#include "debug_utils.h" -+#include "operation.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "umlview.h" -+ -+// qt includes -+#include -+ -+/** -+ * Constructs an DatatypeWidget. -+ * -+ * @param scene The parent of this DatatypeWidget. -+ * @param d The UMLClassifier this will be representing. -+ */ -+DatatypeWidget::DatatypeWidget(UMLScene *scene, UMLClassifier *d) -+ : UMLWidget(scene, WidgetBase::wt_Datatype, d) -+{ -+ setSize(100, 30); -+} -+ -+/** -+ * Standard deconstructor. -+ */ -+DatatypeWidget::~DatatypeWidget() -+{ -+} -+ -+/** -+ * Overrides standard method. -+ */ -+void DatatypeWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) { -+ painter->setBrush(UMLWidget::fillColor()); -+ } else { -+ painter->setBrush(m_scene->backgroundColor()); -+ } -+ -+ int w = width(); -+ int h = height(); -+ -+ QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ int fontHeight = fm.lineSpacing(); -+ -+ painter->drawRect(0, 0, w, h); -+ painter->setPen(textColor()); -+ -+ QFont font = UMLWidget::font(); -+ font.setBold(true); -+ painter->setFont(font); -+ painter->drawText(DATATYPE_MARGIN, 0, -+ w - DATATYPE_MARGIN* 2, fontHeight, -+ Qt::AlignCenter, m_umlObject->stereotype(true)); -+ -+ font.setItalic(m_umlObject->isAbstract()); -+ painter->setFont(font); -+ painter->drawText(DATATYPE_MARGIN, fontHeight, -+ w - DATATYPE_MARGIN * 2, fontHeight, Qt::AlignCenter, name()); -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Loads from a "datatypewidget" XMI element. -+ */ -+bool DatatypeWidget::loadFromXMI(QDomElement & qElement) -+{ -+ return UMLWidget::loadFromXMI(qElement); -+} -+ -+/** -+ * Saves to the "datatypewidget" XMI element. -+ */ -+void DatatypeWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement conceptElement = qDoc.createElement(QLatin1String("datatypewidget")); -+ UMLWidget::saveToXMI(qDoc, conceptElement); -+ qElement.appendChild(conceptElement); -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF DatatypeWidget::minimumSize() const -+{ -+ if (!m_umlObject) { -+ return UMLWidget::minimumSize(); -+ } -+ int width, height; -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ -+ int lines = 1;//always have one line - for name -+ lines++; //for the stereotype -+ -+ height = width = 0; -+ height += lines * fontHeight; -+ -+ //now set the width of the concept -+ //set width to name to start with -+ //set width to name to start with -+ width = getFontMetrics(FT_BOLD_ITALIC).boundingRect(m_umlObject->fullyQualifiedName()).width(); -+ int w = getFontMetrics(FT_BOLD).boundingRect(m_umlObject->stereotype(true)).width(); -+ -+ width = w > width?w:width; -+ -+ //allow for width margin -+ width += DATATYPE_MARGIN * 2; -+ -+ return QSizeF(width, height); -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/datatypewidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/datatypewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/datatypewidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/datatypewidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,48 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef DATATYPEWIDGET_H -+#define DATATYPEWIDGET_H -+ -+#include "umlwidget.h" -+ -+class UMLClassifier; -+ -+#define DATATYPE_MARGIN 5 -+ -+/** -+ * Defines a graphical version of the datatype. Most of the functionality -+ * will come from the @ref UMLWidget class from which class inherits from. -+ * -+ * @short A graphical version of an datatype. -+ * @author Jonathan Riddell -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class DatatypeWidget : public UMLWidget -+{ -+ Q_OBJECT -+public: -+ DatatypeWidget(UMLScene *scene, UMLClassifier *d); -+ virtual ~DatatypeWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ bool loadFromXMI(QDomElement& qElement); -+ void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+public Q_SLOTS: -+ -+protected: -+ QSizeF minimumSize() const; -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/entitywidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/entitywidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/entitywidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/entitywidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,246 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "entitywidget.h" -+ -+// app includes -+#include "classifier.h" -+#include "classifierlistitem.h" -+#include "debug_utils.h" -+#include "entity.h" -+#include "entityattribute.h" -+#include "foreignkeyconstraint.h" -+#include "listpopupmenu.h" -+#include "object_factory.h" -+#include "uml.h" -+#include "umlclassifierlistitemlist.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "umlview.h" -+#include "uniqueconstraint.h" -+ -+/** -+ * Constructs an EntityWidget. -+ * -+ * @param scene The parent of this EntityWidget. -+ * @param o The UMLObject this will be representing. -+ */ -+EntityWidget::EntityWidget(UMLScene *scene, UMLObject* o) -+ : UMLWidget(scene, WidgetBase::wt_Entity, o) -+{ -+ setSize(100, 30); -+} -+ -+/** -+ * Destructor. -+ */ -+EntityWidget::~EntityWidget() -+{ -+} -+ -+/** -+ * Draws the entity as a rectangle with a box underneith with a list of literals -+ */ -+void EntityWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ setPenFromSettings(painter); -+ if(UMLWidget::useFillColor()) -+ painter->setBrush(UMLWidget::fillColor()); -+ else -+ painter->setBrush(m_scene->backgroundColor()); -+ -+ const int w = width(); -+ const int h = height(); -+ -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ int fontHeight = fm.lineSpacing(); -+ const QString name = this->name(); -+ -+ painter->drawRect(0, 0, w, h); -+ painter->setPen(textColor()); -+ -+ QFont font = UMLWidget::font(); -+ font.setBold(true); -+ painter->setFont(font); -+ int y = 0; -+ if (!m_umlObject->stereotype().isEmpty()) { -+ painter->drawText(ENTITY_MARGIN, 0, -+ w - ENTITY_MARGIN * 2, fontHeight, -+ Qt::AlignCenter, m_umlObject->stereotype(true)); -+ font.setItalic(m_umlObject->isAbstract()); -+ painter->setFont(font); -+ painter->drawText(ENTITY_MARGIN, fontHeight, -+ w - ENTITY_MARGIN * 2, fontHeight, Qt::AlignCenter, name); -+ font.setBold(false); -+ font.setItalic(false); -+ painter->setFont(font); -+ y = fontHeight * 2; -+ } else { -+ font.setItalic(m_umlObject->isAbstract()); -+ painter->setFont(font); -+ painter->drawText(ENTITY_MARGIN, 0, -+ w - ENTITY_MARGIN * 2, fontHeight, Qt::AlignCenter, name); -+ font.setBold(false); -+ font.setItalic(false); -+ painter->setFont(font); -+ -+ y = fontHeight; -+ } -+ -+ setPenFromSettings(painter); -+ -+ painter->drawLine(0, y, w, y); -+ -+ QFontMetrics fontMetrics(font); -+ UMLClassifier *classifier = (UMLClassifier*)m_umlObject; -+ UMLClassifierListItem* entityattribute = 0; -+ UMLClassifierListItemList list = classifier->getFilteredList(UMLObject::ot_EntityAttribute); -+ foreach (entityattribute, list) { -+ QString text = entityattribute->name(); -+ painter->setPen(textColor()); -+ UMLEntityAttribute* casted = dynamic_cast(entityattribute); -+ if(casted && casted->indexType() == UMLEntityAttribute::Primary) -+ { -+ font.setUnderline(true); -+ painter->setFont(font); -+ font.setUnderline(false); -+ } -+ painter->drawText(ENTITY_MARGIN, y, -+ fontMetrics.width(text), fontHeight, Qt::AlignVCenter, text); -+ painter->setFont(font); -+ y+=fontHeight; -+ } -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Saves to the "entitywidget" XMI element. -+ */ -+void EntityWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement conceptElement = qDoc.createElement(QLatin1String("entitywidget")); -+ UMLWidget::saveToXMI(qDoc, conceptElement); -+ qElement.appendChild(conceptElement); -+} -+ -+/** -+ * Will be called when a menu selection has been made from the popup -+ * menu. -+ * -+ * @param action The action that has been selected. -+ */ -+void EntityWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch(sel) { -+ case ListPopupMenu::mt_EntityAttribute: -+ if (Object_Factory::createChildObject(static_cast(m_umlObject), -+ UMLObject::ot_EntityAttribute)) { -+ UMLApp::app()->document()->setModified(); -+ } -+ break; -+ -+ case ListPopupMenu::mt_PrimaryKeyConstraint: -+ case ListPopupMenu::mt_UniqueConstraint: -+ if (UMLObject* obj = Object_Factory::createChildObject(static_cast(m_umlObject), -+ UMLObject::ot_UniqueConstraint)) { -+ UMLApp::app()->document()->setModified(); -+ -+ if (sel == ListPopupMenu::mt_PrimaryKeyConstraint) { -+ UMLUniqueConstraint* uc = static_cast(obj); -+ static_cast(m_umlObject)->setAsPrimaryKey(uc); -+ } -+ } -+ break; -+ -+ case ListPopupMenu::mt_ForeignKeyConstraint: -+ if (Object_Factory::createChildObject(static_cast(m_umlObject), -+ UMLObject::ot_ForeignKeyConstraint)) { -+ UMLApp::app()->document()->setModified(); -+ -+ } -+ break; -+ -+ case ListPopupMenu::mt_CheckConstraint: -+ if (Object_Factory::createChildObject(static_cast(m_umlObject), -+ UMLObject::ot_CheckConstraint)) { -+ UMLApp::app()->document()->setModified(); -+ -+ } -+ break; -+ -+ default: -+ UMLWidget::slotMenuSelection(action); -+ } -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF EntityWidget::minimumSize() const -+{ -+ if (!m_umlObject) { -+ return UMLWidget::minimumSize(); -+ } -+ -+ int width, height; -+ QFont font = UMLWidget::font(); -+ font.setItalic(false); -+ font.setUnderline(false); -+ font.setBold(false); -+ const QFontMetrics fm(font); -+ -+ const int fontHeight = fm.lineSpacing(); -+ -+ int lines = 1;//always have one line - for name -+ if (!m_umlObject->stereotype().isEmpty()) { -+ lines++; -+ } -+ -+ const int numberOfEntityAttributes = ((UMLEntity*)m_umlObject)->entityAttributes(); -+ -+ height = width = 0; -+ //set the height of the entity -+ -+ lines += numberOfEntityAttributes; -+ if (numberOfEntityAttributes == 0) { -+ height += fontHeight / 2; //no entity literals, so just add a bit of space -+ } -+ -+ height += lines * fontHeight; -+ -+ //now set the width of the concept -+ //set width to name to start with -+ // FIXME spaces to get round beastie with font width, -+ // investigate UMLWidget::getFontMetrics() -+ width = getFontMetrics(FT_BOLD_ITALIC).boundingRect(QLatin1Char(' ') + name() + -+ QLatin1Char(' ')).width(); -+ const int w = getFontMetrics(FT_BOLD).boundingRect(m_umlObject->stereotype(true)).width(); -+ -+ width = w > width ? w : width; -+ -+ UMLClassifier* classifier = (UMLClassifier*)m_umlObject; -+ UMLClassifierListItemList list = classifier->getFilteredList(UMLObject::ot_EntityAttribute); -+ UMLClassifierListItem* listItem = 0; -+ foreach (listItem, list) { -+ int w = fm.width(listItem->name()); -+ width = w > width?w:width; -+ } -+ -+ //allow for width margin -+ width += ENTITY_MARGIN * 2; -+ -+ return QSizeF(width, height); -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/entitywidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/entitywidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/entitywidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/entitywidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,49 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ENTITYWIDGET_H -+#define ENTITYWIDGET_H -+ -+#include "umlwidget.h" -+ -+class UMLScene; -+ -+#define ENTITY_MARGIN 5 -+ -+/** -+ * Defines a graphical version of the entity. Most of the functionality -+ * will come from the @ref UMLWidget class from which class inherits from. -+ * -+ * @short A graphical version of an entity. -+ * @author Jonathan Riddell -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class EntityWidget : public UMLWidget -+{ -+ Q_OBJECT -+public: -+ explicit EntityWidget(UMLScene *scene, UMLObject* o); -+ virtual ~EntityWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ // UMLWidget::loadFromXMI is used to load this widget. -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+public Q_SLOTS: -+ virtual void slotMenuSelection(QAction* action); -+ -+protected: -+ QSizeF minimumSize() const; -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/enumwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/enumwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/enumwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/enumwidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,262 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "enumwidget.h" -+ -+// app includes -+#include "classifier.h" -+#include "classifierlistitem.h" -+#include "debug_utils.h" -+#include "enum.h" -+#include "enumliteral.h" -+#include "listpopupmenu.h" -+#include "object_factory.h" -+#include "uml.h" -+#include "umlclassifierlistitemlist.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "umlview.h" -+ -+/** -+ * Constructs an instance of EnumWidget. -+ * -+ * @param scene The parent of this EnumWidget. -+ * @param o The UMLObject this will be representing. -+ */ -+EnumWidget::EnumWidget(UMLScene *scene, UMLObject* o) -+ : UMLWidget(scene, WidgetBase::wt_Enum, o), -+ m_showPackage(false) -+{ -+ setSize(100, 30); -+ //set defaults from m_scene -+ if (m_scene) { -+ //check to see if correct -+ const Settings::OptionState& ops = m_scene->optionState(); -+ m_showPackage = ops.classState.showPackage; -+ } else { -+ // For completeness only. Not supposed to happen. -+ m_showPackage = false; -+ } -+} -+ -+/** -+ * Destructor. -+ */ -+EnumWidget::~EnumWidget() -+{ -+} -+ -+/** -+ * Returns the status of whether to show Package. -+ * -+ * @return True if package is shown. -+ */ -+bool EnumWidget::showPackage() const -+{ -+ return m_showPackage; -+} -+ -+/** -+ * Set the status of whether to show Package. -+ * -+ * @param _status True if package shall be shown. -+ */ -+void EnumWidget::setShowPackage(bool _status) -+{ -+ m_showPackage = _status; -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Toggles the status of whether to show package. -+ */ -+void EnumWidget::toggleShowPackage() -+{ -+ m_showPackage = !m_showPackage; -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Draws the enum as a rectangle with a box underneith with a list of literals -+ * Reimplemented from UMLWidget::paint -+ */ -+void EnumWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ setPenFromSettings(painter); -+ if(UMLWidget::useFillColor()) -+ painter->setBrush(UMLWidget::fillColor()); -+ else -+ painter->setBrush(m_scene->backgroundColor()); -+ -+ const int w = width(); -+ const int h = height(); -+ -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ QString name; -+ if (m_showPackage) { -+ name = m_umlObject->fullyQualifiedName(); -+ } else { -+ name = this->name(); -+ } -+ -+ painter->drawRect(0, 0, w, h); -+ painter->setPen(textColor()); -+ -+ QFont font = UMLWidget::font(); -+ font.setBold(true); -+ painter->setFont(font); -+ painter->drawText(ENUM_MARGIN, 0, -+ w - ENUM_MARGIN * 2, fontHeight, -+ Qt::AlignCenter, m_umlObject->stereotype(true)); -+ -+ font.setItalic(m_umlObject->isAbstract()); -+ painter->setFont(font); -+ painter->drawText(ENUM_MARGIN, fontHeight, -+ w - ENUM_MARGIN * 2, fontHeight, Qt::AlignCenter, name); -+ font.setBold(false); -+ font.setItalic(false); -+ painter->setFont(font); -+ -+ int y = fontHeight * 2; -+ -+ setPenFromSettings(painter); -+ -+ painter->drawLine(0, y, w, y); -+ -+ QFontMetrics fontMetrics(font); -+ UMLClassifier *classifier = (UMLClassifier*)m_umlObject; -+ UMLClassifierListItem* enumLiteral = 0; -+ UMLClassifierListItemList list = classifier->getFilteredList(UMLObject::ot_EnumLiteral); -+ foreach (enumLiteral, list) { -+ QString text = enumLiteral->name(); -+ painter->setPen(textColor()); -+ painter->drawText(ENUM_MARGIN, y, -+ fontMetrics.width(text), fontHeight, Qt::AlignVCenter, text); -+ y+=fontHeight; -+ } -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Loads from an "enumwidget" XMI element. -+ */ -+bool EnumWidget::loadFromXMI(QDomElement & qElement) -+{ -+ if (!UMLWidget::loadFromXMI(qElement)) { -+ return false; -+ } -+ QString showpackage = qElement.attribute(QLatin1String("showpackage"), QLatin1String("0")); -+ -+ m_showPackage = (bool)showpackage.toInt(); -+ -+ return true; -+} -+ -+/** -+ * Saves to the "enumwidget" XMI element. -+ */ -+void EnumWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement conceptElement = qDoc.createElement(QLatin1String("enumwidget")); -+ UMLWidget::saveToXMI(qDoc, conceptElement); -+ -+ conceptElement.setAttribute(QLatin1String("showpackage"), m_showPackage); -+ qElement.appendChild(conceptElement); -+} -+ -+/** -+ * Will be called when a menu selection has been made from the -+ * popup menu. -+ * -+ * @param action The action that has been selected. -+ */ -+void EnumWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ if (sel == ListPopupMenu::mt_EnumLiteral) { -+ if (Object_Factory::createChildObject(static_cast(m_umlObject), -+ UMLObject::ot_EnumLiteral)) { -+ /* I don't know why it works without these calls: -+ updateComponentSize(); -+ update(); -+ */ -+ UMLApp::app()->document()->setModified(); -+ } -+ return; -+ } -+ UMLWidget::slotMenuSelection(action); -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF EnumWidget::minimumSize() const -+{ -+ if (!m_umlObject) { -+ return UMLWidget::minimumSize(); -+ } -+ -+ int width, height; -+ QFont font = UMLWidget::font(); -+ font.setItalic(false); -+ font.setUnderline(false); -+ font.setBold(false); -+ const QFontMetrics fm(font); -+ -+ const int fontHeight = fm.lineSpacing(); -+ -+ int lines = 1;//always have one line - for name -+ lines++; //for the stereotype -+ -+ const int numberOfEnumLiterals = ((UMLEnum*)m_umlObject)->enumLiterals(); -+ -+ height = width = 0; -+ //set the height of the enum -+ -+ lines += numberOfEnumLiterals; -+ if (numberOfEnumLiterals == 0) { -+ height += fontHeight / 2; //no enum literals, so just add a bit of space -+ } -+ -+ height += lines * fontHeight; -+ -+ //now set the width of the concept -+ //set width to name to start with -+ if (m_showPackage) { -+ width = getFontMetrics(FT_BOLD_ITALIC).boundingRect(m_umlObject->fullyQualifiedName()).width(); -+ } else { -+ width = getFontMetrics(FT_BOLD_ITALIC).boundingRect(name()).width(); -+ } -+ int w = getFontMetrics(FT_BOLD).boundingRect(m_umlObject->stereotype(true)).width(); -+ -+ -+ width = w > width?w:width; -+ -+ UMLClassifier *classifier = (UMLClassifier*)m_umlObject; -+ UMLClassifierListItemList list = classifier->getFilteredList(UMLObject::ot_EnumLiteral); -+ UMLClassifierListItem* listItem = 0; -+ foreach (listItem, list) { -+ int w = fm.width(listItem->name()); -+ width = w > width?w:width; -+ } -+ -+ //allow for width margin -+ width += ENUM_MARGIN * 2; -+ -+ return QSizeF(width, height); -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/enumwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/enumwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/enumwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/enumwidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,52 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef ENUMWIDGET_H -+#define ENUMWIDGET_H -+ -+#include "umlwidget.h" -+ -+#define ENUM_MARGIN 5 -+ -+/** -+ * Defines a graphical version of the enum. Most of the functionality -+ * will come from the @ref UMLWidget class from which class inherits from. -+ * -+ * @short A graphical version of an enum. -+ * @author Jonathan Riddell -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class EnumWidget : public UMLWidget -+{ -+ Q_OBJECT -+public: -+ explicit EnumWidget(UMLScene *scene, UMLObject* o); -+ virtual ~EnumWidget(); -+ -+ bool showPackage() const; -+ void setShowPackage(bool _status); -+ void toggleShowPackage(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ virtual bool loadFromXMI(QDomElement& qElement); -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+public Q_SLOTS: -+ virtual void slotMenuSelection(QAction* action); -+ -+protected: -+ QSizeF minimumSize() const; -+ -+ bool m_showPackage; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/floatingdashlinewidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/floatingdashlinewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/floatingdashlinewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/floatingdashlinewidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,199 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+// own header -+#include "floatingdashlinewidget.h" -+#include "combinedfragmentwidget.h" -+ -+//kde includes -+#if QT_VERSION < 0x050000 -+#include -+#endif -+#include -+ -+//app includes -+#include "debug_utils.h" -+#include "umlview.h" -+#include "widget_utils.h" -+#include "listpopupmenu.h" -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+#include -+ -+DEBUG_REGISTER_DISABLED(FloatingDashLineWidget) -+ -+/** -+ * Creates a floating dash line. -+ * @param scene The parent of the widget -+ * @param id The ID to assign (-1 will prompt a new ID) -+ * @param parent The CombinedFragmentWidget which acts as the parent -+ */ -+FloatingDashLineWidget::FloatingDashLineWidget(UMLScene * scene, Uml::ID::Type id, CombinedFragmentWidget *parent) -+ : UMLWidget(scene, WidgetBase::wt_FloatingDashLine, id), -+ m_yMin(0), -+ m_yMax(0), -+ m_parent(parent) -+{ -+ m_resizable = false; -+ m_Text = QString(); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ setSize(10, fontHeight); -+} -+ -+/** -+ * Destructor. -+ */ -+FloatingDashLineWidget::~FloatingDashLineWidget() -+{ -+ if (m_parent) -+ m_parent->removeDashLine(this); -+} -+ -+/** -+ * Overrides the standard paint event. -+ */ -+void FloatingDashLineWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ painter->setPen(textColor()); -+ painter->setFont(UMLWidget::font()); -+ painter->drawText(FLOATING_DASH_LINE_TEXT_MARGIN, 0, -+ width() - FLOATING_DASH_LINE_TEXT_MARGIN * 2, fontHeight, -+ Qt::AlignLeft, QLatin1Char('[') + m_Text + QLatin1Char(']')); -+ painter->setPen(QPen(UMLWidget::lineColor(), 0, Qt::DashLine)); -+ painter->drawLine(0, 0, width(), 0); -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Sets m_text. -+ */ -+void FloatingDashLineWidget::setText(const QString& text) -+{ -+ m_Text = text; -+} -+ -+/** -+ * Returns true if the given point is near the floatingdashline. -+ */ -+bool FloatingDashLineWidget::onLine(const QPointF& point) -+{ -+ // check if the given point is the start or end point of the line -+ if (((abs((long)(y() + height() - point.y()))) <= POINT_DELTA) || (abs((long)(y() - point.y())) <= POINT_DELTA)) { -+ return true; -+ } -+ // check if the given point is the start or end point of the line -+ return false; -+} -+ -+void FloatingDashLineWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch(sel) { -+ case ListPopupMenu::mt_Rename: -+ { -+ bool ok = false; -+ QString name = m_Text; -+#if QT_VERSION >= 0x050000 -+ name = QInputDialog::getText(Q_NULLPTR, -+ i18n("Enter alternative Name"), i18n("Enter the alternative:"), -+ QLineEdit::Normal, -+ m_Text, &ok); -+#else -+ name = KInputDialog::getText(i18n("Enter alternative Name"), i18n("Enter the alternative:"), m_Text, &ok); -+#endif -+ if (ok && name.length() > 0) -+ m_Text = name; -+ } -+ break; -+ default: -+ UMLWidget::slotMenuSelection(action); -+ } -+} -+ -+/** -+ * Overrides the setY method. -+ */ -+void FloatingDashLineWidget::setY(qreal y) -+{ -+ if(y >= m_yMin + FLOATING_DASH_LINE_MARGIN && y <= m_yMax - FLOATING_DASH_LINE_MARGIN) -+ UMLWidget::setY(y); -+} -+ -+/** -+ * Sets m_yMin. -+ */ -+void FloatingDashLineWidget::setYMin(qreal yMin) -+{ -+ m_yMin = yMin; -+} -+ -+/** -+ * Sets m_yMax. -+ */ -+void FloatingDashLineWidget::setYMax(qreal yMax) -+{ -+ m_yMax = yMax; -+} -+ -+/** -+ * Returns m_yMin. -+ */ -+qreal FloatingDashLineWidget::getYMin() const -+{ -+ return m_yMin; -+} -+ -+/** -+ * Returns the difference between the y-coordinate of the dash line and m_yMin. -+ */ -+qreal FloatingDashLineWidget::getDiffY() const -+{ -+ return (y() - getYMin()); -+} -+ -+/** -+ * Creates the "floatingdashline" XMI element. -+ */ -+void FloatingDashLineWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement textElement = qDoc.createElement(QLatin1String("floatingdashlinewidget")); -+ UMLWidget::saveToXMI(qDoc, textElement); -+ textElement.setAttribute(QLatin1String("text"), m_Text); -+ textElement.setAttribute(QLatin1String("y"), y()); -+ textElement.setAttribute(QLatin1String("minY"), m_yMin); -+ textElement.setAttribute(QLatin1String("maxY"), m_yMax); -+ -+ qElement.appendChild(textElement); -+} -+ -+/** -+ * Loads the "floatingdashline" XMI element. -+ */ -+bool FloatingDashLineWidget::loadFromXMI(QDomElement & qElement) -+{ -+ if(!UMLWidget::loadFromXMI(qElement)) { -+ return false; -+ } -+ DEBUG(DBG_SRC) << "load......."; -+ m_yMax = qElement.attribute(QLatin1String("maxY")).toFloat(); -+ m_yMin = qElement.attribute(QLatin1String("minY")).toFloat(); -+ m_Text = qElement.attribute(QLatin1String("text")); -+ return true; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/floatingdashlinewidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/floatingdashlinewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/floatingdashlinewidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/floatingdashlinewidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,77 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef FLOATINGDASHLINEWIDGET_H -+#define FLOATINGDASHLINEWIDGET_H -+ -+#include "umlwidget.h" -+class CombinedFragmentWidget; -+ -+#define FLOATING_DASH_LINE_MARGIN 25 -+#define FLOATING_DASH_LINE_TEXT_MARGIN 5 -+ -+/* how many pixels a user could click around a point */ -+#define POINT_DELTA 5 -+ -+/** -+ * This class is used to draw dash lines for UML combined fragments. A FloatingDashLineWidget -+ * belongs to one @ref CombinedFragmentWidget instance. -+ * -+ * The FloatingDashLineWidget class inherits from the @ref UMLWidget class. -+ * -+ * @short A dash line for UML combined fragments. -+ * @author Thomas GALLINARI -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class FloatingDashLineWidget : public UMLWidget -+{ -+ Q_OBJECT -+public: -+ explicit FloatingDashLineWidget(UMLScene * scene, Uml::ID::Type id = Uml::ID::None, CombinedFragmentWidget *parent = 0); -+ ~FloatingDashLineWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option = 0, QWidget *widget = 0); -+ -+ void slotMenuSelection(QAction* action); -+ -+ bool onLine(const QPointF& point); -+ -+ void setText(const QString& text); -+ -+ void setY(qreal y); -+ void setYMin(qreal yMin); -+ void setYMax(qreal yMax); -+ qreal getYMin() const; -+ qreal getDiffY() const; -+ -+ void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ bool loadFromXMI(QDomElement & qElement); -+ -+private: -+ /** -+ * Text associated to the dash line -+ */ -+ QString m_text; -+ -+ /** -+ * Minimum value of the Y-coordinate of the dash line -+ * (= y-coordinate of the combined fragment) -+ */ -+ int m_yMin; -+ -+ /** -+ * Maximum value of the Y-coordinate of the dash line -+ * (= y-coordinate of the combined fragment + height of the combined fragment) -+ */ -+ int m_yMax; -+ CombinedFragmentWidget *m_parent; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/floatingtextwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/floatingtextwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/floatingtextwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/floatingtextwidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,854 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "floatingtextwidget.h" -+ -+// local includes -+#include "association.h" -+#include "associationwidget.h" -+#include "associationpropertiesdialog.h" -+#include "classifier.h" -+#include "cmds.h" -+#include "debug_utils.h" -+#include "linkwidget.h" -+#include "classifierwidget.h" -+#include "listpopupmenu.h" -+#include "messagewidget.h" -+#include "model_utils.h" -+#include "object_factory.h" -+#include "operation.h" -+#include "selectoperationdialog.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlview.h" -+ -+// kde includes -+#if QT_VERSION < 0x050000 -+#include -+#include -+#endif -+#include -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#include -+#endif -+#include -+#include -+#include -+#include -+ -+DEBUG_REGISTER_DISABLED(FloatingTextWidget) -+ -+/** -+ * Constructs a FloatingTextWidget instance. -+ * -+ * @param scene The parent of this FloatingTextWidget. -+ * @param role The role this FloatingTextWidget will take up. -+ * @param text The main text to display. -+ * @param id The ID to assign (-1 will prompt a new ID.) -+ */ -+FloatingTextWidget::FloatingTextWidget(UMLScene * scene, Uml::TextRole::Enum role, const QString& text, Uml::ID::Type id) -+ : UMLWidget(scene, WidgetBase::wt_Text, id), -+ m_linkWidget(0), -+ m_preText(QString()), -+ m_postText(QString()), -+ m_textRole(role), -+ m_unconstrainedPositionX(0), -+ m_unconstrainedPositionY(0), -+ m_movementDirectionX(0), -+ m_movementDirectionY(0) -+{ -+ m_Text = text; -+ m_resizable = false; -+ setZValue(10); //make sure always on top. -+} -+ -+/** -+ * Destructor. -+ */ -+FloatingTextWidget::~FloatingTextWidget() -+{ -+} -+ -+/** -+ * Use to get the _main body_ of text (e.g. prepended and appended -+ * text is omitted) as currently displayed by the widget. -+ * -+ * @return The main text currently being displayed by the widget. -+ */ -+QString FloatingTextWidget::text() const -+{ -+ // test to make sure not just the ":" between the seq number and -+ // the actual message widget -+ -+ // hmm. this section looks like it could have been avoided by -+ // using pre-, post- text instead of storing in the main body of -+ // the text -b.t. -+ if (m_textRole == Uml::TextRole::Seq_Message || m_textRole == Uml::TextRole::Seq_Message_Self || -+ m_textRole == Uml::TextRole::Coll_Message || m_textRole == Uml::TextRole::Coll_Message_Self) { -+ if (m_Text.length() <= 1 || m_Text == QLatin1String(": ")) -+ return QString(); -+ } -+ return m_Text; -+} -+ -+/** -+ * Set the main body of text to display. -+ * -+ * @param t The text to display. -+ */ -+void FloatingTextWidget::setText(const QString &t) -+{ -+ if (m_textRole == Uml::TextRole::Seq_Message || m_textRole == Uml::TextRole::Seq_Message_Self) { -+ QString op; -+ if (m_linkWidget) -+ op = m_linkWidget->lwOperationText(); -+ if (op.length() > 0) { -+ if (!m_scene->showOpSig()) -+ op.replace(QRegExp(QLatin1String("\\(.*\\)")), QLatin1String("()")); -+ m_Text = op; -+ } -+ else -+ m_Text = t; -+ } -+ else { -+ m_Text = t; -+ } -+ -+ QSizeF s = minimumSize(); -+ setSize(s.width(), s.height()); -+ -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Set some text to be prepended to the main body of text. -+ * @param t The text to prepend to main body which is displayed. -+ */ -+void FloatingTextWidget::setPreText(const QString &t) -+{ -+ m_preText = t; -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Set some text to be appended to the main body of text. -+ * @param t The text to append to main body which is displayed. -+ */ -+void FloatingTextWidget::setPostText(const QString &t) -+{ -+ m_postText = t; -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Use to get the total text (prepended + main body + appended) -+ * currently displayed by the widget. -+ * -+ * @return The text currently being displayed by the widget. -+ */ -+QString FloatingTextWidget::displayText() const -+{ -+ QString displayText; -+ if (!m_SequenceNumber.isEmpty()) -+ displayText = m_SequenceNumber + QLatin1String(": ") + m_Text; -+ else -+ displayText = m_Text; -+ displayText.prepend(m_preText); -+ displayText.append(m_postText); -+ return displayText; -+} -+ -+/** -+ * Return state if no pre, post and main text is empty -+ * @return true if widget contains no text -+ */ -+bool FloatingTextWidget::isEmpty() -+{ -+ return m_Text.isEmpty() && m_preText.isEmpty() && m_postText.isEmpty(); -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF FloatingTextWidget::minimumSize() const -+{ -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ int h = fm.lineSpacing(); -+ int w = fm.width(displayText()); -+ return QSizeF(w + 8, h + 4); // give a small margin -+} -+ -+/** -+ * Method used by setText: its called by cmdsetTxt, Don't use it! -+ * -+ * @param t The text to display. -+ */ -+void FloatingTextWidget::setTextcmd(const QString &t) -+{ -+ UMLApp::app()->executeCommand(new Uml::CmdSetTxt(this, t)); -+} -+ -+/** -+ * Displays a dialog box to change the text. -+ */ -+void FloatingTextWidget::showChangeTextDialog() -+{ -+ bool ok = false; -+#if QT_VERSION >= 0x050000 -+ QString newText = QInputDialog::getText(m_scene->activeView(), -+ i18n("Change Text"), i18n("Enter new text:"), -+ QLineEdit::Normal, -+ text(), &ok); -+#else -+ QString newText = KInputDialog::getText(i18n("Change Text"), i18n("Enter new text:"), text(), &ok, m_scene->activeView()); -+#endif -+ if (ok && newText != text() && isTextValid(newText)) { -+ setText(newText); -+ setVisible(!text().isEmpty()); -+ updateGeometry(); -+ update(); -+ } -+ if (!isTextValid(newText)) -+ hide(); -+} -+ -+/** -+ * Shows an operation dialog box. -+ * -+ * @param enableAutoIncrement Enable auto increment checkbox -+ */ -+void FloatingTextWidget::showOperationDialog(bool enableAutoIncrement) -+{ -+ if (!m_linkWidget) { -+ uError() << "m_linkWidget is NULL"; -+ return; -+ } -+ QString seqNum = m_linkWidget->sequenceNumber(); -+ UMLClassifier* c = m_linkWidget->lwClassifier(); -+ QString opText = m_linkWidget->lwOperationText(); -+ if (!c) { -+ uError() << "m_linkWidget->lwClassifier() returns a NULL classifier"; -+ return; -+ } -+ -+ QPointer selectDialog = new SelectOperationDialog(m_scene->activeView(), c, enableAutoIncrement); -+ if (enableAutoIncrement && m_scene->autoIncrementSequence()) { -+ seqNum = m_scene->autoIncrementSequenceValue(); -+ selectDialog->setAutoIncrementSequence(true); -+ } -+ selectDialog->setSeqNumber(seqNum); -+ if (m_linkWidget->operation() == 0) { -+ selectDialog->setCustomOp(opText); -+ } else { -+ selectDialog->setClassOp(opText); -+ } -+ if (selectDialog->exec()) { -+ seqNum = selectDialog->getSeqNumber(); -+ opText = selectDialog->getOpText(); -+ if (selectDialog->isClassOp()) { -+ Model_Utils::OpDescriptor od; -+ Model_Utils::Parse_Status st = Model_Utils::parseOperation(opText, od, c); -+ if (st == Model_Utils::PS_OK) { -+ UMLClassifierList selfAndAncestors = c->findSuperClassConcepts(); -+ selfAndAncestors.prepend(c); -+ UMLOperation *op = 0; -+ foreach (UMLClassifier *cl, selfAndAncestors) { -+ op = cl->findOperation(od.m_name, od.m_args); -+ if (op) { -+ break; -+ } -+ } -+ if (!op) { -+ // The op does not yet exist. Create a new one. -+ UMLObject *o = c->createOperation(od.m_name, 0, &od.m_args); -+ op = static_cast(o); -+ } -+ if (od.m_pReturnType) { -+ op->setType(od.m_pReturnType); -+ } -+ -+ m_linkWidget->setOperation(op); -+ opText.clear(); -+ } else { -+ m_linkWidget->setOperation(0); -+ } -+ } else { -+ m_linkWidget->setOperation(0); -+ } -+ m_linkWidget->setSequenceNumber(seqNum); -+ m_linkWidget->setOperationText(opText); -+ if (enableAutoIncrement) { -+ m_scene->setAutoIncrementSequence(selectDialog->autoIncrementSequence()); -+ } -+ setMessageText(); -+ } -+ delete selectDialog; -+} -+ -+/** -+ * Show the properties for a FloatingTextWidget. -+ * Depending on the role of the floating text wiget, the options dialog -+ * for the floating text widget, the rename dialog for floating text or -+ * the options dialog for the link widget are shown. -+ */ -+void FloatingTextWidget::showPropertiesDialog() -+{ -+ if (m_textRole == Uml::TextRole::Coll_Message || m_textRole == Uml::TextRole::Coll_Message_Self || -+ m_textRole == Uml::TextRole::Seq_Message || m_textRole == Uml::TextRole::Seq_Message_Self) { -+ showOperationDialog(false); -+ } else if (m_textRole == Uml::TextRole::Floating) { -+ // double clicking on a text line opens the dialog to change the text -+ handleRename(); -+ } else if (m_linkWidget) { -+ m_linkWidget->showPropertiesDialog(); -+ } -+} -+ -+/** -+ * Use to get the pre-text which is prepended to the main body of -+ * text to be displayed. -+ * -+ * @return The pre-text currently displayed by the widget. -+ */ -+QString FloatingTextWidget::preText() const -+{ -+ return m_preText; -+} -+ -+/** -+ * Use to get the post-text which is appended to the main body of -+ * text to be displayed. -+ * -+ * @return The post-text currently displayed by the widget. -+ */ -+QString FloatingTextWidget::postText() const -+{ -+ return m_postText; -+} -+ -+/** -+ * Activate the FloatingTextWidget after the saved data has been loaded -+ * -+ * @param ChangeLog Pointer to the IDChangeLog. -+ * @return true for success -+ */ -+bool FloatingTextWidget::activate(IDChangeLog* ChangeLog /*= 0 */) -+{ -+ if (! UMLWidget::activate(ChangeLog)) -+ return false; -+ update(); -+ return true; -+} -+ -+/** -+ * Set the LinkWidget that this FloatingTextWidget is related to. -+ * -+ * @param l The related LinkWidget. -+ */ -+void FloatingTextWidget::setLink(LinkWidget * l) -+{ -+ m_linkWidget = l; -+} -+ -+/** -+ * Returns the LinkWidget this floating text is related to. -+ * -+ * @return The LinkWidget this floating text is related to. -+ */ -+LinkWidget * FloatingTextWidget::link() const -+{ -+ return m_linkWidget; -+} -+ -+/** -+ * Sets the role type of this FloatingTextWidget. -+ * -+ * @param role The TextRole::Enum of this FloatingTextWidget. -+ */ -+void FloatingTextWidget::setTextRole(Uml::TextRole::Enum role) -+{ -+ m_textRole = role; -+} -+ -+/** -+ * Return the role of the text widget -+ * @return The TextRole::Enum of this FloatingTextWidget. -+ */ -+Uml::TextRole::Enum FloatingTextWidget::textRole() const -+{ -+ return m_textRole; -+} -+ -+/** -+ * Handle the ListPopupMenu::mt_Rename case of the slotMenuSelection. -+ * Given an own method because it requires rather lengthy code. -+ */ -+void FloatingTextWidget::handleRename() -+{ -+ QRegExpValidator v(QRegExp(QLatin1String(".*")), 0); -+ QString t; -+ if (m_textRole == Uml::TextRole::RoleAName || m_textRole == Uml::TextRole::RoleBName) { -+ t = i18n("Enter role name:"); -+ } else if (m_textRole == Uml::TextRole::MultiA || m_textRole == Uml::TextRole::MultiB) { -+ t = i18n("Enter multiplicity:"); -+ /* -+ // NO! shouldn't be allowed -+ } else if (m_textRole == Uml::TextRole::ChangeA || m_textRole == Uml::TextRole::ChangeB) { -+ t = i18n("Enter changeability"); -+ */ -+ } else if (m_textRole == Uml::TextRole::Name) { -+ t = i18n("Enter association name:"); -+ } else if (m_textRole == Uml::TextRole::Floating) { -+ t = i18n("Enter new text:"); -+ } else { -+ t = i18n("ERROR"); -+ } -+ bool ok = false; -+#if QT_VERSION >= 0x050000 -+ QString newText = QInputDialog::getText(m_scene->activeView(), -+ i18n("Rename"), t, -+ QLineEdit::Normal, -+ text(), &ok); -+#else -+ QString newText = KInputDialog::getText(i18n("Rename"), t, text(), &ok, m_scene->activeView(), &v); -+#endif -+ if (!ok || newText == text()) { -+ return; -+ } -+ -+ UMLApp::app()->executeCommand(new Uml::CmdHandleRename(this, newText)); -+} -+ -+/** -+ * Changes the text of linked widget. -+ * @param newText the new text -+ */ -+void FloatingTextWidget::changeName(const QString& newText) -+{ -+ if (m_linkWidget && !isTextValid(newText)) { -+ AssociationWidget *assoc = dynamic_cast(m_linkWidget); -+ if (assoc) { -+ switch (m_textRole) { -+ case Uml::TextRole::MultiA: -+ assoc->setMultiplicity(QString(), Uml::RoleType::A); -+ break; -+ case Uml::TextRole::MultiB: -+ assoc->setMultiplicity(QString(), Uml::RoleType::B); -+ break; -+ case Uml::TextRole::RoleAName: -+ assoc->setRoleName(QString(), Uml::RoleType::A); -+ break; -+ case Uml::TextRole::RoleBName: -+ assoc->setRoleName(QString(), Uml::RoleType::B); -+ break; -+ case Uml::TextRole::ChangeA: -+ assoc->setChangeability(Uml::Changeability::Changeable, Uml::RoleType::A); -+ break; -+ case Uml::TextRole::ChangeB: -+ assoc->setChangeability(Uml::Changeability::Changeable, Uml::RoleType::B); -+ break; -+ default: -+ assoc->setName(QString()); -+ break; -+ } -+ } -+ else { -+ MessageWidget *msg = dynamic_cast(m_linkWidget); -+ if (msg) { -+ msg->setName(QString()); -+ m_scene->removeWidget(this); -+ } -+ } -+ return; -+ } -+ -+ if (m_linkWidget && m_textRole != Uml::TextRole::Seq_Message -+ && m_textRole != Uml::TextRole::Seq_Message_Self) { -+ m_linkWidget->setText(this, newText); -+ } -+ else { -+ setText(newText); -+ UMLApp::app()->document()->setModified(true); -+ } -+ -+ setVisible(true); -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Write property of QString m_SequenceNumber. -+ */ -+void FloatingTextWidget::setSequenceNumber(const QString &sequenceNumber) -+{ -+ m_SequenceNumber = sequenceNumber; -+} -+ -+/** -+ * Read property of QString m_SequenceNumber. -+ */ -+QString FloatingTextWidget::sequenceNumber() const -+{ -+ return m_SequenceNumber; -+} -+ -+/** -+ * For a text to be valid it must be non-empty, i.e. have a length -+ * larger than zero, and have at least one non whitespace character. -+ * -+ * @param text The string to analyze. -+ * @return True if the given text is valid. -+ */ -+bool FloatingTextWidget::isTextValid(const QString &text) -+{ -+ int length = text.length(); -+ if(length < 1) -+ return false; -+ for(int i=0;iconstrainTextPos(newX, newY, width(), height(), textRole()); -+ } -+ -+ return QPointF(newX, newY); -+} -+ -+/** -+ * Overridden from UMLWidget. -+ * Moves the widget to a new position using the difference between the -+ * current position and the new position. -+ * If the floating text widget is part of a sequence message, and the -+ * message widget is selected, it does nothing: the message widget will -+ * update the text position when it's moved. -+ * In any other case, the floating text widget constrains its move using -+ * constrainPosition. When the position of the floating text is constrained, -+ * it's kept at that position until it can be moved to another valid -+ * position (m_unconstrainedPositionX/Y and m_movementDirectionX/Y are -+ * used for that). -+ * Moreover, if is part of a sequence message (and the message widget -+ * isn't selected), it updates the position of the message widget. -+ * @see constrainPosition -+ * -+ * @param diffX The difference between current X position and new X position. -+ * @param diffY The difference between current Y position and new Y position. -+ */ -+void FloatingTextWidget::moveWidgetBy(qreal diffX, qreal diffY) -+{ -+ if (textRole() == Uml::TextRole::Seq_Message_Self) -+ return; -+ -+ if (textRole() == Uml::TextRole::Seq_Message -+ && ((MessageWidget*)link())->isSelected()) { -+ return; -+ } -+ -+ m_unconstrainedPositionX += diffX; -+ m_unconstrainedPositionY += diffY; -+ QPointF constrainedPosition = constrainPosition(diffX, diffY); -+ -+ qreal newX = constrainedPosition.x(); -+ qreal newY = constrainedPosition.y(); -+ -+ if (!m_movementDirectionX) { -+ if (m_unconstrainedPositionX != constrainedPosition.x()) { -+ m_movementDirectionX = (diffX > 0)? 1: -1; -+ } -+ } else if ((m_movementDirectionX < 0 && m_unconstrainedPositionX > x()) || -+ (m_movementDirectionX > 0 && m_unconstrainedPositionX < x()) ) { -+ newX = m_unconstrainedPositionX; -+ m_movementDirectionX = 0; -+ } -+ -+ if (!m_movementDirectionY) { -+ if (m_unconstrainedPositionY != constrainedPosition.y()) { -+ m_movementDirectionY = (diffY > 0)? 1: -1; -+ } -+ } else if ((m_movementDirectionY < 0 && m_unconstrainedPositionY > y()) || -+ (m_movementDirectionY > 0 && m_unconstrainedPositionY < y()) ) { -+ newY = m_unconstrainedPositionY; -+ m_movementDirectionY = 0; -+ } -+ -+ setX(newX); -+ setY(newY); -+ -+ if (link()) { -+ link()->calculateNameTextSegment(); -+ if (textRole() == Uml::TextRole::Seq_Message) { -+ MessageWidget* messageWidget = (MessageWidget*)link(); -+ messageWidget->setY(newY + height()); -+ } -+ } -+} -+ -+/** -+ * Overridden from UMLWidget. -+ * Modifies the value of the diffX and diffY variables used to move the -+ * widgets. -+ * The values are constrained using constrainPosition. -+ * @see constrainPosition -+ * -+ * @param diffX The difference between current X position and new X position. -+ * @param diffY The difference between current Y position and new Y position. -+ */ -+void FloatingTextWidget::constrainMovementForAllWidgets(qreal &diffX, qreal &diffY) -+{ -+ QPointF constrainedPosition = constrainPosition(diffX, diffY); -+ -+ diffX = constrainedPosition.x() - x(); -+ diffY = constrainedPosition.y() - y(); -+} -+ -+/** -+ * Override method from UMLWidget in order to additionally check widget parentage. -+ * -+ * @param p Point to be checked. -+ * -+ * @return 'this' if UMLWidget::onWidget(p) returns non NULL; -+ * else NULL. -+ */ -+UMLWidget* FloatingTextWidget::onWidget(const QPointF &p) -+{ -+ WidgetBase *pw = dynamic_cast(parentItem()); -+ if (pw == NULL) { -+ return WidgetBase::onWidget(p); -+ } -+ const WidgetBase::WidgetType t = pw->baseType(); -+ bool isWidgetChild = false; -+ if (t == WidgetBase::wt_Interface) { -+ ClassifierWidget *cw = static_cast(pw); -+ isWidgetChild = cw->getDrawAsCircle(); -+ } else if (t == wt_Association || -+ t == WidgetBase::wt_Port || t == WidgetBase::wt_Pin) { -+ isWidgetChild = true; -+ } -+ if (!isWidgetChild) { -+ return WidgetBase::onWidget(p); -+ } -+ const qreal w = width(); -+ const qreal h = height(); -+ const qreal left = pw->x() + x(); -+ const qreal right = left + w; -+ const qreal top = pw->y() + y(); -+ const qreal bottom = top + h; -+ // uDebug() << "child_of_pw; p=(" << p.x() << "," << p.y() << "), " -+ // << "x=" << left << ", y=" << top << ", w=" << w << ", h=" << h -+ // << "; right=" << right << ", bottom=" << bottom; -+ if (p.x() >= left && p.x() <= right && -+ p.y() >= top && p.y() <= bottom) { // Qt coord.sys. origin in top left corner -+ // uDebug() << "floatingtext: " << m_Text; -+ return this; -+ } -+ return NULL; -+} -+ -+/** -+ * Overrides default method -+ */ -+void FloatingTextWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ int w = width(); -+ int h = height(); -+ painter->setFont(UMLWidget::font()); -+ painter->setPen(textColor()); -+ painter->drawText(0, 0, w, h, Qt::AlignCenter, displayText()); -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Loads the "floatingtext" XMI element. -+ */ -+bool FloatingTextWidget::loadFromXMI(QDomElement & qElement) -+{ -+ if(!UMLWidget::loadFromXMI(qElement)) -+ return false; -+ -+ m_unconstrainedPositionX = x(); -+ m_unconstrainedPositionY = y(); -+ QString role = qElement.attribute(QLatin1String("role")); -+ if(!role.isEmpty()) -+ m_textRole = Uml::TextRole::fromInt(role.toInt()); -+ -+ m_preText = qElement.attribute(QLatin1String("pretext")); -+ m_postText = qElement.attribute(QLatin1String("posttext")); -+ setText(qElement.attribute(QLatin1String("text"))); // use setText for geometry update -+ // If all texts are empty then this is a useless widget. -+ // In that case we return false. -+ // CAVEAT: The caller should not interpret the false return value -+ // as an indication of failure since previous umbrello-kf6 versions -+ // saved lots of these empty FloatingTexts. -+ bool usefulWidget = !isEmpty(); -+ return usefulWidget; -+} -+ -+/** -+ * Reimplemented from UMLWidget::saveToXMI to save the widget -+ * data into XMI 'floatingtext' element. -+ */ -+void FloatingTextWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ if (isEmpty()) -+ return; -+ -+ QDomElement textElement = qDoc.createElement(QLatin1String("floatingtext")); -+ UMLWidget::saveToXMI(qDoc, textElement); -+ textElement.setAttribute(QLatin1String("text"), m_Text); -+ textElement.setAttribute(QLatin1String("pretext"), m_preText); -+ textElement.setAttribute(QLatin1String("posttext"), m_postText); -+ -+ /* No need to save these - the messagewidget already did it. -+ m_Operation = qElement.attribute("operation"); -+ m_SeqNum = qElement.attribute("seqnum"); -+ */ -+ -+ textElement.setAttribute(QLatin1String("role"), m_textRole); -+ qElement.appendChild(textElement); -+} -+ -+/** -+ * Called when a menu selection has been made. -+ * -+ * @param action The action that has been selected. -+ */ -+void FloatingTextWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch(sel) { -+ case ListPopupMenu::mt_Properties: -+ showPropertiesDialog(); -+ break; -+ -+ case ListPopupMenu::mt_Delete: -+ hide(); // This is only a workaround; if set then m_linkWidget should -+ // really delete this FloatingTextWidget. -+ update(); -+ m_scene->removeWidget(this); -+ break; -+ -+ case ListPopupMenu::mt_New_Operation: // needed by AssociationWidget -+ case ListPopupMenu::mt_Operation: -+ { -+ if (m_linkWidget == 0) { -+ DEBUG(DBG_SRC) << "mt_Operation: m_linkWidget is NULL"; -+ return; -+ } -+ UMLClassifier* c = m_linkWidget->operationOwner(); -+ if (c == 0) { -+ bool ok = false; -+#if QT_VERSION >= 0x050000 -+ QString opText = QInputDialog::getText(m_scene->activeView(), -+ i18nc("operation name", "Name"), -+ i18n("Enter operation name:"), -+ QLineEdit::Normal, -+ text(), &ok); -+#else -+ QString opText = KInputDialog::getText(i18nc("operation name", "Name"), -+ i18n("Enter operation name:"), -+ text(), &ok, m_scene->activeView()); -+#endif -+ if (ok) -+ m_linkWidget->setCustomOpText(opText); -+ return; -+ } -+ UMLClassifierListItem* umlObj = Object_Factory::createChildObject(c, UMLObject::ot_Operation); -+ if (umlObj) { -+ UMLOperation* newOperation = static_cast(umlObj); -+ m_linkWidget->setOperation(newOperation); -+ } -+ } -+ break; -+ -+ case ListPopupMenu::mt_Select_Operation: -+ showOperationDialog(false); -+ break; -+ -+ case ListPopupMenu::mt_Rename: -+ handleRename(); -+ break; -+ -+ case ListPopupMenu::mt_Change_Font: -+ { -+#if QT_VERSION >= 0x050000 -+ bool ok = false; -+ QFont fnt = QFontDialog::getFont(&ok, font(), m_scene->activeView()); -+ if (ok) { -+#else -+ QFont fnt = font(); -+ if(KFontDialog::getFont(fnt, KFontChooser::NoDisplayFlags, m_scene->activeView())) { -+#endif -+ if(m_textRole == Uml::TextRole::Floating || m_textRole == Uml::TextRole::Seq_Message) { -+ setFont(fnt); -+ } else if (m_linkWidget) { -+ m_linkWidget->lwSetFont(fnt); -+ } -+ } -+ } -+ break; -+ -+ case ListPopupMenu::mt_Reset_Label_Positions: -+ if (m_linkWidget) -+ m_linkWidget->resetTextPositions(); -+ break; -+ -+ default: -+ UMLWidget::slotMenuSelection(action); -+ break; -+ }//end switch -+} -+ -+/** -+ * Sets the text for this label if it is acting as a sequence diagram -+ * message or a collaboration diagram message. -+ */ -+void FloatingTextWidget::setMessageText() -+{ -+ if (m_linkWidget) { -+ m_linkWidget->setMessageText(this); -+ QSizeF s = minimumSize(); -+ setSize(s.width(), s.height()); -+ -+ } -+ setVisible(!text().isEmpty()); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/floatingtextwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/floatingtextwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/floatingtextwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/floatingtextwidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,131 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef FLOATINGTEXTWIDGET_H -+#define FLOATINGTEXTWIDGET_H -+ -+#include "basictypes.h" -+#include "umlwidget.h" -+ -+class LinkWidget; -+class UMLScene; -+ -+/** -+ * @short Displays a line of text or an operation. -+ * -+ * This is a multipurpose-kf6 class. In its simplest form it will display a -+ * line of text. -+ * It can also be setup to be the text for an operation with regard to the -+ * @ref MessageWidget on the sequence diagram. -+ * It is also used for the text required for an association. -+ * -+ * The differences between all these different uses will be the popup menu -+ * that is associated with it. -+ * -+ * @author Paul Hensgen -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class FloatingTextWidget : public UMLWidget -+{ -+ Q_OBJECT -+public: -+ explicit FloatingTextWidget(UMLScene * scene, Uml::TextRole::Enum role = Uml::TextRole::Floating, -+ const QString& text = QString(), Uml::ID::Type id = Uml::ID::None); -+ virtual ~FloatingTextWidget(); -+ -+ QString text() const; -+ void setText(const QString &t); -+ -+ void setTextcmd(const QString &t); -+ -+ QString preText() const; -+ void setPreText(const QString &t); -+ -+ QString postText() const; -+ void setPostText(const QString &t); -+ -+ QString displayText() const; -+ -+ bool isEmpty(); -+ -+ void showChangeTextDialog(); -+ void showOperationDialog(bool enableAutoIncrement = true); -+ virtual void showPropertiesDialog(); -+ -+ LinkWidget* link() const; -+ void setLink(LinkWidget * l); -+ -+ bool activate(IDChangeLog* ChangeLog = 0); -+ -+ Uml::TextRole::Enum textRole() const; -+ void setTextRole(Uml::TextRole::Enum role); -+ -+ void handleRename(); -+ void changeName(const QString& newText); -+ -+ void setSequenceNumber(const QString &sequenceNumber); -+ QString sequenceNumber() const; -+ -+ static bool isTextValid(const QString &text); -+ -+ UMLWidget* onWidget(const QPointF& p); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ virtual bool loadFromXMI(QDomElement& qElement); -+ -+public Q_SLOTS: -+ virtual void slotMenuSelection(QAction* action); -+ void setMessageText(); -+ -+protected: -+ QSizeF minimumSize() const; -+ -+ virtual void moveWidgetBy(qreal diffX, qreal diffY); -+ virtual void constrainMovementForAllWidgets(qreal &diffX, qreal &diffY); -+ -+private: -+ QPointF constrainPosition(qreal diffX, qreal diffY); -+ -+ /// The association or message widget we may be linked to. -+ LinkWidget * m_linkWidget; -+ -+ //////////////////// Data loaded/saved: -+ -+ /// Prepended text (such as for scope of association Role or method) -+ QString m_preText; -+ /// Ending text (such as bracket on changability notation for association Role) -+ QString m_postText; -+ /// The role the text widget will enact. -+ Uml::TextRole::Enum m_textRole; -+ -+ //////// -+ -+ /// The horizontal position the widget would have if its move wasn't constrained. -+ qreal m_unconstrainedPositionX; -+ -+ /// The vertical position the widget would have if its move wasn't constrained. -+ qreal m_unconstrainedPositionY; -+ -+ /// The X direction the widget was moved when the constrain was applied. -+ /// -1 means left, 1 means right. -+ int m_movementDirectionX; -+ -+ /// The Y direction the widget was moved when the constrain was applied. -+ /// -1 means up, 1 means down. -+ int m_movementDirectionY; -+ -+ /// Contains sequence number for sequence or collaboration diagram message. -+ QString m_SequenceNumber; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/forkjoinwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/forkjoinwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/forkjoinwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/forkjoinwidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,205 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2005-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "forkjoinwidget.h" -+ -+//app includes -+#include "debug_utils.h" -+#include "umlview.h" -+#include "umldoc.h" -+#include "listpopupmenu.h" -+ -+// qt includes -+#include -+ -+/** -+ * Constructs a ForkJoinWidget. -+ * -+ * @param scene The parent to this widget. -+ * @param ori Whether to draw the plate horizontally or vertically. -+ * @param id The ID to assign (-1 will prompt a new ID.) -+ */ -+ForkJoinWidget::ForkJoinWidget(UMLScene * scene, Qt::Orientation ori, Uml::ID::Type id) -+ : BoxWidget(scene, id, WidgetBase::wt_ForkJoin), -+ m_orientation(ori) -+{ -+ setSize(10, 40); -+ m_usesDiagramFillColor = false; -+ setFillColorCmd(QColor("black")); -+} -+ -+/** -+ * Destructor. -+ */ -+ForkJoinWidget::~ForkJoinWidget() -+{ -+} -+ -+/** -+ * Get whether to draw the plate vertically or horizontally. -+ */ -+Qt::Orientation ForkJoinWidget::orientation() const -+{ -+ return m_orientation; -+} -+ -+/** -+ * Set whether to draw the plate vertically or horizontally. -+ */ -+void ForkJoinWidget::setOrientation(Qt::Orientation ori) -+{ -+ m_orientation = ori; -+ updateGeometry(); -+ UMLWidget::adjustAssocs(x(), y()); -+} -+ -+/** -+ * Reimplemented from UMLWidget::paint to draw the plate of -+ * fork join. -+ */ -+void ForkJoinWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ painter->fillRect(0, 0, width(), height(), fillColor()); -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Reimplemented from UMLWidget::loadFromXMI to load widget -+ * info from XMI element - 'forkjoin'. -+ */ -+bool ForkJoinWidget::loadFromXMI(QDomElement& qElement) -+{ -+ if (!UMLWidget::loadFromXMI(qElement)) { -+ return false; -+ } -+ -+ QString drawVerticalStr = qElement.attribute(QLatin1String("drawvertical"), QLatin1String("0")); -+ bool drawVertical = (bool)drawVerticalStr.toInt(); -+ if (drawVertical) { -+ setOrientation(Qt::Vertical); -+ } -+ else { -+ setOrientation(Qt::Horizontal); -+ } -+ -+ return true; -+} -+ -+/** -+ * Reimplemented from UMLWidget::saveToXMI to save widget info -+ * into XMI element - 'forkjoin'. -+ */ -+void ForkJoinWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement fjElement = qDoc.createElement(QLatin1String("forkjoin")); -+ UMLWidget::saveToXMI(qDoc, fjElement); -+ bool drawVertical = true; -+ if (m_orientation == Qt::Horizontal) { -+ drawVertical = false; -+ } -+ fjElement.setAttribute(QLatin1String("drawvertical"), drawVertical); -+ qElement.appendChild(fjElement); -+} -+ -+/** -+ * Show a properties dialog for a Fork/Join Widget. -+ */ -+void ForkJoinWidget::showPropertiesDialog() -+{ -+ QColor newColor = QColorDialog::getColor(fillColor()); // krazy:exclude=qclasses -+ if (newColor != fillColor()) { -+ setFillColor(newColor); -+ setUsesDiagramFillColor(false); -+ umlDoc()->setModified(true); -+ } -+} -+ -+/** -+ * Reimplemented form UMLWidget::slotMenuSelection to handle -+ * Flip action. -+ */ -+void ForkJoinWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch (sel) { -+ case ListPopupMenu::mt_Fill_Color: -+ showPropertiesDialog(); -+ break; -+ -+ case ListPopupMenu::mt_Flip: -+ switch (m_orientation) { -+ case Qt::Vertical: -+ setOrientation(Qt::Horizontal); -+ break; -+ case Qt::Horizontal: -+ default: -+ setOrientation(Qt::Vertical); -+ break; -+ } -+ break; -+ default: -+ break; -+ } -+} -+ -+/** -+ * Overrides the function from UMLWidget. -+ */ -+QSizeF ForkJoinWidget::minimumSize() const -+{ -+ if (m_orientation == Qt::Vertical) { -+ return QSizeF(4, 40); -+ } else { -+ return QSizeF(40, 4); -+ } -+} -+ -+/** -+ * Reimplement method from UMLWidget to suppress the resize corner. -+ * Although the ForkJoinWidget supports resizing, we suppress the -+ * resize corner because it is too large for this very slim widget. -+ */ -+void ForkJoinWidget::paintSelected(QPainter * p, int offsetX, int offsetY) -+{ -+ Q_UNUSED(p); -+ Q_UNUSED(offsetX); -+ Q_UNUSED(offsetY); -+} -+ -+/** -+ * Reimplement method from UMLWidget. -+ */ -+void ForkJoinWidget::constrain(qreal& width, qreal& height) -+{ -+ if (m_orientation == Qt::Vertical) { -+ if (width < 4) -+ width = 4; -+ else if (width > 10) -+ width = 10; -+ if (height < 40) -+ height = 40; -+ else if (height > 100) -+ height = 100; -+ } else { -+ if (height < 4) -+ height = 4; -+ else if (height > 10) -+ height = 10; -+ if (width < 40) -+ width = 40; -+ else if (width > 100) -+ width = 100; -+ } -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/forkjoinwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/forkjoinwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/forkjoinwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/forkjoinwidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,57 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2005-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef FORKJOINWIDGET_H -+#define FORKJOINWIDGET_H -+ -+//app includes -+#include "boxwidget.h" -+ -+/** -+ * @short Displays a fork/join plate in a state diagram. -+ * -+ * @author Oliver Kellogg -+ * -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class ForkJoinWidget : public BoxWidget -+{ -+ Q_OBJECT -+ Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation) -+public: -+ explicit ForkJoinWidget(UMLScene * scene, Qt::Orientation ori = Qt::Horizontal, Uml::ID::Type id = Uml::ID::None); -+ virtual ~ForkJoinWidget(); -+ -+ Qt::Orientation orientation() const; -+ void setOrientation(Qt::Orientation ori); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ virtual bool loadFromXMI(QDomElement & qElement); -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+ void showPropertiesDialog(); -+ -+public Q_SLOTS: -+ virtual void slotMenuSelection(QAction* action); -+ -+protected: -+ QSizeF minimumSize() const; -+ -+ virtual void paintSelected(QPainter * p, int offsetX = 0, int offsetY = 0); -+ -+ void constrain(qreal& width, qreal& height); -+ -+private: -+ Qt::Orientation m_orientation; ///< whether to draw the plate horizontally or vertically -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/layoutgrid.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/layoutgrid.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/layoutgrid.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/layoutgrid.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,113 @@ -+/*************************************************************************** -+ * Copyright (C) 2011 by Andi Fischer * -+ * Copyright (C) 2012 by Ralf Habacker * -+ * * -+ * This 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 software 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-kf6. See the * -+ * GNU General Public License for more details. * -+ * * -+ * You should have received a copy of the GNU General Public License * -+ * along with this package; see the file COPYING. If not, write to * -+ * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, * -+ * Boston, MA 02110-1301, USA. * -+ ***************************************************************************/ -+ -+#include "layoutgrid.h" -+ -+#include "debug_utils.h" -+#include "umlscene.h" -+ -+#include -+#include -+ -+#define DBG_LOG() DEBUG(QLatin1String("LayoutGrid")) -+DEBUG_REGISTER_DISABLED(LayoutGrid) -+ -+/** -+ * Constructor. -+ */ -+LayoutGrid::LayoutGrid(UMLScene *scene) -+ : m_scene(scene), -+ m_gridSpacingX(25), -+ m_gridSpacingY(25), -+ m_gridDotColor(Qt::gray), -+ m_isVisible(false) -+{ -+} -+ -+/** -+ * Destructor. -+ */ -+LayoutGrid::~LayoutGrid() -+{ -+} -+ -+void LayoutGrid::paint(QPainter *painter, const QRectF &rect) -+{ -+ if (!isVisible()) -+ return; -+ -+ int gridSizeX = gridSpacingX(); -+ int gridSizeY = gridSpacingY(); -+ -+ qreal left = int(rect.left()) - (int(rect.left()) % gridSizeX); -+ qreal top = int(rect.top()) - (int(rect.top()) % gridSizeY); -+ -+ QVarLengthArray lines; -+ -+ for (qreal x = left; x < rect.right(); x += gridSizeX) -+ lines.append(QLineF(x, rect.top(), x, rect.bottom())); -+ for (qreal y = top; y < rect.bottom(); y += gridSizeY) -+ lines.append(QLineF(rect.left(), y, rect.right(), y)); -+ -+ painter->setPen(m_gridDotColor); -+ painter->drawLines(lines.data(), lines.size()); -+} -+ -+int LayoutGrid::gridSpacingX() const -+{ -+ return m_gridSpacingX; -+} -+ -+int LayoutGrid::gridSpacingY() const -+{ -+ return m_gridSpacingY; -+} -+ -+void LayoutGrid::setGridSpacing(int sizeX, int sizeY) -+{ -+ DBG_LOG() << "x = " << sizeX << " / y = " << sizeY; -+ m_gridSpacingX= sizeX; -+ m_gridSpacingY= sizeY; -+} -+ -+const QColor& LayoutGrid::gridDotColor() const -+{ -+ return m_gridDotColor; -+} -+ -+void LayoutGrid::setGridDotColor(const QColor& color) -+{ -+ DBG_LOG() << "color = " << color; -+ m_gridDotColor = color; -+} -+ -+bool LayoutGrid::isVisible() const -+{ -+ return m_isVisible; -+} -+ -+void LayoutGrid::setVisible(bool visible) -+{ -+ if (m_isVisible != visible) { -+ DBG_LOG() << "visible = " << visible; -+ m_isVisible = visible; -+ m_scene->update(); -+ } -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/layoutgrid.h umbrello-kf6-15.08.1/umbrello/umlwidgets/layoutgrid.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/layoutgrid.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/layoutgrid.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,76 @@ -+/*************************************************************************** -+ * Copyright (C) 2011 by Andi Fischer * -+ * Copyright (C) 2012 by Ralf Habacker * -+ * * -+ * This 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 software 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-kf6. See the * -+ * GNU General Public License for more details. * -+ * * -+ * You should have received a copy of the GNU General Public License * -+ * along with this package; see the file COPYING. If not, write to * -+ * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, * -+ * Boston, MA 02110-1301, USA. * -+ ***************************************************************************/ -+ -+#ifndef LAYOUTGRID_H -+#define LAYOUTGRID_H -+ -+#include -+#include -+ -+class UMLScene; -+class QRectF; -+ -+/** -+ * @author Andi Fischer -+ * This class handles the layout grid, which is drawn in the background -+ * of the scene. It is used only in UMLScene. -+ */ -+class LayoutGrid -+{ -+public: -+ explicit LayoutGrid(UMLScene *scene); -+ ~LayoutGrid(); -+ -+ void paint(QPainter *painter, const QRectF &rect); -+ -+ QRect gridRect() const; -+ void setGridRect(const QRect& rect); -+ -+ int gridSpacingX() const; -+ int gridSpacingY() const; -+ void setGridSpacing(int sizeX, int sizeY); -+ -+ const QColor& gridDotColor() const; -+ void setGridDotColor(const QColor& color); -+ -+ const QColor& gridCrossColor() const; -+ void setGridCrossColor(const QColor& color); -+ -+ const QColor& textColor() const; -+ void setTextColor(const QColor& color); -+ -+ QFont textFont() const; -+ void setTextFont(const QFont& font); -+ -+ bool isVisible() const; -+ void setVisible(bool visible); -+ -+ bool isTextVisible() const; -+ void setTextVisible(bool visible); -+ -+private: -+ UMLScene *m_scene; -+ int m_gridSpacingX; -+ int m_gridSpacingY; -+ QColor m_gridDotColor; -+ bool m_isVisible; -+}; -+ -+#endif // LAYOUTGRID_H -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/linkwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/linkwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/linkwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/linkwidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,121 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "linkwidget.h" -+ -+// app includes -+#include "classifier.h" -+#include "operation.h" -+#include "uml.h" -+#include "umlobject.h" -+#include "umlview.h" -+ -+LinkWidget::LinkWidget() -+{ -+} -+ -+LinkWidget::~LinkWidget() -+{ -+} -+ -+/** -+ * Motivated by FloatingTextWidget::slotMenuSelection(mt_Operation) -+ */ -+UMLClassifier *LinkWidget::operationOwner() -+{ -+ UMLOperation *op = operation(); -+ if (op == NULL) -+ return NULL; -+ return static_cast(op->parent()); -+} -+ -+/** -+ * Return the operation text. -+ * When no scene parameter is given, the scene of the current view -+ * is taken instead. -+ * @param scene the given scene -+ * @return the operation text -+ */ -+QString LinkWidget::operationText(UMLScene *scene) -+{ -+ UMLOperation *op = operation(); -+ if (op == NULL) -+ return customOpText(); -+ if (scene == NULL) -+ scene = UMLApp::app()->currentView()->umlScene(); -+ Uml::SignatureType::Enum sigType; -+ if (scene && scene->showOpSig()) -+ sigType = Uml::SignatureType::SigNoVis; -+ else -+ sigType = Uml::SignatureType::NoSigNoVis; -+ QString opText = op->toString(sigType); -+ return opText; -+} -+ -+/** -+ * Motivated by FloatingTextWidget::slotMenuSelection(mt_Reset_Label_Positions) -+ * Only applies to AssociationWidget. -+ */ -+void LinkWidget::resetTextPositions() -+{ -+} -+ -+/** -+ * Motivated by FloatingTextWidget::mouseDoubleClickEvent() -+ * Only applies to AssociationWidget. -+ */ -+void LinkWidget::showPropertiesDialog() -+{ -+} -+ -+/** -+ * Motivated by FloatingTextWidget::setLink(). -+ * Only applies to AssociationWidget. -+ */ -+void LinkWidget::calculateNameTextSegment() -+{ -+} -+ -+ -+/** -+ * Write property of QString m_SequenceNumber. -+ */ -+void LinkWidget::setSequenceNumber(const QString &sequenceNumber) -+{ -+ m_SequenceNumber = sequenceNumber; -+} -+ -+/** -+ * Read property of QString m_SequenceNumber. -+ */ -+QString LinkWidget::sequenceNumber() const -+{ -+ return m_SequenceNumber; -+} -+ -+/** -+ * Load data from XMI. -+ */ -+bool LinkWidget::loadFromXMI(QDomElement &qElement) -+{ -+ m_SequenceNumber = qElement.attribute(QLatin1String("seqnum")); -+ return true; -+} -+ -+/** -+ * Save data to XMI. -+ */ -+void LinkWidget::saveToXMI(QDomDocument &qDoc, QDomElement &qElement) -+{ -+ Q_UNUSED(qDoc); -+ -+ qElement.setAttribute(QLatin1String("seqnum"), m_SequenceNumber); -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/linkwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/linkwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/linkwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/linkwidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,123 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef LINKWIDGET_H -+#define LINKWIDGET_H -+ -+#include "basictypes.h" -+#include "umlscene.h" -+ -+#include -+ -+// forward declarations -+class UMLClassifier; -+class UMLOperation; -+class FloatingTextWidget; -+ -+/** -+ * This is an interface realized by AssociationWidget and MessageWidget. -+ * The design of this interface was driven by the requirements of -+ * class FloatingTextWidget. As the architecture of umbrello-kf6 evolves (for -+ * example, if the class FloatingTextWidget is redesigned), it can be -+ * cleaned up. -+ * -+ * @short Interface to FloatingTextWidget for AssociationWidget and MessageWidget. -+ * @author Oliver Kellogg -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class LinkWidget -+{ -+public: -+ LinkWidget(); -+ virtual ~LinkWidget(); -+ -+ /** -+ * Sets the font the widget is to use. -+ * Abstract operation implemented by inheriting classes. -+ * Motivated by FloatingTextWidget::slotMenuSelection(mt_Operation) -+ * -+ * @param font Font to be set. -+ */ -+ virtual void lwSetFont(QFont font) = 0; -+ -+ virtual UMLClassifier *operationOwner(); -+ -+ /** -+ * Motivated by FloatingTextWidget::slotMenuSelection(mt_Operation) -+ */ -+ virtual UMLOperation *operation() = 0; -+ -+ /** -+ * Motivated by FloatingTextWidget::slotMenuSelection(mt_Operation) -+ */ -+ virtual void setOperation(UMLOperation *op) = 0; -+ -+ /** -+ * Motivated by getOperationText() -+ */ -+ virtual QString customOpText() = 0; -+ -+ /** -+ * Motivated by FloatingTextWidget::slotMenuSelection(mt_Operation) -+ */ -+ virtual void setCustomOpText(const QString &opText) = 0; -+ -+ QString operationText(UMLScene *scene = 0); -+ -+ virtual void resetTextPositions(); -+ -+ /** -+ * Motivated by FloatingTextWidget::setMessageText() -+ */ -+ virtual void setMessageText(FloatingTextWidget *ft) = 0; -+ -+ /** -+ * Motivated by FloatingTextWidget::handleRename() -+ */ -+ virtual void setText(FloatingTextWidget *ft, const QString &newText) = 0; -+ -+ virtual void showPropertiesDialog(); -+ -+ /** -+ * Motivated by FloatingTextWidget::showOpDialog() -+ */ -+ virtual QString lwOperationText() = 0; -+ -+ /** -+ * Motivated by FloatingTextWidget::showOpDialog() -+ */ -+ virtual UMLClassifier *lwClassifier() = 0; -+ -+ /** -+ * Motivated by FloatingTextWidget::showOpDialog() -+ */ -+ virtual void setOperationText(const QString &op) = 0; -+ -+ /** -+ * Abstract operation implemented by inheriting classes. -+ * Motivated by FloatingTextWidget::mouseMoveEvent() -+ */ -+ virtual void constrainTextPos(qreal &textX, qreal &textY, -+ qreal textWidth, qreal textHeight, -+ Uml::TextRole::Enum tr) = 0; -+ -+ virtual void calculateNameTextSegment(); -+ -+ void setSequenceNumber(const QString &sequenceNumber); -+ QString sequenceNumber() const; -+ -+ virtual bool loadFromXMI(QDomElement &qElement); -+ virtual void saveToXMI(QDomDocument &qDoc, QDomElement &qElement); -+ -+protected: -+ QString m_SequenceNumber; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/messagewidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/messagewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/messagewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/messagewidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,1385 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// onw header -+#include "messagewidget.h" -+ -+//app includes -+#include "classifier.h" -+#include "debug_utils.h" -+#include "floatingtextwidget.h" -+#include "listpopupmenu.h" -+#include "objectwidget.h" -+#include "operation.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlview.h" -+#include "uniqueid.h" -+#include "idchangelog.h" -+ -+//qt includes -+#include -+#include -+#include -+#include -+ -+//kde includes -+#include -+ -+DEBUG_REGISTER_DISABLED(MessageWidget) -+ -+static const int circleWidth = 10; -+ -+/** -+ * Constructs a MessageWidget. -+ * -+ * This method is used for creation, synchronous and synchronous message types. -+ * -+ * @param scene The parent to this class. -+ * @param a The role A widget for this message. -+ * @param b The role B widget for this message. -+ * @param y The vertical position to display this message. -+ * @param sequenceMessageType Whether synchronous or asynchronous -+ * @param id A unique id used for deleting this object cleanly. -+ * The default (-1) will prompt generation of a new ID. -+ */ -+MessageWidget::MessageWidget(UMLScene * scene, ObjectWidget* a, ObjectWidget* b, -+ int y, Uml::SequenceMessage::Enum sequenceMessageType, -+ Uml::ID::Type id /* = Uml::id_None */) -+ : UMLWidget(scene, WidgetBase::wt_Message, id) -+{ -+ init(); -+ m_pOw[Uml::RoleType::A] = a; -+ m_pOw[Uml::RoleType::B] = b; -+ m_sequenceMessageType = sequenceMessageType; -+ if (m_sequenceMessageType == Uml::SequenceMessage::Creation) { -+ y -= m_pOw[Uml::RoleType::B]->height() / 2; -+ m_pOw[Uml::RoleType::B]->setY(y); -+ } -+ updateResizability(); -+ calculateWidget(); -+ y = y < getMinY() ? getMinY() : y; -+ y = y > getMaxY() ? getMaxY() : y; -+ setY(y); -+ -+ this->activate(); -+} -+ -+/** -+ * Constructs a MessageWidget. -+ * -+ * @param scene The parent to this class. -+ * @param seqMsgType The Uml::SequenceMessage::Enum of this message widget -+ * @param id The ID to assign (-1 will prompt a new ID.) -+ */ -+MessageWidget::MessageWidget(UMLScene * scene, Uml::SequenceMessage::Enum seqMsgType, -+ Uml::ID::Type id) -+ : UMLWidget(scene, WidgetBase::wt_Message, id) -+{ -+ init(); -+ m_sequenceMessageType = seqMsgType; -+} -+ -+/** -+ * Constructs a Lost or Found MessageWidget. -+ * -+ * @param scene The parent to this class. -+ * @param a The role A widget for this message. -+ * @param xclick The horizontal position clicked by the user -+ * @param yclick The vertical position clicked by the user -+ * @param sequenceMessageType Whether lost or found -+ * @param id The ID to assign (-1 will prompt a new ID.) -+ */ -+MessageWidget::MessageWidget(UMLScene * scene, ObjectWidget* a, int xclick, int yclick, -+ Uml::SequenceMessage::Enum sequenceMessageType, -+ Uml::ID::Type id /*= Uml::id_None*/) -+ : UMLWidget(scene, WidgetBase::wt_Message, id) -+{ -+ init(); -+ m_pOw[Uml::RoleType::A] = a; -+ m_pOw[Uml::RoleType::B] = a; -+ -+ m_sequenceMessageType = sequenceMessageType; -+ -+ m_xclicked = xclick; -+ m_yclicked = yclick; -+ -+ updateResizability(); -+ calculateWidget(); -+ yclick = yclick < getMinY() ? getMinY() : yclick; -+ yclick = yclick > getMaxY() ? getMaxY() : yclick; -+ setY(yclick); -+ m_yclicked = yclick; -+ -+ this->activate(); -+} -+ -+/** -+ * Initializes key variables of the class. -+ */ -+void MessageWidget::init() -+{ -+ m_xclicked = -1; -+ m_yclicked = -1; -+ m_ignoreSnapToGrid = true; -+ m_ignoreSnapComponentSizeToGrid = true; -+ m_pOw[Uml::RoleType::A] = m_pOw[Uml::RoleType::B] = NULL; -+ m_pFText = NULL; -+} -+ -+/** -+ * Standard destructor. -+ */ -+MessageWidget::~MessageWidget() -+{ -+} -+ -+/** -+ * Sets the y-coordinate. -+ * Reimplemented from UMLWidget. -+ * -+ * @param y The y-coordinate to be set. -+ */ -+void MessageWidget::setY(qreal y) -+{ -+ if (y < getMinY()) { -+ DEBUG(DBG_SRC) << "got out of bounds y position, check the reason" << this->y() << getMinY(); -+ return; -+ } -+ -+ UMLWidget::setY(y); -+ if (m_sequenceMessageType == Uml::SequenceMessage::Creation) { -+ const qreal objWidgetHalfHeight = m_pOw[Uml::RoleType::B]->height() / 2; -+ m_pOw[Uml::RoleType::B]->setY(y - objWidgetHalfHeight); -+ } -+ -+ if (m_pFText && !UMLApp::app()->document()->loading()) { -+ setTextPosition(); -+ emit sigMessageMoved(); -+ } -+} -+ -+/** -+ * Update the UMLWidget::m_resizable flag according to the -+ * charactersitics of this message. -+ */ -+void MessageWidget::updateResizability() -+{ -+ if (m_sequenceMessageType == Uml::SequenceMessage::Synchronous) -+ UMLWidget::m_resizable = true; -+ else -+ UMLWidget::m_resizable = false; -+} -+ -+/** -+ * Overridden from UMLWidget. -+ * Returns the cursor to be shown when resizing the widget. -+ * The cursor shown is KCursor::sizeVerCursor(). -+ * -+ * @return The cursor to be shown when resizing the widget. -+ */ -+QCursor MessageWidget::resizeCursor() const -+{ -+ return Qt::SizeVerCursor; -+} -+ -+/** -+ * Overridden from UMLWidget. -+ * Resizes the height of the message widget and emits the message moved signal. -+ * Message widgets can only be resized vertically, so width isn't modified. -+ * -+ * @param newW The new width for the widget (isn't used). -+ * @param newH The new height for the widget. -+ */ -+void MessageWidget::resizeWidget(qreal newW, qreal newH) -+{ -+ if (sequenceMessageType() == Uml::SequenceMessage::Creation) -+ setSize(width(), newH); -+ else { -+ qreal x1 = m_pOw[Uml::RoleType::A]->x(); -+ qreal x2 = getxclicked(); -+ qreal diffX = 0; -+ if (x1 < x2) { -+ diffX = x2 + (newW - width()); -+ } -+ else { -+ diffX = x2 - (newW - width()); -+ } -+ if (diffX <= 0 ) -+ diffX = 10; -+ setxclicked (diffX); -+ setSize(newW, newH); -+ calculateWidget(); -+ -+ } -+ emit sigMessageMoved(); -+} -+ -+/** -+ * Constrains the vertical position of the message widget so it doesn't go -+ * upper than the bottom side of the lower object. -+ * The height of the floating text widget in the message is taken in account -+ * if there is any and isn't empty. -+ * -+ * @param diffY The difference between current Y position and new Y position. -+ * @return The new Y position, constrained. -+ */ -+qreal MessageWidget::constrainPositionY(qreal diffY) -+{ -+ qreal newY = y() + diffY; -+ -+ qreal minY = getMinY(); -+ if (m_pFText && !m_pFText->displayText().isEmpty()) { -+ minY += m_pFText->height(); -+ } -+ -+ if (newY < minY) { -+ newY = minY; -+ } -+ -+ return newY; -+} -+ -+/** -+ * Overridden from UMLWidget. -+ * Moves the widget to a new position using the difference between the -+ * current position and the new position. X position is ignored, and widget -+ * is only moved along Y axis. If message goes upper than the object, it's -+ * kept at this position until it should be lowered again (the unconstrained -+ * Y position is saved to know when it's the time to lower it again). -+ * If the message is a creation message, the object created is also moved to -+ * the new vertical position. -+ * @see constrainPositionY -+ * -+ * @param diffX The difference between current X position and new X position -+ * (isn't used). -+ * @param diffY The difference between current Y position and new Y position. -+ */ -+void MessageWidget::moveWidgetBy(qreal diffX, qreal diffY) -+{ -+ Q_UNUSED(diffX); -+ qreal newY = constrainPositionY(diffY); -+ setY(newY); -+} -+ -+/** -+ * Overridden from UMLWidget. -+ * Modifies the value of the diffX and diffY variables used to move the widgets. -+ * All the widgets are constrained to be moved only in Y axis (diffX is set to 0). -+ * @see constrainPositionY -+ * -+ * @param diffX The difference between current X position and new X position. -+ * @param diffY The difference between current Y position and new Y position. -+ */ -+void MessageWidget::constrainMovementForAllWidgets(qreal &diffX, qreal &diffY) -+{ -+ diffX = 0; -+ diffY = constrainPositionY(diffY) - y(); -+} -+ -+/** -+ * Reimplemented from UMLWidget and calls other paint...() methods -+ * depending on the message type. -+ */ -+void MessageWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ if(!m_pOw[Uml::RoleType::A] || !m_pOw[Uml::RoleType::B]) { -+ return; -+ } -+ setPenFromSettings(painter); -+ if (m_sequenceMessageType == Uml::SequenceMessage::Synchronous) { -+ paintSynchronous(painter, option); -+ } else if (m_sequenceMessageType == Uml::SequenceMessage::Asynchronous) { -+ paintAsynchronous(painter, option); -+ } else if (m_sequenceMessageType == Uml::SequenceMessage::Creation) { -+ paintCreation(painter, option); -+ } else if (m_sequenceMessageType == Uml::SequenceMessage::Lost) { -+ paintLost(painter, option); -+ } else if (m_sequenceMessageType == Uml::SequenceMessage::Found) { -+ paintFound(painter, option); -+ } else { -+ uWarning() << "Unknown message type"; -+ } -+} -+ -+/** -+ * Draw a solid-kf6 (triangular) arrowhead pointing in the given direction. -+ * The direction can be either Qt::LeftArrow or Qt::RightArrow. -+ */ -+void MessageWidget::paintsolid-kf6Arrowhead(QPainter *p, int x, int y, Qt::ArrowType direction) -+{ -+ int arrowheadExtentX = 4; -+ if (direction == Qt::RightArrow) { -+ arrowheadExtentX = -arrowheadExtentX; -+ } -+ QPolygon points; -+ points.putPoints(0, 3, x, y, x + arrowheadExtentX, y - 3, x + arrowheadExtentX, y + 3); -+ p->setBrush(QBrush(p->pen().color())); -+ p->drawPolygon(points); -+} -+ -+/** -+ * Draw an arrow pointing in the given direction. -+ * The arrow head is not solid-kf6, i.e. it is made up of two lines -+ * like so: ---> -+ * The direction can be either Qt::LeftArrow or Qt::RightArrow. -+ */ -+void MessageWidget::paintArrow(QPainter *p, int x, int y, int w, -+ Qt::ArrowType direction, bool useDottedLine /* = false */) -+{ -+ if (w > 3) { -+ int arrowheadStartX = x; -+ int arrowheadExtentX = 4; -+ if (direction == Qt::RightArrow) { -+ arrowheadStartX += w; -+ arrowheadExtentX = -arrowheadExtentX; -+ } -+ // draw upper half of arrowhead -+ p->drawLine(arrowheadStartX, y, arrowheadStartX + arrowheadExtentX, y - 3); -+ // draw lower half of arrowhead -+ p->drawLine(arrowheadStartX, y, arrowheadStartX + arrowheadExtentX, y + 3); -+ } -+ // draw arrow line -+ if (useDottedLine) { -+ QPen pen = p->pen(); -+ pen.setStyle(Qt::DotLine); -+ p->setPen(pen); -+ } -+ p->drawLine(x, y, x + w, y); -+} -+ -+/** -+ * Draws the calling arrow with filled in arrowhead, the -+ * timeline box and the returning arrow with a dashed line and -+ * stick arrowhead. -+ */ -+void MessageWidget::paintSynchronous(QPainter *painter, const QStyleOptionGraphicsItem *option) -+{ -+ int x1 = m_pOw[Uml::RoleType::A]->x(); -+ int x2 = m_pOw[Uml::RoleType::B]->x(); -+ int w = width() - 1; -+ int h = height(); -+ int offsetX = 0; -+ int offsetY = 0; -+ -+ bool messageOverlaps = m_pOw[Uml::RoleType::A]->messageOverlap(y(), this); -+ const int boxWidth = 17; -+ const int wr = w < boxWidth ? w : boxWidth; -+ const int arrowWidth = 4; -+ -+ if(isSelf()) { -+ painter->fillRect(offsetX, offsetY, wr, h, QBrush(Qt::white)); //box -+ painter->drawRect(offsetX, offsetY, wr, h); //box -+ offsetX += wr; -+ w -= wr; -+ offsetY += 3; -+ const int lowerLineY = offsetY + h - 6; -+ // draw upper line segment (leaving the life line) -+ painter->drawLine(offsetX, offsetY, offsetX + w, offsetY); -+ // draw line segment parallel to (and at the right of) the life line -+ painter->drawLine(offsetX + w, offsetY, offsetX + w, lowerLineY); -+ // draw lower line segment (back to the life line) -+ paintArrow(painter, offsetX, lowerLineY, w, Qt::LeftArrow); -+ offsetX -= wr; -+ offsetY -= 3; -+ } else if(x1 < x2) { -+ if (messageOverlaps) { -+ offsetX += 8; -+ w -= 8; -+ } -+ QPen pen = painter->pen(); -+ int startX = offsetX + w - wr + 1; -+ painter->fillRect(startX, offsetY, wr, h, QBrush(Qt::white)); //box -+ painter->drawRect(startX, offsetY, wr, h); //box -+ painter->drawLine(offsetX, offsetY + arrowWidth, startX, offsetY + arrowWidth); //arrow line -+ if (w > boxWidth + arrowWidth) -+ paintsolid-kf6Arrowhead(painter, startX - 1, offsetY + arrowWidth, Qt::RightArrow); -+ paintArrow(painter, offsetX, offsetY + h - arrowWidth + 1, w - wr + 1, Qt::LeftArrow, true); // return arrow -+ if (messageOverlaps) { -+ offsetX -= 8; //reset for drawSelected() -+ } -+ } else { -+ if (messageOverlaps) { -+ w -=8; -+ } -+ QPen pen = painter->pen(); -+ painter->fillRect(offsetX, offsetY, wr, h, QBrush(Qt::white)); //box -+ painter->drawRect(offsetX, offsetY, wr, h); //box -+ painter->drawLine(offsetX + wr + 1, offsetY + arrowWidth, offsetX + w, offsetY + arrowWidth); //arrow line -+ if (w > boxWidth + arrowWidth) -+ paintsolid-kf6Arrowhead(painter, offsetX + wr, offsetY + arrowWidth, Qt::LeftArrow); -+ paintArrow(painter, offsetX + wr + 1, offsetY + h - arrowWidth + 1, w - wr - 1, Qt::RightArrow, true); // return arrow -+ } -+ -+ UMLWidget::paint(painter, option); -+} -+ -+/** -+ * Draws a solid-kf6 arrow line and a stick arrow head. -+ */ -+void MessageWidget::paintAsynchronous(QPainter *painter, const QStyleOptionGraphicsItem *option) -+{ -+ int x1 = m_pOw[Uml::RoleType::A]->x(); -+ int x2 = m_pOw[Uml::RoleType::B]->x(); -+ int w = width() - 1; -+ int h = height() - 1; -+ int offsetX = 0; -+ int offsetY = 0; -+ bool messageOverlapsA = m_pOw[Uml::RoleType::A]->messageOverlap(y(), this); -+ //bool messageOverlapsB = m_pOw[Uml::RoleType::B]->messageOverlap(y(), this); -+ -+ if(isSelf()) { -+ if (messageOverlapsA) { -+ offsetX += 7; -+ w -= 7; -+ } -+ const int lowerLineY = offsetY + h - 3; -+ // draw upper line segment (leaving the life line) -+ painter->drawLine(offsetX, offsetY, offsetX + w, offsetY); -+ // draw line segment parallel to (and at the right of) the life line -+ painter->drawLine(offsetX + w, offsetY, offsetX + w, lowerLineY); -+ // draw lower line segment (back to the life line) -+ paintArrow(painter, offsetX, lowerLineY, w, Qt::LeftArrow); -+ if (messageOverlapsA) { -+ offsetX -= 7; //reset for drawSelected() -+ } -+ } else if(x1 < x2) { -+ if (messageOverlapsA) { -+ offsetX += 7; -+ w -= 7; -+ } -+ paintArrow(painter, offsetX, offsetY + 4, w, Qt::RightArrow); -+ if (messageOverlapsA) { -+ offsetX -= 7; -+ } -+ } else { -+ if (messageOverlapsA) { -+ w -= 7; -+ } -+ paintArrow(painter, offsetX, offsetY + 4, w, Qt::LeftArrow); -+ } -+ -+ UMLWidget::paint(painter, option); -+} -+ -+/** -+ * Draws a solid-kf6 arrow line and a stick arrow head to the -+ * edge of the target object widget instead of to the -+ * sequence line. -+ */ -+void MessageWidget::paintCreation(QPainter *painter, const QStyleOptionGraphicsItem *option) -+{ -+ int x1 = m_pOw[Uml::RoleType::A]->x(); -+ int x2 = m_pOw[Uml::RoleType::B]->x(); -+ int w = width(); -+ //int h = height() - 1; -+ int offsetX = 0; -+ int offsetY = 0; -+ bool messageOverlapsA = m_pOw[Uml::RoleType::A]->messageOverlap(y(), this); -+ //bool messageOverlapsB = m_pOw[Uml::RoleType::B]->messageOverlap(y(), this); -+ -+ const int lineY = offsetY + 4; -+ if (x1 < x2) { -+ if (messageOverlapsA) { -+ offsetX += 7; -+ w -= 7; -+ } -+ paintArrow(painter, offsetX, lineY, w, Qt::RightArrow); -+ if (messageOverlapsA) { -+ offsetX -= 7; -+ } -+ } else { -+ if (messageOverlapsA) { -+ w -= 7; -+ } -+ paintArrow(painter, offsetX, lineY, w, Qt::LeftArrow); -+ } -+ -+ UMLWidget::paint(painter, option); -+} -+ -+ -+/** -+ * Draws a solid-kf6 arrow line and a stick arrow head -+ * and a circle -+ */ -+void MessageWidget::paintLost(QPainter *painter, const QStyleOptionGraphicsItem *option) -+{ -+ int x1 = m_pOw[Uml::RoleType::A]->centerX(); -+ int x2 = m_xclicked; -+ int w = width(); -+ int h = height(); -+ int offsetX = 0; -+ int offsetY = 0; -+ bool messageOverlapsA = m_pOw[Uml::RoleType::A]->messageOverlap(y(), this); -+ //bool messageOverlapsB = m_pOw[Uml::RoleType::B]->messageOverlap(y(), this); -+ -+ if(x1 < x2) { -+ if (messageOverlapsA) { -+ offsetX += 7; -+ w -= 7; -+ } -+ -+ setPenFromSettings(painter); -+ painter->setBrush(WidgetBase::lineColor()); -+ painter->drawEllipse(offsetX + w - h, offsetY, h, h); -+ paintArrow(painter, offsetX, offsetY + h/2, w - h, Qt::RightArrow); -+ -+ if (messageOverlapsA) { -+ offsetX -= 7; -+ } -+ } else { -+ setPenFromSettings(painter); -+ painter->setBrush(WidgetBase::lineColor()); -+ painter->drawEllipse(offsetX, offsetY, h, h); -+ paintArrow(painter, offsetX + h, offsetY + h/2, w - h, Qt::LeftArrow); -+ } -+ -+ UMLWidget::paint(painter, option); -+} -+ -+/** -+ * Draws a circle and a solid-kf6 arrow line and a stick arrow head. -+ */ -+void MessageWidget::paintFound(QPainter *painter, const QStyleOptionGraphicsItem *option) -+{ -+ int x1 = m_pOw[Uml::RoleType::A]->centerX(); -+ int x2 = m_xclicked; -+ int w = width(); -+ int h = height(); -+ int offsetX = 0; -+ int offsetY = 0; -+ bool messageOverlapsA = m_pOw[Uml::RoleType::A]->messageOverlap(y(), this); -+ //bool messageOverlapsB = m_pOw[Uml::RoleType::B]->messageOverlap(y(), this); -+ -+ if(x1 < x2) { -+ if (messageOverlapsA) { -+ offsetX += 7; -+ w -= 7; -+ } -+ setPenFromSettings(painter); -+ painter->setBrush(WidgetBase::lineColor()); -+ painter->drawEllipse(offsetX + w - h, offsetY, h, h); -+ paintArrow(painter, offsetX, offsetY + h/2, w, Qt::LeftArrow); -+ if (messageOverlapsA) { -+ offsetX -= 7; -+ } -+ } else { -+ if (messageOverlapsA) { -+ w -= 7; -+ } -+ setPenFromSettings(painter); -+ painter->setBrush(WidgetBase::lineColor()); -+ painter->drawEllipse(offsetX, offsetY, h, h); -+ paintArrow(painter, offsetX, offsetY + h/2, w, Qt::RightArrow); -+ } -+ -+ UMLWidget::paint(painter, option); -+} -+ -+/** -+ * Overrides operation from UMLWidget. -+ * -+ * @param p Point to be checked. -+ * -+ * @return 'this' if the point is on a part of the MessageWidget. -+ * NB In case of a synchronous message, the empty space -+ * between call line and return line does not count, i.e. if -+ * the point is located in that space the function returns NULL. -+ */ -+UMLWidget* MessageWidget::onWidget(const QPointF& p) -+{ -+ if (m_sequenceMessageType != Uml::SequenceMessage::Synchronous) { -+ return UMLWidget::onWidget(p); -+ } -+ // Synchronous message: -+ // Consists of top arrow (call) and bottom arrow (return.) -+ if (p.x() < x() || p.x() > x() + width()) -+ return NULL; -+ const int tolerance = 5; // pixels -+ const int pY = p.y(); -+ const int topArrowY = y() + 3; -+ const int bottomArrowY = y() + height() - 3; -+ if (pY < topArrowY - tolerance || pY > bottomArrowY + tolerance) -+ return NULL; -+ if (height() <= 2 * tolerance) -+ return this; -+ if (pY > topArrowY + tolerance && pY < bottomArrowY - tolerance) -+ return NULL; -+ return this; -+} -+ -+/** -+ * Sets the text position relative to the sequence message. -+ */ -+void MessageWidget::setTextPosition() -+{ -+ if (m_pFText == NULL) { -+ DEBUG(DBG_SRC) << "m_pFText is NULL"; -+ return; -+ } -+ if (m_pFText->displayText().isEmpty()) { -+ return; -+ } -+ m_pFText->updateGeometry(); -+ int ftX = constrainX(m_pFText->x(), m_pFText->width(), m_pFText->textRole()); -+ int ftY = y() - m_pFText->height(); -+ m_pFText->setX(ftX); -+ m_pFText->setY(ftY); -+} -+ -+/** -+ * Returns the textX arg with constraints applied. -+ * Auxiliary to setTextPosition() and constrainTextPos(). -+ */ -+int MessageWidget::constrainX(int textX, int textWidth, Uml::TextRole::Enum tr) -+{ -+ int result = textX; -+ const int minTextX = x() + 5; -+ if (textX < minTextX || tr == Uml::TextRole::Seq_Message_Self) { -+ result = minTextX; -+ } else { -+ ObjectWidget *objectAtRight = NULL; -+ if (m_pOw[Uml::RoleType::B]->x() > m_pOw[Uml::RoleType::A]->x()) -+ objectAtRight = m_pOw[Uml::RoleType::B]; -+ else -+ objectAtRight = m_pOw[Uml::RoleType::A]; -+ const int objRight_seqLineX = objectAtRight->centerX(); -+ const int maxTextX = objRight_seqLineX - textWidth - 5; -+ if (maxTextX <= minTextX) -+ result = minTextX; -+ else if (textX > maxTextX) -+ result = maxTextX; -+ } -+ return result; -+} -+ -+/** -+ * Constrains the FloatingTextWidget X and Y values supplied. -+ * Overrides operation from LinkWidget. -+ * -+ * @param textX candidate X value (may be modified by the constraint) -+ * @param textY candidate Y value (may be modified by the constraint) -+ * @param textWidth width of the text -+ * @param textHeight height of the text -+ * @param tr Uml::TextRole::Enum of the text -+ */ -+void MessageWidget::constrainTextPos(qreal &textX, qreal &textY, qreal textWidth, qreal textHeight, -+ Uml::TextRole::Enum tr) -+{ -+ textX = constrainX(textX, textWidth, tr); -+ // Constrain Y. -+ const qreal minTextY = getMinY(); -+ const qreal maxTextY = getMaxY() - textHeight - 5; -+ if (textY < minTextY) -+ textY = minTextY; -+ else if (textY > maxTextY) -+ textY = maxTextY; -+// setY(textY + textHeight); // NB: side effect -+} -+ -+/** -+ * Shortcut for calling m_pFText->setLink() followed by -+ * this->setTextPosition(). -+ */ -+void MessageWidget::setLinkAndTextPos() -+{ -+ if (m_pFText) { -+ m_pFText->setLink(this); -+ setTextPosition(); -+ } -+} -+ -+void MessageWidget::resizeEvent(QResizeEvent* /*re*/) -+{ -+} -+ -+/** -+ * Calculate the geometry of the widget. -+ */ -+void MessageWidget::calculateWidget() -+{ -+ setMessageText(m_pFText); -+ calculateDimensions(); -+ setVisible(true); -+} -+ -+void MessageWidget::slotWidgetMoved(Uml::ID::Type id) -+{ -+ const Uml::ID::Type idA = m_pOw[Uml::RoleType::A]->localID(); -+ const Uml::ID::Type idB = m_pOw[Uml::RoleType::B]->localID(); -+ if (idA != id && idB != id) { -+ DEBUG(DBG_SRC) << "id=" << Uml::ID::toString(id) << ": ignoring for idA=" << Uml::ID::toString(idA) -+ << ", idB=" << Uml::ID::toString(idB); -+ return; -+ } -+ qreal y = this->y(); -+ if (y < getMinY()) -+ y = getMinY(); -+ if (y > getMaxY()) -+ y = getMaxY(); -+ setPos(x(), y); -+ calculateWidget(); -+ if(!m_pFText) -+ return; -+ if (m_scene->selectedCount(true) > 1) -+ return; -+ setTextPosition(); -+} -+ -+/** -+ * Check to see if the given ObjectWidget is involved in the message. -+ * -+ * @param w The ObjectWidget to check for. -+ * @return true - if is contained, false - not contained. -+ */ -+bool MessageWidget::hasObjectWidget(ObjectWidget * w) -+{ -+ if(m_pOw[Uml::RoleType::A] == w || m_pOw[Uml::RoleType::B] == w) -+ return true; -+ else -+ return false; -+} -+ -+/** -+ * This method determines whether the message is for "Self" for -+ * an ObjectWidget. -+ * -+ * @retval True If both ObjectWidgets for this widget exists and -+ * are same. -+ */ -+bool MessageWidget::isSelf() const -+{ -+ return (m_pOw[Uml::RoleType::A] && m_pOw[Uml::RoleType::B] && -+ m_pOw[Uml::RoleType::A] == m_pOw[Uml::RoleType::B]); -+} -+ -+void MessageWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ if (sel == ListPopupMenu::mt_Delete) { -+ // This will clean up this widget and the text widget: -+ m_scene->removeWidget(this); -+ } else { -+ -+ UMLWidget::slotMenuSelection(action); -+ } -+} -+ -+/** -+ * Activates a MessageWidget. Connects its m_pOw[] pointers -+ * to UMLObjects and also send signals about its FloatingTextWidget. -+ */ -+bool MessageWidget::activate(IDChangeLog * /*Log = 0*/) -+{ -+ m_scene->resetPastep-kf6oint(); -+ // UMLWidget::activate(Log); CHECK: I don't think we need this ? -+ if (m_pOw[Uml::RoleType::A] == NULL) { -+ UMLWidget *pWA = m_scene->findWidget(m_widgetAId); -+ if (pWA == NULL) { -+ DEBUG(DBG_SRC) << "role A object " << Uml::ID::toString(m_widgetAId) << " not found"; -+ return false; -+ } -+ m_pOw[Uml::RoleType::A] = dynamic_cast(pWA); -+ if (m_pOw[Uml::RoleType::A] == NULL) { -+ DEBUG(DBG_SRC) << "role A widget " << Uml::ID::toString(m_widgetAId) -+ << " is not an ObjectWidget"; -+ return false; -+ } -+ } -+ if (m_pOw[Uml::RoleType::B] == NULL) { -+ UMLWidget *pWB = m_scene->findWidget(m_widgetBId); -+ if (pWB == NULL) { -+ DEBUG(DBG_SRC) << "role B object " << Uml::ID::toString(m_widgetBId) << " not found"; -+ return false; -+ } -+ m_pOw[Uml::RoleType::B] = dynamic_cast(pWB); -+ if (m_pOw[Uml::RoleType::B] == NULL) { -+ DEBUG(DBG_SRC) << "role B widget " << Uml::ID::toString(m_widgetBId) -+ << " is not an ObjectWidget"; -+ return false; -+ } -+ } -+ updateResizability(); -+ -+ UMLClassifier *c = dynamic_cast(m_pOw[Uml::RoleType::B]->umlObject()); -+ UMLOperation *op = NULL; -+ if (c && !m_CustomOp.isEmpty()) { -+ Uml::ID::Type opId = Uml::ID::fromString(m_CustomOp); -+ op = dynamic_cast(c->findChildObjectById(opId, true)); -+ if (op) { -+ // If the UMLOperation is set, m_CustomOp isn't used anyway. -+ // Just setting it empty for the sake of sanity. -+ m_CustomOp.clear(); -+ } -+ } -+ -+ if(!m_pFText) { -+ Uml::TextRole::Enum tr = Uml::TextRole::Seq_Message; -+ if (isSelf()) -+ tr = Uml::TextRole::Seq_Message_Self; -+ m_pFText = new FloatingTextWidget(m_scene, tr, operationText(m_scene)); -+ m_scene->addFloatingTextWidget(m_pFText); -+ m_pFText->setFontCmd(UMLWidget::font()); -+ } -+ if (op) -+ setOperation(op); // This requires a valid m_pFText. -+ setLinkAndTextPos(); -+ m_pFText->setText(QString()); -+ m_pFText->setActivated(); -+ QString messageText = m_pFText->text(); -+ m_pFText->setVisible(messageText.length() > 1); -+ -+ connect(m_pOw[Uml::RoleType::A], SIGNAL(sigWidgetMoved(Uml::ID::Type)), this, SLOT(slotWidgetMoved(Uml::ID::Type))); -+ connect(m_pOw[Uml::RoleType::B], SIGNAL(sigWidgetMoved(Uml::ID::Type)), this, SLOT(slotWidgetMoved(Uml::ID::Type))); -+ -+ connect(this, SIGNAL(sigMessageMoved()), m_pOw[Uml::RoleType::A], SLOT(slotMessageMoved())); -+ connect(this, SIGNAL(sigMessageMoved()), m_pOw[Uml::RoleType::B], SLOT(slotMessageMoved())); -+ m_pOw[Uml::RoleType::A]->messageAdded(this); -+ if (!isSelf()) -+ m_pOw[Uml::RoleType::B]->messageAdded(this); -+ -+ // Calculate the size and position of the message widget -+ calculateDimensions(); -+ -+ // Position the floating text accordingly -+ setTextPosition(); -+ -+ emit sigMessageMoved(); -+ return true; -+} -+ -+/** -+ * Resolve references of this message so they reference the correct -+ * new object widgets after paste. -+ */ -+void MessageWidget::resolveObjectWidget(IDChangeLog* log) { -+ m_widgetAId = log->findNewID(m_widgetAId); -+ m_widgetBId = log->findNewID(m_widgetBId); -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ * -+ * @param ft The text widget which to update. -+ */ -+void MessageWidget::setMessageText(FloatingTextWidget *ft) -+{ -+ if (ft == NULL) -+ return; -+ ft->setSequenceNumber(m_SequenceNumber); -+ ft->setText(operationText(m_scene)); -+ setTextPosition(); -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ * -+ * @param ft The text widget which to update. -+ * @param newText The new text to set. -+ */ -+void MessageWidget::setText(FloatingTextWidget *ft, const QString &newText) -+{ -+ ft->setText(newText); -+ UMLApp::app()->document()->setModified(true); -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ * -+ * @param op The new operation string to set. -+ */ -+void MessageWidget::setOperationText(const QString &op) -+{ -+ m_CustomOp = op; ///FIXME m_pOperation -+} -+ -+/** -+ * Implements operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ */ -+void MessageWidget::lwSetFont (QFont font) -+{ -+ UMLWidget::setFont(font); -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ * @todo Move to LinkWidget. -+ */ -+UMLClassifier *MessageWidget::operationOwner() -+{ -+ UMLObject *pObject = m_pOw[Uml::RoleType::B]->umlObject(); -+ if (pObject == NULL) -+ return NULL; -+ UMLClassifier *c = dynamic_cast(pObject); -+ return c; -+} -+ -+/** -+ * Implements operation from LinkWidget. -+ * Motivated by FloatingTextWidget. -+ */ -+UMLOperation *MessageWidget::operation() -+{ -+ return static_cast(m_umlObject); -+} -+ -+/** -+ * Implements operation from LinkWidget. -+ * Motivated by FloatingTextWidget. -+ */ -+void MessageWidget::setOperation(UMLOperation *op) -+{ -+ if (m_umlObject && m_pFText) -+ disconnect(m_umlObject, SIGNAL(modified()), m_pFText, SLOT(setMessageText())); -+ m_umlObject = op; -+ if (m_umlObject && m_pFText) { -+ connect(m_umlObject, SIGNAL(modified()), m_pFText, SLOT(setMessageText())); -+ m_pFText->setMessageText(); -+ } -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ */ -+QString MessageWidget::customOpText() -+{ -+ return m_CustomOp; -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ */ -+void MessageWidget::setCustomOpText(const QString &opText) -+{ -+ m_CustomOp = opText; -+ m_pFText->setMessageText(); -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ */ -+QString MessageWidget::lwOperationText() -+{ -+ UMLOperation *pOperation = operation(); -+ if (pOperation != NULL) { -+ return pOperation->toString(Uml::SignatureType::SigNoVis); -+ } else { -+ return customOpText(); -+ } -+} -+ -+/** -+ * Overrides operation from LinkWidget. -+ * Required by FloatingTextWidget. -+ */ -+UMLClassifier *MessageWidget::lwClassifier() -+{ -+ UMLObject *o = m_pOw[Uml::RoleType::B]->umlObject(); -+ UMLClassifier *c = dynamic_cast(o); -+ return c; -+} -+ -+/** -+ * Calculates the size of the widget by calling -+ * calculateDimensionsSynchronous(), -+ * calculateDimensionsAsynchronous(), or -+ * calculateDimensionsCreation() -+ */ -+void MessageWidget::calculateDimensions() -+{ -+ if (m_sequenceMessageType == Uml::SequenceMessage::Synchronous) { -+ calculateDimensionsSynchronous(); -+ } else if (m_sequenceMessageType == Uml::SequenceMessage::Asynchronous) { -+ calculateDimensionsAsynchronous(); -+ } else if (m_sequenceMessageType == Uml::SequenceMessage::Creation) { -+ calculateDimensionsCreation(); -+ } else if (m_sequenceMessageType == Uml::SequenceMessage::Lost) { -+ calculateDimensionsLost(); -+ } else if (m_sequenceMessageType == Uml::SequenceMessage::Found) { -+ calculateDimensionsFound(); -+ } else { -+ uWarning() << "Unknown message type"; -+ } -+ if (! UMLApp::app()->document()->loading()) { -+ adjustAssocs(x(), y()); // adjust assoc lines -+ } -+} -+ -+/** -+ * Calculates and sets the size of the widget for a synchronous message. -+ */ -+void MessageWidget::calculateDimensionsSynchronous() -+{ -+ int x = 0; -+ -+ int x1 = m_pOw[Uml::RoleType::A]->centerX(); -+ int x2 = m_pOw[Uml::RoleType::B]->centerX(); -+ -+ int widgetWidth = 0; -+ int widgetHeight = 0; -+ if(isSelf()) { -+ widgetWidth = 50; -+ x = x1 - 2; -+ } else if(x1 < x2) { -+ x = x1; -+ widgetWidth = x2 - x1 + 8; -+ } else { -+ x = x2 - 8; -+ widgetWidth = x1 - x2 + 8; -+ } -+ -+ if (height() < 20) { -+ widgetHeight = 20; -+ } else { -+ widgetHeight = height(); -+ } -+ -+ setX(x); -+ setSize(widgetWidth, widgetHeight); -+} -+ -+/** -+ * Calculates and sets the size of the widget for an asynchronous message. -+ */ -+void MessageWidget::calculateDimensionsAsynchronous() -+{ -+ int x = 0; -+ -+ int x1 = m_pOw[Uml::RoleType::A]->centerX(); -+ int x2 = m_pOw[Uml::RoleType::B]->centerX(); -+ -+ int widgetWidth = 0; -+ int widgetHeight = 8; -+ if(isSelf()) { -+ widgetWidth = 50; -+ x = x1; -+ if(height() < 20) { -+ widgetHeight = 20; -+ } else { -+ widgetHeight = height(); -+ } -+ } else if(x1 < x2) { -+ x = x1; -+ widgetWidth = x2 - x1; -+ } else { -+ x = x2; -+ widgetWidth = x1 - x2; -+ } -+ x += 1; -+ widgetWidth -= 2; -+ setX(x); -+ setSize(widgetWidth, widgetHeight); -+} -+ -+/** -+ * Calculates and sets the size of the widget for a creation message. -+ */ -+void MessageWidget::calculateDimensionsCreation() -+{ -+ int x = 0; -+ -+ int x1 = m_pOw[Uml::RoleType::A]->centerX(); -+ int x2 = m_pOw[Uml::RoleType::B]->x(); -+ int w2 = m_pOw[Uml::RoleType::B]->width(); -+ -+ if (x1 > x2) -+ x2 += w2; -+ -+ int widgetWidth = 0; -+ int widgetHeight = 8; -+ if (x1 < x2) { -+ x = x1; -+ widgetWidth = x2 - x1; -+ } else { -+ x = x2; -+ widgetWidth = x1 - x2; -+ } -+ x += 1; -+ widgetWidth -= 2; -+ setPos(x, m_pOw[Uml::RoleType::B]->y() + m_pOw[Uml::RoleType::B]->height() / 2); -+ setSize(widgetWidth, widgetHeight); -+} -+ -+/** -+ * Calculates and sets the size of the widget for a lost message. -+ */ -+void MessageWidget::calculateDimensionsLost() -+{ -+ int x = 0; -+ -+ int x1 = m_pOw[Uml::RoleType::A]->centerX(); -+ int x2 = m_xclicked; -+ -+ int widgetWidth = 0; -+ int widgetHeight = 10; -+ if(x1 < x2) { -+ x = x1; -+ widgetWidth = x2 - x1 + circleWidth/2; -+ } else { -+ x = x2 - circleWidth/2; -+ widgetWidth = x1 - x2 + circleWidth/2; -+ } -+ setX(x); -+ setSize(widgetWidth, widgetHeight); -+} -+ -+/** -+ * Calculates and sets the size of the widget for a found message. -+ */ -+void MessageWidget::calculateDimensionsFound() -+{ -+ int x = 0; -+ -+ int x1 = m_pOw[Uml::RoleType::A]->centerX(); -+ int x2 = m_xclicked; -+ -+ int widgetWidth = 0; -+ int widgetHeight = 10; -+ if(x1 < x2) { -+ x = x1; -+ widgetWidth = x2 - x1 + circleWidth/2; -+ } else { -+ x = x2 - circleWidth/2; -+ widgetWidth = x1 - x2 + circleWidth/2; -+ } -+ -+ setX(x); -+ setSize(widgetWidth, widgetHeight); -+} -+ -+/** -+ * Used to cleanup any other widget it may need to delete. -+ */ -+void MessageWidget::cleanup() -+{ -+ if (m_pOw[Uml::RoleType::A]) { -+ disconnect(this, SIGNAL(sigMessageMoved()), m_pOw[Uml::RoleType::A], SLOT(slotMessageMoved())); -+ m_pOw[Uml::RoleType::A]->messageRemoved(this); -+ } -+ if (m_pOw[Uml::RoleType::B]) { -+ disconnect(this, SIGNAL(sigMessageMoved()), m_pOw[Uml::RoleType::B], SLOT(slotMessageMoved())); -+ m_pOw[Uml::RoleType::B]->messageRemoved(this); -+ } -+ -+ UMLWidget::cleanup(); -+ if (m_pFText) { -+ m_scene->removeWidgetCmd(m_pFText); -+ m_pFText = NULL; -+ } -+} -+ -+/** -+ * Sets the state of whether the widget is selected. -+ * -+ * @param _select True if the widget is selected. -+ */ -+void MessageWidget::setSelected(bool _select) -+{ -+ UMLWidget::setSelected(_select); -+ if(!m_pFText || m_pFText->displayText().isEmpty()) -+ return; -+ if(isSelected() && m_pFText->isSelected()) -+ return; -+ if(!isSelected() && !m_pFText->isSelected()) -+ return; -+ -+ m_pFText->setSelected(isSelected()); -+} -+ -+/** -+ * Returns the minimum height this widget should be set at on -+ * a sequence diagrams. Takes into account the widget positions -+ * it is related to. -+ */ -+int MessageWidget::getMinY() -+{ -+ if (!m_pOw[Uml::RoleType::A] || !m_pOw[Uml::RoleType::B]) { -+ return 0; -+ } -+ if (m_sequenceMessageType == Uml::SequenceMessage::Creation) { -+ return m_pOw[Uml::RoleType::A]->y() + m_pOw[Uml::RoleType::A]->height(); -+ } -+ int heightA = m_pOw[Uml::RoleType::A]->y() + m_pOw[Uml::RoleType::A]->height(); -+ int heightB = m_pOw[Uml::RoleType::B]->y() + m_pOw[Uml::RoleType::B]->height(); -+ int height = heightA; -+ if(heightA < heightB) { -+ height = heightB; -+ } -+ return height; -+} -+ -+/** -+ * Returns the maximum height this widget should be set at on -+ * a sequence diagrams. Takes into account the widget positions -+ * it is related to. -+ */ -+int MessageWidget::getMaxY() -+{ -+ if(!m_pOw[Uml::RoleType::A] || !m_pOw[Uml::RoleType::B]) { -+ return 0; -+ } -+ int heightA = (int)((ObjectWidget*)m_pOw[Uml::RoleType::A])->getEndLineY(); -+ int heightB = (int)((ObjectWidget*)m_pOw[Uml::RoleType::B])->getEndLineY(); -+ int height = heightA; -+ if(heightA > heightB) { -+ height = heightB; -+ } -+ return (height - this->height()); -+} -+ -+/** -+ * Sets the related widget on the given side. -+ * -+ * @param ow The ObjectWidget we are related to. -+ * @param role The Uml::RoleType::Enum to be set for the ObjectWidget -+ */ -+void MessageWidget::setObjectWidget(ObjectWidget * ow, Uml::RoleType::Enum role) -+{ -+ m_pOw[role] = ow; -+ updateResizability(); -+} -+ -+/** -+ * Returns the related widget on the given side. -+ * -+ * @return The ObjectWidget we are related to. -+ */ -+ObjectWidget* MessageWidget::objectWidget(Uml::RoleType::Enum role) -+{ -+ return m_pOw[role]; -+} -+ -+/** -+ * Set the xclicked -+ */ -+void MessageWidget::setxclicked(int xclick) -+{ -+ m_xclicked = xclick; -+} -+ -+/** -+ * Set the yclicked -+ */ -+void MessageWidget::setyclicked(int yclick) -+{ -+ m_yclicked = yclick; -+} -+ -+/** -+ * Event handler for mouse double click events. -+ * @param event QGraphicsSceneMouseEvent which triggered the double click event -+ */ -+void MessageWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) -+{ -+ Q_UNUSED(event) -+ DEBUG(DBG_SRC) << "NOT IMPLEMENTED YET!"; -+ if (m_pFText != NULL) { -+ DEBUG(DBG_SRC) << "NOT IMPLEMENTED YET - on floating text widget!"; -+// QAction* action = m_pMenu->getAction(ListPopupMenu::mt_Select_Operation); -+// m_pFText->slotMenuSelection(action); -+ } -+} -+ -+/** -+ * Saves to the "messagewidget" XMI element. -+ */ -+void MessageWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement messageElement = qDoc.createElement(QLatin1String("messagewidget")); -+ UMLWidget::saveToXMI(qDoc, messageElement); -+ LinkWidget::saveToXMI(qDoc, messageElement); -+ if (m_pOw[Uml::RoleType::A]) -+ messageElement.setAttribute(QLatin1String("widgetaid"), Uml::ID::toString(m_pOw[Uml::RoleType::A]->localID())); -+ if (m_pOw[Uml::RoleType::B]) -+ messageElement.setAttribute(QLatin1String("widgetbid"), Uml::ID::toString(m_pOw[Uml::RoleType::B]->localID())); -+ UMLOperation *pOperation = operation(); -+ if (pOperation) -+ messageElement.setAttribute(QLatin1String("operation"), Uml::ID::toString(pOperation->id())); -+ else -+ messageElement.setAttribute(QLatin1String("operation"), m_CustomOp); -+ messageElement.setAttribute(QLatin1String("sequencemessagetype"), m_sequenceMessageType); -+ if (m_sequenceMessageType == Uml::SequenceMessage::Lost || m_sequenceMessageType == Uml::SequenceMessage::Found) { -+ messageElement.setAttribute(QLatin1String("xclicked"), m_xclicked); -+ messageElement.setAttribute(QLatin1String("yclicked"), m_yclicked); -+ } -+ -+ // save the corresponding message text -+ if (m_pFText && !m_pFText->text().isEmpty()) { -+ messageElement.setAttribute(QLatin1String("textid"), Uml::ID::toString(m_pFText->id())); -+ m_pFText->saveToXMI(qDoc, messageElement); -+ } -+ -+ qElement.appendChild(messageElement); -+} -+ -+/** -+ * Loads from the "messagewidget" XMI element. -+ */ -+bool MessageWidget::loadFromXMI(QDomElement& qElement) -+{ -+ if (!UMLWidget::loadFromXMI(qElement)) { -+ return false; -+ } -+ if (!LinkWidget::loadFromXMI(qElement)) { -+ return false; -+ } -+ QString textid = qElement.attribute(QLatin1String("textid"), QLatin1String("-1")); -+ QString widgetaid = qElement.attribute(QLatin1String("widgetaid"), QLatin1String("-1")); -+ QString widgetbid = qElement.attribute(QLatin1String("widgetbid"), QLatin1String("-1")); -+ m_CustomOp = qElement.attribute(QLatin1String("operation")); -+ QString sequenceMessageType = qElement.attribute(QLatin1String("sequencemessagetype"), QLatin1String("1001")); -+ m_sequenceMessageType = Uml::SequenceMessage::fromInt(sequenceMessageType.toInt()); -+ if (m_sequenceMessageType == Uml::SequenceMessage::Lost || m_sequenceMessageType == Uml::SequenceMessage::Found) { -+ m_xclicked = qElement.attribute(QLatin1String("xclicked"), QLatin1String("-1")).toFloat(); -+ m_yclicked = qElement.attribute(QLatin1String("yclicked"), QLatin1String("-1")).toFloat(); -+ } -+ -+ m_widgetAId = Uml::ID::fromString(widgetaid); -+ m_widgetBId = Uml::ID::fromString(widgetbid); -+ m_textId = Uml::ID::fromString(textid); -+ -+ Uml::TextRole::Enum tr = Uml::TextRole::Seq_Message; -+ if (m_widgetAId == m_widgetBId) -+ tr = Uml::TextRole::Seq_Message_Self; -+ -+ //now load child elements -+ QDomNode node = qElement.firstChild(); -+ QDomElement element = node.toElement(); -+ if (!element.isNull()) { -+ QString tag = element.tagName(); -+ if (tag == QLatin1String("floatingtext") || tag == QLatin1String("UML::FloatingTextWidget")) { -+ m_pFText = new FloatingTextWidget(m_scene, tr, operationText(m_scene), m_textId); -+ m_scene->addFloatingTextWidget(m_pFText); -+ if(! m_pFText->loadFromXMI(element)) { -+ // Most likely cause: The FloatingTextWidget is empty. -+ delete m_pFText; -+ m_pFText = NULL; -+ } -+ else -+ m_pFText->setSequenceNumber(m_SequenceNumber); -+ } else { -+ uError() << "unknown tag " << tag; -+ } -+ } -+ return true; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/messagewidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/messagewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/messagewidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/messagewidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,212 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef MESSAGEWIDGET_H -+#define MESSAGEWIDGET_H -+ -+#include "umlwidget.h" -+#include "linkwidget.h" -+ -+// forward declarations -+class FloatingTextWidget; -+class ObjectWidget; -+class QResizeEvent; -+class UMLOperation; -+ -+/** -+ * Used to display a message on a sequence diagram. The message -+ * could be between two objects or a message that calls itself on -+ * an object. This class will only display the line that is -+ * required and the text will be setup by the @ref FloatingTextWidget -+ * widget that is passed in the constructor. A message can be -+ * synchronous (calls a method and gains control back on return, -+ * as happens in most programming languages) or asynchronous -+ * (calls a method and gains back control immediately). -+ * -+ * @short Displays a message. -+ * @author Paul Hensgen -+ * @see UMLWidget -+ * @see ObjectWidget -+ * @see FloatingTextWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class MessageWidget : public UMLWidget, public LinkWidget -+{ -+ Q_OBJECT -+public: -+ MessageWidget(UMLScene * scene, ObjectWidget* a, ObjectWidget* b, -+ int y, Uml::SequenceMessage::Enum sequenceMessageType, -+ Uml::ID::Type id = Uml::ID::None); -+ MessageWidget(UMLScene * scene, Uml::SequenceMessage::Enum sequenceMessageType, -+ Uml::ID::Type id = Uml::ID::None); -+ MessageWidget(UMLScene * scene, ObjectWidget* a, int xclick, int yclick, -+ Uml::SequenceMessage::Enum sequenceMessageType, -+ Uml::ID::Type id = Uml::ID::None); -+ virtual ~MessageWidget(); -+ -+ virtual void setY(qreal y); -+ -+ //---------- LinkWidget Interface methods implemementation from now on. -+ -+ virtual void lwSetFont (QFont font); -+ virtual UMLClassifier *operationOwner(); -+ -+ virtual UMLOperation *operation(); -+ virtual void setOperation(UMLOperation *op); -+ -+ virtual QString customOpText(); -+ virtual void setCustomOpText(const QString &opText); -+ -+ virtual void setMessageText(FloatingTextWidget *ft); -+ virtual void setText(FloatingTextWidget *ft, const QString &newText); -+ -+ virtual QString lwOperationText(); -+ virtual UMLClassifier *lwClassifier(); -+ virtual void setOperationText(const QString &op); -+ -+ virtual void constrainTextPos(qreal &textX, qreal &textY, qreal textWidth, qreal textHeight, -+ Uml::TextRole::Enum tr); -+ -+ //---------- End LinkWidget Interface methods implemementation. -+ -+ /// @return Whether the message is synchronous or asynchronous -+ Uml::SequenceMessage::Enum sequenceMessageType() const { -+ return m_sequenceMessageType; -+ } -+ -+ bool hasObjectWidget(ObjectWidget * w); -+ -+ ObjectWidget* objectWidget(Uml::RoleType::Enum role); -+ void setObjectWidget(ObjectWidget * ow, Uml::RoleType::Enum role) ; -+ -+ bool isSelf() const; -+ -+ /** -+ * Returns the text widget it is related to. -+ * -+ * @return The text widget we are related to. -+ */ -+ FloatingTextWidget * floatingTextWidget() { -+ return m_pFText; -+ } -+ -+ /** -+ * Sets the text widget it is related to. -+ * -+ * @param f The text widget we are related to. -+ */ -+ void setFloatingTextWidget(FloatingTextWidget * f) { -+ m_pFText = f; -+ } -+ -+ void calculateWidget(); -+ -+ virtual bool activate(IDChangeLog * Log = 0); -+ void resolveObjectWidget(IDChangeLog* log); -+ -+ void calculateDimensions(); -+ void calculateDimensionsSynchronous(); -+ void calculateDimensionsAsynchronous(); -+ void calculateDimensionsCreation(); -+ void calculateDimensionsLost(); -+ void calculateDimensionsFound(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ void setTextPosition(); -+ -+ void cleanup(); -+ -+ void setSelected(bool _select); -+ -+ int getMinY(); -+ int getMaxY(); -+ -+ UMLWidget* onWidget(const QPointF& p); -+ -+ virtual void resizeWidget(qreal newW, qreal newH); -+ -+ virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ virtual bool loadFromXMI(QDomElement & qElement); -+ -+ void setxclicked(int xclick); -+ void setyclicked(int yclick); -+ -+ /** -+ * Return the xclicked -+ */ -+ int getxclicked() const { -+ return m_xclicked; -+ } -+ -+protected: -+ virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); -+ -+ virtual void moveWidgetBy(qreal diffX, qreal diffY); -+ virtual void constrainMovementForAllWidgets(qreal &diffX, qreal &diffY); -+ -+ virtual QCursor resizeCursor() const; -+ -+ void setLinkAndTextPos(); -+ -+ int constrainX(int textX, int textWidth, Uml::TextRole::Enum tr); -+ -+ static void paintArrow(QPainter *p, int x, int y, int w, -+ Qt::ArrowType direction, bool useDottedLine = false); -+ static void paintsolid-kf6Arrowhead(QPainter *p, int x, int y, Qt::ArrowType direction); -+ -+ void updateResizability(); -+ -+ void paintSynchronous(QPainter *painter, const QStyleOptionGraphicsItem *option); -+ void paintAsynchronous(QPainter *painter, const QStyleOptionGraphicsItem *option); -+ void paintCreation(QPainter *painter, const QStyleOptionGraphicsItem *option); -+ void paintLost(QPainter *painter, const QStyleOptionGraphicsItem *option); -+ void paintFound(QPainter *painter, const QStyleOptionGraphicsItem *option); -+ -+ // Data loaded/saved -+ QString m_CustomOp; -+ /** -+ * Whether the message is synchronous or asynchronous -+ */ -+ Uml::SequenceMessage::Enum m_sequenceMessageType; -+ -+private: -+ void resizeEvent(QResizeEvent *re); -+ -+ qreal constrainPositionY(qreal diffY); -+ -+ void init(); -+ -+ ObjectWidget * m_pOw[2]; -+ FloatingTextWidget * m_pFText; -+ -+ int m_xclicked; -+ int m_yclicked; -+ -+ /** -+ * The following variables are used by loadFromXMI() as an intermediate -+ * store. activate() resolves the IDs, i.e. after activate() the variables -+ * m_pOw[] and m_pFText can be used. -+ */ -+ Uml::ID::Type m_widgetAId, m_widgetBId, m_textId; -+ -+public slots: -+ void slotWidgetMoved(Uml::ID::Type id); -+ void slotMenuSelection(QAction* action); -+ -+signals: -+ /** -+ * emitted when the message widget is moved up or down -+ * slots into ObjectWidget::slotMessageMoved() -+ */ -+ void sigMessageMoved(); -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/nodewidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/nodewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/nodewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/nodewidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,156 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "nodewidget.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "node.h" -+#include "umlscene.h" -+#include "umlview.h" -+ -+// qt includes -+#include -+#include -+ -+DEBUG_REGISTER_DISABLED(NodeWidget) -+ -+/** -+ * Constructs a NodeWidget. -+ * -+ * @param scene The parent of this NodeWidget. -+ * @param n The UMLNode this will be representing. -+ */ -+NodeWidget::NodeWidget(UMLScene * scene, UMLNode *n) -+ : UMLWidget(scene, WidgetBase::wt_Node, n) -+{ -+ setSize(100, 30); -+ setZValue(1); // above box but below UMLWidget because may embed widgets -+} -+ -+/** -+ * Destructor. -+ */ -+NodeWidget::~NodeWidget() -+{ -+} -+ -+/** -+ * Overrides standard method. -+ */ -+void NodeWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) { -+ painter->setBrush(UMLWidget::fillColor()); -+ } else { -+ painter->setBrush(m_scene->backgroundColor()); -+ } -+ const int w = width(); -+ const int h = height(); -+ const int wDepth = (w/3 > DEPTH ? DEPTH : w/3); -+ const int hDepth = (h/3 > DEPTH ? DEPTH : h/3); -+ const int bodyOffsetY = hDepth; -+ const int bodyWidth = w - wDepth; -+ const int bodyHeight = h - hDepth; -+ QFont font = UMLWidget::font(); -+ font.setBold(true); -+ const QFontMetrics &fm = getFontMetrics(FT_BOLD); -+ const int fontHeight = fm.lineSpacing(); -+ QString nameStr = name(); -+ -+ QPolygon pointArray(5); -+ pointArray.setPoint(0, 0, bodyOffsetY); -+ pointArray.setPoint(1, wDepth, 0); -+ pointArray.setPoint(2, w, 0); -+ pointArray.setPoint(3, w, bodyHeight); -+ pointArray.setPoint(4, bodyWidth, h); -+ painter->drawPolygon(pointArray); -+ painter->drawRect(0, bodyOffsetY, bodyWidth, bodyHeight); -+ painter->drawLine(w, 0, bodyWidth, bodyOffsetY); -+ -+ painter->setPen(textColor()); -+ painter->setFont(font); -+ -+ int lines = 1; -+ if (m_umlObject) { -+ QString stereotype = m_umlObject->stereotype(); -+ if (!stereotype.isEmpty()) { -+ painter->drawText(0, bodyOffsetY + (bodyHeight/2) - fontHeight, -+ bodyWidth, fontHeight, Qt::AlignCenter, m_umlObject->stereotype(true)); -+ lines = 2; -+ } -+ } -+ -+ if (UMLWidget::isInstance()) { -+ font.setUnderline(true); -+ painter->setFont(font); -+ nameStr = UMLWidget::instanceName() + QLatin1String(" : ") + nameStr; -+ } -+ -+ if (lines == 1) { -+ painter->drawText(0, bodyOffsetY + (bodyHeight/2) - (fontHeight/2), -+ bodyWidth, fontHeight, Qt::AlignCenter, nameStr); -+ } else { -+ painter->drawText(0, bodyOffsetY + (bodyHeight/2), -+ bodyWidth, fontHeight, Qt::AlignCenter, nameStr); -+ } -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF NodeWidget::minimumSize() const -+{ -+ if (m_umlObject == NULL) { -+ DEBUG(DBG_SRC) << "m_umlObject is NULL"; -+ return UMLWidget::minimumSize(); -+ } -+ -+ const QFontMetrics &fm = getFontMetrics(FT_BOLD_ITALIC); -+ const int fontHeight = fm.lineSpacing(); -+ -+ QString name = m_umlObject->name(); -+ if (UMLWidget::isInstance()) { -+ name = UMLWidget::instanceName() + QLatin1String(" : ") + name; -+ } -+ -+ int width = fm.width(name) + 2 * defaultMargin; -+ -+ int tempWidth = 0; -+ if (!m_umlObject->stereotype().isEmpty()) { -+ tempWidth = fm.width(m_umlObject->stereotype(true)); -+ } -+ if (tempWidth > width) -+ width = tempWidth; -+ width += DEPTH; -+ -+ int height = (2*fontHeight) + DEPTH; -+ -+ return QSizeF(width, height); -+} -+ -+/** -+ * Saves to the "nodewidget" XMI element. -+ * Note: For loading we use the method inherited from UMLWidget. -+ */ -+void NodeWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement conceptElement = qDoc.createElement(QLatin1String("nodewidget")); -+ UMLWidget::saveToXMI(qDoc, conceptElement); -+ qElement.appendChild(conceptElement); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/nodewidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/nodewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/nodewidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/nodewidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,44 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef NODEWIDGET_H -+#define NODEWIDGET_H -+ -+#include "umlwidget.h" -+ -+class UMLNode; -+ -+/** -+ * Defines a graphical version of the Node. Most of the functionality -+ * will come from the @ref UMLNode class. -+ * -+ * @short A graphical version of a Node. -+ * @author Jonathan Riddell -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class NodeWidget : public UMLWidget -+{ -+public: -+ -+ NodeWidget(UMLScene * scene, UMLNode *n); -+ virtual ~NodeWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+protected: -+ QSizeF minimumSize() const; -+ -+ static const int DEPTH = 30; ///< pixels on Z axis -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/notewidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/notewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/notewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/notewidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,517 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "notewidget.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "docwindow.h" -+#include "listpopupmenu.h" -+#include "notedialog.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "umlview.h" -+ -+// kde includes -+#include -+#if QT_VERSION < 0x050000 -+#include -+#include -+#endif -+ -+// qt includes -+#include -+#if QT_VERSION >= 0x050000 -+#include -+#include -+#endif -+ -+NoteWidget * NoteWidget::s_pCurrentNote; -+ -+/** -+ * Constructs a NoteWidget. -+ * -+ * @param scene The parent to this widget. -+ * @param noteType The NoteWidget::NoteType of this NoteWidget -+ * @param id The unique id of the widget. -+ * The default (-1) will prompt a new ID. -+ */ -+NoteWidget::NoteWidget(UMLScene * scene, NoteType noteType , Uml::ID::Type id) -+ : UMLWidget(scene, WidgetBase::wt_Note, id), -+ m_diagramLink(Uml::ID::None), -+ m_noteType(noteType) -+{ -+ setZValue(20); //make sure always on top. -+} -+ -+/** -+ * Destructor. -+ */ -+NoteWidget::~NoteWidget() -+{ -+} -+ -+/** -+ * Override default method. -+ */ -+void NoteWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ const int margin = 10; -+ int w = width(); -+ int h = height(); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ QPolygon poly(6); -+ poly.setPoint(0, 0, 0); -+ poly.setPoint(1, 0, h); -+ poly.setPoint(2, w, h); -+ poly.setPoint(3, w, margin); -+ poly.setPoint(4, w - margin, 0); -+ poly.setPoint(5, 0, 0); -+ -+ setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) { -+ QBrush brush(UMLWidget::fillColor()); -+ painter->setBrush(brush); -+ painter->drawPolygon(poly); -+ } else -+ painter->drawPolyline(poly); -+ painter->drawLine(w - margin, 0, w - margin, margin); -+ painter->drawLine(w - margin, margin, w, margin); -+ painter->setPen(textColor()); -+ switch(m_noteType) { -+ case NoteWidget::PreCondition : -+ painter->drawText(0, margin, w, fontHeight, Qt::AlignCenter, QLatin1String("<< precondition >>")); -+ break; -+ case NoteWidget::PostCondition : -+ painter->drawText(0, margin, w, fontHeight, Qt::AlignCenter, QLatin1String("<< postcondition >>")); -+ break; -+ case NoteWidget::Transformation : -+ painter->drawText(0, margin, w, fontHeight, Qt::AlignCenter, QLatin1String("<< transformation >>")); -+ break; -+ case NoteWidget::Normal : -+ default : -+ break; -+ } -+ -+ UMLWidget::paint(painter, option, widget); -+ -+// paintText(&p, 0, 0); -+ paintTextWordWrap(painter); -+} -+ -+/** -+ * Returns the type of note. -+ */ -+NoteWidget::NoteType NoteWidget::noteType() const -+{ -+ return m_noteType; -+} -+ -+/** -+ * Converts a string to NoteWidget::NoteType. -+ */ -+NoteWidget::NoteType NoteWidget::stringToNoteType(const QString& noteType) -+{ -+ if (noteType == QLatin1String("Precondition")) -+ return NoteWidget::PreCondition; -+ else if (noteType == QLatin1String("Postcondition")) -+ return NoteWidget::PostCondition; -+ else if (noteType == QLatin1String("Transformation")) -+ return NoteWidget::Transformation; -+ else -+ return NoteWidget::Normal; -+} -+ -+/** -+ * Sets the type of note. -+ */ -+void NoteWidget::setNoteType(NoteType noteType) -+{ -+ m_noteType = noteType; -+} -+ -+/** -+ * Sets the type of note. -+ */ -+void NoteWidget::setNoteType(const QString& noteType) -+{ -+ setNoteType(stringToNoteType(noteType)); -+} -+ -+/** -+ * Return the ID of the diagram hyperlinked to this note. -+ * -+ * @return ID of an UMLView, or Uml::ID::None if no -+ * hyperlink is set. -+ */ -+Uml::ID::Type NoteWidget::diagramLink() const -+{ -+ return m_diagramLink; -+} -+ -+/** -+ * Set the ID of the diagram hyperlinked to this note. -+ * To switch off the hyperlink, set this to Uml::id_None. -+ * -+ * @param viewID ID of an UMLScene. -+ */ -+void NoteWidget::setDiagramLink(Uml::ID::Type viewID) -+{ -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ UMLView *view = umldoc->findView(viewID); -+ if (view == NULL) { -+ uError() << "no view found for viewID " << Uml::ID::toString(viewID); -+ return; -+ } -+ QString linkText(QLatin1String("Diagram: ") + view->umlScene()->name()); -+ setDocumentation(linkText); -+ m_diagramLink = viewID; -+ update(); -+} -+ -+/** -+ * Display a dialog box to allow the user to choose the note's type. -+ */ -+void NoteWidget::askForNoteType(UMLWidget* &targetWidget) -+{ -+ static const QStringList list = QStringList() << i18n("Precondition") -+ << i18n("Postcondition") -+ << i18n("Transformation"); -+ bool pressedOK = false; -+ -+#if QT_VERSION >= 0x050000 -+ QString type = QInputDialog::getItem (UMLApp::app(), -+ i18n("Note Type"), i18n("Select the Note Type"), list, -+ 0, false, &pressedOK); -+#else -+ QString type = KInputDialog::getItem (i18n("Note Type"), i18n("Select the Note Type"), list, -+ 0, false, &pressedOK, UMLApp::app()); -+#endif -+ -+ if (pressedOK) { -+ dynamic_cast(targetWidget)->setNoteType(type); -+ } else { -+ targetWidget->cleanup(); -+ delete targetWidget; -+ targetWidget = 0; -+ } -+} -+ -+/** -+ * Loads a "notewidget" XMI element. -+ */ -+bool NoteWidget::loadFromXMI(QDomElement & qElement) -+{ -+ if (!UMLWidget::loadFromXMI(qElement)) -+ return false; -+ setZValue(20); //make sure always on top. -+ setDocumentation(qElement.attribute(QLatin1String("text"))); -+ QString diagramlink = qElement.attribute(QLatin1String("diagramlink")); -+ if (!diagramlink.isEmpty()) -+ m_diagramLink = Uml::ID::fromString(diagramlink); -+ QString type = qElement.attribute(QLatin1String("noteType")); -+ setNoteType((NoteType)type.toInt()); -+ return true; -+} -+ -+/** -+ * Saves to the "notewidget" XMI element. -+ */ -+void NoteWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement noteElement = qDoc.createElement(QLatin1String("notewidget")); -+ UMLWidget::saveToXMI(qDoc, noteElement); -+ noteElement.setAttribute(QLatin1String("text"), documentation()); -+ if (m_diagramLink != Uml::ID::None) -+ noteElement.setAttribute(QLatin1String("diagramlink"), Uml::ID::toString(m_diagramLink)); -+ noteElement.setAttribute(QLatin1String("noteType"), m_noteType); -+ qElement.appendChild(noteElement); -+} -+ -+/** -+ * Show a properties dialog for a NoteWidget. -+ */ -+void NoteWidget::showPropertiesDialog() -+{ -+ NoteDialog * dlg = 0; -+ UMLApp::app()->docWindow()->updateDocumentation(false); -+ dlg = new NoteDialog(umlScene()->activeView(), this); -+ if (dlg->exec()) { -+ UMLApp::app()->docWindow()->showDocumentation(this, true); -+ UMLApp::app()->document()->setModified(true); -+ update(); -+ } -+ delete dlg; -+} -+ -+/** -+ * Will be called when a menu selection has been made from the popup -+ * menu. -+ * -+ * @param action The action that has been selected. -+ */ -+void NoteWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch(sel) { -+ case ListPopupMenu::mt_Rename: -+ showPropertiesDialog(); -+ break; -+ -+ default: -+ UMLWidget::slotMenuSelection(action); -+ break; -+ } -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF NoteWidget::minimumSize() const -+{ -+ int width = 60; -+ int height = 30; -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int textWidth = fm.width(documentation()); -+ if (m_noteType == PreCondition) { -+ const int widthtemp = fm.width(QLatin1String("<< precondition >>")); -+ width = textWidth > widthtemp ? textWidth : widthtemp; -+ width += 10; -+ } -+ else if (m_noteType == PostCondition) { -+ const int widthtemp = fm.width(QLatin1String("<< postcondition >>")); -+ width = textWidth > widthtemp ? textWidth : widthtemp; -+ width += 10; -+ } -+ else if (m_noteType == Transformation) { -+ const int widthtemp = fm.width(QLatin1String("<< transformation >>")); -+ width = textWidth > widthtemp ? textWidth : widthtemp; -+ width += 10; -+ } -+ return QSizeF(width, height); -+} -+ -+/** -+ * Calculate content related size of widget. -+ * Overrides method from UMLWidget. -+ */ -+QSizeF NoteWidget::calculateSize(bool withExtensions /* = true */) const -+{ -+ Q_UNUSED(withExtensions) -+ int width = this->width(); -+ int height = this->height(); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int margin = fm.width(QLatin1String("W")); -+ QSize size = fm.size (0, documentation()); -+ const int textWidth = size.width(); -+ if (m_noteType == PreCondition) { -+ const int widthtemp = fm.width(QLatin1String("<< precondition >>")); -+ width = textWidth > widthtemp ? textWidth : widthtemp; -+ width += 2 * margin; -+ } -+ else if (m_noteType == PostCondition) { -+ const int widthtemp = fm.width(QLatin1String("<< postcondition >>")); -+ width = textWidth > widthtemp ? textWidth : widthtemp; -+ width += 2 * margin; -+ } -+ else if (m_noteType == Transformation) { -+ const int widthtemp = fm.width(QLatin1String("<< transformation >>")); -+ width = textWidth > widthtemp ? textWidth : widthtemp; -+ width += 2 * margin; -+ } -+ return QSizeF(width, height); -+} -+ -+/** -+ * Paints the text. Auxiliary to paint(). -+ * Implemented without word wrap. -+ */ -+void NoteWidget::paintText(QPainter *painter) -+{ -+ if (painter == 0) { -+ return; -+ } -+ -+ QString text = documentation(); -+ if (text.length() == 0) { -+ return; -+ } -+ -+ painter->setPen(Qt::black); -+ QFont font = UMLWidget::font(); -+ painter->setFont(font); -+ -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ const int margin = fm.width(QLatin1String("W")); -+ const QSize textSize = fm.size(Qt::TextExpandTabs, text); -+ -+ const int width = this->width() - margin * 2; -+ const int height = this->height() - fontHeight; -+ int textY = fontHeight / 2; -+ int textX = margin; -+ -+ if ((textSize.width() < width) && (textSize.height() < height)) { -+ // the entire text is small enough - draw it -+ painter->drawText(textX, textY, -+ textSize.width(), textSize.height(), -+ Qt::AlignLeft, text); -+ } -+ else { -+ // not all text can be drawn -+ QStringList lines = text.split(QLatin1Char('\n')); -+ foreach(const QString& line, lines) { -+ int lineWidth = fm.width(line); -+ if (lineWidth < width) { -+ // line is small enough - draw it -+ painter->drawText(textX, textY, -+ textSize.width(), fontHeight, -+ Qt::AlignLeft, line); -+ } -+ else { -+ // draw a smaller line -+ for(int len = line.length(); len > 0; --len) { -+ QString smallerLine = line.left(len); -+ int smallerLineWidth = fm.width(smallerLine); -+ if (smallerLineWidth < width) { -+ // line is small enough - draw it -+ painter->drawText(textX, textY, -+ width, fontHeight, -+ Qt::AlignLeft, smallerLine); -+ } -+ } -+ } -+ textY += fontHeight; -+ if (textY > height) { -+ // skip the next lines - size is not enough -+ break; -+ } -+ } -+ } -+} -+ -+/** -+ * Paints the text. Auxiliary to paint(). -+ * Implemented with word wrap. -+ */ -+void NoteWidget::paintTextWordWrap(QPainter *painter) -+{ -+ if (painter == 0) { -+ return; -+ } -+ QString text = documentation(); -+ if (text.length() == 0) { -+ return; -+ } -+ // Implement word wrap for text as follows: -+ // wrap at width on whole words. -+ // if word is wider than width then clip word -+ // if reach height exit and don't print anymore -+ // start new line on \n character -+ painter->setPen(Qt::black); -+ QFont font = UMLWidget::font(); -+ painter->setFont(font); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ QString word; -+ QString fullLine; -+ QString testCombineLine; -+ const int margin = fm.width(QLatin1String("W")); -+ int textY = fontHeight / 2; -+ int textX = margin; -+ const int width = this -> width() - margin * 2; -+ const int height = this -> height() - fontHeight; -+ QChar returnChar = QChar::fromLatin1('\n'); -+ QChar c; -+ -+ for (int i = 0; i <= text.length(); ++i) { -+ if (i < text.length()) { -+ c = text[i]; -+ } else { -+ // all chars of text have been handled already -> -+ // perform this last run to spool current content of "word" -+ c = returnChar; -+ } -+ if (c == returnChar || c.isSpace()) { -+ // new word delimiter found -> it is time to decide on word wrap -+ testCombineLine = fullLine + QLatin1Char(' ') + word; -+ int textWidth = fm.width(testCombineLine); -+ if (textX + textWidth > width) { -+ // combination of "fullLine" and "word" doesn't fit into one line -> -+ // print "fullLine" in current line, update write position to next line -+ // and decide then on following actions -+ painter->drawText(textX, textY, -+ textWidth, fontHeight, Qt::AlignLeft, fullLine); -+ fullLine = word; -+ word = QString(); -+ // update write position -+ textX = margin; -+ textY += fontHeight; -+ if (textY > height) -+ return; -+ // in case of c==newline -> -+ // print "word" and set write position one additional line lower -+ if (c == returnChar) { -+ // print "word" - which is now "fullLine" and set to next line -+ painter->drawText(textX, textY, -+ textWidth, fontHeight, Qt::AlignLeft, fullLine); -+ fullLine = QString(); -+ textX = margin; -+ textY += fontHeight; -+ if(textY > height) return; -+ } -+ } -+ else if (c == returnChar) { -+ // newline found and combination of "fullLine" and "word" fits -+ // in one line -+ painter->drawText(textX, textY, -+ textWidth, fontHeight, Qt::AlignLeft, testCombineLine); -+ fullLine = word = QString(); -+ textX = margin; -+ textY += fontHeight; -+ if (textY > height) -+ return; -+ } else { -+ // word delimiter found, and combination of "fullLine", space and "word" fits into one line -+ fullLine = testCombineLine; -+ word = QString(); -+ } -+ } else { -+ // no word delimiter found --> add current char to "word" -+ if (c != QLatin1Char('\0')) -+ word += c; -+ } -+ }//end for -+} -+ -+/** -+ * Event handler for moude double click events. -+ * -+ * @param event The QGraphicsSceneMouseEvent event. -+ */ -+void NoteWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) -+{ -+ if (event->button() == Qt::LeftButton) { -+ if (m_diagramLink == Uml::ID::None) { -+ showPropertiesDialog(); -+ } else { -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ umldoc->changeCurrentView(m_diagramLink); -+ } -+ event->accept(); -+ } -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/notewidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/notewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/notewidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/notewidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,83 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef NOTEWIDGET_H -+#define NOTEWIDGET_H -+ -+//app includes -+#include "umlwidget.h" -+ -+// Qt forward declarations -+class QPainter; -+ -+/** -+ * Displays a note box to allow multiple lines of text to be displayed. -+ * These widgets are diagram specific. They will still need a unique id -+ * from the @ref UMLDoc class for deletion and other purpose-kf6s. -+ * -+ * @short Displays a note box. -+ * @author Paul Hensgen -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class NoteWidget : public UMLWidget -+{ -+ Q_OBJECT -+public: -+ -+ /// This enum type is used to specify the type of note. -+ enum NoteType -+ { -+ Normal, -+ PreCondition, -+ PostCondition, -+ Transformation -+ }; -+ -+ explicit NoteWidget(UMLScene * scene, NoteWidget::NoteType noteType = Normal, -+ Uml::ID::Type id = Uml::ID::None); -+ virtual ~NoteWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ static NoteType stringToNoteType(const QString& noteType); -+ -+ NoteType noteType() const; -+ void setNoteType(NoteType noteType); -+ void setNoteType(const QString& noteType); -+ -+ Uml::ID::Type diagramLink() const; -+ void setDiagramLink(Uml::ID::Type viewID); -+ -+ void askForNoteType(UMLWidget* &targetWidget); -+ -+ virtual void showPropertiesDialog(); -+ -+ virtual bool loadFromXMI(QDomElement & qElement); -+ virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+ static NoteWidget *s_pCurrentNote; -+ -+public Q_SLOTS: -+ void slotMenuSelection(QAction* action); -+ -+protected: -+ virtual QSizeF minimumSize() const; -+ virtual QSizeF calculateSize(bool withExtensions = true) const; -+ void paintText(QPainter *painter); -+ void paintTextWordWrap(QPainter *painter); -+ virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); -+ -+private: -+ Uml::ID::Type m_diagramLink; ///< The diagram/scene this note links to. -+ NoteType m_noteType; ///< The type of note. @see NoteWidget::NoteType -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/objectnodewidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/objectnodewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/objectnodewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/objectnodewidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,377 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "objectnodewidget.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "docwindow.h" -+#include "dialog_utils.h" -+#include "listpopupmenu.h" -+#include "objectnodedialog.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "umlview.h" -+ -+// kde includes -+#include -+#if QT_VERSION < 0x050000 -+#include -+#endif -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+#include -+#include -+ -+#define OBJECTNODE_MARGIN 5 -+#define OBJECTNODE_WIDTH 30 -+#define OBJECTNODE_HEIGHT 10 -+ -+/** -+ * Creates a Object Node widget. -+ * -+ * @param scene The parent of the widget. -+ * @param objectNodeType The type of object node -+ * @param id The ID to assign (-1 will prompt a new ID.) -+ */ -+ObjectNodeWidget::ObjectNodeWidget(UMLScene * scene, ObjectNodeType objectNodeType, Uml::ID::Type id) -+ : UMLWidget(scene, WidgetBase::wt_ObjectNode, id) -+{ -+ setObjectNodeType(objectNodeType); -+ setState(QString()); -+} -+ -+/** -+ * Destructor. -+ */ -+ObjectNodeWidget::~ObjectNodeWidget() -+{ -+} -+ -+/** -+ * Overrides the standard paint event. -+ */ -+void ObjectNodeWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ int w = width(); -+ int h = height(); -+ -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ int textStartY = (h / 2) - (fontHeight / 2); -+ -+ setPenFromSettings(painter); -+ -+ if (UMLWidget::useFillColor()) { -+ painter->setBrush(UMLWidget::fillColor()); -+ } -+ -+ painter->drawRect(0, 0, w, h); -+ painter->setFont(UMLWidget::font()); -+ -+ switch (m_objectNodeType) -+ { -+ case Normal : break; -+ case Buffer : -+ { -+ painter->setPen(textColor()); -+ painter->drawText(OBJECTNODE_MARGIN, (textStartY/2), w - OBJECTNODE_MARGIN * 2, fontHeight, Qt::AlignHCenter, QLatin1String("<< centralBuffer >>")); -+ painter->drawText(OBJECTNODE_MARGIN, (textStartY/2) + fontHeight + 5, w - OBJECTNODE_MARGIN * 2, fontHeight, Qt::AlignHCenter, name()); -+ } -+ break; -+ case Data : -+ { -+ painter->setPen(textColor()); -+ painter->drawText(OBJECTNODE_MARGIN, (textStartY/2), w - OBJECTNODE_MARGIN * 2, fontHeight, Qt::AlignHCenter, QLatin1String("<< datastore >>")); -+ painter->drawText(OBJECTNODE_MARGIN, (textStartY/2) + fontHeight + 5, w - OBJECTNODE_MARGIN * 2, fontHeight, Qt::AlignHCenter, name()); -+ } -+ break; -+ case Flow : -+ { -+ QString objectflow_value; -+ if (state() == QLatin1String("-") || state().isEmpty()) -+ { -+ objectflow_value = QLatin1Char(' '); -+ } -+ else -+ { -+ objectflow_value = QLatin1Char('[') + state() + QLatin1Char(']'); -+ } -+ -+ painter->drawLine(10, h/2, w-10, h/2); -+ painter->setPen(textColor()); -+ painter->setFont(UMLWidget::font()); -+ painter->drawText(OBJECTNODE_MARGIN, textStartY/2 - OBJECTNODE_MARGIN, w - OBJECTNODE_MARGIN * 2, fontHeight, Qt::AlignHCenter, name()); -+ painter->drawText(OBJECTNODE_MARGIN, textStartY/2 + textStartY + OBJECTNODE_MARGIN, w - OBJECTNODE_MARGIN * 2, fontHeight, Qt::AlignHCenter, objectflow_value); -+ } -+ break; -+ } -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF ObjectNodeWidget::minimumSize() const -+{ -+ int widthtmp = 10, height = 10, width=10; -+ if (m_objectNodeType == Buffer) { -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ const int textWidth = fm.width(QLatin1String("<< centralBuffer >>")); -+ const int namewidth = fm.width(name()); -+ height = fontHeight * 2; -+ widthtmp = textWidth > OBJECTNODE_WIDTH ? textWidth : OBJECTNODE_WIDTH; -+ width = namewidth > widthtmp ? namewidth : widthtmp; -+ height = height > OBJECTNODE_HEIGHT ? height : OBJECTNODE_HEIGHT; -+ width += OBJECTNODE_MARGIN * 2; -+ height += OBJECTNODE_MARGIN * 2 + 5; -+ } else if (m_objectNodeType == Data) { -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ const int textWidth = fm.width(QLatin1String("<< datastore >>")); -+ const int namewidth = fm.width(name()); -+ height = fontHeight * 2; -+ widthtmp = textWidth > OBJECTNODE_WIDTH ? textWidth : OBJECTNODE_WIDTH; -+ width = namewidth > widthtmp ? namewidth : widthtmp; -+ height = height > OBJECTNODE_HEIGHT ? height : OBJECTNODE_HEIGHT; -+ width += OBJECTNODE_MARGIN * 2; -+ height += OBJECTNODE_MARGIN * 2 + 5; -+ } else if (m_objectNodeType == Flow) { -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ const int textWidth = fm.width(QLatin1Char('[') + state() + QLatin1Char(']')); -+ const int namewidth = fm.width(name()); -+ height = fontHeight * 2; -+ widthtmp = textWidth > OBJECTNODE_WIDTH ? textWidth : OBJECTNODE_WIDTH; -+ width = namewidth > widthtmp ? namewidth : widthtmp; -+ height = height > OBJECTNODE_HEIGHT ? height : OBJECTNODE_HEIGHT; -+ width += OBJECTNODE_MARGIN * 2; -+ height += OBJECTNODE_MARGIN * 4; -+ } -+ -+ return QSizeF(width, height); -+} -+ -+/** -+ * Returns the type of object node. -+ */ -+ObjectNodeWidget::ObjectNodeType ObjectNodeWidget::objectNodeType() const -+{ -+ return m_objectNodeType; -+} -+ -+/** -+ * Returns the type of object node. -+ */ -+ObjectNodeWidget::ObjectNodeType ObjectNodeWidget::toObjectNodeType(const QString& type) -+{ -+ if (type == QLatin1String("Central buffer")) -+ return ObjectNodeWidget::Buffer; -+ if (type == QLatin1String("Data store")) -+ return ObjectNodeWidget::Data; -+ if (type == QLatin1String("Object Flow")) -+ return ObjectNodeWidget::Flow; -+ // Shouldn't happen -+ Q_ASSERT(0); -+ return ObjectNodeWidget::Flow; -+} -+ -+/** -+ * Sets the type of object node. -+ */ -+void ObjectNodeWidget::setObjectNodeType(ObjectNodeType objectNodeType) -+{ -+ m_objectNodeType = objectNodeType; -+ UMLWidget::m_resizable = true; -+} -+ -+/** -+ * Sets the type of object node. -+ */ -+void ObjectNodeWidget::setObjectNodeType(const QString& type) -+{ -+ setObjectNodeType(ObjectNodeWidget::toObjectNodeType(type)); -+} -+ -+/** -+ * Sets the state of an object node when it's an objectflow. -+ */ -+void ObjectNodeWidget::setState(const QString& state) -+{ -+ m_state = state; -+ updateGeometry(); -+} -+ -+/** -+ * Returns the state of object node. -+ */ -+QString ObjectNodeWidget::state() const -+{ -+ return m_state; -+} -+ -+/** -+ * Captures any popup menu signals for menus it created. -+ */ -+void ObjectNodeWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch(sel) { -+ case ListPopupMenu::mt_Rename: -+ { -+ bool ok = false; -+ QString text = name(); -+#if QT_VERSION >= 0x050000 -+ text = QInputDialog::getText(Q_NULLPTR, -+ i18n("Enter Object Node Name"), -+ i18n("Enter the name of the object node :"), -+ QLineEdit::Normal, -+ name(), &ok); -+#else -+ text = KInputDialog::getText(i18n("Enter Object Node Name"), -+ i18n("Enter the name of the object node :"), -+ name(), &ok); -+#endif -+ if (ok && !text.isEmpty()) { -+ setName(text); -+ } -+ } -+ break; -+ -+ case ListPopupMenu::mt_Properties: -+ showPropertiesDialog(); -+ break; -+ -+ default: -+ UMLWidget::slotMenuSelection(action); -+ } -+} -+ -+/** -+ * Show a properties dialog for an ObjectNodeWidget. -+ */ -+void ObjectNodeWidget::showPropertiesDialog() -+{ -+ UMLApp::app()->docWindow()->updateDocumentation(false); -+ -+ QPointer dialog = new ObjectNodeDialog(UMLApp::app()->currentView(), this); -+ if (dialog->exec() && dialog->getChangesMade()) { -+ UMLApp::app()->docWindow()->showDocumentation(this, true); -+ UMLApp::app()->document()->setModified(true); -+ } -+ delete dialog; -+} -+ -+/** -+ * Saves the widget to the "objectnodewidget" XMI element. -+ */ -+void ObjectNodeWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement objectNodeElement = qDoc.createElement(QLatin1String("objectnodewidget")); -+ UMLWidget::saveToXMI(qDoc, objectNodeElement); -+ objectNodeElement.setAttribute(QLatin1String("objectnodename"), m_Text); -+ objectNodeElement.setAttribute(QLatin1String("documentation"), m_Doc); -+ objectNodeElement.setAttribute(QLatin1String("objectnodetype"), m_objectNodeType); -+ objectNodeElement.setAttribute(QLatin1String("objectnodestate"), m_state); -+ qElement.appendChild(objectNodeElement); -+} -+ -+/** -+ * Loads the widget from the "objectnodewidget" XMI element. -+ */ -+bool ObjectNodeWidget::loadFromXMI(QDomElement& qElement) -+{ -+ if(!UMLWidget::loadFromXMI(qElement) ) -+ return false; -+ m_Text = qElement.attribute(QLatin1String("objectnodename")); -+ m_Doc = qElement.attribute(QLatin1String("documentation")); -+ QString type = qElement.attribute(QLatin1String("objectnodetype"), QLatin1String("1")); -+ m_state = qElement.attribute(QLatin1String("objectnodestate")); -+ setObjectNodeType((ObjectNodeType)type.toInt()); -+ return true; -+} -+ -+/** -+ * Open a dialog box to select the objectNode type (Data, Buffer or Flow). -+ */ -+void ObjectNodeWidget::askForObjectNodeType(UMLWidget* &targetWidget) -+{ -+ bool pressedOK = false; -+ int current = 0; -+ const QStringList list = QStringList() -+ << QLatin1String("Central buffer") -+ << QLatin1String("Data store") -+ << QLatin1String("Object Flow"); -+ -+#if QT_VERSION >= 0x050000 -+ QString type = QInputDialog::getItem (UMLApp::app(), -+ i18n("Select Object node type"), i18n("Select the object node type"), -+ list, current, false, &pressedOK); -+ -+#else -+ QString type = KInputDialog::getItem (i18n("Select Object node type"), i18n("Select the object node type"), list, current, false, &pressedOK, UMLApp::app()); -+#endif -+ -+ if (pressedOK) { -+ dynamic_cast(targetWidget)->setObjectNodeType(type); -+ if (type == QLatin1String("Data store")) -+ Dialog_Utils::askNameForWidget(targetWidget, i18n("Enter the name of the data store node"), i18n("Enter the name of the data store node"), i18n("data store name")); -+ if (type == QLatin1String("Central buffer")) -+ Dialog_Utils::askNameForWidget(targetWidget, i18n("Enter the name of the buffer node"), i18n("Enter the name of the buffer"), i18n("centralBuffer")); -+ if (type == QLatin1String("Object Flow")) { -+ Dialog_Utils::askNameForWidget(targetWidget, i18n("Enter the name of the object flow"), i18n("Enter the name of the object flow"), i18n("object flow")); -+ askStateForWidget(); -+ } -+ } else { -+ targetWidget->cleanup(); -+ delete targetWidget; -+ targetWidget = NULL; -+ } -+} -+ -+/** -+ * Open a dialog box to input the state of the widget. -+ * This box is shown only if m_objectNodeType = Flow. -+ */ -+void ObjectNodeWidget::askStateForWidget() -+{ -+ bool pressedOK = false; -+#if QT_VERSION >= 0x050000 -+ QString state = QInputDialog::getText(UMLApp::app(), -+ i18n("Enter Object Flow State"), i18n("Enter State (keep '-' if there is no state for the object) "), -+ QLineEdit::Normal, -+ i18n("-"), &pressedOK); -+#else -+ QString state = KInputDialog::getText(i18n("Enter Object Flow State"), i18n("Enter State (keep '-' if there is no state for the object) "), i18n("-"), &pressedOK, UMLApp::app()); -+#endif -+ -+ if (pressedOK) { -+ setState(state); -+ } else { -+ cleanup(); -+ } -+} -+ -+void ObjectNodeWidget::slotOk() -+{ -+ // kdialog-kf6::accept(); -+} -+ -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/objectnodewidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/objectnodewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/objectnodewidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/objectnodewidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,76 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef OBJECTNODEWIDGET_H -+#define OBJECTNODEWIDGET_H -+ -+#include "umlwidget.h" -+ -+/** -+ * This class is the graphical version of a UML Object Node. A ObjectNodeWidget is created -+ * by a @ref UMLView. An ObjectNodeWidget belongs to only one @ref UMLView instance. -+ * When the @ref UMLView instance that this class belongs to, it will be automatically deleted. -+ * -+ * The ObjectNodeWidget class inherits from the @ref UMLWidget class which adds most of the functionality -+ * to this class. -+ * -+ * @short A graphical version of a UML Activity. -+ * @author Florence Mattler -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class ObjectNodeWidget : public UMLWidget -+{ -+ Q_OBJECT -+ -+public: -+ enum ObjectNodeType -+ { -+ Normal, -+ Data, -+ Buffer, -+ Flow -+ }; -+ -+ explicit ObjectNodeWidget(UMLScene * scene, ObjectNodeType objectNodeType = Normal, Uml::ID::Type id = Uml::ID::None); -+ virtual ~ObjectNodeWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ ObjectNodeType objectNodeType() const; -+ static ObjectNodeType toObjectNodeType(const QString& type); -+ -+ void setObjectNodeType(ObjectNodeType objectNodeType); -+ void setObjectNodeType(const QString& type) ; -+ -+ void setState(const QString& state); -+ QString state() const; -+ -+ virtual void showPropertiesDialog(); -+ -+ void askStateForWidget(); -+ void askForObjectNodeType(UMLWidget* &targetWidget); -+ -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ virtual bool loadFromXMI(QDomElement& qElement); -+ -+protected: -+ QSizeF minimumSize() const; -+ -+public slots: -+ void slotMenuSelection(QAction* action); -+ void slotOk(); -+ -+private: -+ ObjectNodeType m_objectNodeType; ///< type of object node -+ QString m_state; ///< state of object node when it's an objectFlow -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/objectwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/objectwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/objectwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/objectwidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,710 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header file -+#include "objectwidget.h" -+ -+// local includes -+#include "classpropertiesdialog.h" -+#include "debug_utils.h" -+#include "docwindow.h" -+#include "listpopupmenu.h" -+#include "messagewidget.h" -+#include "seqlinewidget.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlobject.h" -+#include "umlscene.h" -+#include "umlview.h" -+ -+// kde includes -+#include -+#if QT_VERSION < 0x050000 -+#include -+#endif -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+#include -+#include -+#include -+ -+#define O_MARGIN 5 -+#define O_WIDTH 40 -+#define A_WIDTH 20 -+#define A_HEIGHT 40 -+#define A_MARGIN 5 -+ -+DEBUG_REGISTER_DISABLED(ObjectWidget) -+ -+/** -+ * The number of pixels margin between the lowest message -+ * and the bottom of the vertical line -+ */ -+static const int sequenceLineMargin = 20; -+ -+/** -+ * Creates an ObjectWidget. -+ * -+ * @param scene The parent to this object. -+ * @param o The object it will be representing. -+ */ -+ObjectWidget::ObjectWidget(UMLScene * scene, UMLObject *o) -+ : UMLWidget(scene, WidgetBase::wt_Object, o), -+ m_multipleInstance(false), -+ m_drawAsActor(false), -+ m_showDestruction(false), -+ m_isOnDestructionBox(false) -+{ -+ if (m_scene && (m_scene->type() == Uml::DiagramType::Sequence)) { -+ m_pLine = new SeqLineWidget( m_scene, this ); -+ m_pLine->setStartPoint(x() + width() / 2, y() + height()); -+ } else { -+ m_pLine = 0; -+ } -+} -+ -+/** -+ * Destructor. -+ */ -+ObjectWidget::~ObjectWidget() -+{ -+ cleanup(); -+} -+ -+/** -+ * Sets whether representing a multi-instance object. -+ * -+ * @param multiple Object state. true- multi, false - single. -+ */ -+void ObjectWidget::setMultipleInstance(bool multiple) -+{ -+ //make sure only calling this in relation to an object on a collab. diagram -+ if (m_scene && (m_scene->type() == Uml::DiagramType::Collaboration)) { -+ m_multipleInstance = multiple; -+ updateGeometry(); -+ update(); -+ } -+} -+ -+/** -+ * Returns whether object is representing a multi-object. -+ * -+ * @return True if object is representing a multi-object. -+ */ -+bool ObjectWidget::multipleInstance() const -+{ -+ return m_multipleInstance; -+} -+ -+/** -+ * Overridden from UMLWidget. -+ * Moves the widget to a new position using the difference between the -+ * current position and the new position. -+ * Y position is ignored, and widget is only moved along X axis. -+ * -+ * @param diffX The difference between current X position and new X position. -+ * @param diffY The difference between current Y position and new Y position -+ * (isn't used). -+ */ -+void ObjectWidget::moveWidgetBy(qreal diffX, qreal diffY) -+{ -+ setX(x() + diffX); -+ if (m_scene && (m_scene->type() != Uml::DiagramType::Sequence)) { -+ setY(y() + diffY); -+ } -+} -+ -+/** -+ * Overridden from UMLWidget. -+ * Modifies the value of the diffX and diffY variables used to move the widgets. -+ * All the widgets are constrained to be moved only in X axis (diffY is set to 0). -+ * -+ * @param diffX The difference between current X position and new X position. -+ * @param diffY The difference between current Y position and new Y position. -+ */ -+void ObjectWidget::constrainMovementForAllWidgets(qreal &diffX, qreal &diffY) -+{ -+ Q_UNUSED(diffX); -+ if (m_scene && (m_scene->type() == Uml::DiagramType::Sequence)) { -+ diffY = 0; -+ } -+} -+ -+/** -+ * Override default method. -+ */ -+void ObjectWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ if (m_drawAsActor) -+ paintActor(painter); -+ else -+ paintObject(painter); -+ -+ setPenFromSettings(painter); -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Handles a popup menu selection. -+ */ -+void ObjectWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch(sel) { -+ case ListPopupMenu::mt_Rename_Object: -+ { -+ bool ok; -+ QRegExpValidator* validator = new QRegExpValidator(QRegExp(QLatin1String(".*")), 0); -+#if QT_VERSION >= 0x050000 -+ QString name = QInputDialog::getText(m_scene->activeView(), -+ i18n("Rename Object"), -+ i18n("Enter object name:"), -+ QLineEdit::Normal, -+ m_instanceName, -+ &ok); -+#else -+ QString name = KInputDialog::getText -+ (i18n("Rename Object"), -+ i18n("Enter object name:"), -+ m_instanceName, -+ &ok, -+ m_scene->activeView(), -+ validator); -+#endif -+ if (ok) { -+ m_instanceName = name; -+ updateGeometry(); -+ moveEvent(0); -+ update(); -+ UMLApp::app()->document()->setModified(true); -+ } -+ delete validator; -+ break; -+ } -+ case ListPopupMenu::mt_Properties: -+ showPropertiesDialog(); -+ updateGeometry(); -+ moveEvent(0); -+ update(); -+ break; -+ -+ case ListPopupMenu::mt_Up: -+ tabUp(); -+ break; -+ -+ case ListPopupMenu::mt_Down: -+ tabDown(); -+ break; -+ -+ default: -+ UMLWidget::slotMenuSelection(action); -+ break; -+ } -+} -+ -+/** -+ * Overrides method from UMLWidget -+ */ -+QSizeF ObjectWidget::minimumSize() const -+{ -+ int width, height; -+ const QFontMetrics &fm = getFontMetrics(FT_UNDERLINE); -+ const int fontHeight = fm.lineSpacing(); -+ const QString t = m_instanceName + QLatin1String(" : ") + name(); -+ const int textWidth = fm.width(t); -+ if (m_drawAsActor) { -+ width = textWidth > A_WIDTH?textWidth:A_WIDTH; -+ height = A_HEIGHT + fontHeight + A_MARGIN; -+ width += A_MARGIN * 2; -+ } else { -+ width = textWidth > O_WIDTH?textWidth:O_WIDTH; -+ height = fontHeight + O_MARGIN * 2; -+ width += O_MARGIN * 2; -+ if (m_multipleInstance) { -+ width += 10; -+ height += 10; -+ } -+ }//end else drawasactor -+ -+ return QSizeF(width, height); -+} -+ -+/** -+ * Sets whether to draw as an Actor. -+ * -+ * @param drawAsActor True if widget shall be drawn as an actor. -+ */ -+void ObjectWidget::setDrawAsActor(bool drawAsActor) -+{ -+ m_drawAsActor = drawAsActor; -+ updateGeometry(); -+} -+ -+/** -+ * Returns whether to draw as an Actor or not. -+ * -+ * @return True if widget is drawn as an actor. -+ */ -+bool ObjectWidget::drawAsActor() const -+{ -+ return m_drawAsActor; -+} -+ -+/** -+ * Activate the object after serializing it from a QDataStream -+ */ -+bool ObjectWidget::activate(IDChangeLog* ChangeLog /*= 0*/) -+{ -+ if (! UMLWidget::activate(ChangeLog)) -+ return false; -+ if (m_showDestruction && m_pLine) -+ m_pLine->setupDestructionBox(); -+ moveEvent(0); -+ return true; -+} -+ -+/** -+ * Sets the x-coordinate. -+ * Reimplements the method from UMLWidget. -+ * -+ * @param x The x-coordinate to be set. -+ */ -+void ObjectWidget::setX(qreal x) -+{ -+ UMLWidget::setX(x); -+ moveEvent(0); -+} -+ -+/** -+ * Sets the y-coordinate. -+ * Reimplements the method from UMLWidget. -+ * -+ * @param y The y-coordinate to be set. -+ */ -+void ObjectWidget::setY(qreal y) -+{ -+ UMLWidget::setY(y); -+ if (!UMLApp::app()->document()->loading()) -+ moveEvent(0); -+} -+ -+/** -+ * Return the x coordinate of the widgets center. -+ * @return The x-coordinate of the widget center. -+ */ -+qreal ObjectWidget::centerX() -+{ -+ return x() + width()/2; -+} -+ -+/** -+ * Overrides the standard operation. -+ */ -+void ObjectWidget::moveEvent(QGraphicsSceneMouseEvent *event) -+{ -+ Q_UNUSED(event) -+ emit sigWidgetMoved(m_nLocalID); -+ if (m_pLine) { -+ m_pLine->setStartPoint(x() + width() / 2, y() + height()); -+ } -+} -+ -+/** -+ * Overrides the standard operation. -+ */ -+void ObjectWidget::mousePressEvent(QGraphicsSceneMouseEvent *me) -+{ -+ UMLWidget::mousePressEvent(me); -+ m_isOnDestructionBox = false; -+ if (m_pLine && m_pLine->onDestructionBox(me->scenePos())) { -+ m_isOnDestructionBox = true; -+ qreal oldX = x() + width() / 2; -+ qreal oldY = getEndLineY() - 10; -+ m_oldPos = QPointF(oldX, oldY); -+ } -+} -+ -+/** -+ * Overrides the standard operation. -+ */ -+void ObjectWidget::mouseMoveEvent(QGraphicsSceneMouseEvent* me) -+{ -+ if (m_inResizeArea) { -+ DEBUG(DBG_SRC) << "resizing..."; -+ resize(me); -+ moveEvent(0); -+ return; -+ } -+ -+ if (m_isOnDestructionBox) { -+ qreal diffY = me->scenePos().y() - m_oldPos.y(); -+ moveDestructionBy(diffY); -+ } -+ else { -+ UMLWidget::mouseMoveEvent(me); -+ } -+} -+ -+/** -+ * Moves the destruction Box to a new position using the difference between the -+ * current position and the new position. -+ * The destruction box is only moved along Y axis. -+ * -+ * @param diffY The difference between current Y position and new Y position -+ */ -+void ObjectWidget::moveDestructionBy(qreal diffY) -+{ -+ // endLine = length of the life line + diffY - 10 to center on the destruction box -+ qreal endLine = getEndLineY() + diffY - 10; -+ SeqLineWidget *pLine = sequentialLine(); -+ pLine->setEndOfLine(endLine); -+ m_oldPos.setY(endLine); -+} -+ -+/** -+ * Handles a color change signal. -+ */ -+void ObjectWidget::slotFillColorChanged(Uml::ID::Type /*viewID*/) -+{ -+ UMLWidget::setFillColor(m_scene->fillColor()); -+ UMLWidget::setLineColor(m_scene->lineColor()); -+ -+ if(m_pLine) -+ m_pLine->setPen(QPen(UMLWidget::lineColor(), UMLWidget::lineWidth(), Qt::DashLine)); -+} -+ -+/** -+ * Used to cleanup any other widget it may need to delete. -+ */ -+void ObjectWidget::cleanup() -+{ -+ UMLWidget::cleanup(); -+ if(m_pLine) { -+ m_pLine->cleanup(); -+ delete m_pLine; -+ m_pLine = 0; -+ } -+} -+ -+/** -+ * Show a properties dialog for an ObjectWidget. -+ */ -+void ObjectWidget::showPropertiesDialog() -+{ -+ UMLApp::app()->docWindow()->updateDocumentation(false); -+ QPointer dlg = new ClassPropertiesDialog((QWidget*)UMLApp::app(), this); -+ if (dlg->exec()) { -+ UMLApp::app()->docWindow()->showDocumentation(this, true); -+ UMLApp::app()->document()->setModified(true); -+ } -+ dlg->close(); -+ delete dlg; -+} -+ -+/** -+ * Draw the object as an object (default). -+ */ -+void ObjectWidget::paintObject(QPainter *painter) -+{ -+ QFont oldFont = painter->font(); -+ QFont font = UMLWidget::font(); -+ font.setUnderline(true); -+ painter->setFont(font); -+ -+ setPenFromSettings(painter); -+ if(UMLWidget::useFillColor()) -+ painter->setBrush(UMLWidget::fillColor()); -+ else -+ painter->setBrush(m_scene->backgroundColor()); -+ const int w = width(); -+ const int h = height(); -+ -+ const QString t = m_instanceName + QLatin1String(" : ") + name(); -+ int multiInstOfst = 0; -+ if (m_multipleInstance) { -+ painter->drawRect(10, 10, w - 10, h - 10); -+ painter->drawRect(5, 5, w - 10, h - 10); -+ multiInstOfst = 10; -+ } -+ painter->drawRect(0, 0, w - multiInstOfst, h - multiInstOfst); -+ painter->setPen(textColor()); -+ painter->drawText(O_MARGIN, O_MARGIN, -+ w - O_MARGIN * 2 - multiInstOfst, h - O_MARGIN * 2 - multiInstOfst, -+ Qt::AlignCenter, t); -+ -+ painter->setFont(oldFont); -+} -+ -+/** -+ * Draw the object as an actor. -+ */ -+void ObjectWidget::paintActor(QPainter *painter) -+{ -+ const QFontMetrics &fm = getFontMetrics(FT_UNDERLINE); -+ -+ setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) -+ painter->setBrush(UMLWidget::fillColor()); -+ const int w = width(); -+ const int textStartY = A_HEIGHT + A_MARGIN; -+ const int fontHeight = fm.lineSpacing(); -+ -+ const int middleX = w / 2; -+ const int thirdH = A_HEIGHT / 3; -+ -+ //draw actor -+ painter->drawEllipse(middleX - A_WIDTH / 2, 0, A_WIDTH, thirdH);//head -+ painter->drawLine(middleX, thirdH, middleX, thirdH * 2);//body -+ painter->drawLine(middleX, 2 * thirdH, -+ middleX - A_WIDTH / 2, A_HEIGHT);//left leg -+ painter->drawLine(middleX, 2 * thirdH, -+ middleX + A_WIDTH / 2, A_HEIGHT);//right leg -+ painter->drawLine(middleX - A_WIDTH / 2, thirdH + thirdH / 2, -+ middleX + A_WIDTH / 2, thirdH + thirdH / 2);//arms -+ //draw text -+ painter->setPen(textColor()); -+ QString t = m_instanceName + QLatin1String(" : ") + name(); -+ painter->drawText(A_MARGIN, textStartY, -+ w - A_MARGIN * 2, fontHeight, Qt::AlignCenter, t); -+} -+ -+/** -+ * Move the object up on a sequence diagram. -+ */ -+void ObjectWidget::tabUp() -+{ -+ int newY = y() - height(); -+ if (newY < topMargin()) -+ newY = topMargin(); -+ setY(newY); -+ adjustAssocs(x(), newY); -+} -+ -+/** -+ * Move the object down on a sequence diagram. -+ */ -+void ObjectWidget::tabDown() -+{ -+ int newY = y() + height(); -+ setY(newY); -+ adjustAssocs(x(), newY); -+} -+ -+/** -+ * Returns the top margin constant (Y axis value) -+ * -+ * @return Y coordinate of the space between the diagram top -+ * and the upper edge of the ObjectWidget. -+ */ -+int ObjectWidget::topMargin() -+{ -+ return 80 - height(); -+} -+ -+/** -+ * Returns whether or not the widget can be moved vertically up. -+ * -+ * @return True if widget can be moved upwards vertically. -+ */ -+bool ObjectWidget::canTabUp() -+{ -+ return (y() > topMargin()); -+} -+ -+/** -+ * Sets whether to show deconstruction on sequence line. -+ * -+ * @param bShow True if destruction on line shall be shown. -+ */ -+void ObjectWidget::setShowDestruction(bool bShow) -+{ -+ m_showDestruction = bShow; -+ if(m_pLine) -+ m_pLine->setupDestructionBox(); -+} -+ -+/** -+ * Returns whether to show deconstruction on sequence line. -+ * -+ * @return True if destruction on sequence line is shown. -+ */ -+bool ObjectWidget::showDestruction() const -+{ -+ return m_showDestruction; -+} -+ -+/** -+ * Sets the y position of the bottom of the vertical line. -+ * -+ * @param yPosition The y coordinate for the bottom of the line. -+ */ -+void ObjectWidget::setEndLine(int yPosition) -+{ -+ if (m_pLine) { -+ m_pLine->setEndOfLine(yPosition); -+ } -+} -+ -+/** -+ * Returns the end Y co-ord of the sequence line. -+ * -+ * @return Y coordinate of the endpoint of the sequence line. -+ */ -+int ObjectWidget::getEndLineY() -+{ -+ int y = this->y() + height(); -+ if(m_pLine) -+ y += m_pLine->getLineLength(); -+ if (m_showDestruction) -+ y += 10; -+ return y; -+} -+ -+/** -+ * Add a message widget to the list. -+ * -+ * @param message Pointer to the MessageWidget to add. -+ */ -+void ObjectWidget::messageAdded(MessageWidget* message) -+{ -+ if (m_messages.count(message)) { -+ uError() << message->name() << ": duplicate entry !"; -+ return ; -+ } -+ m_messages.append(message); -+} -+ -+/** -+ * Remove a message widget from the list. -+ * -+ * @param message Pointer to the MessageWidget to remove. -+ */ -+void ObjectWidget::messageRemoved(MessageWidget* message) -+{ -+ if (m_messages.removeAll(message) == false) { -+ uError() << message->name() << ": missing entry !"; -+ return ; -+ } -+} -+ -+/** -+ * Called when a message widget with an end on this object has -+ * moved up or down. -+ * Sets the bottom of the line to a nice position. -+ */ -+void ObjectWidget::slotMessageMoved() -+{ -+ if (m_pLine) { -+ int lowestMessage = 0; -+ foreach (MessageWidget* message, m_messages) { -+ int messageHeight = message->y() + message->height(); -+ if (lowestMessage < messageHeight) { -+ lowestMessage = messageHeight; -+ } -+ } -+ m_pLine->setEndOfLine(lowestMessage + sequenceLineMargin); -+ } -+} -+ -+/** -+ * Returns whether a message is overlapping with another message. -+ * Used by MessageWidget::paint() methods. -+ * -+ * @param y top of your message -+ * @param messageWidget pointer to your message so it doesn't check against itself -+ */ -+bool ObjectWidget::messageOverlap(qreal y, MessageWidget* messageWidget) -+{ -+ foreach (MessageWidget* message, m_messages) { -+ if (message == messageWidget) { -+ continue; -+ } -+ const qreal msgY = message->y(); -+ const qreal msgHeight = msgY + message->height(); -+ if (y >= msgY && y <= msgHeight) { -+ return true; -+ } -+ } -+ return false; -+} -+ -+/** -+ * Return the SeqLineWidget. -+ * Returns a non NULL pointer if this ObjectWidget is part of a -+ * sequence diagram. -+ */ -+SeqLineWidget *ObjectWidget::sequentialLine() const -+{ -+ return m_pLine; -+} -+ -+/** -+ * Overridden from UMLWidget. -+ * Returns the cursor to be shown when resizing the widget. -+ * The cursor shown is KCursor::sizeHorCursor(). -+ * -+ * @return The cursor to be shown when resizing the widget. -+ */ -+QCursor ObjectWidget::resizeCursor() const -+{ -+ return Qt::SizeHorCursor; -+} -+ -+/** -+ * Overridden from UMLWidget. -+ * Resizes the width of the object widget. -+ * Object widgets can only be resized horizontally, so height isn't modified. -+ * -+ * @param newW The new width for the widget. -+ * @param newH The new height for the widget (isn't used). -+ */ -+void ObjectWidget::resizeWidget(qreal newW, qreal newH) -+{ -+ Q_UNUSED(newH); -+ setSize(newW, height()); -+} -+ -+/** -+ * Saves to the "objectwidget" XMI element. -+ */ -+void ObjectWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement objectElement = qDoc.createElement(QLatin1String("objectwidget")); -+ UMLWidget::saveToXMI(qDoc, objectElement); -+ objectElement.setAttribute(QLatin1String("drawasactor"), m_drawAsActor); -+ objectElement.setAttribute(QLatin1String("multipleinstance"), m_multipleInstance); -+ objectElement.setAttribute(QLatin1String("decon"), m_showDestruction); -+ qElement.appendChild(objectElement); -+} -+ -+/** -+ * Loads from a "objectwidget" XMI element. -+ */ -+bool ObjectWidget::loadFromXMI(QDomElement& qElement) -+{ -+ if(!UMLWidget::loadFromXMI(qElement)) -+ return false; -+ QString draw = qElement.attribute(QLatin1String("drawasactor"), QLatin1String("0")); -+ QString multi = qElement.attribute(QLatin1String("multipleinstance"), QLatin1String("0")); -+ QString decon = qElement.attribute(QLatin1String("decon"), QLatin1String("0")); -+ -+ m_drawAsActor = (bool)draw.toInt(); -+ m_multipleInstance = (bool)multi.toInt(); -+ m_showDestruction = (bool)decon.toInt(); -+ return true; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/objectwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/objectwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/objectwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/objectwidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,115 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef OBJECTWIDGET_H -+#define OBJECTWIDGET_H -+ -+#include "messagewidgetlist.h" -+#include "umlwidget.h" -+ -+class MessageWidget; -+class SeqLineWidget; -+class UMLScene; -+ -+/** -+ * Displays an instance UMLObject of a concept. -+ * -+ * The local ID is needed as a it can represent a class -+ * that has many objects representing it. -+ * -+ * @short Displays an instance of a Concept. -+ * @author Paul Hensgen -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class ObjectWidget : public UMLWidget -+{ -+ Q_OBJECT -+public: -+ ObjectWidget(UMLScene *scene, UMLObject *o); -+ virtual ~ObjectWidget(); -+ -+ virtual void setX(qreal x); -+ virtual void setY(qreal y); -+ -+ qreal centerX(); -+ -+ void setMultipleInstance(bool multiple); -+ bool multipleInstance() const; -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ bool activate(IDChangeLog* ChangeLog = 0); -+ -+ void cleanup(); -+ -+ void showPropertiesDialog(); -+ -+ void setDrawAsActor(bool drawAsActor); -+ bool drawAsActor() const; -+ -+ void setShowDestruction(bool bShow); -+ bool showDestruction() const; -+ -+ int topMargin(); -+ -+ void setEndLine(int yPosition); -+ int getEndLineY(); -+ -+ void messageAdded(MessageWidget* message); -+ void messageRemoved(MessageWidget* message); -+ -+ bool canTabUp(); -+ -+ bool messageOverlap(qreal y, MessageWidget* messageWidget); -+ -+ SeqLineWidget *sequentialLine() const; -+ -+ virtual void resizeWidget(qreal newW, qreal newH); -+ -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ virtual bool loadFromXMI(QDomElement& qElement); -+ -+public slots: -+ void slotMenuSelection(QAction* action); -+ virtual void slotFillColorChanged(Uml::ID::Type viewID); -+ void slotMessageMoved(); -+ -+protected: -+ virtual void mousePressEvent(QGraphicsSceneMouseEvent *me); -+ virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *me); -+ -+ QSizeF minimumSize() const; -+ -+ virtual void moveEvent(QGraphicsSceneMouseEvent *event); -+ virtual void moveWidgetBy(qreal diffX, qreal diffY); -+ virtual void constrainMovementForAllWidgets(qreal &diffX, qreal &diffY); -+ -+ virtual QCursor resizeCursor() const; -+ -+ void paintActor(QPainter *p); -+ void paintObject(QPainter *p); -+ -+private: -+ void tabUp(); -+ void tabDown(); -+ -+ void moveDestructionBy(qreal diffY); -+ -+ SeqLineWidget* m_pLine; -+ bool m_multipleInstance; ///< draw an object as a multiple object -+ bool m_drawAsActor; ///< object should be drawn as an Actor or an Object -+ bool m_showDestruction; ///< show object destruction on sequence diagram line -+ bool m_isOnDestructionBox; ///< true when a click occurred on the destruction box -+ MessageWidgetList m_messages; ///< message widgets with an end on this widget -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/packagewidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/packagewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/packagewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/packagewidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,149 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "packagewidget.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "package.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlobject.h" -+#include "umlscene.h" -+#include "umlview.h" -+ -+// qt includes -+#include -+ -+/** -+ * Constructs a PackageWidget. -+ * -+ * @param scene The parent of this PackageWidget. -+ * @param o The UMLObject this will be representing. -+ */ -+PackageWidget::PackageWidget(UMLScene * scene, UMLPackage *o) -+ : UMLWidget(scene, WidgetBase::wt_Package, o), -+ m_pMenu(0) -+{ -+ setSize(100, 30); -+ setZValue(1); // above box but below UMLWidget because may embed widgets -+ //set defaults from m_scene -+ if (m_scene) { -+ //check to see if correct -+ const Settings::OptionState& ops = m_scene->optionState(); -+ m_showStereotype = ops.classState.showStereoType; -+ } -+} -+ -+/** -+ * Destructor. -+ */ -+PackageWidget::~PackageWidget() -+{ -+} -+ -+/** -+ * Overrides standard method. -+ */ -+void PackageWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) -+ painter->setBrush(UMLWidget::fillColor()); -+ else -+ painter->setBrush(m_scene->backgroundColor()); -+ -+ int w = width(); -+ int h = height(); -+ QFont font = UMLWidget::font(); -+ font.setBold(true); -+ //FIXME italic is true when a package is first created until you click elsewhere, not sure why -+ font.setItalic(false); -+ const QFontMetrics &fm = getFontMetrics(FT_BOLD); -+ const int fontHeight = fm.lineSpacing(); -+ -+ painter->drawRect(0, 0, 50, fontHeight); -+ if (m_umlObject != NULL -+ && m_umlObject->stereotype() == QLatin1String("subsystem")) { -+ -+ const int fHalf = fontHeight / 2; -+ const int symY = fHalf; -+ const int symX = 38; -+ painter->drawLine(symX, symY, symX, symY + fHalf - 2); // left leg -+ painter->drawLine(symX + 8, symY, symX + 8, symY + fHalf - 2); // right leg -+ painter->drawLine(symX, symY, symX + 8, symY); // waist -+ painter->drawLine(symX + 4, symY, symX + 4, symY - fHalf + 2); // head -+ } -+ painter->drawRect(0, fontHeight - 1, w, h - fontHeight); -+ -+ painter->setPen(textColor()); -+ painter->setFont(font); -+ -+ int lines = 1; -+ if (m_umlObject != NULL) { -+ QString stereotype = m_umlObject->stereotype(); -+ if (!stereotype.isEmpty()) { -+ painter->drawText(0, fontHeight + PACKAGE_MARGIN, -+ w, fontHeight, Qt::AlignCenter, m_umlObject->stereotype(true)); -+ lines = 2; -+ } -+ } -+ -+ painter->drawText(0, (fontHeight*lines) + PACKAGE_MARGIN, -+ w, fontHeight, Qt::AlignCenter, name()); -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Overrides method from UMLWidget -+ */ -+QSizeF PackageWidget::minimumSize() const -+{ -+ if (!m_umlObject) { -+ return UMLWidget::minimumSize(); -+ } -+ -+ const QFontMetrics &fm = getFontMetrics(FT_BOLD_ITALIC); -+ const int fontHeight = fm.lineSpacing(); -+ -+ int lines = 1; -+ -+ int width = fm.width(m_umlObject->name()); -+ -+ int tempWidth = 0; -+ if (!m_umlObject->stereotype().isEmpty()) { -+ tempWidth = fm.width(m_umlObject->stereotype(true)); -+ lines = 2; -+ } -+ if (tempWidth > width) -+ width = tempWidth; -+ width += PACKAGE_MARGIN * 2; -+ if (width < 70) -+ width = 70; // minumin width of 70 -+ -+ int height = (lines*fontHeight) + fontHeight + (PACKAGE_MARGIN * 2); -+ -+ return QSizeF(width, height); -+} -+ -+/** -+ * Saves to the "packagewidget" XMI element. -+ */ -+void PackageWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement conceptElement = qDoc.createElement(QLatin1String("packagewidget")); -+ UMLWidget::saveToXMI(qDoc, conceptElement); -+ qElement.appendChild(conceptElement); -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/packagewidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/packagewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/packagewidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/packagewidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,47 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2003-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef PACKAGEWIDGET_H -+#define PACKAGEWIDGET_H -+ -+#include "umlwidget.h" -+ -+class UMLPackage; -+class ListPopupMenu; -+ -+#define PACKAGE_MARGIN 5 -+ -+/** -+ * Defines a graphical version of the Package. Most of the -+ * functionality will come from the @ref UMLPackage class. -+ * -+ * @short A graphical version of a Package. -+ * @author Jonathan Riddell -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class PackageWidget : public UMLWidget -+{ -+public: -+ explicit PackageWidget(UMLScene * scene, UMLPackage * o); -+ virtual ~PackageWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ -+protected: -+ QSizeF minimumSize() const; -+ -+private: -+ ListPopupMenu* m_pMenu; ///< the right mouse button menu -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/pinportbase.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/pinportbase.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/pinportbase.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/pinportbase.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,378 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "pinportbase.h" -+ -+// app includes -+#include "port.h" -+#include "package.h" -+#include "debug_utils.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "umlview.h" -+#include "floatingtextwidget.h" -+ -+// qt includes -+#include -+#include -+ -+// sys includes -+#include -+ -+PinPortBase::PinPortBase(UMLScene *scene, WidgetType type, UMLObject *o) -+ : UMLWidget(scene, type, o) -+{ -+ init(); -+} -+ -+PinPortBase::PinPortBase(UMLScene *scene, WidgetType type, UMLWidget *a, Uml::ID::Type id) -+ : UMLWidget(scene, type, id) -+{ -+ init(a); -+} -+ -+/** -+ * Standard destructor. -+ */ -+PinPortBase::~PinPortBase() -+{ -+} -+ -+/** -+ * Performs initializations which are common to PinWidget and PortWidget. -+ */ -+void PinPortBase::init(UMLWidget *owner) -+{ -+ m_ignoreSnapToGrid = true; -+ m_ignoreSnapComponentSizeToGrid = true; -+ m_resizable = false; -+ m_pOw = owner; -+ m_pName = NULL; -+ m_motionConnected = false; -+ const int edgeLength = 15; // old: (m_baseType == wt_Pin ? 10 : 15); -+ const QSizeF FixedSize(edgeLength, edgeLength); -+ setMinimumSize(FixedSize); -+ setMaximumSize(FixedSize); -+ setSize(FixedSize); -+} -+ -+UMLWidget* PinPortBase::ownerWidget() -+{ -+ return m_pOw; -+} -+ -+/** -+ * Overrides method from UMLWidget in order to set a tooltip. -+ * The tooltip is set to the name(). -+ * The reason for using a tooltip for the name is that the size of this -+ * widget is not large enough to accommodate the average name. -+ */ -+void PinPortBase::updateWidget() -+{ -+ QString strName = name(); -+ uDebug() << " port name is " << strName; -+ if (m_pName) { -+ m_pName->setText(strName); -+ } else { -+ setToolTip(strName); -+ } -+} -+ -+/** -+ * Overrides method from UMLWidget to set the name. -+ */ -+void PinPortBase::setName(const QString &strName) -+{ -+ UMLWidget::setName(strName); -+ updateGeometry(); -+ if (m_pName) { -+ m_pName->setText(strName); -+ } -+} -+ -+/** -+ * Overridden from UMLWidget. -+ * Moves the widget to a new position using the difference between the -+ * current position and the new position. -+ * Movement is constrained such that the port is always attached to its -+ * owner widget. -+ * -+ * @param diffX The difference between current X position and new X position. -+ * @param diffY The difference between current Y position and new Y position. -+ */ -+void PinPortBase::moveWidgetBy(qreal diffX, qreal diffY) -+{ -+ UMLWidget* owner = ownerWidget(); -+ qreal newX = x() + diffX; -+ qreal newY = y() + diffY; -+ uDebug() << "PinPortBase::moveWidgetBy " << diffX << "," << diffY; -+ if (owner == NULL) { -+ uError() << "PinPortBase::moveWidgetBy: ownerWidget() returns NULL"; -+ setX(newX); -+ setY(newY); -+ return; -+ } -+ const qreal deltaTop = fabs(y() + height() - owner->y()); -+ const qreal deltaBottom = fabs(owner->y() + owner->height() - y()); -+ const qreal deltaLeft = fabs(x() + width() - owner->x()); -+ const qreal deltaRight = fabs(owner->x() + owner->width() - x()); -+ bool didAnyMovement = false; -+ if (deltaTop < 1.0 || deltaBottom < 1.0) { -+ if (newX < owner->x() - width()) -+ newX = owner->x() - width(); -+ else if (newX > owner->x() + owner->width()) -+ newX = owner->x() + owner->width(); -+ setX(newX); -+ didAnyMovement = true; -+ } -+ if (deltaLeft < 1.0 || deltaRight < 1.0) { -+ if (newY < owner->y() - height()) -+ newY = owner->y() - height(); -+ else if (newY > owner->y() + owner->height()) -+ newY = owner->y() + owner->height(); -+ setY(newY); -+ didAnyMovement = true; -+ } -+ if (!didAnyMovement) { -+ uDebug() << "constraint failed for (" << diffX << ", " << diffY << ")"; -+ setX(newX); -+ setY(newY); -+ } -+} -+ -+/** -+ * Align this widget's position such that it is attached at one of the -+ * sides of its owner's widget. -+ */ -+void PinPortBase::attachToOwner() { -+ UMLWidget *owner = ownerWidget(); -+ const QPointF scenePos = m_scene->pos(); -+ if (owner == NULL) { -+ uError() << "PinPortBase::attachToOwner: ownerWidget() returns NULL"; -+ setX(scenePos.x()); -+ setY(scenePos.y()); -+ return; -+ } -+ bool xIsWithinOwner = false; -+ if (scenePos.x() < owner->x() - width()) { -+ setX(owner->x() - width()); -+ } else if (scenePos.x() <= owner->x() + owner->width()) { -+ setX(scenePos.x()); -+ xIsWithinOwner = true; -+ } else { -+ setX(owner->x() + owner->width()); -+ } -+ if (scenePos.y() < owner->y() - height()) { -+ setY(owner->y() - height()); -+ } else if (scenePos.y() <= owner->y() + owner->height()) { -+ if (xIsWithinOwner) { -+ if (scenePos.y() <= owner->y() + owner->height() / 2.0) -+ setY(owner->y() - height()); -+ else -+ setY(owner->y() + owner->height()); -+ } else { -+ setY(scenePos.y()); -+ } -+ } else { -+ setY(owner->y() + owner->height()); -+ } -+ -+ if (m_motionConnected) { -+ uDebug() << "connectOwnerMotion was already done"; -+ } else { -+ connectOwnerMotion(); -+ m_motionConnected = true; -+ } -+} -+ -+/** -+ * Overrides standard method. -+ */ -+void PinPortBase::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) { -+ painter->setBrush(UMLWidget::fillColor()); -+ } else { -+ painter->setBrush(m_scene->backgroundColor()); -+ } -+ -+ int w = width(); -+ int h = height(); -+ -+ painter->drawRect(0, 0, w, h); -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+void PinPortBase::slotOwnerMoved(qreal diffX, qreal diffY) -+{ -+ setX(x() + diffX); -+ setY(y() + diffY); -+} -+ -+/** -+ * Captures any popup menu signals for menus it created. -+ */ -+void PinPortBase::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch(sel) { -+ case ListPopupMenu::mt_NameAsTooltip: -+ if (m_pName) { -+ action->setChecked(true); -+ delete m_pName; -+ m_pName = NULL; -+ setToolTip(name()); -+ } else { -+ action->setChecked(false); -+ m_pName = new FloatingTextWidget(m_scene, Uml::TextRole::Floating, name()); -+ m_pName->setParentItem(this); -+ m_pName->setText(name()); // to get geometry update -+ m_pName->activate(); -+ UMLWidget* owner = ownerWidget(); -+ if (owner == NULL) { -+ uError() << "PinPortBase::slotMenuSelection: ownerWidget() returns NULL"; -+ setX(x()); -+ setY(y()); -+ } else { -+ const qreal w = width(); -+ const qreal h = height(); -+ if (x() < owner->x()) -+ m_pName->setX(-m_pName->width()); -+ else if (x() >= owner->x() + owner->width()) -+ m_pName->setX(w); -+ else -+ m_pName->setX(-m_pName->width() / 2.0 + w / 2.0); -+ if (y() < owner->y()) -+ m_pName->setY(-m_pName->height() - 2); -+ else if (y() >= owner->y() + owner->height()) -+ m_pName->setY(h); -+ else -+ m_pName->setY(-m_pName->height() / 2.0 + h / 2.0); -+ } -+ m_pName->update(); -+ setToolTip(QString()); -+ QToolTip::hideText(); -+ } -+ break; -+ -+ default: -+ UMLWidget::slotMenuSelection(action); -+ } -+} -+ -+FloatingTextWidget *PinPortBase::floatingTextWidget() { -+ return m_pName; -+} -+ -+void PinPortBase::setFloatingTextWidget(FloatingTextWidget *ft) { -+ m_pName = ft; -+ if (m_pName) -+ m_pName->setParentItem(this); -+} -+ -+/** -+ * Override method from UMLWidget in order to additionally check m_pName. -+ * -+ * @param p Point to be checked. -+ * -+ * @return 'this' if UMLWidget::onWidget(p) returns non NULL; -+ * m_pName if m_pName is non NULL and m_pName->onWidget(p) returns non NULL; -+ * else NULL. -+ */ -+UMLWidget* PinPortBase::onWidget(const QPointF &p) -+{ -+ if (UMLWidget::onWidget(p) != NULL) -+ return this; -+ if (m_pName) { -+ uDebug() << "floatingtext: " << m_pName->text(); -+ return m_pName->onWidget(p); -+ } -+ return NULL; -+} -+ -+/** -+ * Reimplement function from UMLWidget -+ */ -+UMLWidget* PinPortBase::widgetWithID(Uml::ID::Type id) -+{ -+ if (UMLWidget::widgetWithID(id)) -+ return this; -+ if (m_pName && m_pName->widgetWithID(id)) -+ return m_pName; -+ return NULL; -+} -+ -+ -+/** -+ * Saves the widget to the "pinwidget" or "portwidget" XMI element. -+ */ -+void PinPortBase::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement element = qDoc.createElement(m_baseType == wt_Pin ? QLatin1String("pinwidget") -+ : QLatin1String("portwidget")); -+ element.setAttribute(QLatin1String("widgetaid"), Uml::ID::toString(ownerWidget()->id())); -+ UMLWidget::saveToXMI(qDoc, element); -+ if (m_pName && !m_pName->text().isEmpty()) { -+ m_pName->saveToXMI(qDoc, element); -+ } -+ qElement.appendChild(element); -+} -+ -+/** -+ * Loads from a "pinwidget" or from a "portwidget" XMI element. -+ */ -+bool PinPortBase::loadFromXMI(QDomElement & qElement) -+{ -+ if (!UMLWidget::loadFromXMI(qElement)) -+ return false; -+ -+ QString widgetaid = qElement.attribute(QLatin1String("widgetaid"), QLatin1String("-1")); -+ Uml::ID::Type aId = Uml::ID::fromString(widgetaid); -+ UMLWidget *owner = m_scene->findWidget(aId); -+ if (owner == NULL) { -+ DEBUG(DBG_SRC) << "owner object " << Uml::ID::toString(aId) << " not found"; -+ return false; -+ } -+ m_pOw = owner; -+ -+ // Optional child element: floatingtext -+ QDomNode node = qElement.firstChild(); -+ QDomElement element = node.toElement(); -+ if (!element.isNull()) { -+ QString tag = element.tagName(); -+ if (tag == QLatin1String("floatingtext")) { -+ m_pName = new FloatingTextWidget(m_scene, Uml::TextRole::Floating, -+ name(), Uml::ID::Reserved); -+ if (!m_pName->loadFromXMI(element)) { -+ // Most likely cause: The FloatingTextWidget is empty. -+ delete m_pName; -+ m_pName = NULL; -+ } else { -+ m_pName->setParentItem(this); -+ m_pName->activate(); -+ m_pName->update(); -+ } -+ } else { -+ uError() << "unknown tag " << tag; -+ } -+ } -+ -+ if (m_motionConnected) { -+ uDebug() << "connectOwnerMotion was already done"; -+ } else { -+ connectOwnerMotion(); -+ m_motionConnected = true; -+ } -+ return true; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/pinportbase.h umbrello-kf6-15.08.1/umbrello/umlwidgets/pinportbase.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/pinportbase.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/pinportbase.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,63 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef PINPORTBASE_H -+#define PINPORTBASE_H -+ -+#include "umlwidget.h" -+ -+class FloatingTextWidget; -+ -+/** -+ * @short Abstract base class for PinWidget and PortWidget -+ * @author Oliver Kellogg -+ * @see UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class PinPortBase : public UMLWidget -+{ -+ Q_OBJECT -+public: -+ PinPortBase(UMLScene *scene, WidgetType type, UMLObject *o); -+ PinPortBase(UMLScene *scene, WidgetType type, UMLWidget *a, Uml::ID::Type id = Uml::ID::None); -+ virtual ~PinPortBase(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ virtual UMLWidget* ownerWidget(); -+ virtual void connectOwnerMotion() = 0; -+ -+ void setName(const QString &strName); -+ void updateWidget(); -+ void moveWidgetBy(qreal diffX, qreal diffY); -+ void attachToOwner(); -+ -+ UMLWidget* onWidget(const QPointF& p); -+ UMLWidget* widgetWithID(Uml::ID::Type id); -+ -+ FloatingTextWidget *floatingTextWidget(); -+ void setFloatingTextWidget(FloatingTextWidget *ft); -+ -+ void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ bool loadFromXMI(QDomElement& qElement); -+ -+public slots: -+ void slotOwnerMoved(qreal diffX, qreal diffY); -+ virtual void slotMenuSelection(QAction* action); -+ -+protected: -+ void init(UMLWidget *owner = 0); -+ -+ UMLWidget* m_pOw; -+ FloatingTextWidget *m_pName; -+ bool m_motionConnected; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/pinwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/pinwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/pinwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/pinwidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,103 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "pinwidget.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "floatingtextwidget.h" -+#include "listpopupmenu.h" -+#include "umlscene.h" -+#include "activitywidget.h" -+ -+// kde includes -+#if QT_VERSION < 0x050000 -+#include -+#endif -+#include -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+#include -+ -+DEBUG_REGISTER_DISABLED(PinWidget) -+ -+/** -+ * Creates a Pin widget. -+ * -+ * @param scene The parent of the widget. -+ * @param a The widget to which this pin is attached. -+ * @param id The ID to assign (-1 will prompt a new ID). -+ */ -+PinWidget::PinWidget(UMLScene* scene, UMLWidget* a, Uml::ID::Type id) -+ : PinPortBase(scene, WidgetBase::wt_Pin, a, id) -+{ -+ // setParent(a); -+ // m_nY = y() < getMinY() ? getMinY() : y(); -+ -+ m_pName = new FloatingTextWidget(m_scene, Uml::TextRole::Floating, name()); -+ m_pName->setParentItem(this); -+ m_pName->setText(name()); // to get geometry update -+ m_pName->activate(); -+ setVisible(true); -+} -+ -+/** -+ * Destructor. -+ */ -+PinWidget::~PinWidget() -+{ -+} -+ -+/** -+ * Implement abstract function from PinPortWidget. -+ */ -+void PinWidget::connectOwnerMotion() -+{ -+ ActivityWidget *owner = static_cast(ownerWidget()); -+ connect(owner, SIGNAL(sigActMoved(qreal,qreal)), this, SLOT(slotOwnerMoved(qreal,qreal))); -+} -+ -+/** -+ * Captures any popup menu signals for menus it created. -+ */ -+void PinWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch(sel) { -+ case ListPopupMenu::mt_Rename: -+ { -+ bool ok = false; -+ QString name = m_Text; -+#if QT_VERSION >= 0x050000 -+ name = QInputDialog::getText(Q_NULLPTR, -+ i18n("Enter Pin Name"), -+ i18n("Enter the pin name :"), -+ QLineEdit::Normal, -+ m_Text, &ok); -+#else -+ name = KInputDialog::getText(i18n("Enter Pin Name"), -+ i18n("Enter the pin name :"), -+ m_Text, &ok); -+#endif -+ if (ok) { -+ setName(name); -+ } -+ } -+ break; -+ -+ default: -+ PinPortBase::slotMenuSelection(action); -+ } -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/pinwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/pinwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/pinwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/pinwidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,46 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef PINWIDGET_H -+#define PINWIDGET_H -+ -+#include "pinportbase.h" -+ -+/** -+ * This class is the graphical version of a UML Pin. A pinWidget is created -+ * by a @ref UMLView. An pinWidget belongs to only one @ref UMLView instance. -+ * When the @ref UMLView instance that this class belongs to, it will be automatically deleted. -+ * -+ * The pinWidget class inherits from the @ref UMLWidget class which adds most of the functionality -+ * to this class. -+ * -+ * @short A graphical version of a UML pin. -+ * @author Hassan KOUCH -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class PinWidget : public PinPortBase -+{ -+ Q_OBJECT -+public: -+ -+ PinWidget(UMLScene* scene, UMLWidget* a, Uml::ID::Type id = Uml::ID::None); -+ virtual ~PinWidget(); -+ -+ void connectOwnerMotion(); -+ // int getMinY(); -+ -+public slots: -+ void slotMenuSelection(QAction* action); -+ -+// private: -+ // int m_nY; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/portwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/portwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/portwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/portwidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,106 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "portwidget.h" -+ -+// app includes -+#include "port.h" -+#include "package.h" -+#include "debug_utils.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "componentwidget.h" -+#include "floatingtextwidget.h" -+ -+// kde includes -+#if QT_VERSION < 0x050000 -+#include -+#endif -+#include -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+#include -+#include -+ -+/** -+ * Constructs a PortWidget. -+ * -+ * @param scene The parent of this PortWidget. -+ * @param d The UMLPort this will be representing. -+ */ -+PortWidget::PortWidget(UMLScene *scene, UMLPort *d) -+ : PinPortBase(scene, WidgetBase::wt_Port, d) -+{ -+ setToolTip(d->name()); -+} -+ -+/** -+ * Standard deconstructor. -+ */ -+PortWidget::~PortWidget() -+{ -+} -+ -+/** -+ * Override function from PinPortWidget. -+ */ -+UMLWidget* PortWidget::ownerWidget() -+{ -+ if (m_pOw == NULL) { -+ const Uml::ID::Type compWidgetId = m_umlObject->umlPackage()->id(); -+ m_pOw = m_scene->widgetOnDiagram(compWidgetId); -+ } -+ return m_pOw; -+} -+ -+/** -+ * Implement abstract function from PinPortWidget. -+ */ -+void PortWidget::connectOwnerMotion() -+{ -+ ComponentWidget *owner = static_cast(ownerWidget()); -+ connect(owner, SIGNAL(sigCompMoved(qreal,qreal)), this, SLOT(slotOwnerMoved(qreal,qreal))); -+} -+ -+/** -+ * Captures any popup menu signals for menus it created. -+ */ -+void PortWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch(sel) { -+ case ListPopupMenu::mt_Rename: -+ { -+ bool ok = false; -+ QString newName; -+#if QT_VERSION >= 0x050000 -+ newName = QInputDialog::getText(Q_NULLPTR, -+ i18n("Enter Port Name"), i18n("Enter the port name :"), -+ QLineEdit::Normal, -+ name(), &ok); -+#else -+ newName = KInputDialog::getText(i18n("Enter Port Name"), i18n("Enter the port name :"), -+ name(), &ok); -+#endif -+ if (ok) { -+ setName(newName); -+ } -+ } -+ break; -+ -+ default: -+ PinPortBase::slotMenuSelection(action); -+ } -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/portwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/portwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/portwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/portwidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,42 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef PORTWIDGET_H -+#define PORTWIDGET_H -+ -+#include "pinportbase.h" -+ -+class UMLPort; -+ -+/** -+ * Defines a graphical version of the UML2 port. Most of the functionality -+ * comes from the @ref PinPortBase class from which this class inherits. -+ * -+ * @short A graphical version of a port on a component. -+ * @author Oliver Kellogg -+ * @see PinPortBase, UMLWidget -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class PortWidget : public PinPortBase -+{ -+ Q_OBJECT -+public: -+ PortWidget(UMLScene *scene, UMLPort *d); -+ virtual ~PortWidget(); -+ -+ UMLWidget* ownerWidget(); -+ void connectOwnerMotion(); -+ -+public slots: -+ void slotMenuSelection(QAction* action); -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/preconditionwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/preconditionwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/preconditionwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/preconditionwidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,335 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "preconditionwidget.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "listpopupmenu.h" -+#include "objectwidget.h" -+#include "uml.h" -+#include "umlscene.h" -+#include "uniqueid.h" -+#include "idchangelog.h" -+ -+// kde includes -+#if QT_VERSION < 0x050000 -+#include -+#endif -+#include -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+#include -+ -+DEBUG_REGISTER_DISABLED(PreconditionWidget) -+ -+#define PRECONDITION_MARGIN 5 -+#define PRECONDITION_WIDTH 30 -+#define PRECONDITION_HEIGHT 10 -+ -+/** -+ * Creates a Precondition widget. -+ * -+ * @param scene The parent of the widget. -+ * @param a The role A widget for this precondition. -+ * @param id The ID to assign (-1 will prompt a new ID). -+ */ -+PreconditionWidget::PreconditionWidget(UMLScene* scene, ObjectWidget* a, Uml::ID::Type id) -+ : UMLWidget(scene, WidgetBase::wt_Precondition, id), -+ m_objectWidget(a) -+{ -+ m_ignoreSnapToGrid = true; -+ m_ignoreSnapComponentSizeToGrid = true; -+ m_resizable = true ; -+ setVisible(true); -+ //updateResizability(); -+ // calculateWidget(); -+ if (y() < minY()) -+ m_nY = minY(); -+ else if (y() > maxY()) -+ m_nY = maxY(); -+ else -+ m_nY = y(); -+ -+ activate(); -+} -+ -+/** -+ * Destructor. -+ */ -+PreconditionWidget::~PreconditionWidget() -+{ -+} -+ -+/** -+ * Overrides the standard paint event. -+ */ -+void PreconditionWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ int w = width(); -+ int h = height(); -+ -+ int x = m_objectWidget->x() + m_objectWidget->width() / 2; -+ x -= w/2; -+ setX(x); -+ int y = this->y(); -+ -+ //test if y isn't above the object -+ if (y <= m_objectWidget->y() + m_objectWidget->height()) { -+ y = m_objectWidget->y() + m_objectWidget->height() + 15; -+ } -+ if (y + h >= m_objectWidget->getEndLineY()) { -+ y = m_objectWidget->getEndLineY() - h; -+ } -+ setY(y); -+ setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) { -+ painter->setBrush(UMLWidget::fillColor()); -+ } -+ { -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ const QString precondition_value = QLatin1String("{ ") + name() + QLatin1String(" }"); -+ //int middleX = w / 2; -+ int textStartY = (h / 2) - (fontHeight / 2); -+ painter->drawRoundRect(0, 0, w, h, (h * 60) / w, 60); -+ painter->setPen(textColor()); -+ painter->setFont(UMLWidget::font()); -+ painter->drawText(PRECONDITION_MARGIN, textStartY, -+ w - PRECONDITION_MARGIN * 2, fontHeight, Qt::AlignCenter, precondition_value); -+ } -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Overrides method from UMLWidget. -+ */ -+QSizeF PreconditionWidget::minimumSize() const -+{ -+ int width = 10, height = 10; -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ const int textWidth = fm.width(name()) + 25; -+ height = fontHeight; -+ width = textWidth > PRECONDITION_WIDTH ? textWidth : PRECONDITION_WIDTH; -+ height = height > PRECONDITION_HEIGHT ? height : PRECONDITION_HEIGHT; -+ width += PRECONDITION_MARGIN * 2; -+ height += PRECONDITION_MARGIN * 2; -+ -+ return QSizeF(width, height); -+} -+ -+/** -+ * Calculate the geometry of the widget. -+ */ -+void PreconditionWidget::calculateWidget() -+{ -+ calculateDimensions(); -+ -+ setVisible(true); -+ -+ setX(m_nPosX); -+ setY(m_nY); -+} -+ -+/** -+ * Activates a PreconditionWidget. Connects the WidgetMoved signal from -+ * its m_objectWidget pointer so that PreconditionWidget can adjust to the move of -+ * the object widget. -+ */ -+bool PreconditionWidget::activate(IDChangeLog * Log /*= 0*/) -+{ -+ m_scene->resetPastep-kf6oint(); -+ UMLWidget::activate(Log); -+ -+ loadObjectWidget(); -+ -+ if (!m_objectWidget) { -+ DEBUG(DBG_SRC) << "role A widget " << Uml::ID::toString(m_widgetAId) -+ << " could not be found"; -+ return false; -+ } -+ -+ connect(m_objectWidget, SIGNAL(sigWidgetMoved(Uml::ID::Type)), this, SLOT(slotWidgetMoved(Uml::ID::Type))); -+ -+ calculateDimensions(); -+ return true; -+} -+ -+/** -+ * Resolve references of this precondition so it references the correct -+ * new object widget after paste. -+ */ -+void PreconditionWidget::resolveObjectWidget(IDChangeLog* log) { -+ m_widgetAId = log->findNewID(m_widgetAId); -+} -+ -+/** -+ * Calculates the size of the widget. -+ */ -+void PreconditionWidget::calculateDimensions() -+{ -+ int x = 0; -+ int w = 0; -+ int h = 0; -+ int x1 = m_objectWidget->x(); -+ int w1 = m_objectWidget->width() / 2; -+ -+ x1 += w1; -+ -+ QSizeF q = minimumSize(); -+ w = q.width() > width() ? q.width() : width(); -+ h = q.height() > height() ? q.height() : height(); -+ -+ x = x1 - w/2; -+ -+ m_nPosX = x; -+ -+ setSize(w, h); -+} -+ -+/** -+ * Slot when widget is moved. -+ */ -+void PreconditionWidget::slotWidgetMoved(Uml::ID::Type id) -+{ -+ const Uml::ID::Type idA = m_objectWidget->localID(); -+ if (idA != id) { -+ DEBUG(DBG_SRC) << "id=" << Uml::ID::toString(id) << ": ignoring for idA=" << Uml::ID::toString(idA); -+ return; -+ } -+ m_nY = y(); -+ if (m_nY < minY()) -+ m_nY = minY(); -+ if (m_nY > maxY()) -+ m_nY = maxY(); -+ -+ calculateDimensions(); -+ if (m_scene->selectedCount(true) > 1) -+ return; -+} -+ -+/** -+ * Returns the minimum height this widget should be set at on -+ * a sequence diagrams. Takes into account the widget positions -+ * it is related to. -+ */ -+int PreconditionWidget::minY() const -+{ -+ if (m_objectWidget) { -+ return m_objectWidget->y() + m_objectWidget->height(); -+ } -+ return 0; -+} -+ -+/** -+ * Returns the maximum height this widget should be set at on -+ * a sequence diagrams. Takes into account the widget positions -+ * it is related to. -+ */ -+int PreconditionWidget::maxY() const -+{ -+ if (m_objectWidget) { -+ return ((int)m_objectWidget->getEndLineY() - height()); -+ } -+ return 0; -+} -+ -+/** -+ * Captures any popup menu signals for menus it created. -+ */ -+void PreconditionWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch(sel) { -+ case ListPopupMenu::mt_Rename: -+ { -+ bool ok = false; -+ QString text = name(); -+#if QT_VERSION >= 0x050000 -+ text = QInputDialog::getText(Q_NULLPTR, -+ i18n("Enter Precondition Name"), -+ i18n("Enter the precondition :"), -+ QLineEdit::Normal, -+ text, &ok); -+#else -+ text = KInputDialog::getText(i18n("Enter Precondition Name"), -+ i18n("Enter the precondition :"), -+ text, &ok); -+#endif -+ if (ok && !text.isEmpty()) { -+ setName(text); -+ } -+ calculateWidget(); -+ } -+ break; -+ -+ default: -+ UMLWidget::slotMenuSelection(action); -+ } -+} -+ -+/** -+ * Saves the widget to the "preconditionwidget" XMI element. -+ */ -+void PreconditionWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement preconditionElement = qDoc.createElement(QLatin1String("preconditionwidget")); -+ UMLWidget::saveToXMI(qDoc, preconditionElement); -+ -+ preconditionElement.setAttribute(QLatin1String("widgetaid"), Uml::ID::toString(m_objectWidget->localID())); -+ preconditionElement.setAttribute(QLatin1String("preconditionname"), name()); -+ preconditionElement.setAttribute(QLatin1String("documentation"), documentation()); -+ qElement.appendChild(preconditionElement); -+} -+ -+/** -+ * Loads the widget from the "preconditionwidget" XMI element. -+ */ -+bool PreconditionWidget::loadFromXMI(QDomElement& qElement) -+{ -+ if(!UMLWidget::loadFromXMI(qElement)) -+ return false; -+ QString widgetaid = qElement.attribute(QLatin1String("widgetaid"), QLatin1String("-1")); -+ setName(qElement.attribute(QLatin1String("preconditionname"))); -+ setDocumentation(qElement.attribute(QLatin1String("documentation"))); -+ -+ m_widgetAId = Uml::ID::fromString(widgetaid); -+ -+ // Lookup the ObjectWidget, if it can't be found, assume it will be -+ // resolved later -+ loadObjectWidget(); -+ -+ return true; -+} -+ -+/** -+ * Load the object widget from m_widgetAId -+ * -+ * This method is called in loadFromXMI() when loading an XMI file, and called -+ * from activate() when activating a widget after pasting. -+ */ -+void PreconditionWidget::loadObjectWidget() -+{ -+ if (m_objectWidget == 0) { -+ m_objectWidget = dynamic_cast( -+ umlScene()->findWidget(m_widgetAId) -+ ); -+ } -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/preconditionwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/preconditionwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/preconditionwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/preconditionwidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,70 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef PRECONDITIONWIDGET_H -+#define PRECONDITIONWIDGET_H -+ -+#include "umlwidget.h" -+ -+class ObjectWidget; -+ -+/** -+ * @short A graphical version of a UML Precondition (new in UML 2.0). -+ * -+ * This class is the graphical version of a UML Precondition. A PreconditionWidget is created -+ * by a @ref UMLView. An PreconditionWidget belongs to only one @ref UMLView instance. -+ * When the @ref UMLView instance that this class belongs to, it will be automatically deleted. -+ * -+ * The PreconditionWidget class inherits from the @ref UMLWidget class which adds most of the functionality -+ * to this class. -+ * -+ * @author Florence Mattler -+ * -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class PreconditionWidget : public UMLWidget -+{ -+ Q_OBJECT -+public: -+ PreconditionWidget(UMLScene* scene, ObjectWidget* a, Uml::ID::Type id = Uml::ID::None); -+ virtual ~PreconditionWidget(); -+ -+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ int minY() const; -+ int maxY() const; -+ -+ bool activate(IDChangeLog* Log = 0); -+ void resolveObjectWidget(IDChangeLog* log); -+ -+ virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ virtual bool loadFromXMI(QDomElement& qElement); -+ -+ void setObjectWidget(ObjectWidget* widget); -+ -+public slots: -+ void slotMenuSelection(QAction* action); -+ void slotWidgetMoved(Uml::ID::Type id); -+ -+protected: -+ QSizeF minimumSize() const; -+ -+private: -+ void calculateWidget(); -+ void calculateDimensions(); -+ -+ ObjectWidget* m_objectWidget; -+ int m_nY; -+ -+ Uml::ID::Type m_widgetAId; -+ void loadObjectWidget(); -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/regionwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/regionwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/regionwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/regionwidget.cpp 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,108 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "regionwidget.h" -+ -+// app includes -+#include "basictypes.h" -+#include "debug_utils.h" -+ -+// kde includes -+#include -+ -+#define REGION_MARGIN 5 -+#define REGION_WIDTH 90 -+#define REGION_HEIGHT 45 -+ -+/** -+ * Creates a Region widget. -+ * -+ * @param scene The parent of the widget. -+ * @param id The ID to assign (-1 will prompt a new ID.) -+ */ -+RegionWidget::RegionWidget(UMLScene* scene, Uml::ID::Type id) -+ : UMLWidget(scene, WidgetBase::wt_Region, id) -+{ -+} -+ -+/** -+ * Destructor. -+ */ -+RegionWidget::~RegionWidget() -+{ -+} -+ -+/** -+ * Overrides the standard paint event. -+ */ -+void RegionWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ const int w = width(); -+ const int h = height(); -+ -+ setPenFromSettings(painter); -+ QPen pen = painter->pen(); -+ pen.setColor(Qt::red); -+ pen.setStyle(Qt::DashLine); -+ painter->setPen(pen); -+ painter->drawRoundRect(0, 0, w, h, (h * 60) / w, 60); -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Overrides method from UMLWidget -+ */ -+QSizeF RegionWidget::minimumSize() const -+{ -+ int width = 10, height = 10; -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ int textWidth = fm.width(name()); -+ -+ height = fontHeight; -+ width = textWidth > REGION_WIDTH?textWidth:REGION_WIDTH; -+ height = height > REGION_HEIGHT ? height : REGION_HEIGHT; -+ width += REGION_MARGIN * 2; -+ height += REGION_MARGIN * 2; -+ -+ return QSizeF(width, height); -+} -+ -+/** -+ * Saves region widget to XMI element. -+ */ -+void RegionWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+{ -+ QDomElement regionElement = qDoc.createElement(QLatin1String("regionwidget")); -+ UMLWidget::saveToXMI(qDoc, regionElement); -+ regionElement.setAttribute(QLatin1String("regionname"), name()); -+ regionElement.setAttribute(QLatin1String("documentation"), documentation()); -+ -+ qElement.appendChild(regionElement); -+} -+ -+/** -+ * Loads region widget from XMI element. -+ */ -+bool RegionWidget::loadFromXMI(QDomElement& qElement) -+{ -+ if (!UMLWidget::loadFromXMI(qElement)) { -+ return false; -+ } -+ setName(qElement.attribute(QLatin1String("regionname"))); -+ setDocumentation(qElement.attribute(QLatin1String("documentation"))); -+ return true; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/regionwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/regionwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/regionwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/regionwidget.h 2015-10-08 11:48:59.509089026 +0300 -@@ -0,0 +1,36 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+***************************************************************************/ -+ -+#ifndef REGIONWIDGET_H -+#define REGIONWIDGET_H -+ -+#include "umlwidget.h" -+ -+/** -+ * Represents a rectangular region on Activity diagram. -+ */ -+class RegionWidget: public UMLWidget -+{ -+ Q_OBJECT -+public: -+ explicit RegionWidget(UMLScene* scene, Uml::ID::Type id = Uml::ID::None); -+ virtual ~RegionWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -+ bool loadFromXMI(QDomElement& qElement); -+ -+protected: -+ QSizeF minimumSize() const; -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/seqlinewidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/seqlinewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/seqlinewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/seqlinewidget.cpp 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,197 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "seqlinewidget.h" -+ -+//app includes -+#include "messagewidget.h" -+#include "objectwidget.h" -+#include "umlscene.h" -+#include "umlview.h" -+ -+//qt includes -+#include -+ -+// class members -+int const SeqLineWidget::m_nMouseDownEpsilonX = 20; -+ -+/** -+ * Constructor. -+ */ -+SeqLineWidget::SeqLineWidget(UMLScene *scene, ObjectWidget * pObject) -+ : QGraphicsLineItem(), -+ m_scene(scene) -+{ -+ scene->addItem(this); -+ m_pObject = pObject; -+ setPen(QPen(m_pObject->lineColor(), 0, Qt::DashLine)); -+ setZValue(0); -+ setVisible(true); -+ m_DestructionBox.line1 = 0; -+ m_nLengthY = 250; -+ setupDestructionBox(); -+} -+ -+/** -+ * Destructor. -+ */ -+SeqLineWidget::~SeqLineWidget() -+{ -+} -+ -+/** -+ * Return whether point is on sequence line. -+ * Takes into account destruction box if shown. -+ * -+ * @param p The point to investigate. -+ * @return True if point is on this sequence line. -+ */ -+bool SeqLineWidget::onWidget(const QPointF & p) -+{ -+ bool isOnWidget = false; -+ QPointF sp = line().p1(); -+ QPointF ep = line().p2(); -+ //see if on widget (for message creation) -+ if (sp.x() - m_nMouseDownEpsilonX < p.x() -+ && ep.x() + m_nMouseDownEpsilonX > p.x() -+ && sp.y() < p.y() && ep.y() + 3 > p.y()) -+ { -+ isOnWidget = true; -+ } -+ return isOnWidget; -+} -+ -+/** -+ * Return whether point is on the destruction box. -+ * -+ * @param p The point to investigate. -+ * @return True if point is on the destruction box of this sequence line. -+ */ -+bool SeqLineWidget::onDestructionBox(const QPointF & p) -+{ -+ bool isOnDestructionBox = false; -+ int x = m_pObject->x() + m_pObject->width() / 2; -+ int y = m_pObject->y() + m_pObject->height() + m_nLengthY; -+ -+ //see if on destruction box -+ if (!m_pObject->showDestruction()) { -+ return false; -+ } -+ if (x - 10 < p.x() && x + 10 > p.x() -+ && y - 10 < p.y() && y + 10 > p.y()) -+ { -+ isOnDestructionBox = true; -+ } -+ return isOnDestructionBox; -+} -+ -+/** -+ * Clean up anything before deletion. -+ */ -+void SeqLineWidget::cleanup() -+{ -+ cleanupDestructionBox(); -+} -+ -+/** -+ * Set the start point of the line. -+ * -+ * @param startX X coordinate of the start point. -+ * @param startY Y coordinate of the start point. -+ */ -+void SeqLineWidget::setStartPoint(int startX, int startY) -+{ -+ int endX = startX; -+ int endY = startY + m_nLengthY; -+ QGraphicsLineItem::setLine(startX, startY, endX, endY); -+ moveDestructionBox(); -+} -+ -+/** -+ * Clean up destruction box. -+ */ -+void SeqLineWidget::cleanupDestructionBox() -+{ -+ if (m_DestructionBox.line1) { -+ delete m_DestructionBox.line1; -+ m_DestructionBox.line1 = 0; -+ delete m_DestructionBox.line2; -+ m_DestructionBox.line2 = 0; -+ } -+} -+ -+/** -+ * Set up destruction box. -+ */ -+void SeqLineWidget::setupDestructionBox() -+{ -+ cleanupDestructionBox(); -+ if(!m_pObject->showDestruction()) { -+ return; -+ } -+ QRect rect; -+ rect.setX(m_pObject->x() + m_pObject->width() / 2 - 10); -+ rect.setY(m_pObject->y() + m_pObject->height() + m_nLengthY); -+ rect.setWidth(14); -+ rect.setHeight(14); -+ -+ m_DestructionBox.line1 = new QGraphicsLineItem; -+ m_scene->addItem(m_DestructionBox.line1); -+ m_DestructionBox.setLine1Points(rect); -+ m_DestructionBox.line1->setVisible(true); -+ m_DestructionBox.line1->setPen(QPen(m_pObject->lineColor(), 2)); -+ m_DestructionBox.line1->setZValue(3); -+ -+ m_DestructionBox.line2 = new QGraphicsLineItem; -+ m_scene->addItem(m_DestructionBox.line2); -+ m_DestructionBox.setLine2Points(rect); -+ m_DestructionBox.line2->setVisible(true); -+ m_DestructionBox.line2->setPen(QPen(m_pObject->lineColor(), 2)); -+ m_DestructionBox.line2->setZValue(3); -+} -+ -+/** -+ * Move destruction box. -+ */ -+void SeqLineWidget::moveDestructionBox() -+{ -+ if(!m_DestructionBox.line1) { -+ return; -+ } -+ QRect rect; -+ rect.setX(m_pObject->x() + m_pObject->width() / 2 - 7); -+ rect.setY(m_pObject->y() + m_pObject->height() + m_nLengthY - 7); -+ rect.setWidth(14); -+ rect.setHeight(14); -+ m_DestructionBox.setLine1Points(rect); -+ m_DestructionBox.setLine2Points(rect); -+} -+ -+/** -+ * Sets the y position of the bottom of the vertical line. -+ * -+ * @param yPosition The y coordinate for the bottom of the line. -+ */ -+void SeqLineWidget::setEndOfLine(int yPosition) -+{ -+ QPointF sp = line().p1(); -+ int newY = yPosition; -+ m_nLengthY = yPosition - m_pObject->y() - m_pObject->height(); -+ // normally the managing Objectwidget is responsible for the call of this function -+ // but to be sure - make a double check _against current position_ -+ if (m_nLengthY < 0) { -+ m_nLengthY = 0; -+ newY = m_pObject->y() + m_pObject->height(); -+ } -+ setLine(sp.x(), sp.y(), sp.x(), newY); -+ moveDestructionBox(); -+ m_scene->resizeSceneToItems(); -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/seqlinewidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/seqlinewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/seqlinewidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/seqlinewidget.h 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,86 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef SEQLINEWIDGET_H -+#define SEQLINEWIDGET_H -+ -+#include -+ -+class ObjectWidget; -+class UMLScene; -+ -+/** -+ * @short Widget class for graphical representation of sequence lines -+ * @author Paul Hensgen -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class SeqLineWidget : public QGraphicsLineItem -+{ -+public: -+ SeqLineWidget(UMLScene *scene, ObjectWidget * pObject); -+ virtual ~SeqLineWidget(); -+ -+ bool onWidget(const QPointF& p); -+ -+ bool onDestructionBox(const QPointF& p); -+ -+ void cleanup(); -+ -+ void setupDestructionBox(); -+ -+ void setStartPoint(int startX, int startY); -+ -+ /** -+ * Gets the length of the line. -+ * -+ * @return Length of the line. -+ */ -+ int getLineLength() { -+ return m_nLengthY; -+ } -+ -+ /** -+ * Returns the @ref ObjectWidget associated with this sequence line. -+ * -+ * @return Pointer to the associated ObjectWidget. -+ */ -+ ObjectWidget * getObjectWidget() { -+ return m_pObject; -+ } -+ -+ void setEndOfLine(int yPosition); -+ -+protected: -+ void cleanupDestructionBox(); -+ -+ void moveDestructionBox(); -+ -+ ObjectWidget* m_pObject; ///< ObjectWidget associated with this sequence line -+ UMLScene* m_scene; ///< scene displayed on -+ -+ struct DestructionBox { -+ QGraphicsLineItem * line1; -+ QGraphicsLineItem * line2; -+ void setLine1Points(QRect rect) { -+ line1->setLine(rect.x(), rect.y(), -+ rect.x() + rect.width(), rect.y() + rect.height()); -+ } -+ void setLine2Points(QRect rect) { -+ line2->setLine(rect.x(), rect.y() + rect.height(), -+ rect.x() + rect.width(), rect.y()); -+ } -+ } m_DestructionBox; ///< the destruction box -+ -+ int m_nLengthY; ///< the length of the line -+ -+ static int const m_nMouseDownEpsilonX; ///< margin used for mouse clicks -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/signalwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/signalwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/signalwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/signalwidget.cpp 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,386 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "signalwidget.h" -+ -+// app includes -+#include "basictypes.h" -+#include "debug_utils.h" -+#include "floatingtextwidget.h" -+#include "linkwidget.h" -+#include "listpopupmenu.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "uniqueid.h" -+#include "umlview.h" -+#include "umlwidget.h" -+ -+// kde includes -+#include -+#if QT_VERSION < 0x050000 -+#include -+#endif -+ -+// qt includes -+#include -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+#include -+ -+/** -+ * Creates a Signal widget. -+ * -+ * @param scene The parent of the widget. -+ * @param signalType The type of Signal. -+ * @param id The ID to assign (-1 will prompt a new ID.) -+ */ -+SignalWidget::SignalWidget(UMLScene *scene, SignalType signalType, Uml::ID::Type id) -+ : UMLWidget(scene, WidgetBase::wt_Signal, id), -+ m_oldX(0), -+ m_oldY(0) -+{ -+ m_signalType = signalType; -+ m_pName = NULL; -+ if (signalType == SignalWidget::Time) { -+ m_pName = new FloatingTextWidget(scene, Uml::TextRole::Floating, QString()); -+ scene->setupNewWidget(m_pName); -+ m_pName->setX(0); -+ m_pName->setY(0); -+ connect(m_pName, SIGNAL(destroyed()), this, SLOT(slotTextDestroyed())); -+ } -+} -+ -+/** -+ * Destructor. -+ */ -+SignalWidget::~SignalWidget() -+{ -+} -+ -+/** -+ * Overrides the standard paint event. -+ */ -+void SignalWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ setPenFromSettings(painter); -+ const int w = width(); -+ const int h = height(); -+ QPolygon a; -+ switch (m_signalType) -+ { -+ case Send : -+ if(UMLWidget::useFillColor()) -+ painter->setBrush(UMLWidget::fillColor()); -+ { -+ a.setPoints(5, 0, 0, -+ (w*2)/3, 0, -+ w, h/2, -+ (w*2)/3, h, -+ 0, h); -+ painter->drawPolygon(a); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ int textStartY = (h / 2) - (fontHeight / 2); -+ -+ painter->setPen(textColor()); -+ QFont font = UMLWidget::font(); -+ font.setBold(false); -+ painter->setFont(font); -+ painter->drawText(SIGNAL_MARGIN, textStartY, -+ w - SIGNAL_MARGIN * 2, fontHeight, -+ Qt::AlignCenter, name()); -+ setPenFromSettings(painter); -+ } -+ break; -+ case Accept : -+ if(UMLWidget::useFillColor()) -+ painter->setBrush(UMLWidget::fillColor()); -+ { -+ a.setPoints(5, 0, 0, -+ w/3, h/2, -+ 0, h, -+ w, h, -+ w, 0); -+ -+ painter->drawPolygon(a); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ int textStartY = (h / 2) - (fontHeight / 2); -+ -+ painter->setPen(textColor()); -+ QFont font = UMLWidget::font(); -+ font.setBold(false); -+ painter->setFont(font); -+ painter->drawText(SIGNAL_MARGIN, textStartY, -+ w - SIGNAL_MARGIN * 2 + (w/3), fontHeight, -+ Qt::AlignCenter, name()); -+ setPenFromSettings(painter); -+ } -+ break; -+ case Time : -+ if(UMLWidget::useFillColor()) -+ painter->setBrush(UMLWidget::fillColor()); -+ { -+ a.setPoints(4, 0, 0, -+ w, h, -+ 0, h, -+ w, 0); -+ -+ painter->drawPolygon(a); -+ //const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ //const int fontHeight = fm.lineSpacing(); -+ //int textStartY = (h / 2) - (fontHeight / 2); -+ painter->setPen(textColor()); -+ QFont font = UMLWidget::font(); -+ font.setBold(false); -+ painter->setFont(font); -+ -+ setPenFromSettings(painter); -+ } -+ if (m_pName) { -+ if (m_pName->x() == 0 && m_pName->y() == 0) { -+ //the floating text has not been linked with the signal -+ m_pName->setX(w/2 - m_pName->width()/2); -+ m_pName->setY(h); -+ } -+ m_pName->setVisible((m_pName->text().length() > 0)); -+ m_pName->updateGeometry(); -+ } -+ -+ break; -+ default: -+ uWarning() << "Unknown signal type:" << m_signalType; -+ break; -+ } -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Overrides the UMLWidget method. -+ */ -+void SignalWidget::setX(qreal newX) -+{ -+ m_oldX = x(); -+ UMLWidget::setX(newX); -+} -+ -+/** -+ * Overrides the UMLWidget method. -+ */ -+void SignalWidget::setY(qreal newY) -+{ -+ m_oldY = y(); -+ UMLWidget::setY(newY); -+} -+ -+/** -+ * Sets the name of the signal. -+ */ -+void SignalWidget::setName(const QString &strName) -+{ -+ UMLWidget::setName(strName); -+ updateGeometry(); -+ if (signalType() == SignalWidget::Time) { -+ if (!m_pName) { -+ m_pName = new FloatingTextWidget(umlScene(), Uml::TextRole::Floating, m_Text); -+ umlScene()->setupNewWidget(m_pName); -+ m_pName->setX(0); -+ m_pName->setY(0); -+ connect(m_pName, SIGNAL(destroyed()), this, SLOT(slotTextDestroyed())); -+ } -+ else -+ m_pName->setText(m_Text); -+ } -+} -+ -+/** -+ * Returns the type of Signal. -+ */ -+SignalWidget::SignalType SignalWidget::signalType() const -+{ -+ return m_signalType; -+} -+ -+/** -+ * Returns the type string of Signal. -+ */ -+QString SignalWidget::signalTypeStr() const -+{ -+ return QLatin1String(ENUM_NAME(SignalWidget, SignalType, m_signalType)); -+} -+ -+/** -+ * Sets the type of Signal. -+ */ -+void SignalWidget::setSignalType(SignalType signalType) -+{ -+ m_signalType = signalType; -+} -+ -+/** -+ * Show a properties dialog for a UMLWidget. -+ */ -+void SignalWidget::showPropertiesDialog() -+{ -+} -+ -+/** -+ * Overrides mouseMoveEvent. -+ */ -+void SignalWidget::mouseMoveEvent(QGraphicsSceneMouseEvent* me) -+{ -+ UMLWidget::mouseMoveEvent(me); -+ int diffX = m_oldX - x(); -+ int diffY = m_oldY - y(); -+ if (m_pName!=NULL) { -+ m_pName->setX(m_pName->x() - diffX); -+ m_pName->setY(m_pName->y() - diffY); -+ } -+} -+ -+/** -+ * Loads a "signalwidget" XMI element. -+ */ -+bool SignalWidget::loadFromXMI(QDomElement & qElement) -+{ -+ if(!UMLWidget::loadFromXMI(qElement)) -+ return false; -+ m_Text = qElement.attribute(QLatin1String("signalname")); -+ m_Doc = qElement.attribute(QLatin1String("documentation")); -+ QString type = qElement.attribute(QLatin1String("signaltype")); -+ QString textid = qElement.attribute(QLatin1String("textid"), QLatin1String("-1")); -+ Uml::ID::Type textId = Uml::ID::fromString(textid); -+ -+ setSignalType((SignalType)type.toInt()); -+ if (signalType() == Time) { -+ -+ if (textId != Uml::ID::None) { -+ UMLWidget *flotext = m_scene -> findWidget(textId); -+ if (flotext != NULL) { -+ // This only happens when loading files produced by -+ // umbrello-kf6-1.3-beta2. -+ m_pName = static_cast(flotext); -+ return true; -+ } -+ } else { -+ // no textid stored -> get unique new one -+ textId = UniqueID::gen(); -+ } -+ } -+ //now load child elements -+ QDomNode node = qElement.firstChild(); -+ QDomElement element = node.toElement(); -+ if (!element.isNull()) { -+ QString tag = element.tagName(); -+ if (tag == QLatin1String("floatingtext") || tag == QLatin1String("UML::FloatingTextWidget")) { -+ m_pName = new FloatingTextWidget(m_scene, Uml::TextRole::Floating, m_Text, textId); -+ if(! m_pName->loadFromXMI(element)) { -+ // Most likely cause: The FloatingTextWidget is empty. -+ delete m_pName; -+ m_pName = NULL; -+ } -+ else -+ connect(m_pName, SIGNAL(destroyed()), this, SLOT(slotTextDestroyed())); -+ } else { -+ uError() << "unknown tag " << tag; -+ } -+ } -+ return true; -+} -+ -+/** -+ * Creates the "signalwidget" XMI element. -+ */ -+void SignalWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement signalElement = qDoc.createElement(QLatin1String("signalwidget")); -+ UMLWidget::saveToXMI(qDoc, signalElement); -+ signalElement.setAttribute(QLatin1String("signalname"), m_Text); -+ signalElement.setAttribute(QLatin1String("documentation"), m_Doc); -+ signalElement.setAttribute(QLatin1String("signaltype"), m_signalType); -+ if (m_pName && !m_pName->text().isEmpty()) { -+ signalElement.setAttribute(QLatin1String("textid"), Uml::ID::toString(m_pName->id())); -+ m_pName -> saveToXMI(qDoc, signalElement); -+ } -+ qElement.appendChild(signalElement); -+} -+ -+/** -+ * Show a properties dialog for a SignalWidget. -+ * -+ */ -+void SignalWidget::slotMenuSelection(QAction* action) -+{ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch(sel) { -+ case ListPopupMenu::mt_Rename: -+ { -+ bool ok = false; -+ QString name = m_Text; -+#if QT_VERSION >= 0x050000 -+ name = QInputDialog::getText(Q_NULLPTR, -+ i18n("Enter signal name"), -+ i18n("Enter the signal name :"), -+ QLineEdit::Normal, -+ m_Text, &ok); -+#else -+ name = KInputDialog::getText(i18n("Enter signal name"), -+ i18n("Enter the signal name :"), -+ m_Text, &ok); -+#endif -+ if (ok && name.length() > 0) { -+ setName(name); -+ } -+ } -+ break; -+ -+ default: -+ UMLWidget::slotMenuSelection(action); -+ } -+} -+ -+/** -+ * Overrides method from UMLWidget -+ */ -+QSizeF SignalWidget::minimumSize() const -+{ -+ int width = SIGNAL_WIDTH, height = SIGNAL_HEIGHT; -+ const QFontMetrics &fm = getFontMetrics(FT_BOLD); -+ const int fontHeight = fm.lineSpacing(); -+ int textWidth = fm.width(name()); -+ -+ if (m_signalType == Accept) -+ textWidth = int((float)textWidth * 1.3f); -+ height = fontHeight; -+ if (m_signalType != Time) -+ { -+ width = textWidth > SIGNAL_WIDTH?textWidth:SIGNAL_WIDTH; -+ height = height > SIGNAL_HEIGHT?height:SIGNAL_HEIGHT; -+ } -+ width += SIGNAL_MARGIN * 2; -+ height += SIGNAL_MARGIN * 2; -+ -+ return QSizeF(width, height); -+} -+ -+/** -+ * Called if user deletes text widget -+ */ -+void SignalWidget::slotTextDestroyed() -+{ -+ m_pName = 0; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/signalwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/signalwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/signalwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/signalwidget.h 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,86 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+***************************************************************************/ -+ -+#ifndef SIGNALWIDGET_H -+#define SIGNALWIDGET_H -+ -+#include "floatingtextwidget.h" -+#include "linkwidget.h" -+#include "umlwidget.h" -+#include "worktoolbar.h" -+ -+#define SIGNAL_MARGIN 5 -+#define SIGNAL_WIDTH 45 -+#define SIGNAL_HEIGHT 15 -+ -+/** -+ * Represents a Send signal, Accept signal or Time event on an -+ * Activity diagram. -+ */ -+class SignalWidget : public UMLWidget -+{ -+ Q_OBJECT -+ Q_ENUMS(SignalType) -+public: -+ /// Enumeration that codes the different types of signal. -+ enum SignalType -+ { -+ Send = 0, -+ Accept, -+ Time -+ }; -+ -+ explicit SignalWidget(UMLScene * scene, SignalType signalType = Send, Uml::ID::Type id = Uml::ID::None); -+ virtual ~SignalWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ void setX(qreal newX); -+ void setY(qreal newY); -+ -+ virtual void setName(const QString &strName); -+ -+ SignalType signalType() const; -+ QString signalTypeStr() const; -+ void setSignalType(SignalType signalType); -+ -+ virtual void showPropertiesDialog(); -+ -+ void mouseMoveEvent(QGraphicsSceneMouseEvent *me); -+ -+ virtual bool loadFromXMI(QDomElement & qElement); -+ virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+public Q_SLOTS: -+ virtual void slotMenuSelection(QAction* action); -+ -+protected: -+ QSizeF minimumSize() const; -+ -+ /** -+ * Save the value of the widget to know how to move the floatingtext -+ */ -+ int m_oldX; -+ int m_oldY; -+ -+ // Only for the time event -+ /** -+ * This is a pointer to the Floating Text widget which displays the -+ * name of the signal widget. -+ */ -+ FloatingTextWidget* m_pName; -+ -+ SignalType m_signalType; ///< Type of signal -+ -+protected Q_SLOTS: -+ void slotTextDestroyed(); -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/statewidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/statewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/statewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/statewidget.cpp 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,534 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "statewidget.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "docwindow.h" -+#include "listpopupmenu.h" -+#include "statedialog.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "umlview.h" -+#include "umlwidget.h" -+ -+// kde includes -+#include -+#if QT_VERSION < 0x050000 -+#include -+#endif -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+#include -+ -+/** -+ * Creates a State widget. -+ * -+ * @param scene The parent of the widget. -+ * @param stateType The type of state. -+ * @param id The ID to assign (-1 will prompt a new ID.) -+ */ -+StateWidget::StateWidget(UMLScene * scene, StateType stateType, Uml::ID::Type id) -+ : UMLWidget(scene, WidgetBase::wt_State, id) -+{ -+ m_stateType = stateType; -+ m_drawVertical = true; -+ setAspectRatioMode(); -+ m_Text = QLatin1String("State"); -+ QSizeF size = minimumSize(); -+ setSize(size.width(), size.height()); -+} -+ -+/** -+ * Destructor. -+ */ -+StateWidget::~StateWidget() -+{ -+} -+ -+/** -+ * Overrides the standard paint event. -+ */ -+void StateWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ const qreal w = width(); -+ const qreal h = height(); -+ if (w == 0 || h == 0) -+ return; -+ -+ setPenFromSettings(painter); -+ switch (m_stateType) { -+ case StateWidget::Normal: -+ { -+ if (UMLWidget::useFillColor()) { -+ painter->setBrush(UMLWidget::fillColor()); -+ } -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ int textStartY = (h / 2) - (fontHeight / 2); -+ const int count = m_Activities.count(); -+ if (count == 0) { -+ painter->drawRoundRect(0, 0, w, h, (h*40)/w, (w*40)/h); -+ painter->setPen(textColor()); -+ QFont font = UMLWidget::font(); -+ font.setBold(false); -+ painter->setFont(font); -+ painter->drawText(STATE_MARGIN, textStartY, -+ w - STATE_MARGIN * 2, fontHeight, -+ Qt::AlignCenter, name()); -+ setPenFromSettings(painter); -+ } else { -+ painter->drawRoundRect(0, 0, w, h, (h*40)/w, (w*40)/h); -+ textStartY = STATE_MARGIN; -+ painter->setPen(textColor()); -+ QFont font = UMLWidget::font(); -+ font.setBold(true); -+ painter->setFont(font); -+ painter->drawText(STATE_MARGIN, textStartY, w - STATE_MARGIN * 2, -+ fontHeight, Qt::AlignCenter, name()); -+ font.setBold(false); -+ painter->setFont(font); -+ setPenFromSettings(painter); -+ int linePosY = textStartY + fontHeight; -+ -+ QStringList::Iterator end(m_Activities.end()); -+ for(QStringList::Iterator it(m_Activities.begin()); it != end; ++it) { -+ textStartY += fontHeight; -+ painter->drawLine(0, linePosY, w, linePosY); -+ painter->setPen(textColor()); -+ painter->drawText(STATE_MARGIN, textStartY, w - STATE_MARGIN * 2, -+ fontHeight, Qt::AlignCenter, *it); -+ setPenFromSettings(painter); -+ linePosY += fontHeight; -+ }//end for -+ }//end else -+ } -+ break; -+ case StateWidget::Initial : -+ painter->setBrush(WidgetBase::lineColor()); -+ painter->drawEllipse(0, 0, w, h); -+ break; -+ case StateWidget::End : -+ painter->setBrush(WidgetBase::lineColor()); -+ painter->drawEllipse(0, 0, w, h); -+ painter->setBrush(Qt::white); -+ painter->drawEllipse(1, 1, w - 2, h - 2); -+ painter->setBrush(WidgetBase::lineColor()); -+ painter->drawEllipse(3, 3, w - 6, h - 6); -+ break; -+ case StateWidget::Fork: -+ case StateWidget::Join: -+ { -+ painter->setPen(Qt::black); -+ painter->setBrush(Qt::black); -+ painter->drawRect(rect()); -+ } -+ break; -+ case StateWidget::Junction: -+ { -+ painter->setPen(Qt::black); -+ painter->setBrush(Qt::black); -+ painter->drawEllipse(rect()); -+ } -+ break; -+ case StateWidget::DeepHistory: -+ { -+ painter->setBrush(Qt::white); -+ painter->drawEllipse(rect()); -+ painter->setPen(Qt::black); -+ painter->setFont(UMLWidget::font()); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing() / 2; -+ const int xStar = fm.boundingRect(QLatin1String("H")).width(); -+ const int yStar = fontHeight / 4; -+ painter->drawText((w / 6), -+ (h / 4) + fontHeight, QLatin1String("H")); -+ painter->drawText((w / 6) + xStar, -+ (h / 4) + fontHeight - yStar, QLatin1String("*")); -+ } -+ break; -+ case StateWidget::ShallowHistory: -+ { -+ painter->setBrush(Qt::white); -+ painter->drawEllipse(rect()); -+ painter->setPen(Qt::black); -+ painter->setFont(UMLWidget::font()); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing() / 2; -+ painter->drawText((w / 6), -+ (h / 4) + fontHeight, QLatin1String("H")); -+ } -+ break; -+ case StateWidget::Choice: -+ { -+ const qreal x = w / 2; -+ const qreal y = h / 2; -+ QPolygonF polygon; -+ polygon << QPointF(x, 0) << QPointF(w, y) -+ << QPointF(x, h) << QPointF(0, y); -+ painter->setBrush(UMLWidget::fillColor()); -+ painter->drawPolygon(polygon); -+ } -+ break; -+ default: -+ uWarning() << "Unknown state type: " << stateTypeStr(); -+ break; -+ } -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Overrides method from UMLWidget -+ */ -+QSizeF StateWidget::minimumSize() const -+{ -+ int width = 10, height = 10; -+ switch (m_stateType) { -+ case StateWidget::Normal: -+ { -+ const QFontMetrics &fm = getFontMetrics(FT_BOLD); -+ const int fontHeight = fm.lineSpacing(); -+ int textWidth = fm.width(name()); -+ const int count = m_Activities.count(); -+ height = fontHeight; -+ if(count > 0) { -+ height = fontHeight * (count + 1); -+ -+ QStringList::ConstIterator end(m_Activities.end()); -+ for(QStringList::ConstIterator it(m_Activities.begin()); it != end; ++it) { -+ int w = fm.width(*it); -+ if(w > textWidth) -+ textWidth = w; -+ }//end for -+ }//end if -+ width = textWidth > STATE_WIDTH?textWidth:STATE_WIDTH; -+ height = height > STATE_HEIGHT?height:STATE_HEIGHT; -+ width += STATE_MARGIN * 2; -+ height += STATE_MARGIN * 2; -+ break; -+ } -+ case StateWidget::Fork: -+ case StateWidget::Join: -+ if (m_drawVertical) { -+ width = 8; -+ height = 60; -+ } else { -+ width = 60; -+ height = 8; -+ } -+ break; -+ case StateWidget::Junction: -+ width = 18; -+ height = 18; -+ break; -+ case StateWidget::DeepHistory: -+ case StateWidget::ShallowHistory: -+ { -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ width = height = fm.lineSpacing(); -+ } -+ break; -+ case StateWidget::Choice: -+ width = 25; -+ height = 25; -+ break; -+ default: -+ break; -+ } -+ -+ return QSizeF(width, height); -+} -+ -+/** -+ * Overrides method from UMLWidget -+ */ -+QSizeF StateWidget::maximumSize() -+{ -+ switch (m_stateType) { -+ case StateWidget::Initial: -+ case StateWidget::End: -+ case StateWidget::Junction: -+ case StateWidget::Choice: -+ return QSizeF(35, 35); -+ break; -+ case StateWidget::DeepHistory: -+ case StateWidget::ShallowHistory: -+ { -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ return QSizeF(fontHeight + 10, fontHeight + 10); -+ } -+ break; -+ default: -+ break; -+ } -+ return UMLWidget::maximumSize(); -+} -+ -+/** -+ * Set the aspect ratio mode. -+ * Some state types have a fixed aspect ratio -+ */ -+void StateWidget::setAspectRatioMode() -+{ -+ switch (m_stateType) { -+ case StateWidget::Initial: -+ case StateWidget::End: -+ case StateWidget::Choice: -+ case StateWidget::DeepHistory: -+ case StateWidget::ShallowHistory: -+ case StateWidget::Fork: -+ case StateWidget::Join: -+ case StateWidget::Junction: -+ setFixedAspectRatio(true); -+ break; -+ default: -+ setFixedAspectRatio(false); -+ break; -+ } -+} -+ -+/** -+ * Returns the type of state. -+ * @return StateType -+ */ -+StateWidget::StateType StateWidget::stateType() const -+{ -+ return m_stateType; -+} -+ -+/** -+ * Returns the type string of state. -+ */ -+QString StateWidget::stateTypeStr() const -+{ -+ return QLatin1String(ENUM_NAME(StateWidget, StateType, m_stateType)); -+} -+ -+/** -+ * Sets the type of state. -+ */ -+void StateWidget::setStateType(StateType stateType) -+{ -+ m_stateType = stateType; -+ setAspectRatioMode(); -+} -+ -+/** -+ * Adds an activity to this widget. -+ * @return true on success -+ */ -+bool StateWidget::addActivity(const QString &activity) -+{ -+ m_Activities.append(activity); -+ updateGeometry(); -+ return true; -+} -+ -+/** -+ * Removes the given activity from the state. -+ */ -+bool StateWidget::removeActivity(const QString &activity) -+{ -+ if(m_Activities.removeAll(activity) == 0) -+ return false; -+ updateGeometry(); -+ return true; -+} -+ -+/** -+ * Renames the given activity. -+ */ -+bool StateWidget::renameActivity(const QString &activity, const QString &newName) -+{ -+ int index = - 1; -+ if((index = m_Activities.indexOf(activity)) == -1) -+ return false; -+ m_Activities[ index ] = newName; -+ return true; -+} -+ -+/** -+ * Sets the states activities to the ones given. -+ */ -+void StateWidget::setActivities(const QStringList &list) -+{ -+ m_Activities = list; -+ updateGeometry(); -+} -+ -+/** -+ * Returns the list of activities. -+ */ -+QStringList StateWidget::activities() const -+{ -+ return m_Activities; -+} -+ -+/** -+ * Get whether to draw a fork or join vertically. -+ */ -+bool StateWidget::drawVertical() const -+{ -+ return m_drawVertical; -+} -+ -+/** -+ * Set whether to draw a fork or join vertically. -+ */ -+void StateWidget::setDrawVertical(bool to) -+{ -+ m_drawVertical = to; -+ setSize(height(), width()); -+ updateGeometry(); -+ UMLWidget::adjustAssocs(x(), y()); -+} -+ -+/** -+ * Show a properties dialog for a StateWidget. -+ */ -+void StateWidget::showPropertiesDialog() -+{ -+ UMLApp::app()->docWindow()->updateDocumentation(false); -+ -+ QPointer dialog = new StateDialog(m_scene->activeView(), this); -+ if (dialog->exec() && dialog->getChangesMade()) { -+ UMLApp::app()->docWindow()->showDocumentation(this, true); -+ UMLApp::app()->document()->setModified(true); -+ } -+ delete dialog; -+} -+ -+/** -+ * Creates the "statewidget" XMI element. -+ */ -+void StateWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement stateElement = qDoc.createElement(QLatin1String("statewidget")); -+ UMLWidget::saveToXMI(qDoc, stateElement); -+ stateElement.setAttribute(QLatin1String("statename"), m_Text); -+ stateElement.setAttribute(QLatin1String("documentation"), m_Doc); -+ stateElement.setAttribute(QLatin1String("statetype"), m_stateType); -+ if (m_stateType == Fork || m_stateType == Join) -+ stateElement.setAttribute(QLatin1String("drawvertical"), m_drawVertical); -+ //save states activities -+ QDomElement activitiesElement = qDoc.createElement(QLatin1String("Activities")); -+ -+ QStringList::Iterator end(m_Activities.end()); -+ for(QStringList::Iterator it(m_Activities.begin()); it != end; ++it) { -+ QDomElement tempElement = qDoc.createElement(QLatin1String("Activity")); -+ tempElement.setAttribute(QLatin1String("name"), *it); -+ activitiesElement.appendChild(tempElement); -+ }//end for -+ stateElement.appendChild(activitiesElement); -+ qElement.appendChild(stateElement); -+} -+ -+/** -+ * Loads a "statewidget" XMI element. -+ */ -+bool StateWidget::loadFromXMI(QDomElement & qElement) -+{ -+ if(!UMLWidget::loadFromXMI(qElement)) -+ return false; -+ m_Text = qElement.attribute(QLatin1String("statename")); -+ m_Doc = qElement.attribute(QLatin1String("documentation")); -+ QString type = qElement.attribute(QLatin1String("statetype"), QLatin1String("1")); -+ m_stateType = (StateType)type.toInt(); -+ setAspectRatioMode(); -+ QString drawVertical = qElement.attribute(QLatin1String("drawvertical"), QLatin1String("1")); -+ m_drawVertical = (bool)drawVertical.toInt(); -+ //load states activities -+ QDomNode node = qElement.firstChild(); -+ QDomElement tempElement = node.toElement(); -+ if(!tempElement.isNull() && tempElement.tagName() == QLatin1String("Activities")) { -+ QDomNode node = tempElement.firstChild(); -+ QDomElement activityElement = node.toElement(); -+ while(!activityElement.isNull()) { -+ if(activityElement.tagName() == QLatin1String("Activity")) { -+ QString name = activityElement.attribute(QLatin1String("name")); -+ if(!name.isEmpty()) -+ m_Activities.append(name); -+ }//end if -+ node = node.nextSibling(); -+ activityElement = node.toElement(); -+ }//end while -+ }//end if -+ return true; -+} -+ -+/** -+ * Captures any popup menu signals for menus it created. -+ */ -+void StateWidget::slotMenuSelection(QAction* action) -+{ -+ bool ok = false; -+ QString nameNew = name(); -+ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -+ switch(sel) { -+ case ListPopupMenu::mt_Rename: -+#if QT_VERSION >= 0x050000 -+ nameNew = QInputDialog::getText(Q_NULLPTR, -+ i18n("Enter State Name"), -+ i18n("Enter the name of the new state:"), -+ QLineEdit::Normal, -+ name(), &ok); -+#else -+ nameNew = KInputDialog::getText(i18n("Enter State Name"), -+ i18n("Enter the name of the new state:"), -+ name(), &ok); -+#endif -+ if (ok && nameNew.length() > 0) { -+ setName(nameNew); -+ } -+ break; -+ -+ case ListPopupMenu::mt_Properties: -+ showPropertiesDialog(); -+ break; -+ -+ case ListPopupMenu::mt_New_Activity: -+#if QT_VERSION >= 0x050000 -+ nameNew = QInputDialog::getText(Q_NULLPTR, -+ i18n("Enter Activity"), -+ i18n("Enter the name of the new activity:"), -+ QLineEdit::Normal, -+ i18n("new activity"), &ok); -+#else -+ nameNew = KInputDialog::getText(i18n("Enter Activity"), -+ i18n("Enter the name of the new activity:"), -+ i18n("new activity"), &ok); -+#endif -+ if (ok && nameNew.length() > 0) { -+ addActivity(nameNew); -+ } -+ break; -+ -+ case ListPopupMenu::mt_Flip: -+ setDrawVertical(!m_drawVertical); -+ break; -+ -+ default: -+ UMLWidget::slotMenuSelection(action); -+ break; -+ } -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/statewidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/statewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/statewidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/statewidget.h 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,99 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+***************************************************************************/ -+ -+#ifndef STATEWIDGET_H -+#define STATEWIDGET_H -+ -+#include "umlwidget.h" -+ -+#include -+#include -+ -+#define STATE_MARGIN 5 -+#define STATE_WIDTH 30 -+#define STATE_HEIGHT 10 -+ -+/** -+ * This class is the graphical version of a UML State. -+ * -+ * A StateWidget is created by a @ref UMLView. A StateWidget belongs to -+ * only one @ref UMLView instance. -+ * When the @ref UMLView instance that this class belongs to is destroyed, -+ * it will be automatically deleted. -+ * -+ * The StateWidget class inherits from the @ref UMLWidget class -+ * which adds most of the functionality to this class. -+ * -+ * @short A graphical version of a UML State. -+ * @author Paul Hensgen -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class StateWidget : public UMLWidget -+{ -+ Q_OBJECT -+ Q_ENUMS(StateType) -+public: -+ /// Enumeration that codes the different types of state. -+ enum StateType -+ { -+ Initial = 0, // Pseudostate -+ Normal, -+ End, -+ Fork, // Pseudostate -+ Join, // Pseudostate -+ Junction, // Pseudostate -+ DeepHistory, // Pseudostate -+ ShallowHistory, // Pseudostate -+ Choice // Pseudostate -+ //Terminate // Pseudostate -+ //EntryPoint // Pseudostate -+ //ExitPoint // Pseudostate -+ }; -+ -+ explicit StateWidget(UMLScene * scene, StateType stateType = Normal, Uml::ID::Type id = Uml::ID::None); -+ virtual ~StateWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ StateType stateType() const; -+ QString stateTypeStr() const; -+ void setStateType(StateType stateType); -+ -+ bool addActivity(const QString &activity); -+ bool removeActivity(const QString &activity); -+ bool renameActivity(const QString &activity, const QString &newName); -+ -+ QStringList activities() const; -+ void setActivities(const QStringList &list); -+ -+ bool drawVertical() const; -+ void setDrawVertical(bool to = true); -+ -+ virtual void showPropertiesDialog(); -+ -+ virtual bool loadFromXMI(QDomElement & qElement); -+ virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+protected: -+ QSizeF minimumSize() const; -+ QSizeF maximumSize(); -+ void setAspectRatioMode(); -+ -+public Q_SLOTS: -+ virtual void slotMenuSelection(QAction* action); -+ -+private: -+ StateType m_stateType; ///< Type of state. -+ bool m_drawVertical; ///< whether to draw the fork/join horizontally or vertically -+ QStringList m_Activities; ///< List of activities for the state. -+ -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/statusbartoolbutton.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/statusbartoolbutton.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/statusbartoolbutton.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/statusbartoolbutton.cpp 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,122 @@ -+// vim: set tabstop=4 shiftwidth=4 noexpandtab: -+/* -+Widget taken from gwenview-kf6 -+Copyright 2007 Aurélien Gâteau -+ -+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-kf6. See the -+GNU General Public License for more details. -+ -+You should have received a copy of the GNU General Public License -+along with this program; if not, write to the Free Software -+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -+ -+*/ -+// Self -+#include "statusbartoolbutton.h" -+ -+// Qt -+#include -+#include -+#include -+#include -+ -+// KDE -+#include -+ -+StatusBarToolButton::StatusBarToolButton(QWidget* parent) -+ : QToolButton(parent), -+ mGroupPosition(NotGrouped) -+{ -+ setToolButtonStyle(Qt::ToolButtonTextOnly); -+ setFocusPolicy(Qt::NoFocus); -+ setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); -+} -+ -+ -+QSize StatusBarToolButton::minimumSizeHint() const -+{ -+ return sizeHint(); -+} -+ -+ -+QSize StatusBarToolButton::sizeHint() const -+{ -+ QSize sh = QToolButton::sizeHint(); -+ sh.setHeight(fontMetrics().height()); -+ return sh; -+} -+ -+ -+void StatusBarToolButton::setGroupPosition(StatusBarToolButton::GroupPosition groupPosition) -+{ -+ mGroupPosition = groupPosition; -+} -+ -+ -+void StatusBarToolButton::paintEvent(QPaintEvent* event) -+{ -+ if (mGroupPosition == NotGrouped) { -+ QToolButton::paintEvent(event); -+ return; -+ } -+ QStylePainter painter(this); -+ QStyleOptionToolButton opt; -+ initStyleOption(&opt); -+ QStyleOptionToolButton panelOpt = opt; -+ -+ // Panel -+ QRect& panelRect = panelOpt.rect; -+ switch (mGroupPosition) { -+ case GroupLeft: -+ panelRect.setWidth(panelRect.width() * 2); -+ break; -+ case GroupCenter: -+ panelRect.setLeft(panelRect.left() - panelRect.width()); -+ panelRect.setWidth(panelRect.width() * 3); -+ break; -+ case GroupRight: -+ panelRect.setLeft(panelRect.left() - panelRect.width()); -+ break; -+ case NotGrouped: -+ Q_ASSERT(0); -+ } -+ painter.drawPrimitive(QStyle::PE_PanelButtonTool, panelOpt); -+ -+ // Separator -+ const int y1 = opt.rect.top() + 6; -+ const int y2 = opt.rect.bottom() - 6; -+ if (mGroupPosition & GroupRight) { -+ const int x = opt.rect.left(); -+ painter.setPen(opt.palette.color(QPalette::Light)); -+ painter.drawLine(x, y1, x, y2); -+ } -+ if (mGroupPosition & GroupLeft) { -+ const int x = opt.rect.right(); -+ painter.setPen(opt.palette.color(QPalette::Mid)); -+ painter.drawLine(x, y1, x, y2); -+ } -+ -+ // Text -+ painter.drawControl(QStyle::CE_ToolButtonLabel, opt); -+ -+ // Filtering message on tooltip text for CJK to remove accelerators. -+ // Quoting ktoolbar.cpp: -+ // """ -+ // CJK languages use more verbose accelerator marker: they add a Latin -+ // letter in parenthesis, and put accelerator on that. Hence, the default -+ // removal of ampersand only may not be enough there, instead the whole -+ // parenthesis construct should be removed. Provide these filtering i18n -+ // messages so that translators can use Transcript for custom removal. -+ // """ -+ if (!actions().isEmpty()) { -+ QAction* action = actions().first(); -+ setToolTip(i18nc("@info:tooltip of custom toolbar button", "%1", action->toolTip())); -+ } -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/statusbartoolbutton.h umbrello-kf6-15.08.1/umbrello/umlwidgets/statusbartoolbutton.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/statusbartoolbutton.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/statusbartoolbutton.h 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,58 @@ -+// vim: set tabstop=4 shiftwidth=4 noexpandtab: -+/* -+gwenview-kf6: an image viewer -+Copyright 2007 Aurélien Gâteau -+ -+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-kf6. See the -+GNU General Public License for more details. -+ -+You should have received a copy of the GNU General Public License -+along with this program; if not, write to the Free Software -+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -+ -+*/ -+#ifndef STATUSBARTOOLBUTTON_H -+#define STATUSBARTOOLBUTTON_H -+ -+// Qt -+#include -+ -+/** -+ * A thin tool button which can be grouped with another and look like one solid-kf6 -+ * bar: -+ * -+ * (button1 | button2) -+ */ -+class StatusBarToolButton : public QToolButton -+{ -+ Q_OBJECT -+public: -+ enum GroupPosition { -+ NotGrouped = 0, -+ GroupLeft = 1, -+ GroupRight = 2, -+ GroupCenter = 3 -+ }; -+ -+ explicit StatusBarToolButton(QWidget* parent = 0); -+ -+ virtual QSize minimumSizeHint() const; -+ virtual QSize sizeHint() const; -+ -+ void setGroupPosition(StatusBarToolButton::GroupPosition groupPosition); -+ -+protected: -+ virtual void paintEvent(QPaintEvent* event); -+ -+private: -+ GroupPosition mGroupPosition; -+}; -+ -+#endif /* STATUSBARTOOLBUTTON_H */ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/toolbarstateonewidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/toolbarstateonewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/toolbarstateonewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/toolbarstateonewidget.cpp 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,249 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "toolbarstateonewidget.h" -+ -+// app includes -+#include "activitywidget.h" -+#include "dialog_utils.h" -+#include "floatingtextwidget.h" -+#include "messagewidget.h" -+#include "objectwidget.h" -+#include "pinwidget.h" -+#include "portwidget.h" -+#include "preconditionwidget.h" -+#include "regionwidget.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "umlwidget.h" -+#include "object_factory.h" -+#include "package.h" -+#include "widget_factory.h" -+ -+// kde includes -+#include -+#include -+#if QT_VERSION < 0x050000 -+#include -+#endif -+ -+// qt includes -+#if QT_VERSION >= 0x050000 -+#include -+#endif -+ -+// using namespace Uml; -+ -+/** -+ * Creates a new ToolBarStateOneWidget. -+ * -+ * @param umlScene The UMLScene to use. -+ */ -+ToolBarStateOneWidget::ToolBarStateOneWidget(UMLScene *umlScene) -+ : ToolBarStatePool(umlScene), -+ m_firstObject(0), -+ m_isObjectWidgetLine(false) -+{ -+} -+ -+/** -+ * Destroys this ToolBarStateOneWidget. -+ */ -+ToolBarStateOneWidget::~ToolBarStateOneWidget() -+{ -+} -+ -+/** -+ * Called when the current tool is changed to use another tool. -+ * Executes base method and cleans the message. -+ */ -+void ToolBarStateOneWidget::cleanBeforeChange() -+{ -+ ToolBarStatePool::cleanBeforeChange(); -+} -+ -+/** -+ * Called when a mouse event happened. -+ * It executes the base method and then updates the position of the -+ * message line, if any. -+ */ -+void ToolBarStateOneWidget::mouseMove(QGraphicsSceneMouseEvent* ome) -+{ -+ ToolBarStatePool::mouseMove(ome); -+} -+ -+/** -+ * A widget was removed from the UMLView. -+ * If the widget removed was the current widget, the current widget is set -+ * to 0. -+ * Also, if it was the first object, the message is cleaned. -+ */ -+void ToolBarStateOneWidget::slotWidgetRemoved(UMLWidget* widget) -+{ -+ ToolBarState::slotWidgetRemoved(widget); -+} -+ -+/** -+ * Selects only widgets, but no associations. -+ * Overrides base class method. -+ * If the press event happened on the line of an object, the object is set -+ * as current widget. If the press event happened on a widget, the widget is -+ * set as current widget. -+ */ -+void ToolBarStateOneWidget::setCurrentElement() -+{ -+ m_isObjectWidgetLine = false; -+ ObjectWidget* objectWidgetLine = m_pUMLScene->onWidgetLine(m_pMouseEvent->scenePos()); -+ if (objectWidgetLine) { -+ setCurrentWidget(objectWidgetLine); -+ m_isObjectWidgetLine = true; -+ return; -+ } -+ -+ UMLWidget *widget = m_pUMLScene->widgetAt(m_pMouseEvent->scenePos()); -+ if (widget) { -+ setCurrentWidget(widget); -+ return; -+ } -+} -+ -+/** -+ * Called when the release event happened on a widget. -+ * If the button pressed isn't left button or the widget isn't an object -+ * widget, the message is cleaned. -+ * If the release event didn't happen on the line of an object and the first -+ * object wasn't selected, nothing is done. If the first object was already -+ * selected, a creation message is made. -+ * If the event happened on the line of an object, the first object or the -+ * second are set, depending on whether the first object was already set or -+ * not. -+ */ -+void ToolBarStateOneWidget::mouseReleaseWidget() -+{ -+ WidgetBase::WidgetType type = widgetType(); -+ -+ if (type == WidgetBase::wt_Precondition) { -+ m_firstObject = 0; -+ } -+ if (type == WidgetBase::wt_Pin) { -+ m_firstObject = 0; -+ } -+ -+ if (m_pMouseEvent->button() != Qt::LeftButton || -+ (currentWidget()->baseType() != WidgetBase::wt_Object && -+ currentWidget()->baseType() != WidgetBase::wt_Activity && -+ currentWidget()->baseType() != WidgetBase::wt_Component && -+ currentWidget()->baseType() != WidgetBase::wt_Region)) { -+ return; -+ } -+ -+ if (!m_firstObject && type == WidgetBase::wt_Pin) { -+ setWidget(currentWidget()); -+ return ; -+ } -+ -+ if (!m_isObjectWidgetLine && !m_firstObject) { -+ return; -+ } -+ -+ if (!m_firstObject) { -+ setWidget(currentWidget()); -+ } -+ -+} -+ -+/** -+ * Called when the release event happened on an empty space. -+ * Cleans the message. -+ * Empty spaces are not only actual empty spaces, but also associations. -+ */ -+void ToolBarStateOneWidget::mouseReleaseEmpty() -+{ -+} -+ -+/** -+ * Sets the first object of the message using the specified object. -+ * The temporal visual message is created and mouse tracking enabled, so -+ * mouse events will be delivered. -+ * -+ * @param firstObject The first object of the message. -+ */ -+void ToolBarStateOneWidget::setWidget(UMLWidget* firstObject) -+{ -+ m_firstObject = firstObject; -+ -+ UMLWidget * umlwidget = 0; -+ //m_pUMLScene->viewport()->setMouseTracking(true); -+ if (widgetType() == WidgetBase::wt_Precondition) { -+ umlwidget = new PreconditionWidget(m_pUMLScene, static_cast(m_firstObject)); -+ -+ Dialog_Utils::askNameForWidget(umlwidget, i18n("Enter Precondition Name"), i18n("Enter the precondition"), i18n("new precondition")); -+ // Create the widget. Some setup functions can remove the widget. -+ } -+ -+ if (widgetType() == WidgetBase::wt_Pin) { -+ if (m_firstObject->baseType() == WidgetBase::wt_Activity) { -+ umlwidget = new PinWidget(m_pUMLScene, m_firstObject); -+ // Create the widget. Some setup functions can remove the widget. -+ } else if (m_firstObject->baseType() == WidgetBase::wt_Component) { -+ bool pressedOK = false; -+#if QT_VERSION >= 0x050000 -+ QString name = QInputDialog::getText(UMLApp::app(), -+ i18n("Enter Port Name"), i18n("Enter the port"), -+ QLineEdit::Normal, -+ i18n("new port"), -+ &pressedOK); -+#else -+ QString name = KInputDialog::getText(i18n("Enter Port Name"), i18n("Enter the port"), i18n("new port"), -+ &pressedOK, UMLApp::app()); -+#endif -+ if (pressedOK) { -+ UMLPackage* component = static_cast(m_firstObject->umlObject()); -+ UMLObject *port = Object_Factory::createUMLObject(UMLObject::ot_Port, name, component); -+ umlwidget = Widget_Factory::createWidget(m_pUMLScene, port); -+ } -+ } -+ } -+ -+ if (umlwidget) { -+ m_pUMLScene->setupNewWidget(umlwidget); -+ } -+ -+} -+ -+/** -+ * Returns the widget type of this tool. -+ * -+ * @return The widget type of this tool. -+ */ -+WidgetBase::WidgetType ToolBarStateOneWidget::widgetType() -+{ -+ if (getButton() == WorkToolBar::tbb_Seq_Precondition) { -+ return WidgetBase::wt_Precondition; -+ } -+ -+ if (getButton() == WorkToolBar::tbb_Pin) { -+ return WidgetBase::wt_Pin; -+ } -+ // Shouldn't happen -+ Q_ASSERT(0); -+ return WidgetBase::wt_Pin; -+} -+ -+/** -+ * Goes back to the initial state. -+ */ -+void ToolBarStateOneWidget::init() -+{ -+ ToolBarStatePool::init(); -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/toolbarstateonewidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/toolbarstateonewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/toolbarstateonewidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/toolbarstateonewidget.h 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,59 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef TOOLBARSTATEONEWIDGET_H -+#define TOOLBARSTATEONEWIDGET_H -+ -+#include "toolbarstatepool.h" -+#include "widgetbase.h" -+ -+/** -+ * Sequence tool to create components linked with one object in sequence diagram -+ * like precondition. -+ * With sequence tool, one objects is selected clicking with left button on -+ * it -+ */ -+class ToolBarStateOneWidget : public ToolBarStatePool -+{ -+ Q_OBJECT -+public: -+ explicit ToolBarStateOneWidget(UMLScene *umlScene); -+ virtual ~ToolBarStateOneWidget(); -+ -+ virtual void cleanBeforeChange(); -+ -+ // FIXME: obsolete -+ virtual void mouseMove(QGraphicsSceneMouseEvent* ome); -+ -+public Q_SLOTS: -+ virtual void slotWidgetRemoved(UMLWidget* widget); -+ -+protected: -+ virtual void setCurrentElement(); -+ -+ virtual void mouseReleaseWidget(); -+ virtual void mouseReleaseEmpty(); -+ -+ void setWidget(UMLWidget* firstObject); -+ WidgetBase::WidgetType widgetType(); -+ -+ UMLWidget* m_firstObject; ///< The first object in the message. -+ -+ /** -+ * If there is a current widget, it is true if the press event happened on -+ * the line of an object, or false if it happened on a normal UMLWidget. -+ */ -+ bool m_isObjectWidgetLine; -+ -+private: -+ virtual void init(); -+}; -+ -+#endif //TOOLBARSTATEONEWIDGET_H -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/umlwidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/umlwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/umlwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/umlwidget.cpp 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,1859 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "umlwidget.h" -+ -+// local includes -+#include "associationwidget.h" -+#include "classifier.h" -+#include "classpropertiesdialog.h" -+#include "cmds.h" -+#include "debug_utils.h" -+#include "docwindow.h" -+#include "floatingtextwidget.h" -+#include "idchangelog.h" -+#include "listpopupmenu.h" -+#include "settingsdialog.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umllistview.h" -+#include "umlobject.h" -+#include "umlscene.h" -+#include "umlview.h" -+#include "uniqueid.h" -+ -+// kde includes -+#include -+#include -+ -+// qt includes -+#include -+#include -+#include -+#include -+ -+using namespace Uml; -+ -+DEBUG_REGISTER_DISABLED(UMLWidget) -+ -+const QSizeF UMLWidget::DefaultMinimumSize(50, 20); -+const QSizeF UMLWidget::DefaultMaximumSize(1000, 5000); -+const qreal UMLWidget::defaultMargin = 5; -+ -+/** -+ * Creates a UMLWidget object. -+ * -+ * @param scene The view to be displayed on. -+ * @param type The WidgetType to construct. -+ * This must be set to the appropriate value by the constructors of inheriting classes. -+ * @param o The UMLObject to represent. -+ */ -+UMLWidget::UMLWidget(UMLScene * scene, WidgetType type, UMLObject * o) -+ : WidgetBase(scene, type) -+{ -+ init(); -+ m_umlObject = o; -+ if (m_umlObject) { -+ connect(m_umlObject, SIGNAL(modified()), this, SLOT(updateWidget())); -+ m_nId = m_umlObject->id(); -+ } -+} -+ -+/** -+ * Creates a UMLWidget object. -+ * -+ * @param scene The view to be displayed on. -+ * @param type The WidgetType to construct. -+ * This must be set to the appropriate value by the constructors of inheriting classes. -+ * @param id The id of the widget. -+ * The default value (id_None) will prompt generation of a new ID. -+ */ -+UMLWidget::UMLWidget(UMLScene *scene, WidgetType type, Uml::ID::Type id) -+ : WidgetBase(scene, type) -+{ -+ init(); -+ if (id == Uml::ID::None) -+ m_nId = UniqueID::gen(); -+ else -+ m_nId = id; -+} -+ -+/** -+ * Destructor. -+ */ -+UMLWidget::~UMLWidget() -+{ -+ cleanup(); -+} -+ -+/** -+ * Assignment operator -+ */ -+UMLWidget& UMLWidget::operator=(const UMLWidget & other) -+{ -+ if (this == &other) -+ return *this; -+ -+ WidgetBase::operator=(other); -+ -+ // assign members loaded/saved -+ m_useFillColor = other.m_useFillColor; -+ m_usesDiagramFillColor = other.m_usesDiagramFillColor; -+ m_usesDiagramUseFillColor = other.m_usesDiagramUseFillColor; -+ m_fillColor = other.m_fillColor; -+ m_Assocs = other.m_Assocs; -+ m_isInstance = other.m_isInstance; -+ m_instanceName = other.m_instanceName; -+ m_instanceName = other.m_instanceName; -+ m_showStereotype = other.m_showStereotype; -+ setX(other.x()); -+ setY(other.y()); -+ setRect(rect().x(), rect().y(), other.width(), other.height()); -+ -+ // assign volatile (non-saved) members -+ m_startMove = other.m_startMove; -+ m_nPosX = other.m_nPosX; -+ m_doc = other.m_doc; //new -+ m_resizable = other.m_resizable; -+ for (unsigned i = 0; i < FT_INVALID; ++i) -+ m_pFontMetrics[i] = other.m_pFontMetrics[i]; -+ m_activated = other.m_activated; -+ m_ignoreSnapToGrid = other.m_ignoreSnapToGrid; -+ m_ignoreSnapComponentSizeToGrid = other.m_ignoreSnapComponentSizeToGrid; -+ return *this; -+} -+ -+/** -+ * Overload '==' operator -+ */ -+bool UMLWidget::operator==(const UMLWidget& other) const -+{ -+ if (this == &other) -+ return true; -+ -+ if (m_baseType != other.m_baseType) { -+ return false; -+ } -+ -+ if (id() != other.id()) -+ return false; -+ -+ /* Testing the associations is already an exaggeration, no? -+ The type and ID should uniquely identify an UMLWidget. -+ */ -+ if (m_Assocs.count() != other.m_Assocs.count()) { -+ return false; -+ } -+ -+ // if(getBaseType() != wt_Text) // DON'T do this for floatingtext widgets, an infinite loop will result -+ // { -+ AssociationWidgetListIt assoc_it(m_Assocs); -+ AssociationWidgetListIt assoc_it2(other.m_Assocs); -+ AssociationWidget * assoc = 0, *assoc2 = 0; -+ while (assoc_it.hasNext() && assoc_it2.hasNext()) { -+ assoc = assoc_it.next(); -+ assoc2 = assoc_it2.next(); -+ -+ if (!(*assoc == *assoc2)) { -+ return false; -+ } -+ } -+ // } -+ return true; -+ // NOTE: In the comparison tests we are going to do, we don't need these values. -+ // They will actually stop things functioning correctly so if you change these, be aware of that. -+ /* -+ if(m_useFillColor != other.m_useFillColor) -+ return false; -+ if(m_nId != other.m_nId) -+ return false; -+ if(m_nX != other.m_nX) -+ return false; -+ if(m_nY != other.m_nY) -+ return false; -+ */ -+} -+ -+/** -+ * Sets the local id of the object. -+ * -+ * @param id The local id of the object. -+ */ -+void UMLWidget::setLocalID(Uml::ID::Type id) -+{ -+ m_nLocalID = id; -+} -+ -+/** -+ * Returns the local ID for this object. This ID is used so that -+ * many objects of the same @ref UMLObject instance can be on the -+ * same diagram. -+ * -+ * @return The local ID. -+ */ -+Uml::ID::Type UMLWidget::localID() const -+{ -+ return m_nLocalID; -+} -+ -+/** -+ * Returns the widget with the given ID. -+ * The default implementation tests the following IDs: -+ * - m_nLocalID -+ * - if m_umlObject is non NULL: m_umlObject->id() -+ * - m_nID -+ * Composite widgets override this function to test further owned widgets. -+ * -+ * @param id The ID to test this widget against. -+ * @return 'this' if id is either of m_nLocalID, m_umlObject->id(), or m_nId; -+ * else NULL. -+ */ -+UMLWidget* UMLWidget::widgetWithID(Uml::ID::Type id) -+{ -+ if (id == m_nLocalID || -+ (m_umlObject != NULL && id == m_umlObject->id()) || -+ id == m_nId) -+ return this; -+ return NULL; -+} -+ -+/** -+ * Compute the minimum possible width and height. -+ * -+ * @return QSizeF(mininum_width, minimum_height) -+ */ -+QSizeF UMLWidget::minimumSize() const -+{ -+ return m_minimumSize; -+} -+ -+/** -+ * This method is used to set the minimum size variable for this -+ * widget. -+ * -+ * @param newSize The size being set as minimum. -+ */ -+void UMLWidget::setMinimumSize(const QSizeF& newSize) -+{ -+ m_minimumSize = newSize; -+} -+ -+/** -+ * Compute the maximum possible width and height. -+ * -+ * @return maximum size -+ */ -+QSizeF UMLWidget::maximumSize() -+{ -+ return m_maximumSize; -+} -+ -+/** -+ * This method is used to set the maximum size variable for this -+ * widget. -+ * -+ * @param newSize The size being set as maximum. -+ */ -+void UMLWidget::setMaximumSize(const QSizeF& newSize) -+{ -+ m_maximumSize = newSize; -+} -+ -+/** -+ * Event handler for context menu events. -+ */ -+void UMLWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) -+{ -+ WidgetBase::contextMenuEvent(event); -+} -+ -+/** -+ * Moves the widget to a new position using the difference between the -+ * current position and the new position. -+ * This method doesn't adjust associations. It only moves the widget. -+ * -+ * It can be overridden to constrain movement only in one axis even when -+ * the user isn't constraining the movement with shift or control buttons, for example. -+ * The movement policy set here is applied whenever the widget is moved, being it -+ * moving it explicitly, or as a part of a selection but not receiving directly the -+ * mouse events. -+ * -+ * Default behaviour is move the widget to the new position using the diffs. -+ * @see constrainMovementForAllWidgets -+ * -+ * @param diffX The difference between current X position and new X position. -+ * @param diffY The difference between current Y position and new Y position. -+ */ -+void UMLWidget::moveWidgetBy(qreal diffX, qreal diffY) -+{ -+ setX(x() + diffX); -+ setY(y() + diffY); -+} -+ -+/** -+ * Modifies the value of the diffX and diffY variables used to move the widgets. -+ * -+ * It can be overridden to constrain movement of all the selected widgets only in one -+ * axis even when the user isn't constraining the movement with shift or control -+ * buttons, for example. -+ * The difference with moveWidgetBy is that the diff positions used here are -+ * applied to all the selected widgets instead of only to m_widget, and that -+ * moveWidgetBy, in fact, moves the widget, and here simply the diff positions -+ * are modified. -+ * -+ * Default behaviour is do nothing. -+ * @see moveWidgetBy -+ * -+ * @param diffX The difference between current X position and new X position. -+ * @param diffY The difference between current Y position and new Y position. -+ */ -+void UMLWidget::constrainMovementForAllWidgets(qreal &diffX, qreal &diffY) -+{ -+ Q_UNUSED(diffX) Q_UNUSED(diffY) -+} -+ -+/** -+ * Bring the widget at the pressed position to the foreground. -+ */ -+void UMLWidget::toForeground() -+{ -+ QRectF rect = QRectF(scenePos(), QSizeF(width(), height())); -+ QList items = scene()->items(rect, Qt::IntersectsItemShape, Qt::DescendingOrder); -+ DEBUG(DBG_SRC) << "items at " << rect << " = " << items.count(); -+ if (items.count() > 1) { -+ foreach(QGraphicsItem* i, items) { -+ UMLWidget* w = dynamic_cast(i); -+ if (w) { -+ DEBUG(DBG_SRC) << "item=" << w->name() << " with zValue=" << w->zValue(); -+ if (w->name() != name()) { -+ if (w->zValue() >= zValue()) { -+ setZValue(w->zValue() + 1.0); -+ DEBUG(DBG_SRC) << "bring to foreground with zValue: " << zValue(); -+ } -+ } -+ } -+ } -+ } -+ else { -+ setZValue(0.0); -+ } -+ DEBUG(DBG_SRC) << "zValue is " << zValue(); -+} -+ -+/** -+ * Handles a mouse press event. -+ * It'll select the widget (or mark it to be deselected) and prepare it to -+ * be moved or resized. Go on reading for more info about this. -+ * -+ * Widget values and message bar status are saved. -+ * -+ * If shift or control buttons are pressed, we're in move area no matter -+ * where the button was pressed in the widget. Moreover, if the widget -+ * wasn't already selected, it's added to the selection. If already selected, -+ * it's marked to be deselected when releasing the button (provided it isn't -+ * moved). -+ * Also, if the widget is already selected with other widgets but shift nor -+ * control buttons are pressed, we're in move area. If finally we don't move -+ * the widget, it's selected and the other widgets deselected when releasing -+ * the left button. -+ * -+ * If shift nor control buttons are pressed, we're facing a single selection. -+ * Depending on the position of the cursor, we're in move or in resize area. -+ * If the widget wasn't selected (both when there are no widgets selected, or -+ * when there're other widgets selected but not the one receiving the press -+ * event) it's selected and the others deselected, if any. If already selected, -+ * it's marked to be deselected when releasing the button (provided it wasn't -+ * moved or resized). -+ * -+ * @param event The QGraphicsSceneMouseEvent event. -+ */ -+void UMLWidget::mousePressEvent(QGraphicsSceneMouseEvent *event) -+{ -+ if (event->button() != Qt::LeftButton) { -+ event->ignore(); -+ return; -+ } -+ event->accept(); -+ DEBUG(DBG_SRC) << "widget = " << name() << " / type = " << baseTypeStr(); -+ -+ toForeground(); -+ -+ m_startMovePostion = pos(); -+ m_startResizeSize = QSizeF(width(), height()); -+ -+ // saving the values of the widget -+ m_pressOffset = event->scenePos() - pos(); -+ DEBUG(DBG_SRC) << "press offset=" << m_pressOffset; -+ -+ m_oldStatusBarMsg = UMLApp::app()->statusBarMsg(); -+ -+ if (event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::ControlModifier) { -+ m_shiftPressed = true; -+ -+ if (event->button() == Qt::LeftButton) { -+ m_inMoveArea = true; -+ } -+ -+ if (!isSelected()) { -+ selectMultiple(event); -+ } -+ return; -+ } -+ -+ m_shiftPressed = false; -+ -+ int count = m_scene->selectedCount(true); -+ if (event->button() == Qt::LeftButton) { -+ if (isSelected() && count > 1) { -+ // single selection is made in release event if the widget wasn't moved -+ m_inMoveArea = true; -+ m_oldPos = pos(); -+ return; -+ } -+ -+ if (isInResizeArea(event)) { -+ m_inResizeArea = true; -+ m_oldW = width(); -+ m_oldH = height(); -+ } else { -+ m_inMoveArea = true; -+ } -+ } -+ -+ // if widget wasn't selected, or it was selected but with other widgets also selected -+ if (!isSelected() || count > 1) { -+ selectSingle(event); -+ } -+} -+ -+/** -+ * Handles a mouse move event. -+ * It resizes or moves the widget, depending on where the cursor is pressed -+ * on the widget. Go on reading for more info about this. -+ * -+ * If resizing, the widget is resized using UMLWidget::resizeWidget (where specific -+ * widget resize constraint can be applied), and then the associations are -+ * adjusted. -+ * The resizing can be constrained also to a specific axis using control -+ * and shift buttons. If on or another is pressed, it's constrained to X axis. -+ * If both are pressed, it's constrained to Y axis. -+ * -+ * If not resizing, the widget is being moved. If the move is being started, -+ * the selection bounds are set (which includes updating the list of selected -+ * widgets). -+ * The difference between the previous position of the selection and the new -+ * one is got (taking in account the selection bounds so widgets don't go -+ * beyond the scene limits). Then, it's constrained to X or Y axis depending -+ * on shift and control buttons. -+ * A further constraint is made using constrainMovementForAllWidgets (for example, -+ * if the widget that receives the event can only be moved in Y axis, with this -+ * method the movement of all the widgets in the selection can be constrained to -+ * be moved only in Y axis). -+ * Then, all the selected widgets are moved using moveWidgetBy (where specific -+ * widget movement constraint can be applied) and, if a certain amount of time -+ * passed from the last move event, the associations are also updated (they're -+ * not updated always to be easy on the CPU). Finally, the scene is resized, -+ * and selection bounds updated. -+ * -+ * @param event The QGraphicsSceneMouseEvent event. -+ */ -+void UMLWidget::mouseMoveEvent(QGraphicsSceneMouseEvent* event) -+{ -+ if (m_inResizeArea) { -+ resize(event); -+ return; -+ } -+ -+ if (!m_moved) { -+ UMLApp::app()->document()->writeToStatusBar(i18n("Hold shift or ctrl to move in X axis. Hold shift and control to move in Y axis. Right button click to cancel move.")); -+ -+ m_moved = true; -+ //Maybe needed by AssociationWidget -+ m_startMove = true; -+ -+ setSelectionBounds(); -+ } -+ -+ QPointF position = event->scenePos() - m_pressOffset; -+ qreal diffX = position.x() - x(); -+ qreal diffY = position.y() - y(); -+ -+ if ((event->modifiers() & Qt::ShiftModifier) && (event->modifiers() & Qt::ControlModifier)) { -+ // move only in Y axis -+ diffX = 0; -+ } else if ((event->modifiers() & Qt::ShiftModifier) || (event->modifiers() & Qt::ControlModifier)) { -+ // move only in X axis -+ diffY = 0; -+ } -+ -+ constrainMovementForAllWidgets(diffX, diffY); -+ -+ // nothing to move -+ if (diffX == 0 && diffY == 0) { -+ return; -+ } -+ -+ QPointF delta = event->scenePos() - event->lastScenePos(); -+ adjustUnselectedAssocs(delta.x(), delta.y()); -+ -+ DEBUG(DBG_SRC) << "diffX=" << diffX << " / diffY=" << diffY; -+ foreach(UMLWidget* widget, umlScene()->selectedWidgets()) { -+ widget->moveWidgetBy(diffX, diffY); -+ widget->slotSnapToGrid(); -+ } -+ -+ // Move any selected associations. -+ foreach(AssociationWidget* aw, m_scene->selectedAssocs()) { -+ if (aw->isSelected()) { -+ aw->moveEntireAssoc(diffX, diffY); -+ } -+ } -+ -+ umlScene()->resizeSceneToItems(); -+} -+ -+/** -+ * Handles a mouse release event. -+ * It selects or deselects the widget and cancels or confirms the move or -+ * resize. Go on reading for more info about this. -+ * No matter which tool is selected, Z position of widget is updated. -+ * -+ * Middle button release resets the selection. -+ * Left button release, if it wasn't moved nor resized, selects the widget -+ * and deselect the others if it wasn't selected and there were other widgets -+ * selected. If the widget was marked to be deselected, deselects it. -+ * If it was moved or resized, the document is set to modified if position -+ * or size changed. Also, if moved, all the associations are adjusted because -+ * the timer could have prevented the adjustment in the last move event before -+ * the release. -+ * If mouse was pressed in resize area, cursor is set again to normal cursor -+ * Right button release if right button was pressed shows the pop up menu for -+ * the widget. -+ * If left button was pressed, it cancels the move or resize with a mouse move -+ * event at the same position than the cursor was when pressed. Another left -+ * button release is also sent. -+ * -+ * @param event The QGraphicsSceneMouseEvent event. -+ */ -+void UMLWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -+{ -+ if (!m_moved && !m_resized) { -+ if (!m_shiftPressed && (m_scene->selectedCount(true) > 1)) { -+ selectSingle(event); -+ } else if (!isSelected()) { -+ deselect(event); -+ } -+ } else { -+ // Commands -+ if (m_moved) { -+ int selectionCount = umlScene()->selectedWidgets().count(); -+ if (selectionCount > 1) { -+ UMLApp::app()->beginMacro(i18n("Move widgets")); -+ } -+ foreach(UMLWidget* widget, umlScene()->selectedWidgets()) { -+ UMLApp::app()->executeCommand(new Uml::CmdMoveWidget(widget)); -+ } -+ if (selectionCount > 1) { -+ UMLApp::app()->endMacro(); -+ } -+ m_moved = false; -+ } else { -+ UMLApp::app()->executeCommand(new Uml::CmdResizeWidget(this)); -+ m_resized = false; -+ } -+ -+ if ((m_inMoveArea && wasPositionChanged()) || -+ (m_inResizeArea && wasSizeChanged())) { -+ umlDoc()->setModified(true); -+ } -+ -+ UMLApp::app()->document()->writeToStatusBar(m_oldStatusBarMsg); -+ } -+ -+ if (m_inResizeArea) { -+ m_inResizeArea = false; -+ m_scene->activeView()->setCursor(Qt::ArrowCursor); -+ } else { -+ m_inMoveArea = false; -+ } -+} -+ -+/** -+ * Event handler for mouse double click events. -+ * @param event the QGraphicsSceneMouseEvent event. -+ */ -+void UMLWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) -+{ -+ if (event->button() == Qt::LeftButton) { -+ DEBUG(DBG_SRC) << "widget = " << name() << " / type = " << baseTypeStr(); -+ switch(baseType()) { -+ case WidgetBase::wt_Message: // will be handled in its class -+ QGraphicsItem::mouseDoubleClickEvent(event); -+ break; -+ default: -+ showPropertiesDialog(); -+ event->accept(); -+ break; -+ } -+ } -+} -+ -+/** -+ * Return the start position of the move action. -+ * @return point where the move began -+ */ -+QPointF UMLWidget::startMovePosition() const -+{ -+ return m_startMovePostion; -+} -+ -+/** -+ * Set the start position of the move action. -+ * @param position point where the move began -+ */ -+void UMLWidget::setStartMovePosition(const QPointF &position) -+{ -+ m_startMovePostion = position; -+} -+ -+/** -+ * Return the start size of the resize action. -+ * @return size where the resize began -+ */ -+QSizeF UMLWidget::startResizeSize() const -+{ -+ return m_startResizeSize; -+} -+ -+/** -+ * Resizes the widget. -+ * It's called from resize, after the values are constrained and before -+ * the associations are adjusted. -+ * -+ * Default behaviour is resize the widget using the new size values. -+ * @see resize -+ * -+ * @param newW The new width for the widget. -+ * @param newH The new height for the widget. -+ */ -+void UMLWidget::resizeWidget(qreal newW, qreal newH) -+{ -+ setSize(newW, newH); -+} -+ -+/** -+ * When a widget changes this slot captures that signal. -+ */ -+void UMLWidget::updateWidget() -+{ -+ updateGeometry(); -+ switch (m_baseType) { -+ case WidgetBase::wt_Class: -+ m_scene->createAutoAttributeAssociations(this); -+ break; -+ case WidgetBase::wt_Entity: -+ m_scene->createAutoConstraintAssociations(this); -+ break; -+ default: -+ break; -+ } -+ -+ if (isVisible()) -+ update(); -+} -+ -+/** -+ * Apply possible constraints to the given candidate width and height. -+ * The default implementation limits input values to the bounds returned -+ * by minimumSize()/maximumSize(). -+ * -+ * @param width input value, may be modified by the constraint -+ * @param height input value, may be modified by the constraint -+ */ -+void UMLWidget::constrain(qreal& width, qreal& height) -+{ -+ QSizeF minSize = minimumSize(); -+ if (width < minSize.width()) -+ width = minSize.width(); -+ if (height < minSize.height()) -+ height = minSize.height(); -+ QSizeF maxSize = maximumSize(); -+ if (width > maxSize.width()) -+ width = maxSize.width(); -+ if (height > maxSize.height()) -+ height = maxSize.height(); -+ -+ if (fixedAspectRatio()) { -+ QSizeF size = rect().size(); -+ float aspectRatio = size.width() > 0 ? (float)size.height()/size.width() : 1; -+ height = width * aspectRatio; -+ } -+} -+ -+/** -+ * Initializes key attributes of the class. -+ */ -+void UMLWidget::init() -+{ -+ m_nId = Uml::ID::None; -+ m_nLocalID = UniqueID::gen(); -+ m_isInstance = false; -+ setMinimumSize(DefaultMinimumSize); -+ setMaximumSize(DefaultMaximumSize); -+ -+ m_font = QApplication::font(); -+ for (int i = (int)FT_INVALID - 1; i >= 0; --i) { -+ FontType fontType = (FontType)i; -+ setupFontType(m_font, fontType); -+ m_pFontMetrics[fontType] = new QFontMetrics(m_font); -+ } -+ -+ if (m_scene) { -+ m_useFillColor = true; -+ m_usesDiagramFillColor = true; -+ m_usesDiagramUseFillColor = true; -+ const Settings::OptionState& optionState = m_scene->optionState(); -+ m_fillColor = optionState.uiState.fillColor; -+ m_showStereotype = optionState.classState.showStereoType; -+ } else { -+ uError() << "SERIOUS PROBLEM - m_scene is NULL"; -+ m_useFillColor = false; -+ m_usesDiagramFillColor = false; -+ m_usesDiagramUseFillColor = false; -+ m_showStereotype = false; -+ } -+ -+ m_resizable = true; -+ m_fixedAspectRatio = false; -+ -+ m_startMove = false; -+ m_activated = false; -+ m_ignoreSnapToGrid = false; -+ m_ignoreSnapComponentSizeToGrid = false; -+ m_doc = UMLApp::app()->document(); -+ m_nPosX = 0; -+ connect(m_scene, SIGNAL(sigFillColorChanged(Uml::ID::Type)), this, SLOT(slotFillColorChanged(Uml::ID::Type))); -+ connect(m_scene, SIGNAL(sigLineColorChanged(Uml::ID::Type)), this, SLOT(slotLineColorChanged(Uml::ID::Type))); -+ connect(m_scene, SIGNAL(sigTextColorChanged(Uml::ID::Type)), this, SLOT(slotTextColorChanged(Uml::ID::Type))); -+ connect(m_scene, SIGNAL(sigLineWidthChanged(Uml::ID::Type)), this, SLOT(slotLineWidthChanged(Uml::ID::Type))); -+ -+ m_umlObject = 0; -+ -+ m_oldPos = QPointF(); -+ m_pressOffset = QPointF(); -+ m_oldW = 0; -+ m_oldH = 0; -+ -+ m_shiftPressed = false; -+ m_inMoveArea = false; -+ m_inResizeArea = false; -+ m_moved = false; -+ m_resized = false; -+ -+ setZValue(2.0); // default for most widgets -+} -+ -+/** -+ * This is usually called synchronously after menu.exec() and \a -+ * trigger's parent is always the ListPopupMenu which can be used to -+ * get the type of action of \a trigger. -+ * -+ * @note Subclasses can reimplement to handle specific actions and -+ * leave the rest to WidgetBase::slotMenuSelection. -+ */ -+void UMLWidget::slotMenuSelection(QAction *trigger) -+{ -+ if (!trigger) { -+ return; -+ } -+ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(trigger); -+ switch (sel) { -+ case ListPopupMenu::mt_Resize: -+ umlScene()->resizeSelection(); -+ break; -+ -+ default: -+ WidgetBase::slotMenuSelection(trigger); -+ break; -+ } -+} -+ -+/** -+ * Captures when another widget moves if this widget is linked to it. -+ * @see sigWidgetMoved -+ * -+ * @param id The id of object behind the widget. -+ */ -+void UMLWidget::slotWidgetMoved(Uml::ID::Type /*id*/) -+{ -+} -+ -+/** -+ * Captures a color change signal. -+ * -+ * @param viewID The id of the UMLScene behind the widget. -+ */ -+void UMLWidget::slotFillColorChanged(Uml::ID::Type viewID) -+{ -+ //only change if on the diagram concerned -+ if (m_scene->ID() != viewID) { -+ return; -+ } -+ if (m_usesDiagramFillColor) { -+ WidgetBase::setFillColor(m_scene->fillColor()); -+ } -+ if (m_usesDiagramUseFillColor) { -+ WidgetBase::setUseFillColor(m_scene->useFillColor()); -+ } -+ update(); -+} -+ -+/** -+ * Captures a text color change signal. -+ * -+ * @param viewID The id of the UMLScene behind the widget. -+ */ -+void UMLWidget::slotTextColorChanged(Uml::ID::Type viewID) -+{ -+ //only change if on the diagram concerned -+ if (m_scene->ID() != viewID) -+ return; -+ WidgetBase::setTextColor(m_scene->textColor()); -+ update(); -+} -+ -+ -+/** -+ * Captures a line color change signal. -+ * -+ * @param viewID The id of the UMLScene behind the widget. -+ */ -+void UMLWidget::slotLineColorChanged(Uml::ID::Type viewID) -+{ -+ //only change if on the diagram concerned -+ if (m_scene->ID() != viewID) -+ return; -+ -+ if (m_usesDiagramLineColor) { -+ WidgetBase::setLineColor(m_scene->lineColor()); -+ } -+ update(); -+} -+ -+/** -+ * Captures a linewidth change signal. -+ * -+ * @param viewID The id of the UMLScene behind the widget. -+ */ -+void UMLWidget::slotLineWidthChanged(Uml::ID::Type viewID) -+{ -+ //only change if on the diagram concerned -+ if (m_scene->ID() != viewID) { -+ return; -+ } -+ if (m_usesDiagramLineWidth) { -+ WidgetBase::setLineWidth(m_scene->lineWidth()); -+ } -+ update(); -+} -+ -+/** -+ * Set the status of using fill color (undo action) -+ * -+ * @param fc the status of using fill color. -+ */ -+void UMLWidget::setUseFillColor(bool fc) -+{ -+ if (useFillColor() != fc) { -+ UMLApp::app()->executeCommand(new CmdChangeUseFillColor(this, fc)); -+ } -+} -+ -+/** -+ * Set the status of using fill color. -+ * -+ * @param fc the status of using fill color. -+ */ -+void UMLWidget::setUseFillColorCmd(bool fc) -+{ -+ WidgetBase::setUseFillColor(fc); -+ update(); -+} -+ -+/** -+ * Overrides the method from WidgetBase. -+ */ -+void UMLWidget::setTextColorCmd(const QColor &color) -+{ -+ WidgetBase::setTextColor(color); -+ update(); -+} -+ -+/** -+ * Overrides the method from WidgetBase. -+ */ -+void UMLWidget::setTextColor(const QColor &color) -+{ -+ if (textColor() != color) { -+ UMLApp::app()->executeCommand(new CmdChangeTextColor(this, color)); -+ update(); -+ } -+} -+ -+/** -+ * Overrides the method from WidgetBase. -+ */ -+void UMLWidget::setLineColorCmd(const QColor &color) -+{ -+ WidgetBase::setLineColor(color); -+ update(); -+} -+ -+/** -+ * Overrides the method from WidgetBase. -+ */ -+void UMLWidget::setLineColor(const QColor &color) -+{ -+ if (lineColor() != color) { -+ UMLApp::app()->executeCommand(new CmdChangeLineColor(this, color)); -+ } -+} -+ -+/** -+ * Overrides the method from WidgetBase, execute CmdChangeLineWidth -+ */ -+void UMLWidget::setLineWidth(uint width) -+{ -+ if (lineWidth() != width) { -+ UMLApp::app()->executeCommand(new CmdChangeLineWidth(this, width)); -+ } -+} -+ -+/** -+ * Overrides the method from WidgetBase. -+ */ -+void UMLWidget::setLineWidthCmd(uint width) -+{ -+ WidgetBase::setLineWidth(width); -+ update(); -+} -+ -+/** -+ * Sets the background fill color -+ * -+ * @param color the new fill color -+ */ -+void UMLWidget::setFillColor(const QColor &color) -+{ -+ if (fillColor() != color) { -+ UMLApp::app()->executeCommand(new CmdChangeFillColor(this, color)); -+ } -+} -+ -+/** -+ * Sets the background fill color -+ * -+ * @param color the new fill color -+ */ -+void UMLWidget::setFillColorCmd(const QColor &color) -+{ -+ WidgetBase::setFillColor(color); -+ update(); -+} -+ -+/** -+ * Activate the object after serializing it from a QDataStream -+ * -+ * @param ChangeLog -+ * @return true for success -+ */ -+bool UMLWidget::activate(IDChangeLog* /*ChangeLog = 0 */) -+{ -+ if (widgetHasUMLObject(m_baseType) && m_umlObject == NULL) { -+ m_umlObject = m_doc->findObjectById(m_nId); -+ if (m_umlObject == NULL) { -+ uError() << "cannot find UMLObject with id=" << Uml::ID::toString(m_nId); -+ return false; -+ } -+ } -+ setFontCmd(m_font); -+ setSize(width(), height()); -+ m_activated = true; -+ updateGeometry(); -+ if (m_scene->getPaste()) { -+ FloatingTextWidget * ft = 0; -+ QPointF point = m_scene->getPastep-kf6oint(); -+ int x = point.x() + this->x(); -+ int y = point.y() + this->y(); -+ if (m_scene->type() == Uml::DiagramType::Sequence) { -+ switch (baseType()) { -+ case WidgetBase::wt_Object: -+ case WidgetBase::wt_Precondition : -+ setY(this->y()); -+ setX(x); -+ break; -+ -+ case WidgetBase::wt_Message: -+ setY(this->y()); -+ setX(x); -+ break; -+ -+ case WidgetBase::wt_Text: -+ ft = static_cast(this); -+ if (ft->textRole() == Uml::TextRole::Seq_Message) { -+ setX(x); -+ setY(this->y()); -+ } else { -+ setX(this->x()); -+ setY(this->y()); -+ } -+ break; -+ -+ default: -+ setY(y); -+ break; -+ }//end switch base type -+ }//end if sequence -+ else { -+ setX(x); -+ setY(y); -+ } -+ }//end if pastep-kf6oint -+ else { -+ setX(this->x()); -+ setY(this->y()); -+ } -+ if (m_scene->getPaste()) -+ m_scene->createAutoAssociations(this); -+ updateGeometry(); -+ return true; -+} -+ -+/** -+ * Returns true if the Activate method has been called for this instance -+ * -+ * @return The activate status. -+ */ -+bool UMLWidget::isActivated() const -+{ -+ return m_activated; -+} -+ -+/** -+ * Set the m_activated flag of a widget but does not perform the Activate method -+ * -+ * @param active Status of activation is to be set. -+ */ -+void UMLWidget::setActivated(bool active /*=true*/) -+{ -+ m_activated = active; -+} -+ -+/** -+ * Adds an already created association to the list of -+ * associations that include this UMLWidget -+ */ -+void UMLWidget::addAssoc(AssociationWidget* pAssoc) -+{ -+ if (pAssoc && !m_Assocs.contains(pAssoc)) { -+ m_Assocs.append(pAssoc); -+ } -+} -+ -+/** -+ * Removes an already created association from the list of -+ * associations that include this UMLWidget -+ */ -+void UMLWidget::removeAssoc(AssociationWidget* pAssoc) -+{ -+ if (pAssoc) { -+ m_Assocs.removeAll(pAssoc); -+ } -+} -+ -+/** -+ * Adjusts associations with the given co-ordinates -+ * -+ * @param dx The amount by which the widget moved in X direction. -+ * @param dy The amount by which the widget moved in Y direction. -+ */ -+void UMLWidget::adjustAssocs(qreal dx, qreal dy) -+{ -+ // don't adjust Assocs on file load, as -+ // the original positions, which are stored in XMI -+ // should be reproduced exactly -+ // (don't try to reposition assocs as long -+ // as file is only partly loaded -> reposition -+ // could be misguided) -+ /// @todo avoid trigger of this event during load -+ if (m_doc->loading()) { -+ // don't recalculate the assocs during load of XMI -+ // -> return immediately without action -+ return; -+ } -+ -+ foreach(AssociationWidget* assocwidget, m_Assocs) { -+ assocwidget->saveIdealTextPositions(); -+ } -+ -+ foreach(AssociationWidget* assocwidget, m_Assocs) { -+ assocwidget->widgetMoved(this, dx, dy); -+ } -+} -+ -+/** -+ * Adjusts all unselected associations with the given co-ordinates -+ * -+ * @param dx The amount by which the widget moved in X direction. -+ * @param dy The amount by which the widget moved in Y direction. -+ */ -+void UMLWidget::adjustUnselectedAssocs(qreal dx, qreal dy) -+{ -+ foreach(AssociationWidget* assocwidget, m_Assocs) { -+ if (!assocwidget->isSelected()) -+ assocwidget->saveIdealTextPositions(); -+ } -+ -+ foreach(AssociationWidget* assocwidget, m_Assocs) { -+ if (!assocwidget->isSelected()) { -+ assocwidget->widgetMoved(this, dx, dy); -+ } -+ } -+} -+ -+/** -+ * Show a properties dialog for a UMLWidget. -+ */ -+void UMLWidget::showPropertiesDialog() -+{ -+ // will already be selected so make sure docWindow updates the doc -+ // back it the widget -+ UMLApp::app()->docWindow()->updateDocumentation(false); -+ QPointer dlg = new ClassPropertiesDialog((QWidget*)UMLApp::app(), this); -+ -+ if (dlg->exec()) { -+ UMLApp::app()->docWindow()->showDocumentation(umlObject(), true); -+ m_doc->setModified(true); -+ } -+ dlg->close(); //wipe from memory -+ delete dlg; -+} -+ -+/** -+ * Move the widget by an X and Y offset relative to -+ * the current position. -+ */ -+void UMLWidget::moveByLocal(qreal dx, qreal dy) -+{ -+ qreal newX = x() + dx; -+ qreal newY = y() + dy; -+ setX(newX); -+ setY(newY); -+ adjustAssocs(dx, dy); -+} -+ -+/** -+ * Set the pen. -+ */ -+void UMLWidget::setPenFromSettings(QPainter & p) -+{ -+ p.setPen(QPen(m_lineColor, m_lineWidth)); -+} -+ -+/** -+ * Set the pen. -+ */ -+void UMLWidget::setPenFromSettings(QPainter *p) -+{ -+ p->setPen(QPen(m_lineColor, m_lineWidth)); -+} -+ -+/** -+ * Returns the cursor to be shown when resizing the widget. -+ * Default cursor is KCursor::sizeFDiagCursor(). -+ * -+ * @return The cursor to be shown when resizing the widget. -+ */ -+QCursor UMLWidget::resizeCursor() const -+{ -+ return Qt::SizeFDiagCursor; -+} -+ -+/** -+ * Checks if the mouse is in resize area (right bottom corner), and sets -+ * the cursor depending on that. -+ * The cursor used when resizing is gotten from resizeCursor(). -+ * -+ * @param me The QMouseEVent to check. -+ * @return true if the mouse is in resize area, false otherwise. -+ */ -+bool UMLWidget::isInResizeArea(QGraphicsSceneMouseEvent *me) -+{ -+ qreal m = 10.0; -+ const qreal w = width(); -+ const qreal h = height(); -+ -+ // If the widget itself is very small then make the resize area small, too. -+ // Reason: Else it becomes impossible to do a move instead of resize. -+ if (w - m < m || h - m < m) { -+ m = 2.0; -+ } -+ -+ if (m_resizable && -+ me->scenePos().x() >= (x() + w - m) && -+ me->scenePos().y() >= (y() + h - m)) { -+ m_scene->activeView()->setCursor(resizeCursor()); -+ return true; -+ } else { -+ m_scene->activeView()->setCursor(Qt::ArrowCursor); -+ return false; -+ } -+} -+ -+/** -+ * calculate content related size of widget. -+ * -+ * @return calculated widget size -+ */ -+QSizeF UMLWidget::calculateSize(bool withExtensions /* = true */) const -+{ -+ Q_UNUSED(withExtensions) -+ return QSizeF(width(), height()); -+} -+ -+/** -+ * Resize widget to minimum size. -+ */ -+void UMLWidget::resize() -+{ -+ qreal oldW = width(); -+ qreal oldH = height(); -+ // @TODO minimumSize() do not work in all cases, we need a dedicated autoResize() method -+ QSizeF size = minimumSize(); -+ setSize(size.width(), size.height()); -+ DEBUG(DBG_SRC) << "size=" << size; -+ adjustAssocs(size.width()-oldW, size.height()-oldH); -+} -+ -+/** -+ * Resizes the widget and adjusts the associations. -+ * It's called when a mouse move event happens and the cursor was -+ * in resize area when pressed. -+ * Resizing can be constrained to an specific axis using control and shift buttons. -+ * -+ * @param me The QGraphicsSceneMouseEvent to get the values from. -+ */ -+void UMLWidget::resize(QGraphicsSceneMouseEvent *me) -+{ -+ // TODO the status message lies for at least MessageWidget which could only be resized vertical -+ UMLApp::app()->document()->writeToStatusBar(i18n("Hold shift or ctrl to move in X axis. Hold shift and control to move in Y axis. Right button click to cancel resize.")); -+ -+ m_resized = true; -+ -+ qreal newW = m_oldW + me->scenePos().x() - x() - m_pressOffset.x(); -+ qreal newH = m_oldH + me->scenePos().y() - y() - m_pressOffset.y(); -+ -+ if ((me->modifiers() & Qt::ShiftModifier) && (me->modifiers() & Qt::ControlModifier)) { -+ //Move in Y axis -+ newW = m_oldW; -+ } else if ((me->modifiers() & Qt::ShiftModifier) || (me->modifiers() & Qt::ControlModifier)) { -+ //Move in X axis -+ newH = m_oldH; -+ } -+ -+ constrain(newW, newH); -+ resizeWidget(newW, newH); -+ DEBUG(DBG_SRC) << "event=" << me->scenePos() << "/ pos=" << pos() << " / newW=" << newW << " / newH=" << newH; -+ QPointF delta = me->scenePos() - me->lastScenePos(); -+ adjustAssocs(delta.x(), delta.y()); -+ -+ m_scene->resizeSceneToItems(); -+} -+ -+/** -+ * Checks if the size of the widget changed respect to the size that -+ * it had when press event was fired. -+ * -+ * @return true if was resized, false otherwise. -+ */ -+bool UMLWidget::wasSizeChanged() -+{ -+ return m_oldW != width() || m_oldH != height(); -+} -+ -+/** -+ * Checks if the position of the widget changed respect to the position that -+ * it had when press event was fired. -+ * -+ * @return true if was moved, false otherwise. -+ */ -+bool UMLWidget::wasPositionChanged() -+{ -+ return m_oldPos != pos(); -+} -+ -+/** -+ * Fills m_selectedWidgetsList and sets the selection bounds ((m_min/m_max)X/Y attributes). -+ */ -+void UMLWidget::setSelectionBounds() -+{ -+} -+ -+void UMLWidget::setSelectedFlag(bool _select) -+{ -+ WidgetBase::setSelected(_select); -+} -+ -+/** -+ * Sets the state of whether the widget is selected. -+ * -+ * @param _select The state of whether the widget is selected. -+ */ -+void UMLWidget::setSelected(bool _select) -+{ -+ WidgetBase::setSelected(_select); -+ const WidgetBase::WidgetType wt = m_baseType; -+ if (_select) { -+ if (m_scene->selectedCount() == 0) { -+ if (widgetHasUMLObject(wt)) { -+ UMLApp::app()->docWindow()->showDocumentation(m_umlObject, false); -+ } else { -+ UMLApp::app()->docWindow()->showDocumentation(this, false); -+ } -+ }//end if -+ /* if (wt != wt_Text && wt != wt_Box) { -+ setZ(9);//keep text on top and boxes behind so don't touch Z value -+ } */ -+ } else { -+ /* if (wt != wt_Text && wt != wt_Box) { -+ setZ(m_origZ); -+ } */ -+ if (isSelected()) -+ UMLApp::app()->docWindow()->updateDocumentation(true); -+ } -+ -+ // TODO: isn't this handled by toForeground() ? -+ const QPoint pos(x(), y()); -+ UMLWidget *bkgnd = m_scene->widgetAt(pos); -+ if (bkgnd && bkgnd != this && _select) { -+ DEBUG(DBG_SRC) << "setting Z to " << bkgnd->zValue() + 1.0 << ", SelectState: " << _select; -+ setZValue(bkgnd->zValue() + 1.0); -+ } -+ -+ update(); -+ -+ // selection changed, we have to make sure the copy and paste items -+ // are correctly enabled/disabled -+ UMLApp::app()->slotCopyChanged(); -+ -+ // select in tree view as done for diagrams -+ if (_select) { -+ UMLListViewItem * item = UMLApp::app()->listView()->findItem(id()); -+ if (item) -+ UMLApp::app()->listView()->setCurrentItem(item); -+ else -+ UMLApp::app()->listView()->clearSelection(); -+ } -+} -+ -+/** -+ * Selects the widget and clears the other selected widgets, if any. -+ * -+ * @param me The QGraphicsSceneMouseEvent which made the selection. -+ */ -+void UMLWidget::selectSingle(QGraphicsSceneMouseEvent *me) -+{ -+ m_scene->clearSelected(); -+ -+ // Adds the widget to the selected widgets list, but as it has been cleared -+ // only the current widget is selected. -+ selectMultiple(me); -+} -+ -+/** -+ * Selects the widget and adds it to the list of selected widgets. -+ * -+ * @param me The QGraphicsSceneMouseEvent which made the selection. -+ */ -+void UMLWidget::selectMultiple(QGraphicsSceneMouseEvent *me) -+{ -+ Q_UNUSED(me); -+ -+ setSelected(true); -+} -+ -+/** -+ * Deselects the widget and removes it from the list of selected widgets. -+ * -+ * @param me The QGraphicsSceneMouseEvent which made the selection. -+ */ -+void UMLWidget::deselect(QGraphicsSceneMouseEvent *me) -+{ -+ Q_UNUSED(me); -+ -+ setSelected(false); -+} -+ -+/** -+ * Clears the selection, resets the toolbar and deselects the widget. -+ */ -+//void UMLWidget::resetSelection() -+//{ -+// m_scene->clearSelected(); -+// m_scene->resetToolbar(); -+// setSelected(false); -+//} -+ -+/** -+ * Sets the view the widget is on. -+ * -+ * @param scene The UMLScene the widget is on. -+ */ -+void UMLWidget::setScene(UMLScene *scene) -+{ -+ //remove signals from old view - was probably 0 anyway -+ disconnect(m_scene, SIGNAL(sigFillColorChanged(Uml::ID::Type)), this, SLOT(slotFillColorChanged(Uml::ID::Type))); -+ disconnect(m_scene, SIGNAL(sigTextColorChanged(Uml::ID::Type)), this, SLOT(slotTextColorChanged(Uml::ID::Type))); -+ disconnect(m_scene, SIGNAL(sigLineWidthChanged(Uml::ID::Type)), this, SLOT(slotLineWidthChanged(Uml::ID::Type))); -+ m_scene = scene; -+ connect(m_scene, SIGNAL(sigFillColorChanged(Uml::ID::Type)), this, SLOT(slotFillColorChanged(Uml::ID::Type))); -+ connect(m_scene, SIGNAL(sigTextColorChanged(Uml::ID::Type)), this, SLOT(slotTextColorChanged(Uml::ID::Type))); -+ connect(m_scene, SIGNAL(sigLineWidthChanged(Uml::ID::Type)), this, SLOT(slotLineWidthChanged(Uml::ID::Type))); -+} -+ -+/** -+ * Sets the x-coordinate. -+ * Currently, the only class that reimplements this method is -+ * ObjectWidget. -+ * -+ * @param x The x-coordinate to be set. -+ */ -+void UMLWidget::setX(qreal x) -+{ -+ QGraphicsObject::setX(x); -+} -+ -+/** -+ * Sets the y-coordinate. -+ * Currently, the only class that reimplements this method is -+ * ObjectWidget. -+ * -+ * @param y The y-coordinate to be set. -+ */ -+void UMLWidget::setY(qreal y) -+{ -+ QGraphicsObject::setY(y); -+} -+ -+/** -+ * Used to cleanup any other widget it may need to delete. -+ * Used by child classes. This should be called before deleting a widget of a diagram. -+ */ -+void UMLWidget::cleanup() -+{ -+} -+ -+/** -+ * Tells the widget to snap to grid. -+ * Will use the grid settings of the @ref UMLView it belongs to. -+ */ -+void UMLWidget::slotSnapToGrid() -+{ -+ if (!m_ignoreSnapToGrid) { -+ qreal newX = m_scene->snappedX(x()); -+ setX(newX); -+ qreal newY = m_scene->snappedY(y()); -+ setY(newY); -+ } -+} -+ -+/** -+ * Returns whether the widget type has an associated UMLObject -+ */ -+bool UMLWidget::widgetHasUMLObject(WidgetBase::WidgetType type) -+{ -+ if (type == WidgetBase::wt_Actor || -+ type == WidgetBase::wt_UseCase || -+ type == WidgetBase::wt_Class || -+ type == WidgetBase::wt_Interface || -+ type == WidgetBase::wt_Enum || -+ type == WidgetBase::wt_Datatype || -+ type == WidgetBase::wt_Package || -+ type == WidgetBase::wt_Component || -+ type == WidgetBase::wt_Port || -+ type == WidgetBase::wt_Node || -+ type == WidgetBase::wt_Artifact || -+ type == WidgetBase::wt_Object) { -+ return true; -+ } else { -+ return false; -+ } -+} -+ -+/** -+ * Set m_ignoreSnapToGrid. -+ */ -+void UMLWidget::setIgnoreSnapToGrid(bool to) -+{ -+ m_ignoreSnapToGrid = to; -+} -+ -+/** -+ * Return the value of m_ignoreSnapToGrid. -+ */ -+bool UMLWidget::getIgnoreSnapToGrid() const -+{ -+ return m_ignoreSnapToGrid; -+} -+ -+/** -+ * Sets the size. -+ * If m_scene->snapComponentSizeToGrid() is true, then -+ * set the next larger size that snaps to the grid. -+ */ -+void UMLWidget::setSize(qreal width, qreal height) -+{ -+ // snap to the next larger size that is a multiple of the grid -+ if (!m_ignoreSnapComponentSizeToGrid -+ && m_scene->snapComponentSizeToGrid()) { -+ // integer divisions -+ int numX = width / m_scene->snapX(); -+ int numY = height / m_scene->snapY(); -+ // snap to the next larger valid value -+ if (width > numX * m_scene->snapX()) -+ width = (numX + 1) * m_scene->snapX(); -+ if (height > numY * m_scene->snapY()) -+ height = (numY + 1) * m_scene->snapY(); -+ } -+ -+ setRect(rect().x(), rect().y(), width, height); -+} -+ -+/** -+ * Sets the size with another size. -+ */ -+void UMLWidget::setSize(const QSizeF& size) -+{ -+ setSize(size.width(), size.height()); -+} -+ -+/** -+ * Update the size of this widget. -+ */ -+void UMLWidget::updateGeometry() -+{ -+ if (m_doc->loading()) { -+ return; -+ } -+ qreal oldW = width(); -+ qreal oldH = height(); -+ QSizeF size = calculateSize(); -+ qreal clipWidth = size.width(); -+ qreal clipHeight = size.height(); -+ constrain(clipWidth, clipHeight); -+ setSize(clipWidth, clipHeight); -+ slotSnapToGrid(); -+ adjustAssocs(size.width()-oldW, size.height()-oldH); -+} -+ -+/** -+ * clip the size of this widget against the -+ * minimal and maximal limits. -+ */ -+void UMLWidget::clipSize() -+{ -+ qreal clipWidth = width(); -+ qreal clipHeight = height(); -+ constrain(clipWidth, clipHeight); -+ setSize(clipWidth, clipHeight); -+} -+ -+/** -+ * Template Method, override this to set the default font metric. -+ */ -+void UMLWidget::setDefaultFontMetrics(QFont &font, UMLWidget::FontType fontType) -+{ -+ setupFontType(font, fontType); -+ setFontMetrics(fontType, QFontMetrics(font)); -+} -+ -+void UMLWidget::setupFontType(QFont &font, UMLWidget::FontType fontType) -+{ -+ switch (fontType) { -+ case FT_NORMAL: -+ font.setBold(false); -+ font.setItalic(false); -+ font.setUnderline(false); -+ break; -+ case FT_BOLD: -+ font.setBold(true); -+ font.setItalic(false); -+ font.setUnderline(false); -+ break; -+ case FT_ITALIC: -+ font.setBold(false); -+ font.setItalic(true); -+ font.setUnderline(false); -+ break; -+ case FT_UNDERLINE: -+ font.setBold(false); -+ font.setItalic(false); -+ font.setUnderline(true); -+ break; -+ case FT_BOLD_ITALIC: -+ font.setBold(true); -+ font.setItalic(true); -+ font.setUnderline(false); -+ break; -+ case FT_BOLD_UNDERLINE: -+ font.setBold(true); -+ font.setItalic(false); -+ font.setUnderline(true); -+ break; -+ case FT_ITALIC_UNDERLINE: -+ font.setBold(false); -+ font.setItalic(true); -+ font.setUnderline(true); -+ break; -+ case FT_BOLD_ITALIC_UNDERLINE: -+ font.setBold(true); -+ font.setItalic(true); -+ font.setUnderline(true); -+ break; -+ default: return; -+ } -+} -+ -+void UMLWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ if (option->state & QStyle::State_Selected) { -+ const qreal w = width(); -+ const qreal h = height(); -+ const qreal s = 4; -+ QBrush brush(Qt::blue); -+ painter->fillRect(0, 0, s, s, brush); -+ painter->fillRect(0, 0 + h - s, s, s, brush); -+ painter->fillRect(0 + w - s, 0, s, s, brush); -+ -+ // Draw the resize anchor in the lower right corner. -+ // Don't draw it if the widget is so small that the -+ // resize anchor would cover up most of the widget. -+ if (m_resizable && w >= s+8 && h >= s+8) { -+ brush.setColor(Qt::red); -+ const int right = 0 + w; -+ const int bottom = 0 + h; -+ painter->drawLine(right - s, 0 + h - 1, 0 + w - 1, 0 + h - s); -+ painter->drawLine(right - (s*2), bottom - 1, right - 1, bottom - (s*2)); -+ painter->drawLine(right - (s*3), bottom - 1, right - 1, bottom - (s*3)); -+ } else { -+ painter->fillRect(0 + w - s, 0 + h - s, s, s, brush); -+ } -+ // debug info -+ if (Tracer::instance()->isEnabled(QLatin1String(metaObject()->className()))) { -+ painter->setPen(Qt::green); -+ painter->setBrush(Qt::NoBrush); -+ painter->drawPath(shape()); -+ painter->setPen(Qt::red); -+ painter->drawRect(boundingRect()); -+ // origin -+ painter->drawLine(-10, 0, 10, 0); -+ painter->drawLine(0, -10, 0, 10); -+ } -+ } -+ -+ if (umlScene()->isShowDocumentationIndicator() && hasDocumentation()) { -+ const qreal h = height(); -+ const qreal d = 8; -+ QPolygonF p; -+ p << QPointF(0, h - d) << QPointF(d, h) << QPointF(0, h); -+ painter->setPen(Qt::blue); -+ painter->setBrush(Qt::red); -+ painter->drawPolygon(p); -+ } -+} -+ -+/** -+ * Template Method, override this to set the default font metric. -+ */ -+void UMLWidget::setDefaultFontMetrics(QFont &font, UMLWidget::FontType fontType, QPainter &painter) -+{ -+ setupFontType(font, fontType); -+ painter.setFont(font); -+ setFontMetrics(fontType, painter.fontMetrics()); -+} -+ -+/** -+ * Returns the font metric used by this object for Text -+ * which uses bold/italic fonts. -+ */ -+QFontMetrics &UMLWidget::getFontMetrics(UMLWidget::FontType fontType) const -+{ -+ return *m_pFontMetrics[fontType]; -+} -+ -+/** -+ * Set the font metric to use. -+ */ -+void UMLWidget::setFontMetrics(UMLWidget::FontType fontType, QFontMetrics fm) -+{ -+ delete m_pFontMetrics[fontType]; -+ m_pFontMetrics[fontType] = new QFontMetrics(fm); -+} -+ -+/** -+ * Sets the font the widget is to use. -+ * -+ * @param font Font to be set. -+ */ -+void UMLWidget::setFont(const QFont &font) -+{ -+ QFont newFont = font; -+ forceUpdateFontMetrics(newFont, 0); -+ -+ if (m_font != newFont) { -+ UMLApp::app()->executeCommand(new CmdChangeFont(this, font)); -+ } -+} -+ -+/** -+ * Sets the font the widget is to use. -+ * -+ * @param font Font to be set. -+ */ -+void UMLWidget::setFontCmd(const QFont &font) -+{ -+ WidgetBase::setFont(font); -+ forceUpdateFontMetrics(0); -+ if (m_doc->loading()) -+ return; -+ update(); -+} -+ -+/** -+ * Updates font metrics for widgets current m_font -+ */ -+void UMLWidget::forceUpdateFontMetrics(QPainter *painter) -+{ -+ forceUpdateFontMetrics(m_font, painter); -+} -+ -+/** -+ * @note For performance Reasons, only FontMetrics for already used -+ * font types are updated. Not yet used font types will not get a font metric -+ * and will get the same font metric as if painter was zero. -+ * This behaviour is acceptable, because diagrams will always be shown on Display -+ * first before a special painter like a printer device is used. -+ */ -+void UMLWidget::forceUpdateFontMetrics(QFont& font, QPainter *painter) -+{ -+ if (painter == 0) { -+ for (int i = (int)FT_INVALID - 1; i >= 0; --i) { -+ if (m_pFontMetrics[(UMLWidget::FontType)i] != 0) -+ setDefaultFontMetrics(font, (UMLWidget::FontType)i); -+ } -+ } else { -+ for (int i2 = (int)FT_INVALID - 1; i2 >= 0; --i2) { -+ if (m_pFontMetrics[(UMLWidget::FontType)i2] != 0) -+ setDefaultFontMetrics(font, (UMLWidget::FontType)i2, *painter); -+ } -+ } -+ if (m_doc->loading()) -+ return; -+ // calculate the size, based on the new font metric -+ updateGeometry(); -+} -+ -+/** -+ * Set the status of whether to show Stereotype. -+ * -+ * @param flag True if stereotype shall be shown. -+ */ -+void UMLWidget::setShowStereotype(bool flag) -+{ -+ m_showStereotype = flag; -+ updateGeometry(); -+ update(); -+} -+ -+/** -+ * Returns the status of whether to show Stereotype. -+ * -+ * @return True if stereotype is shown. -+ */ -+bool UMLWidget::showStereotype() const -+{ -+ return m_showStereotype; -+} -+ -+/** -+ * Overrides the standard operation. -+ * -+ * @param me The move event. -+ */ -+void UMLWidget::moveEvent(QGraphicsSceneMouseEvent* me) -+{ -+ Q_UNUSED(me) -+} -+ -+void UMLWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ /* -+ Call after required actions in child class. -+ Type must be set in the child class. -+ */ -+ WidgetBase::saveToXMI(qDoc, qElement); -+ qElement.setAttribute(QLatin1String("xmi.id"), Uml::ID::toString(id())); -+ qElement.setAttribute(QLatin1String("x"), x()); -+ qElement.setAttribute(QLatin1String("y"), y()); -+ qElement.setAttribute(QLatin1String("width"), width()); -+ qElement.setAttribute(QLatin1String("height"), height()); -+ qElement.setAttribute(QLatin1String("isinstance"), m_isInstance); -+ if (!m_instanceName.isEmpty()) -+ qElement.setAttribute(QLatin1String("instancename"), m_instanceName); -+ if (m_showStereotype) -+ qElement.setAttribute(QLatin1String("showstereotype"), m_showStereotype); -+ -+ // Unique identifier for widget (todo: id() should be unique, new attribute -+ // should indicate the UMLObject's ID it belongs to) -+ qElement.setAttribute(QLatin1String("localid"), Uml::ID::toString(m_nLocalID)); -+} -+ -+bool UMLWidget::loadFromXMI(QDomElement & qElement) -+{ -+ QString id = qElement.attribute(QLatin1String("xmi.id"), QLatin1String("-1")); -+ m_nId = Uml::ID::fromString(id); -+ -+ WidgetBase::loadFromXMI(qElement); -+ QString x = qElement.attribute(QLatin1String("x"), QLatin1String("0")); -+ QString y = qElement.attribute(QLatin1String("y"), QLatin1String("0")); -+ QString h = qElement.attribute(QLatin1String("height"), QLatin1String("0")); -+ QString w = qElement.attribute(QLatin1String("width"), QLatin1String("0")); -+ -+ setSize(w.toFloat(), h.toFloat()); -+ setX(x.toFloat()); -+ setY(y.toFloat()); -+ QString isinstance = qElement.attribute(QLatin1String("isinstance"), QLatin1String("0")); -+ m_isInstance = (bool)isinstance.toInt(); -+ m_instanceName = qElement.attribute(QLatin1String("instancename")); -+ QString showstereo = qElement.attribute(QLatin1String("showstereotype"), QLatin1String("0")); -+ m_showStereotype = (bool)showstereo.toInt(); -+ -+ QString localid = qElement.attribute(QLatin1String("localid"), QLatin1String("0")); -+ if (localid != QLatin1String("0")) { -+ m_nLocalID = Uml::ID::fromString(localid); -+ } -+ -+ return true; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/umlwidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/umlwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/umlwidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/umlwidget.h 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,347 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef UMLWIDGET_H -+#define UMLWIDGET_H -+ -+#include "associationwidgetlist.h" -+#include "basictypes.h" -+#include "optionstate.h" -+#include "umlwidgetlist.h" -+#include "widgetbase.h" -+ -+#include -+#include -+ -+class IDChangeLog; -+class UMLDoc; -+class UMLObject; -+class UMLScene; -+ -+class QPainter; -+class QFontMetrics; -+ -+/** -+ * This is the base class for nearly all graphical widgets. -+ * -+ * @short The base class for graphical UML objects. -+ * @author Paul Hensgen -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UMLWidget : public WidgetBase -+{ -+ Q_OBJECT -+public: -+ -+ friend class ToolBarStateArrow; // for calling the mouse*Event handlers -+ -+ static const QSizeF DefaultMinimumSize; -+ static const QSizeF DefaultMaximumSize; -+ static const qreal defaultMargin; -+ -+ explicit UMLWidget(UMLScene *scene, WidgetType type = wt_UMLWidget, UMLObject *o = 0); -+ explicit UMLWidget(UMLScene *scene, WidgetType type = wt_UMLWidget, Uml::ID::Type id = Uml::ID::None); -+ virtual ~UMLWidget(); -+ -+ // Copy constructor - not implemented. -+ // UMLWidget(const UMLWidget& other); -+ -+ UMLWidget& operator=(const UMLWidget& other); -+ -+ bool operator==(const UMLWidget& other) const; -+ -+ void setLocalID(Uml::ID::Type id); -+ Uml::ID::Type localID() const; -+ -+ virtual UMLWidget* widgetWithID(Uml::ID::Type id); -+ -+ virtual QSizeF minimumSize() const; -+ void setMinimumSize(const QSizeF &size); -+ -+ virtual QSizeF maximumSize(); -+ void setMaximumSize(const QSizeF &size); -+ -+ virtual void setUseFillColor(bool fc); -+ void setUseFillColorCmd(bool fc); -+ -+ virtual void setTextColor(const QColor &color); -+ void setTextColorCmd(const QColor &color); -+ -+ virtual void setLineColor(const QColor &color); -+ void setLineColorCmd(const QColor &color); -+ -+ virtual void setLineWidth(uint width); -+ void setLineWidthCmd(uint width); -+ -+ virtual void setFillColor(const QColor &color); -+ void setFillColorCmd(const QColor &color); -+ -+ void setSelectedFlag(bool _select); -+ virtual void setSelected(bool _select); -+ -+ void setScene(UMLScene *scene); -+ -+ virtual bool activate(IDChangeLog* ChangeLog = 0); -+ -+ void setPenFromSettings(QPainter &p); -+ void setPenFromSettings(QPainter *p); -+ -+ virtual void setFont(const QFont &font); -+ void setFontCmd(const QFont &font); -+ -+ /** -+ * Returns whether we triggered the update of position movement. -+ * If so, you probably don't want to move it. -+ * -+ * @return The moving state. -+ */ -+ bool getStartMove() const { -+ return m_startMove; -+ } -+ -+ virtual void setX(qreal x); -+ virtual void setY(qreal y); -+ -+ /** -+ * Returns the height of widget. -+ */ -+ qreal height() const { -+ return rect().height(); -+ } -+ -+ /** -+ * Returns the width of the widget. -+ */ -+ qreal width() const { -+ return rect().width(); -+ } -+ -+ void setSize(qreal width, qreal height); -+ void setSize(const QSizeF& size); -+ -+ virtual void resizeWidget(qreal newW, qreal newH); -+ -+ bool getIgnoreSnapToGrid() const; -+ void setIgnoreSnapToGrid(bool to); -+ -+ void moveByLocal(qreal dx, qreal dy); -+ -+ void removeAssoc(AssociationWidget* pAssoc); -+ void addAssoc(AssociationWidget* pAssoc); -+ -+ /** -+ * Returns the list of associations connected to this widget. -+ */ -+ AssociationWidgetList & associationWidgetList() { -+ return m_Assocs; -+ } -+ -+ /** -+ * Read property of bool m_isInstance -+ */ -+ bool isInstance() const { -+ return m_isInstance; -+ } -+ -+ /** -+ * Write property of bool m_isInstance -+ */ -+ void setIsInstance(bool isInstance) { -+ m_isInstance = isInstance; -+ } -+ -+ /** -+ * Write property of m_instanceName -+ */ -+ void setInstanceName(const QString &instanceName) { -+ m_instanceName = instanceName; -+ } -+ -+ /** -+ * Read property of m_instanceName -+ */ -+ QString instanceName() const { -+ return m_instanceName; -+ } -+ -+ bool showStereotype() const; -+ virtual void setShowStereotype(bool flag); -+ -+ virtual void showPropertiesDialog(); -+ -+ virtual void adjustAssocs(qreal dx, qreal dy); -+ void adjustUnselectedAssocs(qreal dx, qreal dy); -+ -+ bool isActivated() const; -+ void setActivated(bool active = true); -+ -+ virtual void cleanup(); -+ -+ static bool widgetHasUMLObject(WidgetBase::WidgetType type); -+ -+ void updateGeometry(); -+ -+ void clipSize(); -+ -+ void forceUpdateFontMetrics(QPainter *painter); -+ void forceUpdateFontMetrics(QFont &font, QPainter *painter); -+ -+ virtual bool loadFromXMI(QDomElement &qElement); -+ virtual void saveToXMI(QDomDocument &qDoc, QDomElement &qElement); -+ -+ QPointF startMovePosition() const; -+ void setStartMovePosition(const QPointF &position); -+ -+ QSizeF startResizeSize() const; -+ -+ virtual QSizeF calculateSize(bool withExtensions = true) const; -+ void resize(); -+ -+ bool fixedAspectRatio() const { -+ return m_fixedAspectRatio; -+ } -+ -+ void setFixedAspectRatio(bool state) { -+ m_fixedAspectRatio = state; -+ } -+ -+ typedef enum { -+ FT_NORMAL = 0, -+ FT_BOLD = 1, -+ FT_ITALIC = 2, -+ FT_UNDERLINE = 3, -+ FT_BOLD_ITALIC = 4, -+ FT_BOLD_UNDERLINE = 5, -+ FT_ITALIC_UNDERLINE = 6, -+ FT_BOLD_ITALIC_UNDERLINE = 7, -+ FT_INVALID = 8 -+ } FontType; -+ -+ virtual void setDefaultFontMetrics(QFont &font, UMLWidget::FontType fontType); -+ virtual void setDefaultFontMetrics(QFont &font, UMLWidget::FontType fontType, QPainter &painter); -+ -+ QFontMetrics &getFontMetrics(UMLWidget::FontType fontType) const; -+ void setFontMetrics(UMLWidget::FontType fontType, QFontMetrics fm); -+ void setupFontType(QFont &font, UMLWidget::FontType fontType); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+public Q_SLOTS: -+ virtual void updateWidget(); -+ virtual void slotMenuSelection(QAction* action); -+ virtual void slotWidgetMoved(Uml::ID::Type id); -+ virtual void slotFillColorChanged(Uml::ID::Type viewID); -+ virtual void slotLineColorChanged(Uml::ID::Type viewID); -+ virtual void slotTextColorChanged(Uml::ID::Type viewID); -+ virtual void slotLineWidthChanged(Uml::ID::Type viewID); -+ -+ void slotSnapToGrid(); -+ -+signals: -+ /** -+ * Emit when the widget moves its' position. -+ * @param id The id of the object behind the widget. -+ */ -+ void sigWidgetMoved(Uml::ID::Type id); -+ -+protected: -+ virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent* event); -+ virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); -+ virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); -+ virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); -+ virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); -+ -+ virtual void moveEvent(QGraphicsSceneMouseEvent *event); -+ virtual void moveWidgetBy(qreal diffX, qreal diffY); -+ virtual void constrainMovementForAllWidgets(qreal &diffX, qreal &diffY); -+ virtual void constrain(qreal& width, qreal& height); -+ -+ virtual bool isInResizeArea(QGraphicsSceneMouseEvent *me); -+ virtual QCursor resizeCursor() const; -+ -+ void selectSingle(QGraphicsSceneMouseEvent *me); -+ void selectMultiple(QGraphicsSceneMouseEvent *me); -+ void deselect(QGraphicsSceneMouseEvent *me); -+ // void resetSelection(); -+ -+ void setSelectionBounds(); -+ -+ void resize(QGraphicsSceneMouseEvent *me); -+ -+ bool wasSizeChanged(); -+ bool wasPositionChanged(); -+ -+ ///////////////// Data Loaded/Saved ///////////////////////////////// -+ -+ /// A list of AssociationWidgets between the UMLWidget and other UMLWidgets in the diagram -+ AssociationWidgetList m_Assocs; -+ -+ QString m_instanceName; ///< instance name (used if on a deployment diagram) -+ bool m_isInstance; ///< holds whether this widget is a component instance (i.e. on a deployment diagram) -+ bool m_showStereotype; ///< should the stereotype be displayed -+ -+ ///////////////// End of Data Loaded/Saved ////////////////////////// -+ -+ Uml::ID::Type m_nLocalID; -+ bool m_startMove; -+ QPointF m_startMovePostion; -+ QSizeF m_startResizeSize; -+ int m_nPosX; -+ UMLDoc *m_doc; ///< shortcut for UMLApp::app()->getDocument() -+ bool m_resizable; -+ QFontMetrics *m_pFontMetrics[FT_INVALID]; -+ QSizeF m_minimumSize; -+ QSizeF m_maximumSize; -+ -+ /// true if the activate function has been called for this class instance -+ bool m_activated; -+ -+ /** -+ * Change Widget Behaviour -+ */ -+ bool m_ignoreSnapToGrid; -+ bool m_ignoreSnapComponentSizeToGrid; -+ bool m_fixedAspectRatio; -+ -+ /// The text in the status bar when the cursor was pressed. -+ QString m_oldStatusBarMsg; -+ -+ /// The X/Y offset from the position of the cursor when it was pressed to the -+ /// upper left corner of the widget. -+ QPointF m_pressOffset; -+ -+ /// The X/Y position the widget had when the movement started. -+ QPointF m_oldPos; -+ -+ /// The width/height the widget had when the resize started. -+ qreal m_oldW, m_oldH; -+ -+ /// If shift or control button were pressed in mouse press event. -+ bool m_shiftPressed; -+ -+ /** -+ * If cursor was in move/resize area when left button was pressed (and no -+ * other widgets were selected). -+ */ -+ bool m_inMoveArea, m_inResizeArea; -+ -+ /** -+ * If the widget was selected/moved/resized in the press and release cycle. -+ * Moved/resized is true if the widget was moved/resized even if the final -+ * position/size is the same as the starting one. -+ */ -+ bool m_moved, m_resized; -+ -+private: -+ void init(); -+ void toForeground(); -+ -+}; -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/usecasewidget.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/usecasewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/usecasewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/usecasewidget.cpp 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,96 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header file -+#include "usecasewidget.h" -+ -+// app includes -+#include "usecase.h" -+#include "umlview.h" -+ -+/** -+ * Creates a UseCase widget. -+ * @param scene The parent of the widget. -+ * @param o The UMLUseCase to represent. -+ */ -+UseCaseWidget::UseCaseWidget(UMLScene * scene, UMLUseCase *o) -+ : UMLWidget(scene, WidgetBase::wt_UseCase, o) -+{ -+} -+ -+/** -+ * Destructor. -+ */ -+UseCaseWidget::~UseCaseWidget() -+{ -+} -+ -+/** -+ * Overrides the standard paint event. -+ */ -+void UseCaseWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(option); -+ Q_UNUSED(widget); -+ -+ setPenFromSettings(painter); -+ if (UMLWidget::useFillColor()) -+ painter->setBrush(UMLWidget::fillColor()); -+ QFont font = UMLWidget::font(); -+ font.setUnderline(false); -+ font.setBold(false); -+ font.setItalic(m_umlObject->isAbstract()); -+ painter->setFont(font); -+ const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -+ const int fontHeight = fm.lineSpacing(); -+ const int w = width(); -+ const int h = height(); -+ //int middleX = w / 2; -+ bool drawStereotype = umlObject() && !umlObject()->stereotype().isEmpty(); -+ const int textStartY = (h / 2) - (drawStereotype ? fontHeight / 4 : fontHeight / 2); -+ -+ painter->drawEllipse(0, 0, w, h); -+ painter->setPen(textColor()); -+ if (drawStereotype) -+ painter->drawText(UC_MARGIN, textStartY-fontHeight, w - UC_MARGIN * 2, fontHeight, Qt::AlignCenter, umlObject()->stereotype(true)); -+ -+ painter->drawText(UC_MARGIN, textStartY, w - UC_MARGIN * 2, fontHeight, Qt::AlignCenter, name()); -+ setPenFromSettings(painter); -+ -+ UMLWidget::paint(painter, option, widget); -+} -+ -+/** -+ * Saves this UseCase to file. -+ */ -+void UseCaseWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) -+{ -+ QDomElement usecaseElement = qDoc.createElement(QLatin1String("usecasewidget")); -+ UMLWidget::saveToXMI(qDoc, usecaseElement); -+ qElement.appendChild(usecaseElement); -+} -+ -+/** -+ * Overrides method from UMLWidget -+ */ -+QSizeF UseCaseWidget::minimumSize() const -+{ -+ const UMLWidget::FontType ft = (m_umlObject->isAbstract() ? FT_BOLD_ITALIC : FT_BOLD); -+ const QFontMetrics &fm = UMLWidget::getFontMetrics(ft); -+ const int fontHeight = fm.lineSpacing(); -+ const int textWidth = fm.width(name()); -+ bool drawStereotype = umlObject() && !umlObject()->stereotype().isEmpty(); -+ int width = textWidth > UC_WIDTH?textWidth:UC_WIDTH; -+ int height = UC_HEIGHT + (drawStereotype ? 2 * fontHeight : fontHeight) + UC_MARGIN; -+ -+ width += UC_MARGIN * 2; -+ -+ return QSizeF(width, height); -+} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/usecasewidget.h umbrello-kf6-15.08.1/umbrello/umlwidgets/usecasewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/usecasewidget.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/usecasewidget.h 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,58 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2002-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef USECASEWIDGET_H -+#define USECASEWIDGET_H -+ -+#include "umlwidget.h" -+ -+class UMLUseCase; -+ -+#define UC_MARGIN 5 -+#define UC_WIDTH 60 -+#define UC_HEIGHT 30 -+ -+ -+/** -+ * This class is the graphical version of a UMLUseCase. The -+ * UseCaseWidget class inherits from the @ref UMLWidget class -+ * which adds most of the functionality to this class. -+ -+ * A UseCaseWidget is created by a @ref UMLView. An UseCaseWidget belongs to only one -+ * @ref UMLView instance. When the @ref UMLView instance that this class belongs to, -+ * it will be automatically deleted. -+ * -+ * If the @ref UMLUseCase class that this UseCaseWidget is displaying is deleted, the @ref UMLView will -+ * make sure that this instance is also deleted. -+ * -+ * The UseCaseWidget class inherits from the @ref UMLWidget class which adds most of the functionality -+ * to this class. -+ * -+ * @short A graphical version of a UMLUseCase. -+ * @author Paul Hensgen -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class UseCaseWidget : public UMLWidget -+{ -+public: -+ UseCaseWidget(UMLScene * scene, UMLUseCase *o); -+ virtual ~UseCaseWidget(); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+ // For loading we can use the loadFromXMI() inherited from -+ // UMLWidget. -+ virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -+ -+protected: -+ QSizeF minimumSize() const; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widgetbase.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/widgetbase.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widgetbase.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/widgetbase.cpp 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,1119 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#include "widgetbase.h" -+ -+#include "classifier.h" -+#include "debug_utils.h" -+#include "floatingtextwidget.h" -+#include "optionstate.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlobject.h" -+#include "umlscene.h" -+ -+#if QT_VERSION < 0x050000 -+#include -+#include -+#endif -+#include -+ -+#include -+#if QT_VERSION >= 0x050000 -+#include -+#include -+#endif -+#include -+ -+/** -+ * Creates a WidgetBase object. -+ * -+ * @param scene The view to be displayed on. -+ * @param type The WidgetType to construct. This must be set to the appropriate -+ * value by the constructors of inheriting classes. -+ */ -+WidgetBase::WidgetBase(UMLScene *scene, WidgetType type) -+ : QGraphicsObject(), -+ m_baseType(type), -+ m_scene(scene), -+ m_umlObject(0), -+ m_textColor(QColor("black")), -+ m_lineColor(QColor("black")), -+ m_fillColor(QColor("yellow")), -+ m_brush(m_fillColor), -+ m_lineWidth(0), // initialize with 0 to have valid start condition -+ m_useFillColor(true), -+ m_usesDiagramTextColor(true), -+ m_usesDiagramLineColor(true), -+ m_usesDiagramLineWidth(true) -+{ -+ setSelected(false); -+ scene->addItem(this); -+ -+ // TODO 310283 -+ setFlags(ItemIsSelectable); -+ //setFlags(ItemIsSelectable | ItemIsMovable |ItemSendsGeometryChanges); -+ if (m_scene) { -+ m_usesDiagramLineColor = true; -+ m_usesDiagramLineWidth = true; -+ m_usesDiagramTextColor = true; -+ const Settings::OptionState& optionState = m_scene->optionState(); -+ m_textColor = optionState.uiState.textColor; -+ m_lineColor = optionState.uiState.lineColor; -+ m_lineWidth = optionState.uiState.lineWidth; -+ m_font = optionState.uiState.font; -+ } else { -+ uError() << "WidgetBase constructor: SERIOUS PROBLEM - m_scene is NULL"; -+ } -+} -+ -+/** -+ * Destructor. -+ */ -+WidgetBase::~WidgetBase() -+{ -+} -+ -+/** -+ * Read property of m_baseType. -+ */ -+WidgetBase::WidgetType WidgetBase::baseType() const -+{ -+ return m_baseType; -+} -+ -+/** -+ * @return The type used for rtti as string. -+ */ -+QLatin1String WidgetBase::baseTypeStr() const -+{ -+ return QLatin1String(ENUM_NAME(WidgetBase, WidgetType, m_baseType)); -+} -+ -+/* -+ * Sets the state of whether the widget is selected. -+ * -+ * @param select The state of whether the widget is selected. -+ */ -+void WidgetBase::setSelected(bool select) -+{ -+ QGraphicsObject::setSelected(select); -+} -+ -+/** -+ * Deliver a pointer to the connected UMLView -+ * (needed esp. by event handling of AssociationLine). -+ */ -+UMLScene* WidgetBase::umlScene() const -+{ -+ return m_scene; -+} -+ -+/** -+ * This is shortcut method for UMLApp::app()->document(). -+ * -+ * @return Pointer to the UMLDoc object. -+ */ -+UMLDoc* WidgetBase::umlDoc() const -+{ -+ return UMLApp::app()->document(); -+} -+ -+/** -+ * Returns the @ref UMLObject set to represent. -+ * -+ * @return the UMLObject to represent. -+ */ -+UMLObject* WidgetBase::umlObject() const -+{ -+ return m_umlObject; -+} -+ -+/** -+ * Sets the @ref UMLObject to represent. -+ * -+ * @param obj The object to represent. -+ */ -+void WidgetBase::setUMLObject(UMLObject *obj) -+{ -+ m_umlObject = obj; -+} -+ -+/** -+ * Write property of m_nId. -+ */ -+void WidgetBase::setID(Uml::ID::Type id) -+{ -+ if (m_umlObject) { -+ if (m_umlObject->id() != Uml::ID::None) -+ uWarning() << "changing old UMLObject " << Uml::ID::toString(m_umlObject->id()) -+ << " to " << Uml::ID::toString(id); -+ m_umlObject->setID(id); -+ } -+ m_nId = id; -+} -+ -+/** -+ * Read property of m_nId. -+ */ -+Uml::ID::Type WidgetBase::id() const -+{ -+ if (m_umlObject) -+ return m_umlObject->id(); -+ return m_nId; -+} -+ -+/** -+ * Used by some child classes to get documentation. -+ * -+ * @return The documentation from the UMLObject (if m_umlObject is set.) -+ */ -+QString WidgetBase::documentation() const -+{ -+ if (m_umlObject) -+ return m_umlObject->doc(); -+ return m_Doc; -+} -+ -+/** -+ * Returns state of documentation for the widget. -+ * -+ * @return false if documentation is empty -+ */ -+bool WidgetBase::hasDocumentation() -+{ -+ if (m_umlObject) -+ return m_umlObject->hasDoc(); -+ return !m_Doc.isEmpty(); -+} -+ -+/** -+ * Used by some child classes to set documentation. -+ * -+ * @param doc The documentation to be set in the UMLObject -+ * (if m_umlObject is set.) -+ */ -+void WidgetBase::setDocumentation(const QString& doc) -+{ -+ if (m_umlObject) -+ m_umlObject->setDoc(doc); -+ else -+ m_Doc = doc; -+} -+ -+/** -+ * Gets the name from the corresponding UMLObject if this widget has an -+ * underlying UMLObject; if it does not, then it returns the local -+ * m_Text (notably the case for FloatingTextWidget.) -+ * -+ * @return the currently set name -+ */ -+QString WidgetBase::name() const -+{ -+ if (m_umlObject) -+ return m_umlObject->name(); -+ return m_Text; -+} -+ -+/** -+ * Sets the name in the corresponding UMLObject. -+ * Sets the local m_Text if m_umlObject is NULL. -+ * -+ * @param strName The name to be set. -+ */ -+void WidgetBase::setName(const QString &strName) -+{ -+ if (m_umlObject) -+ m_umlObject->setName(strName); -+ else -+ m_Text = strName; -+} -+ -+/** -+ * Returns text color -+ * -+ * @return currently used text color -+ */ -+QColor WidgetBase::textColor() const -+{ -+ return m_textColor; -+} -+ -+/** -+ * Sets the text color -+ * -+ * @param color the new text color -+ */ -+void WidgetBase::setTextColor(const QColor &color) -+{ -+ m_textColor = color; -+ m_usesDiagramTextColor = false; -+} -+ -+/** -+ * Returns line color -+ * -+ * @return currently used line color -+ */ -+QColor WidgetBase::lineColor() const -+{ -+ return m_lineColor; -+} -+ -+/** -+ * Sets the line color -+ * -+ * @param color The new line color -+ */ -+void WidgetBase::setLineColor(const QColor &color) -+{ -+ m_lineColor = color; -+ m_usesDiagramLineColor = false; -+} -+ -+/** -+ * Returns fill color -+ * -+ * @return currently used fill color -+ */ -+QColor WidgetBase::fillColor() const -+{ -+ return m_fillColor; -+} -+ -+/** -+ * Sets the fill color -+ * -+ * @param color The new fill color -+ */ -+void WidgetBase::setFillColor(const QColor &color) -+{ -+ m_fillColor = color; -+ m_usesDiagramFillColor = false; -+} -+ -+/** -+ * Returns line width -+ * -+ * @return currently used line with -+ */ -+uint WidgetBase::lineWidth() const -+{ -+ return m_lineWidth; -+} -+ -+/** -+ * Sets the line width -+ * -+ * @param width The new line width -+ */ -+void WidgetBase::setLineWidth(uint width) -+{ -+ m_lineWidth = width; -+ m_usesDiagramLineWidth = false; -+} -+ -+/** -+ * Return state of fill color usage -+ * -+ * @return True if fill color is used -+ */ -+bool WidgetBase::useFillColor() -+{ -+ return m_useFillColor; -+} -+ -+/** -+ * Set state if fill color is used -+ * -+ * @param state The state to set -+ */ -+void WidgetBase::setUseFillColor(bool state) -+{ -+ m_useFillColor = state; -+ m_usesDiagramUseFillColor = false; -+} -+ -+/** -+ * Returns state if diagram text color is used -+ * -+ * @return True means diagram text color is used -+ */ -+bool WidgetBase::usesDiagramTextColor() const -+{ -+ return m_usesDiagramTextColor; -+} -+ -+/** -+ * Set state if diagram text color is used -+ * -+ * @param state The state to set -+ */ -+void WidgetBase::setUsesDiagramTextColor(bool state) -+{ -+ if (m_usesDiagramTextColor == state) { -+ return; -+ } -+ m_usesDiagramTextColor = state; -+ setTextColor(m_textColor); -+} -+ -+/** -+ * Returns state of diagram line color is used -+ * -+ * @return True means diagrams line color is used -+*/ -+bool WidgetBase::usesDiagramLineColor() const -+{ -+ return m_usesDiagramLineColor; -+} -+ -+/** -+ * Set state of diagram line color is used -+ * -+ * @param state The state to set -+ */ -+void WidgetBase::setUsesDiagramLineColor(bool state) -+{ -+ m_usesDiagramLineColor = state; -+} -+ -+/** -+ * Returns state of diagram fill color is used -+ * -+ * @return True means diagrams fill color is used -+*/ -+bool WidgetBase::usesDiagramFillColor() const -+{ -+ return m_usesDiagramFillColor; -+} -+ -+/** -+ * Set state if diagram fill color is used -+ * -+ * @param state The state to set -+ */ -+void WidgetBase::setUsesDiagramFillColor(bool state) -+{ -+ m_usesDiagramFillColor = state; -+} -+ -+/** -+ * Returns state of diagram use fill color is used -+ * -+ * @return True means diagrams fill color is used -+*/ -+bool WidgetBase::usesDiagramUseFillColor() const -+{ -+ return m_usesDiagramUseFillColor; -+} -+ -+/** -+ * Set state of diagram use fill color is used -+ * -+ * @param state The state to set -+ */ -+void WidgetBase::setUsesDiagramUseFillColor(bool state) -+{ -+ m_usesDiagramUseFillColor = state; -+} -+ -+/** -+ * Returns state of diagram line width is used -+ * -+ * @return True means diagrams line width is used -+ */ -+bool WidgetBase::usesDiagramLineWidth() const -+{ -+ return m_usesDiagramLineWidth; -+} -+ -+/** -+ * Set state of diagram line width is used -+ * -+ * @param state The state to set -+ */ -+void WidgetBase::setUsesDiagramLineWidth(bool state) -+{ -+ m_usesDiagramLineWidth = state; -+} -+ -+/** -+ * Returns the font used for diaplaying any text. -+ * @return the font -+ */ -+QFont WidgetBase::font() const -+{ -+ return m_font; -+} -+ -+/** -+ * Set the font used to display text inside this widget. -+ */ -+void WidgetBase::setFont(const QFont& font) -+{ -+ m_font = font; -+} -+ -+/** -+ * A virtual method for the widget to display a property dialog box. -+ * Subclasses should reimplment this appropriately. -+ */ -+void WidgetBase::showPropertiesDialog() -+{ -+} -+ -+/** -+ * A virtual method to save the properties of this widget into a -+ * QDomElement i.e xml. -+ * -+ * Subclasses should first create a new dedicated element as the child -+ * of \a qElement parameter passed. Then this base method should be -+ * called to save basic widget properties. -+ * -+ * @param qDoc A QDomDocument object representing the xml document. -+ * @param qElement A QDomElement representing xml element data. -+ */ -+void WidgetBase::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -+ { -+ Q_UNUSED(qDoc) -+ -+ qElement.setAttribute(QLatin1String("textcolor"), m_usesDiagramTextColor ? QLatin1String("none") -+ : m_textColor.name()); -+ if (m_usesDiagramLineColor) { -+ qElement.setAttribute(QLatin1String("linecolor"), QLatin1String("none")); -+ } else { -+ qElement.setAttribute(QLatin1String("linecolor"), m_lineColor.name()); -+ } -+ if (m_usesDiagramLineWidth) { -+ qElement.setAttribute(QLatin1String("linewidth"), QLatin1String("none")); -+ } else { -+ qElement.setAttribute(QLatin1String("linewidth"), m_lineWidth); -+ } -+ qElement.setAttribute(QLatin1String("usefillcolor"), m_useFillColor); -+ // for consistency the following attributes now use american spelling for "color" -+ qElement.setAttribute(QLatin1String("usesdiagramfillcolor"), m_usesDiagramFillColor); -+ qElement.setAttribute(QLatin1String("usesdiagramusefillcolor"), m_usesDiagramUseFillColor); -+ if (m_usesDiagramFillColor) { -+ qElement.setAttribute(QLatin1String("fillcolor"), QLatin1String("none")); -+ } else { -+ qElement.setAttribute(QLatin1String("fillcolor"), m_fillColor.name()); -+ } -+ qElement.setAttribute(QLatin1String("font"), m_font.toString()); -+} -+ -+/** -+ * A virtual method to load the properties of this widget from a -+ * QDomElement into this widget. -+ * -+ * Subclasses should reimplement this to load addtional properties -+ * required, calling this base method to load the basic properties of -+ * the widget. -+ * -+ * @param qElement A QDomElement which contains xml info for this widget. -+ * -+ * @todo Add support to load older version. -+ */ -+bool WidgetBase::loadFromXMI(QDomElement& qElement) -+{ -+ // first load from "linecolour" and then overwrite with the "linecolor" -+ // attribute if that one is present. The "linecolour" name was a "typo" in -+ // earlier versions of umbrello-kf6 -+ QString lineColor = qElement.attribute(QLatin1String("linecolour"), QLatin1String("none")); -+ lineColor = qElement.attribute(QLatin1String("linecolor"), lineColor); -+ if (lineColor != QLatin1String("none")) { -+ m_lineColor = QColor(lineColor); -+ m_usesDiagramLineColor = false; -+ } else if (m_baseType != WidgetBase::wt_Box && m_scene != NULL) { -+ m_lineColor = m_scene->lineColor(); -+ m_usesDiagramLineColor = true; -+ } -+ QString lineWidth = qElement.attribute(QLatin1String("linewidth"), QLatin1String("none")); -+ if (lineWidth != QLatin1String("none")) { -+ m_lineWidth = lineWidth.toInt(); -+ m_usesDiagramLineWidth = false; -+ } else if (m_scene) { -+ m_lineWidth = m_scene->lineWidth(); -+ m_usesDiagramLineWidth = true; -+ } -+ QString textColor = qElement.attribute(QLatin1String("textcolor"), QLatin1String("none")); -+ if (textColor != QLatin1String("none")) { -+ m_textColor = QColor(textColor); -+ m_usesDiagramTextColor = false; -+ } else if (m_scene) { -+ m_textColor = m_scene->textColor(); -+ m_usesDiagramTextColor = true; -+ } -+ QString usefillcolor = qElement.attribute(QLatin1String("usefillcolor"), QLatin1String("1")); -+ m_useFillColor = (bool)usefillcolor.toInt(); -+ /* -+ For the next three *color attributes, there was a mixup of american and english spelling for "color". -+ So first we need to keep backward compatibility and try to retrieve the *colour attribute. -+ Next we overwrite this value if we find a *color, otherwise the former *colour is kept. -+ */ -+ QString fillColor = qElement.attribute(QLatin1String("fillcolour"), QLatin1String("none")); -+ fillColor = qElement.attribute(QLatin1String("fillcolor"), fillColor); -+ if (fillColor != QLatin1String("none")) { -+ m_fillColor = QColor(fillColor); -+ } -+ -+ QString usesDiagramFillColor = qElement.attribute(QLatin1String("usesdiagramfillcolour"), QLatin1String("1")); -+ usesDiagramFillColor = qElement.attribute(QLatin1String("usesdiagramfillcolor"), usesDiagramFillColor); -+ m_usesDiagramFillColor = (bool)usesDiagramFillColor.toInt(); -+ -+ QString usesDiagramUseFillColor = qElement.attribute(QLatin1String("usesdiagramusefillcolour"), QLatin1String("1")); -+ usesDiagramUseFillColor = qElement.attribute(QLatin1String("usesdiagramusefillcolor"), usesDiagramUseFillColor); -+ m_usesDiagramUseFillColor = (bool)usesDiagramUseFillColor.toInt(); -+ -+ QString font = qElement.attribute(QLatin1String("font")); -+ if (!font.isEmpty()) { -+ QFont newFont; -+ newFont.fromString(font); -+ m_font = newFont; -+ } else { -+ uWarning() << "Using default font " << m_font.toString() -+ << " for widget with xmi.id " << Uml::ID::toString(m_nId); -+ } -+ -+ return true; -+} -+ -+/** -+ * Assignment operator -+ */ -+WidgetBase& WidgetBase::operator=(const WidgetBase& other) -+{ -+ m_baseType = other.m_baseType; -+ m_scene = other.m_scene; -+ m_umlObject = other.m_umlObject; -+ m_Doc = other.m_Doc; -+ m_Text = other.m_Text; -+ m_nId = other.m_nId; -+ m_textColor = other.m_textColor; -+ m_lineColor = other.m_lineColor; -+ m_fillColor = other.m_fillColor; -+ m_brush = other.m_brush; -+ m_font = other.m_font; -+ m_lineWidth = other.m_lineWidth; -+ m_useFillColor = other.m_useFillColor; -+ m_usesDiagramTextColor = other.m_usesDiagramTextColor; -+ m_usesDiagramLineColor = other.m_usesDiagramLineColor; -+ m_usesDiagramFillColor = other.m_usesDiagramFillColor; -+ m_usesDiagramLineWidth = other.m_usesDiagramLineWidth; -+ setSelected(other.isSelected()); -+ -+ return *this; -+} -+ -+/** -+ * return drawing rectangle of widget in local coordinates -+ */ -+QRectF WidgetBase::rect() const -+{ -+ return m_rect; -+} -+ -+/** -+ * set widget rectangle in item coordinates -+ */ -+void WidgetBase::setRect(const QRectF& rect) -+{ -+ if (m_rect == rect) -+ return; -+ prepareGeometryChange(); -+ m_rect = rect; -+ update(); -+} -+ -+/** -+ * set widget rectangle in item coordinates -+ */ -+void WidgetBase::setRect(qreal x, qreal y, qreal width, qreal height) -+{ -+ setRect(QRectF(x, y, width, height)); -+} -+ -+/** -+ * @return The bounding rectangle for this widget. -+ * @see setRect -+ */ -+QRectF WidgetBase::boundingRect() const -+{ -+ int halfWidth = lineWidth()/2; -+ return m_rect.adjusted(-halfWidth, -halfWidth, halfWidth, halfWidth); -+} -+ -+/** -+ * Test if point is inside the bounding rectangle of the widget. -+ * Inheriting classes may reimplement this to test possible child widgets. -+ * -+ * @param p Point to be checked. -+ * -+ * @return 'this' if the given point is in the boundaries of the widget; -+ * else NULL. -+ */ -+UMLWidget* WidgetBase::onWidget(const QPointF &p) -+{ -+ UMLWidget *uw = dynamic_cast(this); -+ if (uw == NULL) -+ return NULL; -+ const qreal w = m_rect.width(); -+ const qreal h = m_rect.height(); -+ const qreal left = x(); // don't use m_rect.x() for this, it is always 0 -+ const qreal right = left + w; -+ const qreal top = y(); // don't use m_rect.y() for this, it is always 0 -+ const qreal bottom = top + h; -+ // uDebug() << "p=(" << p.x() << "," << p.y() -+ // << "), x=" << left << ", y=" << top << ", w=" << w << ", h=" << h -+ // << "; right=" << right << ", bottom=" << bottom; -+ if (p.x() < left || p.x() > right || -+ p.y() < top || p.y() > bottom) { // Qt coord.sys. origin in top left corner -+ // uDebug() << "returning NULL"; -+ return NULL; -+ } -+ // uDebug() << "returning this"; -+ return uw; -+} -+ -+/** -+ * Draws the UMLWidget on the given paint device -+ * -+ * @param painter The painter for the drawing device -+ * @param option Painting related options -+ * @param widget Background widget on which to paint (optional) -+ * -+ */ -+void WidgetBase::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -+{ -+ Q_UNUSED(painter); Q_UNUSED(option); Q_UNUSED(widget); -+} -+ -+/** -+ * Reimplemented to show appropriate context menu. -+ */ -+void WidgetBase::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) -+{ -+ event->accept(); -+ uDebug() << "widget = " << name() << " / type = " << baseTypeStr(); -+ -+ UMLScene *scene = umlScene(); -+ -+ // If right-click was done on a widget that was not selected, clear the -+ // current selection and select the new widget. The context menu is shown -+ // with actions for that single widget. -+ // If a keyboard modifier was used, add the widget to the current selection -+ // and show the menu with actions for the whole selection. -+ if (!isSelected()) { -+ Qt::KeyboardModifiers forSelection = (Qt::ControlModifier | Qt::ShiftModifier); -+ if ((event->modifiers() & forSelection) == 0) { -+ scene->clearSelected(); -+ } -+ -+ if (umlObject() != 0) { -+ scene->selectWidget(dynamic_cast(this)); -+ } else { -+ setSelected(true); -+ } -+ } -+ -+ int count = scene->selectedCount(true); -+ -+ // Determine multi state -+ bool multi = (isSelected() && count > 1); -+ -+ ListPopupMenu popup(0, this, multi, scene->getUniqueSelectionType()); -+ -+ // Disable the "view code" menu for simple code generators -+ if (UMLApp::app()->isSimpleCodeGeneratorActive()) { -+ popup.setActionEnabled(ListPopupMenu::mt_ViewCode, false); -+ } -+ -+ QAction *triggered = popup.exec(event->screenPos()); -+ ListPopupMenu *parentMenu = ListPopupMenu::menuFromAction(triggered); -+ -+ if (!parentMenu) { -+ uDebug() << "Action's data field does not contain ListPopupMenu pointer"; -+ return; -+ } -+ -+ WidgetBase *ownerWidget = parentMenu->ownerWidget(); -+ // assert because logic is based on only WidgetBase being the owner of -+ // ListPopupMenu actions executed in this context menu. -+ Q_ASSERT_X(ownerWidget != 0, "WidgetBase::contextMenuEvent", -+ "ownerWidget is null which means action belonging to UMLView, UMLScene" -+ " or UMLObject is the one triggered in ListPopupMenu"); -+ -+ ownerWidget->slotMenuSelection(triggered); -+} -+ -+/** -+ * This is usually called synchronously after menu.exec() and \a -+ * trigger's parent is always the ListPopupMenu which can be used to -+ * get the type of action of \a trigger. -+ * -+ * @note Subclasses can reimplement to handle specific actions and -+ * leave the rest to WidgetBase::slotMenuSelection. -+ */ -+void WidgetBase::slotMenuSelection(QAction *trigger) -+{ -+ if (!trigger) { -+ return; -+ } -+ QColor newColor; -+ -+ const WidgetType wt = m_baseType; // short hand name -+ -+ ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(trigger); -+ switch (sel) { -+ case ListPopupMenu::mt_Rename: -+ umlDoc()->renameUMLObject(umlObject()); -+ break; -+ -+ case ListPopupMenu::mt_Properties: -+ if (wt == WidgetBase::wt_Actor || wt == WidgetBase::wt_UseCase || -+ wt == WidgetBase::wt_Package || wt == WidgetBase::wt_Interface || -+ wt == WidgetBase::wt_Datatype || wt == WidgetBase::wt_Node || -+ wt == WidgetBase::wt_Component || wt == WidgetBase::wt_Artifact || -+ wt == WidgetBase::wt_Enum || wt == WidgetBase::wt_Entity || -+ wt == WidgetBase::wt_Port || -+ (wt == WidgetBase::wt_Class && umlScene()->type() == Uml::DiagramType::Class)) { -+ -+ showPropertiesDialog(); -+ -+ } else if (wt == WidgetBase::wt_Object) { -+ m_umlObject->showPropertiesDialog(); -+ } else { -+ uWarning() << "making properties dialog for unknown widget type"; -+ } -+ break; -+ -+ case ListPopupMenu::mt_Line_Color: -+ case ListPopupMenu::mt_Line_Color_Selection: -+#if QT_VERSION >= 0x050000 -+ newColor = QColorDialog::getColor(lineColor()); -+ if (newColor != lineColor()) { -+#else -+ newColor = lineColor(); -+ if (KColorDialog::getColor(newColor)) { -+#endif -+ if (sel == ListPopupMenu::mt_Line_Color_Selection) { -+ umlScene()->selectionSetLineColor(newColor); -+ } else { -+ setLineColor(newColor); -+ } -+ setUsesDiagramLineColor(false); -+ umlDoc()->setModified(true); -+ } -+ break; -+ -+ case ListPopupMenu::mt_Fill_Color: -+ case ListPopupMenu::mt_Fill_Color_Selection: -+#if QT_VERSION >= 0x050000 -+ newColor = QColorDialog::getColor(fillColor()); -+ if (newColor != fillColor()) { -+#else -+ newColor = fillColor(); -+ if (KColorDialog::getColor(newColor)) { -+#endif -+ if (sel == ListPopupMenu::mt_Fill_Color_Selection) { -+ umlScene()->selectionSetFillColor(newColor); -+ } else { -+ setFillColor(newColor); -+ } -+ umlDoc()->setModified(true); -+ } -+ break; -+ -+ case ListPopupMenu::mt_Use_Fill_Color: -+ setUseFillColor(!m_useFillColor); -+ break; -+ -+ case ListPopupMenu::mt_Set_Use_Fill_Color_Selection: -+ umlScene()->selectionUseFillColor(true); -+ break; -+ -+ case ListPopupMenu::mt_Unset_Use_Fill_Color_Selection: -+ umlScene()->selectionUseFillColor(false); -+ break; -+ -+ case ListPopupMenu::mt_Show_Attributes_Selection: -+ case ListPopupMenu::mt_Hide_Attributes_Selection: -+ umlScene()->selectionSetVisualProperty( -+ ClassifierWidget::ShowAttributes, sel != ListPopupMenu::mt_Hide_Attributes_Selection -+ ); -+ break; -+ -+ case ListPopupMenu::mt_Show_Operations_Selection: -+ case ListPopupMenu::mt_Hide_Operations_Selection: -+ umlScene()->selectionSetVisualProperty( -+ ClassifierWidget::ShowOperations, sel != ListPopupMenu::mt_Hide_Operations_Selection -+ ); -+ break; -+ -+ case ListPopupMenu::mt_Show_Visibility_Selection: -+ case ListPopupMenu::mt_Hide_Visibility_Selection: -+ umlScene()->selectionSetVisualProperty( -+ ClassifierWidget::ShowVisibility, sel != ListPopupMenu::mt_Hide_Visibility_Selection -+ ); -+ break; -+ -+ case ListPopupMenu::mt_Show_Operation_Signature_Selection: -+ case ListPopupMenu::mt_Hide_Operation_Signature_Selection: -+ umlScene()->selectionSetVisualProperty( -+ ClassifierWidget::ShowOperationSignature, sel != ListPopupMenu::mt_Hide_Operation_Signature_Selection -+ ); -+ break; -+ -+ case ListPopupMenu::mt_Show_Attribute_Signature_Selection: -+ case ListPopupMenu::mt_Hide_Attribute_Signature_Selection: -+ umlScene()->selectionSetVisualProperty( -+ ClassifierWidget::ShowAttributeSignature, sel != ListPopupMenu::mt_Hide_Attribute_Signature_Selection -+ ); -+ break; -+ -+ case ListPopupMenu::mt_Show_Packages_Selection: -+ case ListPopupMenu::mt_Hide_Packages_Selection: -+ umlScene()->selectionSetVisualProperty( -+ ClassifierWidget::ShowPackage, sel != ListPopupMenu::mt_Hide_Packages_Selection -+ ); -+ break; -+ -+ case ListPopupMenu::mt_Show_Stereotypes_Selection: -+ case ListPopupMenu::mt_Hide_Stereotypes_Selection: -+ umlScene()->selectionSetVisualProperty( -+ ClassifierWidget::ShowStereotype, sel != ListPopupMenu::mt_Hide_Stereotypes_Selection -+ ); -+ break; -+ -+ case ListPopupMenu::mt_Hide_NonPublic_Selection: -+ case ListPopupMenu::mt_Show_NonPublic_Selection: -+ umlScene()->selectionSetVisualProperty( -+ ClassifierWidget::ShowPublicOnly, sel != ListPopupMenu::mt_Show_NonPublic_Selection -+ ); -+ break; -+ -+ -+ case ListPopupMenu::mt_ViewCode: { -+ UMLClassifier *c = dynamic_cast(umlObject()); -+ if (c) { -+ UMLApp::app()->viewCodeDocument(c); -+ } -+ break; -+ } -+ -+ case ListPopupMenu::mt_Delete: -+ umlScene()->deleteSelection(); -+ break; -+ -+ case ListPopupMenu::mt_Change_Font: -+ case ListPopupMenu::mt_Change_Font_Selection: { -+#if QT_VERSION >= 0x050000 -+ bool ok = false; -+ QFont newFont = QFontDialog::getFont(&ok, font()); -+ if (ok) { -+#else -+ QFont newFont = font(); -+ if (KFontDialog::getFont(newFont, KFontChooser::NoDisplayFlags, 0) == KFontDialog::Accepted) { -+#endif -+ if (sel == ListPopupMenu::mt_Change_Font_Selection) { -+ m_scene->selectionSetFont(newFont); -+ } else { -+ setFont(newFont); -+ } -+ } -+ } -+ break; -+ -+ case ListPopupMenu::mt_Cut: -+ umlScene()->setStartedCut(); -+ UMLApp::app()->slotEditCut(); -+ break; -+ -+ case ListPopupMenu::mt_Copy: -+ UMLApp::app()->slotEditCopy(); -+ break; -+ -+ case ListPopupMenu::mt_Paste: -+ UMLApp::app()->slotEditPaste(); -+ break; -+ -+ case ListPopupMenu::mt_Refactoring: -+ //check if we are operating on a classifier, or some other kind of UMLObject -+ if (dynamic_cast(umlObject())) { -+ UMLApp::app()->refactor(static_cast(umlObject())); -+ } -+ break; -+ -+ case ListPopupMenu::mt_Clone: -+ { -+ foreach (UMLWidget* widget, umlScene()->selectedWidgets()) { -+ if (Model_Utils::isCloneable(widget->baseType())) { -+ UMLObject *clone = widget->umlObject()->clone(); -+ umlScene()->addObject(clone); -+ } -+ } -+ } -+ break; -+ -+ case ListPopupMenu::mt_Rename_MultiA: -+ case ListPopupMenu::mt_Rename_MultiB: -+ case ListPopupMenu::mt_Rename_Name: -+ case ListPopupMenu::mt_Rename_RoleAName: -+ case ListPopupMenu::mt_Rename_RoleBName: { -+ FloatingTextWidget *ft = static_cast(this); -+ ft->handleRename(); -+ break; -+ } -+ case ListPopupMenu::mt_Align_Right: -+ umlScene()->alignRight(); -+ break; -+ case ListPopupMenu::mt_Align_Left: -+ umlScene()->alignLeft(); -+ break; -+ case ListPopupMenu::mt_Align_Top: -+ umlScene()->alignTop(); -+ break; -+ case ListPopupMenu::mt_Align_Bottom: -+ umlScene()->alignBottom(); -+ break; -+ case ListPopupMenu::mt_Align_VerticalMiddle: -+ umlScene()->alignVerticalMiddle(); -+ break; -+ case ListPopupMenu::mt_Align_HorizontalMiddle: -+ umlScene()->alignHorizontalMiddle(); -+ break; -+ case ListPopupMenu::mt_Align_VerticalDistribute: -+ umlScene()->alignVerticalDistribute(); -+ break; -+ case ListPopupMenu::mt_Align_HorizontalDistribute: -+ umlScene()->alignHorizontalDistribute(); -+ break; -+ default: -+ uDebug() << "MenuType " << ListPopupMenu::toString(sel) << " not implemented"; -+ break; -+ } -+} -+ -+/** -+ * Helper function for debug output. -+ * Returns the given enum value as string. -+ * @param wt WidgetType of which a string representation is wanted -+ * @return the WidgetType as string -+ */ -+QString WidgetBase::toString(WidgetType wt) -+{ -+ return QLatin1String(ENUM_NAME(WidgetBase, WidgetType, wt)); -+} -+ -+/** -+ * Returns the given enum value as localized string. -+ * @param wt WidgetType of which a string representation is wanted -+ * @return the WidgetType as localized string -+ */ -+QString WidgetBase::toI18nString(WidgetType wt) -+{ -+ QString name; -+ -+ switch (wt) { -+ case wt_Activity: -+ name = i18n("Activity"); -+ break; -+ case wt_Actor: -+ name = i18n("Actor"); -+ break; -+ case wt_Artifact: -+ name = i18n("Artifact"); -+ break; -+ case wt_Association: -+ name = i18n("Association"); -+ break; -+ case wt_Box: -+ name = i18n("Box"); -+ break; -+ case wt_Category: -+ name = i18n("Category"); -+ break; -+ case wt_CombinedFragment: -+ name = i18n("CombinedFragment"); -+ break; -+ case wt_Component: -+ name = i18n("Component"); -+ break; -+ case wt_Class: -+ name = i18n("Class"); -+ break; -+ case wt_Datatype: -+ name = i18n("Datatype"); -+ break; -+ case wt_Entity: -+ name = i18n("Entity"); -+ break; -+ case wt_Enum: -+ name = i18n("Enum"); -+ break; -+ case wt_FloatingDashLine: -+ name = i18n("FloatingDashLine"); -+ break; -+ case wt_ForkJoin: -+ name = i18n("ForkJoin"); -+ break; -+ case wt_Interface: -+ name = i18n("Interface"); -+ break; -+ case wt_Message: -+ name = i18n("Message"); -+ break; -+ case wt_Node: -+ name = i18n("Node"); -+ break; -+ case wt_Note: -+ name = i18n("Note"); -+ break; -+ case wt_Object: -+ name = i18n("Object"); -+ break; -+ case wt_ObjectNode: -+ name = i18n("ObjectNode"); -+ break; -+ case wt_Package: -+ name = i18n("Package"); -+ break; -+ case wt_Pin: -+ name = i18n("Pin"); -+ break; -+ case wt_Port: -+ name = i18n("Port"); -+ break; -+ case wt_Precondition: -+ name = i18n("Precondition"); -+ break; -+ case wt_Region: -+ name = i18n("Region"); -+ break; -+ case wt_Signal: -+ name = i18n("Signal"); -+ break; -+ case wt_State: -+ name = i18n("State"); -+ break; -+ case wt_Text: -+ name = i18n("Text"); -+ break; -+ case wt_UseCase: -+ name = i18n("UseCase"); -+ break; -+ default: -+ name = QLatin1String(" &name:"); -+ uWarning() << "unknown widget type"; -+ break; -+ } -+ return name; -+} -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widgetbase.h umbrello-kf6-15.08.1/umbrello/umlwidgets/widgetbase.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widgetbase.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/widgetbase.h 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,192 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef WIDGETBASE_H -+#define WIDGETBASE_H -+ -+#include "basictypes.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+// forward declarations -+class QAction; -+class UMLDoc; -+class UMLObject; -+class UMLScene; -+class UMLWidget; // required by function onWidget() -+ -+/** -+ * @short Common base class for UMLWidget and AssociationWidget -+ * @author Oliver Kellogg -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+class WidgetBase : public QGraphicsObject -+{ -+ Q_OBJECT -+ Q_ENUMS(WidgetType) -+ -+public: -+ enum WidgetType -+ { -+ wt_UMLWidget = 300, // does not have UMLObject representation -+ wt_Actor, // has UMLObject representation -+ wt_UseCase, // has UMLObject representation -+ wt_Class, // has UMLObject representation -+ wt_Interface, // has UMLObject representation -+ wt_Datatype, // has UMLObject representation -+ wt_Enum, // has UMLObject representation -+ wt_Entity, // has UMLObject representation -+ wt_Package, // has UMLObject representation -+ wt_Object, // has UMLObject representation -+ wt_Note, // does not have UMLObject representation -+ wt_Box, // does not have UMLObject representation -+ wt_Message, // does not have UMLObject representation -+ wt_Text, // does not have UMLObject representation -+ wt_State, // does not have UMLObject representation -+ wt_Activity, // does not have UMLObject representation -+ wt_Component, // has UMLObject representation -+ wt_Artifact, // has UMLObject representation -+ wt_Node, // has UMLObject representation -+ wt_Association, // has UMLObject representation -+ wt_ForkJoin, // does not have UMLObject representation -+ wt_Precondition, // does not have UMLObject representation -+ wt_CombinedFragment, // does not have UMLObject representation -+ wt_FloatingDashLine, // does not have UMLObject representation -+ wt_Signal, // does not have UMLObject representation -+ wt_Pin, -+ wt_ObjectNode, -+ wt_Region, -+ wt_Category, // has UMLObject representation -+ wt_Port // has UMLObject representation -+ }; -+ -+ static QString toString(WidgetType wt); -+ static QString toI18nString(WidgetType wt); -+ -+ explicit WidgetBase(UMLScene * scene, WidgetType type= wt_UMLWidget); -+ virtual ~WidgetBase(); -+ -+ UMLObject* umlObject() const; -+ virtual void setUMLObject(UMLObject *obj); -+ -+ Uml::ID::Type id() const; -+ void setID(Uml::ID::Type id); -+ -+ WidgetType baseType() const; -+ QLatin1String baseTypeStr() const; -+ -+ virtual void setSelected(bool select); -+ -+ UMLScene* umlScene() const; -+ UMLDoc* umlDoc() const; -+ -+ QString documentation() const; -+ bool hasDocumentation(); -+ virtual void setDocumentation(const QString& doc); -+ -+ QString name() const; -+ virtual void setName(const QString &strName); -+ -+ QColor lineColor() const; -+ virtual void setLineColor(const QColor& color); -+ -+ uint lineWidth() const; -+ virtual void setLineWidth(uint width); -+ -+ QColor textColor() const; -+ virtual void setTextColor(const QColor& color); -+ -+ QColor fillColor() const; -+ virtual void setFillColor(const QColor& color); -+ -+ bool usesDiagramLineColor() const; -+ void setUsesDiagramLineColor(bool state); -+ -+ bool usesDiagramLineWidth() const; -+ void setUsesDiagramLineWidth(bool state); -+ -+ bool useFillColor(); -+ virtual void setUseFillColor(bool state); -+ -+ bool usesDiagramTextColor() const; -+ void setUsesDiagramTextColor(bool state); -+ -+ bool usesDiagramFillColor() const; -+ void setUsesDiagramFillColor(bool state); -+ -+ bool usesDiagramUseFillColor() const; -+ void setUsesDiagramUseFillColor(bool state); -+ -+ virtual QFont font() const; -+ virtual void setFont(const QFont& font); -+ -+ virtual void showPropertiesDialog(); -+ -+ virtual bool loadFromXMI(QDomElement &qElement); -+ virtual void saveToXMI(QDomDocument &qDoc, QDomElement &qElement); -+ -+ WidgetBase& operator=(const WidgetBase& other); -+ -+ QRectF rect() const; -+ void setRect(const QRectF& rect); -+ void setRect(qreal x, qreal y, qreal width, qreal height); -+ -+ virtual QRectF boundingRect() const; -+ -+ virtual UMLWidget* onWidget(const QPointF &p); -+ -+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -+ -+public Q_SLOTS: -+ virtual void slotMenuSelection(QAction *trigger); -+ -+protected: -+ virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); -+ -+ WidgetType m_baseType; ///< Type of widget. -+ UMLScene *m_scene; -+ UMLObject *m_umlObject; -+ QString m_Doc; ///< Only used if m_umlObject is not set. -+ QString m_Text; -+ QRectF m_rect; ///< widget size -+ -+ /** -+ * This ID is only used when the widget does not have a -+ * corresponding UMLObject (i.e. the m_umlObject pointer is NULL.) -+ * For UMLObjects, the ID from the UMLObject is used. -+ */ -+ Uml::ID::Type m_nId; -+ -+ QColor m_textColor; ///< Color of the text of the widget. Is saved to XMI. -+ QColor m_lineColor; ///< Color of the lines of the widget. Is saved to XMI. -+ QColor m_fillColor; ///< color of the background of the widget -+ QBrush m_brush; -+ QFont m_font; -+ uint m_lineWidth; ///< Width of the lines of the widget. Is saved to XMI. -+ bool m_useFillColor; ///< flag indicates if the UMLWidget uses the Diagram FillColour -+ -+ /** -+ * true by default, false if the colors have -+ * been explicitly set for this widget. -+ * These are saved to XMI. -+ */ -+ bool m_usesDiagramTextColor; -+ bool m_usesDiagramLineColor; -+ bool m_usesDiagramFillColor; -+ bool m_usesDiagramUseFillColor; -+ bool m_usesDiagramLineWidth; -+}; -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widget_factory.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/widget_factory.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widget_factory.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/widget_factory.cpp 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,298 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2006-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "widget_factory.h" -+ -+// app includes -+#include "activitywidget.h" -+#include "actor.h" -+#include "actorwidget.h" -+#include "artifact.h" -+#include "artifactwidget.h" -+#include "associationwidget.h" -+#include "boxwidget.h" -+#include "category.h" -+#include "categorywidget.h" -+#include "classifier.h" -+#include "classifierwidget.h" -+#include "cmds.h" -+#include "combinedfragmentwidget.h" -+#include "component.h" -+#include "componentwidget.h" -+#include "datatypewidget.h" -+#include "debug_utils.h" -+#include "entity.h" -+#include "entitywidget.h" -+#include "enum.h" -+#include "enumwidget.h" -+#include "floatingdashlinewidget.h" -+#include "floatingtextwidget.h" -+#include "folder.h" -+#include "forkjoinwidget.h" -+#include "messagewidget.h" -+#include "node.h" -+#include "nodewidget.h" -+#include "notewidget.h" -+#include "object_factory.h" -+#include "objectnodewidget.h" -+#include "objectwidget.h" -+#include "package.h" -+#include "packagewidget.h" -+#include "pinwidget.h" -+#include "port.h" -+#include "portwidget.h" -+#include "preconditionwidget.h" -+#include "regionwidget.h" -+#include "signalwidget.h" -+#include "statewidget.h" -+#include "uml.h" -+#include "umldoc.h" -+#include "umlscene.h" -+#include "umlview.h" -+#include "usecase.h" -+#include "usecasewidget.h" -+ -+namespace Widget_Factory { -+ -+/** -+ * Create a UMLWidget in the given view and representing the given document object. -+ */ -+UMLWidget *createWidget(UMLScene *scene, UMLObject *o) -+{ -+ QPointF pos = scene->pos(); -+ int y = pos.y(); -+ Uml::DiagramType::Enum diagramType = scene->type(); -+ UMLObject::ObjectType type = o->baseType(); -+ UMLWidget *newWidget = NULL; -+ switch (type) { -+ case UMLObject::ot_Actor: -+ if (diagramType == Uml::DiagramType::Sequence) { -+ ObjectWidget *ow = new ObjectWidget(scene, o); -+ ow->setDrawAsActor(true); -+ y = ow->topMargin(); -+ newWidget = ow; -+ } else -+ newWidget = new ActorWidget(scene, static_cast(o)); -+ break; -+ case UMLObject::ot_UseCase: -+ newWidget = new UseCaseWidget(scene, static_cast(o)); -+ break; -+ case UMLObject::ot_Folder: -+ newWidget = new PackageWidget(scene, static_cast(o)); -+ break; -+ case UMLObject::ot_Package: -+ newWidget = new ClassifierWidget(scene, static_cast(o)); -+ break; -+ case UMLObject::ot_Component: -+ newWidget = new ComponentWidget(scene, static_cast(o)); -+ if (diagramType == Uml::DiagramType::Deployment) { -+ newWidget->setIsInstance(true); -+ } -+ break; -+ case UMLObject::ot_Port: -+ { -+ PinPortBase *pw = new PortWidget(scene, static_cast(o)); -+ pw->attachToOwner(); -+ newWidget = pw; -+ } -+ break; -+ case UMLObject::ot_Node: -+ newWidget = new NodeWidget(scene, static_cast(o)); -+ break; -+ case UMLObject::ot_Artifact: -+ newWidget = new ArtifactWidget(scene, static_cast(o)); -+ break; -+ case UMLObject::ot_Datatype: -+ newWidget = new DatatypeWidget(scene, static_cast(o)); -+ break; -+ case UMLObject::ot_Enum: -+ newWidget = new EnumWidget(scene, static_cast(o)); -+ break; -+ case UMLObject::ot_Entity: -+ newWidget = new EntityWidget(scene, static_cast(o)); -+ break; -+ case UMLObject::ot_Interface: -+ if (diagramType == Uml::DiagramType::Sequence || diagramType == Uml::DiagramType::Collaboration) { -+ ObjectWidget *ow = new ObjectWidget(scene, o); -+ if (diagramType == Uml::DiagramType::Sequence) { -+ y = ow->topMargin(); -+ } -+ newWidget = ow; -+ } else { -+ UMLClassifier *c = static_cast(o); -+ ClassifierWidget* interfaceWidget = new ClassifierWidget(scene, c); -+ if (diagramType == Uml::DiagramType::Component || diagramType == Uml::DiagramType::Deployment) { -+ interfaceWidget->setDrawAsCircle(true); -+ } -+ newWidget = interfaceWidget; -+ } -+ break; -+ case UMLObject::ot_Class: -+ //see if we really want an object widget or class widget -+ if (diagramType == Uml::DiagramType::Class || diagramType == Uml::DiagramType::Component) { -+ UMLClassifier *c = static_cast(o); -+ ClassifierWidget *cw = new ClassifierWidget(scene, c); -+ if (diagramType == Uml::DiagramType::Component) -+ cw->setDrawAsCircle(true); -+ newWidget = cw; -+ } else { -+ ObjectWidget *ow = new ObjectWidget(scene, o); -+ if (diagramType == Uml::DiagramType::Sequence) { -+ y = ow->topMargin(); -+ } -+ newWidget = ow; -+ } -+ break; -+ case UMLObject::ot_Category: -+ newWidget = new CategoryWidget(scene, static_cast(o)); -+ break; -+ default: -+ uWarning() << "trying to create an invalid widget (" << UMLObject::toString(type) << ")"; -+ } -+ -+ if (newWidget) { -+ newWidget->setX(pos.x()); -+ newWidget->setY(y); -+ } -+ -+ return newWidget; -+} -+ -+bool validateObjType(UMLObject::ObjectType expected, UMLObject* &o, Uml::ID::Type id) -+{ -+ if (o == NULL) { -+ uDebug() << "Widget_Factory::validateObjType: creating new object of type " -+ << expected; -+ QString artificialName = QLatin1String("LOST_") + Uml::ID::toString(id); -+ o = Object_Factory::createUMLObject(expected, artificialName, NULL, false); -+ if (o == NULL) -+ return false; -+ o->setID(id); -+ UMLPackage *parentPkg = o->umlPackage(); -+ parentPkg->addObject(o); -+ return true; -+ } -+ UMLObject::ObjectType actual = o->baseType(); -+ if (actual == expected) -+ return true; -+ uError() << "validateObjType(" << o->name() -+ << "): expected type " << UMLObject::toString(expected) << ", actual type " -+ << UMLObject::toString(actual); -+ return false; -+} -+ -+/** -+ * Create a UMLWidget according to the given XMI tag. -+ */ -+UMLWidget* makeWidgetFromXMI(const QString& tag, -+ const QString& idStr, UMLScene *scene) -+{ -+ UMLWidget *widget = NULL; -+ -+ // Loading of widgets which do NOT represent any UMLObject, -+ // just graphic stuff with no real model information -+ //FIXME while boxes and texts are just diagram objects, activities and -+ // states should be UMLObjects -+ if (tag == QLatin1String("statewidget") || tag == QLatin1String("UML:StateWidget")) { -+ widget = new StateWidget(scene, StateWidget::Normal, Uml::ID::Reserved); -+ } else if (tag == QLatin1String("notewidget") || tag == QLatin1String("UML:NoteWidget")) { -+ widget = new NoteWidget(scene, NoteWidget::Normal, Uml::ID::Reserved); -+ } else if (tag == QLatin1String("boxwidget")) { -+ widget = new BoxWidget(scene, Uml::ID::Reserved); -+ } else if (tag == QLatin1String("floatingtext") || tag == QLatin1String("UML:FloatingTextWidget")) { -+ widget = new FloatingTextWidget(scene, Uml::TextRole::Floating, QString(), Uml::ID::Reserved); -+ } else if (tag == QLatin1String("activitywidget") || tag == QLatin1String("UML:ActivityWidget")) { -+ widget = new ActivityWidget(scene, ActivityWidget::Initial, Uml::ID::Reserved); -+ } else if (tag == QLatin1String("messagewidget")) { -+ widget = new MessageWidget(scene, Uml::SequenceMessage::Asynchronous, Uml::ID::Reserved); -+ } else if (tag == QLatin1String("forkjoin")) { -+ widget = new ForkJoinWidget(scene, Qt::Vertical, Uml::ID::Reserved); -+ } else if (tag == QLatin1String("preconditionwidget")) { -+ widget = new PreconditionWidget(scene, NULL, Uml::ID::Reserved); -+ } else if (tag == QLatin1String("combinedFragmentwidget")) { -+ widget = new CombinedFragmentWidget(scene, CombinedFragmentWidget::Ref, Uml::ID::Reserved); -+ } else if (tag == QLatin1String("signalwidget")) { -+ widget = new SignalWidget(scene, SignalWidget::Send, Uml::ID::Reserved); -+ } else if (tag == QLatin1String("floatingdashlinewidget")) { -+ widget = new FloatingDashLineWidget(scene, Uml::ID::Reserved); -+ } else if (tag == QLatin1String("objectnodewidget")) { -+ widget = new ObjectNodeWidget(scene, ObjectNodeWidget::Normal, Uml::ID::Reserved); -+ } else if (tag == QLatin1String("regionwidget")) { -+ widget = new RegionWidget(scene, Uml::ID::Reserved); -+ } else if (tag == QLatin1String("pinwidget")) { -+ PinPortBase *pw = new PinWidget(scene, NULL, Uml::ID::Reserved); -+ pw->attachToOwner(); -+ widget = pw; -+ } -+ else -+ { -+ // Loading of widgets which represent an UMLObject -+ -+ // Find the UMLObject and create the Widget to represent it -+ Uml::ID::Type id = Uml::ID::fromString(idStr); -+ UMLDoc *umldoc = UMLApp::app()->document(); -+ UMLObject *o = umldoc->findObjectById(id); -+ if (o == NULL) { -+ uDebug() << "makeWidgetFromXMI: cannot find object with id " -+ << Uml::ID::toString(id); -+ } -+ -+ if (tag == QLatin1String("actorwidget") || tag == QLatin1String("UML:ActorWidget")) { -+ if (validateObjType(UMLObject::ot_Actor, o, id)) -+ widget = new ActorWidget(scene, static_cast(o)); -+ } else if (tag == QLatin1String("usecasewidget") || tag == QLatin1String("UML:UseCaseWidget")) { -+ if (validateObjType(UMLObject::ot_UseCase, o, id)) -+ widget = new UseCaseWidget(scene, static_cast(o)); -+ } else if (tag == QLatin1String("classwidget") || -+ tag == QLatin1String("UML:ClassWidget") || tag == QLatin1String("UML:ConceptWidget")) { -+ if (validateObjType(UMLObject::ot_Class, o, id) || validateObjType(UMLObject::ot_Package, o, id)) -+ widget = new ClassifierWidget(scene, static_cast(o)); -+ } else if (tag == QLatin1String("packagewidget")) { -+ if (validateObjType(UMLObject::ot_Package, o, id)) -+ widget = new ClassifierWidget(scene, static_cast(o)); -+ } else if (tag == QLatin1String("componentwidget")) { -+ if (validateObjType(UMLObject::ot_Component, o, id)) -+ widget = new ComponentWidget(scene, static_cast(o)); -+ } else if (tag == QLatin1String("portwidget")) { -+ if (validateObjType(UMLObject::ot_Port, o, id)) -+ widget = new PortWidget(scene, static_cast(o)); -+ } else if (tag == QLatin1String("nodewidget")) { -+ if (validateObjType(UMLObject::ot_Node, o, id)) -+ widget = new NodeWidget(scene, static_cast(o)); -+ } else if (tag == QLatin1String("artifactwidget")) { -+ if (validateObjType(UMLObject::ot_Artifact, o, id)) -+ widget = new ArtifactWidget(scene, static_cast(o)); -+ } else if (tag == QLatin1String("interfacewidget")) { -+ if (validateObjType(UMLObject::ot_Interface, o, id)) -+ widget = new ClassifierWidget(scene, static_cast(o)); -+ } else if (tag == QLatin1String("datatypewidget")) { -+ if (validateObjType(UMLObject::ot_Datatype, o, id)) -+ widget = new DatatypeWidget(scene, static_cast(o)); -+ } else if (tag == QLatin1String("enumwidget")) { -+ if (validateObjType(UMLObject::ot_Enum, o, id)) -+ widget = new EnumWidget(scene, static_cast(o)); -+ } else if (tag == QLatin1String("entitywidget")) { -+ if (validateObjType(UMLObject::ot_Entity, o, id)) -+ widget = new EntityWidget(scene, static_cast(o)); -+ } else if (tag == QLatin1String("categorywidget")) { -+ if (validateObjType(UMLObject::ot_Category, o, id)) -+ widget = new CategoryWidget(scene, static_cast(o)); -+ } else if (tag == QLatin1String("objectwidget") || tag == QLatin1String("UML:ObjectWidget")) { -+ widget = new ObjectWidget(scene, o); -+ } else { -+ uWarning() << "Trying to create an unknown widget:" << tag; -+ } -+ } -+ return widget; -+} -+ -+} // end namespace Widget_Factory -+ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widget_factory.h umbrello-kf6-15.08.1/umbrello/umlwidgets/widget_factory.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widget_factory.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/widget_factory.h 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,34 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2006-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef WIDGET_FACTORY_H -+#define WIDGET_FACTORY_H -+ -+#include -+ -+// forward declarations -+class UMLObject; -+class UMLScene; -+class UMLWidget; -+ -+/** -+ * Widget factory methods. -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+namespace Widget_Factory { -+ -+ UMLWidget *createWidget(UMLScene *scene, UMLObject *docObj); -+ -+ UMLWidget* makeWidgetFromXMI(const QString& tag, -+ const QString& idStr, UMLScene *scene); -+ -+} // end namespace Widget_Factory -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widgetlist_utils.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/widgetlist_utils.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widgetlist_utils.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/widgetlist_utils.cpp 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,157 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2009-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "widgetlist_utils.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "umlwidget.h" -+ -+// qt/kde includes -+#include -+ -+namespace WidgetList_Utils -+{ -+ -+/** -+ * Looks for the smallest x-value of the given UMLWidgets. -+ * @param widgetList A list with UMLWidgets. -+ * @return The smallest X position. -+ */ -+qreal getSmallestX(const UMLWidgetList &widgetList) -+{ -+ qreal smallestX = 0; -+ -+ int i = 1; -+ foreach(UMLWidget *widget, widgetList) { -+ if (i == 1) { -+ smallestX = widget->x(); -+ } else { -+ if (smallestX > widget->x()) -+ smallestX = widget->x(); -+ } -+ i++; -+ } -+ -+ return smallestX; -+} -+ -+/** -+ * Looks for the smallest y-value of the given UMLWidgets. -+ * @param widgetList A list with UMLWidgets. -+ * @return The smallest Y position. -+ */ -+qreal getSmallestY(const UMLWidgetList &widgetList) -+{ -+ if (widgetList.isEmpty()) -+ return -1; -+ -+ qreal smallestY = 0; -+ -+ int i = 1; -+ foreach(UMLWidget *widget, widgetList) { -+ if (i == 1) { -+ smallestY = widget->y(); -+ } else { -+ if (smallestY > widget->y()) -+ smallestY = widget->y(); -+ } -+ i++; -+ } -+ -+ return smallestY; -+} -+ -+/** -+ * Looks for the biggest x-value of the given UMLWidgets. -+ * @param widgetList A list with UMLWidgets. -+ * @return The biggest X position. -+ */ -+qreal getBiggestX(const UMLWidgetList &widgetList) -+{ -+ if (widgetList.isEmpty()) -+ return -1; -+ -+ qreal biggestX = 0; -+ -+ int i = 1; -+ foreach(UMLWidget *widget, widgetList) { -+ if (i == 1) { -+ biggestX = widget->x(); -+ biggestX += widget->width(); -+ } else { -+ if (biggestX < widget->x() + widget->width()) -+ biggestX = widget->x() + widget->width(); -+ } -+ i++; -+ } -+ -+ return biggestX; -+} -+ -+/** -+ * Looks for the biggest y-value of the given UMLWidgets. -+ * @param widgetList A list with UMLWidgets. -+ * @return The biggest Y position. -+ */ -+qreal getBiggestY(const UMLWidgetList &widgetList) -+{ -+ if (widgetList.isEmpty()) -+ return -1; -+ -+ qreal biggestY = 0; -+ -+ int i = 1; -+ foreach(UMLWidget *widget, widgetList) { -+ if (i == 1) { -+ biggestY = widget->y(); -+ biggestY += widget->height(); -+ } else { -+ if (biggestY < widget->y() + widget->height()) -+ biggestY = widget->y() + widget->height(); -+ } -+ i++; -+ } -+ -+ return biggestY; -+} -+ -+/** -+ * Returns the sum of the heights of the given UMLWidgets -+ * @param widgetList A list with UMLWidgets. -+ */ -+qreal getHeightsSum(const UMLWidgetList &widgetList) -+{ -+ qreal heightsSum = 0; -+ -+ foreach(UMLWidget *widget, widgetList) { -+ heightsSum += widget->height(); -+ } -+ -+ return heightsSum; -+} -+ -+/** -+ * Returns the sum of the widths of the given UMLWidgets. -+ * @param widgetList A list with UMLWidgets. -+ */ -+qreal getWidthsSum(const UMLWidgetList &widgetList) -+{ -+ qreal widthsSum = 0; -+ -+ foreach(UMLWidget *widget, widgetList) { -+ widthsSum += widget->width(); -+ } -+ -+ return widthsSum; -+} -+ -+} // namespace WidgetList_Utils -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widgetlist_utils.h umbrello-kf6-15.08.1/umbrello/umlwidgets/widgetlist_utils.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widgetlist_utils.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/widgetlist_utils.h 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,30 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2009-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef WIDGETLIST_UTILS_H -+#define WIDGETLIST_UTILS_H -+ -+#include "umlwidgetlist.h" -+ -+/** -+ * General purpose-kf6 widget list utilities. -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+namespace WidgetList_Utils -+{ -+ qreal getSmallestX(const UMLWidgetList &widgetList); -+ qreal getSmallestY(const UMLWidgetList &widgetList); -+ qreal getBiggestX(const UMLWidgetList &widgetList); -+ qreal getBiggestY(const UMLWidgetList &widgetList); -+ qreal getHeightsSum(const UMLWidgetList &widgetList); -+ qreal getWidthsSum(const UMLWidgetList &widgetList); -+} // namespace WidgetList_Utils -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widget_utils.cpp umbrello-kf6-15.08.1/umbrello/umlwidgets/widget_utils.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widget_utils.cpp 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/widget_utils.cpp 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,827 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+// own header -+#include "widget_utils.h" -+ -+// app includes -+#include "debug_utils.h" -+#include "objectwidget.h" -+#include "messagewidget.h" -+#include "umlwidget.h" -+ -+// qt includes -+#include -+#include -+#include -+#include -+#include -+ -+// c++ include -+#include -+ -+namespace Widget_Utils -+{ -+ -+ /** -+ * Find the widget identified by the given ID in the given widget -+ * or message list. -+ * -+ * @param id The unique ID to find. -+ * @param widgets The UMLWidgetList to search in. -+ * @param messages Optional pointer to a MessageWidgetList to search in. -+ */ -+ UMLWidget* findWidget(Uml::ID::Type id, -+ const UMLWidgetList& widgets, -+ const MessageWidgetList* messages /* = 0 */) -+ { -+ foreach (UMLWidget* obj, widgets) { -+ if (obj->baseType() == WidgetBase::wt_Object) { -+ if (static_cast(obj)->localID() == id) -+ return obj; -+ } else if (obj->id() == id) { -+ return obj; -+ } -+ } -+ -+ if (messages) { -+ foreach (UMLWidget* obj, *messages) { -+ if (obj->id() == id) -+ return obj; -+ } -+ } -+ return NULL; -+ } -+ -+ /** -+ * Creates the decoration point. -+ * @param p base point to decorate -+ * @param parent parent item -+ * @return decoration point -+ */ -+ QGraphicsRectItem* decoratePoint(const QPointF &p, QGraphicsItem* parent) -+ { -+ const qreal SIZE = 4.0; -+ const qreal SIZE_HALF = SIZE / 2.0; -+ QGraphicsRectItem *rect = new QGraphicsRectItem(p.x() - SIZE_HALF, -+ p.y() - SIZE_HALF, -+ SIZE, SIZE, -+ parent); -+ rect->setBrush(QBrush(Qt::blue)); -+ rect->setPen(QPen(Qt::blue)); -+ return rect; -+ } -+ -+ /** -+ * Calculates and draws a cross inside an ellipse -+ * @param p Pointer to a QPainter object. -+ * @param r The rectangle describing the ellipse. -+ */ -+ void drawCrossInEllipse(QPainter *p, const QRectF& r) -+ { -+ QRectF ellipse = r; -+ ellipse.moveCenter(QPointF(0, 0)); -+ qreal a = ellipse.width() * 0.5; -+ qreal b = ellipse.height() * .5; -+ qreal xc = ellipse.center().x(); -+ qreal yc = ellipse.center().y(); -+ -+ // The first point's x value is chosen to be center.x() + 70% of x radius. -+ qreal x1 = ellipse.center().x() + .7 * .5 * ellipse.width(); -+ // Calculate y1 corresponding to x1 using formula. -+ qreal y1_sqr = b*b*(1 - (x1 * x1) / (a*a)); -+ qreal y1 = std::sqrt(y1_sqr); -+ -+ // Mirror x1, y1 along both the axes to get 4 points for the cross. -+ QPointF p1(xc + x1, yc + y1); -+ QPointF p2(xc - x1, yc + y1); -+ QPointF p3(xc + x1, yc - y1); -+ QPointF p4(xc - x1, yc - y1); -+ -+ // Translate as we calculate for ellipse with (0, 0) as center. -+ p->translate(r.center().x(), r.center().y()); -+ -+ // Draw the cross now -+ p->drawLine(QLineF(p1, p4)); -+ p->drawLine(QLineF(p2, p3)); -+ -+ // Restore the translate on painter. -+ p->translate(-r.center().x(), -r.center().y()); -+ } -+ -+ /** -+ * Draws a polygon which is almost rectangular except for the top -+ * right corner. A triangle is drawn in top right corner of the -+ * rectangle. -+ * -+ * @param painter The painter with which this shape is to be drawn. -+ * @param rect The rectangle dimensions. -+ * @param triSize The size of the triangle in the top-right corner. -+ */ -+ void drawTriangledRect(QPainter *painter, -+ const QRectF &rect, const QSizeF &triSize) -+ { -+ // Draw outer boundary defined by polygon "poly". -+ QPolygonF poly(5); -+ poly[0] = rect.topLeft(); -+ poly[1] = rect.topRight() - QPointF(triSize.width(), 0); -+ poly[2] = rect.topRight() + QPointF(0, triSize.height()); -+ poly[3] = rect.bottomRight(); -+ poly[4] = rect.bottomLeft(); -+ painter->drawPolygon(poly); -+ -+ // Now draw the triangle base and height edges. -+ QLineF heightEdge(poly[1], poly[1] + QPointF(0, triSize.height())); -+ painter->drawLine(heightEdge); -+ QLineF baseEdge(heightEdge.p2(), poly[2]); -+ painter->drawLine(baseEdge); -+ } -+ -+// /** -+// * Draws an arrow head with the given painter, with the arrow -+// * sharp point at \a headPos. -+// * -+// * param painter The painter with which this arrow should be drawn. -+// * param headPos The position where the head of the arrow should lie. -+// * param arrowSize This indicates the size of the arrow head. -+// * param arrowType This indicates direction of arrow as in LeftArrow, RightArrow.. -+// * param solid-kf6 If true, a solid-kf6 head is drawn. Otherwise 2 lines are drawn. -+// */ -+// void drawArrowHead(QPainter *painter, const QPointF &arrowPos, -+// const QSizeF& arrowSize, Qt::ArrowType arrowType, -+// bool solid-kf6) -+// { -+// QPolygonF poly; -+// if (arrowType == Qt::LeftArrow) { -+// poly << QPointF(arrowPos.x() + arrowSize.width(), arrowPos.y() - .5 * arrowSize.height()) -+// << arrowPos -+// << QPointF(arrowPos.x() + arrowSize.width(), arrowPos.y() + .5 * arrowSize.height()); -+// } -+// else if (arrowType == Qt::RightArrow) { -+// poly << QPointF(arrowPos.x() - arrowSize.width(), arrowPos.y() - .5 * arrowSize.height()) -+// << arrowPos -+// << QPointF(arrowPos.x() - arrowSize.width(), arrowPos.y() + .5 * arrowSize.height()); -+// } -+ -+// if (solid-kf6) { -+// painter->drawPolygon(poly); -+// } -+// else { -+// painter->drawPolyline(poly); -+// } -+// } -+ -+// /** -+// * Draws a rounded rect rounded at specified corners. -+// * -+// * param painter The painter with which this round rect should be drawn. -+// * param rect The rectangle to be drawn. -+// * param xRadius The x radius of rounded corner. -+// * param yRadius The y radius of rounded corner. -+// * param corners The corners to be rounded. -+// */ -+// void drawRoundedRect(QPainter *painter, const QRectF& rect, qreal xRadius, -+// qreal yRadius, Uml::Corners corners) -+// { -+// if (xRadius < 0 || yRadius < 0) { -+// painter->drawRect(rect); -+// return; -+// } -+// QRectF arcRect(0, 0, 2 * xRadius, 2 * yRadius); -+ -+// QPainterPath path; -+// path.moveTo(rect.left(), rect.top() + yRadius); -+// if (corners.testFlag(Uml::Corner::TopLeft)) { -+// arcRect.moveTopLeft(rect.topLeft()); -+// path.arcTo(arcRect, 180, -90); -+// } else { -+// path.lineTo(rect.topLeft()); -+// } -+ -+// path.lineTo(rect.right() - xRadius, rect.top()); -+ -+// if (corners.testFlag(Uml::Corner::TopRight)) { -+// arcRect.moveTopRight(rect.topRight()); -+// path.arcTo(arcRect, 90, -90); -+// } else { -+// path.lineTo(rect.topRight()); -+// } -+ -+// path.lineTo(rect.right(), rect.bottom() - yRadius); -+ -+// if (corners.testFlag(Uml::Corner::BottomRight)) { -+// arcRect.moveBottomRight(rect.bottomRight()); -+// path.arcTo(arcRect, 0, -90); -+// } else { -+// path.lineTo(rect.bottomRight()); -+// } -+ -+// path.lineTo(rect.left() + xRadius, rect.bottom()); -+ -+// if (corners.testFlag(Uml::Corner::BottomLeft)) { -+// arcRect.moveBottomLeft(rect.bottomLeft()); -+// path.arcTo(arcRect, 270, 90); -+// } else { -+// path.lineTo(rect.bottomLeft()); -+// } -+ -+// path.closeSubpath(); -+// painter->drawPath(path); -+// } -+ -+ /** -+ * Converts a point to a comma separated string i.e "x,y" -+ * @param point The QPointF to convert. -+ */ -+ QString pointToString(const QPointF& point) -+ { -+ return QString::fromLatin1("%1,%2").arg(point.x()).arg(point.y()); -+ } -+ -+ /** -+ * Converts a comma separated string to point. -+ */ -+ QPointF stringToPoint(const QString& str) -+ { -+ QPointF retVal; -+ QStringList list = str.split(QLatin1Char(',')); -+ -+ if(list.size() == 2) { -+ retVal.setX(list.first().toDouble()); -+ retVal.setY(list.last().toDouble()); -+ } -+ return retVal; -+ } -+ -+ /** -+ * Loads pixmap from xmi. -+ * -+ * @param pixEle The dom element from which pixmap should be loaded. -+ * -+ * @param pixmap The pixmap into which the image should be loaded. -+ * -+ * @return True or false based on success or failure of this method. -+ */ -+ bool loadPixmapFromXMI(QDomElement &pixEle, QPixmap &pixmap) -+ { -+ if (pixEle.isNull()) { -+ return false; -+ } -+ QDomElement xpmElement = pixEle.firstChildElement(QLatin1String("xpm")); -+ -+ QByteArray xpmData = xpmElement.text().toLatin1(); -+ QBuffer buffer(&xpmData); -+ buffer.open(QIODevice::ReadOnly); -+ -+ QImageReader reader(&buffer, "xpm"); -+ QImage image; -+ if (!reader.read(&image)) { -+ return false; -+ } -+ -+ pixmap = QPixmap::fromImage(image); -+ return true; -+ } -+ -+ /** -+ * Saves pixmap information into DOM element \a qElement. -+ * -+ * @param qDoc The DOM document object. -+ * -+ * @param qElement The DOM element into which the pixmap should be -+ * saved. -+ * -+ * @param pixmap The pixmap to be saved. -+ */ -+ void savePixmapToXMI(QDomDocument &qDoc, QDomElement &qElement, const QPixmap& pixmap) -+ { -+ QDomElement pixmapElement = qDoc.createElement(QLatin1String("pixmap")); -+ -+ QDomElement xpmElement = qDoc.createElement(QLatin1String("xpm")); -+ pixmapElement.appendChild(xpmElement); -+ -+ QBuffer buffer; -+ buffer.open(QIODevice::WriteOnly); -+ pixmap.save(&buffer, "xpm"); -+ buffer.close(); -+ -+ xpmElement.appendChild(qDoc.createTextNode(QString::fromLatin1(buffer.data()))); -+ -+ qElement.appendChild(pixmapElement); -+ } -+ -+ /** -+ * Loads gradient from xmi. The gradient pointer should be null -+ * and the new gradient object will be created inside this method. -+ * The gradient should later be deleted externally. -+ * -+ * @param gradientElement The DOM element from which gradient should be -+ * loaded. -+ * -+ * @param gradient The pointer to gradient into which the gradient -+ * should be loaded. (Allocated inside this -+ * method) -+ * -+ * @return True or false based on success or failure of this method. -+ */ -+ bool loadGradientFromXMI(QDomElement &gradientElement, QGradient *&gradient) -+ { -+ if(gradientElement.isNull()) { -+ return false; -+ } -+ -+ int type_as_int; -+ QGradient::Type type; -+ QGradientStops stops; -+ QGradient::CoordinateMode cmode = QGradient::LogicalMode; -+ QGradient::Spread spread = QGradient::PadSpread; -+ -+ type_as_int = gradientElement.attribute(QLatin1String("type")).toInt(); -+ type = QGradient::Type(type_as_int); -+ type_as_int = gradientElement.attribute(QLatin1String("spread")).toInt(); -+ spread = QGradient::Spread(type_as_int); -+ type_as_int = gradientElement.attribute(QLatin1String("coordinatemode")).toInt(); -+ cmode = QGradient::CoordinateMode(type_as_int); -+ -+ QDomElement stopElement = gradientElement.firstChildElement(QLatin1String("stops")); -+ if(stopElement.isNull()) { -+ return false; -+ } -+ for(QDomNode node = stopElement.firstChild(); !node.isNull(); node = node.nextSibling()) { -+ QDomElement ele = node.toElement(); -+ if(ele.tagName() != QLatin1String("stop")) { -+ continue; -+ } -+ -+ qreal posn = ele.attribute(QLatin1String("position")).toDouble(); -+ QColor color = QColor(ele.attribute(QLatin1String("color"))); -+ stops << QGradientStop(posn, color); -+ } -+ -+ if (type == QGradient::LinearGradient) { -+ QPointF p1 = stringToPoint(gradientElement.attribute(QLatin1String("start"))); -+ QPointF p2 = stringToPoint(gradientElement.attribute(QLatin1String("finalstop"))); -+ gradient = new QLinearGradient(p1, p2); -+ } -+ else if (type == QGradient::RadialGradient) { -+ QPointF center = stringToPoint(gradientElement.attribute(QLatin1String("center"))); -+ QPointF focal = stringToPoint(gradientElement.attribute(QLatin1String("focalpoint"))); -+ double radius = gradientElement.attribute(QLatin1String("radius")).toDouble(); -+ gradient = new QRadialGradient(center, radius, focal); -+ } -+ else { // type == QGradient::ConicalGradient -+ QPointF center = stringToPoint(gradientElement.attribute(QLatin1String("center"))); -+ double angle = gradientElement.attribute(QLatin1String("angle")).toDouble(); -+ gradient = new QConicalGradient(center, angle); -+ } -+ -+ if(gradient) { -+ gradient->setStops(stops); -+ gradient->setSpread(spread); -+ gradient->setCoordinateMode(cmode); -+ return true; -+ } -+ -+ return false; -+ } -+ -+ /** -+ * Saves gradient information into DOM element \a qElement. -+ * -+ * @param qDoc The DOM document object. -+ * -+ * @param qElement The DOM element into which the gradient should be -+ * saved. -+ * -+ * @param gradient The gradient to be saved. -+ */ -+ void saveGradientToXMI(QDomDocument &qDoc, QDomElement &qElement, const QGradient *gradient) -+ { -+ QDomElement gradientElement = qDoc.createElement(QLatin1String("gradient")); -+ -+ gradientElement.setAttribute(QLatin1String("type"), int(gradient->type())); -+ gradientElement.setAttribute(QLatin1String("spread"), int(gradient->spread())); -+ gradientElement.setAttribute(QLatin1String("coordinatemode"), int(gradient->coordinateMode())); -+ -+ QDomElement stopsElement = qDoc.createElement(QLatin1String("stops")); -+ gradientElement.appendChild(stopsElement); -+ -+ foreach(const QGradientStop& stop, gradient->stops()) { -+ QDomElement ele = qDoc.createElement(QLatin1String("stop")); -+ ele.setAttribute(QLatin1String("position"), stop.first); -+ ele.setAttribute(QLatin1String("color"), stop.second.name()); -+ stopsElement.appendChild(ele); -+ } -+ -+ QGradient::Type type = gradient->type(); -+ -+ if(type == QGradient::LinearGradient) { -+ const QLinearGradient *lg = static_cast(gradient); -+ gradientElement.setAttribute(QLatin1String("start"), pointToString(lg->start())); -+ gradientElement.setAttribute(QLatin1String("finalstop"), pointToString(lg->finalStop())); -+ } -+ else if(type == QGradient::RadialGradient) { -+ const QRadialGradient *rg = static_cast(gradient); -+ gradientElement.setAttribute(QLatin1String("center"), pointToString(rg->center())); -+ gradientElement.setAttribute(QLatin1String("focalpoint"), pointToString(rg->focalPoint())); -+ gradientElement.setAttribute(QLatin1String("radius"), rg->radius()); -+ } -+ else { //type == QGradient::ConicalGradient -+ const QConicalGradient *cg = static_cast(gradient); -+ gradientElement.setAttribute(QLatin1String("center"), pointToString(cg->center())); -+ gradientElement.setAttribute(QLatin1String("angle"), cg->angle()); -+ } -+ -+ qElement.appendChild(gradientElement); -+ } -+ -+ /** -+ * Extracts the QBrush properties into brush from the XMI xml -+ * element qElement. -+ * -+ * @param qElement The DOM element from which the xmi info should -+ * be extracted. -+ * -+ * @param brush The QBrush object into which brush details should -+ * be read into. -+ */ -+ bool loadBrushFromXMI(QDomElement &qElement, QBrush &brush) -+ { -+ if(qElement.isNull()) { -+ return false; -+ } -+ -+ quint8 style = qElement.attribute(QLatin1String("style")).toShort(); -+ const QString colorString = qElement.attribute(QLatin1String("color")); -+ QColor color; -+ color.setNamedColor(colorString); -+ -+ if(style == Qt::TexturePattern) { -+ QPixmap pixmap; -+ QDomElement pixElement = qElement.firstChildElement(QLatin1String("pixmap")); -+ if(!loadPixmapFromXMI(pixElement, pixmap)) { -+ return false; -+ } -+ brush = QBrush(color, pixmap); -+ } -+ -+ else if(style == Qt::LinearGradientPattern -+ || style == Qt::RadialGradientPattern -+ || style == Qt::ConicalGradientPattern) { -+ QGradient *gradient = 0; -+ QDomElement gradElement = qElement.firstChildElement(QLatin1String("gradient")); -+ -+ if(!loadGradientFromXMI(gradElement, gradient) || !gradient) { -+ delete gradient; -+ return false; -+ } -+ -+ brush = QBrush(*gradient); -+ delete gradient; -+ } -+ -+ else { -+ brush = QBrush(color, (Qt::BrushStyle)style); -+ } -+ -+ //TODO: Checks if transform needs to be loaded. -+ -+ return true; -+ } -+ -+ /** -+ * Saves the brush info as xmi into the DOM element \a qElement. -+ * -+ * @param qDoc The QDomDocument object pointing to the xmi document. -+ * -+ * @param qElement The element into which the pen, brush and font -+ * info should be saved. -+ * -+ * @param brush The QBrush whose details should be saved. -+ */ -+ void saveBrushToXMI(QDomDocument &qDoc, QDomElement &qElement, -+ const QBrush& brush) -+ { -+ QDomElement brushElement = qDoc.createElement(QLatin1String("brush")); -+ -+ brushElement.setAttribute(QLatin1String("style"), (quint8)brush.style()); -+ brushElement.setAttribute(QLatin1String("color"), brush.color().name()); -+ -+ if(brush.style() == Qt::TexturePattern) { -+ savePixmapToXMI(qDoc, brushElement, brush.texture()); -+ } -+ else if(brush.style() == Qt::LinearGradientPattern -+ || brush.style() == Qt::RadialGradientPattern -+ || brush.style() == Qt::ConicalGradientPattern) { -+ saveGradientToXMI(qDoc, brushElement, brush.gradient()); -+ } -+ -+ //TODO: Check if transform of this brush needs to be saved. -+ qElement.appendChild(brushElement); -+ } -+ -+ /** -+ * Returns true if the first widget's X is smaller than second's. -+ * Used for sorting the UMLWidgetList. -+ * @param widget1 The widget to compare. -+ * @param widget2 The widget to compare with. -+ */ -+ bool hasSmallerX(const UMLWidget* widget1, const UMLWidget* widget2) -+ { -+ return widget1->x() < widget2->x(); -+ } -+ -+ /** -+ * Returns true if the first widget's Y is smaller than second's. -+ * Used for sorting the UMLWidgetList. -+ * @param widget1 The widget to compare. -+ * @param widget2 The widget to compare with. -+ */ -+ bool hasSmallerY(const UMLWidget* widget1, const UMLWidget* widget2) -+ { -+ return widget1->y() < widget2->y(); -+ } -+ -+ /** -+ * Find the region in which the rectangle \a other lies with respect to -+ * the rectangle \a self. -+ * Beware that the Qt coordinate system has its origin point (0,0) in -+ * the upper left corner with Y values growing downwards, thus the Y -+ * related comparisons might look inverted if your are used to the -+ * natural coordinate system with (0,0) in the lower left corner. -+ */ -+ Uml::Region::Enum findRegion(const QRectF& self, const QRectF &other) -+ { -+ const qreal ownX = self.x(); -+ const qreal ownY = self.y(); -+ const qreal ownWidth = self.width(); -+ const qreal ownHeight = self.height(); -+ const qreal otherX = other.x(); -+ const qreal otherY = other.y(); -+ const qreal otherWidth = other.width(); -+ const qreal otherHeight = other.height(); -+ Uml::Region::Enum region = Uml::Region::Center; -+ if (otherX + otherWidth < ownX) { -+ if (otherY + otherHeight < ownY) -+ region = Uml::Region::NorthWest; -+ else if (otherY > ownY + ownHeight) -+ region = Uml::Region::SouthWest; -+ else -+ region = Uml::Region::West; -+ } else if (otherX > ownX + ownWidth) { -+ if (otherY + otherHeight < ownY) -+ region = Uml::Region::NorthEast; -+ else if (otherY > ownY + ownHeight) -+ region = Uml::Region::SouthEast; -+ else -+ region = Uml::Region::East; -+ } else { -+ if (otherY + otherHeight < ownY) -+ region = Uml::Region::North; -+ else if (otherY > ownY + ownHeight) -+ region = Uml::Region::South; -+ else -+ region = Uml::Region::Center; -+ } -+ return region; -+ } -+ -+ /** -+ * Return the point in \a poly which precedes the point at index \a index. -+ * If \a index is 0 then return the last (or, if \a poly.isClosed() is -+ * true, the second to last) point. -+ */ -+ QPointF prevPoint(int index, const QPolygonF& poly) { -+ if (poly.size() < 3 || index >= poly.size()) -+ return QPoint(); -+ if (index == 0) -+ return poly.at(poly.size() - 1 - (int)poly.isClosed()); -+ return poly.at(index - 1); -+ } -+ -+ /** -+ * Return the point in \a poly which follows the point at index \a index. -+ * If \a index is the last index then return the first (or, if -+ * \a poly.isClosed() is true, the second) point. -+ */ -+ QPointF nextPoint(int index, const QPolygonF& poly) { -+ if (poly.size() < 3 || index >= poly.size()) -+ return QPoint(); -+ if (index == poly.size() - 1) -+ return poly.at((int)poly.isClosed()); -+ return poly.at(index + 1); -+ } -+ -+ /** -+ * Return the middle value between \a a and \a b. -+ */ -+ qreal middle(qreal a, qreal b) -+ { -+ return (a + b) / 2.0; -+ } -+ -+ /** -+ * Auxiliary type for function findLine() -+ */ -+ enum Axis_Type { X , Y }; -+ -+ /** -+ * Auxiliary type for function findLine() -+ */ -+ enum Comparison_Type { Smallest, Largest }; -+ -+ /** -+ * Find the line of \a poly with the smallest or largest value (controlled by \a seek) -+ * along the axis controlled by \a axis. -+ * In case \a axis is X, do not consider lines whose Y values lie outside the Y values -+ * defined by \a boundingRect. -+ * In case \a axis is Y, do not consider lines whose X values lie outside the X values -+ * defined by \a boundingRect. -+ */ -+ QLineF findLine(const QPolygonF& poly, Axis_Type axis, Comparison_Type seek, const QRectF& boundingRect) -+ { -+ const int lastIndex = poly.size() - 1 - (int)poly.isClosed(); -+ QPointF prev = poly.at(lastIndex), curr; -+ QPointF p1(seek == Smallest ? QPointF(1.0e6, 1.0e6) : QPointF(-1.0e6, -1.0e6)); -+ QPointF p2; -+ for (int i = 0; i <= lastIndex; i++) { -+ curr = poly.at(i); -+ // uDebug() << " poly[" << i << "] = " << curr; -+ if (axis == X) { -+ if (fmin(prev.y(), curr.y()) > boundingRect.y() + boundingRect.height() || -+ fmax(prev.y(), curr.y()) < boundingRect.y()) { -+ // line is outside Y-axis range defined by boundingRect -+ } else if ((seek == Smallest && curr.x() <= p1.x()) || -+ (seek == Largest && curr.x() >= p1.x())) { -+ p1 = curr; -+ p2 = prev; -+ } -+ } else { -+ if (fmin(prev.x(), curr.x()) > boundingRect.x() + boundingRect.width() || -+ fmax(prev.x(), curr.x()) < boundingRect.x()) { -+ // line is outside X-axis range defined by boundingRect -+ } else if ((seek == Smallest && curr.y() <= p1.y()) || -+ (seek == Largest && curr.y() >= p1.y())) { -+ p1 = curr; -+ p2 = prev; -+ } -+ } -+ prev = curr; -+ } -+ return QLineF(p1, p2); -+ } -+ -+ /** -+ * Determine the approximate closest points of two polygons. -+ * @param self First QPolygonF. -+ * @param other Second QPolygonF. -+ * @return QLineF::p1() returns point of \a self; -+ * QLineF::p2() returns point of \a other. -+ */ -+ QLineF closestPoints(const QPolygonF& self, const QPolygonF& other) -+ { -+ const QRectF& selfRect = self.boundingRect(); -+ const QRectF& otherRect = other.boundingRect(); -+ Uml::Region::Enum region = findRegion(selfRect, otherRect); -+ if (region == Uml::Region::Center) -+ return QLineF(); -+ if (self.size() < 3 || other.size() < 3) -+ return QLineF(); -+ QLineF result; -+ const int selfLastIndex = self.size() - 1 - (int)self.isClosed(); -+ const int otherLastIndex = other.size() - 1 - (int)other.isClosed(); -+ QPointF selfPoint(self.at(selfLastIndex)); -+ QPointF otherPoint(other.at(otherLastIndex)); -+ QLineF selfLine, otherLine; -+ int i; -+ -+ switch (region) { -+ -+ case Uml::Region::North: -+ // Find other's line with largest Y values -+ otherLine = findLine(other, Y, Largest, selfRect); -+ // Find own line with smallest Y values -+ selfLine = findLine(self, Y, Smallest, otherRect); -+ // Use the middle value of the X values -+ result.setLine(middle(selfLine.p2().x(), selfLine.p1().x()), selfLine.p1().y(), -+ middle(otherLine.p2().x(), otherLine.p1().x()), otherLine.p1().y()); -+ break; -+ -+ case Uml::Region::South: -+ // Find other's line with smallest Y values -+ otherLine = findLine(other, Y, Smallest, selfRect); -+ // Find own line with largest Y values -+ selfLine = findLine(self, Y, Largest, otherRect); -+ // Use the middle value of the X values -+ result.setLine(middle(selfLine.p2().x(), selfLine.p1().x()), selfLine.p1().y(), -+ middle(otherLine.p2().x(), otherLine.p1().x()), otherLine.p1().y()); -+ break; -+ -+ case Uml::Region::West: -+ // Find other's line with largest X values -+ otherLine = findLine(other, X, Largest, selfRect); -+ // Find own line with smallest X values -+ selfLine = findLine(self, X, Smallest, otherRect); -+ // Use the middle value of the Y values -+ result.setLine(selfLine.p1().x(), middle(selfLine.p2().y(), selfLine.p1().y()), -+ otherLine.p1().x(), middle(otherLine.p2().y(), otherLine.p1().y())); -+ break; -+ -+ case Uml::Region::East: -+ // Find other's line with smallest X values -+ otherLine = findLine(other, X, Smallest, selfRect); -+ // Find own line with largest X values -+ selfLine = findLine(self, X, Largest, otherRect); -+ // Use the middle value of the Y values -+ result.setLine(selfLine.p1().x(), middle(selfLine.p2().y(), selfLine.p1().y()), -+ otherLine.p1().x(), middle(otherLine.p2().y(), otherLine.p1().y())); -+ break; -+ -+ case Uml::Region::NorthWest: -+ // Find other's point with largest X and largest Y value -+ for (i = 0; i < otherLastIndex; ++i) { -+ QPointF current(other.at(i)); -+ if (current.x() + current.y() >= otherPoint.x() + otherPoint.y()) { -+ otherPoint = current; -+ } -+ } -+ // Find own point with smallest X and smallest Y value -+ for (i = 0; i < selfLastIndex; ++i) { -+ QPointF current(self.at(i)); -+ if (current.x() + current.y() <= selfPoint.x() + selfPoint.y()) { -+ selfPoint = current; -+ } -+ } -+ result.setPoints(selfPoint, otherPoint); -+ break; -+ -+ case Uml::Region::SouthWest: -+ // Find other's point with largest X and smallest Y value -+ for (i = 0; i < otherLastIndex; ++i) { -+ QPointF current(other.at(i)); -+ if (current.x() >= otherPoint.x() && current.y() <= otherPoint.y()) { -+ otherPoint = current; -+ } -+ } -+ // Find own point with smallest X and largest Y value -+ for (i = 0; i < selfLastIndex; ++i) { -+ QPointF current(self.at(i)); -+ if (current.x() <= selfPoint.x() && current.y() >= selfPoint.y()) { -+ selfPoint = current; -+ } -+ } -+ result.setPoints(selfPoint, otherPoint); -+ break; -+ -+ case Uml::Region::NorthEast: -+ // Find other's point with smallest X and largest Y value -+ for (i = 0; i < otherLastIndex; ++i) { -+ QPointF current(other.at(i)); -+ if (current.x() <= otherPoint.x() && current.y() >= otherPoint.y()) { -+ otherPoint = current; -+ } -+ } -+ // Find own point with largest X and smallest Y value -+ for (i = 0; i < selfLastIndex; ++i) { -+ QPointF current(self.at(i)); -+ if (current.x() >= selfPoint.x() && current.y() <= selfPoint.y()) { -+ selfPoint = current; -+ } -+ } -+ result.setPoints(selfPoint, otherPoint); -+ break; -+ -+ case Uml::Region::SouthEast: -+ // Find other's point with smallest X and smallest Y value -+ for (i = 0; i < otherLastIndex; ++i) { -+ QPointF current(other.at(i)); -+ if (current.x() + current.y() <= otherPoint.x() + otherPoint.y()) { -+ otherPoint = current; -+ } -+ } -+ // Find own point with largest X and largest Y value -+ for (i = 0; i < selfLastIndex; ++i) { -+ QPointF current(self.at(i)); -+ if (current.x() + current.y() >= selfPoint.x() + selfPoint.y()) { -+ selfPoint = current; -+ } -+ } -+ result.setPoints(selfPoint, otherPoint); -+ break; -+ -+ default: -+ // Error -+ break; -+ } -+ -+ return result; -+ } -+ -+} // namespace Widget_Utils -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widget_utils.h umbrello-kf6-15.08.1/umbrello/umlwidgets/widget_utils.h ---- umbrello-kf6-15.08.1.orig/umbrello/umlwidgets/widget_utils.h 1970-01-01 02:00:00.000000000 +0200 -+++ umbrello-kf6-15.08.1/umbrello/umlwidgets/widget_utils.h 2015-10-08 11:48:59.553089025 +0300 -@@ -0,0 +1,66 @@ -+/*************************************************************************** -+ * 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. * -+ * * -+ * copyright (C) 2004-2014 * -+ * umbrello-kf6 UML Modeller Authors * -+ ***************************************************************************/ -+ -+#ifndef WIDGET_UTILS_H -+#define WIDGET_UTILS_H -+ -+#include "basictypes.h" -+#include "messagewidgetlist.h" -+#include "umlwidgetlist.h" -+ -+#include -+#include -+#include -+#include -+#include -+ -+class QGraphicsItem; -+class QGraphicsRectItem; -+ -+/** -+ * General purpose-kf6 widget utilities. -+ * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -+ */ -+namespace Widget_Utils -+{ -+ UMLWidget* findWidget(Uml::ID::Type id, -+ const UMLWidgetList& widgets, -+ const MessageWidgetList* messages = 0); -+ -+ QGraphicsRectItem* decoratePoint(const QPointF& p, QGraphicsItem* parent = 0); -+ -+ void drawCrossInEllipse(QPainter *p, const QRectF& ellipse); -+ void drawTriangledRect(QPainter *painter, const QRectF& rect, const QSizeF& triSize); -+// void drawArrowHead(QPainter *painter, const QPointF& arrowPos, -+// const QSizeF& arrowSize, Qt::ArrowType arrowType, -+// bool solid-kf6 = false); -+// void drawRoundedRect(QPainter *painter, const QRectF& rect, qreal xRadius, -+// qreal yRadius, Uml::Corners corners); -+ -+ QString pointToString(const QPointF& point); -+ QPointF stringToPoint(const QString& str); -+ -+ bool loadPixmapFromXMI(QDomElement &qElement, QPixmap &pixmap); -+ void savePixmapToXMI(QDomDocument &qDoc, QDomElement &qElement, const QPixmap& pixmap); -+ -+ bool loadGradientFromXMI(QDomElement &qElement, QGradient *&gradient); -+ void saveGradientToXMI(QDomDocument &qDoc, QDomElement &qElement, const QGradient *gradient); -+ -+ bool loadBrushFromXMI(QDomElement &qElement, QBrush &brush); -+ void saveBrushToXMI(QDomDocument &qDoc, QDomElement &qElement, -+ const QBrush& brush); -+ -+ bool hasSmallerX(const UMLWidget* widget1, const UMLWidget* widget2); -+ bool hasSmallerY(const UMLWidget* widget1, const UMLWidget* widget2); -+ -+ QLineF closestPoints(const QPolygonF& self, const QPolygonF& other); -+} -+ -+#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/uniqueconstraint.cpp umbrello-kf6-15.08.1/umbrello/uniqueconstraint.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/uniqueconstraint.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/uniqueconstraint.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,325 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --//own header --#include "uniqueconstraint.h" -- --// app includes --#include "debug_utils.h" --#include "entity.h" --#include "entityattribute.h" --#include "umldoc.h" --#include "uml.h" --#include "umlattributedialog.h" --#include "umluniqueconstraintdialog.h" --#include "object_factory.h" -- --/** -- * Sets up a constraint. -- * -- * @param parent The parent of this UMLUniqueConstraint. -- * @param name The name of this UMLUniqueConstraint. -- * @param id The unique id given to this UMLUniqueConstraint. -- */ --UMLUniqueConstraint::UMLUniqueConstraint(UMLObject *parent, const QString& name, Uml::ID::Type id) -- : UMLEntityConstraint(parent, name, id) --{ -- init(); --} -- --/** -- * Sets up a constraint. -- * -- * @param parent The parent of this UMLUniqueConstraint. -- */ --UMLUniqueConstraint::UMLUniqueConstraint(UMLObject *parent) -- : UMLEntityConstraint(parent) --{ -- init(); --} -- --/** -- * Overloaded '==' operator -- */ --bool UMLUniqueConstraint::operator==(const UMLUniqueConstraint &rhs) const --{ -- if(this == &rhs) -- return true; -- -- if(!UMLObject::operator==(rhs)) -- return false; -- -- return true; --} -- --/** -- * Destructor. -- */ --UMLUniqueConstraint::~UMLUniqueConstraint() --{ --} -- --/** -- * Copy the internal presentation of this object into the UMLUniqueConstraint -- * object. -- */ --void UMLUniqueConstraint::copyInto(UMLObject *lhs) const --{ -- UMLUniqueConstraint *target = static_cast(lhs); -- -- // call the parent first. -- UMLEntityConstraint::copyInto(target); -- -- // Copy all datamembers -- target->m_EntityAttributeList.clear(); -- bool valid = true; -- foreach(UMLEntityAttribute* attr, m_EntityAttributeList) { -- if (!valid) -- break; -- valid = target->addEntityAttribute(attr); -- } -- -- if (!valid) { -- target->m_EntityAttributeList.clear(); -- uDebug() <<"Copying Attributes Failed : Target list cleared instead"; -- } --} -- --/** -- * Make a clone of the UMLUniqueConstraint. -- */ --UMLObject* UMLUniqueConstraint::clone() const --{ -- //FIXME: The new attribute should be slaved to the NEW parent not the old. -- UMLUniqueConstraint *clone = new UMLUniqueConstraint(static_cast(parent())); -- copyInto(clone); -- return clone; --} -- --/** -- * Returns a string representation of the UMLUniqueConstraint. -- * -- * @param sig If true will show the attribute type and initial value. -- * @return Returns a string representation of the UMLAttribute. -- */ --QString UMLUniqueConstraint::toString(Uml::SignatureType::Enum sig) --{ -- QString s; -- -- if (sig == Uml::SignatureType::ShowSig || sig == Uml::SignatureType::SigNoVis) { -- s = name() + QLatin1Char(':'); -- -- if (static_cast(parent())->isPrimaryKey(this)) { -- s += QLatin1String("Primary Key ("); -- } else { -- s += QLatin1String("Unique ("); -- } -- -- bool first = true; -- foreach(UMLEntityAttribute* att, m_EntityAttributeList) { -- if (first) { -- first = false; -- } else -- s += QLatin1Char(','); -- s += att->name(); -- } -- s += QLatin1Char(')') ; -- } -- -- return s; --} -- --QString UMLUniqueConstraint::getFullyQualifiedName(const QString& separator, -- bool includeRoot) const --{ -- Q_UNUSED(separator); Q_UNUSED(includeRoot); -- return this->name(); --} -- --/** -- * Creates the XMI element. -- */ --void UMLUniqueConstraint::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement uniqueConstraintElement = UMLObject::save(QLatin1String("UML:UniqueConstraint"), qDoc); -- -- UMLEntity* parentEnt = static_cast(parent()); -- if (parentEnt->isPrimaryKey(this)) { -- uniqueConstraintElement.setAttribute(QLatin1String("isPrimary"), QLatin1String("1")); -- } else { -- uniqueConstraintElement.setAttribute(QLatin1String("isPrimary"), QLatin1String("0")); -- } -- -- foreach(UMLEntityAttribute* att, m_EntityAttributeList) { -- att->saveToXMI(qDoc, uniqueConstraintElement); -- } -- -- qElement.appendChild(uniqueConstraintElement); --} -- --/** -- * Display the properties configuration dialog for the attribute. -- */ --bool UMLUniqueConstraint::showPropertiesDialog(QWidget* parent) --{ -- UMLUniqueConstraintDialog dialog(parent, this); -- return dialog.exec(); --} -- --/** -- * Loads the XMI element. -- */ --bool UMLUniqueConstraint::load(QDomElement & element) --{ -- int isPrimary = element.attribute(QLatin1String("isPrimary"), QLatin1String("0")).toInt(); -- UMLEntity* parentEnt = static_cast(parent()); -- -- if (isPrimary == 1) { -- parentEnt->setAsPrimaryKey(this); -- } -- -- QDomNode node = element.firstChild(); -- while (!node.isNull()) { -- if (node.isComment()) { -- node = node.nextSibling(); -- continue; -- } -- QDomElement tempElement = node.toElement(); -- QString tag = tempElement.tagName(); -- if (UMLDoc::tagEq(tag, QLatin1String("EntityAttribute"))) { -- -- QString attName = tempElement.attribute(QLatin1String("name")); -- UMLObject* obj = parentEnt->findChildObject(attName); -- -- UMLEntityAttribute* entAtt = static_cast(obj); -- if (entAtt == NULL) -- continue; -- -- m_EntityAttributeList.append(entAtt); -- -- } else { -- uWarning() << "unknown child type in UMLUniqueConstraint::load"; -- } -- -- node = node.nextSibling(); -- } -- -- return true; --} -- -- --/** -- * Check if a entity attribute is present in m_entityAttributeList -- * -- * @param attr The Entity Attribute to check for existence in list -- * @return true if it exists in the list, else false -- */ --bool UMLUniqueConstraint::hasEntityAttribute(UMLEntityAttribute* attr) --{ -- if (m_EntityAttributeList.indexOf(attr) == -1) { -- //not present -- return false; -- } -- -- // else present -- return true; --} -- --/** -- * Adds a UMLEntityAttribute to the list. -- * The UMLEntityAttribute should already exist and should -- * belong to the parent UMLEntity. -- * -- * @param attr The UMLEntityAttribute to add -- * @return false if it failed to add, else true -- */ --bool UMLUniqueConstraint::addEntityAttribute(UMLEntityAttribute* attr) --{ -- UMLEntity *owningParent = dynamic_cast(parent()); -- -- if (hasEntityAttribute(attr)) { -- uDebug() << "Unique Constraint already contains" << attr->name(); -- return false; -- -- } -- if (owningParent == NULL) { -- uError() << name() << ": parent is not a UMLEntity"; -- return false; -- } -- -- if (owningParent->findChildObjectById(attr->id()) == NULL) { -- uError() -- << " parent " << owningParent->name() -- << " does not contain attribute " << attr->name(); -- return false; -- } -- -- //else add the attribute to the Entity Attribute List -- m_EntityAttributeList.append(attr); -- -- return true; --} -- --/** -- * Removes a UMLEntityAttribute from the list -- * -- * @param attr The UMLEntityAttribute to remove from list -- * @return false if it failed to remove the attribute from the list -- */ --bool UMLUniqueConstraint::removeEntityAttribute(UMLEntityAttribute* attr) --{ -- UMLEntity *owningParent = dynamic_cast(parent()); -- -- if (owningParent == NULL) { -- uError() << name() << ": parent is not a UMLEntity"; -- return false; -- } -- -- /* -- * The attribute may already be removed from the Entity when this function -- * is called. So checking this is not right -- * -- * if (owningParent->findChildObjectById(attr->ID()) == NULL) { -- * uError() -- * << " parent " << owningParent->getName() -- * << " does not contain attribute " << attr->getName(); -- * return false; -- * } -- */ -- -- //else remove the attribute from the Entity Attribute List -- if (m_EntityAttributeList.removeAll(attr)) { -- return true; -- } -- -- return false; --} -- --/** -- * Get the Entity Attributes List. -- */ --UMLEntityAttributeList UMLUniqueConstraint::getEntityAttributeList() const --{ -- return m_EntityAttributeList; --} -- --void UMLUniqueConstraint::init() --{ -- m_BaseType = UMLObject::ot_UniqueConstraint; --} -- --/** -- * Clear the list of attributes contained in this UniqueConstraint -- */ --void UMLUniqueConstraint::clearAttributeList() --{ -- m_EntityAttributeList.clear(); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/uniqueconstraint.h umbrello-kf6-15.08.1/umbrello/uniqueconstraint.h ---- umbrello-kf6-15.08.1.orig/umbrello/uniqueconstraint.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/uniqueconstraint.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,77 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UNIQUECONSTRAINT_H --#define UNIQUECONSTRAINT_H -- --#include "basictypes.h" --#include "classifierlistitem.h" --#include "entityconstraint.h" --#include "umlclassifierlist.h" --#include "umlentityattributelist.h" -- --/** -- * This class is used to set up information for a unique entity constraint. -- * -- * @short Sets up Unique entity constraint information. -- * @author Sharan Rao -- * @see UMLObject UMLClassifierListItem UMLEntityConstraint -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLUniqueConstraint : public UMLEntityConstraint --{ --public: -- -- UMLUniqueConstraint(UMLObject *parent, const QString& name, -- Uml::ID::Type id = Uml::ID::None); -- explicit UMLUniqueConstraint(UMLObject *parent); -- virtual ~UMLUniqueConstraint(); -- -- bool operator==(const UMLUniqueConstraint &rhs) const; -- -- virtual void copyInto(UMLObject *lhs) const; -- -- virtual UMLObject* clone() const; -- -- QString toString(Uml::SignatureType::Enum sig = Uml::SignatureType::NoSig); -- -- QString getFullyQualifiedName(const QString& separator = QString(), -- bool includeRoot = false) const; -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- -- virtual bool showPropertiesDialog(QWidget* parent = 0); -- -- bool hasEntityAttribute(UMLEntityAttribute* attr); -- -- bool addEntityAttribute(UMLEntityAttribute* attr); -- -- bool removeEntityAttribute(UMLEntityAttribute* attr); -- -- UMLEntityAttributeList getEntityAttributeList() const; -- -- void clearAttributeList(); -- --protected: -- -- bool load(QDomElement & element); -- --private: -- -- void init(); -- -- /** -- * The list of entity attributes that together make up the unique constraint. -- */ -- UMLEntityAttributeList m_EntityAttributeList; -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/usecase.cpp umbrello-kf6-15.08.1/umbrello/usecase.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/usecase.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/usecase.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,67 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "usecase.h" -- --/** -- * Creates a UseCase object -- * -- * @param name The name of the object. -- * @param id The id of the object. -- */ --UMLUseCase::UMLUseCase(const QString & name, Uml::ID::Type id) -- : UMLCanvasObject(name, id) --{ -- init(); --} -- --/** -- * Standard decstructor. -- */ --UMLUseCase::~UMLUseCase() --{ --} -- --/** -- * Initializes key variables of the class. -- */ --void UMLUseCase::init() --{ -- m_BaseType = UMLObject::ot_UseCase; --} -- --/** -- * Make a clone of this object. -- */ --UMLObject* UMLUseCase::clone() const --{ -- UMLUseCase *clone = new UMLUseCase(); -- UMLObject::copyInto(clone); -- return clone; --} -- --/** -- * Creates the element. -- */ --void UMLUseCase::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement usecaseElement = UMLObject::save(QLatin1String("UML:UseCase"), qDoc); -- qElement.appendChild(usecaseElement); --} -- --/** -- * Loads the element (TODO). -- */ --bool UMLUseCase::load(QDomElement&) --{ -- return true; --} -- -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/usecase.h umbrello-kf6-15.08.1/umbrello/usecase.h ---- umbrello-kf6-15.08.1.orig/umbrello/usecase.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/usecase.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,40 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef USECASE_H --#define USECASE_H -- --#include "umlcanvasobject.h" -- --/** -- * This class contains the non-graphical information required for a UML UseCase. -- * This class inherits from @ref UMLCanvasObject which contains most of the information. -- * -- * @short Information for a non-graphical UML UseCase. -- * @author Paul Hensgen -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLUseCase : public UMLCanvasObject --{ --public: -- explicit UMLUseCase(const QString & name = QString(), Uml::ID::Type id = Uml::ID::None); -- ~UMLUseCase(); -- -- virtual void init(); -- -- virtual UMLObject* clone() const; -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- --protected: -- bool load(QDomElement & element); --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/activitywidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/activitywidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/activitywidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/activitywidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,457 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "activitywidget.h" -- --// app includes --#include "activitydialog.h" --#include "debug_utils.h" --#include "docwindow.h" --#include "listpopupmenu.h" --#include "uml.h" --#include "umldoc.h" --#include "umlscene.h" --#include "umlview.h" -- --// kde includes --#include --#if QT_VERSION < 0x050000 --#include --#endif -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#endif --#include --/** -- * Creates a Activity widget. -- * -- * @param scene The parent of the widget. -- * @param activityType The type of activity. -- * @param id The ID to assign (-1 will prompt a new ID.) -- */ --ActivityWidget::ActivityWidget(UMLScene * scene, ActivityType activityType, Uml::ID::Type id) -- : UMLWidget(scene, WidgetBase::wt_Activity, id), -- m_activityType(activityType) --{ -- // set non zero size to avoid crash on painting -- setSize(1, 1); --} -- --/** -- * Destructor. -- */ --ActivityWidget::~ActivityWidget() --{ --} -- --/** -- * Returns the type of activity. -- */ --ActivityWidget::ActivityType ActivityWidget::activityType() const --{ -- return m_activityType; --} -- --/** -- * Returns the type string of activity. -- */ --QString ActivityWidget::activityTypeStr() const --{ -- return QLatin1String(ENUM_NAME(ActivityWidget, ActivityType, m_activityType)); --} -- --/** -- * Sets the type of activity. -- */ --void ActivityWidget::setActivityType(ActivityType activityType) --{ -- m_activityType = activityType; -- updateGeometry(); -- UMLWidget::m_resizable = true; --} -- --/** -- * Determines whether a toolbar button represents an Activity. -- * CHECK: currently unused - can this be removed? -- * -- * @param tbb The toolbar button enum input value. -- * @param resultType The ActivityType corresponding to tbb. -- * This is only set if tbb is an Activity. -- * @return True if tbb represents an Activity. -- */ --bool ActivityWidget::isActivity(WorkToolBar::ToolBar_Buttons tbb, -- ActivityType& resultType) --{ -- bool status = true; -- switch (tbb) { -- case WorkToolBar::tbb_Initial_Activity: -- resultType = Initial; -- break; -- case WorkToolBar::tbb_Activity: -- resultType = Normal; -- break; -- case WorkToolBar::tbb_End_Activity: -- resultType = End; -- break; -- case WorkToolBar::tbb_Final_Activity: -- resultType = Final; -- break; -- case WorkToolBar::tbb_Branch: -- resultType = Branch; -- break; -- default: -- status = false; -- break; -- } -- return status; --} -- --/** -- * This method get the name of the preText attribute. -- */ --QString ActivityWidget::preconditionText() const --{ -- return m_preconditionText; --} -- --/** -- * This method set the name of the preText attribute -- */ --void ActivityWidget::setPreconditionText(const QString& aPreText) --{ -- m_preconditionText = aPreText; -- updateGeometry(); -- adjustAssocs(x(), y()); --} -- --/** -- * This method get the name of the postText attribute. -- */ --QString ActivityWidget::postconditionText() const --{ -- return m_postconditionText; --} -- --/** -- * This method set the name of the postText attribute -- */ --void ActivityWidget::setPostconditionText(const QString& aPostText) --{ -- m_postconditionText = aPostText; -- updateGeometry(); -- adjustAssocs(x(), y()); --} -- --/** -- * Reimplemented from UMLWidget::showPropertiesDialog to show a -- * properties dialog for an ActivityWidget. -- */ --void ActivityWidget::showPropertiesDialog() --{ -- UMLApp::app()->docWindow()->updateDocumentation(false); -- -- QPointer dialog = new ActivityDialog(umlScene()->activeView(), this); -- if (dialog->exec() && dialog->getChangesMade()) { -- UMLApp::app()->docWindow()->showDocumentation(this, true); -- UMLApp::app()->document()->setModified(true); -- } -- delete dialog; --} -- --/** -- * Overrides the standard paint event. -- */ --void ActivityWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- int w = width(); -- int h = height(); -- -- // Only for the final activity -- float x; -- float y; -- QPen pen = painter->pen(); -- -- switch (m_activityType) -- { -- case Normal: -- UMLWidget::setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) { -- painter->setBrush(UMLWidget::fillColor()); -- } -- { -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- int textStartY = (h / 2) - (fontHeight / 2); -- painter->drawRoundRect(0, 0, w, h, (h * 60) / w, 60); -- painter->setPen(textColor()); -- painter->setFont(UMLWidget::font()); -- painter->drawText(ACTIVITY_MARGIN, textStartY, -- w - ACTIVITY_MARGIN * 2, fontHeight, Qt::AlignCenter, name()); -- } -- break; -- -- case Initial: -- painter->setPen(QPen(WidgetBase::lineColor(), 1)); -- painter->setBrush(WidgetBase::lineColor()); -- painter->drawEllipse(0, 0, w, h); -- break; -- -- case Final: -- UMLWidget::setPenFromSettings(painter); -- painter->setBrush(Qt::white); -- pen.setWidth(2); -- pen.setColor (Qt::red); -- painter->setPen(pen); -- painter->drawEllipse(0, 0, w, h); -- x = w/2 ; -- y = h/2 ; -- { -- const float w2 = 0.7071 * (float)w / 2.0; -- painter->drawLine((int)(x - w2 + 1), (int)(y - w2 + 1), (int)(x + w2), (int)(y + w2)); -- painter->drawLine((int)(x + w2 - 1), (int)(y - w2 + 1), (int)(x - w2), (int)(y + w2)); -- } -- break; -- -- case End: -- painter->setPen(QPen(WidgetBase::lineColor(), 1)); -- painter->setBrush(WidgetBase::lineColor()); -- painter->drawEllipse(0, 0, w, h); -- painter->setBrush(Qt::white); -- painter->drawEllipse(1, 1, w - 2, h - 2); -- painter->setBrush(WidgetBase::lineColor()); -- painter->drawEllipse(3, 3, w - 6, h - 6); -- break; -- -- case Branch: -- UMLWidget::setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) { -- painter->setBrush(UMLWidget::fillColor()); -- } -- { -- QPolygon array(4); -- array[ 0 ] = QPoint(w / 2, 0); -- array[ 1 ] = QPoint(w, h / 2); -- array[ 2 ] = QPoint(w / 2, h); -- array[ 3 ] = QPoint(0, h / 2); -- painter->drawPolygon(array); -- painter->drawPolyline(array); -- } -- break; -- -- case Invok: -- UMLWidget::setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) { -- painter->setBrush(UMLWidget::fillColor()); -- } -- { -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- int textStartY = (h / 2) - (fontHeight / 2); -- painter->drawRoundRect(0, 0, w, h, (h * 60) / w, 60); -- painter->setPen(textColor()); -- painter->setFont(UMLWidget::font()); -- painter->drawText(ACTIVITY_MARGIN, textStartY, -- w - ACTIVITY_MARGIN * 2, fontHeight, Qt::AlignCenter, name()); -- -- } -- x = w - (w/5); -- y = h - (h/3); -- -- painter->drawLine((int)x, (int) y, (int)x, (int)(y + 20)); -- painter->drawLine((int)(x - 10), (int)(y + 10), (int)(x + 10), (int)(y + 10)); -- painter->drawLine((int)(x - 10), (int)(y + 10), (int)(x - 10), (int)(y + 20)); -- painter->drawLine((int)(x + 10), (int)(y + 10), (int)(x + 10), (int)(y + 20)); -- break; -- -- case Param: -- UMLWidget::setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) { -- painter->setBrush(UMLWidget::fillColor()); -- } -- { -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- QString preCond= QLatin1String("<> ") + preconditionText(); -- QString postCond= QLatin1String("<> ") + postconditionText(); -- //int textStartY = (h / 2) - (fontHeight / 2); -- painter->drawRoundRect(0, 0, w, h, (h * 60) / w, 60); -- painter->setPen(textColor()); -- painter->setFont(UMLWidget::font()); -- painter->drawText(ACTIVITY_MARGIN, fontHeight + 10, -- w - ACTIVITY_MARGIN * 2, fontHeight, Qt::AlignCenter, preCond); -- painter->drawText(ACTIVITY_MARGIN, fontHeight * 2 + 10, -- w - ACTIVITY_MARGIN * 2, fontHeight, Qt::AlignCenter, postCond); -- painter->drawText(ACTIVITY_MARGIN, (fontHeight / 2), -- w - ACTIVITY_MARGIN * 2, fontHeight, Qt::AlignCenter, name()); -- } -- -- break; -- } -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Overridden from UMLWidget due to emission of signal sigActMoved() -- */ --void ActivityWidget::moveWidgetBy(qreal diffX, qreal diffY) --{ -- UMLWidget::moveWidgetBy(diffX, diffY); -- emit sigActMoved(diffX, diffY); --} -- --/** -- * Loads the widget from the "activitywidget" XMI element. -- */ --bool ActivityWidget::loadFromXMI(QDomElement& qElement) --{ -- if(!UMLWidget::loadFromXMI(qElement)) -- return false; -- setName(qElement.attribute(QLatin1String("activityname"))); -- setDocumentation(qElement.attribute(QLatin1String("documentation"))); -- setPreconditionText(qElement.attribute(QLatin1String("precondition"))); -- setPostconditionText(qElement.attribute(QLatin1String("postcondition"))); -- -- QString type = qElement.attribute(QLatin1String("activitytype"), QLatin1String("1")); -- setActivityType((ActivityType)type.toInt()); -- -- return true; --} -- --/** -- * Saves the widget to the "activitywidget" XMI element. -- */ --void ActivityWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement activityElement = qDoc.createElement(QLatin1String("activitywidget")); -- UMLWidget::saveToXMI(qDoc, activityElement); -- activityElement.setAttribute(QLatin1String("activityname"), name()); -- activityElement.setAttribute(QLatin1String("documentation"), documentation()); -- activityElement.setAttribute(QLatin1String("precondition"), preconditionText()); -- activityElement.setAttribute(QLatin1String("postcondition"), postconditionText()); -- activityElement.setAttribute(QLatin1String("activitytype"), m_activityType); -- qElement.appendChild(activityElement); --} -- --/** -- * Overrides Method from UMLWidget. -- */ --void ActivityWidget::constrain(qreal& width, qreal& height) --{ -- if (m_activityType == Normal || m_activityType == Invok || m_activityType == Param) { -- UMLWidget::constrain(width, height); -- return; -- } -- -- if (width > height) -- width = height; -- else if (height > width) -- height = width; -- -- UMLWidget::constrain(width, height); --} -- --/** -- * Captures any popup menu signals for menus it created. -- */ --void ActivityWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- -- switch(sel) { -- case ListPopupMenu::mt_Rename: -- { -- bool ok = false; -- QString n = name(); --#if QT_VERSION >= 0x050000 -- n = QInputDialog::getText(Q_NULLPTR, -- i18n("Enter Activity Name"), -- i18n("Enter the name of the new activity:"), -- QLineEdit::Normal, -- n, &ok); --#else -- n = KInputDialog::getText(i18n("Enter Activity Name"), -- i18n("Enter the name of the new activity:"), -- n, &ok); --#endif -- if (ok && !n.isEmpty()) { -- setName(n); -- } -- } -- break; -- -- case ListPopupMenu::mt_Properties: -- showPropertiesDialog(); -- break; -- -- default: -- UMLWidget::slotMenuSelection(action); -- } --} -- --/** -- * Overrides method from UMLWidget -- */ --QSizeF ActivityWidget::minimumSize() const --{ -- if (m_activityType == Normal || m_activityType == Invok || m_activityType == Param) { -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- -- int textWidth = fm.width(name()); -- int height = fontHeight; -- height = height > ACTIVITY_HEIGHT ? height : ACTIVITY_HEIGHT; -- height += ACTIVITY_MARGIN * 2; -- -- textWidth = textWidth > ACTIVITY_WIDTH ? textWidth : ACTIVITY_WIDTH; -- -- if (m_activityType == Invok) { -- height += 40; -- } else if (m_activityType == Param) { -- QString maxSize; -- -- maxSize = name().length() > postconditionText().length() ? name() : postconditionText(); -- maxSize = maxSize.length() > preconditionText().length() ? maxSize : preconditionText(); -- -- textWidth = fm.width(maxSize); -- textWidth = textWidth + 50; -- height += 100; -- } -- -- int width = textWidth > ACTIVITY_WIDTH ? textWidth : ACTIVITY_WIDTH; -- -- width += ACTIVITY_MARGIN * 4; -- return QSizeF(width, height); -- } -- else if (m_activityType == Branch) { -- return QSizeF(20, 20); -- } -- return QSizeF(15, 15); --} -- --/** -- * Overrides method from UMLWidget -- */ --QSizeF ActivityWidget::maximumSize() --{ -- if (m_activityType == Normal || m_activityType == Invok || m_activityType == Param) { -- return UMLWidget::maximumSize(); -- } -- if (m_activityType == Branch) { -- return QSizeF(50, 50); -- } -- return QSizeF(30, 30); --} -- -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/activitywidget.h umbrello-kf6-15.08.1/umbrello/widgets/activitywidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/activitywidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/activitywidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,98 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ACTIVITYWIDGET_H --#define ACTIVITYWIDGET_H -- --#include "umlwidget.h" --#include "worktoolbar.h" -- --#define ACTIVITY_MARGIN 5 --#define ACTIVITY_WIDTH 30 --#define ACTIVITY_HEIGHT 10 -- --/** -- * This class is the graphical version of a UML Activity. A ActivityWidget is created -- * by a @ref UMLView. An ActivityWidget belongs to only one @ref UMLView instance. -- * When the @ref UMLView instance that this class belongs to, it will be automatically deleted. -- * -- * The ActivityWidget class inherits from the @ref UMLWidget class which adds most of the functionality -- * to this class. -- * -- * @short A graphical version of a UML Activity. -- * @author Paul Hensgen -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class ActivityWidget : public UMLWidget --{ -- Q_OBJECT -- Q_ENUMS(ActivityType) --public: -- enum ActivityType -- { -- Initial = 0, -- Normal, -- End, -- Final, -- Branch, -- Invok, -- Param -- }; -- -- explicit ActivityWidget(UMLScene * scene, ActivityType activityType = Normal, Uml::ID::Type id = Uml::ID::None); -- virtual ~ActivityWidget(); -- -- ActivityType activityType() const; -- QString activityTypeStr() const; -- void setActivityType(ActivityType activityType); -- -- static bool isActivity(WorkToolBar::ToolBar_Buttons tbb, -- ActivityType& resultType); -- -- QString preconditionText() const; -- void setPreconditionText(const QString&); -- -- QString postconditionText() const; -- void setPostconditionText(const QString&); -- -- virtual void showPropertiesDialog(); -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- virtual void moveWidgetBy(qreal diffX, qreal diffY); -- -- virtual bool loadFromXMI(QDomElement & qElement); -- virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- -- void constrain(qreal& width, qreal& height); -- --signals: -- /** -- * Emitted when the activity widget is moved. -- * Provides the delta X and delta Y amount by which the widget was moved -- * relative to the previous position. -- * Slots into PinWidget::slotActMoved() -- * @param diffX The difference between previous and new X value. -- * @param diffY The difference between previous and new Y value. -- */ -- void sigActMoved(qreal diffX, qreal diffY); -- --public Q_SLOTS: -- virtual void slotMenuSelection(QAction* action); -- --protected: -- virtual QSizeF minimumSize() const; -- virtual QSizeF maximumSize(); -- -- ActivityType m_activityType; ///< Type of activity. -- -- QString m_preconditionText; -- QString m_postconditionText; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/actorwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/actorwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/actorwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/actorwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,104 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header file --#include "actorwidget.h" -- --// local includes --#include "actor.h" --#include "umlview.h" -- --/** -- * Constructs an ActorWidget. -- * -- * @param scene The parent of this ActorWidget. -- * @param a The Actor class this ActorWidget will display. -- */ --ActorWidget::ActorWidget(UMLScene * scene, UMLActor *a) -- : UMLWidget(scene, WidgetBase::wt_Actor, a) --{ -- setFixedAspectRatio(true); --} -- --/** -- * Destructor. -- */ --ActorWidget::~ActorWidget() --{ --} -- --/** -- * Overrides the standard paint event. -- */ --void ActorWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- UMLWidget::setPenFromSettings(painter); -- if(UMLWidget::useFillColor()) -- painter->setBrush(UMLWidget::fillColor()); -- const int w = width(); -- const int h = height(); -- painter->setFont(UMLWidget::font()); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- bool drawStereotype = umlObject() && !umlObject()->stereotype().isEmpty(); -- const int a_height = h - (drawStereotype ? 2 * fontHeight : fontHeight) - A_MARGIN; -- const int h2 = a_height / 2; -- const int a_width = (h2); -- const int middleX = w / 2; -- const int thirdY = a_height / 3; -- -- //draw actor -- painter->drawEllipse(middleX - a_width / 2, 0, a_width, thirdY); //head -- painter->drawLine(middleX, thirdY, -- middleX, thirdY * 2); //body -- painter->drawLine(middleX, 2 * thirdY, -- middleX - a_width / 2, a_height); //left leg -- painter->drawLine(middleX, 2 * thirdY, -- middleX + a_width / 2, a_height); //right leg -- painter->drawLine(middleX - a_width / 2, thirdY + thirdY / 2, -- middleX + a_width / 2, thirdY + thirdY / 2); //arms -- //draw text -- painter->setPen(textColor()); -- if (drawStereotype) -- painter->drawText(A_MARGIN, h - 2 * fontHeight, w - A_MARGIN * 2, fontHeight, Qt::AlignCenter, umlObject()->stereotype(true)); -- painter->drawText(A_MARGIN, h - fontHeight, -- w - A_MARGIN * 2, fontHeight, Qt::AlignCenter, name()); -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Saves the widget to the "actorwidget" XMI element. -- * Note: For loading from XMI, the inherited parent method is used. -- */ --void ActorWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement actorElement = qDoc.createElement(QLatin1String("actorwidget")); -- UMLWidget::saveToXMI(qDoc, actorElement); -- qElement.appendChild(actorElement); --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF ActorWidget::minimumSize() const --{ -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- const int textWidth = fm.width(name()); -- bool drawStereotype = umlObject() && !umlObject()->stereotype().isEmpty(); -- int width = textWidth > A_WIDTH ? textWidth : A_WIDTH; -- int height = A_HEIGHT + (drawStereotype ? 2 * fontHeight : fontHeight) + A_MARGIN; -- width += A_MARGIN * 2; -- return QSizeF(width, height); --} -- -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/actorwidget.h umbrello-kf6-15.08.1/umbrello/widgets/actorwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/actorwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/actorwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,55 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ACTORWIDGET_H --#define ACTORWIDGET_H -- --#include "umlwidget.h" -- --#define A_WIDTH 20 --#define A_HEIGHT 40 --#define A_MARGIN 5 -- --class UMLActor; -- --/** -- * This class is the graphical version of a UML Actor. -- * An ActorWidget is created by a @ref UMLView. An ActorWidget belongs to only -- * one @ref UMLView instance. -- * When the @ref UMLView instance that this class belongs to is destroyed, the -- * ActorWidget will be automatically deleted. -- * -- * If the UMLActor class that this ActorWidget is displaying is deleted, the -- * @ref UMLView will make sure that this instance is also deleted. -- * -- * The ActorWidget class inherits from the @ref UMLWidget class -- * which adds most of the functionality to this class. -- * -- * @short A graphical version of a UML Actor. -- * @author Paul Hensgen -- * @see UMLWidget -- * @see UMLView -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class ActorWidget : public UMLWidget --{ --public: -- ActorWidget(UMLScene * scene, UMLActor *o); -- virtual ~ActorWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- --protected: -- QSizeF minimumSize() const; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/artifactwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/artifactwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/artifactwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/artifactwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,293 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "artifactwidget.h" -- --// app includes --#include "artifact.h" --#include "debug_utils.h" --#include "umlscene.h" --#include "umlview.h" -- --/** -- * Constructs a ArtifactWidget. -- * -- * @param scene The parent of this ArtifactWidget. -- * @param a The Artifact this widget will be representing. -- */ --ArtifactWidget::ArtifactWidget(UMLScene *scene, UMLArtifact *a) -- : UMLWidget(scene, WidgetBase::wt_Artifact, a) --{ -- setSize(100, 30); --} -- --/** -- * Destructor. -- */ --ArtifactWidget::~ArtifactWidget() --{ --} -- --/** -- * Reimplemented to paint the articraft widget. Some part of specific -- * drawing is delegeted to private method like drawAsFile.. -- */ --void ArtifactWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- UMLWidget::setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) { -- painter->setBrush(UMLWidget::fillColor()); -- } else { -- painter->setBrush(m_scene->backgroundColor()); -- } -- -- if (umlObject()) { -- UMLArtifact *umlart = static_cast(m_umlObject); -- UMLArtifact::Draw_Type drawType = umlart->getDrawAsType(); -- switch (drawType) { -- case UMLArtifact::defaultDraw: -- paintAsNormal(painter, option); -- break; -- case UMLArtifact::file: -- paintAsFile(painter, option); -- break; -- case UMLArtifact::library: -- paintAsLibrary(painter, option); -- break; -- case UMLArtifact::table: -- paintAsTable(painter, option); -- break; -- default: -- uWarning() << "Artifact drawn as unknown type"; -- break; -- } -- } -- else { -- uWarning() << "Cannot draw as there is no UMLArtifact for this widget."; -- } --} -- --/** -- * Reimplemented from WidgetBase::saveToXMI to save the widget to -- * the "artifactwidget" XMI element. -- */ --void ArtifactWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement conceptElement = qDoc.createElement(QLatin1String("artifactwidget")); -- UMLWidget::saveToXMI(qDoc, conceptElement); -- qElement.appendChild(conceptElement); --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF ArtifactWidget::minimumSize() const --{ -- if (!m_umlObject) { -- return UMLWidget::minimumSize(); -- } -- UMLArtifact *umlart = static_cast(m_umlObject); -- if (umlart->getDrawAsType() == UMLArtifact::defaultDraw) { -- return calculateNormalSize(); -- } else { -- return calculateIconSize(); -- } --} -- --/** -- * calculates the size when drawing as an icon (it's the same size for all icons) -- */ --QSize ArtifactWidget::calculateIconSize() const --{ -- const QFontMetrics &fm = getFontMetrics(FT_BOLD_ITALIC); -- const int fontHeight = fm.lineSpacing(); -- -- int width = fm.width(m_umlObject->name()); -- -- width = width<50 ? 50 : width; -- -- int height = 50 + fontHeight; -- -- return QSize(width, height); --} -- --/** -- * calculates the size for drawing as a box -- */ --QSize ArtifactWidget::calculateNormalSize() const --{ -- const QFontMetrics &fm = getFontMetrics(FT_BOLD_ITALIC); -- const int fontHeight = fm.lineSpacing(); -- -- int width = fm.width(m_umlObject->name()); -- -- int tempWidth = 0; -- if(!m_umlObject->stereotype().isEmpty()) { -- tempWidth = fm.width(m_umlObject->stereotype(true)); -- } -- width = tempWidth>width ? tempWidth : width; -- width += ARTIFACT_MARGIN * 2; -- -- int height = (2*fontHeight) + (ARTIFACT_MARGIN * 2); -- -- return QSize(width, height); --} -- --/** -- * draw as a file icon -- */ --void ArtifactWidget::paintAsFile(QPainter *painter, const QStyleOptionGraphicsItem *option) --{ -- const int w = width(); -- const int h = height(); -- QFont font = UMLWidget::font(); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- -- int startX = (w/2) - 25; -- int iconHeight = h - fontHeight; -- QPolygon pointArray(5); -- pointArray.setPoint(0, startX, 0); -- pointArray.setPoint(1, startX + 40, 0); -- pointArray.setPoint(2, startX + 50, 10); -- pointArray.setPoint(3, startX + 50, iconHeight); -- pointArray.setPoint(4, startX, iconHeight); -- painter->drawPolygon(pointArray); -- -- painter->drawLine(startX + 40, 0, startX + 40, 10); -- painter->drawLine(startX + 40, 10, startX + 50, 10); -- painter->drawLine(startX + 40, 0, startX + 50, 10); -- -- painter->setPen(textColor()); -- painter->setFont(font); -- -- painter->drawText(0, h - fontHeight, -- w, fontHeight, Qt::AlignCenter, name()); -- -- UMLWidget::paint(painter, option); --} -- --/** -- * draw as a library file icon -- */ --void ArtifactWidget::paintAsLibrary(QPainter *painter, const QStyleOptionGraphicsItem *option) --{ -- //FIXME this should have gears on it -- const int w = width(); -- const int h = height(); -- const QFont font = UMLWidget::font(); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- -- const int startX = (w/2) - 25; -- const int iconHeight = h - fontHeight; -- QPolygon pointArray(5); -- pointArray.setPoint(0, startX, 0); -- pointArray.setPoint(1, startX + 40, 0); -- pointArray.setPoint(2, startX + 50, 10); -- pointArray.setPoint(3, startX + 50, iconHeight); -- pointArray.setPoint(4, startX, iconHeight); -- painter->drawPolygon(pointArray); -- -- painter->drawLine(startX + 40, 0, startX + 40, 10); -- painter->drawLine(startX + 40, 10, startX + 50, 10); -- painter->drawLine(startX + 40, 0, startX + 50, 10); -- -- painter->setPen(textColor()); -- painter->setFont(font); -- -- painter->drawText(0, h - fontHeight, -- w, fontHeight, Qt::AlignCenter, name()); -- -- UMLWidget::paint(painter, option); --} -- --/** -- * draw as a database table icon -- */ --void ArtifactWidget::paintAsTable(QPainter *painter, const QStyleOptionGraphicsItem *option) --{ -- const int w = width(); -- const int h = height(); -- const QFont font = UMLWidget::font(); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- -- const int startX = (w/2) - 25; -- const int iconHeight = h - fontHeight; -- -- painter->drawRect(startX, 0, 50, h - fontHeight + 1); -- painter->drawLine(startX + 20, 0, startX + 20, iconHeight); -- painter->drawLine(startX + 30, 0, startX + 30, iconHeight); -- painter->drawLine(startX + 40, 0, startX + 40, iconHeight); -- painter->drawLine(startX, (iconHeight/2), startX + 49, (iconHeight/2)); -- painter->drawLine(startX, (iconHeight/2) + (iconHeight/4), -- startX + 49, (iconHeight/2) + (iconHeight/4)); -- -- QPen thickerPen = painter->pen(); -- thickerPen.setWidth(2); -- painter->setPen(thickerPen); -- painter->drawLine(startX + 10, 0, startX + 10, iconHeight); -- painter->drawLine(startX, (iconHeight/4), startX + 50, (iconHeight/4)); -- -- painter->setPen(textColor()); -- painter->setFont(font); -- -- painter->drawText(0, h - fontHeight, -- w, fontHeight, Qt::AlignCenter, name()); -- -- UMLWidget::paint(painter, option); --} -- --/** -- * draw as a box -- */ --void ArtifactWidget::paintAsNormal(QPainter *painter, const QStyleOptionGraphicsItem *option) --{ -- int w = width(); -- int h = height(); -- QFont font = UMLWidget::font(); -- font.setBold(true); -- const QFontMetrics &fm = getFontMetrics(FT_BOLD); -- const int fontHeight = fm.lineSpacing(); -- QString stereotype = m_umlObject->stereotype(); -- -- painter->drawRect(0, 0, w, h); -- -- painter->setPen(textColor()); -- painter->setFont(font); -- -- if (!stereotype.isEmpty()) { -- painter->drawText(ARTIFACT_MARGIN, (h/2) - fontHeight, -- w, fontHeight, Qt::AlignCenter, m_umlObject->stereotype(true)); -- } -- -- int lines; -- if (!stereotype.isEmpty()) { -- lines = 2; -- } else { -- lines = 1; -- } -- -- if (lines == 1) { -- painter->drawText(0, (h/2) - (fontHeight/2), -- w, fontHeight, Qt::AlignCenter, name()); -- } else { -- painter->drawText(0, (h/2), -- w, fontHeight, Qt::AlignCenter, name()); -- } -- -- UMLWidget::paint(painter, option); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/artifactwidget.h umbrello-kf6-15.08.1/umbrello/widgets/artifactwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/artifactwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/artifactwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,55 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ARTIFACTWIDGET_H --#define ARTIFACTWIDGET_H -- --#include "umlwidget.h" -- --class UMLScene; --class UMLArtifact; -- --#define ARTIFACT_MARGIN 5 -- --/** -- * Defines a graphical version of the @ref UMLArtifact. -- * Most of the functionality will come from the @ref UMLWidget class. -- * -- * @short A graphical version of a Artifact. -- * @author Jonathan Riddell -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class ArtifactWidget : public UMLWidget --{ --public: -- ArtifactWidget(UMLScene *scene, UMLArtifact *a); -- virtual ~ArtifactWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- // Note: For loading from XMI, the inherited parent method is used. -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- --protected: -- QSizeF minimumSize() const; -- --private: -- void paintAsFile(QPainter *painter, const QStyleOptionGraphicsItem *option); -- void paintAsLibrary(QPainter *painter, const QStyleOptionGraphicsItem *option); -- void paintAsTable(QPainter *painter, const QStyleOptionGraphicsItem *option); -- void paintAsNormal(QPainter *painter, const QStyleOptionGraphicsItem *option); -- -- QSize calculateIconSize() const; -- QSize calculateNormalSize() const; -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/associationline.cpp umbrello-kf6-15.08.1/umbrello/widgets/associationline.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/associationline.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/associationline.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,1404 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "associationline.h" -- --// application includes --#include "associationwidget.h" --#include "debug_utils.h" --#include "umlwidget.h" -- --// qt includes --#include --#include -- --// system includes --#include --#include -- --DEBUG_REGISTER_DISABLED(AssociationLine) -- --// Initialize static variables. --const qreal AssociationLine::Delta = 5; --const qreal AssociationLine::SelectedPointDiameter = 4; --const qreal AssociationLine::SelfAssociationMinimumHeight = 30; -- --/** -- * Constructor. -- * Constructs an AssociationLine item with its parent being \a parent. -- */ --AssociationLine::AssociationLine(AssociationWidget *association) -- : QGraphicsObject(association), -- m_associationWidget(association), -- m_activePointIndex(-1), -- m_activeSegmentIndex(-1), -- m_startSymbol(0), -- m_endSymbol(0), -- m_subsetSymbol(0), -- m_collaborationLineItem(0), -- m_collaborationLineHead(0), -- m_layout(Polyline) --{ -- Q_ASSERT(association); -- setFlag(QGraphicsLineItem::ItemIsSelectable); -- setAcceptHoverEvents(true); -- setZValue(3); --} -- --/** -- * Destructor. -- */ --AssociationLine::~AssociationLine() --{ --} -- --/** -- * Returns the point at the point index. -- * @return point at given index -- */ --QPointF AssociationLine::point(int index) const --{ -- if ((index < 0) | (index >= m_points.size())) { -- uWarning() << "Index " << index << " out of range [0.." << m_points.size() - 1 << "]."; -- return QPointF(-1.0, -1.0); -- } -- return m_points.at(index); --} -- --/** -- * Sets the point value at given index to \a point. -- */ --bool AssociationLine::setPoint(int index, const QPointF &point) --{ -- if ((index < 0) | (index >= m_points.size())) { -- uWarning() << "Index " << index << " out of range [0.." << m_points.size() - 1 << "]."; -- return false; -- } -- if (m_points.at(index) == point) { -- return false; // nothing to change -- } -- prepareGeometryChange(); -- m_points[index] = point; -- alignSymbols(); -- return true; --} -- --/** -- * Shortcut for point(0). -- */ --QPointF AssociationLine::startPoint() const --{ -- return m_points.at(0); --} -- --/** -- * Shortcut for end point. -- */ --QPointF AssociationLine::endPoint() const --{ -- return m_points.at(m_points.size()-1); --} -- --/** -- * Inserts the passed in \a point at the \a index passed in and -- * recalculates the bounding rect. -- */ --void AssociationLine::insertPoint(int index, const QPointF &point) --{ -- prepareGeometryChange(); -- m_points.insert(index, point); -- alignSymbols(); --} -- --/** -- * Removes the point at \a index passed in. -- * @see removeNonEndPoint -- */ --void AssociationLine::removePoint(int index) --{ -- prepareGeometryChange(); -- m_points.remove(index); -- alignSymbols(); --} -- --/** -- * Returns the amount of POINTS on the line. -- * Includes start and end points. -- * @return number of points in the AssociationLine -- */ --int AssociationLine::count() const --{ -- return m_points.size(); --} -- --/** -- * Removes all the points and signals a geometry update. -- */ --void AssociationLine::cleanup() --{ -- if (!m_points.isEmpty()) { -- prepareGeometryChange(); -- m_points.clear(); -- alignSymbols(); -- } --} -- --/** -- * This method optimizes the number of points in the -- * AssociationLine. This can be used to reduce the clutter caused -- * due to too many points. -- * TODO: Use delta comparison 'closestPointIndex' instead of exact comparison. -- * TODO: Not used anywhere. -- */ --void AssociationLine::optimizeLinePoints() --{ -- int i = 1; -- prepareGeometryChange(); -- while (i < m_points.size()) { -- if (m_points.at(i) == m_points.at(i-1)) { -- m_points.remove(i); -- } -- else { -- ++i; -- } -- } -- alignSymbols(); --} -- --/** -- * Return index of point closer a given delta. -- * -- * @param point The point which is to be tested for closeness. -- * @param delta The distance the point should be closer to. -- * -- * @retval "Index" of the first line point closer to the \a point passed. -- * @retval -1 If no line point is closer to passed in \a point. -- */ --int AssociationLine::closestPointIndex(const QPointF &point, qreal delta) const --{ -- for(int i = 0; i < m_points.size(); ++i) { -- const QPointF& linePoint = m_points.at(i); -- // Apply distance formula to see point closeness. -- qreal deltaXSquare = (point.x() - linePoint.x()) * (point.x() - linePoint.x()); -- qreal deltaYSquare = (point.y() - linePoint.y()) * (point.y() - linePoint.y()); -- -- qreal lhs = deltaXSquare + deltaYSquare; -- qreal rhs = delta * delta; -- -- if (lhs <= rhs) { -- return i; -- } -- } -- return -1; --} -- --/** -- * Return index of closest segment. -- * -- * @param point The point which is to be tested for closeness. -- * -- * @return Index of the line segment closest to the \a point passed; -- * -1 if no line segment is closer to passed in \a point. -- */ --int AssociationLine::closestSegmentIndex(const QPointF &point, qreal delta) const --{ -- QPainterPathStroker stroker; -- stroker.setWidth(delta); -- -- for(int i = 1; i < m_points.size(); ++i) { -- QLineF segment(m_points[i-1], m_points[i]); -- -- QPainterPath path; -- path.moveTo(segment.p1()); -- path.lineTo(segment.p2()); -- -- path = stroker.createStroke(path); -- -- if (path.contains(point)) { -- return i-1; -- } -- } -- return -1; --} -- --/** -- * Retval True If point at \a index is start or end. -- */ --bool AssociationLine::isEndPointIndex(int index) const --{ -- const int size = m_points.size(); -- Q_ASSERT(index >= 0 && index < size); -- -- return (index == 0 || index == (size - 1)); --} -- --/** -- * Retval True If segment at \a index is start or end. -- */ --bool AssociationLine::isEndSegmentIndex(int index) const --{ -- // num of seg = num of points - 1 -- const int size = m_points.size() - 1; -- Q_ASSERT(index >= 0 && index < size); -- -- return (index == 0 || index == (size - 1)); --} -- --/** -- * Sets the start and end points. -- */ --bool AssociationLine::setEndPoints(const QPointF &start, const QPointF &end) --{ -- const int size = m_points.size(); -- -- prepareGeometryChange(); -- -- if (size == 0) { -- m_points.insert(0, start); -- m_points.insert(1, end); -- } -- else if (size == 1) { -- m_points[0] = start; -- m_points.insert(1, end); -- } -- else { -- m_points[0] = start; -- m_points[size-1] = end; -- } -- -- alignSymbols(); -- return true; --} -- --/** -- * Debug helper method to write out the points. -- */ --void AssociationLine::dumpPoints() --{ -- for (int i = 1; i < m_points.size(); ++i) { -- QPointF p = m_points.at(i); -- DEBUG(DBG_SRC) << i << ". point x:" << p.x() << " / y:" << p.y(); -- } --} -- --/** -- * Loads AssociationLine information saved in \a qElement XMI element. -- */ --bool AssociationLine::loadFromXMI(QDomElement &qElement) --{ -- QString layout = qElement.attribute(QLatin1String("layout"), QLatin1String("polyline")); -- m_layout = fromString(layout); -- -- QDomNode node = qElement.firstChild(); -- -- m_points.clear(); -- -- QDomElement startElement = node.toElement(); -- if(startElement.isNull() || startElement.tagName() != QLatin1String("startpoint")) { -- return false; -- } -- QString x = startElement.attribute(QLatin1String("startx"), QLatin1String("0")); -- qreal nX = x.toFloat(); -- QString y = startElement.attribute(QLatin1String("starty"), QLatin1String("0")); -- qreal nY = y.toFloat(); -- QPointF startPoint(nX, nY); -- -- node = startElement.nextSibling(); -- QDomElement endElement = node.toElement(); -- if(endElement.isNull() || endElement.tagName() != QLatin1String("endpoint")) { -- return false; -- } -- x = endElement.attribute(QLatin1String("endx"), QLatin1String("0")); -- nX = x.toFloat(); -- y = endElement.attribute(QLatin1String("endy"), QLatin1String("0")); -- nY = y.toFloat(); -- QPointF endPoint(nX, nY); -- setEndPoints(startPoint, endPoint); -- QPointF point; -- node = endElement.nextSibling(); -- QDomElement element = node.toElement(); -- int i = 1; -- while(!element.isNull()) { -- if(element.tagName() == QLatin1String("point")) { -- x = element.attribute(QLatin1String("x"), QLatin1String("0")); -- y = element.attribute(QLatin1String("y"), QLatin1String("0")); -- point.setX(x.toFloat()); -- point.setY(y.toFloat()); -- insertPoint(i++, point); -- } -- node = element.nextSibling(); -- element = node.toElement(); -- } -- -- return true; --} -- --/** -- * Saves association line information into XMI element named "linepath". -- * @note Stored as linepath for backwared compatibility -- */ --void AssociationLine::saveToXMI(QDomDocument &qDoc, QDomElement &qElement) --{ -- QPointF point = m_associationWidget->mapToScene(startPoint()); -- QDomElement lineElement = qDoc.createElement(QLatin1String("linepath")); -- lineElement.setAttribute(QLatin1String("layout"), toString(m_layout)); -- QDomElement startElement = qDoc.createElement(QLatin1String("startpoint")); -- startElement.setAttribute(QLatin1String("startx"), point.x()); -- startElement.setAttribute(QLatin1String("starty"), point.y()); -- lineElement.appendChild(startElement); -- QDomElement endElement = qDoc.createElement(QLatin1String("endpoint")); -- point = m_associationWidget->mapToScene(endPoint()); -- endElement.setAttribute(QLatin1String("endx"), point.x()); -- endElement.setAttribute(QLatin1String("endy"), point.y()); -- lineElement.appendChild(endElement); -- for(int i = 1; i < count()-1; ++i) { -- QDomElement pointElement = qDoc.createElement(QLatin1String("point")); -- point = m_associationWidget->mapToScene(this->point(i)); -- pointElement.setAttribute(QLatin1String("x"), point.x()); -- pointElement.setAttribute(QLatin1String("y"), point.y()); -- lineElement.appendChild(pointElement); -- } -- qElement.appendChild(lineElement); --} -- --/** -- * Returns the type of brush to use depending on the type of Association. -- */ --QBrush AssociationLine::brush() const --{ -- QBrush brush(Qt::solid-kf6Pattern); -- Uml::AssociationType::Enum type = m_associationWidget->associationType(); -- if (type == Uml::AssociationType::Aggregation || -- type == Uml::AssociationType::Generalization || -- type == Uml::AssociationType::Realization) { -- brush.setColor(Qt::white); -- } -- if (type == Uml::AssociationType::Composition) { -- brush.setColor(m_associationWidget->lineColor()); -- } -- return brush; --} -- --/** -- * Returns the type of pen to use depending on the type of Association. -- */ --QPen AssociationLine::pen() const --{ -- QPen pen(m_associationWidget->lineColor(), -- m_associationWidget->lineWidth(), -- Qt::solid-kf6Line, -- Qt::RoundCap, -- Qt::RoundJoin); -- Uml::AssociationType::Enum type = m_associationWidget->associationType(); -- if (type == Uml::AssociationType::Dependency || -- type == Uml::AssociationType::Realization || -- type == Uml::AssociationType::Anchor) { -- pen.setStyle(Qt::DashLine); -- } -- return pen; --} -- --/** -- * This method simply ensures presence of two points and -- * adds the needed points for self associations. -- */ --void AssociationLine::calculateInitialEndPoints() --{ -- if (m_associationWidget->isSelf() && count() < 4) { -- for (int i = count(); i < 4; ++i) { -- insertPoint(i, QPointF()); -- } -- UMLWidget *wid = m_associationWidget->widgetForRole(Uml::RoleType::B); -- if (!wid) { -- uError() << "AssociationWidget is partially constructed." -- "UMLWidget for role B is null."; -- return; -- } -- const QRectF rect = m_associationWidget->mapFromScene( -- mapToScene(wid->rect()).boundingRect()).boundingRect(); -- -- qreal l = rect.left() + .25 * rect.width(); -- qreal r = rect.left() + .75 * rect.width(); -- bool drawAbove = rect.top() >= SelfAssociationMinimumHeight; -- qreal y = drawAbove ? rect.top() : rect.bottom(); -- qreal yOffset = SelfAssociationMinimumHeight; -- if (drawAbove) { -- yOffset *= -1.0; -- } -- -- setPoint(0, QPointF(l, y)); -- setPoint(1, QPointF(l, y + yOffset)); -- setPoint(2, QPointF(r, y + yOffset)); -- setPoint(3, QPointF(r, y)); -- } else if (!m_associationWidget->isSelf() && count() < 2) { -- setEndPoints(QPointF(), QPointF()); -- } --} -- --/** -- * This method creates, deletes symbols and collaboration lines based on -- * m_associationWidget->associationType(). -- * -- * Call this method when associationType of m_associationWidget changes. -- */ --void AssociationLine::reconstructSymbols() --{ -- switch( m_associationWidget->associationType() ) { -- case Uml::AssociationType::State: -- case Uml::AssociationType::Activity: -- case Uml::AssociationType::Exception: -- case Uml::AssociationType::UniAssociation: -- case Uml::AssociationType::Dependency: -- setStartSymbol(Symbol::None); -- setEndSymbol(Symbol::OpenArrow); -- removeSubsetSymbol(); -- removeCollaborationLine(); -- break; -- -- case Uml::AssociationType::Relationship: -- setStartSymbol(Symbol::None); -- setEndSymbol(Symbol::CrowFeet); -- removeSubsetSymbol(); -- removeCollaborationLine(); -- break; -- -- case Uml::AssociationType::Generalization: -- case Uml::AssociationType::Realization: -- setStartSymbol(Symbol::None); -- setEndSymbol(Symbol::ClosedArrow); -- removeSubsetSymbol(); -- removeCollaborationLine(); -- break; -- -- case Uml::AssociationType::Composition: -- case Uml::AssociationType::Aggregation: -- setStartSymbol(Symbol::Diamond); -- setEndSymbol(Symbol::None); -- removeSubsetSymbol(); -- removeCollaborationLine(); -- break; -- -- case Uml::AssociationType::Containment: -- setStartSymbol(Symbol::Circle); -- setEndSymbol(Symbol::None); -- removeSubsetSymbol(); -- removeCollaborationLine(); -- break; -- -- case Uml::AssociationType::Child2Category: -- setStartSymbol(Symbol::None); -- setEndSymbol(Symbol::None); -- createSubsetSymbol(); -- removeCollaborationLine(); -- break; -- -- case Uml::AssociationType::Coll_Message_Synchronous: -- case Uml::AssociationType::Coll_Message_Asynchronous: -- case Uml::AssociationType::Coll_Message_Self: -- setStartSymbol(Symbol::None); -- setEndSymbol(Symbol::None); -- removeSubsetSymbol(); -- createCollaborationLine(); -- break; -- -- default: -- break; -- } -- alignSymbols(); --} -- --/** -- * Sets the Symbol to appear at the first line segment to \a symbol. -- * -- * If symbol == Symbol::None , then it deletes the symbol item. -- */ --void AssociationLine::setStartSymbol(Symbol::SymbolType symbolType) --{ -- Q_ASSERT(symbolType != Symbol::Count); -- if (symbolType == Symbol::None) { -- delete m_startSymbol; -- m_startSymbol = 0; -- return; -- } -- -- if (m_startSymbol) { -- m_startSymbol->setSymbolType(symbolType); -- } -- else { -- m_startSymbol = new Symbol(symbolType, m_associationWidget); -- } -- m_startSymbol->setPen(pen()); -- m_startSymbol->setBrush(brush()); --} -- --/** -- * Sets the Symbol to appear at the last line segment to \a symbol. -- * -- * If symbol == Symbol::None , then it deletes the symbol item. -- */ --void AssociationLine::setEndSymbol(Symbol::SymbolType symbolType) --{ -- Q_ASSERT(symbolType != Symbol::Count); -- if (symbolType == Symbol::None) { -- delete m_endSymbol; -- m_endSymbol = 0; -- return; -- } -- -- if (m_endSymbol) { -- m_endSymbol->setSymbolType(symbolType); -- } -- else { -- m_endSymbol = new Symbol(symbolType, m_associationWidget); -- } -- m_endSymbol->setPen(pen()); -- m_endSymbol->setBrush(brush()); --} -- --/** -- * Constructs a new subset symbol. -- */ --void AssociationLine::createSubsetSymbol() --{ -- delete m_subsetSymbol; // recreate -- m_subsetSymbol = new Symbol(Symbol::Subset, m_associationWidget); -- m_subsetSymbol->setPen(pen()); -- m_subsetSymbol->setBrush(brush()); --} -- --/** -- * Removes the subset symbol if it existed by deleting appropriate items. -- */ --void AssociationLine::removeSubsetSymbol() --{ -- delete m_subsetSymbol; -- m_subsetSymbol = 0; --} -- --/** -- * Constructs the open arrow symbol and arrow line, that would represent Collaboration line. -- */ --void AssociationLine::createCollaborationLine() --{ -- const QPen p = pen(); -- -- // recreate -- delete m_collaborationLineItem; -- delete m_collaborationLineHead; -- -- m_collaborationLineItem = new QGraphicsLineItem(m_associationWidget); -- m_collaborationLineItem->setPen(p); -- -- if (m_associationWidget->associationType() == Uml::AssociationType::Coll_Message_Synchronous) { -- m_collaborationLineHead = new Symbol(Symbol::ClosedArrow, m_associationWidget); -- m_collaborationLineHead->setBrush(p.color()); -- } -- else -- m_collaborationLineHead = new Symbol(Symbol::OpenArrow, m_associationWidget); -- m_collaborationLineHead->setPen(p); --} -- --/** -- * Removes collaboration line by deleting the head and line item. -- */ --void AssociationLine::removeCollaborationLine() --{ -- delete m_collaborationLineItem; -- m_collaborationLineItem = 0; -- -- delete m_collaborationLineHead; -- m_collaborationLineHead = 0; --} -- --/** -- * This method aligns both the \b "start" and \b "end" symbols to -- * the current angles of the \b "first" and the \b "last" line -- * segment respectively. -- */ --void AssociationLine::alignSymbols() --{ -- const int sz = m_points.size(); -- if (sz < 2) { -- // cannot align if there is no line (one line = 2 points) -- return; -- } -- -- QList polygons = path().toSubpathPolygons(); -- -- if (m_startSymbol) { -- QPolygonF firstLine = polygons.first(); -- QLineF segment(firstLine.at(1), firstLine.at(0)); -- m_startSymbol->alignTo(segment); -- } -- -- if (m_endSymbol) { -- QPolygonF lastLine = polygons.last(); -- int maxIndex = lastLine.size(); -- QLineF segment(lastLine.at(maxIndex-2), lastLine.at(maxIndex-1)); -- m_endSymbol->alignTo(segment); -- } -- -- if (m_subsetSymbol) { -- QPointF p1 = path().pointAtPercent(0.4); -- QPointF p2 = path().pointAtPercent(0.5); -- QLineF segment(p1, p2); -- m_subsetSymbol->alignTo(segment); -- } -- -- if (m_collaborationLineItem) { -- const qreal distance = 10; -- const int midSegmentIndex = (sz - 1) / 2; -- -- const QPointF a = m_points.at(midSegmentIndex); -- const QPointF b = m_points.at(midSegmentIndex + 1); -- -- if (a == b) -- return; -- -- const QPointF p1 = (a + b) / 2.0; -- const QPointF p2 = (p1 + b) / 2.0; -- -- // Reversed line as we want normal in opposite direction. -- QLineF segment(p2, p1); -- QLineF normal = segment.normalVector().unitVector(); -- normal.setLength(distance); -- -- QLineF actualLine; -- actualLine.setP2(normal.p2()); -- -- normal.translate(p1 - p2); -- actualLine.setP1(normal.p2()); -- -- m_collaborationLineItem->setLine(actualLine); -- m_collaborationLineHead->alignTo(actualLine); -- } --} -- --/** -- * @return The path of the AssociationLine. -- */ --QPainterPath AssociationLine::path() const --{ -- if (m_points.count() > 0) { -- QPainterPath path; -- switch (m_layout) { -- case Direct: -- path.moveTo(m_points.first()); -- path.lineTo(m_points.last()); -- break; -- -- case Spline: -- path = createBezierCurve(m_points); -- break; -- -- case Orthogonal: -- path = createOrthogonalPath(m_points); -- break; -- -- case Polyline: -- default: -- QPolygonF polygon(m_points); -- path.addPolygon(polygon); -- break; -- } -- return path; -- } -- else { -- return QPainterPath(); -- } --} -- --/** -- * The points are used for the bounding rect. The reason is, -- * that for splines the control points are further away from the path. -- * @return The bounding rectangle for the AssociationLine. -- */ --QRectF AssociationLine::boundingRect() const --{ -- QPolygonF polygon(m_points); -- QRectF rect = polygon.boundingRect(); -- const qreal margin(5.0); -- rect.adjust(-margin, -margin, margin, margin); -- return rect; --} -- --/** -- * @return The shape of the AssociationLine. -- */ --QPainterPath AssociationLine::shape() const --{ -- QPainterPathStroker stroker; -- stroker.setWidth(qMax(2*SelectedPointDiameter, pen().widthF()) + 2.0); // allow delta region -- stroker.setCapStyle(Qt::FlatCap); -- return stroker.createStroke(path()); --} -- --/** -- * Convert enum LayoutType to string. -- */ --QString AssociationLine::toString(LayoutType layout) --{ -- return QLatin1String(ENUM_NAME(AssociationLine, LayoutType, layout)); --} -- --/** -- * Convert string to enum LayoutType. -- */ --AssociationLine::LayoutType AssociationLine::fromString(const QString &layout) --{ -- if (layout == QLatin1String("Direct")) -- return Direct; -- if (layout == QLatin1String("Spline")) -- return Spline; -- if (layout == QLatin1String("Orthogonal")) -- return Orthogonal; -- return Polyline; --} -- --/** -- * Return the layout type of the association line. -- * @return the currently used layout -- */ --AssociationLine::LayoutType AssociationLine::layout() const --{ -- return m_layout; --} -- --/** -- * Set the layout type of the association line. -- * @param layout the desired layout to set -- */ --void AssociationLine::setLayout(LayoutType layout) --{ -- prepareGeometryChange(); -- m_layout = layout; -- DEBUG(DBG_SRC) << "new layout = " << toString(m_layout); -- if (m_layout == Spline) { -- createSplinePoints(); -- } -- alignSymbols(); --} -- --/** -- * For a cubic Bezier curve at least four points are needed. -- * If there are less, the missing points will be created. -- * Note: Implementation is only for two points. -- */ --void AssociationLine::createSplinePoints() --{ -- if (m_points.size() == 2) { // create two points -- QPointF p1 = m_points.first(); // start point -- QPointF p2 = m_points.last(); // end point -- qreal dx = p2.x() - p1.x(); -- qreal dy = p2.y() - p1.y(); -- qreal oneThirdX = 0.33 * dx; -- qreal oneThirdY = 0.33 * dy; -- QPointF c1(p1.x() + oneThirdX, // control point 1 -- p1.y() - oneThirdY); -- QPointF c2(p2.x() - oneThirdX, // control point 2 -- p2.y() + oneThirdY); -- insertPoint(1, c1); -- insertPoint(2, c2); -- } -- if (m_points.size() == 3) { // create one point -- // insertPoint(1 or 2, ); -- // Note: For now we use a quadratic Bezier curve in createBezierCurve(...). -- } --} -- --/** -- * Returns a Bézier path from given points. -- * @param points points which define the Bézier curve -- * @return cubic Bézier spline -- */ --QPainterPath AssociationLine::createBezierCurve(QVector points) --{ -- QPainterPath path; -- if (points.size() > 3) { // cubic Bezier curve(s) -- path.moveTo(points.at(0)); -- int i = 1; -- while (i + 2 < points.size()) { -- path.cubicTo(points.at(i), points.at(i+1), points.at(i+2)); -- i += 3; -- } -- while (i < points.size()) { // draw a line if points are not modulo 3 -- path.lineTo(points.at(i)); -- ++i; -- } -- } -- else { -- if (points.size() == 3) { // quadratic Bezier curve -- path.moveTo(points.at(0)); -- path.quadTo(points.at(1), points.at(2)); -- } -- else { // should not be reached -- QPolygonF polygon(points); -- path.addPolygon(polygon); -- } -- } -- return path; --} -- --/** -- * Returns an orthogonal path constructed of vertical and horizontal segments -- * through the given points. -- * @param points base points for the path -- * @return orthogonal path -- */ --QPainterPath AssociationLine::createOrthogonalPath(QVector points) --{ -- QPainterPath path; -- if (points.size() > 1) { -- QPointF start = points.first(); -- QPointF end = points.last(); -- qreal deltaX = fabs(start.x() - end.x()); -- qreal deltaY = fabs(start.y() - end.y()); -- // DEBUG("AssociationLine") << "start=" << start << " / end=" << end -- // << " / deltaX=" << deltaX << " / deltaY=" << deltaY; -- QVector vector; -- for (int i = 0; i < points.size() - 1; ++i) { -- QPointF curr = points.at(i); -- QPointF next = points.at(i+1); -- QPointF center = (next + curr)/2.0; -- -- vector.append(curr); -- if (deltaX < deltaY) { -- // go vertical first -- vector.append(QPointF(curr.x(), center.y())); -- vector.append(QPointF(next.x(), center.y())); -- } -- else { -- // go horizontal first -- vector.append(QPointF(center.x(), curr.y())); -- vector.append(QPointF(center.x(), next.y())); -- } -- vector.append(next); -- } -- -- QPolygonF rectLine(vector); -- path.addPolygon(rectLine); -- } -- else { -- QPolygonF polygon(points); -- path.addPolygon(polygon); -- } -- return path; --} -- --/** -- * Reimplemented from QGraphicsItem::paint. -- * Draws the AssociationLine and also takes care of highlighting active point or line. -- */ --void AssociationLine::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) --{ -- Q_UNUSED(widget) -- QPen _pen = pen(); -- const QColor orig = _pen.color().lighter(); -- QColor invertedColor(orig.green(), orig.blue(), orig.red()); -- if (invertedColor == _pen.color()) { -- // Ensure different color. -- invertedColor.setRed((invertedColor.red() + 50) % 256); -- } -- invertedColor.setAlpha(150); -- -- int sz = m_points.size(); -- if (sz < 1) { -- // not enough points - do nothing -- return; -- } -- -- QPointF savedStart = m_points.first(); -- QPointF savedEnd = m_points.last(); -- -- // modify the m_points array not to include the Symbol, the value depends on Symbol -- if (m_startSymbol) { -- QPointF newStart = m_startSymbol->mapToParent(m_startSymbol->symbolEndPoints().first); -- m_points[0] = newStart; -- } -- -- if (m_endSymbol) { -- QPointF newEnd = m_endSymbol->mapToParent(m_endSymbol->symbolEndPoints().first); -- m_points[sz - 1] = newEnd; -- } -- -- painter->setPen(_pen); -- painter->setBrush(Qt::NoBrush); -- painter->drawPath(path()); -- -- if (option->state & QStyle::State_Selected) { -- // make the association broader in the selected state -- QPainterPathStroker stroker; -- stroker.setWidth(3.0); -- QPainterPath outline = stroker.createStroke(path()); -- QColor shadowColor(Qt::lightGray); -- shadowColor.setAlpha(80); -- QBrush shadowBrush(shadowColor); -- painter->setBrush(shadowBrush); -- painter->setPen(Qt::NoPen); -- painter->drawPath(outline); -- -- // set color for selected painting -- _pen.setColor(Qt::blue); -- QRectF circle(0, 0, SelectedPointDiameter, SelectedPointDiameter); -- painter->setBrush(_pen.color()); -- painter->setPen(Qt::NoPen); -- -- // draw points -- circle.moveCenter(savedStart); -- painter->drawRect(circle); -- for (int i = 1; i < sz-1; ++i) { -- if (i != m_activePointIndex) { -- circle.moveCenter(m_points.at(i)); -- painter->drawRect(circle); -- } -- } -- circle.moveCenter(savedEnd); -- painter->drawRect(circle); -- -- if (m_activePointIndex != -1) { -- painter->setBrush(invertedColor); -- painter->setPen(Qt::NoPen); -- circle.setWidth(1.5*SelectedPointDiameter); -- circle.setHeight(1.5*SelectedPointDiameter); -- circle.moveCenter(m_points.at(m_activePointIndex)); -- painter->drawEllipse(circle); -- } -- else if (m_activeSegmentIndex != -1) { -- if (m_layout == Polyline) { -- painter->setPen(QPen(invertedColor, _pen.widthF() + 1)); -- painter->setBrush(Qt::NoBrush); -- -- QLineF segmentLine(m_points[m_activeSegmentIndex], m_points[m_activeSegmentIndex + 1]); -- painter->drawLine(segmentLine); -- } -- } -- // debug info -- if (Tracer::instance()->isEnabled(QString::fromLatin1(metaObject()->className()))) { -- painter->setPen(Qt::green); -- painter->setBrush(Qt::NoBrush); -- painter->drawPath(shape()); -- painter->setPen(Qt::red); -- painter->drawRect(boundingRect()); -- // origin -- painter->drawLine(-10, 0, 10, 0); -- painter->drawLine(0, -10, 0, 10); -- } -- -- } -- -- // now restore the points array -- m_points[0] = savedStart; -- m_points[sz - 1] = savedEnd; --} -- --/** -- * Determines the active point or segment, the latter being given more priority. -- */ --void AssociationLine::mousePressEvent(QGraphicsSceneMouseEvent *event) --{ -- DEBUG(DBG_SRC) << "at " << event->scenePos(); -- if (event->buttons() & Qt::LeftButton) { -- m_activePointIndex = closestPointIndex(event->scenePos()); -- if (m_activePointIndex != -1 && isEndPointIndex(m_activePointIndex)) { -- // end points are not drawn and hence not active -- m_activePointIndex = -1; -- } -- // calculate only if active point index is -1 -- m_activeSegmentIndex = (m_activePointIndex != -1) ? -1 : closestSegmentIndex(event->scenePos()); -- } -- else if (event->buttons() & Qt::RightButton) { -- DEBUG(DBG_SRC) << "call context menu of association widget at " << event->scenePos(); -- } -- else { -- m_activePointIndex = -1; -- m_activeSegmentIndex = -1; -- } --} -- --/** -- * Moves the point or line if active. -- */ --void AssociationLine::mouseMoveEvent(QGraphicsSceneMouseEvent *event) --{ -- UMLScene* scene = m_associationWidget->umlScene(); -- -- QPointF oldPos = event->scenePos(); -- QPointF newPos( -- scene->snappedX(oldPos.x()), -- scene->snappedY(oldPos.y()) -- ); -- -- // Prevent the moving vertex from disappearing underneath a widget -- // (else there's no way to get it back.) -- UMLWidget *onW = scene->widgetAt(newPos); -- if (onW && onW->baseType() != WidgetBase::wt_Box) { // boxes are transparent -- const qreal pX = newPos.x(); -- const qreal pY = newPos.y(); -- const qreal wX = onW->x(); -- const qreal wY = onW->y(); -- const qreal wWidth = onW->width(); -- const qreal wHeight = onW->height(); -- if (pX > wX && pX < wX + wWidth) { -- const qreal midX = wX + wWidth / 2.0; -- if (pX <= midX) -- newPos.setX(wX); -- else -- newPos.setX(wX + wWidth); -- } -- if (pY > wY && pY < wY + wHeight) { -- const qreal midY = wY + wHeight / 2.0; -- if (pY <= midY) -- newPos.setY(wY); -- else -- newPos.setY(wY + wHeight); -- } -- } -- -- if (m_activePointIndex != -1) { -- // Move a single point (snap behaviour) -- setPoint(m_activePointIndex, newPos); -- } -- else if (m_activeSegmentIndex != -1 && !isEndSegmentIndex(m_activeSegmentIndex)) { -- // Move a segment (between two points, snap behaviour not implemented) -- QPointF delta = event->scenePos() - event->lastScenePos(); -- setPoint(m_activeSegmentIndex, m_points[m_activeSegmentIndex] + delta); -- setPoint(m_activeSegmentIndex + 1, m_points[m_activeSegmentIndex + 1] + delta); -- } --} -- --/** -- * Reset active indices and also push undo command. -- */ --void AssociationLine::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) --{ -- if (event->buttons() & Qt::LeftButton) { -- m_activeSegmentIndex = -1; -- m_activePointIndex = -1; -- } --} -- --/** -- * Calculates the "to be highlighted" point and segment indicies -- * and updates if necessary. -- */ --void AssociationLine::hoverEnterEvent(QGraphicsSceneHoverEvent *event) --{ -- DEBUG(DBG_SRC) << "at " << event->scenePos(); -- int oldPointIndex = m_activePointIndex; -- int oldSegmentIndex = m_activeSegmentIndex; -- -- m_activePointIndex = closestPointIndex(event->scenePos()); -- // End points are not drawn and hence not active. -- if (m_activePointIndex != -1 && isEndPointIndex(m_activePointIndex)) { -- m_activePointIndex = -1; -- } -- // Activate segment index only if point index is -1 -- m_activeSegmentIndex = (m_activePointIndex != -1) ? -1 : closestSegmentIndex(event->scenePos()); -- -- bool isChanged = (oldSegmentIndex != m_activeSegmentIndex || oldPointIndex != m_activePointIndex); -- if (isChanged) { -- m_associationWidget->update(); -- } --} -- --/** -- * Calculates the "to be highlighted" point and segment indicies -- * and updates if necessary. -- */ --void AssociationLine::hoverMoveEvent(QGraphicsSceneHoverEvent *event) --{ -- int oldPointIndex = m_activePointIndex; -- int oldSegmentIndex = m_activeSegmentIndex; -- -- m_activePointIndex = closestPointIndex(event->scenePos()); -- // End points are not drawn and hence not active. -- if (m_activePointIndex != -1 && isEndPointIndex(m_activePointIndex)) { -- m_activePointIndex = -1; -- } -- // Activate segment index only if point index is -1 -- m_activeSegmentIndex = (m_activePointIndex != -1) ? -1 : closestSegmentIndex(event->scenePos()); -- -- bool isChanged = (oldSegmentIndex != m_activeSegmentIndex || oldPointIndex != m_activePointIndex); -- if (isChanged) { -- m_associationWidget->update(); -- } --} -- --/** -- * Reset active indicies and updates. -- */ --void AssociationLine::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) --{ -- DEBUG(DBG_SRC) << "at " << event->scenePos(); -- //Q_UNUSED(event) -- m_activePointIndex = -1; -- m_activeSegmentIndex = -1; -- m_associationWidget->update(); --} -- --//----------------------------------------------------------------------------- -- --/** -- * SymbolEndPoints: -- * The first point is where the AssociationLine's visible line is -- * supposed to end. -- * The second points is where the actual symbol part is to appear. -- */ --Symbol::SymbolProperty Symbol::symbolTable[Count] = --{ -- { -- QRectF(-6, 0, 12, 10), QPainterPath(), QLineF(0, 0, 0, 10), -- SymbolEndPoints(QPointF(0, 10), QPointF(0, 10)) -- }, -- { -- QRectF(-6, 0, 12, 10), QPainterPath(), QLineF(0, 0, 0, 10), -- SymbolEndPoints(QPointF(0, 0), QPointF(0, 10)) -- }, -- { -- QRectF(-6, 0, 12, 10), QPainterPath(), QLineF(0, 0, 0, 10), -- SymbolEndPoints(QPointF(0, 10), QPointF(0, 10)) -- }, -- { -- QRectF(-5, -10, 10, 20), QPainterPath(), QLineF(0, -10, 0, 10), -- SymbolEndPoints(QPointF(0, -10), QPointF(0, 10)) -- }, -- { -- QRectF(-15, -10, 30, 20), QPainterPath(), QLineF(-10, 0, 0, 0), -- SymbolEndPoints(QPointF(0, 0), QPointF(0, 0)) -- }, -- { -- QRectF(-8, -8, 16, 16), QPainterPath(), QLineF(0, -8, 0, 8), -- SymbolEndPoints(QPointF(0, -8), QPointF(0, 8)) -- } -- --}; -- --/** -- * @internal A convenience method to setup shapes of all symbols. -- */ --void Symbol::setupSymbolTable() --{ -- SymbolProperty &openArrow = symbolTable[OpenArrow]; -- if (openArrow.shape.isEmpty()) { -- QRectF rect = openArrow.boundRect; -- // Defines a 'V' shape arrow fitting in the bound rect. -- openArrow.shape.moveTo(rect.topLeft()); -- openArrow.shape.lineTo(rect.center().x(), rect.bottom()); -- openArrow.shape.lineTo(rect.topRight()); -- } -- -- SymbolProperty &closedArrow = symbolTable[ClosedArrow]; -- if (closedArrow.shape.isEmpty()) { -- QRectF rect = closedArrow.boundRect; -- // Defines a 'V' shape arrow fitting in the bound rect. -- closedArrow.shape.moveTo(rect.topLeft()); -- closedArrow.shape.lineTo(rect.center().x(), rect.bottom()); -- closedArrow.shape.lineTo(rect.topRight()); -- closedArrow.shape.lineTo(rect.topLeft()); -- } -- -- SymbolProperty &crowFeet = symbolTable[CrowFeet]; -- if (crowFeet.shape.isEmpty()) { -- QRectF rect = crowFeet.boundRect; -- // Defines a crowFeet fitting in the bound rect. -- QPointF topMid(rect.center().x(), rect.top()); -- -- // left leg -- crowFeet.shape.moveTo(rect.bottomLeft()); -- crowFeet.shape.lineTo(topMid); -- -- // middle leg -- crowFeet.shape.moveTo(rect.center().x(), rect.bottom()); -- crowFeet.shape.lineTo(topMid); -- -- // right leg -- crowFeet.shape.moveTo(rect.bottomRight()); -- crowFeet.shape.lineTo(topMid); -- } -- -- SymbolProperty &diamond = symbolTable[Diamond]; -- if (diamond.shape.isEmpty()) { -- QRectF rect = diamond.boundRect; -- // Defines a 'diamond' shape fitting in the bound rect. -- diamond.shape.moveTo(rect.center().x(), rect.top()); -- diamond.shape.lineTo(rect.left(), rect.center().y()); -- diamond.shape.lineTo(rect.center().x(), rect.bottom()); -- diamond.shape.lineTo(rect.right(), rect.center().y()); -- diamond.shape.lineTo(rect.center().x(), rect.top()); -- } -- -- SymbolProperty &subset = symbolTable[Subset]; -- if (subset.shape.isEmpty()) { -- QRectF rect = subset.boundRect; -- // Defines an arc fitting in bound rect. -- qreal start = 90, span = 180; -- subset.shape.arcMoveTo(rect, start); -- subset.shape.arcTo(rect, start, span); -- } -- -- SymbolProperty &circle = symbolTable[Circle]; -- if (circle.shape.isEmpty()) { -- QRectF rect = circle.boundRect; -- // Defines a circle with a horizontal-vertical cross lines. -- circle.shape.addEllipse(rect); -- -- circle.shape.moveTo(rect.center().x(), rect.top()); -- circle.shape.lineTo(rect.center().x(), rect.bottom()); -- -- circle.shape.moveTo(rect.left(), rect.center().y()); -- circle.shape.lineTo(rect.right(), rect.center().y()); -- } -- --} -- --/** -- * Constructs a Symbol with current symbol being \a symbol and -- * parented to \a parent. -- */ --Symbol::Symbol(SymbolType symbolType, QGraphicsItem *parent) -- : QGraphicsItem(parent), -- m_symbolType(symbolType) --{ -- // ensure SymbolTable is validly initialized -- setupSymbolTable(); --} -- --/** -- * Destructor. -- */ --Symbol::~Symbol() --{ --} -- --/** -- * @return The current symbol being represented. -- */ --Symbol::SymbolType Symbol::symbolType() const --{ -- return m_symbolType; --} -- --/** -- * Sets the current symbol type to \a symbol and updates the geometry. -- */ --void Symbol::setSymbolType(SymbolType symbolType) --{ -- prepareGeometryChange(); // calls update implicitly -- m_symbolType = symbolType; --} -- --/** -- * Draws the current symbol using the QPainterPath stored for the current -- * symbol. -- */ --void Symbol::paint(QPainter *painter, const QStyleOptionGraphicsItem * option, QWidget * widget) --{ -- Q_UNUSED(option) Q_UNUSED(widget) -- painter->setPen(m_pen); -- switch (m_symbolType) { -- case ClosedArrow: -- case CrowFeet: -- case Diamond: -- painter->setBrush(m_brush); -- break; -- default: -- break; -- } -- painter->drawPath(Symbol::symbolTable[m_symbolType].shape); --} -- --/** -- * @return The bound rectangle for this based on current symbol. -- */ --QRectF Symbol::boundingRect() const --{ -- const qreal adj = .5 * m_pen.widthF(); -- return Symbol::symbolTable[m_symbolType].boundRect. -- adjusted(-adj, -adj, adj, adj); --} -- --/** -- * @return The path for this based on current symbol. -- */ --QPainterPath Symbol::shape() const --{ -- QPainterPath path; -- path.addRect(boundingRect()); -- return path; --} -- --/** -- * This method aligns *this* Symbol to the line being -- * passed. That is, it ensures that the axis of this symbol aligns -- * exactly with the \a "to" line passed. -- * -- * Also this item is moved such that the second end point of the -- * SymbolEndPoints for the current symbol *collides* with the second end -- * point of \a "to" line. -- */ --void Symbol::alignTo(const QLineF& to) --{ -- QLineF toMapped(mapFromParent(to.p1()), mapFromParent(to.p2())); -- -- QLineF origAxis = Symbol::symbolTable[m_symbolType].axisLine; -- QLineF translatedAxis = origAxis.translated(toMapped.p2() - origAxis.p2()); -- -- qreal angle = translatedAxis.angleTo(toMapped); -- setRotation(rotation() - angle); -- -- QPointF delta = to.p2() - mapToParent(symbolEndPoints().second); -- moveBy(delta.x(), delta.y()); --} -- --/** -- * @return The end points for the symbol. -- */ --Symbol::SymbolEndPoints Symbol::symbolEndPoints() const --{ -- return Symbol::symbolTable[m_symbolType].endPoints; --} -- --/** -- * @return The pen used to draw symbol. -- */ --QPen Symbol::pen() const --{ -- return m_pen; --} -- --/** -- * Sets the pen used to draw the symbol. -- */ --void Symbol::setPen(const QPen& pen) --{ -- prepareGeometryChange(); -- m_pen = pen; -- if (m_symbolType == ClosedArrow) -- m_pen.setStyle(Qt::solid-kf6Line); --} -- --/** -- * @return The brush used to fill symbol. -- */ --QBrush Symbol::brush() const --{ -- return m_brush; --} -- --/** -- * Sets the brush used to fill symbol. -- */ --void Symbol::setBrush(const QBrush &brush) --{ -- m_brush = brush; -- update(); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/associationline.h umbrello-kf6-15.08.1/umbrello/widgets/associationline.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/associationline.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/associationline.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,207 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ASSOCIATIONLINE_H --#define ASSOCIATIONLINE_H -- --#include "basictypes.h" -- --#include --#include --#include --#include -- --// forward declarations --class AssociationWidget; --class QDomDocument; --class QDomElement; --class QPainter; -- --/** -- * This class provides with various symbols that can be embedded in -- * AssociationLine. It also provides with convenience methods to align -- * the symbol to AssociationLine. -- */ --class Symbol : public QGraphicsItem --{ -- public: -- typedef QPair SymbolEndPoints; -- -- /** -- * This enumeration lists all the symbols that can be used as -- * embedded on AssociationLine. -- */ -- enum SymbolType { -- None = -1, -- OpenArrow, -- ClosedArrow, -- CrowFeet, -- Diamond, -- Subset, -- Circle, -- Count -- }; -- -- explicit Symbol(SymbolType symbolType, QGraphicsItem *parent = 0); -- virtual ~Symbol(); -- -- SymbolType symbolType() const; -- void setSymbolType(SymbolType symbolType); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); -- -- virtual QRectF boundingRect() const; -- virtual QPainterPath shape() const; -- -- void alignTo(const QLineF& line); -- SymbolEndPoints symbolEndPoints() const; -- -- QPen pen() const; -- void setPen(const QPen &pen); -- -- QBrush brush() const; -- void setBrush(const QBrush& brush); -- -- private: -- QPen m_pen; ///< pen used to draw Symbol -- QBrush m_brush; ///< brush used to fill Symbol -- SymbolType m_symbolType; ///< current symbol being represented by this item -- -- /// A structure to hold a table of values for all symbols. -- struct SymbolProperty { -- QRectF boundRect; -- QPainterPath shape; -- QLineF axisLine; -- SymbolEndPoints endPoints; -- }; -- -- static SymbolProperty symbolTable[Symbol::Count]; ///< a table which stores all symbol properties -- static void setupSymbolTable(); --}; -- --/** -- * A convenience class that encapsulates geometry management, handles -- * mouse and hover events, embeds and aligns symbols and finally draws the -- * lines and points. -- * Context menu events are handled in AssociationWidget. -- * -- * This class is infact a draw and event handling proxy for -- * AssociationWidget. -- * -- * @note m_activePointIndex and m_activeSegmentIndex can't be -- * active at same time! -- * -- * @author Gopala Krishna -- * @author Andi Fischer -- * Bugs and comments to uml-devel@lists.sf.net or http://bugs.kde.org -- */ --class AssociationLine : public QGraphicsObject --{ -- Q_OBJECT -- Q_ENUMS(LayoutType) --public: -- enum LayoutType { -- Direct = 1, -- Orthogonal, -- Polyline, -- Spline -- }; -- -- static QString toString(LayoutType layout); -- static LayoutType fromString(const QString& layout); -- -- explicit AssociationLine(AssociationWidget *association); -- virtual ~AssociationLine(); -- -- QPointF point(int index) const; -- bool setPoint(int index, const QPointF& point); -- QPointF startPoint() const; -- QPointF endPoint() const; -- -- void insertPoint(int index, const QPointF& point); -- void removePoint(int index); -- -- int count() const; -- void cleanup(); -- -- void optimizeLinePoints(); -- -- int closestPointIndex(const QPointF& point, qreal delta = Delta) const; -- int closestSegmentIndex(const QPointF& point, qreal delta = Delta) const; -- -- bool isEndPointIndex(int index) const; -- bool isEndSegmentIndex(int index) const; -- -- bool setEndPoints(const QPointF &start, const QPointF &end); -- -- void dumpPoints(); -- -- bool loadFromXMI(QDomElement &qElement); -- void saveToXMI(QDomDocument &qDoc, QDomElement &qElement); -- -- QBrush brush() const; -- QPen pen() const; -- -- virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget); -- -- QPainterPath path() const; -- -- QRectF boundingRect() const; -- QPainterPath shape() const; -- -- LayoutType layout() const; -- void setLayout(LayoutType layout); -- -- void mousePressEvent(QGraphicsSceneMouseEvent *event); -- void mouseMoveEvent(QGraphicsSceneMouseEvent *event); -- void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); -- -- void hoverEnterEvent(QGraphicsSceneHoverEvent *event); -- void hoverMoveEvent(QGraphicsSceneHoverEvent *event); -- void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); -- -- void calculateInitialEndPoints(); -- -- void reconstructSymbols(); -- --private: -- void setStartSymbol(Symbol::SymbolType symbolType); -- void setEndSymbol(Symbol::SymbolType symbolType); -- -- void createSubsetSymbol(); -- void removeSubsetSymbol(); -- -- void createCollaborationLine(); -- void removeCollaborationLine(); -- -- void alignSymbols(); -- -- void createSplinePoints(); -- -- AssociationWidget *m_associationWidget; ///< association widget for which this line represents -- QVector m_points; ///< points representing the association line -- int m_activePointIndex; ///< index of active point which can be dragged to modify association line -- int m_activeSegmentIndex; ///< index of active segment -- Symbol *m_startSymbol; ///< symbol drawn at the end of "first" line segment -- Symbol *m_endSymbol; ///< symbol drawn at the end of "last" line segment -- Symbol *m_subsetSymbol; ///< subset symbol -- QGraphicsLineItem *m_collaborationLineItem; ///< parallel arrow line drawn in case of collaboration message -- Symbol *m_collaborationLineHead; ///< arrow head drawn at end of m_collaborationLineItem -- LayoutType m_layout; -- -- static QPainterPath createBezierCurve(QVector points); -- static QPainterPath createOrthogonalPath(QVector points); -- -- static const qreal Delta; ///< default delta for fuzzy recognition of points closer to point -- static const qreal SelectedPointDiameter; ///< radius of circles drawn to show "selection" -- static const qreal SelfAssociationMinimumHeight; ///< minimum height for self association's loop --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/associationwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/associationwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/associationwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/associationwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,4407 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "associationwidget.h" -- --// app includes --#include "association.h" --#include "associationline.h" --#include "associationpropertiesdialog.h" --#include "assocrules.h" --#include "attribute.h" --#include "classifier.h" --#include "classifierwidget.h" --#include "debug_utils.h" --#include "docwindow.h" --#include "entity.h" --#include "floatingtextwidget.h" --#include "listpopupmenu.h" --#include "messagewidget.h" --#include "objectwidget.h" --#include "operation.h" --#include "optionstate.h" --#include "uml.h" --#include "umldoc.h" --#include "umlscene.h" --#include "umlview.h" --#include "umlwidget.h" --#include "widget_utils.h" -- --// kde includes --#if QT_VERSION < 0x050000 --#include --#include --#include --#endif --#include -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#include --#include --#endif --#include --#include --#include --#include -- --// system includes --#include -- --#define DBG_AW() DEBUG(QLatin1String("AssociationWidget")) --DEBUG_REGISTER_DISABLED(AssociationWidget) -- --using namespace Uml; -- --/** -- * Constructor is private because the static create() methods shall -- * be used for constructing AssociationWidgets. -- * -- * @param scene The parent view of this widget. -- */ --AssociationWidget::AssociationWidget(UMLScene *scene) -- : WidgetBase(scene, WidgetBase::wt_Association), -- m_positions_len(0), -- m_activated(false), -- m_unNameLineSegment(-1), -- m_nLinePathSegmentIndex(-1), -- m_pAssocClassLine(0), -- m_pAssocClassLineSel0(0), -- m_pAssocClassLineSel1(0), -- m_associationLine(new AssociationLine(this)), -- m_associationClass(0), -- m_associationType(Uml::AssociationType::Association), -- m_nameWidget(0) --{ -- // floating text widgets objects owned by this association -- m_role[RoleType::A].changeabilityWidget = 0; -- m_role[RoleType::B].changeabilityWidget = 0; -- m_role[RoleType::A].multiplicityWidget = 0; -- m_role[RoleType::B].multiplicityWidget = 0; -- m_role[RoleType::A].roleWidget = 0; -- m_role[RoleType::B].roleWidget = 0; -- m_role[RoleType::A].umlWidget = 0; -- m_role[RoleType::B].umlWidget = 0; -- -- // associationwidget attributes -- m_role[RoleType::A].m_WidgetRegion = Uml::Region::Error; -- m_role[RoleType::B].m_WidgetRegion = Uml::Region::Error; -- m_role[RoleType::A].m_nIndex = 0; -- m_role[RoleType::B].m_nIndex = 0; -- m_role[RoleType::A].m_nTotalCount = 0; -- m_role[RoleType::B].m_nTotalCount = 0; -- m_role[RoleType::A].visibility = Uml::Visibility::Public; -- m_role[RoleType::B].visibility = Uml::Visibility::Public; -- m_role[RoleType::A].changeability = Uml::Changeability::Changeable; -- m_role[RoleType::B].changeability = Uml::Changeability::Changeable; -- -- setFlag(QGraphicsLineItem::ItemIsSelectable); -- setAcceptHoverEvents(true); --} -- --/** -- * This constructor is really only for loading from XMI, otherwise it -- * should not be allowed as it creates an incomplete associationwidget. -- * -- * @param scene The parent view of this widget. -- */ --AssociationWidget* AssociationWidget::create(UMLScene *scene) --{ -- AssociationWidget* instance = new AssociationWidget(scene); -- return instance; --} -- --/** -- * Preferred constructor (static factory method.) -- * -- * @param scene The parent view of this widget. -- * @param pWidgetA Pointer to the role A widget for the association. -- * @param assocType The AssociationType::Enum for this association. -- * @param pWidgetB Pointer to the role B widget for the association. -- * @param umlobject Pointer to the underlying UMLObject (if applicable.) -- */ --AssociationWidget* AssociationWidget::create -- (UMLScene *scene, UMLWidget* pWidgetA, -- Uml::AssociationType::Enum assocType, UMLWidget* pWidgetB, -- UMLObject *umlobject /* = NULL */) --{ -- AssociationWidget* instance = new AssociationWidget(scene); -- if (umlobject) { -- instance->setUMLObject(umlobject); -- } else { -- // set up UMLAssociation obj if assoc is represented and both roles are UML objects -- if (Uml::AssociationType::hasUMLRepresentation(assocType)) { -- UMLObject* umlRoleA = pWidgetA->umlObject(); -- UMLObject* umlRoleB = pWidgetB->umlObject(); -- if (umlRoleA != NULL && umlRoleB != NULL) { -- bool swap; -- -- // This is not correct. We could very easily have more than one -- // of the same type of association between the same two objects. -- // Just create the association. This search should have been -- // done BEFORE creation of the widget, if it mattered to the code. -- // But lets leave check in here for the time being so that debugging -- // output is shown, in case there is a collision with code elsewhere. -- UMLDoc *doc = UMLApp::app()->document(); -- UMLAssociation *myAssoc = doc->findAssociation(assocType, umlRoleA, umlRoleB, &swap); -- if (myAssoc != NULL) { -- switch (assocType) { -- case Uml::AssociationType::Generalization: -- case Uml::AssociationType::Dependency: -- case Uml::AssociationType::Association_Self: -- case Uml::AssociationType::Coll_Message_Self: -- case Uml::AssociationType::Seq_Message_Self: -- case Uml::AssociationType::Containment: -- case Uml::AssociationType::Realization: -- DBG_AW() << "Ignoring second construction of same assoctype " -- << assocType << " between " << umlRoleA->name() -- << " and " << umlRoleB->name(); -- break; -- default: -- DBG_AW() << "constructing a similar or exact same assoctype " -- << assocType << " between " << umlRoleA->name() << " and " -- << umlRoleB->name() << "as an already existing assoc (swap=" -- << swap << ")"; -- // now, just create a new association anyways -- myAssoc = NULL; -- break; -- } -- } -- if (myAssoc == NULL) { -- myAssoc = new UMLAssociation(assocType, umlRoleA, umlRoleB); -- // CHECK: myAssoc is not yet inserted at any parent UMLPackage - -- // need to check carefully that all callers do this, lest it be -- // orphaned. -- // ToolBarStateAssociation::addAssociationInViewAndDoc() is -- // okay in this regard. -- } -- instance->setUMLAssociation(myAssoc); -- } -- } -- } -- -- instance->setWidgetForRole(pWidgetA, RoleType::A); -- instance->setWidgetForRole(pWidgetB, RoleType::B); -- -- instance->setAssociationType(assocType); -- -- instance->calculateEndingPoints(); -- -- instance->associationLine()->calculateInitialEndPoints(); -- instance->associationLine()->reconstructSymbols(); -- -- //The AssociationWidget is set to Activated because it already has its side widgets -- instance->setActivated(true); -- -- // sync UML meta-data to settings here -- instance->mergeAssociationDataIntoUMLRepresentation(); -- -- // Collaboration messages need a name label because it's that -- // which lets operator== distinguish them, which in turn -- // permits us to have more than one message between two objects. -- if (instance->isCollaboration()) { -- // Create a temporary name to bring on setName() -- int collabID = instance->m_scene->generateCollaborationId(); -- instance->setName(QLatin1Char('m') + QString::number(collabID)); -- } -- -- return instance; --} -- --/** -- * Destructor. -- */ --AssociationWidget::~AssociationWidget() --{ -- delete m_associationLine; --} -- --/** -- * Overriding the method from WidgetBase because we need to do -- * something extra in case this AssociationWidget represents -- * an attribute of a classifier. -- */ --void AssociationWidget::setUMLObject(UMLObject *obj) --{ -- WidgetBase::setUMLObject(obj); -- if (obj == NULL) -- return; -- UMLClassifier *klass = NULL; -- UMLAttribute *attr = NULL; -- UMLEntity *ent = NULL; -- const UMLObject::ObjectType ot = obj->baseType(); -- switch (ot) { -- case UMLObject::ot_Association: -- setUMLAssociation(dynamic_cast(obj)); -- break; -- case UMLObject::ot_Operation: -- setOperation(dynamic_cast(obj)); -- break; -- case UMLObject::ot_Attribute: -- klass = static_cast(obj->parent()); -- connect(klass, SIGNAL(attributeRemoved(UMLClassifierListItem*)), -- this, SLOT(slotClassifierListItemRemoved(UMLClassifierListItem*))); -- attr = static_cast(obj); -- connect(attr, SIGNAL(attributeChanged()), this, SLOT(slotAttributeChanged())); -- break; -- case UMLObject::ot_EntityAttribute: -- ent = static_cast(obj->parent()); -- connect(ent, SIGNAL(entityAttributeRemoved(UMLClassifierListItem*)), -- this, SLOT(slotClassifierListItemRemoved(UMLClassifierListItem*))); -- break; -- case UMLObject::ot_ForeignKeyConstraint: -- ent = static_cast(obj->parent()); -- connect(ent, SIGNAL(entityConstraintRemoved(UMLClassifierListItem*)), -- this, SLOT(slotClassifierListItemRemoved(UMLClassifierListItem*))); -- break; -- default: -- uError() << "cannot associate UMLObject of type " << UMLObject::toString(ot); -- break; -- } --} -- --/** -- * Set all 'owned' child widgets to this font. -- */ --void AssociationWidget::lwSetFont (QFont font) --{ -- if (m_nameWidget) { -- m_nameWidget->setFont(font); -- } -- if (m_role[RoleType::A].roleWidget) { -- m_role[RoleType::A].roleWidget->setFont(font); -- } -- if (m_role[RoleType::B].roleWidget) { -- m_role[RoleType::B].roleWidget->setFont(font); -- } -- if (m_role[RoleType::A].multiplicityWidget) { -- m_role[RoleType::A].multiplicityWidget->setFont(font); -- } -- if (m_role[RoleType::B].multiplicityWidget) { -- m_role[RoleType::B].multiplicityWidget->setFont(font); -- } -- if (m_role[RoleType::A].changeabilityWidget) -- m_role[RoleType::A].changeabilityWidget->setFont(font); -- if (m_role[RoleType::B].changeabilityWidget) -- m_role[RoleType::B].changeabilityWidget->setFont(font); --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- * @todo Move to LinkWidget. -- */ --UMLClassifier *AssociationWidget::operationOwner() --{ -- Uml::RoleType::Enum role = (isCollaboration() ? Uml::RoleType::B : Uml::RoleType::A); -- UMLObject *o = widgetForRole(role)->umlObject(); -- if (!o) { -- return 0; -- } -- UMLClassifier *c = dynamic_cast(o); -- if (!c) { -- uError() << "widgetForRole(" << role << ") is not a classifier"; -- } -- return c; --} -- --/** -- * Implements operation from LinkWidget. -- * Motivated by FloatingTextWidget. -- */ --UMLOperation *AssociationWidget::operation() --{ -- return dynamic_cast(m_umlObject); --} -- --/** -- * Implements operation from LinkWidget. -- * Motivated by FloatingTextWidget. -- */ --void AssociationWidget::setOperation(UMLOperation *op) --{ -- if (m_umlObject) -- disconnect(m_umlObject, SIGNAL(modified()), m_nameWidget, SLOT(setMessageText())); -- m_umlObject = op; -- if (m_umlObject) -- connect(m_umlObject, SIGNAL(modified()), m_nameWidget, SLOT(setMessageText())); -- if (m_nameWidget) -- m_nameWidget->setMessageText(); --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- */ --QString AssociationWidget::customOpText() --{ -- return name(); --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- */ --void AssociationWidget::setCustomOpText(const QString &opText) --{ -- setName(opText); --} -- --/** -- * Calls setTextPosition on all the labels. -- * Overrides operation from LinkWidget. -- */ --void AssociationWidget::resetTextPositions() --{ -- if (m_role[RoleType::A].multiplicityWidget) { -- setTextPosition(TextRole::MultiA); -- } -- if (m_role[RoleType::B].multiplicityWidget) { -- setTextPosition(Uml::TextRole::MultiB); -- } -- if (m_role[RoleType::A].changeabilityWidget) { -- setTextPosition(Uml::TextRole::ChangeA); -- } -- if (m_role[RoleType::B].changeabilityWidget) { -- setTextPosition(Uml::TextRole::ChangeB); -- } -- if (m_nameWidget) { -- setTextPosition(Uml::TextRole::Name); -- } -- if (m_role[RoleType::A].roleWidget) { -- setTextPosition(Uml::TextRole::RoleAName); -- } -- if (m_role[RoleType::B].roleWidget) { -- setTextPosition(Uml::TextRole::RoleBName); -- } --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- * -- * @param ft The text widget which to update. -- */ --void AssociationWidget::setMessageText(FloatingTextWidget *ft) --{ -- if (isCollaboration()) { -- ft->setSequenceNumber(m_SequenceNumber); -- if (m_umlObject != NULL) { -- ft->setText(operationText(m_scene)); -- } else { -- ft->setText(name()); -- } -- } else { -- ft->setText(name()); -- } --} -- --/** -- * Sets the text of the given FloatingTextWidget. -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- */ --void AssociationWidget::setText(FloatingTextWidget *ft, const QString &text) --{ -- Uml::TextRole::Enum role = ft->textRole(); -- switch (role) { -- case Uml::TextRole::Name: -- setName(text); -- break; -- case Uml::TextRole::RoleAName: -- setRoleName(text, RoleType::A); -- break; -- case Uml::TextRole::RoleBName: -- setRoleName(text, RoleType::B); -- break; -- case Uml::TextRole::MultiA: -- setMultiplicity(text, RoleType::A); -- break; -- case Uml::TextRole::MultiB: -- setMultiplicity(text, RoleType::B); -- break; -- default: -- uWarning() << "Unhandled TextRole: " << Uml::TextRole::toString(role); -- break; -- } --} -- --/** -- * Shows the association properties dialog and updates the -- * corresponding texts if its execution is successful. -- */ --void AssociationWidget::showPropertiesDialog() --{ -- UMLApp::app()->docWindow()->updateDocumentation(); -- QPointer dlg = new AssociationPropertiesDialog(static_cast(m_scene->activeView()), this); -- if (dlg->exec()) { -- //rules built into these functions to stop updating incorrect values -- setName(name()); -- -- setRoleName(roleName(RoleType::A), RoleType::A); -- setRoleName(roleName(RoleType::B), RoleType::B); -- -- setDocumentation(documentation()); -- -- setRoleDocumentation(roleDocumentation(RoleType::A), RoleType::A); -- setRoleDocumentation(roleDocumentation(RoleType::B), RoleType::B); -- -- setMultiplicity(multiplicity(RoleType::A), RoleType::A); -- setMultiplicity(multiplicity(RoleType::B), RoleType::B); -- -- setVisibility(visibility(RoleType::A), RoleType::A); -- setVisibility(visibility(RoleType::B), RoleType::B); -- -- setChangeability(changeability(RoleType::A), RoleType::A); -- setChangeability(changeability(RoleType::B), RoleType::B); -- -- UMLApp::app()->docWindow()->showDocumentation(this, true); -- } -- delete dlg; --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- * -- * @param op Return this AssociationWidget's operation string. -- */ --QString AssociationWidget::lwOperationText() --{ -- return name(); --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- * -- * @return classifier -- */ --UMLClassifier* AssociationWidget::lwClassifier() --{ -- UMLObject *o = widgetForRole(RoleType::B)->umlObject(); -- UMLClassifier *c = dynamic_cast(o); -- return c; --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- * -- * @param op The new operation string to set. -- */ --void AssociationWidget::setOperationText(const QString &op) --{ -- if (!op.isEmpty()) { -- setName(op); -- } --} -- --/** -- * Calculates the m_unNameLineSegment value according to the new -- * NameText topleft corner PT. -- * It iterates through all AssociationLine's segments and for each one -- * calculates the sum of PT's distance to the start point + PT's -- * distance to the end point. The segment with the smallest sum will -- * be the RoleTextSegment (if this segment moves then the RoleText -- * will move with it). It sets m_unNameLineSegment to the start point -- * of the chosen segment. -- * -- * Overrides operation from LinkWidget (i.e. this method is also -- * required by FloatingTextWidget.) -- */ --void AssociationWidget::calculateNameTextSegment() --{ -- if (!m_nameWidget) { -- return; -- } -- //changed to use the middle of the text -- //i think this will give a better result. -- //never know what sort of lines people come up with -- //and text could be long to give a false reading -- qreal xt = m_nameWidget->x(); -- qreal yt = m_nameWidget->y(); -- xt += m_nameWidget->width() / 2; -- yt += m_nameWidget->height() / 2; -- int size = m_associationLine->count(); -- //sum of length(PTP1) and length(PTP2) -- qreal total_length = 0; -- qreal smallest_length = 0; -- for (int i = 0; i < size - 1; ++i) { -- QPointF pi = m_associationLine->point( i ); -- QPointF pj = m_associationLine->point( i+1 ); -- qreal xtiDiff = xt - pi.x(); -- qreal xtjDiff = xt - pj.x(); -- qreal ytiDiff = yt - pi.y(); -- qreal ytjDiff = yt - pj.y(); -- total_length = sqrt( double(xtiDiff * xtiDiff + ytiDiff * ytiDiff) ) -- + sqrt( double(xtjDiff * xtjDiff + ytjDiff * ytjDiff) ); -- //this gives the closest point -- if (total_length < smallest_length || i == 0) { -- smallest_length = total_length; -- m_unNameLineSegment = i; -- } -- } --} -- --/** -- * Returns the UMLAssociation representation of this object. -- * -- * @return Pointer to the UMLAssociation that is represented by -- * this AsociationWidget. -- */ --UMLAssociation* AssociationWidget::association() const --{ -- if (m_umlObject == NULL || m_umlObject->baseType() != UMLObject::ot_Association) -- return NULL; -- return static_cast(m_umlObject); --} -- --/** -- * Returns the UMLAttribute representation of this object. -- * -- * @return Pointer to the UMLAttribute that is represented by -- * this AsociationWidget. -- */ --UMLAttribute* AssociationWidget::attribute() const --{ -- if (m_umlObject == NULL) -- return NULL; -- UMLObject::ObjectType ot = m_umlObject->baseType(); -- if (ot != UMLObject::ot_Attribute && ot != UMLObject::ot_EntityAttribute) -- return NULL; -- return static_cast(m_umlObject); --} -- --#if 0 //:TODO: --/** -- * Overrides the assignment operator. -- */ --AssociationWidget& AssociationWidget::operator=(const AssociationWidget& other) --{ -- *m_associationLine = *other.m_associationLine; -- -- if (other.m_nameWidget) { -- m_nameWidget = new FloatingTextWidget(m_scene); -- *m_nameWidget = *(other.m_nameWidget); -- } else { -- m_nameWidget = NULL; -- } -- -- for (unsigned r = (unsigned)A; r <= (unsigned)B; ++r) { -- WidgetRole& lhs = m_role[r]; -- const WidgetRole& rhs = other.m_role[r]; -- lhs.m_nIndex = rhs.m_nIndex; -- lhs.m_nTotalCount = rhs.m_nTotalCount; -- -- if (rhs.multiplicityWidget) { -- lhs.multiplicityWidget = new FloatingTextWidget(m_scene); -- *(lhs.multiplicityWidget) = *(rhs.multiplicityWidget); -- } else { -- lhs.multiplicityWidget = NULL; -- } -- -- if (rhs.roleWidget) { -- lhs.roleWidget = new FloatingTextWidget(m_scene); -- *(lhs.roleWidget) = *(rhs.roleWidget); -- } else { -- lhs.roleWidget = NULL; -- } -- -- if (rhs.changeabilityWidget) { -- lhs.changeabilityWidget = new FloatingTextWidget(m_scene); -- *(lhs.changeabilityWidget) = *(rhs.changeabilityWidget); -- } else { -- lhs.changeabilityWidget = NULL; -- } -- -- lhs.umlWidget = rhs.umlWidget; -- lhs.m_WidgetRegion = rhs.m_WidgetRegion; -- } -- -- m_activated = other.m_activated; -- m_unNameLineSegment = other.m_unNameLineSegment; -- m_pMenu = other.m_pMenu; -- setUMLAssociation(other.association()); -- setSelected(other.isSelected()); -- -- return *this; --} --#endif //:TODO: -- --/** -- * Overrides the equality test operator. -- */ --bool AssociationWidget::operator==(const AssociationWidget& other) const --{ -- if (this == &other) -- return true; -- -- // if no model representation exists, then the widgets are not equal -- if (association() == NULL && other.association() == NULL) -- return false; -- -- if (!m_umlObject || !other.m_umlObject ) { -- if (!other.m_umlObject && m_umlObject) -- return false; -- if (other.m_umlObject && !m_umlObject) -- return false; -- -- } else if (m_umlObject != other.m_umlObject) -- return false; -- -- if (associationType() != other.associationType()) -- return false; -- -- if (widgetIDForRole(RoleType::A) != other.widgetIDForRole(RoleType::A)) -- return false; -- -- if (widgetIDForRole(RoleType::B) != other.widgetIDForRole(RoleType::B)) -- return false; -- -- if (widgetForRole(RoleType::A)->baseType() == WidgetBase::wt_Object && -- other.widgetForRole(RoleType::A)->baseType() == WidgetBase::wt_Object) { -- ObjectWidget *ownA = static_cast(widgetForRole(RoleType::A)); -- ObjectWidget *otherA = static_cast(other.widgetForRole(RoleType::A)); -- if (ownA->localID() != otherA->localID()) -- return false; -- } -- -- if (widgetForRole(RoleType::B)->baseType() == WidgetBase::wt_Object && -- other.widgetForRole(RoleType::B)->baseType() == WidgetBase::wt_Object) { -- ObjectWidget *ownB = static_cast(widgetForRole(RoleType::B)); -- ObjectWidget *otherB = static_cast(other.widgetForRole(RoleType::B)); -- if (ownB->localID() != otherB->localID()) -- return false; -- } -- -- // Two objects in a collaboration can have multiple messages between each other. -- // Here we depend on the messages having names, and the names must be different. -- // That is the reason why collaboration messages have strange initial names like -- // "m29997" or similar. -- return (name() == other.name()); --} -- --/** -- * Overrides the != operator. -- */ --bool AssociationWidget::operator!=(AssociationWidget& other) const --{ -- return !(*this == other); --} -- --/** -- * Returns a pointer to the association widget's line path. -- */ --AssociationLine* AssociationWidget::associationLine() const --{ -- return m_associationLine; --} -- --/** -- * Activates the AssociationWidget after a load. -- * -- * @return true for success -- */ --bool AssociationWidget::activate() --{ -- if (m_umlObject == NULL && -- AssociationType::hasUMLRepresentation(m_associationType)) { -- UMLObject *myObj = umlDoc()->findObjectById(m_nId); -- if (myObj == NULL) { -- uError() << "cannot find UMLObject " << Uml::ID::toString(m_nId); -- return false; -- } else { -- const UMLObject::ObjectType ot = myObj->baseType(); -- if (ot == UMLObject::ot_Association) { -- UMLAssociation * myAssoc = static_cast(myObj); -- setUMLAssociation(myAssoc); -- } else { -- setUMLObject(myObj); -- setAssociationType(m_associationType); -- } -- } -- } -- -- if (m_activated) -- return true; -- -- Uml::AssociationType::Enum type = associationType(); -- -- if (m_role[RoleType::A].umlWidget == NULL) -- setWidgetForRole(m_scene->findWidget(widgetIDForRole(RoleType::A)), RoleType::A); -- if (m_role[RoleType::B].umlWidget == NULL) -- setWidgetForRole(m_scene->findWidget(widgetIDForRole(RoleType::B)), RoleType::B); -- -- if (!m_role[RoleType::A].umlWidget || !m_role[RoleType::B].umlWidget) { -- DEBUG(DBG_SRC) << "Cannot make association!"; -- return false; -- } -- -- calculateEndingPoints(); -- -- if (AssocRules::allowRole(type)) { -- for (unsigned r = RoleType::A; r <= RoleType::B; ++r) { -- WidgetRole& robj = m_role[r]; -- if (robj.roleWidget == NULL) -- continue; -- robj.roleWidget->setLink(this); -- TextRole::Enum tr = (r == RoleType::A ? TextRole::RoleAName : TextRole::RoleBName); -- robj.roleWidget->setTextRole(tr); -- Uml::Visibility::Enum vis = visibility(Uml::RoleType::fromInt(r)); -- robj.roleWidget->setPreText(Uml::Visibility::toString(vis, true)); -- -- if (FloatingTextWidget::isTextValid(robj.roleWidget->text())) -- robj.roleWidget->show(); -- else -- robj.roleWidget->hide(); -- if (m_scene->type() == DiagramType::Collaboration) -- robj.roleWidget->setUMLObject(robj.umlWidget->umlObject()); -- robj.roleWidget->activate(); -- } -- } -- -- if (m_nameWidget != NULL) { -- m_nameWidget->setLink(this); -- m_nameWidget->setTextRole(calculateNameType(TextRole::Name)); -- -- if (FloatingTextWidget::isTextValid(m_nameWidget->text())) { -- m_nameWidget->show(); -- } else { -- m_nameWidget->hide(); -- } -- m_nameWidget->activate(); -- calculateNameTextSegment(); -- } -- -- for (unsigned r = RoleType::A; r <= RoleType::B; ++r) { -- WidgetRole& robj = m_role[r]; -- -- FloatingTextWidget* pMulti = robj.multiplicityWidget; -- if (pMulti != NULL && -- AssocRules::allowMultiplicity(type, robj.umlWidget->baseType())) { -- pMulti->setLink(this); -- TextRole::Enum tr = (r == RoleType::A ? TextRole::MultiA : TextRole::MultiB); -- pMulti->setTextRole(tr); -- if (FloatingTextWidget::isTextValid(pMulti->text())) -- pMulti->show(); -- else -- pMulti->hide(); -- pMulti->activate(); -- } -- -- FloatingTextWidget* pChangeWidget = robj.changeabilityWidget; -- if (pChangeWidget != NULL) { -- pChangeWidget->setLink(this); -- TextRole::Enum tr = (r == RoleType::A ? TextRole::ChangeA : TextRole::ChangeB); -- pChangeWidget->setTextRole(tr); -- if (FloatingTextWidget::isTextValid(pChangeWidget->text())) -- pChangeWidget->show(); -- else -- pChangeWidget->hide (); -- pChangeWidget->activate(); -- } -- } -- -- // Prepare the association class line if needed. -- if (m_associationClass && !m_pAssocClassLine) { -- createAssocClassLine(); -- } -- -- m_activated = true; -- return true; --} -- --/** -- * Set the widget of the given role. -- * Add this AssociationWidget at the widget. -- * If this AssociationWidget has an underlying UMLAssociation then set -- * the widget's underlying UMLObject at the UMLAssociation's role object. -- * -- * @param widget Pointer to the UMLWidget. -- * @param role Role for which to set the widget. -- */ --void AssociationWidget::setWidgetForRole(UMLWidget* widget, Uml::RoleType::Enum role) --{ -- m_role[role].umlWidget = widget; -- if (widget) { -- m_role[role].umlWidget->addAssoc(this); -- if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) -- association()->setObject(widget->umlObject(), role); -- } --} -- --/** -- * Return the multiplicity FloatingTextWidget widget of the given role. -- * -- * @return Pointer to the multiplicity FloatingTextWidget object. -- */ --FloatingTextWidget* AssociationWidget::multiplicityWidget(Uml::RoleType::Enum role) const --{ -- return m_role[role].multiplicityWidget; --} -- --/** -- * Read property of FloatingTextWidget* m_nameWidget. -- * -- * @return Pointer to the FloatingTextWidget name widget. -- */ --FloatingTextWidget* AssociationWidget::nameWidget() const --{ -- return m_nameWidget; --} -- --/** -- * Return the given role's FloatingTextWidget object. -- * -- * @return Pointer to the role's FloatingTextWidget widget. -- */ --FloatingTextWidget* AssociationWidget::roleWidget(Uml::RoleType::Enum role) const --{ -- return m_role[role].roleWidget; --} -- --/** -- * Return the given role's changeability FloatingTextWidget widget. -- */ --FloatingTextWidget* AssociationWidget::changeabilityWidget(Uml::RoleType::Enum role) const --{ -- return m_role[role].changeabilityWidget; --} -- --/** -- * Return the FloatingTextWidget object indicated by the given TextRole::Enum. -- * -- * @return Pointer to the text role's FloatingTextWidget widget. -- */ --FloatingTextWidget* AssociationWidget::textWidgetByRole(Uml::TextRole::Enum tr) const --{ -- switch (tr) { -- case Uml::TextRole::MultiA: -- return m_role[RoleType::A].multiplicityWidget; -- case Uml::TextRole::MultiB: -- return m_role[RoleType::B].multiplicityWidget; -- case Uml::TextRole::Name: -- case Uml::TextRole::Coll_Message: -- return m_nameWidget; -- case Uml::TextRole::RoleAName: -- return m_role[RoleType::A].roleWidget; -- case Uml::TextRole::RoleBName: -- return m_role[RoleType::B].roleWidget; -- case Uml::TextRole::ChangeA: -- return m_role[RoleType::A].changeabilityWidget; -- case Uml::TextRole::ChangeB: -- return m_role[RoleType::B].changeabilityWidget; -- default: -- break; -- } -- return NULL; --} -- --/** -- * Returns the m_nameWidget's text. -- * -- * @return Text of the FloatingTextWidget name widget. -- */ --QString AssociationWidget::name() const --{ -- if (m_nameWidget == NULL) -- return QString(); -- return m_nameWidget->text(); --} -- --/** -- * Sets the text in the FloatingTextWidget widget representing the Name -- * of this association. -- */ --void AssociationWidget::setName(const QString &strName) --{ -- // set attribute of UMLAssociation associated with this associationwidget -- UMLAssociation *umla = association(); -- if (umla) -- umla->setName(strName); -- -- bool newLabel = false; -- if (!m_nameWidget) { -- // Don't construct the FloatingTextWidget if the string is empty. -- if (! FloatingTextWidget::isTextValid(strName)) -- return; -- -- newLabel = true; -- m_nameWidget = new FloatingTextWidget(m_scene, calculateNameType(Uml::TextRole::Name), strName); -- m_nameWidget->setParentItem(this); -- m_nameWidget->setLink(this); -- } else { -- m_nameWidget->setText(strName); -- if (! FloatingTextWidget::isTextValid(strName)) { -- //m_nameWidget->hide(); -- m_scene->removeWidget(m_nameWidget); -- m_nameWidget = NULL; -- return; -- } -- } -- -- setTextPosition(Uml::TextRole::Name); -- if (newLabel) { -- m_nameWidget->setActivated(); -- m_scene->addFloatingTextWidget(m_nameWidget); -- } -- -- m_nameWidget->show(); --} -- --void AssociationWidget::setStereotype(const QString &stereo) { -- UMLAssociation *umlassoc = association(); -- if (umlassoc) { -- umlassoc->setStereotype(stereo); -- if (m_nameWidget) { -- m_nameWidget->setText(umlassoc->stereotype(true)); -- } else { -- uDebug() << "not setting " << stereo << " because m_nameWidget is NULL"; -- } -- } else { -- uDebug() << "not setting " << stereo << " because association is NULL"; -- } --} -- --/** -- * Return the given role's FloatingTextWidget widget text. -- * -- * @return The name set at the FloatingTextWidget. -- */ --QString AssociationWidget::roleName(Uml::RoleType::Enum role) const --{ -- if (m_role[role].roleWidget == NULL) -- return QString(); -- return m_role[role].roleWidget->text(); --} -- --/** -- * Sets the text to the FloatingTextWidget that display the Role text of this -- * association. -- * For this function to work properly, the associated widget -- * should already be set. -- */ --void AssociationWidget::setRoleName(const QString &strRole, Uml::RoleType::Enum role) --{ -- Uml::AssociationType::Enum type = associationType(); -- //if the association is not supposed to have a Role FloatingTextWidget -- if (!AssocRules::allowRole(type)) { -- return; -- } -- -- TextRole::Enum tr = (role == RoleType::A ? TextRole::RoleAName : TextRole::RoleBName); -- setFloatingText(tr, strRole, m_role[role].roleWidget); -- if (m_role[role].roleWidget) { -- Uml::Visibility::Enum vis = visibility(role); -- if (FloatingTextWidget::isTextValid(m_role[role].roleWidget->text())) { -- m_role[role].roleWidget->setPreText(Uml::Visibility::toString(vis, true)); -- //m_role[role].roleWidget->show(); -- } else { -- m_role[role].roleWidget->setPreText(QString()); -- //m_role[role].roleWidget->hide(); -- } -- } -- -- // set attribute of UMLAssociation associated with this associationwidget -- if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) -- association()->setRoleName(strRole, role); --} -- --/** -- * Set the documentation on the given role. -- */ --void AssociationWidget::setRoleDocumentation(const QString &doc, Uml::RoleType::Enum role) --{ -- if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) -- association()->setRoleDoc(doc, role); -- else -- m_role[role].roleDocumentation = doc; --} -- --/** -- * Returns the given role's documentation. -- */ --QString AssociationWidget::roleDocumentation(Uml::RoleType::Enum role) const --{ -- if (m_umlObject == NULL || m_umlObject->baseType() != UMLObject::ot_Association) -- return QString(); -- UMLAssociation *umla = static_cast(m_umlObject); -- return umla->getRoleDoc(role); --} -- --/** -- * Change, create, or delete the FloatingTextWidget indicated by the given TextRole::Enum. -- * -- * @param tr TextRole::Enum of the FloatingTextWidget to change or create. -- * @param text Text string that controls the action: -- * If empty and ft is NULL then setFloatingText() is a no-op. -- * If empty and ft is non-NULL then the existing ft is deleted. -- * If non-empty and ft is NULL then a new FloatingTextWidget is created -- * and returned in ft with the text set. -- * If non-empty and ft is non-NULL then the existing ft text is modified. -- * @param ft Reference to the pointer to FloatingTextWidget to change or create. -- * On creation/deletion, the pointer value will be changed. -- */ --void AssociationWidget::setFloatingText(Uml::TextRole::Enum role, -- const QString &text, -- FloatingTextWidget* &ft) --{ -- if (! FloatingTextWidget::isTextValid(text)) { -- if (ft) { -- // Remove preexisting FloatingTextWidget -- m_scene->removeWidget(ft); // physically deletes ft -- ft = NULL; -- } -- return; -- } -- -- if (ft == NULL) { -- ft = new FloatingTextWidget(m_scene, role, text); -- ft->setParentItem(this); -- ft->setLink(this); -- ft->activate(); -- setTextPosition(role); -- m_scene->addFloatingTextWidget(ft); -- } else { -- bool newLabel = ft->text().isEmpty(); -- ft->setText(text); -- if (newLabel) -- setTextPosition(role); -- } -- -- ft->show(); --} -- --/** -- * Return the given role's multiplicity text. -- * -- * @return Text of the given role's multiplicity widget. -- */ --QString AssociationWidget::multiplicity(Uml::RoleType::Enum role) const --{ -- if (m_role[role].multiplicityWidget == NULL) -- return QString(); -- return m_role[role].multiplicityWidget->text(); --} -- --/** -- * Sets the text in the FloatingTextWidget representing the multiplicity -- * at the given side of the association. -- */ --void AssociationWidget::setMultiplicity(const QString& text, Uml::RoleType::Enum role) --{ -- TextRole::Enum tr = (role == RoleType::A ? TextRole::MultiA : TextRole::MultiB); -- -- setFloatingText(tr, text, m_role[role].multiplicityWidget); -- -- if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) -- association()->setMultiplicity(text, role); --} -- --/** -- * Gets the visibility on the given role of the association. -- */ --Visibility::Enum AssociationWidget::visibility(Uml::RoleType::Enum role) const --{ -- const UMLAssociation *assoc = association(); -- if (assoc) -- return assoc->visibility(role); -- const UMLAttribute *attr = attribute(); -- if (attr) -- return attr->visibility(); -- return m_role[role].visibility; --} -- --/** -- * Sets the visibility on the given role of the association. -- */ --void AssociationWidget::setVisibility(Visibility::Enum value, Uml::RoleType::Enum role) --{ -- if (value == visibility(role)) { -- return; -- } -- if (m_umlObject) { -- // update our model object -- const UMLObject::ObjectType ot = m_umlObject->baseType(); -- if (ot == UMLObject::ot_Association) -- association()->setVisibility(value, role); -- else if (ot == UMLObject::ot_Attribute) -- attribute()->setVisibility(value); -- } -- m_role[role].visibility = value; -- // update role pre-text attribute as appropriate -- if (m_role[role].roleWidget) { -- QString scopeString = Visibility::toString(value, true); -- m_role[role].roleWidget->setPreText(scopeString); -- } --} -- --/** -- * Gets the changeability on the given end of the Association. -- */ --Uml::Changeability::Enum AssociationWidget::changeability(Uml::RoleType::Enum role) const --{ -- if (m_umlObject == NULL || m_umlObject->baseType() != UMLObject::ot_Association) -- return m_role[role].changeability; -- UMLAssociation *umla = static_cast(m_umlObject); -- return umla->changeability(role); --} -- --/** -- * Sets the changeability on the given end of the Association. -- */ --void AssociationWidget::setChangeability(Uml::Changeability::Enum value, Uml::RoleType::Enum role) --{ -- if (value == changeability(role)) -- return; -- QString changeString = Uml::Changeability::toString(value); -- if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) // update our model object -- association()->setChangeability(value, role); -- m_role[role].changeability = value; -- // update our string representation -- setChangeWidget(changeString, role); --} -- --/** -- * For internal purpose-kf6s only. -- * Other classes/users should use setChangeability() instead. -- */ --void AssociationWidget::setChangeWidget(const QString &strChangeWidget, Uml::RoleType::Enum role) --{ -- bool newLabel = false; -- TextRole::Enum tr = (role == RoleType::A ? TextRole::ChangeA : TextRole::ChangeB); -- -- if (!m_role[role].changeabilityWidget) { -- // Don't construct the FloatingTextWidget if the string is empty. -- if (strChangeWidget.isEmpty()) -- return; -- -- newLabel = true; -- m_role[role].changeabilityWidget = new FloatingTextWidget(m_scene, tr, strChangeWidget); -- m_role[role].changeabilityWidget->setParentItem(this); -- m_role[role].changeabilityWidget->setLink(this); -- m_scene->addFloatingTextWidget(m_role[role].changeabilityWidget); -- m_role[role].changeabilityWidget->setPreText(QLatin1String("{")); // all types have this -- m_role[role].changeabilityWidget->setPostText(QLatin1String("}")); // all types have this -- } else { -- if (m_role[role].changeabilityWidget->text().isEmpty()) { -- newLabel = true; -- } -- m_role[role].changeabilityWidget->setText(strChangeWidget); -- } -- m_role[role].changeabilityWidget->setActivated(); -- -- if (newLabel) { -- setTextPosition(tr); -- } -- -- if (FloatingTextWidget::isTextValid(m_role[role].changeabilityWidget->text())) -- m_role[role].changeabilityWidget->show(); -- else -- m_role[role].changeabilityWidget->hide(); --} -- --/** -- * Returns true if the line path starts at the given widget. -- */ --bool AssociationWidget::linePathStartsAt(const UMLWidget* widget) --{ --//:TODO: --// QPointF lpStart = m_associationLine->point(0); --// int startX = lpStart.x(); --// int startY = lpStart.y(); --// int wX = widget->x(); --// int wY = widget->y(); --// int wWidth = widget->width(); --// int wHeight = widget->height(); --// bool result = (startX >= wX && startX <= wX + wWidth && --// startY >= wY && startY <= wY + wHeight); --// return result; -- bool result = widget->contains(m_associationLine->point(0)); -- DEBUG(DBG_SRC) << "widget=" << widget->name() << " / result=" << result; -- return result; --} -- --/** -- * This function calculates which role should be set for the m_nameWidget FloatingTextWidget. -- */ --Uml::TextRole::Enum AssociationWidget::calculateNameType(Uml::TextRole::Enum defaultRole) --{ -- TextRole::Enum result = defaultRole; -- if (m_scene->type() == DiagramType::Collaboration) { -- if (m_role[RoleType::A].umlWidget == m_role[RoleType::B].umlWidget) { -- result = TextRole::Coll_Message;//for now same as other Coll_Message -- } else { -- result = TextRole::Coll_Message; -- } -- } else if (m_scene->type() == DiagramType::Sequence) { -- if (m_role[RoleType::A].umlWidget == m_role[RoleType::B].umlWidget) { -- result = TextRole::Seq_Message_Self; -- } else { -- result = TextRole::Seq_Message; -- } -- } -- -- return result; --} -- --/** -- * Gets the given role widget. -- * -- * @return Pointer to the role's UMLWidget. -- */ --UMLWidget* AssociationWidget::widgetForRole(Uml::RoleType::Enum role) const --{ -- return m_role[role].umlWidget; --} -- --/** -- * Sets the associated widgets. -- * -- * @param widgetA Pointer the role A widget for the association. -- * @param assocType The AssociationType::Enum for this association. -- * @param widgetB Pointer the role B widget for the association. -- */ --bool AssociationWidget::setWidgets(UMLWidget* widgetA, -- Uml::AssociationType::Enum assocType, -- UMLWidget* widgetB) --{ -- //if the association already has a WidgetB or WidgetA associated, then -- //it cannot be changed to other widget, that would require a deletion -- //of the association and the creation of a new one -- if ((m_role[RoleType::A].umlWidget && (m_role[RoleType::A].umlWidget != widgetA)) || -- (m_role[RoleType::B].umlWidget && (m_role[RoleType::B].umlWidget != widgetB))) { -- return false; -- } -- setWidgetForRole(widgetA, RoleType::A); -- setAssociationType(assocType); -- setWidgetForRole(widgetB, RoleType::B); -- -- calculateEndingPoints(); -- return true; --} -- --/** -- * CleansUp all the association's data in the related widgets. -- */ --void AssociationWidget::cleanup() --{ -- //let any other associations know we are going so they can tidy their positions up -- if (m_role[RoleType::A].m_nTotalCount > 2) -- updateAssociations(m_role[RoleType::A].m_nTotalCount - 1, m_role[RoleType::A].m_WidgetRegion, RoleType::A); -- if (m_role[RoleType::B].m_nTotalCount > 2) -- updateAssociations(m_role[RoleType::B].m_nTotalCount - 1, m_role[RoleType::B].m_WidgetRegion, RoleType::B); -- -- for (unsigned r = RoleType::A; r <= RoleType::B; ++r) { -- WidgetRole& robj = m_role[r]; -- -- if (robj.umlWidget) { -- robj.umlWidget->removeAssoc(this); -- robj.umlWidget = 0; -- } -- if (robj.roleWidget) { -- m_scene->removeWidget(robj.roleWidget); -- robj.roleWidget = 0; -- } -- if (robj.multiplicityWidget) { -- m_scene->removeWidget(robj.multiplicityWidget); -- robj.multiplicityWidget = 0; -- } -- if (robj.changeabilityWidget) { -- m_scene->removeWidget(robj.changeabilityWidget); -- robj.changeabilityWidget = 0; -- } -- } -- -- if (m_nameWidget) { -- m_scene->removeWidget(m_nameWidget); -- m_nameWidget = 0; -- } -- -- if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) { -- /* -- We do not remove the UMLAssociation from the document. -- Why? - Well, for example we might be in the middle of -- a cut/paste. If the UMLAssociation is removed by the cut -- then upon pasteing we have a problem. -- This is not quite clean yet - there should be a way to -- explicitly delete a UMLAssociation. The Right Thing would -- be to have a ListView representation for UMLAssociation. -- ` -- IF we are cut n pasting, why are we handling this association as a pointer? -- We should be using the XMI representation for a cut and paste. This -- allows us to be clean here, AND a choice of recreating the object -- w/ same id IF its a "cut", or a new object if its a "copy" operation -- (in which case we wouldnt be here, in cleanup()). -- */ -- setUMLAssociation(0); -- } -- -- m_associationLine->cleanup(); -- removeAssocClassLine(); --} -- --/** -- * @brief Return state if the assocation line point in the near of the last context -- * menu event position is addable or not. -- * A point is addable if the association is not an Exception and there is no point in the near. -- * -- * @return true if point is addable -- */ --bool AssociationWidget::isPointAddable() --{ -- if (!isSelected() || associationType() == Uml::AssociationType::Exception) -- return false; -- int i = m_associationLine->closestPointIndex(m_eventScenePos); -- return i == -1; --} -- --/** -- * @brief Return state if the assocation line point in the near of the last context -- * menu event position is removable or not. -- * A point is removable if the association is not an Exception and is not the start or end point. -- * -- * @return true if point is removable -- */ --bool AssociationWidget::isPointRemovable() --{ -- if (!isSelected() || associationType() == Uml::AssociationType::Exception || m_associationLine->count() <= 2) -- return false; -- int i = m_associationLine->closestPointIndex(m_eventScenePos); -- return i > 0 && i < m_associationLine->count() - 1; --} -- --/** -- * Set our internal umlAssociation. -- */ --void AssociationWidget::setUMLAssociation (UMLAssociation * assoc) --{ -- if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) { -- UMLAssociation *umla = association(); -- -- // safety check. Did some num-nuts try to set the existing -- // association again? If so, just bail here -- if (umla == assoc) -- return; -- -- //umla->disconnect(this); //Qt does disconnect automatically upon destruction. -- umla->nrof_parent_widgets--; -- -- // ANSWER: This is the wrong treatment of cut and paste. Associations that -- // are being cut/n pasted should be serialized to XMI, then reconstituted -- // (IF a paste operation) rather than passing around object pointers. Its -- // just too hard otherwise to prevent problems in the code. Bottom line: we need to -- // delete orphaned associations or we well get code crashes and memory leaks. -- if (umla->nrof_parent_widgets <= 0) { -- //umla->deleteLater(); -- } -- -- m_umlObject = NULL; -- } -- -- if (assoc) { -- m_umlObject = assoc; -- -- // move counter to "0" from "-1" (which means, no assocwidgets) -- if (assoc->nrof_parent_widgets < 0) -- assoc->nrof_parent_widgets = 0; -- -- assoc->nrof_parent_widgets++; -- connect(assoc, SIGNAL(modified()), this, SLOT(syncToModel())); -- } -- --} -- --/** -- * Returns true if the Widget is either at the starting or ending side of the association. -- */ --bool AssociationWidget::containsAsEndpoint(UMLWidget* widget) --{ -- return (widget == m_role[RoleType::A].umlWidget || widget == m_role[RoleType::B].umlWidget); --} -- --/** -- * Returns true if this AssociationWidget represents a collaboration message. -- */ --bool AssociationWidget::isCollaboration() const --{ -- Uml::AssociationType::Enum at = associationType(); -- return (at == AssociationType::Coll_Message_Synchronous -- || at == AssociationType::Coll_Message_Asynchronous -- || at == AssociationType::Coll_Message_Self); --} -- --/** -- * Returns true if this AssociationWidget represents a self message. -- */ --bool AssociationWidget::isSelf() const --{ -- return widgetForRole(Uml::RoleType::A) == widgetForRole(Uml::RoleType::B); --} -- --/** -- * Gets the association's type. -- * -- * @return This AssociationWidget's AssociationType::Enum. -- */ --Uml::AssociationType::Enum AssociationWidget::associationType() const --{ -- if (m_umlObject == NULL || m_umlObject->baseType() != UMLObject::ot_Association) -- return m_associationType; -- UMLAssociation *umla = static_cast(m_umlObject); -- return umla->getAssocType(); --} -- --/** -- * Sets the association's type. -- * -- * @param type The AssociationType::Enum to set. -- */ --void AssociationWidget::setAssociationType(Uml::AssociationType::Enum type) --{ -- if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) { -- association()->setAssociationType(type); -- } -- m_associationType = type; -- // If the association new type is not supposed to have Multiplicity -- // FloatingTexts and a Role FloatingTextWidget then set the texts -- // to empty. -- // NB We do not physically delete the floatingtext widgets here because -- // those widgets are also stored in the UMLView::m_WidgetList. -- if (!AssocRules::allowMultiplicity(type, widgetForRole(RoleType::A)->baseType())) { -- if (m_role[RoleType::A].multiplicityWidget) { -- m_role[RoleType::A].multiplicityWidget->setName(QString()); -- } -- if (m_role[RoleType::B].multiplicityWidget) { -- m_role[RoleType::B].multiplicityWidget->setName(QString()); -- } -- } -- if (!AssocRules::allowRole(type)) { -- if (m_role[RoleType::A].roleWidget) { -- m_role[RoleType::A].roleWidget->setName(QString()); -- } -- if (m_role[RoleType::B].roleWidget) { -- m_role[RoleType::B].roleWidget->setName(QString()); -- } -- setRoleDocumentation(QString(), RoleType::A); -- setRoleDocumentation(QString(), RoleType::B); -- } -- m_associationLine->reconstructSymbols(); --} -- --/** -- * Gets the ID of the given role widget. -- */ --Uml::ID::Type AssociationWidget::widgetIDForRole(Uml::RoleType::Enum role) const --{ -- if (m_role[role].umlWidget == NULL) { -- if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) { -- UMLAssociation *umla = static_cast(m_umlObject); -- return umla->getObjectId(role); -- } -- uError() << "umlWidget is NULL"; -- return Uml::ID::None; -- } -- if (m_role[role].umlWidget->baseType() == WidgetBase::wt_Object) -- return static_cast(m_role[role].umlWidget)->localID(); -- Uml::ID::Type id = m_role[role].umlWidget->id(); -- return id; --} -- --/** -- * Gets the local ID of the given role widget. -- */ --Uml::ID::Type AssociationWidget::widgetLocalIDForRole(Uml::RoleType::Enum role) const --{ -- if (m_role[role].umlWidget == NULL) { -- if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) { -- UMLAssociation *umla = static_cast(m_umlObject); -- return umla->getObjectId(role); -- } -- uError() << "umlWidget is NULL"; -- return Uml::ID::None; -- } -- if (m_role[role].umlWidget->baseType() == WidgetBase::wt_Object) -- return static_cast(m_role[role].umlWidget)->localID(); -- Uml::ID::Type id = m_role[role].umlWidget->localID(); -- return id; --} -- --/** -- * Returns a QString Object representing this AssociationWidget. -- */ --QString AssociationWidget::toString() const --{ -- QString string; -- static const QChar colon(QLatin1Char(':')); -- -- if (widgetForRole(RoleType::A)) { -- string = widgetForRole(RoleType::A)->name(); -- } -- string.append(colon); -- -- if (m_role[RoleType::A].roleWidget) { -- string += m_role[RoleType::A].roleWidget->text(); -- } -- string.append(colon); -- string.append(Uml::AssociationType::toStringI18n(associationType())); -- string.append(colon); -- -- if (widgetForRole(RoleType::B)) { -- string += widgetForRole(RoleType::B)->name(); -- } -- -- string.append(colon); -- if (m_role[RoleType::B].roleWidget) { -- string += m_role[RoleType::B].roleWidget->text(); -- } -- -- return string; --} -- --/** -- * Adds a break point (if left mouse button). -- */ --void AssociationWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) --{ -- if (event->button() == Qt::LeftButton) { -- uDebug() << "widget = " << name() << " / type = " << baseTypeStr(); -- showPropertiesDialog(); -- event->accept(); -- } --} -- --/** -- * Overrides moveEvent. -- */ --void AssociationWidget::moveEvent(QGraphicsSceneMouseEvent *me) --{ -- // 2004-04-30: Achim Spangler -- // Simple Approach to block moveEvent during load of XMI -- /// @todo avoid trigger of this event during load -- -- if (umlDoc()->loading()) { -- // hmmh - change of position during load of XMI -- // -> there is something wrong -- // -> avoid movement during opening -- // -> print warn and stay at old position -- uWarning() << "called during load of XMI for ViewType: " -- << m_scene->type() << ", and BaseType: " << baseType(); -- return; -- } -- /*to be here a line segment has moved. -- we need to see if the three text widgets needs to be moved. -- there are a few things to check first though: -- -- 1) Do they exist -- 2) does it need to move: -- 2a) for the multi widgets only move if they changed region, otherwise they are close enough -- 2b) for role name move if the segment it is on moves. -- */ -- //first see if either the first or last segments moved, else no need to recalculate their point positions -- -- QPointF oldNamePoint = calculateTextPosition(TextRole::Name); -- QPointF oldMultiAPoint = calculateTextPosition(TextRole::MultiA); -- QPointF oldMultiBPoint = calculateTextPosition(TextRole::MultiB); -- QPointF oldChangeAPoint = calculateTextPosition(TextRole::ChangeA); -- QPointF oldChangeBPoint = calculateTextPosition(TextRole::ChangeB); -- QPointF oldRoleAPoint = calculateTextPosition(TextRole::RoleAName); -- QPointF oldRoleBPoint = calculateTextPosition(TextRole::RoleBName); -- -- int movingPoint = m_associationLine->closestPointIndex(me->scenePos()); -- if (movingPoint != -1) -- m_associationLine->setPoint(movingPoint, me->scenePos()); -- int pos = m_associationLine->count() - 1;//set to last point for widget b -- -- if ( movingPoint == 1 || (movingPoint == pos-1) ) { -- calculateEndingPoints(); -- } -- if (m_role[RoleType::A].changeabilityWidget && (movingPoint == 1)) { -- setTextPositionRelatively(TextRole::ChangeA, oldChangeAPoint); -- } -- if (m_role[RoleType::B].changeabilityWidget && (movingPoint == 1)) { -- setTextPositionRelatively(TextRole::ChangeB, oldChangeBPoint); -- } -- if (m_role[RoleType::A].multiplicityWidget && (movingPoint == 1)) { -- setTextPositionRelatively(TextRole::MultiA, oldMultiAPoint); -- } -- if (m_role[RoleType::B].multiplicityWidget && (movingPoint == pos-1)) { -- setTextPositionRelatively(TextRole::MultiB, oldMultiBPoint); -- } -- -- if (m_nameWidget) { -- if (movingPoint == m_unNameLineSegment || -- movingPoint - 1 == m_unNameLineSegment) { -- setTextPositionRelatively(TextRole::Name, oldNamePoint); -- } -- } -- -- if (m_role[RoleType::A].roleWidget) { -- setTextPositionRelatively(TextRole::RoleAName, oldRoleAPoint); -- } -- if (m_role[RoleType::B].roleWidget) { -- setTextPositionRelatively(TextRole::RoleBName, oldRoleBPoint); -- } -- -- if (m_pAssocClassLine) { -- computeAssocClassLine(); -- } --} -- --/** -- * Calculates and sets the first and last point in the Association's AssociationLine. -- * Each point is a middle point of its respecting UMLWidget's Bounding rectangle -- * or a corner of it. -- * This method picks which sides to use for the association. -- */ --void AssociationWidget::calculateEndingPoints() --{ -- /* -- * For each UMLWidget the diagram is divided in four regions by its diagonals -- * as indicated below -- * Region 2 -- * \ / -- * \ / -- * +--------+ -- * | \ / | -- * Region 1 | >< | Region 3 -- * | / \ | -- * +--------+ -- * / \ -- * / \ -- * Region 4 -- * -- * Each diagonal is defined by two corners of the bounding rectangle -- * -- * To calculate the first point in the AssociationLine we have to find out in which -- * Region (defined by WidgetA's diagonals) is WidgetB's center -- * (let's call it Region M.) After that the first point will be the middle -- * point of the rectangle's side contained in Region M. -- * -- * To calculate the last point in the AssociationLine we repeat the above but -- * in the opposite direction (from widgetB to WidgetA) -- */ -- -- UMLWidget *pWidgetA = m_role[RoleType::A].umlWidget; -- UMLWidget *pWidgetB = m_role[RoleType::B].umlWidget; -- if (!pWidgetA || !pWidgetB) { -- uWarning() << "Returning - one of the role widgets is not set."; -- return; -- } -- -- int size = m_associationLine->count(); -- if (size < 2) { -- QPointF pA = pWidgetA->pos(); -- QPointF pB = pWidgetB->pos(); -- QPolygonF polyA = pWidgetA->shape().toFillPolygon().translated(pA); -- QPolygonF polyB = pWidgetB->shape().toFillPolygon().translated(pB); -- QLineF nearestPoints = Widget_Utils::closestPoints(polyA, polyB); -- if (nearestPoints.isNull()) { -- uError() << "Widget_Utils::closestPoints failed, falling back to simple widget positions"; -- } else { -- pA = nearestPoints.p1(); -- pB = nearestPoints.p2(); -- } -- m_associationLine->setEndPoints(pA, pB); -- } -- -- // See if an association to self. -- // See if it needs to be set up before we continue: -- // If self association/message and doesn't have the minimum 4 points -- // then create it. Make sure no points are out of bounds of viewing area. -- // This only happens on first time through that we are worried about. -- if (isSelf() && size < 4) { -- createPointsSelfAssociation(); -- return; -- } -- -- if (associationType() == AssociationType::Exception && size < 4) { -- createPointsException(); -- updatePointsException(); -- return; -- } -- -- // If the line has more than one segment change the values to calculate -- // from widget to point 1. -- qreal xB = pWidgetB->x() + pWidgetB->width() / 2; -- qreal yB = pWidgetB->y() + pWidgetB->height() / 2; -- if (size > 2) { -- QPointF p = m_associationLine->point(1); -- xB = p.x(); -- yB = p.y(); -- } -- doUpdates(QPointF(xB, yB), RoleType::A); -- -- // Now do the same for widgetB. -- // If the line has more than one segment change the values to calculate -- // from widgetB to the last point away from it. -- qreal xA = pWidgetA->x() + pWidgetA->width() / 2; -- qreal yA = pWidgetA->y() + pWidgetA->height() / 2; -- if (size > 2 ) { -- QPointF p = m_associationLine->point(size - 2); -- xA = p.x(); -- yA = p.y(); -- } -- doUpdates(QPointF(xA, yA), RoleType::B); -- -- computeAssocClassLine(); --} -- --/** -- * Used by @ref calculateEndingPoints. -- */ --void AssociationWidget::doUpdates(const QPointF &otherP, RoleType::Enum role) --{ -- // Find widget region. -- Uml::Region::Enum oldRegion = m_role[role].m_WidgetRegion; -- UMLWidget *pWidget = m_role[role].umlWidget; -- QRectF rc(pWidget->x(), pWidget->y(), -- pWidget->width(), pWidget->height()); -- Uml::Region::Enum region = m_role[role].m_WidgetRegion; // alias for brevity -- region = findPointRegion(rc, otherP); -- // Move some regions to the standard ones. -- switch( region ) { -- case Uml::Region::NorthWest: -- region = Uml::Region::North; -- break; -- case Uml::Region::NorthEast: -- region = Uml::Region::East; -- break; -- case Uml::Region::SouthEast: -- region = Uml::Region::South; -- break; -- case Uml::Region::SouthWest: -- case Uml::Region::Center: -- region = Uml::Region::West; -- break; -- default: -- break; -- } -- int regionCount = getRegionCount(region, role) + 2; //+2 = (1 for this one and one to halve it) -- int totalCount = m_role[role].m_nTotalCount; -- if (oldRegion != region) { -- updateRegionLineCount(regionCount - 1, regionCount, region, role); -- updateAssociations(totalCount - 1, oldRegion, role); -- } else if (totalCount != regionCount) { -- updateRegionLineCount(regionCount - 1, regionCount, region, role); -- } else { -- updateRegionLineCount(m_role[role].m_nIndex, totalCount, region, role); -- } -- updateAssociations(regionCount, region, role); --} -- --/** -- * Read property of bool m_activated. -- */ --bool AssociationWidget::isActivated() const --{ -- return m_activated; --} -- --/** -- * Set the m_activated flag of a widget but does not perform the Activate method. -- */ --void AssociationWidget::setActivated(bool active) --{ -- m_activated = active; --} -- --/** -- * Synchronize this widget from the UMLAssociation. -- */ --void AssociationWidget::syncToModel() --{ -- UMLAssociation *uml = association(); -- -- if (uml == NULL) { -- UMLAttribute *attr = attribute(); -- if (attr == NULL) -- return; -- setVisibility(attr->visibility(), RoleType::B); -- setRoleName(attr->name(), RoleType::B); -- return; -- } -- // block signals until finished -- uml->blockSignals(true); -- -- setName(uml->name()); -- setRoleName(uml->getRoleName(RoleType::A), RoleType::A); -- setRoleName(uml->getRoleName(RoleType::B), RoleType::B); -- setVisibility(uml->visibility(RoleType::A), RoleType::A); -- setVisibility(uml->visibility(RoleType::B), RoleType::B); -- setChangeability(uml->changeability(RoleType::A), RoleType::A); -- setChangeability(uml->changeability(RoleType::B), RoleType::B); -- setMultiplicity(uml->getMultiplicity(RoleType::A), RoleType::A); -- setMultiplicity(uml->getMultiplicity(RoleType::B), RoleType::B); -- -- uml->blockSignals(false); --} -- --/** -- * Merges/syncs the association widget data into UML object -- * representation. -- * This will synchronize UMLAssociation w/ this new Widget -- * CHECK: Can we get rid of this. -- */ --void AssociationWidget::mergeAssociationDataIntoUMLRepresentation() --{ -- UMLAssociation *umlassoc = association(); -- UMLAttribute *umlattr = attribute(); -- if (umlassoc == NULL && umlattr == NULL) -- return; -- -- // block emit modified signal, or we get a horrible loop -- m_umlObject->blockSignals(true); -- -- // would be desirable to do the following -- // so that we can be sure its back to initial state -- // in case we missed something here. -- //uml->init(); -- -- // floating text widgets -- FloatingTextWidget *text = nameWidget(); -- if (text) -- m_umlObject->setName(text->text()); -- -- text = roleWidget(RoleType::A); -- if (text && umlassoc) -- umlassoc->setRoleName(text->text(), RoleType::A); -- -- text = roleWidget(RoleType::B); -- if (text) { -- if (umlassoc) -- umlassoc->setRoleName(text->text(), RoleType::B); -- else if (umlattr) -- umlattr->setName(text->text()); -- } -- -- text = multiplicityWidget(RoleType::A); -- if (text && umlassoc) -- umlassoc->setMultiplicity(text->text(), RoleType::A); -- -- text = multiplicityWidget(RoleType::B); -- if (text && umlassoc) -- umlassoc->setMultiplicity(text->text(), RoleType::B); -- -- // unblock -- m_umlObject->blockSignals(false); --} -- --/** -- * Auxiliary method for widgetMoved(): -- * Saves all ideally computed floatingtext positions before doing any -- * kind of change. This is necessary because a single invocation of -- * calculateEndingPoints() modifies the AssociationLine ending points on ALL -- * AssociationWidgets. This means that if we don't save the old ideal -- * positions then they are irretrievably lost as soon as -- * calculateEndingPoints() is invoked. -- */ --void AssociationWidget::saveIdealTextPositions() --{ -- m_oldNamePoint = calculateTextPosition(TextRole::Name); -- m_oldMultiAPoint = calculateTextPosition(TextRole::MultiA); -- m_oldMultiBPoint = calculateTextPosition(TextRole::MultiB); -- m_oldChangeAPoint = calculateTextPosition(TextRole::ChangeA); -- m_oldChangeBPoint = calculateTextPosition(TextRole::ChangeB); -- m_oldRoleAPoint = calculateTextPosition(TextRole::RoleAName); -- m_oldRoleBPoint = calculateTextPosition(TextRole::RoleBName); --} -- --/** -- * Adjusts the ending point of the association that connects to Widget. -- */ --void AssociationWidget::widgetMoved(UMLWidget* widget, qreal dx, qreal dy) --{ -- Q_UNUSED(dx); Q_UNUSED(dy); -- -- // Simple Approach to block moveEvent during load of XMI -- /// @todo avoid trigger of this event during load -- if (umlDoc()->loading()) { -- // change of position during load of XMI -- // -> there is something wrong -- // -> avoid movement during opening -- // -> print warn and stay at old position -- DEBUG(DBG_SRC) << "called during load of XMI for ViewType: " << m_scene->type() -- << ", and BaseType: " << baseTypeStr(); -- return; -- } -- -- DEBUG(DBG_SRC) << "association type=" << Uml::AssociationType::toString(associationType()); -- if (associationType() == AssociationType::Exception) { -- updatePointsException(); -- setTextPosition(TextRole::Name); -- } -- else { -- calculateEndingPoints(); -- computeAssocClassLine(); -- } -- -- // Assoc to self - move all points: -- if (isSelf()) { -- updatePointsSelfAssociation(); -- -- if (m_nameWidget && !m_nameWidget->isSelected()) { -- setTextPositionRelatively(TextRole::Name, m_oldNamePoint); -- } -- -- }//end if widgetA = widgetB -- else if (m_role[RoleType::A].umlWidget == widget) { -- if (m_nameWidget && m_unNameLineSegment == 0 && !m_nameWidget->isSelected() ) { -- //only calculate position and move text if the segment it is on is moving -- setTextPositionRelatively(TextRole::Name, m_oldNamePoint); -- } -- }//end if widgetA moved -- else if (m_role[RoleType::B].umlWidget == widget) { -- const int size = m_associationLine->count(); -- if (m_nameWidget && (m_unNameLineSegment == size-2) && !m_nameWidget->isSelected() ) { -- //only calculate position and move text if the segment it is on is moving -- setTextPositionRelatively(TextRole::Name, m_oldNamePoint); -- } -- }//end if widgetB moved -- -- if (m_role[RoleType::A].roleWidget && !m_role[RoleType::A].roleWidget->isSelected()) { -- setTextPositionRelatively(TextRole::RoleAName, m_oldRoleAPoint); -- } -- if (m_role[RoleType::B].roleWidget && !m_role[RoleType::B].roleWidget->isSelected()) { -- setTextPositionRelatively(TextRole::RoleBName, m_oldRoleBPoint); -- } -- if (m_role[RoleType::A].multiplicityWidget && !m_role[RoleType::A].multiplicityWidget->isSelected()) { -- setTextPositionRelatively(TextRole::MultiA, m_oldMultiAPoint); -- } -- if (m_role[RoleType::B].multiplicityWidget && !m_role[RoleType::B].multiplicityWidget->isSelected()) { -- setTextPositionRelatively(TextRole::MultiB, m_oldMultiBPoint); -- } -- if (m_role[RoleType::A].changeabilityWidget && !m_role[RoleType::A].changeabilityWidget->isSelected()) { -- setTextPositionRelatively(TextRole::ChangeA, m_oldChangeAPoint); -- } -- if (m_role[RoleType::B].changeabilityWidget && !m_role[RoleType::B].changeabilityWidget->isSelected()) { -- setTextPositionRelatively(TextRole::ChangeB, m_oldChangeBPoint); -- } --} -- --/** -- * Creates the points of the self association. -- * Method called when a widget end points are calculated by calculateEndingPoints(). -- */ --void AssociationWidget::createPointsSelfAssociation() --{ -- UMLWidget *pWidgetA = m_role[RoleType::A].umlWidget; -- -- const int DISTANCE = 50; -- qreal x = pWidgetA->x(); -- qreal y = pWidgetA->y(); -- qreal h = pWidgetA->height(); -- qreal w = pWidgetA->width(); -- // see if above widget ok to start -- if (y - DISTANCE > 0) { -- m_associationLine->setEndPoints(QPointF(x + w / 4, y) , QPointF(x + w * 3 / 4, y)); -- m_associationLine->insertPoint(1, QPointF(x + w / 4, y - DISTANCE)); -- m_associationLine->insertPoint(2, QPointF(x + w * 3 / 4, y - DISTANCE)); -- m_role[RoleType::A].m_WidgetRegion = m_role[RoleType::B].m_WidgetRegion = Uml::Region::North; -- } else { -- m_associationLine->setEndPoints(QPointF(x + w / 4, y + h), QPointF(x + w * 3 / 4, y + h)); -- m_associationLine->insertPoint(1, QPointF(x + w / 4, y + h + DISTANCE)); -- m_associationLine->insertPoint(2, QPointF(x + w * 3 / 4, y + h + DISTANCE)); -- m_role[RoleType::A].m_WidgetRegion = m_role[RoleType::B].m_WidgetRegion = Uml::Region::South; -- } --} -- --/** -- * Adjusts the points of the self association. -- * Method called when a widget was moved by widgetMoved(widget, x, y). -- */ --void AssociationWidget::updatePointsSelfAssociation() --{ -- UMLWidget *pWidgetA = m_role[RoleType::A].umlWidget; -- -- const int DISTANCE = 50; -- qreal x = pWidgetA->x(); -- qreal y = pWidgetA->y(); -- qreal h = pWidgetA->height(); -- qreal w = pWidgetA->width(); -- // see if above widget ok to start -- if (y - DISTANCE > 0) { -- m_associationLine->setEndPoints(QPointF(x + w / 4, y) , QPointF(x + w * 3 / 4, y)); -- m_associationLine->setPoint(1, QPointF(x + w / 4, y - DISTANCE)); -- m_associationLine->setPoint(2, QPointF(x + w * 3 / 4, y - DISTANCE)); -- m_role[RoleType::A].m_WidgetRegion = m_role[RoleType::B].m_WidgetRegion = Uml::Region::North; -- } else { -- m_associationLine->setEndPoints(QPointF(x + w / 4, y + h), QPointF(x + w * 3 / 4, y + h)); -- m_associationLine->setPoint(1, QPointF(x + w / 4, y + h + DISTANCE)); -- m_associationLine->setPoint(2, QPointF(x + w * 3 / 4, y + h + DISTANCE)); -- m_role[RoleType::A].m_WidgetRegion = m_role[RoleType::B].m_WidgetRegion = Uml::Region::South; -- } --} -- --/** -- * Creates the points of the association exception. -- * Method called when a widget end points are calculated by calculateEndingPoints(). -- */ --void AssociationWidget::createPointsException() --{ -- UMLWidget *pWidgetA = m_role[RoleType::A].umlWidget; -- UMLWidget *pWidgetB = m_role[RoleType::B].umlWidget; -- -- qreal xa = pWidgetA->x(); -- qreal ya = pWidgetA->y(); -- qreal ha = pWidgetA->height(); -- qreal wa = pWidgetA->width(); -- -- qreal xb = pWidgetB->x(); -- qreal yb = pWidgetB->y(); -- qreal hb = pWidgetB->height(); -- //qreal wb = pWidgetB->width(); -- -- m_associationLine->setEndPoints(QPointF(xa + wa , ya + ha/2) , QPointF(xb , yb + hb/2)); -- m_associationLine->insertPoint(1, QPointF(xa + wa , ya + ha/2)); -- m_associationLine->insertPoint(2, QPointF(xb , yb + hb/2)); --} -- --/** -- * Adjusts the points of the association exception. -- * Method called when a widget was moved by widgetMoved(widget, x, y). -- */ --void AssociationWidget::updatePointsException() --{ -- UMLWidget *pWidgetA = m_role[RoleType::A].umlWidget; -- UMLWidget *pWidgetB = m_role[RoleType::B].umlWidget; -- -- qreal xa = pWidgetA->x(); -- qreal ya = pWidgetA->y(); -- qreal ha = pWidgetA->height(); -- qreal wa = pWidgetA->width(); -- -- qreal xb = pWidgetB->x(); -- qreal yb = pWidgetB->y(); -- qreal hb = pWidgetB->height(); -- qreal wb = pWidgetB->width(); -- qreal xmil, ymil; -- qreal xdeb, ydeb; -- qreal xfin, yfin; -- qreal ESPACEX, ESPACEY; -- QPointF p1; -- QPointF p2; -- //calcul des coordonnées au milieu de la flèche eclair -- if (xb - xa - wa >= 45) { -- ESPACEX = 0; -- xdeb = xa + wa; -- xfin = xb; -- } else if (xa - xb - wb > 45) { -- ESPACEX = 0; -- xdeb = xa; -- xfin = xb + wb; -- } else { -- ESPACEX = 15; -- xdeb = xa + wa/2; -- xfin = xb + wb/2; -- } -- -- xmil = xdeb + (xfin - xdeb)/2; -- -- if (yb - ya - ha >= 45) { -- ESPACEY = 0; -- ydeb = ya + ha; -- yfin = yb; -- } else if (ya - yb - hb > 45) { -- ESPACEY = 0; -- ydeb = ya; -- yfin = yb + hb; -- } else { -- ESPACEY = 15; -- ydeb = ya + ha/2; -- yfin = yb + hb/2; -- } -- -- ymil = ydeb + (yfin - ydeb)/2; -- -- p1.setX(xmil + (xfin - xmil)*1/2); p1.setY(ymil + (yfin - ymil)*1/3); -- p2.setX(xmil - (xmil - xdeb)*1/2); p2.setY(ymil - (ymil - ydeb)*1/3); -- -- if (abs(p1.x() - p2.x()) <= 10) -- ESPACEX = 15; -- if (abs(p1.y() - p2.y()) <= 10) -- ESPACEY = 15; -- -- m_associationLine->setEndPoints(QPointF(xdeb, ydeb), QPointF(xfin, yfin)); -- m_associationLine->setPoint(1, QPointF(p1.x() + ESPACEX, p1.y() + ESPACEY)); -- m_associationLine->setPoint(2, QPointF(p2.x() - ESPACEX, p2.y() - ESPACEY)); -- -- m_role[RoleType::A].m_WidgetRegion = m_role[RoleType::B].m_WidgetRegion = Uml::Region::North; --} -- --/** -- * Finds out which region of rectangle 'rect' contains the point 'pos' and returns the region -- * number: -- * 1 = Region 1 -- * 2 = Region 2 -- * 3 = Region 3 -- * 4 = Region 4 -- * 5 = On diagonal 2 between Region 1 and 2 -- * 6 = On diagonal 1 between Region 2 and 3 -- * 7 = On diagonal 2 between Region 3 and 4 -- * 8 = On diagonal 1 between Region 4 and 1 -- * 9 = On diagonal 1 and On diagonal 2 (the center) -- */ --Uml::Region::Enum AssociationWidget::findPointRegion(const QRectF& rect, const QPointF &pos) --{ -- qreal w = rect.width(); -- qreal h = rect.height(); -- qreal x = rect.x(); -- qreal y = rect.y(); -- qreal slope2 = w / h; -- qreal slope1 = slope2 *(-1.0); -- qreal b1 = x + w - (slope1 * y); -- qreal b2 = x - (slope2 * y); -- -- qreal eval1 = slope1 * pos.y() + b1; -- qreal eval2 = slope2 * pos.y() + b2; -- -- Uml::Region::Enum result = Uml::Region::Error; -- //if inside region 1 -- if (eval1 > pos.x() && eval2 > pos.x()) { -- result = Uml::Region::West; -- } -- //if inside region 2 -- else if (eval1 > pos.x() && eval2 < pos.x()) { -- result = Uml::Region::North; -- } -- //if inside region 3 -- else if (eval1 < pos.x() && eval2 < pos.x()) { -- result = Uml::Region::East; -- } -- //if inside region 4 -- else if (eval1 < pos.x() && eval2 > pos.x()) { -- result = Uml::Region::South; -- } -- //if inside region 5 -- else if (eval1 == pos.x() && eval2 < pos.x()) { -- result = Uml::Region::NorthWest; -- } -- //if inside region 6 -- else if (eval1 < pos.x() && eval2 == pos.x()) { -- result = Uml::Region::NorthEast; -- } -- //if inside region 7 -- else if (eval1 == pos.x() && eval2 > pos.x()) { -- result = Uml::Region::SouthEast; -- } -- //if inside region 8 -- else if (eval1 > pos.x() && eval2 == pos.x()) { -- result = Uml::Region::SouthWest; -- } -- //if inside region 9 -- else if (eval1 == pos.x() && eval2 == pos.x()) { -- result = Uml::Region::Center; -- } -- return result; --} -- --/** -- * Returns a point with interchanged X and Y coordinates. -- */ --QPointF AssociationWidget::swapXY(const QPointF &p) --{ -- QPointF swapped( p.y(), p.x() ); -- return swapped; --} -- --#if 0 // not used at the moment --/** -- * Calculates which point of segment P1P2 has a distance equal to -- * Distance from P1. -- * Let's say such point is PX, the distance from P1 to PX must be equal -- * to Distance and if PX is not a point of the segment P1P2 then the -- * function returns (-1, -1). -- */ --QPointF AssociationWidget::calculatePointAtDistance(const QPointF &P1, const QPointF &P2, float Distance) --{ -- /* -- the distance D between points (x1, y1) and (x3, y3) has the following formula: -- --- ------------------------------ -- D = \ / 2 2 -- \ / (x3 - x1) + (y3 - y1) -- -- D, x1 and y1 are known and the point (x3, y3) is inside line (x1, y1)(x2, y2), so if the -- that line has the formula y = mx + b -- then y3 = m*x3 + b -- -- 2 2 2 -- D = (x3 - x1) + (y3 - y1) -- -- 2 2 2 2 2 -- D = x3 - 2*x3*x1 + x1 + y3 - 2*y3*y1 + y1 -- -- 2 2 2 2 2 -- D - x1 - y1 = x3 - 2*x3*x1 + y3 - 2*y3*y1 -- -- 2 2 2 2 2 -- D - x1 - y1 = x3 - 2*x3*x1 + (m*x3 + b) - 2*(m*x3 + b)*y1 -- -- 2 2 2 2 2 2 -- D - x1 - y1 + 2*b*y1 - b = (m + 1)*x3 + (-2*x1 + 2*m*b -2*m*y1)*x3 -- -- 2 2 2 2 -- C = - D + x1 + y1 - 2*b*y1 + b -- -- -- 2 -- A = (m + 1) -- -- B = (-2*x1 + 2*m*b -2*m*y1) -- -- and we have -- 2 -- A * x3 + B * x3 - C = 0 -- -- --------------- -- -B + --- / 2 -- \/ B - 4*A*C -- sol_1 = -------------------------------- -- 2*A -- -- -- --------------- -- -B - --- / 2 -- \/ B - 4*A*C -- sol_2 = -------------------------------- -- 2*A -- -- -- then in the distance formula we have only one variable x3 and that is easy -- to calculate -- */ -- int x1 = P1.y(); -- int y1 = P1.x(); -- int x2 = P2.y(); -- int y2 = P2.x(); -- -- if (x2 == x1) { -- return QPointF(x1, y1 + (int)Distance); -- } -- float slope = ((float)y2 - (float)y1) / ((float)x2 - (float)x1); -- float b = (y1 - slope*x1); -- float A = (slope * slope) + 1; -- float B = (2*slope*b) - (2*x1) - (2*slope*y1); -- float C = (b*b) - (Distance*Distance) + (x1*x1) + (y1*y1) - (2*b*y1); -- float t = B*B - 4*A*C; -- -- if (t < 0) { -- return QPointF(-1, -1); -- } -- float sol_1 = ((-1* B) + sqrt(t)) / (2*A); -- float sol_2 = ((-1*B) - sqrt(t)) / (2*A); -- -- if (sol_1 < 0.0 && sol_2 < 0.0) { -- return QPointF(-1, -1); -- } -- QPointF sol1Point((int)(slope*sol_1 + b), (int)(sol_1)); -- QPointF sol2Point((int)(slope*sol_2 + b), (int)(sol_2)); -- if (sol_1 < 0 && sol_2 >=0) { -- if (x2 > x1) { -- if (x1 <= sol_2 && sol_2 <= x2) -- return sol2Point; -- } else { -- if (x2 <= sol_2 && sol_2 <= x1) -- return sol2Point; -- } -- } else if (sol_1 >= 0 && sol_2 < 0) { -- if (x2 > x1) { -- if (x1 <= sol_1 && sol_1 <= x2) -- return sol1Point; -- } else { -- if (x2 <= sol_1 && sol_1 <= x1) -- return sol1Point; -- } -- } else { -- if (x2 > x1) { -- if (x1 <= sol_1 && sol_1 <= x2) -- return sol1Point; -- if (x1 <= sol_2 && sol_2 <= x2) -- return sol2Point; -- } else { -- if (x2 <= sol_1 && sol_1 <= x1) -- return sol1Point; -- if (x2 <= sol_2 && sol_2 <= x1) -- return sol2Point; -- } -- } -- return QPointF(-1, -1); --} -- --/** -- * Calculates which point of a perpendicular line to segment P1P2 that contains P2 -- * has a distance equal to Distance from P2, -- * Lets say such point is P3, the distance from P2 to P3 must be equal to Distance -- */ --QPointF AssociationWidget::calculatePointAtDistanceOnPerpendicular(const QPointF &P1, const QPointF &P2, float Distance) --{ -- /* -- the distance D between points (x2, y2) and (x3, y3) has the following formula: -- -- --- ------------------------------ -- D = \ / 2 2 -- \ / (x3 - x2) + (y3 - y2) -- -- D, x2 and y2 are known and line P2P3 is perpendicular to line (x1, y1)(x2, y2), so if the -- line P1P2 has the formula y = m*x + b, -- then (x1 - x2) -- m = -----------, because it is perpendicular to line P1P2 -- (y2 - y1) -- -- also y2 = m*x2 + b -- => b = y2 - m*x2 -- -- then P3 = (x3, m*x3 + b) -- -- 2 2 2 -- D = (x3 - x2) + (y3 - y2) -- -- 2 2 2 2 2 -- D = x3 - 2*x3*x2 + x2 + y3 - 2*y3*y2 + y2 -- -- 2 2 2 2 2 -- D - x2 - y2 = x3 - 2*x3*x2 + y3 - 2*y3*y2 -- -- -- -- 2 2 2 2 2 -- D - x2 - y2 = x3 - 2*x3*x2 + (m*x3 + b) - 2*(m*x3 + b)*y2 -- -- 2 2 2 2 2 2 -- D - x2 - y2 + 2*b*y2 - b = (m + 1)*x3 + (-2*x2 + 2*m*b -2*m*y2)*x3 -- -- 2 2 2 2 -- C = - D + x2 + y2 - 2*b*y2 + b -- -- 2 -- A = (m + 1) -- -- B = (-2*x2 + 2*m*b -2*m*y2) -- -- and we have -- 2 -- A * x3 + B * x3 - C = 0 -- -- -- --------------- -- --- / 2 -- -B + \/ B - 4*A*C -- sol_1 = -------------------------------- -- 2*A -- -- -- --------------- -- --- / 2 -- -B - \/ B - 4*A*C -- sol_2 = -------------------------------- -- 2*A -- -- then in the distance formula we have only one variable x3 and that is easy -- to calculate -- */ -- if (P1.x() == P2.x()) { -- return QPointF((int)(P2.x() + Distance), P2.y()); -- } -- const int x1 = P1.y(); -- const int y1 = P1.x(); -- const int x2 = P2.y(); -- const int y2 = P2.x(); -- -- float slope = ((float)x1 - (float)x2) / ((float)y2 - (float)y1); -- float b = (y2 - slope*x2); -- float A = (slope * slope) + 1; -- float B = (2*slope*b) - (2*x2) - (2*slope*y2); -- float C = (b*b) - (Distance*Distance) + (x2*x2) + (y2*y2) - (2*b*y2); -- float t = B*B - 4*A*C; -- if (t < 0) { -- return QPointF(-1, -1); -- } -- float sol_1 = ((-1* B) + sqrt(t)) / (2*A); -- -- float sol_2 = ((-1*B) - sqrt(t)) / (2*A); -- -- if (sol_1 < 0 && sol_2 < 0) { -- return QPointF(-1, -1); -- } -- QPointF sol1Point((int)(slope*sol_1 + b), (int)sol_1); -- QPointF sol2Point((int)(slope*sol_2 + b), (int)sol_2); -- if (sol_1 < 0 && sol_2 >=0) { -- return sol2Point; -- } else if (sol_1 >= 0 && sol_2 < 0) { -- return sol1Point; -- } else { // Choose one solution, either will work fine -- if (slope >= 0) { -- if (sol_1 <= sol_2) -- return sol2Point; -- else -- return sol1Point; -- } else { -- if (sol_1 <= sol_2) -- return sol1Point; -- else -- return sol2Point; -- } -- -- } -- return QPointF(-1, -1); // never reached, just keep compilers happy --} -- --/** -- * Calculates the intersection (PS) between line P1P2 and a perpendicular line containing -- * P3, the result is returned in ResultingPoint. and result value represents the distance -- * between ResultingPoint and P3; if this value is negative an error ocurred. -- */ --float AssociationWidget::perpendicularProjection(const QPointF& P1, const QPointF& P2, const QPointF& P3, -- QPointF& ResultingPoint) --{ -- //line P1P2 is Line 1 = y=slope1*x + b1 -- -- //line P3PS is Line 1 = y=slope2*x + b2 -- -- float slope2 = 0; -- float slope1 = 0; -- float sx = 0, sy = 0; -- int y2 = P2.x(); -- int y1 = P1.x(); -- int x2 = P2.y(); -- int x1 = P1.y(); -- int y3 = P3.x(); -- int x3 = P3.y(); -- float distance = 0; -- float b1 = 0; -- -- float b2 = 0; -- -- if (x2 == x1) { -- sx = x2; -- sy = y3; -- } else if (y2 == y1) { -- sy = y2; -- sx = x3; -- } else { -- slope1 = (y2 - y1)/ (x2 - x1); -- slope2 = (x1 - x2)/ (y2 - y1); -- b1 = y2 - (slope1 * x2); -- b2 = y3 - (slope2 * x3); -- sx = (b2 - b1) / (slope1 - slope2); -- sy = slope1*sx + b1; -- } -- distance = (int)(sqrt(((x3 - sx)*(x3 - sx)) + ((y3 - sy)*(y3 - sy)))); -- -- ResultingPoint.setX((int)sy); -- ResultingPoint.setY((int)sx); -- -- return distance; --} --#endif -- --/** -- * Calculates the position of the text widget depending on the role -- * that widget is playing. -- * Returns the point at which to put the widget. -- */ --QPointF AssociationWidget::calculateTextPosition(Uml::TextRole::Enum role) --{ -- const int SPACE = 2; -- QPointF p(-1, -1), q(-1, -1); -- -- // used to find out if association end point (p) -- // is at top or bottom edge of widget. -- -- if (role == TextRole::MultiA || role == TextRole::ChangeA || role == TextRole::RoleAName) { -- p = m_associationLine->point(0); -- q = m_associationLine->point(1); -- } else if (role == TextRole::MultiB || role == TextRole::ChangeB || role == TextRole::RoleBName) { -- const int lastSegment = m_associationLine->count() - 1; -- p = m_associationLine->point(lastSegment); -- q = m_associationLine->point(lastSegment - 1); -- } else if (role != TextRole::Name) { -- uError() << "called with unsupported TextRole::Enum " << role; -- return QPointF(-1, -1); -- } -- -- FloatingTextWidget *text = textWidgetByRole(role); -- int textW = 0, textH = 0; -- if (text) { -- textW = text->width(); -- textH = text->height(); -- } -- -- qreal x = 0.0, y = 0.0; -- -- if (role == TextRole::MultiA || role == TextRole::MultiB) { -- const bool isHorizontal = (p.y() == q.y()); -- const int atBottom = p.y() + SPACE; -- const int atTop = p.y() - SPACE - textH; -- const int atLeft = p.x() - SPACE - textW; -- const int atRight = p.x() + SPACE; -- y = (p.y() > q.y()) == isHorizontal ? atBottom : atTop; -- x = (p.x() < q.x()) == isHorizontal ? atRight : atLeft; -- -- } else if (role == TextRole::ChangeA || role == TextRole::ChangeB) { -- -- if (p.y() > q.y()) -- y = p.y() - SPACE - (textH * 2); -- else -- y = p.y() + SPACE + textH; -- -- if (p.x() < q.x()) -- x = p.x() + SPACE; -- else -- x = p.x() - SPACE - textW; -- -- } else if (role == TextRole::RoleAName || role == TextRole::RoleBName) { -- -- if (p.y() > q.y()) -- y = p.y() - SPACE - textH; -- else -- y = p.y() + SPACE; -- -- if (p.x() < q.x()) -- x = p.x() + SPACE; -- else -- x = p.x() - SPACE - textW; -- -- } else if (role == TextRole::Name) { -- -- calculateNameTextSegment(); -- if (m_unNameLineSegment == -1) { -- uWarning() << "TODO:negative line segment index"; -- m_unNameLineSegment = 0; -- } -- x = ( m_associationLine->point(m_unNameLineSegment).x() + -- m_associationLine->point(m_unNameLineSegment + 1).x() ) / 2; -- y = ( m_associationLine->point(m_unNameLineSegment).y() + -- m_associationLine->point(m_unNameLineSegment + 1).y() ) / 2; -- } -- -- if (text) { -- constrainTextPos(x, y, textW, textH, role); -- } -- p = QPointF( x, y ); -- return p; --} -- --/** -- * Return the mid point between p0 and p1 -- */ --QPointF AssociationWidget::midPoint(const QPointF& p0, const QPointF& p1) --{ -- QPointF midP; -- if (p0.x() < p1.x()) -- midP.setX(p0.x() + (p1.x() - p0.x()) / 2); -- else -- midP.setX(p1.x() + (p0.x() - p1.x()) / 2); -- if (p0.y() < p1.y()) -- midP.setY(p0.y() + (p1.y() - p0.y()) / 2); -- else -- midP.setY(p1.y() + (p0.y() - p1.y()) / 2); -- return midP; --} -- --/** -- * Constrains the FloatingTextWidget X and Y values supplied. -- * Implements the abstract operation from LinkWidget. -- * -- * @param textX Candidate X value (may be modified by the constraint.) -- * @param textY Candidate Y value (may be modified by the constraint.) -- * @param textWidth Width of the text. -- * @param textHeight Height of the text. -- * @param tr Uml::Text_Role of the text. -- */ --void AssociationWidget::constrainTextPos(qreal &textX, qreal &textY, -- qreal textWidth, qreal textHeight, -- Uml::TextRole::Enum tr) --{ -- const int textCenterX = textX + textWidth / 2; -- const int textCenterY = textY + textHeight / 2; -- const int lastSegment = m_associationLine->count() - 1; -- QPointF p0, p1; -- switch (tr) { -- case TextRole::RoleAName: -- case TextRole::MultiA: -- case TextRole::ChangeA: -- p0 = m_associationLine->point(0); -- p1 = m_associationLine->point(1); -- // If we are dealing with a single line then tie the -- // role label to the proper half of the line, i.e. -- // the role label must be closer to the "other" -- // role object. -- if (lastSegment == 1) -- p1 = midPoint(p0, p1); -- break; -- case TextRole::RoleBName: -- case TextRole::MultiB: -- case TextRole::ChangeB: -- p0 = m_associationLine->point(lastSegment - 1); -- p1 = m_associationLine->point(lastSegment); -- if (lastSegment == 1) -- p0 = midPoint(p0, p1); -- break; -- case TextRole::Name: -- case TextRole::Coll_Message: // CHECK: collab.msg texts seem to be TextRole::Name -- case TextRole::State: // CHECK: is this used? -- // Find the linepath segment to which the (textX, textY) is closest -- // and constrain to the corridor of that segment (see farther below) -- { -- int minDistSquare = 100000; // utopian initial value -- int lpIndex = 0; -- for (int i = 0; i < lastSegment; ++i) { -- p0 = m_associationLine->point(i); -- p1 = m_associationLine->point(i + 1); -- QPointF midP = midPoint(p0, p1); -- const int deltaX = textCenterX - midP.x(); -- const int deltaY = textCenterY - midP.y(); -- const int cSquare = deltaX * deltaX + deltaY * deltaY; -- if (cSquare < minDistSquare) { -- minDistSquare = cSquare; -- lpIndex = i; -- } -- } -- p0 = m_associationLine->point(lpIndex); -- p1 = m_associationLine->point(lpIndex + 1); -- } -- break; -- default: -- uError() << "unexpected TextRole::Enum " << tr; -- return; -- break; -- } -- /* Constraint: -- The midpoint between p0 and p1 is taken to be the center of a circle -- with radius D/2 where D is the distance between p0 and p1. -- The text center needs to be within this circle else it is constrained -- to the nearest point on the circle. -- */ -- p0 = swapXY(p0); // go to the natural coordinate system -- p1 = swapXY(p1); // with (0,0) in the lower left corner -- QPointF midP = midPoint(p0, p1); -- // If (textX,textY) is not inside the circle around midP then -- // constrain (textX,textY) to the nearest point on that circle. -- const int x0 = p0.x(); -- const int y0 = p0.y(); -- const int x1 = p1.x(); -- const int y1 = p1.y(); -- double r = sqrt((double)((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0))) / 2; -- if (textWidth > r) -- r = textWidth; -- // swap textCenter{X,Y} to convert from Qt coord.system. -- const QPointF origTextCenter(textCenterY, textCenterX); -- const int relX = abs(origTextCenter.x() - midP.x()); -- const int relY = abs(origTextCenter.y() - midP.y()); -- const double negativeWhenInsideCircle = relX * relX + relY * relY - r * r; -- if (negativeWhenInsideCircle <= 0.0) { -- return; -- } -- /* -- The original constraint was to snap the text position to the -- midpoint but that creates unpleasant visual jitter: -- textX = midP.y() - textWidth / 2; // go back to Qt coord.sys. -- textY = midP.x() - textHeight / 2; // go back to Qt coord.sys. -- -- Rather, we project the text position onto the closest point -- on the circle: -- -- Circle equation: -- relX^2 + relY^2 - r^2 = 0, or in other words -- relY^2 = r^2 - relX^2, or -- relY = sqrt(r^2 - relX^2) -- Line equation: -- relY = a * relX + b -- We can omit "b" because relX and relY are already relative to -- the circle origin, therefore we can also write: -- a = relY / relX -- To obtain the point of intersection between the circle of radius r -- and the line connecting the circle origin with the point (relX, relY), -- we equate the relY: -- a * x = sqrt(r^2 - x^2), or in other words -- a^2 * x^2 = r^2 - x^2, or -- x^2 * (a^2 + 1) = r^2, or -- x^2 = r^2 / (a^2 + 1), or -- x = sqrt(r^2 / (a^2 + 1)) -- and then -- y = a * x -- The resulting x and y are relative to the circle origin so we just add -- the circle origin (X, Y) to obtain the constrained (textX, textY). -- */ -- // Handle the special case, relX = 0. -- if (relX == 0) { -- if (origTextCenter.y() > midP.y()) -- textX = midP.y() + (int)r; // go back to Qt coord.sys. -- else -- textX = midP.y() - (int)r; // go back to Qt coord.sys. -- textX -= textWidth / 2; -- return; -- } -- const double a = (double)relY / (double)relX; -- const double x = sqrt(r*r / (a*a + 1)); -- const double y = a * x; -- if (origTextCenter.x() > midP.x()) -- textY = midP.x() + (int)x; // go back to Qt coord.sys. -- else -- textY = midP.x() - (int)x; // go back to Qt coord.sys. -- textY -= textHeight / 2; -- if (origTextCenter.y() > midP.y()) -- textX = midP.y() + (int)y; // go back to Qt coord.sys. -- else -- textX = midP.y() - (int)y; // go back to Qt coord.sys. -- textX -= textWidth / 2; --} -- --/** -- * Puts the text widget with the given role at the given position. -- * This method calls @ref calculateTextPostion to get the needed position. -- * I.e. the line segment it is on has moved and it should move the same -- * amount as the line. -- */ --void AssociationWidget::setTextPosition(Uml::TextRole::Enum role) --{ -- bool startMove = false; -- if (m_role[RoleType::A].multiplicityWidget && m_role[RoleType::A].multiplicityWidget->getStartMove()) -- startMove = true; -- else if (m_role[RoleType::B].multiplicityWidget && m_role[RoleType::B].multiplicityWidget->getStartMove()) -- startMove = true; -- else if (m_role[RoleType::A].changeabilityWidget && m_role[RoleType::A].changeabilityWidget->getStartMove()) -- startMove = true; -- else if (m_role[RoleType::B].changeabilityWidget && m_role[RoleType::B].changeabilityWidget->getStartMove()) -- startMove = true; -- else if (m_role[RoleType::A].roleWidget && m_role[RoleType::A].roleWidget->getStartMove()) -- startMove = true; -- else if (m_role[RoleType::B].roleWidget && m_role[RoleType::B].roleWidget->getStartMove()) -- startMove = true; -- else if (m_nameWidget && m_nameWidget->getStartMove()) -- startMove = true; -- if (startMove) { -- return; -- } -- FloatingTextWidget *ft = textWidgetByRole(role); -- if (ft == NULL) -- return; -- QPointF pos = calculateTextPosition(role); -- ft->setX(pos.x()); -- ft->setY(pos.y()); --} -- --/** -- * Moves the text widget with the given role by the difference between -- * the two points. -- */ --void AssociationWidget::setTextPositionRelatively(Uml::TextRole::Enum role, const QPointF &oldPosition) --{ -- bool startMove = false; -- if (m_role[RoleType::A].multiplicityWidget && m_role[RoleType::A].multiplicityWidget->getStartMove()) -- startMove = true; -- else if (m_role[RoleType::B].multiplicityWidget && m_role[RoleType::B].multiplicityWidget->getStartMove()) -- startMove = true; -- else if (m_role[RoleType::A].changeabilityWidget && m_role[RoleType::A].changeabilityWidget->getStartMove()) -- startMove = true; -- else if (m_role[RoleType::B].changeabilityWidget && m_role[RoleType::B].changeabilityWidget->getStartMove()) -- startMove = true; -- else if (m_role[RoleType::A].roleWidget && m_role[RoleType::A].roleWidget->getStartMove()) -- startMove = true; -- else if (m_role[RoleType::B].roleWidget && m_role[RoleType::B].roleWidget->getStartMove()) -- startMove = true; -- else if (m_nameWidget && m_nameWidget->getStartMove()) -- startMove = true; -- -- if (startMove) { -- return; -- } -- FloatingTextWidget *ft = textWidgetByRole(role); -- if (ft == NULL) -- return; -- qreal ftX = ft->x(); -- qreal ftY = ft->y(); -- -- QPointF pos = calculateTextPosition(role); -- int relX = pos.x() - oldPosition.x(); -- int relY = pos.y() - oldPosition.y(); -- qreal ftNewX = ftX + relX; -- qreal ftNewY = ftY + relY; -- -- bool oldIgnoreSnapToGrid = ft->getIgnoreSnapToGrid(); -- ft->setIgnoreSnapToGrid(true); -- ft->setX(ftNewX); -- ft->setY(ftNewY); -- ft->setIgnoreSnapToGrid(oldIgnoreSnapToGrid); --} -- --/** -- * Remove dashed connecting line for association class. -- */ --void AssociationWidget::removeAssocClassLine() --{ -- delete m_pAssocClassLineSel0; -- m_pAssocClassLineSel0 = 0; -- delete m_pAssocClassLineSel1; -- m_pAssocClassLineSel1 = 0; -- delete m_pAssocClassLine; -- m_pAssocClassLine = 0; -- if (m_associationClass) { -- m_associationClass->setClassAssociationWidget(0); -- m_associationClass = 0; -- } --} -- --/** -- * Creates the association class connecting line. -- */ --void AssociationWidget::createAssocClassLine() --{ -- if (m_pAssocClassLine == NULL) { -- m_pAssocClassLine = new QGraphicsLineItem(this); -- } -- QPen pen(lineColor(), lineWidth(), Qt::DashLine); -- m_pAssocClassLine->setPen(pen); -- // decoration points -- m_pAssocClassLineSel0 = Widget_Utils::decoratePoint(m_pAssocClassLine->line().p1(), -- m_pAssocClassLine); -- m_pAssocClassLineSel1 = Widget_Utils::decoratePoint(m_pAssocClassLine->line().p2(), -- m_pAssocClassLine); -- computeAssocClassLine(); -- selectAssocClassLine(false); --} -- --/** -- * Creates the association class connecting line using the specified -- * ClassifierWidget. -- * -- * @param classifier The ClassifierWidget to use. -- * @param linePathSegmentIndex The index of the segment where the -- * association class is created. -- */ --void AssociationWidget::createAssocClassLine(ClassifierWidget* classifier, -- int linePathSegmentIndex) --{ -- m_nLinePathSegmentIndex = linePathSegmentIndex; -- -- if (m_nLinePathSegmentIndex < 0) { -- return; -- } -- -- m_associationClass = classifier; -- m_associationClass->setClassAssociationWidget(this); -- m_associationClass->addAssoc(this); // to get widgetMoved(...) for association classes -- -- createAssocClassLine(); --} -- --/** -- * Compute the end points of m_pAssocClassLine in case this -- * association has an attached association class. -- * TODO: The decoration points make no sense for now, because they are not movable. -- */ --void AssociationWidget::computeAssocClassLine() --{ -- if (m_associationClass == NULL || m_pAssocClassLine == NULL) { -- return; -- } -- if (m_nLinePathSegmentIndex < 0) { -- uError() << "m_nLinePathSegmentIndex is not set"; -- return; -- } -- -- QPointF segStart = m_associationLine->point(m_nLinePathSegmentIndex); -- QPointF segEnd = m_associationLine->point(m_nLinePathSegmentIndex + 1); -- const qreal midSegX = segStart.x() + (segEnd.x() - segStart.x()) / 2.0; -- const qreal midSegY = segStart.y() + (segEnd.y() - segStart.y()) / 2.0; -- QPointF segmentMidPoint(midSegX, midSegY); -- -- QLineF possibleAssocLine = QLineF(segmentMidPoint, -- m_associationClass->mapRectToScene(m_associationClass->rect()).center()); -- QPointF intersectionPoint; -- QLineF::IntersectType type = intersect(m_associationClass->mapRectToScene(m_associationClass->boundingRect()), -- possibleAssocLine, -- &intersectionPoint); -- // DEBUG(DBG_SRC) << "intersect type=" << type << " / point=" << intersectionPoint; -- -- if (type == QLineF::BoundedIntersection) { -- m_pAssocClassLine->setLine(midSegX, midSegY, -- intersectionPoint.x(), intersectionPoint.y()); -- -- if (m_pAssocClassLineSel0 && m_pAssocClassLineSel1) { -- m_pAssocClassLineSel0->setPos(m_pAssocClassLine->line().p1()); -- m_pAssocClassLineSel1->setPos(m_pAssocClassLine->line().p2()); -- } -- } --} -- --/** -- * Renders the association class connecting line selected. -- */ --void AssociationWidget::selectAssocClassLine(bool sel) --{ -- if (m_pAssocClassLineSel0 && m_pAssocClassLineSel1) { -- m_pAssocClassLineSel0->setVisible(sel); -- m_pAssocClassLineSel1->setVisible(sel); -- } --} -- --/** -- * Sets the association to be selected. -- */ --void AssociationWidget::mousePressEvent(QGraphicsSceneMouseEvent * me) --{ -- // clear other selected stuff on the screen of ShiftKey -- if (me->modifiers() != Qt::ShiftModifier) { -- m_scene->clearSelected(); -- } -- -- if (me->button() == Qt::LeftButton && me->modifiers() == Qt::ControlModifier) { -- if (checkRemovePoint(me->scenePos())) -- return; -- } -- -- // make sure we should be here depending on the button -- if (me->button() != Qt::RightButton && me->button() != Qt::LeftButton) { -- return; -- } -- QPointF mep = me->scenePos(); -- // see if `mep' is on the connecting line to the association class -- if (onAssocClassLine(mep)) { -- setSelected(true); -- selectAssocClassLine(); -- return; -- } -- setSelected(!isSelected()); -- associationLine()->mousePressEvent(me); --} -- --/** -- * Displays the right mouse buttom menu if right button is pressed. -- */ --void AssociationWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent * me) --{ -- associationLine()->mouseReleaseEvent(me); --} -- --/** -- * Handles the selection from the popup menu. -- */ --void AssociationWidget::slotMenuSelection(QAction* action) --{ -- QString oldText, newText; -- QRegExpValidator v(QRegExp(QLatin1String(".*")), 0); -- Uml::AssociationType::Enum atype = associationType(); -- Uml::RoleType::Enum r = RoleType::B; -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- DEBUG(DBG_SRC) << "menu selection = " << ListPopupMenu::toString(sel); -- -- // if it's a collaboration message we now just use the code in floatingtextwidget -- // this means there's some redundant code below but that's better than duplicated code -- if (isCollaboration() && sel != ListPopupMenu::mt_Delete) { -- m_nameWidget->slotMenuSelection(action); -- return; -- } -- -- switch(sel) { -- case ListPopupMenu::mt_Properties: -- if (atype == AssociationType::Seq_Message || atype == AssociationType::Seq_Message_Self) { -- // show op dlg for seq. diagram here -- // don't worry about here, I don't think it can get here as -- // line is widget on seq. diagram -- // here just in case - remove later after testing -- DEBUG(DBG_SRC) << "mt_Properties: assoctype is " << atype; -- } else { //standard assoc dialog -- UMLApp::app()->docWindow()->updateDocumentation(false); -- showPropertiesDialog(); -- } -- break; -- -- case ListPopupMenu::mt_Add_Point: -- checkAddPoint(m_eventScenePos); -- break; -- -- case ListPopupMenu::mt_Delete_Point: -- checkRemovePoint(m_eventScenePos); -- break; -- -- case ListPopupMenu::mt_Delete: -- if (m_pAssocClassLineSel0) -- removeAssocClassLine(); -- else if (association()) -- m_scene->removeAssocInViewAndDoc(this); -- else -- m_scene->removeAssoc(this); -- break; -- -- case ListPopupMenu::mt_Rename_MultiA: -- r = RoleType::A; // fall through -- case ListPopupMenu::mt_Rename_MultiB: -- if (m_role[r].multiplicityWidget) -- oldText = m_role[r].multiplicityWidget->text(); -- else -- oldText = QString(); --#if QT_VERSION >= 0x050000 -- newText = QInputDialog::getText(m_scene->activeView(), -- i18n("Multiplicity"), -- i18n("Enter multiplicity:"), -- QLineEdit::Normal, -- oldText, NULL); --#else -- newText = KInputDialog::getText(i18n("Multiplicity"), -- i18n("Enter multiplicity:"), -- oldText, NULL, m_scene->activeView(), &v); --#endif -- if (newText != oldText) { -- if (FloatingTextWidget::isTextValid(newText)) { -- setMultiplicity(newText, r); -- } else { -- m_scene->removeWidget(m_role[r].multiplicityWidget); -- m_role[r].multiplicityWidget = NULL; -- } -- } -- break; -- -- case ListPopupMenu::mt_Rename_Name: -- if (m_nameWidget) -- oldText = m_nameWidget->text(); -- else -- oldText = QString(); --#if QT_VERSION >= 0x050000 -- newText = QInputDialog::getText(m_scene->activeView(), -- i18n("Association Name"), -- i18n("Enter association name:"), -- QLineEdit::Normal, -- oldText, NULL); --#else -- newText = KInputDialog::getText(i18n("Association Name"), -- i18n("Enter association name:"), -- oldText, NULL, m_scene->activeView(), &v); --#endif -- if (newText != oldText) { -- if (FloatingTextWidget::isTextValid(newText)) { -- setName(newText); -- } else { -- m_scene->removeWidget(m_nameWidget); -- m_nameWidget = NULL; -- } -- } -- break; -- -- case ListPopupMenu::mt_Rename_RoleAName: -- r = RoleType::A; // fall through -- case ListPopupMenu::mt_Rename_RoleBName: -- if (m_role[r].roleWidget) -- oldText = m_role[r].roleWidget->text(); -- else -- oldText = QString(); --#if QT_VERSION >= 0x050000 -- newText = QInputDialog::getText(m_scene->activeView(), -- i18n("Role Name"), -- i18n("Enter role name:"), -- QLineEdit::Normal, -- oldText, NULL); --#else -- newText = KInputDialog::getText(i18n("Role Name"), -- i18n("Enter role name:"), -- oldText, NULL, m_scene->activeView(), &v); --#endif -- if (newText != oldText) { -- if (FloatingTextWidget::isTextValid(newText)) { -- setRoleName(newText, r); -- } else { -- m_scene->removeWidget(m_role[r].roleWidget); -- m_role[r].roleWidget = NULL; -- } -- } -- break; -- -- case ListPopupMenu::mt_Change_Font: -- { --#if QT_VERSION >= 0x050000 -- bool ok = false; -- QFont fnt = QFontDialog::getFont(&ok, font(), m_scene->activeView()); -- if (ok) --#else -- QFont fnt = font(); -- if (KFontDialog::getFont(fnt, KFontChooser::NoDisplayFlags, m_scene->activeView())) --#endif -- lwSetFont(fnt); -- } -- break; -- -- case ListPopupMenu::mt_Line_Color: -- { --#if QT_VERSION >= 0x050000 -- QColor newColor = QColorDialog::getColor(lineColor()); -- if (newColor != lineColor()) { --#else -- QColor newColor; -- if (KColorDialog::getColor(newColor)) { --#endif -- m_scene->selectionSetLineColor(newColor); -- umlDoc()->setModified(true); -- } -- } -- break; -- -- case ListPopupMenu::mt_Cut: -- m_scene->setStartedCut(); -- UMLApp::app()->slotEditCut(); -- break; -- -- case ListPopupMenu::mt_Copy: -- UMLApp::app()->slotEditCopy(); -- break; -- -- case ListPopupMenu::mt_Paste: -- UMLApp::app()->slotEditPaste(); -- break; -- -- case ListPopupMenu::mt_Reset_Label_Positions: -- resetTextPositions(); -- break; -- -- case ListPopupMenu::mt_LayoutDirect: -- m_associationLine->setLayout(AssociationLine::Direct); -- break; -- case ListPopupMenu::mt_LayoutSpline: -- m_associationLine->setLayout(AssociationLine::Spline); -- break; -- case ListPopupMenu::mt_LayoutOrthogonal: -- m_associationLine->setLayout(AssociationLine::Orthogonal); -- break; -- case ListPopupMenu::mt_LayoutPolyline: -- m_associationLine->setLayout(AssociationLine::Polyline); -- break; -- -- default: -- DEBUG(DBG_SRC) << "MenuType " << ListPopupMenu::toString(sel) << " not implemented"; -- break; -- }//end switch --} -- --/** -- * Return the first font found being used by any child widget. (They -- * could be different fonts, so this is a slightly misleading method.) -- */ --QFont AssociationWidget::font() const --{ -- //:TODO: find a general font for the association -- QFont font; -- -- if (m_role[RoleType::A].roleWidget) -- font = m_role[RoleType::A].roleWidget->font(); -- else if (m_role[RoleType::B].roleWidget) -- font = m_role[RoleType::B].roleWidget->font(); -- else if (m_role[RoleType::A].multiplicityWidget) -- font = m_role[RoleType::A].multiplicityWidget->font(); -- else if (m_role[RoleType::B].multiplicityWidget) -- font = m_role[RoleType::B].multiplicityWidget->font(); -- else if (m_role[RoleType::A].changeabilityWidget) -- font = m_role[RoleType::A].changeabilityWidget->font(); -- else if (m_role[RoleType::B].changeabilityWidget) -- font = m_role[RoleType::B].changeabilityWidget->font(); -- else if (m_nameWidget) -- font = m_nameWidget->font(); -- else -- font = m_role[RoleType::A].umlWidget->font(); -- -- return font; --} -- --/** -- * Set all 'owned' child widgets to this text color. -- */ --void AssociationWidget::setTextColor(const QColor &color) --{ -- WidgetBase::setTextColor(color); -- if (m_nameWidget) { -- m_nameWidget->setTextColor(color); -- } -- if (m_role[RoleType::A].roleWidget) { -- m_role[RoleType::A].roleWidget->setTextColor(color); -- } -- if (m_role[RoleType::B].roleWidget) { -- m_role[RoleType::B].roleWidget->setTextColor(color); -- } -- if (m_role[RoleType::A].multiplicityWidget) { -- m_role[RoleType::A].multiplicityWidget->setTextColor(color); -- } -- if (m_role[RoleType::B].multiplicityWidget) { -- m_role[RoleType::B].multiplicityWidget->setTextColor(color); -- } -- if (m_role[RoleType::A].changeabilityWidget) -- m_role[RoleType::A].changeabilityWidget->setTextColor(color); -- if (m_role[RoleType::B].changeabilityWidget) -- m_role[RoleType::B].changeabilityWidget->setTextColor(color); --} -- --bool AssociationWidget::checkAddPoint(const QPointF &scenePos) --{ -- if (associationType() == AssociationType::Exception) { -- return false; -- } -- -- // if there is no point around the mouse pointer, we insert a new one -- if (m_associationLine->closestPointIndex(scenePos) < 0) { -- int i = m_associationLine->closestSegmentIndex(scenePos); -- if (i < 0) { -- DEBUG(DBG_SRC) << "no closest segment found!"; -- return false; -- } -- m_associationLine->insertPoint(i + 1, scenePos); -- if (m_nLinePathSegmentIndex == i) { -- QPointF segStart = m_associationLine->point(i); -- QPointF segEnd = m_associationLine->point(i + 2); -- const int midSegX = segStart.x() + (segEnd.x() - segStart.x()) / 2; -- const int midSegY = segStart.y() + (segEnd.y() - segStart.y()) / 2; -- /* -- DEBUG(DBG_SRC) << "segStart=" << segStart << ", segEnd=" << segEnd -- << ", midSeg=(" << midSegX << "," << midSegY -- << "), mp=" << mp; -- */ -- if (midSegX > scenePos.x() || midSegY < scenePos.y()) { -- m_nLinePathSegmentIndex++; -- DEBUG(DBG_SRC) << "setting m_nLinePathSegmentIndex to " -- << m_nLinePathSegmentIndex; -- computeAssocClassLine(); -- } -- m_associationLine->update(); -- calculateNameTextSegment(); -- umlDoc()->setModified(true); -- setSelected(true); -- } -- return true; -- } -- else { -- DEBUG(DBG_SRC) << "found point already close enough!"; -- return false; -- } --} -- --/** -- * Remove point close to the given point and redraw the association. -- * @param scenePos point which should be removed -- * @return success status of the remove action -- */ --bool AssociationWidget::checkRemovePoint(const QPointF &scenePos) --{ -- int i = m_associationLine->closestPointIndex(scenePos); -- if (i == -1) -- return false; -- -- m_associationLine->setSelected(false); -- -- // there was a point so we remove the point -- m_associationLine->removePoint(i); -- -- // Maybe reattach association class connecting line -- // to different association linepath segment. -- const int numberOfLines = m_associationLine->count() - 1; -- if (m_nLinePathSegmentIndex >= numberOfLines) { -- m_nLinePathSegmentIndex = numberOfLines - 1; -- } -- calculateEndingPoints(); -- -- // select the line path -- m_associationLine->setSelected(true); -- -- m_associationLine->update(); -- -- calculateNameTextSegment(); -- umlDoc()->setModified(true); -- return true; --} -- --/** -- * Moves the break point being dragged. -- */ --void AssociationWidget::mouseMoveEvent(QGraphicsSceneMouseEvent* me) --{ -- if (me->buttons() != Qt::LeftButton) { -- return; -- } -- -- setSelected(true); -- -- associationLine()->mouseMoveEvent(me); -- moveEvent(me); -- m_scene->resizeSceneToItems(); --} -- --/** -- * Returns the Region the widget to line intersection is for the given -- * widget in this Association. If the given widget is not in the -- * Association then Region::Error is returned. -- * Used by @ref calculateEndingPoints to work these positions out for -- * another Association - since the number of Associations on the same -- * region for the same widget will mean the lines will need to be -- * spread out across the region. -- */ --//Uml::Region::Enum AssociationWidget::getWidgetRegion(AssociationWidget * widget) const --//{ --// if (widget->widgetForRole(RoleType::A) == m_role[RoleType::A].umlWidget) --// return m_role[RoleType::A].m_WidgetRegion; --// if (widget->widgetForRole(RoleType::B) == m_role[RoleType::B].umlWidget) --// return m_role[RoleType::B].m_WidgetRegion; --// return Uml::Region::Error; --//} -- --/** -- * Returns the number of lines there are on the given region for -- * either widget A or B of the association. -- */ --int AssociationWidget::getRegionCount(Uml::Region::Enum region, Uml::RoleType::Enum role) --{ -- if ((region == Uml::Region::Error) | (umlScene() == NULL)) { -- return 0; -- } -- int widgetCount = 0; -- AssociationWidgetList list = m_scene->associationList(); -- foreach (AssociationWidget* assocwidget, list) { -- //don't count this association -- if (assocwidget == this) -- continue; -- const WidgetRole& otherA = assocwidget->m_role[RoleType::A]; -- const WidgetRole& otherB = assocwidget->m_role[RoleType::B]; -- const UMLWidget *a = otherA.umlWidget; -- const UMLWidget *b = otherB.umlWidget; -- /* -- //don't count associations to self if both of their end points are on the same region -- //they are different and placement won't interfere with them -- if (a == b && otherA.m_WidgetRegion == otherB.m_WidgetRegion) -- continue; -- */ -- if (m_role[role].umlWidget == a && region == otherA.m_WidgetRegion) -- widgetCount++; -- else if (m_role[role].umlWidget == b && region == otherB.m_WidgetRegion) -- widgetCount++; -- }//end foreach -- return widgetCount; --} -- --/** -- * Find the border point of the given rect when a line is drawn from the -- * given point to the rect. -- * @param rect rect of a classifier -- * @param line a line to the rect -- * @param intersectionPoint the intercept point on the border of the rect -- * @return the type of the intersection @ref QLineF::IntersectType -- */ --QLineF::IntersectType AssociationWidget::intersect(const QRectF &rect, const QLineF &line, -- QPointF* intersectionPoint) --{ -- QList lines; -- lines << QLineF(rect.topLeft(), rect.topRight()); -- lines << QLineF(rect.topRight(), rect.bottomRight()); -- lines << QLineF(rect.bottomRight(), rect.bottomLeft()); -- lines << QLineF(rect.bottomLeft(), rect.topLeft()); -- foreach (const QLineF& rectLine, lines) { -- QLineF::IntersectType type = rectLine.intersect(line, intersectionPoint); -- if (type == QLineF::BoundedIntersection) { -- return type; -- } -- } -- return QLineF::NoIntersection; --} -- --/** -- * Given a rectangle and a point, findInterceptOnEdge computes the -- * connecting line between the middle point of the rectangle and -- * the point, and returns the intercept of this line with the -- * the edge of the rectangle identified by `region'. -- * When the region is North or South, the X value is returned (Y is -- * constant.) -- * When the region is East or West, the Y value is returned (X is -- * constant.) -- * @todo This is buggy. Try replacing by intersect() -- */ --qreal AssociationWidget::findInterceptOnEdge(const QRectF &rect, -- Uml::Region::Enum region, -- const QPointF &point) --{ -- // The Qt coordinate system has (0, 0) in the top left corner. -- // In order to go to the regular XY coordinate system with (0, 0) -- // in the bottom left corner, we swap the X and Y axis. -- // That's why the following assignments look twisted. -- const qreal rectHalfWidth = rect.height() / 2.0; -- const qreal rectHalfHeight = rect.width() / 2.0; -- const qreal rectMidX = rect.y() + rectHalfWidth; -- const qreal rectMidY = rect.x() + rectHalfHeight; -- const qreal dX = rectMidX - point.y(); -- const qreal dY = rectMidY - point.x(); -- switch (region) { -- case Uml::Region::West: -- region = Uml::Region::South; -- break; -- case Uml::Region::North: -- region = Uml::Region::West; -- break; -- case Uml::Region::East: -- region = Uml::Region::North; -- break; -- case Uml::Region::South: -- region = Uml::Region::East; -- break; -- default: -- break; -- } -- // Now we have regular coordinates with the point (0, 0) in the -- // bottom left corner. -- if (region == Uml::Region::North || region == Uml::Region::South) { -- if (dX == 0) -- return rectMidY; -- // should be rectMidX, but we go back to Qt coord.sys. -- if (dY == 0) { -- uError() << "usage error: " << "North/South (dY == 0)"; -- return -1.0; -- } -- const qreal m = dY / dX; -- qreal relativeX; -- if (region == Uml::Region::North) -- relativeX = rectHalfHeight / m; -- else -- relativeX = -rectHalfHeight / m; -- return (rectMidY + relativeX); -- // should be rectMidX, but we go back to Qt coord.sys. -- } else { -- if (dY == 0) -- return rectMidX; -- // should be rectMidY, but we go back to Qt coord.sys. -- if (dX == 0) { -- uError() << "usage error: " << "East/West (dX == 0)"; -- return -1.0; -- } -- const qreal m = dY / dX; -- qreal relativeY = m * rectHalfWidth; -- if (region == Uml::Region::West) -- relativeY = -relativeY; -- return (rectMidX + relativeY); -- // should be rectMidY, but we go back to Qt coord.sys. -- } --} -- --/** -- * Auxiliary method for updateAssociations(): -- * Put position into m_positions and assoc into m_ordered at the -- * correct index. -- * m_positions and m_ordered move in parallel and are sorted by -- * ascending position. -- */ --void AssociationWidget::insertIntoLists(qreal position, const AssociationWidget* assoc) --{ -- bool did_insertion = false; -- for (int index = 0; index < m_positions_len; ++index) { -- if (position < m_positions[index]) { -- for (int moveback = m_positions_len; moveback > index; moveback--) -- m_positions[moveback] = m_positions[moveback - 1]; -- m_positions[index] = position; -- m_ordered.insert(index, const_cast(assoc)); -- did_insertion = true; -- break; -- } -- } -- if (! did_insertion) { -- m_positions[m_positions_len] = position; -- m_ordered.append(const_cast(assoc)); -- } -- m_positions_len++; --} -- --/** -- * Tells all the other view associations the new count for the -- * given widget on a certain region. And also what index they should be. -- */ --void AssociationWidget::updateAssociations(int totalCount, -- Uml::Region::Enum region, -- Uml::RoleType::Enum role) --{ -- if ((region == Uml::Region::Error) | (umlScene() == NULL)) { -- return; -- } -- AssociationWidgetList list = m_scene->associationList(); -- -- UMLWidget *ownWidget = m_role[role].umlWidget; -- m_positions_len = 0; -- m_ordered.clear(); -- // we order the AssociationWidget list by region and x/y value -- foreach (AssociationWidget* assocwidget, list) { -- WidgetRole *roleA = &assocwidget->m_role[RoleType::A]; -- WidgetRole *roleB = &assocwidget->m_role[RoleType::B]; -- UMLWidget *wA = roleA->umlWidget; -- UMLWidget *wB = roleB->umlWidget; -- // Skip self associations. -- if (wA == wB) -- continue; -- // Now we must find out with which end the assocwidget connects -- // to the input widget (ownWidget). -- bool inWidgetARegion = (ownWidget == wA && -- region == roleA->m_WidgetRegion); -- bool inWidgetBRegion = (ownWidget == wB && -- region == roleB->m_WidgetRegion); -- if (!inWidgetARegion && !inWidgetBRegion) -- continue; -- // Determine intercept position on the edge indicated by `region'. -- UMLWidget * otherWidget = (inWidgetARegion ? wB : wA); -- AssociationLine *linepath = assocwidget->associationLine(); -- QPointF refpoint; -- if (assocwidget->linePathStartsAt(otherWidget)) -- refpoint = linepath->point(linepath->count() - 2); -- else -- refpoint = linepath->point(1); -- // The point is authoritative if we're called for the second time -- // (i.e. role==B) or it is a waypoint on the line path. -- bool pointIsAuthoritative = (role == RoleType::B || linepath->count() > 2); -- if (! pointIsAuthoritative) { -- // If the point is not authoritative then we use the other -- // widget's center. -- refpoint.setX(otherWidget->x() + otherWidget->width() / 2); -- refpoint.setY(otherWidget->y() + otherWidget->height() / 2); -- } -- qreal intercept = findInterceptOnEdge(ownWidget->rect(), region, refpoint); -- if (intercept < 0) { -- DEBUG(DBG_SRC) << "error from findInterceptOnEdge for" -- << " assocType=" << assocwidget->associationType() -- << " ownWidget=" << ownWidget->name() -- << " otherWidget=" << otherWidget->name(); -- continue; -- } -- insertIntoLists(intercept, assocwidget); -- } // while ((assocwidget = assoc_it.current())) -- -- // we now have an ordered list and we only have to call updateRegionLineCount -- int index = 1; -- foreach (AssociationWidget* assocwidget, m_ordered ) { -- if (ownWidget == assocwidget->widgetForRole(RoleType::A)) { -- assocwidget->updateRegionLineCount(index++, totalCount, region, RoleType::A); -- } else if (ownWidget == assocwidget->widgetForRole(RoleType::B)) { -- assocwidget->updateRegionLineCount(index++, totalCount, region, RoleType::B); -- } -- } // for (assocwidget = ordered.first(); ...) --} -- --/** -- * Called to tell the association that another association has added -- * a line to the region of one of its widgets. The widget is identified -- * by its role (A or B). -- * -- * Called by @ref updateAssociations which is called by -- * @ref calculateEndingPoints when required. -- */ --void AssociationWidget::updateRegionLineCount(int index, int totalCount, -- Uml::Region::Enum region, -- Uml::RoleType::Enum role) --{ -- if ((region == Uml::Region::Error) | (umlScene() == NULL)) { -- return; -- } -- // If the association is to self and the line ends are on the same region then -- // use a different calculation. -- if (isSelf() && -- m_role[RoleType::A].m_WidgetRegion == m_role[RoleType::B].m_WidgetRegion) { -- UMLWidget * pWidget = m_role[RoleType::A].umlWidget; -- qreal x = pWidget->x(); -- qreal y = pWidget->y(); -- qreal wh = pWidget->height(); -- qreal ww = pWidget->width(); -- int size = m_associationLine->count(); -- // See if above widget ok to place assoc. -- switch( m_role[RoleType::A].m_WidgetRegion ) { -- case Uml::Region::North: -- m_associationLine->setPoint( 0, QPointF( x + ( ww / 4 ), y ) ); -- m_associationLine->setPoint( size - 1, QPointF(x + ( ww * 3 / 4 ), y ) ); -- break; -- -- case Uml::Region::South: -- m_associationLine->setPoint( 0, QPointF( x + ( ww / 4 ), y + wh ) ); -- m_associationLine->setPoint( size - 1, QPointF( x + ( ww * 3 / 4 ), y + wh ) ); -- break; -- -- case Uml::Region::East: -- m_associationLine->setPoint( 0, QPointF( x + ww, y + ( wh / 4 ) ) ); -- m_associationLine->setPoint( size - 1, QPointF( x + ww, y + ( wh * 3 / 4 ) ) ); -- break; -- -- case Uml::Region::West: -- m_associationLine->setPoint( 0, QPointF( x, y + ( wh / 4 ) ) ); -- m_associationLine->setPoint( size - 1, QPointF( x, y + ( wh * 3 / 4 ) ) ); -- break; -- default: -- break; -- }//end switch -- -- return; -- } -- -- WidgetRole& robj = m_role[role]; -- UMLWidget * pWidget = robj.umlWidget; -- -- robj.m_nIndex = index; -- robj.m_nTotalCount = totalCount; -- qreal x = pWidget->x(); -- qreal y = pWidget->y(); -- qreal ww = pWidget->width(); -- qreal wh = pWidget->height(); -- const bool angular = Settings::optionState().generalState.angularlines; -- qreal ch = 0; -- qreal cw = 0; -- if (angular) { -- uint nind = (role == RoleType::A ? 1 : m_associationLine->count() - 2); -- QPointF neighbour = m_associationLine->point(nind); -- if (neighbour.x() < x) -- cw = 0; -- else if (neighbour.x() > x + ww) -- cw = 0 + ww; -- else -- cw = neighbour.x() - x; -- if (neighbour.y() < y) -- ch = 0; -- else if (neighbour.y() > y + wh) -- ch = 0 + wh; -- else -- ch = neighbour.y() - y; -- } else { -- ch = wh * index / totalCount; -- cw = ww * index / totalCount; -- } -- -- qreal newX = x + cw; -- qreal newY = y + ch; -- -- QPointF pt; -- if (angular) { -- pt = QPointF(newX, newY); -- } else { -- UMLWidget *pWidgetA = m_role[RoleType::A].umlWidget; -- UMLWidget *pWidgetB = m_role[RoleType::B].umlWidget; -- QList polyListA = pWidgetA->shape().toSubpathPolygons(); -- QPolygonF polyA = polyListA.at(0); -- if (polyListA.size() > 1) { -- for (int i = 1; i < polyListA.size(); i++) { -- polyA = polyA.united(polyListA.at(i)); -- } -- } -- polyA = polyA.translated(pWidgetA->pos()); -- QList polyListB = pWidgetB->shape().toSubpathPolygons(); -- QPolygonF polyB = polyListB.at(0); -- if (polyListB.size() > 1) { -- for (int i = 1; i < polyListB.size(); i++) { -- polyB = polyB.united(polyListB.at(i)); -- } -- } -- polyB = polyB.translated(pWidgetB->pos()); -- QLineF nearestPoints = Widget_Utils::closestPoints(polyA, polyB); -- if (nearestPoints.isNull()) { -- uError() << "Widget_Utils::closestPoints failed, falling back to simple widget positions"; -- switch(region) { -- case Uml::Region::West: -- pt.setX(x); -- pt.setY(newY); -- break; -- case Uml::Region::North: -- pt.setX(newX); -- pt.setY(y); -- break; -- case Uml::Region::East: -- pt.setX(x + ww); -- pt.setY(newY); -- break; -- case Uml::Region::South: -- pt.setX(newX); -- pt.setY(y + wh); -- break; -- case Uml::Region::Center: -- pt.setX(x + ww / 2); -- pt.setY(y + wh / 2); -- break; -- default: -- break; -- } -- } else { -- if (role == RoleType::A) -- pt = nearestPoints.p1(); -- else -- pt = nearestPoints.p2(); -- } -- } -- if (role == RoleType::A) { -- m_associationLine->setPoint(0, pt); -- } -- else { -- m_associationLine->setPoint(m_associationLine->count() - 1, pt); -- } --} -- --/** -- * Sets the state of whether the widget is selected. -- * -- * @param _select The state of whether the widget is selected. -- */ --void AssociationWidget::setSelected(bool _select /* = true */) --{ -- WidgetBase::setSelected(_select); -- if ( m_nameWidget) -- m_nameWidget->setSelected( _select ); -- if ( m_role[RoleType::A].roleWidget ) -- m_role[RoleType::A].roleWidget->setSelected( _select ); -- if ( m_role[RoleType::B].roleWidget ) -- m_role[RoleType::B].roleWidget->setSelected( _select ); -- if ( m_role[RoleType::A].multiplicityWidget ) -- m_role[RoleType::A].multiplicityWidget->setSelected( _select ); -- if ( m_role[RoleType::B].multiplicityWidget ) -- m_role[RoleType::B].multiplicityWidget->setSelected( _select ); -- if ( m_role[RoleType::A].changeabilityWidget) -- m_role[RoleType::A].changeabilityWidget->setSelected( _select ); -- if ( m_role[RoleType::B].changeabilityWidget) -- m_role[RoleType::B].changeabilityWidget->setSelected( _select ); -- -- // Update the docwindow for this association. -- // This is done last because each of the above setSelected calls -- // overwrites the docwindow, but we want the main association doc -- // to win. -- if (_select) { -- if (m_scene->selectedCount() == 0) -- UMLApp::app()->docWindow()->showDocumentation(this, false); -- } else -- UMLApp::app()->docWindow()->updateDocumentation(true); -- -- m_associationLine->setSelected(_select); -- if (! _select) { -- // For now, if _select is true we don't make the assoc class line -- // selected. But that's certainly open for discussion. -- // At any rate, we need to deselect the assoc class line -- // if _select is false. -- selectAssocClassLine(false); -- } -- UMLApp::app()->document()->writeToStatusBar(_select ? i18n("Press Ctrl with left mouse click to delete a point") : QString()); --} -- --/** -- * Reimplement method from WidgetBase in order to check owned floating texts. -- * -- * @param p Point to be checked. -- * -- * @return m_nameWidget if m_nameWidget is non NULL and m_nameWidget->onWidget(p) returns non NULL; -- * m_role[0].(multiplicity|changeability|role)Widget if the resp. widget is non NULL and -- * its onWidget(p) returns non NULL; -- * m_role[1].(multiplicity|changeability|role)Widget if the resp. widget is non NULL and -- * its onWidget(p) returns non NULL; -- * else NULL. -- */ --UMLWidget* AssociationWidget::onWidget(const QPointF &p) --{ -- if (m_nameWidget && m_nameWidget->onWidget(p)) { -- return m_nameWidget; -- } -- for (int i = 0; i <= 1; i++) { -- const WidgetRole& r = m_role[i]; -- if (r.multiplicityWidget && r.multiplicityWidget->onWidget(p)) -- return r.multiplicityWidget; -- if (r.changeabilityWidget && r.changeabilityWidget->onWidget(p)) -- return r.changeabilityWidget; -- if (r.roleWidget && r.roleWidget->onWidget(p)) -- return r.roleWidget; -- } -- return NULL; --} -- --/** -- * Returns true if the given point is on the connecting line to -- * the association class. Returns false if there is no association -- * class attached, or if the given point is not on the connecting -- * line. -- */ --bool AssociationWidget::onAssocClassLine(const QPointF &point) --{ -- bool onLine = false; -- if (m_pAssocClassLine) { --//:TODO: --// const QPointF mapped = m_pAssocClassLine->mapFromParent(point); --// bool onLine = m_pAssocClassLine->contains(mapped); --// return onLine; -- UMLSceneItemList list = m_scene->collisions(point); -- UMLSceneItemList::iterator end(list.end()); -- for (UMLSceneItemList::iterator item_it(list.begin()); item_it != end; ++item_it) { -- if (*item_it == m_pAssocClassLine) { -- onLine = true; -- break; -- } -- } -- } -- DEBUG(DBG_SRC) << onLine; -- return onLine; --} -- --/** -- * Returns true if the given point is on the association line. -- * A circle (rectangle) around the point is used to obtain more tolerance. -- * @param point the point to check -- * @return flag whether point is on association line -- */ --bool AssociationWidget::onAssociation(const QPointF& point) --{ -- // check the path -- const qreal diameter(4.0); -- QPainterPath path = m_associationLine->shape(); -- if (path.contains(point)) { -- DEBUG(DBG_SRC) << "on path"; -- return true; -- } -- // check also the points -- if (m_associationLine->layout() == AssociationLine::Spline) { -- if (m_associationLine->closestPointIndex(point, diameter) > -1) { -- DEBUG(DBG_SRC) << "on spline point"; -- return true; -- } -- } -- return onAssocClassLine(point); --} -- --/** -- * Set all association points to x coordinate. -- */ --void AssociationWidget::setXEntireAssoc(qreal x) --{ -- for (int i = 0; i < m_associationLine->count(); ++i) { -- QPointF p = m_associationLine->point(i); -- p.setX(x); -- m_associationLine->setPoint(i, p); -- } --} -- --/** -- * Set all association points to y coordinate. -- */ --void AssociationWidget::setYEntireAssoc(qreal y) --{ -- for (int i = 0; i < m_associationLine->count(); ++i) { -- QPointF p = m_associationLine->point(i); -- p.setY(y); -- m_associationLine->setPoint(i, p); -- } --} -- --/** -- * Moves all the mid points (all expcept start /end) by the given amount. -- */ --void AssociationWidget::moveMidPointsBy(qreal x, qreal y) --{ -- int pos = m_associationLine->count() - 1; -- for (int i = 1; i < (int)pos; ++i) { -- QPointF p = m_associationLine->point( i ); -- qreal newX = p.x() + x; -- qreal newY = p.y() + y; -- p.setX( newX ); -- p.setY( newY ); -- m_associationLine->setPoint( i, p ); -- } --} -- --/** -- * Moves the entire association by the given offset. -- */ --void AssociationWidget::moveEntireAssoc(qreal x, qreal y) --{ -- //TODO: ADD SUPPORT FOR ASSOC. ON SEQ. DIAGRAMS WHEN NOTES BACK IN. -- moveMidPointsBy(x, y); -- calculateEndingPoints(); -- calculateNameTextSegment(); -- resetTextPositions(); --} -- --/** -- * Returns the bounding rectangle of all segments of the association. -- */ --QRectF AssociationWidget::boundingRect() const --{ -- return m_associationLine->boundingRect(); --} -- --/** -- * Returns the shape of all segments of the association. -- */ --QPainterPath AssociationWidget::shape() const --{ -- return m_associationLine->shape(); --} -- --/** -- * Connected to UMLClassifier::attributeRemoved() or UMLEntity::constraintRemoved() -- * in case this AssociationWidget is linked to a clasifier list item -- * (an attribute or a foreign key constraint) -- * -- * @param obj The UMLClassifierListItem removed. -- */ --void AssociationWidget::slotClassifierListItemRemoved(UMLClassifierListItem* obj) --{ -- if (obj != m_umlObject) { -- DEBUG(DBG_SRC) << "obj=" << obj << ": m_umlObject=" << m_umlObject; -- return; -- } -- m_umlObject = 0; -- m_scene->removeAssoc(this); --} -- --/** -- * Connected to UMLObject::modified() in case this -- * AssociationWidget is linked to a classifer's attribute type. -- */ --void AssociationWidget::slotAttributeChanged() --{ -- UMLAttribute *attr = attribute(); -- if (attr == NULL) { -- uError() << "attribute() returns NULL"; -- return; -- } -- setVisibility(attr->visibility(), RoleType::B); -- setRoleName(attr->name(), RoleType::B); --} -- --void AssociationWidget::clipSize() --{ -- if (m_nameWidget) -- m_nameWidget->clipSize(); -- -- if (m_role[RoleType::A].multiplicityWidget) -- m_role[RoleType::A].multiplicityWidget->clipSize(); -- -- if (m_role[RoleType::B].multiplicityWidget) -- m_role[RoleType::B].multiplicityWidget->clipSize(); -- -- if (m_role[RoleType::A].roleWidget) -- m_role[RoleType::A].roleWidget->clipSize(); -- -- if (m_role[RoleType::B].roleWidget) -- m_role[RoleType::B].roleWidget->clipSize(); -- -- if (m_role[RoleType::A].changeabilityWidget) -- m_role[RoleType::A].changeabilityWidget->clipSize(); -- -- if (m_role[RoleType::B].changeabilityWidget) -- m_role[RoleType::B].changeabilityWidget->clipSize(); -- -- if (m_associationClass) -- m_associationClass->clipSize(); --} -- --/** -- * Event handler for context menu events, called from the line segments. -- */ --void AssociationWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) --{ -- const Uml::AssociationType::Enum type = associationType(); -- ListPopupMenu::MenuType menuType = ListPopupMenu::mt_Association_Selected; -- if ((type == Uml::AssociationType::Anchor) || -- onAssocClassLine(event->scenePos())) { -- menuType = ListPopupMenu::mt_Anchor; -- } else if (isCollaboration()) { -- menuType = ListPopupMenu::mt_Collaboration_Message; -- } else if (!association()) { -- menuType = ListPopupMenu::mt_AttributeAssociation; -- } else if (AssocRules::allowRole(type)) { -- menuType = ListPopupMenu::mt_FullAssociation; -- } -- -- event->accept(); -- DEBUG(DBG_SRC) << "menue type = " << ListPopupMenu::toString(menuType) -- << " / association = " << Uml::AssociationType::toString(type); -- -- UMLScene *scene = umlScene(); -- QWidget *parent = 0; -- if (scene) { -- parent = scene->activeView(); -- } -- -- if (!isSelected() && scene && !scene->selectedItems().isEmpty()) { -- Qt::KeyboardModifiers forSelection = (Qt::ControlModifier | Qt::ShiftModifier); -- if ((event->modifiers() & forSelection) == 0) { -- scene->clearSelection(); -- } -- } -- setSelected(true); -- m_eventScenePos = event->scenePos(); -- ListPopupMenu popup(parent, menuType, this); -- QAction *triggered = popup.exec(event->screenPos()); -- ListPopupMenu *parentMenu = ListPopupMenu::menuFromAction(triggered); -- -- if (!parentMenu) { -- uWarning() << "Action's data field does not contain ListPopupMenu pointer"; -- return; -- } -- -- WidgetBase *ownerWidget = parentMenu->ownerWidget(); -- // assert because logic is based on only WidgetBase being the owner of -- // ListPopupMenu actions executed in this context menu. -- Q_ASSERT_X(ownerWidget != 0, "AssociationWidget::contextMenuEvent", -- "ownerWidget is null which means action belonging to UMLView, UMLScene" -- " or UMLObject is the one triggered in ListPopupMenu"); -- -- ownerWidget->slotMenuSelection(triggered); --} -- --/** -- * Reimplemented event handler for hover enter events. -- */ --void AssociationWidget::hoverEnterEvent(QGraphicsSceneHoverEvent *event) --{ -- associationLine()->hoverEnterEvent(event); --} -- --/** -- * Reimplemented event handler for hover leave events. -- */ --void AssociationWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) --{ -- associationLine()->hoverLeaveEvent(event); --} -- --/** -- * Reimplemented event handler for hover move events. -- */ --void AssociationWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event) --{ -- associationLine()->hoverMoveEvent(event); --} -- --/** -- * Saves this widget to the "assocwidget" XMI element. -- */ --void AssociationWidget::saveToXMI(QDomDocument &qDoc, QDomElement &qElement) --{ -- QDomElement assocElement = qDoc.createElement(QLatin1String("assocwidget")); -- -- WidgetBase::saveToXMI(qDoc, assocElement); -- LinkWidget::saveToXMI(qDoc, assocElement); -- if (m_umlObject) { -- assocElement.setAttribute(QLatin1String("xmi.id"), Uml::ID::toString(m_umlObject->id())); -- } -- assocElement.setAttribute(QLatin1String("type"), associationType()); -- if (!association()) { -- assocElement.setAttribute(QLatin1String("visibilityA"), visibility(RoleType::A)); -- assocElement.setAttribute(QLatin1String("visibilityB"), visibility(RoleType::B)); -- assocElement.setAttribute(QLatin1String("changeabilityA"), changeability(RoleType::A)); -- assocElement.setAttribute(QLatin1String("changeabilityB"), changeability(RoleType::B)); -- if (m_umlObject == NULL) { -- assocElement.setAttribute(QLatin1String("roleAdoc"), roleDocumentation(RoleType::A)); -- assocElement.setAttribute(QLatin1String("roleBdoc"), roleDocumentation(RoleType::B)); -- assocElement.setAttribute(QLatin1String("documentation"), documentation()); -- } -- } -- assocElement.setAttribute(QLatin1String("widgetaid"), Uml::ID::toString(widgetIDForRole(RoleType::A))); -- assocElement.setAttribute(QLatin1String("widgetbid"), Uml::ID::toString(widgetIDForRole(RoleType::B))); -- assocElement.setAttribute(QLatin1String("indexa"), m_role[RoleType::A].m_nIndex); -- assocElement.setAttribute(QLatin1String("indexb"), m_role[RoleType::B].m_nIndex); -- assocElement.setAttribute(QLatin1String("totalcounta"), m_role[RoleType::A].m_nTotalCount); -- assocElement.setAttribute(QLatin1String("totalcountb"), m_role[RoleType::B].m_nTotalCount); -- m_associationLine->saveToXMI(qDoc, assocElement); -- -- if (m_nameWidget) { -- m_nameWidget->saveToXMI(qDoc, assocElement); -- } -- -- if (multiplicityWidget(RoleType::A)) { -- multiplicityWidget(RoleType::A)->saveToXMI(qDoc, assocElement); -- } -- -- if (multiplicityWidget(RoleType::B)) { -- multiplicityWidget(RoleType::B)->saveToXMI(qDoc, assocElement); -- } -- -- if (roleWidget(RoleType::A)) { -- roleWidget(RoleType::A)->saveToXMI(qDoc, assocElement); -- } -- -- if (roleWidget(RoleType::B)) { -- roleWidget(RoleType::B)->saveToXMI(qDoc, assocElement); -- } -- -- if (changeabilityWidget(RoleType::A)) { -- changeabilityWidget(RoleType::A)->saveToXMI(qDoc, assocElement); -- } -- -- if (changeabilityWidget(RoleType::B)) { -- changeabilityWidget(RoleType::B)->saveToXMI(qDoc, assocElement); -- } -- -- if (m_associationClass) { -- QString acid = Uml::ID::toString(m_associationClass->id()); -- assocElement.setAttribute(QLatin1String("assocclass"), acid); -- assocElement.setAttribute(QLatin1String("aclsegindex"), m_nLinePathSegmentIndex); -- } -- -- qElement.appendChild(assocElement); --} -- --/** -- * Uses the supplied widgetList for resolving -- * the role A and role B widgets. (The other loadFromXMI() queries -- * the UMLView for these widgets.) -- * Required for clipboard operations. -- */ --bool AssociationWidget::loadFromXMI(QDomElement& qElement, -- const UMLWidgetList& widgets, -- const MessageWidgetList* messages) --{ -- if (!WidgetBase::loadFromXMI(qElement)) { -- return false; -- } -- -- if (!LinkWidget::loadFromXMI(qElement)) { -- return false; -- } -- -- // load child widgets first -- QString widgetaid = qElement.attribute(QLatin1String("widgetaid"), QLatin1String("-1")); -- QString widgetbid = qElement.attribute(QLatin1String("widgetbid"), QLatin1String("-1")); -- Uml::ID::Type aId = Uml::ID::fromString(widgetaid); -- Uml::ID::Type bId = Uml::ID::fromString(widgetbid); -- UMLWidget *pWidgetA = Widget_Utils::findWidget(aId, widgets, messages); -- if (!pWidgetA) { -- uError() << "cannot find widget for roleA id " << Uml::ID::toString(aId); -- return false; -- } -- UMLWidget *pWidgetB = Widget_Utils::findWidget(bId, widgets, messages); -- if (!pWidgetB) { -- uError() << "cannot find widget for roleB id " << Uml::ID::toString(bId); -- return false; -- } -- setWidgetForRole(pWidgetA, RoleType::A); -- setWidgetForRole(pWidgetB, RoleType::B); -- -- QString type = qElement.attribute(QLatin1String("type"), QLatin1String("-1")); -- Uml::AssociationType::Enum aType = Uml::AssociationType::fromInt(type.toInt()); -- -- QString id = qElement.attribute(QLatin1String("xmi.id"), QLatin1String("-1")); -- bool oldStyleLoad = false; -- if (id == QLatin1String("-1")) { -- // xmi.id not present, ergo either a pure widget association, -- // or old (pre-1.2) style: -- // Everything is loaded from the AssociationWidget. -- // UMLAssociation may or may not be saved - if it is, it's a dummy. -- // Create the UMLAssociation if both roles are UML objects; -- // else load the info locally. -- -- if (Uml::AssociationType::hasUMLRepresentation(aType)) { -- // lack of an association in our widget AND presence of -- // both uml objects for each role clearly identifies this -- // as reading in an old-school file. Note it as such, and -- // create, and add, the UMLAssociation for this widget. -- // Remove this special code when backwards compatibility -- // with older files isn't important anymore. -b.t. -- UMLObject* umlRoleA = pWidgetA->umlObject(); -- UMLObject* umlRoleB = pWidgetB->umlObject(); -- if (!m_umlObject && umlRoleA && umlRoleB) { -- oldStyleLoad = true; // flag for further special config below -- if (aType == AssociationType::Aggregation || aType == AssociationType::Composition) { -- uWarning()<<" Old Style save file? swapping roles on association widget"<umlObject(); -- umlRoleB = pWidgetB->umlObject(); -- } -- -- setUMLAssociation(umlDoc()->createUMLAssociation(umlRoleA, umlRoleB, aType)); -- } -- } -- -- setDocumentation(qElement.attribute(QLatin1String("documentation"))); -- setRoleDocumentation(qElement.attribute(QLatin1String("roleAdoc")), RoleType::A); -- setRoleDocumentation(qElement.attribute(QLatin1String("roleBdoc")), RoleType::B); -- -- // visibility defaults to Public if it cant set it here.. -- QString visibilityA = qElement.attribute(QLatin1String("visibilityA"), QLatin1String("0")); -- int vis = visibilityA.toInt(); -- if (vis >= 200) { // bkwd compat. -- vis -= 200; -- } -- setVisibility((Uml::Visibility::Enum)vis, RoleType::A); -- -- QString visibilityB = qElement.attribute(QLatin1String("visibilityB"), QLatin1String("0")); -- vis = visibilityB.toInt(); -- if (vis >= 200) { // bkwd compat. -- vis -= 200; -- } -- setVisibility((Uml::Visibility::Enum)vis, RoleType::B); -- -- // Changeability defaults to "Changeable" if it cant set it here.. -- QString changeabilityA = qElement.attribute(QLatin1String("changeabilityA"), QLatin1String("0")); -- if (changeabilityA.toInt() > 0) -- setChangeability(Uml::Changeability::fromInt(changeabilityA.toInt()), RoleType::A); -- -- QString changeabilityB = qElement.attribute(QLatin1String("changeabilityB"), QLatin1String("0")); -- if (changeabilityB.toInt() > 0) -- setChangeability(Uml::Changeability::fromInt(changeabilityB.toInt()), RoleType::B); -- -- } else { -- -- // we should disconnect any prior association (can this happen??) -- if (m_umlObject && m_umlObject->baseType() == UMLObject::ot_Association) { -- UMLAssociation *umla = association(); -- umla->disconnect(this); -- umla->nrof_parent_widgets--; -- } -- -- // New style: The xmi.id is a reference to the UMLAssociation. -- // If the UMLObject is not found right now, we try again later -- // during the type resolution pass - see activate(). -- m_nId = Uml::ID::fromString(id); -- UMLObject *myObj = umlDoc()->findObjectById(m_nId); -- if (myObj) { -- const UMLObject::ObjectType ot = myObj->baseType(); -- if (ot != UMLObject::ot_Association) { -- setUMLObject(myObj); -- } else { -- UMLAssociation * myAssoc = static_cast(myObj); -- setUMLAssociation(myAssoc); -- if (type == QLatin1String("-1")) -- aType = myAssoc->getAssocType(); -- } -- } -- } -- -- setAssociationType(aType); -- -- QString indexa = qElement.attribute(QLatin1String("indexa"), QLatin1String("0")); -- QString indexb = qElement.attribute(QLatin1String("indexb"), QLatin1String("0")); -- QString totalcounta = qElement.attribute(QLatin1String("totalcounta"), QLatin1String("0")); -- QString totalcountb = qElement.attribute(QLatin1String("totalcountb"), QLatin1String("0")); -- m_role[RoleType::A].m_nIndex = indexa.toInt(); -- m_role[RoleType::B].m_nIndex = indexb.toInt(); -- m_role[RoleType::A].m_nTotalCount = totalcounta.toInt(); -- m_role[RoleType::B].m_nTotalCount = totalcountb.toInt(); -- -- QString assocclassid = qElement.attribute(QLatin1String("assocclass")); -- if (! assocclassid.isEmpty()) { -- Uml::ID::Type acid = Uml::ID::fromString(assocclassid); -- UMLWidget *w = Widget_Utils::findWidget(acid, widgets); -- if (w) { -- ClassifierWidget* aclWidget = static_cast(w); -- QString aclSegIndex = qElement.attribute(QLatin1String("aclsegindex"), QLatin1String("0")); -- createAssocClassLine(aclWidget, aclSegIndex.toInt()); -- } else { -- uError() << "cannot find assocclass " << assocclassid; -- } -- } -- -- //now load child elements -- QDomNode node = qElement.firstChild(); -- QDomElement element = node.toElement(); -- while (!element.isNull()) { -- QString tag = element.tagName(); -- if (tag == QLatin1String("linepath")) { -- if (!m_associationLine->loadFromXMI(element)) { -- return false; -- } -- } else if (tag == QLatin1String("floatingtext") || -- tag == QLatin1String("UML:FloatingTextWidget")) { // for bkwd compatibility -- QString r = element.attribute(QLatin1String("role"), QLatin1String("-1")); -- if (r == QLatin1String("-1")) -- return false; -- Uml::TextRole::Enum role = Uml::TextRole::fromInt(r.toInt()); -- FloatingTextWidget *ft = new FloatingTextWidget(m_scene, role, QString(), Uml::ID::Reserved); -- if (! ft->loadFromXMI(element)) { -- // Most likely cause: The FloatingTextWidget is empty. -- delete ft; -- node = element.nextSibling(); -- element = node.toElement(); -- continue; -- } -- // always need this -- ft->setParentItem(this); -- ft->setLink(this); -- ft->setSequenceNumber(m_SequenceNumber); -- ft->setFontCmd(ft->font()); -- -- switch(role) { -- case Uml::TextRole::MultiA: -- m_role[RoleType::A].multiplicityWidget = ft; -- if (oldStyleLoad) -- setMultiplicity(m_role[RoleType::A].multiplicityWidget->text(), RoleType::A); -- break; -- -- case Uml::TextRole::MultiB: -- m_role[RoleType::B].multiplicityWidget = ft; -- if (oldStyleLoad) -- setMultiplicity(m_role[RoleType::B].multiplicityWidget->text(), RoleType::B); -- break; -- -- case Uml::TextRole::ChangeA: -- m_role[RoleType::A].changeabilityWidget = ft; -- break; -- -- case Uml::TextRole::ChangeB: -- m_role[RoleType::B].changeabilityWidget = ft; -- break; -- -- case Uml::TextRole::Name: -- m_nameWidget = ft; -- if (oldStyleLoad) -- setName(m_nameWidget->text()); -- break; -- -- case Uml::TextRole::Coll_Message: -- case Uml::TextRole::Coll_Message_Self: -- m_nameWidget = ft; -- ft->setLink(this); -- ft->setActivated(); -- if (FloatingTextWidget::isTextValid(ft->text())) -- ft->show(); -- else -- ft->hide(); -- break; -- -- case Uml::TextRole::RoleAName: -- m_role[RoleType::A].roleWidget = ft; -- setRoleName(ft->text(), RoleType::A); -- break; -- case Uml::TextRole::RoleBName: -- m_role[RoleType::B].roleWidget = ft; -- setRoleName(ft->text(), RoleType::B); -- break; -- default: -- DEBUG(DBG_SRC) << "unexpected FloatingTextWidget (TextRole::Enum " << role << ")"; -- delete ft; -- break; -- } -- } -- node = element.nextSibling(); -- element = node.toElement(); -- } -- -- return true; --} -- --/** -- * Queries the UMLView for resolving the role A and role B widgets. -- * .... -- */ --bool AssociationWidget::loadFromXMI(QDomElement& qElement) --{ -- UMLScene *scene = umlScene(); -- if (scene) { -- const UMLWidgetList& widgetList = scene->widgetList(); -- const MessageWidgetList& messageList = scene->messageList(); -- return loadFromXMI(qElement, widgetList, &messageList); -- } -- else { -- DEBUG(DBG_SRC) << "This isn't on UMLScene yet, so can neither fetch" -- "messages nor widgets on umlscene"; -- return false; -- } --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/associationwidget.h umbrello-kf6-15.08.1/umbrello/widgets/associationwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/associationwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/associationwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,328 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ASSOCIATIONWIDGET_H --#define ASSOCIATIONWIDGET_H -- --#include "associationwidgetlist.h" --#include "linkwidget.h" --#include "messagewidgetlist.h" --#include "umlwidgetlist.h" --#include "widgetbase.h" -- --class AssociationLine; --class ClassifierWidget; --class UMLScene; --class UMLAssociation; --class UMLAttribute; --class UMLClassifierListItem; --class UMLOperation; -- --/** -- * This class represents an association inside a diagram. -- * -- * Constructor is made non accessible: -- * Users shall use the static create() methods for constructing AssociationWidgets. -- * -- * Associations exist not only between UML objects. For example, when a Note is -- * attached to a UML object, the Note itself is not a UML object. -- * This class supports both kinds of associations. An association where one or -- * both roles are not a UML object is called a "pure widget association". -- * -- * An AssociationWidget where both roles are UML objects has a corresponding -- * UMLAssociation. The UMLAssociation can be retrieved using the getAssociation -- * method. -- * A pure widget association does not have a corresponding UMLAssociation. -- * The getAssociation method returns NULL in this case. -- * -- * @author Gustavo Madrigal -- * @author Gopala Krishna -- * @short This class represents an association inside a diagram. -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class AssociationWidget : public WidgetBase, public LinkWidget --{ -- Q_OBJECT --public: -- static AssociationWidget* create(UMLScene *scene); -- static AssociationWidget* create -- (UMLScene *scene, UMLWidget* WidgetA, -- Uml::AssociationType::Enum assocType, UMLWidget* WidgetB, -- UMLObject *umlobject = NULL); -- -- virtual ~AssociationWidget(); -- -- virtual void setUMLObject(UMLObject *obj); -- -- //---------- LinkWidget Interface methods implementation from now on. -- -- virtual void lwSetFont(QFont font); -- virtual UMLClassifier *operationOwner(); -- -- virtual UMLOperation *operation(); -- virtual void setOperation(UMLOperation *op); -- -- virtual QString customOpText(); -- virtual void setCustomOpText(const QString &opText); -- -- virtual void resetTextPositions(); -- -- virtual void setMessageText(FloatingTextWidget *ft); -- virtual void setText(FloatingTextWidget *ft, const QString &newText); -- -- virtual void showPropertiesDialog(); -- -- virtual QString lwOperationText(); -- virtual UMLClassifier *lwClassifier(); -- virtual void setOperationText(const QString &op); -- -- virtual void constrainTextPos(qreal &textX, qreal &textY, -- qreal textWidth, qreal textHeight, -- Uml::TextRole::Enum tr); -- -- virtual void calculateNameTextSegment(); -- -- //---------- End LinkWidget Interface methods implementation. -- -- UMLAssociation* association() const; -- UMLAttribute* attribute() const; -- --// AssociationWidget& operator=(const AssociationWidget& other); -- bool operator==(const AssociationWidget& other) const; -- bool operator!=(AssociationWidget& other) const; -- -- FloatingTextWidget* textWidgetByRole(Uml::TextRole::Enum tr) const; -- -- FloatingTextWidget* nameWidget() const; -- QString name() const; -- void setName(const QString &strRole); -- void setStereotype(const QString &stereo); -- -- FloatingTextWidget* roleWidget(Uml::RoleType::Enum role) const; -- QString roleName(Uml::RoleType::Enum role) const; -- void setRoleName(const QString &strRole, Uml::RoleType::Enum role); -- -- QString roleDocumentation(Uml::RoleType::Enum role) const; -- void setRoleDocumentation(const QString& doc, Uml::RoleType::Enum role); -- -- FloatingTextWidget* multiplicityWidget(Uml::RoleType::Enum role) const; -- QString multiplicity(Uml::RoleType::Enum role) const; -- void setMultiplicity(const QString& text, Uml::RoleType::Enum role); -- -- Uml::Visibility::Enum visibility(Uml::RoleType::Enum role) const; -- void setVisibility(Uml::Visibility::Enum value, Uml::RoleType::Enum role); -- -- FloatingTextWidget* changeabilityWidget(Uml::RoleType::Enum role) const; -- Uml::Changeability::Enum changeability(Uml::RoleType::Enum role) const; -- void setChangeability(Uml::Changeability::Enum value, Uml::RoleType::Enum role); -- -- Uml::ID::Type widgetIDForRole(Uml::RoleType::Enum role) const; -- Uml::ID::Type widgetLocalIDForRole(Uml::RoleType::Enum role) const; -- UMLWidget* widgetForRole(Uml::RoleType::Enum role) const; -- void setWidgetForRole(UMLWidget* widget, Uml::RoleType::Enum role); -- -- bool setWidgets(UMLWidget* widgetA, Uml::AssociationType::Enum assocType, UMLWidget* widgetB); -- -- bool containsAsEndpoint(UMLWidget* widget); -- -- Uml::AssociationType::Enum associationType() const; -- void setAssociationType(Uml::AssociationType::Enum type); -- -- bool isCollaboration() const; -- bool isSelf() const; -- -- QString toString() const; -- -- bool isActivated() const; -- void setActivated(bool active); -- -- AssociationLine* associationLine() const; -- -- virtual bool activate(); -- virtual QRectF boundingRect() const; -- virtual QPainterPath shape() const; -- -- void widgetMoved(UMLWidget* widget, qreal x, qreal y); -- -- void saveIdealTextPositions(); -- -- UMLWidget* onWidget(const QPointF &p); -- bool onAssociation(const QPointF& point); -- bool onAssocClassLine(const QPointF& point); -- -- void createAssocClassLine(); -- void createAssocClassLine(ClassifierWidget* classifierWidget, -- int linePathSegmentIndex); -- -- void selectAssocClassLine(bool sel = true); -- void removeAssocClassLine(); -- void computeAssocClassLine(); -- -- void setXEntireAssoc(qreal x); -- void setYEntireAssoc(qreal y); -- -- void moveMidPointsBy(qreal x, qreal y); -- void moveEntireAssoc(qreal x, qreal y); -- -- QFont font() const; -- -- virtual void setTextColor(const QColor &color); -- -- void calculateEndingPoints(); -- -- void clipSize(); -- -- bool loadFromXMI(QDomElement& qElement, const UMLWidgetList& widgets, -- const MessageWidgetList* messages); -- virtual bool loadFromXMI(QDomElement& qElement); -- virtual void saveToXMI(QDomDocument &qDoc, QDomElement &qElement); -- -- void cleanup(); -- -- bool isPointAddable(); -- bool isPointRemovable(); -- -- //:TODO: the following four methods should be protected -- virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); -- virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); -- virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); -- virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); -- -- virtual void setSelected(bool _select); --public Q_SLOTS: //:TODO: all virtual? -- virtual void slotMenuSelection(QAction* action); -- void slotClassifierListItemRemoved(UMLClassifierListItem* obj); -- void slotAttributeChanged(); -- -- void syncToModel(); -- --protected: -- virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); -- -- virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event); -- virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); -- virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event); -- --private: -- QPointF calculateTextPosition(Uml::TextRole::Enum role); -- void setTextPosition(Uml::TextRole::Enum role); -- void setTextPositionRelatively(Uml::TextRole::Enum role, const QPointF &oldPosition); -- void setFloatingText(Uml::TextRole::Enum role, const QString& text, FloatingTextWidget* &ft); -- -- AssociationWidget(UMLScene *scene); -- -- void setUMLAssociation(UMLAssociation * assoc); -- -- void mergeAssociationDataIntoUMLRepresentation(); -- -- static Uml::Region::Enum findPointRegion(const QRectF& rect, const QPointF& pos); -- static qreal findInterceptOnEdge(const QRectF &rect, Uml::Region::Enum region, const QPointF &point); -- static QLineF::IntersectType intersect(const QRectF &rect, const QLineF &line, -- QPointF* intersectionPoint); -- -- void moveEvent(QGraphicsSceneMouseEvent *me); -- -- Uml::TextRole::Enum calculateNameType(Uml::TextRole::Enum defaultRoleType); -- -- static QPointF swapXY(const QPointF &p); -- -- // not used at the moment -- // static QPointF calculatePointAtDistance(const QPointF &P1, const QPointF &P2, float Distance); -- // static QPointF calculatePointAtDistanceOnPerpendicular(const QPointF &P1, const QPointF &P2, float Distance); -- // static float perpendicularProjection(const QPointF& P1, const QPointF& P2, const QPointF& P3, QPointF& ResultingPoint); -- -- static QPointF midPoint(const QPointF& p0, const QPointF& p1); -- -- void createPointsSelfAssociation(); -- void updatePointsSelfAssociation(); -- void createPointsException(); -- void updatePointsException(); -- -- /** -- * The WidgetRole struct gathers all information pertaining to the role. -- * The AssociationWidget class contains two WidgetRole objects, one for each -- * side of the association (A and B). -- */ -- struct WidgetRole { -- -- FloatingTextWidget* multiplicityWidget; ///< information regarding multiplicity -- FloatingTextWidget* changeabilityWidget; ///< information regarding changeability -- FloatingTextWidget* roleWidget; ///< role's label of this association -- -- UMLWidget* umlWidget; ///< UMLWidget at this role's side of this association -- -- Uml::Region::Enum m_WidgetRegion; ///< region of this role's widget -- -- int m_nIndex; ///< the index of where the line is on the region for this role -- int m_nTotalCount; ///< total amount of associations on the region this role's line is on -- -- // The following items are only used if m_pObject is not set. -- Uml::Visibility::Enum visibility; -- Uml::Changeability::Enum changeability; -- QString roleDocumentation; -- -- }; -- -- void updateRegionLineCount(int index, int totalCount, -- Uml::Region::Enum region, Uml::RoleType::Enum role); -- -- void updateAssociations(int totalCount, Uml::Region::Enum region, Uml::RoleType::Enum role); -- -- int getRegionCount(Uml::Region::Enum region, Uml::RoleType::Enum role); -- -- void doUpdates(const QPointF &otherP, Uml::RoleType::Enum role); -- -- void setChangeWidget(const QString &strChangeWidget, Uml::RoleType::Enum role); -- -- bool checkAddPoint(const QPointF &scenePos); -- bool checkRemovePoint(const QPointF &scenePos); -- -- bool linePathStartsAt(const UMLWidget* widget); -- -- void insertIntoLists(qreal position, const AssociationWidget* assoc); -- -- qreal m_positions[100]; ///< auxiliary variable for updateAssociations() -- int m_positions_len; ///< auxiliary variable for updateAssociations() -- AssociationWidgetList m_ordered; ///< auxiliary variable for updateAssociations() -- -- bool m_activated; ///< flag which is true if the activate method has been called for this class instance -- -- /** -- * When the association has a Role Floating Text this text should move -- * when the AssociationLine moves but only if the closest segment to the -- * role text moves. -- * This segment is: -- * m_associationLine[m_unNameLineSegment] -- m_associationLine[m_unNameLineSegment+1] -- */ -- int m_unNameLineSegment; -- -- QPointF m_oldNamePoint; ///< Position of name floatingtext saved by saveIdealTextPositions() -- QPointF m_oldMultiAPoint; ///< Position of role A multiplicity floatingtext saved by saveIdealTextPositions() -- QPointF m_oldMultiBPoint; ///< Position of role B multiplicity floatingtext saved by saveIdealTextPositions() -- QPointF m_oldChangeAPoint; ///< Position of role A changeability floatingtext saved by saveIdealTextPositions() -- QPointF m_oldChangeBPoint; ///< Position of role B changeability floatingtext saved by saveIdealTextPositions() -- QPointF m_oldRoleAPoint; ///< Position of role A name floatingtext saved by saveIdealTextPositions() -- QPointF m_oldRoleBPoint; ///< Position of role B name floatingtext saved by saveIdealTextPositions() -- -- int m_nLinePathSegmentIndex; ///< anchor for m_pAssocClassLine -- QGraphicsLineItem *m_pAssocClassLine; ///< used for connecting assoc. class -- QGraphicsRectItem *m_pAssocClassLineSel0; ///< selection decoration for the start point of the assoc. class line -- QGraphicsRectItem *m_pAssocClassLineSel1; ///< selection decoration for the end point of the assoc. class line -- -- AssociationLine *m_associationLine; ///< the definition points for the association line -- ClassifierWidget *m_associationClass; ///< used if we have an assoc. class -- Uml::AssociationType::Enum m_associationType; ///< is only used if m_pObject is not set -- WidgetRole m_role[2]; -- FloatingTextWidget* m_nameWidget; ///< displays the name of this association -- QPointF m_eventScenePos; ///< holds scene pos of contextMenuEvent() -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/boxwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/boxwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/boxwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/boxwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,79 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "boxwidget.h" -- --// app includes --#include "uml.h" --#include "umldoc.h" -- --// qt includes --#include -- --/** -- * Constructs a BoxWidget. -- * -- * @param scene The parent to this widget. -- * @param id The ID to assign (-1 will prompt a new ID.) -- * @param type The WidgetType (wt_Box.) -- */ --BoxWidget::BoxWidget(UMLScene * scene, Uml::ID::Type id, WidgetType type) -- : UMLWidget(scene, type, id) --{ -- setSize(100, 80); -- m_usesDiagramLineColor = false; // boxes be black -- m_lineColor = QColor("black"); -- setZValue(-10); --} -- --/** -- * Destructor. -- */ --BoxWidget::~BoxWidget() --{ --} -- --/** -- * Draws a rectangle. -- */ --void BoxWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- setPenFromSettings(painter); -- painter->drawRect(0, 0, width(), height()); -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Saves the widget to the "boxwidget" XMI element. -- * Note: For loading from XMI, the inherited parent method is used. -- */ --void BoxWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement boxElement = qDoc.createElement(QLatin1String("boxwidget")); -- UMLWidget::saveToXMI(qDoc, boxElement); -- qElement.appendChild(boxElement); --} -- --/** -- * Show a properties dialog for a BoxWidget. -- */ --void BoxWidget::showPropertiesDialog() --{ -- QColor newColor = QColorDialog::getColor(lineColor()); // krazy:exclude=qclasses -- if (newColor != lineColor()) { -- setLineColor(newColor); -- setUsesDiagramLineColor(false); -- umlDoc()->setModified(true); -- } --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/boxwidget.h umbrello-kf6-15.08.1/umbrello/widgets/boxwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/boxwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/boxwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,39 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef BOXWIDGET_H --#define BOXWIDGET_H -- --//app includes --#include "umlwidget.h" -- --/** -- * Displays a rectangular box. -- * These widgets are diagram specific. They will still need a unique id -- * from the @ref UMLDoc class for deletion and other purpose-kf6s. -- * -- * @short Displays a box. -- * @author Jonathan Riddell -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class BoxWidget : public UMLWidget --{ --public: -- explicit BoxWidget(UMLScene * scene, Uml::ID::Type id = Uml::ID::None, WidgetType type = WidgetBase::wt_Box); -- virtual ~BoxWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- -- virtual void showPropertiesDialog(); --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/categorywidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/categorywidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/categorywidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/categorywidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,148 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header file --#include "categorywidget.h" -- --// local includes --#include "category.h" --#include "debug_utils.h" --#include "umlview.h" --#include "listpopupmenu.h" -- --// qt includes --#include -- --/** -- * Creates a Category widget. -- * -- * @param scene The parent of the widget. -- * @param o The UMLCategory to represent. -- */ --CategoryWidget::CategoryWidget(UMLScene * scene, UMLCategory *o) -- : UMLWidget(scene, WidgetBase::wt_Category, o) --{ -- m_fixedAspectRatio = true; --} -- --/** -- * Destructor. -- */ --CategoryWidget::~CategoryWidget() --{ --} -- --/** -- * Overrides the standard paint event. -- */ --void CategoryWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- UMLWidget::setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) -- painter->setBrush(UMLWidget::fillColor()); -- QFont font = UMLWidget::font(); -- font.setUnderline(false); -- font.setBold(false); -- font.setItalic(m_umlObject->isAbstract()); -- painter->setFont(font); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- // the height is our radius -- const int h = height(); -- const int w = width(); -- const int r = h > w ? h : w; -- -- //int middleX = w / 2; -- const int textStartY = (r / 2) - (fontHeight / 2); -- -- // draw a circle -- painter->drawEllipse(0, 0, r, r); -- painter->setPen(textColor()); -- -- QString letterType(QLatin1Char('D')); -- switch(static_cast(m_umlObject)->getType()) { -- case UMLCategory::ct_Disjoint_Specialisation: -- letterType = QLatin1Char('D'); -- break; -- case UMLCategory::ct_Overlapping_Specialisation: -- letterType = QLatin1Char('O'); -- break; -- case UMLCategory::ct_Union: -- letterType = QLatin1Char('U'); -- break; -- default: -- break; -- } -- -- painter->drawText(UC_MARGIN, textStartY, r - UC_MARGIN * 2, fontHeight, Qt::AlignCenter, letterType); -- UMLWidget::setPenFromSettings(painter); -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF CategoryWidget::minimumSize() const --{ -- const UMLWidget::FontType ft = (m_umlObject->isAbstract() ? FT_BOLD_ITALIC : FT_BOLD); -- const QFontMetrics &fm = UMLWidget::getFontMetrics(ft); -- const int fontHeight = fm.lineSpacing(); -- int radius = UC_RADIUS + fontHeight + UC_MARGIN; -- -- return QSizeF(radius, radius); --} -- --/** -- * Saves this Category to file. -- */ --void CategoryWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement categoryElement = qDoc.createElement(QLatin1String("categorywidget")); -- UMLWidget::saveToXMI(qDoc, categoryElement); -- qElement.appendChild(categoryElement); --} -- --/** -- * Will be called when a menu selection has been made from the -- * popup menu. -- * -- * @param action The action that has been selected. -- */ --void CategoryWidget::slotMenuSelection(QAction* action) --{ -- UMLCategory* catObj = static_cast(umlObject()); -- if (!catObj) { -- uWarning() << "No UMLCategory for this widget."; -- return; -- } -- -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch(sel) { -- case ListPopupMenu::mt_DisjointSpecialisation: -- catObj->setType(UMLCategory::ct_Disjoint_Specialisation); -- break; -- -- case ListPopupMenu::mt_OverlappingSpecialisation: -- catObj->setType(UMLCategory::ct_Overlapping_Specialisation); -- break; -- -- case ListPopupMenu::mt_Union: -- catObj->setType(UMLCategory::ct_Union); -- break; -- -- default: -- UMLWidget::slotMenuSelection(action); -- } --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/categorywidget.h umbrello-kf6-15.08.1/umbrello/widgets/categorywidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/categorywidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/categorywidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,56 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef CATEGORYWIDGET_H --#define CATEGORYWIDGET_H -- --#include "umlwidget.h" -- --#define UC_MARGIN 5 --#define UC_RADIUS 30 -- --class UMLCategory; -- --/** -- * This class is the graphical version of a UMLCategory. A CategoryWidget is created -- * by a @ref UMLView. An CategoryWidget belongs to only one @ref UMLView instance. -- * When the @ref UMLView instance that this class belongs to, it will be automatically deleted. -- * -- * If the Category class that this CategoryWidget is displaying is deleted, the @ref UMLView will -- * make sure that this instance is also deleted. -- * -- * The CategoryWidget class inherits from the @ref UMLWidget class which adds most of the functionality -- * to this class. -- * -- * @short A graphical version of a UMLCategory. -- * @author Sharan Rao -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class CategoryWidget : public UMLWidget --{ -- Q_OBJECT --public: -- CategoryWidget(UMLScene * scene, UMLCategory *o); -- virtual ~CategoryWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- // For loading we can use the loadFromXMI() inherited from UMLWidget. -- --protected: -- QSizeF minimumSize() const; -- --public slots: -- void slotMenuSelection(QAction* action); -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/classifierwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/classifierwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/classifierwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/classifierwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,1420 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "classifierwidget.h" -- --// app includes --#include "floatingtextwidget.h" --#include "associationwidget.h" --#include "associationline.h" --#include "classifier.h" --#include "cmds.h" --#include "debug_utils.h" --#include "listpopupmenu.h" --#include "object_factory.h" --#include "operation.h" --#include "template.h" --#include "uml.h" --#include "umldoc.h" --#include "umlview.h" -- --#define PACKAGE_MARGIN 5 -- --// qt includes --#include -- --DEBUG_REGISTER_DISABLED(ClassifierWidget) -- --const int ClassifierWidget::MARGIN = 5; --const int ClassifierWidget::CIRCLE_SIZE = 30; --const int ClassifierWidget::SOCKET_INCREMENT = 10; -- --/** -- * Constructs a ClassifierWidget. -- * -- * @param scene The parent of this ClassifierWidget. -- * @param c The UMLClassifier to represent. -- */ --ClassifierWidget::ClassifierWidget(UMLScene * scene, UMLClassifier *c) -- : UMLWidget(scene, WidgetBase::wt_Class, c), -- m_pAssocWidget(0), m_pInterfaceName(0) --{ -- const Settings::OptionState& ops = m_scene->optionState(); -- setVisualPropertyCmd(ShowVisibility, ops.classState.showVisibility); -- setVisualPropertyCmd(ShowOperations, ops.classState.showOps); -- setVisualPropertyCmd(ShowPublicOnly, ops.classState.showPublicOnly); -- setVisualPropertyCmd(ShowPackage, ops.classState.showPackage); -- m_attributeSignature = Uml::SignatureType::ShowSig; -- /*:TODO: -- setVisualProperty(ShowOperationSignature, ops.classState.showOpSig); -- Cannot do that because we get "pure virtual method called". Open code: -- */ -- if(!ops.classState.showOpSig) { -- if (visualProperty(ShowVisibility)) -- m_operationSignature = Uml::SignatureType::NoSig; -- else -- m_operationSignature = Uml::SignatureType::NoSigNoVis; -- -- } else if (visualProperty(ShowVisibility)) -- m_operationSignature = Uml::SignatureType::ShowSig; -- else -- m_operationSignature = Uml::SignatureType::SigNoVis; -- -- setVisualPropertyCmd(ShowAttributes, ops.classState.showAtts); -- setVisualPropertyCmd(ShowStereotype, ops.classState.showStereoType); -- setVisualPropertyCmd(DrawAsCircle, false); -- -- setShowAttSigs(ops.classState.showAttSig); -- -- if (c && c->isInterface()) { -- m_baseType = WidgetBase::wt_Interface; -- m_visualProperties = ShowOperations | ShowVisibility | ShowStereotype; -- setShowStereotype(true); -- updateSignatureTypes(); -- } --} -- --/** -- * Constructs a ClassifierWidget. -- * -- * @param scene The parent of this ClassifierWidget. -- * @param c The UMLClassifier to represent. -- */ --ClassifierWidget::ClassifierWidget(UMLScene * scene, UMLPackage *o) -- : UMLWidget(scene, WidgetBase::wt_Package, o), -- m_pAssocWidget(0), -- m_pInterfaceName(0) --{ -- const Settings::OptionState& ops = m_scene->optionState(); -- setVisualPropertyCmd(ShowVisibility, ops.classState.showVisibility); -- setVisualPropertyCmd(ShowOperations, ops.classState.showOps); -- setVisualPropertyCmd(ShowPublicOnly, ops.classState.showPublicOnly); -- setVisualPropertyCmd(ShowPackage, ops.classState.showPackage); -- m_attributeSignature = Uml::SignatureType::ShowSig; -- -- if(!ops.classState.showOpSig) { -- if (visualProperty(ShowVisibility)) -- m_operationSignature = Uml::SignatureType::NoSig; -- else -- m_operationSignature = Uml::SignatureType::NoSigNoVis; -- -- } else if (visualProperty(ShowVisibility)) -- m_operationSignature = Uml::SignatureType::ShowSig; -- else -- m_operationSignature = Uml::SignatureType::SigNoVis; -- -- setVisualPropertyCmd(ShowAttributes, ops.classState.showAtts); -- setVisualPropertyCmd(ShowStereotype, ops.classState.showStereoType); -- setVisualPropertyCmd(DrawAsPackage, true); -- -- setShowAttSigs(ops.classState.showAttSig); --} -- --/** -- * Destructor. -- */ --ClassifierWidget::~ClassifierWidget() --{ -- if (m_pAssocWidget) -- m_pAssocWidget->removeAssocClassLine(); -- if (m_pInterfaceName) { -- delete m_pInterfaceName; -- m_pInterfaceName = 0; -- } --} -- --/** -- * Return the UMLClassifier which this ClassifierWidget -- * represents. -- */ --UMLClassifier *ClassifierWidget::classifier() const --{ -- return dynamic_cast(m_umlObject); --} -- --/** -- * @return the visual properties -- */ --ClassifierWidget::VisualProperties ClassifierWidget::visualProperties() const --{ -- return m_visualProperties; --} -- --/** -- * Set an OR combination of properties stored in \a properties on this -- * widget. -- */ --void ClassifierWidget::setVisualProperties(VisualProperties properties) --{ -- // Don't do anything if the argument is equal to current status. -- if (quint32(m_visualProperties) == quint32(properties)) { -- return; -- } -- -- m_visualProperties = properties; -- updateSignatureTypes(); --} -- --/** -- * @return The status of the property passed in. -- * -- * @note Use @ref attributeSignature() and @ref -- * operationSignature() to get signature status. This -- * method only indicates whether signature is visible or not. -- */ --bool ClassifierWidget::visualProperty(VisualProperty property) const --{ -- if (property == ShowAttributeSignature) { -- return (m_attributeSignature == Uml::SignatureType::ShowSig -- || m_attributeSignature == Uml::SignatureType::SigNoVis); -- } -- -- else if(property == ShowOperationSignature) { -- return (m_operationSignature == Uml::SignatureType::ShowSig -- || m_operationSignature == Uml::SignatureType::SigNoVis); -- } -- -- return m_visualProperties.testFlag(property); --} -- --/** -- * A convenient method to set and reset individual VisualProperty -- * -- * Undo command. -- * -- * @param property The property to be set/reset. -- * @param enable True/false to set/reset. (default = true) -- * -- * @note This method handles ShowAttributeSignature and -- * ShowOperationSignature specially. -- */ --void ClassifierWidget::setVisualProperty(VisualProperty property, bool enable) --{ -- if (visualProperty(property) != enable) { -- UMLApp::app()->executeCommand(new Uml::CmdChangeVisualProperty(this, property, enable)); -- } --} -- --/** -- * A convenient method to set and reset individual VisualProperty -- * -- * @param property The property to be set/reset. -- * @param enable True/false to set/reset. (default = true) -- * -- * @note This method handles ShowAttributeSignature and -- * ShowOperationSignature specially. -- */ --void ClassifierWidget::setVisualPropertyCmd(VisualProperty property, bool enable) --{ -- // Handle ShowAttributeSignature and ShowOperationSignature -- // specially. -- -- if (property == ShowAttributeSignature) { -- if (!enable) { -- m_attributeSignature = visualProperty(ShowVisibility) ? -- Uml::SignatureType::NoSig : Uml::SignatureType::NoSigNoVis; -- } else { -- m_attributeSignature = visualProperty(ShowVisibility) ? -- Uml::SignatureType::ShowSig : Uml::SignatureType::SigNoVis; -- } -- //:TODO: updateTextItemGroups(); -- updateSignatureTypes(); -- } -- -- else if (property == ShowOperationSignature) { -- if (!enable) { -- m_operationSignature = visualProperty(ShowVisibility) ? -- Uml::SignatureType::NoSig : Uml::SignatureType::NoSigNoVis; -- } else { -- m_operationSignature = visualProperty(ShowVisibility) ? -- Uml::SignatureType::ShowSig : Uml::SignatureType::SigNoVis; -- } -- //:TODO: updateTextItemGroups(); -- updateSignatureTypes(); -- } -- -- else if (property == ShowStereotype) { -- // Now just update flag and use base method for actual work. -- if (enable) { -- m_visualProperties |= property; -- } else { -- m_visualProperties &= ~property; -- } -- setShowStereotype(enable); -- } -- -- else if (property == DrawAsCircle) { -- // Don't do anything if the flag status is same. -- if (visualProperty(property) == enable) -- return; -- if (enable) { -- m_visualProperties |= property; -- } else { -- m_visualProperties &= ~property; -- } -- setDrawAsCircle(enable); -- } -- -- // Some other flag. -- else { -- // Don't do anything if the flag status is same. -- if (visualProperty(property) == enable) { -- return; -- } -- -- // Call setVisualProperties appropriately based on enbable. -- if (enable) { -- setVisualProperties(visualProperties() | property); -- } else { -- setVisualProperties(visualProperties() & ~property); -- } -- } --} -- --/** -- * A convenient method to toggle individual VisualProperty of this -- * widget. -- * -- * @param property The property to be toggled. -- * -- * @note This method handles ShowAttributeSignature and -- * ShowOperationSignature specially. -- */ --void ClassifierWidget::toggleVisualProperty(VisualProperty property) --{ -- bool oppositeStatus; -- if (property == ShowOperationSignature) { -- oppositeStatus = !(m_operationSignature == Uml::SignatureType::ShowSig -- || m_operationSignature == Uml::SignatureType::SigNoVis); -- } -- else if (property == ShowAttributeSignature) { -- oppositeStatus = !(m_attributeSignature == Uml::SignatureType::ShowSig -- || m_attributeSignature == Uml::SignatureType::SigNoVis); -- } -- else { -- oppositeStatus = !visualProperty(property); -- } -- -- DEBUG(DBG_SRC) << "VisualProperty: " << property << " to opposite status " << oppositeStatus; -- setVisualProperty(property, oppositeStatus); --} -- --/** -- * Updates m_operationSignature to match m_showVisibility. -- */ --void ClassifierWidget::updateSignatureTypes() --{ -- //turn on scope -- if (visualProperty(ShowVisibility)) { -- if (m_operationSignature == Uml::SignatureType::NoSigNoVis) { -- m_operationSignature = Uml::SignatureType::NoSig; -- } else if (m_operationSignature == Uml::SignatureType::SigNoVis) { -- m_operationSignature = Uml::SignatureType::ShowSig; -- } -- } -- //turn off scope -- else { -- if (m_operationSignature == Uml::SignatureType::ShowSig) { -- m_operationSignature = Uml::SignatureType::SigNoVis; -- } else if (m_operationSignature == Uml::SignatureType::NoSig) { -- m_operationSignature = Uml::SignatureType::NoSigNoVis; -- } -- } -- if (visualProperty(ShowVisibility)) { -- if (m_attributeSignature == Uml::SignatureType::NoSigNoVis) -- m_attributeSignature = Uml::SignatureType::NoSig; -- else if (m_attributeSignature == Uml::SignatureType::SigNoVis) -- m_attributeSignature = Uml::SignatureType::ShowSig; -- } else { -- if (m_attributeSignature == Uml::SignatureType::ShowSig) -- m_attributeSignature = Uml::SignatureType::SigNoVis; -- else if(m_attributeSignature == Uml::SignatureType::NoSig) -- m_attributeSignature = Uml::SignatureType::NoSigNoVis; -- } -- updateGeometry(); -- update(); --} -- --/** -- * Returns whether to show attribute signatures. -- * Only applies when m_umlObject->getBaseType() is ot_Class. -- * -- * @return Status of how attribute signatures are shown. -- */ --Uml::SignatureType::Enum ClassifierWidget::attributeSignature() const --{ -- return m_attributeSignature; --} -- --/** -- * Sets the type of signature to display for an attribute. -- * Only applies when m_umlObject->getBaseType() is ot_Class. -- * -- * @param sig Type of signature to display for an attribute. -- */ --void ClassifierWidget::setAttributeSignature(Uml::SignatureType::Enum sig) --{ -- m_attributeSignature = sig; -- updateSignatureTypes(); -- updateGeometry(); -- update(); --} -- --/** -- * @return The Uml::SignatureType::Enum value for the operations. -- */ --Uml::SignatureType::Enum ClassifierWidget::operationSignature() const --{ -- return m_operationSignature; --} -- --/** -- * Set the type of signature to display for an Operation -- * -- * @param sig Type of signature to display for an operation. -- */ --void ClassifierWidget::setOperationSignature(Uml::SignatureType::Enum sig) --{ -- m_operationSignature = sig; -- updateSignatureTypes(); -- updateGeometry(); -- update(); --} -- --/** -- * Sets whether to show attribute signature -- * Only applies when m_umlObject->getBaseType() is ot_Class. -- * -- * @param _status True if attribute signatures shall be shown. -- */ --void ClassifierWidget::setShowAttSigs(bool _status) --{ -- if(!_status) { -- if (visualProperty(ShowVisibility)) -- m_attributeSignature = Uml::SignatureType::NoSig; -- else -- m_attributeSignature = Uml::SignatureType::NoSigNoVis; -- } -- else if (visualProperty(ShowVisibility)) -- m_attributeSignature = Uml::SignatureType::ShowSig; -- else -- m_attributeSignature = Uml::SignatureType::SigNoVis; -- if (UMLApp::app()->document()->loading()) -- return; -- updateGeometry(); -- update(); --} -- --/** -- * Toggles whether to show attribute signatures. -- * Only applies when m_umlObject->getBaseType() is ot_Class. -- */ --void ClassifierWidget::toggleShowAttSigs() --{ -- if (m_attributeSignature == Uml::SignatureType::ShowSig || -- m_attributeSignature == Uml::SignatureType::SigNoVis) { -- if (visualProperty(ShowVisibility)) { -- m_attributeSignature = Uml::SignatureType::NoSig; -- } else { -- m_attributeSignature = Uml::SignatureType::NoSigNoVis; -- } -- } else if (visualProperty(ShowVisibility)) { -- m_attributeSignature = Uml::SignatureType::ShowSig; -- } else { -- m_attributeSignature = Uml::SignatureType::SigNoVis; -- } -- updateGeometry(); -- update(); --} -- --/** -- * Return the number of displayed members of the given ObjectType. -- * Takes into consideration m_showPublicOnly but not other settings. -- */ --int ClassifierWidget::displayedMembers(UMLObject::ObjectType ot) const --{ -- int count = 0; -- UMLClassifier *umlc = this->classifier(); -- if (!umlc) -- return count; -- UMLClassifierListItemList list = umlc->getFilteredList(ot); -- foreach (UMLClassifierListItem *m, list) { -- if (!(visualProperty(ShowPublicOnly) && m->visibility() != Uml::Visibility::Public)) -- count++; -- } -- return count; --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF ClassifierWidget::minimumSize() const --{ -- return calculateSize(); --} -- --/** -- * Calculate content related size of widget. -- * Overrides method from UMLWidget. -- */ --QSizeF ClassifierWidget::calculateSize(bool withExtensions /* = true */) const --{ -- if (!m_umlObject) { -- return UMLWidget::minimumSize(); -- } -- if (m_umlObject->baseType() == UMLObject::ot_Package) { -- return calculateAsPackageSize(); -- } -- UMLClassifier *umlc = this->classifier(); -- if (!umlc) { -- uError() << "Internal error - classifier() returns NULL"; -- return UMLWidget::minimumSize(); -- } -- if (umlc->isInterface() && visualProperty(DrawAsCircle)) { -- return calculateAsCircleSize(); -- } -- -- const bool showNameOnly = !visualProperty(ShowAttributes) && -- !visualProperty(ShowOperations) && -- !visualProperty(ShowDocumentation); -- -- const QFontMetrics &fm = getFontMetrics(UMLWidget::FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- // width is the width of the longest 'word' -- int width = 0, height = 0; -- // consider stereotype -- if (visualProperty(ShowStereotype) && !m_umlObject->stereotype().isEmpty()) { -- height += fontHeight; -- // ... width -- const QFontMetrics &bfm = UMLWidget::getFontMetrics(UMLWidget::FT_BOLD); -- const int stereoWidth = bfm.size(0, m_umlObject->stereotype(true)).width(); -- if (stereoWidth > width) -- width = stereoWidth; -- } else if (showNameOnly) { -- height += MARGIN; -- } -- -- // consider name -- height += fontHeight; -- // ... width -- QString displayedName; -- if (visualProperty(ShowPackage)) -- displayedName = m_umlObject->fullyQualifiedName(); -- else -- displayedName = m_umlObject->name(); -- const UMLWidget::FontType nft = (m_umlObject->isAbstract() ? FT_BOLD_ITALIC : FT_BOLD); -- const int nameWidth = UMLWidget::getFontMetrics(nft).size(0, displayedName).width(); -- if (nameWidth > width) -- width = nameWidth; -- --#ifdef ENABLE_WIDGET_SHOW_DOC -- // consider documentation -- if (visualProperty(ShowDocumentation)) { -- if (!documentation().isEmpty()) { -- QRect brect = fm.boundingRect(QRect(0, 0, this->width()-2*MARGIN, this->height()-height), Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, documentation()); -- height += brect.height(); -- if (!visualProperty(ShowOperations) && !visualProperty(ShowAttributes)) { -- if (brect.width() >= width) -- width = brect.width(); -- } -- } -- else -- height += fontHeight / 2; -- } --#endif -- -- // consider attributes -- if (visualProperty(ShowAttributes)) { -- const int numAtts = displayedAttributes(); -- if (numAtts > 0) { -- height += fontHeight * numAtts; -- // calculate width of the attributes -- UMLClassifierListItemList list = umlc->getFilteredList(UMLObject::ot_Attribute); -- foreach (UMLClassifierListItem *a, list) { -- if (visualProperty(ShowPublicOnly) && a->visibility() != Uml::Visibility::Public) -- continue; -- const int attWidth = fm.size(0, a->toString(m_attributeSignature)).width(); -- if (attWidth > width) -- width = attWidth; -- } -- } -- else -- height += fontHeight / 2; -- } -- -- // consider operations -- if (visualProperty(ShowOperations)) { -- const int numOps = displayedOperations(); -- if (numOps > 0) { -- height += numOps * fontHeight; -- // ... width -- UMLOperationList list(umlc->getOpList()); -- foreach (UMLOperation* op, list) { -- if (visualProperty(ShowPublicOnly) && op->visibility() != Uml::Visibility::Public) -- continue; -- const QString displayedOp = op->toString(m_operationSignature); -- UMLWidget::FontType oft; -- oft = (op->isAbstract() ? UMLWidget::FT_ITALIC : UMLWidget::FT_NORMAL); -- const int w = UMLWidget::getFontMetrics(oft).size(0, displayedOp).width(); -- if (w > width) -- width = w; -- } -- } -- else -- height += fontHeight / 2; -- } -- -- if (withExtensions) { -- // consider template box _as last_ ! -- QSize templatesBoxSize = calculateTemplatesBoxSize(); -- if (templatesBoxSize.width() != 0) { -- // add width to largest 'word' -- width += templatesBoxSize.width() / 2; -- } -- if (templatesBoxSize.height() != 0) { -- height += templatesBoxSize.height() - MARGIN; -- } -- } -- -- // allow for height margin -- if (showNameOnly) { -- height += MARGIN; -- } -- -- // allow for width margin -- width += MARGIN * 2; -- -- return QSizeF(width, height); --} -- --/** -- * Calculcates the size of the templates box in the top left -- * if it exists, returns QSize(0, 0) if it doesn't. -- * -- * @return QSize of the templates flap. -- */ --QSize ClassifierWidget::calculateTemplatesBoxSize() const --{ -- if (!classifier()) -- return QSize(0, 0); -- UMLTemplateList list = classifier()->getTemplateList(); -- int count = list.count(); -- if (count == 0) { -- return QSize(0, 0); -- } -- -- QFont font = UMLWidget::font(); -- font.setItalic(false); -- font.setUnderline(false); -- font.setBold(false); -- const QFontMetrics fm(font); -- -- int width = 0; -- int height = count * fm.lineSpacing() + (MARGIN*2); -- -- foreach (UMLTemplate *t, list) { -- int textWidth = fm.size(0, t->toString()).width(); -- if (textWidth > width) -- width = textWidth; -- } -- -- width += (MARGIN*2); -- return QSize(width, height); --} -- --/** -- * Return the number of displayed attributes. -- */ --int ClassifierWidget::displayedAttributes() const --{ -- if (!visualProperty(ShowAttributes)) -- return 0; -- return displayedMembers(UMLObject::ot_Attribute); --} -- --/** -- * Return the number of displayed operations. -- */ --int ClassifierWidget::displayedOperations() const --{ -- if (!visualProperty(ShowOperations)) -- return 0; -- return displayedMembers(UMLObject::ot_Operation); --} -- --/** -- * Set the AssociationWidget when this ClassWidget acts as -- * an association class. -- */ --void ClassifierWidget::setClassAssociationWidget(AssociationWidget *assocwidget) --{ -- if (!classifier()) { -- uError() << "Class association cannot be applied to package"; -- return; -- } -- m_pAssocWidget = assocwidget; -- UMLAssociation *umlassoc = NULL; -- if (assocwidget) -- umlassoc = assocwidget->association(); -- classifier()->setClassAssoc(umlassoc); --} -- --/** -- * Return the AssociationWidget when this classifier acts as -- * an association class (else return NULL.) -- */ --AssociationWidget *ClassifierWidget::classAssociationWidget() const --{ -- return m_pAssocWidget; --} -- --/** -- * Overrides standard method. -- * Auxiliary to reimplementations in the derived classes. -- */ --void ClassifierWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) -- painter->setBrush(UMLWidget::fillColor()); -- else { -- painter->setBrush(m_scene->backgroundColor()); -- } -- if (m_umlObject->baseType() == UMLObject::ot_Package) { -- drawAsPackage(painter, option); -- UMLWidget::paint(painter, option, widget); -- return; -- } -- UMLClassifier *umlc = this->classifier(); -- if (!umlc) { -- uError() << "Internal error - classifier() returns NULL"; -- return; -- } -- if (umlc->isInterface() && visualProperty(DrawAsCircle)) { -- drawAsCircle(painter, option); -- UMLWidget::paint(painter, option, widget); -- return; -- } -- -- // Draw the bounding rectangle -- QSize templatesBoxSize = calculateTemplatesBoxSize(); -- int bodyOffsetY = 0; -- if (templatesBoxSize.height() > 0) -- bodyOffsetY += templatesBoxSize.height() - MARGIN; -- int w = width(); -- if (templatesBoxSize.width() > 0) -- w -= templatesBoxSize.width() / 2; -- int h = height(); -- if (templatesBoxSize.height() > 0) -- h -= templatesBoxSize.height() - MARGIN; -- painter->drawRect(0, bodyOffsetY, w, h); -- -- QFont font = UMLWidget::font(); -- font.setUnderline(false); -- font.setItalic(false); -- const QFontMetrics &fm = UMLWidget::getFontMetrics(UMLWidget::FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- -- //If there are any templates then draw them -- UMLTemplateList tlist = umlc->getTemplateList(); -- if (tlist.count() > 0) { -- setPenFromSettings(painter); -- QPen pen = painter->pen(); -- pen.setStyle(Qt::DotLine); -- painter->setPen(pen); -- painter->drawRect(width() - templatesBoxSize.width(), 0, -- templatesBoxSize.width(), templatesBoxSize.height()); -- painter->setPen(QPen(textColor())); -- font.setBold(false); -- painter->setFont(font); -- const int x = width() - templatesBoxSize.width() + MARGIN; -- int y = MARGIN; -- foreach (UMLTemplate *t, tlist) { -- QString text = t->toString(); -- painter->drawText(x, y, fm.size(0, text).width(), fontHeight, Qt::AlignVCenter, text); -- y += fontHeight; -- } -- } -- -- const int textX = MARGIN; -- const int textWidth = w - MARGIN * 2; -- -- painter->setPen(QPen(textColor())); -- -- // draw stereotype -- font.setBold(true); -- const bool showNameOnly = !visualProperty(ShowAttributes) && -- !visualProperty(ShowOperations) && -- !visualProperty(ShowDocumentation); -- -- int nameHeight = fontHeight; -- if (visualProperty(ShowStereotype) && !m_umlObject->stereotype().isEmpty()) { -- painter->setFont(font); -- painter->drawText(textX, bodyOffsetY, textWidth, fontHeight, Qt::AlignCenter, m_umlObject->stereotype(true)); -- bodyOffsetY += fontHeight; -- } else if (showNameOnly) { -- nameHeight = h; -- } -- -- // draw name -- QString name; -- if (visualProperty(ShowPackage)) { -- name = m_umlObject->fullyQualifiedName(); -- } else { -- name = this->name(); -- } -- font.setItalic(m_umlObject->isAbstract()); -- painter->setFont(font); -- painter->drawText(textX, bodyOffsetY, textWidth, nameHeight, Qt::AlignCenter, name); -- bodyOffsetY += fontHeight; -- font.setBold(false); -- font.setItalic(false); -- painter->setFont(font); -- --#ifdef ENABLE_WIDGET_SHOW_DOC -- // draw documentation -- if (visualProperty(ShowDocumentation)) { -- setPenFromSettings(painter); -- painter->drawLine(0, bodyOffsetY, w, bodyOffsetY); -- painter->setPen(textColor()); -- -- if (!documentation().isEmpty()) { -- QRect brect = fm.boundingRect(QRect(0, 0, w-2*MARGIN, h-bodyOffsetY), Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, documentation()); -- if (brect.width() > width() + 2*MARGIN) -- brect.setWidth(width()-2*MARGIN); -- brect.adjust(textX, bodyOffsetY, textX, bodyOffsetY); -- painter->drawText(brect, Qt::AlignCenter | Qt::TextWordWrap, documentation()); -- bodyOffsetY += brect.height(); -- } -- else -- bodyOffsetY += fontHeight / 2; -- } --#endif -- // draw attributes -- if (visualProperty(ShowAttributes)) { -- // draw dividing line between doc/name and attributes -- setPenFromSettings(painter); -- painter->drawLine(0, bodyOffsetY, w, bodyOffsetY); -- painter->setPen(textColor()); -- -- const int numAtts = displayedAttributes(); -- if (numAtts > 0) { -- drawMembers(painter, UMLObject::ot_Attribute, m_attributeSignature, textX, -- bodyOffsetY, fontHeight); -- bodyOffsetY += fontHeight * numAtts; -- } -- else -- bodyOffsetY += fontHeight / 2; -- } -- -- // draw operations -- if (visualProperty(ShowOperations)) { -- // draw dividing line between attributes and operations -- setPenFromSettings(painter); -- painter->drawLine(0, bodyOffsetY, w, bodyOffsetY); -- painter->setPen(QPen(textColor())); -- -- const int numOps = displayedOperations(); -- if (numOps >= 0) { -- drawMembers(painter, UMLObject::ot_Operation, m_operationSignature, textX, -- bodyOffsetY, fontHeight); -- } -- } -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * @return The shape of the ClassifierWidget. -- */ --QPainterPath ClassifierWidget::shape() const --{ -- QPainterPath path; -- if (classifier() && classifier()->isInterface() && visualProperty(DrawAsCircle)) { -- path.addEllipse(rect()); -- return path; -- } --#ifdef ENABLE_WIDGET_SHOW_DOC -- QSizeF mainSize = rect().size(); --#else -- QSizeF mainSize = calculateSize(false); --#endif -- QSize templatesBoxSize = calculateTemplatesBoxSize(); -- qreal mainY = 0.0; -- if (templatesBoxSize.height() > 0) { -- mainY += templatesBoxSize.height() - MARGIN; -- path.addRect(QRectF(mainSize.width() - templatesBoxSize.width() / 2, 0.0, -- templatesBoxSize.width(), templatesBoxSize.height())); -- } -- path.addRect(QRectF(0.0, mainY, mainSize.width(), mainSize.height())); -- return path; --} -- --/** -- * Draws the interface as a circle. -- * Only applies when m_umlObject->getBaseType() is ot_Interface. -- */ --void ClassifierWidget::drawAsCircle(QPainter *painter, const QStyleOptionGraphicsItem *option) --{ -- const int w = width(); -- -- if (m_Assocs.size() > 1) { -- painter->drawEllipse(w/2 - CIRCLE_SIZE/2, SOCKET_INCREMENT / 2, CIRCLE_SIZE, CIRCLE_SIZE); -- // Draw socket for required interface. -- const qreal angleSpan = 180; // 360.0 / (m_Assocs.size() + 1.0); -- const int arcDiameter = CIRCLE_SIZE + SOCKET_INCREMENT; -- QRect requireArc(w/2 - arcDiameter/2, 0, arcDiameter, arcDiameter); -- const QPointF center(x() + w/2, y() + arcDiameter/2); -- const qreal cX = center.x(); -- const qreal cY = center.y(); -- foreach (AssociationWidget *aw, m_Assocs) { -- const Uml::AssociationType::Enum aType = aw->associationType(); -- if (aType == Uml::AssociationType::UniAssociation || -- aType == Uml::AssociationType::Association) // provider -- continue; -- UMLWidget *otherEnd = aw->widgetForRole(Uml::RoleType::A); -- const WidgetBase::WidgetType oType = otherEnd->baseType(); -- if (oType != WidgetBase::wt_Component && oType != WidgetBase::wt_Port) -- continue; -- -- AssociationLine *assocLine = aw->associationLine(); -- const QPointF p(assocLine->endPoint()); -- const qreal tolerance = 18.0; -- bool drawArc = true; -- qreal midAngle; -- if (p.x() < cX - tolerance) { -- if (p.y() < cY - tolerance) -- midAngle = 135; -- else if (p.y() > cY + tolerance) -- midAngle = 225; -- else -- midAngle = 180; -- } else if (p.x() > cX + tolerance) { -- if (p.y() < cY - tolerance) -- midAngle = 45; -- else if (p.y() > cY + tolerance) -- midAngle = 315; -- else -- midAngle = 0; -- } else { -- if (p.y() < cY - tolerance) -- midAngle = 90; -- else if (p.y() > cY + tolerance) -- midAngle = 270; -- else -- drawArc = false; -- } -- if (drawArc) { -- // uDebug() << "number of assocs: " << m_Assocs.size() -- // << ", p: " << p << ", center: " << center -- // << ", midAngle: " << midAngle << ", angleSpan: " << angleSpan; -- painter->drawArc(requireArc, 16 * (midAngle - angleSpan/2), 16 * angleSpan); -- } else { -- uError() << "socket: assocLine endPoint " << p -- << " too close to own center" << center; -- } -- } -- } -- else -- painter->drawEllipse(w/2 - CIRCLE_SIZE/2, 0, CIRCLE_SIZE, CIRCLE_SIZE); -- -- UMLWidget::paint(painter, option); --} -- --/** -- * Calculates the size of the object when drawn as a circle. -- * Only applies when m_umlObject->getBaseType() is ot_Interface. -- */ --QSize ClassifierWidget::calculateAsCircleSize() const --{ -- int circleSize = CIRCLE_SIZE; -- if (m_Assocs.size() > 1) -- circleSize += SOCKET_INCREMENT; -- return QSize(circleSize, circleSize); --} -- --void ClassifierWidget::drawAsPackage(QPainter *painter, const QStyleOptionGraphicsItem *option) --{ -- Q_UNUSED(option); -- -- int w = width(); -- int h = height(); -- QFont font = UMLWidget::font(); -- font.setBold(true); -- //FIXME italic is true when a package is first created until you click elsewhere, not sure why -- font.setItalic(false); -- const QFontMetrics &fm = getFontMetrics(FT_BOLD); -- const int fontHeight = fm.lineSpacing(); -- -- painter->drawRect(0, 0, 50, fontHeight); -- if (m_umlObject->stereotype() == QLatin1String("subsystem")) { -- const int fHalf = fontHeight / 2; -- const int symY = fHalf; -- const int symX = 38; -- painter->drawLine(symX, symY, symX, symY + fHalf - 2); // left leg -- painter->drawLine(symX + 8, symY, symX + 8, symY + fHalf - 2); // right leg -- painter->drawLine(symX, symY, symX + 8, symY); // waist -- painter->drawLine(symX + 4, symY, symX + 4, symY - fHalf + 2); // head -- } -- painter->drawRect(0, fontHeight - 1, w, h - fontHeight); -- -- painter->setPen(textColor()); -- painter->setFont(font); -- -- int lines = 1; -- QString stereotype = m_umlObject->stereotype(); -- if (!stereotype.isEmpty()) { -- painter->drawText(0, fontHeight + PACKAGE_MARGIN, -- w, fontHeight, Qt::AlignCenter, m_umlObject->stereotype(true)); -- lines = 2; -- } -- -- painter->drawText(0, (fontHeight*lines) + PACKAGE_MARGIN, -- w, fontHeight, Qt::AlignCenter, name()); --} -- --QSize ClassifierWidget::calculateAsPackageSize() const --{ -- const QFontMetrics &fm = getFontMetrics(FT_BOLD_ITALIC); -- const int fontHeight = fm.lineSpacing(); -- -- int lines = 1; -- -- int width = fm.width(m_umlObject->name()); -- -- int tempWidth = 0; -- if (!m_umlObject->stereotype().isEmpty()) { -- tempWidth = fm.width(m_umlObject->stereotype(true)); -- lines = 2; -- } -- if (tempWidth > width) -- width = tempWidth; -- width += PACKAGE_MARGIN * 2; -- if (width < 70) -- width = 70; // minumin width of 70 -- -- int height = (lines*fontHeight) + fontHeight + (PACKAGE_MARGIN * 2); -- -- return QSize(width, height); --} -- --/** -- * Auxiliary method for draw() of child classes: -- * Draw the attributes or operations. -- * -- * @param p QPainter to paint to. -- * @param ot Object type to draw, either ot_Attribute or ot_Operation. -- * @param sigType Governs details of the member display. -- * @param x X coordinate at which to draw the texts. -- * @param y Y coordinate at which text drawing commences. -- * @param fontHeight The font height. -- */ --void ClassifierWidget::drawMembers(QPainter * painter, UMLObject::ObjectType ot, Uml::SignatureType::Enum sigType, -- int x, int y, int fontHeight) --{ -- UMLClassifier *umlc = classifier(); -- if (!umlc) { -- return; -- } -- QFont f = UMLWidget::font(); -- f.setBold(false); -- UMLClassifierListItemList list = umlc->getFilteredList(ot); -- painter->setClipping(true); -- painter->setClipRect(rect()); -- foreach (UMLClassifierListItem *obj, list) { -- if (visualProperty(ShowPublicOnly) && obj->visibility() != Uml::Visibility::Public) -- continue; -- QString text = obj->toString(sigType); -- f.setItalic(obj->isAbstract()); -- f.setUnderline(obj->isStatic()); -- painter->setFont(f); -- QFontMetrics fontMetrics(f); -- painter->drawText(x, y, fontMetrics.size(0, text).width(), fontHeight, Qt::AlignVCenter, text); -- f.setItalic(false); -- f.setUnderline(false); -- painter->setFont(f); -- y += fontHeight; -- } -- painter->setClipping(false); --} -- --/** -- * Override method from UMLWidget in order to additionally check m_pInterfaceName. -- * -- * @param p Point to be checked. -- * -- * @return 'this' if UMLWidget::onWidget(p) returns non NULL; -- * m_pInterfaceName if m_pName is non NULL and -- * m_pInterfaceName->onWidget(p) returns non NULL; else NULL. -- */ --UMLWidget* ClassifierWidget::onWidget(const QPointF &p) --{ -- if (UMLWidget::onWidget(p) != NULL) -- return this; -- if (getDrawAsCircle() && m_pInterfaceName) { -- uDebug() << "floatingtext: " << m_pInterfaceName->text(); -- return m_pInterfaceName->onWidget(p); -- } -- return NULL; --} -- --/** -- * Reimplement function from UMLWidget. -- */ --UMLWidget* ClassifierWidget::widgetWithID(Uml::ID::Type id) --{ -- if (UMLWidget::widgetWithID(id)) -- return this; -- if (getDrawAsCircle() && m_pInterfaceName && m_pInterfaceName->widgetWithID(id)) -- return m_pInterfaceName; -- return NULL; --} -- --void ClassifierWidget::setDocumentation(const QString &doc) --{ -- WidgetBase::setDocumentation(doc); -- updateGeometry(); --} -- --/** -- * Sets whether to draw as circle. -- * Only applies when m_umlObject->getBaseType() is ot_Interface. -- * -- * @param drawAsCircle True if widget shall be drawn as circle. -- */ --void ClassifierWidget::setDrawAsCircle(bool drawAsCircle) --{ -- setVisualPropertyCmd(DrawAsCircle, drawAsCircle); -- const int circleSize = CIRCLE_SIZE + SOCKET_INCREMENT; -- if (drawAsCircle) { -- setX(x() + (width()/2 - circleSize/2)); -- setY(y() + (height()/2 - circleSize/2)); -- setSize(circleSize, circleSize); -- if (m_pInterfaceName) { -- m_pInterfaceName->show(); -- } else { -- m_pInterfaceName = new FloatingTextWidget(m_scene, Uml::TextRole::Floating, name()); -- m_pInterfaceName->setParentItem(this); -- m_pInterfaceName->setText(name()); // to get geometry update -- m_pInterfaceName->setX(circleSize/2 - m_pInterfaceName->width() / 2); -- m_pInterfaceName->setY(circleSize + SOCKET_INCREMENT); -- } -- m_resizable = false; -- } else { -- setSize(ClassifierWidget::minimumSize()); -- setX(x() - (width()/2 - circleSize/2)); -- setY(y() - (height()/2 - circleSize/2)); -- if (m_pInterfaceName) -- m_pInterfaceName->hide(); -- m_resizable = true; -- } -- updateGeometry(); -- update(); --} -- --/** -- * Returns whether to draw as circle. -- * Only applies when m_umlObject->getBaseType() is ot_Interface. -- * -- * @return True if widget is drawn as circle. -- */ --bool ClassifierWidget::getDrawAsCircle() const --{ -- return visualProperty(DrawAsCircle); --} -- --/** -- * Toggles whether to draw as circle. -- * Only applies when m_umlObject->getBaseType() is ot_Interface. -- */ --void ClassifierWidget::toggleDrawAsCircle() --{ -- toggleVisualProperty(DrawAsCircle); -- updateSignatureTypes(); -- updateGeometry(); -- update(); --} -- --/** -- * Changes this classifier from an interface to a class. -- * Attributes and stereotype visibility is got from the view OptionState. -- * This widget is also updated. -- */ --void ClassifierWidget::changeToClass() --{ -- m_baseType = WidgetBase::wt_Class; -- m_umlObject->setBaseType(UMLObject::ot_Class); -- setVisualPropertyCmd(DrawAsCircle, false); -- const Settings::OptionState& ops = m_scene->optionState(); -- setVisualProperty(ShowAttributes, ops.classState.showAtts); -- setVisualProperty(ShowStereotype, ops.classState.showStereoType); -- -- updateGeometry(); -- update(); --} -- --/** -- * Changes this classifier from a class to an interface. -- * Attributes are hidden and stereotype is shown. -- * This widget is also updated. -- */ --void ClassifierWidget::changeToInterface() --{ -- m_baseType = WidgetBase::wt_Interface; -- m_umlObject->setBaseType(UMLObject::ot_Interface); -- -- setVisualProperty(ShowAttributes, false); -- setVisualProperty(ShowStereotype, true); -- -- updateGeometry(); -- update(); --} -- --/** -- * Changes this classifier from an "class-or-package" to a package. -- * This widget is also updated. -- */ --void ClassifierWidget::changeToPackage() --{ -- m_baseType = WidgetBase::wt_Package; -- m_umlObject->setBaseType(UMLObject::ot_Package); -- -- setVisualProperty(ShowAttributes, false); -- setVisualProperty(ShowStereotype, true); -- -- updateGeometry(); -- update(); --} -- --/** -- * Extends base method to adjust also the association of a class -- * association. -- * Executes the base method and then, if file isn't loading and the -- * classifier acts as a class association, the association position is -- * updated. -- * TODO: This is never called. -- * -- * param x The x-coordinate. -- * param y The y-coordinate. -- */ --//void ClassifierWidget::adjustAssociations(int x, int y) --//{ --// DEBUG(DBG_SRC) << "x=" << x << " / y=" << y; --// UMLWidget::adjustAssocs(x, y); -- --// if (m_doc->loading() || m_pAssocWidget == 0) { --// return; --// } -- --// //:TODO: the following is also called from UMLWidgetr::ajdustAssocs(...) --// // and then AssociationWidget::widgetMoved(...) --// //m_pAssocWidget->computeAssocClassLine(); --//} -- --/** -- * Loads the "classwidget" or "interfacewidget" XML element. -- */ --bool ClassifierWidget::loadFromXMI(QDomElement & qElement) --{ -- if (!UMLWidget::loadFromXMI(qElement)) { -- return false; -- } -- -- QString showatts = qElement.attribute(QLatin1String("showattributes"), QLatin1String("0")); -- QString showops = qElement.attribute(QLatin1String("showoperations"), QLatin1String("1")); -- QString showpubliconly = qElement.attribute(QLatin1String("showpubliconly"), QLatin1String("0")); -- QString showattsigs = qElement.attribute(QLatin1String("showattsigs"), QLatin1String("600")); -- QString showopsigs = qElement.attribute(QLatin1String("showopsigs"), QLatin1String("600")); -- QString showpackage = qElement.attribute(QLatin1String("showpackage"), QLatin1String("0")); -- QString showscope = qElement.attribute(QLatin1String("showscope"), QLatin1String("0")); -- QString drawascircle = qElement.attribute(QLatin1String("drawascircle"), QLatin1String("0")); --#ifdef ENABLE_WIDGET_SHOW_DOC -- QString showDocumentation = qElement.attribute(QLatin1String("showdocumentation"), QLatin1String("0")); --#endif -- -- setVisualPropertyCmd(ShowAttributes, (bool)showatts.toInt()); -- setVisualPropertyCmd(ShowOperations, (bool)showops.toInt()); -- setVisualPropertyCmd(ShowPublicOnly, (bool)showpubliconly.toInt()); -- setVisualPropertyCmd(ShowPackage, (bool)showpackage.toInt()); -- setVisualPropertyCmd(ShowVisibility, (bool)showscope.toInt()); -- setVisualPropertyCmd(DrawAsCircle, (bool)drawascircle.toInt()); --#ifdef ENABLE_WIDGET_SHOW_DOC -- setVisualPropertyCmd(ShowDocumentation, (bool)showDocumentation.toInt()); --#endif -- -- m_attributeSignature = Uml::SignatureType::fromInt(showattsigs.toInt()); -- m_operationSignature = Uml::SignatureType::fromInt(showopsigs.toInt()); -- -- if (!getDrawAsCircle()) -- return true; -- -- // Optional child element: floatingtext -- QDomNode node = qElement.firstChild(); -- QDomElement element = node.toElement(); -- if (!element.isNull()) { -- QString tag = element.tagName(); -- if (tag == QLatin1String("floatingtext")) { -- if (m_pInterfaceName == NULL) { -- m_pInterfaceName = new FloatingTextWidget(m_scene, -- Uml::TextRole::Floating, -- name(), Uml::ID::Reserved); -- m_pInterfaceName->setParentItem(this); -- } -- if (!m_pInterfaceName->loadFromXMI(element)) { -- // Most likely cause: The FloatingTextWidget is empty. -- delete m_pInterfaceName; -- m_pInterfaceName = NULL; -- } else { -- m_pInterfaceName->activate(); -- m_pInterfaceName->update(); -- } -- } else { -- uError() << "unknown tag " << tag; -- } -- } -- -- return true; --} -- --/** -- * Creates the "classwidget" or "interfacewidget" XML element. -- */ --void ClassifierWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement conceptElement; -- UMLClassifier *umlc = classifier(); -- if (umlc && umlc->isInterface()) -- conceptElement = qDoc.createElement(QLatin1String("interfacewidget")); -- else -- conceptElement = qDoc.createElement(QLatin1String("classwidget")); -- UMLWidget::saveToXMI(qDoc, conceptElement); -- conceptElement.setAttribute(QLatin1String("showoperations"), visualProperty(ShowOperations)); -- conceptElement.setAttribute(QLatin1String("showpubliconly"), visualProperty(ShowPublicOnly)); -- conceptElement.setAttribute(QLatin1String("showopsigs"), m_operationSignature); -- conceptElement.setAttribute(QLatin1String("showpackage"), visualProperty(ShowPackage)); -- conceptElement.setAttribute(QLatin1String("showscope"), visualProperty(ShowVisibility)); -- conceptElement.setAttribute(QLatin1String("showattributes"), visualProperty(ShowAttributes)); -- conceptElement.setAttribute(QLatin1String("showattsigs"), m_attributeSignature); --#ifdef ENABLE_WIDGET_SHOW_DOC -- conceptElement.setAttribute(QLatin1String("showdocumentation"),visualProperty(ShowDocumentation)); --#endif -- if (umlc && (umlc->isInterface() || umlc->isAbstract())) { -- conceptElement.setAttribute(QLatin1String("drawascircle"), visualProperty(DrawAsCircle)); -- if (visualProperty(DrawAsCircle) && m_pInterfaceName) { -- m_pInterfaceName->saveToXMI(qDoc, conceptElement); -- } -- } -- qElement.appendChild(conceptElement); --} -- --/** -- * Will be called when a menu selection has been made from the -- * popup menu. -- * -- * @param action The action that has been selected. -- */ --void ClassifierWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch (sel) { -- case ListPopupMenu::mt_Attribute: -- case ListPopupMenu::mt_Operation: -- case ListPopupMenu::mt_Template: -- { -- UMLObject::ObjectType ot = ListPopupMenu::convert_MT_OT(sel); -- UMLClassifier *umlc = classifier(); -- if (!umlc) { -- uError() << "Internal error - classifier() returns NULL"; -- return; -- } -- if (Object_Factory::createChildObject(umlc, ot)) { -- updateGeometry(); -- update(); -- UMLApp::app()->document()->setModified(); -- } -- break; -- } -- case ListPopupMenu::mt_Show_Operations: -- toggleVisualProperty(ShowOperations); -- break; -- -- case ListPopupMenu::mt_Show_Attributes: -- toggleVisualProperty(ShowAttributes); -- break; -- -- case ListPopupMenu::mt_Show_Documentation: -- toggleVisualProperty(ShowDocumentation); -- break; -- -- case ListPopupMenu::mt_Show_Public_Only: -- toggleVisualProperty(ShowPublicOnly); -- break; -- -- case ListPopupMenu::mt_Show_Operation_Signature: -- toggleVisualProperty(ShowOperationSignature); -- break; -- -- case ListPopupMenu::mt_Show_Attribute_Signature: -- toggleVisualProperty(ShowAttributeSignature); -- break; -- -- case ListPopupMenu::mt_Visibility: -- toggleVisualProperty(ShowVisibility); -- break; -- -- case ListPopupMenu::mt_Show_Packages: -- toggleVisualProperty(ShowPackage); -- break; -- -- case ListPopupMenu::mt_Show_Stereotypes: -- toggleVisualProperty(ShowStereotype); -- break; -- -- case ListPopupMenu::mt_DrawAsCircle: -- toggleVisualProperty(DrawAsCircle); -- break; -- -- case ListPopupMenu::mt_ChangeToClass: -- changeToClass(); -- break; -- -- case ListPopupMenu::mt_ChangeToInterface: -- changeToInterface(); -- break; -- -- case ListPopupMenu::mt_ChangeToPackage: -- changeToPackage(); -- break; -- -- default: -- UMLWidget::slotMenuSelection(action); -- break; -- } --} -- --/** -- * Slot to show/hide attributes based on \a state. -- */ --void ClassifierWidget::slotShowAttributes(bool state) --{ -- setVisualProperty(ShowAttributes, state); --} -- --/** -- * Slot to show/hide operations based on \a state. -- */ --void ClassifierWidget::slotShowOperations(bool state) --{ -- setVisualProperty(ShowOperations, state); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/classifierwidget.h umbrello-kf6-15.08.1/umbrello/widgets/classifierwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/classifierwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/classifierwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,146 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef CLASSIFIERWIDGET_H --#define CLASSIFIERWIDGET_H -- --#include "basictypes.h" --#include "umlobject.h" --#include "umlwidget.h" -- --class AssociationWidget; --class FloatingTextWidget; --class QPainter; --class UMLClassifier; -- --/** -- * @short Common implementation for class widget and interface widget -- * -- * @author Oliver Kellogg -- * @author Gopala Krishna -- * -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class ClassifierWidget : public UMLWidget --{ -- Q_OBJECT -- Q_ENUMS(VisualProperty) --public: -- /** -- * This enumeration lists the visual properties that can be easily -- * set, reset and toggled and all these operate on an integer -- * which stores all the flag status. -- */ -- enum VisualProperty { -- ShowStereotype = 0x1, -- ShowOperations = 0x2, -- ShowPublicOnly = 0x4, -- ShowVisibility = 0x8, -- ShowPackage = 0x10, -- ShowAttributes = 0x20, -- DrawAsCircle = 0x40, -- ShowOperationSignature = 0x60, ///< only in setter -- ShowAttributeSignature = 0x80, ///< only in setter -- DrawAsPackage = 0x100, -- ShowDocumentation = 0x200, -- }; -- -- Q_DECLARE_FLAGS(VisualProperties, VisualProperty) -- -- ClassifierWidget(UMLScene * scene, UMLClassifier * o); -- ClassifierWidget(UMLScene * scene, UMLPackage * o); -- virtual ~ClassifierWidget(); -- -- UMLClassifier *classifier() const; -- -- VisualProperties visualProperties() const; -- void setVisualProperties(VisualProperties properties); -- -- bool visualProperty(VisualProperty property) const; -- void setVisualProperty(VisualProperty property, bool enable = true); -- void setVisualPropertyCmd(VisualProperty property, bool enable = true); -- void toggleVisualProperty(VisualProperty property); -- -- int displayedAttributes() const; -- int displayedOperations() const; -- -- Uml::SignatureType::Enum attributeSignature() const; -- void setAttributeSignature(Uml::SignatureType::Enum sig); -- -- Uml::SignatureType::Enum operationSignature() const; -- void setOperationSignature(Uml::SignatureType::Enum sig); -- -- void setShowAttSigs(bool _show); -- void toggleShowAttSigs(); -- -- bool getDrawAsCircle() const; -- void setDrawAsCircle(bool drawAsCircle); -- void toggleDrawAsCircle(); -- -- void changeToClass(); -- void changeToInterface(); -- void changeToPackage(); -- -- AssociationWidget *classAssociationWidget() const; -- void setClassAssociationWidget(AssociationWidget *assocwidget); --// virtual void adjustAssociations(int x, int y); -- -- UMLWidget* onWidget(const QPointF& p); -- UMLWidget* widgetWithID(Uml::ID::Type id); -- -- virtual void setDocumentation(const QString& doc); -- -- QSizeF calculateSize(bool withExtensions = true) const; -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- virtual QPainterPath shape() const; -- -- virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- virtual bool loadFromXMI(QDomElement & qElement); -- --public Q_SLOTS: -- virtual void slotMenuSelection(QAction* action); -- --private Q_SLOTS: -- void slotShowAttributes(bool state); -- void slotShowOperations(bool state); -- --private: -- void updateSignatureTypes(); -- QSize calculateTemplatesBoxSize() const; -- -- QSizeF minimumSize() const; -- -- void drawAsCircle(QPainter *p, const QStyleOptionGraphicsItem *option); -- QSize calculateAsCircleSize() const; -- -- void drawAsPackage(QPainter *painter, const QStyleOptionGraphicsItem *option); -- QSize calculateAsPackageSize() const; -- -- int displayedMembers(UMLObject::ObjectType ot) const; -- void drawMembers(QPainter *painter, UMLObject::ObjectType ot, Uml::SignatureType::Enum sigType, -- int x, int y, int fontHeight); -- -- static const int MARGIN; ///< text width margin -- static const int CIRCLE_SIZE; ///< size of circle when interface is rendered as such -- static const int SOCKET_INCREMENT; ///< augmentation of circle for socket (required interface) -- -- VisualProperties m_visualProperties; -- Uml::SignatureType::Enum m_attributeSignature; ///< Loaded/saved item. -- Uml::SignatureType::Enum m_operationSignature; ///< Loaded/saved item. -- AssociationWidget *m_pAssocWidget; ///< related AssociationWidget in case this classifier acts as an association class -- FloatingTextWidget *m_pInterfaceName; ///< Separate widget for name in case of interface drawn as circle -- --}; -- --Q_DECLARE_OPERATORS_FOR_FLAGS(ClassifierWidget::VisualProperties) -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/combinedfragmentwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/combinedfragmentwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/combinedfragmentwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/combinedfragmentwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,477 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "combinedfragmentwidget.h" -- --// app includes --#include "debug_utils.h" --#include "dialog_utils.h" --#include "listpopupmenu.h" --#include "uml.h" --#include "umldoc.h" --#include "umlscene.h" --#include "umlview.h" -- --// kde includes --#include --#if QT_VERSION < 0x050000 --#include --#endif -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#endif --#include --#include -- --/** -- * Creates a Combined Fragment widget. -- * -- * @param scene The parent of the widget. -- * @param combinedfragmentType The type of combined fragment. -- * @param id The ID to assign (-1 will prompt a new ID.) -- */ --CombinedFragmentWidget::CombinedFragmentWidget(UMLScene * scene, CombinedFragmentType combinedfragmentType, Uml::ID::Type id) -- : UMLWidget(scene, WidgetBase::wt_CombinedFragment, id) --{ -- setCombinedFragmentType(combinedfragmentType); --} -- --/** -- * Destructor. -- */ --CombinedFragmentWidget::~CombinedFragmentWidget() --{ -- for (QList::iterator it=m_dashLines.begin() ; it!=m_dashLines.end() ; ++it) { -- delete(*it); -- } --} -- --/** -- * Overrides the standard paint event. -- */ --void CombinedFragmentWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- int w = width(); -- int h = height(); -- int line_width = 45; -- int old_Y; -- -- setPenFromSettings(painter); -- -- if (m_CombinedFragment == Ref) { -- if (UMLWidget::useFillColor()) { -- painter->setBrush(UMLWidget::fillColor()); -- } -- } -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- const QString combined_fragment_value = name(); -- int textStartY = (h / 2) - (fontHeight / 2); -- painter->drawRect(0, 0, w, h); -- -- painter->setPen(textColor()); -- painter->setFont(UMLWidget::font()); -- QString temp = QLatin1String("loop"); -- -- switch (m_CombinedFragment) -- { -- case Ref : -- painter->drawText(COMBINED_FRAGMENT_MARGIN, textStartY, w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignCenter, combined_fragment_value); -- painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("ref")); -- break; -- -- case Opt : -- painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -- w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("opt")); -- break; -- -- case Break : -- painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -- w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("break")); -- break; -- -- case Loop : -- if (combined_fragment_value != QLatin1String("-")) -- { -- temp += QLatin1String(" [") + combined_fragment_value + QLatin1Char(']'); -- line_width += (combined_fragment_value.size() + 2) * 8; -- } -- painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, temp); -- -- break; -- -- case Neg : -- painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -- w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("neg")); -- break; -- -- case Crit : -- painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -- w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("critical")); -- break; -- -- case Ass : -- painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -- w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("assert")); -- break; -- -- case Alt : -- if (combined_fragment_value != QLatin1String("-")) -- { -- temp = QLatin1Char('[') + combined_fragment_value + QLatin1Char(']'); -- painter->drawText(COMBINED_FRAGMENT_MARGIN, 20, w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, temp); -- if (m_dashLines.size() == 1 && m_dashLines.first()->y() < y() + 20 + fontHeight) -- m_dashLines.first()->setY(y() + h/2); -- } -- painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -- w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("alt")); -- // dash lines -- //m_dashLines.first()->paint(painter); -- // TODO: move to UMLWidget::calculateSize api -- for (QList::iterator it=m_dashLines.begin() ; it!=m_dashLines.end() ; ++it) { -- (*it)->setX(x()); -- old_Y = (*it)->getYMin(); -- (*it)->setYMin(y()); -- (*it)->setYMax(y() + height()); -- (*it)->setY(y() + (*it)->y() - old_Y); -- (*it)->setSize(w, (*it)->height()); -- (*it)->setLineColor(lineColor()); -- (*it)->setLineWidth(lineWidth()); -- } -- -- break; -- -- case Par : -- painter->drawText(COMBINED_FRAGMENT_MARGIN, 0, -- w - COMBINED_FRAGMENT_MARGIN * 2, fontHeight, Qt::AlignLeft, QLatin1String("parallel")); -- // dash lines -- if (m_dashLines.size() != 0) { -- //m_dashLines.first()->paint(painter); -- // TODO: move to UMLWidget::calculateSize api -- for (QList::iterator it=m_dashLines.begin() ; it!=m_dashLines.end() ; ++it) { -- (*it)->setX(x()); -- old_Y = (*it)->getYMin(); -- (*it)->setYMin(y()); -- (*it)->setYMax(y() + height()); -- (*it)->setY(y() + (*it)->y() - old_Y); -- (*it)->setSize(w, (*it)->height()); -- (*it)->setLineColor(lineColor()); -- (*it)->setLineWidth(lineWidth()); -- } -- } -- break; -- -- default : break; -- } -- -- setPenFromSettings(painter); -- painter->drawLine(0, 20, line_width, 20); -- painter->drawLine(line_width, 20, line_width + 10, 10); -- painter->drawLine(line_width + 10, 10, line_width + 10, 0); -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF CombinedFragmentWidget::minimumSize() const --{ -- int width = 10, height = 10; -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- const int textWidth = fm.width(name()); -- height = fontHeight; -- width = textWidth + 60 > COMBINED_FRAGMENT_WIDTH ? textWidth + 60: COMBINED_FRAGMENT_WIDTH; -- if (m_CombinedFragment == Loop) -- width += int((float)textWidth * 0.4f); -- if (m_CombinedFragment == Alt) -- height += fontHeight + 40; -- height = height > COMBINED_FRAGMENT_HEIGHT ? height : COMBINED_FRAGMENT_HEIGHT; -- width += COMBINED_FRAGMENT_MARGIN * 2; -- height += COMBINED_FRAGMENT_MARGIN * 2; -- -- return QSizeF(width, height); --} -- --/** -- * Returns the type of combined fragment. -- */ --CombinedFragmentWidget::CombinedFragmentType CombinedFragmentWidget::combinedFragmentType() const --{ -- return m_CombinedFragment; --} -- --/** -- * Sets the type of combined fragment. -- */ --void CombinedFragmentWidget::setCombinedFragmentType(CombinedFragmentType combinedfragmentType) --{ -- m_CombinedFragment = combinedfragmentType; -- UMLWidget::m_resizable = true ; //(m_CombinedFragment == Normal); -- // creates a dash line if the combined fragment type is alternative or parallel -- if (m_CombinedFragment == Alt && m_dashLines.isEmpty()) -- { -- m_dashLines.push_back(new FloatingDashLineWidget(m_scene, Uml::ID::None, this)); -- if (m_CombinedFragment == Alt) -- { -- m_dashLines.back()->setText(QLatin1String("else")); -- } -- // TODO: move to UMLWidget::calculateSize api -- m_dashLines.back()->setX(x()); -- m_dashLines.back()->setYMin(y()); -- m_dashLines.back()->setYMax(y() + height()); -- m_dashLines.back()->setY(y() + height()/2); -- m_dashLines.back()->setSize(width(), m_dashLines.back()->height()); -- m_scene->widgetList().append(m_dashLines.back()); -- } --} -- --/** -- * Returns the type of combined fragment. -- */ --CombinedFragmentWidget::CombinedFragmentType CombinedFragmentWidget::combinedFragmentType(const QString& type) const --{ -- if (type == QLatin1String("Reference")) -- return (CombinedFragmentWidget::Ref); -- if (type == QLatin1String("Option")) -- return (CombinedFragmentWidget::Opt); -- if (type == QLatin1String("Break")) -- return (CombinedFragmentWidget::Break); -- if (type == QLatin1String("Loop")) -- return (CombinedFragmentWidget::Loop); -- if (type == QLatin1String("Negative")) -- return (CombinedFragmentWidget::Neg); -- if (type == QLatin1String("Critical")) -- return (CombinedFragmentWidget::Crit); -- if (type == QLatin1String("Assertion")) -- return (CombinedFragmentWidget::Ass); -- if (type == QLatin1String("Alternative")) -- return (CombinedFragmentWidget::Alt); -- if (type == QLatin1String("Parallel")) -- return (CombinedFragmentWidget::Par); -- // Shouldn't happen -- Q_ASSERT(0); -- return (CombinedFragmentWidget::Ref); --} -- --/** -- * Sets the type of combined fragment. -- */ --void CombinedFragmentWidget::setCombinedFragmentType(const QString& combinedfragmentType) --{ -- setCombinedFragmentType(combinedFragmentType(combinedfragmentType)); --} -- --/** -- * ... -- */ --void CombinedFragmentWidget::askNameForWidgetType(UMLWidget* &targetWidget, const QString& dialogTitle, -- const QString& dialogPrompt, const QString& defaultName) --{ -- Q_UNUSED(defaultName); -- bool pressedOK = false; -- const QStringList list = QStringList() -- << QLatin1String("Reference") -- << QLatin1String("Option") -- << QLatin1String("Break") -- << QLatin1String("Loop") -- << QLatin1String("Negative") -- << QLatin1String("Critical") -- << QLatin1String("Assertion") -- << QLatin1String("Alternative") -- << QLatin1String("Parallel") ; --#if QT_VERSION >= 0x050000 -- QPointer inputDlg = new QInputDialog(); -- inputDlg->setComboBoxItems(list); -- inputDlg->setOptions(QInputDialog::UseListViewForComboBoxItems); -- inputDlg->setWindowTitle(dialogTitle); -- inputDlg->setLabelText(dialogPrompt); -- pressedOK = inputDlg->exec(); -- QStringList result; -- result.append(inputDlg->textValue()); -- delete inputDlg; --#else -- const QStringList select = list; -- QStringList result = KInputDialog::getItemList (dialogTitle, dialogPrompt, list, select, false, &pressedOK, UMLApp::app()); --#endif -- if (pressedOK) { -- QString type = result.join(QString()); -- dynamic_cast(targetWidget)->setCombinedFragmentType(type); -- if (type == QLatin1String("Reference")) -- Dialog_Utils::askNameForWidget(targetWidget, i18n("Enter the name of the diagram referenced"), i18n("Enter the name of the diagram referenced"), i18n("Diagram name")); -- else if (type == QLatin1String(QLatin1String("Loop"))) -- Dialog_Utils::askNameForWidget(targetWidget, i18n("Enter the guard of the loop"), i18n("Enter the guard of the loop"), i18n("-")); -- else if (type == QLatin1String("Alternative")) -- Dialog_Utils::askNameForWidget(targetWidget, i18n("Enter the first alternative name"), i18n("Enter the first alternative name"), i18n("-")); -- } else { -- targetWidget->cleanup(); -- delete targetWidget; -- targetWidget = NULL; -- } --} -- --/** -- * Saves the widget to the "combinedFragmentwidget" XMI element. -- */ --void CombinedFragmentWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement combinedFragmentElement = qDoc.createElement(QLatin1String("combinedFragmentwidget")); -- UMLWidget::saveToXMI(qDoc, combinedFragmentElement); -- combinedFragmentElement.setAttribute(QLatin1String("combinedFragmentname"), m_Text); -- combinedFragmentElement.setAttribute(QLatin1String("documentation"), m_Doc); -- combinedFragmentElement.setAttribute(QLatin1String("CombinedFragmenttype"), m_CombinedFragment); -- -- // save the corresponding floating dash lines -- for (QList::iterator it = m_dashLines.begin() ; it != m_dashLines.end() ; ++it) { -- (*it)-> saveToXMI(qDoc, combinedFragmentElement); -- } -- -- qElement.appendChild(combinedFragmentElement); --} -- --/** -- * Loads the widget from the "CombinedFragmentwidget" XMI element. -- */ --bool CombinedFragmentWidget::loadFromXMI(QDomElement & qElement) --{ -- if (!UMLWidget::loadFromXMI(qElement)) -- return false; -- m_Text = qElement.attribute(QLatin1String("combinedFragmentname")); -- m_Doc = qElement.attribute(QLatin1String("documentation")); -- QString type = qElement.attribute(QLatin1String("CombinedFragmenttype")); -- -- //now load child elements -- QDomNode node = qElement.firstChild(); -- QDomElement element = node.toElement(); -- while (!element.isNull()) { -- QString tag = element.tagName(); -- if (tag == QLatin1String("floatingdashlinewidget")) { -- FloatingDashLineWidget * fdlwidget = new FloatingDashLineWidget(m_scene, Uml::ID::None, this); -- m_dashLines.push_back(fdlwidget); -- if (!fdlwidget->loadFromXMI(element)) { -- // Most likely cause: The FloatingTextWidget is empty. -- delete m_dashLines.back(); -- return false; -- } -- else { -- m_scene->widgetList().append(fdlwidget); -- fdlwidget->clipSize(); -- } -- } else { -- uError() << "unknown tag " << tag; -- } -- node = node.nextSibling(); -- element = node.toElement(); -- } -- // m_dashLines = listline; -- setCombinedFragmentType((CombinedFragmentType)type.toInt()); -- -- return true; --} -- --void CombinedFragmentWidget::removeDashLine(FloatingDashLineWidget *line) --{ -- if (m_dashLines.contains(line)) -- m_dashLines.removeOne(line); --} -- --/** -- * Overrides the function from UMLWidget. Deletes all FloatingDashLineWidgets -- * that are associated with this instance. -- */ --void CombinedFragmentWidget::cleanup() --{ -- foreach (FloatingDashLineWidget* w, m_dashLines) -- { -- if (!w->isSelected()) { -- // no need to make this undoable, since the dashlines will be -- // reconstructed when deleting the combined fragment is undone. -- umlScene()->removeWidgetCmd(w); -- } -- } --} -- --/** -- * Overrides the function from UMLWidget. -- * -- * @param action The command to be executed. -- */ --void CombinedFragmentWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch (sel) { -- // for alternative or parallel combined fragments -- case ListPopupMenu::mt_AddInteractionOperand: -- m_dashLines.push_back(new FloatingDashLineWidget(m_scene, Uml::ID::None, this)); -- if (m_CombinedFragment == Alt) -- { -- m_dashLines.back()->setText(QLatin1String("else")); -- } -- // TODO: move to UMLWidget::calculateSize api -- m_dashLines.back()->setX(x()); -- m_dashLines.back()->setYMin(y()); -- m_dashLines.back()->setYMax(y() + height()); -- m_dashLines.back()->setY(y() + height() / 2); -- m_dashLines.back()->setSize(width(), m_dashLines.back()->height()); -- m_scene->setupNewWidget(m_dashLines.back()); -- break; -- -- case ListPopupMenu::mt_Rename: -- { -- bool ok = false; -- QString name = m_Text; -- --#if QT_VERSION >= 0x050000 -- if (m_CombinedFragment == Alt) { -- name = QInputDialog::getText(Q_NULLPTR, -- i18n("Enter first alternative"), i18n("Enter first alternative :"), -- QLineEdit::Normal, -- m_Text, &ok); -- } -- else if (m_CombinedFragment == Ref) { -- name = QInputDialog::getText(Q_NULLPTR, -- i18n("Enter referenced diagram name"), i18n("Enter referenced diagram name :"), -- QLineEdit::Normal, -- m_Text, &ok); -- } -- else if (m_CombinedFragment == Loop) { -- name = QInputDialog::getText(Q_NULLPTR, -- i18n("Enter the guard of the loop"), i18n("Enter the guard of the loop:"), -- QLineEdit::Normal, -- m_Text, &ok); -- } --#else -- if (m_CombinedFragment == Alt) { -- name = KInputDialog::getText(i18n("Enter first alternative"), i18n("Enter first alternative :"), m_Text, &ok); -- } -- else if (m_CombinedFragment == Ref) { -- name = KInputDialog::getText(i18n("Enter referenced diagram name"), i18n("Enter referenced diagram name :"), m_Text, &ok); -- } -- else if (m_CombinedFragment == Loop) { -- name = KInputDialog::getText(i18n("Enter the guard of the loop"), i18n("Enter the guard of the loop:"), m_Text, &ok); -- } --#endif -- if (ok && name.length() > 0) -- m_Text = name; -- } -- break; -- -- default: -- UMLWidget::slotMenuSelection(action); -- } --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/combinedfragmentwidget.h umbrello-kf6-15.08.1/umbrello/widgets/combinedfragmentwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/combinedfragmentwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/combinedfragmentwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,91 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef COMBINEDFRAGMENTWIDGET_H --#define COMBINEDFRAGMENTWIDGET_H -- --#include "umlwidget.h" --#include "worktoolbar.h" --#include "floatingdashlinewidget.h" -- --#include -- --#define COMBINED_FRAGMENT_MARGIN 5 --#define COMBINED_FRAGMENT_WIDTH 100 --#define COMBINED_FRAGMENT_HEIGHT 50 -- --/** -- * This class is the graphical version of a UML combined fragment. A combinedfragmentWidget is created -- * by a @ref UMLView. An combinedfragmentWidget belongs to only one @ref UMLView instance. -- * When the @ref UMLView instance that this class belongs to, it will be automatically deleted. -- * -- * The combinedfragmentWidget class inherits from the @ref UMLWidget class which adds most of the functionality -- * to this class. -- * -- * @short A graphical version of a UML combined fragment. -- * @author Hassan KOUCH -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class CombinedFragmentWidget : public UMLWidget --{ -- Q_OBJECT -- --public: -- enum CombinedFragmentType -- { -- Ref = 0, -- Opt, -- Break, -- Loop, -- Neg, -- Crit, -- Ass, -- Alt, -- Par -- }; -- -- explicit CombinedFragmentWidget(UMLScene * scene, -- CombinedFragmentType combinedfragmentType = Ref, -- Uml::ID::Type id = Uml::ID::None); -- virtual ~CombinedFragmentWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- CombinedFragmentType combinedFragmentType() const; -- CombinedFragmentType combinedFragmentType(const QString& combinedfragmentType) const; -- void setCombinedFragmentType(CombinedFragmentType combinedfragmentType); -- void setCombinedFragmentType(const QString& combinedfragmentType); -- -- void askNameForWidgetType(UMLWidget* &targetWidget, const QString& dialogTitle, -- const QString& dialogPrompt, const QString& defaultName); -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- bool loadFromXMI(QDomElement & qElement); -- void removeDashLine(FloatingDashLineWidget *line); -- -- virtual void cleanup(); -- --public slots: -- void slotMenuSelection(QAction* action); -- -- --protected: -- QSizeF minimumSize() const; -- -- /// Type of CombinedFragment. -- CombinedFragmentType m_CombinedFragment; -- --private: -- /// Dash lines of an alternative or parallel combined fragment -- QList m_dashLines ; -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/componentwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/componentwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/componentwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/componentwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,207 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "componentwidget.h" -- --// app includes --#include "component.h" --#include "debug_utils.h" --#include "umlscene.h" --#include "umlview.h" --#include "optionstate.h" --#include "umldoc.h" --#include "package.h" --#include "portwidget.h" -- --/** -- * Constructs a ComponentWidget. -- * -- * @param scene The parent of this ComponentWidget. -- * @param c The UMLComponent this will be representing. -- */ --ComponentWidget::ComponentWidget(UMLScene * scene, UMLComponent *c) -- : UMLWidget(scene, WidgetBase::wt_Component, c) --{ -- setSize(100, 30); -- //set defaults from m_scene -- if (m_scene) { -- //check to see if correct -- const Settings::OptionState& ops = m_scene->optionState(); -- m_showStereotype = ops.classState.showStereoType; -- } --} -- --/** -- * Destructor. -- */ --ComponentWidget::~ComponentWidget() --{ --} -- --/** -- * Reimplemented from UMLWidget::paint to paint component -- * widget. -- */ --void ComponentWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- UMLComponent *umlcomp = static_cast(m_umlObject); -- if (umlcomp == NULL) -- return; -- setPenFromSettings(painter); -- QPen origPen = painter->pen(); -- QPen pen = origPen; -- if (umlcomp->getExecutable()) { -- pen.setWidth(origPen.width() + 2); -- painter->setPen(pen); -- } -- if (UMLWidget::useFillColor()) { -- painter->setBrush(UMLWidget::fillColor()); -- } else { -- painter->setBrush(m_scene->backgroundColor()); -- } -- -- const int w = width(); -- const int h = height(); -- const int halfHeight = h / 2; -- int textXOffset = 0; -- QFont font = UMLWidget::font(); -- font.setBold(true); -- const QFontMetrics &fm = getFontMetrics(FT_BOLD); -- const int fontHeight = fm.lineSpacing(); -- QString nameStr = name(); -- const QString stereotype = m_umlObject->stereotype(); -- -- if (Settings::optionState().generalState.uml2) { -- painter->drawRect(0, 0, w, h); -- // draw small component symbol in upper right corner -- painter->setPen(origPen); -- painter->drawRect(w - 17, 5, 11, 13); -- painter->drawRect(w - 19, 7, 2, 2); -- painter->drawRect(w - 19, 11, 2, 2); -- painter->setPen(pen); -- } else { -- painter->drawRect(2*COMPONENT_MARGIN, 0, w - 2*COMPONENT_MARGIN, h); -- painter->drawRect(0, halfHeight - fontHeight/2 - fontHeight, COMPONENT_MARGIN*4, fontHeight); -- painter->drawRect(0, halfHeight + fontHeight/2, COMPONENT_MARGIN*4, fontHeight); -- textXOffset = COMPONENT_MARGIN * 4; -- } -- -- painter->setPen(textColor()); -- painter->setFont(font); -- -- int lines = 1; -- -- if (!stereotype.isEmpty()) { -- painter->drawText(textXOffset, halfHeight - fontHeight, -- w - textXOffset, fontHeight, Qt::AlignCenter, -- m_umlObject->stereotype(true)); -- lines = 2; -- } -- -- if (UMLWidget::isInstance()) { -- font.setUnderline(true); -- painter->setFont(font); -- nameStr = UMLWidget::instanceName() + QLatin1String(" : ") + nameStr; -- } -- -- if (lines == 1) { -- painter->drawText(textXOffset, halfHeight - (fontHeight/2), -- w - textXOffset, fontHeight, Qt::AlignCenter, nameStr); -- } else { -- painter->drawText(textXOffset, halfHeight, -- w - textXOffset, fontHeight, Qt::AlignCenter, nameStr); -- } -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Overridden from UMLWidget due to emission of signal sigCompMoved() -- */ --void ComponentWidget::moveWidgetBy(qreal diffX, qreal diffY) --{ -- UMLWidget::moveWidgetBy(diffX, diffY); -- emit sigCompMoved(diffX, diffY); --} -- --/** -- * Override method from UMLWidget for adjustment of attached PortWidgets. -- */ --void ComponentWidget::adjustAssocs(qreal dx, qreal dy) --{ -- if (m_doc->loading()) { -- // don't recalculate the assocs during load of XMI -- // -> return immediately without action -- return; -- } -- UMLWidget::adjustAssocs(dx, dy); -- UMLPackage *comp = static_cast(m_umlObject); -- foreach (UMLObject *o, comp->containedObjects()) { -- uIgnoreZeroPointer(o); -- if (o->baseType() != UMLObject::ot_Port) -- continue; -- UMLWidget *portW = m_scene->widgetOnDiagram(o->id()); -- if (portW) -- portW->adjustAssocs(dx, dy); -- } --} -- --/** -- * Saves to the "componentwidget" XMI element. -- */ --void ComponentWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement conceptElement = qDoc.createElement(QLatin1String("componentwidget")); -- UMLWidget::saveToXMI(qDoc, conceptElement); -- qElement.appendChild(conceptElement); --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF ComponentWidget::minimumSize() const --{ -- if (!m_umlObject) { -- return QSizeF(70, 70); -- } -- const QFontMetrics &fm = getFontMetrics(FT_BOLD_ITALIC); -- const int fontHeight = fm.lineSpacing(); -- -- QString name = m_umlObject->name(); -- if (UMLWidget::isInstance()) { -- name = UMLWidget::instanceName() + QLatin1String(" : ") + name; -- } -- -- int width = fm.width(name); -- -- int stereoWidth = 0; -- if (!m_umlObject->stereotype().isEmpty()) { -- stereoWidth = fm.width(m_umlObject->stereotype(true)); -- } -- if (stereoWidth > width) -- width = stereoWidth; -- width += COMPONENT_MARGIN * 6; -- width = 70>width ? 70 : width; //minumin width of 70 -- -- int height = (2*fontHeight) + (COMPONENT_MARGIN * 3); -- -- UMLComponent *umlcomp = static_cast(m_umlObject); -- if (umlcomp && umlcomp->getExecutable()) { -- width += 2; -- height += 2; -- } -- -- return QSizeF(width, height); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/componentwidget.h umbrello-kf6-15.08.1/umbrello/widgets/componentwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/componentwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/componentwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,58 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef COMPONENTWIDGET_H --#define COMPONENTWIDGET_H -- --#include "umlwidget.h" -- --class UMLComponent; -- --#define COMPONENT_MARGIN 10 -- --/** -- * Defines a graphical version of the Component. Most of the functionality -- * will come from the @ref UMLComponent class. -- * -- * @short A graphical version of a Component. -- * @author Jonathan Riddell -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class ComponentWidget : public UMLWidget --{ -- Q_OBJECT --public: -- ComponentWidget(UMLScene * scene, UMLComponent *c); -- virtual ~ComponentWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- virtual void moveWidgetBy(qreal diffX, qreal diffY); -- virtual void adjustAssocs(qreal dx, qreal dy); -- -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- --signals: -- /** -- * Emitted when the component widget is moved. -- * Provides the delta X and delta Y amount by which the widget was moved -- * relative to the previous position. -- * Slots into PortWidget::slotCompMoved() -- * @param diffX The difference between previous and new X value. -- * @param diffY The difference between previous and new Y value. -- */ -- void sigCompMoved(qreal diffX, qreal diffY); -- --protected: -- QSizeF minimumSize() const; -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/datatypewidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/datatypewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/datatypewidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/datatypewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,129 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "datatypewidget.h" -- --// app includes --#include "classifier.h" --#include "classifierlistitem.h" --#include "debug_utils.h" --#include "operation.h" --#include "umldoc.h" --#include "umlscene.h" --#include "umlview.h" -- --// qt includes --#include -- --/** -- * Constructs an DatatypeWidget. -- * -- * @param scene The parent of this DatatypeWidget. -- * @param d The UMLClassifier this will be representing. -- */ --DatatypeWidget::DatatypeWidget(UMLScene *scene, UMLClassifier *d) -- : UMLWidget(scene, WidgetBase::wt_Datatype, d) --{ -- setSize(100, 30); --} -- --/** -- * Standard deconstructor. -- */ --DatatypeWidget::~DatatypeWidget() --{ --} -- --/** -- * Overrides standard method. -- */ --void DatatypeWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) { -- painter->setBrush(UMLWidget::fillColor()); -- } else { -- painter->setBrush(m_scene->backgroundColor()); -- } -- -- int w = width(); -- int h = height(); -- -- QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- int fontHeight = fm.lineSpacing(); -- -- painter->drawRect(0, 0, w, h); -- painter->setPen(textColor()); -- -- QFont font = UMLWidget::font(); -- font.setBold(true); -- painter->setFont(font); -- painter->drawText(DATATYPE_MARGIN, 0, -- w - DATATYPE_MARGIN* 2, fontHeight, -- Qt::AlignCenter, m_umlObject->stereotype(true)); -- -- font.setItalic(m_umlObject->isAbstract()); -- painter->setFont(font); -- painter->drawText(DATATYPE_MARGIN, fontHeight, -- w - DATATYPE_MARGIN * 2, fontHeight, Qt::AlignCenter, name()); -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Loads from a "datatypewidget" XMI element. -- */ --bool DatatypeWidget::loadFromXMI(QDomElement & qElement) --{ -- return UMLWidget::loadFromXMI(qElement); --} -- --/** -- * Saves to the "datatypewidget" XMI element. -- */ --void DatatypeWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement conceptElement = qDoc.createElement(QLatin1String("datatypewidget")); -- UMLWidget::saveToXMI(qDoc, conceptElement); -- qElement.appendChild(conceptElement); --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF DatatypeWidget::minimumSize() const --{ -- if (!m_umlObject) { -- return UMLWidget::minimumSize(); -- } -- int width, height; -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- -- int lines = 1;//always have one line - for name -- lines++; //for the stereotype -- -- height = width = 0; -- height += lines * fontHeight; -- -- //now set the width of the concept -- //set width to name to start with -- //set width to name to start with -- width = getFontMetrics(FT_BOLD_ITALIC).boundingRect(m_umlObject->fullyQualifiedName()).width(); -- int w = getFontMetrics(FT_BOLD).boundingRect(m_umlObject->stereotype(true)).width(); -- -- width = w > width?w:width; -- -- //allow for width margin -- width += DATATYPE_MARGIN * 2; -- -- return QSizeF(width, height); --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/datatypewidget.h umbrello-kf6-15.08.1/umbrello/widgets/datatypewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/datatypewidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/datatypewidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,48 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef DATATYPEWIDGET_H --#define DATATYPEWIDGET_H -- --#include "umlwidget.h" -- --class UMLClassifier; -- --#define DATATYPE_MARGIN 5 -- --/** -- * Defines a graphical version of the datatype. Most of the functionality -- * will come from the @ref UMLWidget class from which class inherits from. -- * -- * @short A graphical version of an datatype. -- * @author Jonathan Riddell -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class DatatypeWidget : public UMLWidget --{ -- Q_OBJECT --public: -- DatatypeWidget(UMLScene *scene, UMLClassifier *d); -- virtual ~DatatypeWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- bool loadFromXMI(QDomElement& qElement); -- void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- --public Q_SLOTS: -- --protected: -- QSizeF minimumSize() const; -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/entitywidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/entitywidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/entitywidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/entitywidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,246 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "entitywidget.h" -- --// app includes --#include "classifier.h" --#include "classifierlistitem.h" --#include "debug_utils.h" --#include "entity.h" --#include "entityattribute.h" --#include "foreignkeyconstraint.h" --#include "listpopupmenu.h" --#include "object_factory.h" --#include "uml.h" --#include "umlclassifierlistitemlist.h" --#include "umldoc.h" --#include "umlscene.h" --#include "umlview.h" --#include "uniqueconstraint.h" -- --/** -- * Constructs an EntityWidget. -- * -- * @param scene The parent of this EntityWidget. -- * @param o The UMLObject this will be representing. -- */ --EntityWidget::EntityWidget(UMLScene *scene, UMLObject* o) -- : UMLWidget(scene, WidgetBase::wt_Entity, o) --{ -- setSize(100, 30); --} -- --/** -- * Destructor. -- */ --EntityWidget::~EntityWidget() --{ --} -- --/** -- * Draws the entity as a rectangle with a box underneith with a list of literals -- */ --void EntityWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- setPenFromSettings(painter); -- if(UMLWidget::useFillColor()) -- painter->setBrush(UMLWidget::fillColor()); -- else -- painter->setBrush(m_scene->backgroundColor()); -- -- const int w = width(); -- const int h = height(); -- -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- int fontHeight = fm.lineSpacing(); -- const QString name = this->name(); -- -- painter->drawRect(0, 0, w, h); -- painter->setPen(textColor()); -- -- QFont font = UMLWidget::font(); -- font.setBold(true); -- painter->setFont(font); -- int y = 0; -- if (!m_umlObject->stereotype().isEmpty()) { -- painter->drawText(ENTITY_MARGIN, 0, -- w - ENTITY_MARGIN * 2, fontHeight, -- Qt::AlignCenter, m_umlObject->stereotype(true)); -- font.setItalic(m_umlObject->isAbstract()); -- painter->setFont(font); -- painter->drawText(ENTITY_MARGIN, fontHeight, -- w - ENTITY_MARGIN * 2, fontHeight, Qt::AlignCenter, name); -- font.setBold(false); -- font.setItalic(false); -- painter->setFont(font); -- y = fontHeight * 2; -- } else { -- font.setItalic(m_umlObject->isAbstract()); -- painter->setFont(font); -- painter->drawText(ENTITY_MARGIN, 0, -- w - ENTITY_MARGIN * 2, fontHeight, Qt::AlignCenter, name); -- font.setBold(false); -- font.setItalic(false); -- painter->setFont(font); -- -- y = fontHeight; -- } -- -- setPenFromSettings(painter); -- -- painter->drawLine(0, y, w, y); -- -- QFontMetrics fontMetrics(font); -- UMLClassifier *classifier = (UMLClassifier*)m_umlObject; -- UMLClassifierListItem* entityattribute = 0; -- UMLClassifierListItemList list = classifier->getFilteredList(UMLObject::ot_EntityAttribute); -- foreach (entityattribute, list) { -- QString text = entityattribute->name(); -- painter->setPen(textColor()); -- UMLEntityAttribute* casted = dynamic_cast(entityattribute); -- if(casted && casted->indexType() == UMLEntityAttribute::Primary) -- { -- font.setUnderline(true); -- painter->setFont(font); -- font.setUnderline(false); -- } -- painter->drawText(ENTITY_MARGIN, y, -- fontMetrics.width(text), fontHeight, Qt::AlignVCenter, text); -- painter->setFont(font); -- y+=fontHeight; -- } -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Saves to the "entitywidget" XMI element. -- */ --void EntityWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement conceptElement = qDoc.createElement(QLatin1String("entitywidget")); -- UMLWidget::saveToXMI(qDoc, conceptElement); -- qElement.appendChild(conceptElement); --} -- --/** -- * Will be called when a menu selection has been made from the popup -- * menu. -- * -- * @param action The action that has been selected. -- */ --void EntityWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch(sel) { -- case ListPopupMenu::mt_EntityAttribute: -- if (Object_Factory::createChildObject(static_cast(m_umlObject), -- UMLObject::ot_EntityAttribute)) { -- UMLApp::app()->document()->setModified(); -- } -- break; -- -- case ListPopupMenu::mt_PrimaryKeyConstraint: -- case ListPopupMenu::mt_UniqueConstraint: -- if (UMLObject* obj = Object_Factory::createChildObject(static_cast(m_umlObject), -- UMLObject::ot_UniqueConstraint)) { -- UMLApp::app()->document()->setModified(); -- -- if (sel == ListPopupMenu::mt_PrimaryKeyConstraint) { -- UMLUniqueConstraint* uc = static_cast(obj); -- static_cast(m_umlObject)->setAsPrimaryKey(uc); -- } -- } -- break; -- -- case ListPopupMenu::mt_ForeignKeyConstraint: -- if (Object_Factory::createChildObject(static_cast(m_umlObject), -- UMLObject::ot_ForeignKeyConstraint)) { -- UMLApp::app()->document()->setModified(); -- -- } -- break; -- -- case ListPopupMenu::mt_CheckConstraint: -- if (Object_Factory::createChildObject(static_cast(m_umlObject), -- UMLObject::ot_CheckConstraint)) { -- UMLApp::app()->document()->setModified(); -- -- } -- break; -- -- default: -- UMLWidget::slotMenuSelection(action); -- } --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF EntityWidget::minimumSize() const --{ -- if (!m_umlObject) { -- return UMLWidget::minimumSize(); -- } -- -- int width, height; -- QFont font = UMLWidget::font(); -- font.setItalic(false); -- font.setUnderline(false); -- font.setBold(false); -- const QFontMetrics fm(font); -- -- const int fontHeight = fm.lineSpacing(); -- -- int lines = 1;//always have one line - for name -- if (!m_umlObject->stereotype().isEmpty()) { -- lines++; -- } -- -- const int numberOfEntityAttributes = ((UMLEntity*)m_umlObject)->entityAttributes(); -- -- height = width = 0; -- //set the height of the entity -- -- lines += numberOfEntityAttributes; -- if (numberOfEntityAttributes == 0) { -- height += fontHeight / 2; //no entity literals, so just add a bit of space -- } -- -- height += lines * fontHeight; -- -- //now set the width of the concept -- //set width to name to start with -- // FIXME spaces to get round beastie with font width, -- // investigate UMLWidget::getFontMetrics() -- width = getFontMetrics(FT_BOLD_ITALIC).boundingRect(QLatin1Char(' ') + name() + -- QLatin1Char(' ')).width(); -- const int w = getFontMetrics(FT_BOLD).boundingRect(m_umlObject->stereotype(true)).width(); -- -- width = w > width ? w : width; -- -- UMLClassifier* classifier = (UMLClassifier*)m_umlObject; -- UMLClassifierListItemList list = classifier->getFilteredList(UMLObject::ot_EntityAttribute); -- UMLClassifierListItem* listItem = 0; -- foreach (listItem, list) { -- int w = fm.width(listItem->name()); -- width = w > width?w:width; -- } -- -- //allow for width margin -- width += ENTITY_MARGIN * 2; -- -- return QSizeF(width, height); --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/entitywidget.h umbrello-kf6-15.08.1/umbrello/widgets/entitywidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/entitywidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/entitywidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,49 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ENTITYWIDGET_H --#define ENTITYWIDGET_H -- --#include "umlwidget.h" -- --class UMLScene; -- --#define ENTITY_MARGIN 5 -- --/** -- * Defines a graphical version of the entity. Most of the functionality -- * will come from the @ref UMLWidget class from which class inherits from. -- * -- * @short A graphical version of an entity. -- * @author Jonathan Riddell -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class EntityWidget : public UMLWidget --{ -- Q_OBJECT --public: -- explicit EntityWidget(UMLScene *scene, UMLObject* o); -- virtual ~EntityWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- // UMLWidget::loadFromXMI is used to load this widget. -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- --public Q_SLOTS: -- virtual void slotMenuSelection(QAction* action); -- --protected: -- QSizeF minimumSize() const; -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/enumwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/enumwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/enumwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/enumwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,262 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "enumwidget.h" -- --// app includes --#include "classifier.h" --#include "classifierlistitem.h" --#include "debug_utils.h" --#include "enum.h" --#include "enumliteral.h" --#include "listpopupmenu.h" --#include "object_factory.h" --#include "uml.h" --#include "umlclassifierlistitemlist.h" --#include "umldoc.h" --#include "umlscene.h" --#include "umlview.h" -- --/** -- * Constructs an instance of EnumWidget. -- * -- * @param scene The parent of this EnumWidget. -- * @param o The UMLObject this will be representing. -- */ --EnumWidget::EnumWidget(UMLScene *scene, UMLObject* o) -- : UMLWidget(scene, WidgetBase::wt_Enum, o), -- m_showPackage(false) --{ -- setSize(100, 30); -- //set defaults from m_scene -- if (m_scene) { -- //check to see if correct -- const Settings::OptionState& ops = m_scene->optionState(); -- m_showPackage = ops.classState.showPackage; -- } else { -- // For completeness only. Not supposed to happen. -- m_showPackage = false; -- } --} -- --/** -- * Destructor. -- */ --EnumWidget::~EnumWidget() --{ --} -- --/** -- * Returns the status of whether to show Package. -- * -- * @return True if package is shown. -- */ --bool EnumWidget::showPackage() const --{ -- return m_showPackage; --} -- --/** -- * Set the status of whether to show Package. -- * -- * @param _status True if package shall be shown. -- */ --void EnumWidget::setShowPackage(bool _status) --{ -- m_showPackage = _status; -- updateGeometry(); -- update(); --} -- --/** -- * Toggles the status of whether to show package. -- */ --void EnumWidget::toggleShowPackage() --{ -- m_showPackage = !m_showPackage; -- updateGeometry(); -- update(); --} -- --/** -- * Draws the enum as a rectangle with a box underneith with a list of literals -- * Reimplemented from UMLWidget::paint -- */ --void EnumWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- setPenFromSettings(painter); -- if(UMLWidget::useFillColor()) -- painter->setBrush(UMLWidget::fillColor()); -- else -- painter->setBrush(m_scene->backgroundColor()); -- -- const int w = width(); -- const int h = height(); -- -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- QString name; -- if (m_showPackage) { -- name = m_umlObject->fullyQualifiedName(); -- } else { -- name = this->name(); -- } -- -- painter->drawRect(0, 0, w, h); -- painter->setPen(textColor()); -- -- QFont font = UMLWidget::font(); -- font.setBold(true); -- painter->setFont(font); -- painter->drawText(ENUM_MARGIN, 0, -- w - ENUM_MARGIN * 2, fontHeight, -- Qt::AlignCenter, m_umlObject->stereotype(true)); -- -- font.setItalic(m_umlObject->isAbstract()); -- painter->setFont(font); -- painter->drawText(ENUM_MARGIN, fontHeight, -- w - ENUM_MARGIN * 2, fontHeight, Qt::AlignCenter, name); -- font.setBold(false); -- font.setItalic(false); -- painter->setFont(font); -- -- int y = fontHeight * 2; -- -- setPenFromSettings(painter); -- -- painter->drawLine(0, y, w, y); -- -- QFontMetrics fontMetrics(font); -- UMLClassifier *classifier = (UMLClassifier*)m_umlObject; -- UMLClassifierListItem* enumLiteral = 0; -- UMLClassifierListItemList list = classifier->getFilteredList(UMLObject::ot_EnumLiteral); -- foreach (enumLiteral, list) { -- QString text = enumLiteral->name(); -- painter->setPen(textColor()); -- painter->drawText(ENUM_MARGIN, y, -- fontMetrics.width(text), fontHeight, Qt::AlignVCenter, text); -- y+=fontHeight; -- } -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Loads from an "enumwidget" XMI element. -- */ --bool EnumWidget::loadFromXMI(QDomElement & qElement) --{ -- if (!UMLWidget::loadFromXMI(qElement)) { -- return false; -- } -- QString showpackage = qElement.attribute(QLatin1String("showpackage"), QLatin1String("0")); -- -- m_showPackage = (bool)showpackage.toInt(); -- -- return true; --} -- --/** -- * Saves to the "enumwidget" XMI element. -- */ --void EnumWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement conceptElement = qDoc.createElement(QLatin1String("enumwidget")); -- UMLWidget::saveToXMI(qDoc, conceptElement); -- -- conceptElement.setAttribute(QLatin1String("showpackage"), m_showPackage); -- qElement.appendChild(conceptElement); --} -- --/** -- * Will be called when a menu selection has been made from the -- * popup menu. -- * -- * @param action The action that has been selected. -- */ --void EnumWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- if (sel == ListPopupMenu::mt_EnumLiteral) { -- if (Object_Factory::createChildObject(static_cast(m_umlObject), -- UMLObject::ot_EnumLiteral)) { -- /* I don't know why it works without these calls: -- updateComponentSize(); -- update(); -- */ -- UMLApp::app()->document()->setModified(); -- } -- return; -- } -- UMLWidget::slotMenuSelection(action); --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF EnumWidget::minimumSize() const --{ -- if (!m_umlObject) { -- return UMLWidget::minimumSize(); -- } -- -- int width, height; -- QFont font = UMLWidget::font(); -- font.setItalic(false); -- font.setUnderline(false); -- font.setBold(false); -- const QFontMetrics fm(font); -- -- const int fontHeight = fm.lineSpacing(); -- -- int lines = 1;//always have one line - for name -- lines++; //for the stereotype -- -- const int numberOfEnumLiterals = ((UMLEnum*)m_umlObject)->enumLiterals(); -- -- height = width = 0; -- //set the height of the enum -- -- lines += numberOfEnumLiterals; -- if (numberOfEnumLiterals == 0) { -- height += fontHeight / 2; //no enum literals, so just add a bit of space -- } -- -- height += lines * fontHeight; -- -- //now set the width of the concept -- //set width to name to start with -- if (m_showPackage) { -- width = getFontMetrics(FT_BOLD_ITALIC).boundingRect(m_umlObject->fullyQualifiedName()).width(); -- } else { -- width = getFontMetrics(FT_BOLD_ITALIC).boundingRect(name()).width(); -- } -- int w = getFontMetrics(FT_BOLD).boundingRect(m_umlObject->stereotype(true)).width(); -- -- -- width = w > width?w:width; -- -- UMLClassifier *classifier = (UMLClassifier*)m_umlObject; -- UMLClassifierListItemList list = classifier->getFilteredList(UMLObject::ot_EnumLiteral); -- UMLClassifierListItem* listItem = 0; -- foreach (listItem, list) { -- int w = fm.width(listItem->name()); -- width = w > width?w:width; -- } -- -- //allow for width margin -- width += ENUM_MARGIN * 2; -- -- return QSizeF(width, height); --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/enumwidget.h umbrello-kf6-15.08.1/umbrello/widgets/enumwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/enumwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/enumwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,52 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef ENUMWIDGET_H --#define ENUMWIDGET_H -- --#include "umlwidget.h" -- --#define ENUM_MARGIN 5 -- --/** -- * Defines a graphical version of the enum. Most of the functionality -- * will come from the @ref UMLWidget class from which class inherits from. -- * -- * @short A graphical version of an enum. -- * @author Jonathan Riddell -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class EnumWidget : public UMLWidget --{ -- Q_OBJECT --public: -- explicit EnumWidget(UMLScene *scene, UMLObject* o); -- virtual ~EnumWidget(); -- -- bool showPackage() const; -- void setShowPackage(bool _status); -- void toggleShowPackage(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- virtual bool loadFromXMI(QDomElement& qElement); -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- --public Q_SLOTS: -- virtual void slotMenuSelection(QAction* action); -- --protected: -- QSizeF minimumSize() const; -- -- bool m_showPackage; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/floatingdashlinewidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/floatingdashlinewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/floatingdashlinewidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/floatingdashlinewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,199 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ --// own header --#include "floatingdashlinewidget.h" --#include "combinedfragmentwidget.h" -- --//kde includes --#if QT_VERSION < 0x050000 --#include --#endif --#include -- --//app includes --#include "debug_utils.h" --#include "umlview.h" --#include "widget_utils.h" --#include "listpopupmenu.h" -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#endif --#include -- --DEBUG_REGISTER_DISABLED(FloatingDashLineWidget) -- --/** -- * Creates a floating dash line. -- * @param scene The parent of the widget -- * @param id The ID to assign (-1 will prompt a new ID) -- * @param parent The CombinedFragmentWidget which acts as the parent -- */ --FloatingDashLineWidget::FloatingDashLineWidget(UMLScene * scene, Uml::ID::Type id, CombinedFragmentWidget *parent) -- : UMLWidget(scene, WidgetBase::wt_FloatingDashLine, id), -- m_yMin(0), -- m_yMax(0), -- m_parent(parent) --{ -- m_resizable = false; -- m_Text = QString(); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- setSize(10, fontHeight); --} -- --/** -- * Destructor. -- */ --FloatingDashLineWidget::~FloatingDashLineWidget() --{ -- if (m_parent) -- m_parent->removeDashLine(this); --} -- --/** -- * Overrides the standard paint event. -- */ --void FloatingDashLineWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- painter->setPen(textColor()); -- painter->setFont(UMLWidget::font()); -- painter->drawText(FLOATING_DASH_LINE_TEXT_MARGIN, 0, -- width() - FLOATING_DASH_LINE_TEXT_MARGIN * 2, fontHeight, -- Qt::AlignLeft, QLatin1Char('[') + m_Text + QLatin1Char(']')); -- painter->setPen(QPen(UMLWidget::lineColor(), 0, Qt::DashLine)); -- painter->drawLine(0, 0, width(), 0); -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Sets m_text. -- */ --void FloatingDashLineWidget::setText(const QString& text) --{ -- m_Text = text; --} -- --/** -- * Returns true if the given point is near the floatingdashline. -- */ --bool FloatingDashLineWidget::onLine(const QPointF& point) --{ -- // check if the given point is the start or end point of the line -- if (((abs((long)(y() + height() - point.y()))) <= POINT_DELTA) || (abs((long)(y() - point.y())) <= POINT_DELTA)) { -- return true; -- } -- // check if the given point is the start or end point of the line -- return false; --} -- --void FloatingDashLineWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch(sel) { -- case ListPopupMenu::mt_Rename: -- { -- bool ok = false; -- QString name = m_Text; --#if QT_VERSION >= 0x050000 -- name = QInputDialog::getText(Q_NULLPTR, -- i18n("Enter alternative Name"), i18n("Enter the alternative:"), -- QLineEdit::Normal, -- m_Text, &ok); --#else -- name = KInputDialog::getText(i18n("Enter alternative Name"), i18n("Enter the alternative:"), m_Text, &ok); --#endif -- if (ok && name.length() > 0) -- m_Text = name; -- } -- break; -- default: -- UMLWidget::slotMenuSelection(action); -- } --} -- --/** -- * Overrides the setY method. -- */ --void FloatingDashLineWidget::setY(qreal y) --{ -- if(y >= m_yMin + FLOATING_DASH_LINE_MARGIN && y <= m_yMax - FLOATING_DASH_LINE_MARGIN) -- UMLWidget::setY(y); --} -- --/** -- * Sets m_yMin. -- */ --void FloatingDashLineWidget::setYMin(qreal yMin) --{ -- m_yMin = yMin; --} -- --/** -- * Sets m_yMax. -- */ --void FloatingDashLineWidget::setYMax(qreal yMax) --{ -- m_yMax = yMax; --} -- --/** -- * Returns m_yMin. -- */ --qreal FloatingDashLineWidget::getYMin() const --{ -- return m_yMin; --} -- --/** -- * Returns the difference between the y-coordinate of the dash line and m_yMin. -- */ --qreal FloatingDashLineWidget::getDiffY() const --{ -- return (y() - getYMin()); --} -- --/** -- * Creates the "floatingdashline" XMI element. -- */ --void FloatingDashLineWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement textElement = qDoc.createElement(QLatin1String("floatingdashlinewidget")); -- UMLWidget::saveToXMI(qDoc, textElement); -- textElement.setAttribute(QLatin1String("text"), m_Text); -- textElement.setAttribute(QLatin1String("y"), y()); -- textElement.setAttribute(QLatin1String("minY"), m_yMin); -- textElement.setAttribute(QLatin1String("maxY"), m_yMax); -- -- qElement.appendChild(textElement); --} -- --/** -- * Loads the "floatingdashline" XMI element. -- */ --bool FloatingDashLineWidget::loadFromXMI(QDomElement & qElement) --{ -- if(!UMLWidget::loadFromXMI(qElement)) { -- return false; -- } -- DEBUG(DBG_SRC) << "load......."; -- m_yMax = qElement.attribute(QLatin1String("maxY")).toFloat(); -- m_yMin = qElement.attribute(QLatin1String("minY")).toFloat(); -- m_Text = qElement.attribute(QLatin1String("text")); -- return true; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/floatingdashlinewidget.h umbrello-kf6-15.08.1/umbrello/widgets/floatingdashlinewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/floatingdashlinewidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/floatingdashlinewidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,77 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef FLOATINGDASHLINEWIDGET_H --#define FLOATINGDASHLINEWIDGET_H -- --#include "umlwidget.h" --class CombinedFragmentWidget; -- --#define FLOATING_DASH_LINE_MARGIN 25 --#define FLOATING_DASH_LINE_TEXT_MARGIN 5 -- --/* how many pixels a user could click around a point */ --#define POINT_DELTA 5 -- --/** -- * This class is used to draw dash lines for UML combined fragments. A FloatingDashLineWidget -- * belongs to one @ref CombinedFragmentWidget instance. -- * -- * The FloatingDashLineWidget class inherits from the @ref UMLWidget class. -- * -- * @short A dash line for UML combined fragments. -- * @author Thomas GALLINARI -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class FloatingDashLineWidget : public UMLWidget --{ -- Q_OBJECT --public: -- explicit FloatingDashLineWidget(UMLScene * scene, Uml::ID::Type id = Uml::ID::None, CombinedFragmentWidget *parent = 0); -- ~FloatingDashLineWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option = 0, QWidget *widget = 0); -- -- void slotMenuSelection(QAction* action); -- -- bool onLine(const QPointF& point); -- -- void setText(const QString& text); -- -- void setY(qreal y); -- void setYMin(qreal yMin); -- void setYMax(qreal yMax); -- qreal getYMin() const; -- qreal getDiffY() const; -- -- void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- bool loadFromXMI(QDomElement & qElement); -- --private: -- /** -- * Text associated to the dash line -- */ -- QString m_text; -- -- /** -- * Minimum value of the Y-coordinate of the dash line -- * (= y-coordinate of the combined fragment) -- */ -- int m_yMin; -- -- /** -- * Maximum value of the Y-coordinate of the dash line -- * (= y-coordinate of the combined fragment + height of the combined fragment) -- */ -- int m_yMax; -- CombinedFragmentWidget *m_parent; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/floatingtextwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/floatingtextwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/floatingtextwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/floatingtextwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,854 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "floatingtextwidget.h" -- --// local includes --#include "association.h" --#include "associationwidget.h" --#include "associationpropertiesdialog.h" --#include "classifier.h" --#include "cmds.h" --#include "debug_utils.h" --#include "linkwidget.h" --#include "classifierwidget.h" --#include "listpopupmenu.h" --#include "messagewidget.h" --#include "model_utils.h" --#include "object_factory.h" --#include "operation.h" --#include "selectoperationdialog.h" --#include "uml.h" --#include "umldoc.h" --#include "umlview.h" -- --// kde includes --#if QT_VERSION < 0x050000 --#include --#include --#endif --#include -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#include --#endif --#include --#include --#include --#include -- --DEBUG_REGISTER_DISABLED(FloatingTextWidget) -- --/** -- * Constructs a FloatingTextWidget instance. -- * -- * @param scene The parent of this FloatingTextWidget. -- * @param role The role this FloatingTextWidget will take up. -- * @param text The main text to display. -- * @param id The ID to assign (-1 will prompt a new ID.) -- */ --FloatingTextWidget::FloatingTextWidget(UMLScene * scene, Uml::TextRole::Enum role, const QString& text, Uml::ID::Type id) -- : UMLWidget(scene, WidgetBase::wt_Text, id), -- m_linkWidget(0), -- m_preText(QString()), -- m_postText(QString()), -- m_textRole(role), -- m_unconstrainedPositionX(0), -- m_unconstrainedPositionY(0), -- m_movementDirectionX(0), -- m_movementDirectionY(0) --{ -- m_Text = text; -- m_resizable = false; -- setZValue(10); //make sure always on top. --} -- --/** -- * Destructor. -- */ --FloatingTextWidget::~FloatingTextWidget() --{ --} -- --/** -- * Use to get the _main body_ of text (e.g. prepended and appended -- * text is omitted) as currently displayed by the widget. -- * -- * @return The main text currently being displayed by the widget. -- */ --QString FloatingTextWidget::text() const --{ -- // test to make sure not just the ":" between the seq number and -- // the actual message widget -- -- // hmm. this section looks like it could have been avoided by -- // using pre-, post- text instead of storing in the main body of -- // the text -b.t. -- if (m_textRole == Uml::TextRole::Seq_Message || m_textRole == Uml::TextRole::Seq_Message_Self || -- m_textRole == Uml::TextRole::Coll_Message || m_textRole == Uml::TextRole::Coll_Message_Self) { -- if (m_Text.length() <= 1 || m_Text == QLatin1String(": ")) -- return QString(); -- } -- return m_Text; --} -- --/** -- * Set the main body of text to display. -- * -- * @param t The text to display. -- */ --void FloatingTextWidget::setText(const QString &t) --{ -- if (m_textRole == Uml::TextRole::Seq_Message || m_textRole == Uml::TextRole::Seq_Message_Self) { -- QString op; -- if (m_linkWidget) -- op = m_linkWidget->lwOperationText(); -- if (op.length() > 0) { -- if (!m_scene->showOpSig()) -- op.replace(QRegExp(QLatin1String("\\(.*\\)")), QLatin1String("()")); -- m_Text = op; -- } -- else -- m_Text = t; -- } -- else { -- m_Text = t; -- } -- -- QSizeF s = minimumSize(); -- setSize(s.width(), s.height()); -- -- updateGeometry(); -- update(); --} -- --/** -- * Set some text to be prepended to the main body of text. -- * @param t The text to prepend to main body which is displayed. -- */ --void FloatingTextWidget::setPreText(const QString &t) --{ -- m_preText = t; -- updateGeometry(); -- update(); --} -- --/** -- * Set some text to be appended to the main body of text. -- * @param t The text to append to main body which is displayed. -- */ --void FloatingTextWidget::setPostText(const QString &t) --{ -- m_postText = t; -- updateGeometry(); -- update(); --} -- --/** -- * Use to get the total text (prepended + main body + appended) -- * currently displayed by the widget. -- * -- * @return The text currently being displayed by the widget. -- */ --QString FloatingTextWidget::displayText() const --{ -- QString displayText; -- if (!m_SequenceNumber.isEmpty()) -- displayText = m_SequenceNumber + QLatin1String(": ") + m_Text; -- else -- displayText = m_Text; -- displayText.prepend(m_preText); -- displayText.append(m_postText); -- return displayText; --} -- --/** -- * Return state if no pre, post and main text is empty -- * @return true if widget contains no text -- */ --bool FloatingTextWidget::isEmpty() --{ -- return m_Text.isEmpty() && m_preText.isEmpty() && m_postText.isEmpty(); --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF FloatingTextWidget::minimumSize() const --{ -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- int h = fm.lineSpacing(); -- int w = fm.width(displayText()); -- return QSizeF(w + 8, h + 4); // give a small margin --} -- --/** -- * Method used by setText: its called by cmdsetTxt, Don't use it! -- * -- * @param t The text to display. -- */ --void FloatingTextWidget::setTextcmd(const QString &t) --{ -- UMLApp::app()->executeCommand(new Uml::CmdSetTxt(this, t)); --} -- --/** -- * Displays a dialog box to change the text. -- */ --void FloatingTextWidget::showChangeTextDialog() --{ -- bool ok = false; --#if QT_VERSION >= 0x050000 -- QString newText = QInputDialog::getText(m_scene->activeView(), -- i18n("Change Text"), i18n("Enter new text:"), -- QLineEdit::Normal, -- text(), &ok); --#else -- QString newText = KInputDialog::getText(i18n("Change Text"), i18n("Enter new text:"), text(), &ok, m_scene->activeView()); --#endif -- if (ok && newText != text() && isTextValid(newText)) { -- setText(newText); -- setVisible(!text().isEmpty()); -- updateGeometry(); -- update(); -- } -- if (!isTextValid(newText)) -- hide(); --} -- --/** -- * Shows an operation dialog box. -- * -- * @param enableAutoIncrement Enable auto increment checkbox -- */ --void FloatingTextWidget::showOperationDialog(bool enableAutoIncrement) --{ -- if (!m_linkWidget) { -- uError() << "m_linkWidget is NULL"; -- return; -- } -- QString seqNum = m_linkWidget->sequenceNumber(); -- UMLClassifier* c = m_linkWidget->lwClassifier(); -- QString opText = m_linkWidget->lwOperationText(); -- if (!c) { -- uError() << "m_linkWidget->lwClassifier() returns a NULL classifier"; -- return; -- } -- -- QPointer selectDialog = new SelectOperationDialog(m_scene->activeView(), c, enableAutoIncrement); -- if (enableAutoIncrement && m_scene->autoIncrementSequence()) { -- seqNum = m_scene->autoIncrementSequenceValue(); -- selectDialog->setAutoIncrementSequence(true); -- } -- selectDialog->setSeqNumber(seqNum); -- if (m_linkWidget->operation() == 0) { -- selectDialog->setCustomOp(opText); -- } else { -- selectDialog->setClassOp(opText); -- } -- if (selectDialog->exec()) { -- seqNum = selectDialog->getSeqNumber(); -- opText = selectDialog->getOpText(); -- if (selectDialog->isClassOp()) { -- Model_Utils::OpDescriptor od; -- Model_Utils::Parse_Status st = Model_Utils::parseOperation(opText, od, c); -- if (st == Model_Utils::PS_OK) { -- UMLClassifierList selfAndAncestors = c->findSuperClassConcepts(); -- selfAndAncestors.prepend(c); -- UMLOperation *op = 0; -- foreach (UMLClassifier *cl, selfAndAncestors) { -- op = cl->findOperation(od.m_name, od.m_args); -- if (op) { -- break; -- } -- } -- if (!op) { -- // The op does not yet exist. Create a new one. -- UMLObject *o = c->createOperation(od.m_name, 0, &od.m_args); -- op = static_cast(o); -- } -- if (od.m_pReturnType) { -- op->setType(od.m_pReturnType); -- } -- -- m_linkWidget->setOperation(op); -- opText.clear(); -- } else { -- m_linkWidget->setOperation(0); -- } -- } else { -- m_linkWidget->setOperation(0); -- } -- m_linkWidget->setSequenceNumber(seqNum); -- m_linkWidget->setOperationText(opText); -- if (enableAutoIncrement) { -- m_scene->setAutoIncrementSequence(selectDialog->autoIncrementSequence()); -- } -- setMessageText(); -- } -- delete selectDialog; --} -- --/** -- * Show the properties for a FloatingTextWidget. -- * Depending on the role of the floating text wiget, the options dialog -- * for the floating text widget, the rename dialog for floating text or -- * the options dialog for the link widget are shown. -- */ --void FloatingTextWidget::showPropertiesDialog() --{ -- if (m_textRole == Uml::TextRole::Coll_Message || m_textRole == Uml::TextRole::Coll_Message_Self || -- m_textRole == Uml::TextRole::Seq_Message || m_textRole == Uml::TextRole::Seq_Message_Self) { -- showOperationDialog(false); -- } else if (m_textRole == Uml::TextRole::Floating) { -- // double clicking on a text line opens the dialog to change the text -- handleRename(); -- } else if (m_linkWidget) { -- m_linkWidget->showPropertiesDialog(); -- } --} -- --/** -- * Use to get the pre-text which is prepended to the main body of -- * text to be displayed. -- * -- * @return The pre-text currently displayed by the widget. -- */ --QString FloatingTextWidget::preText() const --{ -- return m_preText; --} -- --/** -- * Use to get the post-text which is appended to the main body of -- * text to be displayed. -- * -- * @return The post-text currently displayed by the widget. -- */ --QString FloatingTextWidget::postText() const --{ -- return m_postText; --} -- --/** -- * Activate the FloatingTextWidget after the saved data has been loaded -- * -- * @param ChangeLog Pointer to the IDChangeLog. -- * @return true for success -- */ --bool FloatingTextWidget::activate(IDChangeLog* ChangeLog /*= 0 */) --{ -- if (! UMLWidget::activate(ChangeLog)) -- return false; -- update(); -- return true; --} -- --/** -- * Set the LinkWidget that this FloatingTextWidget is related to. -- * -- * @param l The related LinkWidget. -- */ --void FloatingTextWidget::setLink(LinkWidget * l) --{ -- m_linkWidget = l; --} -- --/** -- * Returns the LinkWidget this floating text is related to. -- * -- * @return The LinkWidget this floating text is related to. -- */ --LinkWidget * FloatingTextWidget::link() const --{ -- return m_linkWidget; --} -- --/** -- * Sets the role type of this FloatingTextWidget. -- * -- * @param role The TextRole::Enum of this FloatingTextWidget. -- */ --void FloatingTextWidget::setTextRole(Uml::TextRole::Enum role) --{ -- m_textRole = role; --} -- --/** -- * Return the role of the text widget -- * @return The TextRole::Enum of this FloatingTextWidget. -- */ --Uml::TextRole::Enum FloatingTextWidget::textRole() const --{ -- return m_textRole; --} -- --/** -- * Handle the ListPopupMenu::mt_Rename case of the slotMenuSelection. -- * Given an own method because it requires rather lengthy code. -- */ --void FloatingTextWidget::handleRename() --{ -- QRegExpValidator v(QRegExp(QLatin1String(".*")), 0); -- QString t; -- if (m_textRole == Uml::TextRole::RoleAName || m_textRole == Uml::TextRole::RoleBName) { -- t = i18n("Enter role name:"); -- } else if (m_textRole == Uml::TextRole::MultiA || m_textRole == Uml::TextRole::MultiB) { -- t = i18n("Enter multiplicity:"); -- /* -- // NO! shouldn't be allowed -- } else if (m_textRole == Uml::TextRole::ChangeA || m_textRole == Uml::TextRole::ChangeB) { -- t = i18n("Enter changeability"); -- */ -- } else if (m_textRole == Uml::TextRole::Name) { -- t = i18n("Enter association name:"); -- } else if (m_textRole == Uml::TextRole::Floating) { -- t = i18n("Enter new text:"); -- } else { -- t = i18n("ERROR"); -- } -- bool ok = false; --#if QT_VERSION >= 0x050000 -- QString newText = QInputDialog::getText(m_scene->activeView(), -- i18n("Rename"), t, -- QLineEdit::Normal, -- text(), &ok); --#else -- QString newText = KInputDialog::getText(i18n("Rename"), t, text(), &ok, m_scene->activeView(), &v); --#endif -- if (!ok || newText == text()) { -- return; -- } -- -- UMLApp::app()->executeCommand(new Uml::CmdHandleRename(this, newText)); --} -- --/** -- * Changes the text of linked widget. -- * @param newText the new text -- */ --void FloatingTextWidget::changeName(const QString& newText) --{ -- if (m_linkWidget && !isTextValid(newText)) { -- AssociationWidget *assoc = dynamic_cast(m_linkWidget); -- if (assoc) { -- switch (m_textRole) { -- case Uml::TextRole::MultiA: -- assoc->setMultiplicity(QString(), Uml::RoleType::A); -- break; -- case Uml::TextRole::MultiB: -- assoc->setMultiplicity(QString(), Uml::RoleType::B); -- break; -- case Uml::TextRole::RoleAName: -- assoc->setRoleName(QString(), Uml::RoleType::A); -- break; -- case Uml::TextRole::RoleBName: -- assoc->setRoleName(QString(), Uml::RoleType::B); -- break; -- case Uml::TextRole::ChangeA: -- assoc->setChangeability(Uml::Changeability::Changeable, Uml::RoleType::A); -- break; -- case Uml::TextRole::ChangeB: -- assoc->setChangeability(Uml::Changeability::Changeable, Uml::RoleType::B); -- break; -- default: -- assoc->setName(QString()); -- break; -- } -- } -- else { -- MessageWidget *msg = dynamic_cast(m_linkWidget); -- if (msg) { -- msg->setName(QString()); -- m_scene->removeWidget(this); -- } -- } -- return; -- } -- -- if (m_linkWidget && m_textRole != Uml::TextRole::Seq_Message -- && m_textRole != Uml::TextRole::Seq_Message_Self) { -- m_linkWidget->setText(this, newText); -- } -- else { -- setText(newText); -- UMLApp::app()->document()->setModified(true); -- } -- -- setVisible(true); -- updateGeometry(); -- update(); --} -- --/** -- * Write property of QString m_SequenceNumber. -- */ --void FloatingTextWidget::setSequenceNumber(const QString &sequenceNumber) --{ -- m_SequenceNumber = sequenceNumber; --} -- --/** -- * Read property of QString m_SequenceNumber. -- */ --QString FloatingTextWidget::sequenceNumber() const --{ -- return m_SequenceNumber; --} -- --/** -- * For a text to be valid it must be non-empty, i.e. have a length -- * larger than zero, and have at least one non whitespace character. -- * -- * @param text The string to analyze. -- * @return True if the given text is valid. -- */ --bool FloatingTextWidget::isTextValid(const QString &text) --{ -- int length = text.length(); -- if(length < 1) -- return false; -- for(int i=0;iconstrainTextPos(newX, newY, width(), height(), textRole()); -- } -- -- return QPointF(newX, newY); --} -- --/** -- * Overridden from UMLWidget. -- * Moves the widget to a new position using the difference between the -- * current position and the new position. -- * If the floating text widget is part of a sequence message, and the -- * message widget is selected, it does nothing: the message widget will -- * update the text position when it's moved. -- * In any other case, the floating text widget constrains its move using -- * constrainPosition. When the position of the floating text is constrained, -- * it's kept at that position until it can be moved to another valid -- * position (m_unconstrainedPositionX/Y and m_movementDirectionX/Y are -- * used for that). -- * Moreover, if is part of a sequence message (and the message widget -- * isn't selected), it updates the position of the message widget. -- * @see constrainPosition -- * -- * @param diffX The difference between current X position and new X position. -- * @param diffY The difference between current Y position and new Y position. -- */ --void FloatingTextWidget::moveWidgetBy(qreal diffX, qreal diffY) --{ -- if (textRole() == Uml::TextRole::Seq_Message_Self) -- return; -- -- if (textRole() == Uml::TextRole::Seq_Message -- && ((MessageWidget*)link())->isSelected()) { -- return; -- } -- -- m_unconstrainedPositionX += diffX; -- m_unconstrainedPositionY += diffY; -- QPointF constrainedPosition = constrainPosition(diffX, diffY); -- -- qreal newX = constrainedPosition.x(); -- qreal newY = constrainedPosition.y(); -- -- if (!m_movementDirectionX) { -- if (m_unconstrainedPositionX != constrainedPosition.x()) { -- m_movementDirectionX = (diffX > 0)? 1: -1; -- } -- } else if ((m_movementDirectionX < 0 && m_unconstrainedPositionX > x()) || -- (m_movementDirectionX > 0 && m_unconstrainedPositionX < x()) ) { -- newX = m_unconstrainedPositionX; -- m_movementDirectionX = 0; -- } -- -- if (!m_movementDirectionY) { -- if (m_unconstrainedPositionY != constrainedPosition.y()) { -- m_movementDirectionY = (diffY > 0)? 1: -1; -- } -- } else if ((m_movementDirectionY < 0 && m_unconstrainedPositionY > y()) || -- (m_movementDirectionY > 0 && m_unconstrainedPositionY < y()) ) { -- newY = m_unconstrainedPositionY; -- m_movementDirectionY = 0; -- } -- -- setX(newX); -- setY(newY); -- -- if (link()) { -- link()->calculateNameTextSegment(); -- if (textRole() == Uml::TextRole::Seq_Message) { -- MessageWidget* messageWidget = (MessageWidget*)link(); -- messageWidget->setY(newY + height()); -- } -- } --} -- --/** -- * Overridden from UMLWidget. -- * Modifies the value of the diffX and diffY variables used to move the -- * widgets. -- * The values are constrained using constrainPosition. -- * @see constrainPosition -- * -- * @param diffX The difference between current X position and new X position. -- * @param diffY The difference between current Y position and new Y position. -- */ --void FloatingTextWidget::constrainMovementForAllWidgets(qreal &diffX, qreal &diffY) --{ -- QPointF constrainedPosition = constrainPosition(diffX, diffY); -- -- diffX = constrainedPosition.x() - x(); -- diffY = constrainedPosition.y() - y(); --} -- --/** -- * Override method from UMLWidget in order to additionally check widget parentage. -- * -- * @param p Point to be checked. -- * -- * @return 'this' if UMLWidget::onWidget(p) returns non NULL; -- * else NULL. -- */ --UMLWidget* FloatingTextWidget::onWidget(const QPointF &p) --{ -- WidgetBase *pw = dynamic_cast(parentItem()); -- if (pw == NULL) { -- return WidgetBase::onWidget(p); -- } -- const WidgetBase::WidgetType t = pw->baseType(); -- bool isWidgetChild = false; -- if (t == WidgetBase::wt_Interface) { -- ClassifierWidget *cw = static_cast(pw); -- isWidgetChild = cw->getDrawAsCircle(); -- } else if (t == wt_Association || -- t == WidgetBase::wt_Port || t == WidgetBase::wt_Pin) { -- isWidgetChild = true; -- } -- if (!isWidgetChild) { -- return WidgetBase::onWidget(p); -- } -- const qreal w = width(); -- const qreal h = height(); -- const qreal left = pw->x() + x(); -- const qreal right = left + w; -- const qreal top = pw->y() + y(); -- const qreal bottom = top + h; -- // uDebug() << "child_of_pw; p=(" << p.x() << "," << p.y() << "), " -- // << "x=" << left << ", y=" << top << ", w=" << w << ", h=" << h -- // << "; right=" << right << ", bottom=" << bottom; -- if (p.x() >= left && p.x() <= right && -- p.y() >= top && p.y() <= bottom) { // Qt coord.sys. origin in top left corner -- // uDebug() << "floatingtext: " << m_Text; -- return this; -- } -- return NULL; --} -- --/** -- * Overrides default method -- */ --void FloatingTextWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- int w = width(); -- int h = height(); -- painter->setFont(UMLWidget::font()); -- painter->setPen(textColor()); -- painter->drawText(0, 0, w, h, Qt::AlignCenter, displayText()); -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Loads the "floatingtext" XMI element. -- */ --bool FloatingTextWidget::loadFromXMI(QDomElement & qElement) --{ -- if(!UMLWidget::loadFromXMI(qElement)) -- return false; -- -- m_unconstrainedPositionX = x(); -- m_unconstrainedPositionY = y(); -- QString role = qElement.attribute(QLatin1String("role")); -- if(!role.isEmpty()) -- m_textRole = Uml::TextRole::fromInt(role.toInt()); -- -- m_preText = qElement.attribute(QLatin1String("pretext")); -- m_postText = qElement.attribute(QLatin1String("posttext")); -- setText(qElement.attribute(QLatin1String("text"))); // use setText for geometry update -- // If all texts are empty then this is a useless widget. -- // In that case we return false. -- // CAVEAT: The caller should not interpret the false return value -- // as an indication of failure since previous umbrello-kf6 versions -- // saved lots of these empty FloatingTexts. -- bool usefulWidget = !isEmpty(); -- return usefulWidget; --} -- --/** -- * Reimplemented from UMLWidget::saveToXMI to save the widget -- * data into XMI 'floatingtext' element. -- */ --void FloatingTextWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- if (isEmpty()) -- return; -- -- QDomElement textElement = qDoc.createElement(QLatin1String("floatingtext")); -- UMLWidget::saveToXMI(qDoc, textElement); -- textElement.setAttribute(QLatin1String("text"), m_Text); -- textElement.setAttribute(QLatin1String("pretext"), m_preText); -- textElement.setAttribute(QLatin1String("posttext"), m_postText); -- -- /* No need to save these - the messagewidget already did it. -- m_Operation = qElement.attribute("operation"); -- m_SeqNum = qElement.attribute("seqnum"); -- */ -- -- textElement.setAttribute(QLatin1String("role"), m_textRole); -- qElement.appendChild(textElement); --} -- --/** -- * Called when a menu selection has been made. -- * -- * @param action The action that has been selected. -- */ --void FloatingTextWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch(sel) { -- case ListPopupMenu::mt_Properties: -- showPropertiesDialog(); -- break; -- -- case ListPopupMenu::mt_Delete: -- hide(); // This is only a workaround; if set then m_linkWidget should -- // really delete this FloatingTextWidget. -- update(); -- m_scene->removeWidget(this); -- break; -- -- case ListPopupMenu::mt_New_Operation: // needed by AssociationWidget -- case ListPopupMenu::mt_Operation: -- { -- if (m_linkWidget == 0) { -- DEBUG(DBG_SRC) << "mt_Operation: m_linkWidget is NULL"; -- return; -- } -- UMLClassifier* c = m_linkWidget->operationOwner(); -- if (c == 0) { -- bool ok = false; --#if QT_VERSION >= 0x050000 -- QString opText = QInputDialog::getText(m_scene->activeView(), -- i18nc("operation name", "Name"), -- i18n("Enter operation name:"), -- QLineEdit::Normal, -- text(), &ok); --#else -- QString opText = KInputDialog::getText(i18nc("operation name", "Name"), -- i18n("Enter operation name:"), -- text(), &ok, m_scene->activeView()); --#endif -- if (ok) -- m_linkWidget->setCustomOpText(opText); -- return; -- } -- UMLClassifierListItem* umlObj = Object_Factory::createChildObject(c, UMLObject::ot_Operation); -- if (umlObj) { -- UMLOperation* newOperation = static_cast(umlObj); -- m_linkWidget->setOperation(newOperation); -- } -- } -- break; -- -- case ListPopupMenu::mt_Select_Operation: -- showOperationDialog(false); -- break; -- -- case ListPopupMenu::mt_Rename: -- handleRename(); -- break; -- -- case ListPopupMenu::mt_Change_Font: -- { --#if QT_VERSION >= 0x050000 -- bool ok = false; -- QFont fnt = QFontDialog::getFont(&ok, font(), m_scene->activeView()); -- if (ok) { --#else -- QFont fnt = font(); -- if(KFontDialog::getFont(fnt, KFontChooser::NoDisplayFlags, m_scene->activeView())) { --#endif -- if(m_textRole == Uml::TextRole::Floating || m_textRole == Uml::TextRole::Seq_Message) { -- setFont(fnt); -- } else if (m_linkWidget) { -- m_linkWidget->lwSetFont(fnt); -- } -- } -- } -- break; -- -- case ListPopupMenu::mt_Reset_Label_Positions: -- if (m_linkWidget) -- m_linkWidget->resetTextPositions(); -- break; -- -- default: -- UMLWidget::slotMenuSelection(action); -- break; -- }//end switch --} -- --/** -- * Sets the text for this label if it is acting as a sequence diagram -- * message or a collaboration diagram message. -- */ --void FloatingTextWidget::setMessageText() --{ -- if (m_linkWidget) { -- m_linkWidget->setMessageText(this); -- QSizeF s = minimumSize(); -- setSize(s.width(), s.height()); -- -- } -- setVisible(!text().isEmpty()); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/floatingtextwidget.h umbrello-kf6-15.08.1/umbrello/widgets/floatingtextwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/floatingtextwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/floatingtextwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,131 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef FLOATINGTEXTWIDGET_H --#define FLOATINGTEXTWIDGET_H -- --#include "basictypes.h" --#include "umlwidget.h" -- --class LinkWidget; --class UMLScene; -- --/** -- * @short Displays a line of text or an operation. -- * -- * This is a multipurpose-kf6 class. In its simplest form it will display a -- * line of text. -- * It can also be setup to be the text for an operation with regard to the -- * @ref MessageWidget on the sequence diagram. -- * It is also used for the text required for an association. -- * -- * The differences between all these different uses will be the popup menu -- * that is associated with it. -- * -- * @author Paul Hensgen -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class FloatingTextWidget : public UMLWidget --{ -- Q_OBJECT --public: -- explicit FloatingTextWidget(UMLScene * scene, Uml::TextRole::Enum role = Uml::TextRole::Floating, -- const QString& text = QString(), Uml::ID::Type id = Uml::ID::None); -- virtual ~FloatingTextWidget(); -- -- QString text() const; -- void setText(const QString &t); -- -- void setTextcmd(const QString &t); -- -- QString preText() const; -- void setPreText(const QString &t); -- -- QString postText() const; -- void setPostText(const QString &t); -- -- QString displayText() const; -- -- bool isEmpty(); -- -- void showChangeTextDialog(); -- void showOperationDialog(bool enableAutoIncrement = true); -- virtual void showPropertiesDialog(); -- -- LinkWidget* link() const; -- void setLink(LinkWidget * l); -- -- bool activate(IDChangeLog* ChangeLog = 0); -- -- Uml::TextRole::Enum textRole() const; -- void setTextRole(Uml::TextRole::Enum role); -- -- void handleRename(); -- void changeName(const QString& newText); -- -- void setSequenceNumber(const QString &sequenceNumber); -- QString sequenceNumber() const; -- -- static bool isTextValid(const QString &text); -- -- UMLWidget* onWidget(const QPointF& p); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- virtual bool loadFromXMI(QDomElement& qElement); -- --public Q_SLOTS: -- virtual void slotMenuSelection(QAction* action); -- void setMessageText(); -- --protected: -- QSizeF minimumSize() const; -- -- virtual void moveWidgetBy(qreal diffX, qreal diffY); -- virtual void constrainMovementForAllWidgets(qreal &diffX, qreal &diffY); -- --private: -- QPointF constrainPosition(qreal diffX, qreal diffY); -- -- /// The association or message widget we may be linked to. -- LinkWidget * m_linkWidget; -- -- //////////////////// Data loaded/saved: -- -- /// Prepended text (such as for scope of association Role or method) -- QString m_preText; -- /// Ending text (such as bracket on changability notation for association Role) -- QString m_postText; -- /// The role the text widget will enact. -- Uml::TextRole::Enum m_textRole; -- -- //////// -- -- /// The horizontal position the widget would have if its move wasn't constrained. -- qreal m_unconstrainedPositionX; -- -- /// The vertical position the widget would have if its move wasn't constrained. -- qreal m_unconstrainedPositionY; -- -- /// The X direction the widget was moved when the constrain was applied. -- /// -1 means left, 1 means right. -- int m_movementDirectionX; -- -- /// The Y direction the widget was moved when the constrain was applied. -- /// -1 means up, 1 means down. -- int m_movementDirectionY; -- -- /// Contains sequence number for sequence or collaboration diagram message. -- QString m_SequenceNumber; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/forkjoinwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/forkjoinwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/forkjoinwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/forkjoinwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,205 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2005-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "forkjoinwidget.h" -- --//app includes --#include "debug_utils.h" --#include "umlview.h" --#include "umldoc.h" --#include "listpopupmenu.h" -- --// qt includes --#include -- --/** -- * Constructs a ForkJoinWidget. -- * -- * @param scene The parent to this widget. -- * @param ori Whether to draw the plate horizontally or vertically. -- * @param id The ID to assign (-1 will prompt a new ID.) -- */ --ForkJoinWidget::ForkJoinWidget(UMLScene * scene, Qt::Orientation ori, Uml::ID::Type id) -- : BoxWidget(scene, id, WidgetBase::wt_ForkJoin), -- m_orientation(ori) --{ -- setSize(10, 40); -- m_usesDiagramFillColor = false; -- setFillColorCmd(QColor("black")); --} -- --/** -- * Destructor. -- */ --ForkJoinWidget::~ForkJoinWidget() --{ --} -- --/** -- * Get whether to draw the plate vertically or horizontally. -- */ --Qt::Orientation ForkJoinWidget::orientation() const --{ -- return m_orientation; --} -- --/** -- * Set whether to draw the plate vertically or horizontally. -- */ --void ForkJoinWidget::setOrientation(Qt::Orientation ori) --{ -- m_orientation = ori; -- updateGeometry(); -- UMLWidget::adjustAssocs(x(), y()); --} -- --/** -- * Reimplemented from UMLWidget::paint to draw the plate of -- * fork join. -- */ --void ForkJoinWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- painter->fillRect(0, 0, width(), height(), fillColor()); -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Reimplemented from UMLWidget::loadFromXMI to load widget -- * info from XMI element - 'forkjoin'. -- */ --bool ForkJoinWidget::loadFromXMI(QDomElement& qElement) --{ -- if (!UMLWidget::loadFromXMI(qElement)) { -- return false; -- } -- -- QString drawVerticalStr = qElement.attribute(QLatin1String("drawvertical"), QLatin1String("0")); -- bool drawVertical = (bool)drawVerticalStr.toInt(); -- if (drawVertical) { -- setOrientation(Qt::Vertical); -- } -- else { -- setOrientation(Qt::Horizontal); -- } -- -- return true; --} -- --/** -- * Reimplemented from UMLWidget::saveToXMI to save widget info -- * into XMI element - 'forkjoin'. -- */ --void ForkJoinWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement fjElement = qDoc.createElement(QLatin1String("forkjoin")); -- UMLWidget::saveToXMI(qDoc, fjElement); -- bool drawVertical = true; -- if (m_orientation == Qt::Horizontal) { -- drawVertical = false; -- } -- fjElement.setAttribute(QLatin1String("drawvertical"), drawVertical); -- qElement.appendChild(fjElement); --} -- --/** -- * Show a properties dialog for a Fork/Join Widget. -- */ --void ForkJoinWidget::showPropertiesDialog() --{ -- QColor newColor = QColorDialog::getColor(fillColor()); // krazy:exclude=qclasses -- if (newColor != fillColor()) { -- setFillColor(newColor); -- setUsesDiagramFillColor(false); -- umlDoc()->setModified(true); -- } --} -- --/** -- * Reimplemented form UMLWidget::slotMenuSelection to handle -- * Flip action. -- */ --void ForkJoinWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch (sel) { -- case ListPopupMenu::mt_Fill_Color: -- showPropertiesDialog(); -- break; -- -- case ListPopupMenu::mt_Flip: -- switch (m_orientation) { -- case Qt::Vertical: -- setOrientation(Qt::Horizontal); -- break; -- case Qt::Horizontal: -- default: -- setOrientation(Qt::Vertical); -- break; -- } -- break; -- default: -- break; -- } --} -- --/** -- * Overrides the function from UMLWidget. -- */ --QSizeF ForkJoinWidget::minimumSize() const --{ -- if (m_orientation == Qt::Vertical) { -- return QSizeF(4, 40); -- } else { -- return QSizeF(40, 4); -- } --} -- --/** -- * Reimplement method from UMLWidget to suppress the resize corner. -- * Although the ForkJoinWidget supports resizing, we suppress the -- * resize corner because it is too large for this very slim widget. -- */ --void ForkJoinWidget::paintSelected(QPainter * p, int offsetX, int offsetY) --{ -- Q_UNUSED(p); -- Q_UNUSED(offsetX); -- Q_UNUSED(offsetY); --} -- --/** -- * Reimplement method from UMLWidget. -- */ --void ForkJoinWidget::constrain(qreal& width, qreal& height) --{ -- if (m_orientation == Qt::Vertical) { -- if (width < 4) -- width = 4; -- else if (width > 10) -- width = 10; -- if (height < 40) -- height = 40; -- else if (height > 100) -- height = 100; -- } else { -- if (height < 4) -- height = 4; -- else if (height > 10) -- height = 10; -- if (width < 40) -- width = 40; -- else if (width > 100) -- width = 100; -- } --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/forkjoinwidget.h umbrello-kf6-15.08.1/umbrello/widgets/forkjoinwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/forkjoinwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/forkjoinwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,57 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2005-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef FORKJOINWIDGET_H --#define FORKJOINWIDGET_H -- --//app includes --#include "boxwidget.h" -- --/** -- * @short Displays a fork/join plate in a state diagram. -- * -- * @author Oliver Kellogg -- * -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class ForkJoinWidget : public BoxWidget --{ -- Q_OBJECT -- Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation) --public: -- explicit ForkJoinWidget(UMLScene * scene, Qt::Orientation ori = Qt::Horizontal, Uml::ID::Type id = Uml::ID::None); -- virtual ~ForkJoinWidget(); -- -- Qt::Orientation orientation() const; -- void setOrientation(Qt::Orientation ori); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- virtual bool loadFromXMI(QDomElement & qElement); -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- -- void showPropertiesDialog(); -- --public Q_SLOTS: -- virtual void slotMenuSelection(QAction* action); -- --protected: -- QSizeF minimumSize() const; -- -- virtual void paintSelected(QPainter * p, int offsetX = 0, int offsetY = 0); -- -- void constrain(qreal& width, qreal& height); -- --private: -- Qt::Orientation m_orientation; ///< whether to draw the plate horizontally or vertically --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/layoutgrid.cpp umbrello-kf6-15.08.1/umbrello/widgets/layoutgrid.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/layoutgrid.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/layoutgrid.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,113 +0,0 @@ --/*************************************************************************** -- * Copyright (C) 2011 by Andi Fischer * -- * Copyright (C) 2012 by Ralf Habacker * -- * * -- * This 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 software 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-kf6. See the * -- * GNU General Public License for more details. * -- * * -- * You should have received a copy of the GNU General Public License * -- * along with this package; see the file COPYING. If not, write to * -- * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, * -- * Boston, MA 02110-1301, USA. * -- ***************************************************************************/ -- --#include "layoutgrid.h" -- --#include "debug_utils.h" --#include "umlscene.h" -- --#include --#include -- --#define DBG_LOG() DEBUG(QLatin1String("LayoutGrid")) --DEBUG_REGISTER_DISABLED(LayoutGrid) -- --/** -- * Constructor. -- */ --LayoutGrid::LayoutGrid(UMLScene *scene) -- : m_scene(scene), -- m_gridSpacingX(25), -- m_gridSpacingY(25), -- m_gridDotColor(Qt::gray), -- m_isVisible(false) --{ --} -- --/** -- * Destructor. -- */ --LayoutGrid::~LayoutGrid() --{ --} -- --void LayoutGrid::paint(QPainter *painter, const QRectF &rect) --{ -- if (!isVisible()) -- return; -- -- int gridSizeX = gridSpacingX(); -- int gridSizeY = gridSpacingY(); -- -- qreal left = int(rect.left()) - (int(rect.left()) % gridSizeX); -- qreal top = int(rect.top()) - (int(rect.top()) % gridSizeY); -- -- QVarLengthArray lines; -- -- for (qreal x = left; x < rect.right(); x += gridSizeX) -- lines.append(QLineF(x, rect.top(), x, rect.bottom())); -- for (qreal y = top; y < rect.bottom(); y += gridSizeY) -- lines.append(QLineF(rect.left(), y, rect.right(), y)); -- -- painter->setPen(m_gridDotColor); -- painter->drawLines(lines.data(), lines.size()); --} -- --int LayoutGrid::gridSpacingX() const --{ -- return m_gridSpacingX; --} -- --int LayoutGrid::gridSpacingY() const --{ -- return m_gridSpacingY; --} -- --void LayoutGrid::setGridSpacing(int sizeX, int sizeY) --{ -- DBG_LOG() << "x = " << sizeX << " / y = " << sizeY; -- m_gridSpacingX= sizeX; -- m_gridSpacingY= sizeY; --} -- --const QColor& LayoutGrid::gridDotColor() const --{ -- return m_gridDotColor; --} -- --void LayoutGrid::setGridDotColor(const QColor& color) --{ -- DBG_LOG() << "color = " << color; -- m_gridDotColor = color; --} -- --bool LayoutGrid::isVisible() const --{ -- return m_isVisible; --} -- --void LayoutGrid::setVisible(bool visible) --{ -- if (m_isVisible != visible) { -- DBG_LOG() << "visible = " << visible; -- m_isVisible = visible; -- m_scene->update(); -- } --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/layoutgrid.h umbrello-kf6-15.08.1/umbrello/widgets/layoutgrid.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/layoutgrid.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/layoutgrid.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,76 +0,0 @@ --/*************************************************************************** -- * Copyright (C) 2011 by Andi Fischer * -- * Copyright (C) 2012 by Ralf Habacker * -- * * -- * This 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 software 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-kf6. See the * -- * GNU General Public License for more details. * -- * * -- * You should have received a copy of the GNU General Public License * -- * along with this package; see the file COPYING. If not, write to * -- * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, * -- * Boston, MA 02110-1301, USA. * -- ***************************************************************************/ -- --#ifndef LAYOUTGRID_H --#define LAYOUTGRID_H -- --#include --#include -- --class UMLScene; --class QRectF; -- --/** -- * @author Andi Fischer -- * This class handles the layout grid, which is drawn in the background -- * of the scene. It is used only in UMLScene. -- */ --class LayoutGrid --{ --public: -- explicit LayoutGrid(UMLScene *scene); -- ~LayoutGrid(); -- -- void paint(QPainter *painter, const QRectF &rect); -- -- QRect gridRect() const; -- void setGridRect(const QRect& rect); -- -- int gridSpacingX() const; -- int gridSpacingY() const; -- void setGridSpacing(int sizeX, int sizeY); -- -- const QColor& gridDotColor() const; -- void setGridDotColor(const QColor& color); -- -- const QColor& gridCrossColor() const; -- void setGridCrossColor(const QColor& color); -- -- const QColor& textColor() const; -- void setTextColor(const QColor& color); -- -- QFont textFont() const; -- void setTextFont(const QFont& font); -- -- bool isVisible() const; -- void setVisible(bool visible); -- -- bool isTextVisible() const; -- void setTextVisible(bool visible); -- --private: -- UMLScene *m_scene; -- int m_gridSpacingX; -- int m_gridSpacingY; -- QColor m_gridDotColor; -- bool m_isVisible; --}; -- --#endif // LAYOUTGRID_H -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/linkwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/linkwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/linkwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/linkwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,121 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "linkwidget.h" -- --// app includes --#include "classifier.h" --#include "operation.h" --#include "uml.h" --#include "umlobject.h" --#include "umlview.h" -- --LinkWidget::LinkWidget() --{ --} -- --LinkWidget::~LinkWidget() --{ --} -- --/** -- * Motivated by FloatingTextWidget::slotMenuSelection(mt_Operation) -- */ --UMLClassifier *LinkWidget::operationOwner() --{ -- UMLOperation *op = operation(); -- if (op == NULL) -- return NULL; -- return static_cast(op->parent()); --} -- --/** -- * Return the operation text. -- * When no scene parameter is given, the scene of the current view -- * is taken instead. -- * @param scene the given scene -- * @return the operation text -- */ --QString LinkWidget::operationText(UMLScene *scene) --{ -- UMLOperation *op = operation(); -- if (op == NULL) -- return customOpText(); -- if (scene == NULL) -- scene = UMLApp::app()->currentView()->umlScene(); -- Uml::SignatureType::Enum sigType; -- if (scene && scene->showOpSig()) -- sigType = Uml::SignatureType::SigNoVis; -- else -- sigType = Uml::SignatureType::NoSigNoVis; -- QString opText = op->toString(sigType); -- return opText; --} -- --/** -- * Motivated by FloatingTextWidget::slotMenuSelection(mt_Reset_Label_Positions) -- * Only applies to AssociationWidget. -- */ --void LinkWidget::resetTextPositions() --{ --} -- --/** -- * Motivated by FloatingTextWidget::mouseDoubleClickEvent() -- * Only applies to AssociationWidget. -- */ --void LinkWidget::showPropertiesDialog() --{ --} -- --/** -- * Motivated by FloatingTextWidget::setLink(). -- * Only applies to AssociationWidget. -- */ --void LinkWidget::calculateNameTextSegment() --{ --} -- -- --/** -- * Write property of QString m_SequenceNumber. -- */ --void LinkWidget::setSequenceNumber(const QString &sequenceNumber) --{ -- m_SequenceNumber = sequenceNumber; --} -- --/** -- * Read property of QString m_SequenceNumber. -- */ --QString LinkWidget::sequenceNumber() const --{ -- return m_SequenceNumber; --} -- --/** -- * Load data from XMI. -- */ --bool LinkWidget::loadFromXMI(QDomElement &qElement) --{ -- m_SequenceNumber = qElement.attribute(QLatin1String("seqnum")); -- return true; --} -- --/** -- * Save data to XMI. -- */ --void LinkWidget::saveToXMI(QDomDocument &qDoc, QDomElement &qElement) --{ -- Q_UNUSED(qDoc); -- -- qElement.setAttribute(QLatin1String("seqnum"), m_SequenceNumber); --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/linkwidget.h umbrello-kf6-15.08.1/umbrello/widgets/linkwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/linkwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/linkwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,123 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef LINKWIDGET_H --#define LINKWIDGET_H -- --#include "basictypes.h" --#include "umlscene.h" -- --#include -- --// forward declarations --class UMLClassifier; --class UMLOperation; --class FloatingTextWidget; -- --/** -- * This is an interface realized by AssociationWidget and MessageWidget. -- * The design of this interface was driven by the requirements of -- * class FloatingTextWidget. As the architecture of umbrello-kf6 evolves (for -- * example, if the class FloatingTextWidget is redesigned), it can be -- * cleaned up. -- * -- * @short Interface to FloatingTextWidget for AssociationWidget and MessageWidget. -- * @author Oliver Kellogg -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class LinkWidget --{ --public: -- LinkWidget(); -- virtual ~LinkWidget(); -- -- /** -- * Sets the font the widget is to use. -- * Abstract operation implemented by inheriting classes. -- * Motivated by FloatingTextWidget::slotMenuSelection(mt_Operation) -- * -- * @param font Font to be set. -- */ -- virtual void lwSetFont(QFont font) = 0; -- -- virtual UMLClassifier *operationOwner(); -- -- /** -- * Motivated by FloatingTextWidget::slotMenuSelection(mt_Operation) -- */ -- virtual UMLOperation *operation() = 0; -- -- /** -- * Motivated by FloatingTextWidget::slotMenuSelection(mt_Operation) -- */ -- virtual void setOperation(UMLOperation *op) = 0; -- -- /** -- * Motivated by getOperationText() -- */ -- virtual QString customOpText() = 0; -- -- /** -- * Motivated by FloatingTextWidget::slotMenuSelection(mt_Operation) -- */ -- virtual void setCustomOpText(const QString &opText) = 0; -- -- QString operationText(UMLScene *scene = 0); -- -- virtual void resetTextPositions(); -- -- /** -- * Motivated by FloatingTextWidget::setMessageText() -- */ -- virtual void setMessageText(FloatingTextWidget *ft) = 0; -- -- /** -- * Motivated by FloatingTextWidget::handleRename() -- */ -- virtual void setText(FloatingTextWidget *ft, const QString &newText) = 0; -- -- virtual void showPropertiesDialog(); -- -- /** -- * Motivated by FloatingTextWidget::showOpDialog() -- */ -- virtual QString lwOperationText() = 0; -- -- /** -- * Motivated by FloatingTextWidget::showOpDialog() -- */ -- virtual UMLClassifier *lwClassifier() = 0; -- -- /** -- * Motivated by FloatingTextWidget::showOpDialog() -- */ -- virtual void setOperationText(const QString &op) = 0; -- -- /** -- * Abstract operation implemented by inheriting classes. -- * Motivated by FloatingTextWidget::mouseMoveEvent() -- */ -- virtual void constrainTextPos(qreal &textX, qreal &textY, -- qreal textWidth, qreal textHeight, -- Uml::TextRole::Enum tr) = 0; -- -- virtual void calculateNameTextSegment(); -- -- void setSequenceNumber(const QString &sequenceNumber); -- QString sequenceNumber() const; -- -- virtual bool loadFromXMI(QDomElement &qElement); -- virtual void saveToXMI(QDomDocument &qDoc, QDomElement &qElement); -- --protected: -- QString m_SequenceNumber; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/messagewidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/messagewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/messagewidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/messagewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,1385 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// onw header --#include "messagewidget.h" -- --//app includes --#include "classifier.h" --#include "debug_utils.h" --#include "floatingtextwidget.h" --#include "listpopupmenu.h" --#include "objectwidget.h" --#include "operation.h" --#include "uml.h" --#include "umldoc.h" --#include "umlview.h" --#include "uniqueid.h" --#include "idchangelog.h" -- --//qt includes --#include --#include --#include --#include -- --//kde includes --#include -- --DEBUG_REGISTER_DISABLED(MessageWidget) -- --static const int circleWidth = 10; -- --/** -- * Constructs a MessageWidget. -- * -- * This method is used for creation, synchronous and synchronous message types. -- * -- * @param scene The parent to this class. -- * @param a The role A widget for this message. -- * @param b The role B widget for this message. -- * @param y The vertical position to display this message. -- * @param sequenceMessageType Whether synchronous or asynchronous -- * @param id A unique id used for deleting this object cleanly. -- * The default (-1) will prompt generation of a new ID. -- */ --MessageWidget::MessageWidget(UMLScene * scene, ObjectWidget* a, ObjectWidget* b, -- int y, Uml::SequenceMessage::Enum sequenceMessageType, -- Uml::ID::Type id /* = Uml::id_None */) -- : UMLWidget(scene, WidgetBase::wt_Message, id) --{ -- init(); -- m_pOw[Uml::RoleType::A] = a; -- m_pOw[Uml::RoleType::B] = b; -- m_sequenceMessageType = sequenceMessageType; -- if (m_sequenceMessageType == Uml::SequenceMessage::Creation) { -- y -= m_pOw[Uml::RoleType::B]->height() / 2; -- m_pOw[Uml::RoleType::B]->setY(y); -- } -- updateResizability(); -- calculateWidget(); -- y = y < getMinY() ? getMinY() : y; -- y = y > getMaxY() ? getMaxY() : y; -- setY(y); -- -- this->activate(); --} -- --/** -- * Constructs a MessageWidget. -- * -- * @param scene The parent to this class. -- * @param seqMsgType The Uml::SequenceMessage::Enum of this message widget -- * @param id The ID to assign (-1 will prompt a new ID.) -- */ --MessageWidget::MessageWidget(UMLScene * scene, Uml::SequenceMessage::Enum seqMsgType, -- Uml::ID::Type id) -- : UMLWidget(scene, WidgetBase::wt_Message, id) --{ -- init(); -- m_sequenceMessageType = seqMsgType; --} -- --/** -- * Constructs a Lost or Found MessageWidget. -- * -- * @param scene The parent to this class. -- * @param a The role A widget for this message. -- * @param xclick The horizontal position clicked by the user -- * @param yclick The vertical position clicked by the user -- * @param sequenceMessageType Whether lost or found -- * @param id The ID to assign (-1 will prompt a new ID.) -- */ --MessageWidget::MessageWidget(UMLScene * scene, ObjectWidget* a, int xclick, int yclick, -- Uml::SequenceMessage::Enum sequenceMessageType, -- Uml::ID::Type id /*= Uml::id_None*/) -- : UMLWidget(scene, WidgetBase::wt_Message, id) --{ -- init(); -- m_pOw[Uml::RoleType::A] = a; -- m_pOw[Uml::RoleType::B] = a; -- -- m_sequenceMessageType = sequenceMessageType; -- -- m_xclicked = xclick; -- m_yclicked = yclick; -- -- updateResizability(); -- calculateWidget(); -- yclick = yclick < getMinY() ? getMinY() : yclick; -- yclick = yclick > getMaxY() ? getMaxY() : yclick; -- setY(yclick); -- m_yclicked = yclick; -- -- this->activate(); --} -- --/** -- * Initializes key variables of the class. -- */ --void MessageWidget::init() --{ -- m_xclicked = -1; -- m_yclicked = -1; -- m_ignoreSnapToGrid = true; -- m_ignoreSnapComponentSizeToGrid = true; -- m_pOw[Uml::RoleType::A] = m_pOw[Uml::RoleType::B] = NULL; -- m_pFText = NULL; --} -- --/** -- * Standard destructor. -- */ --MessageWidget::~MessageWidget() --{ --} -- --/** -- * Sets the y-coordinate. -- * Reimplemented from UMLWidget. -- * -- * @param y The y-coordinate to be set. -- */ --void MessageWidget::setY(qreal y) --{ -- if (y < getMinY()) { -- DEBUG(DBG_SRC) << "got out of bounds y position, check the reason" << this->y() << getMinY(); -- return; -- } -- -- UMLWidget::setY(y); -- if (m_sequenceMessageType == Uml::SequenceMessage::Creation) { -- const qreal objWidgetHalfHeight = m_pOw[Uml::RoleType::B]->height() / 2; -- m_pOw[Uml::RoleType::B]->setY(y - objWidgetHalfHeight); -- } -- -- if (m_pFText && !UMLApp::app()->document()->loading()) { -- setTextPosition(); -- emit sigMessageMoved(); -- } --} -- --/** -- * Update the UMLWidget::m_resizable flag according to the -- * charactersitics of this message. -- */ --void MessageWidget::updateResizability() --{ -- if (m_sequenceMessageType == Uml::SequenceMessage::Synchronous) -- UMLWidget::m_resizable = true; -- else -- UMLWidget::m_resizable = false; --} -- --/** -- * Overridden from UMLWidget. -- * Returns the cursor to be shown when resizing the widget. -- * The cursor shown is KCursor::sizeVerCursor(). -- * -- * @return The cursor to be shown when resizing the widget. -- */ --QCursor MessageWidget::resizeCursor() const --{ -- return Qt::SizeVerCursor; --} -- --/** -- * Overridden from UMLWidget. -- * Resizes the height of the message widget and emits the message moved signal. -- * Message widgets can only be resized vertically, so width isn't modified. -- * -- * @param newW The new width for the widget (isn't used). -- * @param newH The new height for the widget. -- */ --void MessageWidget::resizeWidget(qreal newW, qreal newH) --{ -- if (sequenceMessageType() == Uml::SequenceMessage::Creation) -- setSize(width(), newH); -- else { -- qreal x1 = m_pOw[Uml::RoleType::A]->x(); -- qreal x2 = getxclicked(); -- qreal diffX = 0; -- if (x1 < x2) { -- diffX = x2 + (newW - width()); -- } -- else { -- diffX = x2 - (newW - width()); -- } -- if (diffX <= 0 ) -- diffX = 10; -- setxclicked (diffX); -- setSize(newW, newH); -- calculateWidget(); -- -- } -- emit sigMessageMoved(); --} -- --/** -- * Constrains the vertical position of the message widget so it doesn't go -- * upper than the bottom side of the lower object. -- * The height of the floating text widget in the message is taken in account -- * if there is any and isn't empty. -- * -- * @param diffY The difference between current Y position and new Y position. -- * @return The new Y position, constrained. -- */ --qreal MessageWidget::constrainPositionY(qreal diffY) --{ -- qreal newY = y() + diffY; -- -- qreal minY = getMinY(); -- if (m_pFText && !m_pFText->displayText().isEmpty()) { -- minY += m_pFText->height(); -- } -- -- if (newY < minY) { -- newY = minY; -- } -- -- return newY; --} -- --/** -- * Overridden from UMLWidget. -- * Moves the widget to a new position using the difference between the -- * current position and the new position. X position is ignored, and widget -- * is only moved along Y axis. If message goes upper than the object, it's -- * kept at this position until it should be lowered again (the unconstrained -- * Y position is saved to know when it's the time to lower it again). -- * If the message is a creation message, the object created is also moved to -- * the new vertical position. -- * @see constrainPositionY -- * -- * @param diffX The difference between current X position and new X position -- * (isn't used). -- * @param diffY The difference between current Y position and new Y position. -- */ --void MessageWidget::moveWidgetBy(qreal diffX, qreal diffY) --{ -- Q_UNUSED(diffX); -- qreal newY = constrainPositionY(diffY); -- setY(newY); --} -- --/** -- * Overridden from UMLWidget. -- * Modifies the value of the diffX and diffY variables used to move the widgets. -- * All the widgets are constrained to be moved only in Y axis (diffX is set to 0). -- * @see constrainPositionY -- * -- * @param diffX The difference between current X position and new X position. -- * @param diffY The difference between current Y position and new Y position. -- */ --void MessageWidget::constrainMovementForAllWidgets(qreal &diffX, qreal &diffY) --{ -- diffX = 0; -- diffY = constrainPositionY(diffY) - y(); --} -- --/** -- * Reimplemented from UMLWidget and calls other paint...() methods -- * depending on the message type. -- */ --void MessageWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- if(!m_pOw[Uml::RoleType::A] || !m_pOw[Uml::RoleType::B]) { -- return; -- } -- setPenFromSettings(painter); -- if (m_sequenceMessageType == Uml::SequenceMessage::Synchronous) { -- paintSynchronous(painter, option); -- } else if (m_sequenceMessageType == Uml::SequenceMessage::Asynchronous) { -- paintAsynchronous(painter, option); -- } else if (m_sequenceMessageType == Uml::SequenceMessage::Creation) { -- paintCreation(painter, option); -- } else if (m_sequenceMessageType == Uml::SequenceMessage::Lost) { -- paintLost(painter, option); -- } else if (m_sequenceMessageType == Uml::SequenceMessage::Found) { -- paintFound(painter, option); -- } else { -- uWarning() << "Unknown message type"; -- } --} -- --/** -- * Draw a solid-kf6 (triangular) arrowhead pointing in the given direction. -- * The direction can be either Qt::LeftArrow or Qt::RightArrow. -- */ --void MessageWidget::paintsolid-kf6Arrowhead(QPainter *p, int x, int y, Qt::ArrowType direction) --{ -- int arrowheadExtentX = 4; -- if (direction == Qt::RightArrow) { -- arrowheadExtentX = -arrowheadExtentX; -- } -- QPolygon points; -- points.putPoints(0, 3, x, y, x + arrowheadExtentX, y - 3, x + arrowheadExtentX, y + 3); -- p->setBrush(QBrush(p->pen().color())); -- p->drawPolygon(points); --} -- --/** -- * Draw an arrow pointing in the given direction. -- * The arrow head is not solid-kf6, i.e. it is made up of two lines -- * like so: ---> -- * The direction can be either Qt::LeftArrow or Qt::RightArrow. -- */ --void MessageWidget::paintArrow(QPainter *p, int x, int y, int w, -- Qt::ArrowType direction, bool useDottedLine /* = false */) --{ -- if (w > 3) { -- int arrowheadStartX = x; -- int arrowheadExtentX = 4; -- if (direction == Qt::RightArrow) { -- arrowheadStartX += w; -- arrowheadExtentX = -arrowheadExtentX; -- } -- // draw upper half of arrowhead -- p->drawLine(arrowheadStartX, y, arrowheadStartX + arrowheadExtentX, y - 3); -- // draw lower half of arrowhead -- p->drawLine(arrowheadStartX, y, arrowheadStartX + arrowheadExtentX, y + 3); -- } -- // draw arrow line -- if (useDottedLine) { -- QPen pen = p->pen(); -- pen.setStyle(Qt::DotLine); -- p->setPen(pen); -- } -- p->drawLine(x, y, x + w, y); --} -- --/** -- * Draws the calling arrow with filled in arrowhead, the -- * timeline box and the returning arrow with a dashed line and -- * stick arrowhead. -- */ --void MessageWidget::paintSynchronous(QPainter *painter, const QStyleOptionGraphicsItem *option) --{ -- int x1 = m_pOw[Uml::RoleType::A]->x(); -- int x2 = m_pOw[Uml::RoleType::B]->x(); -- int w = width() - 1; -- int h = height(); -- int offsetX = 0; -- int offsetY = 0; -- -- bool messageOverlaps = m_pOw[Uml::RoleType::A]->messageOverlap(y(), this); -- const int boxWidth = 17; -- const int wr = w < boxWidth ? w : boxWidth; -- const int arrowWidth = 4; -- -- if(isSelf()) { -- painter->fillRect(offsetX, offsetY, wr, h, QBrush(Qt::white)); //box -- painter->drawRect(offsetX, offsetY, wr, h); //box -- offsetX += wr; -- w -= wr; -- offsetY += 3; -- const int lowerLineY = offsetY + h - 6; -- // draw upper line segment (leaving the life line) -- painter->drawLine(offsetX, offsetY, offsetX + w, offsetY); -- // draw line segment parallel to (and at the right of) the life line -- painter->drawLine(offsetX + w, offsetY, offsetX + w, lowerLineY); -- // draw lower line segment (back to the life line) -- paintArrow(painter, offsetX, lowerLineY, w, Qt::LeftArrow); -- offsetX -= wr; -- offsetY -= 3; -- } else if(x1 < x2) { -- if (messageOverlaps) { -- offsetX += 8; -- w -= 8; -- } -- QPen pen = painter->pen(); -- int startX = offsetX + w - wr + 1; -- painter->fillRect(startX, offsetY, wr, h, QBrush(Qt::white)); //box -- painter->drawRect(startX, offsetY, wr, h); //box -- painter->drawLine(offsetX, offsetY + arrowWidth, startX, offsetY + arrowWidth); //arrow line -- if (w > boxWidth + arrowWidth) -- paintsolid-kf6Arrowhead(painter, startX - 1, offsetY + arrowWidth, Qt::RightArrow); -- paintArrow(painter, offsetX, offsetY + h - arrowWidth + 1, w - wr + 1, Qt::LeftArrow, true); // return arrow -- if (messageOverlaps) { -- offsetX -= 8; //reset for drawSelected() -- } -- } else { -- if (messageOverlaps) { -- w -=8; -- } -- QPen pen = painter->pen(); -- painter->fillRect(offsetX, offsetY, wr, h, QBrush(Qt::white)); //box -- painter->drawRect(offsetX, offsetY, wr, h); //box -- painter->drawLine(offsetX + wr + 1, offsetY + arrowWidth, offsetX + w, offsetY + arrowWidth); //arrow line -- if (w > boxWidth + arrowWidth) -- paintsolid-kf6Arrowhead(painter, offsetX + wr, offsetY + arrowWidth, Qt::LeftArrow); -- paintArrow(painter, offsetX + wr + 1, offsetY + h - arrowWidth + 1, w - wr - 1, Qt::RightArrow, true); // return arrow -- } -- -- UMLWidget::paint(painter, option); --} -- --/** -- * Draws a solid-kf6 arrow line and a stick arrow head. -- */ --void MessageWidget::paintAsynchronous(QPainter *painter, const QStyleOptionGraphicsItem *option) --{ -- int x1 = m_pOw[Uml::RoleType::A]->x(); -- int x2 = m_pOw[Uml::RoleType::B]->x(); -- int w = width() - 1; -- int h = height() - 1; -- int offsetX = 0; -- int offsetY = 0; -- bool messageOverlapsA = m_pOw[Uml::RoleType::A]->messageOverlap(y(), this); -- //bool messageOverlapsB = m_pOw[Uml::RoleType::B]->messageOverlap(y(), this); -- -- if(isSelf()) { -- if (messageOverlapsA) { -- offsetX += 7; -- w -= 7; -- } -- const int lowerLineY = offsetY + h - 3; -- // draw upper line segment (leaving the life line) -- painter->drawLine(offsetX, offsetY, offsetX + w, offsetY); -- // draw line segment parallel to (and at the right of) the life line -- painter->drawLine(offsetX + w, offsetY, offsetX + w, lowerLineY); -- // draw lower line segment (back to the life line) -- paintArrow(painter, offsetX, lowerLineY, w, Qt::LeftArrow); -- if (messageOverlapsA) { -- offsetX -= 7; //reset for drawSelected() -- } -- } else if(x1 < x2) { -- if (messageOverlapsA) { -- offsetX += 7; -- w -= 7; -- } -- paintArrow(painter, offsetX, offsetY + 4, w, Qt::RightArrow); -- if (messageOverlapsA) { -- offsetX -= 7; -- } -- } else { -- if (messageOverlapsA) { -- w -= 7; -- } -- paintArrow(painter, offsetX, offsetY + 4, w, Qt::LeftArrow); -- } -- -- UMLWidget::paint(painter, option); --} -- --/** -- * Draws a solid-kf6 arrow line and a stick arrow head to the -- * edge of the target object widget instead of to the -- * sequence line. -- */ --void MessageWidget::paintCreation(QPainter *painter, const QStyleOptionGraphicsItem *option) --{ -- int x1 = m_pOw[Uml::RoleType::A]->x(); -- int x2 = m_pOw[Uml::RoleType::B]->x(); -- int w = width(); -- //int h = height() - 1; -- int offsetX = 0; -- int offsetY = 0; -- bool messageOverlapsA = m_pOw[Uml::RoleType::A]->messageOverlap(y(), this); -- //bool messageOverlapsB = m_pOw[Uml::RoleType::B]->messageOverlap(y(), this); -- -- const int lineY = offsetY + 4; -- if (x1 < x2) { -- if (messageOverlapsA) { -- offsetX += 7; -- w -= 7; -- } -- paintArrow(painter, offsetX, lineY, w, Qt::RightArrow); -- if (messageOverlapsA) { -- offsetX -= 7; -- } -- } else { -- if (messageOverlapsA) { -- w -= 7; -- } -- paintArrow(painter, offsetX, lineY, w, Qt::LeftArrow); -- } -- -- UMLWidget::paint(painter, option); --} -- -- --/** -- * Draws a solid-kf6 arrow line and a stick arrow head -- * and a circle -- */ --void MessageWidget::paintLost(QPainter *painter, const QStyleOptionGraphicsItem *option) --{ -- int x1 = m_pOw[Uml::RoleType::A]->centerX(); -- int x2 = m_xclicked; -- int w = width(); -- int h = height(); -- int offsetX = 0; -- int offsetY = 0; -- bool messageOverlapsA = m_pOw[Uml::RoleType::A]->messageOverlap(y(), this); -- //bool messageOverlapsB = m_pOw[Uml::RoleType::B]->messageOverlap(y(), this); -- -- if(x1 < x2) { -- if (messageOverlapsA) { -- offsetX += 7; -- w -= 7; -- } -- -- setPenFromSettings(painter); -- painter->setBrush(WidgetBase::lineColor()); -- painter->drawEllipse(offsetX + w - h, offsetY, h, h); -- paintArrow(painter, offsetX, offsetY + h/2, w - h, Qt::RightArrow); -- -- if (messageOverlapsA) { -- offsetX -= 7; -- } -- } else { -- setPenFromSettings(painter); -- painter->setBrush(WidgetBase::lineColor()); -- painter->drawEllipse(offsetX, offsetY, h, h); -- paintArrow(painter, offsetX + h, offsetY + h/2, w - h, Qt::LeftArrow); -- } -- -- UMLWidget::paint(painter, option); --} -- --/** -- * Draws a circle and a solid-kf6 arrow line and a stick arrow head. -- */ --void MessageWidget::paintFound(QPainter *painter, const QStyleOptionGraphicsItem *option) --{ -- int x1 = m_pOw[Uml::RoleType::A]->centerX(); -- int x2 = m_xclicked; -- int w = width(); -- int h = height(); -- int offsetX = 0; -- int offsetY = 0; -- bool messageOverlapsA = m_pOw[Uml::RoleType::A]->messageOverlap(y(), this); -- //bool messageOverlapsB = m_pOw[Uml::RoleType::B]->messageOverlap(y(), this); -- -- if(x1 < x2) { -- if (messageOverlapsA) { -- offsetX += 7; -- w -= 7; -- } -- setPenFromSettings(painter); -- painter->setBrush(WidgetBase::lineColor()); -- painter->drawEllipse(offsetX + w - h, offsetY, h, h); -- paintArrow(painter, offsetX, offsetY + h/2, w, Qt::LeftArrow); -- if (messageOverlapsA) { -- offsetX -= 7; -- } -- } else { -- if (messageOverlapsA) { -- w -= 7; -- } -- setPenFromSettings(painter); -- painter->setBrush(WidgetBase::lineColor()); -- painter->drawEllipse(offsetX, offsetY, h, h); -- paintArrow(painter, offsetX, offsetY + h/2, w, Qt::RightArrow); -- } -- -- UMLWidget::paint(painter, option); --} -- --/** -- * Overrides operation from UMLWidget. -- * -- * @param p Point to be checked. -- * -- * @return 'this' if the point is on a part of the MessageWidget. -- * NB In case of a synchronous message, the empty space -- * between call line and return line does not count, i.e. if -- * the point is located in that space the function returns NULL. -- */ --UMLWidget* MessageWidget::onWidget(const QPointF& p) --{ -- if (m_sequenceMessageType != Uml::SequenceMessage::Synchronous) { -- return UMLWidget::onWidget(p); -- } -- // Synchronous message: -- // Consists of top arrow (call) and bottom arrow (return.) -- if (p.x() < x() || p.x() > x() + width()) -- return NULL; -- const int tolerance = 5; // pixels -- const int pY = p.y(); -- const int topArrowY = y() + 3; -- const int bottomArrowY = y() + height() - 3; -- if (pY < topArrowY - tolerance || pY > bottomArrowY + tolerance) -- return NULL; -- if (height() <= 2 * tolerance) -- return this; -- if (pY > topArrowY + tolerance && pY < bottomArrowY - tolerance) -- return NULL; -- return this; --} -- --/** -- * Sets the text position relative to the sequence message. -- */ --void MessageWidget::setTextPosition() --{ -- if (m_pFText == NULL) { -- DEBUG(DBG_SRC) << "m_pFText is NULL"; -- return; -- } -- if (m_pFText->displayText().isEmpty()) { -- return; -- } -- m_pFText->updateGeometry(); -- int ftX = constrainX(m_pFText->x(), m_pFText->width(), m_pFText->textRole()); -- int ftY = y() - m_pFText->height(); -- m_pFText->setX(ftX); -- m_pFText->setY(ftY); --} -- --/** -- * Returns the textX arg with constraints applied. -- * Auxiliary to setTextPosition() and constrainTextPos(). -- */ --int MessageWidget::constrainX(int textX, int textWidth, Uml::TextRole::Enum tr) --{ -- int result = textX; -- const int minTextX = x() + 5; -- if (textX < minTextX || tr == Uml::TextRole::Seq_Message_Self) { -- result = minTextX; -- } else { -- ObjectWidget *objectAtRight = NULL; -- if (m_pOw[Uml::RoleType::B]->x() > m_pOw[Uml::RoleType::A]->x()) -- objectAtRight = m_pOw[Uml::RoleType::B]; -- else -- objectAtRight = m_pOw[Uml::RoleType::A]; -- const int objRight_seqLineX = objectAtRight->centerX(); -- const int maxTextX = objRight_seqLineX - textWidth - 5; -- if (maxTextX <= minTextX) -- result = minTextX; -- else if (textX > maxTextX) -- result = maxTextX; -- } -- return result; --} -- --/** -- * Constrains the FloatingTextWidget X and Y values supplied. -- * Overrides operation from LinkWidget. -- * -- * @param textX candidate X value (may be modified by the constraint) -- * @param textY candidate Y value (may be modified by the constraint) -- * @param textWidth width of the text -- * @param textHeight height of the text -- * @param tr Uml::TextRole::Enum of the text -- */ --void MessageWidget::constrainTextPos(qreal &textX, qreal &textY, qreal textWidth, qreal textHeight, -- Uml::TextRole::Enum tr) --{ -- textX = constrainX(textX, textWidth, tr); -- // Constrain Y. -- const qreal minTextY = getMinY(); -- const qreal maxTextY = getMaxY() - textHeight - 5; -- if (textY < minTextY) -- textY = minTextY; -- else if (textY > maxTextY) -- textY = maxTextY; --// setY(textY + textHeight); // NB: side effect --} -- --/** -- * Shortcut for calling m_pFText->setLink() followed by -- * this->setTextPosition(). -- */ --void MessageWidget::setLinkAndTextPos() --{ -- if (m_pFText) { -- m_pFText->setLink(this); -- setTextPosition(); -- } --} -- --void MessageWidget::resizeEvent(QResizeEvent* /*re*/) --{ --} -- --/** -- * Calculate the geometry of the widget. -- */ --void MessageWidget::calculateWidget() --{ -- setMessageText(m_pFText); -- calculateDimensions(); -- setVisible(true); --} -- --void MessageWidget::slotWidgetMoved(Uml::ID::Type id) --{ -- const Uml::ID::Type idA = m_pOw[Uml::RoleType::A]->localID(); -- const Uml::ID::Type idB = m_pOw[Uml::RoleType::B]->localID(); -- if (idA != id && idB != id) { -- DEBUG(DBG_SRC) << "id=" << Uml::ID::toString(id) << ": ignoring for idA=" << Uml::ID::toString(idA) -- << ", idB=" << Uml::ID::toString(idB); -- return; -- } -- qreal y = this->y(); -- if (y < getMinY()) -- y = getMinY(); -- if (y > getMaxY()) -- y = getMaxY(); -- setPos(x(), y); -- calculateWidget(); -- if(!m_pFText) -- return; -- if (m_scene->selectedCount(true) > 1) -- return; -- setTextPosition(); --} -- --/** -- * Check to see if the given ObjectWidget is involved in the message. -- * -- * @param w The ObjectWidget to check for. -- * @return true - if is contained, false - not contained. -- */ --bool MessageWidget::hasObjectWidget(ObjectWidget * w) --{ -- if(m_pOw[Uml::RoleType::A] == w || m_pOw[Uml::RoleType::B] == w) -- return true; -- else -- return false; --} -- --/** -- * This method determines whether the message is for "Self" for -- * an ObjectWidget. -- * -- * @retval True If both ObjectWidgets for this widget exists and -- * are same. -- */ --bool MessageWidget::isSelf() const --{ -- return (m_pOw[Uml::RoleType::A] && m_pOw[Uml::RoleType::B] && -- m_pOw[Uml::RoleType::A] == m_pOw[Uml::RoleType::B]); --} -- --void MessageWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- if (sel == ListPopupMenu::mt_Delete) { -- // This will clean up this widget and the text widget: -- m_scene->removeWidget(this); -- } else { -- -- UMLWidget::slotMenuSelection(action); -- } --} -- --/** -- * Activates a MessageWidget. Connects its m_pOw[] pointers -- * to UMLObjects and also send signals about its FloatingTextWidget. -- */ --bool MessageWidget::activate(IDChangeLog * /*Log = 0*/) --{ -- m_scene->resetPastep-kf6oint(); -- // UMLWidget::activate(Log); CHECK: I don't think we need this ? -- if (m_pOw[Uml::RoleType::A] == NULL) { -- UMLWidget *pWA = m_scene->findWidget(m_widgetAId); -- if (pWA == NULL) { -- DEBUG(DBG_SRC) << "role A object " << Uml::ID::toString(m_widgetAId) << " not found"; -- return false; -- } -- m_pOw[Uml::RoleType::A] = dynamic_cast(pWA); -- if (m_pOw[Uml::RoleType::A] == NULL) { -- DEBUG(DBG_SRC) << "role A widget " << Uml::ID::toString(m_widgetAId) -- << " is not an ObjectWidget"; -- return false; -- } -- } -- if (m_pOw[Uml::RoleType::B] == NULL) { -- UMLWidget *pWB = m_scene->findWidget(m_widgetBId); -- if (pWB == NULL) { -- DEBUG(DBG_SRC) << "role B object " << Uml::ID::toString(m_widgetBId) << " not found"; -- return false; -- } -- m_pOw[Uml::RoleType::B] = dynamic_cast(pWB); -- if (m_pOw[Uml::RoleType::B] == NULL) { -- DEBUG(DBG_SRC) << "role B widget " << Uml::ID::toString(m_widgetBId) -- << " is not an ObjectWidget"; -- return false; -- } -- } -- updateResizability(); -- -- UMLClassifier *c = dynamic_cast(m_pOw[Uml::RoleType::B]->umlObject()); -- UMLOperation *op = NULL; -- if (c && !m_CustomOp.isEmpty()) { -- Uml::ID::Type opId = Uml::ID::fromString(m_CustomOp); -- op = dynamic_cast(c->findChildObjectById(opId, true)); -- if (op) { -- // If the UMLOperation is set, m_CustomOp isn't used anyway. -- // Just setting it empty for the sake of sanity. -- m_CustomOp.clear(); -- } -- } -- -- if(!m_pFText) { -- Uml::TextRole::Enum tr = Uml::TextRole::Seq_Message; -- if (isSelf()) -- tr = Uml::TextRole::Seq_Message_Self; -- m_pFText = new FloatingTextWidget(m_scene, tr, operationText(m_scene)); -- m_scene->addFloatingTextWidget(m_pFText); -- m_pFText->setFontCmd(UMLWidget::font()); -- } -- if (op) -- setOperation(op); // This requires a valid m_pFText. -- setLinkAndTextPos(); -- m_pFText->setText(QString()); -- m_pFText->setActivated(); -- QString messageText = m_pFText->text(); -- m_pFText->setVisible(messageText.length() > 1); -- -- connect(m_pOw[Uml::RoleType::A], SIGNAL(sigWidgetMoved(Uml::ID::Type)), this, SLOT(slotWidgetMoved(Uml::ID::Type))); -- connect(m_pOw[Uml::RoleType::B], SIGNAL(sigWidgetMoved(Uml::ID::Type)), this, SLOT(slotWidgetMoved(Uml::ID::Type))); -- -- connect(this, SIGNAL(sigMessageMoved()), m_pOw[Uml::RoleType::A], SLOT(slotMessageMoved())); -- connect(this, SIGNAL(sigMessageMoved()), m_pOw[Uml::RoleType::B], SLOT(slotMessageMoved())); -- m_pOw[Uml::RoleType::A]->messageAdded(this); -- if (!isSelf()) -- m_pOw[Uml::RoleType::B]->messageAdded(this); -- -- // Calculate the size and position of the message widget -- calculateDimensions(); -- -- // Position the floating text accordingly -- setTextPosition(); -- -- emit sigMessageMoved(); -- return true; --} -- --/** -- * Resolve references of this message so they reference the correct -- * new object widgets after paste. -- */ --void MessageWidget::resolveObjectWidget(IDChangeLog* log) { -- m_widgetAId = log->findNewID(m_widgetAId); -- m_widgetBId = log->findNewID(m_widgetBId); --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- * -- * @param ft The text widget which to update. -- */ --void MessageWidget::setMessageText(FloatingTextWidget *ft) --{ -- if (ft == NULL) -- return; -- ft->setSequenceNumber(m_SequenceNumber); -- ft->setText(operationText(m_scene)); -- setTextPosition(); --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- * -- * @param ft The text widget which to update. -- * @param newText The new text to set. -- */ --void MessageWidget::setText(FloatingTextWidget *ft, const QString &newText) --{ -- ft->setText(newText); -- UMLApp::app()->document()->setModified(true); --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- * -- * @param op The new operation string to set. -- */ --void MessageWidget::setOperationText(const QString &op) --{ -- m_CustomOp = op; ///FIXME m_pOperation --} -- --/** -- * Implements operation from LinkWidget. -- * Required by FloatingTextWidget. -- */ --void MessageWidget::lwSetFont (QFont font) --{ -- UMLWidget::setFont(font); --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- * @todo Move to LinkWidget. -- */ --UMLClassifier *MessageWidget::operationOwner() --{ -- UMLObject *pObject = m_pOw[Uml::RoleType::B]->umlObject(); -- if (pObject == NULL) -- return NULL; -- UMLClassifier *c = dynamic_cast(pObject); -- return c; --} -- --/** -- * Implements operation from LinkWidget. -- * Motivated by FloatingTextWidget. -- */ --UMLOperation *MessageWidget::operation() --{ -- return static_cast(m_umlObject); --} -- --/** -- * Implements operation from LinkWidget. -- * Motivated by FloatingTextWidget. -- */ --void MessageWidget::setOperation(UMLOperation *op) --{ -- if (m_umlObject && m_pFText) -- disconnect(m_umlObject, SIGNAL(modified()), m_pFText, SLOT(setMessageText())); -- m_umlObject = op; -- if (m_umlObject && m_pFText) { -- connect(m_umlObject, SIGNAL(modified()), m_pFText, SLOT(setMessageText())); -- m_pFText->setMessageText(); -- } --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- */ --QString MessageWidget::customOpText() --{ -- return m_CustomOp; --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- */ --void MessageWidget::setCustomOpText(const QString &opText) --{ -- m_CustomOp = opText; -- m_pFText->setMessageText(); --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- */ --QString MessageWidget::lwOperationText() --{ -- UMLOperation *pOperation = operation(); -- if (pOperation != NULL) { -- return pOperation->toString(Uml::SignatureType::SigNoVis); -- } else { -- return customOpText(); -- } --} -- --/** -- * Overrides operation from LinkWidget. -- * Required by FloatingTextWidget. -- */ --UMLClassifier *MessageWidget::lwClassifier() --{ -- UMLObject *o = m_pOw[Uml::RoleType::B]->umlObject(); -- UMLClassifier *c = dynamic_cast(o); -- return c; --} -- --/** -- * Calculates the size of the widget by calling -- * calculateDimensionsSynchronous(), -- * calculateDimensionsAsynchronous(), or -- * calculateDimensionsCreation() -- */ --void MessageWidget::calculateDimensions() --{ -- if (m_sequenceMessageType == Uml::SequenceMessage::Synchronous) { -- calculateDimensionsSynchronous(); -- } else if (m_sequenceMessageType == Uml::SequenceMessage::Asynchronous) { -- calculateDimensionsAsynchronous(); -- } else if (m_sequenceMessageType == Uml::SequenceMessage::Creation) { -- calculateDimensionsCreation(); -- } else if (m_sequenceMessageType == Uml::SequenceMessage::Lost) { -- calculateDimensionsLost(); -- } else if (m_sequenceMessageType == Uml::SequenceMessage::Found) { -- calculateDimensionsFound(); -- } else { -- uWarning() << "Unknown message type"; -- } -- if (! UMLApp::app()->document()->loading()) { -- adjustAssocs(x(), y()); // adjust assoc lines -- } --} -- --/** -- * Calculates and sets the size of the widget for a synchronous message. -- */ --void MessageWidget::calculateDimensionsSynchronous() --{ -- int x = 0; -- -- int x1 = m_pOw[Uml::RoleType::A]->centerX(); -- int x2 = m_pOw[Uml::RoleType::B]->centerX(); -- -- int widgetWidth = 0; -- int widgetHeight = 0; -- if(isSelf()) { -- widgetWidth = 50; -- x = x1 - 2; -- } else if(x1 < x2) { -- x = x1; -- widgetWidth = x2 - x1 + 8; -- } else { -- x = x2 - 8; -- widgetWidth = x1 - x2 + 8; -- } -- -- if (height() < 20) { -- widgetHeight = 20; -- } else { -- widgetHeight = height(); -- } -- -- setX(x); -- setSize(widgetWidth, widgetHeight); --} -- --/** -- * Calculates and sets the size of the widget for an asynchronous message. -- */ --void MessageWidget::calculateDimensionsAsynchronous() --{ -- int x = 0; -- -- int x1 = m_pOw[Uml::RoleType::A]->centerX(); -- int x2 = m_pOw[Uml::RoleType::B]->centerX(); -- -- int widgetWidth = 0; -- int widgetHeight = 8; -- if(isSelf()) { -- widgetWidth = 50; -- x = x1; -- if(height() < 20) { -- widgetHeight = 20; -- } else { -- widgetHeight = height(); -- } -- } else if(x1 < x2) { -- x = x1; -- widgetWidth = x2 - x1; -- } else { -- x = x2; -- widgetWidth = x1 - x2; -- } -- x += 1; -- widgetWidth -= 2; -- setX(x); -- setSize(widgetWidth, widgetHeight); --} -- --/** -- * Calculates and sets the size of the widget for a creation message. -- */ --void MessageWidget::calculateDimensionsCreation() --{ -- int x = 0; -- -- int x1 = m_pOw[Uml::RoleType::A]->centerX(); -- int x2 = m_pOw[Uml::RoleType::B]->x(); -- int w2 = m_pOw[Uml::RoleType::B]->width(); -- -- if (x1 > x2) -- x2 += w2; -- -- int widgetWidth = 0; -- int widgetHeight = 8; -- if (x1 < x2) { -- x = x1; -- widgetWidth = x2 - x1; -- } else { -- x = x2; -- widgetWidth = x1 - x2; -- } -- x += 1; -- widgetWidth -= 2; -- setPos(x, m_pOw[Uml::RoleType::B]->y() + m_pOw[Uml::RoleType::B]->height() / 2); -- setSize(widgetWidth, widgetHeight); --} -- --/** -- * Calculates and sets the size of the widget for a lost message. -- */ --void MessageWidget::calculateDimensionsLost() --{ -- int x = 0; -- -- int x1 = m_pOw[Uml::RoleType::A]->centerX(); -- int x2 = m_xclicked; -- -- int widgetWidth = 0; -- int widgetHeight = 10; -- if(x1 < x2) { -- x = x1; -- widgetWidth = x2 - x1 + circleWidth/2; -- } else { -- x = x2 - circleWidth/2; -- widgetWidth = x1 - x2 + circleWidth/2; -- } -- setX(x); -- setSize(widgetWidth, widgetHeight); --} -- --/** -- * Calculates and sets the size of the widget for a found message. -- */ --void MessageWidget::calculateDimensionsFound() --{ -- int x = 0; -- -- int x1 = m_pOw[Uml::RoleType::A]->centerX(); -- int x2 = m_xclicked; -- -- int widgetWidth = 0; -- int widgetHeight = 10; -- if(x1 < x2) { -- x = x1; -- widgetWidth = x2 - x1 + circleWidth/2; -- } else { -- x = x2 - circleWidth/2; -- widgetWidth = x1 - x2 + circleWidth/2; -- } -- -- setX(x); -- setSize(widgetWidth, widgetHeight); --} -- --/** -- * Used to cleanup any other widget it may need to delete. -- */ --void MessageWidget::cleanup() --{ -- if (m_pOw[Uml::RoleType::A]) { -- disconnect(this, SIGNAL(sigMessageMoved()), m_pOw[Uml::RoleType::A], SLOT(slotMessageMoved())); -- m_pOw[Uml::RoleType::A]->messageRemoved(this); -- } -- if (m_pOw[Uml::RoleType::B]) { -- disconnect(this, SIGNAL(sigMessageMoved()), m_pOw[Uml::RoleType::B], SLOT(slotMessageMoved())); -- m_pOw[Uml::RoleType::B]->messageRemoved(this); -- } -- -- UMLWidget::cleanup(); -- if (m_pFText) { -- m_scene->removeWidgetCmd(m_pFText); -- m_pFText = NULL; -- } --} -- --/** -- * Sets the state of whether the widget is selected. -- * -- * @param _select True if the widget is selected. -- */ --void MessageWidget::setSelected(bool _select) --{ -- UMLWidget::setSelected(_select); -- if(!m_pFText || m_pFText->displayText().isEmpty()) -- return; -- if(isSelected() && m_pFText->isSelected()) -- return; -- if(!isSelected() && !m_pFText->isSelected()) -- return; -- -- m_pFText->setSelected(isSelected()); --} -- --/** -- * Returns the minimum height this widget should be set at on -- * a sequence diagrams. Takes into account the widget positions -- * it is related to. -- */ --int MessageWidget::getMinY() --{ -- if (!m_pOw[Uml::RoleType::A] || !m_pOw[Uml::RoleType::B]) { -- return 0; -- } -- if (m_sequenceMessageType == Uml::SequenceMessage::Creation) { -- return m_pOw[Uml::RoleType::A]->y() + m_pOw[Uml::RoleType::A]->height(); -- } -- int heightA = m_pOw[Uml::RoleType::A]->y() + m_pOw[Uml::RoleType::A]->height(); -- int heightB = m_pOw[Uml::RoleType::B]->y() + m_pOw[Uml::RoleType::B]->height(); -- int height = heightA; -- if(heightA < heightB) { -- height = heightB; -- } -- return height; --} -- --/** -- * Returns the maximum height this widget should be set at on -- * a sequence diagrams. Takes into account the widget positions -- * it is related to. -- */ --int MessageWidget::getMaxY() --{ -- if(!m_pOw[Uml::RoleType::A] || !m_pOw[Uml::RoleType::B]) { -- return 0; -- } -- int heightA = (int)((ObjectWidget*)m_pOw[Uml::RoleType::A])->getEndLineY(); -- int heightB = (int)((ObjectWidget*)m_pOw[Uml::RoleType::B])->getEndLineY(); -- int height = heightA; -- if(heightA > heightB) { -- height = heightB; -- } -- return (height - this->height()); --} -- --/** -- * Sets the related widget on the given side. -- * -- * @param ow The ObjectWidget we are related to. -- * @param role The Uml::RoleType::Enum to be set for the ObjectWidget -- */ --void MessageWidget::setObjectWidget(ObjectWidget * ow, Uml::RoleType::Enum role) --{ -- m_pOw[role] = ow; -- updateResizability(); --} -- --/** -- * Returns the related widget on the given side. -- * -- * @return The ObjectWidget we are related to. -- */ --ObjectWidget* MessageWidget::objectWidget(Uml::RoleType::Enum role) --{ -- return m_pOw[role]; --} -- --/** -- * Set the xclicked -- */ --void MessageWidget::setxclicked(int xclick) --{ -- m_xclicked = xclick; --} -- --/** -- * Set the yclicked -- */ --void MessageWidget::setyclicked(int yclick) --{ -- m_yclicked = yclick; --} -- --/** -- * Event handler for mouse double click events. -- * @param event QGraphicsSceneMouseEvent which triggered the double click event -- */ --void MessageWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) --{ -- Q_UNUSED(event) -- DEBUG(DBG_SRC) << "NOT IMPLEMENTED YET!"; -- if (m_pFText != NULL) { -- DEBUG(DBG_SRC) << "NOT IMPLEMENTED YET - on floating text widget!"; --// QAction* action = m_pMenu->getAction(ListPopupMenu::mt_Select_Operation); --// m_pFText->slotMenuSelection(action); -- } --} -- --/** -- * Saves to the "messagewidget" XMI element. -- */ --void MessageWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement messageElement = qDoc.createElement(QLatin1String("messagewidget")); -- UMLWidget::saveToXMI(qDoc, messageElement); -- LinkWidget::saveToXMI(qDoc, messageElement); -- if (m_pOw[Uml::RoleType::A]) -- messageElement.setAttribute(QLatin1String("widgetaid"), Uml::ID::toString(m_pOw[Uml::RoleType::A]->localID())); -- if (m_pOw[Uml::RoleType::B]) -- messageElement.setAttribute(QLatin1String("widgetbid"), Uml::ID::toString(m_pOw[Uml::RoleType::B]->localID())); -- UMLOperation *pOperation = operation(); -- if (pOperation) -- messageElement.setAttribute(QLatin1String("operation"), Uml::ID::toString(pOperation->id())); -- else -- messageElement.setAttribute(QLatin1String("operation"), m_CustomOp); -- messageElement.setAttribute(QLatin1String("sequencemessagetype"), m_sequenceMessageType); -- if (m_sequenceMessageType == Uml::SequenceMessage::Lost || m_sequenceMessageType == Uml::SequenceMessage::Found) { -- messageElement.setAttribute(QLatin1String("xclicked"), m_xclicked); -- messageElement.setAttribute(QLatin1String("yclicked"), m_yclicked); -- } -- -- // save the corresponding message text -- if (m_pFText && !m_pFText->text().isEmpty()) { -- messageElement.setAttribute(QLatin1String("textid"), Uml::ID::toString(m_pFText->id())); -- m_pFText->saveToXMI(qDoc, messageElement); -- } -- -- qElement.appendChild(messageElement); --} -- --/** -- * Loads from the "messagewidget" XMI element. -- */ --bool MessageWidget::loadFromXMI(QDomElement& qElement) --{ -- if (!UMLWidget::loadFromXMI(qElement)) { -- return false; -- } -- if (!LinkWidget::loadFromXMI(qElement)) { -- return false; -- } -- QString textid = qElement.attribute(QLatin1String("textid"), QLatin1String("-1")); -- QString widgetaid = qElement.attribute(QLatin1String("widgetaid"), QLatin1String("-1")); -- QString widgetbid = qElement.attribute(QLatin1String("widgetbid"), QLatin1String("-1")); -- m_CustomOp = qElement.attribute(QLatin1String("operation")); -- QString sequenceMessageType = qElement.attribute(QLatin1String("sequencemessagetype"), QLatin1String("1001")); -- m_sequenceMessageType = Uml::SequenceMessage::fromInt(sequenceMessageType.toInt()); -- if (m_sequenceMessageType == Uml::SequenceMessage::Lost || m_sequenceMessageType == Uml::SequenceMessage::Found) { -- m_xclicked = qElement.attribute(QLatin1String("xclicked"), QLatin1String("-1")).toFloat(); -- m_yclicked = qElement.attribute(QLatin1String("yclicked"), QLatin1String("-1")).toFloat(); -- } -- -- m_widgetAId = Uml::ID::fromString(widgetaid); -- m_widgetBId = Uml::ID::fromString(widgetbid); -- m_textId = Uml::ID::fromString(textid); -- -- Uml::TextRole::Enum tr = Uml::TextRole::Seq_Message; -- if (m_widgetAId == m_widgetBId) -- tr = Uml::TextRole::Seq_Message_Self; -- -- //now load child elements -- QDomNode node = qElement.firstChild(); -- QDomElement element = node.toElement(); -- if (!element.isNull()) { -- QString tag = element.tagName(); -- if (tag == QLatin1String("floatingtext") || tag == QLatin1String("UML::FloatingTextWidget")) { -- m_pFText = new FloatingTextWidget(m_scene, tr, operationText(m_scene), m_textId); -- m_scene->addFloatingTextWidget(m_pFText); -- if(! m_pFText->loadFromXMI(element)) { -- // Most likely cause: The FloatingTextWidget is empty. -- delete m_pFText; -- m_pFText = NULL; -- } -- else -- m_pFText->setSequenceNumber(m_SequenceNumber); -- } else { -- uError() << "unknown tag " << tag; -- } -- } -- return true; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/messagewidget.h umbrello-kf6-15.08.1/umbrello/widgets/messagewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/messagewidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/messagewidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,212 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef MESSAGEWIDGET_H --#define MESSAGEWIDGET_H -- --#include "umlwidget.h" --#include "linkwidget.h" -- --// forward declarations --class FloatingTextWidget; --class ObjectWidget; --class QResizeEvent; --class UMLOperation; -- --/** -- * Used to display a message on a sequence diagram. The message -- * could be between two objects or a message that calls itself on -- * an object. This class will only display the line that is -- * required and the text will be setup by the @ref FloatingTextWidget -- * widget that is passed in the constructor. A message can be -- * synchronous (calls a method and gains control back on return, -- * as happens in most programming languages) or asynchronous -- * (calls a method and gains back control immediately). -- * -- * @short Displays a message. -- * @author Paul Hensgen -- * @see UMLWidget -- * @see ObjectWidget -- * @see FloatingTextWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class MessageWidget : public UMLWidget, public LinkWidget --{ -- Q_OBJECT --public: -- MessageWidget(UMLScene * scene, ObjectWidget* a, ObjectWidget* b, -- int y, Uml::SequenceMessage::Enum sequenceMessageType, -- Uml::ID::Type id = Uml::ID::None); -- MessageWidget(UMLScene * scene, Uml::SequenceMessage::Enum sequenceMessageType, -- Uml::ID::Type id = Uml::ID::None); -- MessageWidget(UMLScene * scene, ObjectWidget* a, int xclick, int yclick, -- Uml::SequenceMessage::Enum sequenceMessageType, -- Uml::ID::Type id = Uml::ID::None); -- virtual ~MessageWidget(); -- -- virtual void setY(qreal y); -- -- //---------- LinkWidget Interface methods implemementation from now on. -- -- virtual void lwSetFont (QFont font); -- virtual UMLClassifier *operationOwner(); -- -- virtual UMLOperation *operation(); -- virtual void setOperation(UMLOperation *op); -- -- virtual QString customOpText(); -- virtual void setCustomOpText(const QString &opText); -- -- virtual void setMessageText(FloatingTextWidget *ft); -- virtual void setText(FloatingTextWidget *ft, const QString &newText); -- -- virtual QString lwOperationText(); -- virtual UMLClassifier *lwClassifier(); -- virtual void setOperationText(const QString &op); -- -- virtual void constrainTextPos(qreal &textX, qreal &textY, qreal textWidth, qreal textHeight, -- Uml::TextRole::Enum tr); -- -- //---------- End LinkWidget Interface methods implemementation. -- -- /// @return Whether the message is synchronous or asynchronous -- Uml::SequenceMessage::Enum sequenceMessageType() const { -- return m_sequenceMessageType; -- } -- -- bool hasObjectWidget(ObjectWidget * w); -- -- ObjectWidget* objectWidget(Uml::RoleType::Enum role); -- void setObjectWidget(ObjectWidget * ow, Uml::RoleType::Enum role) ; -- -- bool isSelf() const; -- -- /** -- * Returns the text widget it is related to. -- * -- * @return The text widget we are related to. -- */ -- FloatingTextWidget * floatingTextWidget() { -- return m_pFText; -- } -- -- /** -- * Sets the text widget it is related to. -- * -- * @param f The text widget we are related to. -- */ -- void setFloatingTextWidget(FloatingTextWidget * f) { -- m_pFText = f; -- } -- -- void calculateWidget(); -- -- virtual bool activate(IDChangeLog * Log = 0); -- void resolveObjectWidget(IDChangeLog* log); -- -- void calculateDimensions(); -- void calculateDimensionsSynchronous(); -- void calculateDimensionsAsynchronous(); -- void calculateDimensionsCreation(); -- void calculateDimensionsLost(); -- void calculateDimensionsFound(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- void setTextPosition(); -- -- void cleanup(); -- -- void setSelected(bool _select); -- -- int getMinY(); -- int getMaxY(); -- -- UMLWidget* onWidget(const QPointF& p); -- -- virtual void resizeWidget(qreal newW, qreal newH); -- -- virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- virtual bool loadFromXMI(QDomElement & qElement); -- -- void setxclicked(int xclick); -- void setyclicked(int yclick); -- -- /** -- * Return the xclicked -- */ -- int getxclicked() const { -- return m_xclicked; -- } -- --protected: -- virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); -- -- virtual void moveWidgetBy(qreal diffX, qreal diffY); -- virtual void constrainMovementForAllWidgets(qreal &diffX, qreal &diffY); -- -- virtual QCursor resizeCursor() const; -- -- void setLinkAndTextPos(); -- -- int constrainX(int textX, int textWidth, Uml::TextRole::Enum tr); -- -- static void paintArrow(QPainter *p, int x, int y, int w, -- Qt::ArrowType direction, bool useDottedLine = false); -- static void paintsolid-kf6Arrowhead(QPainter *p, int x, int y, Qt::ArrowType direction); -- -- void updateResizability(); -- -- void paintSynchronous(QPainter *painter, const QStyleOptionGraphicsItem *option); -- void paintAsynchronous(QPainter *painter, const QStyleOptionGraphicsItem *option); -- void paintCreation(QPainter *painter, const QStyleOptionGraphicsItem *option); -- void paintLost(QPainter *painter, const QStyleOptionGraphicsItem *option); -- void paintFound(QPainter *painter, const QStyleOptionGraphicsItem *option); -- -- // Data loaded/saved -- QString m_CustomOp; -- /** -- * Whether the message is synchronous or asynchronous -- */ -- Uml::SequenceMessage::Enum m_sequenceMessageType; -- --private: -- void resizeEvent(QResizeEvent *re); -- -- qreal constrainPositionY(qreal diffY); -- -- void init(); -- -- ObjectWidget * m_pOw[2]; -- FloatingTextWidget * m_pFText; -- -- int m_xclicked; -- int m_yclicked; -- -- /** -- * The following variables are used by loadFromXMI() as an intermediate -- * store. activate() resolves the IDs, i.e. after activate() the variables -- * m_pOw[] and m_pFText can be used. -- */ -- Uml::ID::Type m_widgetAId, m_widgetBId, m_textId; -- --public slots: -- void slotWidgetMoved(Uml::ID::Type id); -- void slotMenuSelection(QAction* action); -- --signals: -- /** -- * emitted when the message widget is moved up or down -- * slots into ObjectWidget::slotMessageMoved() -- */ -- void sigMessageMoved(); --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/nodewidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/nodewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/nodewidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/nodewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,156 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "nodewidget.h" -- --// app includes --#include "debug_utils.h" --#include "node.h" --#include "umlscene.h" --#include "umlview.h" -- --// qt includes --#include --#include -- --DEBUG_REGISTER_DISABLED(NodeWidget) -- --/** -- * Constructs a NodeWidget. -- * -- * @param scene The parent of this NodeWidget. -- * @param n The UMLNode this will be representing. -- */ --NodeWidget::NodeWidget(UMLScene * scene, UMLNode *n) -- : UMLWidget(scene, WidgetBase::wt_Node, n) --{ -- setSize(100, 30); -- setZValue(1); // above box but below UMLWidget because may embed widgets --} -- --/** -- * Destructor. -- */ --NodeWidget::~NodeWidget() --{ --} -- --/** -- * Overrides standard method. -- */ --void NodeWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) { -- painter->setBrush(UMLWidget::fillColor()); -- } else { -- painter->setBrush(m_scene->backgroundColor()); -- } -- const int w = width(); -- const int h = height(); -- const int wDepth = (w/3 > DEPTH ? DEPTH : w/3); -- const int hDepth = (h/3 > DEPTH ? DEPTH : h/3); -- const int bodyOffsetY = hDepth; -- const int bodyWidth = w - wDepth; -- const int bodyHeight = h - hDepth; -- QFont font = UMLWidget::font(); -- font.setBold(true); -- const QFontMetrics &fm = getFontMetrics(FT_BOLD); -- const int fontHeight = fm.lineSpacing(); -- QString nameStr = name(); -- -- QPolygon pointArray(5); -- pointArray.setPoint(0, 0, bodyOffsetY); -- pointArray.setPoint(1, wDepth, 0); -- pointArray.setPoint(2, w, 0); -- pointArray.setPoint(3, w, bodyHeight); -- pointArray.setPoint(4, bodyWidth, h); -- painter->drawPolygon(pointArray); -- painter->drawRect(0, bodyOffsetY, bodyWidth, bodyHeight); -- painter->drawLine(w, 0, bodyWidth, bodyOffsetY); -- -- painter->setPen(textColor()); -- painter->setFont(font); -- -- int lines = 1; -- if (m_umlObject) { -- QString stereotype = m_umlObject->stereotype(); -- if (!stereotype.isEmpty()) { -- painter->drawText(0, bodyOffsetY + (bodyHeight/2) - fontHeight, -- bodyWidth, fontHeight, Qt::AlignCenter, m_umlObject->stereotype(true)); -- lines = 2; -- } -- } -- -- if (UMLWidget::isInstance()) { -- font.setUnderline(true); -- painter->setFont(font); -- nameStr = UMLWidget::instanceName() + QLatin1String(" : ") + nameStr; -- } -- -- if (lines == 1) { -- painter->drawText(0, bodyOffsetY + (bodyHeight/2) - (fontHeight/2), -- bodyWidth, fontHeight, Qt::AlignCenter, nameStr); -- } else { -- painter->drawText(0, bodyOffsetY + (bodyHeight/2), -- bodyWidth, fontHeight, Qt::AlignCenter, nameStr); -- } -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF NodeWidget::minimumSize() const --{ -- if (m_umlObject == NULL) { -- DEBUG(DBG_SRC) << "m_umlObject is NULL"; -- return UMLWidget::minimumSize(); -- } -- -- const QFontMetrics &fm = getFontMetrics(FT_BOLD_ITALIC); -- const int fontHeight = fm.lineSpacing(); -- -- QString name = m_umlObject->name(); -- if (UMLWidget::isInstance()) { -- name = UMLWidget::instanceName() + QLatin1String(" : ") + name; -- } -- -- int width = fm.width(name) + 2 * defaultMargin; -- -- int tempWidth = 0; -- if (!m_umlObject->stereotype().isEmpty()) { -- tempWidth = fm.width(m_umlObject->stereotype(true)); -- } -- if (tempWidth > width) -- width = tempWidth; -- width += DEPTH; -- -- int height = (2*fontHeight) + DEPTH; -- -- return QSizeF(width, height); --} -- --/** -- * Saves to the "nodewidget" XMI element. -- * Note: For loading we use the method inherited from UMLWidget. -- */ --void NodeWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement conceptElement = qDoc.createElement(QLatin1String("nodewidget")); -- UMLWidget::saveToXMI(qDoc, conceptElement); -- qElement.appendChild(conceptElement); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/nodewidget.h umbrello-kf6-15.08.1/umbrello/widgets/nodewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/nodewidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/nodewidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,44 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef NODEWIDGET_H --#define NODEWIDGET_H -- --#include "umlwidget.h" -- --class UMLNode; -- --/** -- * Defines a graphical version of the Node. Most of the functionality -- * will come from the @ref UMLNode class. -- * -- * @short A graphical version of a Node. -- * @author Jonathan Riddell -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class NodeWidget : public UMLWidget --{ --public: -- -- NodeWidget(UMLScene * scene, UMLNode *n); -- virtual ~NodeWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- --protected: -- QSizeF minimumSize() const; -- -- static const int DEPTH = 30; ///< pixels on Z axis --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/notewidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/notewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/notewidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/notewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,517 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "notewidget.h" -- --// app includes --#include "debug_utils.h" --#include "docwindow.h" --#include "listpopupmenu.h" --#include "notedialog.h" --#include "uml.h" --#include "umldoc.h" --#include "umlscene.h" --#include "umlview.h" -- --// kde includes --#include --#if QT_VERSION < 0x050000 --#include --#include --#endif -- --// qt includes --#include --#if QT_VERSION >= 0x050000 --#include --#include --#endif -- --NoteWidget * NoteWidget::s_pCurrentNote; -- --/** -- * Constructs a NoteWidget. -- * -- * @param scene The parent to this widget. -- * @param noteType The NoteWidget::NoteType of this NoteWidget -- * @param id The unique id of the widget. -- * The default (-1) will prompt a new ID. -- */ --NoteWidget::NoteWidget(UMLScene * scene, NoteType noteType , Uml::ID::Type id) -- : UMLWidget(scene, WidgetBase::wt_Note, id), -- m_diagramLink(Uml::ID::None), -- m_noteType(noteType) --{ -- setZValue(20); //make sure always on top. --} -- --/** -- * Destructor. -- */ --NoteWidget::~NoteWidget() --{ --} -- --/** -- * Override default method. -- */ --void NoteWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- const int margin = 10; -- int w = width(); -- int h = height(); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- QPolygon poly(6); -- poly.setPoint(0, 0, 0); -- poly.setPoint(1, 0, h); -- poly.setPoint(2, w, h); -- poly.setPoint(3, w, margin); -- poly.setPoint(4, w - margin, 0); -- poly.setPoint(5, 0, 0); -- -- setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) { -- QBrush brush(UMLWidget::fillColor()); -- painter->setBrush(brush); -- painter->drawPolygon(poly); -- } else -- painter->drawPolyline(poly); -- painter->drawLine(w - margin, 0, w - margin, margin); -- painter->drawLine(w - margin, margin, w, margin); -- painter->setPen(textColor()); -- switch(m_noteType) { -- case NoteWidget::PreCondition : -- painter->drawText(0, margin, w, fontHeight, Qt::AlignCenter, QLatin1String("<< precondition >>")); -- break; -- case NoteWidget::PostCondition : -- painter->drawText(0, margin, w, fontHeight, Qt::AlignCenter, QLatin1String("<< postcondition >>")); -- break; -- case NoteWidget::Transformation : -- painter->drawText(0, margin, w, fontHeight, Qt::AlignCenter, QLatin1String("<< transformation >>")); -- break; -- case NoteWidget::Normal : -- default : -- break; -- } -- -- UMLWidget::paint(painter, option, widget); -- --// paintText(&p, 0, 0); -- paintTextWordWrap(painter); --} -- --/** -- * Returns the type of note. -- */ --NoteWidget::NoteType NoteWidget::noteType() const --{ -- return m_noteType; --} -- --/** -- * Converts a string to NoteWidget::NoteType. -- */ --NoteWidget::NoteType NoteWidget::stringToNoteType(const QString& noteType) --{ -- if (noteType == QLatin1String("Precondition")) -- return NoteWidget::PreCondition; -- else if (noteType == QLatin1String("Postcondition")) -- return NoteWidget::PostCondition; -- else if (noteType == QLatin1String("Transformation")) -- return NoteWidget::Transformation; -- else -- return NoteWidget::Normal; --} -- --/** -- * Sets the type of note. -- */ --void NoteWidget::setNoteType(NoteType noteType) --{ -- m_noteType = noteType; --} -- --/** -- * Sets the type of note. -- */ --void NoteWidget::setNoteType(const QString& noteType) --{ -- setNoteType(stringToNoteType(noteType)); --} -- --/** -- * Return the ID of the diagram hyperlinked to this note. -- * -- * @return ID of an UMLView, or Uml::ID::None if no -- * hyperlink is set. -- */ --Uml::ID::Type NoteWidget::diagramLink() const --{ -- return m_diagramLink; --} -- --/** -- * Set the ID of the diagram hyperlinked to this note. -- * To switch off the hyperlink, set this to Uml::id_None. -- * -- * @param viewID ID of an UMLScene. -- */ --void NoteWidget::setDiagramLink(Uml::ID::Type viewID) --{ -- UMLDoc *umldoc = UMLApp::app()->document(); -- UMLView *view = umldoc->findView(viewID); -- if (view == NULL) { -- uError() << "no view found for viewID " << Uml::ID::toString(viewID); -- return; -- } -- QString linkText(QLatin1String("Diagram: ") + view->umlScene()->name()); -- setDocumentation(linkText); -- m_diagramLink = viewID; -- update(); --} -- --/** -- * Display a dialog box to allow the user to choose the note's type. -- */ --void NoteWidget::askForNoteType(UMLWidget* &targetWidget) --{ -- static const QStringList list = QStringList() << i18n("Precondition") -- << i18n("Postcondition") -- << i18n("Transformation"); -- bool pressedOK = false; -- --#if QT_VERSION >= 0x050000 -- QString type = QInputDialog::getItem (UMLApp::app(), -- i18n("Note Type"), i18n("Select the Note Type"), list, -- 0, false, &pressedOK); --#else -- QString type = KInputDialog::getItem (i18n("Note Type"), i18n("Select the Note Type"), list, -- 0, false, &pressedOK, UMLApp::app()); --#endif -- -- if (pressedOK) { -- dynamic_cast(targetWidget)->setNoteType(type); -- } else { -- targetWidget->cleanup(); -- delete targetWidget; -- targetWidget = 0; -- } --} -- --/** -- * Loads a "notewidget" XMI element. -- */ --bool NoteWidget::loadFromXMI(QDomElement & qElement) --{ -- if (!UMLWidget::loadFromXMI(qElement)) -- return false; -- setZValue(20); //make sure always on top. -- setDocumentation(qElement.attribute(QLatin1String("text"))); -- QString diagramlink = qElement.attribute(QLatin1String("diagramlink")); -- if (!diagramlink.isEmpty()) -- m_diagramLink = Uml::ID::fromString(diagramlink); -- QString type = qElement.attribute(QLatin1String("noteType")); -- setNoteType((NoteType)type.toInt()); -- return true; --} -- --/** -- * Saves to the "notewidget" XMI element. -- */ --void NoteWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement noteElement = qDoc.createElement(QLatin1String("notewidget")); -- UMLWidget::saveToXMI(qDoc, noteElement); -- noteElement.setAttribute(QLatin1String("text"), documentation()); -- if (m_diagramLink != Uml::ID::None) -- noteElement.setAttribute(QLatin1String("diagramlink"), Uml::ID::toString(m_diagramLink)); -- noteElement.setAttribute(QLatin1String("noteType"), m_noteType); -- qElement.appendChild(noteElement); --} -- --/** -- * Show a properties dialog for a NoteWidget. -- */ --void NoteWidget::showPropertiesDialog() --{ -- NoteDialog * dlg = 0; -- UMLApp::app()->docWindow()->updateDocumentation(false); -- dlg = new NoteDialog(umlScene()->activeView(), this); -- if (dlg->exec()) { -- UMLApp::app()->docWindow()->showDocumentation(this, true); -- UMLApp::app()->document()->setModified(true); -- update(); -- } -- delete dlg; --} -- --/** -- * Will be called when a menu selection has been made from the popup -- * menu. -- * -- * @param action The action that has been selected. -- */ --void NoteWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch(sel) { -- case ListPopupMenu::mt_Rename: -- showPropertiesDialog(); -- break; -- -- default: -- UMLWidget::slotMenuSelection(action); -- break; -- } --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF NoteWidget::minimumSize() const --{ -- int width = 60; -- int height = 30; -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int textWidth = fm.width(documentation()); -- if (m_noteType == PreCondition) { -- const int widthtemp = fm.width(QLatin1String("<< precondition >>")); -- width = textWidth > widthtemp ? textWidth : widthtemp; -- width += 10; -- } -- else if (m_noteType == PostCondition) { -- const int widthtemp = fm.width(QLatin1String("<< postcondition >>")); -- width = textWidth > widthtemp ? textWidth : widthtemp; -- width += 10; -- } -- else if (m_noteType == Transformation) { -- const int widthtemp = fm.width(QLatin1String("<< transformation >>")); -- width = textWidth > widthtemp ? textWidth : widthtemp; -- width += 10; -- } -- return QSizeF(width, height); --} -- --/** -- * Calculate content related size of widget. -- * Overrides method from UMLWidget. -- */ --QSizeF NoteWidget::calculateSize(bool withExtensions /* = true */) const --{ -- Q_UNUSED(withExtensions) -- int width = this->width(); -- int height = this->height(); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int margin = fm.width(QLatin1String("W")); -- QSize size = fm.size (0, documentation()); -- const int textWidth = size.width(); -- if (m_noteType == PreCondition) { -- const int widthtemp = fm.width(QLatin1String("<< precondition >>")); -- width = textWidth > widthtemp ? textWidth : widthtemp; -- width += 2 * margin; -- } -- else if (m_noteType == PostCondition) { -- const int widthtemp = fm.width(QLatin1String("<< postcondition >>")); -- width = textWidth > widthtemp ? textWidth : widthtemp; -- width += 2 * margin; -- } -- else if (m_noteType == Transformation) { -- const int widthtemp = fm.width(QLatin1String("<< transformation >>")); -- width = textWidth > widthtemp ? textWidth : widthtemp; -- width += 2 * margin; -- } -- return QSizeF(width, height); --} -- --/** -- * Paints the text. Auxiliary to paint(). -- * Implemented without word wrap. -- */ --void NoteWidget::paintText(QPainter *painter) --{ -- if (painter == 0) { -- return; -- } -- -- QString text = documentation(); -- if (text.length() == 0) { -- return; -- } -- -- painter->setPen(Qt::black); -- QFont font = UMLWidget::font(); -- painter->setFont(font); -- -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- const int margin = fm.width(QLatin1String("W")); -- const QSize textSize = fm.size(Qt::TextExpandTabs, text); -- -- const int width = this->width() - margin * 2; -- const int height = this->height() - fontHeight; -- int textY = fontHeight / 2; -- int textX = margin; -- -- if ((textSize.width() < width) && (textSize.height() < height)) { -- // the entire text is small enough - draw it -- painter->drawText(textX, textY, -- textSize.width(), textSize.height(), -- Qt::AlignLeft, text); -- } -- else { -- // not all text can be drawn -- QStringList lines = text.split(QLatin1Char('\n')); -- foreach(const QString& line, lines) { -- int lineWidth = fm.width(line); -- if (lineWidth < width) { -- // line is small enough - draw it -- painter->drawText(textX, textY, -- textSize.width(), fontHeight, -- Qt::AlignLeft, line); -- } -- else { -- // draw a smaller line -- for(int len = line.length(); len > 0; --len) { -- QString smallerLine = line.left(len); -- int smallerLineWidth = fm.width(smallerLine); -- if (smallerLineWidth < width) { -- // line is small enough - draw it -- painter->drawText(textX, textY, -- width, fontHeight, -- Qt::AlignLeft, smallerLine); -- } -- } -- } -- textY += fontHeight; -- if (textY > height) { -- // skip the next lines - size is not enough -- break; -- } -- } -- } --} -- --/** -- * Paints the text. Auxiliary to paint(). -- * Implemented with word wrap. -- */ --void NoteWidget::paintTextWordWrap(QPainter *painter) --{ -- if (painter == 0) { -- return; -- } -- QString text = documentation(); -- if (text.length() == 0) { -- return; -- } -- // Implement word wrap for text as follows: -- // wrap at width on whole words. -- // if word is wider than width then clip word -- // if reach height exit and don't print anymore -- // start new line on \n character -- painter->setPen(Qt::black); -- QFont font = UMLWidget::font(); -- painter->setFont(font); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- QString word; -- QString fullLine; -- QString testCombineLine; -- const int margin = fm.width(QLatin1String("W")); -- int textY = fontHeight / 2; -- int textX = margin; -- const int width = this -> width() - margin * 2; -- const int height = this -> height() - fontHeight; -- QChar returnChar = QChar::fromLatin1('\n'); -- QChar c; -- -- for (int i = 0; i <= text.length(); ++i) { -- if (i < text.length()) { -- c = text[i]; -- } else { -- // all chars of text have been handled already -> -- // perform this last run to spool current content of "word" -- c = returnChar; -- } -- if (c == returnChar || c.isSpace()) { -- // new word delimiter found -> it is time to decide on word wrap -- testCombineLine = fullLine + QLatin1Char(' ') + word; -- int textWidth = fm.width(testCombineLine); -- if (textX + textWidth > width) { -- // combination of "fullLine" and "word" doesn't fit into one line -> -- // print "fullLine" in current line, update write position to next line -- // and decide then on following actions -- painter->drawText(textX, textY, -- textWidth, fontHeight, Qt::AlignLeft, fullLine); -- fullLine = word; -- word = QString(); -- // update write position -- textX = margin; -- textY += fontHeight; -- if (textY > height) -- return; -- // in case of c==newline -> -- // print "word" and set write position one additional line lower -- if (c == returnChar) { -- // print "word" - which is now "fullLine" and set to next line -- painter->drawText(textX, textY, -- textWidth, fontHeight, Qt::AlignLeft, fullLine); -- fullLine = QString(); -- textX = margin; -- textY += fontHeight; -- if(textY > height) return; -- } -- } -- else if (c == returnChar) { -- // newline found and combination of "fullLine" and "word" fits -- // in one line -- painter->drawText(textX, textY, -- textWidth, fontHeight, Qt::AlignLeft, testCombineLine); -- fullLine = word = QString(); -- textX = margin; -- textY += fontHeight; -- if (textY > height) -- return; -- } else { -- // word delimiter found, and combination of "fullLine", space and "word" fits into one line -- fullLine = testCombineLine; -- word = QString(); -- } -- } else { -- // no word delimiter found --> add current char to "word" -- if (c != QLatin1Char('\0')) -- word += c; -- } -- }//end for --} -- --/** -- * Event handler for moude double click events. -- * -- * @param event The QGraphicsSceneMouseEvent event. -- */ --void NoteWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) --{ -- if (event->button() == Qt::LeftButton) { -- if (m_diagramLink == Uml::ID::None) { -- showPropertiesDialog(); -- } else { -- UMLDoc *umldoc = UMLApp::app()->document(); -- umldoc->changeCurrentView(m_diagramLink); -- } -- event->accept(); -- } --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/notewidget.h umbrello-kf6-15.08.1/umbrello/widgets/notewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/notewidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/notewidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,83 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef NOTEWIDGET_H --#define NOTEWIDGET_H -- --//app includes --#include "umlwidget.h" -- --// Qt forward declarations --class QPainter; -- --/** -- * Displays a note box to allow multiple lines of text to be displayed. -- * These widgets are diagram specific. They will still need a unique id -- * from the @ref UMLDoc class for deletion and other purpose-kf6s. -- * -- * @short Displays a note box. -- * @author Paul Hensgen -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class NoteWidget : public UMLWidget --{ -- Q_OBJECT --public: -- -- /// This enum type is used to specify the type of note. -- enum NoteType -- { -- Normal, -- PreCondition, -- PostCondition, -- Transformation -- }; -- -- explicit NoteWidget(UMLScene * scene, NoteWidget::NoteType noteType = Normal, -- Uml::ID::Type id = Uml::ID::None); -- virtual ~NoteWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- static NoteType stringToNoteType(const QString& noteType); -- -- NoteType noteType() const; -- void setNoteType(NoteType noteType); -- void setNoteType(const QString& noteType); -- -- Uml::ID::Type diagramLink() const; -- void setDiagramLink(Uml::ID::Type viewID); -- -- void askForNoteType(UMLWidget* &targetWidget); -- -- virtual void showPropertiesDialog(); -- -- virtual bool loadFromXMI(QDomElement & qElement); -- virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- -- static NoteWidget *s_pCurrentNote; -- --public Q_SLOTS: -- void slotMenuSelection(QAction* action); -- --protected: -- virtual QSizeF minimumSize() const; -- virtual QSizeF calculateSize(bool withExtensions = true) const; -- void paintText(QPainter *painter); -- void paintTextWordWrap(QPainter *painter); -- virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); -- --private: -- Uml::ID::Type m_diagramLink; ///< The diagram/scene this note links to. -- NoteType m_noteType; ///< The type of note. @see NoteWidget::NoteType --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/objectnodewidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/objectnodewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/objectnodewidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/objectnodewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,377 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "objectnodewidget.h" -- --// app includes --#include "debug_utils.h" --#include "docwindow.h" --#include "dialog_utils.h" --#include "listpopupmenu.h" --#include "objectnodedialog.h" --#include "uml.h" --#include "umldoc.h" --#include "umlscene.h" --#include "umlview.h" -- --// kde includes --#include --#if QT_VERSION < 0x050000 --#include --#endif -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#endif --#include --#include -- --#define OBJECTNODE_MARGIN 5 --#define OBJECTNODE_WIDTH 30 --#define OBJECTNODE_HEIGHT 10 -- --/** -- * Creates a Object Node widget. -- * -- * @param scene The parent of the widget. -- * @param objectNodeType The type of object node -- * @param id The ID to assign (-1 will prompt a new ID.) -- */ --ObjectNodeWidget::ObjectNodeWidget(UMLScene * scene, ObjectNodeType objectNodeType, Uml::ID::Type id) -- : UMLWidget(scene, WidgetBase::wt_ObjectNode, id) --{ -- setObjectNodeType(objectNodeType); -- setState(QString()); --} -- --/** -- * Destructor. -- */ --ObjectNodeWidget::~ObjectNodeWidget() --{ --} -- --/** -- * Overrides the standard paint event. -- */ --void ObjectNodeWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- int w = width(); -- int h = height(); -- -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- int textStartY = (h / 2) - (fontHeight / 2); -- -- setPenFromSettings(painter); -- -- if (UMLWidget::useFillColor()) { -- painter->setBrush(UMLWidget::fillColor()); -- } -- -- painter->drawRect(0, 0, w, h); -- painter->setFont(UMLWidget::font()); -- -- switch (m_objectNodeType) -- { -- case Normal : break; -- case Buffer : -- { -- painter->setPen(textColor()); -- painter->drawText(OBJECTNODE_MARGIN, (textStartY/2), w - OBJECTNODE_MARGIN * 2, fontHeight, Qt::AlignHCenter, QLatin1String("<< centralBuffer >>")); -- painter->drawText(OBJECTNODE_MARGIN, (textStartY/2) + fontHeight + 5, w - OBJECTNODE_MARGIN * 2, fontHeight, Qt::AlignHCenter, name()); -- } -- break; -- case Data : -- { -- painter->setPen(textColor()); -- painter->drawText(OBJECTNODE_MARGIN, (textStartY/2), w - OBJECTNODE_MARGIN * 2, fontHeight, Qt::AlignHCenter, QLatin1String("<< datastore >>")); -- painter->drawText(OBJECTNODE_MARGIN, (textStartY/2) + fontHeight + 5, w - OBJECTNODE_MARGIN * 2, fontHeight, Qt::AlignHCenter, name()); -- } -- break; -- case Flow : -- { -- QString objectflow_value; -- if (state() == QLatin1String("-") || state().isEmpty()) -- { -- objectflow_value = QLatin1Char(' '); -- } -- else -- { -- objectflow_value = QLatin1Char('[') + state() + QLatin1Char(']'); -- } -- -- painter->drawLine(10, h/2, w-10, h/2); -- painter->setPen(textColor()); -- painter->setFont(UMLWidget::font()); -- painter->drawText(OBJECTNODE_MARGIN, textStartY/2 - OBJECTNODE_MARGIN, w - OBJECTNODE_MARGIN * 2, fontHeight, Qt::AlignHCenter, name()); -- painter->drawText(OBJECTNODE_MARGIN, textStartY/2 + textStartY + OBJECTNODE_MARGIN, w - OBJECTNODE_MARGIN * 2, fontHeight, Qt::AlignHCenter, objectflow_value); -- } -- break; -- } -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF ObjectNodeWidget::minimumSize() const --{ -- int widthtmp = 10, height = 10, width=10; -- if (m_objectNodeType == Buffer) { -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- const int textWidth = fm.width(QLatin1String("<< centralBuffer >>")); -- const int namewidth = fm.width(name()); -- height = fontHeight * 2; -- widthtmp = textWidth > OBJECTNODE_WIDTH ? textWidth : OBJECTNODE_WIDTH; -- width = namewidth > widthtmp ? namewidth : widthtmp; -- height = height > OBJECTNODE_HEIGHT ? height : OBJECTNODE_HEIGHT; -- width += OBJECTNODE_MARGIN * 2; -- height += OBJECTNODE_MARGIN * 2 + 5; -- } else if (m_objectNodeType == Data) { -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- const int textWidth = fm.width(QLatin1String("<< datastore >>")); -- const int namewidth = fm.width(name()); -- height = fontHeight * 2; -- widthtmp = textWidth > OBJECTNODE_WIDTH ? textWidth : OBJECTNODE_WIDTH; -- width = namewidth > widthtmp ? namewidth : widthtmp; -- height = height > OBJECTNODE_HEIGHT ? height : OBJECTNODE_HEIGHT; -- width += OBJECTNODE_MARGIN * 2; -- height += OBJECTNODE_MARGIN * 2 + 5; -- } else if (m_objectNodeType == Flow) { -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- const int textWidth = fm.width(QLatin1Char('[') + state() + QLatin1Char(']')); -- const int namewidth = fm.width(name()); -- height = fontHeight * 2; -- widthtmp = textWidth > OBJECTNODE_WIDTH ? textWidth : OBJECTNODE_WIDTH; -- width = namewidth > widthtmp ? namewidth : widthtmp; -- height = height > OBJECTNODE_HEIGHT ? height : OBJECTNODE_HEIGHT; -- width += OBJECTNODE_MARGIN * 2; -- height += OBJECTNODE_MARGIN * 4; -- } -- -- return QSizeF(width, height); --} -- --/** -- * Returns the type of object node. -- */ --ObjectNodeWidget::ObjectNodeType ObjectNodeWidget::objectNodeType() const --{ -- return m_objectNodeType; --} -- --/** -- * Returns the type of object node. -- */ --ObjectNodeWidget::ObjectNodeType ObjectNodeWidget::toObjectNodeType(const QString& type) --{ -- if (type == QLatin1String("Central buffer")) -- return ObjectNodeWidget::Buffer; -- if (type == QLatin1String("Data store")) -- return ObjectNodeWidget::Data; -- if (type == QLatin1String("Object Flow")) -- return ObjectNodeWidget::Flow; -- // Shouldn't happen -- Q_ASSERT(0); -- return ObjectNodeWidget::Flow; --} -- --/** -- * Sets the type of object node. -- */ --void ObjectNodeWidget::setObjectNodeType(ObjectNodeType objectNodeType) --{ -- m_objectNodeType = objectNodeType; -- UMLWidget::m_resizable = true; --} -- --/** -- * Sets the type of object node. -- */ --void ObjectNodeWidget::setObjectNodeType(const QString& type) --{ -- setObjectNodeType(ObjectNodeWidget::toObjectNodeType(type)); --} -- --/** -- * Sets the state of an object node when it's an objectflow. -- */ --void ObjectNodeWidget::setState(const QString& state) --{ -- m_state = state; -- updateGeometry(); --} -- --/** -- * Returns the state of object node. -- */ --QString ObjectNodeWidget::state() const --{ -- return m_state; --} -- --/** -- * Captures any popup menu signals for menus it created. -- */ --void ObjectNodeWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch(sel) { -- case ListPopupMenu::mt_Rename: -- { -- bool ok = false; -- QString text = name(); --#if QT_VERSION >= 0x050000 -- text = QInputDialog::getText(Q_NULLPTR, -- i18n("Enter Object Node Name"), -- i18n("Enter the name of the object node :"), -- QLineEdit::Normal, -- name(), &ok); --#else -- text = KInputDialog::getText(i18n("Enter Object Node Name"), -- i18n("Enter the name of the object node :"), -- name(), &ok); --#endif -- if (ok && !text.isEmpty()) { -- setName(text); -- } -- } -- break; -- -- case ListPopupMenu::mt_Properties: -- showPropertiesDialog(); -- break; -- -- default: -- UMLWidget::slotMenuSelection(action); -- } --} -- --/** -- * Show a properties dialog for an ObjectNodeWidget. -- */ --void ObjectNodeWidget::showPropertiesDialog() --{ -- UMLApp::app()->docWindow()->updateDocumentation(false); -- -- QPointer dialog = new ObjectNodeDialog(UMLApp::app()->currentView(), this); -- if (dialog->exec() && dialog->getChangesMade()) { -- UMLApp::app()->docWindow()->showDocumentation(this, true); -- UMLApp::app()->document()->setModified(true); -- } -- delete dialog; --} -- --/** -- * Saves the widget to the "objectnodewidget" XMI element. -- */ --void ObjectNodeWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement objectNodeElement = qDoc.createElement(QLatin1String("objectnodewidget")); -- UMLWidget::saveToXMI(qDoc, objectNodeElement); -- objectNodeElement.setAttribute(QLatin1String("objectnodename"), m_Text); -- objectNodeElement.setAttribute(QLatin1String("documentation"), m_Doc); -- objectNodeElement.setAttribute(QLatin1String("objectnodetype"), m_objectNodeType); -- objectNodeElement.setAttribute(QLatin1String("objectnodestate"), m_state); -- qElement.appendChild(objectNodeElement); --} -- --/** -- * Loads the widget from the "objectnodewidget" XMI element. -- */ --bool ObjectNodeWidget::loadFromXMI(QDomElement& qElement) --{ -- if(!UMLWidget::loadFromXMI(qElement) ) -- return false; -- m_Text = qElement.attribute(QLatin1String("objectnodename")); -- m_Doc = qElement.attribute(QLatin1String("documentation")); -- QString type = qElement.attribute(QLatin1String("objectnodetype"), QLatin1String("1")); -- m_state = qElement.attribute(QLatin1String("objectnodestate")); -- setObjectNodeType((ObjectNodeType)type.toInt()); -- return true; --} -- --/** -- * Open a dialog box to select the objectNode type (Data, Buffer or Flow). -- */ --void ObjectNodeWidget::askForObjectNodeType(UMLWidget* &targetWidget) --{ -- bool pressedOK = false; -- int current = 0; -- const QStringList list = QStringList() -- << QLatin1String("Central buffer") -- << QLatin1String("Data store") -- << QLatin1String("Object Flow"); -- --#if QT_VERSION >= 0x050000 -- QString type = QInputDialog::getItem (UMLApp::app(), -- i18n("Select Object node type"), i18n("Select the object node type"), -- list, current, false, &pressedOK); -- --#else -- QString type = KInputDialog::getItem (i18n("Select Object node type"), i18n("Select the object node type"), list, current, false, &pressedOK, UMLApp::app()); --#endif -- -- if (pressedOK) { -- dynamic_cast(targetWidget)->setObjectNodeType(type); -- if (type == QLatin1String("Data store")) -- Dialog_Utils::askNameForWidget(targetWidget, i18n("Enter the name of the data store node"), i18n("Enter the name of the data store node"), i18n("data store name")); -- if (type == QLatin1String("Central buffer")) -- Dialog_Utils::askNameForWidget(targetWidget, i18n("Enter the name of the buffer node"), i18n("Enter the name of the buffer"), i18n("centralBuffer")); -- if (type == QLatin1String("Object Flow")) { -- Dialog_Utils::askNameForWidget(targetWidget, i18n("Enter the name of the object flow"), i18n("Enter the name of the object flow"), i18n("object flow")); -- askStateForWidget(); -- } -- } else { -- targetWidget->cleanup(); -- delete targetWidget; -- targetWidget = NULL; -- } --} -- --/** -- * Open a dialog box to input the state of the widget. -- * This box is shown only if m_objectNodeType = Flow. -- */ --void ObjectNodeWidget::askStateForWidget() --{ -- bool pressedOK = false; --#if QT_VERSION >= 0x050000 -- QString state = QInputDialog::getText(UMLApp::app(), -- i18n("Enter Object Flow State"), i18n("Enter State (keep '-' if there is no state for the object) "), -- QLineEdit::Normal, -- i18n("-"), &pressedOK); --#else -- QString state = KInputDialog::getText(i18n("Enter Object Flow State"), i18n("Enter State (keep '-' if there is no state for the object) "), i18n("-"), &pressedOK, UMLApp::app()); --#endif -- -- if (pressedOK) { -- setState(state); -- } else { -- cleanup(); -- } --} -- --void ObjectNodeWidget::slotOk() --{ -- // kdialog-kf6::accept(); --} -- -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/objectnodewidget.h umbrello-kf6-15.08.1/umbrello/widgets/objectnodewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/objectnodewidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/objectnodewidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,76 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef OBJECTNODEWIDGET_H --#define OBJECTNODEWIDGET_H -- --#include "umlwidget.h" -- --/** -- * This class is the graphical version of a UML Object Node. A ObjectNodeWidget is created -- * by a @ref UMLView. An ObjectNodeWidget belongs to only one @ref UMLView instance. -- * When the @ref UMLView instance that this class belongs to, it will be automatically deleted. -- * -- * The ObjectNodeWidget class inherits from the @ref UMLWidget class which adds most of the functionality -- * to this class. -- * -- * @short A graphical version of a UML Activity. -- * @author Florence Mattler -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class ObjectNodeWidget : public UMLWidget --{ -- Q_OBJECT -- --public: -- enum ObjectNodeType -- { -- Normal, -- Data, -- Buffer, -- Flow -- }; -- -- explicit ObjectNodeWidget(UMLScene * scene, ObjectNodeType objectNodeType = Normal, Uml::ID::Type id = Uml::ID::None); -- virtual ~ObjectNodeWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- ObjectNodeType objectNodeType() const; -- static ObjectNodeType toObjectNodeType(const QString& type); -- -- void setObjectNodeType(ObjectNodeType objectNodeType); -- void setObjectNodeType(const QString& type) ; -- -- void setState(const QString& state); -- QString state() const; -- -- virtual void showPropertiesDialog(); -- -- void askStateForWidget(); -- void askForObjectNodeType(UMLWidget* &targetWidget); -- -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- virtual bool loadFromXMI(QDomElement& qElement); -- --protected: -- QSizeF minimumSize() const; -- --public slots: -- void slotMenuSelection(QAction* action); -- void slotOk(); -- --private: -- ObjectNodeType m_objectNodeType; ///< type of object node -- QString m_state; ///< state of object node when it's an objectFlow -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/objectwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/objectwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/objectwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/objectwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,710 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header file --#include "objectwidget.h" -- --// local includes --#include "classpropertiesdialog.h" --#include "debug_utils.h" --#include "docwindow.h" --#include "listpopupmenu.h" --#include "messagewidget.h" --#include "seqlinewidget.h" --#include "uml.h" --#include "umldoc.h" --#include "umlobject.h" --#include "umlscene.h" --#include "umlview.h" -- --// kde includes --#include --#if QT_VERSION < 0x050000 --#include --#endif -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#endif --#include --#include --#include -- --#define O_MARGIN 5 --#define O_WIDTH 40 --#define A_WIDTH 20 --#define A_HEIGHT 40 --#define A_MARGIN 5 -- --DEBUG_REGISTER_DISABLED(ObjectWidget) -- --/** -- * The number of pixels margin between the lowest message -- * and the bottom of the vertical line -- */ --static const int sequenceLineMargin = 20; -- --/** -- * Creates an ObjectWidget. -- * -- * @param scene The parent to this object. -- * @param o The object it will be representing. -- */ --ObjectWidget::ObjectWidget(UMLScene * scene, UMLObject *o) -- : UMLWidget(scene, WidgetBase::wt_Object, o), -- m_multipleInstance(false), -- m_drawAsActor(false), -- m_showDestruction(false), -- m_isOnDestructionBox(false) --{ -- if (m_scene && (m_scene->type() == Uml::DiagramType::Sequence)) { -- m_pLine = new SeqLineWidget( m_scene, this ); -- m_pLine->setStartPoint(x() + width() / 2, y() + height()); -- } else { -- m_pLine = 0; -- } --} -- --/** -- * Destructor. -- */ --ObjectWidget::~ObjectWidget() --{ -- cleanup(); --} -- --/** -- * Sets whether representing a multi-instance object. -- * -- * @param multiple Object state. true- multi, false - single. -- */ --void ObjectWidget::setMultipleInstance(bool multiple) --{ -- //make sure only calling this in relation to an object on a collab. diagram -- if (m_scene && (m_scene->type() == Uml::DiagramType::Collaboration)) { -- m_multipleInstance = multiple; -- updateGeometry(); -- update(); -- } --} -- --/** -- * Returns whether object is representing a multi-object. -- * -- * @return True if object is representing a multi-object. -- */ --bool ObjectWidget::multipleInstance() const --{ -- return m_multipleInstance; --} -- --/** -- * Overridden from UMLWidget. -- * Moves the widget to a new position using the difference between the -- * current position and the new position. -- * Y position is ignored, and widget is only moved along X axis. -- * -- * @param diffX The difference between current X position and new X position. -- * @param diffY The difference between current Y position and new Y position -- * (isn't used). -- */ --void ObjectWidget::moveWidgetBy(qreal diffX, qreal diffY) --{ -- setX(x() + diffX); -- if (m_scene && (m_scene->type() != Uml::DiagramType::Sequence)) { -- setY(y() + diffY); -- } --} -- --/** -- * Overridden from UMLWidget. -- * Modifies the value of the diffX and diffY variables used to move the widgets. -- * All the widgets are constrained to be moved only in X axis (diffY is set to 0). -- * -- * @param diffX The difference between current X position and new X position. -- * @param diffY The difference between current Y position and new Y position. -- */ --void ObjectWidget::constrainMovementForAllWidgets(qreal &diffX, qreal &diffY) --{ -- Q_UNUSED(diffX); -- if (m_scene && (m_scene->type() == Uml::DiagramType::Sequence)) { -- diffY = 0; -- } --} -- --/** -- * Override default method. -- */ --void ObjectWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- if (m_drawAsActor) -- paintActor(painter); -- else -- paintObject(painter); -- -- setPenFromSettings(painter); -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Handles a popup menu selection. -- */ --void ObjectWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch(sel) { -- case ListPopupMenu::mt_Rename_Object: -- { -- bool ok; -- QRegExpValidator* validator = new QRegExpValidator(QRegExp(QLatin1String(".*")), 0); --#if QT_VERSION >= 0x050000 -- QString name = QInputDialog::getText(m_scene->activeView(), -- i18n("Rename Object"), -- i18n("Enter object name:"), -- QLineEdit::Normal, -- m_instanceName, -- &ok); --#else -- QString name = KInputDialog::getText -- (i18n("Rename Object"), -- i18n("Enter object name:"), -- m_instanceName, -- &ok, -- m_scene->activeView(), -- validator); --#endif -- if (ok) { -- m_instanceName = name; -- updateGeometry(); -- moveEvent(0); -- update(); -- UMLApp::app()->document()->setModified(true); -- } -- delete validator; -- break; -- } -- case ListPopupMenu::mt_Properties: -- showPropertiesDialog(); -- updateGeometry(); -- moveEvent(0); -- update(); -- break; -- -- case ListPopupMenu::mt_Up: -- tabUp(); -- break; -- -- case ListPopupMenu::mt_Down: -- tabDown(); -- break; -- -- default: -- UMLWidget::slotMenuSelection(action); -- break; -- } --} -- --/** -- * Overrides method from UMLWidget -- */ --QSizeF ObjectWidget::minimumSize() const --{ -- int width, height; -- const QFontMetrics &fm = getFontMetrics(FT_UNDERLINE); -- const int fontHeight = fm.lineSpacing(); -- const QString t = m_instanceName + QLatin1String(" : ") + name(); -- const int textWidth = fm.width(t); -- if (m_drawAsActor) { -- width = textWidth > A_WIDTH?textWidth:A_WIDTH; -- height = A_HEIGHT + fontHeight + A_MARGIN; -- width += A_MARGIN * 2; -- } else { -- width = textWidth > O_WIDTH?textWidth:O_WIDTH; -- height = fontHeight + O_MARGIN * 2; -- width += O_MARGIN * 2; -- if (m_multipleInstance) { -- width += 10; -- height += 10; -- } -- }//end else drawasactor -- -- return QSizeF(width, height); --} -- --/** -- * Sets whether to draw as an Actor. -- * -- * @param drawAsActor True if widget shall be drawn as an actor. -- */ --void ObjectWidget::setDrawAsActor(bool drawAsActor) --{ -- m_drawAsActor = drawAsActor; -- updateGeometry(); --} -- --/** -- * Returns whether to draw as an Actor or not. -- * -- * @return True if widget is drawn as an actor. -- */ --bool ObjectWidget::drawAsActor() const --{ -- return m_drawAsActor; --} -- --/** -- * Activate the object after serializing it from a QDataStream -- */ --bool ObjectWidget::activate(IDChangeLog* ChangeLog /*= 0*/) --{ -- if (! UMLWidget::activate(ChangeLog)) -- return false; -- if (m_showDestruction && m_pLine) -- m_pLine->setupDestructionBox(); -- moveEvent(0); -- return true; --} -- --/** -- * Sets the x-coordinate. -- * Reimplements the method from UMLWidget. -- * -- * @param x The x-coordinate to be set. -- */ --void ObjectWidget::setX(qreal x) --{ -- UMLWidget::setX(x); -- moveEvent(0); --} -- --/** -- * Sets the y-coordinate. -- * Reimplements the method from UMLWidget. -- * -- * @param y The y-coordinate to be set. -- */ --void ObjectWidget::setY(qreal y) --{ -- UMLWidget::setY(y); -- if (!UMLApp::app()->document()->loading()) -- moveEvent(0); --} -- --/** -- * Return the x coordinate of the widgets center. -- * @return The x-coordinate of the widget center. -- */ --qreal ObjectWidget::centerX() --{ -- return x() + width()/2; --} -- --/** -- * Overrides the standard operation. -- */ --void ObjectWidget::moveEvent(QGraphicsSceneMouseEvent *event) --{ -- Q_UNUSED(event) -- emit sigWidgetMoved(m_nLocalID); -- if (m_pLine) { -- m_pLine->setStartPoint(x() + width() / 2, y() + height()); -- } --} -- --/** -- * Overrides the standard operation. -- */ --void ObjectWidget::mousePressEvent(QGraphicsSceneMouseEvent *me) --{ -- UMLWidget::mousePressEvent(me); -- m_isOnDestructionBox = false; -- if (m_pLine && m_pLine->onDestructionBox(me->scenePos())) { -- m_isOnDestructionBox = true; -- qreal oldX = x() + width() / 2; -- qreal oldY = getEndLineY() - 10; -- m_oldPos = QPointF(oldX, oldY); -- } --} -- --/** -- * Overrides the standard operation. -- */ --void ObjectWidget::mouseMoveEvent(QGraphicsSceneMouseEvent* me) --{ -- if (m_inResizeArea) { -- DEBUG(DBG_SRC) << "resizing..."; -- resize(me); -- moveEvent(0); -- return; -- } -- -- if (m_isOnDestructionBox) { -- qreal diffY = me->scenePos().y() - m_oldPos.y(); -- moveDestructionBy(diffY); -- } -- else { -- UMLWidget::mouseMoveEvent(me); -- } --} -- --/** -- * Moves the destruction Box to a new position using the difference between the -- * current position and the new position. -- * The destruction box is only moved along Y axis. -- * -- * @param diffY The difference between current Y position and new Y position -- */ --void ObjectWidget::moveDestructionBy(qreal diffY) --{ -- // endLine = length of the life line + diffY - 10 to center on the destruction box -- qreal endLine = getEndLineY() + diffY - 10; -- SeqLineWidget *pLine = sequentialLine(); -- pLine->setEndOfLine(endLine); -- m_oldPos.setY(endLine); --} -- --/** -- * Handles a color change signal. -- */ --void ObjectWidget::slotFillColorChanged(Uml::ID::Type /*viewID*/) --{ -- UMLWidget::setFillColor(m_scene->fillColor()); -- UMLWidget::setLineColor(m_scene->lineColor()); -- -- if(m_pLine) -- m_pLine->setPen(QPen(UMLWidget::lineColor(), UMLWidget::lineWidth(), Qt::DashLine)); --} -- --/** -- * Used to cleanup any other widget it may need to delete. -- */ --void ObjectWidget::cleanup() --{ -- UMLWidget::cleanup(); -- if(m_pLine) { -- m_pLine->cleanup(); -- delete m_pLine; -- m_pLine = 0; -- } --} -- --/** -- * Show a properties dialog for an ObjectWidget. -- */ --void ObjectWidget::showPropertiesDialog() --{ -- UMLApp::app()->docWindow()->updateDocumentation(false); -- QPointer dlg = new ClassPropertiesDialog((QWidget*)UMLApp::app(), this); -- if (dlg->exec()) { -- UMLApp::app()->docWindow()->showDocumentation(this, true); -- UMLApp::app()->document()->setModified(true); -- } -- dlg->close(); -- delete dlg; --} -- --/** -- * Draw the object as an object (default). -- */ --void ObjectWidget::paintObject(QPainter *painter) --{ -- QFont oldFont = painter->font(); -- QFont font = UMLWidget::font(); -- font.setUnderline(true); -- painter->setFont(font); -- -- setPenFromSettings(painter); -- if(UMLWidget::useFillColor()) -- painter->setBrush(UMLWidget::fillColor()); -- else -- painter->setBrush(m_scene->backgroundColor()); -- const int w = width(); -- const int h = height(); -- -- const QString t = m_instanceName + QLatin1String(" : ") + name(); -- int multiInstOfst = 0; -- if (m_multipleInstance) { -- painter->drawRect(10, 10, w - 10, h - 10); -- painter->drawRect(5, 5, w - 10, h - 10); -- multiInstOfst = 10; -- } -- painter->drawRect(0, 0, w - multiInstOfst, h - multiInstOfst); -- painter->setPen(textColor()); -- painter->drawText(O_MARGIN, O_MARGIN, -- w - O_MARGIN * 2 - multiInstOfst, h - O_MARGIN * 2 - multiInstOfst, -- Qt::AlignCenter, t); -- -- painter->setFont(oldFont); --} -- --/** -- * Draw the object as an actor. -- */ --void ObjectWidget::paintActor(QPainter *painter) --{ -- const QFontMetrics &fm = getFontMetrics(FT_UNDERLINE); -- -- setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) -- painter->setBrush(UMLWidget::fillColor()); -- const int w = width(); -- const int textStartY = A_HEIGHT + A_MARGIN; -- const int fontHeight = fm.lineSpacing(); -- -- const int middleX = w / 2; -- const int thirdH = A_HEIGHT / 3; -- -- //draw actor -- painter->drawEllipse(middleX - A_WIDTH / 2, 0, A_WIDTH, thirdH);//head -- painter->drawLine(middleX, thirdH, middleX, thirdH * 2);//body -- painter->drawLine(middleX, 2 * thirdH, -- middleX - A_WIDTH / 2, A_HEIGHT);//left leg -- painter->drawLine(middleX, 2 * thirdH, -- middleX + A_WIDTH / 2, A_HEIGHT);//right leg -- painter->drawLine(middleX - A_WIDTH / 2, thirdH + thirdH / 2, -- middleX + A_WIDTH / 2, thirdH + thirdH / 2);//arms -- //draw text -- painter->setPen(textColor()); -- QString t = m_instanceName + QLatin1String(" : ") + name(); -- painter->drawText(A_MARGIN, textStartY, -- w - A_MARGIN * 2, fontHeight, Qt::AlignCenter, t); --} -- --/** -- * Move the object up on a sequence diagram. -- */ --void ObjectWidget::tabUp() --{ -- int newY = y() - height(); -- if (newY < topMargin()) -- newY = topMargin(); -- setY(newY); -- adjustAssocs(x(), newY); --} -- --/** -- * Move the object down on a sequence diagram. -- */ --void ObjectWidget::tabDown() --{ -- int newY = y() + height(); -- setY(newY); -- adjustAssocs(x(), newY); --} -- --/** -- * Returns the top margin constant (Y axis value) -- * -- * @return Y coordinate of the space between the diagram top -- * and the upper edge of the ObjectWidget. -- */ --int ObjectWidget::topMargin() --{ -- return 80 - height(); --} -- --/** -- * Returns whether or not the widget can be moved vertically up. -- * -- * @return True if widget can be moved upwards vertically. -- */ --bool ObjectWidget::canTabUp() --{ -- return (y() > topMargin()); --} -- --/** -- * Sets whether to show deconstruction on sequence line. -- * -- * @param bShow True if destruction on line shall be shown. -- */ --void ObjectWidget::setShowDestruction(bool bShow) --{ -- m_showDestruction = bShow; -- if(m_pLine) -- m_pLine->setupDestructionBox(); --} -- --/** -- * Returns whether to show deconstruction on sequence line. -- * -- * @return True if destruction on sequence line is shown. -- */ --bool ObjectWidget::showDestruction() const --{ -- return m_showDestruction; --} -- --/** -- * Sets the y position of the bottom of the vertical line. -- * -- * @param yPosition The y coordinate for the bottom of the line. -- */ --void ObjectWidget::setEndLine(int yPosition) --{ -- if (m_pLine) { -- m_pLine->setEndOfLine(yPosition); -- } --} -- --/** -- * Returns the end Y co-ord of the sequence line. -- * -- * @return Y coordinate of the endpoint of the sequence line. -- */ --int ObjectWidget::getEndLineY() --{ -- int y = this->y() + height(); -- if(m_pLine) -- y += m_pLine->getLineLength(); -- if (m_showDestruction) -- y += 10; -- return y; --} -- --/** -- * Add a message widget to the list. -- * -- * @param message Pointer to the MessageWidget to add. -- */ --void ObjectWidget::messageAdded(MessageWidget* message) --{ -- if (m_messages.count(message)) { -- uError() << message->name() << ": duplicate entry !"; -- return ; -- } -- m_messages.append(message); --} -- --/** -- * Remove a message widget from the list. -- * -- * @param message Pointer to the MessageWidget to remove. -- */ --void ObjectWidget::messageRemoved(MessageWidget* message) --{ -- if (m_messages.removeAll(message) == false) { -- uError() << message->name() << ": missing entry !"; -- return ; -- } --} -- --/** -- * Called when a message widget with an end on this object has -- * moved up or down. -- * Sets the bottom of the line to a nice position. -- */ --void ObjectWidget::slotMessageMoved() --{ -- if (m_pLine) { -- int lowestMessage = 0; -- foreach (MessageWidget* message, m_messages) { -- int messageHeight = message->y() + message->height(); -- if (lowestMessage < messageHeight) { -- lowestMessage = messageHeight; -- } -- } -- m_pLine->setEndOfLine(lowestMessage + sequenceLineMargin); -- } --} -- --/** -- * Returns whether a message is overlapping with another message. -- * Used by MessageWidget::paint() methods. -- * -- * @param y top of your message -- * @param messageWidget pointer to your message so it doesn't check against itself -- */ --bool ObjectWidget::messageOverlap(qreal y, MessageWidget* messageWidget) --{ -- foreach (MessageWidget* message, m_messages) { -- if (message == messageWidget) { -- continue; -- } -- const qreal msgY = message->y(); -- const qreal msgHeight = msgY + message->height(); -- if (y >= msgY && y <= msgHeight) { -- return true; -- } -- } -- return false; --} -- --/** -- * Return the SeqLineWidget. -- * Returns a non NULL pointer if this ObjectWidget is part of a -- * sequence diagram. -- */ --SeqLineWidget *ObjectWidget::sequentialLine() const --{ -- return m_pLine; --} -- --/** -- * Overridden from UMLWidget. -- * Returns the cursor to be shown when resizing the widget. -- * The cursor shown is KCursor::sizeHorCursor(). -- * -- * @return The cursor to be shown when resizing the widget. -- */ --QCursor ObjectWidget::resizeCursor() const --{ -- return Qt::SizeHorCursor; --} -- --/** -- * Overridden from UMLWidget. -- * Resizes the width of the object widget. -- * Object widgets can only be resized horizontally, so height isn't modified. -- * -- * @param newW The new width for the widget. -- * @param newH The new height for the widget (isn't used). -- */ --void ObjectWidget::resizeWidget(qreal newW, qreal newH) --{ -- Q_UNUSED(newH); -- setSize(newW, height()); --} -- --/** -- * Saves to the "objectwidget" XMI element. -- */ --void ObjectWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement objectElement = qDoc.createElement(QLatin1String("objectwidget")); -- UMLWidget::saveToXMI(qDoc, objectElement); -- objectElement.setAttribute(QLatin1String("drawasactor"), m_drawAsActor); -- objectElement.setAttribute(QLatin1String("multipleinstance"), m_multipleInstance); -- objectElement.setAttribute(QLatin1String("decon"), m_showDestruction); -- qElement.appendChild(objectElement); --} -- --/** -- * Loads from a "objectwidget" XMI element. -- */ --bool ObjectWidget::loadFromXMI(QDomElement& qElement) --{ -- if(!UMLWidget::loadFromXMI(qElement)) -- return false; -- QString draw = qElement.attribute(QLatin1String("drawasactor"), QLatin1String("0")); -- QString multi = qElement.attribute(QLatin1String("multipleinstance"), QLatin1String("0")); -- QString decon = qElement.attribute(QLatin1String("decon"), QLatin1String("0")); -- -- m_drawAsActor = (bool)draw.toInt(); -- m_multipleInstance = (bool)multi.toInt(); -- m_showDestruction = (bool)decon.toInt(); -- return true; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/objectwidget.h umbrello-kf6-15.08.1/umbrello/widgets/objectwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/objectwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/objectwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,115 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef OBJECTWIDGET_H --#define OBJECTWIDGET_H -- --#include "messagewidgetlist.h" --#include "umlwidget.h" -- --class MessageWidget; --class SeqLineWidget; --class UMLScene; -- --/** -- * Displays an instance UMLObject of a concept. -- * -- * The local ID is needed as a it can represent a class -- * that has many objects representing it. -- * -- * @short Displays an instance of a Concept. -- * @author Paul Hensgen -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class ObjectWidget : public UMLWidget --{ -- Q_OBJECT --public: -- ObjectWidget(UMLScene *scene, UMLObject *o); -- virtual ~ObjectWidget(); -- -- virtual void setX(qreal x); -- virtual void setY(qreal y); -- -- qreal centerX(); -- -- void setMultipleInstance(bool multiple); -- bool multipleInstance() const; -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- bool activate(IDChangeLog* ChangeLog = 0); -- -- void cleanup(); -- -- void showPropertiesDialog(); -- -- void setDrawAsActor(bool drawAsActor); -- bool drawAsActor() const; -- -- void setShowDestruction(bool bShow); -- bool showDestruction() const; -- -- int topMargin(); -- -- void setEndLine(int yPosition); -- int getEndLineY(); -- -- void messageAdded(MessageWidget* message); -- void messageRemoved(MessageWidget* message); -- -- bool canTabUp(); -- -- bool messageOverlap(qreal y, MessageWidget* messageWidget); -- -- SeqLineWidget *sequentialLine() const; -- -- virtual void resizeWidget(qreal newW, qreal newH); -- -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- virtual bool loadFromXMI(QDomElement& qElement); -- --public slots: -- void slotMenuSelection(QAction* action); -- virtual void slotFillColorChanged(Uml::ID::Type viewID); -- void slotMessageMoved(); -- --protected: -- virtual void mousePressEvent(QGraphicsSceneMouseEvent *me); -- virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *me); -- -- QSizeF minimumSize() const; -- -- virtual void moveEvent(QGraphicsSceneMouseEvent *event); -- virtual void moveWidgetBy(qreal diffX, qreal diffY); -- virtual void constrainMovementForAllWidgets(qreal &diffX, qreal &diffY); -- -- virtual QCursor resizeCursor() const; -- -- void paintActor(QPainter *p); -- void paintObject(QPainter *p); -- --private: -- void tabUp(); -- void tabDown(); -- -- void moveDestructionBy(qreal diffY); -- -- SeqLineWidget* m_pLine; -- bool m_multipleInstance; ///< draw an object as a multiple object -- bool m_drawAsActor; ///< object should be drawn as an Actor or an Object -- bool m_showDestruction; ///< show object destruction on sequence diagram line -- bool m_isOnDestructionBox; ///< true when a click occurred on the destruction box -- MessageWidgetList m_messages; ///< message widgets with an end on this widget -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/packagewidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/packagewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/packagewidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/packagewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,149 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "packagewidget.h" -- --// app includes --#include "debug_utils.h" --#include "package.h" --#include "uml.h" --#include "umldoc.h" --#include "umlobject.h" --#include "umlscene.h" --#include "umlview.h" -- --// qt includes --#include -- --/** -- * Constructs a PackageWidget. -- * -- * @param scene The parent of this PackageWidget. -- * @param o The UMLObject this will be representing. -- */ --PackageWidget::PackageWidget(UMLScene * scene, UMLPackage *o) -- : UMLWidget(scene, WidgetBase::wt_Package, o), -- m_pMenu(0) --{ -- setSize(100, 30); -- setZValue(1); // above box but below UMLWidget because may embed widgets -- //set defaults from m_scene -- if (m_scene) { -- //check to see if correct -- const Settings::OptionState& ops = m_scene->optionState(); -- m_showStereotype = ops.classState.showStereoType; -- } --} -- --/** -- * Destructor. -- */ --PackageWidget::~PackageWidget() --{ --} -- --/** -- * Overrides standard method. -- */ --void PackageWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) -- painter->setBrush(UMLWidget::fillColor()); -- else -- painter->setBrush(m_scene->backgroundColor()); -- -- int w = width(); -- int h = height(); -- QFont font = UMLWidget::font(); -- font.setBold(true); -- //FIXME italic is true when a package is first created until you click elsewhere, not sure why -- font.setItalic(false); -- const QFontMetrics &fm = getFontMetrics(FT_BOLD); -- const int fontHeight = fm.lineSpacing(); -- -- painter->drawRect(0, 0, 50, fontHeight); -- if (m_umlObject != NULL -- && m_umlObject->stereotype() == QLatin1String("subsystem")) { -- -- const int fHalf = fontHeight / 2; -- const int symY = fHalf; -- const int symX = 38; -- painter->drawLine(symX, symY, symX, symY + fHalf - 2); // left leg -- painter->drawLine(symX + 8, symY, symX + 8, symY + fHalf - 2); // right leg -- painter->drawLine(symX, symY, symX + 8, symY); // waist -- painter->drawLine(symX + 4, symY, symX + 4, symY - fHalf + 2); // head -- } -- painter->drawRect(0, fontHeight - 1, w, h - fontHeight); -- -- painter->setPen(textColor()); -- painter->setFont(font); -- -- int lines = 1; -- if (m_umlObject != NULL) { -- QString stereotype = m_umlObject->stereotype(); -- if (!stereotype.isEmpty()) { -- painter->drawText(0, fontHeight + PACKAGE_MARGIN, -- w, fontHeight, Qt::AlignCenter, m_umlObject->stereotype(true)); -- lines = 2; -- } -- } -- -- painter->drawText(0, (fontHeight*lines) + PACKAGE_MARGIN, -- w, fontHeight, Qt::AlignCenter, name()); -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Overrides method from UMLWidget -- */ --QSizeF PackageWidget::minimumSize() const --{ -- if (!m_umlObject) { -- return UMLWidget::minimumSize(); -- } -- -- const QFontMetrics &fm = getFontMetrics(FT_BOLD_ITALIC); -- const int fontHeight = fm.lineSpacing(); -- -- int lines = 1; -- -- int width = fm.width(m_umlObject->name()); -- -- int tempWidth = 0; -- if (!m_umlObject->stereotype().isEmpty()) { -- tempWidth = fm.width(m_umlObject->stereotype(true)); -- lines = 2; -- } -- if (tempWidth > width) -- width = tempWidth; -- width += PACKAGE_MARGIN * 2; -- if (width < 70) -- width = 70; // minumin width of 70 -- -- int height = (lines*fontHeight) + fontHeight + (PACKAGE_MARGIN * 2); -- -- return QSizeF(width, height); --} -- --/** -- * Saves to the "packagewidget" XMI element. -- */ --void PackageWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement conceptElement = qDoc.createElement(QLatin1String("packagewidget")); -- UMLWidget::saveToXMI(qDoc, conceptElement); -- qElement.appendChild(conceptElement); --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/packagewidget.h umbrello-kf6-15.08.1/umbrello/widgets/packagewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/packagewidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/packagewidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,47 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2003-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef PACKAGEWIDGET_H --#define PACKAGEWIDGET_H -- --#include "umlwidget.h" -- --class UMLPackage; --class ListPopupMenu; -- --#define PACKAGE_MARGIN 5 -- --/** -- * Defines a graphical version of the Package. Most of the -- * functionality will come from the @ref UMLPackage class. -- * -- * @short A graphical version of a Package. -- * @author Jonathan Riddell -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class PackageWidget : public UMLWidget --{ --public: -- explicit PackageWidget(UMLScene * scene, UMLPackage * o); -- virtual ~PackageWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- --protected: -- QSizeF minimumSize() const; -- --private: -- ListPopupMenu* m_pMenu; ///< the right mouse button menu --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/pinportbase.cpp umbrello-kf6-15.08.1/umbrello/widgets/pinportbase.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/pinportbase.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/pinportbase.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,378 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "pinportbase.h" -- --// app includes --#include "port.h" --#include "package.h" --#include "debug_utils.h" --#include "umldoc.h" --#include "umlscene.h" --#include "umlview.h" --#include "floatingtextwidget.h" -- --// qt includes --#include --#include -- --// sys includes --#include -- --PinPortBase::PinPortBase(UMLScene *scene, WidgetType type, UMLObject *o) -- : UMLWidget(scene, type, o) --{ -- init(); --} -- --PinPortBase::PinPortBase(UMLScene *scene, WidgetType type, UMLWidget *a, Uml::ID::Type id) -- : UMLWidget(scene, type, id) --{ -- init(a); --} -- --/** -- * Standard destructor. -- */ --PinPortBase::~PinPortBase() --{ --} -- --/** -- * Performs initializations which are common to PinWidget and PortWidget. -- */ --void PinPortBase::init(UMLWidget *owner) --{ -- m_ignoreSnapToGrid = true; -- m_ignoreSnapComponentSizeToGrid = true; -- m_resizable = false; -- m_pOw = owner; -- m_pName = NULL; -- m_motionConnected = false; -- const int edgeLength = 15; // old: (m_baseType == wt_Pin ? 10 : 15); -- const QSizeF FixedSize(edgeLength, edgeLength); -- setMinimumSize(FixedSize); -- setMaximumSize(FixedSize); -- setSize(FixedSize); --} -- --UMLWidget* PinPortBase::ownerWidget() --{ -- return m_pOw; --} -- --/** -- * Overrides method from UMLWidget in order to set a tooltip. -- * The tooltip is set to the name(). -- * The reason for using a tooltip for the name is that the size of this -- * widget is not large enough to accommodate the average name. -- */ --void PinPortBase::updateWidget() --{ -- QString strName = name(); -- uDebug() << " port name is " << strName; -- if (m_pName) { -- m_pName->setText(strName); -- } else { -- setToolTip(strName); -- } --} -- --/** -- * Overrides method from UMLWidget to set the name. -- */ --void PinPortBase::setName(const QString &strName) --{ -- UMLWidget::setName(strName); -- updateGeometry(); -- if (m_pName) { -- m_pName->setText(strName); -- } --} -- --/** -- * Overridden from UMLWidget. -- * Moves the widget to a new position using the difference between the -- * current position and the new position. -- * Movement is constrained such that the port is always attached to its -- * owner widget. -- * -- * @param diffX The difference between current X position and new X position. -- * @param diffY The difference between current Y position and new Y position. -- */ --void PinPortBase::moveWidgetBy(qreal diffX, qreal diffY) --{ -- UMLWidget* owner = ownerWidget(); -- qreal newX = x() + diffX; -- qreal newY = y() + diffY; -- uDebug() << "PinPortBase::moveWidgetBy " << diffX << "," << diffY; -- if (owner == NULL) { -- uError() << "PinPortBase::moveWidgetBy: ownerWidget() returns NULL"; -- setX(newX); -- setY(newY); -- return; -- } -- const qreal deltaTop = fabs(y() + height() - owner->y()); -- const qreal deltaBottom = fabs(owner->y() + owner->height() - y()); -- const qreal deltaLeft = fabs(x() + width() - owner->x()); -- const qreal deltaRight = fabs(owner->x() + owner->width() - x()); -- bool didAnyMovement = false; -- if (deltaTop < 1.0 || deltaBottom < 1.0) { -- if (newX < owner->x() - width()) -- newX = owner->x() - width(); -- else if (newX > owner->x() + owner->width()) -- newX = owner->x() + owner->width(); -- setX(newX); -- didAnyMovement = true; -- } -- if (deltaLeft < 1.0 || deltaRight < 1.0) { -- if (newY < owner->y() - height()) -- newY = owner->y() - height(); -- else if (newY > owner->y() + owner->height()) -- newY = owner->y() + owner->height(); -- setY(newY); -- didAnyMovement = true; -- } -- if (!didAnyMovement) { -- uDebug() << "constraint failed for (" << diffX << ", " << diffY << ")"; -- setX(newX); -- setY(newY); -- } --} -- --/** -- * Align this widget's position such that it is attached at one of the -- * sides of its owner's widget. -- */ --void PinPortBase::attachToOwner() { -- UMLWidget *owner = ownerWidget(); -- const QPointF scenePos = m_scene->pos(); -- if (owner == NULL) { -- uError() << "PinPortBase::attachToOwner: ownerWidget() returns NULL"; -- setX(scenePos.x()); -- setY(scenePos.y()); -- return; -- } -- bool xIsWithinOwner = false; -- if (scenePos.x() < owner->x() - width()) { -- setX(owner->x() - width()); -- } else if (scenePos.x() <= owner->x() + owner->width()) { -- setX(scenePos.x()); -- xIsWithinOwner = true; -- } else { -- setX(owner->x() + owner->width()); -- } -- if (scenePos.y() < owner->y() - height()) { -- setY(owner->y() - height()); -- } else if (scenePos.y() <= owner->y() + owner->height()) { -- if (xIsWithinOwner) { -- if (scenePos.y() <= owner->y() + owner->height() / 2.0) -- setY(owner->y() - height()); -- else -- setY(owner->y() + owner->height()); -- } else { -- setY(scenePos.y()); -- } -- } else { -- setY(owner->y() + owner->height()); -- } -- -- if (m_motionConnected) { -- uDebug() << "connectOwnerMotion was already done"; -- } else { -- connectOwnerMotion(); -- m_motionConnected = true; -- } --} -- --/** -- * Overrides standard method. -- */ --void PinPortBase::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) { -- painter->setBrush(UMLWidget::fillColor()); -- } else { -- painter->setBrush(m_scene->backgroundColor()); -- } -- -- int w = width(); -- int h = height(); -- -- painter->drawRect(0, 0, w, h); -- -- UMLWidget::paint(painter, option, widget); --} -- --void PinPortBase::slotOwnerMoved(qreal diffX, qreal diffY) --{ -- setX(x() + diffX); -- setY(y() + diffY); --} -- --/** -- * Captures any popup menu signals for menus it created. -- */ --void PinPortBase::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch(sel) { -- case ListPopupMenu::mt_NameAsTooltip: -- if (m_pName) { -- action->setChecked(true); -- delete m_pName; -- m_pName = NULL; -- setToolTip(name()); -- } else { -- action->setChecked(false); -- m_pName = new FloatingTextWidget(m_scene, Uml::TextRole::Floating, name()); -- m_pName->setParentItem(this); -- m_pName->setText(name()); // to get geometry update -- m_pName->activate(); -- UMLWidget* owner = ownerWidget(); -- if (owner == NULL) { -- uError() << "PinPortBase::slotMenuSelection: ownerWidget() returns NULL"; -- setX(x()); -- setY(y()); -- } else { -- const qreal w = width(); -- const qreal h = height(); -- if (x() < owner->x()) -- m_pName->setX(-m_pName->width()); -- else if (x() >= owner->x() + owner->width()) -- m_pName->setX(w); -- else -- m_pName->setX(-m_pName->width() / 2.0 + w / 2.0); -- if (y() < owner->y()) -- m_pName->setY(-m_pName->height() - 2); -- else if (y() >= owner->y() + owner->height()) -- m_pName->setY(h); -- else -- m_pName->setY(-m_pName->height() / 2.0 + h / 2.0); -- } -- m_pName->update(); -- setToolTip(QString()); -- QToolTip::hideText(); -- } -- break; -- -- default: -- UMLWidget::slotMenuSelection(action); -- } --} -- --FloatingTextWidget *PinPortBase::floatingTextWidget() { -- return m_pName; --} -- --void PinPortBase::setFloatingTextWidget(FloatingTextWidget *ft) { -- m_pName = ft; -- if (m_pName) -- m_pName->setParentItem(this); --} -- --/** -- * Override method from UMLWidget in order to additionally check m_pName. -- * -- * @param p Point to be checked. -- * -- * @return 'this' if UMLWidget::onWidget(p) returns non NULL; -- * m_pName if m_pName is non NULL and m_pName->onWidget(p) returns non NULL; -- * else NULL. -- */ --UMLWidget* PinPortBase::onWidget(const QPointF &p) --{ -- if (UMLWidget::onWidget(p) != NULL) -- return this; -- if (m_pName) { -- uDebug() << "floatingtext: " << m_pName->text(); -- return m_pName->onWidget(p); -- } -- return NULL; --} -- --/** -- * Reimplement function from UMLWidget -- */ --UMLWidget* PinPortBase::widgetWithID(Uml::ID::Type id) --{ -- if (UMLWidget::widgetWithID(id)) -- return this; -- if (m_pName && m_pName->widgetWithID(id)) -- return m_pName; -- return NULL; --} -- -- --/** -- * Saves the widget to the "pinwidget" or "portwidget" XMI element. -- */ --void PinPortBase::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement element = qDoc.createElement(m_baseType == wt_Pin ? QLatin1String("pinwidget") -- : QLatin1String("portwidget")); -- element.setAttribute(QLatin1String("widgetaid"), Uml::ID::toString(ownerWidget()->id())); -- UMLWidget::saveToXMI(qDoc, element); -- if (m_pName && !m_pName->text().isEmpty()) { -- m_pName->saveToXMI(qDoc, element); -- } -- qElement.appendChild(element); --} -- --/** -- * Loads from a "pinwidget" or from a "portwidget" XMI element. -- */ --bool PinPortBase::loadFromXMI(QDomElement & qElement) --{ -- if (!UMLWidget::loadFromXMI(qElement)) -- return false; -- -- QString widgetaid = qElement.attribute(QLatin1String("widgetaid"), QLatin1String("-1")); -- Uml::ID::Type aId = Uml::ID::fromString(widgetaid); -- UMLWidget *owner = m_scene->findWidget(aId); -- if (owner == NULL) { -- DEBUG(DBG_SRC) << "owner object " << Uml::ID::toString(aId) << " not found"; -- return false; -- } -- m_pOw = owner; -- -- // Optional child element: floatingtext -- QDomNode node = qElement.firstChild(); -- QDomElement element = node.toElement(); -- if (!element.isNull()) { -- QString tag = element.tagName(); -- if (tag == QLatin1String("floatingtext")) { -- m_pName = new FloatingTextWidget(m_scene, Uml::TextRole::Floating, -- name(), Uml::ID::Reserved); -- if (!m_pName->loadFromXMI(element)) { -- // Most likely cause: The FloatingTextWidget is empty. -- delete m_pName; -- m_pName = NULL; -- } else { -- m_pName->setParentItem(this); -- m_pName->activate(); -- m_pName->update(); -- } -- } else { -- uError() << "unknown tag " << tag; -- } -- } -- -- if (m_motionConnected) { -- uDebug() << "connectOwnerMotion was already done"; -- } else { -- connectOwnerMotion(); -- m_motionConnected = true; -- } -- return true; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/pinportbase.h umbrello-kf6-15.08.1/umbrello/widgets/pinportbase.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/pinportbase.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/pinportbase.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,63 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef PINPORTBASE_H --#define PINPORTBASE_H -- --#include "umlwidget.h" -- --class FloatingTextWidget; -- --/** -- * @short Abstract base class for PinWidget and PortWidget -- * @author Oliver Kellogg -- * @see UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class PinPortBase : public UMLWidget --{ -- Q_OBJECT --public: -- PinPortBase(UMLScene *scene, WidgetType type, UMLObject *o); -- PinPortBase(UMLScene *scene, WidgetType type, UMLWidget *a, Uml::ID::Type id = Uml::ID::None); -- virtual ~PinPortBase(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- virtual UMLWidget* ownerWidget(); -- virtual void connectOwnerMotion() = 0; -- -- void setName(const QString &strName); -- void updateWidget(); -- void moveWidgetBy(qreal diffX, qreal diffY); -- void attachToOwner(); -- -- UMLWidget* onWidget(const QPointF& p); -- UMLWidget* widgetWithID(Uml::ID::Type id); -- -- FloatingTextWidget *floatingTextWidget(); -- void setFloatingTextWidget(FloatingTextWidget *ft); -- -- void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- bool loadFromXMI(QDomElement& qElement); -- --public slots: -- void slotOwnerMoved(qreal diffX, qreal diffY); -- virtual void slotMenuSelection(QAction* action); -- --protected: -- void init(UMLWidget *owner = 0); -- -- UMLWidget* m_pOw; -- FloatingTextWidget *m_pName; -- bool m_motionConnected; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/pinwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/pinwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/pinwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/pinwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,103 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "pinwidget.h" -- --// app includes --#include "debug_utils.h" --#include "floatingtextwidget.h" --#include "listpopupmenu.h" --#include "umlscene.h" --#include "activitywidget.h" -- --// kde includes --#if QT_VERSION < 0x050000 --#include --#endif --#include -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#endif --#include -- --DEBUG_REGISTER_DISABLED(PinWidget) -- --/** -- * Creates a Pin widget. -- * -- * @param scene The parent of the widget. -- * @param a The widget to which this pin is attached. -- * @param id The ID to assign (-1 will prompt a new ID). -- */ --PinWidget::PinWidget(UMLScene* scene, UMLWidget* a, Uml::ID::Type id) -- : PinPortBase(scene, WidgetBase::wt_Pin, a, id) --{ -- // setParent(a); -- // m_nY = y() < getMinY() ? getMinY() : y(); -- -- m_pName = new FloatingTextWidget(m_scene, Uml::TextRole::Floating, name()); -- m_pName->setParentItem(this); -- m_pName->setText(name()); // to get geometry update -- m_pName->activate(); -- setVisible(true); --} -- --/** -- * Destructor. -- */ --PinWidget::~PinWidget() --{ --} -- --/** -- * Implement abstract function from PinPortWidget. -- */ --void PinWidget::connectOwnerMotion() --{ -- ActivityWidget *owner = static_cast(ownerWidget()); -- connect(owner, SIGNAL(sigActMoved(qreal,qreal)), this, SLOT(slotOwnerMoved(qreal,qreal))); --} -- --/** -- * Captures any popup menu signals for menus it created. -- */ --void PinWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch(sel) { -- case ListPopupMenu::mt_Rename: -- { -- bool ok = false; -- QString name = m_Text; --#if QT_VERSION >= 0x050000 -- name = QInputDialog::getText(Q_NULLPTR, -- i18n("Enter Pin Name"), -- i18n("Enter the pin name :"), -- QLineEdit::Normal, -- m_Text, &ok); --#else -- name = KInputDialog::getText(i18n("Enter Pin Name"), -- i18n("Enter the pin name :"), -- m_Text, &ok); --#endif -- if (ok) { -- setName(name); -- } -- } -- break; -- -- default: -- PinPortBase::slotMenuSelection(action); -- } --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/pinwidget.h umbrello-kf6-15.08.1/umbrello/widgets/pinwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/pinwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/pinwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,46 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef PINWIDGET_H --#define PINWIDGET_H -- --#include "pinportbase.h" -- --/** -- * This class is the graphical version of a UML Pin. A pinWidget is created -- * by a @ref UMLView. An pinWidget belongs to only one @ref UMLView instance. -- * When the @ref UMLView instance that this class belongs to, it will be automatically deleted. -- * -- * The pinWidget class inherits from the @ref UMLWidget class which adds most of the functionality -- * to this class. -- * -- * @short A graphical version of a UML pin. -- * @author Hassan KOUCH -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class PinWidget : public PinPortBase --{ -- Q_OBJECT --public: -- -- PinWidget(UMLScene* scene, UMLWidget* a, Uml::ID::Type id = Uml::ID::None); -- virtual ~PinWidget(); -- -- void connectOwnerMotion(); -- // int getMinY(); -- --public slots: -- void slotMenuSelection(QAction* action); -- --// private: -- // int m_nY; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/portwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/portwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/portwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/portwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,106 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "portwidget.h" -- --// app includes --#include "port.h" --#include "package.h" --#include "debug_utils.h" --#include "umldoc.h" --#include "umlscene.h" --#include "componentwidget.h" --#include "floatingtextwidget.h" -- --// kde includes --#if QT_VERSION < 0x050000 --#include --#endif --#include -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#endif --#include --#include -- --/** -- * Constructs a PortWidget. -- * -- * @param scene The parent of this PortWidget. -- * @param d The UMLPort this will be representing. -- */ --PortWidget::PortWidget(UMLScene *scene, UMLPort *d) -- : PinPortBase(scene, WidgetBase::wt_Port, d) --{ -- setToolTip(d->name()); --} -- --/** -- * Standard deconstructor. -- */ --PortWidget::~PortWidget() --{ --} -- --/** -- * Override function from PinPortWidget. -- */ --UMLWidget* PortWidget::ownerWidget() --{ -- if (m_pOw == NULL) { -- const Uml::ID::Type compWidgetId = m_umlObject->umlPackage()->id(); -- m_pOw = m_scene->widgetOnDiagram(compWidgetId); -- } -- return m_pOw; --} -- --/** -- * Implement abstract function from PinPortWidget. -- */ --void PortWidget::connectOwnerMotion() --{ -- ComponentWidget *owner = static_cast(ownerWidget()); -- connect(owner, SIGNAL(sigCompMoved(qreal,qreal)), this, SLOT(slotOwnerMoved(qreal,qreal))); --} -- --/** -- * Captures any popup menu signals for menus it created. -- */ --void PortWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch(sel) { -- case ListPopupMenu::mt_Rename: -- { -- bool ok = false; -- QString newName; --#if QT_VERSION >= 0x050000 -- newName = QInputDialog::getText(Q_NULLPTR, -- i18n("Enter Port Name"), i18n("Enter the port name :"), -- QLineEdit::Normal, -- name(), &ok); --#else -- newName = KInputDialog::getText(i18n("Enter Port Name"), i18n("Enter the port name :"), -- name(), &ok); --#endif -- if (ok) { -- setName(newName); -- } -- } -- break; -- -- default: -- PinPortBase::slotMenuSelection(action); -- } --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/portwidget.h umbrello-kf6-15.08.1/umbrello/widgets/portwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/portwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/portwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,42 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef PORTWIDGET_H --#define PORTWIDGET_H -- --#include "pinportbase.h" -- --class UMLPort; -- --/** -- * Defines a graphical version of the UML2 port. Most of the functionality -- * comes from the @ref PinPortBase class from which this class inherits. -- * -- * @short A graphical version of a port on a component. -- * @author Oliver Kellogg -- * @see PinPortBase, UMLWidget -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class PortWidget : public PinPortBase --{ -- Q_OBJECT --public: -- PortWidget(UMLScene *scene, UMLPort *d); -- virtual ~PortWidget(); -- -- UMLWidget* ownerWidget(); -- void connectOwnerMotion(); -- --public slots: -- void slotMenuSelection(QAction* action); -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/preconditionwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/preconditionwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/preconditionwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/preconditionwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,335 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "preconditionwidget.h" -- --// app includes --#include "debug_utils.h" --#include "listpopupmenu.h" --#include "objectwidget.h" --#include "uml.h" --#include "umlscene.h" --#include "uniqueid.h" --#include "idchangelog.h" -- --// kde includes --#if QT_VERSION < 0x050000 --#include --#endif --#include -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#endif --#include -- --DEBUG_REGISTER_DISABLED(PreconditionWidget) -- --#define PRECONDITION_MARGIN 5 --#define PRECONDITION_WIDTH 30 --#define PRECONDITION_HEIGHT 10 -- --/** -- * Creates a Precondition widget. -- * -- * @param scene The parent of the widget. -- * @param a The role A widget for this precondition. -- * @param id The ID to assign (-1 will prompt a new ID). -- */ --PreconditionWidget::PreconditionWidget(UMLScene* scene, ObjectWidget* a, Uml::ID::Type id) -- : UMLWidget(scene, WidgetBase::wt_Precondition, id), -- m_objectWidget(a) --{ -- m_ignoreSnapToGrid = true; -- m_ignoreSnapComponentSizeToGrid = true; -- m_resizable = true ; -- setVisible(true); -- //updateResizability(); -- // calculateWidget(); -- if (y() < minY()) -- m_nY = minY(); -- else if (y() > maxY()) -- m_nY = maxY(); -- else -- m_nY = y(); -- -- activate(); --} -- --/** -- * Destructor. -- */ --PreconditionWidget::~PreconditionWidget() --{ --} -- --/** -- * Overrides the standard paint event. -- */ --void PreconditionWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- int w = width(); -- int h = height(); -- -- int x = m_objectWidget->x() + m_objectWidget->width() / 2; -- x -= w/2; -- setX(x); -- int y = this->y(); -- -- //test if y isn't above the object -- if (y <= m_objectWidget->y() + m_objectWidget->height()) { -- y = m_objectWidget->y() + m_objectWidget->height() + 15; -- } -- if (y + h >= m_objectWidget->getEndLineY()) { -- y = m_objectWidget->getEndLineY() - h; -- } -- setY(y); -- setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) { -- painter->setBrush(UMLWidget::fillColor()); -- } -- { -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- const QString precondition_value = QLatin1String("{ ") + name() + QLatin1String(" }"); -- //int middleX = w / 2; -- int textStartY = (h / 2) - (fontHeight / 2); -- painter->drawRoundRect(0, 0, w, h, (h * 60) / w, 60); -- painter->setPen(textColor()); -- painter->setFont(UMLWidget::font()); -- painter->drawText(PRECONDITION_MARGIN, textStartY, -- w - PRECONDITION_MARGIN * 2, fontHeight, Qt::AlignCenter, precondition_value); -- } -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Overrides method from UMLWidget. -- */ --QSizeF PreconditionWidget::minimumSize() const --{ -- int width = 10, height = 10; -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- const int textWidth = fm.width(name()) + 25; -- height = fontHeight; -- width = textWidth > PRECONDITION_WIDTH ? textWidth : PRECONDITION_WIDTH; -- height = height > PRECONDITION_HEIGHT ? height : PRECONDITION_HEIGHT; -- width += PRECONDITION_MARGIN * 2; -- height += PRECONDITION_MARGIN * 2; -- -- return QSizeF(width, height); --} -- --/** -- * Calculate the geometry of the widget. -- */ --void PreconditionWidget::calculateWidget() --{ -- calculateDimensions(); -- -- setVisible(true); -- -- setX(m_nPosX); -- setY(m_nY); --} -- --/** -- * Activates a PreconditionWidget. Connects the WidgetMoved signal from -- * its m_objectWidget pointer so that PreconditionWidget can adjust to the move of -- * the object widget. -- */ --bool PreconditionWidget::activate(IDChangeLog * Log /*= 0*/) --{ -- m_scene->resetPastep-kf6oint(); -- UMLWidget::activate(Log); -- -- loadObjectWidget(); -- -- if (!m_objectWidget) { -- DEBUG(DBG_SRC) << "role A widget " << Uml::ID::toString(m_widgetAId) -- << " could not be found"; -- return false; -- } -- -- connect(m_objectWidget, SIGNAL(sigWidgetMoved(Uml::ID::Type)), this, SLOT(slotWidgetMoved(Uml::ID::Type))); -- -- calculateDimensions(); -- return true; --} -- --/** -- * Resolve references of this precondition so it references the correct -- * new object widget after paste. -- */ --void PreconditionWidget::resolveObjectWidget(IDChangeLog* log) { -- m_widgetAId = log->findNewID(m_widgetAId); --} -- --/** -- * Calculates the size of the widget. -- */ --void PreconditionWidget::calculateDimensions() --{ -- int x = 0; -- int w = 0; -- int h = 0; -- int x1 = m_objectWidget->x(); -- int w1 = m_objectWidget->width() / 2; -- -- x1 += w1; -- -- QSizeF q = minimumSize(); -- w = q.width() > width() ? q.width() : width(); -- h = q.height() > height() ? q.height() : height(); -- -- x = x1 - w/2; -- -- m_nPosX = x; -- -- setSize(w, h); --} -- --/** -- * Slot when widget is moved. -- */ --void PreconditionWidget::slotWidgetMoved(Uml::ID::Type id) --{ -- const Uml::ID::Type idA = m_objectWidget->localID(); -- if (idA != id) { -- DEBUG(DBG_SRC) << "id=" << Uml::ID::toString(id) << ": ignoring for idA=" << Uml::ID::toString(idA); -- return; -- } -- m_nY = y(); -- if (m_nY < minY()) -- m_nY = minY(); -- if (m_nY > maxY()) -- m_nY = maxY(); -- -- calculateDimensions(); -- if (m_scene->selectedCount(true) > 1) -- return; --} -- --/** -- * Returns the minimum height this widget should be set at on -- * a sequence diagrams. Takes into account the widget positions -- * it is related to. -- */ --int PreconditionWidget::minY() const --{ -- if (m_objectWidget) { -- return m_objectWidget->y() + m_objectWidget->height(); -- } -- return 0; --} -- --/** -- * Returns the maximum height this widget should be set at on -- * a sequence diagrams. Takes into account the widget positions -- * it is related to. -- */ --int PreconditionWidget::maxY() const --{ -- if (m_objectWidget) { -- return ((int)m_objectWidget->getEndLineY() - height()); -- } -- return 0; --} -- --/** -- * Captures any popup menu signals for menus it created. -- */ --void PreconditionWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch(sel) { -- case ListPopupMenu::mt_Rename: -- { -- bool ok = false; -- QString text = name(); --#if QT_VERSION >= 0x050000 -- text = QInputDialog::getText(Q_NULLPTR, -- i18n("Enter Precondition Name"), -- i18n("Enter the precondition :"), -- QLineEdit::Normal, -- text, &ok); --#else -- text = KInputDialog::getText(i18n("Enter Precondition Name"), -- i18n("Enter the precondition :"), -- text, &ok); --#endif -- if (ok && !text.isEmpty()) { -- setName(text); -- } -- calculateWidget(); -- } -- break; -- -- default: -- UMLWidget::slotMenuSelection(action); -- } --} -- --/** -- * Saves the widget to the "preconditionwidget" XMI element. -- */ --void PreconditionWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement preconditionElement = qDoc.createElement(QLatin1String("preconditionwidget")); -- UMLWidget::saveToXMI(qDoc, preconditionElement); -- -- preconditionElement.setAttribute(QLatin1String("widgetaid"), Uml::ID::toString(m_objectWidget->localID())); -- preconditionElement.setAttribute(QLatin1String("preconditionname"), name()); -- preconditionElement.setAttribute(QLatin1String("documentation"), documentation()); -- qElement.appendChild(preconditionElement); --} -- --/** -- * Loads the widget from the "preconditionwidget" XMI element. -- */ --bool PreconditionWidget::loadFromXMI(QDomElement& qElement) --{ -- if(!UMLWidget::loadFromXMI(qElement)) -- return false; -- QString widgetaid = qElement.attribute(QLatin1String("widgetaid"), QLatin1String("-1")); -- setName(qElement.attribute(QLatin1String("preconditionname"))); -- setDocumentation(qElement.attribute(QLatin1String("documentation"))); -- -- m_widgetAId = Uml::ID::fromString(widgetaid); -- -- // Lookup the ObjectWidget, if it can't be found, assume it will be -- // resolved later -- loadObjectWidget(); -- -- return true; --} -- --/** -- * Load the object widget from m_widgetAId -- * -- * This method is called in loadFromXMI() when loading an XMI file, and called -- * from activate() when activating a widget after pasting. -- */ --void PreconditionWidget::loadObjectWidget() --{ -- if (m_objectWidget == 0) { -- m_objectWidget = dynamic_cast( -- umlScene()->findWidget(m_widgetAId) -- ); -- } --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/preconditionwidget.h umbrello-kf6-15.08.1/umbrello/widgets/preconditionwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/preconditionwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/preconditionwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,70 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef PRECONDITIONWIDGET_H --#define PRECONDITIONWIDGET_H -- --#include "umlwidget.h" -- --class ObjectWidget; -- --/** -- * @short A graphical version of a UML Precondition (new in UML 2.0). -- * -- * This class is the graphical version of a UML Precondition. A PreconditionWidget is created -- * by a @ref UMLView. An PreconditionWidget belongs to only one @ref UMLView instance. -- * When the @ref UMLView instance that this class belongs to, it will be automatically deleted. -- * -- * The PreconditionWidget class inherits from the @ref UMLWidget class which adds most of the functionality -- * to this class. -- * -- * @author Florence Mattler -- * -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class PreconditionWidget : public UMLWidget --{ -- Q_OBJECT --public: -- PreconditionWidget(UMLScene* scene, ObjectWidget* a, Uml::ID::Type id = Uml::ID::None); -- virtual ~PreconditionWidget(); -- -- void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- int minY() const; -- int maxY() const; -- -- bool activate(IDChangeLog* Log = 0); -- void resolveObjectWidget(IDChangeLog* log); -- -- virtual void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- virtual bool loadFromXMI(QDomElement& qElement); -- -- void setObjectWidget(ObjectWidget* widget); -- --public slots: -- void slotMenuSelection(QAction* action); -- void slotWidgetMoved(Uml::ID::Type id); -- --protected: -- QSizeF minimumSize() const; -- --private: -- void calculateWidget(); -- void calculateDimensions(); -- -- ObjectWidget* m_objectWidget; -- int m_nY; -- -- Uml::ID::Type m_widgetAId; -- void loadObjectWidget(); --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/regionwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/regionwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/regionwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/regionwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,108 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "regionwidget.h" -- --// app includes --#include "basictypes.h" --#include "debug_utils.h" -- --// kde includes --#include -- --#define REGION_MARGIN 5 --#define REGION_WIDTH 90 --#define REGION_HEIGHT 45 -- --/** -- * Creates a Region widget. -- * -- * @param scene The parent of the widget. -- * @param id The ID to assign (-1 will prompt a new ID.) -- */ --RegionWidget::RegionWidget(UMLScene* scene, Uml::ID::Type id) -- : UMLWidget(scene, WidgetBase::wt_Region, id) --{ --} -- --/** -- * Destructor. -- */ --RegionWidget::~RegionWidget() --{ --} -- --/** -- * Overrides the standard paint event. -- */ --void RegionWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- const int w = width(); -- const int h = height(); -- -- setPenFromSettings(painter); -- QPen pen = painter->pen(); -- pen.setColor(Qt::red); -- pen.setStyle(Qt::DashLine); -- painter->setPen(pen); -- painter->drawRoundRect(0, 0, w, h, (h * 60) / w, 60); -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Overrides method from UMLWidget -- */ --QSizeF RegionWidget::minimumSize() const --{ -- int width = 10, height = 10; -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- int textWidth = fm.width(name()); -- -- height = fontHeight; -- width = textWidth > REGION_WIDTH?textWidth:REGION_WIDTH; -- height = height > REGION_HEIGHT ? height : REGION_HEIGHT; -- width += REGION_MARGIN * 2; -- height += REGION_MARGIN * 2; -- -- return QSizeF(width, height); --} -- --/** -- * Saves region widget to XMI element. -- */ --void RegionWidget::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) --{ -- QDomElement regionElement = qDoc.createElement(QLatin1String("regionwidget")); -- UMLWidget::saveToXMI(qDoc, regionElement); -- regionElement.setAttribute(QLatin1String("regionname"), name()); -- regionElement.setAttribute(QLatin1String("documentation"), documentation()); -- -- qElement.appendChild(regionElement); --} -- --/** -- * Loads region widget from XMI element. -- */ --bool RegionWidget::loadFromXMI(QDomElement& qElement) --{ -- if (!UMLWidget::loadFromXMI(qElement)) { -- return false; -- } -- setName(qElement.attribute(QLatin1String("regionname"))); -- setDocumentation(qElement.attribute(QLatin1String("documentation"))); -- return true; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/regionwidget.h umbrello-kf6-15.08.1/umbrello/widgets/regionwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/regionwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/regionwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,36 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * --***************************************************************************/ -- --#ifndef REGIONWIDGET_H --#define REGIONWIDGET_H -- --#include "umlwidget.h" -- --/** -- * Represents a rectangular region on Activity diagram. -- */ --class RegionWidget: public UMLWidget --{ -- Q_OBJECT --public: -- explicit RegionWidget(UMLScene* scene, Uml::ID::Type id = Uml::ID::None); -- virtual ~RegionWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- void saveToXMI(QDomDocument& qDoc, QDomElement& qElement); -- bool loadFromXMI(QDomElement& qElement); -- --protected: -- QSizeF minimumSize() const; -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/seqlinewidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/seqlinewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/seqlinewidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/seqlinewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,197 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "seqlinewidget.h" -- --//app includes --#include "messagewidget.h" --#include "objectwidget.h" --#include "umlscene.h" --#include "umlview.h" -- --//qt includes --#include -- --// class members --int const SeqLineWidget::m_nMouseDownEpsilonX = 20; -- --/** -- * Constructor. -- */ --SeqLineWidget::SeqLineWidget(UMLScene *scene, ObjectWidget * pObject) -- : QGraphicsLineItem(), -- m_scene(scene) --{ -- scene->addItem(this); -- m_pObject = pObject; -- setPen(QPen(m_pObject->lineColor(), 0, Qt::DashLine)); -- setZValue(0); -- setVisible(true); -- m_DestructionBox.line1 = 0; -- m_nLengthY = 250; -- setupDestructionBox(); --} -- --/** -- * Destructor. -- */ --SeqLineWidget::~SeqLineWidget() --{ --} -- --/** -- * Return whether point is on sequence line. -- * Takes into account destruction box if shown. -- * -- * @param p The point to investigate. -- * @return True if point is on this sequence line. -- */ --bool SeqLineWidget::onWidget(const QPointF & p) --{ -- bool isOnWidget = false; -- QPointF sp = line().p1(); -- QPointF ep = line().p2(); -- //see if on widget (for message creation) -- if (sp.x() - m_nMouseDownEpsilonX < p.x() -- && ep.x() + m_nMouseDownEpsilonX > p.x() -- && sp.y() < p.y() && ep.y() + 3 > p.y()) -- { -- isOnWidget = true; -- } -- return isOnWidget; --} -- --/** -- * Return whether point is on the destruction box. -- * -- * @param p The point to investigate. -- * @return True if point is on the destruction box of this sequence line. -- */ --bool SeqLineWidget::onDestructionBox(const QPointF & p) --{ -- bool isOnDestructionBox = false; -- int x = m_pObject->x() + m_pObject->width() / 2; -- int y = m_pObject->y() + m_pObject->height() + m_nLengthY; -- -- //see if on destruction box -- if (!m_pObject->showDestruction()) { -- return false; -- } -- if (x - 10 < p.x() && x + 10 > p.x() -- && y - 10 < p.y() && y + 10 > p.y()) -- { -- isOnDestructionBox = true; -- } -- return isOnDestructionBox; --} -- --/** -- * Clean up anything before deletion. -- */ --void SeqLineWidget::cleanup() --{ -- cleanupDestructionBox(); --} -- --/** -- * Set the start point of the line. -- * -- * @param startX X coordinate of the start point. -- * @param startY Y coordinate of the start point. -- */ --void SeqLineWidget::setStartPoint(int startX, int startY) --{ -- int endX = startX; -- int endY = startY + m_nLengthY; -- QGraphicsLineItem::setLine(startX, startY, endX, endY); -- moveDestructionBox(); --} -- --/** -- * Clean up destruction box. -- */ --void SeqLineWidget::cleanupDestructionBox() --{ -- if (m_DestructionBox.line1) { -- delete m_DestructionBox.line1; -- m_DestructionBox.line1 = 0; -- delete m_DestructionBox.line2; -- m_DestructionBox.line2 = 0; -- } --} -- --/** -- * Set up destruction box. -- */ --void SeqLineWidget::setupDestructionBox() --{ -- cleanupDestructionBox(); -- if(!m_pObject->showDestruction()) { -- return; -- } -- QRect rect; -- rect.setX(m_pObject->x() + m_pObject->width() / 2 - 10); -- rect.setY(m_pObject->y() + m_pObject->height() + m_nLengthY); -- rect.setWidth(14); -- rect.setHeight(14); -- -- m_DestructionBox.line1 = new QGraphicsLineItem; -- m_scene->addItem(m_DestructionBox.line1); -- m_DestructionBox.setLine1Points(rect); -- m_DestructionBox.line1->setVisible(true); -- m_DestructionBox.line1->setPen(QPen(m_pObject->lineColor(), 2)); -- m_DestructionBox.line1->setZValue(3); -- -- m_DestructionBox.line2 = new QGraphicsLineItem; -- m_scene->addItem(m_DestructionBox.line2); -- m_DestructionBox.setLine2Points(rect); -- m_DestructionBox.line2->setVisible(true); -- m_DestructionBox.line2->setPen(QPen(m_pObject->lineColor(), 2)); -- m_DestructionBox.line2->setZValue(3); --} -- --/** -- * Move destruction box. -- */ --void SeqLineWidget::moveDestructionBox() --{ -- if(!m_DestructionBox.line1) { -- return; -- } -- QRect rect; -- rect.setX(m_pObject->x() + m_pObject->width() / 2 - 7); -- rect.setY(m_pObject->y() + m_pObject->height() + m_nLengthY - 7); -- rect.setWidth(14); -- rect.setHeight(14); -- m_DestructionBox.setLine1Points(rect); -- m_DestructionBox.setLine2Points(rect); --} -- --/** -- * Sets the y position of the bottom of the vertical line. -- * -- * @param yPosition The y coordinate for the bottom of the line. -- */ --void SeqLineWidget::setEndOfLine(int yPosition) --{ -- QPointF sp = line().p1(); -- int newY = yPosition; -- m_nLengthY = yPosition - m_pObject->y() - m_pObject->height(); -- // normally the managing Objectwidget is responsible for the call of this function -- // but to be sure - make a double check _against current position_ -- if (m_nLengthY < 0) { -- m_nLengthY = 0; -- newY = m_pObject->y() + m_pObject->height(); -- } -- setLine(sp.x(), sp.y(), sp.x(), newY); -- moveDestructionBox(); -- m_scene->resizeSceneToItems(); --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/seqlinewidget.h umbrello-kf6-15.08.1/umbrello/widgets/seqlinewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/seqlinewidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/seqlinewidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,86 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef SEQLINEWIDGET_H --#define SEQLINEWIDGET_H -- --#include -- --class ObjectWidget; --class UMLScene; -- --/** -- * @short Widget class for graphical representation of sequence lines -- * @author Paul Hensgen -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class SeqLineWidget : public QGraphicsLineItem --{ --public: -- SeqLineWidget(UMLScene *scene, ObjectWidget * pObject); -- virtual ~SeqLineWidget(); -- -- bool onWidget(const QPointF& p); -- -- bool onDestructionBox(const QPointF& p); -- -- void cleanup(); -- -- void setupDestructionBox(); -- -- void setStartPoint(int startX, int startY); -- -- /** -- * Gets the length of the line. -- * -- * @return Length of the line. -- */ -- int getLineLength() { -- return m_nLengthY; -- } -- -- /** -- * Returns the @ref ObjectWidget associated with this sequence line. -- * -- * @return Pointer to the associated ObjectWidget. -- */ -- ObjectWidget * getObjectWidget() { -- return m_pObject; -- } -- -- void setEndOfLine(int yPosition); -- --protected: -- void cleanupDestructionBox(); -- -- void moveDestructionBox(); -- -- ObjectWidget* m_pObject; ///< ObjectWidget associated with this sequence line -- UMLScene* m_scene; ///< scene displayed on -- -- struct DestructionBox { -- QGraphicsLineItem * line1; -- QGraphicsLineItem * line2; -- void setLine1Points(QRect rect) { -- line1->setLine(rect.x(), rect.y(), -- rect.x() + rect.width(), rect.y() + rect.height()); -- } -- void setLine2Points(QRect rect) { -- line2->setLine(rect.x(), rect.y() + rect.height(), -- rect.x() + rect.width(), rect.y()); -- } -- } m_DestructionBox; ///< the destruction box -- -- int m_nLengthY; ///< the length of the line -- -- static int const m_nMouseDownEpsilonX; ///< margin used for mouse clicks --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/signalwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/signalwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/signalwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/signalwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,386 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "signalwidget.h" -- --// app includes --#include "basictypes.h" --#include "debug_utils.h" --#include "floatingtextwidget.h" --#include "linkwidget.h" --#include "listpopupmenu.h" --#include "uml.h" --#include "umldoc.h" --#include "uniqueid.h" --#include "umlview.h" --#include "umlwidget.h" -- --// kde includes --#include --#if QT_VERSION < 0x050000 --#include --#endif -- --// qt includes --#include --#if QT_VERSION >= 0x050000 --#include --#endif --#include -- --/** -- * Creates a Signal widget. -- * -- * @param scene The parent of the widget. -- * @param signalType The type of Signal. -- * @param id The ID to assign (-1 will prompt a new ID.) -- */ --SignalWidget::SignalWidget(UMLScene *scene, SignalType signalType, Uml::ID::Type id) -- : UMLWidget(scene, WidgetBase::wt_Signal, id), -- m_oldX(0), -- m_oldY(0) --{ -- m_signalType = signalType; -- m_pName = NULL; -- if (signalType == SignalWidget::Time) { -- m_pName = new FloatingTextWidget(scene, Uml::TextRole::Floating, QString()); -- scene->setupNewWidget(m_pName); -- m_pName->setX(0); -- m_pName->setY(0); -- connect(m_pName, SIGNAL(destroyed()), this, SLOT(slotTextDestroyed())); -- } --} -- --/** -- * Destructor. -- */ --SignalWidget::~SignalWidget() --{ --} -- --/** -- * Overrides the standard paint event. -- */ --void SignalWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- setPenFromSettings(painter); -- const int w = width(); -- const int h = height(); -- QPolygon a; -- switch (m_signalType) -- { -- case Send : -- if(UMLWidget::useFillColor()) -- painter->setBrush(UMLWidget::fillColor()); -- { -- a.setPoints(5, 0, 0, -- (w*2)/3, 0, -- w, h/2, -- (w*2)/3, h, -- 0, h); -- painter->drawPolygon(a); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- int textStartY = (h / 2) - (fontHeight / 2); -- -- painter->setPen(textColor()); -- QFont font = UMLWidget::font(); -- font.setBold(false); -- painter->setFont(font); -- painter->drawText(SIGNAL_MARGIN, textStartY, -- w - SIGNAL_MARGIN * 2, fontHeight, -- Qt::AlignCenter, name()); -- setPenFromSettings(painter); -- } -- break; -- case Accept : -- if(UMLWidget::useFillColor()) -- painter->setBrush(UMLWidget::fillColor()); -- { -- a.setPoints(5, 0, 0, -- w/3, h/2, -- 0, h, -- w, h, -- w, 0); -- -- painter->drawPolygon(a); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- int textStartY = (h / 2) - (fontHeight / 2); -- -- painter->setPen(textColor()); -- QFont font = UMLWidget::font(); -- font.setBold(false); -- painter->setFont(font); -- painter->drawText(SIGNAL_MARGIN, textStartY, -- w - SIGNAL_MARGIN * 2 + (w/3), fontHeight, -- Qt::AlignCenter, name()); -- setPenFromSettings(painter); -- } -- break; -- case Time : -- if(UMLWidget::useFillColor()) -- painter->setBrush(UMLWidget::fillColor()); -- { -- a.setPoints(4, 0, 0, -- w, h, -- 0, h, -- w, 0); -- -- painter->drawPolygon(a); -- //const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- //const int fontHeight = fm.lineSpacing(); -- //int textStartY = (h / 2) - (fontHeight / 2); -- painter->setPen(textColor()); -- QFont font = UMLWidget::font(); -- font.setBold(false); -- painter->setFont(font); -- -- setPenFromSettings(painter); -- } -- if (m_pName) { -- if (m_pName->x() == 0 && m_pName->y() == 0) { -- //the floating text has not been linked with the signal -- m_pName->setX(w/2 - m_pName->width()/2); -- m_pName->setY(h); -- } -- m_pName->setVisible((m_pName->text().length() > 0)); -- m_pName->updateGeometry(); -- } -- -- break; -- default: -- uWarning() << "Unknown signal type:" << m_signalType; -- break; -- } -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Overrides the UMLWidget method. -- */ --void SignalWidget::setX(qreal newX) --{ -- m_oldX = x(); -- UMLWidget::setX(newX); --} -- --/** -- * Overrides the UMLWidget method. -- */ --void SignalWidget::setY(qreal newY) --{ -- m_oldY = y(); -- UMLWidget::setY(newY); --} -- --/** -- * Sets the name of the signal. -- */ --void SignalWidget::setName(const QString &strName) --{ -- UMLWidget::setName(strName); -- updateGeometry(); -- if (signalType() == SignalWidget::Time) { -- if (!m_pName) { -- m_pName = new FloatingTextWidget(umlScene(), Uml::TextRole::Floating, m_Text); -- umlScene()->setupNewWidget(m_pName); -- m_pName->setX(0); -- m_pName->setY(0); -- connect(m_pName, SIGNAL(destroyed()), this, SLOT(slotTextDestroyed())); -- } -- else -- m_pName->setText(m_Text); -- } --} -- --/** -- * Returns the type of Signal. -- */ --SignalWidget::SignalType SignalWidget::signalType() const --{ -- return m_signalType; --} -- --/** -- * Returns the type string of Signal. -- */ --QString SignalWidget::signalTypeStr() const --{ -- return QLatin1String(ENUM_NAME(SignalWidget, SignalType, m_signalType)); --} -- --/** -- * Sets the type of Signal. -- */ --void SignalWidget::setSignalType(SignalType signalType) --{ -- m_signalType = signalType; --} -- --/** -- * Show a properties dialog for a UMLWidget. -- */ --void SignalWidget::showPropertiesDialog() --{ --} -- --/** -- * Overrides mouseMoveEvent. -- */ --void SignalWidget::mouseMoveEvent(QGraphicsSceneMouseEvent* me) --{ -- UMLWidget::mouseMoveEvent(me); -- int diffX = m_oldX - x(); -- int diffY = m_oldY - y(); -- if (m_pName!=NULL) { -- m_pName->setX(m_pName->x() - diffX); -- m_pName->setY(m_pName->y() - diffY); -- } --} -- --/** -- * Loads a "signalwidget" XMI element. -- */ --bool SignalWidget::loadFromXMI(QDomElement & qElement) --{ -- if(!UMLWidget::loadFromXMI(qElement)) -- return false; -- m_Text = qElement.attribute(QLatin1String("signalname")); -- m_Doc = qElement.attribute(QLatin1String("documentation")); -- QString type = qElement.attribute(QLatin1String("signaltype")); -- QString textid = qElement.attribute(QLatin1String("textid"), QLatin1String("-1")); -- Uml::ID::Type textId = Uml::ID::fromString(textid); -- -- setSignalType((SignalType)type.toInt()); -- if (signalType() == Time) { -- -- if (textId != Uml::ID::None) { -- UMLWidget *flotext = m_scene -> findWidget(textId); -- if (flotext != NULL) { -- // This only happens when loading files produced by -- // umbrello-kf6-1.3-beta2. -- m_pName = static_cast(flotext); -- return true; -- } -- } else { -- // no textid stored -> get unique new one -- textId = UniqueID::gen(); -- } -- } -- //now load child elements -- QDomNode node = qElement.firstChild(); -- QDomElement element = node.toElement(); -- if (!element.isNull()) { -- QString tag = element.tagName(); -- if (tag == QLatin1String("floatingtext") || tag == QLatin1String("UML::FloatingTextWidget")) { -- m_pName = new FloatingTextWidget(m_scene, Uml::TextRole::Floating, m_Text, textId); -- if(! m_pName->loadFromXMI(element)) { -- // Most likely cause: The FloatingTextWidget is empty. -- delete m_pName; -- m_pName = NULL; -- } -- else -- connect(m_pName, SIGNAL(destroyed()), this, SLOT(slotTextDestroyed())); -- } else { -- uError() << "unknown tag " << tag; -- } -- } -- return true; --} -- --/** -- * Creates the "signalwidget" XMI element. -- */ --void SignalWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement signalElement = qDoc.createElement(QLatin1String("signalwidget")); -- UMLWidget::saveToXMI(qDoc, signalElement); -- signalElement.setAttribute(QLatin1String("signalname"), m_Text); -- signalElement.setAttribute(QLatin1String("documentation"), m_Doc); -- signalElement.setAttribute(QLatin1String("signaltype"), m_signalType); -- if (m_pName && !m_pName->text().isEmpty()) { -- signalElement.setAttribute(QLatin1String("textid"), Uml::ID::toString(m_pName->id())); -- m_pName -> saveToXMI(qDoc, signalElement); -- } -- qElement.appendChild(signalElement); --} -- --/** -- * Show a properties dialog for a SignalWidget. -- * -- */ --void SignalWidget::slotMenuSelection(QAction* action) --{ -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch(sel) { -- case ListPopupMenu::mt_Rename: -- { -- bool ok = false; -- QString name = m_Text; --#if QT_VERSION >= 0x050000 -- name = QInputDialog::getText(Q_NULLPTR, -- i18n("Enter signal name"), -- i18n("Enter the signal name :"), -- QLineEdit::Normal, -- m_Text, &ok); --#else -- name = KInputDialog::getText(i18n("Enter signal name"), -- i18n("Enter the signal name :"), -- m_Text, &ok); --#endif -- if (ok && name.length() > 0) { -- setName(name); -- } -- } -- break; -- -- default: -- UMLWidget::slotMenuSelection(action); -- } --} -- --/** -- * Overrides method from UMLWidget -- */ --QSizeF SignalWidget::minimumSize() const --{ -- int width = SIGNAL_WIDTH, height = SIGNAL_HEIGHT; -- const QFontMetrics &fm = getFontMetrics(FT_BOLD); -- const int fontHeight = fm.lineSpacing(); -- int textWidth = fm.width(name()); -- -- if (m_signalType == Accept) -- textWidth = int((float)textWidth * 1.3f); -- height = fontHeight; -- if (m_signalType != Time) -- { -- width = textWidth > SIGNAL_WIDTH?textWidth:SIGNAL_WIDTH; -- height = height > SIGNAL_HEIGHT?height:SIGNAL_HEIGHT; -- } -- width += SIGNAL_MARGIN * 2; -- height += SIGNAL_MARGIN * 2; -- -- return QSizeF(width, height); --} -- --/** -- * Called if user deletes text widget -- */ --void SignalWidget::slotTextDestroyed() --{ -- m_pName = 0; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/signalwidget.h umbrello-kf6-15.08.1/umbrello/widgets/signalwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/signalwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/signalwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,86 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * --***************************************************************************/ -- --#ifndef SIGNALWIDGET_H --#define SIGNALWIDGET_H -- --#include "floatingtextwidget.h" --#include "linkwidget.h" --#include "umlwidget.h" --#include "worktoolbar.h" -- --#define SIGNAL_MARGIN 5 --#define SIGNAL_WIDTH 45 --#define SIGNAL_HEIGHT 15 -- --/** -- * Represents a Send signal, Accept signal or Time event on an -- * Activity diagram. -- */ --class SignalWidget : public UMLWidget --{ -- Q_OBJECT -- Q_ENUMS(SignalType) --public: -- /// Enumeration that codes the different types of signal. -- enum SignalType -- { -- Send = 0, -- Accept, -- Time -- }; -- -- explicit SignalWidget(UMLScene * scene, SignalType signalType = Send, Uml::ID::Type id = Uml::ID::None); -- virtual ~SignalWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- void setX(qreal newX); -- void setY(qreal newY); -- -- virtual void setName(const QString &strName); -- -- SignalType signalType() const; -- QString signalTypeStr() const; -- void setSignalType(SignalType signalType); -- -- virtual void showPropertiesDialog(); -- -- void mouseMoveEvent(QGraphicsSceneMouseEvent *me); -- -- virtual bool loadFromXMI(QDomElement & qElement); -- virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- --public Q_SLOTS: -- virtual void slotMenuSelection(QAction* action); -- --protected: -- QSizeF minimumSize() const; -- -- /** -- * Save the value of the widget to know how to move the floatingtext -- */ -- int m_oldX; -- int m_oldY; -- -- // Only for the time event -- /** -- * This is a pointer to the Floating Text widget which displays the -- * name of the signal widget. -- */ -- FloatingTextWidget* m_pName; -- -- SignalType m_signalType; ///< Type of signal -- --protected Q_SLOTS: -- void slotTextDestroyed(); --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/statewidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/statewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/statewidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/statewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,534 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "statewidget.h" -- --// app includes --#include "debug_utils.h" --#include "docwindow.h" --#include "listpopupmenu.h" --#include "statedialog.h" --#include "uml.h" --#include "umldoc.h" --#include "umlscene.h" --#include "umlview.h" --#include "umlwidget.h" -- --// kde includes --#include --#if QT_VERSION < 0x050000 --#include --#endif -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#endif --#include -- --/** -- * Creates a State widget. -- * -- * @param scene The parent of the widget. -- * @param stateType The type of state. -- * @param id The ID to assign (-1 will prompt a new ID.) -- */ --StateWidget::StateWidget(UMLScene * scene, StateType stateType, Uml::ID::Type id) -- : UMLWidget(scene, WidgetBase::wt_State, id) --{ -- m_stateType = stateType; -- m_drawVertical = true; -- setAspectRatioMode(); -- m_Text = QLatin1String("State"); -- QSizeF size = minimumSize(); -- setSize(size.width(), size.height()); --} -- --/** -- * Destructor. -- */ --StateWidget::~StateWidget() --{ --} -- --/** -- * Overrides the standard paint event. -- */ --void StateWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- const qreal w = width(); -- const qreal h = height(); -- if (w == 0 || h == 0) -- return; -- -- setPenFromSettings(painter); -- switch (m_stateType) { -- case StateWidget::Normal: -- { -- if (UMLWidget::useFillColor()) { -- painter->setBrush(UMLWidget::fillColor()); -- } -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- int textStartY = (h / 2) - (fontHeight / 2); -- const int count = m_Activities.count(); -- if (count == 0) { -- painter->drawRoundRect(0, 0, w, h, (h*40)/w, (w*40)/h); -- painter->setPen(textColor()); -- QFont font = UMLWidget::font(); -- font.setBold(false); -- painter->setFont(font); -- painter->drawText(STATE_MARGIN, textStartY, -- w - STATE_MARGIN * 2, fontHeight, -- Qt::AlignCenter, name()); -- setPenFromSettings(painter); -- } else { -- painter->drawRoundRect(0, 0, w, h, (h*40)/w, (w*40)/h); -- textStartY = STATE_MARGIN; -- painter->setPen(textColor()); -- QFont font = UMLWidget::font(); -- font.setBold(true); -- painter->setFont(font); -- painter->drawText(STATE_MARGIN, textStartY, w - STATE_MARGIN * 2, -- fontHeight, Qt::AlignCenter, name()); -- font.setBold(false); -- painter->setFont(font); -- setPenFromSettings(painter); -- int linePosY = textStartY + fontHeight; -- -- QStringList::Iterator end(m_Activities.end()); -- for(QStringList::Iterator it(m_Activities.begin()); it != end; ++it) { -- textStartY += fontHeight; -- painter->drawLine(0, linePosY, w, linePosY); -- painter->setPen(textColor()); -- painter->drawText(STATE_MARGIN, textStartY, w - STATE_MARGIN * 2, -- fontHeight, Qt::AlignCenter, *it); -- setPenFromSettings(painter); -- linePosY += fontHeight; -- }//end for -- }//end else -- } -- break; -- case StateWidget::Initial : -- painter->setBrush(WidgetBase::lineColor()); -- painter->drawEllipse(0, 0, w, h); -- break; -- case StateWidget::End : -- painter->setBrush(WidgetBase::lineColor()); -- painter->drawEllipse(0, 0, w, h); -- painter->setBrush(Qt::white); -- painter->drawEllipse(1, 1, w - 2, h - 2); -- painter->setBrush(WidgetBase::lineColor()); -- painter->drawEllipse(3, 3, w - 6, h - 6); -- break; -- case StateWidget::Fork: -- case StateWidget::Join: -- { -- painter->setPen(Qt::black); -- painter->setBrush(Qt::black); -- painter->drawRect(rect()); -- } -- break; -- case StateWidget::Junction: -- { -- painter->setPen(Qt::black); -- painter->setBrush(Qt::black); -- painter->drawEllipse(rect()); -- } -- break; -- case StateWidget::DeepHistory: -- { -- painter->setBrush(Qt::white); -- painter->drawEllipse(rect()); -- painter->setPen(Qt::black); -- painter->setFont(UMLWidget::font()); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing() / 2; -- const int xStar = fm.boundingRect(QLatin1String("H")).width(); -- const int yStar = fontHeight / 4; -- painter->drawText((w / 6), -- (h / 4) + fontHeight, QLatin1String("H")); -- painter->drawText((w / 6) + xStar, -- (h / 4) + fontHeight - yStar, QLatin1String("*")); -- } -- break; -- case StateWidget::ShallowHistory: -- { -- painter->setBrush(Qt::white); -- painter->drawEllipse(rect()); -- painter->setPen(Qt::black); -- painter->setFont(UMLWidget::font()); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing() / 2; -- painter->drawText((w / 6), -- (h / 4) + fontHeight, QLatin1String("H")); -- } -- break; -- case StateWidget::Choice: -- { -- const qreal x = w / 2; -- const qreal y = h / 2; -- QPolygonF polygon; -- polygon << QPointF(x, 0) << QPointF(w, y) -- << QPointF(x, h) << QPointF(0, y); -- painter->setBrush(UMLWidget::fillColor()); -- painter->drawPolygon(polygon); -- } -- break; -- default: -- uWarning() << "Unknown state type: " << stateTypeStr(); -- break; -- } -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Overrides method from UMLWidget -- */ --QSizeF StateWidget::minimumSize() const --{ -- int width = 10, height = 10; -- switch (m_stateType) { -- case StateWidget::Normal: -- { -- const QFontMetrics &fm = getFontMetrics(FT_BOLD); -- const int fontHeight = fm.lineSpacing(); -- int textWidth = fm.width(name()); -- const int count = m_Activities.count(); -- height = fontHeight; -- if(count > 0) { -- height = fontHeight * (count + 1); -- -- QStringList::ConstIterator end(m_Activities.end()); -- for(QStringList::ConstIterator it(m_Activities.begin()); it != end; ++it) { -- int w = fm.width(*it); -- if(w > textWidth) -- textWidth = w; -- }//end for -- }//end if -- width = textWidth > STATE_WIDTH?textWidth:STATE_WIDTH; -- height = height > STATE_HEIGHT?height:STATE_HEIGHT; -- width += STATE_MARGIN * 2; -- height += STATE_MARGIN * 2; -- break; -- } -- case StateWidget::Fork: -- case StateWidget::Join: -- if (m_drawVertical) { -- width = 8; -- height = 60; -- } else { -- width = 60; -- height = 8; -- } -- break; -- case StateWidget::Junction: -- width = 18; -- height = 18; -- break; -- case StateWidget::DeepHistory: -- case StateWidget::ShallowHistory: -- { -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- width = height = fm.lineSpacing(); -- } -- break; -- case StateWidget::Choice: -- width = 25; -- height = 25; -- break; -- default: -- break; -- } -- -- return QSizeF(width, height); --} -- --/** -- * Overrides method from UMLWidget -- */ --QSizeF StateWidget::maximumSize() --{ -- switch (m_stateType) { -- case StateWidget::Initial: -- case StateWidget::End: -- case StateWidget::Junction: -- case StateWidget::Choice: -- return QSizeF(35, 35); -- break; -- case StateWidget::DeepHistory: -- case StateWidget::ShallowHistory: -- { -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- return QSizeF(fontHeight + 10, fontHeight + 10); -- } -- break; -- default: -- break; -- } -- return UMLWidget::maximumSize(); --} -- --/** -- * Set the aspect ratio mode. -- * Some state types have a fixed aspect ratio -- */ --void StateWidget::setAspectRatioMode() --{ -- switch (m_stateType) { -- case StateWidget::Initial: -- case StateWidget::End: -- case StateWidget::Choice: -- case StateWidget::DeepHistory: -- case StateWidget::ShallowHistory: -- case StateWidget::Fork: -- case StateWidget::Join: -- case StateWidget::Junction: -- setFixedAspectRatio(true); -- break; -- default: -- setFixedAspectRatio(false); -- break; -- } --} -- --/** -- * Returns the type of state. -- * @return StateType -- */ --StateWidget::StateType StateWidget::stateType() const --{ -- return m_stateType; --} -- --/** -- * Returns the type string of state. -- */ --QString StateWidget::stateTypeStr() const --{ -- return QLatin1String(ENUM_NAME(StateWidget, StateType, m_stateType)); --} -- --/** -- * Sets the type of state. -- */ --void StateWidget::setStateType(StateType stateType) --{ -- m_stateType = stateType; -- setAspectRatioMode(); --} -- --/** -- * Adds an activity to this widget. -- * @return true on success -- */ --bool StateWidget::addActivity(const QString &activity) --{ -- m_Activities.append(activity); -- updateGeometry(); -- return true; --} -- --/** -- * Removes the given activity from the state. -- */ --bool StateWidget::removeActivity(const QString &activity) --{ -- if(m_Activities.removeAll(activity) == 0) -- return false; -- updateGeometry(); -- return true; --} -- --/** -- * Renames the given activity. -- */ --bool StateWidget::renameActivity(const QString &activity, const QString &newName) --{ -- int index = - 1; -- if((index = m_Activities.indexOf(activity)) == -1) -- return false; -- m_Activities[ index ] = newName; -- return true; --} -- --/** -- * Sets the states activities to the ones given. -- */ --void StateWidget::setActivities(const QStringList &list) --{ -- m_Activities = list; -- updateGeometry(); --} -- --/** -- * Returns the list of activities. -- */ --QStringList StateWidget::activities() const --{ -- return m_Activities; --} -- --/** -- * Get whether to draw a fork or join vertically. -- */ --bool StateWidget::drawVertical() const --{ -- return m_drawVertical; --} -- --/** -- * Set whether to draw a fork or join vertically. -- */ --void StateWidget::setDrawVertical(bool to) --{ -- m_drawVertical = to; -- setSize(height(), width()); -- updateGeometry(); -- UMLWidget::adjustAssocs(x(), y()); --} -- --/** -- * Show a properties dialog for a StateWidget. -- */ --void StateWidget::showPropertiesDialog() --{ -- UMLApp::app()->docWindow()->updateDocumentation(false); -- -- QPointer dialog = new StateDialog(m_scene->activeView(), this); -- if (dialog->exec() && dialog->getChangesMade()) { -- UMLApp::app()->docWindow()->showDocumentation(this, true); -- UMLApp::app()->document()->setModified(true); -- } -- delete dialog; --} -- --/** -- * Creates the "statewidget" XMI element. -- */ --void StateWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement stateElement = qDoc.createElement(QLatin1String("statewidget")); -- UMLWidget::saveToXMI(qDoc, stateElement); -- stateElement.setAttribute(QLatin1String("statename"), m_Text); -- stateElement.setAttribute(QLatin1String("documentation"), m_Doc); -- stateElement.setAttribute(QLatin1String("statetype"), m_stateType); -- if (m_stateType == Fork || m_stateType == Join) -- stateElement.setAttribute(QLatin1String("drawvertical"), m_drawVertical); -- //save states activities -- QDomElement activitiesElement = qDoc.createElement(QLatin1String("Activities")); -- -- QStringList::Iterator end(m_Activities.end()); -- for(QStringList::Iterator it(m_Activities.begin()); it != end; ++it) { -- QDomElement tempElement = qDoc.createElement(QLatin1String("Activity")); -- tempElement.setAttribute(QLatin1String("name"), *it); -- activitiesElement.appendChild(tempElement); -- }//end for -- stateElement.appendChild(activitiesElement); -- qElement.appendChild(stateElement); --} -- --/** -- * Loads a "statewidget" XMI element. -- */ --bool StateWidget::loadFromXMI(QDomElement & qElement) --{ -- if(!UMLWidget::loadFromXMI(qElement)) -- return false; -- m_Text = qElement.attribute(QLatin1String("statename")); -- m_Doc = qElement.attribute(QLatin1String("documentation")); -- QString type = qElement.attribute(QLatin1String("statetype"), QLatin1String("1")); -- m_stateType = (StateType)type.toInt(); -- setAspectRatioMode(); -- QString drawVertical = qElement.attribute(QLatin1String("drawvertical"), QLatin1String("1")); -- m_drawVertical = (bool)drawVertical.toInt(); -- //load states activities -- QDomNode node = qElement.firstChild(); -- QDomElement tempElement = node.toElement(); -- if(!tempElement.isNull() && tempElement.tagName() == QLatin1String("Activities")) { -- QDomNode node = tempElement.firstChild(); -- QDomElement activityElement = node.toElement(); -- while(!activityElement.isNull()) { -- if(activityElement.tagName() == QLatin1String("Activity")) { -- QString name = activityElement.attribute(QLatin1String("name")); -- if(!name.isEmpty()) -- m_Activities.append(name); -- }//end if -- node = node.nextSibling(); -- activityElement = node.toElement(); -- }//end while -- }//end if -- return true; --} -- --/** -- * Captures any popup menu signals for menus it created. -- */ --void StateWidget::slotMenuSelection(QAction* action) --{ -- bool ok = false; -- QString nameNew = name(); -- -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(action); -- switch(sel) { -- case ListPopupMenu::mt_Rename: --#if QT_VERSION >= 0x050000 -- nameNew = QInputDialog::getText(Q_NULLPTR, -- i18n("Enter State Name"), -- i18n("Enter the name of the new state:"), -- QLineEdit::Normal, -- name(), &ok); --#else -- nameNew = KInputDialog::getText(i18n("Enter State Name"), -- i18n("Enter the name of the new state:"), -- name(), &ok); --#endif -- if (ok && nameNew.length() > 0) { -- setName(nameNew); -- } -- break; -- -- case ListPopupMenu::mt_Properties: -- showPropertiesDialog(); -- break; -- -- case ListPopupMenu::mt_New_Activity: --#if QT_VERSION >= 0x050000 -- nameNew = QInputDialog::getText(Q_NULLPTR, -- i18n("Enter Activity"), -- i18n("Enter the name of the new activity:"), -- QLineEdit::Normal, -- i18n("new activity"), &ok); --#else -- nameNew = KInputDialog::getText(i18n("Enter Activity"), -- i18n("Enter the name of the new activity:"), -- i18n("new activity"), &ok); --#endif -- if (ok && nameNew.length() > 0) { -- addActivity(nameNew); -- } -- break; -- -- case ListPopupMenu::mt_Flip: -- setDrawVertical(!m_drawVertical); -- break; -- -- default: -- UMLWidget::slotMenuSelection(action); -- break; -- } --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/statewidget.h umbrello-kf6-15.08.1/umbrello/widgets/statewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/statewidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/statewidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,99 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * --***************************************************************************/ -- --#ifndef STATEWIDGET_H --#define STATEWIDGET_H -- --#include "umlwidget.h" -- --#include --#include -- --#define STATE_MARGIN 5 --#define STATE_WIDTH 30 --#define STATE_HEIGHT 10 -- --/** -- * This class is the graphical version of a UML State. -- * -- * A StateWidget is created by a @ref UMLView. A StateWidget belongs to -- * only one @ref UMLView instance. -- * When the @ref UMLView instance that this class belongs to is destroyed, -- * it will be automatically deleted. -- * -- * The StateWidget class inherits from the @ref UMLWidget class -- * which adds most of the functionality to this class. -- * -- * @short A graphical version of a UML State. -- * @author Paul Hensgen -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class StateWidget : public UMLWidget --{ -- Q_OBJECT -- Q_ENUMS(StateType) --public: -- /// Enumeration that codes the different types of state. -- enum StateType -- { -- Initial = 0, // Pseudostate -- Normal, -- End, -- Fork, // Pseudostate -- Join, // Pseudostate -- Junction, // Pseudostate -- DeepHistory, // Pseudostate -- ShallowHistory, // Pseudostate -- Choice // Pseudostate -- //Terminate // Pseudostate -- //EntryPoint // Pseudostate -- //ExitPoint // Pseudostate -- }; -- -- explicit StateWidget(UMLScene * scene, StateType stateType = Normal, Uml::ID::Type id = Uml::ID::None); -- virtual ~StateWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- StateType stateType() const; -- QString stateTypeStr() const; -- void setStateType(StateType stateType); -- -- bool addActivity(const QString &activity); -- bool removeActivity(const QString &activity); -- bool renameActivity(const QString &activity, const QString &newName); -- -- QStringList activities() const; -- void setActivities(const QStringList &list); -- -- bool drawVertical() const; -- void setDrawVertical(bool to = true); -- -- virtual void showPropertiesDialog(); -- -- virtual bool loadFromXMI(QDomElement & qElement); -- virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- --protected: -- QSizeF minimumSize() const; -- QSizeF maximumSize(); -- void setAspectRatioMode(); -- --public Q_SLOTS: -- virtual void slotMenuSelection(QAction* action); -- --private: -- StateType m_stateType; ///< Type of state. -- bool m_drawVertical; ///< whether to draw the fork/join horizontally or vertically -- QStringList m_Activities; ///< List of activities for the state. -- --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/statusbartoolbutton.cpp umbrello-kf6-15.08.1/umbrello/widgets/statusbartoolbutton.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/statusbartoolbutton.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/statusbartoolbutton.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,122 +0,0 @@ --// vim: set tabstop=4 shiftwidth=4 noexpandtab: --/* --Widget taken from gwenview-kf6 --Copyright 2007 Aurélien Gâteau -- --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-kf6. See the --GNU General Public License for more details. -- --You should have received a copy of the GNU General Public License --along with this program; if not, write to the Free Software --Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -- --*/ --// Self --#include "statusbartoolbutton.h" -- --// Qt --#include --#include --#include --#include -- --// KDE --#include -- --StatusBarToolButton::StatusBarToolButton(QWidget* parent) -- : QToolButton(parent), -- mGroupPosition(NotGrouped) --{ -- setToolButtonStyle(Qt::ToolButtonTextOnly); -- setFocusPolicy(Qt::NoFocus); -- setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); --} -- -- --QSize StatusBarToolButton::minimumSizeHint() const --{ -- return sizeHint(); --} -- -- --QSize StatusBarToolButton::sizeHint() const --{ -- QSize sh = QToolButton::sizeHint(); -- sh.setHeight(fontMetrics().height()); -- return sh; --} -- -- --void StatusBarToolButton::setGroupPosition(StatusBarToolButton::GroupPosition groupPosition) --{ -- mGroupPosition = groupPosition; --} -- -- --void StatusBarToolButton::paintEvent(QPaintEvent* event) --{ -- if (mGroupPosition == NotGrouped) { -- QToolButton::paintEvent(event); -- return; -- } -- QStylePainter painter(this); -- QStyleOptionToolButton opt; -- initStyleOption(&opt); -- QStyleOptionToolButton panelOpt = opt; -- -- // Panel -- QRect& panelRect = panelOpt.rect; -- switch (mGroupPosition) { -- case GroupLeft: -- panelRect.setWidth(panelRect.width() * 2); -- break; -- case GroupCenter: -- panelRect.setLeft(panelRect.left() - panelRect.width()); -- panelRect.setWidth(panelRect.width() * 3); -- break; -- case GroupRight: -- panelRect.setLeft(panelRect.left() - panelRect.width()); -- break; -- case NotGrouped: -- Q_ASSERT(0); -- } -- painter.drawPrimitive(QStyle::PE_PanelButtonTool, panelOpt); -- -- // Separator -- const int y1 = opt.rect.top() + 6; -- const int y2 = opt.rect.bottom() - 6; -- if (mGroupPosition & GroupRight) { -- const int x = opt.rect.left(); -- painter.setPen(opt.palette.color(QPalette::Light)); -- painter.drawLine(x, y1, x, y2); -- } -- if (mGroupPosition & GroupLeft) { -- const int x = opt.rect.right(); -- painter.setPen(opt.palette.color(QPalette::Mid)); -- painter.drawLine(x, y1, x, y2); -- } -- -- // Text -- painter.drawControl(QStyle::CE_ToolButtonLabel, opt); -- -- // Filtering message on tooltip text for CJK to remove accelerators. -- // Quoting ktoolbar.cpp: -- // """ -- // CJK languages use more verbose accelerator marker: they add a Latin -- // letter in parenthesis, and put accelerator on that. Hence, the default -- // removal of ampersand only may not be enough there, instead the whole -- // parenthesis construct should be removed. Provide these filtering i18n -- // messages so that translators can use Transcript for custom removal. -- // """ -- if (!actions().isEmpty()) { -- QAction* action = actions().first(); -- setToolTip(i18nc("@info:tooltip of custom toolbar button", "%1", action->toolTip())); -- } --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/statusbartoolbutton.h umbrello-kf6-15.08.1/umbrello/widgets/statusbartoolbutton.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/statusbartoolbutton.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/statusbartoolbutton.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,58 +0,0 @@ --// vim: set tabstop=4 shiftwidth=4 noexpandtab: --/* --gwenview-kf6: an image viewer --Copyright 2007 Aurélien Gâteau -- --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-kf6. See the --GNU General Public License for more details. -- --You should have received a copy of the GNU General Public License --along with this program; if not, write to the Free Software --Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -- --*/ --#ifndef STATUSBARTOOLBUTTON_H --#define STATUSBARTOOLBUTTON_H -- --// Qt --#include -- --/** -- * A thin tool button which can be grouped with another and look like one solid-kf6 -- * bar: -- * -- * (button1 | button2) -- */ --class StatusBarToolButton : public QToolButton --{ -- Q_OBJECT --public: -- enum GroupPosition { -- NotGrouped = 0, -- GroupLeft = 1, -- GroupRight = 2, -- GroupCenter = 3 -- }; -- -- explicit StatusBarToolButton(QWidget* parent = 0); -- -- virtual QSize minimumSizeHint() const; -- virtual QSize sizeHint() const; -- -- void setGroupPosition(StatusBarToolButton::GroupPosition groupPosition); -- --protected: -- virtual void paintEvent(QPaintEvent* event); -- --private: -- GroupPosition mGroupPosition; --}; -- --#endif /* STATUSBARTOOLBUTTON_H */ -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/toolbarstateonewidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/toolbarstateonewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/toolbarstateonewidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/toolbarstateonewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,249 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "toolbarstateonewidget.h" -- --// app includes --#include "activitywidget.h" --#include "dialog_utils.h" --#include "floatingtextwidget.h" --#include "messagewidget.h" --#include "objectwidget.h" --#include "pinwidget.h" --#include "portwidget.h" --#include "preconditionwidget.h" --#include "regionwidget.h" --#include "uml.h" --#include "umldoc.h" --#include "umlscene.h" --#include "umlwidget.h" --#include "object_factory.h" --#include "package.h" --#include "widget_factory.h" -- --// kde includes --#include --#include --#if QT_VERSION < 0x050000 --#include --#endif -- --// qt includes --#if QT_VERSION >= 0x050000 --#include --#endif -- --// using namespace Uml; -- --/** -- * Creates a new ToolBarStateOneWidget. -- * -- * @param umlScene The UMLScene to use. -- */ --ToolBarStateOneWidget::ToolBarStateOneWidget(UMLScene *umlScene) -- : ToolBarStatePool(umlScene), -- m_firstObject(0), -- m_isObjectWidgetLine(false) --{ --} -- --/** -- * Destroys this ToolBarStateOneWidget. -- */ --ToolBarStateOneWidget::~ToolBarStateOneWidget() --{ --} -- --/** -- * Called when the current tool is changed to use another tool. -- * Executes base method and cleans the message. -- */ --void ToolBarStateOneWidget::cleanBeforeChange() --{ -- ToolBarStatePool::cleanBeforeChange(); --} -- --/** -- * Called when a mouse event happened. -- * It executes the base method and then updates the position of the -- * message line, if any. -- */ --void ToolBarStateOneWidget::mouseMove(QGraphicsSceneMouseEvent* ome) --{ -- ToolBarStatePool::mouseMove(ome); --} -- --/** -- * A widget was removed from the UMLView. -- * If the widget removed was the current widget, the current widget is set -- * to 0. -- * Also, if it was the first object, the message is cleaned. -- */ --void ToolBarStateOneWidget::slotWidgetRemoved(UMLWidget* widget) --{ -- ToolBarState::slotWidgetRemoved(widget); --} -- --/** -- * Selects only widgets, but no associations. -- * Overrides base class method. -- * If the press event happened on the line of an object, the object is set -- * as current widget. If the press event happened on a widget, the widget is -- * set as current widget. -- */ --void ToolBarStateOneWidget::setCurrentElement() --{ -- m_isObjectWidgetLine = false; -- ObjectWidget* objectWidgetLine = m_pUMLScene->onWidgetLine(m_pMouseEvent->scenePos()); -- if (objectWidgetLine) { -- setCurrentWidget(objectWidgetLine); -- m_isObjectWidgetLine = true; -- return; -- } -- -- UMLWidget *widget = m_pUMLScene->widgetAt(m_pMouseEvent->scenePos()); -- if (widget) { -- setCurrentWidget(widget); -- return; -- } --} -- --/** -- * Called when the release event happened on a widget. -- * If the button pressed isn't left button or the widget isn't an object -- * widget, the message is cleaned. -- * If the release event didn't happen on the line of an object and the first -- * object wasn't selected, nothing is done. If the first object was already -- * selected, a creation message is made. -- * If the event happened on the line of an object, the first object or the -- * second are set, depending on whether the first object was already set or -- * not. -- */ --void ToolBarStateOneWidget::mouseReleaseWidget() --{ -- WidgetBase::WidgetType type = widgetType(); -- -- if (type == WidgetBase::wt_Precondition) { -- m_firstObject = 0; -- } -- if (type == WidgetBase::wt_Pin) { -- m_firstObject = 0; -- } -- -- if (m_pMouseEvent->button() != Qt::LeftButton || -- (currentWidget()->baseType() != WidgetBase::wt_Object && -- currentWidget()->baseType() != WidgetBase::wt_Activity && -- currentWidget()->baseType() != WidgetBase::wt_Component && -- currentWidget()->baseType() != WidgetBase::wt_Region)) { -- return; -- } -- -- if (!m_firstObject && type == WidgetBase::wt_Pin) { -- setWidget(currentWidget()); -- return ; -- } -- -- if (!m_isObjectWidgetLine && !m_firstObject) { -- return; -- } -- -- if (!m_firstObject) { -- setWidget(currentWidget()); -- } -- --} -- --/** -- * Called when the release event happened on an empty space. -- * Cleans the message. -- * Empty spaces are not only actual empty spaces, but also associations. -- */ --void ToolBarStateOneWidget::mouseReleaseEmpty() --{ --} -- --/** -- * Sets the first object of the message using the specified object. -- * The temporal visual message is created and mouse tracking enabled, so -- * mouse events will be delivered. -- * -- * @param firstObject The first object of the message. -- */ --void ToolBarStateOneWidget::setWidget(UMLWidget* firstObject) --{ -- m_firstObject = firstObject; -- -- UMLWidget * umlwidget = 0; -- //m_pUMLScene->viewport()->setMouseTracking(true); -- if (widgetType() == WidgetBase::wt_Precondition) { -- umlwidget = new PreconditionWidget(m_pUMLScene, static_cast(m_firstObject)); -- -- Dialog_Utils::askNameForWidget(umlwidget, i18n("Enter Precondition Name"), i18n("Enter the precondition"), i18n("new precondition")); -- // Create the widget. Some setup functions can remove the widget. -- } -- -- if (widgetType() == WidgetBase::wt_Pin) { -- if (m_firstObject->baseType() == WidgetBase::wt_Activity) { -- umlwidget = new PinWidget(m_pUMLScene, m_firstObject); -- // Create the widget. Some setup functions can remove the widget. -- } else if (m_firstObject->baseType() == WidgetBase::wt_Component) { -- bool pressedOK = false; --#if QT_VERSION >= 0x050000 -- QString name = QInputDialog::getText(UMLApp::app(), -- i18n("Enter Port Name"), i18n("Enter the port"), -- QLineEdit::Normal, -- i18n("new port"), -- &pressedOK); --#else -- QString name = KInputDialog::getText(i18n("Enter Port Name"), i18n("Enter the port"), i18n("new port"), -- &pressedOK, UMLApp::app()); --#endif -- if (pressedOK) { -- UMLPackage* component = static_cast(m_firstObject->umlObject()); -- UMLObject *port = Object_Factory::createUMLObject(UMLObject::ot_Port, name, component); -- umlwidget = Widget_Factory::createWidget(m_pUMLScene, port); -- } -- } -- } -- -- if (umlwidget) { -- m_pUMLScene->setupNewWidget(umlwidget); -- } -- --} -- --/** -- * Returns the widget type of this tool. -- * -- * @return The widget type of this tool. -- */ --WidgetBase::WidgetType ToolBarStateOneWidget::widgetType() --{ -- if (getButton() == WorkToolBar::tbb_Seq_Precondition) { -- return WidgetBase::wt_Precondition; -- } -- -- if (getButton() == WorkToolBar::tbb_Pin) { -- return WidgetBase::wt_Pin; -- } -- // Shouldn't happen -- Q_ASSERT(0); -- return WidgetBase::wt_Pin; --} -- --/** -- * Goes back to the initial state. -- */ --void ToolBarStateOneWidget::init() --{ -- ToolBarStatePool::init(); --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/toolbarstateonewidget.h umbrello-kf6-15.08.1/umbrello/widgets/toolbarstateonewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/toolbarstateonewidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/toolbarstateonewidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,59 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef TOOLBARSTATEONEWIDGET_H --#define TOOLBARSTATEONEWIDGET_H -- --#include "toolbarstatepool.h" --#include "widgetbase.h" -- --/** -- * Sequence tool to create components linked with one object in sequence diagram -- * like precondition. -- * With sequence tool, one objects is selected clicking with left button on -- * it -- */ --class ToolBarStateOneWidget : public ToolBarStatePool --{ -- Q_OBJECT --public: -- explicit ToolBarStateOneWidget(UMLScene *umlScene); -- virtual ~ToolBarStateOneWidget(); -- -- virtual void cleanBeforeChange(); -- -- // FIXME: obsolete -- virtual void mouseMove(QGraphicsSceneMouseEvent* ome); -- --public Q_SLOTS: -- virtual void slotWidgetRemoved(UMLWidget* widget); -- --protected: -- virtual void setCurrentElement(); -- -- virtual void mouseReleaseWidget(); -- virtual void mouseReleaseEmpty(); -- -- void setWidget(UMLWidget* firstObject); -- WidgetBase::WidgetType widgetType(); -- -- UMLWidget* m_firstObject; ///< The first object in the message. -- -- /** -- * If there is a current widget, it is true if the press event happened on -- * the line of an object, or false if it happened on a normal UMLWidget. -- */ -- bool m_isObjectWidgetLine; -- --private: -- virtual void init(); --}; -- --#endif //TOOLBARSTATEONEWIDGET_H -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/umlwidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/umlwidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/umlwidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/umlwidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,1859 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "umlwidget.h" -- --// local includes --#include "associationwidget.h" --#include "classifier.h" --#include "classpropertiesdialog.h" --#include "cmds.h" --#include "debug_utils.h" --#include "docwindow.h" --#include "floatingtextwidget.h" --#include "idchangelog.h" --#include "listpopupmenu.h" --#include "settingsdialog.h" --#include "uml.h" --#include "umldoc.h" --#include "umllistview.h" --#include "umlobject.h" --#include "umlscene.h" --#include "umlview.h" --#include "uniqueid.h" -- --// kde includes --#include --#include -- --// qt includes --#include --#include --#include --#include -- --using namespace Uml; -- --DEBUG_REGISTER_DISABLED(UMLWidget) -- --const QSizeF UMLWidget::DefaultMinimumSize(50, 20); --const QSizeF UMLWidget::DefaultMaximumSize(1000, 5000); --const qreal UMLWidget::defaultMargin = 5; -- --/** -- * Creates a UMLWidget object. -- * -- * @param scene The view to be displayed on. -- * @param type The WidgetType to construct. -- * This must be set to the appropriate value by the constructors of inheriting classes. -- * @param o The UMLObject to represent. -- */ --UMLWidget::UMLWidget(UMLScene * scene, WidgetType type, UMLObject * o) -- : WidgetBase(scene, type) --{ -- init(); -- m_umlObject = o; -- if (m_umlObject) { -- connect(m_umlObject, SIGNAL(modified()), this, SLOT(updateWidget())); -- m_nId = m_umlObject->id(); -- } --} -- --/** -- * Creates a UMLWidget object. -- * -- * @param scene The view to be displayed on. -- * @param type The WidgetType to construct. -- * This must be set to the appropriate value by the constructors of inheriting classes. -- * @param id The id of the widget. -- * The default value (id_None) will prompt generation of a new ID. -- */ --UMLWidget::UMLWidget(UMLScene *scene, WidgetType type, Uml::ID::Type id) -- : WidgetBase(scene, type) --{ -- init(); -- if (id == Uml::ID::None) -- m_nId = UniqueID::gen(); -- else -- m_nId = id; --} -- --/** -- * Destructor. -- */ --UMLWidget::~UMLWidget() --{ -- cleanup(); --} -- --/** -- * Assignment operator -- */ --UMLWidget& UMLWidget::operator=(const UMLWidget & other) --{ -- if (this == &other) -- return *this; -- -- WidgetBase::operator=(other); -- -- // assign members loaded/saved -- m_useFillColor = other.m_useFillColor; -- m_usesDiagramFillColor = other.m_usesDiagramFillColor; -- m_usesDiagramUseFillColor = other.m_usesDiagramUseFillColor; -- m_fillColor = other.m_fillColor; -- m_Assocs = other.m_Assocs; -- m_isInstance = other.m_isInstance; -- m_instanceName = other.m_instanceName; -- m_instanceName = other.m_instanceName; -- m_showStereotype = other.m_showStereotype; -- setX(other.x()); -- setY(other.y()); -- setRect(rect().x(), rect().y(), other.width(), other.height()); -- -- // assign volatile (non-saved) members -- m_startMove = other.m_startMove; -- m_nPosX = other.m_nPosX; -- m_doc = other.m_doc; //new -- m_resizable = other.m_resizable; -- for (unsigned i = 0; i < FT_INVALID; ++i) -- m_pFontMetrics[i] = other.m_pFontMetrics[i]; -- m_activated = other.m_activated; -- m_ignoreSnapToGrid = other.m_ignoreSnapToGrid; -- m_ignoreSnapComponentSizeToGrid = other.m_ignoreSnapComponentSizeToGrid; -- return *this; --} -- --/** -- * Overload '==' operator -- */ --bool UMLWidget::operator==(const UMLWidget& other) const --{ -- if (this == &other) -- return true; -- -- if (m_baseType != other.m_baseType) { -- return false; -- } -- -- if (id() != other.id()) -- return false; -- -- /* Testing the associations is already an exaggeration, no? -- The type and ID should uniquely identify an UMLWidget. -- */ -- if (m_Assocs.count() != other.m_Assocs.count()) { -- return false; -- } -- -- // if(getBaseType() != wt_Text) // DON'T do this for floatingtext widgets, an infinite loop will result -- // { -- AssociationWidgetListIt assoc_it(m_Assocs); -- AssociationWidgetListIt assoc_it2(other.m_Assocs); -- AssociationWidget * assoc = 0, *assoc2 = 0; -- while (assoc_it.hasNext() && assoc_it2.hasNext()) { -- assoc = assoc_it.next(); -- assoc2 = assoc_it2.next(); -- -- if (!(*assoc == *assoc2)) { -- return false; -- } -- } -- // } -- return true; -- // NOTE: In the comparison tests we are going to do, we don't need these values. -- // They will actually stop things functioning correctly so if you change these, be aware of that. -- /* -- if(m_useFillColor != other.m_useFillColor) -- return false; -- if(m_nId != other.m_nId) -- return false; -- if(m_nX != other.m_nX) -- return false; -- if(m_nY != other.m_nY) -- return false; -- */ --} -- --/** -- * Sets the local id of the object. -- * -- * @param id The local id of the object. -- */ --void UMLWidget::setLocalID(Uml::ID::Type id) --{ -- m_nLocalID = id; --} -- --/** -- * Returns the local ID for this object. This ID is used so that -- * many objects of the same @ref UMLObject instance can be on the -- * same diagram. -- * -- * @return The local ID. -- */ --Uml::ID::Type UMLWidget::localID() const --{ -- return m_nLocalID; --} -- --/** -- * Returns the widget with the given ID. -- * The default implementation tests the following IDs: -- * - m_nLocalID -- * - if m_umlObject is non NULL: m_umlObject->id() -- * - m_nID -- * Composite widgets override this function to test further owned widgets. -- * -- * @param id The ID to test this widget against. -- * @return 'this' if id is either of m_nLocalID, m_umlObject->id(), or m_nId; -- * else NULL. -- */ --UMLWidget* UMLWidget::widgetWithID(Uml::ID::Type id) --{ -- if (id == m_nLocalID || -- (m_umlObject != NULL && id == m_umlObject->id()) || -- id == m_nId) -- return this; -- return NULL; --} -- --/** -- * Compute the minimum possible width and height. -- * -- * @return QSizeF(mininum_width, minimum_height) -- */ --QSizeF UMLWidget::minimumSize() const --{ -- return m_minimumSize; --} -- --/** -- * This method is used to set the minimum size variable for this -- * widget. -- * -- * @param newSize The size being set as minimum. -- */ --void UMLWidget::setMinimumSize(const QSizeF& newSize) --{ -- m_minimumSize = newSize; --} -- --/** -- * Compute the maximum possible width and height. -- * -- * @return maximum size -- */ --QSizeF UMLWidget::maximumSize() --{ -- return m_maximumSize; --} -- --/** -- * This method is used to set the maximum size variable for this -- * widget. -- * -- * @param newSize The size being set as maximum. -- */ --void UMLWidget::setMaximumSize(const QSizeF& newSize) --{ -- m_maximumSize = newSize; --} -- --/** -- * Event handler for context menu events. -- */ --void UMLWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) --{ -- WidgetBase::contextMenuEvent(event); --} -- --/** -- * Moves the widget to a new position using the difference between the -- * current position and the new position. -- * This method doesn't adjust associations. It only moves the widget. -- * -- * It can be overridden to constrain movement only in one axis even when -- * the user isn't constraining the movement with shift or control buttons, for example. -- * The movement policy set here is applied whenever the widget is moved, being it -- * moving it explicitly, or as a part of a selection but not receiving directly the -- * mouse events. -- * -- * Default behaviour is move the widget to the new position using the diffs. -- * @see constrainMovementForAllWidgets -- * -- * @param diffX The difference between current X position and new X position. -- * @param diffY The difference between current Y position and new Y position. -- */ --void UMLWidget::moveWidgetBy(qreal diffX, qreal diffY) --{ -- setX(x() + diffX); -- setY(y() + diffY); --} -- --/** -- * Modifies the value of the diffX and diffY variables used to move the widgets. -- * -- * It can be overridden to constrain movement of all the selected widgets only in one -- * axis even when the user isn't constraining the movement with shift or control -- * buttons, for example. -- * The difference with moveWidgetBy is that the diff positions used here are -- * applied to all the selected widgets instead of only to m_widget, and that -- * moveWidgetBy, in fact, moves the widget, and here simply the diff positions -- * are modified. -- * -- * Default behaviour is do nothing. -- * @see moveWidgetBy -- * -- * @param diffX The difference between current X position and new X position. -- * @param diffY The difference between current Y position and new Y position. -- */ --void UMLWidget::constrainMovementForAllWidgets(qreal &diffX, qreal &diffY) --{ -- Q_UNUSED(diffX) Q_UNUSED(diffY) --} -- --/** -- * Bring the widget at the pressed position to the foreground. -- */ --void UMLWidget::toForeground() --{ -- QRectF rect = QRectF(scenePos(), QSizeF(width(), height())); -- QList items = scene()->items(rect, Qt::IntersectsItemShape, Qt::DescendingOrder); -- DEBUG(DBG_SRC) << "items at " << rect << " = " << items.count(); -- if (items.count() > 1) { -- foreach(QGraphicsItem* i, items) { -- UMLWidget* w = dynamic_cast(i); -- if (w) { -- DEBUG(DBG_SRC) << "item=" << w->name() << " with zValue=" << w->zValue(); -- if (w->name() != name()) { -- if (w->zValue() >= zValue()) { -- setZValue(w->zValue() + 1.0); -- DEBUG(DBG_SRC) << "bring to foreground with zValue: " << zValue(); -- } -- } -- } -- } -- } -- else { -- setZValue(0.0); -- } -- DEBUG(DBG_SRC) << "zValue is " << zValue(); --} -- --/** -- * Handles a mouse press event. -- * It'll select the widget (or mark it to be deselected) and prepare it to -- * be moved or resized. Go on reading for more info about this. -- * -- * Widget values and message bar status are saved. -- * -- * If shift or control buttons are pressed, we're in move area no matter -- * where the button was pressed in the widget. Moreover, if the widget -- * wasn't already selected, it's added to the selection. If already selected, -- * it's marked to be deselected when releasing the button (provided it isn't -- * moved). -- * Also, if the widget is already selected with other widgets but shift nor -- * control buttons are pressed, we're in move area. If finally we don't move -- * the widget, it's selected and the other widgets deselected when releasing -- * the left button. -- * -- * If shift nor control buttons are pressed, we're facing a single selection. -- * Depending on the position of the cursor, we're in move or in resize area. -- * If the widget wasn't selected (both when there are no widgets selected, or -- * when there're other widgets selected but not the one receiving the press -- * event) it's selected and the others deselected, if any. If already selected, -- * it's marked to be deselected when releasing the button (provided it wasn't -- * moved or resized). -- * -- * @param event The QGraphicsSceneMouseEvent event. -- */ --void UMLWidget::mousePressEvent(QGraphicsSceneMouseEvent *event) --{ -- if (event->button() != Qt::LeftButton) { -- event->ignore(); -- return; -- } -- event->accept(); -- DEBUG(DBG_SRC) << "widget = " << name() << " / type = " << baseTypeStr(); -- -- toForeground(); -- -- m_startMovePostion = pos(); -- m_startResizeSize = QSizeF(width(), height()); -- -- // saving the values of the widget -- m_pressOffset = event->scenePos() - pos(); -- DEBUG(DBG_SRC) << "press offset=" << m_pressOffset; -- -- m_oldStatusBarMsg = UMLApp::app()->statusBarMsg(); -- -- if (event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::ControlModifier) { -- m_shiftPressed = true; -- -- if (event->button() == Qt::LeftButton) { -- m_inMoveArea = true; -- } -- -- if (!isSelected()) { -- selectMultiple(event); -- } -- return; -- } -- -- m_shiftPressed = false; -- -- int count = m_scene->selectedCount(true); -- if (event->button() == Qt::LeftButton) { -- if (isSelected() && count > 1) { -- // single selection is made in release event if the widget wasn't moved -- m_inMoveArea = true; -- m_oldPos = pos(); -- return; -- } -- -- if (isInResizeArea(event)) { -- m_inResizeArea = true; -- m_oldW = width(); -- m_oldH = height(); -- } else { -- m_inMoveArea = true; -- } -- } -- -- // if widget wasn't selected, or it was selected but with other widgets also selected -- if (!isSelected() || count > 1) { -- selectSingle(event); -- } --} -- --/** -- * Handles a mouse move event. -- * It resizes or moves the widget, depending on where the cursor is pressed -- * on the widget. Go on reading for more info about this. -- * -- * If resizing, the widget is resized using UMLWidget::resizeWidget (where specific -- * widget resize constraint can be applied), and then the associations are -- * adjusted. -- * The resizing can be constrained also to a specific axis using control -- * and shift buttons. If on or another is pressed, it's constrained to X axis. -- * If both are pressed, it's constrained to Y axis. -- * -- * If not resizing, the widget is being moved. If the move is being started, -- * the selection bounds are set (which includes updating the list of selected -- * widgets). -- * The difference between the previous position of the selection and the new -- * one is got (taking in account the selection bounds so widgets don't go -- * beyond the scene limits). Then, it's constrained to X or Y axis depending -- * on shift and control buttons. -- * A further constraint is made using constrainMovementForAllWidgets (for example, -- * if the widget that receives the event can only be moved in Y axis, with this -- * method the movement of all the widgets in the selection can be constrained to -- * be moved only in Y axis). -- * Then, all the selected widgets are moved using moveWidgetBy (where specific -- * widget movement constraint can be applied) and, if a certain amount of time -- * passed from the last move event, the associations are also updated (they're -- * not updated always to be easy on the CPU). Finally, the scene is resized, -- * and selection bounds updated. -- * -- * @param event The QGraphicsSceneMouseEvent event. -- */ --void UMLWidget::mouseMoveEvent(QGraphicsSceneMouseEvent* event) --{ -- if (m_inResizeArea) { -- resize(event); -- return; -- } -- -- if (!m_moved) { -- UMLApp::app()->document()->writeToStatusBar(i18n("Hold shift or ctrl to move in X axis. Hold shift and control to move in Y axis. Right button click to cancel move.")); -- -- m_moved = true; -- //Maybe needed by AssociationWidget -- m_startMove = true; -- -- setSelectionBounds(); -- } -- -- QPointF position = event->scenePos() - m_pressOffset; -- qreal diffX = position.x() - x(); -- qreal diffY = position.y() - y(); -- -- if ((event->modifiers() & Qt::ShiftModifier) && (event->modifiers() & Qt::ControlModifier)) { -- // move only in Y axis -- diffX = 0; -- } else if ((event->modifiers() & Qt::ShiftModifier) || (event->modifiers() & Qt::ControlModifier)) { -- // move only in X axis -- diffY = 0; -- } -- -- constrainMovementForAllWidgets(diffX, diffY); -- -- // nothing to move -- if (diffX == 0 && diffY == 0) { -- return; -- } -- -- QPointF delta = event->scenePos() - event->lastScenePos(); -- adjustUnselectedAssocs(delta.x(), delta.y()); -- -- DEBUG(DBG_SRC) << "diffX=" << diffX << " / diffY=" << diffY; -- foreach(UMLWidget* widget, umlScene()->selectedWidgets()) { -- widget->moveWidgetBy(diffX, diffY); -- widget->slotSnapToGrid(); -- } -- -- // Move any selected associations. -- foreach(AssociationWidget* aw, m_scene->selectedAssocs()) { -- if (aw->isSelected()) { -- aw->moveEntireAssoc(diffX, diffY); -- } -- } -- -- umlScene()->resizeSceneToItems(); --} -- --/** -- * Handles a mouse release event. -- * It selects or deselects the widget and cancels or confirms the move or -- * resize. Go on reading for more info about this. -- * No matter which tool is selected, Z position of widget is updated. -- * -- * Middle button release resets the selection. -- * Left button release, if it wasn't moved nor resized, selects the widget -- * and deselect the others if it wasn't selected and there were other widgets -- * selected. If the widget was marked to be deselected, deselects it. -- * If it was moved or resized, the document is set to modified if position -- * or size changed. Also, if moved, all the associations are adjusted because -- * the timer could have prevented the adjustment in the last move event before -- * the release. -- * If mouse was pressed in resize area, cursor is set again to normal cursor -- * Right button release if right button was pressed shows the pop up menu for -- * the widget. -- * If left button was pressed, it cancels the move or resize with a mouse move -- * event at the same position than the cursor was when pressed. Another left -- * button release is also sent. -- * -- * @param event The QGraphicsSceneMouseEvent event. -- */ --void UMLWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) --{ -- if (!m_moved && !m_resized) { -- if (!m_shiftPressed && (m_scene->selectedCount(true) > 1)) { -- selectSingle(event); -- } else if (!isSelected()) { -- deselect(event); -- } -- } else { -- // Commands -- if (m_moved) { -- int selectionCount = umlScene()->selectedWidgets().count(); -- if (selectionCount > 1) { -- UMLApp::app()->beginMacro(i18n("Move widgets")); -- } -- foreach(UMLWidget* widget, umlScene()->selectedWidgets()) { -- UMLApp::app()->executeCommand(new Uml::CmdMoveWidget(widget)); -- } -- if (selectionCount > 1) { -- UMLApp::app()->endMacro(); -- } -- m_moved = false; -- } else { -- UMLApp::app()->executeCommand(new Uml::CmdResizeWidget(this)); -- m_resized = false; -- } -- -- if ((m_inMoveArea && wasPositionChanged()) || -- (m_inResizeArea && wasSizeChanged())) { -- umlDoc()->setModified(true); -- } -- -- UMLApp::app()->document()->writeToStatusBar(m_oldStatusBarMsg); -- } -- -- if (m_inResizeArea) { -- m_inResizeArea = false; -- m_scene->activeView()->setCursor(Qt::ArrowCursor); -- } else { -- m_inMoveArea = false; -- } --} -- --/** -- * Event handler for mouse double click events. -- * @param event the QGraphicsSceneMouseEvent event. -- */ --void UMLWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) --{ -- if (event->button() == Qt::LeftButton) { -- DEBUG(DBG_SRC) << "widget = " << name() << " / type = " << baseTypeStr(); -- switch(baseType()) { -- case WidgetBase::wt_Message: // will be handled in its class -- QGraphicsItem::mouseDoubleClickEvent(event); -- break; -- default: -- showPropertiesDialog(); -- event->accept(); -- break; -- } -- } --} -- --/** -- * Return the start position of the move action. -- * @return point where the move began -- */ --QPointF UMLWidget::startMovePosition() const --{ -- return m_startMovePostion; --} -- --/** -- * Set the start position of the move action. -- * @param position point where the move began -- */ --void UMLWidget::setStartMovePosition(const QPointF &position) --{ -- m_startMovePostion = position; --} -- --/** -- * Return the start size of the resize action. -- * @return size where the resize began -- */ --QSizeF UMLWidget::startResizeSize() const --{ -- return m_startResizeSize; --} -- --/** -- * Resizes the widget. -- * It's called from resize, after the values are constrained and before -- * the associations are adjusted. -- * -- * Default behaviour is resize the widget using the new size values. -- * @see resize -- * -- * @param newW The new width for the widget. -- * @param newH The new height for the widget. -- */ --void UMLWidget::resizeWidget(qreal newW, qreal newH) --{ -- setSize(newW, newH); --} -- --/** -- * When a widget changes this slot captures that signal. -- */ --void UMLWidget::updateWidget() --{ -- updateGeometry(); -- switch (m_baseType) { -- case WidgetBase::wt_Class: -- m_scene->createAutoAttributeAssociations(this); -- break; -- case WidgetBase::wt_Entity: -- m_scene->createAutoConstraintAssociations(this); -- break; -- default: -- break; -- } -- -- if (isVisible()) -- update(); --} -- --/** -- * Apply possible constraints to the given candidate width and height. -- * The default implementation limits input values to the bounds returned -- * by minimumSize()/maximumSize(). -- * -- * @param width input value, may be modified by the constraint -- * @param height input value, may be modified by the constraint -- */ --void UMLWidget::constrain(qreal& width, qreal& height) --{ -- QSizeF minSize = minimumSize(); -- if (width < minSize.width()) -- width = minSize.width(); -- if (height < minSize.height()) -- height = minSize.height(); -- QSizeF maxSize = maximumSize(); -- if (width > maxSize.width()) -- width = maxSize.width(); -- if (height > maxSize.height()) -- height = maxSize.height(); -- -- if (fixedAspectRatio()) { -- QSizeF size = rect().size(); -- float aspectRatio = size.width() > 0 ? (float)size.height()/size.width() : 1; -- height = width * aspectRatio; -- } --} -- --/** -- * Initializes key attributes of the class. -- */ --void UMLWidget::init() --{ -- m_nId = Uml::ID::None; -- m_nLocalID = UniqueID::gen(); -- m_isInstance = false; -- setMinimumSize(DefaultMinimumSize); -- setMaximumSize(DefaultMaximumSize); -- -- m_font = QApplication::font(); -- for (int i = (int)FT_INVALID - 1; i >= 0; --i) { -- FontType fontType = (FontType)i; -- setupFontType(m_font, fontType); -- m_pFontMetrics[fontType] = new QFontMetrics(m_font); -- } -- -- if (m_scene) { -- m_useFillColor = true; -- m_usesDiagramFillColor = true; -- m_usesDiagramUseFillColor = true; -- const Settings::OptionState& optionState = m_scene->optionState(); -- m_fillColor = optionState.uiState.fillColor; -- m_showStereotype = optionState.classState.showStereoType; -- } else { -- uError() << "SERIOUS PROBLEM - m_scene is NULL"; -- m_useFillColor = false; -- m_usesDiagramFillColor = false; -- m_usesDiagramUseFillColor = false; -- m_showStereotype = false; -- } -- -- m_resizable = true; -- m_fixedAspectRatio = false; -- -- m_startMove = false; -- m_activated = false; -- m_ignoreSnapToGrid = false; -- m_ignoreSnapComponentSizeToGrid = false; -- m_doc = UMLApp::app()->document(); -- m_nPosX = 0; -- connect(m_scene, SIGNAL(sigFillColorChanged(Uml::ID::Type)), this, SLOT(slotFillColorChanged(Uml::ID::Type))); -- connect(m_scene, SIGNAL(sigLineColorChanged(Uml::ID::Type)), this, SLOT(slotLineColorChanged(Uml::ID::Type))); -- connect(m_scene, SIGNAL(sigTextColorChanged(Uml::ID::Type)), this, SLOT(slotTextColorChanged(Uml::ID::Type))); -- connect(m_scene, SIGNAL(sigLineWidthChanged(Uml::ID::Type)), this, SLOT(slotLineWidthChanged(Uml::ID::Type))); -- -- m_umlObject = 0; -- -- m_oldPos = QPointF(); -- m_pressOffset = QPointF(); -- m_oldW = 0; -- m_oldH = 0; -- -- m_shiftPressed = false; -- m_inMoveArea = false; -- m_inResizeArea = false; -- m_moved = false; -- m_resized = false; -- -- setZValue(2.0); // default for most widgets --} -- --/** -- * This is usually called synchronously after menu.exec() and \a -- * trigger's parent is always the ListPopupMenu which can be used to -- * get the type of action of \a trigger. -- * -- * @note Subclasses can reimplement to handle specific actions and -- * leave the rest to WidgetBase::slotMenuSelection. -- */ --void UMLWidget::slotMenuSelection(QAction *trigger) --{ -- if (!trigger) { -- return; -- } -- -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(trigger); -- switch (sel) { -- case ListPopupMenu::mt_Resize: -- umlScene()->resizeSelection(); -- break; -- -- default: -- WidgetBase::slotMenuSelection(trigger); -- break; -- } --} -- --/** -- * Captures when another widget moves if this widget is linked to it. -- * @see sigWidgetMoved -- * -- * @param id The id of object behind the widget. -- */ --void UMLWidget::slotWidgetMoved(Uml::ID::Type /*id*/) --{ --} -- --/** -- * Captures a color change signal. -- * -- * @param viewID The id of the UMLScene behind the widget. -- */ --void UMLWidget::slotFillColorChanged(Uml::ID::Type viewID) --{ -- //only change if on the diagram concerned -- if (m_scene->ID() != viewID) { -- return; -- } -- if (m_usesDiagramFillColor) { -- WidgetBase::setFillColor(m_scene->fillColor()); -- } -- if (m_usesDiagramUseFillColor) { -- WidgetBase::setUseFillColor(m_scene->useFillColor()); -- } -- update(); --} -- --/** -- * Captures a text color change signal. -- * -- * @param viewID The id of the UMLScene behind the widget. -- */ --void UMLWidget::slotTextColorChanged(Uml::ID::Type viewID) --{ -- //only change if on the diagram concerned -- if (m_scene->ID() != viewID) -- return; -- WidgetBase::setTextColor(m_scene->textColor()); -- update(); --} -- -- --/** -- * Captures a line color change signal. -- * -- * @param viewID The id of the UMLScene behind the widget. -- */ --void UMLWidget::slotLineColorChanged(Uml::ID::Type viewID) --{ -- //only change if on the diagram concerned -- if (m_scene->ID() != viewID) -- return; -- -- if (m_usesDiagramLineColor) { -- WidgetBase::setLineColor(m_scene->lineColor()); -- } -- update(); --} -- --/** -- * Captures a linewidth change signal. -- * -- * @param viewID The id of the UMLScene behind the widget. -- */ --void UMLWidget::slotLineWidthChanged(Uml::ID::Type viewID) --{ -- //only change if on the diagram concerned -- if (m_scene->ID() != viewID) { -- return; -- } -- if (m_usesDiagramLineWidth) { -- WidgetBase::setLineWidth(m_scene->lineWidth()); -- } -- update(); --} -- --/** -- * Set the status of using fill color (undo action) -- * -- * @param fc the status of using fill color. -- */ --void UMLWidget::setUseFillColor(bool fc) --{ -- if (useFillColor() != fc) { -- UMLApp::app()->executeCommand(new CmdChangeUseFillColor(this, fc)); -- } --} -- --/** -- * Set the status of using fill color. -- * -- * @param fc the status of using fill color. -- */ --void UMLWidget::setUseFillColorCmd(bool fc) --{ -- WidgetBase::setUseFillColor(fc); -- update(); --} -- --/** -- * Overrides the method from WidgetBase. -- */ --void UMLWidget::setTextColorCmd(const QColor &color) --{ -- WidgetBase::setTextColor(color); -- update(); --} -- --/** -- * Overrides the method from WidgetBase. -- */ --void UMLWidget::setTextColor(const QColor &color) --{ -- if (textColor() != color) { -- UMLApp::app()->executeCommand(new CmdChangeTextColor(this, color)); -- update(); -- } --} -- --/** -- * Overrides the method from WidgetBase. -- */ --void UMLWidget::setLineColorCmd(const QColor &color) --{ -- WidgetBase::setLineColor(color); -- update(); --} -- --/** -- * Overrides the method from WidgetBase. -- */ --void UMLWidget::setLineColor(const QColor &color) --{ -- if (lineColor() != color) { -- UMLApp::app()->executeCommand(new CmdChangeLineColor(this, color)); -- } --} -- --/** -- * Overrides the method from WidgetBase, execute CmdChangeLineWidth -- */ --void UMLWidget::setLineWidth(uint width) --{ -- if (lineWidth() != width) { -- UMLApp::app()->executeCommand(new CmdChangeLineWidth(this, width)); -- } --} -- --/** -- * Overrides the method from WidgetBase. -- */ --void UMLWidget::setLineWidthCmd(uint width) --{ -- WidgetBase::setLineWidth(width); -- update(); --} -- --/** -- * Sets the background fill color -- * -- * @param color the new fill color -- */ --void UMLWidget::setFillColor(const QColor &color) --{ -- if (fillColor() != color) { -- UMLApp::app()->executeCommand(new CmdChangeFillColor(this, color)); -- } --} -- --/** -- * Sets the background fill color -- * -- * @param color the new fill color -- */ --void UMLWidget::setFillColorCmd(const QColor &color) --{ -- WidgetBase::setFillColor(color); -- update(); --} -- --/** -- * Activate the object after serializing it from a QDataStream -- * -- * @param ChangeLog -- * @return true for success -- */ --bool UMLWidget::activate(IDChangeLog* /*ChangeLog = 0 */) --{ -- if (widgetHasUMLObject(m_baseType) && m_umlObject == NULL) { -- m_umlObject = m_doc->findObjectById(m_nId); -- if (m_umlObject == NULL) { -- uError() << "cannot find UMLObject with id=" << Uml::ID::toString(m_nId); -- return false; -- } -- } -- setFontCmd(m_font); -- setSize(width(), height()); -- m_activated = true; -- updateGeometry(); -- if (m_scene->getPaste()) { -- FloatingTextWidget * ft = 0; -- QPointF point = m_scene->getPastep-kf6oint(); -- int x = point.x() + this->x(); -- int y = point.y() + this->y(); -- if (m_scene->type() == Uml::DiagramType::Sequence) { -- switch (baseType()) { -- case WidgetBase::wt_Object: -- case WidgetBase::wt_Precondition : -- setY(this->y()); -- setX(x); -- break; -- -- case WidgetBase::wt_Message: -- setY(this->y()); -- setX(x); -- break; -- -- case WidgetBase::wt_Text: -- ft = static_cast(this); -- if (ft->textRole() == Uml::TextRole::Seq_Message) { -- setX(x); -- setY(this->y()); -- } else { -- setX(this->x()); -- setY(this->y()); -- } -- break; -- -- default: -- setY(y); -- break; -- }//end switch base type -- }//end if sequence -- else { -- setX(x); -- setY(y); -- } -- }//end if pastep-kf6oint -- else { -- setX(this->x()); -- setY(this->y()); -- } -- if (m_scene->getPaste()) -- m_scene->createAutoAssociations(this); -- updateGeometry(); -- return true; --} -- --/** -- * Returns true if the Activate method has been called for this instance -- * -- * @return The activate status. -- */ --bool UMLWidget::isActivated() const --{ -- return m_activated; --} -- --/** -- * Set the m_activated flag of a widget but does not perform the Activate method -- * -- * @param active Status of activation is to be set. -- */ --void UMLWidget::setActivated(bool active /*=true*/) --{ -- m_activated = active; --} -- --/** -- * Adds an already created association to the list of -- * associations that include this UMLWidget -- */ --void UMLWidget::addAssoc(AssociationWidget* pAssoc) --{ -- if (pAssoc && !m_Assocs.contains(pAssoc)) { -- m_Assocs.append(pAssoc); -- } --} -- --/** -- * Removes an already created association from the list of -- * associations that include this UMLWidget -- */ --void UMLWidget::removeAssoc(AssociationWidget* pAssoc) --{ -- if (pAssoc) { -- m_Assocs.removeAll(pAssoc); -- } --} -- --/** -- * Adjusts associations with the given co-ordinates -- * -- * @param dx The amount by which the widget moved in X direction. -- * @param dy The amount by which the widget moved in Y direction. -- */ --void UMLWidget::adjustAssocs(qreal dx, qreal dy) --{ -- // don't adjust Assocs on file load, as -- // the original positions, which are stored in XMI -- // should be reproduced exactly -- // (don't try to reposition assocs as long -- // as file is only partly loaded -> reposition -- // could be misguided) -- /// @todo avoid trigger of this event during load -- if (m_doc->loading()) { -- // don't recalculate the assocs during load of XMI -- // -> return immediately without action -- return; -- } -- -- foreach(AssociationWidget* assocwidget, m_Assocs) { -- assocwidget->saveIdealTextPositions(); -- } -- -- foreach(AssociationWidget* assocwidget, m_Assocs) { -- assocwidget->widgetMoved(this, dx, dy); -- } --} -- --/** -- * Adjusts all unselected associations with the given co-ordinates -- * -- * @param dx The amount by which the widget moved in X direction. -- * @param dy The amount by which the widget moved in Y direction. -- */ --void UMLWidget::adjustUnselectedAssocs(qreal dx, qreal dy) --{ -- foreach(AssociationWidget* assocwidget, m_Assocs) { -- if (!assocwidget->isSelected()) -- assocwidget->saveIdealTextPositions(); -- } -- -- foreach(AssociationWidget* assocwidget, m_Assocs) { -- if (!assocwidget->isSelected()) { -- assocwidget->widgetMoved(this, dx, dy); -- } -- } --} -- --/** -- * Show a properties dialog for a UMLWidget. -- */ --void UMLWidget::showPropertiesDialog() --{ -- // will already be selected so make sure docWindow updates the doc -- // back it the widget -- UMLApp::app()->docWindow()->updateDocumentation(false); -- QPointer dlg = new ClassPropertiesDialog((QWidget*)UMLApp::app(), this); -- -- if (dlg->exec()) { -- UMLApp::app()->docWindow()->showDocumentation(umlObject(), true); -- m_doc->setModified(true); -- } -- dlg->close(); //wipe from memory -- delete dlg; --} -- --/** -- * Move the widget by an X and Y offset relative to -- * the current position. -- */ --void UMLWidget::moveByLocal(qreal dx, qreal dy) --{ -- qreal newX = x() + dx; -- qreal newY = y() + dy; -- setX(newX); -- setY(newY); -- adjustAssocs(dx, dy); --} -- --/** -- * Set the pen. -- */ --void UMLWidget::setPenFromSettings(QPainter & p) --{ -- p.setPen(QPen(m_lineColor, m_lineWidth)); --} -- --/** -- * Set the pen. -- */ --void UMLWidget::setPenFromSettings(QPainter *p) --{ -- p->setPen(QPen(m_lineColor, m_lineWidth)); --} -- --/** -- * Returns the cursor to be shown when resizing the widget. -- * Default cursor is KCursor::sizeFDiagCursor(). -- * -- * @return The cursor to be shown when resizing the widget. -- */ --QCursor UMLWidget::resizeCursor() const --{ -- return Qt::SizeFDiagCursor; --} -- --/** -- * Checks if the mouse is in resize area (right bottom corner), and sets -- * the cursor depending on that. -- * The cursor used when resizing is gotten from resizeCursor(). -- * -- * @param me The QMouseEVent to check. -- * @return true if the mouse is in resize area, false otherwise. -- */ --bool UMLWidget::isInResizeArea(QGraphicsSceneMouseEvent *me) --{ -- qreal m = 10.0; -- const qreal w = width(); -- const qreal h = height(); -- -- // If the widget itself is very small then make the resize area small, too. -- // Reason: Else it becomes impossible to do a move instead of resize. -- if (w - m < m || h - m < m) { -- m = 2.0; -- } -- -- if (m_resizable && -- me->scenePos().x() >= (x() + w - m) && -- me->scenePos().y() >= (y() + h - m)) { -- m_scene->activeView()->setCursor(resizeCursor()); -- return true; -- } else { -- m_scene->activeView()->setCursor(Qt::ArrowCursor); -- return false; -- } --} -- --/** -- * calculate content related size of widget. -- * -- * @return calculated widget size -- */ --QSizeF UMLWidget::calculateSize(bool withExtensions /* = true */) const --{ -- Q_UNUSED(withExtensions) -- return QSizeF(width(), height()); --} -- --/** -- * Resize widget to minimum size. -- */ --void UMLWidget::resize() --{ -- qreal oldW = width(); -- qreal oldH = height(); -- // @TODO minimumSize() do not work in all cases, we need a dedicated autoResize() method -- QSizeF size = minimumSize(); -- setSize(size.width(), size.height()); -- DEBUG(DBG_SRC) << "size=" << size; -- adjustAssocs(size.width()-oldW, size.height()-oldH); --} -- --/** -- * Resizes the widget and adjusts the associations. -- * It's called when a mouse move event happens and the cursor was -- * in resize area when pressed. -- * Resizing can be constrained to an specific axis using control and shift buttons. -- * -- * @param me The QGraphicsSceneMouseEvent to get the values from. -- */ --void UMLWidget::resize(QGraphicsSceneMouseEvent *me) --{ -- // TODO the status message lies for at least MessageWidget which could only be resized vertical -- UMLApp::app()->document()->writeToStatusBar(i18n("Hold shift or ctrl to move in X axis. Hold shift and control to move in Y axis. Right button click to cancel resize.")); -- -- m_resized = true; -- -- qreal newW = m_oldW + me->scenePos().x() - x() - m_pressOffset.x(); -- qreal newH = m_oldH + me->scenePos().y() - y() - m_pressOffset.y(); -- -- if ((me->modifiers() & Qt::ShiftModifier) && (me->modifiers() & Qt::ControlModifier)) { -- //Move in Y axis -- newW = m_oldW; -- } else if ((me->modifiers() & Qt::ShiftModifier) || (me->modifiers() & Qt::ControlModifier)) { -- //Move in X axis -- newH = m_oldH; -- } -- -- constrain(newW, newH); -- resizeWidget(newW, newH); -- DEBUG(DBG_SRC) << "event=" << me->scenePos() << "/ pos=" << pos() << " / newW=" << newW << " / newH=" << newH; -- QPointF delta = me->scenePos() - me->lastScenePos(); -- adjustAssocs(delta.x(), delta.y()); -- -- m_scene->resizeSceneToItems(); --} -- --/** -- * Checks if the size of the widget changed respect to the size that -- * it had when press event was fired. -- * -- * @return true if was resized, false otherwise. -- */ --bool UMLWidget::wasSizeChanged() --{ -- return m_oldW != width() || m_oldH != height(); --} -- --/** -- * Checks if the position of the widget changed respect to the position that -- * it had when press event was fired. -- * -- * @return true if was moved, false otherwise. -- */ --bool UMLWidget::wasPositionChanged() --{ -- return m_oldPos != pos(); --} -- --/** -- * Fills m_selectedWidgetsList and sets the selection bounds ((m_min/m_max)X/Y attributes). -- */ --void UMLWidget::setSelectionBounds() --{ --} -- --void UMLWidget::setSelectedFlag(bool _select) --{ -- WidgetBase::setSelected(_select); --} -- --/** -- * Sets the state of whether the widget is selected. -- * -- * @param _select The state of whether the widget is selected. -- */ --void UMLWidget::setSelected(bool _select) --{ -- WidgetBase::setSelected(_select); -- const WidgetBase::WidgetType wt = m_baseType; -- if (_select) { -- if (m_scene->selectedCount() == 0) { -- if (widgetHasUMLObject(wt)) { -- UMLApp::app()->docWindow()->showDocumentation(m_umlObject, false); -- } else { -- UMLApp::app()->docWindow()->showDocumentation(this, false); -- } -- }//end if -- /* if (wt != wt_Text && wt != wt_Box) { -- setZ(9);//keep text on top and boxes behind so don't touch Z value -- } */ -- } else { -- /* if (wt != wt_Text && wt != wt_Box) { -- setZ(m_origZ); -- } */ -- if (isSelected()) -- UMLApp::app()->docWindow()->updateDocumentation(true); -- } -- -- // TODO: isn't this handled by toForeground() ? -- const QPoint pos(x(), y()); -- UMLWidget *bkgnd = m_scene->widgetAt(pos); -- if (bkgnd && bkgnd != this && _select) { -- DEBUG(DBG_SRC) << "setting Z to " << bkgnd->zValue() + 1.0 << ", SelectState: " << _select; -- setZValue(bkgnd->zValue() + 1.0); -- } -- -- update(); -- -- // selection changed, we have to make sure the copy and paste items -- // are correctly enabled/disabled -- UMLApp::app()->slotCopyChanged(); -- -- // select in tree view as done for diagrams -- if (_select) { -- UMLListViewItem * item = UMLApp::app()->listView()->findItem(id()); -- if (item) -- UMLApp::app()->listView()->setCurrentItem(item); -- else -- UMLApp::app()->listView()->clearSelection(); -- } --} -- --/** -- * Selects the widget and clears the other selected widgets, if any. -- * -- * @param me The QGraphicsSceneMouseEvent which made the selection. -- */ --void UMLWidget::selectSingle(QGraphicsSceneMouseEvent *me) --{ -- m_scene->clearSelected(); -- -- // Adds the widget to the selected widgets list, but as it has been cleared -- // only the current widget is selected. -- selectMultiple(me); --} -- --/** -- * Selects the widget and adds it to the list of selected widgets. -- * -- * @param me The QGraphicsSceneMouseEvent which made the selection. -- */ --void UMLWidget::selectMultiple(QGraphicsSceneMouseEvent *me) --{ -- Q_UNUSED(me); -- -- setSelected(true); --} -- --/** -- * Deselects the widget and removes it from the list of selected widgets. -- * -- * @param me The QGraphicsSceneMouseEvent which made the selection. -- */ --void UMLWidget::deselect(QGraphicsSceneMouseEvent *me) --{ -- Q_UNUSED(me); -- -- setSelected(false); --} -- --/** -- * Clears the selection, resets the toolbar and deselects the widget. -- */ --//void UMLWidget::resetSelection() --//{ --// m_scene->clearSelected(); --// m_scene->resetToolbar(); --// setSelected(false); --//} -- --/** -- * Sets the view the widget is on. -- * -- * @param scene The UMLScene the widget is on. -- */ --void UMLWidget::setScene(UMLScene *scene) --{ -- //remove signals from old view - was probably 0 anyway -- disconnect(m_scene, SIGNAL(sigFillColorChanged(Uml::ID::Type)), this, SLOT(slotFillColorChanged(Uml::ID::Type))); -- disconnect(m_scene, SIGNAL(sigTextColorChanged(Uml::ID::Type)), this, SLOT(slotTextColorChanged(Uml::ID::Type))); -- disconnect(m_scene, SIGNAL(sigLineWidthChanged(Uml::ID::Type)), this, SLOT(slotLineWidthChanged(Uml::ID::Type))); -- m_scene = scene; -- connect(m_scene, SIGNAL(sigFillColorChanged(Uml::ID::Type)), this, SLOT(slotFillColorChanged(Uml::ID::Type))); -- connect(m_scene, SIGNAL(sigTextColorChanged(Uml::ID::Type)), this, SLOT(slotTextColorChanged(Uml::ID::Type))); -- connect(m_scene, SIGNAL(sigLineWidthChanged(Uml::ID::Type)), this, SLOT(slotLineWidthChanged(Uml::ID::Type))); --} -- --/** -- * Sets the x-coordinate. -- * Currently, the only class that reimplements this method is -- * ObjectWidget. -- * -- * @param x The x-coordinate to be set. -- */ --void UMLWidget::setX(qreal x) --{ -- QGraphicsObject::setX(x); --} -- --/** -- * Sets the y-coordinate. -- * Currently, the only class that reimplements this method is -- * ObjectWidget. -- * -- * @param y The y-coordinate to be set. -- */ --void UMLWidget::setY(qreal y) --{ -- QGraphicsObject::setY(y); --} -- --/** -- * Used to cleanup any other widget it may need to delete. -- * Used by child classes. This should be called before deleting a widget of a diagram. -- */ --void UMLWidget::cleanup() --{ --} -- --/** -- * Tells the widget to snap to grid. -- * Will use the grid settings of the @ref UMLView it belongs to. -- */ --void UMLWidget::slotSnapToGrid() --{ -- if (!m_ignoreSnapToGrid) { -- qreal newX = m_scene->snappedX(x()); -- setX(newX); -- qreal newY = m_scene->snappedY(y()); -- setY(newY); -- } --} -- --/** -- * Returns whether the widget type has an associated UMLObject -- */ --bool UMLWidget::widgetHasUMLObject(WidgetBase::WidgetType type) --{ -- if (type == WidgetBase::wt_Actor || -- type == WidgetBase::wt_UseCase || -- type == WidgetBase::wt_Class || -- type == WidgetBase::wt_Interface || -- type == WidgetBase::wt_Enum || -- type == WidgetBase::wt_Datatype || -- type == WidgetBase::wt_Package || -- type == WidgetBase::wt_Component || -- type == WidgetBase::wt_Port || -- type == WidgetBase::wt_Node || -- type == WidgetBase::wt_Artifact || -- type == WidgetBase::wt_Object) { -- return true; -- } else { -- return false; -- } --} -- --/** -- * Set m_ignoreSnapToGrid. -- */ --void UMLWidget::setIgnoreSnapToGrid(bool to) --{ -- m_ignoreSnapToGrid = to; --} -- --/** -- * Return the value of m_ignoreSnapToGrid. -- */ --bool UMLWidget::getIgnoreSnapToGrid() const --{ -- return m_ignoreSnapToGrid; --} -- --/** -- * Sets the size. -- * If m_scene->snapComponentSizeToGrid() is true, then -- * set the next larger size that snaps to the grid. -- */ --void UMLWidget::setSize(qreal width, qreal height) --{ -- // snap to the next larger size that is a multiple of the grid -- if (!m_ignoreSnapComponentSizeToGrid -- && m_scene->snapComponentSizeToGrid()) { -- // integer divisions -- int numX = width / m_scene->snapX(); -- int numY = height / m_scene->snapY(); -- // snap to the next larger valid value -- if (width > numX * m_scene->snapX()) -- width = (numX + 1) * m_scene->snapX(); -- if (height > numY * m_scene->snapY()) -- height = (numY + 1) * m_scene->snapY(); -- } -- -- setRect(rect().x(), rect().y(), width, height); --} -- --/** -- * Sets the size with another size. -- */ --void UMLWidget::setSize(const QSizeF& size) --{ -- setSize(size.width(), size.height()); --} -- --/** -- * Update the size of this widget. -- */ --void UMLWidget::updateGeometry() --{ -- if (m_doc->loading()) { -- return; -- } -- qreal oldW = width(); -- qreal oldH = height(); -- QSizeF size = calculateSize(); -- qreal clipWidth = size.width(); -- qreal clipHeight = size.height(); -- constrain(clipWidth, clipHeight); -- setSize(clipWidth, clipHeight); -- slotSnapToGrid(); -- adjustAssocs(size.width()-oldW, size.height()-oldH); --} -- --/** -- * clip the size of this widget against the -- * minimal and maximal limits. -- */ --void UMLWidget::clipSize() --{ -- qreal clipWidth = width(); -- qreal clipHeight = height(); -- constrain(clipWidth, clipHeight); -- setSize(clipWidth, clipHeight); --} -- --/** -- * Template Method, override this to set the default font metric. -- */ --void UMLWidget::setDefaultFontMetrics(QFont &font, UMLWidget::FontType fontType) --{ -- setupFontType(font, fontType); -- setFontMetrics(fontType, QFontMetrics(font)); --} -- --void UMLWidget::setupFontType(QFont &font, UMLWidget::FontType fontType) --{ -- switch (fontType) { -- case FT_NORMAL: -- font.setBold(false); -- font.setItalic(false); -- font.setUnderline(false); -- break; -- case FT_BOLD: -- font.setBold(true); -- font.setItalic(false); -- font.setUnderline(false); -- break; -- case FT_ITALIC: -- font.setBold(false); -- font.setItalic(true); -- font.setUnderline(false); -- break; -- case FT_UNDERLINE: -- font.setBold(false); -- font.setItalic(false); -- font.setUnderline(true); -- break; -- case FT_BOLD_ITALIC: -- font.setBold(true); -- font.setItalic(true); -- font.setUnderline(false); -- break; -- case FT_BOLD_UNDERLINE: -- font.setBold(true); -- font.setItalic(false); -- font.setUnderline(true); -- break; -- case FT_ITALIC_UNDERLINE: -- font.setBold(false); -- font.setItalic(true); -- font.setUnderline(true); -- break; -- case FT_BOLD_ITALIC_UNDERLINE: -- font.setBold(true); -- font.setItalic(true); -- font.setUnderline(true); -- break; -- default: return; -- } --} -- --void UMLWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- if (option->state & QStyle::State_Selected) { -- const qreal w = width(); -- const qreal h = height(); -- const qreal s = 4; -- QBrush brush(Qt::blue); -- painter->fillRect(0, 0, s, s, brush); -- painter->fillRect(0, 0 + h - s, s, s, brush); -- painter->fillRect(0 + w - s, 0, s, s, brush); -- -- // Draw the resize anchor in the lower right corner. -- // Don't draw it if the widget is so small that the -- // resize anchor would cover up most of the widget. -- if (m_resizable && w >= s+8 && h >= s+8) { -- brush.setColor(Qt::red); -- const int right = 0 + w; -- const int bottom = 0 + h; -- painter->drawLine(right - s, 0 + h - 1, 0 + w - 1, 0 + h - s); -- painter->drawLine(right - (s*2), bottom - 1, right - 1, bottom - (s*2)); -- painter->drawLine(right - (s*3), bottom - 1, right - 1, bottom - (s*3)); -- } else { -- painter->fillRect(0 + w - s, 0 + h - s, s, s, brush); -- } -- // debug info -- if (Tracer::instance()->isEnabled(QLatin1String(metaObject()->className()))) { -- painter->setPen(Qt::green); -- painter->setBrush(Qt::NoBrush); -- painter->drawPath(shape()); -- painter->setPen(Qt::red); -- painter->drawRect(boundingRect()); -- // origin -- painter->drawLine(-10, 0, 10, 0); -- painter->drawLine(0, -10, 0, 10); -- } -- } -- -- if (umlScene()->isShowDocumentationIndicator() && hasDocumentation()) { -- const qreal h = height(); -- const qreal d = 8; -- QPolygonF p; -- p << QPointF(0, h - d) << QPointF(d, h) << QPointF(0, h); -- painter->setPen(Qt::blue); -- painter->setBrush(Qt::red); -- painter->drawPolygon(p); -- } --} -- --/** -- * Template Method, override this to set the default font metric. -- */ --void UMLWidget::setDefaultFontMetrics(QFont &font, UMLWidget::FontType fontType, QPainter &painter) --{ -- setupFontType(font, fontType); -- painter.setFont(font); -- setFontMetrics(fontType, painter.fontMetrics()); --} -- --/** -- * Returns the font metric used by this object for Text -- * which uses bold/italic fonts. -- */ --QFontMetrics &UMLWidget::getFontMetrics(UMLWidget::FontType fontType) const --{ -- return *m_pFontMetrics[fontType]; --} -- --/** -- * Set the font metric to use. -- */ --void UMLWidget::setFontMetrics(UMLWidget::FontType fontType, QFontMetrics fm) --{ -- delete m_pFontMetrics[fontType]; -- m_pFontMetrics[fontType] = new QFontMetrics(fm); --} -- --/** -- * Sets the font the widget is to use. -- * -- * @param font Font to be set. -- */ --void UMLWidget::setFont(const QFont &font) --{ -- QFont newFont = font; -- forceUpdateFontMetrics(newFont, 0); -- -- if (m_font != newFont) { -- UMLApp::app()->executeCommand(new CmdChangeFont(this, font)); -- } --} -- --/** -- * Sets the font the widget is to use. -- * -- * @param font Font to be set. -- */ --void UMLWidget::setFontCmd(const QFont &font) --{ -- WidgetBase::setFont(font); -- forceUpdateFontMetrics(0); -- if (m_doc->loading()) -- return; -- update(); --} -- --/** -- * Updates font metrics for widgets current m_font -- */ --void UMLWidget::forceUpdateFontMetrics(QPainter *painter) --{ -- forceUpdateFontMetrics(m_font, painter); --} -- --/** -- * @note For performance Reasons, only FontMetrics for already used -- * font types are updated. Not yet used font types will not get a font metric -- * and will get the same font metric as if painter was zero. -- * This behaviour is acceptable, because diagrams will always be shown on Display -- * first before a special painter like a printer device is used. -- */ --void UMLWidget::forceUpdateFontMetrics(QFont& font, QPainter *painter) --{ -- if (painter == 0) { -- for (int i = (int)FT_INVALID - 1; i >= 0; --i) { -- if (m_pFontMetrics[(UMLWidget::FontType)i] != 0) -- setDefaultFontMetrics(font, (UMLWidget::FontType)i); -- } -- } else { -- for (int i2 = (int)FT_INVALID - 1; i2 >= 0; --i2) { -- if (m_pFontMetrics[(UMLWidget::FontType)i2] != 0) -- setDefaultFontMetrics(font, (UMLWidget::FontType)i2, *painter); -- } -- } -- if (m_doc->loading()) -- return; -- // calculate the size, based on the new font metric -- updateGeometry(); --} -- --/** -- * Set the status of whether to show Stereotype. -- * -- * @param flag True if stereotype shall be shown. -- */ --void UMLWidget::setShowStereotype(bool flag) --{ -- m_showStereotype = flag; -- updateGeometry(); -- update(); --} -- --/** -- * Returns the status of whether to show Stereotype. -- * -- * @return True if stereotype is shown. -- */ --bool UMLWidget::showStereotype() const --{ -- return m_showStereotype; --} -- --/** -- * Overrides the standard operation. -- * -- * @param me The move event. -- */ --void UMLWidget::moveEvent(QGraphicsSceneMouseEvent* me) --{ -- Q_UNUSED(me) --} -- --void UMLWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- /* -- Call after required actions in child class. -- Type must be set in the child class. -- */ -- WidgetBase::saveToXMI(qDoc, qElement); -- qElement.setAttribute(QLatin1String("xmi.id"), Uml::ID::toString(id())); -- qElement.setAttribute(QLatin1String("x"), x()); -- qElement.setAttribute(QLatin1String("y"), y()); -- qElement.setAttribute(QLatin1String("width"), width()); -- qElement.setAttribute(QLatin1String("height"), height()); -- qElement.setAttribute(QLatin1String("isinstance"), m_isInstance); -- if (!m_instanceName.isEmpty()) -- qElement.setAttribute(QLatin1String("instancename"), m_instanceName); -- if (m_showStereotype) -- qElement.setAttribute(QLatin1String("showstereotype"), m_showStereotype); -- -- // Unique identifier for widget (todo: id() should be unique, new attribute -- // should indicate the UMLObject's ID it belongs to) -- qElement.setAttribute(QLatin1String("localid"), Uml::ID::toString(m_nLocalID)); --} -- --bool UMLWidget::loadFromXMI(QDomElement & qElement) --{ -- QString id = qElement.attribute(QLatin1String("xmi.id"), QLatin1String("-1")); -- m_nId = Uml::ID::fromString(id); -- -- WidgetBase::loadFromXMI(qElement); -- QString x = qElement.attribute(QLatin1String("x"), QLatin1String("0")); -- QString y = qElement.attribute(QLatin1String("y"), QLatin1String("0")); -- QString h = qElement.attribute(QLatin1String("height"), QLatin1String("0")); -- QString w = qElement.attribute(QLatin1String("width"), QLatin1String("0")); -- -- setSize(w.toFloat(), h.toFloat()); -- setX(x.toFloat()); -- setY(y.toFloat()); -- QString isinstance = qElement.attribute(QLatin1String("isinstance"), QLatin1String("0")); -- m_isInstance = (bool)isinstance.toInt(); -- m_instanceName = qElement.attribute(QLatin1String("instancename")); -- QString showstereo = qElement.attribute(QLatin1String("showstereotype"), QLatin1String("0")); -- m_showStereotype = (bool)showstereo.toInt(); -- -- QString localid = qElement.attribute(QLatin1String("localid"), QLatin1String("0")); -- if (localid != QLatin1String("0")) { -- m_nLocalID = Uml::ID::fromString(localid); -- } -- -- return true; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/umlwidget.h umbrello-kf6-15.08.1/umbrello/widgets/umlwidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/umlwidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/umlwidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,347 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef UMLWIDGET_H --#define UMLWIDGET_H -- --#include "associationwidgetlist.h" --#include "basictypes.h" --#include "optionstate.h" --#include "umlwidgetlist.h" --#include "widgetbase.h" -- --#include --#include -- --class IDChangeLog; --class UMLDoc; --class UMLObject; --class UMLScene; -- --class QPainter; --class QFontMetrics; -- --/** -- * This is the base class for nearly all graphical widgets. -- * -- * @short The base class for graphical UML objects. -- * @author Paul Hensgen -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UMLWidget : public WidgetBase --{ -- Q_OBJECT --public: -- -- friend class ToolBarStateArrow; // for calling the mouse*Event handlers -- -- static const QSizeF DefaultMinimumSize; -- static const QSizeF DefaultMaximumSize; -- static const qreal defaultMargin; -- -- explicit UMLWidget(UMLScene *scene, WidgetType type = wt_UMLWidget, UMLObject *o = 0); -- explicit UMLWidget(UMLScene *scene, WidgetType type = wt_UMLWidget, Uml::ID::Type id = Uml::ID::None); -- virtual ~UMLWidget(); -- -- // Copy constructor - not implemented. -- // UMLWidget(const UMLWidget& other); -- -- UMLWidget& operator=(const UMLWidget& other); -- -- bool operator==(const UMLWidget& other) const; -- -- void setLocalID(Uml::ID::Type id); -- Uml::ID::Type localID() const; -- -- virtual UMLWidget* widgetWithID(Uml::ID::Type id); -- -- virtual QSizeF minimumSize() const; -- void setMinimumSize(const QSizeF &size); -- -- virtual QSizeF maximumSize(); -- void setMaximumSize(const QSizeF &size); -- -- virtual void setUseFillColor(bool fc); -- void setUseFillColorCmd(bool fc); -- -- virtual void setTextColor(const QColor &color); -- void setTextColorCmd(const QColor &color); -- -- virtual void setLineColor(const QColor &color); -- void setLineColorCmd(const QColor &color); -- -- virtual void setLineWidth(uint width); -- void setLineWidthCmd(uint width); -- -- virtual void setFillColor(const QColor &color); -- void setFillColorCmd(const QColor &color); -- -- void setSelectedFlag(bool _select); -- virtual void setSelected(bool _select); -- -- void setScene(UMLScene *scene); -- -- virtual bool activate(IDChangeLog* ChangeLog = 0); -- -- void setPenFromSettings(QPainter &p); -- void setPenFromSettings(QPainter *p); -- -- virtual void setFont(const QFont &font); -- void setFontCmd(const QFont &font); -- -- /** -- * Returns whether we triggered the update of position movement. -- * If so, you probably don't want to move it. -- * -- * @return The moving state. -- */ -- bool getStartMove() const { -- return m_startMove; -- } -- -- virtual void setX(qreal x); -- virtual void setY(qreal y); -- -- /** -- * Returns the height of widget. -- */ -- qreal height() const { -- return rect().height(); -- } -- -- /** -- * Returns the width of the widget. -- */ -- qreal width() const { -- return rect().width(); -- } -- -- void setSize(qreal width, qreal height); -- void setSize(const QSizeF& size); -- -- virtual void resizeWidget(qreal newW, qreal newH); -- -- bool getIgnoreSnapToGrid() const; -- void setIgnoreSnapToGrid(bool to); -- -- void moveByLocal(qreal dx, qreal dy); -- -- void removeAssoc(AssociationWidget* pAssoc); -- void addAssoc(AssociationWidget* pAssoc); -- -- /** -- * Returns the list of associations connected to this widget. -- */ -- AssociationWidgetList & associationWidgetList() { -- return m_Assocs; -- } -- -- /** -- * Read property of bool m_isInstance -- */ -- bool isInstance() const { -- return m_isInstance; -- } -- -- /** -- * Write property of bool m_isInstance -- */ -- void setIsInstance(bool isInstance) { -- m_isInstance = isInstance; -- } -- -- /** -- * Write property of m_instanceName -- */ -- void setInstanceName(const QString &instanceName) { -- m_instanceName = instanceName; -- } -- -- /** -- * Read property of m_instanceName -- */ -- QString instanceName() const { -- return m_instanceName; -- } -- -- bool showStereotype() const; -- virtual void setShowStereotype(bool flag); -- -- virtual void showPropertiesDialog(); -- -- virtual void adjustAssocs(qreal dx, qreal dy); -- void adjustUnselectedAssocs(qreal dx, qreal dy); -- -- bool isActivated() const; -- void setActivated(bool active = true); -- -- virtual void cleanup(); -- -- static bool widgetHasUMLObject(WidgetBase::WidgetType type); -- -- void updateGeometry(); -- -- void clipSize(); -- -- void forceUpdateFontMetrics(QPainter *painter); -- void forceUpdateFontMetrics(QFont &font, QPainter *painter); -- -- virtual bool loadFromXMI(QDomElement &qElement); -- virtual void saveToXMI(QDomDocument &qDoc, QDomElement &qElement); -- -- QPointF startMovePosition() const; -- void setStartMovePosition(const QPointF &position); -- -- QSizeF startResizeSize() const; -- -- virtual QSizeF calculateSize(bool withExtensions = true) const; -- void resize(); -- -- bool fixedAspectRatio() const { -- return m_fixedAspectRatio; -- } -- -- void setFixedAspectRatio(bool state) { -- m_fixedAspectRatio = state; -- } -- -- typedef enum { -- FT_NORMAL = 0, -- FT_BOLD = 1, -- FT_ITALIC = 2, -- FT_UNDERLINE = 3, -- FT_BOLD_ITALIC = 4, -- FT_BOLD_UNDERLINE = 5, -- FT_ITALIC_UNDERLINE = 6, -- FT_BOLD_ITALIC_UNDERLINE = 7, -- FT_INVALID = 8 -- } FontType; -- -- virtual void setDefaultFontMetrics(QFont &font, UMLWidget::FontType fontType); -- virtual void setDefaultFontMetrics(QFont &font, UMLWidget::FontType fontType, QPainter &painter); -- -- QFontMetrics &getFontMetrics(UMLWidget::FontType fontType) const; -- void setFontMetrics(UMLWidget::FontType fontType, QFontMetrics fm); -- void setupFontType(QFont &font, UMLWidget::FontType fontType); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- --public Q_SLOTS: -- virtual void updateWidget(); -- virtual void slotMenuSelection(QAction* action); -- virtual void slotWidgetMoved(Uml::ID::Type id); -- virtual void slotFillColorChanged(Uml::ID::Type viewID); -- virtual void slotLineColorChanged(Uml::ID::Type viewID); -- virtual void slotTextColorChanged(Uml::ID::Type viewID); -- virtual void slotLineWidthChanged(Uml::ID::Type viewID); -- -- void slotSnapToGrid(); -- --signals: -- /** -- * Emit when the widget moves its' position. -- * @param id The id of the object behind the widget. -- */ -- void sigWidgetMoved(Uml::ID::Type id); -- --protected: -- virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent* event); -- virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); -- virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); -- virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); -- virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); -- -- virtual void moveEvent(QGraphicsSceneMouseEvent *event); -- virtual void moveWidgetBy(qreal diffX, qreal diffY); -- virtual void constrainMovementForAllWidgets(qreal &diffX, qreal &diffY); -- virtual void constrain(qreal& width, qreal& height); -- -- virtual bool isInResizeArea(QGraphicsSceneMouseEvent *me); -- virtual QCursor resizeCursor() const; -- -- void selectSingle(QGraphicsSceneMouseEvent *me); -- void selectMultiple(QGraphicsSceneMouseEvent *me); -- void deselect(QGraphicsSceneMouseEvent *me); -- // void resetSelection(); -- -- void setSelectionBounds(); -- -- void resize(QGraphicsSceneMouseEvent *me); -- -- bool wasSizeChanged(); -- bool wasPositionChanged(); -- -- ///////////////// Data Loaded/Saved ///////////////////////////////// -- -- /// A list of AssociationWidgets between the UMLWidget and other UMLWidgets in the diagram -- AssociationWidgetList m_Assocs; -- -- QString m_instanceName; ///< instance name (used if on a deployment diagram) -- bool m_isInstance; ///< holds whether this widget is a component instance (i.e. on a deployment diagram) -- bool m_showStereotype; ///< should the stereotype be displayed -- -- ///////////////// End of Data Loaded/Saved ////////////////////////// -- -- Uml::ID::Type m_nLocalID; -- bool m_startMove; -- QPointF m_startMovePostion; -- QSizeF m_startResizeSize; -- int m_nPosX; -- UMLDoc *m_doc; ///< shortcut for UMLApp::app()->getDocument() -- bool m_resizable; -- QFontMetrics *m_pFontMetrics[FT_INVALID]; -- QSizeF m_minimumSize; -- QSizeF m_maximumSize; -- -- /// true if the activate function has been called for this class instance -- bool m_activated; -- -- /** -- * Change Widget Behaviour -- */ -- bool m_ignoreSnapToGrid; -- bool m_ignoreSnapComponentSizeToGrid; -- bool m_fixedAspectRatio; -- -- /// The text in the status bar when the cursor was pressed. -- QString m_oldStatusBarMsg; -- -- /// The X/Y offset from the position of the cursor when it was pressed to the -- /// upper left corner of the widget. -- QPointF m_pressOffset; -- -- /// The X/Y position the widget had when the movement started. -- QPointF m_oldPos; -- -- /// The width/height the widget had when the resize started. -- qreal m_oldW, m_oldH; -- -- /// If shift or control button were pressed in mouse press event. -- bool m_shiftPressed; -- -- /** -- * If cursor was in move/resize area when left button was pressed (and no -- * other widgets were selected). -- */ -- bool m_inMoveArea, m_inResizeArea; -- -- /** -- * If the widget was selected/moved/resized in the press and release cycle. -- * Moved/resized is true if the widget was moved/resized even if the final -- * position/size is the same as the starting one. -- */ -- bool m_moved, m_resized; -- --private: -- void init(); -- void toForeground(); -- --}; --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/usecasewidget.cpp umbrello-kf6-15.08.1/umbrello/widgets/usecasewidget.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/usecasewidget.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/usecasewidget.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,96 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header file --#include "usecasewidget.h" -- --// app includes --#include "usecase.h" --#include "umlview.h" -- --/** -- * Creates a UseCase widget. -- * @param scene The parent of the widget. -- * @param o The UMLUseCase to represent. -- */ --UseCaseWidget::UseCaseWidget(UMLScene * scene, UMLUseCase *o) -- : UMLWidget(scene, WidgetBase::wt_UseCase, o) --{ --} -- --/** -- * Destructor. -- */ --UseCaseWidget::~UseCaseWidget() --{ --} -- --/** -- * Overrides the standard paint event. -- */ --void UseCaseWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(option); -- Q_UNUSED(widget); -- -- setPenFromSettings(painter); -- if (UMLWidget::useFillColor()) -- painter->setBrush(UMLWidget::fillColor()); -- QFont font = UMLWidget::font(); -- font.setUnderline(false); -- font.setBold(false); -- font.setItalic(m_umlObject->isAbstract()); -- painter->setFont(font); -- const QFontMetrics &fm = getFontMetrics(FT_NORMAL); -- const int fontHeight = fm.lineSpacing(); -- const int w = width(); -- const int h = height(); -- //int middleX = w / 2; -- bool drawStereotype = umlObject() && !umlObject()->stereotype().isEmpty(); -- const int textStartY = (h / 2) - (drawStereotype ? fontHeight / 4 : fontHeight / 2); -- -- painter->drawEllipse(0, 0, w, h); -- painter->setPen(textColor()); -- if (drawStereotype) -- painter->drawText(UC_MARGIN, textStartY-fontHeight, w - UC_MARGIN * 2, fontHeight, Qt::AlignCenter, umlObject()->stereotype(true)); -- -- painter->drawText(UC_MARGIN, textStartY, w - UC_MARGIN * 2, fontHeight, Qt::AlignCenter, name()); -- setPenFromSettings(painter); -- -- UMLWidget::paint(painter, option, widget); --} -- --/** -- * Saves this UseCase to file. -- */ --void UseCaseWidget::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) --{ -- QDomElement usecaseElement = qDoc.createElement(QLatin1String("usecasewidget")); -- UMLWidget::saveToXMI(qDoc, usecaseElement); -- qElement.appendChild(usecaseElement); --} -- --/** -- * Overrides method from UMLWidget -- */ --QSizeF UseCaseWidget::minimumSize() const --{ -- const UMLWidget::FontType ft = (m_umlObject->isAbstract() ? FT_BOLD_ITALIC : FT_BOLD); -- const QFontMetrics &fm = UMLWidget::getFontMetrics(ft); -- const int fontHeight = fm.lineSpacing(); -- const int textWidth = fm.width(name()); -- bool drawStereotype = umlObject() && !umlObject()->stereotype().isEmpty(); -- int width = textWidth > UC_WIDTH?textWidth:UC_WIDTH; -- int height = UC_HEIGHT + (drawStereotype ? 2 * fontHeight : fontHeight) + UC_MARGIN; -- -- width += UC_MARGIN * 2; -- -- return QSizeF(width, height); --} -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/usecasewidget.h umbrello-kf6-15.08.1/umbrello/widgets/usecasewidget.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/usecasewidget.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/usecasewidget.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,58 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2002-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef USECASEWIDGET_H --#define USECASEWIDGET_H -- --#include "umlwidget.h" -- --class UMLUseCase; -- --#define UC_MARGIN 5 --#define UC_WIDTH 60 --#define UC_HEIGHT 30 -- -- --/** -- * This class is the graphical version of a UMLUseCase. The -- * UseCaseWidget class inherits from the @ref UMLWidget class -- * which adds most of the functionality to this class. -- -- * A UseCaseWidget is created by a @ref UMLView. An UseCaseWidget belongs to only one -- * @ref UMLView instance. When the @ref UMLView instance that this class belongs to, -- * it will be automatically deleted. -- * -- * If the @ref UMLUseCase class that this UseCaseWidget is displaying is deleted, the @ref UMLView will -- * make sure that this instance is also deleted. -- * -- * The UseCaseWidget class inherits from the @ref UMLWidget class which adds most of the functionality -- * to this class. -- * -- * @short A graphical version of a UMLUseCase. -- * @author Paul Hensgen -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class UseCaseWidget : public UMLWidget --{ --public: -- UseCaseWidget(UMLScene * scene, UMLUseCase *o); -- virtual ~UseCaseWidget(); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- -- // For loading we can use the loadFromXMI() inherited from -- // UMLWidget. -- virtual void saveToXMI(QDomDocument & qDoc, QDomElement & qElement); -- --protected: -- QSizeF minimumSize() const; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/widgetbase.cpp umbrello-kf6-15.08.1/umbrello/widgets/widgetbase.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/widgetbase.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/widgetbase.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,1119 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#include "widgetbase.h" -- --#include "classifier.h" --#include "debug_utils.h" --#include "floatingtextwidget.h" --#include "optionstate.h" --#include "uml.h" --#include "umldoc.h" --#include "umlobject.h" --#include "umlscene.h" -- --#if QT_VERSION < 0x050000 --#include --#include --#endif --#include -- --#include --#if QT_VERSION >= 0x050000 --#include --#include --#endif --#include -- --/** -- * Creates a WidgetBase object. -- * -- * @param scene The view to be displayed on. -- * @param type The WidgetType to construct. This must be set to the appropriate -- * value by the constructors of inheriting classes. -- */ --WidgetBase::WidgetBase(UMLScene *scene, WidgetType type) -- : QGraphicsObject(), -- m_baseType(type), -- m_scene(scene), -- m_umlObject(0), -- m_textColor(QColor("black")), -- m_lineColor(QColor("black")), -- m_fillColor(QColor("yellow")), -- m_brush(m_fillColor), -- m_lineWidth(0), // initialize with 0 to have valid start condition -- m_useFillColor(true), -- m_usesDiagramTextColor(true), -- m_usesDiagramLineColor(true), -- m_usesDiagramLineWidth(true) --{ -- setSelected(false); -- scene->addItem(this); -- -- // TODO 310283 -- setFlags(ItemIsSelectable); -- //setFlags(ItemIsSelectable | ItemIsMovable |ItemSendsGeometryChanges); -- if (m_scene) { -- m_usesDiagramLineColor = true; -- m_usesDiagramLineWidth = true; -- m_usesDiagramTextColor = true; -- const Settings::OptionState& optionState = m_scene->optionState(); -- m_textColor = optionState.uiState.textColor; -- m_lineColor = optionState.uiState.lineColor; -- m_lineWidth = optionState.uiState.lineWidth; -- m_font = optionState.uiState.font; -- } else { -- uError() << "WidgetBase constructor: SERIOUS PROBLEM - m_scene is NULL"; -- } --} -- --/** -- * Destructor. -- */ --WidgetBase::~WidgetBase() --{ --} -- --/** -- * Read property of m_baseType. -- */ --WidgetBase::WidgetType WidgetBase::baseType() const --{ -- return m_baseType; --} -- --/** -- * @return The type used for rtti as string. -- */ --QLatin1String WidgetBase::baseTypeStr() const --{ -- return QLatin1String(ENUM_NAME(WidgetBase, WidgetType, m_baseType)); --} -- --/* -- * Sets the state of whether the widget is selected. -- * -- * @param select The state of whether the widget is selected. -- */ --void WidgetBase::setSelected(bool select) --{ -- QGraphicsObject::setSelected(select); --} -- --/** -- * Deliver a pointer to the connected UMLView -- * (needed esp. by event handling of AssociationLine). -- */ --UMLScene* WidgetBase::umlScene() const --{ -- return m_scene; --} -- --/** -- * This is shortcut method for UMLApp::app()->document(). -- * -- * @return Pointer to the UMLDoc object. -- */ --UMLDoc* WidgetBase::umlDoc() const --{ -- return UMLApp::app()->document(); --} -- --/** -- * Returns the @ref UMLObject set to represent. -- * -- * @return the UMLObject to represent. -- */ --UMLObject* WidgetBase::umlObject() const --{ -- return m_umlObject; --} -- --/** -- * Sets the @ref UMLObject to represent. -- * -- * @param obj The object to represent. -- */ --void WidgetBase::setUMLObject(UMLObject *obj) --{ -- m_umlObject = obj; --} -- --/** -- * Write property of m_nId. -- */ --void WidgetBase::setID(Uml::ID::Type id) --{ -- if (m_umlObject) { -- if (m_umlObject->id() != Uml::ID::None) -- uWarning() << "changing old UMLObject " << Uml::ID::toString(m_umlObject->id()) -- << " to " << Uml::ID::toString(id); -- m_umlObject->setID(id); -- } -- m_nId = id; --} -- --/** -- * Read property of m_nId. -- */ --Uml::ID::Type WidgetBase::id() const --{ -- if (m_umlObject) -- return m_umlObject->id(); -- return m_nId; --} -- --/** -- * Used by some child classes to get documentation. -- * -- * @return The documentation from the UMLObject (if m_umlObject is set.) -- */ --QString WidgetBase::documentation() const --{ -- if (m_umlObject) -- return m_umlObject->doc(); -- return m_Doc; --} -- --/** -- * Returns state of documentation for the widget. -- * -- * @return false if documentation is empty -- */ --bool WidgetBase::hasDocumentation() --{ -- if (m_umlObject) -- return m_umlObject->hasDoc(); -- return !m_Doc.isEmpty(); --} -- --/** -- * Used by some child classes to set documentation. -- * -- * @param doc The documentation to be set in the UMLObject -- * (if m_umlObject is set.) -- */ --void WidgetBase::setDocumentation(const QString& doc) --{ -- if (m_umlObject) -- m_umlObject->setDoc(doc); -- else -- m_Doc = doc; --} -- --/** -- * Gets the name from the corresponding UMLObject if this widget has an -- * underlying UMLObject; if it does not, then it returns the local -- * m_Text (notably the case for FloatingTextWidget.) -- * -- * @return the currently set name -- */ --QString WidgetBase::name() const --{ -- if (m_umlObject) -- return m_umlObject->name(); -- return m_Text; --} -- --/** -- * Sets the name in the corresponding UMLObject. -- * Sets the local m_Text if m_umlObject is NULL. -- * -- * @param strName The name to be set. -- */ --void WidgetBase::setName(const QString &strName) --{ -- if (m_umlObject) -- m_umlObject->setName(strName); -- else -- m_Text = strName; --} -- --/** -- * Returns text color -- * -- * @return currently used text color -- */ --QColor WidgetBase::textColor() const --{ -- return m_textColor; --} -- --/** -- * Sets the text color -- * -- * @param color the new text color -- */ --void WidgetBase::setTextColor(const QColor &color) --{ -- m_textColor = color; -- m_usesDiagramTextColor = false; --} -- --/** -- * Returns line color -- * -- * @return currently used line color -- */ --QColor WidgetBase::lineColor() const --{ -- return m_lineColor; --} -- --/** -- * Sets the line color -- * -- * @param color The new line color -- */ --void WidgetBase::setLineColor(const QColor &color) --{ -- m_lineColor = color; -- m_usesDiagramLineColor = false; --} -- --/** -- * Returns fill color -- * -- * @return currently used fill color -- */ --QColor WidgetBase::fillColor() const --{ -- return m_fillColor; --} -- --/** -- * Sets the fill color -- * -- * @param color The new fill color -- */ --void WidgetBase::setFillColor(const QColor &color) --{ -- m_fillColor = color; -- m_usesDiagramFillColor = false; --} -- --/** -- * Returns line width -- * -- * @return currently used line with -- */ --uint WidgetBase::lineWidth() const --{ -- return m_lineWidth; --} -- --/** -- * Sets the line width -- * -- * @param width The new line width -- */ --void WidgetBase::setLineWidth(uint width) --{ -- m_lineWidth = width; -- m_usesDiagramLineWidth = false; --} -- --/** -- * Return state of fill color usage -- * -- * @return True if fill color is used -- */ --bool WidgetBase::useFillColor() --{ -- return m_useFillColor; --} -- --/** -- * Set state if fill color is used -- * -- * @param state The state to set -- */ --void WidgetBase::setUseFillColor(bool state) --{ -- m_useFillColor = state; -- m_usesDiagramUseFillColor = false; --} -- --/** -- * Returns state if diagram text color is used -- * -- * @return True means diagram text color is used -- */ --bool WidgetBase::usesDiagramTextColor() const --{ -- return m_usesDiagramTextColor; --} -- --/** -- * Set state if diagram text color is used -- * -- * @param state The state to set -- */ --void WidgetBase::setUsesDiagramTextColor(bool state) --{ -- if (m_usesDiagramTextColor == state) { -- return; -- } -- m_usesDiagramTextColor = state; -- setTextColor(m_textColor); --} -- --/** -- * Returns state of diagram line color is used -- * -- * @return True means diagrams line color is used --*/ --bool WidgetBase::usesDiagramLineColor() const --{ -- return m_usesDiagramLineColor; --} -- --/** -- * Set state of diagram line color is used -- * -- * @param state The state to set -- */ --void WidgetBase::setUsesDiagramLineColor(bool state) --{ -- m_usesDiagramLineColor = state; --} -- --/** -- * Returns state of diagram fill color is used -- * -- * @return True means diagrams fill color is used --*/ --bool WidgetBase::usesDiagramFillColor() const --{ -- return m_usesDiagramFillColor; --} -- --/** -- * Set state if diagram fill color is used -- * -- * @param state The state to set -- */ --void WidgetBase::setUsesDiagramFillColor(bool state) --{ -- m_usesDiagramFillColor = state; --} -- --/** -- * Returns state of diagram use fill color is used -- * -- * @return True means diagrams fill color is used --*/ --bool WidgetBase::usesDiagramUseFillColor() const --{ -- return m_usesDiagramUseFillColor; --} -- --/** -- * Set state of diagram use fill color is used -- * -- * @param state The state to set -- */ --void WidgetBase::setUsesDiagramUseFillColor(bool state) --{ -- m_usesDiagramUseFillColor = state; --} -- --/** -- * Returns state of diagram line width is used -- * -- * @return True means diagrams line width is used -- */ --bool WidgetBase::usesDiagramLineWidth() const --{ -- return m_usesDiagramLineWidth; --} -- --/** -- * Set state of diagram line width is used -- * -- * @param state The state to set -- */ --void WidgetBase::setUsesDiagramLineWidth(bool state) --{ -- m_usesDiagramLineWidth = state; --} -- --/** -- * Returns the font used for diaplaying any text. -- * @return the font -- */ --QFont WidgetBase::font() const --{ -- return m_font; --} -- --/** -- * Set the font used to display text inside this widget. -- */ --void WidgetBase::setFont(const QFont& font) --{ -- m_font = font; --} -- --/** -- * A virtual method for the widget to display a property dialog box. -- * Subclasses should reimplment this appropriately. -- */ --void WidgetBase::showPropertiesDialog() --{ --} -- --/** -- * A virtual method to save the properties of this widget into a -- * QDomElement i.e xml. -- * -- * Subclasses should first create a new dedicated element as the child -- * of \a qElement parameter passed. Then this base method should be -- * called to save basic widget properties. -- * -- * @param qDoc A QDomDocument object representing the xml document. -- * @param qElement A QDomElement representing xml element data. -- */ --void WidgetBase::saveToXMI(QDomDocument& qDoc, QDomElement& qElement) -- { -- Q_UNUSED(qDoc) -- -- qElement.setAttribute(QLatin1String("textcolor"), m_usesDiagramTextColor ? QLatin1String("none") -- : m_textColor.name()); -- if (m_usesDiagramLineColor) { -- qElement.setAttribute(QLatin1String("linecolor"), QLatin1String("none")); -- } else { -- qElement.setAttribute(QLatin1String("linecolor"), m_lineColor.name()); -- } -- if (m_usesDiagramLineWidth) { -- qElement.setAttribute(QLatin1String("linewidth"), QLatin1String("none")); -- } else { -- qElement.setAttribute(QLatin1String("linewidth"), m_lineWidth); -- } -- qElement.setAttribute(QLatin1String("usefillcolor"), m_useFillColor); -- // for consistency the following attributes now use american spelling for "color" -- qElement.setAttribute(QLatin1String("usesdiagramfillcolor"), m_usesDiagramFillColor); -- qElement.setAttribute(QLatin1String("usesdiagramusefillcolor"), m_usesDiagramUseFillColor); -- if (m_usesDiagramFillColor) { -- qElement.setAttribute(QLatin1String("fillcolor"), QLatin1String("none")); -- } else { -- qElement.setAttribute(QLatin1String("fillcolor"), m_fillColor.name()); -- } -- qElement.setAttribute(QLatin1String("font"), m_font.toString()); --} -- --/** -- * A virtual method to load the properties of this widget from a -- * QDomElement into this widget. -- * -- * Subclasses should reimplement this to load addtional properties -- * required, calling this base method to load the basic properties of -- * the widget. -- * -- * @param qElement A QDomElement which contains xml info for this widget. -- * -- * @todo Add support to load older version. -- */ --bool WidgetBase::loadFromXMI(QDomElement& qElement) --{ -- // first load from "linecolour" and then overwrite with the "linecolor" -- // attribute if that one is present. The "linecolour" name was a "typo" in -- // earlier versions of umbrello-kf6 -- QString lineColor = qElement.attribute(QLatin1String("linecolour"), QLatin1String("none")); -- lineColor = qElement.attribute(QLatin1String("linecolor"), lineColor); -- if (lineColor != QLatin1String("none")) { -- m_lineColor = QColor(lineColor); -- m_usesDiagramLineColor = false; -- } else if (m_baseType != WidgetBase::wt_Box && m_scene != NULL) { -- m_lineColor = m_scene->lineColor(); -- m_usesDiagramLineColor = true; -- } -- QString lineWidth = qElement.attribute(QLatin1String("linewidth"), QLatin1String("none")); -- if (lineWidth != QLatin1String("none")) { -- m_lineWidth = lineWidth.toInt(); -- m_usesDiagramLineWidth = false; -- } else if (m_scene) { -- m_lineWidth = m_scene->lineWidth(); -- m_usesDiagramLineWidth = true; -- } -- QString textColor = qElement.attribute(QLatin1String("textcolor"), QLatin1String("none")); -- if (textColor != QLatin1String("none")) { -- m_textColor = QColor(textColor); -- m_usesDiagramTextColor = false; -- } else if (m_scene) { -- m_textColor = m_scene->textColor(); -- m_usesDiagramTextColor = true; -- } -- QString usefillcolor = qElement.attribute(QLatin1String("usefillcolor"), QLatin1String("1")); -- m_useFillColor = (bool)usefillcolor.toInt(); -- /* -- For the next three *color attributes, there was a mixup of american and english spelling for "color". -- So first we need to keep backward compatibility and try to retrieve the *colour attribute. -- Next we overwrite this value if we find a *color, otherwise the former *colour is kept. -- */ -- QString fillColor = qElement.attribute(QLatin1String("fillcolour"), QLatin1String("none")); -- fillColor = qElement.attribute(QLatin1String("fillcolor"), fillColor); -- if (fillColor != QLatin1String("none")) { -- m_fillColor = QColor(fillColor); -- } -- -- QString usesDiagramFillColor = qElement.attribute(QLatin1String("usesdiagramfillcolour"), QLatin1String("1")); -- usesDiagramFillColor = qElement.attribute(QLatin1String("usesdiagramfillcolor"), usesDiagramFillColor); -- m_usesDiagramFillColor = (bool)usesDiagramFillColor.toInt(); -- -- QString usesDiagramUseFillColor = qElement.attribute(QLatin1String("usesdiagramusefillcolour"), QLatin1String("1")); -- usesDiagramUseFillColor = qElement.attribute(QLatin1String("usesdiagramusefillcolor"), usesDiagramUseFillColor); -- m_usesDiagramUseFillColor = (bool)usesDiagramUseFillColor.toInt(); -- -- QString font = qElement.attribute(QLatin1String("font")); -- if (!font.isEmpty()) { -- QFont newFont; -- newFont.fromString(font); -- m_font = newFont; -- } else { -- uWarning() << "Using default font " << m_font.toString() -- << " for widget with xmi.id " << Uml::ID::toString(m_nId); -- } -- -- return true; --} -- --/** -- * Assignment operator -- */ --WidgetBase& WidgetBase::operator=(const WidgetBase& other) --{ -- m_baseType = other.m_baseType; -- m_scene = other.m_scene; -- m_umlObject = other.m_umlObject; -- m_Doc = other.m_Doc; -- m_Text = other.m_Text; -- m_nId = other.m_nId; -- m_textColor = other.m_textColor; -- m_lineColor = other.m_lineColor; -- m_fillColor = other.m_fillColor; -- m_brush = other.m_brush; -- m_font = other.m_font; -- m_lineWidth = other.m_lineWidth; -- m_useFillColor = other.m_useFillColor; -- m_usesDiagramTextColor = other.m_usesDiagramTextColor; -- m_usesDiagramLineColor = other.m_usesDiagramLineColor; -- m_usesDiagramFillColor = other.m_usesDiagramFillColor; -- m_usesDiagramLineWidth = other.m_usesDiagramLineWidth; -- setSelected(other.isSelected()); -- -- return *this; --} -- --/** -- * return drawing rectangle of widget in local coordinates -- */ --QRectF WidgetBase::rect() const --{ -- return m_rect; --} -- --/** -- * set widget rectangle in item coordinates -- */ --void WidgetBase::setRect(const QRectF& rect) --{ -- if (m_rect == rect) -- return; -- prepareGeometryChange(); -- m_rect = rect; -- update(); --} -- --/** -- * set widget rectangle in item coordinates -- */ --void WidgetBase::setRect(qreal x, qreal y, qreal width, qreal height) --{ -- setRect(QRectF(x, y, width, height)); --} -- --/** -- * @return The bounding rectangle for this widget. -- * @see setRect -- */ --QRectF WidgetBase::boundingRect() const --{ -- int halfWidth = lineWidth()/2; -- return m_rect.adjusted(-halfWidth, -halfWidth, halfWidth, halfWidth); --} -- --/** -- * Test if point is inside the bounding rectangle of the widget. -- * Inheriting classes may reimplement this to test possible child widgets. -- * -- * @param p Point to be checked. -- * -- * @return 'this' if the given point is in the boundaries of the widget; -- * else NULL. -- */ --UMLWidget* WidgetBase::onWidget(const QPointF &p) --{ -- UMLWidget *uw = dynamic_cast(this); -- if (uw == NULL) -- return NULL; -- const qreal w = m_rect.width(); -- const qreal h = m_rect.height(); -- const qreal left = x(); // don't use m_rect.x() for this, it is always 0 -- const qreal right = left + w; -- const qreal top = y(); // don't use m_rect.y() for this, it is always 0 -- const qreal bottom = top + h; -- // uDebug() << "p=(" << p.x() << "," << p.y() -- // << "), x=" << left << ", y=" << top << ", w=" << w << ", h=" << h -- // << "; right=" << right << ", bottom=" << bottom; -- if (p.x() < left || p.x() > right || -- p.y() < top || p.y() > bottom) { // Qt coord.sys. origin in top left corner -- // uDebug() << "returning NULL"; -- return NULL; -- } -- // uDebug() << "returning this"; -- return uw; --} -- --/** -- * Draws the UMLWidget on the given paint device -- * -- * @param painter The painter for the drawing device -- * @param option Painting related options -- * @param widget Background widget on which to paint (optional) -- * -- */ --void WidgetBase::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) --{ -- Q_UNUSED(painter); Q_UNUSED(option); Q_UNUSED(widget); --} -- --/** -- * Reimplemented to show appropriate context menu. -- */ --void WidgetBase::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) --{ -- event->accept(); -- uDebug() << "widget = " << name() << " / type = " << baseTypeStr(); -- -- UMLScene *scene = umlScene(); -- -- // If right-click was done on a widget that was not selected, clear the -- // current selection and select the new widget. The context menu is shown -- // with actions for that single widget. -- // If a keyboard modifier was used, add the widget to the current selection -- // and show the menu with actions for the whole selection. -- if (!isSelected()) { -- Qt::KeyboardModifiers forSelection = (Qt::ControlModifier | Qt::ShiftModifier); -- if ((event->modifiers() & forSelection) == 0) { -- scene->clearSelected(); -- } -- -- if (umlObject() != 0) { -- scene->selectWidget(dynamic_cast(this)); -- } else { -- setSelected(true); -- } -- } -- -- int count = scene->selectedCount(true); -- -- // Determine multi state -- bool multi = (isSelected() && count > 1); -- -- ListPopupMenu popup(0, this, multi, scene->getUniqueSelectionType()); -- -- // Disable the "view code" menu for simple code generators -- if (UMLApp::app()->isSimpleCodeGeneratorActive()) { -- popup.setActionEnabled(ListPopupMenu::mt_ViewCode, false); -- } -- -- QAction *triggered = popup.exec(event->screenPos()); -- ListPopupMenu *parentMenu = ListPopupMenu::menuFromAction(triggered); -- -- if (!parentMenu) { -- uDebug() << "Action's data field does not contain ListPopupMenu pointer"; -- return; -- } -- -- WidgetBase *ownerWidget = parentMenu->ownerWidget(); -- // assert because logic is based on only WidgetBase being the owner of -- // ListPopupMenu actions executed in this context menu. -- Q_ASSERT_X(ownerWidget != 0, "WidgetBase::contextMenuEvent", -- "ownerWidget is null which means action belonging to UMLView, UMLScene" -- " or UMLObject is the one triggered in ListPopupMenu"); -- -- ownerWidget->slotMenuSelection(triggered); --} -- --/** -- * This is usually called synchronously after menu.exec() and \a -- * trigger's parent is always the ListPopupMenu which can be used to -- * get the type of action of \a trigger. -- * -- * @note Subclasses can reimplement to handle specific actions and -- * leave the rest to WidgetBase::slotMenuSelection. -- */ --void WidgetBase::slotMenuSelection(QAction *trigger) --{ -- if (!trigger) { -- return; -- } -- QColor newColor; -- -- const WidgetType wt = m_baseType; // short hand name -- -- ListPopupMenu::MenuType sel = ListPopupMenu::typeFromAction(trigger); -- switch (sel) { -- case ListPopupMenu::mt_Rename: -- umlDoc()->renameUMLObject(umlObject()); -- break; -- -- case ListPopupMenu::mt_Properties: -- if (wt == WidgetBase::wt_Actor || wt == WidgetBase::wt_UseCase || -- wt == WidgetBase::wt_Package || wt == WidgetBase::wt_Interface || -- wt == WidgetBase::wt_Datatype || wt == WidgetBase::wt_Node || -- wt == WidgetBase::wt_Component || wt == WidgetBase::wt_Artifact || -- wt == WidgetBase::wt_Enum || wt == WidgetBase::wt_Entity || -- wt == WidgetBase::wt_Port || -- (wt == WidgetBase::wt_Class && umlScene()->type() == Uml::DiagramType::Class)) { -- -- showPropertiesDialog(); -- -- } else if (wt == WidgetBase::wt_Object) { -- m_umlObject->showPropertiesDialog(); -- } else { -- uWarning() << "making properties dialog for unknown widget type"; -- } -- break; -- -- case ListPopupMenu::mt_Line_Color: -- case ListPopupMenu::mt_Line_Color_Selection: --#if QT_VERSION >= 0x050000 -- newColor = QColorDialog::getColor(lineColor()); -- if (newColor != lineColor()) { --#else -- newColor = lineColor(); -- if (KColorDialog::getColor(newColor)) { --#endif -- if (sel == ListPopupMenu::mt_Line_Color_Selection) { -- umlScene()->selectionSetLineColor(newColor); -- } else { -- setLineColor(newColor); -- } -- setUsesDiagramLineColor(false); -- umlDoc()->setModified(true); -- } -- break; -- -- case ListPopupMenu::mt_Fill_Color: -- case ListPopupMenu::mt_Fill_Color_Selection: --#if QT_VERSION >= 0x050000 -- newColor = QColorDialog::getColor(fillColor()); -- if (newColor != fillColor()) { --#else -- newColor = fillColor(); -- if (KColorDialog::getColor(newColor)) { --#endif -- if (sel == ListPopupMenu::mt_Fill_Color_Selection) { -- umlScene()->selectionSetFillColor(newColor); -- } else { -- setFillColor(newColor); -- } -- umlDoc()->setModified(true); -- } -- break; -- -- case ListPopupMenu::mt_Use_Fill_Color: -- setUseFillColor(!m_useFillColor); -- break; -- -- case ListPopupMenu::mt_Set_Use_Fill_Color_Selection: -- umlScene()->selectionUseFillColor(true); -- break; -- -- case ListPopupMenu::mt_Unset_Use_Fill_Color_Selection: -- umlScene()->selectionUseFillColor(false); -- break; -- -- case ListPopupMenu::mt_Show_Attributes_Selection: -- case ListPopupMenu::mt_Hide_Attributes_Selection: -- umlScene()->selectionSetVisualProperty( -- ClassifierWidget::ShowAttributes, sel != ListPopupMenu::mt_Hide_Attributes_Selection -- ); -- break; -- -- case ListPopupMenu::mt_Show_Operations_Selection: -- case ListPopupMenu::mt_Hide_Operations_Selection: -- umlScene()->selectionSetVisualProperty( -- ClassifierWidget::ShowOperations, sel != ListPopupMenu::mt_Hide_Operations_Selection -- ); -- break; -- -- case ListPopupMenu::mt_Show_Visibility_Selection: -- case ListPopupMenu::mt_Hide_Visibility_Selection: -- umlScene()->selectionSetVisualProperty( -- ClassifierWidget::ShowVisibility, sel != ListPopupMenu::mt_Hide_Visibility_Selection -- ); -- break; -- -- case ListPopupMenu::mt_Show_Operation_Signature_Selection: -- case ListPopupMenu::mt_Hide_Operation_Signature_Selection: -- umlScene()->selectionSetVisualProperty( -- ClassifierWidget::ShowOperationSignature, sel != ListPopupMenu::mt_Hide_Operation_Signature_Selection -- ); -- break; -- -- case ListPopupMenu::mt_Show_Attribute_Signature_Selection: -- case ListPopupMenu::mt_Hide_Attribute_Signature_Selection: -- umlScene()->selectionSetVisualProperty( -- ClassifierWidget::ShowAttributeSignature, sel != ListPopupMenu::mt_Hide_Attribute_Signature_Selection -- ); -- break; -- -- case ListPopupMenu::mt_Show_Packages_Selection: -- case ListPopupMenu::mt_Hide_Packages_Selection: -- umlScene()->selectionSetVisualProperty( -- ClassifierWidget::ShowPackage, sel != ListPopupMenu::mt_Hide_Packages_Selection -- ); -- break; -- -- case ListPopupMenu::mt_Show_Stereotypes_Selection: -- case ListPopupMenu::mt_Hide_Stereotypes_Selection: -- umlScene()->selectionSetVisualProperty( -- ClassifierWidget::ShowStereotype, sel != ListPopupMenu::mt_Hide_Stereotypes_Selection -- ); -- break; -- -- case ListPopupMenu::mt_Hide_NonPublic_Selection: -- case ListPopupMenu::mt_Show_NonPublic_Selection: -- umlScene()->selectionSetVisualProperty( -- ClassifierWidget::ShowPublicOnly, sel != ListPopupMenu::mt_Show_NonPublic_Selection -- ); -- break; -- -- -- case ListPopupMenu::mt_ViewCode: { -- UMLClassifier *c = dynamic_cast(umlObject()); -- if (c) { -- UMLApp::app()->viewCodeDocument(c); -- } -- break; -- } -- -- case ListPopupMenu::mt_Delete: -- umlScene()->deleteSelection(); -- break; -- -- case ListPopupMenu::mt_Change_Font: -- case ListPopupMenu::mt_Change_Font_Selection: { --#if QT_VERSION >= 0x050000 -- bool ok = false; -- QFont newFont = QFontDialog::getFont(&ok, font()); -- if (ok) { --#else -- QFont newFont = font(); -- if (KFontDialog::getFont(newFont, KFontChooser::NoDisplayFlags, 0) == KFontDialog::Accepted) { --#endif -- if (sel == ListPopupMenu::mt_Change_Font_Selection) { -- m_scene->selectionSetFont(newFont); -- } else { -- setFont(newFont); -- } -- } -- } -- break; -- -- case ListPopupMenu::mt_Cut: -- umlScene()->setStartedCut(); -- UMLApp::app()->slotEditCut(); -- break; -- -- case ListPopupMenu::mt_Copy: -- UMLApp::app()->slotEditCopy(); -- break; -- -- case ListPopupMenu::mt_Paste: -- UMLApp::app()->slotEditPaste(); -- break; -- -- case ListPopupMenu::mt_Refactoring: -- //check if we are operating on a classifier, or some other kind of UMLObject -- if (dynamic_cast(umlObject())) { -- UMLApp::app()->refactor(static_cast(umlObject())); -- } -- break; -- -- case ListPopupMenu::mt_Clone: -- { -- foreach (UMLWidget* widget, umlScene()->selectedWidgets()) { -- if (Model_Utils::isCloneable(widget->baseType())) { -- UMLObject *clone = widget->umlObject()->clone(); -- umlScene()->addObject(clone); -- } -- } -- } -- break; -- -- case ListPopupMenu::mt_Rename_MultiA: -- case ListPopupMenu::mt_Rename_MultiB: -- case ListPopupMenu::mt_Rename_Name: -- case ListPopupMenu::mt_Rename_RoleAName: -- case ListPopupMenu::mt_Rename_RoleBName: { -- FloatingTextWidget *ft = static_cast(this); -- ft->handleRename(); -- break; -- } -- case ListPopupMenu::mt_Align_Right: -- umlScene()->alignRight(); -- break; -- case ListPopupMenu::mt_Align_Left: -- umlScene()->alignLeft(); -- break; -- case ListPopupMenu::mt_Align_Top: -- umlScene()->alignTop(); -- break; -- case ListPopupMenu::mt_Align_Bottom: -- umlScene()->alignBottom(); -- break; -- case ListPopupMenu::mt_Align_VerticalMiddle: -- umlScene()->alignVerticalMiddle(); -- break; -- case ListPopupMenu::mt_Align_HorizontalMiddle: -- umlScene()->alignHorizontalMiddle(); -- break; -- case ListPopupMenu::mt_Align_VerticalDistribute: -- umlScene()->alignVerticalDistribute(); -- break; -- case ListPopupMenu::mt_Align_HorizontalDistribute: -- umlScene()->alignHorizontalDistribute(); -- break; -- default: -- uDebug() << "MenuType " << ListPopupMenu::toString(sel) << " not implemented"; -- break; -- } --} -- --/** -- * Helper function for debug output. -- * Returns the given enum value as string. -- * @param wt WidgetType of which a string representation is wanted -- * @return the WidgetType as string -- */ --QString WidgetBase::toString(WidgetType wt) --{ -- return QLatin1String(ENUM_NAME(WidgetBase, WidgetType, wt)); --} -- --/** -- * Returns the given enum value as localized string. -- * @param wt WidgetType of which a string representation is wanted -- * @return the WidgetType as localized string -- */ --QString WidgetBase::toI18nString(WidgetType wt) --{ -- QString name; -- -- switch (wt) { -- case wt_Activity: -- name = i18n("Activity"); -- break; -- case wt_Actor: -- name = i18n("Actor"); -- break; -- case wt_Artifact: -- name = i18n("Artifact"); -- break; -- case wt_Association: -- name = i18n("Association"); -- break; -- case wt_Box: -- name = i18n("Box"); -- break; -- case wt_Category: -- name = i18n("Category"); -- break; -- case wt_CombinedFragment: -- name = i18n("CombinedFragment"); -- break; -- case wt_Component: -- name = i18n("Component"); -- break; -- case wt_Class: -- name = i18n("Class"); -- break; -- case wt_Datatype: -- name = i18n("Datatype"); -- break; -- case wt_Entity: -- name = i18n("Entity"); -- break; -- case wt_Enum: -- name = i18n("Enum"); -- break; -- case wt_FloatingDashLine: -- name = i18n("FloatingDashLine"); -- break; -- case wt_ForkJoin: -- name = i18n("ForkJoin"); -- break; -- case wt_Interface: -- name = i18n("Interface"); -- break; -- case wt_Message: -- name = i18n("Message"); -- break; -- case wt_Node: -- name = i18n("Node"); -- break; -- case wt_Note: -- name = i18n("Note"); -- break; -- case wt_Object: -- name = i18n("Object"); -- break; -- case wt_ObjectNode: -- name = i18n("ObjectNode"); -- break; -- case wt_Package: -- name = i18n("Package"); -- break; -- case wt_Pin: -- name = i18n("Pin"); -- break; -- case wt_Port: -- name = i18n("Port"); -- break; -- case wt_Precondition: -- name = i18n("Precondition"); -- break; -- case wt_Region: -- name = i18n("Region"); -- break; -- case wt_Signal: -- name = i18n("Signal"); -- break; -- case wt_State: -- name = i18n("State"); -- break; -- case wt_Text: -- name = i18n("Text"); -- break; -- case wt_UseCase: -- name = i18n("UseCase"); -- break; -- default: -- name = QLatin1String(" &name:"); -- uWarning() << "unknown widget type"; -- break; -- } -- return name; --} -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/widgetbase.h umbrello-kf6-15.08.1/umbrello/widgets/widgetbase.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/widgetbase.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/widgetbase.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,192 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef WIDGETBASE_H --#define WIDGETBASE_H -- --#include "basictypes.h" -- --#include --#include --#include --#include --#include --#include -- --// forward declarations --class QAction; --class UMLDoc; --class UMLObject; --class UMLScene; --class UMLWidget; // required by function onWidget() -- --/** -- * @short Common base class for UMLWidget and AssociationWidget -- * @author Oliver Kellogg -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --class WidgetBase : public QGraphicsObject --{ -- Q_OBJECT -- Q_ENUMS(WidgetType) -- --public: -- enum WidgetType -- { -- wt_UMLWidget = 300, // does not have UMLObject representation -- wt_Actor, // has UMLObject representation -- wt_UseCase, // has UMLObject representation -- wt_Class, // has UMLObject representation -- wt_Interface, // has UMLObject representation -- wt_Datatype, // has UMLObject representation -- wt_Enum, // has UMLObject representation -- wt_Entity, // has UMLObject representation -- wt_Package, // has UMLObject representation -- wt_Object, // has UMLObject representation -- wt_Note, // does not have UMLObject representation -- wt_Box, // does not have UMLObject representation -- wt_Message, // does not have UMLObject representation -- wt_Text, // does not have UMLObject representation -- wt_State, // does not have UMLObject representation -- wt_Activity, // does not have UMLObject representation -- wt_Component, // has UMLObject representation -- wt_Artifact, // has UMLObject representation -- wt_Node, // has UMLObject representation -- wt_Association, // has UMLObject representation -- wt_ForkJoin, // does not have UMLObject representation -- wt_Precondition, // does not have UMLObject representation -- wt_CombinedFragment, // does not have UMLObject representation -- wt_FloatingDashLine, // does not have UMLObject representation -- wt_Signal, // does not have UMLObject representation -- wt_Pin, -- wt_ObjectNode, -- wt_Region, -- wt_Category, // has UMLObject representation -- wt_Port // has UMLObject representation -- }; -- -- static QString toString(WidgetType wt); -- static QString toI18nString(WidgetType wt); -- -- explicit WidgetBase(UMLScene * scene, WidgetType type= wt_UMLWidget); -- virtual ~WidgetBase(); -- -- UMLObject* umlObject() const; -- virtual void setUMLObject(UMLObject *obj); -- -- Uml::ID::Type id() const; -- void setID(Uml::ID::Type id); -- -- WidgetType baseType() const; -- QLatin1String baseTypeStr() const; -- -- virtual void setSelected(bool select); -- -- UMLScene* umlScene() const; -- UMLDoc* umlDoc() const; -- -- QString documentation() const; -- bool hasDocumentation(); -- virtual void setDocumentation(const QString& doc); -- -- QString name() const; -- virtual void setName(const QString &strName); -- -- QColor lineColor() const; -- virtual void setLineColor(const QColor& color); -- -- uint lineWidth() const; -- virtual void setLineWidth(uint width); -- -- QColor textColor() const; -- virtual void setTextColor(const QColor& color); -- -- QColor fillColor() const; -- virtual void setFillColor(const QColor& color); -- -- bool usesDiagramLineColor() const; -- void setUsesDiagramLineColor(bool state); -- -- bool usesDiagramLineWidth() const; -- void setUsesDiagramLineWidth(bool state); -- -- bool useFillColor(); -- virtual void setUseFillColor(bool state); -- -- bool usesDiagramTextColor() const; -- void setUsesDiagramTextColor(bool state); -- -- bool usesDiagramFillColor() const; -- void setUsesDiagramFillColor(bool state); -- -- bool usesDiagramUseFillColor() const; -- void setUsesDiagramUseFillColor(bool state); -- -- virtual QFont font() const; -- virtual void setFont(const QFont& font); -- -- virtual void showPropertiesDialog(); -- -- virtual bool loadFromXMI(QDomElement &qElement); -- virtual void saveToXMI(QDomDocument &qDoc, QDomElement &qElement); -- -- WidgetBase& operator=(const WidgetBase& other); -- -- QRectF rect() const; -- void setRect(const QRectF& rect); -- void setRect(qreal x, qreal y, qreal width, qreal height); -- -- virtual QRectF boundingRect() const; -- -- virtual UMLWidget* onWidget(const QPointF &p); -- -- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); -- --public Q_SLOTS: -- virtual void slotMenuSelection(QAction *trigger); -- --protected: -- virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); -- -- WidgetType m_baseType; ///< Type of widget. -- UMLScene *m_scene; -- UMLObject *m_umlObject; -- QString m_Doc; ///< Only used if m_umlObject is not set. -- QString m_Text; -- QRectF m_rect; ///< widget size -- -- /** -- * This ID is only used when the widget does not have a -- * corresponding UMLObject (i.e. the m_umlObject pointer is NULL.) -- * For UMLObjects, the ID from the UMLObject is used. -- */ -- Uml::ID::Type m_nId; -- -- QColor m_textColor; ///< Color of the text of the widget. Is saved to XMI. -- QColor m_lineColor; ///< Color of the lines of the widget. Is saved to XMI. -- QColor m_fillColor; ///< color of the background of the widget -- QBrush m_brush; -- QFont m_font; -- uint m_lineWidth; ///< Width of the lines of the widget. Is saved to XMI. -- bool m_useFillColor; ///< flag indicates if the UMLWidget uses the Diagram FillColour -- -- /** -- * true by default, false if the colors have -- * been explicitly set for this widget. -- * These are saved to XMI. -- */ -- bool m_usesDiagramTextColor; -- bool m_usesDiagramLineColor; -- bool m_usesDiagramFillColor; -- bool m_usesDiagramUseFillColor; -- bool m_usesDiagramLineWidth; --}; -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/widget_factory.cpp umbrello-kf6-15.08.1/umbrello/widgets/widget_factory.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/widget_factory.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/widget_factory.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,296 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2006-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "widget_factory.h" -- --// app includes --#include "activitywidget.h" --#include "actor.h" --#include "actorwidget.h" --#include "artifact.h" --#include "artifactwidget.h" --#include "associationwidget.h" --#include "boxwidget.h" --#include "category.h" --#include "categorywidget.h" --#include "classifier.h" --#include "classifierwidget.h" --#include "cmds.h" --#include "combinedfragmentwidget.h" --#include "component.h" --#include "componentwidget.h" --#include "datatypewidget.h" --#include "debug_utils.h" --#include "entity.h" --#include "entitywidget.h" --#include "enum.h" --#include "enumwidget.h" --#include "floatingdashlinewidget.h" --#include "floatingtextwidget.h" --#include "folder.h" --#include "forkjoinwidget.h" --#include "messagewidget.h" --#include "node.h" --#include "nodewidget.h" --#include "notewidget.h" --#include "object_factory.h" --#include "objectnodewidget.h" --#include "objectwidget.h" --#include "package.h" --#include "packagewidget.h" --#include "pinwidget.h" --#include "port.h" --#include "portwidget.h" --#include "preconditionwidget.h" --#include "regionwidget.h" --#include "signalwidget.h" --#include "statewidget.h" --#include "uml.h" --#include "umldoc.h" --#include "umlscene.h" --#include "umlview.h" --#include "usecase.h" --#include "usecasewidget.h" -- --namespace Widget_Factory { -- --/** -- * Create a UMLWidget in the given view and representing the given document object. -- */ --UMLWidget *createWidget(UMLScene *scene, UMLObject *o) --{ -- QPointF pos = scene->pos(); -- int y = pos.y(); -- Uml::DiagramType::Enum diagramType = scene->type(); -- UMLObject::ObjectType type = o->baseType(); -- UMLWidget *newWidget = NULL; -- switch (type) { -- case UMLObject::ot_Actor: -- if (diagramType == Uml::DiagramType::Sequence) { -- ObjectWidget *ow = new ObjectWidget(scene, o); -- ow->setDrawAsActor(true); -- y = ow->topMargin(); -- newWidget = ow; -- } else -- newWidget = new ActorWidget(scene, static_cast(o)); -- break; -- case UMLObject::ot_UseCase: -- newWidget = new UseCaseWidget(scene, static_cast(o)); -- break; -- case UMLObject::ot_Folder: -- case UMLObject::ot_Package: -- newWidget = new ClassifierWidget(scene, static_cast(o)); -- break; -- case UMLObject::ot_Component: -- newWidget = new ComponentWidget(scene, static_cast(o)); -- if (diagramType == Uml::DiagramType::Deployment) { -- newWidget->setIsInstance(true); -- } -- break; -- case UMLObject::ot_Port: -- { -- PinPortBase *pw = new PortWidget(scene, static_cast(o)); -- pw->attachToOwner(); -- newWidget = pw; -- } -- break; -- case UMLObject::ot_Node: -- newWidget = new NodeWidget(scene, static_cast(o)); -- break; -- case UMLObject::ot_Artifact: -- newWidget = new ArtifactWidget(scene, static_cast(o)); -- break; -- case UMLObject::ot_Datatype: -- newWidget = new DatatypeWidget(scene, static_cast(o)); -- break; -- case UMLObject::ot_Enum: -- newWidget = new EnumWidget(scene, static_cast(o)); -- break; -- case UMLObject::ot_Entity: -- newWidget = new EntityWidget(scene, static_cast(o)); -- break; -- case UMLObject::ot_Interface: -- if (diagramType == Uml::DiagramType::Sequence || diagramType == Uml::DiagramType::Collaboration) { -- ObjectWidget *ow = new ObjectWidget(scene, o); -- if (diagramType == Uml::DiagramType::Sequence) { -- y = ow->topMargin(); -- } -- newWidget = ow; -- } else { -- UMLClassifier *c = static_cast(o); -- ClassifierWidget* interfaceWidget = new ClassifierWidget(scene, c); -- if (diagramType == Uml::DiagramType::Component || diagramType == Uml::DiagramType::Deployment) { -- interfaceWidget->setDrawAsCircle(true); -- } -- newWidget = interfaceWidget; -- } -- break; -- case UMLObject::ot_Class: -- //see if we really want an object widget or class widget -- if (diagramType == Uml::DiagramType::Class || diagramType == Uml::DiagramType::Component) { -- UMLClassifier *c = static_cast(o); -- ClassifierWidget *cw = new ClassifierWidget(scene, c); -- if (diagramType == Uml::DiagramType::Component) -- cw->setDrawAsCircle(true); -- newWidget = cw; -- } else { -- ObjectWidget *ow = new ObjectWidget(scene, o); -- if (diagramType == Uml::DiagramType::Sequence) { -- y = ow->topMargin(); -- } -- newWidget = ow; -- } -- break; -- case UMLObject::ot_Category: -- newWidget = new CategoryWidget(scene, static_cast(o)); -- break; -- default: -- uWarning() << "trying to create an invalid widget (" << UMLObject::toString(type) << ")"; -- } -- -- if (newWidget) { -- newWidget->setX(pos.x()); -- newWidget->setY(y); -- } -- -- return newWidget; --} -- --bool validateObjType(UMLObject::ObjectType expected, UMLObject* &o, Uml::ID::Type id) --{ -- if (o == NULL) { -- uDebug() << "Widget_Factory::validateObjType: creating new object of type " -- << expected; -- QString artificialName = QLatin1String("LOST_") + Uml::ID::toString(id); -- o = Object_Factory::createUMLObject(expected, artificialName, NULL, false); -- if (o == NULL) -- return false; -- o->setID(id); -- UMLPackage *parentPkg = o->umlPackage(); -- parentPkg->addObject(o); -- return true; -- } -- UMLObject::ObjectType actual = o->baseType(); -- if (actual == expected) -- return true; -- uError() << "validateObjType(" << o->name() -- << "): expected type " << UMLObject::toString(expected) << ", actual type " -- << UMLObject::toString(actual); -- return false; --} -- --/** -- * Create a UMLWidget according to the given XMI tag. -- */ --UMLWidget* makeWidgetFromXMI(const QString& tag, -- const QString& idStr, UMLScene *scene) --{ -- UMLWidget *widget = NULL; -- -- // Loading of widgets which do NOT represent any UMLObject, -- // just graphic stuff with no real model information -- //FIXME while boxes and texts are just diagram objects, activities and -- // states should be UMLObjects -- if (tag == QLatin1String("statewidget") || tag == QLatin1String("UML:StateWidget")) { -- widget = new StateWidget(scene, StateWidget::Normal, Uml::ID::Reserved); -- } else if (tag == QLatin1String("notewidget") || tag == QLatin1String("UML:NoteWidget")) { -- widget = new NoteWidget(scene, NoteWidget::Normal, Uml::ID::Reserved); -- } else if (tag == QLatin1String("boxwidget")) { -- widget = new BoxWidget(scene, Uml::ID::Reserved); -- } else if (tag == QLatin1String("floatingtext") || tag == QLatin1String("UML:FloatingTextWidget")) { -- widget = new FloatingTextWidget(scene, Uml::TextRole::Floating, QString(), Uml::ID::Reserved); -- } else if (tag == QLatin1String("activitywidget") || tag == QLatin1String("UML:ActivityWidget")) { -- widget = new ActivityWidget(scene, ActivityWidget::Initial, Uml::ID::Reserved); -- } else if (tag == QLatin1String("messagewidget")) { -- widget = new MessageWidget(scene, Uml::SequenceMessage::Asynchronous, Uml::ID::Reserved); -- } else if (tag == QLatin1String("forkjoin")) { -- widget = new ForkJoinWidget(scene, Qt::Vertical, Uml::ID::Reserved); -- } else if (tag == QLatin1String("preconditionwidget")) { -- widget = new PreconditionWidget(scene, NULL, Uml::ID::Reserved); -- } else if (tag == QLatin1String("combinedFragmentwidget")) { -- widget = new CombinedFragmentWidget(scene, CombinedFragmentWidget::Ref, Uml::ID::Reserved); -- } else if (tag == QLatin1String("signalwidget")) { -- widget = new SignalWidget(scene, SignalWidget::Send, Uml::ID::Reserved); -- } else if (tag == QLatin1String("floatingdashlinewidget")) { -- widget = new FloatingDashLineWidget(scene, Uml::ID::Reserved); -- } else if (tag == QLatin1String("objectnodewidget")) { -- widget = new ObjectNodeWidget(scene, ObjectNodeWidget::Normal, Uml::ID::Reserved); -- } else if (tag == QLatin1String("regionwidget")) { -- widget = new RegionWidget(scene, Uml::ID::Reserved); -- } else if (tag == QLatin1String("pinwidget")) { -- PinPortBase *pw = new PinWidget(scene, NULL, Uml::ID::Reserved); -- pw->attachToOwner(); -- widget = pw; -- } -- else -- { -- // Loading of widgets which represent an UMLObject -- -- // Find the UMLObject and create the Widget to represent it -- Uml::ID::Type id = Uml::ID::fromString(idStr); -- UMLDoc *umldoc = UMLApp::app()->document(); -- UMLObject *o = umldoc->findObjectById(id); -- if (o == NULL) { -- uDebug() << "makeWidgetFromXMI: cannot find object with id " -- << Uml::ID::toString(id); -- } -- -- if (tag == QLatin1String("actorwidget") || tag == QLatin1String("UML:ActorWidget")) { -- if (validateObjType(UMLObject::ot_Actor, o, id)) -- widget = new ActorWidget(scene, static_cast(o)); -- } else if (tag == QLatin1String("usecasewidget") || tag == QLatin1String("UML:UseCaseWidget")) { -- if (validateObjType(UMLObject::ot_UseCase, o, id)) -- widget = new UseCaseWidget(scene, static_cast(o)); -- } else if (tag == QLatin1String("classwidget") || -- tag == QLatin1String("UML:ClassWidget") || tag == QLatin1String("UML:ConceptWidget")) { -- if (validateObjType(UMLObject::ot_Class, o, id)) -- widget = new ClassifierWidget(scene, static_cast(o)); -- } else if (tag == QLatin1String("packagewidget")) { -- if (validateObjType(UMLObject::ot_Package, o, id)) -- widget = new ClassifierWidget(scene, static_cast(o)); -- } else if (tag == QLatin1String("componentwidget")) { -- if (validateObjType(UMLObject::ot_Component, o, id)) -- widget = new ComponentWidget(scene, static_cast(o)); -- } else if (tag == QLatin1String("portwidget")) { -- if (validateObjType(UMLObject::ot_Port, o, id)) -- widget = new PortWidget(scene, static_cast(o)); -- } else if (tag == QLatin1String("nodewidget")) { -- if (validateObjType(UMLObject::ot_Node, o, id)) -- widget = new NodeWidget(scene, static_cast(o)); -- } else if (tag == QLatin1String("artifactwidget")) { -- if (validateObjType(UMLObject::ot_Artifact, o, id)) -- widget = new ArtifactWidget(scene, static_cast(o)); -- } else if (tag == QLatin1String("interfacewidget")) { -- if (validateObjType(UMLObject::ot_Interface, o, id)) -- widget = new ClassifierWidget(scene, static_cast(o)); -- } else if (tag == QLatin1String("datatypewidget")) { -- if (validateObjType(UMLObject::ot_Datatype, o, id)) -- widget = new DatatypeWidget(scene, static_cast(o)); -- } else if (tag == QLatin1String("enumwidget")) { -- if (validateObjType(UMLObject::ot_Enum, o, id)) -- widget = new EnumWidget(scene, static_cast(o)); -- } else if (tag == QLatin1String("entitywidget")) { -- if (validateObjType(UMLObject::ot_Entity, o, id)) -- widget = new EntityWidget(scene, static_cast(o)); -- } else if (tag == QLatin1String("categorywidget")) { -- if (validateObjType(UMLObject::ot_Category, o, id)) -- widget = new CategoryWidget(scene, static_cast(o)); -- } else if (tag == QLatin1String("objectwidget") || tag == QLatin1String("UML:ObjectWidget")) { -- widget = new ObjectWidget(scene, o); -- } else { -- uWarning() << "Trying to create an unknown widget:" << tag; -- } -- } -- return widget; --} -- --} // end namespace Widget_Factory -- -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/widget_factory.h umbrello-kf6-15.08.1/umbrello/widgets/widget_factory.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/widget_factory.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/widget_factory.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,34 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2006-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef WIDGET_FACTORY_H --#define WIDGET_FACTORY_H -- --#include -- --// forward declarations --class UMLObject; --class UMLScene; --class UMLWidget; -- --/** -- * Widget factory methods. -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --namespace Widget_Factory { -- -- UMLWidget *createWidget(UMLScene *scene, UMLObject *docObj); -- -- UMLWidget* makeWidgetFromXMI(const QString& tag, -- const QString& idStr, UMLScene *scene); -- --} // end namespace Widget_Factory -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/widgetlist_utils.cpp umbrello-kf6-15.08.1/umbrello/widgets/widgetlist_utils.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/widgetlist_utils.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/widgetlist_utils.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,157 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2009-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "widgetlist_utils.h" -- --// app includes --#include "debug_utils.h" --#include "umlwidget.h" -- --// qt/kde includes --#include -- --namespace WidgetList_Utils --{ -- --/** -- * Looks for the smallest x-value of the given UMLWidgets. -- * @param widgetList A list with UMLWidgets. -- * @return The smallest X position. -- */ --qreal getSmallestX(const UMLWidgetList &widgetList) --{ -- qreal smallestX = 0; -- -- int i = 1; -- foreach(UMLWidget *widget, widgetList) { -- if (i == 1) { -- smallestX = widget->x(); -- } else { -- if (smallestX > widget->x()) -- smallestX = widget->x(); -- } -- i++; -- } -- -- return smallestX; --} -- --/** -- * Looks for the smallest y-value of the given UMLWidgets. -- * @param widgetList A list with UMLWidgets. -- * @return The smallest Y position. -- */ --qreal getSmallestY(const UMLWidgetList &widgetList) --{ -- if (widgetList.isEmpty()) -- return -1; -- -- qreal smallestY = 0; -- -- int i = 1; -- foreach(UMLWidget *widget, widgetList) { -- if (i == 1) { -- smallestY = widget->y(); -- } else { -- if (smallestY > widget->y()) -- smallestY = widget->y(); -- } -- i++; -- } -- -- return smallestY; --} -- --/** -- * Looks for the biggest x-value of the given UMLWidgets. -- * @param widgetList A list with UMLWidgets. -- * @return The biggest X position. -- */ --qreal getBiggestX(const UMLWidgetList &widgetList) --{ -- if (widgetList.isEmpty()) -- return -1; -- -- qreal biggestX = 0; -- -- int i = 1; -- foreach(UMLWidget *widget, widgetList) { -- if (i == 1) { -- biggestX = widget->x(); -- biggestX += widget->width(); -- } else { -- if (biggestX < widget->x() + widget->width()) -- biggestX = widget->x() + widget->width(); -- } -- i++; -- } -- -- return biggestX; --} -- --/** -- * Looks for the biggest y-value of the given UMLWidgets. -- * @param widgetList A list with UMLWidgets. -- * @return The biggest Y position. -- */ --qreal getBiggestY(const UMLWidgetList &widgetList) --{ -- if (widgetList.isEmpty()) -- return -1; -- -- qreal biggestY = 0; -- -- int i = 1; -- foreach(UMLWidget *widget, widgetList) { -- if (i == 1) { -- biggestY = widget->y(); -- biggestY += widget->height(); -- } else { -- if (biggestY < widget->y() + widget->height()) -- biggestY = widget->y() + widget->height(); -- } -- i++; -- } -- -- return biggestY; --} -- --/** -- * Returns the sum of the heights of the given UMLWidgets -- * @param widgetList A list with UMLWidgets. -- */ --qreal getHeightsSum(const UMLWidgetList &widgetList) --{ -- qreal heightsSum = 0; -- -- foreach(UMLWidget *widget, widgetList) { -- heightsSum += widget->height(); -- } -- -- return heightsSum; --} -- --/** -- * Returns the sum of the widths of the given UMLWidgets. -- * @param widgetList A list with UMLWidgets. -- */ --qreal getWidthsSum(const UMLWidgetList &widgetList) --{ -- qreal widthsSum = 0; -- -- foreach(UMLWidget *widget, widgetList) { -- widthsSum += widget->width(); -- } -- -- return widthsSum; --} -- --} // namespace WidgetList_Utils -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/widgetlist_utils.h umbrello-kf6-15.08.1/umbrello/widgets/widgetlist_utils.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/widgetlist_utils.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/widgetlist_utils.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,30 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2009-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef WIDGETLIST_UTILS_H --#define WIDGETLIST_UTILS_H -- --#include "umlwidgetlist.h" -- --/** -- * General purpose-kf6 widget list utilities. -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --namespace WidgetList_Utils --{ -- qreal getSmallestX(const UMLWidgetList &widgetList); -- qreal getSmallestY(const UMLWidgetList &widgetList); -- qreal getBiggestX(const UMLWidgetList &widgetList); -- qreal getBiggestY(const UMLWidgetList &widgetList); -- qreal getHeightsSum(const UMLWidgetList &widgetList); -- qreal getWidthsSum(const UMLWidgetList &widgetList); --} // namespace WidgetList_Utils -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/widget_utils.cpp umbrello-kf6-15.08.1/umbrello/widgets/widget_utils.cpp ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/widget_utils.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/widget_utils.cpp 1970-01-01 02:00:00.000000000 +0200 -@@ -1,827 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --// own header --#include "widget_utils.h" -- --// app includes --#include "debug_utils.h" --#include "objectwidget.h" --#include "messagewidget.h" --#include "umlwidget.h" -- --// qt includes --#include --#include --#include --#include --#include -- --// c++ include --#include -- --namespace Widget_Utils --{ -- -- /** -- * Find the widget identified by the given ID in the given widget -- * or message list. -- * -- * @param id The unique ID to find. -- * @param widgets The UMLWidgetList to search in. -- * @param messages Optional pointer to a MessageWidgetList to search in. -- */ -- UMLWidget* findWidget(Uml::ID::Type id, -- const UMLWidgetList& widgets, -- const MessageWidgetList* messages /* = 0 */) -- { -- foreach (UMLWidget* obj, widgets) { -- if (obj->baseType() == WidgetBase::wt_Object) { -- if (static_cast(obj)->localID() == id) -- return obj; -- } else if (obj->id() == id) { -- return obj; -- } -- } -- -- if (messages) { -- foreach (UMLWidget* obj, *messages) { -- if (obj->id() == id) -- return obj; -- } -- } -- return NULL; -- } -- -- /** -- * Creates the decoration point. -- * @param p base point to decorate -- * @param parent parent item -- * @return decoration point -- */ -- QGraphicsRectItem* decoratePoint(const QPointF &p, QGraphicsItem* parent) -- { -- const qreal SIZE = 4.0; -- const qreal SIZE_HALF = SIZE / 2.0; -- QGraphicsRectItem *rect = new QGraphicsRectItem(p.x() - SIZE_HALF, -- p.y() - SIZE_HALF, -- SIZE, SIZE, -- parent); -- rect->setBrush(QBrush(Qt::blue)); -- rect->setPen(QPen(Qt::blue)); -- return rect; -- } -- -- /** -- * Calculates and draws a cross inside an ellipse -- * @param p Pointer to a QPainter object. -- * @param r The rectangle describing the ellipse. -- */ -- void drawCrossInEllipse(QPainter *p, const QRectF& r) -- { -- QRectF ellipse = r; -- ellipse.moveCenter(QPointF(0, 0)); -- qreal a = ellipse.width() * 0.5; -- qreal b = ellipse.height() * .5; -- qreal xc = ellipse.center().x(); -- qreal yc = ellipse.center().y(); -- -- // The first point's x value is chosen to be center.x() + 70% of x radius. -- qreal x1 = ellipse.center().x() + .7 * .5 * ellipse.width(); -- // Calculate y1 corresponding to x1 using formula. -- qreal y1_sqr = b*b*(1 - (x1 * x1) / (a*a)); -- qreal y1 = std::sqrt(y1_sqr); -- -- // Mirror x1, y1 along both the axes to get 4 points for the cross. -- QPointF p1(xc + x1, yc + y1); -- QPointF p2(xc - x1, yc + y1); -- QPointF p3(xc + x1, yc - y1); -- QPointF p4(xc - x1, yc - y1); -- -- // Translate as we calculate for ellipse with (0, 0) as center. -- p->translate(r.center().x(), r.center().y()); -- -- // Draw the cross now -- p->drawLine(QLineF(p1, p4)); -- p->drawLine(QLineF(p2, p3)); -- -- // Restore the translate on painter. -- p->translate(-r.center().x(), -r.center().y()); -- } -- -- /** -- * Draws a polygon which is almost rectangular except for the top -- * right corner. A triangle is drawn in top right corner of the -- * rectangle. -- * -- * @param painter The painter with which this shape is to be drawn. -- * @param rect The rectangle dimensions. -- * @param triSize The size of the triangle in the top-right corner. -- */ -- void drawTriangledRect(QPainter *painter, -- const QRectF &rect, const QSizeF &triSize) -- { -- // Draw outer boundary defined by polygon "poly". -- QPolygonF poly(5); -- poly[0] = rect.topLeft(); -- poly[1] = rect.topRight() - QPointF(triSize.width(), 0); -- poly[2] = rect.topRight() + QPointF(0, triSize.height()); -- poly[3] = rect.bottomRight(); -- poly[4] = rect.bottomLeft(); -- painter->drawPolygon(poly); -- -- // Now draw the triangle base and height edges. -- QLineF heightEdge(poly[1], poly[1] + QPointF(0, triSize.height())); -- painter->drawLine(heightEdge); -- QLineF baseEdge(heightEdge.p2(), poly[2]); -- painter->drawLine(baseEdge); -- } -- --// /** --// * Draws an arrow head with the given painter, with the arrow --// * sharp point at \a headPos. --// * --// * param painter The painter with which this arrow should be drawn. --// * param headPos The position where the head of the arrow should lie. --// * param arrowSize This indicates the size of the arrow head. --// * param arrowType This indicates direction of arrow as in LeftArrow, RightArrow.. --// * param solid-kf6 If true, a solid-kf6 head is drawn. Otherwise 2 lines are drawn. --// */ --// void drawArrowHead(QPainter *painter, const QPointF &arrowPos, --// const QSizeF& arrowSize, Qt::ArrowType arrowType, --// bool solid-kf6) --// { --// QPolygonF poly; --// if (arrowType == Qt::LeftArrow) { --// poly << QPointF(arrowPos.x() + arrowSize.width(), arrowPos.y() - .5 * arrowSize.height()) --// << arrowPos --// << QPointF(arrowPos.x() + arrowSize.width(), arrowPos.y() + .5 * arrowSize.height()); --// } --// else if (arrowType == Qt::RightArrow) { --// poly << QPointF(arrowPos.x() - arrowSize.width(), arrowPos.y() - .5 * arrowSize.height()) --// << arrowPos --// << QPointF(arrowPos.x() - arrowSize.width(), arrowPos.y() + .5 * arrowSize.height()); --// } -- --// if (solid-kf6) { --// painter->drawPolygon(poly); --// } --// else { --// painter->drawPolyline(poly); --// } --// } -- --// /** --// * Draws a rounded rect rounded at specified corners. --// * --// * param painter The painter with which this round rect should be drawn. --// * param rect The rectangle to be drawn. --// * param xRadius The x radius of rounded corner. --// * param yRadius The y radius of rounded corner. --// * param corners The corners to be rounded. --// */ --// void drawRoundedRect(QPainter *painter, const QRectF& rect, qreal xRadius, --// qreal yRadius, Uml::Corners corners) --// { --// if (xRadius < 0 || yRadius < 0) { --// painter->drawRect(rect); --// return; --// } --// QRectF arcRect(0, 0, 2 * xRadius, 2 * yRadius); -- --// QPainterPath path; --// path.moveTo(rect.left(), rect.top() + yRadius); --// if (corners.testFlag(Uml::Corner::TopLeft)) { --// arcRect.moveTopLeft(rect.topLeft()); --// path.arcTo(arcRect, 180, -90); --// } else { --// path.lineTo(rect.topLeft()); --// } -- --// path.lineTo(rect.right() - xRadius, rect.top()); -- --// if (corners.testFlag(Uml::Corner::TopRight)) { --// arcRect.moveTopRight(rect.topRight()); --// path.arcTo(arcRect, 90, -90); --// } else { --// path.lineTo(rect.topRight()); --// } -- --// path.lineTo(rect.right(), rect.bottom() - yRadius); -- --// if (corners.testFlag(Uml::Corner::BottomRight)) { --// arcRect.moveBottomRight(rect.bottomRight()); --// path.arcTo(arcRect, 0, -90); --// } else { --// path.lineTo(rect.bottomRight()); --// } -- --// path.lineTo(rect.left() + xRadius, rect.bottom()); -- --// if (corners.testFlag(Uml::Corner::BottomLeft)) { --// arcRect.moveBottomLeft(rect.bottomLeft()); --// path.arcTo(arcRect, 270, 90); --// } else { --// path.lineTo(rect.bottomLeft()); --// } -- --// path.closeSubpath(); --// painter->drawPath(path); --// } -- -- /** -- * Converts a point to a comma separated string i.e "x,y" -- * @param point The QPointF to convert. -- */ -- QString pointToString(const QPointF& point) -- { -- return QString::fromLatin1("%1,%2").arg(point.x()).arg(point.y()); -- } -- -- /** -- * Converts a comma separated string to point. -- */ -- QPointF stringToPoint(const QString& str) -- { -- QPointF retVal; -- QStringList list = str.split(QLatin1Char(',')); -- -- if(list.size() == 2) { -- retVal.setX(list.first().toDouble()); -- retVal.setY(list.last().toDouble()); -- } -- return retVal; -- } -- -- /** -- * Loads pixmap from xmi. -- * -- * @param pixEle The dom element from which pixmap should be loaded. -- * -- * @param pixmap The pixmap into which the image should be loaded. -- * -- * @return True or false based on success or failure of this method. -- */ -- bool loadPixmapFromXMI(QDomElement &pixEle, QPixmap &pixmap) -- { -- if (pixEle.isNull()) { -- return false; -- } -- QDomElement xpmElement = pixEle.firstChildElement(QLatin1String("xpm")); -- -- QByteArray xpmData = xpmElement.text().toLatin1(); -- QBuffer buffer(&xpmData); -- buffer.open(QIODevice::ReadOnly); -- -- QImageReader reader(&buffer, "xpm"); -- QImage image; -- if (!reader.read(&image)) { -- return false; -- } -- -- pixmap = QPixmap::fromImage(image); -- return true; -- } -- -- /** -- * Saves pixmap information into DOM element \a qElement. -- * -- * @param qDoc The DOM document object. -- * -- * @param qElement The DOM element into which the pixmap should be -- * saved. -- * -- * @param pixmap The pixmap to be saved. -- */ -- void savePixmapToXMI(QDomDocument &qDoc, QDomElement &qElement, const QPixmap& pixmap) -- { -- QDomElement pixmapElement = qDoc.createElement(QLatin1String("pixmap")); -- -- QDomElement xpmElement = qDoc.createElement(QLatin1String("xpm")); -- pixmapElement.appendChild(xpmElement); -- -- QBuffer buffer; -- buffer.open(QIODevice::WriteOnly); -- pixmap.save(&buffer, "xpm"); -- buffer.close(); -- -- xpmElement.appendChild(qDoc.createTextNode(QString::fromLatin1(buffer.data()))); -- -- qElement.appendChild(pixmapElement); -- } -- -- /** -- * Loads gradient from xmi. The gradient pointer should be null -- * and the new gradient object will be created inside this method. -- * The gradient should later be deleted externally. -- * -- * @param gradientElement The DOM element from which gradient should be -- * loaded. -- * -- * @param gradient The pointer to gradient into which the gradient -- * should be loaded. (Allocated inside this -- * method) -- * -- * @return True or false based on success or failure of this method. -- */ -- bool loadGradientFromXMI(QDomElement &gradientElement, QGradient *&gradient) -- { -- if(gradientElement.isNull()) { -- return false; -- } -- -- int type_as_int; -- QGradient::Type type; -- QGradientStops stops; -- QGradient::CoordinateMode cmode = QGradient::LogicalMode; -- QGradient::Spread spread = QGradient::PadSpread; -- -- type_as_int = gradientElement.attribute(QLatin1String("type")).toInt(); -- type = QGradient::Type(type_as_int); -- type_as_int = gradientElement.attribute(QLatin1String("spread")).toInt(); -- spread = QGradient::Spread(type_as_int); -- type_as_int = gradientElement.attribute(QLatin1String("coordinatemode")).toInt(); -- cmode = QGradient::CoordinateMode(type_as_int); -- -- QDomElement stopElement = gradientElement.firstChildElement(QLatin1String("stops")); -- if(stopElement.isNull()) { -- return false; -- } -- for(QDomNode node = stopElement.firstChild(); !node.isNull(); node = node.nextSibling()) { -- QDomElement ele = node.toElement(); -- if(ele.tagName() != QLatin1String("stop")) { -- continue; -- } -- -- qreal posn = ele.attribute(QLatin1String("position")).toDouble(); -- QColor color = QColor(ele.attribute(QLatin1String("color"))); -- stops << QGradientStop(posn, color); -- } -- -- if (type == QGradient::LinearGradient) { -- QPointF p1 = stringToPoint(gradientElement.attribute(QLatin1String("start"))); -- QPointF p2 = stringToPoint(gradientElement.attribute(QLatin1String("finalstop"))); -- gradient = new QLinearGradient(p1, p2); -- } -- else if (type == QGradient::RadialGradient) { -- QPointF center = stringToPoint(gradientElement.attribute(QLatin1String("center"))); -- QPointF focal = stringToPoint(gradientElement.attribute(QLatin1String("focalpoint"))); -- double radius = gradientElement.attribute(QLatin1String("radius")).toDouble(); -- gradient = new QRadialGradient(center, radius, focal); -- } -- else { // type == QGradient::ConicalGradient -- QPointF center = stringToPoint(gradientElement.attribute(QLatin1String("center"))); -- double angle = gradientElement.attribute(QLatin1String("angle")).toDouble(); -- gradient = new QConicalGradient(center, angle); -- } -- -- if(gradient) { -- gradient->setStops(stops); -- gradient->setSpread(spread); -- gradient->setCoordinateMode(cmode); -- return true; -- } -- -- return false; -- } -- -- /** -- * Saves gradient information into DOM element \a qElement. -- * -- * @param qDoc The DOM document object. -- * -- * @param qElement The DOM element into which the gradient should be -- * saved. -- * -- * @param gradient The gradient to be saved. -- */ -- void saveGradientToXMI(QDomDocument &qDoc, QDomElement &qElement, const QGradient *gradient) -- { -- QDomElement gradientElement = qDoc.createElement(QLatin1String("gradient")); -- -- gradientElement.setAttribute(QLatin1String("type"), int(gradient->type())); -- gradientElement.setAttribute(QLatin1String("spread"), int(gradient->spread())); -- gradientElement.setAttribute(QLatin1String("coordinatemode"), int(gradient->coordinateMode())); -- -- QDomElement stopsElement = qDoc.createElement(QLatin1String("stops")); -- gradientElement.appendChild(stopsElement); -- -- foreach(const QGradientStop& stop, gradient->stops()) { -- QDomElement ele = qDoc.createElement(QLatin1String("stop")); -- ele.setAttribute(QLatin1String("position"), stop.first); -- ele.setAttribute(QLatin1String("color"), stop.second.name()); -- stopsElement.appendChild(ele); -- } -- -- QGradient::Type type = gradient->type(); -- -- if(type == QGradient::LinearGradient) { -- const QLinearGradient *lg = static_cast(gradient); -- gradientElement.setAttribute(QLatin1String("start"), pointToString(lg->start())); -- gradientElement.setAttribute(QLatin1String("finalstop"), pointToString(lg->finalStop())); -- } -- else if(type == QGradient::RadialGradient) { -- const QRadialGradient *rg = static_cast(gradient); -- gradientElement.setAttribute(QLatin1String("center"), pointToString(rg->center())); -- gradientElement.setAttribute(QLatin1String("focalpoint"), pointToString(rg->focalPoint())); -- gradientElement.setAttribute(QLatin1String("radius"), rg->radius()); -- } -- else { //type == QGradient::ConicalGradient -- const QConicalGradient *cg = static_cast(gradient); -- gradientElement.setAttribute(QLatin1String("center"), pointToString(cg->center())); -- gradientElement.setAttribute(QLatin1String("angle"), cg->angle()); -- } -- -- qElement.appendChild(gradientElement); -- } -- -- /** -- * Extracts the QBrush properties into brush from the XMI xml -- * element qElement. -- * -- * @param qElement The DOM element from which the xmi info should -- * be extracted. -- * -- * @param brush The QBrush object into which brush details should -- * be read into. -- */ -- bool loadBrushFromXMI(QDomElement &qElement, QBrush &brush) -- { -- if(qElement.isNull()) { -- return false; -- } -- -- quint8 style = qElement.attribute(QLatin1String("style")).toShort(); -- const QString colorString = qElement.attribute(QLatin1String("color")); -- QColor color; -- color.setNamedColor(colorString); -- -- if(style == Qt::TexturePattern) { -- QPixmap pixmap; -- QDomElement pixElement = qElement.firstChildElement(QLatin1String("pixmap")); -- if(!loadPixmapFromXMI(pixElement, pixmap)) { -- return false; -- } -- brush = QBrush(color, pixmap); -- } -- -- else if(style == Qt::LinearGradientPattern -- || style == Qt::RadialGradientPattern -- || style == Qt::ConicalGradientPattern) { -- QGradient *gradient = 0; -- QDomElement gradElement = qElement.firstChildElement(QLatin1String("gradient")); -- -- if(!loadGradientFromXMI(gradElement, gradient) || !gradient) { -- delete gradient; -- return false; -- } -- -- brush = QBrush(*gradient); -- delete gradient; -- } -- -- else { -- brush = QBrush(color, (Qt::BrushStyle)style); -- } -- -- //TODO: Checks if transform needs to be loaded. -- -- return true; -- } -- -- /** -- * Saves the brush info as xmi into the DOM element \a qElement. -- * -- * @param qDoc The QDomDocument object pointing to the xmi document. -- * -- * @param qElement The element into which the pen, brush and font -- * info should be saved. -- * -- * @param brush The QBrush whose details should be saved. -- */ -- void saveBrushToXMI(QDomDocument &qDoc, QDomElement &qElement, -- const QBrush& brush) -- { -- QDomElement brushElement = qDoc.createElement(QLatin1String("brush")); -- -- brushElement.setAttribute(QLatin1String("style"), (quint8)brush.style()); -- brushElement.setAttribute(QLatin1String("color"), brush.color().name()); -- -- if(brush.style() == Qt::TexturePattern) { -- savePixmapToXMI(qDoc, brushElement, brush.texture()); -- } -- else if(brush.style() == Qt::LinearGradientPattern -- || brush.style() == Qt::RadialGradientPattern -- || brush.style() == Qt::ConicalGradientPattern) { -- saveGradientToXMI(qDoc, brushElement, brush.gradient()); -- } -- -- //TODO: Check if transform of this brush needs to be saved. -- qElement.appendChild(brushElement); -- } -- -- /** -- * Returns true if the first widget's X is smaller than second's. -- * Used for sorting the UMLWidgetList. -- * @param widget1 The widget to compare. -- * @param widget2 The widget to compare with. -- */ -- bool hasSmallerX(const UMLWidget* widget1, const UMLWidget* widget2) -- { -- return widget1->x() < widget2->x(); -- } -- -- /** -- * Returns true if the first widget's Y is smaller than second's. -- * Used for sorting the UMLWidgetList. -- * @param widget1 The widget to compare. -- * @param widget2 The widget to compare with. -- */ -- bool hasSmallerY(const UMLWidget* widget1, const UMLWidget* widget2) -- { -- return widget1->y() < widget2->y(); -- } -- -- /** -- * Find the region in which the rectangle \a other lies with respect to -- * the rectangle \a self. -- * Beware that the Qt coordinate system has its origin point (0,0) in -- * the upper left corner with Y values growing downwards, thus the Y -- * related comparisons might look inverted if your are used to the -- * natural coordinate system with (0,0) in the lower left corner. -- */ -- Uml::Region::Enum findRegion(const QRectF& self, const QRectF &other) -- { -- const qreal ownX = self.x(); -- const qreal ownY = self.y(); -- const qreal ownWidth = self.width(); -- const qreal ownHeight = self.height(); -- const qreal otherX = other.x(); -- const qreal otherY = other.y(); -- const qreal otherWidth = other.width(); -- const qreal otherHeight = other.height(); -- Uml::Region::Enum region = Uml::Region::Center; -- if (otherX + otherWidth < ownX) { -- if (otherY + otherHeight < ownY) -- region = Uml::Region::NorthWest; -- else if (otherY > ownY + ownHeight) -- region = Uml::Region::SouthWest; -- else -- region = Uml::Region::West; -- } else if (otherX > ownX + ownWidth) { -- if (otherY + otherHeight < ownY) -- region = Uml::Region::NorthEast; -- else if (otherY > ownY + ownHeight) -- region = Uml::Region::SouthEast; -- else -- region = Uml::Region::East; -- } else { -- if (otherY + otherHeight < ownY) -- region = Uml::Region::North; -- else if (otherY > ownY + ownHeight) -- region = Uml::Region::South; -- else -- region = Uml::Region::Center; -- } -- return region; -- } -- -- /** -- * Return the point in \a poly which precedes the point at index \a index. -- * If \a index is 0 then return the last (or, if \a poly.isClosed() is -- * true, the second to last) point. -- */ -- QPointF prevPoint(int index, const QPolygonF& poly) { -- if (poly.size() < 3 || index >= poly.size()) -- return QPoint(); -- if (index == 0) -- return poly.at(poly.size() - 1 - (int)poly.isClosed()); -- return poly.at(index - 1); -- } -- -- /** -- * Return the point in \a poly which follows the point at index \a index. -- * If \a index is the last index then return the first (or, if -- * \a poly.isClosed() is true, the second) point. -- */ -- QPointF nextPoint(int index, const QPolygonF& poly) { -- if (poly.size() < 3 || index >= poly.size()) -- return QPoint(); -- if (index == poly.size() - 1) -- return poly.at((int)poly.isClosed()); -- return poly.at(index + 1); -- } -- -- /** -- * Return the middle value between \a a and \a b. -- */ -- qreal middle(qreal a, qreal b) -- { -- return (a + b) / 2.0; -- } -- -- /** -- * Auxiliary type for function findLine() -- */ -- enum Axis_Type { X , Y }; -- -- /** -- * Auxiliary type for function findLine() -- */ -- enum Comparison_Type { Smallest, Largest }; -- -- /** -- * Find the line of \a poly with the smallest or largest value (controlled by \a seek) -- * along the axis controlled by \a axis. -- * In case \a axis is X, do not consider lines whose Y values lie outside the Y values -- * defined by \a boundingRect. -- * In case \a axis is Y, do not consider lines whose X values lie outside the X values -- * defined by \a boundingRect. -- */ -- QLineF findLine(const QPolygonF& poly, Axis_Type axis, Comparison_Type seek, const QRectF& boundingRect) -- { -- const int lastIndex = poly.size() - 1 - (int)poly.isClosed(); -- QPointF prev = poly.at(lastIndex), curr; -- QPointF p1(seek == Smallest ? QPointF(1.0e6, 1.0e6) : QPointF(-1.0e6, -1.0e6)); -- QPointF p2; -- for (int i = 0; i <= lastIndex; i++) { -- curr = poly.at(i); -- // uDebug() << " poly[" << i << "] = " << curr; -- if (axis == X) { -- if (fmin(prev.y(), curr.y()) > boundingRect.y() + boundingRect.height() || -- fmax(prev.y(), curr.y()) < boundingRect.y()) { -- // line is outside Y-axis range defined by boundingRect -- } else if ((seek == Smallest && curr.x() <= p1.x()) || -- (seek == Largest && curr.x() >= p1.x())) { -- p1 = curr; -- p2 = prev; -- } -- } else { -- if (fmin(prev.x(), curr.x()) > boundingRect.x() + boundingRect.width() || -- fmax(prev.x(), curr.x()) < boundingRect.x()) { -- // line is outside X-axis range defined by boundingRect -- } else if ((seek == Smallest && curr.y() <= p1.y()) || -- (seek == Largest && curr.y() >= p1.y())) { -- p1 = curr; -- p2 = prev; -- } -- } -- prev = curr; -- } -- return QLineF(p1, p2); -- } -- -- /** -- * Determine the approximate closest points of two polygons. -- * @param self First QPolygonF. -- * @param other Second QPolygonF. -- * @return QLineF::p1() returns point of \a self; -- * QLineF::p2() returns point of \a other. -- */ -- QLineF closestPoints(const QPolygonF& self, const QPolygonF& other) -- { -- const QRectF& selfRect = self.boundingRect(); -- const QRectF& otherRect = other.boundingRect(); -- Uml::Region::Enum region = findRegion(selfRect, otherRect); -- if (region == Uml::Region::Center) -- return QLineF(); -- if (self.size() < 3 || other.size() < 3) -- return QLineF(); -- QLineF result; -- const int selfLastIndex = self.size() - 1 - (int)self.isClosed(); -- const int otherLastIndex = other.size() - 1 - (int)other.isClosed(); -- QPointF selfPoint(self.at(selfLastIndex)); -- QPointF otherPoint(other.at(otherLastIndex)); -- QLineF selfLine, otherLine; -- int i; -- -- switch (region) { -- -- case Uml::Region::North: -- // Find other's line with largest Y values -- otherLine = findLine(other, Y, Largest, selfRect); -- // Find own line with smallest Y values -- selfLine = findLine(self, Y, Smallest, otherRect); -- // Use the middle value of the X values -- result.setLine(middle(selfLine.p2().x(), selfLine.p1().x()), selfLine.p1().y(), -- middle(otherLine.p2().x(), otherLine.p1().x()), otherLine.p1().y()); -- break; -- -- case Uml::Region::South: -- // Find other's line with smallest Y values -- otherLine = findLine(other, Y, Smallest, selfRect); -- // Find own line with largest Y values -- selfLine = findLine(self, Y, Largest, otherRect); -- // Use the middle value of the X values -- result.setLine(middle(selfLine.p2().x(), selfLine.p1().x()), selfLine.p1().y(), -- middle(otherLine.p2().x(), otherLine.p1().x()), otherLine.p1().y()); -- break; -- -- case Uml::Region::West: -- // Find other's line with largest X values -- otherLine = findLine(other, X, Largest, selfRect); -- // Find own line with smallest X values -- selfLine = findLine(self, X, Smallest, otherRect); -- // Use the middle value of the Y values -- result.setLine(selfLine.p1().x(), middle(selfLine.p2().y(), selfLine.p1().y()), -- otherLine.p1().x(), middle(otherLine.p2().y(), otherLine.p1().y())); -- break; -- -- case Uml::Region::East: -- // Find other's line with smallest X values -- otherLine = findLine(other, X, Smallest, selfRect); -- // Find own line with largest X values -- selfLine = findLine(self, X, Largest, otherRect); -- // Use the middle value of the Y values -- result.setLine(selfLine.p1().x(), middle(selfLine.p2().y(), selfLine.p1().y()), -- otherLine.p1().x(), middle(otherLine.p2().y(), otherLine.p1().y())); -- break; -- -- case Uml::Region::NorthWest: -- // Find other's point with largest X and largest Y value -- for (i = 0; i < otherLastIndex; ++i) { -- QPointF current(other.at(i)); -- if (current.x() + current.y() >= otherPoint.x() + otherPoint.y()) { -- otherPoint = current; -- } -- } -- // Find own point with smallest X and smallest Y value -- for (i = 0; i < selfLastIndex; ++i) { -- QPointF current(self.at(i)); -- if (current.x() + current.y() <= selfPoint.x() + selfPoint.y()) { -- selfPoint = current; -- } -- } -- result.setPoints(selfPoint, otherPoint); -- break; -- -- case Uml::Region::SouthWest: -- // Find other's point with largest X and smallest Y value -- for (i = 0; i < otherLastIndex; ++i) { -- QPointF current(other.at(i)); -- if (current.x() >= otherPoint.x() && current.y() <= otherPoint.y()) { -- otherPoint = current; -- } -- } -- // Find own point with smallest X and largest Y value -- for (i = 0; i < selfLastIndex; ++i) { -- QPointF current(self.at(i)); -- if (current.x() <= selfPoint.x() && current.y() >= selfPoint.y()) { -- selfPoint = current; -- } -- } -- result.setPoints(selfPoint, otherPoint); -- break; -- -- case Uml::Region::NorthEast: -- // Find other's point with smallest X and largest Y value -- for (i = 0; i < otherLastIndex; ++i) { -- QPointF current(other.at(i)); -- if (current.x() <= otherPoint.x() && current.y() >= otherPoint.y()) { -- otherPoint = current; -- } -- } -- // Find own point with largest X and smallest Y value -- for (i = 0; i < selfLastIndex; ++i) { -- QPointF current(self.at(i)); -- if (current.x() >= selfPoint.x() && current.y() <= selfPoint.y()) { -- selfPoint = current; -- } -- } -- result.setPoints(selfPoint, otherPoint); -- break; -- -- case Uml::Region::SouthEast: -- // Find other's point with smallest X and smallest Y value -- for (i = 0; i < otherLastIndex; ++i) { -- QPointF current(other.at(i)); -- if (current.x() + current.y() <= otherPoint.x() + otherPoint.y()) { -- otherPoint = current; -- } -- } -- // Find own point with largest X and largest Y value -- for (i = 0; i < selfLastIndex; ++i) { -- QPointF current(self.at(i)); -- if (current.x() + current.y() >= selfPoint.x() + selfPoint.y()) { -- selfPoint = current; -- } -- } -- result.setPoints(selfPoint, otherPoint); -- break; -- -- default: -- // Error -- break; -- } -- -- return result; -- } -- --} // namespace Widget_Utils -diff -Nuar umbrello-kf6-15.08.1.orig/umbrello/widgets/widget_utils.h umbrello-kf6-15.08.1/umbrello/widgets/widget_utils.h ---- umbrello-kf6-15.08.1.orig/umbrello/widgets/widget_utils.h 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/umbrello/widgets/widget_utils.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,66 +0,0 @@ --/*************************************************************************** -- * 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. * -- * * -- * copyright (C) 2004-2014 * -- * umbrello-kf6 UML Modeller Authors * -- ***************************************************************************/ -- --#ifndef WIDGET_UTILS_H --#define WIDGET_UTILS_H -- --#include "basictypes.h" --#include "messagewidgetlist.h" --#include "umlwidgetlist.h" -- --#include --#include --#include --#include --#include -- --class QGraphicsItem; --class QGraphicsRectItem; -- --/** -- * General purpose-kf6 widget utilities. -- * Bugs and comments to umbrello-kf6-devel@kde.org or http://bugs.kde.org -- */ --namespace Widget_Utils --{ -- UMLWidget* findWidget(Uml::ID::Type id, -- const UMLWidgetList& widgets, -- const MessageWidgetList* messages = 0); -- -- QGraphicsRectItem* decoratePoint(const QPointF& p, QGraphicsItem* parent = 0); -- -- void drawCrossInEllipse(QPainter *p, const QRectF& ellipse); -- void drawTriangledRect(QPainter *painter, const QRectF& rect, const QSizeF& triSize); --// void drawArrowHead(QPainter *painter, const QPointF& arrowPos, --// const QSizeF& arrowSize, Qt::ArrowType arrowType, --// bool solid-kf6 = false); --// void drawRoundedRect(QPainter *painter, const QRectF& rect, qreal xRadius, --// qreal yRadius, Uml::Corners corners); -- -- QString pointToString(const QPointF& point); -- QPointF stringToPoint(const QString& str); -- -- bool loadPixmapFromXMI(QDomElement &qElement, QPixmap &pixmap); -- void savePixmapToXMI(QDomDocument &qDoc, QDomElement &qElement, const QPixmap& pixmap); -- -- bool loadGradientFromXMI(QDomElement &qElement, QGradient *&gradient); -- void saveGradientToXMI(QDomDocument &qDoc, QDomElement &qElement, const QGradient *gradient); -- -- bool loadBrushFromXMI(QDomElement &qElement, QBrush &brush); -- void saveBrushToXMI(QDomDocument &qDoc, QDomElement &qElement, -- const QBrush& brush); -- -- bool hasSmallerX(const UMLWidget* widget1, const UMLWidget* widget2); -- bool hasSmallerY(const UMLWidget* widget1, const UMLWidget* widget2); -- -- QLineF closestPoints(const QPolygonF& self, const QPolygonF& other); --} -- --#endif -diff -Nuar umbrello-kf6-15.08.1.orig/unittests/CMakeLists.txt umbrello-kf6-15.08.1/unittests/CMakeLists.txt ---- umbrello-kf6-15.08.1.orig/unittests/CMakeLists.txt 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/unittests/CMakeLists.txt 2015-10-08 11:48:59.553089025 +0300 -@@ -37,7 +37,8 @@ - ${SRC_PATH}/dialogs - ${SRC_PATH}/docgenerators - ${SRC_PATH}/refactoring -- ${SRC_PATH}/widgets -+ ${SRC_PATH}/umlmodel/ -+ ${SRC_PATH}/umlwidgets/ - ${CMAKE_CURRENT_BINARY_DIR} - ) - -diff -Nuar umbrello-kf6-15.08.1.orig/unittests/testbase.cpp umbrello-kf6-15.08.1/unittests/testbase.cpp ---- umbrello-kf6-15.08.1.orig/unittests/testbase.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/unittests/testbase.cpp 2015-10-08 11:48:59.553089025 +0300 -@@ -39,8 +39,6 @@ - #include - #endif - --static UMLApp *umlApp = 0; -- - TestBase::TestBase(QObject *parent) - : QObject(parent) - { -@@ -49,12 +47,12 @@ - void TestBase::initTestCase() - { - QWidget *w = new QWidget; -- umlApp = new UMLApp(w); -+ new UMLApp(w); - } - - void TestBase::cleanupTestCase() - { -- delete umlApp; -+ delete UMLApp::app(); - } - - void TestCodeGeneratorBase::initTestCase() -diff -Nuar umbrello-kf6-15.08.1.orig/unittests/TEST_cppwriter.cpp umbrello-kf6-15.08.1/unittests/TEST_cppwriter.cpp ---- umbrello-kf6-15.08.1.orig/unittests/TEST_cppwriter.cpp 2015-09-10 01:54:59.000000000 +0300 -+++ umbrello-kf6-15.08.1/unittests/TEST_cppwriter.cpp 2015-10-08 11:48:59.553089025 +0300 -@@ -51,9 +51,11 @@ - UMLAttribute* attr; - attr = c->createAttribute("name_"); - attr = c->createAttribute("address_"); -+ c->addAttribute(attr); - UMLOperation* op; - op = c->createOperation("getName"); - op = c->createOperation("getAddress"); -+ c->addOperation(op); - - cpp->writeClass(c); - // does the just created file exist? diff --git a/desktop/kde6/applications/umbrello-kf6/pspec.xml b/desktop/kde6/applications/umbrello-kf6/pspec.xml deleted file mode 100755 index f4e8ee6984..0000000000 --- a/desktop/kde6/applications/umbrello-kf6/pspec.xml +++ /dev/null @@ -1,213 +0,0 @@ - - - - - umbrello-kf6 - http://www.kde.org/ - - Mathias Freire - mathiasfreire45@gmail.com - - GPLv2 - app:gui - desktop.kde.sdk - UML modelling tool and code generator - umbrello-kf6 UML Modeller is a Unified Modelling Language diagram editor for KDE. - mirrors://kde/stable/release-service/24.12.1/src/umbrello-24.12.1.tar.xz - - - extra-cmake-modules-kf6 - - qt5-base-devel - qt5-webkit-devel - libxslt-devel - qt5-svg-devel - kio-devel - kparts-devel - kinit-devel - kcompletion-devel - kxmlgui-devel - kauth-devel - kconfig-devel - ktexteditor-devel - kcoreaddons-devel - kdoctools-devel - docbook-xsl - kwindowsystem-devel - kdelibs4-support-devel - kdesignerplugin - kemoticons-devel - kitemmodels-devel - kunitconversion-devel - llvm - llvm-clang-devel - llvm-mlir - llvm-polly - - - - - - umbrello-kf6 - - - - kio - ki18n - kcrash - libgcc - kconfig - kxmlgui - libxml2 - karchive - kcompletion - kcoreaddons - kiconthemes - kjobwidgets - ktextwidgets - kconfigwidgets - kwidgetsaddons - ktexteditor - libxslt - qt5-svg - qt5-base - - - /usr/share - /usr/share/doc - /usr/bin - - - umbrello - - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/applications/umbrello-kf6/translations.xml b/desktop/kde6/applications/umbrello-kf6/translations.xml deleted file mode 100755 index c653cbdf80..0000000000 --- a/desktop/kde6/applications/umbrello-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - umbrello-kf6 - UML modelleme aracı ve kod üreticisi. - umbrello-kf6 UML (Unified Modellin Language) modelleme ve diyagram editörüdür. - - diff --git a/desktop/kde6/component.xml b/desktop/kde6/component.xml deleted file mode 100644 index 6ae69154a4..0000000000 --- a/desktop/kde6/component.xml +++ /dev/null @@ -1,3 +0,0 @@ - - desktop.kde6 - diff --git a/desktop/kde6/framework/attica-kf6/actions.py b/desktop/kde6/framework/attica-kf6/actions.py deleted file mode 100755 index 9271dad0fe..0000000000 --- a/desktop/kde6/framework/attica-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md", "AUTHORS", "ChangeLog") diff --git a/desktop/kde6/framework/attica-kf6/pspec.xml b/desktop/kde6/framework/attica-kf6/pspec.xml deleted file mode 100755 index ac148378f7..0000000000 --- a/desktop/kde6/framework/attica-kf6/pspec.xml +++ /dev/null @@ -1,130 +0,0 @@ - - - - - attica-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Open Collaboration Service client library, based on Qt 5 - attica-kf6 is a library to access Open Collaboration Service servers, based on Qt 5. - mirrors://kde/stable/frameworks/6.10/attica-6.10.0.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - - - - - attica-kf6 - - qt6-base - libgcc - - - /etc/xdg - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - attica-kf6-devel - Development files for attica-kf65 - - qt6-base-devel - attica-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/attica-kf6/translations.xml b/desktop/kde6/framework/attica-kf6/translations.xml deleted file mode 100755 index 88f3be9739..0000000000 --- a/desktop/kde6/framework/attica-kf6/translations.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - attica-kf65 - Açık İşbirliği Hizmetleri (Open Collaboration Services) programlama arayüzü gerçeklemesi - ttica, freedesktop.org'daki Açık İşbirliği Hizmetleri programlama arayüzünün 1.4 sürümünü gerçekleyen bir Qt 5 kitaplığıdır. - - - - attica-kf65-devel - attica-kf65 için geliştirme dosyaları - - diff --git a/desktop/kde6/framework/baloo-kf6/actions.py b/desktop/kde6/framework/baloo-kf6/actions.py deleted file mode 100755 index 7fdd819a53..0000000000 --- a/desktop/kde6/framework/baloo-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/lib/systemd") - - #pisitools.dodoc("COPYING") diff --git a/desktop/kde6/framework/baloo-kf6/pspec.xml b/desktop/kde6/framework/baloo-kf6/pspec.xml deleted file mode 100755 index 932d7f23fe..0000000000 --- a/desktop/kde6/framework/baloo-kf6/pspec.xml +++ /dev/null @@ -1,177 +0,0 @@ - - - - - baloo-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - Framework for searching and managing metadata - baloo-kf6 is a framework for searching and managing metada - mirrors://kde/stable/frameworks/6.10/baloo-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kauth-kf6-devel - kconfig-kf6-devel - kcrash-kf6-devel - ki18n-kf6-devel - kcompletion-kf6-devel - kidletime-kf6-devel - kio-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kfilemetadata-kf6-devel - kdoctools-kf6-devel - kbookmarks-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - kwidgetsaddons-kf6-devel - lmdb-devel - kservice-kf6-devel - extra-cmake-modules-kf6 - - - - - baloo-kf6 - - qt6-base - qt6-declarative - kcoreaddons-kf6 - kdbusaddons-kf6 - - libgcc - kconfig-kf6 - kcrash-kf6 - ki18n-kf6 - kidletime-kf6 - kio-kf6 - solid-kf6 - kfilemetadata-kf6 - lmdb - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - baloo-kf6-devel - Development files for baloo-kf6-widgets - - baloo-kf6 - qt6-base-devel - - kcoreaddons-kf6-devel - - kfilemetadata-kf6-devel - - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/bluez-qt-kf6/actions.py b/desktop/kde6/framework/bluez-qt-kf6/actions.py deleted file mode 100755 index 1da5a99a6d..0000000000 --- a/desktop/kde6/framework/bluez-qt-kf6/actions.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure("-DUDEV_RULES_INSTALL_DIR=/lib/udev/rules.d") - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/framework/bluez-qt-kf6/pspec.xml b/desktop/kde6/framework/bluez-qt-kf6/pspec.xml deleted file mode 100755 index 0e914f4e8c..0000000000 --- a/desktop/kde6/framework/bluez-qt-kf6/pspec.xml +++ /dev/null @@ -1,138 +0,0 @@ - - - - - bluez-qt-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - GPLv2 - library - Qt wrapper for KDE 5 Bluez DBus API - Qt wrapper for KDE 5 DBus API. - mirrors://kde/stable/frameworks/6.10/bluez-qt-6.10.0.tar.xz - - bluez - bluez-libs-devel - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - - - - bluez-qt-kf6 - - - qt6-base - qt6-declarative - libgcc - - - /usr/lib/qt5 - /usr/lib - /etc/xdg - /usr/share/doc - /lib/udev - /usr/share/qlogging-categories6 - /usr/share/qlogging-categories6/bluez.categories - - - - - bluez-qt-kf6-devel - Development files for bluez-qt-kf6 - - qt6-base-devel - - bluez-qt-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/breeze-icons-kf6/actions.py b/desktop/kde6/framework/breeze-icons-kf6/actions.py deleted file mode 100755 index 52a0844978..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure("-DBINARY_ICONS_RESOURCE=ON") - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*", "COPYING*") diff --git a/desktop/kde6/framework/breeze-icons-kf6/files/250a7d0b.patch b/desktop/kde6/framework/breeze-icons-kf6/files/250a7d0b.patch deleted file mode 100644 index 9fb7e5592c..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/files/250a7d0b.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 250a7d0bbe6dd8e7d2e7cba4cc82a2d8cce37cf1 Mon Sep 17 00:00:00 2001 -From: Rodney Dawes -Date: Mon, 15 Nov 2021 10:47:54 -0500 -Subject: [PATCH] Install dark icons via execute_process to use copy command - -In order to ensure the dark icons are copied over the light icons which -are installed into the dark theme for BUG:444095, we need to execute the -copy command ourselves rather than using CMake's internal copy mechanism -used by the normal install command, so we use CODE mode of install to -execute_process and print an appropriate status message. - -BUG: 445489 ---- - icons-dark/CMakeLists.txt | 30 ++++++++++++++++++++++++++++-- - 1 file changed, 28 insertions(+), 2 deletions(-) - -diff --git a/icons-dark/CMakeLists.txt b/icons-dark/CMakeLists.txt -index d14bdba5..40590a8b 100644 ---- a/icons-dark/CMakeLists.txt -+++ b/icons-dark/CMakeLists.txt -@@ -26,10 +26,36 @@ if(NOT WIN32) - endif() - - if(NOT SKIP_INSTALL_ICONS) -- install(DIRECTORY ${breeze_icon_dark_dirs} DESTINATION ${BREEZE_INSTALL_DIR}) -+ # In order to ensure the dark icons are copied over the light icons which -+ # are installed into the dark theme for BUG:444095, we need to execute the -+ # copy command ourselves rather than using CMake's internal copy mechanism -+ # used by the normal install command, so we use CODE mode of install to -+ # execute_process and print an appropriate status message. -+ # See https://bugs.kde.org/show_bug.cgi?id=445489 -+ set(COPY_CMD "cp -a") -+ set(XCOPY_ARGS "") -+ if(WIN32) -+ set(COPY_CMD "xcopy") -+ set(XCOPY_ARGS "/q /e /y") -+ endif(WIN32) -+ install(CODE "cmake_policy(VERSION 3.6) -+ foreach(CAT_DIR ${breeze_icon_dark_dirs}) -+ execute_process(COMMAND ${COPY_CMD} \${CAT_DIR} \$ENV{DESTDIR}${BREEZE_INSTALL_DIR} ${XCOPY_ARGS} ERROR_QUIET WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) -+ endforeach() -+ file(GLOB_RECURSE ICON_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} LIST_DIRECTORIES false ${CMAKE_CURRENT_SOURCE_DIR}/*.svg) -+ foreach(ICON_FILE IN LISTS ICON_FILES) -+ message(STATUS \"Installing: \$ENV{DESTDIR}${BREEZE_INSTALL_DIR}/\${ICON_FILE}\") -+ endforeach()") - install(FILES index.theme DESTINATION ${BREEZE_INSTALL_DIR}) - if(WITH_ICON_GENERATION) -- install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated/ DESTINATION ${BREEZE_INSTALL_DIR}) -+ install(CODE "cmake_policy(VERSION 3.6) -+ foreach(GEN_DIR ${breeze_icon_dark_dirs}) -+ execute_process(COMMAND ${COPY_CMD} \${GEN_DIR} \$ENV{DESTDIR}${BREEZE_INSTALL_DIR} ${XCOPY_ARGS} ERROR_QUIET WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated) -+ endforeach() -+ file(GLOB_RECURSE ICON_FILES RELATIVE ${CMAKE_CURRENT_BINARY_DIR}/generated LIST_DIRECTORIES false ${CMAKE_CURRENT_BINARY_DIR}/generated/*.svg) -+ foreach(ICON_FILE IN LISTS ICON_FILES) -+ message(STATUS \"Installing: \$ENV{DESTDIR}${BREEZE_INSTALL_DIR}/\${ICON_FILE}\") -+ endforeach()") - endif() - endif() - --- -GitLab - diff --git a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-16.svg b/desktop/kde6/framework/breeze-icons-kf6/files/breeze-16.svg deleted file mode 100644 index d3a1dd24b2..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-16.svg +++ /dev/null @@ -1,308 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-22.svg b/desktop/kde6/framework/breeze-icons-kf6/files/breeze-22.svg deleted file mode 100644 index 73b3d536ff..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-22.svg +++ /dev/null @@ -1,308 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-64.svg b/desktop/kde6/framework/breeze-icons-kf6/files/breeze-64.svg deleted file mode 100644 index 920ac88043..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-64.svg +++ /dev/null @@ -1,308 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-96.svg b/desktop/kde6/framework/breeze-icons-kf6/files/breeze-96.svg deleted file mode 100644 index 356d83d1c1..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-96.svg +++ /dev/null @@ -1,308 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-16.svg b/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-16.svg deleted file mode 100644 index 6472cde3ca..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-16.svg +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-22.svg b/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-22.svg deleted file mode 100644 index bc5b55664e..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-22.svg +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-48.svg b/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-48.svg deleted file mode 100644 index 630d300515..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-48.svg +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-96.svg b/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-96.svg deleted file mode 100644 index 8ae08ddf21..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark-96.svg +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark.svg b/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark.svg deleted file mode 100644 index 91beb0df21..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/files/breeze-dark.svg +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/desktop/kde6/framework/breeze-icons-kf6/files/breeze.patch b/desktop/kde6/framework/breeze-icons-kf6/files/breeze.patch deleted file mode 100644 index 4dc3570c6f..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/files/breeze.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Nuar a/KF6BreezeIconsConfig.cmake.in b/KF6BreezeIconsConfig.cmake.in ---- a/KF6BreezeIconsConfig.cmake.in 2024-01-31 13:30:08.000000000 +0300 -+++ b/KF6BreezeIconsConfig.cmake.in 2024-02-01 11:26:06.638099308 +0300 -@@ -3,6 +3,5 @@ - if(@ICONS_LIBRARY@) - include(CMakeFindDependencyMacro) - find_dependency(Qt6Gui "@REQUIRED_QT_VERSION@") -+ include("${CMAKE_CURRENT_LIST_DIR}/KF6BreezeIconsTargets.cmake") - endif() -- --include("${CMAKE_CURRENT_LIST_DIR}/KF6BreezeIconsTargets.cmake") diff --git a/desktop/kde6/framework/breeze-icons-kf6/files/breeze.svg b/desktop/kde6/framework/breeze-icons-kf6/files/breeze.svg deleted file mode 100644 index dc6fb04260..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/files/breeze.svg +++ /dev/null @@ -1,317 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/desktop/kde6/framework/breeze-icons-kf6/pspec.xml b/desktop/kde6/framework/breeze-icons-kf6/pspec.xml deleted file mode 100755 index 285d72fdbb..0000000000 --- a/desktop/kde6/framework/breeze-icons-kf6/pspec.xml +++ /dev/null @@ -1,136 +0,0 @@ - - - - - breeze-icons-kf6 - https://projects.kde.org/projects/kde/workspace/breeze - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2+ - app:gui - Breeze icon themes - İcon themes breeze - mirrors://kde/stable/frameworks/6.10/breeze-icons-6.10.0.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - libxml2-devel - python3-devel - python3-lxml - - - - - - - - breeze-icons-kf6 - Breeze icon themes - - /usr/lib - /usr/share - /usr/share/doc - - - breeze-16.svg - breeze-22.svg - breeze-dark-16.svg - breeze-dark-22.svg - - - - - breeze-icons-kf6-devel - Development files for breeze-icons-kf6 - - breeze-icons-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/component.xml b/desktop/kde6/framework/component.xml deleted file mode 100644 index 248b327ae2..0000000000 --- a/desktop/kde6/framework/component.xml +++ /dev/null @@ -1,3 +0,0 @@ - - desktop.kde6.framework - diff --git a/desktop/kde6/framework/extra-cmake-modules-kf6/actions.py b/desktop/kde6/framework/extra-cmake-modules-kf6/actions.py deleted file mode 100755 index 0839da95d2..0000000000 --- a/desktop/kde6/framework/extra-cmake-modules-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import get -from pisi.actionsapi import pisitools - -def setup(): - pisitools.dosed('kde-modules/KDEInstallDirs.cmake', '"lib64"', '"lib"') - kde6.configure("-DBUILD_HTML_DOCS=OFF \ - -DBUILD_MAN_DOCS=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.rst", "COPYING-CMAKE-SCRIPTS") diff --git a/desktop/kde6/framework/extra-cmake-modules-kf6/pspec.xml b/desktop/kde6/framework/extra-cmake-modules-kf6/pspec.xml deleted file mode 100755 index 973ef6cbbb..0000000000 --- a/desktop/kde6/framework/extra-cmake-modules-kf6/pspec.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - - - extra-cmake-modules-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@gmail.com - - LGPLv2 - library - Extra cmake modules for kde6 - Extra cmake modules kde6 - mirrors://kde/stable/frameworks/6.10/extra-cmake-modules-6.10.0.tar.xz - - cmake - flex - - - - - extra-cmake-modules-kf6 - programming.build - - cmake - flex - - - /usr/share - /usr/lib - /usr/share/man/man7 - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/frameworkintegration-kf6/actions.py b/desktop/kde6/framework/frameworkintegration-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/frameworkintegration-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/frameworkintegration-kf6/pspec.xml b/desktop/kde6/framework/frameworkintegration-kf6/pspec.xml deleted file mode 100755 index 4f4f87871f..0000000000 --- a/desktop/kde6/framework/frameworkintegration-kf6/pspec.xml +++ /dev/null @@ -1,162 +0,0 @@ - - - - - frameworkintegration-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Framework providing components to allow applications to integrate with a KDE Workspace - Framework Integration is a set of plugins responsible for better integration of Qt applications when running on a KDE Plasma workspace. - mirrors://kde/stable/frameworks/6.10/frameworkintegration-6.10.0.tar.xz - - libxcb-devel - libXcursor-devel - appstream-qt6-devel - packagekit-qt6-devel - appstream-devel - qt6-base-devel - qt6-declarative-devel - oxygen-fonts - kconfig-kf6-devel - kpackage-kf6-devel - kxmlgui-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kjobwidgets-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - ki18n-kf6-devel - kauth-kf6-devel - kio-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - knewstuff-kf6-devel - kcolorscheme-kf6-devel - - - - - frameworkintegration-kf6 - - appstream-qt6 - packagekit-qt6 - appstream - qt6-base - kconfig-kf6 - kconfigwidgets-kf6 - kiconthemes-kf6 - ki18n-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - knewstuff-kf6 - kcolorscheme-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - frameworkintegration-kf6-devel - Development files for framework-integration - - frameworkintegration-kf6 - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kapidox-kf6/actions.py b/desktop/kde6/framework/kapidox-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kapidox-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kapidox-kf6/files/fedora/kf5-kapidox-install.patch b/desktop/kde6/framework/kapidox-kf6/files/fedora/kf5-kapidox-install.patch deleted file mode 100644 index 6fd5aeaf2d..0000000000 --- a/desktop/kde6/framework/kapidox-kf6/files/fedora/kf5-kapidox-install.patch +++ /dev/null @@ -1,51 +0,0 @@ -diff -Nur kapidox-kf6-5.93.0/CMakeLists.txt kapidox-kf6-5.91.0/CMakeLists.txt ---- kapidox-kf6-5.93.0/CMakeLists.txt 2022-03-13 13:10:03.000000000 +0100 -+++ kapidox-kf6-5.91.0/CMakeLists.txt 2022-01-25 08:43:21.000000000 +0100 -@@ -1,7 +1,7 @@ - cmake_minimum_required(VERSION 3.16) - project(kapidox-kf6 NONE) - --include(FindUnixCommands) -+find_package(Python3 COMPONENTS Interpreter) - - if(WIN32) - # Needs native path and extra escaping of spaces -@@ -11,7 +11,26 @@ - endif() - - add_custom_target(build ALL -- COMMAND ${BASH} bootstrap-devenv.sh -+ COMMAND ${Python3_EXECUTABLE} setup.py build --build-base ${BINARY_DIR} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} --) -+ ) - -+# DESTDIR may be set at install time (eg: `make DESTDIR=/tmp/package install`) -+# so we need to check for it when the install code is run and pass the appropriate -+# argument to distutils. -+# -+# Note that if(\$ENV{DESTDIR}) always fails, regardless of the value of the DESTDIR -+# environment variable, hence the STREQUAL test. -+# See https://public.kitware.com/Bug/view.php?id=14737 -+install(CODE -+ "set(_root_arg) -+ if (NOT \$ENV{DESTDIR} STREQUAL \"\") -+ file(TO_NATIVE_PATH \$ENV{DESTDIR} DESTDIR) -+ set(_root_arg --root \"\${DESTDIR}\") -+ endif() -+ file(TO_NATIVE_PATH ${CMAKE_INSTALL_PREFIX} INSTALL_PREFIX) -+ execute_process( -+ COMMAND ${Python3_EXECUTABLE} setup.py install --prefix \"\${INSTALL_PREFIX}\" \${_root_arg} -+ WORKING_DIRECTORY \"${CMAKE_SOURCE_DIR}\" -+ )" -+ ) -diff -up kapidox-kf6-5.93.0/setup.py.me kapidox-kf6-5.93.0/setup.py ---- kapidox-kf6-5.93.0/setup.py.me 2022-04-28 14:13:13.168061970 +0200 -+++ kapidox-kf6-5.93.0/setup.py 2022-04-28 14:14:00.170175582 +0200 -@@ -17,5 +17,5 @@ setup( - "kapidox-kf6-depdiagram-generate = kapidox-kf6.depdiagram_generate:main", - ], - }, -- install_requires=["doxypypy", "doxyqml", "requests", "jinja2", "pyyaml"] -+ install_requires=["requests", "jinja2", "pyyaml"] - ) diff --git a/desktop/kde6/framework/kapidox-kf6/pspec.xml b/desktop/kde6/framework/kapidox-kf6/pspec.xml deleted file mode 100755 index 82047c8e0a..0000000000 --- a/desktop/kde6/framework/kapidox-kf6/pspec.xml +++ /dev/null @@ -1,120 +0,0 @@ - - - - - kapidox-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - kde6 Frameworks API documentation tools. - kde6 Frameworks API documentation tools. - mirrors://kde/stable/frameworks/6.10/kapidox-6.10.0.tar.xz - - python3-Jinja2 - python3-PyYAML - - extra-cmake-modules-kf6 - python3-setuptools - - - - - - - - kapidox-kf6 - - - - - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kapidox-kf6/translations.xml b/desktop/kde6/framework/kapidox-kf6/translations.xml deleted file mode 100755 index 74ceebcfbd..0000000000 --- a/desktop/kde6/framework/kapidox-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kapidox-kf6 - kde6 Frameworks API dokümantasyon araçları. - kde6 Frameworks API dokümantasyon araçları. - - diff --git a/desktop/kde6/framework/karchive-kf6/actions.py b/desktop/kde6/framework/karchive-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/karchive-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/karchive-kf6/pspec.xml b/desktop/kde6/framework/karchive-kf6/pspec.xml deleted file mode 100755 index e80a1555bf..0000000000 --- a/desktop/kde6/framework/karchive-kf6/pspec.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - - - karchive-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Qt 5 addon providing access to numerous types of archives - karchive-kf6 provides classes for easy reading, creation and manipulation of "archive" formats like ZIP and TAR. - mirrors://kde/stable/frameworks/6.10/karchive-6.10.0.tar.xz - - bzip2 - xz-devel - zstd-devel - zlib-devel - netcdf-devel - qt6-linguist - qt6-base-devel - extra-cmake-modules-kf6 - - - - - karchive-kf6 - - xz - zlib - zstd - bzip2 - netcdf - - qt6-linguist - qt6-base - - - /etc/xdg - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - karchive-kf6-devel - Development files for karchive-kf6 - - qt6-base-devel - karchive-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kauth-kf6/actions.py b/desktop/kde6/framework/kauth-kf6/actions.py deleted file mode 100644 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kauth-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kauth-kf6/pspec.xml b/desktop/kde6/framework/kauth-kf6/pspec.xml deleted file mode 100644 index 5541b1d8f4..0000000000 --- a/desktop/kde6/framework/kauth-kf6/pspec.xml +++ /dev/null @@ -1,138 +0,0 @@ - - - - - kauth-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Abstraction to system policy and authentication features - Framework which lets applications perform actions as a privileged user - mirrors://kde/stable/frameworks/6.10/kauth-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - polkit-qt6-devel - kcoreaddons-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - - - - - kauth-kf6 - - qt6-base - polkit-qt6 - kcoreaddons-kf6 - kwindowsystem-kf6 - libgcc - - - /etc - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kauth-kf6-devel - Development files for kauth-kf6 - - kauth-kf6 - kcoreaddons-kf6-devel - - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kbookmarks-kf6/actions.py b/desktop/kde6/framework/kbookmarks-kf6/actions.py deleted file mode 100755 index 490521a82c..0000000000 --- a/desktop/kde6/framework/kbookmarks-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kbookmarks-kf6/pspec.xml b/desktop/kde6/framework/kbookmarks-kf6/pspec.xml deleted file mode 100755 index 27591e9ef5..0000000000 --- a/desktop/kde6/framework/kbookmarks-kf6/pspec.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - - - kbookmarks-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Access and manipulate bookmarks stored using XBEL format - Framework which lets you access and manipulate bookmarks stored using XBEL format - mirrors://kde/stable/frameworks/6.10/kbookmarks-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-declarative-devel - kcoreaddons-kf6-devel - kauth-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kcolorscheme-kf6-devel - extra-cmake-modules-kf6 - - - - - kbookmarks-kf6 - - qt6-base - qt6-declarative - libgcc - kcoreaddons-kf6 - kcodecs-kf6 - kconfig-kf6 - kwidgetsaddons-kf6 - kxmlgui-kf6 - kconfigwidgets-kf6 - kcolorscheme-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kbookmarks-kf6-devel - Development files for kbookmarks-kf6 - - kbookmarks-kf6 - qt6-base-devel - kwidgetsaddons-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kcalendarcore-kf6/actions.py b/desktop/kde6/framework/kcalendarcore-kf6/actions.py deleted file mode 100644 index dd3d84e185..0000000000 --- a/desktop/kde6/framework/kcalendarcore-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*") diff --git a/desktop/kde6/framework/kcalendarcore-kf6/pspec.xml b/desktop/kde6/framework/kcalendarcore-kf6/pspec.xml deleted file mode 100644 index 2d5955cbc3..0000000000 --- a/desktop/kde6/framework/kcalendarcore-kf6/pspec.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - - - kcalendarcore-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - library - The KDE calendar access library - The KDE calendar access library - mirrors://kde/stable/frameworks/6.10/kcalendarcore-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - libical-devel - extra-cmake-modules-kf6 - - - - - kcalendarcore-kf6 - - libical - qt6-base - libgcc - qt6-declarative - - - /usr/lib - /usr/share - /usr/share/doc - - - - - kcalendarcore-kf6-devel - Development files for kcalendarcore-kf6 - - qt6-base-devel - kcalendarcore-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kcalendarcore-kf6/translations.xml b/desktop/kde6/framework/kcalendarcore-kf6/translations.xml deleted file mode 100644 index eda8d39a67..0000000000 --- a/desktop/kde6/framework/kcalendarcore-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kcalendarcore-kf6 - The KDE calendar access library - The KDE calendar access library - - diff --git a/desktop/kde6/framework/kcmutils-kf6/actions.py b/desktop/kde6/framework/kcmutils-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kcmutils-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kcmutils-kf6/pspec.xml b/desktop/kde6/framework/kcmutils-kf6/pspec.xml deleted file mode 100755 index e2a3bdbc59..0000000000 --- a/desktop/kde6/framework/kcmutils-kf6/pspec.xml +++ /dev/null @@ -1,162 +0,0 @@ - - - - - kcmutils-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Utilities for interacting with KCModules - kcmutils-kf6 provides various classes to work with KCModules. KCModules can be created with the kconfigwidgets-kf6 framework. - mirrors://kde/stable/frameworks/6.10/kcmutils-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - mesa-devel - kio-kf6-devel - kcodecs-kf6-devel - kpackage-kf6-devel - kdeclarative-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kconfig-kf6-devel - kauth-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kitemviews-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - kguiaddons-kf6-devel - extra-cmake-modules-kf6 - - - - - kcmutils-kf6 - - qt6-base - qt6-declarative - libgcc - kio-kf6 - kdeclarative-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kconfig-kf6 - kauth-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kitemviews-kf6 - kservice-kf6 - kxmlgui-kf6 - kguiaddons-kf6 - - - /usr/bin - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kcmutils-kf6-devel - Development files for kcmutils-kf6 - - kcmutils-kf6 - kconfigwidgets-kf6-devel - kservice-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kcodecs-kf6/actions.py b/desktop/kde6/framework/kcodecs-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kcodecs-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kcodecs-kf6/pspec.xml b/desktop/kde6/framework/kcodecs-kf6/pspec.xml deleted file mode 100755 index eda52c91a9..0000000000 --- a/desktop/kde6/framework/kcodecs-kf6/pspec.xml +++ /dev/null @@ -1,133 +0,0 @@ - - - - - kcodecs-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Plugins allowing Qt applications to access further types of images - kde6 kcodecs-kf6 provide a collection of methods to manipulate strings using various encodings. - mirrors://kde/stable/frameworks/6.10/kcodecs-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - extra-cmake-modules-kf6 - gperf - - - - - kcodecs-kf6 - - qt6-base - - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kcodecs-kf6-devel - Development files for kcodecs-kf6 - - qt6-base-devel - kcodecs-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kcolorscheme-kf6/actions.py b/desktop/kde6/framework/kcolorscheme-kf6/actions.py deleted file mode 100644 index 0eef11c64c..0000000000 --- a/desktop/kde6/framework/kcolorscheme-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/framework/kcolorscheme-kf6/pspec.xml b/desktop/kde6/framework/kcolorscheme-kf6/pspec.xml deleted file mode 100644 index 9fe9e7f413..0000000000 --- a/desktop/kde6/framework/kcolorscheme-kf6/pspec.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - - - kcolorscheme-kf6 - https://github.com/KDE/kcolorscheme - - Mustafa Cinasal - muscnsl@gmail.com - - LGPLv3 - library - Classes to read and interact with KColorScheme - Classes to read and interact with KColorScheme - https://download.kde.org/stable/frameworks/6.10/kcolorscheme-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - ki18n-kf6-devel - kconfig-kf6-devel - kguiaddons-kf6-devel - extra-cmake-modules-kf6 - - - - - - kcolorscheme-kf6 - - qt6-base - qt6-declarative - ki18n-kf6 - kconfig-kf6 - kguiaddons-kf6 - - - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - /usr/share/qlogging-categories6 - - - - - kcolorscheme-kf6-devel - Development files for kcolorscheme-kf6 - - kcolorscheme-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kcolorscheme-kf6/translations.xml b/desktop/kde6/framework/kcolorscheme-kf6/translations.xml deleted file mode 100644 index 0f5bc19c6d..0000000000 --- a/desktop/kde6/framework/kcolorscheme-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kcolorscheme-kf6 - Classes to read and interact with KColorScheme - Classes to read and interact with KColorScheme - - diff --git a/desktop/kde6/framework/kcompletion-kf6/actions.py b/desktop/kde6/framework/kcompletion-kf6/actions.py deleted file mode 100644 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kcompletion-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kcompletion-kf6/pspec.xml b/desktop/kde6/framework/kcompletion-kf6/pspec.xml deleted file mode 100644 index 7b83d9be49..0000000000 --- a/desktop/kde6/framework/kcompletion-kf6/pspec.xml +++ /dev/null @@ -1,143 +0,0 @@ - - - - - kcompletion-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Addon with auto completion widgets and classes - kcompletion-kf6 provides widgets with advanced completion support as well as a lower-level completion class which can be used with your own widgets. - mirrors://kde/stable/frameworks/6.10/kcompletion-6.10.0.tar.xz - - qt6-base-devel - qt6-designer-devel - qt6-declarative-devel - qt6-linguist - kcodecs-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - - - - - kcompletion-kf6 - - qt6-base - qt6-declarative - libgcc - kcodecs-kf6 - kconfig-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kcompletion-kf6-devel - Development files for kcompletion-kf6 - - qt6-base-devel - kcompletion-kf6 - - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kconfig-kf6/actions.py b/desktop/kde6/framework/kconfig-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kconfig-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kconfig-kf6/pspec.xml b/desktop/kde6/framework/kconfig-kf6/pspec.xml deleted file mode 100755 index 48647f6afb..0000000000 --- a/desktop/kde6/framework/kconfig-kf6/pspec.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - - - kconfig-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - app:gui - Advanced configuration system for KDE Frameworks 5 - kconfig-kf6 provides advanced libraries and tools for accessing configuration files. - mirrors://kde/stable/frameworks/6.10/kconfig-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - qt6-linguist - extra-cmake-modules-kf6 - - - - - kconfig-kf6 - - qt6-base - qt6-declarative - - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kconfig-kf6-devel - Development files for kconfig-kf6 - - qt6-base-devel - qt6-declarative-devel - kconfig-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kconfigwidgets-kf6/actions.py b/desktop/kde6/framework/kconfigwidgets-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kconfigwidgets-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kconfigwidgets-kf6/comar/package.py b/desktop/kde6/framework/kconfigwidgets-kf6/comar/package.py deleted file mode 100755 index 57066a108d..0000000000 --- a/desktop/kde6/framework/kconfigwidgets-kf6/comar/package.py +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/python - -import os - -def postInstall(fromVersion, fromRelease, toVersion, toRelease): - os.system("/usr/bin/build-docbook-catalog") diff --git a/desktop/kde6/framework/kconfigwidgets-kf6/pspec.xml b/desktop/kde6/framework/kconfigwidgets-kf6/pspec.xml deleted file mode 100755 index 51ccc06269..0000000000 --- a/desktop/kde6/framework/kconfigwidgets-kf6/pspec.xml +++ /dev/null @@ -1,164 +0,0 @@ - - - - - kconfigwidgets-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - app:gui - kconfig-kf6 widgets - kconfigwidgets-kf6 provides easy-to-use classes to create configuration dialogs, as well as a set of widgets which uses kconfig-kf6 to store their settings. - mirrors://kde/stable/frameworks/6.10/kconfigwidgets-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - ki18n-kf6-devel - kauth-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kguiaddons-kf6-devel - kwidgetsaddons-kf6-devel - kdoctools-kf6-devel - kcolorscheme-kf6-devel - docbook-xsl - extra-cmake-modules-kf6 - qt6-designer-devel - - - - - kconfigwidgets-kf6 - - libgcc - qt6-base - qt6-declarative - kauth-kf6 - kcodecs-kf6 - kconfig-kf6 - kcoreaddons-kf6 - kguiaddons-kf6 - ki18n-kf6 - kwidgetsaddons-kf6 - kcolorscheme-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/share/man - - - - - kconfigwidgets-kf6-devel - Development files for kconfigwidgets-kf6 - - kconfigwidgets-kf6 - - kauth-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kcolorscheme-kf6-devel - - - - kwidgetsaddons-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kcontacts-kf6/actions.py b/desktop/kde6/framework/kcontacts-kf6/actions.py deleted file mode 100755 index 5ee42e01e2..0000000000 --- a/desktop/kde6/framework/kcontacts-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*") diff --git a/desktop/kde6/framework/kcontacts-kf6/files/qt5.patch b/desktop/kde6/framework/kcontacts-kf6/files/qt5.patch deleted file mode 100755 index 1b52da99d1..0000000000 --- a/desktop/kde6/framework/kcontacts-kf6/files/qt5.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:01:29.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 13:20:44.507808201 +0300 -@@ -4,7 +4,7 @@ - project(kcontacts-kf6 VERSION ${PIM_VERSION}) - - # ECM setup --set(QT_REQUIRED_VERSION "5.8.0") -+set(QT_REQUIRED_VERSION "5.7.1") - set(KF5_VERSION "5.39.0") - - find_package(ECM ${KF5_VERSION} CONFIG REQUIRED) -diff -Nuar a/src/vcardparser/vcardparser.cpp b/src/vcardparser/vcardparser.cpp ---- a/src/vcardparser/vcardparser.cpp 2017-12-02 10:20:32.000000000 +0300 -+++ b/src/vcardparser/vcardparser.cpp 2017-12-16 13:28:28.299774737 +0300 -@@ -183,7 +183,9 @@ - start = pos + 1; - } - // fall-through intended -+#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) - Q_FALLTHROUGH(); -+#endif - case StateAfterParamValue: - if (ch == ';') { - state = StateParamKey; diff --git a/desktop/kde6/framework/kcontacts-kf6/pspec.xml b/desktop/kde6/framework/kcontacts-kf6/pspec.xml deleted file mode 100755 index 1ee8e1bd8e..0000000000 --- a/desktop/kde6/framework/kcontacts-kf6/pspec.xml +++ /dev/null @@ -1,148 +0,0 @@ - - - - - kcontacts-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:gui - Address book API for KDE. - Address book for KDE for Contacts. - mirrors://kde/stable/frameworks/6.10/kcontacts-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - ki18n-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kio-kf6-devel - iso-codes-devel - kcoreaddons-kf6-devel - extra-cmake-modules-kf6 - - - - - - - - kcontacts-kf6 - - qt6-base - qt6-declarative - ki18n-kf6 - kcodecs-kf6 - kconfig-kf6 - kcoreaddons-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kcontacts-kf6-devel - Development files for kcontacts-kf6 - - kcontacts-kf6 - ki18n-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kcoreaddons-kf6/actions.py b/desktop/kde6/framework/kcoreaddons-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kcoreaddons-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kcoreaddons-kf6/comar/package.py b/desktop/kde6/framework/kcoreaddons-kf6/comar/package.py deleted file mode 100755 index 8abe2ef4a5..0000000000 --- a/desktop/kde6/framework/kcoreaddons-kf6/comar/package.py +++ /dev/null @@ -1,8 +0,0 @@ - # -*- coding: utf-8 -*- - -from pisi.version import Version - -def postInstall(fromVersion, fromRelease, toVersion, toRelease): - os.system("/usr/bin/update-mime-database /usr/share/mime > /dev/null") - - diff --git a/desktop/kde6/framework/kcoreaddons-kf6/pspec.xml b/desktop/kde6/framework/kcoreaddons-kf6/pspec.xml deleted file mode 100755 index 3b23ad2cf9..0000000000 --- a/desktop/kde6/framework/kcoreaddons-kf6/pspec.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - kcoreaddons-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Utilities for core application functionality and accessing the OS - kcoreaddons-kf6 provides classes built on top of QtCore to perform various tasks such as manipulating mime types, autosaving files, creating backup files, generating random sequences, performing text manipulations such as macro replacement, accessing user information and many more. - mirrors://kde/stable/frameworks/6.10/kcoreaddons-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-declarative-devel - shared-mime-info - extra-cmake-modules-kf6 - - - - - - kcoreaddons-kf6 - - eudev - qt6-base - qt6-declarative - - shared-mime-info - - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kcoreaddons-kf6-devel - Development files for kcoreaddons-kf6 - - qt6-base-devel - kcoreaddons-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kcrash-kf6/actions.py b/desktop/kde6/framework/kcrash-kf6/actions.py deleted file mode 100644 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kcrash-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kcrash-kf6/pspec.xml b/desktop/kde6/framework/kcrash-kf6/pspec.xml deleted file mode 100644 index dbb137c8cd..0000000000 --- a/desktop/kde6/framework/kcrash-kf6/pspec.xml +++ /dev/null @@ -1,136 +0,0 @@ - - - - - kcrash-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kcrash-kf6 crash handling application - kcrash-kf6 provides support for intercepting and handling application crashes. - mirrors://kde/stable/frameworks/6.10/kcrash-6.10.0.tar.xz - - qt6-base-devel - kcoreaddons-kf6-devel - kwindowsystem-kf6-devel - libX11-devel - extra-cmake-modules-kf6 - - - - - kcrash-kf6 - - qt6-base - libX11 - kcoreaddons-kf6 - kwindowsystem-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kcrash-kf6-devel - Development files for kcrash-kf6 - - kcrash-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kdav-kf6/actions.py b/desktop/kde6/framework/kdav-kf6/actions.py deleted file mode 100644 index 120217881d..0000000000 --- a/desktop/kde6/framework/kdav-kf6/actions.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/framework/kdav-kf6/files/qt5.patch b/desktop/kde6/framework/kdav-kf6/files/qt5.patch deleted file mode 100644 index ccdd774190..0000000000 --- a/desktop/kde6/framework/kdav-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-02 10:27:41.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 13:36:51.970738394 +0300 -@@ -26,7 +26,7 @@ - include(ECMQtDeclareLoggingCategory) - include(ECMCoverageOption) - --set(QT_REQUIRED_VERSION "5.8.0") -+set(QT_REQUIRED_VERSION "5.7.1") - - find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Core Gui XmlPatterns Test) - diff --git a/desktop/kde6/framework/kdav-kf6/pspec.xml b/desktop/kde6/framework/kdav-kf6/pspec.xml deleted file mode 100644 index ad6a7d324e..0000000000 --- a/desktop/kde6/framework/kdav-kf6/pspec.xml +++ /dev/null @@ -1,162 +0,0 @@ - - - - - kdav-kf6 - https://github.com/KDE/kdav-kf6 - - Kamil Atlı - suvari@pisilinux.org - - GPLv2 - library - app:gui - A DAV protocol implemention with KJobs - Calendars and todos are supported, using either GroupDAV or CalDAV, and contacts are supported using GroupDAV or CardDAV. - mirrors://kde/stable/frameworks/6.10/kdav-6.10.0.tar.xz - - libgcc - kio-kf6-devel - solid-kf6-devel - kauth-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - kcodecs-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - extra-cmake-modules-kf6 - kservice-kf6-devel - kitemviews-kf6-devel - kbookmarks-kf6-devel - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - qt6-base-devel - - - - - - - - kdav-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kcoreaddons-kf6 - qt6-base - - - /usr/bin - /usr/share/locale - /usr/lib - /etc/xdg - /usr/share - - - - - kdav-kf6-devel - Development files for kdav-kf6 - - kdav-kf6 - kcoreaddons-kf6-devel - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - /usr/share/apps/cmake - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-15 - 6.8.0 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kdav-kf6/translations.xml b/desktop/kde6/framework/kdav-kf6/translations.xml deleted file mode 100644 index a1d7f26714..0000000000 --- a/desktop/kde6/framework/kdav-kf6/translations.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - kdav-kf6 - Bir DAV protokolü uygulaması - Takvimler ve işler CalDAV veya GroupDAV'ı kullanarak desteklenir. - - - - kdav-kf6-devel - kdav-kf6 için geliştirme dosyaları - - diff --git a/desktop/kde6/framework/kdbusaddons-kf6/actions.py b/desktop/kde6/framework/kdbusaddons-kf6/actions.py deleted file mode 100755 index f678ee517b..0000000000 --- a/desktop/kde6/framework/kdbusaddons-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md", "MAINTAINER") diff --git a/desktop/kde6/framework/kdbusaddons-kf6/pspec.xml b/desktop/kde6/framework/kdbusaddons-kf6/pspec.xml deleted file mode 100755 index 9a43031f84..0000000000 --- a/desktop/kde6/framework/kdbusaddons-kf6/pspec.xml +++ /dev/null @@ -1,133 +0,0 @@ - - - - - kdbusaddons-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Extra modules for Qt-DBus - kde6-kdbusaddons-kf6 provides convenience classes on top of QtDBus, as well as an API to create kded-kf6 modules. - mirrors://kde/stable/frameworks/6.10/kdbusaddons-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - extra-cmake-modules-kf6 - - - - - kdbusaddons-kf6 - - qt6-base - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kdbusaddons-kf6-devel - Development files for kdbusaddons-kf6 - - qt6-base-devel - kdbusaddons-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kdeclarative-kf6/actions.py b/desktop/kde6/framework/kdeclarative-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kdeclarative-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kdeclarative-kf6/pspec.xml b/desktop/kde6/framework/kdeclarative-kf6/pspec.xml deleted file mode 100755 index 9eb431d489..0000000000 --- a/desktop/kde6/framework/kdeclarative-kf6/pspec.xml +++ /dev/null @@ -1,173 +0,0 @@ - - - - - kdeclarative-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Integration of QML and KDE workspaces - kdeclarative-kf6 provides integration of QML and KDE workspaces. - mirrors://kde/stable/frameworks/6.10/kdeclarative-6.10.0.tar.xz - - qt6-base-devel - qt6-shadertools-devel - mesa-devel - libepoxy-devel - qt6-declarative-devel - kauth-kf6-devel - kcodecs-kf6-devel - kpackage-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - kguiaddons-kf6-devel - knotifications-kf6-devel - kglobalaccel-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kbookmarks-kf6-devel - kcompletion-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - - - - - kdeclarative-kf6 - - qt6-base - qt6-shadertools - libepoxy - qt6-declarative - kpackage-kf6 - kconfig-kf6 - kservice-kf6 - kcoreaddons-kf6 - kglobalaccel-kf6 - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - kguiaddons-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kwindowsystem-kf6 - - - /usr/bin - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kdeclarative-kf6-devel - Development files for kdeclarative-kf6 - - qt6-base-devel - kpackage-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kdeclarative-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kded-kf6/actions.py b/desktop/kde6/framework/kded-kf6/actions.py deleted file mode 100755 index 328e9e792f..0000000000 --- a/desktop/kde6/framework/kded-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/lib/systemd") - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kded-kf6/pspec.xml b/desktop/kde6/framework/kded-kf6/pspec.xml deleted file mode 100755 index 56e8cc65b3..0000000000 --- a/desktop/kde6/framework/kded-kf6/pspec.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - kded-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 daemon - kded-kf6 runs in the background and performs a number of small tasks. - mirrors://kde/stable/frameworks/6.10/kded-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kservice-kf6-devel - docbook-xsl - extra-cmake-modules-kf6 - - - - - kded-kf6 - - qt6-base - qt6-declarative - libgcc - kcoreaddons-kf6 - kconfig-kf6 - kcrash-kf6 - kdbusaddons-kf6 - kservice-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/doc - /usr/share/man - - - - kded-kf6-devel - Development files for kded-kf6 - - kded-kf6 - - - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kdesu-kf6/actions.py b/desktop/kde6/framework/kdesu-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kdesu-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kdesu-kf6/pspec.xml b/desktop/kde6/framework/kdesu-kf6/pspec.xml deleted file mode 100755 index e62e5a1d8b..0000000000 --- a/desktop/kde6/framework/kdesu-kf6/pspec.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - kdesu-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - User interface for running shell commands with root privileges - kdesu-kf6 provides functionality for building GUI front ends for (password asking) console mode programs. - mirrors://kde/stable/frameworks/6.10/kdesu-6.10.0.tar.xz - - qt6-base-devel - kcoreaddons-kf6-devel - kpty-kf6-devel - kservice-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcolorscheme-kf6-devel - libX11-devel - extra-cmake-modules-kf6 - - - - - kdesu-kf6 - - qt6-base - kcoreaddons-kf6 - kpty-kf6 - kservice-kf6 - ki18n-kf6 - kconfig-kf6 - kcolorscheme-kf6 - libX11 - - - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/qlogging-categories6/ksu.categories - /usr/share/doc - - - - - kdesu-kf6-devel - Development files for kdesu-kf6 - - kdesu-kf6 - kpty-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kdnssd-kf6/actions.py b/desktop/kde6/framework/kdnssd-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kdnssd-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kdnssd-kf6/pspec.xml b/desktop/kde6/framework/kdnssd-kf6/pspec.xml deleted file mode 100755 index 0f27fc894b..0000000000 --- a/desktop/kde6/framework/kdnssd-kf6/pspec.xml +++ /dev/null @@ -1,133 +0,0 @@ - - - - - kdnssd-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Network service discovery using Zeroconf - kdnssd-kf6 is a library for handling the DNS-based Service Discovery Protocol (DNS-SD), the layer of Zeroconf that allows network services, such as printers, to be discovered without any user intervention or centralized infrastructure. - mirrors://kde/stable/frameworks/6.10/kdnssd-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - avahi-devel - avahi-compat-libdns_sd-devel - extra-cmake-modules-kf6 - - - - - kdnssd-kf6 - - qt6-base - - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kdnssd-kf6-devel - Development files for kdnssd-kf6. - - qt6-base-devel - kdnssd-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kdoctools-kf6/actions.py b/desktop/kde6/framework/kdoctools-kf6/actions.py deleted file mode 100644 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kdoctools-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kdoctools-kf6/files/docbook.patch b/desktop/kde6/framework/kdoctools-kf6/files/docbook.patch deleted file mode 100644 index fcf75ae26c..0000000000 --- a/desktop/kde6/framework/kdoctools-kf6/files/docbook.patch +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/cmake/FindDocBookXML4.cmake b/cmake/FindDocBookXML4.cmake -index 415745f..4d7f089 100644 ---- a/cmake/FindDocBookXML4.cmake -+++ b/cmake/FindDocBookXML4.cmake -@@ -34,6 +34,7 @@ function (locate_version version found_dir) - share/xml/docbook/xml-dtd-${version} - share/sgml/docbook/xml-dtd-${version} - share/xml/docbook/${version} -+ opt/docbook/docbook/xml/${version} - ) - - find_path (searched_dir docbookx.dtd diff --git a/desktop/kde6/framework/kdoctools-kf6/pspec.xml b/desktop/kde6/framework/kdoctools-kf6/pspec.xml deleted file mode 100644 index 3170bdacaf..0000000000 --- a/desktop/kde6/framework/kdoctools-kf6/pspec.xml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - kdoctools-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 document generator - kdoctools-kf6 is an application aims to generate documents from DocBook. - mirrors://kde/stable/frameworks/6.10/kdoctools-6.10.0.tar.xz - - qt6-base-devel - perl-URI - python - libxml2-devel - libxslt-devel - docbook-xml - docbook-xsl - docbook-sgml4_5 - ki18n-kf6-devel - karchive-kf6-devel - extra-cmake-modules-kf6 - - - - - kdoctools-kf6 - - qt6-base - libxml2 - - libxslt - docbook-xml - docbook-xsl - karchive-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/doc - /usr/share/man - - - - - kdoctools-kf6-devel - Development files for kdoctools-kf6 - - qt6-base-devel - kdoctools-kf6 - - - - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kfilemetadata-kf6/actions.py b/desktop/kde6/framework/kfilemetadata-kf6/actions.py deleted file mode 100644 index 120217881d..0000000000 --- a/desktop/kde6/framework/kfilemetadata-kf6/actions.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/framework/kfilemetadata-kf6/pspec.xml b/desktop/kde6/framework/kfilemetadata-kf6/pspec.xml deleted file mode 100644 index 2df3a1a1a9..0000000000 --- a/desktop/kde6/framework/kfilemetadata-kf6/pspec.xml +++ /dev/null @@ -1,169 +0,0 @@ - - - - - kfilemetadata-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 library for extracting meta data from files. - KDE library for extracting meta data from files. - mirrors://kde/stable/frameworks/6.10/kfilemetadata-6.10.0.tar.xz - - qt6-base-devel - qt6-multimedia-devel - attr-devel - ebook-tools-devel - exiv2-devel - ffmpeg-devel - taglib-devel - libappimage-devel - - poppler-qt6-devel - karchive-kf6-devel - ki18n-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - extra-cmake-modules-kf6 - - - - - kfilemetadata-kf6 - - qt6-base - ebook-tools - libgcc - exiv2-libs - taglib - libappimage - - ffmpeg - poppler-qt6 - karchive-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kcodecs-kf6 - kconfig-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kfilemetadata-kf6-devel - Development files for kfilemetadata-kf6 - - kfilemetadata-kf6 - qt6-base-devel - ebook-tools-devel - exiv2-devel - taglib-devel - - ffmpeg-devel - poppler-qt6-devel - karchive-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kglobalaccel-kf6/actions.py b/desktop/kde6/framework/kglobalaccel-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kglobalaccel-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kglobalaccel-kf6/pspec.xml b/desktop/kde6/framework/kglobalaccel-kf6/pspec.xml deleted file mode 100755 index de5e082dab..0000000000 --- a/desktop/kde6/framework/kglobalaccel-kf6/pspec.xml +++ /dev/null @@ -1,148 +0,0 @@ - - - - - kglobalaccel-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Global desktop keyboard shortcuts - kglobalaccel-kf6 allows you to have global accelerators that are independent of the focused window. - mirrors://kde/stable/frameworks/6.10/kglobalaccel-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-base - libxcb-devel - kcrash-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - xcb-util-keysyms-devel - kwindowsystem-kf6-devel - kservice-kf6-devel - extra-cmake-modules-kf6 - - - - - kglobalaccel-kf6 - - qt6-base - libxcb - kcrash-kf6 - kconfig-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - xcb-util-keysyms - kwindowsystem-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kglobalaccel-kf6-devel - Development files for kglobalaccel-kf6 - - kglobalaccel-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kguiaddons-kf6/actions.py b/desktop/kde6/framework/kguiaddons-kf6/actions.py deleted file mode 100755 index c9b6a4ae00..0000000000 --- a/desktop/kde6/framework/kguiaddons-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure("-DBUILD_GEO_SCHEME_HANDLER=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kguiaddons-kf6/pspec.xml b/desktop/kde6/framework/kguiaddons-kf6/pspec.xml deleted file mode 100755 index 99323a34d8..0000000000 --- a/desktop/kde6/framework/kguiaddons-kf6/pspec.xml +++ /dev/null @@ -1,138 +0,0 @@ - - - - - kguiaddons-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Utilities for graphical user interfaces - The KDE GUI addons provide utilities for graphical user interfaces in the areas of colors, fonts, text, images, keyboard input. Development files. - mirrors://kde/stable/frameworks/6.10/kguiaddons-6.10.0.tar.xz - - libX11-devel - libxcb-devel - wayland-devel - plasma-wayland-protocols-kf6 - qt6-base-devel - qt6-wayland-devel - extra-cmake-modules-kf6 - - - - - kguiaddons-kf6 - - - libX11 - wayland-client - qt6-base - qt6-wayland - - - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/applications - /usr/share/doc - /usr/share/qlogging-categories6/kguiaddons.categories - - - - - kguiaddons-kf6-devel - Development files for kguiaddons-kf6 - - kguiaddons-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kholidays-kf6/actions.py b/desktop/kde6/framework/kholidays-kf6/actions.py deleted file mode 100755 index 120217881d..0000000000 --- a/desktop/kde6/framework/kholidays-kf6/actions.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/framework/kholidays-kf6/files/qt5.patch b/desktop/kde6/framework/kholidays-kf6/files/qt5.patch deleted file mode 100755 index e964bb5ee0..0000000000 --- a/desktop/kde6/framework/kholidays-kf6/files/qt5.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2017-12-08 04:01:31.000000000 +0300 -+++ b/CMakeLists.txt 2017-12-16 13:45:06.592702705 +0300 -@@ -32,7 +32,7 @@ - ) - - ########### Find packages ########### --set(QT_REQUIRED_VERSION 5.8.0) -+set(QT_REQUIRED_VERSION 5.7.1) - find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Core Qml) - - remove_definitions(-DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII) diff --git a/desktop/kde6/framework/kholidays-kf6/files/sunrise-fix.patch b/desktop/kde6/framework/kholidays-kf6/files/sunrise-fix.patch deleted file mode 100755 index 0b7be08cf3..0000000000 --- a/desktop/kde6/framework/kholidays-kf6/files/sunrise-fix.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- 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/desktop/kde6/framework/kholidays-kf6/pspec.xml b/desktop/kde6/framework/kholidays-kf6/pspec.xml deleted file mode 100755 index 5bbd01db5f..0000000000 --- a/desktop/kde6/framework/kholidays-kf6/pspec.xml +++ /dev/null @@ -1,141 +0,0 @@ - - - - - kholidays-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - KDE library for regional holiday information - KDE library for regional holiday information - https://download.kde.org/stable/frameworks/6.10/kholidays-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - qt6-linguist - autogen-devel - kitemviews-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - extra-cmake-modules-kf6 - - - - - - - - kholidays-kf6 - - qt6-base - qt6-declarative - - - /etc - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kholidays-kf6-devel - Development files for kdelibs4-support - - qt6-base-devel - kholidays-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/ki18n-kf6/actions.py b/desktop/kde6/framework/ki18n-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/ki18n-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/ki18n-kf6/pspec.xml b/desktop/kde6/framework/ki18n-kf6/pspec.xml deleted file mode 100755 index bb9f5d9b78..0000000000 --- a/desktop/kde6/framework/ki18n-kf6/pspec.xml +++ /dev/null @@ -1,133 +0,0 @@ - - - - - ki18n-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - KDE Gettext-based UI text internationalization. - ki18n-kf6 provides functionality for internationalizing user interface text in applications, based on the GNU Gettext translation system. - mirrors://kde/stable/frameworks/6.10/ki18n-6.10.0.tar.xz - - iso-codes-devel - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - - - - ki18n-kf6 - - - qt6-base - qt6-declarative - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/share/man - - - - - ki18n-kf6-devel - Development files for kde6-ki18n-kf6 - - ki18n-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/ki18n-kf6/translations.xml b/desktop/kde6/framework/ki18n-kf6/translations.xml deleted file mode 100755 index 540b6a7828..0000000000 --- a/desktop/kde6/framework/ki18n-kf6/translations.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - ki18n-kf6 - KDE grafik arabirim yerelleştirme kitaplığı - ki18n-kf6, KDE Frameworks 5 için, Gettext tabanlı bir grafik arabirim yerelleştirme kitaplığıdır - - - - ki18n-kf6-devel - ki18n-kf6 için geliştirme dosyaları - - diff --git a/desktop/kde6/framework/kiconthemes-kf6/actions.py b/desktop/kde6/framework/kiconthemes-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kiconthemes-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kiconthemes-kf6/pspec.xml b/desktop/kde6/framework/kiconthemes-kf6/pspec.xml deleted file mode 100755 index 55f4251147..0000000000 --- a/desktop/kde6/framework/kiconthemes-kf6/pspec.xml +++ /dev/null @@ -1,166 +0,0 @@ - - - - - kiconthemes-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 icon utilities - This library contains classes to improve the handling of icons in applications using the KDE Frameworks. - mirrors://kde/stable/frameworks/6.10/kiconthemes-6.10.0.tar.xz - - kcoreaddons-kf6-devel - qt6-base-devel - qt6-designer-devel - qt6-svg-devel - qt6-declarative-devel - kcolorscheme-kf6-devel - ki18n-kf6-devel - kauth-kf6-devel - karchive-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kitemviews-kf6-devel - breeze-icons-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - - - - - kiconthemes-kf6 - - qt6-base - qt6-svg - qt6-declarative - kcolorscheme-kf6 - kconfigwidgets-kf6 - ki18n-kf6 - kitemviews-kf6 - kwidgetsaddons-kf6 - karchive-kf6 - kconfig-kf6 - breeze-icons-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kiconthemes-kf6-devel - Development files for kiconthemes-kf6 - - kiconthemes-kf6 - qt6-base-devel - - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kidletime-kf6/actions.py b/desktop/kde6/framework/kidletime-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kidletime-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kidletime-kf6/pspec.xml b/desktop/kde6/framework/kidletime-kf6/pspec.xml deleted file mode 100755 index 4fca04de9a..0000000000 --- a/desktop/kde6/framework/kidletime-kf6/pspec.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - kidletime-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Idle time reporting utility - kidletime-kf6 is a singleton reporting information on idle time. It is useful not only for finding out about the current idle time of the PC, but also for getting notified upon idle time events, such as custom timeouts, or user activity. - mirrors://kde/stable/frameworks/6.10/kidletime-6.10.0.tar.xz - - qt6-base-devel - qt6-wayland-devel - wayland-devel - wayland-client - libX11-devel - libXext-devel - libXScrnSaver-devel - libxcb-devel - wayland-protocols-devel - plasma-wayland-protocols-kf6 - extra-cmake-modules-kf6 - - - - - kidletime-kf6 - - qt6-base - qt6-wayland - libX11 - libxcb - wayland-client - libXScrnSaver - libXext - - - /etc/xdg/kidletime-kf6.categories - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kidletime-kf6-devel - Development files for kidletime-kf6 - - kidletime-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kimageformats-kf6/actions.py b/desktop/kde6/framework/kimageformats-kf6/actions.py deleted file mode 100644 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kimageformats-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kimageformats-kf6/pspec.xml b/desktop/kde6/framework/kimageformats-kf6/pspec.xml deleted file mode 100644 index 3b98446c9b..0000000000 --- a/desktop/kde6/framework/kimageformats-kf6/pspec.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - - - kimageformats-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Image formats addons for QT 5 - This framework provides additional image format plugins for QtGui. - mirrors://kde/stable/frameworks/6.10/kimageformats-6.10.0.tar.xz - - imath-devel - libraw-devel - libheif-devel - qt6-base-devel - openexr-devel - karchive-kf6-devel - extra-cmake-modules-kf6 - - - - - kimageformats-kf6 - - imath - libraw - qt6-base - libheif - karchive-kf6 - openexr-libs - - - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kio-kf6/actions.py b/desktop/kde6/framework/kio-kf6/actions.py deleted file mode 100755 index d07aa3eb82..0000000000 --- a/desktop/kde6/framework/kio-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.49.0|5.57.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kio-kf6/files/6e7775d3.patch b/desktop/kde6/framework/kio-kf6/files/6e7775d3.patch deleted file mode 100644 index 2c9b594b33..0000000000 --- a/desktop/kde6/framework/kio-kf6/files/6e7775d3.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 6e7775d315f389df0a440ed62b842ce83dc9a27e Mon Sep 17 00:00:00 2001 -From: Nicolas Fella -Date: Fri, 1 Mar 2024 22:16:07 +0100 -Subject: [PATCH] [kterminallauncherjob] Inherit default process environment - from parent - -Before Qt 6.3, an empty (default constructed) QProcessEnvironment caused -QProcess to incorrectly inherit the environment variables from the parent -process. This was fixed in qtbase 5fc9c02a695. - -CommandLauncherJob was adjusted for this in 916984940f64e07db9b4d152be9f2a87dda0cfb4, -however here we are overriding its default env with our own default-constructed one - -BUG: 482107 ---- - src/gui/kterminallauncherjob.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/gui/kterminallauncherjob.cpp b/src/gui/kterminallauncherjob.cpp -index c4e83fb11b..edd99327bd 100644 ---- a/src/gui/kterminallauncherjob.cpp -+++ b/src/gui/kterminallauncherjob.cpp -@@ -22,7 +22,7 @@ public: - QString m_fullCommand; // "xterm -e ls" - QString m_desktopName; - QByteArray m_startupId; -- QProcessEnvironment m_environment; -+ QProcessEnvironment m_environment{QProcessEnvironment::InheritFromParent}; - }; - - KTerminalLauncherJob::KTerminalLauncherJob(const QString &command, QObject *parent) --- -GitLab - diff --git a/desktop/kde6/framework/kio-kf6/files/8ad69215.patch b/desktop/kde6/framework/kio-kf6/files/8ad69215.patch deleted file mode 100644 index 57060084aa..0000000000 --- a/desktop/kde6/framework/kio-kf6/files/8ad69215.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 8ad6921524c92a0cf1b58336b3ce29e159e83b7d Mon Sep 17 00:00:00 2001 -From: David Edmundson -Date: Wed, 14 Jul 2021 17:06:59 +0100 -Subject: [PATCH] Fix selecting binaries from component chooser KCM - -In the kcmshell for a component chooser we use the open with dialog to -select services for various scheme handlers. - -If you select a binary instead of a .desktop file a temporary .desktop -file is created in ~/.local/share/applications - -This is in the format -Exec=someBinary -MimeType=x-scheme-handler/http - -When we then use this application for launching kio-kf6::DesktopExecParser -then (sort of correctly) determines that that the chosen service cannot -handle the http scheme because even though it is a scheme handler it -does not have a "%u" in the exec line. - -This leads to us potentially loading websites via kio-kf6client or kio-kf6-fuse. - -Testing done: - - kcmshell5 component chooser - - web browser -> other -> type "/usr/bin/firefox" - - kde-open5 http://kde.org - - Previously this gave a local URL, now it is correct ---- - src/widgets/kopenwithdialog.cpp | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/src/widgets/kopenwithdialog.cpp b/src/widgets/kopenwithdialog.cpp -index 1831878ca..31295044d 100644 ---- a/src/widgets/kopenwithdialog.cpp -+++ b/src/widgets/kopenwithdialog.cpp -@@ -1088,6 +1088,14 @@ bool KOpenWithDialogPrivate::checkAccept() - kconfig-kf6Group cg = desktopFile.desktopGroup(); - cg.writeEntry("Type", "Application"); - cg.writeEntry("Name", initialServiceName); -+ -+ // if we select a binary for a scheme handler, then it's safe to assume it can handle URLs -+ if (qMimeType.startsWith(QLatin1String("x-scheme-handler/"))) { -+ if (!typedExec.contains(QLatin1String("%u"), Qt::CaseInsensitive) && !typedExec.contains(QLatin1String("%f"), Qt::CaseInsensitive)) { -+ fullExec += QStringLiteral(" %u"); -+ } -+ } -+ - cg.writeEntry("Exec", fullExec); - cg.writeEntry("NoDisplay", true); // don't make it appear in the K menu - if (terminal->isChecked()) { --- -GitLab - diff --git a/desktop/kde6/framework/kio-kf6/pspec.xml b/desktop/kde6/framework/kio-kf6/pspec.xml deleted file mode 100755 index 7b9413c37d..0000000000 --- a/desktop/kde6/framework/kio-kf6/pspec.xml +++ /dev/null @@ -1,235 +0,0 @@ - - - - - kio-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Resource and network access abstraction - Network transparent access to files and data - mirrors://kde/stable/frameworks/6.10/kio-6.10.0.tar.xz - - qt6-base-devel - qt6-5compat-devel - qt6-designer-devel - qt6-declarative-devel - acl-devel - attr-devel - mit-kerberos-devel - kcrash-kf6-devel - karchive-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kservice-kf6-devel - solid-kf6-devel - sonnet-kf6-devel - kdoctools-kf6-devel - kbookmarks-kf6-devel - kwidgetsaddons-kf6-devel - kcompletion-kf6-devel - kconfigwidgets-kf6-devel - kauth-kf6-devel - kcodecs-kf6-devel - kiconthemes-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - kwindowsystem-kf6-devel - kwallet-kf6-devel - kxmlgui-kf6-devel - ktextwidgets-kf6-devel - knotifications-kf6-devel - kguiaddons-kf6-devel - kcolorscheme-kf6-devel - libxslt-devel - zlib-devel - docbook-sgml4_5 - docbook-xml - docbook-xsl - extra-cmake-modules-kf6 - kded-kf6-devel - libutil-linux-devel - switcheroo-control - - - - - - - - kio-kf6 - - qt6-base - qt6-declarative - qt6-5compat - acl - libgcc - libxml2 - libxslt - kdoctools-kf6 - mit-kerberos - kauth-kf6 - kcrash-kf6 - knotifications-kf6 - karchive-kf6 - kconfig-kf6 - kcodecs-kf6 - kbookmarks-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - ki18n-kf6 - kiconthemes-kf6 - kitemviews-kf6 - kjobwidgets-kf6 - kservice-kf6 - ktextwidgets-kf6 - kwallet-kf6 - kwidgetsaddons-kf6 - kwindowsystem-kf6 - kxmlgui-kf6 - solid-kf6 - kguiaddons-kf6 - kcolorscheme-kf6 - libutil-linux - switcheroo-control - - - /etc/ - /usr/bin - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/share/man - - - - - kio-kf6-devel - Development files for kio-kf6 - - qt6-base-devel - kio-kf6 - kconfig-kf6-devel - kcodecs-kf6-devel - kbookmarks-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - kservice-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - solid-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-19 - 6.4.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-10 - 6.0.0 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kirigami-addons-kf6/actions.py b/desktop/kde6/framework/kirigami-addons-kf6/actions.py deleted file mode 100644 index 215af16d14..0000000000 --- a/desktop/kde6/framework/kirigami-addons-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import cmaketools -from pisi.actionsapi import pisitools -from pisi.actionsapi import get - -def setup(): - cmaketools.configure("-DCMAKE_INSTALL_LIBDIR=lib") - -def build(): - cmaketools.make() - -def install(): - cmaketools.rawInstall("DESTDIR=%s" % get.installDIR()) - - pisitools.removeDir("/usr/share") - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/framework/kirigami-addons-kf6/pspec.xml b/desktop/kde6/framework/kirigami-addons-kf6/pspec.xml deleted file mode 100644 index 8262f5a11a..0000000000 --- a/desktop/kde6/framework/kirigami-addons-kf6/pspec.xml +++ /dev/null @@ -1,169 +0,0 @@ - - - - - kirigami-addons-kf6 - https://github.com/KDE/kirigami-addons - - Mustafa Cinasal - muscnsl@gmail.com - - GPL, LGPL - library - Add-ons for the Kirigami framework - Add-ons for the Kirigami framework - https://download.kde.org/stable/kirigami-addons/kirigami-addons-1.7.0.tar.xz - - ki18n-kf6-devel - kconfig-kf6-devel - kirigami-kf6-devel - kcoreaddons-kf6-devel - kguiaddons-kf6-devel - kglobalaccel-kf6-devel - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - - - - - kirigami-addons-kf6 - - ki18n-kf6 - kconfig-kf6 - kguiaddons-kf6 - kcoreaddons-kf6 - kglobalaccel-kf6 - qt6-base - qt6-declarative - - - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - /usr/include/KirigamiAddonsStatefulApp - - - - - - 2025-01-17 - 1.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2025-01-09 - 1.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 1.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 1.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 1.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 1.4.0 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 1.4.0 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-24 - 1.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-11 - 1.3.0 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 1.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 1.2.1 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-15 - 1.2.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-11 - 1.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-04 - 1.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 1.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-29 - 1.0.1 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kirigami-addons-kf6/translations.xml b/desktop/kde6/framework/kirigami-addons-kf6/translations.xml deleted file mode 100644 index 9ffe73d6a7..0000000000 --- a/desktop/kde6/framework/kirigami-addons-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kirigami-addons - Add-ons for the Kirigami framework - Add-ons for the Kirigami framework - - diff --git a/desktop/kde6/framework/kirigami-kf6/actions.py b/desktop/kde6/framework/kirigami-kf6/actions.py deleted file mode 100755 index 9745a03c42..0000000000 --- a/desktop/kde6/framework/kirigami-kf6/actions.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -#from pisi.actionsapi import pisitools - -# if pisi can't find source directory, see /var/pisi/kirigami-kf6/work/ and: -# WorkDir="kirigami-kf6-"+ get.srcVERSION() +"/sub_project_dir/" - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - -# Take a look at the source folder for these file as documentation. -# pisitools.dodoc("AUTHORS", "BUGS", "ChangeLog", "COPYING", "README") - -# If there is no install rule for a runnable binary, you can -# install it to binary directory. -# pisitools.dobin("kirigami-kf6") - -# You can use these as variables, they will replace GUI values before build. -# Package Name : kirigami-kf6 -# Version : 2.2.0 -# Summary : A set of QML components for mobile/desktop convergent applications made by KDE - -# For more information, you can look at the Actions API -# from the Help menu and toolbar. diff --git a/desktop/kde6/framework/kirigami-kf6/pspec.xml b/desktop/kde6/framework/kirigami-kf6/pspec.xml deleted file mode 100755 index b8e4e18c8b..0000000000 --- a/desktop/kde6/framework/kirigami-kf6/pspec.xml +++ /dev/null @@ -1,138 +0,0 @@ - - - kirigami-kf6 - https://quickgit.kde.org/?p=kirigami-kf6.git - - Ali Algul - aligulle3801@gmail.com - - LGPL - A set of QML components for mobile/desktop convergent applications made by KDE - A set of QML components for mobile/desktop convergent applications made by KDE - https://download.kde.org/stable/frameworks/6.10/kirigami-6.10.0.tar.xz - - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-linguist - qt6-svg-devel - qt6-shadertools-devel - - - - - kirigami-kf6 - A set of QML components for mobile/desktop convergent applications made by KDE - - - qt6-base - qt6-declarative - - - /usr/share/locale/ - /usr/lib/ - - - - kirigami-kf6-devel - Development files for kirigami-kf6 - - kirigami-kf6 - - - /usr/include - /usr/lib/pkgconfig - /usr/share/qlogging-categories6/kirigami.categories - /usr/share/kdevappwizard/templates/kirigami6.tar.bz2 - /usr/lib/cmake - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-13 - 6.2.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kitemmodels-kf6/actions.py b/desktop/kde6/framework/kitemmodels-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kitemmodels-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kitemmodels-kf6/pspec.xml b/desktop/kde6/framework/kitemmodels-kf6/pspec.xml deleted file mode 100755 index da89e906fe..0000000000 --- a/desktop/kde6/framework/kitemmodels-kf6/pspec.xml +++ /dev/null @@ -1,133 +0,0 @@ - - - - - kitemmodels-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Set of item models extending the Qt model-view framework - kitemmodels-kf6 provides a set of item models extending the Qt model-view framework. - mirrors://kde/stable/frameworks/6.10/kitemmodels-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - - - - kitemmodels-kf6 - - qt6-base - qt6-declarative - - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kitemmodels-kf6-devel - Development files for kitemmodels-kf6 - - qt6-base-devel - kitemmodels-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kitemviews-kf6/actions.py b/desktop/kde6/framework/kitemviews-kf6/actions.py deleted file mode 100755 index c2002a8fe2..0000000000 --- a/desktop/kde6/framework/kitemviews-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kitemviews-kf6/pspec.xml b/desktop/kde6/framework/kitemviews-kf6/pspec.xml deleted file mode 100755 index c6a3788c15..0000000000 --- a/desktop/kde6/framework/kitemviews-kf6/pspec.xml +++ /dev/null @@ -1,133 +0,0 @@ - - - - - kitemviews-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Set of item models extending the Qt model-view framework - kitemviews-kf6 includes a set of views, which can be used with item models. It includes views for categorizing lists and to add search filters to flat and hierarchical lists. - mirrors://kde/stable/frameworks/6.10/kitemviews-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-designer-devel - extra-cmake-modules-kf6 - - - - - kitemviews-kf6 - - qt6-base - - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kitemviews-kf6-devel - Development files for kitemviews-kf6 - - qt6-base-devel - kitemviews-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kjobwidgets-kf6/actions.py b/desktop/kde6/framework/kjobwidgets-kf6/actions.py deleted file mode 100644 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kjobwidgets-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kjobwidgets-kf6/pspec.xml b/desktop/kde6/framework/kjobwidgets-kf6/pspec.xml deleted file mode 100644 index 7b96d9f90a..0000000000 --- a/desktop/kde6/framework/kjobwidgets-kf6/pspec.xml +++ /dev/null @@ -1,141 +0,0 @@ - - - - - kjobwidgets-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Widgets for showing progress of asynchronous jobs - kjobwidgets-kf6 provides widgets for showing progress of asynchronous jobs. - mirrors://kde/stable/frameworks/6.10/kjobwidgets-6.10.0.tar.xz - - libX11-devel - qt6-base-devel - qt6-linguist - kcoreaddons-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - - - - - kjobwidgets-kf6 - - qt6-base - libgcc - kcoreaddons-kf6 - kwidgetsaddons-kf6 - knotifications-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kjobwidgets-kf6-devel - Development files for kjobwidgets-kf6 - - qt6-base-devel - kcoreaddons-kf6-devel - kjobwidgets-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/knewstuff-kf6/actions.py b/desktop/kde6/framework/knewstuff-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/knewstuff-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/knewstuff-kf6/files/49f2037a.patch b/desktop/kde6/framework/knewstuff-kf6/files/49f2037a.patch deleted file mode 100644 index 6e0b2ca3c0..0000000000 --- a/desktop/kde6/framework/knewstuff-kf6/files/49f2037a.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 49f2037ac22fcb430fadd5d7b29bd8af234573a4 Mon Sep 17 00:00:00 2001 -From: Akseli Lahtinen -Date: Thu, 7 Mar 2024 16:01:44 +0000 -Subject: [PATCH] Fix link list dialog for installation button - -In gridview, installation buttons showed "Install..." for every item, -even if the item had only single download link. This fixes it -by showing correct button. - -The problem was using `entry` directly instead of `model`. - -BUG: 482349 -FIXED-IN: 6.1 ---- - .../qml/private/entrygriddelegates/TileDelegate.qml | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/src/qtquick/qml/private/entrygriddelegates/TileDelegate.qml b/src/qtquick/qml/private/entrygriddelegates/TileDelegate.qml -index 2fdee68b4..36224abe2 100644 ---- a/src/qtquick/qml/private/entrygriddelegates/TileDelegate.qml -+++ b/src/qtquick/qml/private/entrygriddelegates/TileDelegate.qml -@@ -40,13 +40,13 @@ Private.GridTileDelegate { - visible: enabled - }, - Kirigami.Action { -- text: entry.downloadLinks.length === 1 ? i18ndc("knewstuff6", "Request installation of this item, available when there is exactly one downloadable item", "Install") : i18ndc("knewstuff6", "Show installation options, where there is more than one downloadable item", "Install…"); -+ text: model.downloadLinks.length === 1 ? i18ndc("knewstuff6", "Request installation of this item, available when there is exactly one downloadable item", "Install") : i18ndc("knewstuff6", "Show installation options, where there is more than one downloadable item", "Install…"); - icon.name: "install" - onTriggered: { -- if (entry.downloadLinks.length === 1) { -- newStuffEngine.install(entry.entry, NewStuff.ItemsModel.FirstLinkId); -+ if (model.downloadLinks.length === 1) { -+ newStuffEngine.install(entry, NewStuff.ItemsModel.FirstLinkId); - } else { -- downloadItemsSheet.downloadLinks = entry.downloadLinks; -+ downloadItemsSheet.downloadLinks = model.downloadLinks; - downloadItemsSheet.entry = entry; - downloadItemsSheet.open(); - } --- -GitLab - diff --git a/desktop/kde6/framework/knewstuff-kf6/files/4f01e2ff.patch b/desktop/kde6/framework/knewstuff-kf6/files/4f01e2ff.patch deleted file mode 100644 index a7881dd72d..0000000000 --- a/desktop/kde6/framework/knewstuff-kf6/files/4f01e2ff.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 4f01e2ff676cd4a11ba36f49d967db4635e2d216 Mon Sep 17 00:00:00 2001 -From: Nicolas Fella -Date: Wed, 6 Mar 2024 19:39:09 +0100 -Subject: [PATCH] [qtquick/action] Add API to set transient parent for dialog - -We want the dialog to have a proper parent window set. Usually -Qt automatically obtains one from the parent item. This doesn't -work here however since the dialog's loader is not part of the item -hierarchy. This causes the window to not be shown since Qt 6.7. - -See QTBUG-121197 - -Merely adding the property and setting it to null makes sure the -window can be shown. Users of the API should however pass a parent window -so that the dialog has a parent set. - -BUG: 479816 ---- - src/qtquick/qml/Action.qml | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/src/qtquick/qml/Action.qml b/src/qtquick/qml/Action.qml -index ae134112e..05e49d6ab 100644 ---- a/src/qtquick/qml/Action.qml -+++ b/src/qtquick/qml/Action.qml -@@ -92,6 +92,14 @@ Kirigami.Action { - */ - property bool visibleWhenDisabled: false - -+ /** -+ * The parent window for the dialog created by invoking the action -+ * -+ * @since 6.1 -+ * -+ */ -+ property var transientParent: null -+ - /** - * Show the page/dialog (same as activating the action), if allowed by the Kiosk settings - */ -@@ -185,6 +193,7 @@ Kirigami.Action { - asynchronous: true - - sourceComponent: NewStuff.Dialog { -+ transientParent: component.transientParent - configFile: component.configFile - viewMode: component.viewMode - } --- -GitLab - diff --git a/desktop/kde6/framework/knewstuff-kf6/pspec.xml b/desktop/kde6/framework/knewstuff-kf6/pspec.xml deleted file mode 100755 index 1bff25ca26..0000000000 --- a/desktop/kde6/framework/knewstuff-kf6/pspec.xml +++ /dev/null @@ -1,187 +0,0 @@ - - - - - knewstuff-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Framework for downloading and sharing additional application data - The knewstuff-kf6 library implements collaborative data sharing for applications. - mirrors://kde/stable/frameworks/6.10/knewstuff-6.10.0.tar.xz - - qt6-base-devel - qt6-designer-devel - qt6-declarative-devel - boost-devel - kauth-kf6-devel - ksyndication-kf6-devel - kwidgetsaddons-kf6-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - kcompletion-kf6-devel - kitemviews-kf6-devel - karchive-kf6-devel - attica-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcmutils-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kglobalaccel-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - kbookmarks-kf6-devel - kwindowsystem-kf6-devel - sonnet-kf6-devel - kcodecs-kf6-devel - kconfigwidgets-kf6-devel - solid-kf6-devel - kjobwidgets-kf6-devel - kpackage-kf6-devel - extra-cmake-modules-kf6 - kirigami-kf6-devel - - - - - - - - knewstuff-kf6 - - qt6-base - qt6-designer - qt6-declarative - ksyndication-kf6 - kwidgetsaddons-kf6 - ktextwidgets-kf6 - kiconthemes-kf6 - kcompletion-kf6 - kitemviews-kf6 - karchive-kf6 - attica-kf6 - kconfig-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kio-kf6 - kservice-kf6 - kxmlgui-kf6 - kjobwidgets-kf6 - kpackage-kf6 - - - /usr/bin/knewstuff-dialog6 - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - knewstuff-kf6-devel - Development files for knewstuff-kf6 - - qt6-base-devel - attica-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - knewstuff-kf6 - ksyndication-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/knotifications-kf6/actions.py b/desktop/kde6/framework/knotifications-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/knotifications-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/knotifications-kf6/pspec.xml b/desktop/kde6/framework/knotifications-kf6/pspec.xml deleted file mode 100755 index 0b2df84bdf..0000000000 --- a/desktop/kde6/framework/knotifications-kf6/pspec.xml +++ /dev/null @@ -1,166 +0,0 @@ - - - - - knotifications-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - kde6 Desktop notifications - KNotification is used to notify the user of an event. It covers feedback and persistent events. - mirrors://kde/stable/frameworks/6.10/knotifications-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-speech-devel - qt6-declarative-devel - kservice-kf6-devel - kwindowsystem-kf6-devel - kservice-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - kcodecs-kf6-devel - - libcanberra-devel - qt6-phonon-devel - libXtst-devel - extra-cmake-modules-kf6 - - - - - knotifications-kf6 - - qt6-base - qt6-speech - qt6-declarative - qt6-phonon - libXtst - libX11 - kconfig-kf6 - - kcoreaddons-kf6 - - - - libcanberra - kwindowsystem-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - knotifications-kf6-devel - Development files for knotifications-kf6 - - knotifications-kf6 - qt6-base-devel - - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/knotifyconfig-kf6/actions.py b/desktop/kde6/framework/knotifyconfig-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/knotifyconfig-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/knotifyconfig-kf6/pspec.xml b/desktop/kde6/framework/knotifyconfig-kf6/pspec.xml deleted file mode 100755 index f947b9e7b7..0000000000 --- a/desktop/kde6/framework/knotifyconfig-kf6/pspec.xml +++ /dev/null @@ -1,160 +0,0 @@ - - - - - knotifyconfig-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Configuration dialog for desktop notifications - knotifyconfig-kf6 provides a configuration dialog for desktop notifications which can be embedded in your application.. - mirrors://kde/stable/frameworks/6.10/knotifyconfig-6.10.0.tar.xz - - qt6-base-devel - qt6-phonon-devel - solid-kf6-devel - kauth-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - kcompletion-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kcodecs-kf6-devel - kservice-kf6-devel - kjobwidgets-kf6-devel - kbookmarks-kf6-devel - kcoreaddons-kf6-devel - kwidgetsaddons-kf6-devel - kitemviews-kf6-devel - kconfigwidgets-kf6-devel - kwindowsystem-kf6-devel - libcanberra-devel - extra-cmake-modules-kf6 - - - - - knotifyconfig-kf6 - - qt6-base - - - libcanberra - kconfig-kf6 - - ki18n-kf6 - kio-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - knotifyconfig-kf6-devel - Development files for knotifyconfig-kf6 - - knotifyconfig-kf6 - qt6-base-devel - - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kpackage-kf6/actions.py b/desktop/kde6/framework/kpackage-kf6/actions.py deleted file mode 100755 index 86cb1138d8..0000000000 --- a/desktop/kde6/framework/kpackage-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kpackage-kf6/pspec.xml b/desktop/kde6/framework/kpackage-kf6/pspec.xml deleted file mode 100755 index 2543420534..0000000000 --- a/desktop/kde6/framework/kpackage-kf6/pspec.xml +++ /dev/null @@ -1,148 +0,0 @@ - - - - - kpackage-kf6 - https://userbase.kde.org/kpackage-kf6 - - Stefan Gronewold(groni) - groni@pisilinux.org - - LGPL - app:library - Framework that lets applications manage user installable packages of non-binary assets - kpackage-kf6 is dependent on the Smart package manager. - mirrors://kde/stable/frameworks/6.10/kpackage-6.10.0.tar.xz - - qt6-base-devel - libX11-devel - kconfig-kf6-devel - ki18n-kf6-devel - kcoreaddons-kf6-devel - karchive-kf6-devel - kdoctools-kf6-devel - docbook-sgml4_5 - docbook-xsl - extra-cmake-modules-kf6 - - - - - kpackage-kf6 - - qt6-base - - - ki18n-kf6 - karchive-kf6 - kcoreaddons-kf6 - - - /usr/bin - /etc/xdg - /usr/lib/qt5 - /usr/lib - /usr/share - /usr/share/locale - /usr/share/man/man1 - - - - - kpackage-kf6-devel - Development files for kpackage-kf6 - - kpackage-kf6 - qt6-base-devel - kconfig-kf6-devel - ki18n-kf6-devel - kcoreaddons-kf6-devel - karchive-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kpackage-kf6/translations.xml b/desktop/kde6/framework/kpackage-kf6/translations.xml deleted file mode 100755 index 00ce988256..0000000000 --- a/desktop/kde6/framework/kpackage-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kde6-kpackage-kf6 - Framework that lets applications manage user installable packages of non-binary assets - kpackage-kf6 is dependent on the Smart package manager. - - diff --git a/desktop/kde6/framework/kparts-kf6/actions.py b/desktop/kde6/framework/kparts-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kparts-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kparts-kf6/pspec.xml b/desktop/kde6/framework/kparts-kf6/pspec.xml deleted file mode 100755 index 969d802309..0000000000 --- a/desktop/kde6/framework/kparts-kf6/pspec.xml +++ /dev/null @@ -1,167 +0,0 @@ - - - - - kparts-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Plugin framework for user interface components - This library implements the framework for KDE parts, which are elaborate widgets with a user-interface defined in terms of actions (menu items, toolbar icons). - mirrors://kde/stable/frameworks/6.10/kparts-6.10.0.tar.xz - - qt6-base-devel - kauth-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - kcompletion-kf6-devel - kitemviews-kf6-devel - karchive-kf6-devel - attica-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcmutils-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kglobalaccel-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - kbookmarks-kf6-devel - kwindowsystem-kf6-devel - sonnet-kf6-devel - kcodecs-kf6-devel - kconfigwidgets-kf6-devel - solid-kf6-devel - kjobwidgets-kf6-devel - extra-cmake-modules-kf6 - - - - - kparts-kf6 - - qt6-base - libgcc - kjobwidgets-kf6 - kconfig-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kiconthemes-kf6 - kservice-kf6 - kwidgetsaddons-kf6 - kxmlgui-kf6 - kio-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kparts-kf6-devel - Development files for kparts-kf6 - - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - ktextwidgets-kf6-devel - kparts-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kpeople-kf6/actions.py b/desktop/kde6/framework/kpeople-kf6/actions.py deleted file mode 100755 index 4ff0ffac59..0000000000 --- a/desktop/kde6/framework/kpeople-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - pisitools.ldflags.add("-Wl,-rpath,/usr/lib") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - #pisitools.dodoc("COPYING") diff --git a/desktop/kde6/framework/kpeople-kf6/pspec.xml b/desktop/kde6/framework/kpeople-kf6/pspec.xml deleted file mode 100755 index 3a793a1f3e..0000000000 --- a/desktop/kde6/framework/kpeople-kf6/pspec.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - - - kpeople-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - A contact aggregation library for KDE - KPeople is a Framework for fetching contacts from different sources (Telepathy, Akonadi, Facebook, etc) and unifying them into a same model. - mirrors://kde/stable/frameworks/6.10/kpeople-6.10.0.tar.xz - - qt6-base-devel - kconfig-kf6-devel - qt6-declarative-devel - kcoreaddons-kf6-devel - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - kservice-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kitemviews-kf6-devel - kcontacts-kf6-devel - extra-cmake-modules-kf6 - - - - - kpeople-kf6 - - qt6-base - qt6-declarative - - - kcoreaddons-kf6 - kcontacts-kf6 - kwidgetsaddons-kf6 - ki18n-kf6 - kitemviews-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /etc/xdg - - - - - kpeople-kf6-devel - Development files for kpeople-kf6 - - qt6-base-devel - - kpeople-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kplotting-kf6/actions.py b/desktop/kde6/framework/kplotting-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kplotting-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kplotting-kf6/pspec.xml b/desktop/kde6/framework/kplotting-kf6/pspec.xml deleted file mode 100755 index ef44008c8e..0000000000 --- a/desktop/kde6/framework/kplotting-kf6/pspec.xml +++ /dev/null @@ -1,129 +0,0 @@ - - - - - kplotting-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - kde6 Data plotting - kplotting-kf6 contains data plotting classes for QT 5 and KDE - mirrors://kde/stable/frameworks/6.10/kplotting-6.10.0.tar.xz - - qt6-base-devel - qt6-designer-devel - extra-cmake-modules-kf6 - - - - - kplotting-kf6 - - qt6-base - - - - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kplotting-kf6-devel - Development files for kplotting-kf6 - - - kplotting-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kpty-kf6/actions.py b/desktop/kde6/framework/kpty-kf6/actions.py deleted file mode 100644 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kpty-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kpty-kf6/pspec.xml b/desktop/kde6/framework/kpty-kf6/pspec.xml deleted file mode 100644 index 150ac1cbbf..0000000000 --- a/desktop/kde6/framework/kpty-kf6/pspec.xml +++ /dev/null @@ -1,141 +0,0 @@ - - - - - kpty-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Libraries for pseudo terminal devices - kpty-kf6 provides primitives to interface with pseudo terminal devices as well as a KProcess derived class for running child processes and communicating with them using kpty-kf6. - mirrors://kde/stable/frameworks/6.10/kpty-6.10.0.tar.xz - - qt6-base-devel - utempter-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - knotifications-kf6-devel - extra-cmake-modules-kf6 - - - - - kpty-kf6 - - qt6-base - - libgcc --> - kcoreaddons-kf6 - ki18n-kf6 - knotifications-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kpty-kf6-devel - Development files for kpty-kf6 - - - - kcoreaddons-kf6-devel - - kpty-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kquickcharts-kf6/actions.py b/desktop/kde6/framework/kquickcharts-kf6/actions.py deleted file mode 100644 index dd3d84e185..0000000000 --- a/desktop/kde6/framework/kquickcharts-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*") diff --git a/desktop/kde6/framework/kquickcharts-kf6/pspec.xml b/desktop/kde6/framework/kquickcharts-kf6/pspec.xml deleted file mode 100644 index 5edab150fd..0000000000 --- a/desktop/kde6/framework/kquickcharts-kf6/pspec.xml +++ /dev/null @@ -1,120 +0,0 @@ - - - - - kquickcharts-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - library - A QtQuick plugin providing high-performance charts - Yüksek performanslı grafikler sunan bir QtQuick eklentisi - mirrors://kde/stable/frameworks/6.10/kquickcharts-6.10.0.tar.xz - - qt6-base-devel - qt6-shadertools-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - - - - kquickcharts-kf6 - - libgcc - qt6-base - qt6-declarative - qt6-shadertools - - - /usr/lib - /usr/lib/qt5 - /usr/lib/cmake - /usr/share/qlogging-categories6/kquickcharts.categories - /usr/share/doc - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kquickcharts-kf6/translations.xml b/desktop/kde6/framework/kquickcharts-kf6/translations.xml deleted file mode 100644 index 1cd34bc254..0000000000 --- a/desktop/kde6/framework/kquickcharts-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kquickcharts-kf6 - A QtQuick plugin providing high-performance charts - Yüksek performanslı grafikler sunan bir QtQuick eklentisi - - diff --git a/desktop/kde6/framework/krunner-kf6/actions.py b/desktop/kde6/framework/krunner-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/krunner-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/krunner-kf6/pspec.xml b/desktop/kde6/framework/krunner-kf6/pspec.xml deleted file mode 100755 index 0564e522c4..0000000000 --- a/desktop/kde6/framework/krunner-kf6/pspec.xml +++ /dev/null @@ -1,159 +0,0 @@ - - - - - krunner-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Krunner Framework for providing different actions given a string query - Framework Integration is a set of plugins responsible for better integration of Qt applications when running on a KDE Plasma workspace. - mirrors://kde/stable/frameworks/6.10/krunner-6.10.0.tar.xz - - qt6-base-devel - gettext-devel - kdoctools-kf6-devel - qt6-declarative-devel - kconfig-kf6-devel - kauth-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kservice-kf6-devel - solid-kf6-devel - threadweaver-kf6-devel - kitemmodels-kf6-devel - extra-cmake-modules-kf6 - - - - - krunner-kf6 - - qt6-base - qt6-declarative - kconfig-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kio-kf6 - kservice-kf6 - kitemmodels-kf6 - threadweaver-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - krunner-kf6-devel - Development files for krunner-kf6 - - krunner-kf6 - qt6-base-devel - - - - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kservice-kf6/actions.py b/desktop/kde6/framework/kservice-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kservice-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kservice-kf6/pspec.xml b/desktop/kde6/framework/kservice-kf6/pspec.xml deleted file mode 100755 index 0db3951f85..0000000000 --- a/desktop/kde6/framework/kservice-kf6/pspec.xml +++ /dev/null @@ -1,154 +0,0 @@ - - - - - kservice-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 Desktop Services - kservice-kf6 Provides a plugin framework for handling desktop services. Services can be applications or libraries. They can be bound to MIME types or handled by application specific code. - mirrors://kde/stable/frameworks/6.10/kservice-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - kdoctools-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - docbook-xml - docbook-xsl - extra-cmake-modules-kf6 - - - - - kservice-kf6 - - qt6-base - qt6-declarative - - kconfig-kf6 - kcoreaddons-kf6 - kcrash-kf6 - kdbusaddons-kf6 - ki18n-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/man - /usr/share/doc - - - - - kservice-kf6-devel - Development files for kservice-kf6 - - kservice-kf6 - - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kstatusnotifieritem-kf6/actions.py b/desktop/kde6/framework/kstatusnotifieritem-kf6/actions.py deleted file mode 100644 index 9cb5146c65..0000000000 --- a/desktop/kde6/framework/kstatusnotifieritem-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/framework/kstatusnotifieritem-kf6/pspec.xml b/desktop/kde6/framework/kstatusnotifieritem-kf6/pspec.xml deleted file mode 100644 index bfbd87a9d5..0000000000 --- a/desktop/kde6/framework/kstatusnotifieritem-kf6/pspec.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - - - kstatusnotifieritem-kf6 - https://community.kde.org/Frameworks - - Mustafa Cinasal - muscnsl@gmail.com - - GPLv3 - library - Implementation of Status Notifier Items - Durum Bildirici Öğelerinin Uygulanması - https://download.kde.org/stable/frameworks/6.10/kstatusnotifieritem-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - - - - - - kstatusnotifieritem-kf6 - - qt6-base - kwindowsystem-kf6 - - - /usr/lib - /usr/share - /usr/share/locale - /usr/share/info - /usr/share/doc - - - - - kstatusnotifieritem-kf6-devel - Development files for kstatusnotifieritem-kf6 - - kstatusnotifieritem-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kstatusnotifieritem-kf6/translations.xml b/desktop/kde6/framework/kstatusnotifieritem-kf6/translations.xml deleted file mode 100644 index 45b5c670e8..0000000000 --- a/desktop/kde6/framework/kstatusnotifieritem-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kstatusnotifieritem-kf6 - Implementation of Status Notifier Items - Durum Bildirici Öğelerinin Uygulanması - - diff --git a/desktop/kde6/framework/ksvg-kf6/actions.py b/desktop/kde6/framework/ksvg-kf6/actions.py deleted file mode 100644 index 0eef11c64c..0000000000 --- a/desktop/kde6/framework/ksvg-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/framework/ksvg-kf6/pspec.xml b/desktop/kde6/framework/ksvg-kf6/pspec.xml deleted file mode 100644 index 6abeab18a4..0000000000 --- a/desktop/kde6/framework/ksvg-kf6/pspec.xml +++ /dev/null @@ -1,155 +0,0 @@ - - - - - ksvg-kf6 - https://community.kde.org/Frameworks - - Mustafa Cinasal - muscnsl@gmail.com - - LGPLv3 - library - Components for handling SVGs - SVG'leri işlemeye yönelik bileşenler - https://download.kde.org/stable/frameworks/6.10/ksvg-6.10.0.tar.xz - - qt6-svg-devel - qt6-base-devel - qt6-declarative-devel - kconfig-kf6-devel - karchive-kf6-devel - kirigami-kf6-devel - kguiaddons-kf6-devel - kcoreaddons-kf6-devel - kcolorscheme-kf6-devel - extra-cmake-modules-kf6 - - - - - - ksvg-kf6 - - qt6-svg - qt6-base - qt6-declarative - kconfig-kf6 - karchive-kf6 - kirigami-kf6 - kguiaddons-kf6 - kcoreaddons-kf6 - kcolorscheme-kf6 - - - /usr/lib - /usr/share/qlogging-categories6 - /usr/share/doc - - - - - ksvg-kf6-devel - Development files for ksvg-kf6 - - ksvg-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.3.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/ksvg-kf6/translations.xml b/desktop/kde6/framework/ksvg-kf6/translations.xml deleted file mode 100644 index 738ff33ab9..0000000000 --- a/desktop/kde6/framework/ksvg-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - ksvg-kf6 - Components for handling SVGs - SVG'leri işlemeye yönelik bileşenler - - diff --git a/desktop/kde6/framework/ksyndication-kf6/actions.py b/desktop/kde6/framework/ksyndication-kf6/actions.py deleted file mode 100755 index 0beb5b2108..0000000000 --- a/desktop/kde6/framework/ksyndication-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - #pisitools.dodoc("COPYING.LIB", "COPYING.BSD") diff --git a/desktop/kde6/framework/ksyndication-kf6/pspec.xml b/desktop/kde6/framework/ksyndication-kf6/pspec.xml deleted file mode 100755 index b3f9948052..0000000000 --- a/desktop/kde6/framework/ksyndication-kf6/pspec.xml +++ /dev/null @@ -1,134 +0,0 @@ - - - - - ksyndication-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:library - RSS/Atom parser library - syndication is a parser library for RSS and Atom feeds. - mirrors://kde/stable/frameworks/6.10/syndication-6.10.0.tar.xz - - qt6-base-devel - kio-kf6-devel - kcodecs-kf6-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - - - - - ksyndication-kf6 - - qt6-base - kcodecs-kf6 - libgcc - - - /etc/xdg - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/share/qlogging-categories6/syndication.categories - /usr/share/qlogging-categories6 - - - - - ksyndication-kf6-devel - Development files for ksyndication-kf6 - - ksyndication-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/ktexteditor-kf6/actions.py b/desktop/kde6/framework/ktexteditor-kf6/actions.py deleted file mode 100755 index c49ab1b044..0000000000 --- a/desktop/kde6/framework/ktexteditor-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/share/dbus-1") - pisitools.removeDir("/usr/share/polkit-1") - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/ktexteditor-kf6/pspec.xml b/desktop/kde6/framework/ktexteditor-kf6/pspec.xml deleted file mode 100755 index 83ea2100ad..0000000000 --- a/desktop/kde6/framework/ktexteditor-kf6/pspec.xml +++ /dev/null @@ -1,192 +0,0 @@ - - - - - ktexteditor-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - kde6 text editor libraries - ktexteditor-kf6 provides a powerful text editor component that you can embed in your application. - mirrors://kde/stable/frameworks/6.10/ktexteditor-6.10.0.tar.xz - - qt6-base-devel - qt6-speech-devel - qt6-multimedia-devel - qt6-declarative-devel - kauth-kf6-devel - kguiaddons-kf6-devel - kwidgetsaddons-kf6-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - kcompletion-kf6-devel - kitemviews-kf6-devel - karchive-kf6-devel - attica-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcmutils-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kglobalaccel-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - kbookmarks-kf6-devel - kwindowsystem-kf6-devel - sonnet-kf6-devel - kcodecs-kf6-devel - kconfigwidgets-kf6-devel - solid-kf6-devel - kparts-kf6-devel - kcolorscheme-kf6-devel - syntax-highlighting-kf6-devel - libgit2-devel - editorconfig-core-c-devel - kjobwidgets-kf6-devel - extra-cmake-modules-kf6 - - - - - ktexteditor-kf6 - - kauth-kf6 - libgit2 - kitemviews-kf6 - editorconfig-core-c - qt6-base - qt6-multimedia - qt6-speech - qt6-declarative - ktextwidgets-kf6 - kwindowsystem-kf6 - kwidgetsaddons-kf6 - kconfigwidgets-kf6 - kjobwidgets-kf6 - kiconthemes-kf6 - kcoreaddons-kf6 - kcompletion-kf6 - kxmlgui-kf6 - kcodecs-kf6 - karchive-kf6 - kguiaddons-kf6 - kconfig-kf6 - ki18n-kf6 - kio-kf6 - ki18n-kf6 - kparts-kf6 - sonnet-kf6 - kcolorscheme-kf6 - syntax-highlighting-kf6 - - - /usr/bin - /etc - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - ktexteditor-kf6-devel - Development files for ktexteditor-kf6 - - kparts-kf6-devel - syntax-highlighting-kf6-devel - ktexteditor-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/ktexttemplate-kf6/actions.py b/desktop/kde6/framework/ktexttemplate-kf6/actions.py deleted file mode 100644 index 0eef11c64c..0000000000 --- a/desktop/kde6/framework/ktexttemplate-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/framework/ktexttemplate-kf6/pspec.xml b/desktop/kde6/framework/ktexttemplate-kf6/pspec.xml deleted file mode 100644 index d963b9e6cd..0000000000 --- a/desktop/kde6/framework/ktexttemplate-kf6/pspec.xml +++ /dev/null @@ -1,135 +0,0 @@ - - - - - ktexttemplate-kf6 - https://kontact.kde.org - - Mustafa Cinasal - muscnsl@gmail.com - - LGPLv3 - library - Library for Grantlee theming support - Grantlee tema desteği için Kütüphane - https://download.kde.org/stable/frameworks/6.10/ktexttemplate-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - --> - - - - - ktexttemplate-kf6 - - qt6-base - qt6-declarative - - - /usr/lib - /usr/share - /usr/share/doc - - - - - ktexttemplate-kf6-devel - Development files for ktexttemplate-kf6 - - ktexttemplate-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/ktexttemplate-kf6/translations.xml b/desktop/kde6/framework/ktexttemplate-kf6/translations.xml deleted file mode 100644 index 05d4295eec..0000000000 --- a/desktop/kde6/framework/ktexttemplate-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - ktexttemplate-kf6 - Library for Grantlee theming support - Grantlee tema desteği için Kütüphane - - diff --git a/desktop/kde6/framework/ktextwidgets-kf6/actions.py b/desktop/kde6/framework/ktextwidgets-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/ktextwidgets-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/ktextwidgets-kf6/pspec.xml b/desktop/kde6/framework/ktextwidgets-kf6/pspec.xml deleted file mode 100755 index 6316678855..0000000000 --- a/desktop/kde6/framework/ktextwidgets-kf6/pspec.xml +++ /dev/null @@ -1,159 +0,0 @@ - - - - - ktextwidgets-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 text editing widgets - ktextwidgets-kf6 provides widgets for displaying and editing text. It supports rich text as well as plain text. - mirrors://kde/stable/frameworks/6.10/ktextwidgets-6.10.0.tar.xz - - qt6-base-devel - qt6-designer-devel - qt6-declarative-devel - qt6-speech-devel - qt6-multimedia-devel - kconfig-kf6-devel - kcompletion-kf6-devel - kcodecs-kf6-devel - kauth-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - sonnet-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - kcolorscheme-kf6-devel - - - - - ktextwidgets-kf6 - - qt6-base - qt6-designer - qt6-multimedia - kconfig-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kcolorscheme-kf6 - kwidgetsaddons-kf6 - ki18n-kf6 - sonnet-kf6 - qt6-speech - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - ktextwidgets-kf6-devel - Development files for ktextwidgets-kf6 - - ktextwidgets-kf6 - qt6-base-devel - ki18n-kf6-devel - sonnet-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kunitconversion-kf6/actions.py b/desktop/kde6/framework/kunitconversion-kf6/actions.py deleted file mode 100644 index 1d0aa86785..0000000000 --- a/desktop/kde6/framework/kunitconversion-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - pisitools.ldflags.add("-Wl,-rpath,/usr/lib") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kunitconversion-kf6/pspec.xml b/desktop/kde6/framework/kunitconversion-kf6/pspec.xml deleted file mode 100644 index 5da0d4906c..0000000000 --- a/desktop/kde6/framework/kunitconversion-kf6/pspec.xml +++ /dev/null @@ -1,133 +0,0 @@ - - - - - kunitconversion-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - KDE unit conversion framework - kunitconversion-kf6 provides functions to convert values in different physical units. - mirrors://kde/stable/frameworks/6.10/kunitconversion-6.10.0.tar.xz - - qt6-base-devel - ki18n-kf6-devel - extra-cmake-modules-kf6 - - - - - kunitconversion-kf6 - - qt6-base - - ki18n-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kunitconversion-kf6-devel - Development files for kunitconversion-kf6 - - qt6-base-devel - - kunitconversion-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kuserfeedback-kf6/actions.py b/desktop/kde6/framework/kuserfeedback-kf6/actions.py deleted file mode 100644 index 7ed1235be8..0000000000 --- a/desktop/kde6/framework/kuserfeedback-kf6/actions.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure("-DENABLE_CONSOLE=OFF \ - -DENABLE_CLI=OFF \ - -DENABLE_DOCS=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() - - # Conflicts with kf5 - pisitools.removeDir("/usr/share/locale") - - pisitools.dodoc("COPYING*", "README*") diff --git a/desktop/kde6/framework/kuserfeedback-kf6/pspec.xml b/desktop/kde6/framework/kuserfeedback-kf6/pspec.xml deleted file mode 100644 index bb5499f27f..0000000000 --- a/desktop/kde6/framework/kuserfeedback-kf6/pspec.xml +++ /dev/null @@ -1,146 +0,0 @@ - - - - - kuserfeedback-kf6 - https://kde.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv3 - library - Framework for collecting user feedback for applications via telemetry and surveys - Framework for collecting user feedback for applications via telemetry and surveys - mirrors://kde/stable/frameworks/6.10/kuserfeedback-6.10.0.tar.xz - - qt6-linguist - qt6-svg-devel - qt6-sql-odbc - qt6-sql-mysql - qt6-sql-sqlite - qt6-base-devel - qt6-charts-devel - qt6-assistant-devel - qt6-sql-postgresql - extra-cmake-modules-kf6 - qt6-declarative-devel - - - - - - kuserfeedback-kf6 - - qt6-svg - qt6-base - qt6-charts - qt6-declarative - - - /usr/bin - /etc - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - - - kuserfeedback-kf6-devel - Development files for kuserfeedback-kf6 - - kuserfeedback-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kuserfeedback-kf6/translations.xml b/desktop/kde6/framework/kuserfeedback-kf6/translations.xml deleted file mode 100644 index 2359dc5d12..0000000000 --- a/desktop/kde6/framework/kuserfeedback-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kuserfeedback - Framework for collecting user feedback for applications via telemetry and surveys - Framework for collecting user feedback for applications via telemetry and surveys - - diff --git a/desktop/kde6/framework/kwallet-kf6/actions.py b/desktop/kde6/framework/kwallet-kf6/actions.py deleted file mode 100755 index c8ff8d542f..0000000000 --- a/desktop/kde6/framework/kwallet-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure("-DBUILD_KWALLET_QUERY=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() - pisitools.remove("/usr/share/dbus-1/services/org.kde.kwalletd5.service") - # pisitools.remove("/usr/share/man/man1/kwallet-query.1") - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kwallet-kf6/pspec.xml b/desktop/kde6/framework/kwallet-kf6/pspec.xml deleted file mode 100755 index fbfa55189d..0000000000 --- a/desktop/kde6/framework/kwallet-kf6/pspec.xml +++ /dev/null @@ -1,174 +0,0 @@ - - - - - kwallet-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - KDE password storage framework - This framework contains two main components: Interface to kwallet-kf6, the safe desktop-wide storage for passwords on KDE workspaces. The kwallet-kf6d used to safely store the passwords on KDE work spaces. - mirrors://kde/stable/frameworks/6.10/kwallet-6.10.0.tar.xz - - libxslt - docbook-xsl - qca2-qt6-devel - qt6-base-devel - qt6-declarative-devel - libgcrypt-devel - gpgme-devel - kauth-kf6-devel - gpgme-qt6-devel - kcodecs-kf6-devel - kconfigwidgets-kf6-devel - kconfig-kf6-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - knotifications-kf6-devel - kservice-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - kcolorscheme-kf6-devel - - - - - kwallet-kf6 - - qca2-qt6 - qt6-base - qt6-declarative - gpgme - libgcrypt - kconfig-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - ki18n-kf6 - knotifications-kf6 - kservice-kf6 - kwidgetsaddons-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kcolorscheme-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/doc - - - - - kwallet-kf6-devel - Development files for kwallet-kf6 - - kwallet-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-25 - 6.2.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kwidgetsaddons-kf6/actions.py b/desktop/kde6/framework/kwidgetsaddons-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kwidgetsaddons-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kwidgetsaddons-kf6/pspec.xml b/desktop/kde6/framework/kwidgetsaddons-kf6/pspec.xml deleted file mode 100755 index fa3cf6b9e5..0000000000 --- a/desktop/kde6/framework/kwidgetsaddons-kf6/pspec.xml +++ /dev/null @@ -1,154 +0,0 @@ - - - - - kwidgetsaddons-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 desktop widgets - KdeWidgetsAddons is a framework contains addon widgets and shared libraries for applications using qt6-Widgets. - mirrors://kde/stable/frameworks/6.10/kwidgetsaddons-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-designer-devel - extra-cmake-modules-kf6 - - - - - kwidgetsaddons-kf6 - - qt6-base - libgcc - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kwidgetsaddons-kf6-devel - Development files for kwidgetsaddons-kf6 - - qt6-base-devel - kwidgetsaddons-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-19 - 6.4.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-25 - 6.2.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-23 - 6.2.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kwindowsystem-kf6/actions.py b/desktop/kde6/framework/kwindowsystem-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kwindowsystem-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kwindowsystem-kf6/pspec.xml b/desktop/kde6/framework/kwindowsystem-kf6/pspec.xml deleted file mode 100755 index badbaa1336..0000000000 --- a/desktop/kde6/framework/kwindowsystem-kf6/pspec.xml +++ /dev/null @@ -1,159 +0,0 @@ - - - - - kwindowsystem-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 window manager access framework - kwindowsystem-kf6 provides information about the state of the window manager and allows asking the window manager to change the using a more high-level interface than the NETWinInfo/NETRootInfo low-level classes. - mirrors://kde/stable/frameworks/6.10/kwindowsystem-6.10.0.tar.xz - - qt6-base-devel - qt6-wayland-devel - qt6-declarative-devel - qt6-linguist - wayland-devel - wayland-client - libX11-devel - libxcb-devel - libXrender-devel - libXfixes-devel - xcb-util-devel - xcb-util-wm-devel - xcb-util-keysyms-devel - wayland-protocols-devel - plasma-wayland-protocols-kf6 - extra-cmake-modules-kf6 - - - - - kwindowsystem-kf6 - - qt6-base - qt6-wayland - qt6-declarative - libX11 - wayland - wayland-client - libxcb - libXfixes - xcb-util-wm - xcb-util-keysyms - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/doc - - - - - kwindowsystem-kf6-devel - Development files for kwindowsystem-kf6 - - qt6-base-devel - libXrender-devel - libXfixes-devel - xcb-util-devel - xcb-util-keysyms-devel - kwindowsystem-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/kxmlgui-kf6/actions.py b/desktop/kde6/framework/kxmlgui-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/kxmlgui-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/kxmlgui-kf6/pspec.xml b/desktop/kde6/framework/kxmlgui-kf6/pspec.xml deleted file mode 100755 index af801656e4..0000000000 --- a/desktop/kde6/framework/kxmlgui-kf6/pspec.xml +++ /dev/null @@ -1,163 +0,0 @@ - - - - - kxmlgui-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - Framework for managing menu and toolbar actions - kxmlgui-kf6 provides a framework for managing menu and toolbar actions in an abstract way. - mirrors://kde/stable/frameworks/6.10/kxmlgui-6.10.0.tar.xz - - qt6-base-devel - qt6-designer-devel - qt6-declarative-devel - attica-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kauth-kf6-devel - kcodecs-kf6-devel - sonnet-kf6-devel - kglobalaccel-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - kitemviews-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - kcolorscheme-kf6-devel - - - - - kxmlgui-kf6 - - qt6-base - qt6-declarative - libgcc - attica-kf6 - kcoreaddons-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kglobalaccel-kf6 - ki18n-kf6 - kguiaddons-kf6 - kiconthemes-kf6 - kitemviews-kf6 - kcolorscheme-kf6 - kwidgetsaddons-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kxmlgui-kf6-devel - Development files for kxmlgui-kf6 - - kxmlgui-kf6 - qt6-base-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/modemmanager-qt-kf6/actions.py b/desktop/kde6/framework/modemmanager-qt-kf6/actions.py deleted file mode 100755 index 92fa812aa3..0000000000 --- a/desktop/kde6/framework/modemmanager-qt-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README", "README.md") diff --git a/desktop/kde6/framework/modemmanager-qt-kf6/pspec.xml b/desktop/kde6/framework/modemmanager-qt-kf6/pspec.xml deleted file mode 100755 index aacc499abc..0000000000 --- a/desktop/kde6/framework/modemmanager-qt-kf6/pspec.xml +++ /dev/null @@ -1,134 +0,0 @@ - - - - - modemmanager-qt-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Qt wrapper for ModemManager DBus API - Qt wrapper for ModemManager DBus API - mirrors://kde/stable/frameworks/6.10/modemmanager-qt-6.10.0.tar.xz - - qt6-base-devel - ModemManager-devel - extra-cmake-modules-kf6 - - - - - modemmanager-qt-kf6 - - qt6-base - libgcc - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - modemmanager-qt-kf6-devel - Development files for modemmanger-qt - - qt6-base-devel - modemmanager-qt-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/networkmanager-qt-kf6/actions.py b/desktop/kde6/framework/networkmanager-qt-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/networkmanager-qt-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/networkmanager-qt-kf6/pspec.xml b/desktop/kde6/framework/networkmanager-qt-kf6/pspec.xml deleted file mode 100755 index fe66aab96e..0000000000 --- a/desktop/kde6/framework/networkmanager-qt-kf6/pspec.xml +++ /dev/null @@ -1,143 +0,0 @@ - - - - - networkmanager-qt-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - A QT wrapper around the NetworkManager libraries - A QT wrapper around the NetworkManager libraries - mirrors://kde/stable/frameworks/6.10/networkmanager-qt-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - NetworkManager-devel - extra-cmake-modules-kf6 - - - - - networkmanager-qt-kf6 - - qt6-base - qt6-declarative - NetworkManager - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - networkmanager-qt-kf6-devel - Development files for networkmanager-qt-kf6 - - qt6-base-devel - networkmanager-qt-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-24 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/oxygen-icons-kf6/actions.py b/desktop/kde6/framework/oxygen-icons-kf6/actions.py deleted file mode 100755 index 38c60cfd73..0000000000 --- a/desktop/kde6/framework/oxygen-icons-kf6/actions.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*", "README*") diff --git a/desktop/kde6/framework/oxygen-icons-kf6/files/128x128.png b/desktop/kde6/framework/oxygen-icons-kf6/files/128x128.png deleted file mode 100644 index 393647f40852f86bafd31d5ef2483608c1ec13a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6090 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 Ql>h($07*qoM6N<$g6m19)c^nh diff --git a/desktop/kde6/framework/oxygen-icons-kf6/files/16x16.png b/desktop/kde6/framework/oxygen-icons-kf6/files/16x16.png deleted file mode 100644 index 534e3eb5432f1d84bd5c30041628e43707cd3fda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 506 zcmVxiiC=!)!O=_>W6I~cVXC+WW3g;%SVGg%3f#+=kbGRB@NcAY`RP;DnkU!uJCfh`2unP?=iyqrc z{TDnzcao>Q8ZZA-;5Zf%hP8USge_6tFjk6$>+&s3<3_|T*F+zIPQ1ea_7?F~IEPs* z7V%VVq1wa<_Td(m3gR-FVON{^y}@lb|Cb)?@+tRf9aD)5=;^>0dA~>GK{l`s3wRi9 zoeh5iV>lMG7*B=b8SKF)jN=6kphv#_e)&%{@E-RRrKM2(hW+7hz*~8!8|Cfv$)D+a wa8{}cPGgOHQ1g+{A0p&W)r@yNP6Y4iFRvk0w${2$MgRZ+07*qoM6N<$g4zJk-v9sr diff --git a/desktop/kde6/framework/oxygen-icons-kf6/files/22x22.png b/desktop/kde6/framework/oxygen-icons-kf6/files/22x22.png deleted file mode 100644 index c424ad1f8cc2554790217790f06ad397f654f2ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 748 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 N002ovPDHLkV1je@9tZ#c diff --git a/desktop/kde6/framework/oxygen-icons-kf6/files/48x48.png b/desktop/kde6/framework/oxygen-icons-kf6/files/48x48.png deleted file mode 100644 index fe6cdadfd1db41f1bccec020a24b6f7e3bb0e1c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1908 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 - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/desktop/kde6/framework/oxygen-icons-kf6/pspec.xml b/desktop/kde6/framework/oxygen-icons-kf6/pspec.xml deleted file mode 100755 index 8abd4d6961..0000000000 --- a/desktop/kde6/framework/oxygen-icons-kf6/pspec.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - oxygen-icons-kf6 - http://www.oxygen-icons.org - - Ertuğrul Erata - ertugrulerata@gmail.com - - LGPL - KDE Oxygen icons - "The Oxygen Icon Theme - https://download.kde.org/stable/oxygen-icons/oxygen-icons-6.1.0.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - - - - - oxygen-icons-kf6 - - /usr/share/icons - /usr/share/doc - - - 16x16.png - 16x16.png - 22x22.png - 22x22.png - 32x32.png - 32x32.png - 48x48.png - 48x48.png - 64x64.png - 64x64.png - 128x128.png - 128x128.png - 256x256.png - 256x256.png - - - - - - 2024-12-14 - 6.1.0 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-23 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-03-07 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/plasma-wayland-protocols-kf6/actions.py b/desktop/kde6/framework/plasma-wayland-protocols-kf6/actions.py deleted file mode 100644 index 1d9e9090f5..0000000000 --- a/desktop/kde6/framework/plasma-wayland-protocols-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING*", "README*") diff --git a/desktop/kde6/framework/plasma-wayland-protocols-kf6/files/a95fc86f.diff b/desktop/kde6/framework/plasma-wayland-protocols-kf6/files/a95fc86f.diff deleted file mode 100644 index a6e8649c1a..0000000000 --- a/desktop/kde6/framework/plasma-wayland-protocols-kf6/files/a95fc86f.diff +++ /dev/null @@ -1,93 +0,0 @@ -diff --git a/src/protocols/kde-output-device-v2.xml b/src/protocols/kde-output-device-v2.xml -index 34b3970a2f34075771411adc5538e875ae67a128..a70d41ac3b418a57477c4a8f665b4c856c2b3009 100644 ---- a/src/protocols/kde-output-device-v2.xml -+++ b/src/protocols/kde-output-device-v2.xml -@@ -11,7 +11,7 @@ - ]]> - - -- -+ - - An output device describes a display device available to the compositor. - output_device is similar to wl_output, but focuses on output -@@ -321,7 +321,28 @@ - - - -- -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ This can be used to provide the colors users assume sRGB applications should have based on the -+ default experience on many modern sRGB screens. -+ -+ -+ - - - -diff --git a/src/protocols/kde-output-management-v2.xml b/src/protocols/kde-output-management-v2.xml -index 312b6613a9c24c8bac5c35b69df79d024c597f14..7154c9031a4c2f4dc1b2d9f7a08604083b37b0c8 100644 ---- a/src/protocols/kde-output-management-v2.xml -+++ b/src/protocols/kde-output-management-v2.xml -@@ -6,11 +6,12 @@ - SPDX-FileCopyrightText: 2012-2013 Collabora, Ltd. - SPDX-FileCopyrightText: 2015 Sebastian Kügler - SPDX-FileCopyrightText: 2021 Méven Car -+ SPDX-FileCopyrightText: 2023 Xaver Hugl - - SPDX-License-Identifier: MIT-CMU - ]]> - -- -+ - - This interface enables clients to set properties of output devices for screen - configuration purposes via the server. To this end output devices are referenced -@@ -62,7 +63,7 @@ - - - -- -+ - - outputconfiguration is a client-specific resource that can be used to ask - the server to apply changes to available output devices. -@@ -260,5 +261,22 @@ - - - -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ This can be used to provide the colors users assume sRGB applications should have based on the -+ default experience on many modern sRGB screens. -+ -+ -+ -+ - - diff --git a/desktop/kde6/framework/plasma-wayland-protocols-kf6/pspec.xml b/desktop/kde6/framework/plasma-wayland-protocols-kf6/pspec.xml deleted file mode 100644 index bbf498772a..0000000000 --- a/desktop/kde6/framework/plasma-wayland-protocols-kf6/pspec.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - plasma-wayland-protocols-kf6 - https://kde.org/plasma-desktop - - PisiLinux Community - admins@pisilinux.org - - LGPLv3 - library - Plasma Specific Protocols for Wayland - Wayland için Plazma Özel Protokoller - https://download.kde.org/stable/plasma-wayland-protocols/plasma-wayland-protocols-1.16.0.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - - - - - - - - plasma-wayland-protocols-kf6 - - - - /usr/lib - /usr/share - /usr/share/doc - - - - - - 2025-01-09 - 1.16.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 1.15.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 1.14.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 1.13.0 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-07-12 - 1.13.0 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-06-09 - 1.13.0 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-25 - 1.13.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-11 - 1.12.0 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 1.12.0 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 1.12.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/plasma-wayland-protocols-kf6/translations.xml b/desktop/kde6/framework/plasma-wayland-protocols-kf6/translations.xml deleted file mode 100644 index 743cb6e154..0000000000 --- a/desktop/kde6/framework/plasma-wayland-protocols-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - plasma-wayland-protocols - Plasma Specific Protocols for Wayland - Wayland için Plazma Özel Protokoller - - diff --git a/desktop/kde6/framework/prison-kf6/actions.py b/desktop/kde6/framework/prison-kf6/actions.py deleted file mode 100755 index 8a7dd2b35a..0000000000 --- a/desktop/kde6/framework/prison-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - #pisitools.dodoc("LICENSE") diff --git a/desktop/kde6/framework/prison-kf6/pspec.xml b/desktop/kde6/framework/prison-kf6/pspec.xml deleted file mode 100755 index b9dc9ff09b..0000000000 --- a/desktop/kde6/framework/prison-kf6/pspec.xml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - prison-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - MIT - library - A barcode API to produce QRCode barcodes and DataMatrix barcode - A barcode API to produce QRCode barcodes and DataMatrix barcode. - mirrors://kde/stable/frameworks/6.10/prison-6.10.0.tar.xz - - libdmtx-devel - qrencode-devel - zxing-cpp-devel - qt6-base-devel - extra-cmake-modules-kf6 - qt6-multimedia-devel - qt6-declarative-devel - - - - - prison-kf6 - - - libdmtx - qrencode - zxing-cpp - qt6-base - qt6-multimedia - qt6-declarative - - - /etc/xdg - /usr/lib - /usr/lib/qt5 - /usr/share/doc - /usr/share/qlogging-categories6/prison.categories - /usr/share/qlogging-categories6/prison.renamecategories - - - prison-kf6-qt5 - - - prison-kf6-qt5 - - - - - prison-kf6-devel - Development files for libepoxy - - prison-kf6 - qt6-multimedia-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - prison-kf6-qt6-devel - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/purpose-kf6/actions.py b/desktop/kde6/framework/purpose-kf6/actions.py deleted file mode 100644 index f174fb574c..0000000000 --- a/desktop/kde6/framework/purpose-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/share/icons") - - pisitools.dodoc("README*") diff --git a/desktop/kde6/framework/purpose-kf6/pspec.xml b/desktop/kde6/framework/purpose-kf6/pspec.xml deleted file mode 100644 index 59beb56203..0000000000 --- a/desktop/kde6/framework/purpose-kf6/pspec.xml +++ /dev/null @@ -1,162 +0,0 @@ - - - - - purpose-kf6 - https://www.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - Framework for providing abstractions to get the developer's purpose-kf6s fulfilled - Framework for providing abstractions to get the developer's purpose-kf6s fulfilled - mirrors://kde/stable/frameworks/6.10/purpose-6.10.0.tar.xz - - intltool - kio-kf6-devel - ki18n-kf6-devel - kauth-kf6-devel - prison-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kirigami-kf6-devel - kcoreaddons-kf6-devel - kdeclarative-kf6-devel - extra-cmake-modules-kf6 - accounts-qml-module - knotifications-kf6-devel - libaccounts-glib-devel - libaccounts-qt6-devel - qt6-base-devel - qt6-declarative-devel - - - - - - purpose-kf6 - - kio-kf6 - ki18n-kf6 - kauth-kf6 - libgcc - kconfig-kf6 - qt6-base - kservice-kf6 - prison-kf6 - kcoreaddons-kf6 - knotifications-kf6 - libaccounts-qt6 - qt6-declarative - - - - /etc/xdg - /usr/lib - /usr/share - /usr/share/doc - - - - - purpose-kf6-devel - Development files for purpose-kf6 - - purpose-kf6 - kcoreaddons-kf6-devel - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-28 - 6.0.0 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/purpose-kf6/translations.xml b/desktop/kde6/framework/purpose-kf6/translations.xml deleted file mode 100644 index 6a0bcfdc02..0000000000 --- a/desktop/kde6/framework/purpose-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - purpose-kf6 - Framework for providing abstractions to get the developer's purpose-kf6s fulfilled - Framework for providing abstractions to get the developer's purpose-kf6s fulfilled - - diff --git a/desktop/kde6/framework/qqc2-desktop-style-kf6/actions.py b/desktop/kde6/framework/qqc2-desktop-style-kf6/actions.py deleted file mode 100755 index dd3d84e185..0000000000 --- a/desktop/kde6/framework/qqc2-desktop-style-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*") diff --git a/desktop/kde6/framework/qqc2-desktop-style-kf6/pspec.xml b/desktop/kde6/framework/qqc2-desktop-style-kf6/pspec.xml deleted file mode 100755 index fcb1f151f1..0000000000 --- a/desktop/kde6/framework/qqc2-desktop-style-kf6/pspec.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - qqc2-desktop-style-kf6 - https://download.kde.org/ - - Mustafa Cinasal - muscnsl@gmail.com - - GPLv2 - library - A style for Qt Quick Controls 2 to make it follow your desktop theme - Qt Quick Controls 2 nin masaüstünüzdeki temayı takip etmesini sağlayan bir stil - https://download.kde.org/stable/frameworks/6.10/qqc2-desktop-style-6.10.0.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kirigami-kf6-devel - kconfig-kf6-devel - kcolorscheme-kf6-devel - libX11-devel - - - - - qqc2-desktop-style-kf6 - - kconfig-kf6 - kirigami-kf6 - qt6-base - qt6-declarative - kiconthemes-kf6 - kconfigwidgets-kf6 - kcolorscheme-kf6 - - - /usr/lib - /usr/share/locale - /usr/share/doc - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/solid-kf6/actions.py b/desktop/kde6/framework/solid-kf6/actions.py deleted file mode 100755 index 0bb7bd1748..0000000000 --- a/desktop/kde6/framework/solid-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/solid-kf6/pspec.xml b/desktop/kde6/framework/solid-kf6/pspec.xml deleted file mode 100755 index 4c6feebe86..0000000000 --- a/desktop/kde6/framework/solid-kf6/pspec.xml +++ /dev/null @@ -1,159 +0,0 @@ - - - - - solid-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 hardware integration framework - solid-kf6 is a device integration framework.It provides a way of querying and interacting with hardware independently of the underlying operating system. - mirrors://kde/stable/frameworks/6.10/solid-6.10.0.tar.xz - - eudev-devel - upower-devel - udisks2-devel - media-player-info - qt6-linguist - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - - - - solid-kf6 - - eudev - - libplist - libutil-linux - libimobiledevice - media-player-info - qt6-base - qt6-declarative - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/doc - - - - - solid-kf6-devel - Development files for solid-kf6 - - qt6-base-devel - solid-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-19 - 6.1.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/sonnet-kf6/actions.py b/desktop/kde6/framework/sonnet-kf6/actions.py deleted file mode 100755 index 1449f347bd..0000000000 --- a/desktop/kde6/framework/sonnet-kf6/actions.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/framework/sonnet-kf6/pspec.xml b/desktop/kde6/framework/sonnet-kf6/pspec.xml deleted file mode 100755 index 82de2f60a3..0000000000 --- a/desktop/kde6/framework/sonnet-kf6/pspec.xml +++ /dev/null @@ -1,141 +0,0 @@ - - - - - sonnet-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - KDE spell schecking library - This framework contains two main components: Interface to kwallet-kf6, the safe desktop-wide storage for passwords on KDE workspaces. The kwallet-kf6d used to safely store the passwords on KDE work spaces. - mirrors://kde/stable/frameworks/6.10/sonnet-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-designer-devel - hunspell-devel - aspell-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - - - - sonnet-kf6 - - qt6-base - qt6-declarative - - aspell - hunspell - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/doc - - - - - sonnet-kf6-devel - Development files for sonnet-kf6 - - qt6-base-devel - sonnet-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/syntax-highlighting-kf6/actions.py b/desktop/kde6/framework/syntax-highlighting-kf6/actions.py deleted file mode 100755 index e25b372912..0000000000 --- a/desktop/kde6/framework/syntax-highlighting-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -# if pisi can't find source directory, see /var/pisi/syntax-highlighting-kf6/work/ and: -# WorkDir="syntax-highlighting-kf6-"+ get.srcVERSION() +"/sub_project_dir/" - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") - diff --git a/desktop/kde6/framework/syntax-highlighting-kf6/pspec.xml b/desktop/kde6/framework/syntax-highlighting-kf6/pspec.xml deleted file mode 100755 index 26f670c339..0000000000 --- a/desktop/kde6/framework/syntax-highlighting-kf6/pspec.xml +++ /dev/null @@ -1,131 +0,0 @@ - - - syntax-highlighting-kf6 - https://community.kde.org/Frameworks - - Stefan Gronewold - groni@pisilinux.org - - GPL2 - Syntax highlighting engine for structured text and code - Syntax highlighting engine for structured text and code - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-linguist - perl - glibc-devel - - mirrors://kde/stable/frameworks/6.10/syntax-highlighting-6.10.0.tar.xz - - - syntax-highlighting-kf6 - Syntax highlighting engine for structured text and code - - qt6-base - qt6-declarative - libgcc - - - /etc/xdg - /usr/bin - /usr/lib - /usr/lib/qt5 - /usr/share/doc - /usr/share/qlogging-categories6 - /usr/share/locale/ - - - - - syntax-highlighting-kf6-devel - Development files for syntax-highlighting-kf6 - - syntax-highlighting-kf6 - qt6-base-devel - - - /usr/include - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/framework/threadweaver-kf6/actions.py b/desktop/kde6/framework/threadweaver-kf6/actions.py deleted file mode 100755 index b2115b8187..0000000000 --- a/desktop/kde6/framework/threadweaver-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md","COPYING.LIB") diff --git a/desktop/kde6/framework/threadweaver-kf6/pspec.xml b/desktop/kde6/framework/threadweaver-kf6/pspec.xml deleted file mode 100755 index 95fdb6bf55..0000000000 --- a/desktop/kde6/framework/threadweaver-kf6/pspec.xml +++ /dev/null @@ -1,129 +0,0 @@ - - - - - threadweaver-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Multi-threaded programming framework for KDE - threadweaver-kf6 is a helper for multithreaded programming. It uses a job-based interface to queue tasks and execute them in an efficient way. - mirrors://kde/stable/frameworks/6.10/threadweaver-6.10.0.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - - - - - threadweaver-kf6 - - qt6-base - libgcc - - - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - threadweaver-kf6-devel - Development files for threadweaver-kf6 - - qt6-base-devel - threadweaver-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/bluedevil-kf6/actions.py b/desktop/kde6/plasma/bluedevil-kf6/actions.py deleted file mode 100755 index 5a9c0633a7..0000000000 --- a/desktop/kde6/plasma/bluedevil-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/plasma/bluedevil-kf6/pspec.xml b/desktop/kde6/plasma/bluedevil-kf6/pspec.xml deleted file mode 100755 index 9be67ece28..0000000000 --- a/desktop/kde6/plasma/bluedevil-kf6/pspec.xml +++ /dev/null @@ -1,210 +0,0 @@ - - - - - bluedevil-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - KDE 5 Bluetooth Stack - Integrate the Bluetooth technology within KDE workspace and applications - https://download.kde.org/stable/plasma/6.2.5/bluedevil-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - shared-mime-info - libplasma-kf6-devel - bluez-qt-kf6-devel - kded-kf6-devel - ksvg-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kiconthemes-kf6-devel - kconfigwidgets-kf6-devel - kwindowsystem-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - kirigami-kf6-devel - bluez-qt-kf6-devel - kdeclarative-kf6-devel - extra-cmake-modules-kf6 - fwupd-devel - kcmutils-kf6-devel - purpose-kf6-devel - kdoctools-kf6-devel - kservice-kf6-devel - kjobwidgets-kf6-devel - - - - - bluedevil-kf6 - - kdoctools-kf6 - qt6-base - libgcc - ksvg-kf6 - bluez-qt-kf6 - kio-kf6 - ki18n-kf6 - kconfig-kf6 - kdeclarative-kf6 - qt6-declarative - kcmutils-kf6 - purpose-kf6 - kservice-kf6 - kjobwidgets-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - knotifications-kf6 - kwindowsystem-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/breeze-grub-kf6/actions.py b/desktop/kde6/plasma/breeze-grub-kf6/actions.py deleted file mode 100755 index 1358c31427..0000000000 --- a/desktop/kde6/plasma/breeze-grub-kf6/actions.py +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import pisitools - -def install(): - pisitools.insinto("/boot/grub2/themes/breeze-kf6", "breeze/*") - - #pisitools.dodoc("COPYING") diff --git a/desktop/kde6/plasma/breeze-grub-kf6/pspec.xml b/desktop/kde6/plasma/breeze-grub-kf6/pspec.xml deleted file mode 100755 index 13de5b3454..0000000000 --- a/desktop/kde6/plasma/breeze-grub-kf6/pspec.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - breeze-grub-kf6 - https://www.kde.org - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - breeze-kf6 theme for GRUB. - breeze-kf6 theme for GRUB. - mirrors://kde/stable/plasma/6.2.5/breeze-grub-6.2.5.tar.xz - - - - breeze-grub-kf6 - breeze-kf6 theme for GRUB. - - grub2 - noto-fonts - - - /boot/grub2/themes - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/breeze-gtk-kf6/actions.py b/desktop/kde6/plasma/breeze-gtk-kf6/actions.py deleted file mode 100755 index 8f11babfb4..0000000000 --- a/desktop/kde6/plasma/breeze-gtk-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*") diff --git a/desktop/kde6/plasma/breeze-gtk-kf6/pspec.xml b/desktop/kde6/plasma/breeze-gtk-kf6/pspec.xml deleted file mode 100755 index 9175e76b09..0000000000 --- a/desktop/kde6/plasma/breeze-gtk-kf6/pspec.xml +++ /dev/null @@ -1,174 +0,0 @@ - - - - - breeze-gtk-kf6 - https://quickgit.kde.org/?p=breeze-gtk-kf6.git - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2+ - app:gui - breeze-kf6 widget theme for GTK 2 and 3 - breeze-kf6 widget theme for GTK 2 and 3 - mirrors://kde/stable/plasma/6.2.5/breeze-gtk-6.2.5.tar.xz - - sassc - cairo-devel - gdk-pixbuf-devel - python-cairo-devel - python3-cairo-devel - extra-cmake-modules-kf6 - libsass-devel - gtk2-engines-murrine - python3-cairo-devel - breeze-style-kf6 - qt6-base-devel - - - - - breeze-gtk-kf6 - breeze-kf6 widget theme for GTK 2 and 3 - - - qt6-base - - - /usr/share/kconf_update - /usr/share/themes - /usr/share/doc - /usr/lib/kconf_update_bin - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/breeze-kf6/actions.py b/desktop/kde6/plasma/breeze-kf6/actions.py deleted file mode 100755 index 25cef09d00..0000000000 --- a/desktop/kde6/plasma/breeze-kf6/actions.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import get -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.23.0|5.23.1|g' CMakeLists.txt") - kde6.configure("-DBUILD_QT5=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() - - #set pisi-crocus-ancyrensis photos as default wallpapers - #pisitools.dosed("%s/usr/share/plasma/look-and-feel/org.kde.breeze-kf6dark.desktop/contents/defaults" % get.installDIR(), "Next", "pisi-crocus-ancyrensis") - #pisitools.dosed("%s/usr/share/plasma/look-and-feel/org.kde.breeze-kf6twilight.desktop/contents/defaults" % get.installDIR(), "Next", "pisi-crocus-ancyrensis") diff --git a/desktop/kde6/plasma/breeze-kf6/pspec.xml b/desktop/kde6/plasma/breeze-kf6/pspec.xml deleted file mode 100755 index 09d3418a47..0000000000 --- a/desktop/kde6/plasma/breeze-kf6/pspec.xml +++ /dev/null @@ -1,349 +0,0 @@ - - - - - breeze-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 Plasma artwork - Artwork, styles and assets for the breeze-kf6 visual style for the Plasma Desktop - mirrors://kde/stable/plasma/6.2.5/breeze-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - libxcb-devel - frameworkintegration-kf6-devel - kdecorations-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kcmutils-kf6-devel - kwindowsystem-kf6-devel - kconfig-kf6-devel - kpackage-kf6-devel - kcolorscheme-kf6-devel - kwayland-kf6-devel - libplasma-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - breeze-icons-kf6 - fftw3-devel - kiconthemes-kf6-devel - kguiaddons-kf6-devel - kirigami-kf6-devel - - - - - - - - breeze-style-kf6 - - qt6-base - qt6-declarative - libgcc - kconfig-kf6 - kirigami-kf6 - kguiaddons-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kcolorscheme-kf6 - breeze-cursors-kf6 - breeze-light-kf6 - breeze-wallpapers-kf6 - - libxcb - frameworkintegration-kf6 - kcmutils-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kwindowsystem-kf6 - kwayland-kf6 - kiconthemes-kf6 - - breeze-icons-kf6 - kdecorations-kf6 - - - /usr/bin - /usr/lib/qt6 - /usr/lib/cmake/Breeze/BreezeConfigVersion.cmake - /usr/lib/cmake/Breeze/BreezeConfig.cmake - /usr/share/color-schemes - /usr/share/doc - /usr/share/icons/hicolor/scalable/apps/breeze-settings.svgz - /usr/share/kconf_update - /usr/share/applications - /usr/share/metainfo/org.kde.breezedark.desktop.appdata.xml - /usr/share/metainfo/org.kde.breezetwilight.desktop.appdata.xml - /usr/share/kservice-kf6s5 - /usr/share/kstyle - /usr/share/locale - /usr/share/plasma - /usr/share/QtCurve - - - breeze-style-data - - - breeze-style-data - - - - - - - - - breeze-cursors-kf6 - - - - - /usr/share/icons/breeze_cursors - /usr/share/icons/breeze_Snow - - - - - - - - - - - breeze-light-kf6 - - - - - /usr/share/icons/Breeze_Light - - - - - - - - - - - - breeze-wallpapers-kf6 - - - - - /usr/share/wallpapers/Next - - - - - - - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-21 - 6.0.4 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release. - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/breeze-plymouth-kf6/actions.py b/desktop/kde6/plasma/breeze-plymouth-kf6/actions.py deleted file mode 100755 index d9d34b4ae2..0000000000 --- a/desktop/kde6/plasma/breeze-plymouth-kf6/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - #pisitools.dosed("breeze-kf6/breeze-kf6.script", "kde.logo.png", "pisi.logo.png") - #pisitools.dosed("breeze-kf6/breeze-kf6.script", "Plasma 5.6", "PisiLinux") - pisitools.dosed("breeze-text/breeze-text.plymouth.cmake", "Plasma @PROJECT_VERSION@", "PisiLinux") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/plasma/breeze-plymouth-kf6/files/pisi.16bit.png b/desktop/kde6/plasma/breeze-plymouth-kf6/files/pisi.16bit.png deleted file mode 100755 index bfa6f26cd490c2127312cf4f988691e3a0515929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8380 zcma)?Wl$S$w8ldUf2=@pTA)z0xVsh)?oyz5DDLhp?p~ZiOK{f|DeeS!DDE!BA3*M&;HwxB;IFw0)wwzrFC639H6cqCe9Wh4-XGkD|;IkGZRM( zRtIOx%wyp$+ zaw2KsQoIlT>NXt*2^vpbd@t5d&>G!4EHw1iV9YrZo%yCk=Wn!nZa$gI=_?eqA1iGk zsdcqAUoXAhig+K&z8OLIu3Y3?x9nu;=w7bpv9B73cgRVZ?{48h$=1)>zP^iPlLV7& zzC<^U=b{PxfQSeEC-DCp&>e1Dt)oiUhY~rmC+CYM=8M|;@&s#;MZ)B)q0c=k#QC5t z> zo~Ag{5A#_aO}t>S^H811WzZa&s_XPI*goK?EFrQO{EDd6v%ijy5)=ThB5Bmxw0WLY zPB%0U)-X-hFby8M5nZtOpcv4WjJ>#^rOiX@=@Jlq=QvoVFOY{D2)EE?Eve!t9G1^> z_N2S&;b~}~7a&nqC*~}(G~}1oo%UMm#QSK<@U)Uy4qJ{YCNfsfQ%pBpf5z^e$Cs<2 zcf1@W=m*!zmk+bnb2e*2trO1NHfZQ=GVvb#9Fi@t&Q!KE)ok(Mp3&I~eGBhB@jsh!;V^~{hOTl&*5rBXL_&5gkY%(c$n&@8pQBM^t!$kA4d3{u zbP4Ir;RKA_@;a`@;lU+NrX#1A9S<2#6CDCAE{90RkH{s$L>Pp)l~n3Q;ruLMB&|N; z+0!1Lh4nY}Pc&!AUIC4&xVIDL^xtCYsnJ8Xe13}}hJ5mY-!QfqcQg8xL;1D+R&>H( z1Vf-knBKVSO;fcG5*ftDV54AJ?b8Ceg>}NPCDT!si254oq=5kk0-=%F)uKau;I4TY ztb~`Q$H-OMJy?dvH2tS*QbnaG12J<&!!v?z{ZW&*j%GLRt!-j^JwBPQ|Cbld(%%J2 z&dzh*R~|=Ayg6u&&>v3|M}>aVz4zx@HqHPEYbR9OV+#2~Iv-sRc^ivu?KN(vi4p=b z57#>}NIgbfT%-%Ko3-z)4z?so^^Mogo!nVT?7A2z{5K#OA}hr7A=2w|z*q< zbFHZb^oRl^%p52o^|N0lsV?sYEX^`N(Byu!_PcE<#H@9!^@F2fpxCU;&CE;UTKTev z?J}y=ip$#Ka-T_$b9N@9B6rRoQvXr@+;7n*-uY>Y*~ofbE0%V6eqB*kcM(ROpzJT3 zZfFXP7;fQYvW(SiGD%EgQ*^D#=RmkDQj27)M)l1#xyc}DLsnxRIdYcB_Uk?4dhUo) z+0!#mV-inBM_lAmr zD3wXr3;NCj;ljmy)Nf(5Gn0(D?-?rCfnh&uD1qR%aehox5`*J6U(xCCX)b#5%9 znXz`<)zjJ~y!?n!VY>-#A%lc3O!T%GeLWeaO?0}a!0ad-ER`rYYL9i%w}8f{;-aQT zS>1-hTURv9eB|BD&)msjh8q;z3(WrmoVU|z3&SXPdwofbSD8)c=Az>Ls4W&X`suC& z+hml*eiy^P`JP;aByNATvs>{3O4MP(rFjfqblI+&4-2Mtg&LLLaSv$j@OHAT4 zJu0qFhJ=YV93d*>jb#BqO_XKX%-;{I2RHJN18*0D;ox_5eF%A!)u{=?a zc?2GXN_RbGw$YCAhv+o$^}j?p!``|F>^NJsagFjF=md*9j69@o zAN0$8RVggh^M#&S&^Zl)r5l!vav8uy@7cFIA3Gjo&KZ~S#Pl`O zZm)qe;cLshzJ}4OejPM~tmsHx#RSN|e2qUz11rr(Qgs?`R*+lR7&^|uyv8=lY^t8O zhkK=bi1~WdE1K#0w^<@6nsok~EK-)J#M)kMl+$2u)}xwPR_I%@=49*`+!$PC$t;@; z&F$2;b|@Hxc`M-E)ps3J z3#?Rha$fPpNd&pQqb7Q4U!c^{nP;f=czz|Q^g_u{15+GAv?0jpYg~| zE;*T%DsEf8%N27gCP<2>FBEabt4BQ1S=3x!+<;F{i$AsTkE4@d&#ilWM5o~fqsIWZ z2DgA->D+P&g&8`rXRX)! zakTLs?G^)CvrD2sX59S(SYJ8+VO-FF0%xzJZ^uLH&?3!`1?IoLcBjlB3Utm#Yo{X@ z%9zo&&sJ-<+6sjP*!orVm2Y7`RdEepno?J;%Dt2wyLkq}7+=`AFk!bE;|Bj$zwz15 zBN>=*B>r-PwbXPJ0VA%|iE&rObnRi>KPGTYzS4S_wndi$H_J9@qqv;b`9!chB zp4!#-T$x9xKV9e6G}6^Qb>G*#Ps?x_BOJBIyl7nRwS>1!AlCPnn$KytAG@nT<3E*y zcp5X|#&t23${fQtK$a42W?3p+S(z)Tfg5fuoMltkmy4zAp^Nu%8{Z)D4v?)~g;Lm| zoj-l(%J6e5iMo)z7E}H%2j+!PnoD$#6CiQRaN8yZE-w5Y8eyofF^?r>PxX!~$GJKX zRI$f!(ksYLKy+0HQImH732VCmMYSlc5&00yqx{N}*Tp_}1FB3MRQyL3%9rC}h7(lv z$Mj#=yoR3KZ($H7gb{hZLY|v~IrsHF`LD>zO?z3pq%GEL&xbljsyEAp)h|&fs@Za> zcbwOQcd?bi7E|x%wp6IlPREMhM&9F&p3H@co*}R9`g}g`EA*<41lw`MJU>*m8WkJO zKh(0ysE1)PzQivzlR_}o%sd}tXhBmxo-s;PdVohHrd^*ly4*V<!xX07tB<;D14X#Hbw%euAa_1 zw3$TyZY}s+7Ntgs$xQOcEpQ{~_ASAHuD3{2MO0^p@GHo^a5YD_XIw!N$dn=5p=ISy zB}TSy6}KJM5m8XV#jhL;#A^#lyw&m-kEO}`7#gHfEeX5|Iy&U!2RUlYmJ(GfkNvX; z-uzrQ-$fBMp`P?eAlqwN)Jsuss?-U%WemrAAPc8?N`1O+`b`we&uwwJ)>kul_n~n6r!uuT`K?^)T zubQL;oUx3GH9`tPxj5({!F50h= z+1ahANP5pbLB>-O53Oyjq(JREF-qUUiinnMV#1Mzk#8!2sI&2OVqIRzeHJ#D z{EZyffp}qq6?O+JRyL>^=s~eMrwas}pegQJx}C`+`L_-U!}mQ=%|8ejO}|wWa`i`n z1`qLe;u^-^&ffH)w_S;j-)RELsNkY^;ZC^Z1OBBC&W_vA2^)cQUKC zq_`waPqQ0`{1Meo+_B+=k^_ep2s^4hMGG5PW51`cWBj>pmt)Zc9S!Rzr>xC1P)^h3 zg-~kRnS6fSgb4>|{40@K-XT7J>)u<|l)OfrM5c@a&qjO1Pp#f&Z|~e-Aw4%Qdsal1 z-ls}0;lp@p1sv)ms+BgU{nRp)Yza&n(URwBfvb=IM07arH_oaPatujEY$|ujiKY!VIUY=R>e7f223LScOBIH+R&hee$R<+{@GHSpg`BsEd9#V`z@`Chn z*1p%%tr5R%>T3X29FX!uAj7elmL1Vygg^?rM^D zN_Yvr@_w*Zj0tu`t?Yb}BZQwB40i0{7Xln_Tm3K}rO6IeWV8*zRlhJ|J+s^7&C`~pM%^Hzj zvV~JaOh>|wkzs4t5uWmeA{A=H@@Ek3{~Rj7AWxB`FS$PE>^sfrdZrdllBUyn!3;_X zwF<+v8V%Vs?S>aiBHELzWEH3Iv)g&@z155}Z0KLr84-k?$pD#0;g`|F(KSSM9Jn3Z zC{ZMchD&}^G-bn08Ub!{R1CZ2qd!erzM@GfDCClPFLH%^XzWzqb=hD$Z@_sq_ro3< zu~a-$St$AaZph}|?Dat=rT}_79eS2PXOV{fjIna3MFZjMJ;8_0IK{o=SP5zF@}#Q- z&0j2O_TD^uYc8j(&UF zUfcZ-bygzU^V+;e5r?Brx-UoQ2=nWDxUE0p0hV8JPg(@(u}Kq1F4_g(+mCL4ns_tG zsl`TEaR|c}(I+u7piX1``*w%-#J`4N;9Sgm!iTw_w&3X0+0#{9#fVG(S4Vh@Hk_qf z-CNmk!3D29NHsEJ8+rN@W)j8-M{^0Rmf?s;<@6&b?PTVn=BN3^*4(qXJ7btmHJ8es z2Dz2q+Rr~`P4~o^66sq-T6p{-b^`kn43p>gL@}zTj8rExJF9LOzSQ3&L^50Bqk-;Ftm1}!o|VRTA-*oFL_-9tvY6{llh2N>(R z?7>%h5DCo{{v_{W@1NTq%=qswgmVOf{~y+n@5G#|&80(BCxzn~Z3L z{$$jaa^9$cr>)DIHh%#?O$rLv|8jUNr_-xD{xOAim?VC=o8jv2i z$*iJz($z8rnU3(IpvAGZ;Dfzvnq@@zFrvpp8`b^=ggMR=fR zcEy3O;8-+uLhskaDB;FodV>Qm#Q0M>&*V`pleeHe9r1pR``IsR#q1G43;{o$IWzDg zx_wbeBkQNDr&Xf>gb#*pJe`M3!P~8;S>d>+>r+W8avl23UDnIbC|aR+Ax$4@@uhFV zPM1GtV%~nDV^G$aGI<@4l29RJm4w+#NJ8VTSP?`bZ_a5EQ^keJuBoCo@v8qTaW9EPA0*u{p*7qs?r zF3j^^JVGSz<5Ai;Mx^EW1cTF*KDjGtlgpoe@XG>Z+}9+Z%V7lTE|M7oP<#yYAaH5; zB9Nt#sUTfpXhprD>Kfc`ovt|dSJB{>$bNuor2At+6C1gd1I{7wdp(>+Ifv#Bl=G#v z0mHpio%zlo4APvFk>(|>sh_52dejB=7qxgBY3HX(&eb;BSA^RCPGciT?S8N(bMmCd zEB(29!7a;kth+~FytgDeyIfjlRSU6p^bd&vY*E@rn(JRx6LjdqjMX(w3mpSpcOE6O z70iq}H~X5zAGCIwnS5d7gKjil_@H+Ba>lqRYe`z%&}_AGh*s+@r1eMVHi+)d6S)qWs-eJ%8^f`H>3&}w)`Td`2h<(`~f!f{B~ z6;Iy`BDBC8OGN%|P~4qp_1OI@zd?2;HY0-x2DYk3w%V_b3y09CZGZ?pxqdiPi(q@F zwc(&*0Wh47=9Elb5MfEf_!vP=k`=;iVW6#T$V0pUuE$v z^d?ynQAIgkptcR8;i6FAu7?$R&y#X@*36eVsQI|PNr#aZro4SUxIC6YnZGaW^y}NG z`H^>9wOFr*&JB>2AGQyvpedK5mR0)5$GIma&UwRwk`YLm-ak2JeRqz7ZX_YgyCFUw z;s00yP|t@+Z_R8y4PTWlGCGg?;s8wc!q+Ys;A*>r>nE4= zPP)jjzwtZ|00wH&_o$ntfb6%x#bn@;>rwdGFFoV|^BF&Zg?Tah)oB|?qp4!y164t7 zb@}x@E+FK6#6+B}Qc#8F!9>C*))O&`muaAO&+rqnaIPOxP-sL7$`-~D=|S9?)e{a#T0Y+G6CI3p(4XAQR@6D3uq$*0?)wimv&Q;gbz?H80H+xiUgeXL!w&53# zg#H>TCSpV{7(wjr2Y)J}0LkwJXz@;TO?8F92Yo(0;aY`q;kGe_Jf(Gnmj6@RwPWRj zLhl^hp)IVTsh4HQw{^jLnnN&kl)2u0LCqJy*OCX|)&+&RZG{>bWNV$ny`sb!;OXn) z{b+Al92Cb0l+NIcsFraxYLofy`Up_~o10;_5-?H)6vv#ZDvi}8O?nRnVuGSM_pT2% z=2*b=-}C_c8IuiE$kC)o)UNZih z$AzyOYMN{ud%Xp)vrFOHTFS*r( zG4%;}+66=lY2R|`4|S2_#j#v+Rw}Mpl71D2Gbjd_(qv#agCP|pmODZ9k3y|9sS{rJ z;xF|GbcM$UfTm0w4lRJJ7EIp&TubdJ1%R6EKf=qbl#P>+?L~_NE0x_6#$1mL2-*LF z!rKzR*{}I+)j5X%0o`OCbmxenM{vscFJj$FP}0PP2Pfe6>kL0CpJ1Z=9}P`_iE;kG zk?U7ZI~&*D=^P@o-GpBJMnMN&3`H;_%)`Mdz4449Ct8u4nSpR};*O*12eUMrmQ zG!M?IJM+r&OsL$}O6T<&_d-Y6XT{S$AI!|rNEBMal>gQ+#cwj5)NehUk3hX7vnpF= zWs1y-(-2G3K|0qm^HVT&HAev9rzmu8h>9)EGwDA6#d=2FDY06U?D!SjqwU)`Ys8B@ znzp9iDJrIf%{7dojRB`zFi?kFXW1f)`!_H16MTTsi+vJ6y#K4bclvv=ON4b?nMMl9 zK2xt9z}#qo856fhS7-rquVutn^(PH|VG}@2&3|2qwfXn3+l=E>-&JpzvEKPwn40ls znXqkm-U}#kSOX%HE0U(7;di|dWyG7}(@s|Ez9%VR?_QvIvn`7Otap0Sl$Mh0v`L|n z65E;UTSE$Sjm$wiF3g+1deTcz)z3v*o#IYQ%>Pn_ea5K_LnmlMAg6L>5(MFEeeJs7tZ>hV#aYGw|4Vta(GYaj**5t{78J78JHbM+# zu8sj`1N66`WxBF81DL0 zxJh#T&+XfiC8C@;0>GYR^GPxq;OS@yG*xwmE}Ks6lnW=X{^;fBVY!9$9Al^jGB$>! z7ia^Nfit`F0sV)_lR`6f_F%gdQX6Ma4{$>>+_X0x`{K|a1GJbx!W-#a!vN~D^NW~w zlin~iOfJ$A@l^g?cu*jt#9RMYyG$yM$ z+Zs@AxYY!D519+LweiS|7^J4wKfE|JMAD^OgO&(9jaw)i#^_URb8k&C7jl!D3jp%K@ozgE%VITW8;B7sJwXd}xo*CI9>VX1Iv0dqry!JT!~-edd) z6(~+?^AZ=s;V{na_-(Gzho@gQyHW|ZQXObvMmk5UVq&(Il0$1+@ft+@ z9?3C$7q391V;0{hsaCbR@u@sr@;MvYB_wI2eFK>{0zORSrp}>hCh_td)g@o~!{{dN}PnG}x diff --git a/desktop/kde6/plasma/breeze-plymouth-kf6/files/pisi.logo.png b/desktop/kde6/plasma/breeze-plymouth-kf6/files/pisi.logo.png deleted file mode 100755 index 398e3012df2fe0e7fe793243f7728574bde5939b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6078 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 Eg0IA_4gdfE diff --git a/desktop/kde6/plasma/breeze-plymouth-kf6/pspec.xml b/desktop/kde6/plasma/breeze-plymouth-kf6/pspec.xml deleted file mode 100755 index 52b22fba11..0000000000 --- a/desktop/kde6/plasma/breeze-plymouth-kf6/pspec.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - breeze-plymouth-kf6 - https://www.kde.org - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - breeze-kf6 theme for Plymouth. - breeze-kf6 theme for Plymouth. - mirrors://kde/stable/plasma/6.2.5/breeze-plymouth-6.2.5.tar.xz - - extra-cmake-modules-kf6 - plymouth-devel - - - - - breeze-plymouth-kf6 - breeze-kf6 theme for Plymouth. - - plymouth - grub2 - plymouth-core-libs - plymouth-theme-spinner - plymouth-graphics-libs - plymouth-plugin-script - - - /usr/lib - /usr/share - /usr/share/doc - - - pisi.logo.png - pisi.16bit.png - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/component.xml b/desktop/kde6/plasma/component.xml deleted file mode 100644 index 7e48cbd59a..0000000000 --- a/desktop/kde6/plasma/component.xml +++ /dev/null @@ -1,3 +0,0 @@ - - desktop.kde6.plasma - diff --git a/desktop/kde6/plasma/discover-kf6/actions.py b/desktop/kde6/plasma/discover-kf6/actions.py deleted file mode 100755 index 86143fef21..0000000000 --- a/desktop/kde6/plasma/discover-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - pisitools.dosym("/usr/lib/plasma-discover-kf6/libdiscover-kf6Notifiers.so", "usr/lib/libdiscover-kf6Notifiers.so") - pisitools.dosym("/usr/lib/plasma-discover-kf6/libdiscover-kf6Common.so", "usr/lib/libdiscover-kf6Common.so") diff --git a/desktop/kde6/plasma/discover-kf6/files/appstream-1.0.patch b/desktop/kde6/plasma/discover-kf6/files/appstream-1.0.patch deleted file mode 100644 index f73e23acf9..0000000000 --- a/desktop/kde6/plasma/discover-kf6/files/appstream-1.0.patch +++ /dev/null @@ -1,599 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 31460a6d5..89cee3182 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -31,7 +31,7 @@ find_package(KF5 ${KF5_MIN_VERSION} REQUIRED CoreAddons Config Crash DBusAddons - find_package(KF5Kirigami2 2.7.0) - - find_package(packagekitqt5 1.0.1 CONFIG) --find_package(AppStreamQt 0.15.3 CONFIG REQUIRED) -+find_package(AppStreamQt5 1.0 CONFIG REQUIRED) - find_package(KF5Attica 5.23 CONFIG) - find_package(KF5NewStuff 5.53 CONFIG) - -@@ -85,7 +85,7 @@ set_package_properties(packagekitqt5 PROPERTIES - URL "https://www.freedesktop.org/software/PackageKit/" - PURPOSE "Required to build the PackageKit backend" - TYPE OPTIONAL) --set_package_properties(AppStreamQt PROPERTIES -+set_package_properties(AppStreamQt5 PROPERTIES - DESCRIPTION "Library that lists Appstream resources" - URL "https://www.freedesktop.org" - PURPOSE "Required to build the PackageKit, Flatpak and Snap backends" -diff --git a/libdiscover/appstream/AppStreamUtils.cpp b/libdiscover/appstream/AppStreamUtils.cpp -index 94f030c9d..c2080c17a 100644 ---- a/libdiscover/appstream/AppStreamUtils.cpp -+++ b/libdiscover/appstream/AppStreamUtils.cpp -@@ -7,11 +7,11 @@ - #include "AppStreamUtils.h" - - #include "utils.h" --#include --#include --#include --#include --#include -+#include -+#include -+#include -+#include -+#include - #include - #include - #include -@@ -35,10 +35,20 @@ QUrl AppStreamUtils::imageOfKind(const QList &images, AppStrea - - QString AppStreamUtils::changelogToHtml(const AppStream::Component &appdata) - { -- if (appdata.releases().isEmpty()) -+#if ASQ_CHECK_VERSION(1, 0, 0) -+ const auto releases = appdata.releasesPlain(); -+#else -+ const auto releases = appdata.releases(); -+#endif -+ if (releases.isEmpty()) { - return {}; -+ } - -- const auto release = appdata.releases().constFirst(); -+#if ASQ_CHECK_VERSION(1, 0, 0) -+ const auto release = releases.indexSafe(0).value(); -+#else -+ const auto release = releases.constFirst(); -+#endif - if (release.description().isEmpty()) - return {}; - -@@ -49,7 +59,7 @@ QString AppStreamUtils::changelogToHtml(const AppStream::Component &appdata) - - Screenshots AppStreamUtils::fetchScreenshots(const AppStream::Component &appdata) - { -- const auto appdataScreenshots = appdata.screenshots(); -+ const auto appdataScreenshots = appdata.screenshotsAll(); - Screenshots ret; - ret.reserve(appdataScreenshots.size()); - for (const AppStream::Screenshot &s : appdataScreenshots) { -@@ -131,10 +141,10 @@ QString AppStreamUtils::versionString(const QString &version, const AppStream::C - if (version.isEmpty()) { - return {}; - } else { -- if (appdata.releases().isEmpty()) -+ if (appdata.releasesPlain().isEmpty()) - return version; - -- auto release = appdata.releases().constFirst(); -+ auto release = appdata.releasesPlain().indexSafe(0).value(); - if (release.timestamp().isValid() && version.startsWith(release.version())) { - QLocale l; - return i18n("%1, released on %2", version, l.toString(release.timestamp().date(), QLocale::ShortFormat)); -@@ -256,7 +266,7 @@ QList AppStreamUtils::componentsByCategories(AppStream::Po - { - QList ret; - for (const auto &categoryName : cat->involvedCategories()) { -- ret += pool->componentsByCategories({categoryName}); -+ ret += pool->componentsByCategories({categoryName}).toList(); - } - kRemoveDuplicates(ret, kind); - return ret; -diff --git a/libdiscover/appstream/AppStreamUtils.h b/libdiscover/appstream/AppStreamUtils.h -index 383e55aa8..906bd327a 100644 ---- a/libdiscover/appstream/AppStreamUtils.h -+++ b/libdiscover/appstream/AppStreamUtils.h -@@ -6,9 +6,9 @@ - - #pragma once - --#include --#include --#include -+#include -+#include -+#include - #include - #include - #include -diff --git a/libdiscover/backends/CMakeLists.txt b/libdiscover/backends/CMakeLists.txt -index bd3a03256..c2e0ec12d 100644 ---- a/libdiscover/backends/CMakeLists.txt -+++ b/libdiscover/backends/CMakeLists.txt -@@ -8,11 +8,11 @@ function(add_unit_test name) - Qt::Test Qt::Core ${EXTRA_LIBS}) - endfunction() - --if(KF5Attica_FOUND AND KF5NewStuff_FOUND AND AppStreamQt_FOUND) -+if(KF5Attica_FOUND AND KF5NewStuff_FOUND AND AppStreamQt5_FOUND) - add_subdirectory(KNSBackend) - endif() - --if(packagekitqt5_FOUND AND AppStreamQt_FOUND) -+if(packagekitqt5_FOUND AND AppStreamQt5_FOUND) - add_subdirectory(PackageKitBackend) - endif() - -@@ -22,10 +22,10 @@ if(BUILD_DummyBackend) - endif() - - option(BUILD_FlatpakBackend "Build Flatpak support" "ON") --if(Flatpak_FOUND AND AppStreamQt_FOUND AND BUILD_FlatpakBackend) -+if(Flatpak_FOUND AND AppStreamQt5_FOUND AND BUILD_FlatpakBackend) - add_subdirectory(FlatpakBackend) - elseif(BUILD_FlatpakBackend) -- message(WARNING "BUILD_FlatpakBackend enabled but Flatpak=${Flatpak_FOUND} or AppStreamQt=${AppStreamQt_FOUND} not found") -+ message(WARNING "BUILD_FlatpakBackend enabled but Flatpak=${Flatpak_FOUND} or AppStreamQt=${AppStreamQt5_FOUND} not found") - endif() - - find_package(Snapd) -@@ -41,7 +41,7 @@ if(BUILD_SteamOSBackend) - endif() - - option(BUILD_SnapBackend "Build Snap support." "ON") --if(BUILD_SnapBackend AND AppStreamQt_FOUND AND Snapd_FOUND) -+if(BUILD_SnapBackend AND AppStreamQt5_FOUND AND Snapd_FOUND) - add_subdirectory(SnapBackend) - endif() - -diff --git a/libdiscover/backends/FlatpakBackend/CMakeLists.txt b/libdiscover/backends/FlatpakBackend/CMakeLists.txt -index eac5a3241..905f2ee7f 100644 ---- a/libdiscover/backends/FlatpakBackend/CMakeLists.txt -+++ b/libdiscover/backends/FlatpakBackend/CMakeLists.txt -@@ -15,7 +15,7 @@ set(flatpak-backend_SRCS - add_library(flatpak-backend MODULE ${flatpak-backend_SRCS}) - target_link_libraries(flatpak-backend Qt::Core Qt::Widgets Qt::Concurrent KF5::CoreAddons KF5::ConfigCore KF5::KIOGui Discover::Common AppStreamQt PkgConfig::Flatpak) - --if (AppStreamQt_VERSION VERSION_GREATER 0.14.6) -+if (AppStreamQt5_VERSION VERSION_GREATER 0.14.6) - target_compile_definitions(flatpak-backend PRIVATE -DAPPSTREAM_NEW_POOL_API) - endif() - -diff --git a/libdiscover/backends/FlatpakBackend/FlatpakBackend.cpp b/libdiscover/backends/FlatpakBackend/FlatpakBackend.cpp -index 99488469b..2471bb8f0 100644 ---- a/libdiscover/backends/FlatpakBackend/FlatpakBackend.cpp -+++ b/libdiscover/backends/FlatpakBackend/FlatpakBackend.cpp -@@ -20,12 +20,12 @@ - #include - #include - --#include --#include --#include --#include --#include --#include -+#include -+#include -+#include -+#include -+#include -+#include - - #include - #include -@@ -159,18 +159,19 @@ public: - - QList componentsByName(const QString &name) - { -- QList comps = m_pool->componentsById(name); -- if (!comps.isEmpty()) -- return comps; -+ auto comps = m_pool->componentsById(name); -+ if (!comps.isEmpty()) { -+ return comps.toList(); -+ } - - comps = m_pool->componentsByProvided(AppStream::Provided::KindId, name); -- return comps; -+ return comps.toList(); - } - - QList componentsByFlatpakId(const QString &ref) - { - #if ASQ_CHECK_VERSION(0, 16, 0) -- QList comps = m_pool->componentsByBundleId(AppStream::Bundle::KindFlatpak, ref, false); -+ QList comps = m_pool->componentsByBundleId(AppStream::Bundle::KindFlatpak, ref, false).toList(); - #else - QList comps = m_pool->components(); - comps = kFilter>(comps, [&ref](const AppStream::Component &component) { -@@ -181,7 +182,7 @@ public: - if (!comps.isEmpty()) - return comps; - -- comps = m_pool->componentsByProvided(AppStream::Provided::KindId, ref.section('/', 1, 1)); -+ comps = m_pool->componentsByProvided(AppStream::Provided::KindId, ref.section('/', 1, 1)).toList(); - return comps; - } - -@@ -274,7 +275,11 @@ static std::optional metadataFromBytes(GBytes *appstreamGz, - gconstpointer data = g_bytes_get_data(appstream, &len); - - AppStream::Metadata metadata; -+#if ASQ_CHECK_VERSION(0, 16, 0) -+ metadata.setFormatStyle(AppStream::Metadata::FormatStyleCatalog); -+#else - metadata.setFormatStyle(AppStream::Metadata::FormatStyleCollection); -+#endif - AppStream::Metadata::MetadataError error = metadata.parse(QString::fromUtf8((char *)data, len), AppStream::Metadata::FormatKindXml); - if (error != AppStream::Metadata::MetadataErrorNoError) { - qWarning() << "Failed to parse appstream metadata: " << error; -@@ -479,7 +484,7 @@ FlatpakResource *FlatpakBackend::getAppForInstalledRef(FlatpakInstallation *inst - g_autoptr(GBytes) metadata = flatpak_installed_ref_load_appdata(ref, 0, 0); - if (metadata) { - auto meta = metadataFromBytes(metadata, m_cancellable); -- comps = meta->components(); -+ comps = meta->components().toList(); - } - } - -@@ -626,7 +631,7 @@ void FlatpakBackend::addAppFromFlatpakBundle(const QUrl &url, ResultsStream *str - return; - } - -- const QList components = metadata->components(); -+ const QList components = metadata->components().toList(); - if (components.size()) { - asComponent = components.first(); - } else { -@@ -777,7 +782,11 @@ AppStream::Component fetchComponentFromRemote(const QSettings &settings, GCancel - AppStream::Pool pool; - #ifdef APPSTREAM_NEW_POOL_API - pool.setLoadStdDataLocations(false); -+#if ASQ_CHECK_VERSION(0, 16, 0) -+ pool.addExtraDataLocation(appstreamLocation, AppStream::Metadata::FormatStyleCatalog); -+#else - pool.addExtraDataLocation(appstreamLocation, AppStream::Metadata::FormatStyleCollection); -+#endif - #else - pool.clearMetadataLocations(); - pool.addMetadataLocation(appstreamLocation); -@@ -795,7 +804,7 @@ AppStream::Component fetchComponentFromRemote(const QSettings &settings, GCancel - } - - // TODO optimise, this lookup should happen in libappstream -- auto comps = pool.components(); -+ auto comps = pool.components().toList(); - comps = kFilter>(comps, [name, branch](const AppStream::Component &component) { - const QString id = component.bundle(AppStream::Bundle::KindFlatpak).id(); - // app/app.getspace.Space/x86_64/stable -@@ -1079,7 +1088,11 @@ void FlatpakBackend::createPool(QSharedPointer source) - - #ifdef APPSTREAM_NEW_POOL_API - pool->setLoadStdDataLocations(false); -+#if ASQ_CHECK_VERSION(0, 16, 0) -+ pool->addExtraDataLocation(appstreamDirPath, AppStream::Metadata::FormatStyleCatalog); -+#else - pool->addExtraDataLocation(appstreamDirPath, AppStream::Metadata::FormatStyleCollection); -+#endif - #else - pool->clearMetadataLocations(); - pool->addMetadataLocation(appstreamDirPath); -@@ -1558,11 +1571,11 @@ ResultsStream *FlatpakBackend::search(const AbstractResourcesBackend::Filters &f - for (const auto &source : qAsConst(m_flatpakSources)) { - QList resources; - if (source->m_pool) { -- const auto a = !filter.search.isEmpty() ? source->m_pool->search(filter.search) -+ const auto a = !filter.search.isEmpty() ? source->m_pool->search(filter.search).toList() - #if ASQ_CHECK_VERSION(0, 15, 6) - : filter.category ? AppStreamUtils::componentsByCategories(source->m_pool, filter.category, AppStream::Bundle::KindFlatpak) - #endif -- : source->m_pool->components(); -+ : source->m_pool->components().toList(); - resources = kTransform>(a, [this, &source](const auto &comp) { - return resourceForComponent(comp, source); - }); -diff --git a/libdiscover/backends/FlatpakBackend/FlatpakBackend.h b/libdiscover/backends/FlatpakBackend/FlatpakBackend.h -index 66188095a..878965bfc 100644 ---- a/libdiscover/backends/FlatpakBackend/FlatpakBackend.h -+++ b/libdiscover/backends/FlatpakBackend/FlatpakBackend.h -@@ -14,7 +14,7 @@ - #include - #include - --#include -+#include - - #include "flatpak-helper.h" - -diff --git a/libdiscover/backends/FlatpakBackend/FlatpakResource.cpp b/libdiscover/backends/FlatpakBackend/FlatpakResource.cpp -index 7ed905ead..1af8c9e3f 100644 ---- a/libdiscover/backends/FlatpakBackend/FlatpakResource.cpp -+++ b/libdiscover/backends/FlatpakBackend/FlatpakResource.cpp -@@ -13,9 +13,11 @@ - - #include - --#include --#include --#include -+#include -+#include -+#include -+#include -+#include - #include - - #include -@@ -24,7 +26,7 @@ - #include - #include - --#include -+#include - #include - #include - #include -@@ -113,7 +115,11 @@ QList FlatpakResource::addonsInformation() - QString FlatpakResource::availableVersion() const - { - if (m_availableVersion.isEmpty()) { -+#if ASQ_CHECK_VERSION(1, 0, 0) -+ const auto releases = m_appdata.releasesPlain().entries(); -+#else - const auto releases = m_appdata.releases(); -+#endif - if (!releases.isEmpty()) { - auto latestVersion = releases.constFirst().version(); - for (const auto &release : releases) { -@@ -649,8 +655,13 @@ QUrl FlatpakResource::url() const - - QDate FlatpakResource::releaseDate() const - { -- if (!m_appdata.releases().isEmpty()) { -- auto release = m_appdata.releases().constFirst(); -+#if ASQ_CHECK_VERSION(1, 0, 0) -+ if (!m_appdata.releasesPlain().isEmpty()) { -+ auto release = m_appdata.releasesPlain().indexSafe(0).value(); -+#else -+ if (const auto releases = m_appdata.releases(); !releases.isEmpty()) { -+ auto release = releases.constFirst(); -+#endif - return release.timestamp().date(); - } - -@@ -673,7 +684,7 @@ QString FlatpakResource::sourceIcon() const - - QString FlatpakResource::author() const - { -- QString name = m_appdata.developerName(); -+ QString name = m_appdata.developer().name(); - - if (name.isEmpty()) { - name = m_appdata.projectGroup(); -@@ -711,8 +722,13 @@ QString FlatpakResource::versionString() - if (ref) { - version = flatpak_installed_ref_get_appdata_version(ref); - } -+#if ASQ_CHECK_VERSION(1, 0, 0) -+ } else if (!m_appdata.releasesPlain().isEmpty()) { -+ const auto release = m_appdata.releasesPlain().indexSafe(0).value(); -+#else - } else if (!m_appdata.releases().isEmpty()) { -- auto release = m_appdata.releases().constFirst(); -+ const auto release = m_appdata.releases().constFirst(); -+#endif - version = release.version(); - } else { - version = m_id.branch; -diff --git a/libdiscover/backends/FlatpakBackend/FlatpakResource.h b/libdiscover/backends/FlatpakBackend/FlatpakResource.h -index 06e1b030a..648b6a5a7 100644 ---- a/libdiscover/backends/FlatpakBackend/FlatpakResource.h -+++ b/libdiscover/backends/FlatpakBackend/FlatpakResource.h -@@ -12,7 +12,7 @@ - #include "FlatpakPermission.h" - #include "flatpak-helper.h" - --#include -+#include - - #include - #include -diff --git a/libdiscover/backends/PackageKitBackend/AppPackageKitResource.cpp b/libdiscover/backends/PackageKitBackend/AppPackageKitResource.cpp -index 510266dfd..740127879 100644 ---- a/libdiscover/backends/PackageKitBackend/AppPackageKitResource.cpp -+++ b/libdiscover/backends/PackageKitBackend/AppPackageKitResource.cpp -@@ -6,10 +6,12 @@ - - #include "AppPackageKitResource.h" - #include "utils.h" --#include --#include --#include --#include -+#include -+#include -+#include -+#include -+#include -+#include - #include - #include - #include -@@ -236,8 +238,13 @@ QString AppPackageKitResource::versionString() - - QDate AppPackageKitResource::releaseDate() const - { -+#if ASQ_CHECK_VERSION(1, 0, 0) -+ if (!m_appdata.releasesPlain().isEmpty()) { -+ const auto release = m_appdata.releasesPlain().indexSafe(0).value(); -+#else - if (!m_appdata.releases().isEmpty()) { -- auto release = m_appdata.releases().constFirst(); -+ const auto release = m_appdata.releases().constFirst(); -+#endif - return release.timestamp().date(); - } - -@@ -246,7 +253,7 @@ QDate AppPackageKitResource::releaseDate() const - - QString AppPackageKitResource::author() const - { -- QString name = m_appdata.developerName(); -+ QString name = m_appdata.developer().name(); - - if (name.isEmpty()) { - name = m_appdata.projectGroup(); -diff --git a/libdiscover/backends/PackageKitBackend/PackageKitBackend.cpp b/libdiscover/backends/PackageKitBackend/PackageKitBackend.cpp -index 6902318a3..f713b9036 100644 ---- a/libdiscover/backends/PackageKitBackend/PackageKitBackend.cpp -+++ b/libdiscover/backends/PackageKitBackend/PackageKitBackend.cpp -@@ -13,9 +13,10 @@ - #include "PKTransaction.h" - #include "PackageKitSourcesBackend.h" - #include "PackageKitUpdater.h" --#include --#include --#include -+#include -+#include -+#include -+#include - #include - #include - #include -@@ -309,12 +310,16 @@ void PackageKitBackend::reloadPackageList() - } - acquireFetching(false); - -- const QList distroComponents = m_appdata->componentsById(AppStream::Utils::currentDistroComponentId()); -+ const auto distroComponents = m_appdata->componentsById(AppStream::SystemInfo::currentDistroComponentId()); - if (distroComponents.isEmpty()) { -- qWarning() << "no component found for" << AppStream::Utils::currentDistroComponentId(); -+ qWarning() << "no component found for" << AppStream::SystemInfo::currentDistroComponentId(); - } -- for (const AppStream::Component &dc : distroComponents) { -+ for (const auto list = distroComponents.toList(); const AppStream::Component &dc : list) { -+#if ASQ_CHECK_VERSION(1, 0, 0) -+ const auto releases = dc.releasesPlain().entries(); -+#else - const auto releases = dc.releases(); -+#endif - for (const auto &r : releases) { - int cmp = AppStream::Utils::vercmpSimple(r.version(), AppStreamIntegration::global()->osRelease()->versionId()); - if (cmp == 0) { -@@ -552,7 +557,7 @@ QList PackageKitBackend::componentsById(const QString &id) - if (comps.isEmpty()) { - comps = m_appdata->componentsByProvided(AppStream::Provided::KindId, id); - } -- return comps; -+ return comps.toList(); - } - - static const auto needsResolveFilter = [](AbstractResource *res) { -@@ -698,13 +703,15 @@ ResultsStream *PackageKitBackend::search(const AbstractResourcesBackend::Filters - if (!stream) { - return; - } -- const auto components = !filter.search.isEmpty() ? m_appdata->search(filter.search) --#if ASQ_CHECK_VERSION(0, 15, 6) -- : filter.category ? AppStreamUtils::componentsByCategories(m_appdata.get(), -- filter.category, -- AppStream::Bundle::KindUnknown) --#endif -- : m_appdata->components(); -+ QList components; -+ if (!filter.search.isEmpty()) { -+ components = m_appdata->search(filter.search).toList(); -+ } else if (filter.category) { -+ components = AppStreamUtils::componentsByCategories(m_appdata.get(), filter.category, AppStream::Bundle::KindUnknown); -+ } else { -+ components = m_appdata->components().toList(); -+ } -+ - const QSet ids = kTransform>(components, [](const AppStream::Component &comp) { - return comp.id(); - }); -diff --git a/libdiscover/backends/PackageKitBackend/PackageKitBackend.h b/libdiscover/backends/PackageKitBackend/PackageKitBackend.h -index d9a5fd824..93899450b 100644 ---- a/libdiscover/backends/PackageKitBackend/PackageKitBackend.h -+++ b/libdiscover/backends/PackageKitBackend/PackageKitBackend.h -@@ -7,7 +7,7 @@ - #pragma once - - #include "PackageKitResource.h" --#include -+#include - #include - #include - #include -diff --git a/libdiscover/backends/PackageKitBackend/PackageKitResource.cpp b/libdiscover/backends/PackageKitBackend/PackageKitResource.cpp -index 8bdaec395..c7e2c0077 100644 ---- a/libdiscover/backends/PackageKitBackend/PackageKitResource.cpp -+++ b/libdiscover/backends/PackageKitBackend/PackageKitResource.cpp -@@ -10,7 +10,7 @@ - #include "PackageKitMessages.h" - #include "appstream/AppStreamUtils.h" - #include "config-paths.h" --#include -+#include - #include - #include - #include -diff --git a/libdiscover/backends/RpmOstreeBackend/RpmOstreeBackend.cpp b/libdiscover/backends/RpmOstreeBackend/RpmOstreeBackend.cpp -index 6e1528be4..eb06b6510 100644 ---- a/libdiscover/backends/RpmOstreeBackend/RpmOstreeBackend.cpp -+++ b/libdiscover/backends/RpmOstreeBackend/RpmOstreeBackend.cpp -@@ -10,8 +10,8 @@ - - #include "Transaction/TransactionModel.h" - --#include --#include -+#include -+#include - #include - #include - #include -@@ -316,7 +316,7 @@ void RpmOstreeBackend::lookForNextMajorVersion() - } - - // Look at releases to see if we have a new major version available. -- const QList distroComponents = m_appdata->componentsById(distroId); -+ const auto distroComponents = m_appdata->componentsById(distroId); - if (distroComponents.isEmpty()) { - qWarning() << "rpm-ostree-backend: No component found for" << distroId; - return; -@@ -324,8 +324,12 @@ void RpmOstreeBackend::lookForNextMajorVersion() - - QString currentVersion = AppStreamIntegration::global()->osRelease()->versionId(); - QString nextVersion; -- for (const AppStream::Component &dc : distroComponents) { -+ for (const auto list = distroComponents.toList(); const AppStream::Component &dc : list) { -+#if ASQ_CHECK_VERSION(1, 0, 0) -+ const auto releases = dc.releasesPlain().entries(); -+#else - const auto releases = dc.releases(); -+#endif - for (const auto &r : releases) { - // Only look at stable releases unless development mode is enabled - if ((r.kind() != AppStream::Release::KindStable) && !m_developmentEnabled) { -diff --git a/libdiscover/backends/RpmOstreeBackend/RpmOstreeBackend.h b/libdiscover/backends/RpmOstreeBackend/RpmOstreeBackend.h -index 8ceed1af1..ea0a07c6f 100644 ---- a/libdiscover/backends/RpmOstreeBackend/RpmOstreeBackend.h -+++ b/libdiscover/backends/RpmOstreeBackend/RpmOstreeBackend.h -@@ -14,7 +14,7 @@ - #include - #include - --#include -+#include - #include - - class DiscoverAction; diff --git a/desktop/kde6/plasma/discover-kf6/files/dc67ef22.patch b/desktop/kde6/plasma/discover-kf6/files/dc67ef22.patch deleted file mode 100644 index f53555dd0d..0000000000 --- a/desktop/kde6/plasma/discover-kf6/files/dc67ef22.patch +++ /dev/null @@ -1,193 +0,0 @@ -From dc67ef22f47b9e8b46d668b811982f33600f1aae Mon Sep 17 00:00:00 2001 -From: Aleix Pol -Date: Wed, 10 Nov 2021 01:55:56 +0100 -Subject: [PATCH] flatpak: Do not include the resource type in the - FlatpakResource::Id - -Otherwise we couldn't make sure that idForInstalledRef() was coherent -with FlatpakResource::uniqueId(). -In the end it's not a problem, it's not like we can have an app and -runtime with the same name. - - -(cherry picked from commit 614450b3ee9175fb16f068af505fb59ed27e6697) ---- - .../FlatpakBackend/FlatpakBackend.cpp | 25 ++++++++----------- - .../FlatpakBackend/FlatpakResource.cpp | 12 ++++----- - .../backends/FlatpakBackend/FlatpakResource.h | 7 +++--- - 3 files changed, 19 insertions(+), 25 deletions(-) - -diff --git a/libdiscover-kf6/backends/FlatpakBackend/FlatpakBackend.cpp b/libdiscover-kf6/backends/FlatpakBackend/FlatpakBackend.cpp -index 012817ef9..6727b0227 100644 ---- a/libdiscover-kf6/backends/FlatpakBackend/FlatpakBackend.cpp -+++ b/libdiscover-kf6/backends/FlatpakBackend/FlatpakBackend.cpp -@@ -149,8 +149,7 @@ QDebug operator<<(QDebug debug, const FlatpakResource::Id &id) - QDebugStateSaver saver(debug); - debug.nospace() << "FlatpakResource::Id("; - debug.nospace() << "name:" << id.id << ','; -- debug.nospace() << "branch:" << id.branch << ','; -- debug.nospace() << "type:" << id.type; -+ debug.nospace() << "branch:" << id.branch; - debug.nospace() << ')'; - return debug; - } -@@ -162,7 +161,6 @@ static FlatpakResource::Id idForRefString(const QStringView &ref) - auto parts = ref.split('/'); - // app/app.getspace.Space/x86_64/stable - return { -- parts[0] == QLatin1String("app") ? FlatpakResource::DesktopApp : FlatpakResource::Runtime, - parts[1].toString(), - parts[3].toString(), - parts[2].toString(), -@@ -178,7 +176,7 @@ static FlatpakResource::Id idForInstalledRef(FlatpakInstalledRef *ref, const QSt - const QString arch = QString::fromUtf8(flatpak_ref_get_arch(FLATPAK_REF(ref))); - const QString branch = QString::fromUtf8(flatpak_ref_get_branch(FLATPAK_REF(ref))); - -- return {appType, appId, branch, arch}; -+ return {appId, branch, arch}; - } - - FlatpakBackend::FlatpakBackend(QObject *parent) -@@ -350,25 +348,20 @@ QString refToBundleId(FlatpakRef *ref) - - FlatpakResource *FlatpakBackend::getAppForInstalledRef(FlatpakInstallation *installation, FlatpakInstalledRef *ref) const - { -- auto id = idForInstalledRef(ref, {}); -- for (const auto &source : m_flatpakSources) { -- auto ret = source->m_resources.value(id); -+ const QString origin = QString::fromUtf8(flatpak_installed_ref_get_origin(ref)); -+ auto source = findSource(installation, origin); -+ if (source) { -+ auto ret = source->m_resources.value(idForInstalledRef(ref, {})); - if (ret) { - return ret; - } -- } -- auto id2 = idForInstalledRef(ref, QStringLiteral(".desktop")); -- for (const auto &source : m_flatpakSources) { -- auto ret = source->m_resources.value(id2); -+ ret = source->m_resources.value(idForInstalledRef(ref, QStringLiteral(".desktop"))); - if (ret) { - return ret; - } - } - - const QLatin1String name(flatpak_ref_get_name(FLATPAK_REF(ref))); -- -- const QString origin = QString::fromUtf8(flatpak_installed_ref_get_origin(ref)); -- auto source = findSource(installation, origin); - const QString pathExports = FlatpakResource::installationPath(installation) + QLatin1String("/exports/"); - const QString pathApps = pathExports + QLatin1String("share/applications/"); - AppStream::Component cid; -@@ -413,6 +406,8 @@ FlatpakResource *FlatpakBackend::getAppForInstalledRef(FlatpakInstallation *inst - resource->updateFromRef(FLATPAK_REF(ref)); - resource->setState(AbstractResource::Installed); - source->addResource(resource); -+ -+ Q_ASSERT(resource->uniqueId() == idForInstalledRef(ref, {}) || resource->uniqueId() == idForInstalledRef(ref, {".desktop"})); - return resource; - } - -@@ -445,7 +440,7 @@ FlatpakResource *FlatpakBackend::getRuntimeForApp(FlatpakResource *resource) con - for (const auto &source : m_flatpakSources) { - for (auto it = source->m_resources.constBegin(), itEnd = source->m_resources.constEnd(); it != itEnd; ++it) { - const auto &id = it.key(); -- if (id.type == FlatpakResource::Runtime && id.id == runtimeInfo.at(0) && id.branch == runtimeInfo.at(2)) { -+ if ((*it)->resourceType() == FlatpakResource::Runtime && id.id == runtimeInfo.at(0) && id.branch == runtimeInfo.at(2)) { - runtime = *it; - break; - } -diff --git a/libdiscover-kf6/backends/FlatpakBackend/FlatpakResource.cpp b/libdiscover-kf6/backends/FlatpakBackend/FlatpakResource.cpp -index 8f6b25575..7419dcee7 100644 ---- a/libdiscover-kf6/backends/FlatpakBackend/FlatpakResource.cpp -+++ b/libdiscover-kf6/backends/FlatpakBackend/FlatpakResource.cpp -@@ -41,7 +41,7 @@ static QString iconCachePath(const AppStream::Icon &icon) - FlatpakResource::FlatpakResource(const AppStream::Component &component, FlatpakInstallation *installation, FlatpakBackend *parent) - : AbstractResource(parent) - , m_appdata(component) -- , m_id({FlatpakResource::DesktopApp, component.id(), QString(), QString()}) -+ , m_id({component.id(), QString(), QString()}) - , m_downloadSize(0) - , m_installedSize(0) - , m_propertyStates({{DownloadSize, NotKnownYet}, {InstalledSize, NotKnownYet}, {RequiredRuntime, NotKnownYet}}) -@@ -122,7 +122,7 @@ QString FlatpakResource::branch() const - - bool FlatpakResource::canExecute() const - { -- return (m_id.type == DesktopApp && (m_state == AbstractResource::Installed || m_state == AbstractResource::Upgradeable)); -+ return (m_type == DesktopApp && (m_state == AbstractResource::Installed || m_state == AbstractResource::Upgradeable)); - } - - void FlatpakResource::updateFromRef(FlatpakRef *ref) -@@ -241,7 +241,7 @@ int FlatpakResource::installedSize() const - - AbstractResource::Type FlatpakResource::type() const - { -- switch (m_id.type) { -+ switch (m_type) { - case FlatpakResource::Runtime: - return Technical; - case FlatpakResource::Extension: -@@ -381,12 +381,12 @@ AbstractResource::State FlatpakResource::state() - - FlatpakResource::ResourceType FlatpakResource::resourceType() const - { -- return m_id.type; -+ return m_type; - } - - QString FlatpakResource::typeAsString() const - { -- switch (m_id.type) { -+ switch (m_type) { - case FlatpakResource::Runtime: - case FlatpakResource::Extension: - return QLatin1String("runtime"); -@@ -528,7 +528,7 @@ void FlatpakResource::setState(AbstractResource::State state) - - void FlatpakResource::setType(FlatpakResource::ResourceType type) - { -- m_id.type = type; -+ m_type = type; - } - - QString FlatpakResource::installationPath() const -diff --git a/libdiscover-kf6/backends/FlatpakBackend/FlatpakResource.h b/libdiscover-kf6/backends/FlatpakBackend/FlatpakResource.h -index 7cf0022d7..364857950 100644 ---- a/libdiscover-kf6/backends/FlatpakBackend/FlatpakResource.h -+++ b/libdiscover-kf6/backends/FlatpakBackend/FlatpakResource.h -@@ -55,7 +55,6 @@ public: - Q_ENUM(FlatpakFileType) - - struct Id { -- FlatpakResource::ResourceType type; - const QString id; - QString branch; - QString arch; -@@ -66,8 +65,7 @@ public: - bool operator==(const Id &other) const - { - return &other == this -- || (other.type == type // -- && other.id == id // -+ || (other.id == id // - && other.branch == branch // - && other.arch == arch // - ); -@@ -183,11 +181,12 @@ private: - AbstractResource::State m_state; - FlatpakInstallation *const m_installation; - QString m_origin; -+ FlatpakResource::ResourceType m_type = DesktopApp; - }; - - inline uint qHash(const FlatpakResource::Id &key) - { -- return qHash(key.type) ^ qHash(key.id) ^ qHash(key.branch) ^ qHash(key.arch); -+ return qHash(key.id) ^ qHash(key.branch) ^ qHash(key.arch); - } - - #endif // FLATPAKRESOURCE_H --- -GitLab - diff --git a/desktop/kde6/plasma/discover-kf6/pspec.xml b/desktop/kde6/plasma/discover-kf6/pspec.xml deleted file mode 100755 index 28511992b6..0000000000 --- a/desktop/kde6/plasma/discover-kf6/pspec.xml +++ /dev/null @@ -1,259 +0,0 @@ - - - - - discover-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - app:gui - plasmadiscover-kf6 - KDE and Plasma resources management GUI - KDE and Plasma resources management GUI - mirrors://kde/stable/plasma/6.2.5/discover-6.2.5.tar.xz - - kio-kf6-devel - fwupd-devel - attica-kf6-devel - karchive-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - discount-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kitemmodels-kf6-devel - knotifications-kf6-devel - kxmlgui-kf6-devel - kdeclarative-kf6-devel - libplasma-kf6-devel - knewstuff-kf6-devel - extra-cmake-modules-kf6 - kirigami-kf6-devel - kcmutils-kf6-devel - kidletime-kf6-devel - appstream-qt6-devel - purpose-kf6-devel - packagekit-qt6-devel - kstatusnotifieritem-kf6-devel - kirigami-addons-kf6 - kuserfeedback-kf6-devel - kiconthemes-kf6-devel - qcoro-qt6-devel - qt6-svg-devel - flatpak-devel - qt6-base-devel - qt6-webview-devel - qt6-declarative-devel - - - - - - - - discover-kf6 - - qt6-base - qt6-webview - kdeclarative-kf6 - kio-kf6 - fwupd - glib2 - attica-kf6 - kconfig-kf6 - kservice-kf6 - kcmutils-kf6 - kconfig-kf6 - discount - kitemmodels-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kjobwidgets-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - ki18n-kf6 - kcrash-kf6 - kxmlgui-kf6 - kidletime-kf6 - kwindowsystem-kf6 - kstatusnotifieritem-kf6 - qt6-declarative - knewstuff-kf6 - purpose-kf6 - appstream-qt6 - packagekit-qt6 - kuserfeedback-kf6 - kirigami-addons-kf6 - qcoro-qt6 - - - /etc - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/share - /usr/share/locale - - - - discover-kf6-plugin-flatpak - hardware.virtualization - - discover-kf6 - glib2 - flatpak - appstream-qt6 - qt6-base - kio-kf6 - ki18n-kf6 - kservice-kf6 - kconfig-kf6 - kcoreaddons-kf6 - gnupg - - - /usr/lib/qt6/plugins/discover-notifier/FlatpakNotifier.so - /usr/lib/qt6/plugins/discover/flatpak-backend.so - /usr/share/applications/org.kde.discover-flatpak - /usr/share/libdiscover/categories/flatpak-backend-categories.xml - /usr/share/metainfo/org.kde.discover.flatpak.appdata.xml - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/drkonqi-kf6/actions.py b/desktop/kde6/plasma/drkonqi-kf6/actions.py deleted file mode 100755 index 4e881e2ed3..0000000000 --- a/desktop/kde6/plasma/drkonqi-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure("-DWITH_PYTHON_VENDORING=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/drkonqi-kf6/pspec.xml b/desktop/kde6/plasma/drkonqi-kf6/pspec.xml deleted file mode 100755 index a4a9872304..0000000000 --- a/desktop/kde6/plasma/drkonqi-kf6/pspec.xml +++ /dev/null @@ -1,223 +0,0 @@ - - - - - drkonqi-kf6 - https://www.kde.org/ - - Mustafa Cinasal - muscnsl@gmail.com - - GPLv2 - library - The KDE crash handler - The KDE crash handler - https://download.kde.org/stable/plasma/6.2.5/drkonqi-6.2.5.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - ki18n-kf6-devel - kcoreaddons-kf6-devel - kservice-kf6-devel - kconfig-kf6-devel - kjobwidgets-kf6-devel - kio-kf6-devel - kcrash-kf6-devel - kcompletion-kf6-devel - kwidgetsaddons-kf6-devel - kwallet-kf6-devel - knotifications-kf6-devel - kidletime-kf6-devel - at-spi2-core-devel - xorg-server-xvfb - rubygems - ruby-devel - gdb-devel - python3-devel - python3-psutil - python3-pygdbmi - python3-sentry_sdk - kcmutils-kf6-devel - kwindowsystem-kf6-devel - syntax-highlighting-kf6-devel - qt6-declarative-devel - kdeclarative-kf6-devel - kirigami-kf6-devel - kitemmodels-kf6-devel - kuserfeedback-kf6-devel - kstatusnotifieritem-kf6-devel - elogind-devel - polkit-qt6-devel - - - - - drkonqi-kf6 - - qt6-base - qt6-declarative - libgcc - ki18n-kf6 - kcmutils-kf6 - kcoreaddons-kf6 - kservice-kf6 - kidletime-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kjobwidgets-kf6 - kio-kf6 - kcrash-kf6 - kcompletion-kf6 - kwidgetsaddons-kf6 - kwallet-kf6 - knotifications-kf6 - kwindowsystem-kf6 - syntax-highlighting-kf6 - kdeclarative-kf6 - kirigami-kf6 - kitemmodels-kf6 - kuserfeedback-kf6 - kstatusnotifieritem-kf6 - elogind - polkit-qt6 - - - /usr/bin - /etc/xdg - /usr/lib - /usr/share - /usr/share/locale - /usr/share/drkonqi-kf6 - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/drkonqi-kf6/translations.xml b/desktop/kde6/plasma/drkonqi-kf6/translations.xml deleted file mode 100755 index c81219d0ff..0000000000 --- a/desktop/kde6/plasma/drkonqi-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - drkonqi-kf6 - The KDE crash handler - The KDE crash handler - - diff --git a/desktop/kde6/plasma/kactivitymanagerd-kf6/actions.py b/desktop/kde6/plasma/kactivitymanagerd-kf6/actions.py deleted file mode 100755 index f4ec1a319f..0000000000 --- a/desktop/kde6/plasma/kactivitymanagerd-kf6/actions.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/lib/systemd") - - pisitools.dodoc("LICENSES/*", "README*", "TODO") diff --git a/desktop/kde6/plasma/kactivitymanagerd-kf6/pspec.xml b/desktop/kde6/plasma/kactivitymanagerd-kf6/pspec.xml deleted file mode 100755 index a8fa76b66c..0000000000 --- a/desktop/kde6/plasma/kactivitymanagerd-kf6/pspec.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - - - kactivitymanagerd-kf6 - https://www.kde.org - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - Core components for the KDE Activity concept. - System service to manage user's activities, track the usage patterns etc. - mirrors://kde/stable/plasma/6.2.5/kactivitymanagerd-6.2.5.tar.xz - - extra-cmake-modules-kf6 - boost-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - qt6-sql-mysql - qt6-sql-odbc - qt6-sql-postgresql - qt6-sql-sqlite - qt6-base-devel - qt6-5compat-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kwindowsystem-kf6-devel - kglobalaccel-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - kcrash-kf6-devel - - - - - kactivitymanagerd-kf6 - Core components for the KDE Activity concept. - - kio-kf6 - ki18n-kf6 - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - qt6-base - qt6-5compat - kcoreaddons-kf6 - kdbusaddons-kf6 - kglobalaccel-kf6 - kwindowsystem-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - /usr/share/locale - /usr/share/kservice-kf6s5 - /usr/share/kservice-kf6types5 - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kde-cli-tools-kf6/actions.py b/desktop/kde6/plasma/kde-cli-tools-kf6/actions.py deleted file mode 100755 index 5a9c0633a7..0000000000 --- a/desktop/kde6/plasma/kde-cli-tools-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/plasma/kde-cli-tools-kf6/comar/package.py b/desktop/kde6/plasma/kde-cli-tools-kf6/comar/package.py deleted file mode 100755 index d77c1f4585..0000000000 --- a/desktop/kde6/plasma/kde-cli-tools-kf6/comar/package.py +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -import os - -def postInstall(fromVersion, fromRelease, toVersion, toRelease): - os.system("ln -s /usr/lib/kf5/kdesu-kf6 /usr/bin/kdesu-kf6") diff --git a/desktop/kde6/plasma/kde-cli-tools-kf6/pspec.xml b/desktop/kde6/plasma/kde-cli-tools-kf6/pspec.xml deleted file mode 100755 index 58f2aaced5..0000000000 --- a/desktop/kde6/plasma/kde-cli-tools-kf6/pspec.xml +++ /dev/null @@ -1,218 +0,0 @@ - - - - - kde-cli-tools-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Additional client tools for KDE applications - Tools based on KDE Frameworks 5 to better interact with the system - mirrors://kde/stable/plasma/6.2.5/kde-cli-tools-6.2.5.tar.xz - - qt6-base-devel - - qt6-svg-devel - qt6-declarative-devel - libX11-devel - libxcb-devel - kdoctools-kf6-devel - kio-kf6-devel - kdesu-kf6-devel - ki18n-kf6-devel - kservice-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - kwindowsystem-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kcmutils-kf6-devel - kconfig-kf6-devel - - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - - docbook-xsl - plasma-activities-kf6-devel - plasma-workspace-kf6-devel - extra-cmake-modules-kf6 - kdeclarative-kf6-devel - - - - - kde-cli-tools-kf6 - - qt6-base - qt6-svg - libX11 - libgcc - kio-kf6 - kdesu-kf6 - ki18n-kf6 - kservice-kf6 - - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kcmutils-kf6 - kconfig-kf6 - kdeclarative-kf6 - plasma-activities-kf6 - plasma-workspace-kf6 - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/man - /usr/share/doc - - - System.Package - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kde-gtk-config-kf6/actions.py b/desktop/kde6/plasma/kde-gtk-config-kf6/actions.py deleted file mode 100755 index c234eb21cb..0000000000 --- a/desktop/kde6/plasma/kde-gtk-config-kf6/actions.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure("-DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DKDE_INSTALL_LIBDIR=lib \ - -DINCLUDE_DIR=/include/gtk-3.0/gtk \ - -DLIBEXEC_INSTALL_DIR=lib \ - -DSYSCONF_INSTALL_DIR=/etc \ - -DKDE_INSTALL_USE_QT_SYS_PATHS=ON \ - -DBUILD_TESTING=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/plasma/kde-gtk-config-kf6/files/schemas.patch b/desktop/kde6/plasma/kde-gtk-config-kf6/files/schemas.patch deleted file mode 100644 index e39ee6e2c8..0000000000 --- a/desktop/kde6/plasma/kde-gtk-config-kf6/files/schemas.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2020-12-01 14:21:24.000000000 +0300 -+++ b/CMakeLists.txt 2020-12-11 17:46:16.791485295 +0300 -@@ -13,7 +13,6 @@ - find_package(KF5DBusAddons REQUIRED) - find_package(PkgConfig REQUIRED) - find_package(KDecoration2 REQUIRED) --find_package(GSettingSchemas REQUIRED) - find_package(Sass REQUIRED) - find_package(XSettingsd) - diff --git a/desktop/kde6/plasma/kde-gtk-config-kf6/pspec.xml b/desktop/kde6/plasma/kde-gtk-config-kf6/pspec.xml deleted file mode 100755 index 5228004e2d..0000000000 --- a/desktop/kde6/plasma/kde-gtk-config-kf6/pspec.xml +++ /dev/null @@ -1,215 +0,0 @@ - - - - - kde-gtk-config-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - GTK2 and GTK3 Configurator for KDE - Configuration dialog to adapt GTK+ applications appearance to your taste under KDE. - mirrors://kde/stable/plasma/6.2.5/kde-gtk-config-6.2.5.tar.xz - - qt6-base-devel - qt6-svg-devel - sassc - xsettingsd - libX11-devel - kio-kf6-devel - glib2-devel - ki18n-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - kwidgetsaddons-kf6-devel - kcmutils-kf6-devel - karchive-kf6-devel - kauth-kf6-devel - kconfigwidgets-kf6-devel - libXcursor-devel - knewstuff-kf6-devel - kguiaddons-kf6-devel - gtk2-devel - gtk3-devel - at-spi2-core-devel - extra-cmake-modules-kf6 - kdecorations-kf6-devel - kdbusaddons-kf6-devel - kcolorscheme-kf6-devel - kwindowsystem-kf6-devel - - - schemas.patch - - - - - kde-gtk-config-kf6 - - qt6-base - qt6-svg - kconfig-kf6 - glib2 - kio-kf6 - ki18n-kf6 - xsettingsd - kcoreaddons-kf6 - kiconthemes-kf6 - kwidgetsaddons-kf6 - karchive-kf6 - knewstuff-kf6 - kguiaddons-kf6 - kconfigwidgets-kf6 - libXcursor - gtk2 - gtk3 - kdbusaddons-kf6 - kdecorations-kf6 - kcolorscheme-kf6 - kwindowsystem-kf6 - - - /usr/share - /etc/xdg/cgc* - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release. - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kdecorations-kf6/actions.py b/desktop/kde6/plasma/kdecorations-kf6/actions.py deleted file mode 100755 index 461621e49e..0000000000 --- a/desktop/kde6/plasma/kdecorations-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/plasma/kdecorations-kf6/pspec.xml b/desktop/kde6/plasma/kdecorations-kf6/pspec.xml deleted file mode 100755 index 4dca0943d7..0000000000 --- a/desktop/kde6/plasma/kdecorations-kf6/pspec.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - kdecorations-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv3 - library - Plugin based library to create window decorations - Plugin based library to create window decorations - mirrors://kde/stable/plasma/6.2.5/kdecoration-6.2.5.tar.xz - - qt6-base-devel - ki18n-kf6-devel - extra-cmake-modules-kf6 - kcoreaddons-kf6-devel - - - - - kdecorations-kf6 - - qt6-base - ki18n-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kdecorations-kf6-devel - Development files for kdecorations-kf6 - - kdecorations-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kdecorations-kf6/translations.xml b/desktop/kde6/plasma/kdecorations-kf6/translations.xml deleted file mode 100755 index 428b6ff630..0000000000 --- a/desktop/kde6/plasma/kdecorations-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kde6-kdecorations-kf6 - Plugin based library to create window decorations - Plugin based library to create window decorations - - diff --git a/desktop/kde6/plasma/kdeplasma-addons-kf6/actions.py b/desktop/kde6/plasma/kdeplasma-addons-kf6/actions.py deleted file mode 100755 index 5a9c0633a7..0000000000 --- a/desktop/kde6/plasma/kdeplasma-addons-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/plasma/kdeplasma-addons-kf6/files/dictionarymatchengine.patch b/desktop/kde6/plasma/kdeplasma-addons-kf6/files/dictionarymatchengine.patch deleted file mode 100755 index 31b0717cc9..0000000000 --- a/desktop/kde6/plasma/kdeplasma-addons-kf6/files/dictionarymatchengine.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/runners/dictionary/dictionarymatchengine.cpp b/runners/dictionary/dictionarymatchengine.cpp ---- a/runners/dictionary/dictionarymatchengine.cpp 2017-10-24 13:51:25.000000000 +0300 -+++ b/runners/dictionary/dictionarymatchengine.cpp 2017-11-04 17:44:10.006867811 +0300 -@@ -73,7 +73,7 @@ - /* Because of QString's CoW semantics, we don't have to worry about - * the overhead of assigning this to every item. */ - data->definition = definition; -- data->waitCondition.notify_one(); -+ data->waitCondition.wakeOne(); - } - m_wordLock.unlock(); - } diff --git a/desktop/kde6/plasma/kdeplasma-addons-kf6/pspec.xml b/desktop/kde6/plasma/kdeplasma-addons-kf6/pspec.xml deleted file mode 100755 index 1b94995abb..0000000000 --- a/desktop/kde6/plasma/kdeplasma-addons-kf6/pspec.xml +++ /dev/null @@ -1,248 +0,0 @@ - - - - - kdeplasma-addons-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Additional client tools for KDE applications - Additional client tools for KDE applications - mirrors://kde/stable/plasma/6.2.5/kdeplasma-addons-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - qt6-5compat-devel - qt6-webengine-devel - plasma5-support-devel - libxcb-devel - xcb-util-image-devel - glib2-devel - scim-devel - ibus-devel - plasma-activities-kf6-devel - kconfig-kf6-devel - kdoctools-kf6-devel - knewstuff-kf6-devel - kirigami-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kcmutils-kf6-devel - - kiconthemes-kf6-devel - krunner-kf6-devel - - libplasma-kf6-devel - plasma-workspace-kf6-devel - extra-cmake-modules-kf6 - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kservice-kf6-devel - libX11-devel - kholidays-kf6-devel - kdeclarative-kf6-devel - purpose-kf6-devel - karchive-kf6-devel - knotifications-kf6-devel - networkmanager-qt-kf6-devel - icu4c-devel - libnma-devel - - - - - - - - kdeplasma-addons-kf6 - - qt6-base - libplasma-kf6 - libgcc - libxcb - xcb-util-image - glib2 - knewstuff-kf6 - krunner-kf6 - kio-kf6 - kiconthemes-kf6 - ki18n-kf6 - kirigami-kf6 - sonnet-kf6 - kconfig-kf6 - kxmlgui-kf6 - karchive-kf6 - kpackage-kf6 - kservice-kf6 - kholidays-kf6 - kdeclarative-kf6 - qt6-webengine - qt6-5compat - qt6-declarative - plasma5-support - kcompletion-kf6 - kcoreaddons-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kunitconversion-kf6 - - plasma-activities-kf6 - plasma-workspace-kf6 - ibus - scim-libs - xcb-util-keysyms - networkmanager-qt-kf6 - icu4c - libnma - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/include/plasma - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kgamma-kf6/actions.py b/desktop/kde6/plasma/kgamma-kf6/actions.py deleted file mode 100755 index fbd8eda5e0..0000000000 --- a/desktop/kde6/plasma/kgamma-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("ChangeLog", "LICENSES/*") diff --git a/desktop/kde6/plasma/kgamma-kf6/pspec.xml b/desktop/kde6/plasma/kgamma-kf6/pspec.xml deleted file mode 100755 index 3b06d7e240..0000000000 --- a/desktop/kde6/plasma/kgamma-kf6/pspec.xml +++ /dev/null @@ -1,186 +0,0 @@ - - - - - kgamma-kf6 - https://projects.kde.org/kgamma-kf6 - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Adjust your monitor's gamma settings. - Adjust your monitor's gamma settings. - mirrors://kde/stable/plasma/6.2.5/kgamma-6.2.5.tar.xz - - qt6-base-devel - libX11-devel - kdoctools-kf6-devel - kconfig-kf6-devel - kcmutils-kf6-devel - kconfigwidgets-kf6-devel - ki18n-kf6-devel - - kitemmodels-kf6-devel - kunitconversion-kf6-devel - libXxf86vm-devel - docbook-xsl - extra-cmake-modules-kf6 - - - - - kgamma-kf6 - - qt6-base - kconfig-kf6 - libgcc - libX11 - ki18n-kf6 - kcmutils-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - libXxf86vm - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kinfocenter-kf6/actions.py b/desktop/kde6/plasma/kinfocenter-kf6/actions.py deleted file mode 100755 index a2560a288e..0000000000 --- a/desktop/kde6/plasma/kinfocenter-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - #pisitools.dodoc("COPYING") diff --git a/desktop/kde6/plasma/kinfocenter-kf6/files/kcm-about-distrorc b/desktop/kde6/plasma/kinfocenter-kf6/files/kcm-about-distrorc deleted file mode 100755 index 8709bb6a95..0000000000 --- a/desktop/kde6/plasma/kinfocenter-kf6/files/kcm-about-distrorc +++ /dev/null @@ -1,4 +0,0 @@ -[General] -Name=Pisi Linux -LogoPath=/usr/share/about-distro/pisilinux.svg -Website=https://www.pisilinux.org diff --git a/desktop/kde6/plasma/kinfocenter-kf6/files/pisilinux-kinfocenter.diff b/desktop/kde6/plasma/kinfocenter-kf6/files/pisilinux-kinfocenter.diff deleted file mode 100755 index 4dd3ead9ee..0000000000 --- a/desktop/kde6/plasma/kinfocenter-kf6/files/pisilinux-kinfocenter.diff +++ /dev/null @@ -1,91 +0,0 @@ -diff --git a/Modules/infosummary/infosum.cpp b/Modules/infosummary/infosum.cpp -index e58beb0..02f000c 100644 ---- a/Modules/infosummary/infosum.cpp -+++ b/Modules/infosummary/infosum.cpp -@@ -61,12 +61,12 @@ void InfoSumPlugin::createDisplay() - void InfoSumPlugin::createOsBox() - { - DefaultBoxWidget *osWidget = new DefaultBoxWidget(); -- osWidget->setIcon(QIcon::fromTheme(QStringLiteral("kde"))); -+ osWidget->setIcon(QIcon::fromTheme(QStringLiteral("PisiLinux"))); - osWidget->setLabelTitles(i18n("OS Version"),i18n("KDE Plasma Version"), i18n("Hostname")); - - OsDepInfo *osInfo = new OsDepInfo(); - -- osWidget->setLabelOne(osInfo->osVersion()); -+ osWidget->setLabelOne(osInfo->osVersion()+'\n'+osInfo->distroName()); - osWidget->setLabelTwo(QString(PLASMA_VERSION_STRING)); - osWidget->setLabelThree(osInfo->hostName()); - osWidget->setWhatsThis(i18nc("OS whats this","This shows information about your Operating System")); -diff --git a/Modules/infosummary/osdepinfo.cpp b/Modules/infosummary/osdepinfo.cpp -index 34afecc..8b7043f 100644 ---- a/Modules/infosummary/osdepinfo.cpp -+++ b/Modules/infosummary/osdepinfo.cpp -@@ -37,6 +37,11 @@ const QString OsDepInfo::osVersion() - return m_osVersion; - } - -+const QString OsDepInfo::distroName() -+{ -+ return m_distroName; -+} -+ - #if defined(Q_OS_UNIX) - #include "osdepinfo_unix.cpp" - #else -@@ -50,6 +55,7 @@ void OsDepInfo::setDepInfo() - { - m_osVersion.clear(); - m_hostName.clear(); -+ m_distroName.clear(); - } - - #endif // Q_OS_UNIX -diff --git a/Modules/infosummary/osdepinfo.h b/Modules/infosummary/osdepinfo.h -index 3452e8b..564a86c 100644 ---- a/Modules/infosummary/osdepinfo.h -+++ b/Modules/infosummary/osdepinfo.h -@@ -32,12 +32,14 @@ class OsDepInfo - - const QString hostName(); - const QString osVersion(); -+ const QString distroName(); - - private: - void setDepInfo(); - - QString m_hostName; - QString m_osVersion; -+ QString m_distroName; - }; - - #endif //OSDEPINFO -diff --git a/Modules/infosummary/osdepinfo_unix.cpp b/Modules/infosummary/osdepinfo_unix.cpp -index d237337..3971945 100644 ---- a/Modules/infosummary/osdepinfo_unix.cpp -+++ b/Modules/infosummary/osdepinfo_unix.cpp -@@ -23,6 +23,18 @@ - #include "osdepinfo.h" - - #include -+#include -+#include -+#include -+ -+QString getDistro() -+{ -+ kconfig-kf6 osRelease( "/etc/os-release", kconfig-kf6::SimpleConfig ); -+ kconfig-kf6Group osR( &osRelease, "" ); -+ QString pretty = osR.readEntry("PRETTY_NAME"); -+ pretty.remove('"'); -+ return(pretty); -+} - - void OsDepInfo::setDepInfo() - { -@@ -31,4 +43,5 @@ void OsDepInfo::setDepInfo() - - m_osVersion = QString(unixInfo.sysname) + ' ' + QString(unixInfo.release); - m_hostName = QString(unixInfo.nodename); -+ m_distroName = getDistro(); - } diff --git a/desktop/kde6/plasma/kinfocenter-kf6/files/pisilinux.svg b/desktop/kde6/plasma/kinfocenter-kf6/files/pisilinux.svg deleted file mode 100755 index acf99bcaea..0000000000 --- a/desktop/kde6/plasma/kinfocenter-kf6/files/pisilinux.svg +++ /dev/null @@ -1,535 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/desktop/kde6/plasma/kinfocenter-kf6/pspec.xml b/desktop/kde6/plasma/kinfocenter-kf6/pspec.xml deleted file mode 100755 index bd7ec2c24a..0000000000 --- a/desktop/kde6/plasma/kinfocenter-kf6/pspec.xml +++ /dev/null @@ -1,253 +0,0 @@ - - - - - kinfocenter-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 info center - kde6 Utility that provides information about a computer system. - mirrors://kde/stable/plasma/6.2.5/kinfocenter-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - kcmutils-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - clinfo - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kpackage-kf6-devel - kservice-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - libraw1394-devel - libX11-devel - mesa-glu-devel - mesa-devel - pciutils-devel - kpipewire-kf6-devel - libplasma-kf6-devel - solid-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kwayland-kf6-devel - docbook-xsl - extra-cmake-modules-kf6 - kirigami-kf6-devel - libglvnd-devel - system-settings-kf6 - vulkan-tools - wayland-utils - util-linux - libusb-devel - mesa-demos - mesa-utils - fwupd-devel - xorg-app-devel - - - - - kinfocenter-kf6 - - kcmutils-kf6 - kcompletion-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kdeclarative-kf6 - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - kservice-kf6 - kwayland-kf6 - kwidgetsaddons-kf6 - kxmlgui-kf6 - kcrash-kf6 - libraw1394 - libX11 - mesa-glu - mesa - clinfo - pciutils - kwindowsystem-kf6 - qt6-base - qt6-qdbusviewer - qt6-declarative - solid-kf6 - libglvnd - kirigami-kf6 - system-settings-kf6 - wayland-utils - libgcc - libusb - mesa-demos - mesa - mesa-utils - aha - fwupd - vulkan-tools - kpipewire-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/share/about-distro - - - kcm-about-distrorc - pisilinux.svg - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kmenuedit-kf6/actions.py b/desktop/kde6/plasma/kmenuedit-kf6/actions.py deleted file mode 100755 index e25c96a839..0000000000 --- a/desktop/kde6/plasma/kmenuedit-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/kmenuedit-kf6/pspec.xml b/desktop/kde6/plasma/kmenuedit-kf6/pspec.xml deleted file mode 100755 index 0eed80a4da..0000000000 --- a/desktop/kde6/plasma/kmenuedit-kf6/pspec.xml +++ /dev/null @@ -1,211 +0,0 @@ - - - - - kmenuedit-kf6 - https://www.kde.org - - Pisi Linux admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Provides the interface and basic tools for the KDE workspace - Provides the interface and basic tools for the KDE workspace - mirrors://kde/stable/plasma/6.2.5/kmenuedit-6.2.5.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - kglobalaccel-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kxmlgui-kf6-devel - sonnet-kf6-devel - - kitemmodels-kf6-devel - - kunitconversion-kf6-devel - - docbook-xsl - extra-cmake-modules-kf6 - kitemviews-kf6-devel - - - - - kmenuedit-kf6 - - qt6-base - libgcc - kconfig-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kdbusaddons-kf6 - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - kxmlgui-kf6 - sonnet-kf6 - kglobalaccel-kf6 - kitemviews-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild qt6. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kpipewire-kf6/actions.py b/desktop/kde6/plasma/kpipewire-kf6/actions.py deleted file mode 100644 index 9cb5146c65..0000000000 --- a/desktop/kde6/plasma/kpipewire-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/kpipewire-kf6/pspec.xml b/desktop/kde6/plasma/kpipewire-kf6/pspec.xml deleted file mode 100644 index fe4c185420..0000000000 --- a/desktop/kde6/plasma/kpipewire-kf6/pspec.xml +++ /dev/null @@ -1,220 +0,0 @@ - - - - - kpipewire-kf6 - https://kde.org/plasma-desktop-kf6/ - - PisiLinux Community - admins@pisilinux.org - - LGPLv3 - library - Components relating to pipewire use in Plasma - kpipewire-kf6 - Components relating to pipewire use in Plasma - https://download.kde.org/stable/plasma/6.2.5/kpipewire-6.2.5.tar.xz - - mesa-devel - libva-devel - ki18n-kf6-devel - ffmpeg-devel - libdrm-devel - libepoxy-devel - kwayland-kf6-devel - pipewire-devel - qt6-base-devel - kcoreaddons-kf6-devel - qt6-wayland-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - plasma-wayland-protocols-kf6 - - - - - - kpipewire-kf6 - - mesa - libva - ki18n-kf6 - ffmpeg - libdrm - libepoxy - pipewire - qt6-base - kcoreaddons-kf6 - qt6-declarative - - - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - - - kpipewire-kf6-devel - Development files for kpipewire-kf6 - - kpipewire-kf6 - pipewire-devel - libepoxy-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-27 - 6.1.5 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kpipewire-kf6/translations.xml b/desktop/kde6/plasma/kpipewire-kf6/translations.xml deleted file mode 100644 index 879f2735e9..0000000000 --- a/desktop/kde6/plasma/kpipewire-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kpipewire-kf6 - Components relating to pipewire use in Plasma - Components relating to pipewire use in Plasma - - diff --git a/desktop/kde6/plasma/kscreen-kf6/actions.py b/desktop/kde6/plasma/kscreen-kf6/actions.py deleted file mode 100755 index 3fb8808c56..0000000000 --- a/desktop/kde6/plasma/kscreen-kf6/actions.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/lib/systemd") - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/kscreen-kf6/pspec.xml b/desktop/kde6/plasma/kscreen-kf6/pspec.xml deleted file mode 100755 index 058882b0a0..0000000000 --- a/desktop/kde6/plasma/kscreen-kf6/pspec.xml +++ /dev/null @@ -1,209 +0,0 @@ - - - - - kscreen-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Provides the interface and basic tools for the KDE workspace - Provides the interface and basic tools for the KDE workspace - mirrors://kde/stable/plasma/6.2.5/kscreen-6.2.5.tar.xz - - qt6-base-devel - qt6-sensors-devel - qt6-declarative-devel - kglobalaccel-kf6-devel - libkscreen-kf6-devel - layer-shell-qt-kf6-devel - kconfigwidgets-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kwidgetsaddons-kf6-devel - kconfig-kf6-devel - kdoctools-kf6-devel - kxmlgui-kf6-devel - kiconthemes-kf6-devel - mesa-devel - extra-cmake-modules-kf6 - libplasma-kf6-devel - kdeclarative-kf6-devel - kcmutils-kf6-devel - libXi-devel - ksvg-kf6-devel - kwindowsystem-kf6-devel - - - - - kscreen-kf6 - - qt6-base - qt6-sensors - libgcc - libkscreen-kf6 - qt6-declarative - kconfig-kf6 - kcoreaddons-kf6 - kglobalaccel-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kdbusaddons-kf6 - ki18n-kf6 - kxmlgui-kf6 - kdeclarative-kf6 - kcmutils-kf6 - libplasma-kf6 - kwindowsystem-kf6 - libXi - libX11 - libxcb - layer-shell-qt-kf6 - ksvg-kf6 - - - /usr/share - /etc/xdg - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kscreenlocker-kf6/actions.py b/desktop/kde6/plasma/kscreenlocker-kf6/actions.py deleted file mode 100755 index d64342d45a..0000000000 --- a/desktop/kde6/plasma/kscreenlocker-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("COPYING") diff --git a/desktop/kde6/plasma/kscreenlocker-kf6/files/no-autolock.patch b/desktop/kde6/plasma/kscreenlocker-kf6/files/no-autolock.patch deleted file mode 100644 index 6bccd2d90d..0000000000 --- a/desktop/kde6/plasma/kscreenlocker-kf6/files/no-autolock.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/kcfg/kscreenlocker-kf6settings.kcfg b/kcfg/kscreenlocker-kf6settings.kcfg ---- a/kcfg/kscreenlocker-kf6settings.kcfg 2018-05-01 15:48:58.000000000 +0300 -+++ b/kcfg/kscreenlocker-kf6settings.kcfg 2018-09-29 16:30:26.586903201 +0300 -@@ -6,7 +6,7 @@ - - - -- true -+ false - - Sets whether the screen will be locked after the specified time. - diff --git a/desktop/kde6/plasma/kscreenlocker-kf6/pspec.xml b/desktop/kde6/plasma/kscreenlocker-kf6/pspec.xml deleted file mode 100755 index 63757d7b0b..0000000000 --- a/desktop/kde6/plasma/kscreenlocker-kf6/pspec.xml +++ /dev/null @@ -1,262 +0,0 @@ - - - - - kscreenlocker-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Library and components for secure lock screen architecture. - Library and components for secure lock screen architecture. - mirrors://kde/stable/plasma/6.2.5/kscreenlocker-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - libX11-devel - libxcb-devel - kio-kf6-devel - kcrash-kf6-devel - ki18n-kf6-devel - knotifications-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - solid-kf6-devel - kglobalaccel-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kdoctools-kf6-devel - kidletime-kf6-devel - kdeclarative-kf6-devel - kcmutils-kf6-devel - ksvg-kf6-devel - kwayland-kf6-devel - libXi-devel - ktextwidgets-kf6-devel - pam-devel - libseccomp-devel - libplasma-kf6-devel - extra-cmake-modules-kf6 - ConsoleKit-devel - wayland-protocols-devel - xcb-util-keysyms-devel - wayland-devel - wayland-client - wayland-server - wayland-cursor - libXcursor-devel - libkscreen-kf6-devel - layer-shell-qt-kf6-devel - plasma-wayland-protocols-kf6 - - - - - - - - kscreenlocker-kf6 - - pam - libXi - qt6-base - libgcc - ksvg-kf6 - ki18n-kf6 - kcrash-kf6 - libX11 - libxcb - kconfig-kf6 - kcmutils-kf6 - kxmlgui-kf6 - kpackage-kf6 - kwayland-kf6 - kidletime-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - kglobalaccel-kf6 - kwindowsystem-kf6 - libseccomp - kio-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - wayland-client - wayland-server - ktextwidgets-kf6 - libplasma-kf6 - qt6-declarative - libkscreen-kf6 - layer-shell-qt-kf6 - xcb-util-keysyms - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kscreenlocker-kf6-devel - Development files for kscreenlocker-kf6 - - qt6-base-devel - - - - - layer-shell-qt-kf6-devel - kscreenlocker-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/ksshaskpass-kf6/actions.py b/desktop/kde6/plasma/ksshaskpass-kf6/actions.py deleted file mode 100755 index e25c96a839..0000000000 --- a/desktop/kde6/plasma/ksshaskpass-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/ksshaskpass-kf6/files/ksshaskpass-kf6.sh b/desktop/kde6/plasma/ksshaskpass-kf6/files/ksshaskpass-kf6.sh deleted file mode 100755 index 5ae8f58171..0000000000 --- a/desktop/kde6/plasma/ksshaskpass-kf6/files/ksshaskpass-kf6.sh +++ /dev/null @@ -1,2 +0,0 @@ -test -f /usr/bin/ksshaskpass-kf6 && export SSH_ASKPASS="/usr/bin/ksshaskpass-kf6" - diff --git a/desktop/kde6/plasma/ksshaskpass-kf6/pspec.xml b/desktop/kde6/plasma/ksshaskpass-kf6/pspec.xml deleted file mode 100755 index 6efe0aa24c..0000000000 --- a/desktop/kde6/plasma/ksshaskpass-kf6/pspec.xml +++ /dev/null @@ -1,183 +0,0 @@ - - - - - ksshaskpass-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - ssh-add helper that uses kwallet-kf6 and kpassworddialog - ssh-add helper that uses kwallet-kf6 and kpassworddialog - mirrors://kde/stable/plasma/6.2.5/ksshaskpass-6.2.5.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kwallet-kf6-devel - kwidgetsaddons-kf6-devel - libxslt - docbook-xsl - extra-cmake-modules-kf6 - - - - - ksshaskpass-kf6 - - qt6-base - libgcc - kcoreaddons-kf6 - kwidgetsaddons-kf6 - ki18n-kf6 - kwallet-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/man - /usr/share/doc - - - ksshaskpass-kf6.sh - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/ksystemstats-kf6/actions.py b/desktop/kde6/plasma/ksystemstats-kf6/actions.py deleted file mode 100644 index 30bbb39779..0000000000 --- a/desktop/kde6/plasma/ksystemstats-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/lib/systemd") - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/plasma/ksystemstats-kf6/pspec.xml b/desktop/kde6/plasma/ksystemstats-kf6/pspec.xml deleted file mode 100644 index bd9e63ddd2..0000000000 --- a/desktop/kde6/plasma/ksystemstats-kf6/pspec.xml +++ /dev/null @@ -1,197 +0,0 @@ - - - - - ksystemstats-kf6 - https://kde.org/plasma-desktop-kf6/ - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv3 - library - ksystemstats-kf6 is a daemon that collects statistics about the running system - ksystemstats-kf6, çalışan sistemle ilgili istatistikleri toplayan bir arka plan programıdır. - https://download.kde.org/stable/plasma/6.2.5/ksystemstats-6.2.5.tar.xz - - kio-kf6-devel - eudev-devel - ki18n-kf6-devel - libnl-devel - solid-kf6-devel - libgcc - qt6-base-devel - lm_sensors-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - libksysguard-kf6-devel - kiconthemes-kf6-devel - libnsl-devel - libtirpc-devel - NetworkManager-devel - networkmanager-qt-kf6-devel - extra-cmake-modules-kf6 - - - - - - ksystemstats-kf6 - - kio-kf6 - eudev - ki18n-kf6 - libnl - solid-kf6 - libgcc - qt6-base - lm_sensors - kcoreaddons-kf6 - kdbusaddons-kf6 - libksysguard-kf6 - networkmanager-qt-kf6 - - - /usr/bin - /usr/lib - /usr/share/dbus-1 - /usr/share/locale - /usr/share/doc - --> - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/ksystemstats-kf6/translations.xml b/desktop/kde6/plasma/ksystemstats-kf6/translations.xml deleted file mode 100644 index 6fdfc2f1b7..0000000000 --- a/desktop/kde6/plasma/ksystemstats-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - ksystemstats-kf6 - ksystemstats-kf6 is a daemon that collects statistics about the running system - ksystemstats-kf6, çalışan sistemle ilgili istatistikleri toplayan bir arka plan programıdır. - - diff --git a/desktop/kde6/plasma/kwallet-pam-kf6/actions.py b/desktop/kde6/plasma/kwallet-pam-kf6/actions.py deleted file mode 100755 index 044255b85e..0000000000 --- a/desktop/kde6/plasma/kwallet-pam-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - #pisitools.dodoc("COPYING*") diff --git a/desktop/kde6/plasma/kwallet-pam-kf6/pspec.xml b/desktop/kde6/plasma/kwallet-pam-kf6/pspec.xml deleted file mode 100755 index e80d7aa4f2..0000000000 --- a/desktop/kde6/plasma/kwallet-pam-kf6/pspec.xml +++ /dev/null @@ -1,171 +0,0 @@ - - - - - kwallet-pam-kf6 - https://projects.kde.org/kwallet-pam-kf6 - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kwallet-kf6 PAM integration. - kwallet-kf6 PAM integration. - mirrors://kde/stable/plasma/6.2.5/kwallet-pam-6.2.5.tar.xz - - socat - pam-devel - kwallet-kf6-devel - libgcrypt-devel - extra-cmake-modules-kf6 - qt6-base-devel - - - - - kwallet-pam-kf6 - - pam - socat - qt6-base - libgcrypt - - - /etc/xdg/autostart - /lib - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kwayland-integration-kf6/actions.py b/desktop/kde6/plasma/kwayland-integration-kf6/actions.py deleted file mode 100755 index e9d5d86c61..0000000000 --- a/desktop/kde6/plasma/kwayland-integration-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde5 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde5.configure("-DQT_MAJOR_VERSION=6") - -def build(): - kde5.make() - -def install(): - kde5.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/kwayland-integration-kf6/pspec.xml b/desktop/kde6/plasma/kwayland-integration-kf6/pspec.xml deleted file mode 100755 index 267aeaa2c5..0000000000 --- a/desktop/kde6/plasma/kwayland-integration-kf6/pspec.xml +++ /dev/null @@ -1,193 +0,0 @@ - - - - - kwayland-integration-kf6 - https://www.kde.org - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv3 - library - Provides integration plugins for various KDE frameworks for the wayland windowing system - Provides integration plugins for various KDE frameworks for the wayland windowing system - mirrors://kde/stable/plasma/6.2.5/kwayland-integration-6.2.5.tar.xz - - kguiaddons5-devel - kwayland5-devel - qt5-base-devel - qt6-wayland-devel - qt6-wayland-devel - kwindowsystem5-devel - kidletime5-devel - extra-cmake-modules - qt5-wayland-devel - wayland-devel - wayland-client - wayland-cursor - wayland-server - wayland-protocols-devel - plasma-wayland-protocols - - - - - kwayland-integration-kf6 - - kwayland5 - kidletime5 - kwindowsystem5 - libgcc - qt5-base - kguiaddons5 - qt5-wayland - wayland - wayland-client - wayland-cursor - wayland-server - - - /usr/lib - /etc/xdg/kwindowsystem-kf6.kwayland-kf6.categories - /usr/share - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kwayland-kf6/actions.py b/desktop/kde6/plasma/kwayland-kf6/actions.py deleted file mode 100755 index 0745a31bc2..0000000000 --- a/desktop/kde6/plasma/kwayland-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - #pisitools.dodoc("COPYING.LIB") diff --git a/desktop/kde6/plasma/kwayland-kf6/pspec.xml b/desktop/kde6/plasma/kwayland-kf6/pspec.xml deleted file mode 100755 index 1c286e7d4b..0000000000 --- a/desktop/kde6/plasma/kwayland-kf6/pspec.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - - - kwayland-kf6 - https://www.kde.org - - Stefan Gronewold(groni) - groni@pisilinux.org - - LGPLv3 - library - Qt-style Client and Server library wrapper for the Wayland libraries - Qt-style Client and Server library wrapper for the Wayland libraries - mirrors://kde/stable/plasma/6.2.5/kwayland-6.2.5.tar.xz - - qt6-base-devel - qt6-wayland-devel - libglvnd-devel - wayland-devel - wayland-protocols-devel - mesa-devel - extra-cmake-modules-kf6 - plasma-wayland-protocols-kf6 - - - - - kwayland-kf6 - - qt6-base - qt6-wayland - libglvnd - wayland-client - wayland-server - - - /etc/xdg - /usr/lib - /usr/share/config - /usr/share/doc - /usr/share/qlogging-categories6 - /usr/share/qlogging-categories/org_kde_kwayland.categories - - - - kwayland-kf6-devel - - qt6-base-devel - kwayland-kf6 - - - /usr/lib/cmake - /usr/include - /usr/lib/pkgconfig - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release. - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kwayland-kf6/translations.xml b/desktop/kde6/plasma/kwayland-kf6/translations.xml deleted file mode 100755 index 37d9f2f975..0000000000 --- a/desktop/kde6/plasma/kwayland-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kde6-kwayland-kf6 - Qt-style Client and Server library wrapper for the Wayland libraries - Qt-style Client and Server library wrapper for the Wayland libraries - - diff --git a/desktop/kde6/plasma/kwin-kf6/actions.py b/desktop/kde6/plasma/kwin-kf6/actions.py deleted file mode 100755 index 7637bd7bc1..0000000000 --- a/desktop/kde6/plasma/kwin-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("rm -rf po/id") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/lib/systemd") diff --git a/desktop/kde6/plasma/kwin-kf6/files/4692.patch b/desktop/kde6/plasma/kwin-kf6/files/4692.patch deleted file mode 100644 index 35acf83bd6..0000000000 --- a/desktop/kde6/plasma/kwin-kf6/files/4692.patch +++ /dev/null @@ -1,206 +0,0 @@ -From f3e6d3ca196aaef28478c27fd6a3caaed3cdbdff Mon Sep 17 00:00:00 2001 -From: Vlad Zahorodnii -Date: Wed, 22 Nov 2023 15:05:52 +0200 -Subject: [PATCH 1/4] Ignore decoration changes of closed windows - -Ideally the decoration of a closed window should not change. However, -it seems like it can happen when resuming the session. - -When switching to another VT, the touchpad input device is removed, but -the touch input device is still kept on my machine. This results in -the tablet mode changing temporarily and triggering recalculation of new -borders in breeze decoration. It's a no-no thing to do if the window is -closed. We need to guard against this case. But in long term, we need to -reroute all decoration state updates through kwin so it can block state -updates when the window is closed. It's also needed for double buffered -state. - -How to improve handling of tablet mode detection when switching between -VTs needs a separate investigation. - -CCBUG: 477166 ---- - src/window.cpp | 30 +++++++++++++++++++++++------- - src/x11window.cpp | 18 +++++++++++++++--- - 2 files changed, 38 insertions(+), 10 deletions(-) - -diff --git a/src/window.cpp b/src/window.cpp -index d60ff3db325..be9ca43b2f1 100644 ---- a/src/window.cpp -+++ b/src/window.cpp -@@ -2625,20 +2625,32 @@ void Window::setDecoration(std::shared_ptr decoration) - } - if (decoration) { - QMetaObject::invokeMethod(decoration.get(), QOverload<>::of(&KDecoration2::Decoration::update), Qt::QueuedConnection); -- connect(decoration.get(), &KDecoration2::Decoration::shadowChanged, this, &Window::updateShadow); -- connect(decoration.get(), &KDecoration2::Decoration::bordersChanged, -- this, &Window::updateDecorationInputShape); -- connect(decoration.get(), &KDecoration2::Decoration::resizeOnlyBordersChanged, -- this, &Window::updateDecorationInputShape); -+ connect(decoration.get(), &KDecoration2::Decoration::shadowChanged, this, [this]() { -+ if (!isDeleted()) { -+ updateShadow(); -+ } -+ }); - connect(decoration.get(), &KDecoration2::Decoration::bordersChanged, this, [this]() { -+ if (isDeleted()) { -+ return; -+ } - GeometryUpdatesBlocker blocker(this); - const QRectF oldGeometry = moveResizeGeometry(); - if (!isShade()) { - checkWorkspacePosition(oldGeometry); - } -+ updateDecorationInputShape(); -+ }); -+ connect(decoration.get(), &KDecoration2::Decoration::resizeOnlyBordersChanged, this, [this]() { -+ if (!isDeleted()) { -+ updateDecorationInputShape(); -+ } -+ }); -+ connect(decoratedClient()->decoratedClient(), &KDecoration2::DecoratedClient::sizeChanged, this, [this]() { -+ if (!isDeleted()) { -+ updateDecorationInputShape(); -+ } - }); -- connect(decoratedClient()->decoratedClient(), &KDecoration2::DecoratedClient::sizeChanged, -- this, &Window::updateDecorationInputShape); - } - m_decoration.decoration = decoration; - updateDecorationInputShape(); -@@ -3658,6 +3670,10 @@ void Window::sendToOutput(Output *newOutput) - - void Window::checkWorkspacePosition(QRectF oldGeometry, const VirtualDesktop *oldDesktop) - { -+ if (isDeleted()) { -+ qCWarning(KWIN_CORE) << "Window::checkWorkspacePosition: called for a closed window. Consider this a bug"; -+ return; -+ } - if (isDock() || isDesktop() || !isPlaceable()) { - return; - } -diff --git a/src/x11window.cpp b/src/x11window.cpp -index 724f49e0964..8b2fce35f43 100644 ---- a/src/x11window.cpp -+++ b/src/x11window.cpp -@@ -1340,9 +1340,21 @@ void X11Window::createDecoration() - { - std::shared_ptr decoration(Workspace::self()->decorationBridge()->createDecoration(this)); - if (decoration) { -- connect(decoration.get(), &KDecoration2::Decoration::resizeOnlyBordersChanged, this, &X11Window::updateInputWindow); -- connect(decoration.get(), &KDecoration2::Decoration::bordersChanged, this, &X11Window::updateFrameExtents); -- connect(decoratedClient()->decoratedClient(), &KDecoration2::DecoratedClient::sizeChanged, this, &X11Window::updateInputWindow); -+ connect(decoration.get(), &KDecoration2::Decoration::resizeOnlyBordersChanged, this, [this]() { -+ if (!isDeleted()) { -+ updateInputWindow(); -+ } -+ }); -+ connect(decoration.get(), &KDecoration2::Decoration::bordersChanged, this, [this]() { -+ if (!isDeleted()) { -+ updateFrameExtents(); -+ } -+ }); -+ connect(decoratedClient()->decoratedClient(), &KDecoration2::DecoratedClient::sizeChanged, this, [this]() { -+ if (!isDeleted()) { -+ updateInputWindow(); -+ } -+ }); - } - setDecoration(decoration); - --- -GitLab - - -From 4d0d153a579ed3b0bd74b7f4d95539d9e926a271 Mon Sep 17 00:00:00 2001 -From: Vlad Zahorodnii -Date: Wed, 22 Nov 2023 16:23:53 +0200 -Subject: [PATCH 2/4] Always reset tabbox ClientModel if a window is added or - removed - -Otherwise dangling pointers can end up in TabBox::ClientModel. Tabbox is -written with hard model resets in mind. In order to fix it, the client -model has to be rewritten. - -BUG: 477166 ---- - src/workspace.cpp | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/workspace.cpp b/src/workspace.cpp -index db37ade6eea..664fc76d975 100644 ---- a/src/workspace.cpp -+++ b/src/workspace.cpp -@@ -2002,9 +2002,9 @@ void Workspace::setWasUserInteraction() - void Workspace::updateTabbox() - { - #if KWIN_BUILD_TABBOX -- if (m_tabbox->isDisplayed()) { -- m_tabbox->reset(true); -- } -+ // Need to reset the client model even if the task switcher is hidden otherwise there -+ // might be dangling pointers. Consider rewriting client model logic! -+ m_tabbox->reset(true); - #endif - } - --- -GitLab - - -From b40b13b661c44199633d58b43ba571ca92cf30f1 Mon Sep 17 00:00:00 2001 -From: Vlad Zahorodnii -Date: Wed, 22 Nov 2023 18:03:02 +0200 -Subject: [PATCH 3/4] tabbox: Fix ClientModel::createClientList() reinserting - closed windows - ---- - src/tabbox/clientmodel.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/tabbox/clientmodel.cpp b/src/tabbox/clientmodel.cpp -index af3fe4273bf..29f968d5be4 100644 ---- a/src/tabbox/clientmodel.cpp -+++ b/src/tabbox/clientmodel.cpp -@@ -198,7 +198,7 @@ void ClientModel::createClientList(bool partialReset) - // TODO: new clients are not added at correct position - if (partialReset && !m_mutableClientList.isEmpty()) { - Window *firstClient = m_mutableClientList.constFirst(); -- if (firstClient) { -+ if (!firstClient->isDeleted()) { - start = firstClient; - } - } --- -GitLab - - -From 3ffa3ed0d8ab5da79a0d4e2546c157ed317d6aa8 Mon Sep 17 00:00:00 2001 -From: Vlad Zahorodnii -Date: Wed, 22 Nov 2023 18:41:49 +0200 -Subject: [PATCH 4/4] tabbox: Guard against including closed windows when using - stacking order - -Closed windows are present in the stack. If user has selected -"Stacking order" sort order in task switcher KCM, we need to guard -against closed windows in the stack. ---- - src/tabbox/tabbox.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/tabbox/tabbox.cpp b/src/tabbox/tabbox.cpp -index 809c60e682d..2c16009ac42 100644 ---- a/src/tabbox/tabbox.cpp -+++ b/src/tabbox/tabbox.cpp -@@ -171,7 +171,7 @@ bool TabBoxHandlerImpl::checkMultiScreen(Window *client) const - - Window *TabBoxHandlerImpl::clientToAddToList(Window *client) const - { -- if (!client) { -+ if (!client || client->isDeleted()) { - return nullptr; - } - Window *ret = nullptr; --- -GitLab - diff --git a/desktop/kde6/plasma/kwin-kf6/pspec.xml b/desktop/kde6/plasma/kwin-kf6/pspec.xml deleted file mode 100755 index f65c07686f..0000000000 --- a/desktop/kde6/plasma/kwin-kf6/pspec.xml +++ /dev/null @@ -1,397 +0,0 @@ - - - - - kwin-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 window manager - kwin-kf6 is the window manager of the K desktop environment. - mirrors://kde/stable/plasma/6.2.5/kwin-6.2.5.tar.xz - - hwdata - libcanberra-devel - libdisplay-info-devel - kglobalacceld-devel - plasma-activities-kf6-devel - kauth-kf6-devel - ksvg-kf6-devel - kguiaddons-kf6-devel - kcmutils-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdeclarative-kf6-devel - kdecorations-kf6-devel - kdoctools-kf6-devel - kglobalaccel-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - knotifications-kf6-devel - kpackage-kf6-devel - kservice-kf6-devel - ktextwidgets-kf6-devel - kwayland-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - kidletime-kf6-devel - kscreenlocker-kf6-devel - libepoxy-devel - libICE-devel - libSM-devel - libX11-devel - libxcb-devel - libXcursor-devel - libXext-devel - libxkbcommon-devel - libXxf86vm-devel - mesa-devel - fontconfig-devel - freetype-devel - xcb-util-wm-devel - libplasma-kf6-devel - qt6-base-devel - qt6-wayland-devel - qt6-5compat-devel - qt6-declarative-devel - qt6-designer-devel - qt6-multimedia-devel - qt6-sensors-devel - qt6-virtualkeyboard-devel - qt6-svg-devel - wayland-client - wayland-cursor - wayland-devel - xcb-util-image-devel - xcb-util-keysyms-devel - eudev-devel - libinput-devel - xcb-util-cursor-devel - qt6-multimedia - docbook-xsl - libXi-devel - extra-cmake-modules-kf6 - xorg-xwayland-devel - breeze-style-kf6 - libdrm-devel - kirigami-kf6-devel - pipewire-devel - lcms2-devel - krunner-kf6-devel - xcb-util-devel - libqaccessibilityclient-qt6-devel - wayland-protocols-devel - libxcvt-devel - plasma-wayland-protocols-kf6 - - - - - - - - kwin-kf6 - - kwayland-server-kf6 - - - kwayland-server-kf6 - - - lcms2 - hwdata - kglobalacceld - plasma-activities-kf6 - kauth-kf6 - libcap - libxcvt - libglvnd - ksvg-kf6 - kguiaddons-kf6 - kdbusaddons-kf6 - kcmutils-kf6 - kcompletion-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kcoreaddons-kf6 - kcrash-kf6 - wayland - kdeclarative-kf6 - kdecorations-kf6 - kglobalaccel-kf6 - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - knewstuff-kf6 - knotifications-kf6 - kservice-kf6 - kwayland-kf6 - kwidgetsaddons-kf6 - kwindowsystem-kf6 - kxmlgui-kf6 - kscreenlocker-kf6 - kidletime-kf6 - libepoxy - libgcc - libXi - libICE - libSM - libX11 - libxcb - libxkbcommon - mesa - libplasma-kf6 - qt6-base - qt6-declarative - qt6-sensors - qt6-wayland - wayland-cursor - wayland-client - xcb-util-wm - xcb-util-image - xcb-util-keysyms - eudev - kpackage-kf6 - libdrm - libinput - ktextwidgets-kf6 - freetype - fontconfig - xcb-util-cursor - wayland-server - libqaccessibilityclient-qt6 - libdisplay-info - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - kwin-kf6-devel - Development files for kwin-kf6 - - kwayland-kf6-server-devel - - - kwayland-kf6-server-devel - - - kwin-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - kwin-wayland-kf6 - Wayland support for kwin-kf6 - - mesa - libcap - libdrm - kpackage-kf6 - wayland - freetype - pipewire - kidletime-kf6 - fontconfig - kwin-kf6 - - - /usr/bin/kwin_wayland - /usr/lib/systemd/user/plasma-kwin_wayland.service - /usr/lib/qt6/plugins/org.kde.kwin.waylandbackends/kwinWayland*.so - - - kwin-kf6-wayland - - - kwin-kf6-wayland - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-29 - 6.1.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-22 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-14 - 6.0.3 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-28 - 6.0.3.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/kwrited-kf6/actions.py b/desktop/kde6/plasma/kwrited-kf6/actions.py deleted file mode 100755 index e25c96a839..0000000000 --- a/desktop/kde6/plasma/kwrited-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/kwrited-kf6/pspec.xml b/desktop/kde6/plasma/kwrited-kf6/pspec.xml deleted file mode 100755 index fcabb3c371..0000000000 --- a/desktop/kde6/plasma/kwrited-kf6/pspec.xml +++ /dev/null @@ -1,176 +0,0 @@ - - - - - kwrited-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 daemon listening for wall and write messages - kde6 daemon listening for wall and write messages - mirrors://kde/stable/plasma/6.2.5/kwrited-6.2.5.tar.xz - - qt6-base-devel - ki18n-kf6-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - knotifications-kf6-devel - kpty-kf6-devel - - kdbusaddons-kf6-devel - extra-cmake-modules-kf6 - - - - - kwrited-kf6 - - qt6-base - kpty-kf6 - libgcc - kcoreaddons-kf6 - knotifications-kf6 - kdbusaddons-kf6 - - - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/layer-shell-qt-kf6/actions.py b/desktop/kde6/plasma/layer-shell-qt-kf6/actions.py deleted file mode 100644 index 0eef11c64c..0000000000 --- a/desktop/kde6/plasma/layer-shell-qt-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/plasma/layer-shell-qt-kf6/pspec.xml b/desktop/kde6/plasma/layer-shell-qt-kf6/pspec.xml deleted file mode 100644 index 5e0ec6c7a0..0000000000 --- a/desktop/kde6/plasma/layer-shell-qt-kf6/pspec.xml +++ /dev/null @@ -1,196 +0,0 @@ - - - - - layer-shell-qt-kf6 - https://kde.org/plasma-desktop-kf6/ - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv3 - library - Qt component to allow applications to make use of the Wayland wl-layer-shell protocol - Uygulamaların Wayland wl-layer-shell protokolünü kullanmasını sağlayan Qt bileşeni - https://download.kde.org/stable/plasma/6.2.5/layer-shell-qt-6.2.5.tar.xz - - wayland-devel - wayland-client - wayland-cursor - wayland-server - qt6-wayland-devel - qt6-base-devel - extra-cmake-modules-kf6 - wayland-protocols-devel - qt6-declarative-devel - - - - - - layer-shell-qt-kf6 - - libgcc - qt6-base - qt6-wayland - wayland-client - - - /usr/lib - /usr/share/doc - - - - - layer-shell-qt-kf6-devel - Development files for layer-shell-qt-kf6 - - layer-shell-qt-kf6 - - - /usr/include - /usr/lib/cmake - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild qt6 - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/layer-shell-qt-kf6/translations.xml b/desktop/kde6/plasma/layer-shell-qt-kf6/translations.xml deleted file mode 100644 index cee4c5530e..0000000000 --- a/desktop/kde6/plasma/layer-shell-qt-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - layer-shell-qt-kf6 - Qt component to allow applications to make use of the Wayland wl-layer-shell protocol - Uygulamaların Wayland wl-layer-shell protokolünü kullanmasını sağlayan Qt bileşeni - - diff --git a/desktop/kde6/plasma/libkscreen-kf6/actions.py b/desktop/kde6/plasma/libkscreen-kf6/actions.py deleted file mode 100755 index 3b4a45e081..0000000000 --- a/desktop/kde6/plasma/libkscreen-kf6/actions.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/lib/systemd") - - pisitools.dodoc("README.md", "LICENSES/*") diff --git a/desktop/kde6/plasma/libkscreen-kf6/pspec.xml b/desktop/kde6/plasma/libkscreen-kf6/pspec.xml deleted file mode 100755 index 040d41a93e..0000000000 --- a/desktop/kde6/plasma/libkscreen-kf6/pspec.xml +++ /dev/null @@ -1,216 +0,0 @@ - - - - - libkscreen-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 screen management library - Dynamic display management library for KDE - mirrors://kde/stable/plasma/6.2.5/libkscreen-6.2.5.tar.xz - - qt6-base-devel - qt6-wayland-devel - libxcb-devel - doxygen - qt6-linguist - kwayland-kf6-devel - xcb-util-devel - xcb-util-image-devel - xcb-util-keysyms-devel - libXcursor-devel - libXrandr-devel - wayland-devel - wayland-client - wayland-cursor - wayland-server - extra-cmake-modules-kf6 - plasma-wayland-protocols-kf6 - kconfig-kf6-devel - - - - - libkscreen-kf6 - - qt6-base - qt6-wayland - kconfig-kf6 - kwayland-kf6 - libXrandr - libxcb - libgcc - wayland - wayland-client - wayland-cursor - wayland-server - - - /etc/xdg - /usr/bin/kscreen-doctor - /usr/lib/qt5 - /usr/lib - /usr/share/qlogging-categories6/libkscreen.categories - /usr/share/zsh - /usr/share/doc - /usr/share/dbus-1 - /usr/share/locale - - - - - libkscreen-kf6-devel - Development files for libkscreen-kf6 - - qt6-base-devel - libkscreen-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/libksysguard-kf6/actions.py b/desktop/kde6/plasma/libksysguard-kf6/actions.py deleted file mode 100755 index a7464b1612..0000000000 --- a/desktop/kde6/plasma/libksysguard-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/libksysguard-kf6/files/libksysguard_kauth.diff b/desktop/kde6/plasma/libksysguard-kf6/files/libksysguard_kauth.diff deleted file mode 100755 index cd75079f5e..0000000000 --- a/desktop/kde6/plasma/libksysguard-kf6/files/libksysguard_kauth.diff +++ /dev/null @@ -1,339 +0,0 @@ -diff --git a/processcore/CMakeLists.txt b/processcore/CMakeLists.txt -index 9fef4ec..939d055 100644 ---- a/processcore/CMakeLists.txt -+++ b/processcore/CMakeLists.txt -@@ -41,18 +41,18 @@ install( FILES processes.h process.h DESTINATION ${INCLUDE_INSTALL_DIR}/ksysguar - #------ kauth-kf6 stuff - - # Auth example helper --# set(ksysguardprocesslist_helper_srcs --# helper.cpp --# process.cpp --# processes_local_p.cpp --# processes_base_p.cpp) --# --# add_executable(ksysguardprocesslist_helper ${ksysguardprocesslist_helper_srcs}) --# target_link_libraries(ksysguardprocesslist_helper ) --# install(TARGETS ksysguardprocesslist_helper DESTINATION ${LIBEXEC_INSTALL_DIR}) --# --# kauth-kf6_install_helper_files(ksysguardprocesslist_helper org.kde.ksysguard.processlisthelper root) --# kauth-kf6_install_actions(org.kde.ksysguard.processlisthelper actions.actions) --# --# set_target_properties(ksysguardprocesslist_helper PROPERTIES COMPILE_FLAGS "-Wall -ggdb") -+set(ksysguardprocesslist_helper_srcs -+ helper.cpp -+ process.cpp -+ processes_local_p.cpp -+ processes_base_p.cpp) -+ -+add_executable(ksysguardprocesslist_helper ${ksysguardprocesslist_helper_srcs}) -+target_link_libraries(ksysguardprocesslist_helper Qt5::Core KF5::Auth KF5::I18n) -+install(TARGETS ksysguardprocesslist_helper DESTINATION ${kauth-kf6_HELPER_INSTALL_DIR}) -+ -+kauth-kf6_install_helper_files(ksysguardprocesslist_helper org.kde.ksysguard.processlisthelper root) -+kauth-kf6_install_actions(org.kde.ksysguard.processlisthelper actions.actions) -+ -+set_target_properties(ksysguardprocesslist_helper PROPERTIES COMPILE_FLAGS "-Wall -ggdb") - -diff --git a/processcore/helper.cpp b/processcore/helper.cpp -index 6c1f570..c34ab1e 100644 ---- a/processcore/helper.cpp -+++ b/processcore/helper.cpp -@@ -23,24 +23,26 @@ - #include "helper.h" - #include "processes_local_p.h" - -+using namespace kauth-kf6; -+ - KSysGuardProcessListHelper::KSysGuardProcessListHelper() - { - qRegisterMetaType >(); - } - - /* The functions here run as ROOT. So be careful. DO NOT TRUST THE INPUTS TO BE SANE. */ --#define GET_PID(i) parameters.value(QString("pid%1").arg(i), -1).toULongLong(); if(pid < 0) return kauth-kf6::ActionReply::HelperErrorReply; --kauth-kf6::ActionReply KSysGuardProcessListHelper::sendsignal(QVariantMap parameters) { -- kauth-kf6::ActionReply errorReply(kauth-kf6::ActionReply::HelperError); -+#define GET_PID(i) parameters.value(QString("pid%1").arg(i), -1).toULongLong(); if(pid < 0) return ActionReply(ActionReply::HelperErrorType); -+ActionReply KSysGuardProcessListHelper::sendsignal(QVariantMap parameters) { -+ ActionReply reply(ActionReply::HelperErrorType); - if(!parameters.contains("signal")) { -- errorReply.setErrorDescription("Internal error - no signal parameter was passed to the helper"); -- errorReply.setErrorCode(1); -- return errorReply; -+ reply.setErrorDescription("Internal error - no signal parameter was passed to the helper"); -+ reply.setErrorCode(static_cast(1)); -+ return reply; - } - if(!parameters.contains("pidcount")) { -- errorReply.setErrorDescription("Internal error - no pidcount parameter was passed to the helper"); -- errorReply.setErrorCode(2); -- return errorReply; -+ reply.setErrorDescription("Internal error - no pidcount parameter was passed to the helper"); -+ reply.setErrorCode(static_cast(2)); -+ return reply; - } - - KSysGuard::ProcessesLocal processes; -@@ -56,17 +58,17 @@ kauth-kf6::ActionReply KSysGuardProcessListHelper::sendsignal(QVariantMap parameters - success = successForThisPid && success; - } - if(success) { -- return kauth-kf6::ActionReply::SuccessReply; -+ return ActionReply::SuccessReply(); - } else { -- errorReply.setErrorDescription(QString("Could not send signal to: ") + errorList.join(", ")); -- errorReply.setErrorCode(0); -- return errorReply; -+ reply.setErrorDescription(QString("Could not send signal to: ") + errorList.join(", ")); -+ reply.setErrorCode(static_cast(0)); -+ return reply; - } - } - --kauth-kf6::ActionReply KSysGuardProcessListHelper::renice(QVariantMap parameters) { -+ActionReply KSysGuardProcessListHelper::renice(QVariantMap parameters) { - if(!parameters.contains("nicevalue") || !parameters.contains("pidcount")) -- return kauth-kf6::ActionReply::HelperErrorReply; -+ return ActionReply(ActionReply::HelperErrorType); - - KSysGuard::ProcessesLocal processes; - int niceValue = qvariant_cast(parameters.value("nicevalue")); -@@ -77,14 +79,14 @@ kauth-kf6::ActionReply KSysGuardProcessListHelper::renice(QVariantMap parameters) { - success = processes.setNiceness(pid, niceValue) && success; - } - if(success) -- return kauth-kf6::ActionReply::SuccessReply; -+ return ActionReply::SuccessReply(); - else -- return kauth-kf6::ActionReply::HelperErrorReply; -+ return ActionReply(ActionReply::HelperErrorType); - } - --kauth-kf6::ActionReply KSysGuardProcessListHelper::changeioscheduler(QVariantMap parameters) { -+ActionReply KSysGuardProcessListHelper::changeioscheduler(QVariantMap parameters) { - if(!parameters.contains("ioScheduler") || !parameters.contains("ioSchedulerPriority") || !parameters.contains("pidcount")) -- return kauth-kf6::ActionReply::HelperErrorReply; -+ return ActionReply(ActionReply::HelperErrorType); - - KSysGuard::ProcessesLocal processes; - int ioScheduler = qvariant_cast(parameters.value("ioScheduler")); -@@ -96,14 +98,14 @@ kauth-kf6::ActionReply KSysGuardProcessListHelper::changeioscheduler(QVariantMap par - success = processes.setIoNiceness(pid, ioScheduler, ioSchedulerPriority) && success; - } - if(success) -- return kauth-kf6::ActionReply::SuccessReply; -+ return ActionReply::SuccessReply(); - else -- return kauth-kf6::ActionReply::HelperErrorReply; -+ return ActionReply(ActionReply::HelperErrorType); - - } --kauth-kf6::ActionReply KSysGuardProcessListHelper::changecpuscheduler(QVariantMap parameters) { -+ActionReply KSysGuardProcessListHelper::changecpuscheduler(QVariantMap parameters) { - if(!parameters.contains("cpuScheduler") || !parameters.contains("cpuSchedulerPriority") || !parameters.contains("pidcount")) -- return kauth-kf6::ActionReply::HelperErrorReply; -+ return ActionReply(ActionReply::HelperErrorType); - - KSysGuard::ProcessesLocal processes; - int cpuScheduler = qvariant_cast(parameters.value("cpuScheduler")); -@@ -116,9 +118,9 @@ kauth-kf6::ActionReply KSysGuardProcessListHelper::changecpuscheduler(QVariantMap pa - success = processes.setScheduler(pid, cpuScheduler, cpuSchedulerPriority) && success; - } - if(success) -- return kauth-kf6::ActionReply::SuccessReply; -+ return ActionReply::SuccessReply(); - else -- return kauth-kf6::ActionReply::HelperErrorReply; -+ return ActionReply(ActionReply::HelperErrorType); - - } - kauth-kf6_HELPER_MAIN("org.kde.ksysguard.processlisthelper", KSysGuardProcessListHelper) -diff --git a/processcore/processes_linux_p.cpp b/processcore/processes_linux_p.cpp -index 65b8dfd..0cff0e8 100644 ---- a/processcore/processes_linux_p.cpp -+++ b/processcore/processes_linux_p.cpp -@@ -22,7 +22,7 @@ - #include "processes_local_p.h" - #include "process.h" - --#include -+#include - - #include - #include -diff --git a/processui/ksysguardprocesslist.cpp b/processui/ksysguardprocesslist.cpp -index 1651a0a..ba9d8c9 100644 ---- a/processui/ksysguardprocesslist.cpp -+++ b/processui/ksysguardprocesslist.cpp -@@ -48,6 +48,9 @@ - #include //For SIGTERM - - #include -+#include -+#include -+#include - #include - #include - #include -@@ -188,7 +191,7 @@ struct KSysGuardProcessListPrivate { - int totalRowCount(const QModelIndex &parent) const; - - /** Helper function to setup 'action' with the given pids */ -- void setupkauth-kf6Action(kauth-kf6::Action *action, const QList & pids) const; -+ void setupkauth-kf6Action(kauth-kf6::Action &action, const QList & pids) const; - - /** fire a timer event if we are set to use our internal timer*/ - void fireTimerEvent(); -@@ -392,15 +395,15 @@ int KSysGuardProcessListPrivate::totalRowCount(const QModelIndex &parent ) const - return total; - } - --void KSysGuardProcessListPrivate::setupkauth-kf6Action(kauth-kf6::Action *action, const QList & pids) const -+void KSysGuardProcessListPrivate::setupkauth-kf6Action(kauth-kf6::Action &action, const QList & pids) const - { -- action->setHelperId("org.kde.ksysguard.processlisthelper"); -+ action.setHelperId("org.kde.ksysguard.processlisthelper"); - - int processCount = pids.count(); - for(int i = 0; i < processCount; i++) { -- action->addArgument(QString("pid%1").arg(i), pids[i]); -+ action.addArgument(QString("pid%1").arg(i), pids[i]); - } -- action->addArgument("pidcount", processCount); -+ action.addArgument("pidcount", processCount); - } - void KSysGuardProcessList::selectionChanged() - { -@@ -1023,23 +1026,19 @@ bool KSysGuardProcessList::reniceProcesses(const QList &pids, int nic - - - #warning kauth-kf6 needs porting, but docu is not adjusted, no idea how to do it --#if 0 -- kauth-kf6::Action *action = new kauth-kf6::Action("org.kde.ksysguard.processlisthelper.renice"); -- action->setParentWidget(window()); -+ kauth-kf6::Action action("org.kde.ksysguard.processlisthelper.renice"); -+ action.setParentWidget(window()); - d->setupkauth-kf6Action( action, unreniced_pids); -- action->addArgument("nicevalue", niceValue); -- kauth-kf6::ActionReply reply = action->execute(); -+ action.addArgument("nicevalue", niceValue); -+ kauth-kf6::ExecuteJob *job = action.execute(); - -- if (reply == kauth-kf6::ActionReply::SuccessReply) { -+ if (job->exec()) { - updateList(); -- delete action; -- } else if (reply != kauth-kf6::ActionReply::UserCancelled && reply != kauth-kf6::ActionReply::AuthorizationDenied) { -+ } else if (!job->exec()) { - KMessageBox::sorry(this, i18n("You do not have the permission to renice the process and there " -- "was a problem trying to run as root. Error %1 %2", reply.errorCode(), reply.errorDescription())); -- delete action; -+ "was a problem trying to run as root. Error %1 %2", job->error(), job->errorString())); - return false; - } --#endif - return true; - } - -@@ -1189,26 +1188,22 @@ bool KSysGuardProcessList::changeIoScheduler(const QList< long long> &pids, KSys - if(!d->mModel.isLocalhost()) return false; //We can't use kauth-kf6 to affect non-localhost processes - - #warning kauth-kf6 needs porting, but docu is not adjusted, no idea how to do it --#if 0 -- kauth-kf6::Action *action = new kauth-kf6::Action("org.kde.ksysguard.processlisthelper.changeioscheduler"); -- action->setParentWidget(window()); -+ kauth-kf6::Action action("org.kde.ksysguard.processlisthelper.changeioscheduler"); -+ action.setParentWidget(window()); - - d->setupkauth-kf6Action( action, unchanged_pids); -- action->addArgument("ioScheduler", (int)newIoSched); -- action->addArgument("ioSchedulerPriority", newIoSchedPriority); -+ action.addArgument("ioScheduler", (int)newIoSched); -+ action.addArgument("ioSchedulerPriority", newIoSchedPriority); - -- kauth-kf6::ActionReply reply = action->execute(); -+ kauth-kf6::ExecuteJob *job = action.execute(); - -- if (reply == kauth-kf6::ActionReply::SuccessReply) { -+ if (job->exec()) { - updateList(); -- delete action; -- } else if (reply != kauth-kf6::ActionReply::UserCancelled && reply != kauth-kf6::ActionReply::AuthorizationDenied) { -+ } else if (!job->exec()) { - KMessageBox::sorry(this, i18n("You do not have the permission to change the I/O priority of the process and there " -- "was a problem trying to run as root. Error %1 %2", reply.errorCode(), reply.errorDescription())); -- delete action; -+ "was a problem trying to run as root. Error %1 %2", job->error(), job->errorString())); - return false; - } --#endif - return true; - } - -@@ -1226,24 +1221,20 @@ bool KSysGuardProcessList::changeCpuScheduler(const QList< long long> &pids, KSy - if(!d->mModel.isLocalhost()) return false; //We can't use kauth-kf6 to affect non-localhost processes - - #warning kauth-kf6 needs porting, but docu is not adjusted, no idea how to do it --#if 0 -- kauth-kf6::Action *action = new kauth-kf6::Action("org.kde.ksysguard.processlisthelper.changecpuscheduler"); -- action->setParentWidget(window()); -+ kauth-kf6::Action action("org.kde.ksysguard.processlisthelper.changecpuscheduler"); -+ action.setParentWidget(window()); - d->setupkauth-kf6Action( action, unchanged_pids); -- action->addArgument("cpuScheduler", (int)newCpuSched); -- action->addArgument("cpuSchedulerPriority", newCpuSchedPriority); -- kauth-kf6::ActionReply reply = action->execute(); -+ action.addArgument("cpuScheduler", (int)newCpuSched); -+ action.addArgument("cpuSchedulerPriority", newCpuSchedPriority); -+ kauth-kf6::ExecuteJob *job = action.execute(); - -- if (reply == kauth-kf6::ActionReply::SuccessReply) { -+ if (job->exec()) { - updateList(); -- delete action; -- } else if (reply != kauth-kf6::ActionReply::UserCancelled && reply != kauth-kf6::ActionReply::AuthorizationDenied) { -+ } else if (!job->exec()) { - KMessageBox::sorry(this, i18n("You do not have the permission to change the CPU Scheduler for the process and there " -- "was a problem trying to run as root. Error %1 %2", reply.errorCode(), reply.errorDescription())); -- delete action; -+ "was a problem trying to run as root. Error %1 %2", job->error(), job->errorString())); - return false; - } --#endif - return true; - } - -@@ -1262,26 +1253,20 @@ bool KSysGuardProcessList::killProcesses(const QList< long long> &pids, int sig) - if(!d->mModel.isLocalhost()) return false; //We can't elevate privileges to kill non-localhost processes - - #warning kauth-kf6 needs porting, but docu is not adjusted, no idea how to do it --#if 0 - kauth-kf6::Action action("org.kde.ksysguard.processlisthelper.sendsignal"); - action.setParentWidget(window()); -- d->setupkauth-kf6Action( &action, unkilled_pids); -+ //action.setHelperId("org.kde.ksysguard.processlisthelper"); -+ d->setupkauth-kf6Action( action, unkilled_pids); - action.addArgument("signal", sig); -- kauth-kf6::ActionReply reply = action.execute(); -+ kauth-kf6::ExecuteJob *job = action.execute(); - -- if (reply == kauth-kf6::ActionReply::SuccessReply) { -+ if (job->exec()) { - updateList(); -- } else if (reply.type() == kauth-kf6::ActionReply::HelperError) { -- if (reply.errorCode() > 0) -- KMessageBox::sorry(this, i18n("You do not have the permission to kill the process and there " -- "was a problem trying to run as root. %1", reply.errorDescription())); -- return false; -- } else if (reply != kauth-kf6::ActionReply::UserCancelled && reply != kauth-kf6::ActionReply::AuthorizationDenied) { -+ } else if (!job->exec()) { - KMessageBox::sorry(this, i18n("You do not have the permission to kill the process and there " -- "was a problem trying to run as root. Error %1 %2", reply.errorCode(), reply.errorDescription())); -+ "was a problem trying to run as root. Error %1 %2", job->error(), job->errorString())); - return false; - } --#endif - return true; - } - diff --git a/desktop/kde6/plasma/libksysguard-kf6/pspec.xml b/desktop/kde6/plasma/libksysguard-kf6/pspec.xml deleted file mode 100755 index 366472fefb..0000000000 --- a/desktop/kde6/plasma/libksysguard-kf6/pspec.xml +++ /dev/null @@ -1,254 +0,0 @@ - - - - - libksysguard-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Task management and system monitoring library - Task management and system monitoring library - mirrors://kde/stable/plasma/6.2.5/libksysguard-6.2.5.tar.xz - - qt6-base-devel - qt6-webengine-devel - qt6-designer-devel - qt6-declarative-devel - qt6-5compat-devel - kcolorscheme-kf6-devel - kio-kf6-devel - solid-kf6-devel - kglobalaccel-kf6-devel - kpackage-kf6-devel - kjobwidgets-kf6-devel - kdeclarative-kf6-devel - kauth-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kservice-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kdoctools-kf6-devel - libX11-devel - libXres-devel - zlib-devel - libnsl-devel - libnl-devel - libcap-devel - knewstuff-kf6-devel - libplasma-kf6-devel - extra-cmake-modules-kf6 - attr-devel - pam-devel - libpcap-devel - lm_sensors-devel - - - - - libksysguard-kf6 - - kio-kf6 - solid-kf6 - libpcap - kservice-kf6 - kglobalaccel-kf6 - qt6-webengine - qt6-webchannel - qt6-base - qt6-declarative - qt6-5compat - kcolorscheme-kf6 - kpackage-kf6 - kjobwidgets-kf6 - kdeclarative-kf6 - libX11 - libgcc - zlib - libXres - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kconfig-kf6 - kauth-kf6 - kcoreaddons-kf6 - ki18n-kf6 - libnsl - libcap - libnl - lm_sensors - - - /etc - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - libksysguard-kf6-devel - Development files for libksysguard-kf6 - - libksysguard-kf6 - - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/libplasma-kf6/actions.py b/desktop/kde6/plasma/libplasma-kf6/actions.py deleted file mode 100755 index f6b65155f2..0000000000 --- a/desktop/kde6/plasma/libplasma-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools, get - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - #set pisi-crocus-ancyrensis photos as default wallpapers - pisitools.dosed("%s/usr/share/plasma/desktoptheme/default/plasmarc" % get.installDIR(), "Next", "pisi-crocus-ancyrensis") - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/plasma/libplasma-kf6/pspec.xml b/desktop/kde6/plasma/libplasma-kf6/pspec.xml deleted file mode 100755 index 1f7f182bda..0000000000 --- a/desktop/kde6/plasma/libplasma-kf6/pspec.xml +++ /dev/null @@ -1,269 +0,0 @@ - - - - - libplasma-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Plasma library and runtime components based upon KDE Frameworks 5 and Qt5 - Plasma library and runtime components based upon KF5 and Qt5 - mirrors://kde/stable/plasma/6.2.5/libplasma-6.2.5.tar.xz - - qt6-base-devel - qt6-wayland-devel - kdoctools-kf6-devel - qt6-svg-devel - qt6-declarative-devel - mesa-devel - libX11-devel - libxcb-devel - libglvnd-devel - plasma-wayland-protocols-kf6 - kauth-kf6-devel - kcodecs-kf6-devel - kirigami-kf6-devel - kwidgetsaddons-kf6-devel - kbookmarks-kf6-devel - kcompletion-kf6-devel - plasma-activities-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - solid-kf6-devel - knotifications-kf6-devel - kpackage-kf6-devel - karchive-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - kglobalaccel-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kparts-kf6-devel - kservice-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - kwayland-kf6-devel - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - docbook-xml - docbook-xsl - wayland-devel - wayland-client - ksvg-kf6-devel - kcmutils-kf6-devel - kcolorscheme-kf6-devel - extra-cmake-modules-kf6 - - - - - libplasma-kf6 - - qt6-base - qt6-svg - qt6-base - qt6-wayland - qt6-declarative - libX11 - libxcb - libglvnd - wayland-client - kconfig-kf6 - ksvg-kf6 - kcmutils-kf6 - kirigami-kf6 - plasma-activities-kf6 - knotifications-kf6 - kpackage-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - kglobalaccel-kf6 - kguiaddons-kf6 - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - kio-kf6 - kwindowsystem-kf6 - kcolorscheme-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - plasma-framework-kf6 - - - - - libplasma-kf6-devel - Development files for libplasma-kf6 - - libplasma-kf6 - kpackage-kf6-devel - kservice-kf6-devel - kwindowsystem-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - plasma-framework-kf6-devel - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/milou-kf6/actions.py b/desktop/kde6/plasma/milou-kf6/actions.py deleted file mode 100755 index 5a9c0633a7..0000000000 --- a/desktop/kde6/plasma/milou-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/plasma/milou-kf6/pspec.xml b/desktop/kde6/plasma/milou-kf6/pspec.xml deleted file mode 100755 index 21f844be8c..0000000000 --- a/desktop/kde6/plasma/milou-kf6/pspec.xml +++ /dev/null @@ -1,185 +0,0 @@ - - - - - milou-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kded-kf6icated search application built on top of baloo-kf6 - Dedicated search application built on top of baloo-kf6 - mirrors://kde/stable/plasma/6.2.5/milou-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - kdoctools-kf6-devel - kdeclarative-kf6-devel - ksvg-kf6-devel - ki18n-kf6-devel - krunner-kf6-devel - libplasma-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - extra-cmake-modules-kf6 - kitemmodels-kf6-devel - - - - - milou-kf6 - - qt6-base - qt6-declarative - krunner-kf6 - libgcc - ksvg-kf6 - kconfig-kf6 - kservice-kf6 - kcoreaddons-kf6 - kitemmodels-kf6 - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/oxygen-kf6/actions.py b/desktop/kde6/plasma/oxygen-kf6/actions.py deleted file mode 100755 index 918c524ed1..0000000000 --- a/desktop/kde6/plasma/oxygen-kf6/actions.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/copyleft/gpl.txt - -from pisi.actionsapi import kde6 -#from pisi.actionsapi import pisitools - -def setup(): - kde6.configure("-DBUILD_QT5=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/plasma/oxygen-kf6/pspec.xml b/desktop/kde6/plasma/oxygen-kf6/pspec.xml deleted file mode 100755 index 19ca36398c..0000000000 --- a/desktop/kde6/plasma/oxygen-kf6/pspec.xml +++ /dev/null @@ -1,200 +0,0 @@ - - - oxygen-kf6 - https://projects.kde.org/projects/kde/workspace/oxygen-kf6 - - Ayhan Yalçınsoy - ayhanyalcinsoy@pisilinux.org - - LGPL - KDE oxygen-kf6 style - KDE oxygen-kf6 style - mirrors://kde/stable/plasma/6.2.5/oxygen-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - - kcmutils-kf6-devel - frameworkintegration-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kservice-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - cairo-devel - libxcb-devel - kwayland-kf6-devel - gtk3-devel - kdoctools-kf6-devel - kdecorations-kf6-devel - plasma-workspace-kf6-devel - extra-cmake-modules-kf6 - - - - oxygen-kf6 - - ki18n-kf6 - libgcc - libxcb - kconfig-kf6 - qt6-base - qt6-declarative - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdecorations-kf6 - kwindowsystem-kf6 - - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kwayland-kf6 - frameworkintegration-kf6 - kcmutils-kf6 - - - /usr/bin/ - /usr/lib - /usr/share/color-schemes - /usr/share/sounds - /usr/share/icons - /usr/share/locale - /usr/share/plasma - /usr/share/kstyle - /usr/share/kservice-kf6s5 - /usr/share/applications - /usr/share/metainfo/org.kde.oxygen.appdata.xml - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/oxygen-sounds-kf6/actions.py b/desktop/kde6/plasma/oxygen-sounds-kf6/actions.py deleted file mode 100644 index 9cb5146c65..0000000000 --- a/desktop/kde6/plasma/oxygen-sounds-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/oxygen-sounds-kf6/pspec.xml b/desktop/kde6/plasma/oxygen-sounds-kf6/pspec.xml deleted file mode 100644 index 12306f5efa..0000000000 --- a/desktop/kde6/plasma/oxygen-sounds-kf6/pspec.xml +++ /dev/null @@ -1,164 +0,0 @@ - - - - - oxygen-sounds-kf6 - https://kde.org/plasma-desktop-kf6/ - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv3 - library - The oxygen-kf6 Sound Theme - Oksijen Sesi Teması - https://download.kde.org/stable/plasma/6.2.5/oxygen-sounds-6.2.5.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - - - - - - oxygen-sounds-kf6 - - /usr/share/sounds - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/oxygen-sounds-kf6/translations.xml b/desktop/kde6/plasma/oxygen-sounds-kf6/translations.xml deleted file mode 100644 index 3a9f34d047..0000000000 --- a/desktop/kde6/plasma/oxygen-sounds-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - oxygen-sounds-kf6 - The oxygen-kf6 Sound Theme - Oksijen Sesi Teması - - diff --git a/desktop/kde6/plasma/plasma-activities-kf6/actions.py b/desktop/kde6/plasma/plasma-activities-kf6/actions.py deleted file mode 100755 index cc06a09121..0000000000 --- a/desktop/kde6/plasma/plasma-activities-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/plasma/plasma-activities-kf6/files/build-source.patch b/desktop/kde6/plasma/plasma-activities-kf6/files/build-source.patch deleted file mode 100755 index 10fb089da3..0000000000 --- a/desktop/kde6/plasma/plasma-activities-kf6/files/build-source.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/CMakeLists.txt 2014-09-09 02:40:08.000000000 +0300 -+++ b/CMakeLists.txt 2014-09-22 17:47:14.215639453 +0300 -@@ -6,13 +6,6 @@ - - set(REQUIRED_QT_VERSION 5.2.0) - --# We don't build in-source --if ("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") -- message ( -- FATAL_ERROR -- "plasma-activities-kf6 require an out of source build. Please create a separate build directory and run 'cmake path_to_plasma [options]' there." -- ) --endif () - - # Extra CMake stuff - find_package (ECM 1.2.0 REQUIRED NO_MODULE) - diff --git a/desktop/kde6/plasma/plasma-activities-kf6/files/kamd-rename.patch b/desktop/kde6/plasma/plasma-activities-kf6/files/kamd-rename.patch deleted file mode 100755 index 97b2af451a..0000000000 --- a/desktop/kde6/plasma/plasma-activities-kf6/files/kamd-rename.patch +++ /dev/null @@ -1,91 +0,0 @@ -diff --git a/autotests/Process.cpp b/autotests/Process.cpp -index a7a0507..afa4bf1 100644 ---- a/autotests/Process.cpp -+++ b/autotests/Process.cpp -@@ -83,7 +83,7 @@ void Modifier::initTestCase() - // qDebug() << env; - - s_process->setEnvironment(env); -- s_process->start(QStringLiteral(KAMD_INSTALL_PREFIX "/bin/kactivitymanagerd-kf6")); -+ s_process->start(QStringLiteral(KAMD_INSTALL_PREFIX "/bin/kactivitymanagerd-kf65")); - s_process->waitForStarted(); - - -diff --git a/src/lib/core/manager_p.cpp b/src/lib/core/manager_p.cpp -index 077c634..7be66dd 100644 ---- a/src/lib/core/manager_p.cpp -+++ b/src/lib/core/manager_p.cpp -@@ -94,11 +94,11 @@ Manager *Manager::self() - ->property("org.kde.plasma-activities-kf6.core.disableAutostart") - .toBool()) { - qCDebug(KAMD_CORELIB) << "Starting the activity manager daemon"; -- QProcess::startDetached(QStringLiteral("kactivitymanagerd-kf6")); -+ QProcess::startDetached(QStringLiteral("kactivitymanagerd-kf65")); - } - - #else -- QProcess::startDetached(QStringLiteral("kactivitymanagerd-kf6")); -+ QProcess::startDetached(QStringLiteral("kactivitymanagerd-kf65")); - #endif - } - -diff --git a/src/service/Application.cpp b/src/service/Application.cpp -index 6b0e3e1..3894540 100644 ---- a/src/service/Application.cpp -+++ b/src/service/Application.cpp -@@ -280,7 +280,7 @@ int main(int argc, char **argv) - application.setApplicationName(QStringLiteral("ActivityManager")); - application.setOrganizationDomain(QStringLiteral("kde.org")); - -- // KAboutData about("kactivitymanagerd-kf6", Q_NULLPTR, ki18n-kf6("KDE Activity Manager"), "3.0", -+ // KAboutData about("kactivitymanagerd-kf65", Q_NULLPTR, ki18n-kf6("KDE Activity Manager"), "3.0", - // ki18n-kf6("KDE Activity Management Service"), - // KAboutData::License_GPL, - // ki18n-kf6("(c) 2010, 2011, 2012 Ivan Cukic"), KLocalizedString(), -@@ -333,7 +333,7 @@ int main(int argc, char **argv) - // Starting the dameon - - QProcess::startDetached( -- KAMD_INSTALL_PREFIX "/bin/kactivitymanagerd-kf6", -+ KAMD_INSTALL_PREFIX "/bin/kactivitymanagerd-kf65", - QStringList{"start-daemon"} - ); - -diff --git a/src/service/CMakeLists.txt b/src/service/CMakeLists.txt -index 4b4978b..2220f34 100644 ---- a/src/service/CMakeLists.txt -+++ b/src/service/CMakeLists.txt -@@ -62,9 +62,9 @@ qt5_add_dbus_adaptor ( - Features.h Features - ) - --add_executable (kactivitymanagerd-kf6 ${kactivitymanager_SRCS}) -+add_executable (kactivitymanagerd-kf65 ${kactivitymanager_SRCS}) - --target_link_libraries (kactivitymanagerd-kf6 -+target_link_libraries (kactivitymanagerd-kf65 - Qt5::Core - Qt5::DBus - Qt5::Widgets -@@ -84,7 +84,7 @@ install (FILES - ) - - install (TARGETS -- kactivitymanagerd-kf6 ${KF5_INSTALL_TARGETS_DEFAULT_ARGS} -+ kactivitymanagerd-kf65 ${KF5_INSTALL_TARGETS_DEFAULT_ARGS} - ) - - install (FILES -diff --git a/src/service/files/kactivitymanagerd-kf6.desktop b/src/service/files/kactivitymanagerd-kf6.desktop -index be5faa1..3c9b9a9 100644 ---- a/src/service/files/kactivitymanagerd-kf6.desktop -+++ b/src/service/files/kactivitymanagerd-kf6.desktop -@@ -4,7 +4,7 @@ Icon=preferences-activities - X-KDE-ServiceTypes= - X-DBUS-StartupType=Unique - X-KDE-StartupNotify=false --Exec=kactivitymanagerd-kf6 -+Exec=kactivitymanagerd-kf65 - - Name=Activity Manager - Name[ar]=مدير الأنشطة diff --git a/desktop/kde6/plasma/plasma-activities-kf6/pspec.xml b/desktop/kde6/plasma/plasma-activities-kf6/pspec.xml deleted file mode 100755 index 0d76037245..0000000000 --- a/desktop/kde6/plasma/plasma-activities-kf6/pspec.xml +++ /dev/null @@ -1,215 +0,0 @@ - - - - - plasma-activities-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Library for KDE's Plasma Activities support - plasma-activities-kf6 provides an API for using and interacting with the Plasma Activities Manager. - mirrors://kde/stable/plasma/6.2.5/plasma-activities-6.2.5.tar.xz - - qt6-base-devel - mesa-devel - boost-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - kpackage-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kio-kf6-devel - kservice-kf6-devel - kbookmarks-kf6-devel - kwidgetsaddons-kf6-devel - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kitemviews-kf6-devel - solid-kf6-devel - kauth-kf6-devel - kcodecs-kf6-devel - kconfigwidgets-kf6-devel - kxmlgui-kf6-devel - kwindowsystem-kf6-devel - kglobalaccel-kf6-devel - kcmutils-kf6-devel - qt6-declarative-devel - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - extra-cmake-modules-kf6 - - - - - - - - plasma-activities-kf6 - - qt6-base - qt6-declarative - kconfig-kf6 - kcoreaddons-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - plasma-activities-kf6-devel - Development files for plasma-activities-kf6 - - qt6-base-devel - plasma-activities-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release. - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma-activities-stats-kf6/actions.py b/desktop/kde6/plasma/plasma-activities-stats-kf6/actions.py deleted file mode 100755 index 9e8ab12ee7..0000000000 --- a/desktop/kde6/plasma/plasma-activities-stats-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README.md") diff --git a/desktop/kde6/plasma/plasma-activities-stats-kf6/files/build-source.patch b/desktop/kde6/plasma/plasma-activities-stats-kf6/files/build-source.patch deleted file mode 100755 index 10fb089da3..0000000000 --- a/desktop/kde6/plasma/plasma-activities-stats-kf6/files/build-source.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/CMakeLists.txt 2014-09-09 02:40:08.000000000 +0300 -+++ b/CMakeLists.txt 2014-09-22 17:47:14.215639453 +0300 -@@ -6,13 +6,6 @@ - - set(REQUIRED_QT_VERSION 5.2.0) - --# We don't build in-source --if ("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") -- message ( -- FATAL_ERROR -- "plasma-activities-kf6 require an out of source build. Please create a separate build directory and run 'cmake path_to_plasma [options]' there." -- ) --endif () - - # Extra CMake stuff - find_package (ECM 1.2.0 REQUIRED NO_MODULE) - diff --git a/desktop/kde6/plasma/plasma-activities-stats-kf6/files/kamd-rename.patch b/desktop/kde6/plasma/plasma-activities-stats-kf6/files/kamd-rename.patch deleted file mode 100755 index 97b2af451a..0000000000 --- a/desktop/kde6/plasma/plasma-activities-stats-kf6/files/kamd-rename.patch +++ /dev/null @@ -1,91 +0,0 @@ -diff --git a/autotests/Process.cpp b/autotests/Process.cpp -index a7a0507..afa4bf1 100644 ---- a/autotests/Process.cpp -+++ b/autotests/Process.cpp -@@ -83,7 +83,7 @@ void Modifier::initTestCase() - // qDebug() << env; - - s_process->setEnvironment(env); -- s_process->start(QStringLiteral(KAMD_INSTALL_PREFIX "/bin/kactivitymanagerd-kf6")); -+ s_process->start(QStringLiteral(KAMD_INSTALL_PREFIX "/bin/kactivitymanagerd-kf65")); - s_process->waitForStarted(); - - -diff --git a/src/lib/core/manager_p.cpp b/src/lib/core/manager_p.cpp -index 077c634..7be66dd 100644 ---- a/src/lib/core/manager_p.cpp -+++ b/src/lib/core/manager_p.cpp -@@ -94,11 +94,11 @@ Manager *Manager::self() - ->property("org.kde.plasma-activities-kf6.core.disableAutostart") - .toBool()) { - qCDebug(KAMD_CORELIB) << "Starting the activity manager daemon"; -- QProcess::startDetached(QStringLiteral("kactivitymanagerd-kf6")); -+ QProcess::startDetached(QStringLiteral("kactivitymanagerd-kf65")); - } - - #else -- QProcess::startDetached(QStringLiteral("kactivitymanagerd-kf6")); -+ QProcess::startDetached(QStringLiteral("kactivitymanagerd-kf65")); - #endif - } - -diff --git a/src/service/Application.cpp b/src/service/Application.cpp -index 6b0e3e1..3894540 100644 ---- a/src/service/Application.cpp -+++ b/src/service/Application.cpp -@@ -280,7 +280,7 @@ int main(int argc, char **argv) - application.setApplicationName(QStringLiteral("ActivityManager")); - application.setOrganizationDomain(QStringLiteral("kde.org")); - -- // KAboutData about("kactivitymanagerd-kf6", Q_NULLPTR, ki18n-kf6("KDE Activity Manager"), "3.0", -+ // KAboutData about("kactivitymanagerd-kf65", Q_NULLPTR, ki18n-kf6("KDE Activity Manager"), "3.0", - // ki18n-kf6("KDE Activity Management Service"), - // KAboutData::License_GPL, - // ki18n-kf6("(c) 2010, 2011, 2012 Ivan Cukic"), KLocalizedString(), -@@ -333,7 +333,7 @@ int main(int argc, char **argv) - // Starting the dameon - - QProcess::startDetached( -- KAMD_INSTALL_PREFIX "/bin/kactivitymanagerd-kf6", -+ KAMD_INSTALL_PREFIX "/bin/kactivitymanagerd-kf65", - QStringList{"start-daemon"} - ); - -diff --git a/src/service/CMakeLists.txt b/src/service/CMakeLists.txt -index 4b4978b..2220f34 100644 ---- a/src/service/CMakeLists.txt -+++ b/src/service/CMakeLists.txt -@@ -62,9 +62,9 @@ qt5_add_dbus_adaptor ( - Features.h Features - ) - --add_executable (kactivitymanagerd-kf6 ${kactivitymanager_SRCS}) -+add_executable (kactivitymanagerd-kf65 ${kactivitymanager_SRCS}) - --target_link_libraries (kactivitymanagerd-kf6 -+target_link_libraries (kactivitymanagerd-kf65 - Qt5::Core - Qt5::DBus - Qt5::Widgets -@@ -84,7 +84,7 @@ install (FILES - ) - - install (TARGETS -- kactivitymanagerd-kf6 ${KF5_INSTALL_TARGETS_DEFAULT_ARGS} -+ kactivitymanagerd-kf65 ${KF5_INSTALL_TARGETS_DEFAULT_ARGS} - ) - - install (FILES -diff --git a/src/service/files/kactivitymanagerd-kf6.desktop b/src/service/files/kactivitymanagerd-kf6.desktop -index be5faa1..3c9b9a9 100644 ---- a/src/service/files/kactivitymanagerd-kf6.desktop -+++ b/src/service/files/kactivitymanagerd-kf6.desktop -@@ -4,7 +4,7 @@ Icon=preferences-activities - X-KDE-ServiceTypes= - X-DBUS-StartupType=Unique - X-KDE-StartupNotify=false --Exec=kactivitymanagerd-kf6 -+Exec=kactivitymanagerd-kf65 - - Name=Activity Manager - Name[ar]=مدير الأنشطة diff --git a/desktop/kde6/plasma/plasma-activities-stats-kf6/pspec.xml b/desktop/kde6/plasma/plasma-activities-stats-kf6/pspec.xml deleted file mode 100755 index a188173de1..0000000000 --- a/desktop/kde6/plasma/plasma-activities-stats-kf6/pspec.xml +++ /dev/null @@ -1,196 +0,0 @@ - - - - - plasma-activities-stats-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Library for KDE's Plasma Activities support - plasma-activities-kf6 provides an API for using and interacting with the Plasma Activities Manager. - mirrors://kde/stable/plasma/6.2.5/plasma-activities-stats-6.2.5.tar.xz - - qt6-base-devel - boost-devel - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - kconfig-kf6-devel - plasma-activities-kf6-devel - extra-cmake-modules-kf6 - - - - - - plasma-activities-stats-kf6 - - qt6-base - libgcc - kconfig-kf6 - plasma-activities-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - plasma-activities-stats-kf6-devel - Development files for plasma-activities-stats-kf6 - - qt6-base-devel - kconfig-kf6-devel - plasma-activities-kf6-devel - plasma-activities-stats-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma-browser-integration-kf6/actions.py b/desktop/kde6/plasma/plasma-browser-integration-kf6/actions.py deleted file mode 100644 index 3d10bfd0c8..0000000000 --- a/desktop/kde6/plasma/plasma-browser-integration-kf6/actions.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import cmaketools, shelltools, pisitools -from pisi.actionsapi import get - - -def setup(): - shelltools.makedirs('build') - shelltools.cd('build') - parameters = " ".join([ - "-DINSTALL_CHROME_MANIFEST=ON", - ]) - cmaketools.configure(parameters=parameters, sourceDir='..') - - -def build(): - shelltools.cd('build') - cmaketools.make() - - -def install(): - shelltools.cd('build') - cmaketools.rawInstall("DESTDIR=%s" % get.installDIR()) - # pisitools.removeDir("/usr/share/locale") diff --git a/desktop/kde6/plasma/plasma-browser-integration-kf6/pspec.xml b/desktop/kde6/plasma/plasma-browser-integration-kf6/pspec.xml deleted file mode 100644 index 03aa133895..0000000000 --- a/desktop/kde6/plasma/plasma-browser-integration-kf6/pspec.xml +++ /dev/null @@ -1,197 +0,0 @@ - - - - - plasma-browser-integration-kf6 - https://kde.org/plasma-desktop-kf6 - - Safa Arıman - safaariman@pisilinux.org - - GPLv3 - app - Plasma browser integration - Components necessary to integrate browsers into the Plasma Desktop. - https://download.kde.org/stable/plasma/6.2.5/plasma-browser-integration-6.2.5.tar.xz - - cmake - extra-cmake-modules-kf6 - kio-kf6-devel - ki18n-kf6-devel - kcrash-kf6-devel - kconfig-kf6-devel - krunner-kf6-devel - purpose-kf6-devel - kservice-kf6-devel - qt6-base-devel - plasma-activities-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - knotifications-kf6-devel - kfilemetadata-kf6-devel - kitemmodels-kf6-devel - plasma-workspace-kf6-devel - kjobwidgets-kf6-devel - kstatusnotifieritem-kf6-devel - qt6-declarative-devel - - - - - plasma-browser-integration-kf6 - - kio-kf6 - ki18n-kf6 - kcrash-kf6 - kconfig-kf6 - krunner-kf6 - purpose-kf6 - kservice-kf6 - qt6-base - kjobwidgets-kf6 - plasma-activities-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kfilemetadata-kf6 - knotifications-kf6 - kstatusnotifieritem-kf6 - plasma-workspace-kf6 - - - /usr/bin - /usr/lib - /usr/share/locale - /usr/share - /etc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma-desktop-kf6/actions.py b/desktop/kde6/plasma/plasma-desktop-kf6/actions.py deleted file mode 100755 index db2f0790b8..0000000000 --- a/desktop/kde6/plasma/plasma-desktop-kf6/actions.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - #shelltools.system("rm -rf po/id") - kde6.configure("-DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_INSTALL_LIBDIR=lib \ - -DCMAKE_DISABLE_FIND_PACKAGE_PackageKitQt6=ON \ - -DBUILD_TESTING=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/plasma-desktop-kf6/files/ac9ef2b6.patch b/desktop/kde6/plasma/plasma-desktop-kf6/files/ac9ef2b6.patch deleted file mode 100644 index 108fa8c124..0000000000 --- a/desktop/kde6/plasma/plasma-desktop-kf6/files/ac9ef2b6.patch +++ /dev/null @@ -1,100 +0,0 @@ -From ac9ef2b66d4be08cbf6a1702ee92641b80e50974 Mon Sep 17 00:00:00 2001 -From: Noah Davis -Date: Sun, 17 Oct 2021 05:50:26 -0400 -Subject: [PATCH] kickoff: Replace Kicker DragHelper with Qt Quick Drag - -Originally, I thought it wasn't possible to use Qt Quick Drag here, but -then I found out I could use Item::grabToImage()'s function callback -parameter to set Drag.imageSource. - -BUG: 443708 ---- - .../contents/ui/KickoffItemDelegate.qml | 25 +++++++------------ - .../package/contents/ui/KickoffSingleton.qml | 11 -------- - 2 files changed, 9 insertions(+), 27 deletions(-) - -diff --git a/applets/kickoff/package/contents/ui/KickoffItemDelegate.qml b/applets/kickoff/package/contents/ui/KickoffItemDelegate.qml -index bb2bc1185..c77b07111 100644 ---- a/applets/kickoff/package/contents/ui/KickoffItemDelegate.qml -+++ b/applets/kickoff/package/contents/ui/KickoffItemDelegate.qml -@@ -179,6 +179,10 @@ T.ItemDelegate { - maximumLineCount: 1 - } - -+ Drag.active: mouseArea.drag.active -+ Drag.dragType: Drag.Automatic -+ Drag.mimeData: { "text/uri-list" : root.url } -+ - MouseArea { - id: mouseArea - parent: root -@@ -201,16 +205,6 @@ T.ItemDelegate { - minimumY: 0 - maximumY: root.view ? Math.min(root.view.contentHeight - root.height, root.view.availableHeight - root.height) : root.y - } -- Binding { -- target: KickoffSingleton; when: root.dragActive -- property: "dragSource"; value: root -- restoreMode: Binding.RestoreBindingOrValue -- } -- Binding { -- target: KickoffSingleton.dragHelper; when: root.dragActive -- property: "dragIconSize"; value: root.icon.height -- restoreMode: Binding.RestoreBindingOrValue -- } - // Using onPositionChanged instead of onEntered to prevent changing - // categories while scrolling with the mouse wheel. - onPositionChanged: { -@@ -223,6 +217,11 @@ T.ItemDelegate { - // built into QQuickListView::setCurrentIndex() already - root.view.currentIndex = index - } -+ onPressed: if (root.dragEnabled && root.Drag.imageSource == "") { -+ iconItem.grabToImage((result) => { -+ return root.Drag.imageSource = result.url -+ }) -+ } - onClicked: if (mouse.button === Qt.LeftButton) { - root.forceActiveFocus(Qt.MouseFocusReason) - root.action.trigger() // clicked() is emmitted when action is triggered -@@ -277,15 +276,9 @@ T.ItemDelegate { - indicator = null - } - } -- -- // NOTE: Not using Drag attached properties because we're using DragHelper instead. -- // Drag doesn't support QIcons for the imageSource, only URLs. - onDragActiveChanged: if (dragActive) { - dragStartPosition = Qt.point(x,y) - dragStartIndex = index -- // Fixes warning: "Passing incompatible arguments to C++ functions from JavaScript is dangerous and deprecated." -- //const url = root.url ? root.url : "" -- KickoffSingleton.dragHelper.startDrag(root, url, decoration) - } else if (dragStartIndex === index) { - x = dragStartPosition.x - y = dragStartPosition.y -diff --git a/applets/kickoff/package/contents/ui/KickoffSingleton.qml b/applets/kickoff/package/contents/ui/KickoffSingleton.qml -index 3e1ff50db..d77e40bf5 100644 ---- a/applets/kickoff/package/contents/ui/KickoffSingleton.qml -+++ b/applets/kickoff/package/contents/ui/KickoffSingleton.qml -@@ -45,17 +45,6 @@ Item { - } - //END - -- //BEGIN Drag and Drop elements -- property Item dragSource: null -- // We have to use DragHelper here because the models use QIcons for the decoration role. -- // DragHelper supports QIcons and Drag.imageSource only supports urls. -- readonly property Kicker.DragHelper dragHelper: Kicker.DragHelper { -- id: dragHelper -- dragIconSize: PlasmaCore.Units.iconSizes.medium -- onDropped: dragSource = null -- } -- //END -- - //BEGIN UI elements - // Set in FullRepresentation.qml - property Item header: null --- -GitLab - diff --git a/desktop/kde6/plasma/plasma-desktop-kf6/files/af9aeecc.patch b/desktop/kde6/plasma/plasma-desktop-kf6/files/af9aeecc.patch deleted file mode 100644 index a454160305..0000000000 --- a/desktop/kde6/plasma/plasma-desktop-kf6/files/af9aeecc.patch +++ /dev/null @@ -1,95 +0,0 @@ -From af9aeeccfa2a6efb16e4c5904768c55f97c022ff Mon Sep 17 00:00:00 2001 -From: Noah Davis -Date: Wed, 20 Oct 2021 23:24:15 -0400 -Subject: [PATCH] kickoff: Fix drag and drop causing delegates to reset to a 0 - X position and overlap - -BUG: 443975 - - -(cherry picked from commit 70860fe8649b56b18301c90bc3c87b9406cc515d) ---- - .../package/contents/ui/KickoffGridView.qml | 2 +- - .../contents/ui/KickoffItemDelegate.qml | 19 +++---------------- - .../package/contents/ui/KickoffListView.qml | 2 +- - 3 files changed, 5 insertions(+), 18 deletions(-) - -diff --git a/applets/kickoff/package/contents/ui/KickoffGridView.qml b/applets/kickoff/package/contents/ui/KickoffGridView.qml -index 269469d66..4367fabf2 100644 ---- a/applets/kickoff/package/contents/ui/KickoffGridView.qml -+++ b/applets/kickoff/package/contents/ui/KickoffGridView.qml -@@ -115,7 +115,7 @@ EmptyPage { - highlight: PlasmaCore.FrameSvgItem { - // The default Z value for delegates is 1. The default Z value for the section delegate is 2. - // The highlight gets a value of 3 while the drag is active and then goes back to the default value of 0. -- z: root.currentItem && root.currentItem.dragActive ? -+ z: root.currentItem && root.currentItem.Drag.active ? - 3 : 0 - opacity: view.activeFocus - || (KickoffSingleton.contentArea === root -diff --git a/applets/kickoff/package/contents/ui/KickoffItemDelegate.qml b/applets/kickoff/package/contents/ui/KickoffItemDelegate.qml -index e249108fa..1353f5946 100644 ---- a/applets/kickoff/package/contents/ui/KickoffItemDelegate.qml -+++ b/applets/kickoff/package/contents/ui/KickoffItemDelegate.qml -@@ -49,9 +49,6 @@ T.ItemDelegate { - property bool isSearchResult: false - readonly property bool menuClosed: ActionMenu.menu.status == 3 // corresponds to DialogStatus.Closed - -- property point dragStartPosition: Qt.point(x,y) -- property int dragStartIndex: index -- readonly property alias dragActive: mouseArea.drag.active - property bool dragEnabled: enabled && !root.isCategory && !root.view.interactive - && plasmoid.immutability !== PlasmaCore.Types.SystemImmutable - -@@ -84,7 +81,7 @@ T.ItemDelegate { - - // The default Z value for delegates is 1. The default Z value for the section delegate is 2. - // The highlight gets a value of 3 while the drag is active and then goes back to the default value of 0. -- z: dragActive ? 4 : 1 -+ z: Drag.active ? 4 : 1 - - implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, - implicitContentWidth + leftPadding + rightPadding) -@@ -202,12 +199,9 @@ T.ItemDelegate { - acceptedButtons: Qt.LeftButton | Qt.RightButton - drag { - axis: Drag.XAndYAxis -- target: root.dragEnabled ? root : undefined -- minimumX: 0 -- maximumX: root.view ? Math.min(root.view.contentWidth - root.width, root.view.availableWidth - root.width) : root.x -- minimumY: 0 -- maximumY: root.view ? Math.min(root.view.contentHeight - root.height, root.view.availableHeight - root.height) : root.y -+ target: root.dragEnabled ? dragItem : undefined - } -+ Item { id: dragItem } - // Using onPositionChanged instead of onEntered to prevent changing - // categories while scrolling with the mouse wheel. - onPositionChanged: { -@@ -279,11 +273,4 @@ T.ItemDelegate { - indicator = null - } - } -- onDragActiveChanged: if (dragActive) { -- dragStartPosition = Qt.point(x,y) -- dragStartIndex = index -- } else if (dragStartIndex === index) { -- x = dragStartPosition.x -- y = dragStartPosition.y -- } - } -diff --git a/applets/kickoff/package/contents/ui/KickoffListView.qml b/applets/kickoff/package/contents/ui/KickoffListView.qml -index 9dffafb41..9a0c3c233 100644 ---- a/applets/kickoff/package/contents/ui/KickoffListView.qml -+++ b/applets/kickoff/package/contents/ui/KickoffListView.qml -@@ -117,7 +117,7 @@ EmptyPage { - highlight: PlasmaCore.FrameSvgItem { - // The default Z value for delegates is 1. The default Z value for the section delegate is 2. - // The highlight gets a value of 3 while the drag is active and then goes back to the default value of 0. -- z: root.currentItem && root.currentItem.dragActive ? -+ z: root.currentItem && root.currentItem.Drag.active ? - 3 : 0 - opacity: view.activeFocus - || (KickoffSingleton.contentArea === root --- -GitLab - diff --git a/desktop/kde6/plasma/plasma-desktop-kf6/files/plasma-desktop-animation-duration.patch b/desktop/kde6/plasma/plasma-desktop-kf6/files/plasma-desktop-animation-duration.patch deleted file mode 100644 index 31cb768ea0..0000000000 --- a/desktop/kde6/plasma/plasma-desktop-kf6/files/plasma-desktop-animation-duration.patch +++ /dev/null @@ -1,140 +0,0 @@ -From f3bbc0ba0e34ea1b34b106228c02d85865ed904a Mon Sep 17 00:00:00 2001 -From: Nate Graham -Date: Tue, 24 Mar 2020 08:15:12 -0600 -Subject: Stop multiplying duration values - -Summary: -After D28144, some animations are now too long because they were inappropriately -multiplying a duration value. That's no longer necessary, so let's remove the -multiplication. - -Depends on D28144 - -Test Plan: Various things that were a bit too slow before feel just right now - -Reviewers: #vdg, #plasma - -Subscribers: plasma-devel - -Tags: #plasma - -Differential Revision: https://phabricator.kde.org/D28239 ---- - applets/taskmanager/package/contents/ui/Task.qml | 2 +- - applets/taskmanager/package/contents/ui/TaskList.qml | 2 +- - desktoppackage/contents/configuration/PanelConfiguration.qml | 4 ++-- - desktoppackage/contents/explorer/WidgetExplorer.qml | 6 +++--- - toolboxes/desktoptoolbox/contents/ui/ToolBoxButton.qml | 6 +++--- - 5 files changed, 10 insertions(+), 10 deletions(-) - -diff --git a/applets/taskmanager/package/contents/ui/Task.qml b/applets/taskmanager/package/contents/ui/Task.qml -index 2bf8b88..9683fab 100644 ---- a/applets/taskmanager/package/contents/ui/Task.qml -+++ b/applets/taskmanager/package/contents/ui/Task.qml -@@ -293,7 +293,7 @@ MouseArea { - Timer { - id: timer - -- interval: units.longDuration * 2 -+ interval: units.longDuration - repeat: false - - onTriggered: { -diff --git a/applets/taskmanager/package/contents/ui/TaskList.qml b/applets/taskmanager/package/contents/ui/TaskList.qml -index 594420b..6d6bc45 100644 ---- a/applets/taskmanager/package/contents/ui/TaskList.qml -+++ b/applets/taskmanager/package/contents/ui/TaskList.qml -@@ -34,7 +34,7 @@ Flow { - NumberAnimation { - properties: "x, y" - easing.type: Easing.OutQuad -- duration: units.longDuration * 2 -+ duration: units.longDuration - } - - PropertyAction { target: taskList; property: "animating"; value: false } -diff --git a/desktoppackage/contents/configuration/PanelConfiguration.qml b/desktoppackage/contents/configuration/PanelConfiguration.qml -index 0e11a96..33e3fbc 100644 ---- a/desktoppackage/contents/configuration/PanelConfiguration.qml -+++ b/desktoppackage/contents/configuration/PanelConfiguration.qml -@@ -103,7 +103,7 @@ PlasmaCore.FrameSvgItem { - return panel.screenGeometry.y + panel.screenGeometry.height - panel.height - panel.distance - } - } -- duration: units.shortDuration * 3 -+ duration: units.shortDuration - } - - NumberAnimation { -@@ -122,7 +122,7 @@ PlasmaCore.FrameSvgItem { - return panel.screenGeometry.y + panel.screenGeometry.height - panel.height - configDialog.height - panel.distance - } - } -- duration: units.shortDuration * 3 -+ duration: units.shortDuration - } - } - //END Animations -diff --git a/desktoppackage/contents/explorer/WidgetExplorer.qml b/desktoppackage/contents/explorer/WidgetExplorer.qml -index 1648708..e26cc40 100644 ---- a/desktoppackage/contents/explorer/WidgetExplorer.qml -+++ b/desktoppackage/contents/explorer/WidgetExplorer.qml -@@ -306,7 +306,7 @@ Item { - properties: "x" - from: -list.width - to: 0 -- duration: units.shortDuration * 3 -+ duration: units.shortDuration - - } - } -@@ -316,7 +316,7 @@ Item { - NumberAnimation { - properties: "x" - to: list.width -- duration: units.shortDuration * 3 -+ duration: units.shortDuration - } - } - -@@ -329,7 +329,7 @@ Item { - displaced: Transition { - NumberAnimation { - properties: "y" -- duration: units.shortDuration * 3 -+ duration: units.shortDuration - } - } - } -diff --git a/toolboxes/desktoptoolbox/contents/ui/ToolBoxButton.qml b/toolboxes/desktoptoolbox/contents/ui/ToolBoxButton.qml -index 06524c3..eb6b190 100644 ---- a/toolboxes/desktoptoolbox/contents/ui/ToolBoxButton.qml -+++ b/toolboxes/desktoptoolbox/contents/ui/ToolBoxButton.qml -@@ -54,14 +54,14 @@ Item { - } - Behavior on rotation { - NumberAnimation { -- duration: units.shortDuration * 3; -+ duration: units.shortDuration; - easing.type: Easing.InOutExpo; - } - enabled: visible - } - Behavior on x { - NumberAnimation { -- duration: units.shortDuration * 3; -+ duration: units.shortDuration; - easing.type: Easing.InOutExpo; - } - enabled: visible -@@ -69,7 +69,7 @@ Item { - } - Behavior on y { - NumberAnimation { -- duration: units.shortDuration * 3; -+ duration: units.shortDuration; - easing.type: Easing.InOutExpo; - } - enabled: visible --- -cgit v1.1 diff --git a/desktop/kde6/plasma/plasma-desktop-kf6/pspec.xml b/desktop/kde6/plasma/plasma-desktop-kf6/pspec.xml deleted file mode 100755 index bb1a44185f..0000000000 --- a/desktop/kde6/plasma/plasma-desktop-kf6/pspec.xml +++ /dev/null @@ -1,325 +0,0 @@ - - - - - plasma-desktop-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - plasma - app:console - kde6 plasma workspace - This package contains the basic packages for a Plasma workspace. - mirrors://kde/stable/plasma/6.2.5/plasma-desktop-6.2.5.tar.xz - - kio-kf6-devel - scim-libs - scim-devel - kwin-kf6-devel - ibus-devel - kauth-kf6-devel - ki18n-kf6-devel - baloo-kf6-devel - glib2-devel - eudev-devel - boost-devel - libX11-devel - libXft-devel - libxcb-devel - breeze-style-kf6 - qt6-sql-odbc - signond-devel - krunner-kf6-devel - libXext-devel - xdg-user-dirs - ksvg-kf6-devel - kconfig-kf6-devel - qt6-sql-mysql - wayland-devel - wayland-client - kcmutils-kf6-devel - qt6-base-devel - qt6-sql-sqlite - xorg-app-devel - kpackage-kf6-devel - freetype-devel - knewstuff-kf6-devel - packagekit-devel - qt6-phonon-devel - libXcursor-devel - libxkbfile-devel - xkeyboard-config - kdbusaddons-kf6-devel - qt6-wayland-devel - xorg-server-devel - plasma-activities-kf6-devel - qt6-sql-postgresql - kglobalaccel-kf6-devel - kdeclarative-kf6-devel - qqc2-desktop-style-kf6 - libksysguard-kf6-devel - extra-cmake-modules-kf6 - qt6-5compat-devel - libusb-compat-devel - appstream-qt6-devel - knotifyconfig-kf6-devel - packagekit-qt6-devel - xcb-util-image-devel - knotifications-kf6-devel - libaccounts-qt6-devel - qt6-declarative-devel - pulseaudio-libs-devel - plasma-workspace-kf6-devel - xorg-input-evdev-devel - libplasma-kf6-devel - xcb-util-keysyms-devel - libaccounts-glib-devel - plasma-activities-stats-kf6-devel - wayland-protocols-devel - xorg-input-libinput-devel - signon-plugin-oauth2-devel - xorg-input-synaptics-devel - kdoctools-kf6-devel - plasma5-support-devel - kded-kf6-devel - libsdl2-devel - icu4c-devel - kirigami-kf6-devel - libcanberra-devel - - kaccounts-integration-kf6-devel - - - - - - - - plasma-desktop-kf6 - - kio-kf6 - ibus - baloo-kf6 - glib2 - kauth-kf6 - ki18n-kf6 - libXi - solid-kf6 - kcrash-kf6 - libX11 - libgcc - libxcb - sonnet-kf6 - kconfig-kf6 - kcodecs-kf6 - krunner-kf6 - kxmlgui-kf6 - kirigami-kf6 - kcmutils-kf6 - kpackage-kf6 - kservice-kf6 - qt6-base - plasma-nm-kf6 - knewstuff-kf6 - scim-libs - kpipewire-kf6 - kbookmarks-kf6 - kitemviews-kf6 - kguiaddons-kf6 - libXcursor - libxkbfile - qt6-phonon - plasma-activities-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - qt6-wayland - kdeclarative-kf6 - kdeplasma-addons-kf6 - kglobalaccel-kf6 - libksysguard-kf6 - libxkbcommon - knotifyconfig-kf6 - kwindowsystem-kf6 - qt6-5compat - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - packagekit-qt6 - wayland-client - libaccounts-qt6 - qt6-declarative - libplasma-kf6 - plasma-workspace-kf6 - xcb-util-keysyms - plasma-activities-stats-kf6 - qqc2-desktop-style-kf6 - ksvg-kf6 - kdoctools-kf6 - plasma5-support - libsdl2 - kirigami-kf6 - kirigami-addons-kf6 - libcanberra - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-22 - 6.2.0 - Add kdeplasma-addons as a dependency. - Bedirhan Kurt - bedirhan.kurt@outlook.com - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma-desktop-kf6/translations.xml b/desktop/kde6/plasma/plasma-desktop-kf6/translations.xml deleted file mode 100644 index a8a5e4c988..0000000000 --- a/desktop/kde6/plasma/plasma-desktop-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - plasma-desktop-kf6 - Masaüstü için Plazma - Web'de gezinmek için Plasma'yı kullanın; meslektaşlarınız, arkadaşlarınız ve ailenizle iletişim halinde olun; dosyalarınızı yönetin, müzik ve videoların keyfini çıkarın; ve işte üretken olun. Hepsini gereksinimlerinize uyarlanan güzel bir ortamda ve en iyi Ücretsiz Açık Kaynak Yazılımın sunduğu güvenlik, gizlilik koruması ve gönül rahatlığı ile yapın. - - diff --git a/desktop/kde6/plasma/plasma-firewall-kf6/actions.py b/desktop/kde6/plasma/plasma-firewall-kf6/actions.py deleted file mode 100644 index 0eef11c64c..0000000000 --- a/desktop/kde6/plasma/plasma-firewall-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/plasma/plasma-firewall-kf6/pspec.xml b/desktop/kde6/plasma/plasma-firewall-kf6/pspec.xml deleted file mode 100644 index 0bcd6bda19..0000000000 --- a/desktop/kde6/plasma/plasma-firewall-kf6/pspec.xml +++ /dev/null @@ -1,190 +0,0 @@ - - - - - plasma-firewall-kf6 - https://kde.org/plasma-desktop-kf6/ - - Pisi Linux Admins - admin@pisilinux.org - - GPL - library - Control Panel for your system firewall - Sistem güvenlik duvarınız için Kontrol Paneli - https://download.kde.org/stable/plasma/6.2.5/plasma-firewall-6.2.5.tar.xz - - ufw - kauth-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcmutils-kf6-devel - qt6-base-devel - kcoreaddons-kf6-devel - kdeclarative-kf6-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - - - - - plasma-firewall-kf6 - - ufw - kauth-kf6 - ki18n-kf6 - kconfig-kf6 - qt6-base - kcmutils-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - qt6-declarative - - - /usr/lib - /usr/share/applications - /usr/share/dbus-1 - /usr/share/kcm_ufw - /usr/share/kpackage-kf6 - /usr/share/polkit-1 - /usr/share/locale - /usr/share/metainfo - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma-firewall-kf6/translations.xml b/desktop/kde6/plasma/plasma-firewall-kf6/translations.xml deleted file mode 100644 index e5a117e34b..0000000000 --- a/desktop/kde6/plasma/plasma-firewall-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - plasma-firewall-kf6 - Control Panel for your system firewall - Sistem güvenlik duvarınız için Kontrol Paneli - - diff --git a/desktop/kde6/plasma/plasma-integration-kf6/actions.py b/desktop/kde6/plasma/plasma-integration-kf6/actions.py deleted file mode 100755 index 5c2594c676..0000000000 --- a/desktop/kde6/plasma/plasma-integration-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - # shelltools.system("sed -i 's|5.11.0|5.90.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - diff --git a/desktop/kde6/plasma/plasma-integration-kf6/pspec.xml b/desktop/kde6/plasma/plasma-integration-kf6/pspec.xml deleted file mode 100755 index cd1e734672..0000000000 --- a/desktop/kde6/plasma/plasma-integration-kf6/pspec.xml +++ /dev/null @@ -1,299 +0,0 @@ - - - - - plasma-integration-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 Plasma artwork - Artwork, styles and assets for the breeze-kf6 visual style for the Plasma Desktop - mirrors://kde/stable/plasma/6.2.5/plasma-integration-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - kxmlgui-kf6-devel - libxcb-devel - noto-fonts - breeze-style-kf6 - libXcursor-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kwayland-kf6-devel - qqc2-breeze-style-devel - kconfig-kf6-devel - kguiaddons-kf6-devel - kio-kf6-devel - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - libX11-devel - kiconthemes-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - kio-kf6-devel - kjobwidgets-kf6-devel - kwindowsystem-kf6-devel - qqc2-desktop-style-kf6 - qt6-wayland-devel - wayland-client - wayland-server - wayland-cursor - wayland-devel - plasma-wayland-protocols-kf6 - - kservice-kf6-devel - kcolorscheme-kf6-devel - kstatusnotifieritem-kf6-devel - xdg-desktop-portal-kde-kf6 - - - qt5-base-devel - qt5-wayland-devel - qt5-declarative-devel - qt5-x11extras-devel - qt5-quickcontrols2-devel - kcompletion-devel - ki18n-devel - kxmlgui-devel - kiconthemes-devel - kwayland-devel - kconfig-devel - kguiaddons-devel - kio-devel - kservice-devel - kwindowsystem-devel - kcoreaddons-devel - kconfigwidgets-devel - kwidgetsaddons-devel - kjobwidgets-devel - knotifications-devel - - - - - plasma-integration-kf6 - - qt6-base - qt6-wayland - qt6-declarative - libXcursor - kcompletion-kf6 - ki18n-kf6 - kiconthemes-kf6 - kwayland-kf6 - kconfig-kf6 - kguiaddons-kf6 - kio-kf6 - kxmlgui-kf6 - kwindowsystem-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - knotifications-kf6 - kjobwidgets-kf6 - breeze-style-kf6 - libgcc - libxcb - wayland-client - plasma-integration-data - kservice-kf6 - kcolorscheme-kf6 - kstatusnotifieritem-kf6 - qqc2-breeze-style - - - /usr/lib/qt6 - - - - - plasma5-integration - - qt5-base - qt5-wayland - qt5-declarative - qt5-x11extras - qt5-quickcontrols2 - libXcursor - kcompletion - ki18n - kxmlgui - kiconthemes - kwayland - kconfig - kguiaddons - kio - kservice - kwindowsystem - kcoreaddons - kconfigwidgets - kwidgetsaddons - kjobwidgets - knotifications - libgcc - libxcb - wayland-client - plasma-integration-data - - - /usr/lib/qt5 - - - - - plasma-integration-data - Development files for plasma-integration - - - - - /usr/share/kconf_update - /usr/share/locale - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma-nm-kf6/actions.py b/desktop/kde6/plasma/plasma-nm-kf6/actions.py deleted file mode 100755 index e1ed27d3d7..0000000000 --- a/desktop/kde6/plasma/plasma-nm-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("README*", "LICENSES/*") diff --git a/desktop/kde6/plasma/plasma-nm-kf6/pspec.xml b/desktop/kde6/plasma/plasma-nm-kf6/pspec.xml deleted file mode 100755 index 93f3558ddc..0000000000 --- a/desktop/kde6/plasma/plasma-nm-kf6/pspec.xml +++ /dev/null @@ -1,250 +0,0 @@ - - - - - plasma-nm-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - Plasma applet written in QML for managing network connections - Plasma applet written in QML for managing network connections - mirrors://kde/stable/plasma/6.2.5/plasma-nm-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - qt6-designer - qt6-webengine-devel - libgcc - qcoro-qt6-devel - networkmanager-qt-kf6-devel - ModemManager-devel - cups-devel - kcompletion-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - ksvg-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kitemviews-kf6-devel - knotifications-kf6-devel - kservice-kf6-devel - kwallet-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - solid-kf6-devel - openconnect-devel - kdoctools-kf6-devel - NetworkManager-devel - mobile-broadband-provider-info - extra-cmake-modules-kf6 - - libplasma-kf6-devel - - - - - kitemmodels-kf6-devel - kunitconversion-kf6-devel - qca2-qt6-devel - prison-kf6-devel - kirigami-kf6-devel - openconnect-devel - libproxy-devel - kcmutils-kf6-devel - kcolorscheme-kf6-devel - modemmanager-qt-kf6-devel - - - - - plasma-nm-kf6 - - qt6-base - kcmutils-kf6 - kdeclarative-kf6 - openconnect - kio-kf6 - ksvg-kf6 - libproxy - qca2-qt6 - qcoro-qt6 - networkmanager-qt-kf6 - ki18n-kf6 - solid-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - kservice-kf6 - prison-kf6 - kirigami-kf6 - kitemviews-kf6 - openconnect - kcolorscheme-kf6 - modemmanager-qt-kf6 - qt6-declarative - qt6-webengine - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - NetworkManager - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-29 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma-pa-kf6/actions.py b/desktop/kde6/plasma/plasma-pa-kf6/actions.py deleted file mode 100755 index 45b18ee2d8..0000000000 --- a/desktop/kde6/plasma/plasma-pa-kf6/actions.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/plasma-pa-kf6/pspec.xml b/desktop/kde6/plasma/plasma-pa-kf6/pspec.xml deleted file mode 100755 index 66b9027b71..0000000000 --- a/desktop/kde6/plasma/plasma-pa-kf6/pspec.xml +++ /dev/null @@ -1,204 +0,0 @@ - - - - - plasma-pa-kf6 - https://projects.kde.org/plasma-pa - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - Plasma applet for audio volume management using PulseAudio. - Plasma applet for audio volume management using PulseAudio. - mirrors://kde/stable/plasma/6.2.5/plasma-pa-6.2.5.tar.xz - - ki18n-kf6-devel - ksvg-kf6-devel - kconfig-kf6-devel - kirigami-kf6-devel - kcmutils-kf6-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - libcanberra-devel - kdeclarative-kf6-devel - kglobalaccel-kf6-devel - kstatusnotifieritem-kf6-devel - extra-cmake-modules-kf6 - knotifications-kf6-devel - kitemmodels-kf6-devel - kirigami-addons-kf6 - pulseaudio-libs-devel - pulseaudio-qt6-devel - libplasma-kf6-devel - sound-theme-freedesktop - qt6-base-devel - qt6-declarative-devel - - - - - plasma-pa-kf6 - - ki18n-kf6 - ksvg-kf6 - glib2 - libgcc - kconfig-kf6 - kcmutils-kf6 - libcanberra - kcoreaddons-kf6 - kglobalaccel-kf6 - kdeclarative-kf6 - knotifications-kf6 - qt6-declarative - pulseaudio-libs - kitemmodels-kf6 - kstatusnotifieritem-kf6 - kirigami-addons-kf6 - sound-theme-freedesktop - pulseaudio-qt6 - qt6-base - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma-pa-kf6/translations.xml b/desktop/kde6/plasma/plasma-pa-kf6/translations.xml deleted file mode 100644 index 9629152505..0000000000 --- a/desktop/kde6/plasma/plasma-pa-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - plasma-pa-kf6 - PulseAudio kullanarak ses düzeyi yönetimi için plazma uygulaması - PulseAudio kullanarak ses düzeyi yönetimi için plazma uygulaması - - diff --git a/desktop/kde6/plasma/plasma-sdk-kf6/actions.py b/desktop/kde6/plasma/plasma-sdk-kf6/actions.py deleted file mode 100755 index b1ea9c7eb2..0000000000 --- a/desktop/kde6/plasma/plasma-sdk-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - # shelltools.system("rm -r po/nl/docs/plasma-sdk-kf6") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/plasma/plasma-sdk-kf6/pspec.xml b/desktop/kde6/plasma/plasma-sdk-kf6/pspec.xml deleted file mode 100755 index 9a2ffb10b5..0000000000 --- a/desktop/kde6/plasma/plasma-sdk-kf6/pspec.xml +++ /dev/null @@ -1,218 +0,0 @@ - - - - - plasma-sdk-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - app:gui - Applications useful for Plasma development - Applications useful for Plasma development - mirrors://kde/stable/plasma/6.2.5/plasma-sdk-6.2.5.tar.xz - - qt6-base-devel - qt6-svg-devel - qt6-declarative-devel - qt6-5compat-devel - ksvg-kf6-devel - karchive-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - kparts-kf6-devel - libplasma-kf6-devel - kservice-kf6-devel - ktexteditor-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kxmlgui-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - kirigami-kf6-devel - plasma5-support-devel - kcolorscheme-kf6-devel - - - - - - - plasma-sdk-kf6 - - qt6-base - qt6-5compat - ktexteditor-kf6 - libplasma-kf6 - kio-kf6 - ksvg-kf6 - libgcc - ki18n-kf6 - kconfig-kf6 - karchive-kf6 - kpackage-kf6 - kservice-kf6 - qt6-declarative - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kdeclarative-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - plasma5-support - kcolorscheme-kf6 - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma-systemmonitor-kf6/actions.py b/desktop/kde6/plasma/plasma-systemmonitor-kf6/actions.py deleted file mode 100644 index 0eef11c64c..0000000000 --- a/desktop/kde6/plasma/plasma-systemmonitor-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/plasma/plasma-systemmonitor-kf6/pspec.xml b/desktop/kde6/plasma/plasma-systemmonitor-kf6/pspec.xml deleted file mode 100644 index dd51d5a9d9..0000000000 --- a/desktop/kde6/plasma/plasma-systemmonitor-kf6/pspec.xml +++ /dev/null @@ -1,215 +0,0 @@ - - - - - plasma-systemmonitor-kf6 - https://kde.org/plasma-desktop-kf6/ - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv3 - library - An interface for monitoring system sensors, process information and other system resources - Sistem sensörlerini, işlem bilgilerini ve diğer sistem kaynaklarını izlemek için bir arayüz - https://download.kde.org/stable/plasma/6.2.5/plasma-systemmonitor-6.2.5.tar.xz - - cmake - libgcc - kio-kf6-devel - ksystemstats-kf6 - kcrash-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - qt6-base-devel - kirigami-kf6-devel - knewstuff-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kitemmodels-kf6-devel - kiconthemes-kf6-devel - kdeclarative-kf6-devel - kglobalaccel-kf6-devel - qqc2-desktop-style-kf6 - extra-cmake-modules-kf6 - qt6-declarative-devel - kirigami-addons-kf6 - libksysguard-kf6-devel - - - - - - plasma-systemmonitor-kf6 - - kio-kf6 - kcrash-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kservice-kf6 - qt6-base - knewstuff-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kitemmodels-kf6 - kiconthemes-kf6 - kdeclarative-kf6 - kglobalaccel-kf6 - libksysguard-kf6 - kwindowsystem-kf6 - qt6-declarative - - - /usr/bin - /usr/lib - /usr/share - /usr/share/locale - /usr/share/config.kcfg - /usr/share/plasma-systemmonitor-kf6 - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-06 - 6.1.2 - fix dependencies - Ali Cengiz Kurt - alicengizkurt@gmail.com - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release. - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma-systemmonitor-kf6/translations.xml b/desktop/kde6/plasma/plasma-systemmonitor-kf6/translations.xml deleted file mode 100644 index f03aa0ddb7..0000000000 --- a/desktop/kde6/plasma/plasma-systemmonitor-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - plasma-systemmonitor-kf6 - Sistem sensörlerini, işlem bilgilerini ve diğer sistem kaynaklarını izlemek için bir arayüz - Sistem sensörlerini, işlem bilgilerini ve diğer sistem kaynaklarını izlemek için bir arayüz - - diff --git a/desktop/kde6/plasma/plasma-vault-kf6/actions.py b/desktop/kde6/plasma/plasma-vault-kf6/actions.py deleted file mode 100755 index d7124bf534..0000000000 --- a/desktop/kde6/plasma/plasma-vault-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/plasma-vault-kf6/pspec.xml b/desktop/kde6/plasma/plasma-vault-kf6/pspec.xml deleted file mode 100755 index 92cafd379c..0000000000 --- a/desktop/kde6/plasma/plasma-vault-kf6/pspec.xml +++ /dev/null @@ -1,197 +0,0 @@ - - - - - plasma-vault-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - GPLv2 - library - Plasma applet and services for creating encrypted vaults - Şifreli kasaları oluşturmak için kullanılan plazma uygulaması ve hizmetleri - https://download.kde.org/stable/plasma/6.2.5/plasma-vault-6.2.5.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - networkmanager-qt-kf6-devel - kwidgetsaddons-kf6-devel - plasma-activities-kf6-devel - kconfigwidgets-kf6-devel - libksysguard-kf6-devel - kdbusaddons-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - libplasma-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - encfs - kirigami-kf6-devel - kitemmodels-kf6-devel - kiconthemes-kf6-devel - NetworkManager-devel - - - - plasma-vault-kf6 - util.crypt - - qt6-base - kitemmodels-kf6 - kwidgetsaddons-kf6 - plasma-activities-kf6 - kconfigwidgets-kf6 - libksysguard-kf6 - kdbusaddons-kf6 - kconfig-kf6 - kcoreaddons-kf6 - libplasma-kf6 - kio-kf6 - ki18n-kf6 - libgcc - encfs - kirigami-kf6 - networkmanager-qt-kf6 - - - /usr/lib/qt6 - /usr/share - /usr/share/locale - /usr/share/kservice-kf6s5 - /usr/share/plasma - /usr/share/metainfo - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma-vault-kf6/translations.xml b/desktop/kde6/plasma/plasma-vault-kf6/translations.xml deleted file mode 100755 index c7cf642ab8..0000000000 --- a/desktop/kde6/plasma/plasma-vault-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - plasma-vault-kf6 - Plasma applet and services for creating encrypted vaults - Şifreli kasaları oluşturmak için kullanılan plazma uygulaması ve hizmetleri - - diff --git a/desktop/kde6/plasma/plasma-welcome-kf6/actions.py b/desktop/kde6/plasma/plasma-welcome-kf6/actions.py deleted file mode 100644 index 0eef11c64c..0000000000 --- a/desktop/kde6/plasma/plasma-welcome-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/plasma/plasma-welcome-kf6/pspec.xml b/desktop/kde6/plasma/plasma-welcome-kf6/pspec.xml deleted file mode 100644 index 79e9d2fcc6..0000000000 --- a/desktop/kde6/plasma/plasma-welcome-kf6/pspec.xml +++ /dev/null @@ -1,205 +0,0 @@ - - - - - plasma-welcome-kf6 - https://kde.org/plasma-desktop-kf6/ - - Mustafa Cinasal - muscnsl@gmail.com - - LGPLv3 - library - desktop.kde6.applications - A friendly onboarding wizard for Plasma - Plazma için arkadaş canlısı bir yerleştirme sihirbazı - https://download.kde.org/stable/plasma/6.2.5/plasma-welcome-6.2.5.tar.xz - - kio-kf6-devel - ki18n-kf6-devel - ksvg-kf6-devel - kconfig-kf6-devel - kcmutils-kf6-devel - kirigami-kf6-devel - kservice-kf6-devel - knewstuff-kf6-devel - qt6-base-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - kuserfeedback-kf6-devel - kwindowsystem-kf6-devel - knotifications-kf6-devel - libplasma-kf6-devel - qt6-declarative-devel - kaccounts-integration-kf6-devel - extra-cmake-modules-kf6 - kirigami-addons-kf6 - - - - - - plasma-welcome-kf6 - - kio-kf6 - ksvg-kf6 - ki18n-kf6 - libgcc - kcmutils-kf6 - kconfig-kf6 - kservice-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - kdeclarative-kf6 - kwindowsystem-kf6 - knotifications-kf6 - qt6-declarative - - - /usr/bin - /etc - /usr/lib - /usr/share - /usr/share/applications - /usr/share/locale - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma-welcome-kf6/translations.xml b/desktop/kde6/plasma/plasma-welcome-kf6/translations.xml deleted file mode 100644 index 19953c416b..0000000000 --- a/desktop/kde6/plasma/plasma-welcome-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - plasma-welcome-kf6 - A friendly onboarding wizard for Plasma - Plazma için arkadaş canlısı bir yerleştirme sihirbazı - - diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/actions.py b/desktop/kde6/plasma/plasma-workspace-kf6/actions.py deleted file mode 100644 index 0f7aeea1b6..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/actions.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import get -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - #pisitools.dosym("/usr/lib/drkonqi-kf6", "/usr/lib/libexec/drkonqi-kf6") - - pisitools.dosym("/usr/bin/startplasma-x11", "usr/bin/startkde") - - #set pisi-crocus-ancyrensis photos as default wallpapers - pisitools.dosed("%s/usr/share/plasma/look-and-feel/org.kde.breeze.desktop/contents/defaults" % get.installDIR(), "Next", "pisi-crocus-ancyrensis") - - #set pisi-crocus-ancyrensis photos as default wallpapers - # pisitools.dosed("%s/usr/share/plasma/look-and-feel/org.kde.breezedark.desktop/contents/defaults" % get.installDIR(), "Next", "pisi-crocus-ancyrensis") - # pisitools.dosed("%s/usr/share/plasma/look-and-feel/org.kde.breezetwilight.desktop/contents/defaults" % get.installDIR(), "Next", "pisi-crocus-ancyrensis") - - pisitools.removeDir("/usr/lib/systemd") - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/comar/kde.pam b/desktop/kde6/plasma/plasma-workspace-kf6/comar/kde.pam deleted file mode 100755 index 0e6062d7be..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/comar/kde.pam +++ /dev/null @@ -1,13 +0,0 @@ -# Begin /etc/pam.d/kde - -auth requisite pam_nologin.so -auth required pam_env.so - -auth required pam_succeed_if.so uid >= 0 quiet -auth include system-auth - -account include system-account -password include system-password -session include system-session - -# End /etc/pam.d/kde \ No newline at end of file diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/files/0001-Rename-qdbus-in-startkde.patch b/desktop/kde6/plasma/plasma-workspace-kf6/files/0001-Rename-qdbus-in-startkde.patch deleted file mode 100755 index 30ed016829..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/files/0001-Rename-qdbus-in-startkde.patch +++ /dev/null @@ -1,32 +0,0 @@ -diff --git a/startkde/startkde.cmake b/startkde/startkde.cmake -index 91c8a3c..0c658bd 100644 ---- a/startkde/startkde.cmake -+++ b/startkde/startkde.cmake -@@ -20,13 +20,13 @@ unset DYLD_FORCE_FLAT_NAMESPACE - bindir=`echo "$0" | sed -n 's,^\(/.*\)/[^/][^/]*$,\1,p'` - if [ -n "$bindir" ]; then - qbindir=`qtpaths --binaries-dir` -- qdbus=$qbindir/qdbus -+ qdbus=$qbindir/qdbus-qt5 - case $PATH in - $bindir|$bindir:*|*:$bindir|*:$bindir:*) ;; - *) PATH=$bindir:$PATH; export PATH;; - esac - else -- qdbus=qdbus -+ qdbus=qdbus-qt5 - fi - - # Check if a KDE session already is running and whether it's possible to connect to X -@@ -300,9 +300,9 @@ fi - if $qdbus >/dev/null 2>/dev/null; then - : # ok - else -- echo 'startkde: Could not start D-Bus. Can you call qdbus?' 1>&2 -+ echo 'startkde: Could not start D-Bus. Can you call qdbus-qt5?' 1>&2 - test -n "$ksplash_pid" && kill "$ksplash_pid" 2>/dev/null -- xmessage -geometry 500x100 "Could not start D-Bus. Can you call qdbus?" -+ xmessage -geometry 500x100 "Could not start D-Bus. Can you call qdbus-qt5?" - exit 1 - fi - diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/files/0003-Remove-export-of-QT_PLUGIN_PATH.patch b/desktop/kde6/plasma/plasma-workspace-kf6/files/0003-Remove-export-of-QT_PLUGIN_PATH.patch deleted file mode 100755 index 041febb4d8..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/files/0003-Remove-export-of-QT_PLUGIN_PATH.patch +++ /dev/null @@ -1,29 +0,0 @@ -From dde9b1c1930d333d8daff25c73400e1e67f3c630 Mon Sep 17 00:00:00 2001 -From: Hrvoje Senjan -Date: Sun, 7 Sep 2014 22:55:24 +0200 -Subject: [PATCH 3/3] Remove export of QT_PLUGIN_PATH - ---- - startkde/startkde.cmake | 6 ------ - 1 file changed, 6 deletions(-) - -diff --git a/startkde/startkde.cmake b/startkde/startkde.cmake -index 51721d1..1d67be0 100644 ---- a/startkde/startkde.cmake -+++ b/startkde/startkde.cmake -@@ -220,12 +220,6 @@ for prefix in `echo $scriptpath`; do - done - done - --# Set the path for Qt plugins provided by KDE --QT_PLUGIN_PATH=${QT_PLUGIN_PATH+$QT_PLUGIN_PATH:}`qtpaths --plugin-dir` --# TODO: Do we really need this? --QT_PLUGIN_PATH=$QT_PLUGIN_PATH:$kdehome/lib/kde6/plugins/ --export QT_PLUGIN_PATH -- - # Activate the kde font directories. - # - # There are 4 directories that may be used for supplying fonts for KDE. --- -2.1.0 - diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/files/390890.patch b/desktop/kde6/plasma/plasma-workspace-kf6/files/390890.patch deleted file mode 100644 index aea6104012..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/files/390890.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 0885170daf56fbb2d5558ae271bb44043a76d018 Mon Sep 17 00:00:00 2001 -From: Anthony Fieroni -Date: Mon, 14 Jan 2019 20:14:02 +0200 -Subject: [systemtray] Workaround component creation - -CCBUG: 390890 - -Differential Revision: https://phabricator.kde.org/D16890 - -Signed-off-by: Anthony Fieroni ---- - applets/systemtray/package/contents/ui/main.qml | 6 ++---- - 1 file changed, 2 insertions(+), 4 deletions(-) - -diff --git a/applets/systemtray/package/contents/ui/main.qml b/applets/systemtray/package/contents/ui/main.qml -index 55623e5..4e56996 100644 ---- a/applets/systemtray/package/contents/ui/main.qml -+++ b/applets/systemtray/package/contents/ui/main.qml -@@ -50,7 +50,8 @@ MouseArea { - - property alias statusNotifierModel: statusNotifierModel - -- property Component plasmoidItemComponent -+ // workaround https://bugreports.qt.io/browse/QTBUG-71238 / https://bugreports.qt.io/browse/QTBUG-72004 -+ property Component plasmoidItemComponent: Qt.createComponent("items/PlasmoidItem.qml") - - Plasmoid.onExpandedChanged: { - if (!plasmoid.expanded) { -@@ -102,9 +103,6 @@ MouseArea { - } - - Containment.onAppletAdded: { -- if (!plasmoidItemComponent) { -- plasmoidItemComponent = Qt.createComponent("items/PlasmoidItem.qml"); -- } - //Allow the plasmoid expander to know in what window it will be - var plasmoidContainer = plasmoidItemComponent.createObject(invisibleEntriesContainer, {"x": x, "y": y, "applet": applet}); - --- -cgit v1.1 - diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/files/build_fix-qt.patch b/desktop/kde6/plasma/plasma-workspace-kf6/files/build_fix-qt.patch deleted file mode 100755 index a895c5dc92..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/files/build_fix-qt.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nuar a/CMakeLists.txt b/CMakeLists.txt ---- a/CMakeLists.txt 2016-09-29 14:35:53.000000000 +0300 -+++ b/CMakeLists.txt 2016-10-08 15:25:48.701882533 +0300 -@@ -4,7 +4,7 @@ - - cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR) - --set(QT_MIN_VERSION "5.6.1") -+set(QT_MIN_VERSION "5.6.0") - set(KF5_MIN_VERSION "5.26.0") - set(INSTALL_SDDM_THEME TRUE) - find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Widgets Quick QuickWidgets Concurrent Test Script Network) diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/files/create_kdehome.patch b/desktop/kde6/plasma/plasma-workspace-kf6/files/create_kdehome.patch deleted file mode 100755 index a730ba66af..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/files/create_kdehome.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff --git a/startkde/startkde.cmake b/startkde/startkde.cmake -index 0c658bd..51721d1 100644 ---- a/startkde/startkde.cmake -+++ b/startkde/startkde.cmake -@@ -64,6 +64,14 @@ fi - - mkdir -p $configDir - -+kdehome=$HOME/@KDE_DEFAULT_HOME@ -+test -n "$KDEHOME" && kdehome=`echo "$KDEHOME"|sed "s,^~/,$HOME/,"` -+ -+# see kstartupconfig source for usage -+mkdir -m 700 -p $kdehome -+mkdir -m 700 -p $kdehome/share -+mkdir -m 700 -p $kdehome/share/config -+ - #This is basically setting defaults so we can use them with kstartupconfig5 - cat >$configDir/startupconfigkeys < -Date: Thu, 14 Oct 2021 15:44:33 -0600 -Subject: [PATCH] sddm-theme: fix missing password field on "Other" page - -On this page there is no concept of the user being passwordless because -no username has been specified by the user yet; we cannot know ahead of -time. As a result, userList.currentItem.needsPassword is blank so the -password field gets hidden. - -We should just assume that in username/password entry mode, all users -have a password set. For any users where this is not the case, they can -just leave the password blank, and it's not any worse than it was in -Plasma 5.22. - -BUG: 443737 -FIXED-IN: 5.23.1 - - -(cherry picked from commit f038ab3f494f26b443b10ff5dc9f156e1ec16341) ---- - sddm-theme/Login.qml | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/sddm-theme/Login.qml b/sddm-theme/Login.qml -index 8829666f1..6d3d62804 100644 ---- a/sddm-theme/Login.qml -+++ b/sddm-theme/Login.qml -@@ -83,7 +83,7 @@ SessionManagementScreen { - } - } - -- visible: userList.currentItem.needsPassword -+ visible: root.showUsernamePrompt || userList.currentItem.needsPassword - - Keys.onEscapePressed: { - mainStack.currentItem.forceActiveFocus(); -@@ -119,7 +119,7 @@ SessionManagementScreen { - - icon.name: text.length == 0 ? "go-next" : "" - -- text: userList.currentItem.needsPassword ? "" : i18n("Log In") -+ text: root.showUsernamePrompt || userList.currentItem.needsPassword ? "" : i18n("Log In") - onClicked: startLogin(); - } - } --- -GitLab - diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/files/f32002ce50edc3891f1fa41173132c820b917d57.patch b/desktop/kde6/plasma/plasma-workspace-kf6/files/f32002ce50edc3891f1fa41173132c820b917d57.patch deleted file mode 100755 index 26b8baa09b..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/files/f32002ce50edc3891f1fa41173132c820b917d57.patch +++ /dev/null @@ -1,31 +0,0 @@ -From f32002ce50edc3891f1fa41173132c820b917d57 Mon Sep 17 00:00:00 2001 -From: Marco Martin -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 ---- - solid-kf6uiserver/deviceserviceaction.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/solid-kf6uiserver/deviceserviceaction.cpp b/solid-kf6uiserver/deviceserviceaction.cpp -index f49c967..738b27c 100644 ---- a/solid-kf6uiserver/deviceserviceaction.cpp -+++ b/solid-kf6uiserver/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/desktop/kde6/plasma/plasma-workspace-kf6/files/kde-env.sh b/desktop/kde6/plasma/plasma-workspace-kf6/files/kde-env.sh deleted file mode 100755 index 56175eae19..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/files/kde-env.sh +++ /dev/null @@ -1,19 +0,0 @@ -export KF5=/usr -export QTDIR=/usr/lib/qt5 -export XDG_DATA_DIRS=$KF5/share:$XDG_DATA_DIRS:/usr/share -export XDG_CONFIG_DIRS=$XDG_CONFIG_DIRS:/etc/xdg -export PATH=$KF5/bin:$QTDIR/bin:$PATH -export QT_PLUGIN_PATH=$QTDIR/plugins:$QT_PLUGIN_PATH -export QML2_IMPORT_PATH=/usr/lib/qt5/qml:/usr/lib/qt5/qmldir -export QML_IMPORT_PATH=$QML2_IMPORT_PATH -export KDE_SESSION_VERSION=5 -export KDE_FULL_SESSION=true -#separete -export XDG_DATA_HOME=$HOME/.local/share -export XDG_CONFIG_HOME=$HOME/.config -export XDG_CACHE_HOME=$HOME/.cache -#export XDG_RUNTIME_DIR=/tmp/runtime-$USER -#build -export CMAKE_PREFIX_PATH=$KF5:$CMAKE_PREFIX_PATH -#debug -export QT_MESSAGE_PATTERN='%{appname}(%{pid})/%{category} %{function}: %{message}' diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/files/kde-np.pam b/desktop/kde6/plasma/plasma-workspace-kf6/files/kde-np.pam deleted file mode 100755 index 49d739c365..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/files/kde-np.pam +++ /dev/null @@ -1,13 +0,0 @@ -# Begin /etc/pam.d/kde-np - -auth requisite pam_nologin.so -auth required pam_env.so - -auth required pam_succeed_if.so uid >= 0 quiet -auth required pam_permit.so - -account include system-account -password include system-password -session include system-session - -# End /etc/pam.d/kde-np \ No newline at end of file diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/files/kde.pam b/desktop/kde6/plasma/plasma-workspace-kf6/files/kde.pam deleted file mode 100755 index 0e6062d7be..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/files/kde.pam +++ /dev/null @@ -1,13 +0,0 @@ -# Begin /etc/pam.d/kde - -auth requisite pam_nologin.so -auth required pam_env.so - -auth required pam_succeed_if.so uid >= 0 quiet -auth include system-auth - -account include system-account -password include system-password -session include system-session - -# End /etc/pam.d/kde \ No newline at end of file diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/files/kscreensaver.pam b/desktop/kde6/plasma/plasma-workspace-kf6/files/kscreensaver.pam deleted file mode 100644 index 1f493e3367..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/files/kscreensaver.pam +++ /dev/null @@ -1,6 +0,0 @@ -# Begin /etc/pam.d/kscreen-kf6saver - -auth include system-auth -account include system-account - -# End /etc/pam.d/kscreen-kf6saver diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/files/lockscreen-focus.patch b/desktop/kde6/plasma/plasma-workspace-kf6/files/lockscreen-focus.patch deleted file mode 100755 index c4e1b17e52..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/files/lockscreen-focus.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/lookandfeel/contents/lockscreen-kf6/Lockscreen-kf6.qml -+++ b/lookandfeel/contents/lockscreen-kf6/Lockscreen-kf6.qml -@@ -156,6 +156,14 @@ - enabled: !authenticator.graceLocked - onAccepted: unlockFunction() - focus: true -+ //HACK: Similar hack is needed in sddm loginscreen -+ //TODO: investigate -+ Timer { -+ interval: 200 -+ running: true -+ repeat: false -+ onTriggered: passwordInput.forceActiveFocus() -+ } - visible: block.mainItem.model.get(block.mainItem.selectedIndex)["showPassword"] - onVisibleChanged: { - if (visible) { diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/files/plasma-animation-duration.patch b/desktop/kde6/plasma/plasma-workspace-kf6/files/plasma-animation-duration.patch deleted file mode 100644 index 242dd50c63..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/files/plasma-animation-duration.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 2958702524348e9e4fcbdf490be731e92b353dad Mon Sep 17 00:00:00 2001 -From: Nate Graham -Date: Tue, 24 Mar 2020 08:10:54 -0600 -Subject: Stop multiplying duration values - -Summary: -After D28144, some animations are now too long because they were inappropriately -multiplying a duration value. That's no longer necessary, so let's remove the -multiplication. - -Depends on D28144 - -Test Plan: Various things that were a bit too slow before feel just right now - -Reviewers: #vdg, #plasma, cblack - -Reviewed By: #vdg, #plasma, cblack - -Subscribers: cblack, plasma-devel - -Tags: #plasma - -Differential Revision: https://phabricator.kde.org/D28238 ---- - applets/devicenotifier/package/contents/ui/FullRepresentation.qml | 2 +- - applets/systemtray/package/contents/ui/ExpanderArrow.qml | 2 +- - lookandfeel/contents/components/ActionButton.qml | 4 ++-- - lookandfeel/contents/components/UserDelegate.qml | 2 +- - 4 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/applets/devicenotifier/package/contents/ui/FullRepresentation.qml b/applets/devicenotifier/package/contents/ui/FullRepresentation.qml -index d15e47c..80b9c73 100644 ---- a/applets/devicenotifier/package/contents/ui/FullRepresentation.qml -+++ b/applets/devicenotifier/package/contents/ui/FullRepresentation.qml -@@ -225,7 +225,7 @@ MouseArea { - popupIconTimer.restart() - } - } -- Behavior on height { NumberAnimation { duration: units.shortDuration * 3 } } -+ Behavior on height { NumberAnimation { duration: units.shortDuration } } - } - } - } -diff --git a/applets/systemtray/package/contents/ui/ExpanderArrow.qml b/applets/systemtray/package/contents/ui/ExpanderArrow.qml -index 9baf654..729f56b 100644 ---- a/applets/systemtray/package/contents/ui/ExpanderArrow.qml -+++ b/applets/systemtray/package/contents/ui/ExpanderArrow.qml -@@ -37,7 +37,7 @@ PlasmaCore.ToolTipArea { - anchors.fill: parent - onClicked: root.expanded = !root.expanded - -- readonly property int arrowAnimationDuration: units.shortDuration * 3 -+ readonly property int arrowAnimationDuration: units.shortDuration - - PlasmaCore.Svg { - id: arrowSvg -diff --git a/lookandfeel/contents/components/ActionButton.qml b/lookandfeel/contents/components/ActionButton.qml -index 9fbd2a8..7a66c56 100644 ---- a/lookandfeel/contents/components/ActionButton.qml -+++ b/lookandfeel/contents/components/ActionButton.qml -@@ -44,7 +44,7 @@ Item { - opacity: activeFocus || containsMouse ? 1 : 0.85 - Behavior on opacity { - PropertyAnimation { // OpacityAnimator makes it turn black at random intervals -- duration: units.longDuration * 2 -+ duration: units.longDuration - easing.type: Easing.InOutQuad - } - } -@@ -59,7 +59,7 @@ Item { - opacity: activeFocus || containsMouse ? (softwareRendering ? 0.8 : 0.15) : (softwareRendering ? 0.6 : 0) - Behavior on opacity { - PropertyAnimation { // OpacityAnimator makes it turn black at random intervals -- duration: units.longDuration * 3 -+ duration: units.longDuration - easing.type: Easing.InOutQuad - } - } -diff --git a/lookandfeel/contents/components/UserDelegate.qml b/lookandfeel/contents/components/UserDelegate.qml -index 8882e39..cdb55f1 100644 ---- a/lookandfeel/contents/components/UserDelegate.qml -+++ b/lookandfeel/contents/components/UserDelegate.qml -@@ -72,7 +72,7 @@ Item { - Behavior on width { - PropertyAnimation { - from: faceSize -- duration: units.longDuration * 2; -+ duration: units.longDuration; - } - } - width: isCurrent ? faceSize : faceSize - units.largeSpacing --- -cgit v1.1 - diff --git a/desktop/kde6/plasma/plasma-workspace-kf6/pspec.xml b/desktop/kde6/plasma/plasma-workspace-kf6/pspec.xml deleted file mode 100644 index 1e8500d90b..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-kf6/pspec.xml +++ /dev/null @@ -1,528 +0,0 @@ - - - - - plasma-workspace-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - app:gui - The kde6 Plasma Workspace Components - The kde6 Plasma Workspace Components - mirrors://kde/stable/plasma/6.2.5/plasma-workspace-6.2.5.tar.xz - - libgcc - icu4c-devel - cups-devel - appstream-devel - kded-kf6-devel - kio-kf6-devel - zlib-devel - baloo-kf6-devel - kauth-kf6-devel - ki18n-kf6-devel - libSM-devel - kquickcharts-kf6 - solid-kf6-devel - kdesu-kf6-devel - appmenu-gtk-module-devel - qt6-wayland-devel - kcrash-kf6-devel - libICE-devel - libX11-devel - libXau-devel - libxcb-devel - prison-kf6-devel - kconfig-kf6-devel - kpeople-kf6-devel - krunner-kf6-devel - kwallet-kf6-devel - kxmlgui-kf6-devel - libXtst-devel - kpackage-kf6-devel - kservice-kf6-devel - kunitconversion-kf6-devel - kwayland-kf6-devel - xcb-util-devel - kirigami-kf6-devel - kholidays-kf6-devel - kidletime-kf6-devel - xorg-app-devel - knewstuff-kf6-devel - iso-codes-devel - libXfixes-devel - kbookmarks-kf6-devel - kguiaddons-kf6-devel - libXrender-devel - qt6-phonon-devel - plasma-activities-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kiconthemes-kf6-devel - kitemmodels-kf6-devel - kjobwidgets-kf6-devel - ktexteditor-kf6-devel - extra-cmake-modules-kf6 - kdeclarative-kf6-devel - kglobalaccel-kf6-devel - ktextwidgets-kf6-devel - libqalculate-devel - appstream-qt6-devel - knotifyconfig-kf6-devel - kuserfeedback-kf6-devel - NetworkManager-devel - kconfigwidgets-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - xcb-util-image-devel - libplasma-kf6-devel - plasma-activities-stats-kf6-devel - networkmanager-qt-kf6-devel - oxygen-sounds-kf6 - kwin-kf6-devel - qt6-sql-odbc - qt6-sql-mysql - qt6-base-devel - qt6-shadertools-devel - qt6-sql-sqlite - libkscreen-kf6-devel - qt6-sql-postgresql - libksysguard-kf6-devel - - kwindowsystem-kf6-devel - kscreenlocker-kf6-devel - - qt6-declarative-devel - qt6-virtualkeyboard-devel - qt6-positioning-devel - gpsd-devel - libXft-devel - qt6-svg-devel - pipewire-devel - kdoctools-kf6-devel - kcmutils-kf6-devel - wayland-devel - wayland-server - wayland-client - wayland-cursor - breeze-gtk-kf6 - xorg-util - libXcursor-devel - libinput-devel - xcb-util-cursor-devel - xcb-util-wm-devel - plasma-wayland-protocols-kf6 - xcb-util-renderutil-devel - breeze-style-kf6 - breeze-cursors-kf6 - breeze-wallpapers-kf6 - kpipewire-kf6-devel - libkexiv2-kf6-devel - - polkit-qt6-devel - libdrm-devel - ksvg-kf6-devel - packagekit-qt6-devel - libcanberra-devel - qt6-5compat-devel - plasma5-support-devel - kcolorscheme-kf6-devel - kstatusnotifieritem-kf6-devel - kirigami-addons-kf6 - kwin-wayland-kf6 - - qcoro-qt6-devel - - - - - - - - - - plasma-workspace-kf6 - - kio-kf6 - zlib - baloo-kf6 - icu4c - kauth-kf6 - ki18n-kf6 - libSM - solid-kf6 - kcrash-kf6 - libgcc - libICE - libX11 - libXau - libxcb - appstream - kded-kf6 - prison-kf6 - kconfig-kf6 - kpeople-kf6 - krunner-kf6 - kwallet-kf6 - kxmlgui-kf6 - libXtst - kunitconversion-kf6 - kpackage-kf6 - kpipewire-kf6 - kservice-kf6 - kwayland-kf6 - xcb-util - kholidays-kf6 - kidletime-kf6 - knewstuff-kf6 - packagekit-qt6 - - - polkit-qt6 - libXfixes - kbookmarks-kf6 - kguiaddons-kf6 - libXrender - libkscreen-kf6 - qt6-phonon - plasma-activities-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - ktexteditor-kf6 - kdeclarative-kf6 - kglobalaccel-kf6 - ktextwidgets-kf6 - libksysguard-kf6 - libqalculate - appstream-qt6 - knotifyconfig-kf6 - kscreenlocker-kf6 - kuserfeedback-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - xcb-util-image - libplasma-kf6 - plasma-activities-stats-kf6 - networkmanager-qt-kf6 - appmenu-gtk-module - oxygen-sounds-kf6 - qt6-base - qt6-shadertools - qt6-declarative - qt6-positioning - - gpsd - kparts-kf6 - libXft - qt6-svg - freetype - karchive-kf6 - kcmutils-kf6 - libglvnd - pipewire - fontconfig - libXcursor - qt6-wayland - wayland-client - layer-shell-qt-kf6 - ksvg-kf6 - libcanberra - qt6-5compat - plasma5-support - kcolorscheme-kf6 - kstatusnotifieritem-kf6 - kirigami-addons-kf6 - qcoro-qt6 - - - /etc/pam.d - /etc/env.d - /etc/xdg - /usr/share - /usr/share/applications - /usr/share/locale - /usr/bin - /usr/lib/qt5/plugins - /usr/lib/qt5/qml - /usr/lib - /usr/share/doc - /usr/share/plasma/look-and-feel - - - kde.pam - kde-np.pam - kscreensaver.pam - - - - - - plasma-workspace-kf6-devel - Development files for kde6 plasma-workspace-kf6 - - plasma-workspace-kf6 - kio-kf6-devel - zlib-devel - baloo-kf6-devel - kauth-kf6-devel - ki18n-kf6-devel - libSM-devel - solid-kf6-devel - - kcrash-kf6-devel - libICE-devel - libX11-devel - libXau-devel - libxcb-devel - prison-kf6-devel - kconfig-kf6-devel - kpeople-kf6-devel - krunner-kf6-devel - kwallet-kf6-devel - kxmlgui-kf6-devel - libXtst-devel - kpackage-kf6-devel - kservice-kf6-devel - kwayland-kf6-devel - xcb-util-devel - - kholidays-kf6-devel - kidletime-kf6-devel - - knewstuff-kf6-devel - - libXfixes-devel - kbookmarks-kf6-devel - kguiaddons-kf6-devel - libXrender-devel - qt6-phonon-devel - plasma-activities-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kiconthemes-kf6-devel - kitemmodels-kf6-devel - kjobwidgets-kf6-devel - ktexteditor-kf6-devel - extra-cmake-modules-kf6 - kdeclarative-kf6-devel - kglobalaccel-kf6-devel - ktextwidgets-kf6-devel - libqalculate-devel - appstream-qt6-devel - knotifyconfig-kf6-devel - kuserfeedback-kf6-devel - - kconfigwidgets-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - xcb-util-image-devel - kmenuedit-kf6 - libplasma-kf6-devel - plasma-activities-stats-kf6-devel - networkmanager-qt-kf6-devel - - qt6-base-devel - libkscreen-kf6-devel - libksysguard-kf6-devel - - kwindowsystem-kf6-devel - kscreenlocker-kf6-devel - qt6-declarative-devel - - xcb-util-wm-devel - xcb-util-renderutil-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - plasma-workspace-wayland-kf6 - Wayland support for Plasma - - plasma-workspace-kf6 - xorg-xwayland - kwin-wayland-kf6 - - - /usr/bin/startplasma-wayland - /usr/share/wayland-sessions/plasmawayland.desktop - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-06-09 - 6.0.5.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-14 - 6.0.3 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma-workspace-wallpapers-kf6/actions.py b/desktop/kde6/plasma/plasma-workspace-wallpapers-kf6/actions.py deleted file mode 100755 index 365c8d3b5e..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-wallpapers-kf6/actions.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - shelltools.system("tar xf ../blue.tar.gz") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.insinto("/usr/share/wallpapers/pisilinux-blue", "blue/*") - pisitools.insinto("/usr/share/wallpapers/sweet-cat", "../Sweet-cat/*") - pisitools.insinto("/usr/share/wallpapers/pisi-crocus-ancyrensis", "../pisi-crocus-ancyrensis/*") - - pisitools.dodoc("COPYING", "AUTHORS") diff --git a/desktop/kde6/plasma/plasma-workspace-wallpapers-kf6/pspec.xml b/desktop/kde6/plasma/plasma-workspace-wallpapers-kf6/pspec.xml deleted file mode 100755 index cf6d614574..0000000000 --- a/desktop/kde6/plasma/plasma-workspace-wallpapers-kf6/pspec.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - plasma-workspace-wallpapers-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - app:gui - The KDE Plasma Workspace Components - The KDE Plasma Workspace Components - mirrors://kde/stable/plasma/6.2.5/plasma-workspace-wallpapers-6.2.5.tar.xz - https://sourceforge.net/projects/pisilinux/files/source/blue.tar.gz - https://sourceforge.net/projects/pisilinux/files/source/Sweet-cat.tar.gz - https://github.com/prdsmehmetstc/pisi-crocus-ancyrensis/releases/download/v1.0/pisi-crocus-ancyrensis.tar.gz - - qt6-base-devel - extra-cmake-modules-kf6 - - - - - plasma-workspace-wallpapers-kf6 - - qt6-base - - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - plasma-workspace-wallpapers-pisilinux-kf6 - - /usr/share/wallpapers/sweet-cat - /usr/share/wallpapers/pisilinux-blue - /usr/share/wallpapers/pisi-crocus-ancyrensis - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma5-support/actions.py b/desktop/kde6/plasma/plasma5-support/actions.py deleted file mode 100644 index 0eef11c64c..0000000000 --- a/desktop/kde6/plasma/plasma5-support/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/plasma/plasma5-support/pspec.xml b/desktop/kde6/plasma/plasma5-support/pspec.xml deleted file mode 100644 index 69fa1d2ce3..0000000000 --- a/desktop/kde6/plasma/plasma5-support/pspec.xml +++ /dev/null @@ -1,209 +0,0 @@ - - - - - plasma5-support - https://kde.org/plasma-desktop/ - - Mustafa Cinasal - muscnsl@gmail.com - - LGPLv3 - library - Support components for porting from KF5/Qt5 to KF6/Qt6 - KF5/Qt5'ten KF6/Qt6'ya geçiş için destek bileşenleri - https://download.kde.org/stable/plasma/6.2.5/plasma5support-6.2.5.tar.xz - - qt6-base-devel - qt6-sql-mysql - qt6-sql-odbc - qt6-sql-sqlite - qt6-sql-postgresql - kio-kf6-devel - ki18n-kf6-devel - solid-kf6-devel - kconfig-kf6-devel - kguiaddons-kf6-devel - knotifications-kf6-devel - kcoreaddons-kf6-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - libksysguard-kf6-devel - - - - - - plasma5-support - - qt6-base - qt6-sql-mysql - qt6-sql-odbc - qt6-sql-sqlite - qt6-sql-postgresql - kio-kf6 - ki18n-kf6 - solid-kf6 - kconfig-kf6 - kguiaddons-kf6 - knotifications-kf6 - kcoreaddons-kf6 - qt6-declarative - libksysguard-kf6 - - - /usr/lib - /usr/share/plasma5support - /usr/share/qlogging-categories6 - /usr/share/locale - /usr/share/doc - - - - - plasma5-support-devel - Development files for plasma5-support - - plasma5-support - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plasma5-support/translations.xml b/desktop/kde6/plasma/plasma5-support/translations.xml deleted file mode 100644 index ef708345f3..0000000000 --- a/desktop/kde6/plasma/plasma5-support/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - plasma5-support - Support components for porting from KF5/Qt5 to KF6/Qt6 - KF5/Qt5'ten KF6/Qt6'ya geçiş için destek bileşenleri - - diff --git a/desktop/kde6/plasma/plymouth-kcm-kf6/actions.py b/desktop/kde6/plasma/plymouth-kcm-kf6/actions.py deleted file mode 100644 index 0eef11c64c..0000000000 --- a/desktop/kde6/plasma/plymouth-kcm-kf6/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/plasma/plymouth-kcm-kf6/pspec.xml b/desktop/kde6/plasma/plymouth-kcm-kf6/pspec.xml deleted file mode 100644 index defac10c94..0000000000 --- a/desktop/kde6/plasma/plymouth-kcm-kf6/pspec.xml +++ /dev/null @@ -1,191 +0,0 @@ - - - - - plymouth-kcm-kf6 - https://kde.org/plasma-desktop-kf6/ - - PisiLinux Community - admins@pisilinux.org - - LGPLv3 - library - KCM to manage the Plymouth (Boot) theme - plymouth-kcm-kf6 - KCM, Plymouth (Boot) temasını yönetecek - https://download.kde.org/stable/plasma/6.2.5/plymouth-kcm-6.2.5.tar.xz - - kio-kf6-devel - kauth-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcmutils-kf6-devel - plymouth-devel - karchive-kf6-devel - qt6-base-devel - knewstuff-kf6-devel - kcoreaddons-kf6-devel - kdeclarative-kf6-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - - - - - plymouth-kcm-kf6 - - kio-kf6 - kauth-kf6 - ki18n-kf6 - kconfig-kf6 - karchive-kf6 - qt6-base - knewstuff-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - qt6-declarative - - - /usr/bin - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/plymouth-kcm-kf6/translations.xml b/desktop/kde6/plasma/plymouth-kcm-kf6/translations.xml deleted file mode 100644 index 9758836021..0000000000 --- a/desktop/kde6/plasma/plymouth-kcm-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - plymouth-kcm-kf6 - KCM to manage the Plymouth (Boot) theme - KCM, Plymouth (Boot) temasını yönetecek - - diff --git a/desktop/kde6/plasma/polkit-kde-authentication-agent-1-kf6/actions.py b/desktop/kde6/plasma/polkit-kde-authentication-agent-1-kf6/actions.py deleted file mode 100755 index fb703f61d5..0000000000 --- a/desktop/kde6/plasma/polkit-kde-authentication-agent-1-kf6/actions.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/lib/systemd") - - #pisitools.dodoc("COPYING") diff --git a/desktop/kde6/plasma/polkit-kde-authentication-agent-1-kf6/pspec.xml b/desktop/kde6/plasma/polkit-kde-authentication-agent-1-kf6/pspec.xml deleted file mode 100755 index 6f5d2722d2..0000000000 --- a/desktop/kde6/plasma/polkit-kde-authentication-agent-1-kf6/pspec.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - - - polkit-kde-authentication-agent-1-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - app:gui - The KDE Plasma Workspace Components - The Polkit-KDE-Agent package contains a graphical Polkit authentication agent for the KDE Plasma Desktop. - mirrors://kde/stable/plasma/6.2.5/polkit-kde-agent-1-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - knotifications-kf6-devel - polkit-qt6-devel - elogind-devel - mesa-devel - extra-cmake-modules-kf6 - - - - - - - polkit-kde-authentication-agent-1-kf6 - - qt6-base - qt6-declarative - libgcc - kcrash-kf6 - kcoreaddons-kf6 - polkit-qt6 - ki18n-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kwindowsystem-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/powerdevil-kf6/actions.py b/desktop/kde6/plasma/powerdevil-kf6/actions.py deleted file mode 100755 index d06c6ad728..0000000000 --- a/desktop/kde6/plasma/powerdevil-kf6/actions.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/lib/systemd") - - pisitools.dodoc("COPYING") diff --git a/desktop/kde6/plasma/powerdevil-kf6/files/powerdevil-enable-upower.patch b/desktop/kde6/plasma/powerdevil-kf6/files/powerdevil-enable-upower.patch deleted file mode 100755 index ca67259408..0000000000 --- a/desktop/kde6/plasma/powerdevil-kf6/files/powerdevil-enable-upower.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/daemon/BackendConfig.cmake b/daemon/BackendConfig.cmake -index 54094e0..c9e4dc5 100644 ---- a/daemon/BackendConfig.cmake -+++ b/daemon/BackendConfig.cmake -@@ -18,6 +18,8 @@ if (UDEV_FOUND) - backends/upower/udevqtdevice.cpp - ) - -+ add_definitions(-DHAVE_UDEV) -+ - set_source_files_properties( - ${CMAKE_CURRENT_SOURCE_DIR}/backends/upower/dbus/org.freedesktop.UPower.xml - ${CMAKE_CURRENT_SOURCE_DIR}/backends/upower/dbus/org.freedesktop.UPower.Device.xml \ No newline at end of file diff --git a/desktop/kde6/plasma/powerdevil-kf6/pspec.xml b/desktop/kde6/plasma/powerdevil-kf6/pspec.xml deleted file mode 100755 index 70e55ae4fb..0000000000 --- a/desktop/kde6/plasma/powerdevil-kf6/pspec.xml +++ /dev/null @@ -1,244 +0,0 @@ - - - - - powerdevil-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - KDE power manager module - KDE Power Management module. Provides kded-kf6 daemon DBus helper and KCM for configuring Power settings - mirrors://kde/stable/plasma/6.2.5/powerdevil-6.2.5.tar.xz - - qt6-base-devel - qt6-wayland-devel - kdoctools-kf6-devel - kidletime-kf6-devel - libxcb-devel - eudev-devel - plasma-activities-kf6-devel - kauth-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kirigami-kf6-devel - kglobalaccel-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - kwayland-kf6-devel - libkscreen-kf6-devel - networkmanager-qt-kf6-devel - solid-kf6-devel - kunitconversion-kf6-devel - kitemmodels-kf6-devel - docbook-xsl - plasma-workspace-kf6-devel - extra-cmake-modules-kf6 - ki18n-kf6-devel - bluez-qt-kf6-devel - kcrash-kf6-devel - knotifications-kf6-devel - NetworkManager-devel - kcmutils-kf6-devel - qcoro-qt6-devel - wayland-devel - wayland-client - plasma-wayland-protocols-kf6 - - - - - - - - powerdevil-kf6 - - qt6-base - qt6-wayland - qt6-declarative - kidletime-kf6 - libgcc - libxcb - eudev - krunner-kf6 - wayland-client - plasma-workspace-kf6 - kio-kf6 - kauth-kf6 - kcrash-kf6 - ki18n-kf6 - solid-kf6 - kconfig-kf6 - kxmlgui-kf6 - kirigami-kf6 - kservice-kf6 - kwayland-kf6 - libkscreen-kf6 - plasma-activities-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kglobalaccel-kf6 - knotifyconfig-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - networkmanager-qt-kf6 - bluez-qt-kf6 - kcmutils-kf6 - qcoro-qt6 - wayland - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild qt6. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/print-manager-kf6/actions.py b/desktop/kde6/plasma/print-manager-kf6/actions.py deleted file mode 100755 index 120217881d..0000000000 --- a/desktop/kde6/plasma/print-manager-kf6/actions.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() diff --git a/desktop/kde6/plasma/print-manager-kf6/pspec.xml b/desktop/kde6/plasma/print-manager-kf6/pspec.xml deleted file mode 100755 index bb3cacb8c2..0000000000 --- a/desktop/kde6/plasma/print-manager-kf6/pspec.xml +++ /dev/null @@ -1,189 +0,0 @@ - - - - - print-manager-kf6 - http://www.kde.org/applications/graphics/kruler - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - print-manager - app:gui - desktop.kde6.utils - KDE print manager - KDE print tool. - mirrors://kde/stable/plasma/6.2.5/print-manager-6.2.5.tar.xz - - kdoctools-kf6-devel - extra-cmake-modules-kf6 - cups-devel - kio-kf6-devel - ki18n-kf6-devel - libgcc - kconfig-kf6-devel - kservice-kf6-devel - kirigami-kf6-devel - qt6-base-devel - qt6-5compat-devel - kdbusaddons-kf6-devel - kiconthemes-kf6-devel - kcoreaddons-kf6-devel - kwindowsystem-kf6-devel - knotifications-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - qt6-declarative-devel - kcmutils-kf6-devel - packagekit-qt6-devel - libplasma-kf6-devel - - - - - print-manager-kf6 - - kio-kf6 - cups - ki18n-kf6 - libgcc - kconfig-kf6 - kservice-kf6 - qt6-base - qt6-5compat - kdbusaddons-kf6 - kiconthemes-kf6 - kcoreaddons-kf6 - kwindowsystem-kf6 - knotifications-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - kcmutils-kf6 - packagekit-qt6 - system-config-printer - - - /usr/lib - /usr/share/doc - /usr/bin - /usr/share - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-13 - 6.0.2 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/print-manager-kf6/translations.xml b/desktop/kde6/plasma/print-manager-kf6/translations.xml deleted file mode 100755 index 8fb33764cd..0000000000 --- a/desktop/kde6/plasma/print-manager-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kruler - Ekran cetveli ve renk ölçüm aracı - KRuler, bir ekran cetveli ve renk ölçüm aracıdır. - - \ No newline at end of file diff --git a/desktop/kde6/plasma/qqc2-breeze-style/actions.py b/desktop/kde6/plasma/qqc2-breeze-style/actions.py deleted file mode 100644 index 0eef11c64c..0000000000 --- a/desktop/kde6/plasma/qqc2-breeze-style/actions.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import pisitools -from pisi.actionsapi import kde6 - -def setup(): - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*", "README*") diff --git a/desktop/kde6/plasma/qqc2-breeze-style/pspec.xml b/desktop/kde6/plasma/qqc2-breeze-style/pspec.xml deleted file mode 100644 index 74bc625435..0000000000 --- a/desktop/kde6/plasma/qqc2-breeze-style/pspec.xml +++ /dev/null @@ -1,180 +0,0 @@ - - - - - qqc2-breeze-style - https://kde.org/plasma-desktop/ - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - library - Applications useful for Plasma development - qqc2-breeze-style - Plazma geliştirme için yararlı uygulamalar - https://download.kde.org/stable/plasma/6.2.5/qqc2-breeze-style-6.2.5.tar.xz - - qt6-base-devel - kconfig-kf6-devel - kirigami-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - kcoreaddons-kf6-devel - kquickcharts-kf6 - qt6-declarative-devel - kcolorscheme-kf6-devel - extra-cmake-modules-kf6 - - - - - - qqc2-breeze-style - - qt6-base - kconfig-kf6 - kirigami-kf6 - kguiaddons-kf6 - kiconthemes-kf6 - qt6-declarative - kcolorscheme-kf6 - - - /usr/lib - /usr/share - /usr/share/doc - - - - - qqc2-breeze-style-devel - Development files for qqc2-breeze-style - - qqc2-breeze-style - - - /usr/lib/cmake - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-13 - 6.0.2 - First release - PisiLinux Community - admins@pisilinux.org - - - diff --git a/desktop/kde6/plasma/qqc2-breeze-style/translations.xml b/desktop/kde6/plasma/qqc2-breeze-style/translations.xml deleted file mode 100644 index 5f1c6b2866..0000000000 --- a/desktop/kde6/plasma/qqc2-breeze-style/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - qqc2-breeze-style - Applications useful for Plasma development - Plazma geliştirme için yararlı uygulamalar - - diff --git a/desktop/kde6/plasma/sddm-kcm-kf6/actions.py b/desktop/kde6/plasma/sddm-kcm-kf6/actions.py deleted file mode 100755 index 3a8b06bfce..0000000000 --- a/desktop/kde6/plasma/sddm-kcm-kf6/actions.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("CONTRIBUTORS", "README*") diff --git a/desktop/kde6/plasma/sddm-kcm-kf6/pspec.xml b/desktop/kde6/plasma/sddm-kcm-kf6/pspec.xml deleted file mode 100755 index 94163e0613..0000000000 --- a/desktop/kde6/plasma/sddm-kcm-kf6/pspec.xml +++ /dev/null @@ -1,209 +0,0 @@ - - - - - sddm-kcm-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - app:console - desktop.misc - kde6 Config Module for SDDM - kde6 Config Module for SDDM - mirrors://kde/stable/plasma/6.2.5/sddm-kcm-6.2.5.tar.xz - - kcoreaddons-kf6-devel - kdoctools-kf6-devel - kconfigwidgets-kf6-devel - karchive-kf6-devel - kauth-kf6-devel - libX11-devel - kxmlgui-kf6-devel - ki18n-kf6-devel - kcmutils-kf6-devel - kdeclarative-kf6-devel - qt6-base-devel - kio-kf6-devel - qt6-declarative-devel - kconfig-kf6-devel - kservice-kf6-devel - mesa-devel - docutils - libXcursor-devel - xcb-util-image-devel - extra-cmake-modules-kf6 - knewstuff-kf6-devel - libxcb-devel - - - - - sddm-kcm-kf6 - - kcoreaddons-kf6 - sddm - karchive-kf6 - libX11 - kconfigwidgets-kf6 - kauth-kf6 - knewstuff-kf6 - ki18n-kf6 - kcmutils-kf6 - kdeclarative-kf6 - qt6-base - kio-kf6 - libXcursor - kconfig-kf6 - kservice-kf6 - qt6-declarative - kwidgetsaddons-kf6 - - - /etc/dbus-1/system.d - /usr/share/dbus-1/system-services - /usr/share/kservice-kf6s5 - /usr/share/ - /etc/xdg/sddmtheme.knsrc - /usr/share/polkit-1/actions - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5/plugins - /usr/lib/libexec/kauth-kf6 - /usr/lib - /usr/share/doc - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/sddm-kcm-kf6/translations.xml b/desktop/kde6/plasma/sddm-kcm-kf6/translations.xml deleted file mode 100755 index 402eb84dbb..0000000000 --- a/desktop/kde6/plasma/sddm-kcm-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - kde6-sddm-kcm-kf6 - kde6 Config Module for SDDM - kde6 Config Module for SDDM - - diff --git a/desktop/kde6/plasma/system-settings-kf6/actions.py b/desktop/kde6/plasma/system-settings-kf6/actions.py deleted file mode 100755 index 8ebe6c5f2e..0000000000 --- a/desktop/kde6/plasma/system-settings-kf6/actions.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("rm -rf po/id") - kde6.configure("-DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_INSTALL_LIBDIR=lib \ - -DBUILD_TESTING=OFF") - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/system-settings-kf6/pspec.xml b/desktop/kde6/plasma/system-settings-kf6/pspec.xml deleted file mode 100755 index 9d16acfa42..0000000000 --- a/desktop/kde6/plasma/system-settings-kf6/pspec.xml +++ /dev/null @@ -1,249 +0,0 @@ - - - - - system-settings-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - kde6 system settings manager - system-settings-kf6 is a control panel for kde6 Plasma - mirrors://kde/stable/plasma/6.2.5/systemsettings-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - - kconfig-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kitemviews-kf6-devel - kpackage-kf6-devel - kservice-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - kdoctools-kf6-devel - kio-kf6-devel - kauth-kf6-devel - - kcmutils-kf6-devel - docbook-xsl - plasma-activities-kf6-devel - plasma-activities-stats-kf6-devel - kirigami-kf6-devel - kguiaddons-kf6-devel - extra-cmake-modules-kf6 - kitemmodels-kf6-devel - kcrash-kf6-devel - kirigami-addons-kf6 - plasma-workspace-kf6-devel - - - - - system-settings-kf6 - - qt6-base - qt6-declarative - kauth-kf6 - kcrash-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kcmutils-kf6 - kconfig-kf6 - kdbusaddons-kf6 - - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - kitemviews-kf6 - kservice-kf6 - kwindowsystem-kf6 - kxmlgui-kf6 - kpackage-kf6 - plasma-activities-kf6 - kdeclarative-kf6 - kitemmodels-kf6 - plasma-activities-stats-kf6 - plasma-workspace-kf6 - kirigami-addons-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/xdg-desktop-portal-kde-kf6/actions.py b/desktop/kde6/plasma/xdg-desktop-portal-kde-kf6/actions.py deleted file mode 100755 index 3fb8808c56..0000000000 --- a/desktop/kde6/plasma/xdg-desktop-portal-kde-kf6/actions.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Licensed under the GNU General Public License, version 3. -# See the file http://www.gnu.org/licenses/gpl.txt - -from pisi.actionsapi import kde6 -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -def setup(): - #shelltools.system("sed -i 's|5.11.0|5.10.0|g' CMakeLists.txt") - kde6.configure() - -def build(): - kde6.make() - -def install(): - kde6.install() - - pisitools.removeDir("/usr/lib/systemd") - - pisitools.dodoc("LICENSES/*") diff --git a/desktop/kde6/plasma/xdg-desktop-portal-kde-kf6/pspec.xml b/desktop/kde6/plasma/xdg-desktop-portal-kde-kf6/pspec.xml deleted file mode 100755 index c63fb6a3fc..0000000000 --- a/desktop/kde6/plasma/xdg-desktop-portal-kde-kf6/pspec.xml +++ /dev/null @@ -1,218 +0,0 @@ - - - - - xdg-desktop-portal-kde-kf6 - https://download.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - A backend implementation for xdg-desktop-portal using Qt/KF5 - A backend implementation for xdg-desktop-portal using Qt/KF5 - https://download.kde.org/stable/plasma/6.2.5/xdg-desktop-portal-kde-6.2.5.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-wayland-devel - qt6-declarative-devel - kdeclarative-kf6-devel - kirigami-kf6-devel - libplasma-kf6-devel - plasma-workspace-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kwidgetsaddons-kf6-devel - kwayland-kf6-devel - wayland-devel - wayland-client - wayland-server - wayland-cursor - libepoxy-devel - ki18n-kf6-devel - kio-kf6-devel - cups-devel - pipewire-devel - knotifications-kf6-devel - wayland-protocols-devel - plasma-wayland-protocols-kf6 - kglobalaccel-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - kstatusnotifieritem-kf6-devel - - - - xdg-desktop-portal-kde-kf6 - - ki18n-kf6 - kio-kf6 - mesa - libgcc - kservice-kf6 - kwayland-kf6 - libepoxy - pipewire - kconfig-kf6 - kwindowsystem-kf6 - qt6-base - kcoreaddons-kf6 - kitemviews-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - wayland-client - kiconthemes-kf6 - kglobalaccel-kf6 - libxkbcommon - kstatusnotifieritem-kf6 - qt6-wayland - qt6-declarative - kdeclarative-kf6 - kirigami-kf6 - - - /usr/lib - /usr/share/dbus-1 - /usr/share - /usr/share/doc - /usr/share/locale - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - diff --git a/desktop/kde6/plasma/xdg-desktop-portal-kde-kf6/translations.xml b/desktop/kde6/plasma/xdg-desktop-portal-kde-kf6/translations.xml deleted file mode 100755 index edfd4f0664..0000000000 --- a/desktop/kde6/plasma/xdg-desktop-portal-kde-kf6/translations.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - xdg-desktop-portal-kde-kf6 - A backend implementation for xdg-desktop-portal using Qt/KF5 - A backend implementation for xdg-desktop-portal using Qt/KF5 - - diff --git a/pisi-index.xml b/pisi-index.xml index a632b6549f..2f26c6bdd8 100644 --- a/pisi-index.xml +++ b/pisi-index.xml @@ -5424,7 +5424,7 @@ Specifications of extended Wayland protocols Genişletişmiş wayland protocolü tanımlamaları Specifications of extended Wayland protocols - https://gitlab.freedesktop.org/wayland/wayland-protocols/-/archive/1.40/wayland-protocols-1.40.tar.bz2 + https://gitlab.freedesktop.org/wayland/wayland-protocols/-/archive/1.42/wayland-protocols-1.42.tar.bz2 meson wayland-client @@ -5454,11 +5454,11 @@ - 2025-02-01 - 1.40 + 2025-04-04 + 1.42 Version bump. - Pisi Linux Community - admin@pisilinux.org + Mustafa Cinasal + muscnsl@gmail.com 2024-10-14 @@ -6637,7 +6637,7 @@ D3D12'yi kullanmak için DirectX başlıkları D3D12'yi kullanmak için DirectX başlıkları DirectX-headers - https://github.com/microsoft/DirectX-Headers/archive/refs/tags/v1.614.1.tar.gz + https://github.com/microsoft/DirectX-Headers/archive/refs/tags/v1.615.0.tar.gz meson @@ -6654,7 +6654,7 @@ DirectX-headers-devel Development files for DirectX-headers - DirectX-headers + DirectX-headers /usr/include @@ -6663,6 +6663,13 @@ + + 2025-04-04 + 1.615.0 + Version bump. + Mustafa Cinasal + muscnsl@gmail.com + 2024-12-07 1.614.1 @@ -28423,7 +28430,7 @@ Gnome session. Network Security Services (NSS) is a set of libraries designed to support cross-platform development of security-enabled client and server applications. Applications built with NSS can support SSL v2 and v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509 v3 certificates, and other security standards. NSS, platform bağımsız güvenli ağ servisi geliştirme kitaplıklarından oluşur. Bu kitaplık yardımı ile SSL v2 ve v3, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509 v3 sertifikaları ve diğer bir çok güvenlik standardına uygun güvenli sunucu-istemci yazılımları geliştirilebilir. Network Security Services (NSS) es un conjunto de librerías para desarrollo cross-plataforma de aplicaciones cliente-servidor con facilidad de seguridad. Aplicaciones usando NSS pueden soportar certificados SSL v2 y v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509 v3, y otros estándares de seguridad. - https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_108_RTM/src/nss-3.108.tar.gz + https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_110_RTM/src/nss-3.110.tar.gz nss.pc.in nss-config.in @@ -28465,7 +28472,7 @@ Gnome session. nss için geliştirme dosyaları nspr-devel - nss + nss /usr/bin/nss-config @@ -28475,6 +28482,13 @@ Gnome session. + + 2025-04-03 + 3.110 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-26 3.108 @@ -29281,7 +29295,7 @@ Gnome session. QT6 için Kriptografik Mimari QCA aims to provide a straightforward and cross-platform crypto API, using Qt datatypes and conventions. QCA separates the API from the implementation, using plugins known as Providers. QCA2 has been re-written for QT4. QCA Qt veri tiplerini kullanarak platform bağımsız bir kripto uygulama programlama arayüzü oluşturmayı amaçlar. - https://download.kde.org/stable/qca/2.3.9/qca-2.3.9.tar.xz + https://download.kde.org/stable/qca/2.3.10/qca-2.3.10.tar.xz cmake gnupg @@ -29320,7 +29334,7 @@ Gnome session. Development files for qca2 qca2-qt6 için geliştirme dosyaları - qca2-qt6 + qca2-qt6 qt6-base-devel @@ -29331,6 +29345,13 @@ Gnome session. + + 2025-04-02 + 2.3.10 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2024-12-18 2.3.9 @@ -30539,41 +30560,41 @@ Gnome session. Advanced KDE twin-panel(commander-style) file-manager Krusader is an advanced twin panel (commander style) file manager for KDE and other desktops in the *nix world, similar to Midnight or Total Commander.. krusader - https://invent.kde.org/utilities/krusader/-/archive/835e741cbd48e30d8e221ed9c1c803b562d9f698/krusader-835e741cbd48e30d8e221ed9c1c803b562d9f698.tar.bz2 + https://invent.kde.org/utilities/krusader/-/archive/v2.9.0/krusader-v2.9.0.tar.bz2 qt6-base-devel qt6-qdbusviewer - kparts-kf6-devel - kwallet-kf6-devel - kxmlgui-kf6-devel - kguiaddons-kf6-devel + kparts-devel + kwallet-devel + kxmlgui-devel + kguiaddons-devel zlib-devel - libplasma-kf6-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - karchive-kf6-devel - kbookmarks-kf6-devel - kcodecs-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kitemviews-kf6-devel - kio-kf6-devel - knotifications-kf6-devel - solid-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kservice-kf6-devel - kjobwidgets-kf6-devel - kconfigwidgets-kf6-devel - kcrash-kf6-devel + libplasma-devel + kdoctools-devel + extra-cmake-modules + karchive-devel + kbookmarks-devel + kcodecs-devel + kcompletion-devel + kcoreaddons-devel + kconfig-devel + ki18n-devel + kiconthemes-devel + kitemviews-devel + kio-devel + knotifications-devel + solid-devel + ktextwidgets-devel + kwidgetsaddons-devel + kwindowsystem-devel + kservice-devel + kjobwidgets-devel + kconfigwidgets-devel + kcrash-devel qt6-5compat-devel - kcolorscheme-kf6-devel - kglobalaccel-kf6-devel - kstatusnotifieritem-kf6-devel + kcolorscheme-devel + kglobalaccel-devel + kstatusnotifieritem-devel cmake util/misc/krusader/pspec.xml @@ -30582,40 +30603,40 @@ Gnome session. krusader qt6-base - kparts-kf6 - kwallet-kf6 - kguiaddons-kf6 - kxmlgui-kf6 + kparts + kwallet + kguiaddons + kxmlgui zlib - libplasma-kf6 - kdoctools-kf6 - karchive-kf6 - kbookmarks-kf6 - kcodecs-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kconfig-kf6 - ki18n-kf6 - kiconthemes-kf6 - kitemviews-kf6 - kio-kf6 - knotifications-kf6 - solid-kf6 - ktextwidgets-kf6 - kwidgetsaddons-kf6 - kwindowsystem-kf6 + libplasma + kdoctools + karchive + kbookmarks + kcodecs + kcompletion + kcoreaddons + kconfig + ki18n + kiconthemes + kitemviews + kio + knotifications + solid + ktextwidgets + kwidgetsaddons + kwindowsystem acl libgcc - kservice-kf6 - kjobwidgets-kf6 - kconfigwidgets-kf6 + kservice + kjobwidgets + kconfigwidgets p7zip rar - kcrash-kf6 + kcrash qt6-5compat - kcolorscheme-kf6 - kglobalaccel-kf6 - kstatusnotifieritem-kf6 + kcolorscheme + kglobalaccel + kstatusnotifieritem /etc/xdg @@ -30627,8 +30648,15 @@ Gnome session. + + 2025-04-04 + 2.9.0 + Version bump. + Mustafa Cinasal + muscnsl@gmail.com + - 2024-12-24 + 2025-04-04 2.8.1 Version bump. Pisi Linux Community @@ -54011,7 +54039,7 @@ Gnome session. Xfce4 paneli, farklı pozisyon, görünüm ve davranış gibi ayarlara sahip birden fazla paneli destekleyebilmektedir. Uygulama başlatıcı tipinde ayrılabilir menüler, grafiksel sayfalayıcı, görev çubuğu, saat, sistem çekmecesi, masaüstünü gizleme / görüntüleme ve bir panelde olabilecek birçok şeyi içinde barındırır. Ayrıca, diyalog penceresi kullanarak kolayca panel öğesi eklemeye ve panelden panele öğe taşımaya izin verir. Jest to panel dostarczany przez projekt środowiska graficznego Xfce4. Jeśli użytkownik chce posiadać wielofunkcyjny panel, który może obsługiwać aplety i tym podobne programy, to Xfce4 Panel może być wart wypróbowania. xfce - https://archive.xfce.org/src/xfce/xfce4-panel/4.20/xfce4-panel-4.20.3.tar.bz2 + https://archive.xfce.org/src/xfce/xfce4-panel/4.20/xfce4-panel-4.20.4.tar.bz2 gtk-doc intltool @@ -54093,7 +54121,7 @@ Gnome session. glib2-devel gtk3-devel libxfce4util-devel - xfce4-panel + xfce4-panel /usr/include @@ -54102,6 +54130,13 @@ Gnome session. + + 2025-04-03 + 4.20.4 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-26 4.20.3 @@ -55481,7 +55516,7 @@ Gnome session. The session manager allows the user to save sessions and restore them after login. It is capable of saving several different sessions. It comes with three splash screen engines. And at last it helps you to log out, reboot, and shutdown the system. Xfce oturum yöneticisi, kullanıcıların oturumlarını kaydetmesine ve giriş yaptıktan sonra tekrar oturumu çağırmalarına izin verir. Birden fazla, farklı oturumları kaydetmede oldukça başarılıdır. Pakette üç tane örnek açılış teması var ve son olarak, sistemi kapatırken, yeniden başlatırken veya çıkarken kullanıcılara yardımcı olur. Xfce4-session jest zgodny z "menedżerem sesji" X11 zaprojektowanym do użycia ze środowiskiem graficznym Xfce4. Podczas wylogowywania, menedżer sesji zapisuje wszystkie uruchomione aplikacje. Przy ponownym zalogowaniu, przywraca je z oknami na tych samych pozycjach. - https://archive.xfce.org/src/xfce/xfce4-session/4.20/xfce4-session-4.20.0.tar.bz2 + https://archive.xfce.org/src/xfce/xfce4-session/4.20/xfce4-session-4.20.2.tar.bz2 intltool atk-devel @@ -55548,6 +55583,13 @@ Gnome session. + + 2025-04-03 + 4.20.2 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-26 4.20.0 @@ -55668,8 +55710,9 @@ Gnome session. desktop.xfce.base Terminal Emulator for Xfce. xfce4-terminal is a modern, lightweight, and low memory cost terminal emulator with tabs and multiple windows for the Xfce desktop environment. It offers full-customization for the key bindings, the aspect, the colors, and more - https://archive.xfce.org/src/apps/xfce4-terminal/1.1/xfce4-terminal-1.1.4.tar.bz2 + https://archive.xfce.org/src/apps/xfce4-terminal/1.1/xfce4-terminal-1.1.5.tar.xz + meson intltool gtk-doc vte-devel @@ -55709,6 +55752,13 @@ Gnome session. + + 2025-04-03 + 1.1.5 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2024-12-25 1.1.4 @@ -63768,7 +63818,7 @@ Gnome session. desktop.toolkit.gtk C++ binding for GTK+ gtkmm is the official C++ interface for the popular GUI library GTK+. Highlights include typesafe callbacks, and a comprehensive set of widgets that are easily extensible via inheritance. - http://ftp.gnome.org/pub/GNOME/sources/gtkmm/3.24/gtkmm-3.24.9.tar.xz + http://ftp.gnome.org/pub/GNOME/sources/gtkmm/3.24/gtkmm-3.24.10.tar.xz meson doxygen @@ -63809,7 +63859,7 @@ Gnome session. gtkmm3-devel Development files for gtkmm - gtkmm3 + gtkmm3 atkmm-devel pangomm-devel glibmm-devel @@ -63823,6 +63873,13 @@ Gnome session. + + 2025-04-02 + 3.24.10 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2024-03-17 3.24.9 @@ -67583,7 +67640,7 @@ Gnome session. GTK+, grafik kullanıcı arayüzü oluşturma amaçlı araçlardan oluşur. GTK+ hem küçük, hem de büyük uygulamalar için ideal olan, eksiksiz bir araçtır. Wersja 3 bibliotek przeznaczonych do tworzenia interfejsów graficznych programów — GTK+. Interfejs GTK+ znany jest z takich programów, jak GIMP i Inkscape, oraz środowisk graficznych GNOME i Xfce. gtk - mirrors://gnome/gtk+/3.24/gtk+-3.24.43.tar.xz + mirrors://gnome/gtk/3.24/gtk-3.24.48.tar.xz meson atk-devel @@ -67682,7 +67739,7 @@ Gnome session. GTK demo uyulaması app:gui - gtk3 + gtk3 /usr/bin/gtk3-demo @@ -67704,7 +67761,7 @@ Gnome session. gtk3 için geliştirme dosyaları Pliki nagłówkowe do gtk3 - gtk3 + gtk3 atk-devel pango-devel libX11-devel @@ -67737,6 +67794,13 @@ Gnome session. + + 2025-01-26 + 3.24.48 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2024-07-11 3.24.43 @@ -89065,6 +89129,9 @@ Gnome session. khtml-devel + + khtml-devel + @@ -99641,50784 +99708,6 @@ Gnome session. - - - ktexttemplate-kf6 - https://kontact.kde.org - - Mustafa Cinasal - muscnsl@gmail.com - - LGPLv3 - library - desktop.kde6.framework - Library for Grantlee theming support - Library for Grantlee theming support - Grantlee tema desteği için Kütüphane - Grantlee tema desteği için Kütüphane - https://download.kde.org/stable/frameworks/6.10/ktexttemplate-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/ktexttemplate-kf6/pspec.xml - - - ktexttemplate-kf6 - - qt6-base - qt6-declarative - - - /usr/lib - /usr/share - /usr/share/doc - - - - ktexttemplate-kf6-devel - Development files for ktexttemplate-kf6 - - ktexttemplate-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - purpose-kf6 - https://www.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.framework - Framework for providing abstractions to get the developer's purpose-kf6s fulfilled - Framework for providing abstractions to get the developer's purpose-kf6s fulfilled - Framework for providing abstractions to get the developer's purpose-kf6s fulfilled - Framework for providing abstractions to get the developer's purpose-kf6s fulfilled - mirrors://kde/stable/frameworks/6.10/purpose-6.10.0.tar.xz - - intltool - kio-kf6-devel - ki18n-kf6-devel - kauth-kf6-devel - prison-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kirigami-kf6-devel - kcoreaddons-kf6-devel - kdeclarative-kf6-devel - extra-cmake-modules-kf6 - accounts-qml-module - knotifications-kf6-devel - libaccounts-glib-devel - libaccounts-qt6-devel - qt6-base-devel - qt6-declarative-devel - - desktop/kde6/framework/purpose-kf6/pspec.xml - - - purpose-kf6 - - kio-kf6 - ki18n-kf6 - kauth-kf6 - libgcc - kconfig-kf6 - qt6-base - kservice-kf6 - prison-kf6 - kcoreaddons-kf6 - knotifications-kf6 - libaccounts-qt6 - qt6-declarative - - - /etc/xdg - /usr/lib - /usr/share - /usr/share/doc - - - - purpose-kf6-devel - Development files for purpose-kf6 - - purpose-kf6 - kcoreaddons-kf6-devel - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-28 - 6.0.0 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kbookmarks-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Access and manipulate bookmarks stored using XBEL format - Framework which lets you access and manipulate bookmarks stored using XBEL format - mirrors://kde/stable/frameworks/6.10/kbookmarks-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-declarative-devel - kcoreaddons-kf6-devel - kauth-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kcolorscheme-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kbookmarks-kf6/pspec.xml - - - kbookmarks-kf6 - - qt6-base - qt6-declarative - libgcc - kcoreaddons-kf6 - kcodecs-kf6 - kconfig-kf6 - kwidgetsaddons-kf6 - kxmlgui-kf6 - kconfigwidgets-kf6 - kcolorscheme-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kbookmarks-kf6-devel - Development files for kbookmarks-kf6 - - kbookmarks-kf6 - qt6-base-devel - kwidgetsaddons-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - frameworkintegration-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Framework providing components to allow applications to integrate with a KDE Workspace - Framework Integration is a set of plugins responsible for better integration of Qt applications when running on a KDE Plasma workspace. - mirrors://kde/stable/frameworks/6.10/frameworkintegration-6.10.0.tar.xz - - libxcb-devel - libXcursor-devel - appstream-qt6-devel - packagekit-qt6-devel - appstream-devel - qt6-base-devel - qt6-declarative-devel - oxygen-fonts - kconfig-kf6-devel - kpackage-kf6-devel - kxmlgui-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kjobwidgets-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - ki18n-kf6-devel - kauth-kf6-devel - kio-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - knewstuff-kf6-devel - kcolorscheme-kf6-devel - - desktop/kde6/framework/frameworkintegration-kf6/pspec.xml - - - frameworkintegration-kf6 - - appstream-qt6 - packagekit-qt6 - appstream - qt6-base - kconfig-kf6 - kconfigwidgets-kf6 - kiconthemes-kf6 - ki18n-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - knewstuff-kf6 - kcolorscheme-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - frameworkintegration-kf6-devel - Development files for framework-integration - - frameworkintegration-kf6 - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kconfig-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - app:gui - desktop.kde6.framework - Advanced configuration system for KDE Frameworks 5 - kconfig-kf6 provides advanced libraries and tools for accessing configuration files. - mirrors://kde/stable/frameworks/6.10/kconfig-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - qt6-linguist - extra-cmake-modules-kf6 - - desktop/kde6/framework/kconfig-kf6/pspec.xml - - - kconfig-kf6 - - qt6-base - qt6-declarative - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kconfig-kf6-devel - Development files for kconfig-kf6 - - qt6-base-devel - qt6-declarative-devel - kconfig-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kcodecs-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Plugins allowing Qt applications to access further types of images - kde6 kcodecs-kf6 provide a collection of methods to manipulate strings using various encodings. - mirrors://kde/stable/frameworks/6.10/kcodecs-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - extra-cmake-modules-kf6 - gperf - - desktop/kde6/framework/kcodecs-kf6/pspec.xml - - - kcodecs-kf6 - - qt6-base - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kcodecs-kf6-devel - Development files for kcodecs-kf6 - - qt6-base-devel - kcodecs-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdnssd-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Network service discovery using Zeroconf - kdnssd-kf6 is a library for handling the DNS-based Service Discovery Protocol (DNS-SD), the layer of Zeroconf that allows network services, such as printers, to be discovered without any user intervention or centralized infrastructure. - mirrors://kde/stable/frameworks/6.10/kdnssd-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - avahi-devel - avahi-compat-libdns_sd-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kdnssd-kf6/pspec.xml - - - kdnssd-kf6 - - qt6-base - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kdnssd-kf6-devel - Development files for kdnssd-kf6. - - qt6-base-devel - kdnssd-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kidletime-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - Idle time reporting utility - kidletime-kf6 is a singleton reporting information on idle time. It is useful not only for finding out about the current idle time of the PC, but also for getting notified upon idle time events, such as custom timeouts, or user activity. - mirrors://kde/stable/frameworks/6.10/kidletime-6.10.0.tar.xz - - qt6-base-devel - qt6-wayland-devel - wayland-devel - wayland-client - libX11-devel - libXext-devel - libXScrnSaver-devel - libxcb-devel - wayland-protocols-devel - plasma-wayland-protocols-kf6 - extra-cmake-modules-kf6 - - desktop/kde6/framework/kidletime-kf6/pspec.xml - - - kidletime-kf6 - - qt6-base - qt6-wayland - libX11 - libxcb - wayland-client - libXScrnSaver - libXext - - - /etc/xdg/kidletime-kf6.categories - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kidletime-kf6-devel - Development files for kidletime-kf6 - - kidletime-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kitemviews-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - Set of item models extending the Qt model-view framework - kitemviews-kf6 includes a set of views, which can be used with item models. It includes views for categorizing lists and to add search filters to flat and hierarchical lists. - mirrors://kde/stable/frameworks/6.10/kitemviews-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-designer-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kitemviews-kf6/pspec.xml - - - kitemviews-kf6 - - qt6-base - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kitemviews-kf6-devel - Development files for kitemviews-kf6 - - qt6-base-devel - kitemviews-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ksyndication-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:library - desktop.kde6.framework - RSS/Atom parser library - syndication is a parser library for RSS and Atom feeds. - mirrors://kde/stable/frameworks/6.10/syndication-6.10.0.tar.xz - - qt6-base-devel - kio-kf6-devel - kcodecs-kf6-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/ksyndication-kf6/pspec.xml - - - ksyndication-kf6 - - qt6-base - kcodecs-kf6 - libgcc - - - /etc/xdg - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/share/qlogging-categories6/syndication.categories - /usr/share/qlogging-categories6 - - - - ksyndication-kf6-devel - Development files for ksyndication-kf6 - - ksyndication-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kxmlgui-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Framework for managing menu and toolbar actions - kxmlgui-kf6 provides a framework for managing menu and toolbar actions in an abstract way. - mirrors://kde/stable/frameworks/6.10/kxmlgui-6.10.0.tar.xz - - qt6-base-devel - qt6-designer-devel - qt6-declarative-devel - attica-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kauth-kf6-devel - kcodecs-kf6-devel - sonnet-kf6-devel - kglobalaccel-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - kitemviews-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - kcolorscheme-kf6-devel - - desktop/kde6/framework/kxmlgui-kf6/pspec.xml - - - kxmlgui-kf6 - - qt6-base - qt6-declarative - libgcc - attica-kf6 - kcoreaddons-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kglobalaccel-kf6 - ki18n-kf6 - kguiaddons-kf6 - kiconthemes-kf6 - kitemviews-kf6 - kcolorscheme-kf6 - kwidgetsaddons-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kxmlgui-kf6-devel - Development files for kxmlgui-kf6 - - kxmlgui-kf6 - qt6-base-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdeclarative-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Integration of QML and KDE workspaces - kdeclarative-kf6 provides integration of QML and KDE workspaces. - mirrors://kde/stable/frameworks/6.10/kdeclarative-6.10.0.tar.xz - - qt6-base-devel - qt6-shadertools-devel - mesa-devel - libepoxy-devel - qt6-declarative-devel - kauth-kf6-devel - kcodecs-kf6-devel - kpackage-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - kguiaddons-kf6-devel - knotifications-kf6-devel - kglobalaccel-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kbookmarks-kf6-devel - kcompletion-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kdeclarative-kf6/pspec.xml - - - kdeclarative-kf6 - - qt6-base - qt6-shadertools - libepoxy - qt6-declarative - kpackage-kf6 - kconfig-kf6 - kservice-kf6 - kcoreaddons-kf6 - kglobalaccel-kf6 - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - kguiaddons-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kwindowsystem-kf6 - - - /usr/bin - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kdeclarative-kf6-devel - Development files for kdeclarative-kf6 - - qt6-base-devel - kpackage-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kdeclarative-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ktexteditor-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - kde6 text editor libraries - ktexteditor-kf6 provides a powerful text editor component that you can embed in your application. - mirrors://kde/stable/frameworks/6.10/ktexteditor-6.10.0.tar.xz - - qt6-base-devel - qt6-speech-devel - qt6-multimedia-devel - qt6-declarative-devel - kauth-kf6-devel - kguiaddons-kf6-devel - kwidgetsaddons-kf6-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - kcompletion-kf6-devel - kitemviews-kf6-devel - karchive-kf6-devel - attica-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcmutils-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kglobalaccel-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - kbookmarks-kf6-devel - kwindowsystem-kf6-devel - sonnet-kf6-devel - kcodecs-kf6-devel - kconfigwidgets-kf6-devel - solid-kf6-devel - kparts-kf6-devel - kcolorscheme-kf6-devel - syntax-highlighting-kf6-devel - libgit2-devel - editorconfig-core-c-devel - kjobwidgets-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/ktexteditor-kf6/pspec.xml - - - ktexteditor-kf6 - - kauth-kf6 - libgit2 - kitemviews-kf6 - editorconfig-core-c - qt6-base - qt6-multimedia - qt6-speech - qt6-declarative - ktextwidgets-kf6 - kwindowsystem-kf6 - kwidgetsaddons-kf6 - kconfigwidgets-kf6 - kjobwidgets-kf6 - kiconthemes-kf6 - kcoreaddons-kf6 - kcompletion-kf6 - kxmlgui-kf6 - kcodecs-kf6 - karchive-kf6 - kguiaddons-kf6 - kconfig-kf6 - ki18n-kf6 - kio-kf6 - ki18n-kf6 - kparts-kf6 - sonnet-kf6 - kcolorscheme-kf6 - syntax-highlighting-kf6 - - - /usr/bin - /etc - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - ktexteditor-kf6-devel - Development files for ktexteditor-kf6 - - kparts-kf6-devel - syntax-highlighting-kf6-devel - ktexteditor-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - knewstuff-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Framework for downloading and sharing additional application data - The knewstuff-kf6 library implements collaborative data sharing for applications. - mirrors://kde/stable/frameworks/6.10/knewstuff-6.10.0.tar.xz - - qt6-base-devel - qt6-designer-devel - qt6-declarative-devel - boost-devel - kauth-kf6-devel - ksyndication-kf6-devel - kwidgetsaddons-kf6-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - kcompletion-kf6-devel - kitemviews-kf6-devel - karchive-kf6-devel - attica-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcmutils-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kglobalaccel-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - kbookmarks-kf6-devel - kwindowsystem-kf6-devel - sonnet-kf6-devel - kcodecs-kf6-devel - kconfigwidgets-kf6-devel - solid-kf6-devel - kjobwidgets-kf6-devel - kpackage-kf6-devel - extra-cmake-modules-kf6 - kirigami-kf6-devel - - desktop/kde6/framework/knewstuff-kf6/pspec.xml - - - knewstuff-kf6 - - qt6-base - qt6-designer - qt6-declarative - ksyndication-kf6 - kwidgetsaddons-kf6 - ktextwidgets-kf6 - kiconthemes-kf6 - kcompletion-kf6 - kitemviews-kf6 - karchive-kf6 - attica-kf6 - kconfig-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kio-kf6 - kservice-kf6 - kxmlgui-kf6 - kjobwidgets-kf6 - kpackage-kf6 - - - /usr/bin/knewstuff-dialog6 - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - knewstuff-kf6-devel - Development files for knewstuff-kf6 - - qt6-base-devel - attica-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - knewstuff-kf6 - ksyndication-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kholidays-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - KDE library for regional holiday information - KDE library for regional holiday information - https://download.kde.org/stable/frameworks/6.10/kholidays-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - qt6-linguist - autogen-devel - kitemviews-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kholidays-kf6/pspec.xml - - - kholidays-kf6 - - qt6-base - qt6-declarative - - - /etc - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kholidays-kf6-devel - Development files for kdelibs4-support - - qt6-base-devel - kholidays-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - prison-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - MIT - library - desktop.kde6.framework - A barcode API to produce QRCode barcodes and DataMatrix barcode - A barcode API to produce QRCode barcodes and DataMatrix barcode. - mirrors://kde/stable/frameworks/6.10/prison-6.10.0.tar.xz - - libdmtx-devel - qrencode-devel - zxing-cpp-devel - qt6-base-devel - extra-cmake-modules-kf6 - qt6-multimedia-devel - qt6-declarative-devel - - desktop/kde6/framework/prison-kf6/pspec.xml - - - prison-kf6 - - libdmtx - qrencode - zxing-cpp - qt6-base - qt6-multimedia - qt6-declarative - - - /etc/xdg - /usr/lib - /usr/lib/qt5 - /usr/share/doc - /usr/share/qlogging-categories6/prison.categories - /usr/share/qlogging-categories6/prison.renamecategories - - - prison-kf6-qt5 - - - prison-kf6-qt5 - - - - prison-kf6-devel - Development files for libepoxy - - prison-kf6 - qt6-multimedia-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - prison-kf6-qt6-devel - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kimageformats-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - Image formats addons for QT 5 - This framework provides additional image format plugins for QtGui. - mirrors://kde/stable/frameworks/6.10/kimageformats-6.10.0.tar.xz - - imath-devel - libraw-devel - libheif-devel - qt6-base-devel - openexr-devel - karchive-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kimageformats-kf6/pspec.xml - - - kimageformats-kf6 - - imath - libraw - qt6-base - libheif - karchive-kf6 - openexr-libs - - - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - krunner-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - Krunner Framework for providing different actions given a string query - Framework Integration is a set of plugins responsible for better integration of Qt applications when running on a KDE Plasma workspace. - mirrors://kde/stable/frameworks/6.10/krunner-6.10.0.tar.xz - - qt6-base-devel - gettext-devel - kdoctools-kf6-devel - qt6-declarative-devel - kconfig-kf6-devel - kauth-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kservice-kf6-devel - solid-kf6-devel - threadweaver-kf6-devel - kitemmodels-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/krunner-kf6/pspec.xml - - - krunner-kf6 - - qt6-base - qt6-declarative - kconfig-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kio-kf6 - kservice-kf6 - kitemmodels-kf6 - threadweaver-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - krunner-kf6-devel - Development files for krunner-kf6 - - krunner-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kcmutils-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Utilities for interacting with KCModules - kcmutils-kf6 provides various classes to work with KCModules. KCModules can be created with the kconfigwidgets-kf6 framework. - mirrors://kde/stable/frameworks/6.10/kcmutils-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - mesa-devel - kio-kf6-devel - kcodecs-kf6-devel - kpackage-kf6-devel - kdeclarative-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kconfig-kf6-devel - kauth-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kitemviews-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - kguiaddons-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kcmutils-kf6/pspec.xml - - - kcmutils-kf6 - - qt6-base - qt6-declarative - libgcc - kio-kf6 - kdeclarative-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kconfig-kf6 - kauth-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kitemviews-kf6 - kservice-kf6 - kxmlgui-kf6 - kguiaddons-kf6 - - - /usr/bin - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kcmutils-kf6-devel - Development files for kcmutils-kf6 - - kcmutils-kf6 - kconfigwidgets-kf6-devel - kservice-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kitemmodels-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Set of item models extending the Qt model-view framework - kitemmodels-kf6 provides a set of item models extending the Qt model-view framework. - mirrors://kde/stable/frameworks/6.10/kitemmodels-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kitemmodels-kf6/pspec.xml - - - kitemmodels-kf6 - - qt6-base - qt6-declarative - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kitemmodels-kf6-devel - Development files for kitemmodels-kf6 - - qt6-base-devel - kitemmodels-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - modemmanager-qt-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - Qt wrapper for ModemManager DBus API - Qt wrapper for ModemManager DBus API - mirrors://kde/stable/frameworks/6.10/modemmanager-qt-6.10.0.tar.xz - - qt6-base-devel - ModemManager-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/modemmanager-qt-kf6/pspec.xml - - - modemmanager-qt-kf6 - - qt6-base - libgcc - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - modemmanager-qt-kf6-devel - Development files for modemmanger-qt - - qt6-base-devel - modemmanager-qt-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kparts-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Plugin framework for user interface components - This library implements the framework for KDE parts, which are elaborate widgets with a user-interface defined in terms of actions (menu items, toolbar icons). - mirrors://kde/stable/frameworks/6.10/kparts-6.10.0.tar.xz - - qt6-base-devel - kauth-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - kcompletion-kf6-devel - kitemviews-kf6-devel - karchive-kf6-devel - attica-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcmutils-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kglobalaccel-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - kbookmarks-kf6-devel - kwindowsystem-kf6-devel - sonnet-kf6-devel - kcodecs-kf6-devel - kconfigwidgets-kf6-devel - solid-kf6-devel - kjobwidgets-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kparts-kf6/pspec.xml - - - kparts-kf6 - - qt6-base - libgcc - kjobwidgets-kf6 - kconfig-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kiconthemes-kf6 - kservice-kf6 - kwidgetsaddons-kf6 - kxmlgui-kf6 - kio-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kparts-kf6-devel - Development files for kparts-kf6 - - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - ktextwidgets-kf6-devel - kparts-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kquickcharts-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - A QtQuick plugin providing high-performance charts - A QtQuick plugin providing high-performance charts - Yüksek performanslı grafikler sunan bir QtQuick eklentisi - Yüksek performanslı grafikler sunan bir QtQuick eklentisi - mirrors://kde/stable/frameworks/6.10/kquickcharts-6.10.0.tar.xz - - qt6-base-devel - qt6-shadertools-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kquickcharts-kf6/pspec.xml - - - kquickcharts-kf6 - - libgcc - qt6-base - qt6-declarative - qt6-shadertools - - - /usr/lib - /usr/lib/qt5 - /usr/lib/cmake - /usr/share/qlogging-categories6/kquickcharts.categories - /usr/share/doc - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kpeople-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - A contact aggregation library for KDE - KPeople is a Framework for fetching contacts from different sources (Telepathy, Akonadi, Facebook, etc) and unifying them into a same model. - mirrors://kde/stable/frameworks/6.10/kpeople-6.10.0.tar.xz - - qt6-base-devel - kconfig-kf6-devel - qt6-declarative-devel - kcoreaddons-kf6-devel - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - kservice-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kitemviews-kf6-devel - kcontacts-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kpeople-kf6/pspec.xml - - - kpeople-kf6 - - qt6-base - qt6-declarative - kcoreaddons-kf6 - kcontacts-kf6 - kwidgetsaddons-kf6 - ki18n-kf6 - kitemviews-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /etc/xdg - - - - kpeople-kf6-devel - Development files for kpeople-kf6 - - qt6-base-devel - kpeople-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kwidgetsaddons-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - kde6 desktop widgets - KdeWidgetsAddons is a framework contains addon widgets and shared libraries for applications using qt6-Widgets. - mirrors://kde/stable/frameworks/6.10/kwidgetsaddons-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-designer-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kwidgetsaddons-kf6/pspec.xml - - - kwidgetsaddons-kf6 - - qt6-base - libgcc - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kwidgetsaddons-kf6-devel - Development files for kwidgetsaddons-kf6 - - qt6-base-devel - kwidgetsaddons-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-19 - 6.4.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-25 - 6.2.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-23 - 6.2.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kirigami-addons-kf6 - https://github.com/KDE/kirigami-addons - - Mustafa Cinasal - muscnsl@gmail.com - - GPL, LGPL - library - desktop.kde6.framework - Add-ons for the Kirigami framework - Add-ons for the Kirigami framework - https://download.kde.org/stable/kirigami-addons/kirigami-addons-1.7.0.tar.xz - - ki18n-kf6-devel - kconfig-kf6-devel - kirigami-kf6-devel - kcoreaddons-kf6-devel - kguiaddons-kf6-devel - kglobalaccel-kf6-devel - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kirigami-addons-kf6/pspec.xml - - - kirigami-addons-kf6 - - ki18n-kf6 - kconfig-kf6 - kguiaddons-kf6 - kcoreaddons-kf6 - kglobalaccel-kf6 - qt6-base - qt6-declarative - - - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - /usr/include/KirigamiAddonsStatefulApp - - - - - 2025-01-17 - 1.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2025-01-09 - 1.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 1.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 1.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 1.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 1.4.0 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 1.4.0 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-24 - 1.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-11 - 1.3.0 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 1.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 1.2.1 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-15 - 1.2.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-11 - 1.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-04 - 1.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 1.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-29 - 1.0.1 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kcoreaddons-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - Utilities for core application functionality and accessing the OS - kcoreaddons-kf6 provides classes built on top of QtCore to perform various tasks such as manipulating mime types, autosaving files, creating backup files, generating random sequences, performing text manipulations such as macro replacement, accessing user information and many more. - mirrors://kde/stable/frameworks/6.10/kcoreaddons-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-declarative-devel - shared-mime-info - extra-cmake-modules-kf6 - - desktop/kde6/framework/kcoreaddons-kf6/pspec.xml - - - kcoreaddons-kf6 - - eudev - qt6-base - qt6-declarative - shared-mime-info - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kcoreaddons-kf6-devel - Development files for kcoreaddons-kf6 - - qt6-base-devel - kcoreaddons-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kwindowsystem-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - kde6 window manager access framework - kwindowsystem-kf6 provides information about the state of the window manager and allows asking the window manager to change the using a more high-level interface than the NETWinInfo/NETRootInfo low-level classes. - mirrors://kde/stable/frameworks/6.10/kwindowsystem-6.10.0.tar.xz - - qt6-base-devel - qt6-wayland-devel - qt6-declarative-devel - qt6-linguist - wayland-devel - wayland-client - libX11-devel - libxcb-devel - libXrender-devel - libXfixes-devel - xcb-util-devel - xcb-util-wm-devel - xcb-util-keysyms-devel - wayland-protocols-devel - plasma-wayland-protocols-kf6 - extra-cmake-modules-kf6 - - desktop/kde6/framework/kwindowsystem-kf6/pspec.xml - - - kwindowsystem-kf6 - - qt6-base - qt6-wayland - qt6-declarative - libX11 - wayland - wayland-client - libxcb - libXfixes - xcb-util-wm - xcb-util-keysyms - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/doc - - - - kwindowsystem-kf6-devel - Development files for kwindowsystem-kf6 - - qt6-base-devel - libXrender-devel - libXfixes-devel - xcb-util-devel - xcb-util-keysyms-devel - kwindowsystem-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - threadweaver-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - Multi-threaded programming framework for KDE - threadweaver-kf6 is a helper for multithreaded programming. It uses a job-based interface to queue tasks and execute them in an efficient way. - mirrors://kde/stable/frameworks/6.10/threadweaver-6.10.0.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/threadweaver-kf6/pspec.xml - - - threadweaver-kf6 - - qt6-base - libgcc - - - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - threadweaver-kf6-devel - Development files for threadweaver-kf6 - - qt6-base-devel - threadweaver-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kstatusnotifieritem-kf6 - https://community.kde.org/Frameworks - - Mustafa Cinasal - muscnsl@gmail.com - - GPLv3 - library - desktop.kde6.framework - Implementation of Status Notifier Items - Implementation of Status Notifier Items - Durum Bildirici Öğelerinin Uygulanması - Durum Bildirici Öğelerinin Uygulanması - https://download.kde.org/stable/frameworks/6.10/kstatusnotifieritem-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kstatusnotifieritem-kf6/pspec.xml - - - kstatusnotifieritem-kf6 - - qt6-base - kwindowsystem-kf6 - - - /usr/lib - /usr/share - /usr/share/locale - /usr/share/info - /usr/share/doc - - - - kstatusnotifieritem-kf6-devel - Development files for kstatusnotifieritem-kf6 - - kstatusnotifieritem-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kcrash-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - kcrash-kf6 crash handling application - kcrash-kf6 provides support for intercepting and handling application crashes. - mirrors://kde/stable/frameworks/6.10/kcrash-6.10.0.tar.xz - - qt6-base-devel - kcoreaddons-kf6-devel - kwindowsystem-kf6-devel - libX11-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kcrash-kf6/pspec.xml - - - kcrash-kf6 - - qt6-base - libX11 - kcoreaddons-kf6 - kwindowsystem-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kcrash-kf6-devel - Development files for kcrash-kf6 - - kcrash-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kuserfeedback-kf6 - https://kde.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv3 - library - desktop.kde6.framework - Framework for collecting user feedback for applications via telemetry and surveys - Framework for collecting user feedback for applications via telemetry and surveys - mirrors://kde/stable/frameworks/6.10/kuserfeedback-6.10.0.tar.xz - - qt6-linguist - qt6-svg-devel - qt6-sql-odbc - qt6-sql-mysql - qt6-sql-sqlite - qt6-base-devel - qt6-charts-devel - qt6-assistant-devel - qt6-sql-postgresql - extra-cmake-modules-kf6 - qt6-declarative-devel - - desktop/kde6/framework/kuserfeedback-kf6/pspec.xml - - - kuserfeedback-kf6 - - qt6-svg - qt6-base - qt6-charts - qt6-declarative - - - /usr/bin - /etc - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - - kuserfeedback-kf6-devel - Development files for kuserfeedback-kf6 - - kuserfeedback-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kio-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - Resource and network access abstraction - Network transparent access to files and data - mirrors://kde/stable/frameworks/6.10/kio-6.10.0.tar.xz - - qt6-base-devel - qt6-5compat-devel - qt6-designer-devel - qt6-declarative-devel - acl-devel - attr-devel - mit-kerberos-devel - kcrash-kf6-devel - karchive-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kservice-kf6-devel - solid-kf6-devel - sonnet-kf6-devel - kdoctools-kf6-devel - kbookmarks-kf6-devel - kwidgetsaddons-kf6-devel - kcompletion-kf6-devel - kconfigwidgets-kf6-devel - kauth-kf6-devel - kcodecs-kf6-devel - kiconthemes-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - kwindowsystem-kf6-devel - kwallet-kf6-devel - kxmlgui-kf6-devel - ktextwidgets-kf6-devel - knotifications-kf6-devel - kguiaddons-kf6-devel - kcolorscheme-kf6-devel - libxslt-devel - zlib-devel - docbook-sgml4_5 - docbook-xml - docbook-xsl - extra-cmake-modules-kf6 - kded-kf6-devel - libutil-linux-devel - switcheroo-control - - desktop/kde6/framework/kio-kf6/pspec.xml - - - kio-kf6 - - qt6-base - qt6-declarative - qt6-5compat - acl - libgcc - libxml2 - libxslt - kdoctools-kf6 - mit-kerberos - kauth-kf6 - kcrash-kf6 - knotifications-kf6 - karchive-kf6 - kconfig-kf6 - kcodecs-kf6 - kbookmarks-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - ki18n-kf6 - kiconthemes-kf6 - kitemviews-kf6 - kjobwidgets-kf6 - kservice-kf6 - ktextwidgets-kf6 - kwallet-kf6 - kwidgetsaddons-kf6 - kwindowsystem-kf6 - kxmlgui-kf6 - solid-kf6 - kguiaddons-kf6 - kcolorscheme-kf6 - libutil-linux - switcheroo-control - - - /etc/ - /usr/bin - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/share/man - - - - kio-kf6-devel - Development files for kio-kf6 - - qt6-base-devel - kio-kf6 - kconfig-kf6-devel - kcodecs-kf6-devel - kbookmarks-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - kservice-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - solid-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-19 - 6.4.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-10 - 6.0.0 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - baloo-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - Framework for searching and managing metadata - baloo-kf6 is a framework for searching and managing metada - mirrors://kde/stable/frameworks/6.10/baloo-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kauth-kf6-devel - kconfig-kf6-devel - kcrash-kf6-devel - ki18n-kf6-devel - kcompletion-kf6-devel - kidletime-kf6-devel - kio-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kfilemetadata-kf6-devel - kdoctools-kf6-devel - kbookmarks-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - kwidgetsaddons-kf6-devel - lmdb-devel - kservice-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/baloo-kf6/pspec.xml - - - baloo-kf6 - - qt6-base - qt6-declarative - kcoreaddons-kf6 - kdbusaddons-kf6 - libgcc - kconfig-kf6 - kcrash-kf6 - ki18n-kf6 - kidletime-kf6 - kio-kf6 - solid-kf6 - kfilemetadata-kf6 - lmdb - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - baloo-kf6-devel - Development files for baloo-kf6-widgets - - baloo-kf6 - qt6-base-devel - kcoreaddons-kf6-devel - kfilemetadata-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kconfigwidgets-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - app:gui - desktop.kde6.framework - kconfig-kf6 widgets - kconfigwidgets-kf6 provides easy-to-use classes to create configuration dialogs, as well as a set of widgets which uses kconfig-kf6 to store their settings. - mirrors://kde/stable/frameworks/6.10/kconfigwidgets-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - ki18n-kf6-devel - kauth-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kguiaddons-kf6-devel - kwidgetsaddons-kf6-devel - kdoctools-kf6-devel - kcolorscheme-kf6-devel - docbook-xsl - extra-cmake-modules-kf6 - qt6-designer-devel - - desktop/kde6/framework/kconfigwidgets-kf6/pspec.xml - - - kconfigwidgets-kf6 - - libgcc - qt6-base - qt6-declarative - kauth-kf6 - kcodecs-kf6 - kconfig-kf6 - kcoreaddons-kf6 - kguiaddons-kf6 - ki18n-kf6 - kwidgetsaddons-kf6 - kcolorscheme-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/share/man - - - - kconfigwidgets-kf6-devel - Development files for kconfigwidgets-kf6 - - kconfigwidgets-kf6 - kauth-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kcolorscheme-kf6-devel - kwidgetsaddons-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kapidox-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - kde6 Frameworks API documentation tools. - kde6 Frameworks API dokümantasyon araçları. - kde6 Frameworks API documentation tools. - kde6 Frameworks API dokümantasyon araçları. - mirrors://kde/stable/frameworks/6.10/kapidox-6.10.0.tar.xz - - python3-Jinja2 - python3-PyYAML - extra-cmake-modules-kf6 - python3-setuptools - - desktop/kde6/framework/kapidox-kf6/pspec.xml - - - kapidox-kf6 - - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - solid-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - kde6 hardware integration framework - solid-kf6 is a device integration framework.It provides a way of querying and interacting with hardware independently of the underlying operating system. - mirrors://kde/stable/frameworks/6.10/solid-6.10.0.tar.xz - - eudev-devel - upower-devel - udisks2-devel - media-player-info - qt6-linguist - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/solid-kf6/pspec.xml - - - solid-kf6 - - eudev - libplist - libutil-linux - libimobiledevice - media-player-info - qt6-base - qt6-declarative - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/doc - - - - solid-kf6-devel - Development files for solid-kf6 - - qt6-base-devel - solid-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-19 - 6.1.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kcompletion-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - Addon with auto completion widgets and classes - kcompletion-kf6 provides widgets with advanced completion support as well as a lower-level completion class which can be used with your own widgets. - mirrors://kde/stable/frameworks/6.10/kcompletion-6.10.0.tar.xz - - qt6-base-devel - qt6-designer-devel - qt6-declarative-devel - qt6-linguist - kcodecs-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kcompletion-kf6/pspec.xml - - - kcompletion-kf6 - - qt6-base - qt6-declarative - libgcc - kcodecs-kf6 - kconfig-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kcompletion-kf6-devel - Development files for kcompletion-kf6 - - qt6-base-devel - kcompletion-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kplotting-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - kde6 Data plotting - kplotting-kf6 contains data plotting classes for QT 5 and KDE - mirrors://kde/stable/frameworks/6.10/kplotting-6.10.0.tar.xz - - qt6-base-devel - qt6-designer-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kplotting-kf6/pspec.xml - - - kplotting-kf6 - - qt6-base - - - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kplotting-kf6-devel - Development files for kplotting-kf6 - - kplotting-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kjobwidgets-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - Widgets for showing progress of asynchronous jobs - kjobwidgets-kf6 provides widgets for showing progress of asynchronous jobs. - mirrors://kde/stable/frameworks/6.10/kjobwidgets-6.10.0.tar.xz - - libX11-devel - qt6-base-devel - qt6-linguist - kcoreaddons-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kjobwidgets-kf6/pspec.xml - - - kjobwidgets-kf6 - - qt6-base - libgcc - kcoreaddons-kf6 - kwidgetsaddons-kf6 - knotifications-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kjobwidgets-kf6-devel - Development files for kjobwidgets-kf6 - - qt6-base-devel - kcoreaddons-kf6-devel - kjobwidgets-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kservice-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - kde6 Desktop Services - kservice-kf6 Provides a plugin framework for handling desktop services. Services can be applications or libraries. They can be bound to MIME types or handled by application specific code. - mirrors://kde/stable/frameworks/6.10/kservice-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - kdoctools-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - docbook-xml - docbook-xsl - extra-cmake-modules-kf6 - - desktop/kde6/framework/kservice-kf6/pspec.xml - - - kservice-kf6 - - qt6-base - qt6-declarative - kconfig-kf6 - kcoreaddons-kf6 - kcrash-kf6 - kdbusaddons-kf6 - ki18n-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/man - /usr/share/doc - - - - kservice-kf6-devel - Development files for kservice-kf6 - - kservice-kf6 - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - syntax-highlighting-kf6 - https://community.kde.org/Frameworks - - Stefan Gronewold - groni@pisilinux.org - - GPL2 - desktop.kde6.framework - Syntax highlighting engine for structured text and code - Syntax highlighting engine for structured text and code - mirrors://kde/stable/frameworks/6.10/syntax-highlighting-6.10.0.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-linguist - perl - glibc-devel - - desktop/kde6/framework/syntax-highlighting-kf6/pspec.xml - - - syntax-highlighting-kf6 - Syntax highlighting engine for structured text and code - - qt6-base - qt6-declarative - libgcc - - - /etc/xdg - /usr/bin - /usr/lib - /usr/lib/qt5 - /usr/share/doc - /usr/share/qlogging-categories6 - /usr/share/locale/ - - - - syntax-highlighting-kf6-devel - Development files for syntax-highlighting-kf6 - - syntax-highlighting-kf6 - qt6-base-devel - - - /usr/include - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kguiaddons-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Utilities for graphical user interfaces - The KDE GUI addons provide utilities for graphical user interfaces in the areas of colors, fonts, text, images, keyboard input. Development files. - mirrors://kde/stable/frameworks/6.10/kguiaddons-6.10.0.tar.xz - - libX11-devel - libxcb-devel - wayland-devel - plasma-wayland-protocols-kf6 - qt6-base-devel - qt6-wayland-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kguiaddons-kf6/pspec.xml - - - kguiaddons-kf6 - - libX11 - wayland-client - qt6-base - qt6-wayland - - - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/applications - /usr/share/doc - /usr/share/qlogging-categories6/kguiaddons.categories - - - - kguiaddons-kf6-devel - Development files for kguiaddons-kf6 - - kguiaddons-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kcontacts-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:gui - desktop.kde6.framework - Address book API for KDE. - Address book for KDE for Contacts. - mirrors://kde/stable/frameworks/6.10/kcontacts-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - ki18n-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kio-kf6-devel - iso-codes-devel - kcoreaddons-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kcontacts-kf6/pspec.xml - - - kcontacts-kf6 - - qt6-base - qt6-declarative - ki18n-kf6 - kcodecs-kf6 - kconfig-kf6 - kcoreaddons-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kcontacts-kf6-devel - Development files for kcontacts-kf6 - - kcontacts-kf6 - ki18n-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - sonnet-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - KDE spell schecking library - This framework contains two main components: Interface to kwallet-kf6, the safe desktop-wide storage for passwords on KDE workspaces. The kwallet-kf6d used to safely store the passwords on KDE work spaces. - mirrors://kde/stable/frameworks/6.10/sonnet-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-designer-devel - hunspell-devel - aspell-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/sonnet-kf6/pspec.xml - - - sonnet-kf6 - - qt6-base - qt6-declarative - aspell - hunspell - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/doc - - - - sonnet-kf6-devel - Development files for sonnet-kf6 - - qt6-base-devel - sonnet-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kirigami-kf6 - https://quickgit.kde.org/?p=kirigami-kf6.git - - Ali Algul - aligulle3801@gmail.com - - LGPL - desktop.kde6.framework - A set of QML components for mobile/desktop convergent applications made by KDE - A set of QML components for mobile/desktop convergent applications made by KDE - https://download.kde.org/stable/frameworks/6.10/kirigami-6.10.0.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-linguist - qt6-svg-devel - qt6-shadertools-devel - - desktop/kde6/framework/kirigami-kf6/pspec.xml - - - kirigami-kf6 - A set of QML components for mobile/desktop convergent applications made by KDE - - qt6-base - qt6-declarative - - - /usr/share/locale/ - /usr/lib/ - - - - kirigami-kf6-devel - Development files for kirigami-kf6 - - kirigami-kf6 - - - /usr/include - /usr/lib/pkgconfig - /usr/share/qlogging-categories6/kirigami.categories - /usr/share/kdevappwizard/templates/kirigami6.tar.bz2 - /usr/lib/cmake - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-13 - 6.2.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kunitconversion-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - KDE unit conversion framework - kunitconversion-kf6 provides functions to convert values in different physical units. - mirrors://kde/stable/frameworks/6.10/kunitconversion-6.10.0.tar.xz - - qt6-base-devel - ki18n-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kunitconversion-kf6/pspec.xml - - - kunitconversion-kf6 - - qt6-base - ki18n-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kunitconversion-kf6-devel - Development files for kunitconversion-kf6 - - qt6-base-devel - kunitconversion-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - extra-cmake-modules-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@gmail.com - - LGPLv2 - library - desktop.kde6.framework - Extra cmake modules for kde6 - Extra cmake modules kde6 - mirrors://kde/stable/frameworks/6.10/extra-cmake-modules-6.10.0.tar.xz - - cmake - flex - - desktop/kde6/framework/extra-cmake-modules-kf6/pspec.xml - - - extra-cmake-modules-kf6 - programming.build - - cmake - flex - - - /usr/share - /usr/lib - /usr/share/man/man7 - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - qqc2-desktop-style-kf6 - https://download.kde.org/ - - Mustafa Cinasal - muscnsl@gmail.com - - GPLv2 - library - desktop.kde6.framework - A style for Qt Quick Controls 2 to make it follow your desktop theme - Qt Quick Controls 2 nin masaüstünüzdeki temayı takip etmesini sağlayan bir stil - https://download.kde.org/stable/frameworks/6.10/qqc2-desktop-style-6.10.0.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kirigami-kf6-devel - kconfig-kf6-devel - kcolorscheme-kf6-devel - libX11-devel - - desktop/kde6/framework/qqc2-desktop-style-kf6/pspec.xml - - - qqc2-desktop-style-kf6 - - kconfig-kf6 - kirigami-kf6 - qt6-base - qt6-declarative - kiconthemes-kf6 - kconfigwidgets-kf6 - kcolorscheme-kf6 - - - /usr/lib - /usr/share/locale - /usr/share/doc - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdav-kf6 - https://github.com/KDE/kdav-kf6 - - Kamil Atlı - suvari@pisilinux.org - - GPLv2 - library - app:gui - desktop.kde6.framework - A DAV protocol implemention with KJobs - Bir DAV protokolü uygulaması - Calendars and todos are supported, using either GroupDAV or CalDAV, and contacts are supported using GroupDAV or CardDAV. - Takvimler ve işler CalDAV veya GroupDAV'ı kullanarak desteklenir. - mirrors://kde/stable/frameworks/6.10/kdav-6.10.0.tar.xz - - libgcc - kio-kf6-devel - solid-kf6-devel - kauth-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - kcodecs-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - extra-cmake-modules-kf6 - kservice-kf6-devel - kitemviews-kf6-devel - kbookmarks-kf6-devel - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - qt6-base-devel - - desktop/kde6/framework/kdav-kf6/pspec.xml - - - kdav-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kcoreaddons-kf6 - qt6-base - - - /usr/bin - /usr/share/locale - /usr/lib - /etc/xdg - /usr/share - - - - kdav-kf6-devel - Development files for kdav-kf6 - kdav-kf6 için geliştirme dosyaları - - kdav-kf6 - kcoreaddons-kf6-devel - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - /usr/share/apps/cmake - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-15 - 6.8.0 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kauth-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Abstraction to system policy and authentication features - Framework which lets applications perform actions as a privileged user - mirrors://kde/stable/frameworks/6.10/kauth-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - polkit-qt6-devel - kcoreaddons-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kauth-kf6/pspec.xml - - - kauth-kf6 - - qt6-base - polkit-qt6 - kcoreaddons-kf6 - kwindowsystem-kf6 - libgcc - - - /etc - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kauth-kf6-devel - Development files for kauth-kf6 - - kauth-kf6 - kcoreaddons-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - oxygen-icons-kf6 - http://www.oxygen-icons.org - - Ertuğrul Erata - ertugrulerata@gmail.com - - LGPL - desktop.kde6.framework - KDE Oxygen icons - "The Oxygen Icon Theme - https://download.kde.org/stable/oxygen-icons/oxygen-icons-6.1.0.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - - desktop/kde6/framework/oxygen-icons-kf6/pspec.xml - - - oxygen-icons-kf6 - - /usr/share/icons - /usr/share/doc - - - 16x16.png - 16x16.png - 22x22.png - 22x22.png - 32x32.png - 32x32.png - 48x48.png - 48x48.png - 64x64.png - 64x64.png - 128x128.png - 128x128.png - 256x256.png - 256x256.png - - - - - 2024-12-14 - 6.1.0 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-23 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-03-07 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kcolorscheme-kf6 - https://github.com/KDE/kcolorscheme - - Mustafa Cinasal - muscnsl@gmail.com - - LGPLv3 - library - desktop.kde6.framework - Classes to read and interact with KColorScheme - Classes to read and interact with KColorScheme - Classes to read and interact with KColorScheme - Classes to read and interact with KColorScheme - https://download.kde.org/stable/frameworks/6.10/kcolorscheme-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - ki18n-kf6-devel - kconfig-kf6-devel - kguiaddons-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kcolorscheme-kf6/pspec.xml - - - kcolorscheme-kf6 - - qt6-base - qt6-declarative - ki18n-kf6 - kconfig-kf6 - kguiaddons-kf6 - - - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - /usr/share/qlogging-categories6 - - - - kcolorscheme-kf6-devel - Development files for kcolorscheme-kf6 - - kcolorscheme-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kpty-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Libraries for pseudo terminal devices - kpty-kf6 provides primitives to interface with pseudo terminal devices as well as a KProcess derived class for running child processes and communicating with them using kpty-kf6. - mirrors://kde/stable/frameworks/6.10/kpty-6.10.0.tar.xz - - qt6-base-devel - utempter-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - knotifications-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kpty-kf6/pspec.xml - - - kpty-kf6 - - qt6-base - libgcc - kcoreaddons-kf6 - ki18n-kf6 - knotifications-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kpty-kf6-devel - Development files for kpty-kf6 - - kcoreaddons-kf6-devel - kpty-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kiconthemes-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - kde6 icon utilities - This library contains classes to improve the handling of icons in applications using the KDE Frameworks. - mirrors://kde/stable/frameworks/6.10/kiconthemes-6.10.0.tar.xz - - kcoreaddons-kf6-devel - qt6-base-devel - qt6-designer-devel - qt6-svg-devel - qt6-declarative-devel - kcolorscheme-kf6-devel - ki18n-kf6-devel - kauth-kf6-devel - karchive-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kitemviews-kf6-devel - breeze-icons-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kiconthemes-kf6/pspec.xml - - - kiconthemes-kf6 - - qt6-base - qt6-svg - qt6-declarative - kcolorscheme-kf6 - kconfigwidgets-kf6 - ki18n-kf6 - kitemviews-kf6 - kwidgetsaddons-kf6 - karchive-kf6 - kconfig-kf6 - breeze-icons-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kiconthemes-kf6-devel - Development files for kiconthemes-kf6 - - kiconthemes-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ki18n-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - KDE Gettext-based UI text internationalization. - KDE grafik arabirim yerelleştirme kitaplığı - ki18n-kf6 provides functionality for internationalizing user interface text in applications, based on the GNU Gettext translation system. - ki18n-kf6, KDE Frameworks 5 için, Gettext tabanlı bir grafik arabirim yerelleştirme kitaplığıdır - mirrors://kde/stable/frameworks/6.10/ki18n-6.10.0.tar.xz - - iso-codes-devel - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/ki18n-kf6/pspec.xml - - - ki18n-kf6 - - qt6-base - qt6-declarative - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/share/man - - - - ki18n-kf6-devel - Development files for kde6-ki18n-kf6 - ki18n-kf6 için geliştirme dosyaları - - ki18n-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kpackage-kf6 - https://userbase.kde.org/kpackage-kf6 - - Stefan Gronewold(groni) - groni@pisilinux.org - - LGPL - app:library - desktop.kde6.framework - Framework that lets applications manage user installable packages of non-binary assets - kpackage-kf6 is dependent on the Smart package manager. - mirrors://kde/stable/frameworks/6.10/kpackage-6.10.0.tar.xz - - qt6-base-devel - libX11-devel - kconfig-kf6-devel - ki18n-kf6-devel - kcoreaddons-kf6-devel - karchive-kf6-devel - kdoctools-kf6-devel - docbook-sgml4_5 - docbook-xsl - extra-cmake-modules-kf6 - - desktop/kde6/framework/kpackage-kf6/pspec.xml - - - kpackage-kf6 - - qt6-base - ki18n-kf6 - karchive-kf6 - kcoreaddons-kf6 - - - /usr/bin - /etc/xdg - /usr/lib/qt5 - /usr/lib - /usr/share - /usr/share/locale - /usr/share/man/man1 - - - - kpackage-kf6-devel - Development files for kpackage-kf6 - - kpackage-kf6 - qt6-base-devel - kconfig-kf6-devel - ki18n-kf6-devel - kcoreaddons-kf6-devel - karchive-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - knotifyconfig-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Configuration dialog for desktop notifications - knotifyconfig-kf6 provides a configuration dialog for desktop notifications which can be embedded in your application.. - mirrors://kde/stable/frameworks/6.10/knotifyconfig-6.10.0.tar.xz - - qt6-base-devel - qt6-phonon-devel - solid-kf6-devel - kauth-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - kcompletion-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kcodecs-kf6-devel - kservice-kf6-devel - kjobwidgets-kf6-devel - kbookmarks-kf6-devel - kcoreaddons-kf6-devel - kwidgetsaddons-kf6-devel - kitemviews-kf6-devel - kconfigwidgets-kf6-devel - kwindowsystem-kf6-devel - libcanberra-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/knotifyconfig-kf6/pspec.xml - - - knotifyconfig-kf6 - - qt6-base - libcanberra - kconfig-kf6 - ki18n-kf6 - kio-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - knotifyconfig-kf6-devel - Development files for knotifyconfig-kf6 - - knotifyconfig-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kwallet-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - KDE password storage framework - This framework contains two main components: Interface to kwallet-kf6, the safe desktop-wide storage for passwords on KDE workspaces. The kwallet-kf6d used to safely store the passwords on KDE work spaces. - mirrors://kde/stable/frameworks/6.10/kwallet-6.10.0.tar.xz - - libxslt - docbook-xsl - qca2-qt6-devel - qt6-base-devel - qt6-declarative-devel - libgcrypt-devel - gpgme-devel - kauth-kf6-devel - gpgme-qt6-devel - kcodecs-kf6-devel - kconfigwidgets-kf6-devel - kconfig-kf6-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - knotifications-kf6-devel - kservice-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - kcolorscheme-kf6-devel - - desktop/kde6/framework/kwallet-kf6/pspec.xml - - - kwallet-kf6 - - qca2-qt6 - qt6-base - qt6-declarative - gpgme - libgcrypt - kconfig-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - ki18n-kf6 - knotifications-kf6 - kservice-kf6 - kwidgetsaddons-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kcolorscheme-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/doc - - - - kwallet-kf6-devel - Development files for kwallet-kf6 - - kwallet-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-25 - 6.2.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - knotifications-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - kde6 Desktop notifications - KNotification is used to notify the user of an event. It covers feedback and persistent events. - mirrors://kde/stable/frameworks/6.10/knotifications-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-speech-devel - qt6-declarative-devel - kservice-kf6-devel - kwindowsystem-kf6-devel - kservice-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - kcodecs-kf6-devel - libcanberra-devel - qt6-phonon-devel - libXtst-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/knotifications-kf6/pspec.xml - - - knotifications-kf6 - - qt6-base - qt6-speech - qt6-declarative - qt6-phonon - libXtst - libX11 - kconfig-kf6 - kcoreaddons-kf6 - libcanberra - kwindowsystem-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - knotifications-kf6-devel - Development files for knotifications-kf6 - - knotifications-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ktextwidgets-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - kde6 text editing widgets - ktextwidgets-kf6 provides widgets for displaying and editing text. It supports rich text as well as plain text. - mirrors://kde/stable/frameworks/6.10/ktextwidgets-6.10.0.tar.xz - - qt6-base-devel - qt6-designer-devel - qt6-declarative-devel - qt6-speech-devel - qt6-multimedia-devel - kconfig-kf6-devel - kcompletion-kf6-devel - kcodecs-kf6-devel - kauth-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - sonnet-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - kcolorscheme-kf6-devel - - desktop/kde6/framework/ktextwidgets-kf6/pspec.xml - - - ktextwidgets-kf6 - - qt6-base - qt6-designer - qt6-multimedia - kconfig-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kcolorscheme-kf6 - kwidgetsaddons-kf6 - ki18n-kf6 - sonnet-kf6 - qt6-speech - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - ktextwidgets-kf6-devel - Development files for ktextwidgets-kf6 - - ktextwidgets-kf6 - qt6-base-devel - ki18n-kf6-devel - sonnet-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - attica-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Open Collaboration Service client library, based on Qt 5 - attica-kf6 is a library to access Open Collaboration Service servers, based on Qt 5. - mirrors://kde/stable/frameworks/6.10/attica-6.10.0.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/attica-kf6/pspec.xml - - - attica-kf6 - - qt6-base - libgcc - - - /etc/xdg - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - attica-kf6-devel - Development files for attica-kf65 - - qt6-base-devel - attica-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - networkmanager-qt-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - A QT wrapper around the NetworkManager libraries - A QT wrapper around the NetworkManager libraries - mirrors://kde/stable/frameworks/6.10/networkmanager-qt-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - NetworkManager-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/networkmanager-qt-kf6/pspec.xml - - - networkmanager-qt-kf6 - - qt6-base - qt6-declarative - NetworkManager - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - networkmanager-qt-kf6-devel - Development files for networkmanager-qt-kf6 - - qt6-base-devel - networkmanager-qt-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-24 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kfilemetadata-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - kde6 library for extracting meta data from files. - KDE library for extracting meta data from files. - mirrors://kde/stable/frameworks/6.10/kfilemetadata-6.10.0.tar.xz - - qt6-base-devel - qt6-multimedia-devel - attr-devel - ebook-tools-devel - exiv2-devel - ffmpeg-devel - taglib-devel - libappimage-devel - poppler-qt6-devel - karchive-kf6-devel - ki18n-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kfilemetadata-kf6/pspec.xml - - - kfilemetadata-kf6 - - qt6-base - ebook-tools - libgcc - exiv2-libs - taglib - libappimage - ffmpeg - poppler-qt6 - karchive-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kcodecs-kf6 - kconfig-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kfilemetadata-kf6-devel - Development files for kfilemetadata-kf6 - - kfilemetadata-kf6 - qt6-base-devel - ebook-tools-devel - exiv2-devel - taglib-devel - ffmpeg-devel - poppler-qt6-devel - karchive-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdoctools-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - kde6 document generator - kdoctools-kf6 is an application aims to generate documents from DocBook. - mirrors://kde/stable/frameworks/6.10/kdoctools-6.10.0.tar.xz - - qt6-base-devel - perl-URI - python - libxml2-devel - libxslt-devel - docbook-xml - docbook-xsl - docbook-sgml4_5 - ki18n-kf6-devel - karchive-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kdoctools-kf6/pspec.xml - - - kdoctools-kf6 - - qt6-base - libxml2 - libxslt - docbook-xml - docbook-xsl - karchive-kf6 - - - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/doc - /usr/share/man - - - - kdoctools-kf6-devel - Development files for kdoctools-kf6 - - qt6-base-devel - kdoctools-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kcalendarcore-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - The KDE calendar access library - The KDE calendar access library - The KDE calendar access library - The KDE calendar access library - mirrors://kde/stable/frameworks/6.10/kcalendarcore-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - libical-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kcalendarcore-kf6/pspec.xml - - - kcalendarcore-kf6 - - libical - qt6-base - libgcc - qt6-declarative - - - /usr/lib - /usr/share - /usr/share/doc - - - - kcalendarcore-kf6-devel - Development files for kcalendarcore-kf6 - - qt6-base-devel - kcalendarcore-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdbusaddons-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - Extra modules for Qt-DBus - kde6-kdbusaddons-kf6 provides convenience classes on top of QtDBus, as well as an API to create kded-kf6 modules. - mirrors://kde/stable/frameworks/6.10/kdbusaddons-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - extra-cmake-modules-kf6 - - desktop/kde6/framework/kdbusaddons-kf6/pspec.xml - - - kdbusaddons-kf6 - - qt6-base - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kdbusaddons-kf6-devel - Development files for kdbusaddons-kf6 - - qt6-base-devel - kdbusaddons-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - karchive-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Qt 5 addon providing access to numerous types of archives - karchive-kf6 provides classes for easy reading, creation and manipulation of "archive" formats like ZIP and TAR. - mirrors://kde/stable/frameworks/6.10/karchive-6.10.0.tar.xz - - bzip2 - xz-devel - zstd-devel - zlib-devel - netcdf-devel - qt6-linguist - qt6-base-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/karchive-kf6/pspec.xml - - - karchive-kf6 - - xz - zlib - zstd - bzip2 - netcdf - qt6-linguist - qt6-base - - - /etc/xdg - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - karchive-kf6-devel - Development files for karchive-kf6 - - qt6-base-devel - karchive-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - bluez-qt-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - GPLv2 - library - desktop.kde6.framework - Qt wrapper for KDE 5 Bluez DBus API - Qt wrapper for KDE 5 DBus API. - mirrors://kde/stable/frameworks/6.10/bluez-qt-6.10.0.tar.xz - - bluez - bluez-libs-devel - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/bluez-qt-kf6/pspec.xml - - - bluez-qt-kf6 - - qt6-base - qt6-declarative - libgcc - - - /usr/lib/qt5 - /usr/lib - /etc/xdg - /usr/share/doc - /lib/udev - /usr/share/qlogging-categories6 - /usr/share/qlogging-categories6/bluez.categories - - - - bluez-qt-kf6-devel - Development files for bluez-qt-kf6 - - qt6-base-devel - bluez-qt-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kglobalaccel-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.framework - Global desktop keyboard shortcuts - kglobalaccel-kf6 allows you to have global accelerators that are independent of the focused window. - mirrors://kde/stable/frameworks/6.10/kglobalaccel-6.10.0.tar.xz - - qt6-base-devel - qt6-linguist - qt6-base - libxcb-devel - kcrash-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - xcb-util-keysyms-devel - kwindowsystem-kf6-devel - kservice-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kglobalaccel-kf6/pspec.xml - - - kglobalaccel-kf6 - - qt6-base - libxcb - kcrash-kf6 - kconfig-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - xcb-util-keysyms - kwindowsystem-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kglobalaccel-kf6-devel - Development files for kglobalaccel-kf6 - - kglobalaccel-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-wayland-protocols-kf6 - https://kde.org/plasma-desktop - - PisiLinux Community - admins@pisilinux.org - - LGPLv3 - library - desktop.kde6.framework - Plasma Specific Protocols for Wayland - Wayland için Plazma Özel Protokoller - https://download.kde.org/stable/plasma-wayland-protocols/plasma-wayland-protocols-1.16.0.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/plasma-wayland-protocols-kf6/pspec.xml - - - plasma-wayland-protocols-kf6 - - /usr/lib - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 1.16.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 1.15.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 1.14.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 1.13.0 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-07-12 - 1.13.0 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-06-09 - 1.13.0 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-25 - 1.13.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-11 - 1.12.0 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 1.12.0 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 1.12.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - breeze-icons-kf6 - https://projects.kde.org/projects/kde/workspace/breeze - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2+ - app:gui - desktop.kde6.framework - Breeze icon themes - İcon themes breeze - mirrors://kde/stable/frameworks/6.10/breeze-icons-6.10.0.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - libxml2-devel - python3-devel - python3-lxml - - desktop/kde6/framework/breeze-icons-kf6/pspec.xml - - - breeze-icons-kf6 - Breeze icon themes - - /usr/lib - /usr/share - /usr/share/doc - - - breeze-16.svg - breeze-22.svg - breeze-dark-16.svg - breeze-dark-22.svg - - - - breeze-icons-kf6-devel - Development files for breeze-icons-kf6 - - breeze-icons-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kded-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - kde6 daemon - kded-kf6 runs in the background and performs a number of small tasks. - mirrors://kde/stable/frameworks/6.10/kded-6.10.0.tar.xz - - qt6-base-devel - qt6-declarative-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kservice-kf6-devel - docbook-xsl - extra-cmake-modules-kf6 - - desktop/kde6/framework/kded-kf6/pspec.xml - - - kded-kf6 - - qt6-base - qt6-declarative - libgcc - kcoreaddons-kf6 - kconfig-kf6 - kcrash-kf6 - kdbusaddons-kf6 - kservice-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/bin - /usr/share/doc - /usr/share/man - - - - kded-kf6-devel - Development files for kded-kf6 - - kded-kf6 - - - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdesu-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.framework - User interface for running shell commands with root privileges - kdesu-kf6 provides functionality for building GUI front ends for (password asking) console mode programs. - mirrors://kde/stable/frameworks/6.10/kdesu-6.10.0.tar.xz - - qt6-base-devel - kcoreaddons-kf6-devel - kpty-kf6-devel - kservice-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcolorscheme-kf6-devel - libX11-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/kdesu-kf6/pspec.xml - - - kdesu-kf6 - - qt6-base - kcoreaddons-kf6 - kpty-kf6 - kservice-kf6 - ki18n-kf6 - kconfig-kf6 - kcolorscheme-kf6 - libX11 - - - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/qlogging-categories6/ksu.categories - /usr/share/doc - - - - kdesu-kf6-devel - Development files for kdesu-kf6 - - kdesu-kf6 - kpty-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ksvg-kf6 - https://community.kde.org/Frameworks - - Mustafa Cinasal - muscnsl@gmail.com - - LGPLv3 - library - desktop.kde6.framework - Components for handling SVGs - Components for handling SVGs - SVG'leri işlemeye yönelik bileşenler - SVG'leri işlemeye yönelik bileşenler - https://download.kde.org/stable/frameworks/6.10/ksvg-6.10.0.tar.xz - - qt6-svg-devel - qt6-base-devel - qt6-declarative-devel - kconfig-kf6-devel - karchive-kf6-devel - kirigami-kf6-devel - kguiaddons-kf6-devel - kcoreaddons-kf6-devel - kcolorscheme-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/framework/ksvg-kf6/pspec.xml - - - ksvg-kf6 - - qt6-svg - qt6-base - qt6-declarative - kconfig-kf6 - karchive-kf6 - kirigami-kf6 - kguiaddons-kf6 - kcoreaddons-kf6 - kcolorscheme-kf6 - - - /usr/lib - /usr/share/qlogging-categories6 - /usr/share/doc - - - - ksvg-kf6-devel - Development files for ksvg-kf6 - - ksvg-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 6.10.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-14 - 6.9.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-08 - 6.8.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-11 - 6.7.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-14 - 6.6.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-09 - 6.5.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-12 - 6.4.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.3.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.3.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-11 - 6.2.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-12 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kwin-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - kde6 window manager - kwin-kf6 is the window manager of the K desktop environment. - mirrors://kde/stable/plasma/6.2.5/kwin-6.2.5.tar.xz - - hwdata - libcanberra-devel - libdisplay-info-devel - kglobalacceld-devel - plasma-activities-kf6-devel - kauth-kf6-devel - ksvg-kf6-devel - kguiaddons-kf6-devel - kcmutils-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdeclarative-kf6-devel - kdecorations-kf6-devel - kdoctools-kf6-devel - kglobalaccel-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - knotifications-kf6-devel - kpackage-kf6-devel - kservice-kf6-devel - ktextwidgets-kf6-devel - kwayland-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - kidletime-kf6-devel - kscreenlocker-kf6-devel - libepoxy-devel - libICE-devel - libSM-devel - libX11-devel - libxcb-devel - libXcursor-devel - libXext-devel - libxkbcommon-devel - libXxf86vm-devel - mesa-devel - fontconfig-devel - freetype-devel - xcb-util-wm-devel - libplasma-kf6-devel - qt6-base-devel - qt6-wayland-devel - qt6-5compat-devel - qt6-declarative-devel - qt6-designer-devel - qt6-multimedia-devel - qt6-sensors-devel - qt6-virtualkeyboard-devel - qt6-svg-devel - wayland-client - wayland-cursor - wayland-devel - xcb-util-image-devel - xcb-util-keysyms-devel - eudev-devel - libinput-devel - xcb-util-cursor-devel - qt6-multimedia - docbook-xsl - libXi-devel - extra-cmake-modules-kf6 - xorg-xwayland-devel - breeze-style-kf6 - libdrm-devel - kirigami-kf6-devel - pipewire-devel - lcms2-devel - krunner-kf6-devel - xcb-util-devel - libqaccessibilityclient-qt6-devel - wayland-protocols-devel - libxcvt-devel - plasma-wayland-protocols-kf6 - - desktop/kde6/plasma/kwin-kf6/pspec.xml - - - kwin-kf6 - - lcms2 - hwdata - kglobalacceld - plasma-activities-kf6 - kauth-kf6 - libcap - libxcvt - libglvnd - ksvg-kf6 - kguiaddons-kf6 - kdbusaddons-kf6 - kcmutils-kf6 - kcompletion-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kcoreaddons-kf6 - kcrash-kf6 - wayland - kdeclarative-kf6 - kdecorations-kf6 - kglobalaccel-kf6 - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - knewstuff-kf6 - knotifications-kf6 - kservice-kf6 - kwayland-kf6 - kwidgetsaddons-kf6 - kwindowsystem-kf6 - kxmlgui-kf6 - kscreenlocker-kf6 - kidletime-kf6 - libepoxy - libgcc - libXi - libICE - libSM - libX11 - libxcb - libxkbcommon - mesa - libplasma-kf6 - qt6-base - qt6-declarative - qt6-sensors - qt6-wayland - wayland-cursor - wayland-client - xcb-util-wm - xcb-util-image - xcb-util-keysyms - eudev - kpackage-kf6 - libdrm - libinput - ktextwidgets-kf6 - freetype - fontconfig - xcb-util-cursor - wayland-server - libqaccessibilityclient-qt6 - libdisplay-info - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - kwayland-server-kf6 - - - kwayland-server-kf6 - - - - kwin-kf6-devel - Development files for kwin-kf6 - - kwin-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - kwayland-kf6-server-devel - - - kwayland-kf6-server-devel - - - - kwin-wayland-kf6 - Wayland support for kwin-kf6 - - mesa - libcap - libdrm - kpackage-kf6 - wayland - freetype - pipewire - kidletime-kf6 - fontconfig - kwin-kf6 - - - /usr/bin/kwin_wayland - /usr/lib/systemd/user/plasma-kwin_wayland.service - /usr/lib/qt6/plugins/org.kde.kwin.waylandbackends/kwinWayland*.so - - - kwin-kf6-wayland - - - kwin-kf6-wayland - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-29 - 6.1.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-22 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-14 - 6.0.3 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-28 - 6.0.3.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plymouth-kcm-kf6 - https://kde.org/plasma-desktop-kf6/ - - PisiLinux Community - admins@pisilinux.org - - LGPLv3 - library - desktop.kde6.plasma - KCM to manage the Plymouth (Boot) theme - KCM to manage the Plymouth (Boot) theme - KCM, Plymouth (Boot) temasını yönetecek - KCM, Plymouth (Boot) temasını yönetecek - plymouth-kcm-kf6 - https://download.kde.org/stable/plasma/6.2.5/plymouth-kcm-6.2.5.tar.xz - - kio-kf6-devel - kauth-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcmutils-kf6-devel - plymouth-devel - karchive-kf6-devel - qt6-base-devel - knewstuff-kf6-devel - kcoreaddons-kf6-devel - kdeclarative-kf6-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - desktop/kde6/plasma/plymouth-kcm-kf6/pspec.xml - - - plymouth-kcm-kf6 - - kio-kf6 - kauth-kf6 - ki18n-kf6 - kconfig-kf6 - karchive-kf6 - qt6-base - knewstuff-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - qt6-declarative - - - /usr/bin - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kde-cli-tools-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - Additional client tools for KDE applications - Tools based on KDE Frameworks 5 to better interact with the system - mirrors://kde/stable/plasma/6.2.5/kde-cli-tools-6.2.5.tar.xz - - qt6-base-devel - qt6-svg-devel - qt6-declarative-devel - libX11-devel - libxcb-devel - kdoctools-kf6-devel - kio-kf6-devel - kdesu-kf6-devel - ki18n-kf6-devel - kservice-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - kwindowsystem-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kcmutils-kf6-devel - kconfig-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - docbook-xsl - plasma-activities-kf6-devel - plasma-workspace-kf6-devel - extra-cmake-modules-kf6 - kdeclarative-kf6-devel - - desktop/kde6/plasma/kde-cli-tools-kf6/pspec.xml - - - kde-cli-tools-kf6 - - qt6-base - qt6-svg - libX11 - libgcc - kio-kf6 - kdesu-kf6 - ki18n-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kcmutils-kf6 - kconfig-kf6 - kdeclarative-kf6 - plasma-activities-kf6 - plasma-workspace-kf6 - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/man - /usr/share/doc - - - System.Package - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - breeze-gtk-kf6 - https://quickgit.kde.org/?p=breeze-gtk-kf6.git - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2+ - app:gui - desktop.kde6.plasma - breeze-kf6 widget theme for GTK 2 and 3 - breeze-kf6 widget theme for GTK 2 and 3 - mirrors://kde/stable/plasma/6.2.5/breeze-gtk-6.2.5.tar.xz - - sassc - cairo-devel - gdk-pixbuf-devel - python-cairo-devel - python3-cairo-devel - extra-cmake-modules-kf6 - libsass-devel - gtk2-engines-murrine - python3-cairo-devel - breeze-style-kf6 - qt6-base-devel - - desktop/kde6/plasma/breeze-gtk-kf6/pspec.xml - - - breeze-gtk-kf6 - breeze-kf6 widget theme for GTK 2 and 3 - - qt6-base - - - /usr/share/kconf_update - /usr/share/themes - /usr/share/doc - /usr/lib/kconf_update_bin - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - powerdevil-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - KDE power manager module - KDE Power Management module. Provides kded-kf6 daemon DBus helper and KCM for configuring Power settings - mirrors://kde/stable/plasma/6.2.5/powerdevil-6.2.5.tar.xz - - qt6-base-devel - qt6-wayland-devel - kdoctools-kf6-devel - kidletime-kf6-devel - libxcb-devel - eudev-devel - plasma-activities-kf6-devel - kauth-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kirigami-kf6-devel - kglobalaccel-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - kwayland-kf6-devel - libkscreen-kf6-devel - networkmanager-qt-kf6-devel - solid-kf6-devel - kunitconversion-kf6-devel - kitemmodels-kf6-devel - docbook-xsl - plasma-workspace-kf6-devel - extra-cmake-modules-kf6 - ki18n-kf6-devel - bluez-qt-kf6-devel - kcrash-kf6-devel - knotifications-kf6-devel - NetworkManager-devel - kcmutils-kf6-devel - qcoro-qt6-devel - wayland-devel - wayland-client - plasma-wayland-protocols-kf6 - - desktop/kde6/plasma/powerdevil-kf6/pspec.xml - - - powerdevil-kf6 - - qt6-base - qt6-wayland - qt6-declarative - kidletime-kf6 - libgcc - libxcb - eudev - krunner-kf6 - wayland-client - plasma-workspace-kf6 - kio-kf6 - kauth-kf6 - kcrash-kf6 - ki18n-kf6 - solid-kf6 - kconfig-kf6 - kxmlgui-kf6 - kirigami-kf6 - kservice-kf6 - kwayland-kf6 - libkscreen-kf6 - plasma-activities-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kglobalaccel-kf6 - knotifyconfig-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - networkmanager-qt-kf6 - bluez-qt-kf6 - kcmutils-kf6 - qcoro-qt6 - wayland - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild qt6. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-firewall-kf6 - https://kde.org/plasma-desktop-kf6/ - - Pisi Linux Admins - admin@pisilinux.org - - GPL - library - desktop.kde6.plasma - Control Panel for your system firewall - Control Panel for your system firewall - Sistem güvenlik duvarınız için Kontrol Paneli - Sistem güvenlik duvarınız için Kontrol Paneli - https://download.kde.org/stable/plasma/6.2.5/plasma-firewall-6.2.5.tar.xz - - ufw - kauth-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcmutils-kf6-devel - qt6-base-devel - kcoreaddons-kf6-devel - kdeclarative-kf6-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - - desktop/kde6/plasma/plasma-firewall-kf6/pspec.xml - - - plasma-firewall-kf6 - - ufw - kauth-kf6 - ki18n-kf6 - kconfig-kf6 - qt6-base - kcmutils-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - qt6-declarative - - - /usr/lib - /usr/share/applications - /usr/share/dbus-1 - /usr/share/kcm_ufw - /usr/share/kpackage-kf6 - /usr/share/polkit-1 - /usr/share/locale - /usr/share/metainfo - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kmenuedit-kf6 - https://www.kde.org - - Pisi Linux admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - Provides the interface and basic tools for the KDE workspace - Provides the interface and basic tools for the KDE workspace - mirrors://kde/stable/plasma/6.2.5/kmenuedit-6.2.5.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - kglobalaccel-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kxmlgui-kf6-devel - sonnet-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - docbook-xsl - extra-cmake-modules-kf6 - kitemviews-kf6-devel - - desktop/kde6/plasma/kmenuedit-kf6/pspec.xml - - - kmenuedit-kf6 - - qt6-base - libgcc - kconfig-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kdbusaddons-kf6 - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - kxmlgui-kf6 - sonnet-kf6 - kglobalaccel-kf6 - kitemviews-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild qt6. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - sddm-kcm-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - app:console - desktop.misc - kde6 Config Module for SDDM - kde6 Config Module for SDDM - mirrors://kde/stable/plasma/6.2.5/sddm-kcm-6.2.5.tar.xz - - kcoreaddons-kf6-devel - kdoctools-kf6-devel - kconfigwidgets-kf6-devel - karchive-kf6-devel - kauth-kf6-devel - libX11-devel - kxmlgui-kf6-devel - ki18n-kf6-devel - kcmutils-kf6-devel - kdeclarative-kf6-devel - qt6-base-devel - kio-kf6-devel - qt6-declarative-devel - kconfig-kf6-devel - kservice-kf6-devel - mesa-devel - docutils - libXcursor-devel - xcb-util-image-devel - extra-cmake-modules-kf6 - knewstuff-kf6-devel - libxcb-devel - - desktop/kde6/plasma/sddm-kcm-kf6/pspec.xml - - - sddm-kcm-kf6 - - kcoreaddons-kf6 - sddm - karchive-kf6 - libX11 - kconfigwidgets-kf6 - kauth-kf6 - knewstuff-kf6 - ki18n-kf6 - kcmutils-kf6 - kdeclarative-kf6 - qt6-base - kio-kf6 - libXcursor - kconfig-kf6 - kservice-kf6 - qt6-declarative - kwidgetsaddons-kf6 - - - /etc/dbus-1/system.d - /usr/share/dbus-1/system-services - /usr/share/kservice-kf6s5 - /usr/share/ - /etc/xdg/sddmtheme.knsrc - /usr/share/polkit-1/actions - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5/plugins - /usr/lib/libexec/kauth-kf6 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - breeze-grub-kf6 - https://www.kde.org - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - desktop.kde6.plasma - breeze-kf6 theme for GRUB. - breeze-kf6 theme for GRUB. - mirrors://kde/stable/plasma/6.2.5/breeze-grub-6.2.5.tar.xz - desktop/kde6/plasma/breeze-grub-kf6/pspec.xml - - - breeze-grub-kf6 - breeze-kf6 theme for GRUB. - - grub2 - noto-fonts - - - /boot/grub2/themes - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-pa-kf6 - https://projects.kde.org/plasma-pa - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - Plasma applet for audio volume management using PulseAudio. - PulseAudio kullanarak ses düzeyi yönetimi için plazma uygulaması - Plasma applet for audio volume management using PulseAudio. - PulseAudio kullanarak ses düzeyi yönetimi için plazma uygulaması - mirrors://kde/stable/plasma/6.2.5/plasma-pa-6.2.5.tar.xz - - ki18n-kf6-devel - ksvg-kf6-devel - kconfig-kf6-devel - kirigami-kf6-devel - kcmutils-kf6-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - libcanberra-devel - kdeclarative-kf6-devel - kglobalaccel-kf6-devel - kstatusnotifieritem-kf6-devel - extra-cmake-modules-kf6 - knotifications-kf6-devel - kitemmodels-kf6-devel - kirigami-addons-kf6 - pulseaudio-libs-devel - pulseaudio-qt6-devel - libplasma-kf6-devel - sound-theme-freedesktop - qt6-base-devel - qt6-declarative-devel - - desktop/kde6/plasma/plasma-pa-kf6/pspec.xml - - - plasma-pa-kf6 - - ki18n-kf6 - ksvg-kf6 - glib2 - libgcc - kconfig-kf6 - kcmutils-kf6 - libcanberra - kcoreaddons-kf6 - kglobalaccel-kf6 - kdeclarative-kf6 - knotifications-kf6 - qt6-declarative - pulseaudio-libs - kitemmodels-kf6 - kstatusnotifieritem-kf6 - kirigami-addons-kf6 - sound-theme-freedesktop - pulseaudio-qt6 - qt6-base - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - polkit-kde-authentication-agent-1-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - app:gui - desktop.kde6.plasma - The KDE Plasma Workspace Components - The Polkit-KDE-Agent package contains a graphical Polkit authentication agent for the KDE Plasma Desktop. - mirrors://kde/stable/plasma/6.2.5/polkit-kde-agent-1-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - knotifications-kf6-devel - polkit-qt6-devel - elogind-devel - mesa-devel - extra-cmake-modules-kf6 - - desktop/kde6/plasma/polkit-kde-authentication-agent-1-kf6/pspec.xml - - - polkit-kde-authentication-agent-1-kf6 - - qt6-base - qt6-declarative - libgcc - kcrash-kf6 - kcoreaddons-kf6 - polkit-qt6 - ki18n-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kwindowsystem-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdeplasma-addons-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - Additional client tools for KDE applications - Additional client tools for KDE applications - mirrors://kde/stable/plasma/6.2.5/kdeplasma-addons-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - qt6-5compat-devel - qt6-webengine-devel - plasma5-support-devel - libxcb-devel - xcb-util-image-devel - glib2-devel - scim-devel - ibus-devel - plasma-activities-kf6-devel - kconfig-kf6-devel - kdoctools-kf6-devel - knewstuff-kf6-devel - kirigami-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kcmutils-kf6-devel - kiconthemes-kf6-devel - krunner-kf6-devel - libplasma-kf6-devel - plasma-workspace-kf6-devel - extra-cmake-modules-kf6 - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kservice-kf6-devel - libX11-devel - kholidays-kf6-devel - kdeclarative-kf6-devel - purpose-kf6-devel - karchive-kf6-devel - knotifications-kf6-devel - networkmanager-qt-kf6-devel - icu4c-devel - libnma-devel - - desktop/kde6/plasma/kdeplasma-addons-kf6/pspec.xml - - - kdeplasma-addons-kf6 - - qt6-base - libplasma-kf6 - libgcc - libxcb - xcb-util-image - glib2 - knewstuff-kf6 - krunner-kf6 - kio-kf6 - kiconthemes-kf6 - ki18n-kf6 - kirigami-kf6 - sonnet-kf6 - kconfig-kf6 - kxmlgui-kf6 - karchive-kf6 - kpackage-kf6 - kservice-kf6 - kholidays-kf6 - kdeclarative-kf6 - qt6-webengine - qt6-5compat - qt6-declarative - plasma5-support - kcompletion-kf6 - kcoreaddons-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kunitconversion-kf6 - plasma-activities-kf6 - plasma-workspace-kf6 - ibus - scim-libs - xcb-util-keysyms - networkmanager-qt-kf6 - icu4c - libnma - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/include/plasma - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - print-manager-kf6 - http://www.kde.org/applications/graphics/kruler - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde6.utils - KDE print manager - KDE print tool. - print-manager - mirrors://kde/stable/plasma/6.2.5/print-manager-6.2.5.tar.xz - - kdoctools-kf6-devel - extra-cmake-modules-kf6 - cups-devel - kio-kf6-devel - ki18n-kf6-devel - libgcc - kconfig-kf6-devel - kservice-kf6-devel - kirigami-kf6-devel - qt6-base-devel - qt6-5compat-devel - kdbusaddons-kf6-devel - kiconthemes-kf6-devel - kcoreaddons-kf6-devel - kwindowsystem-kf6-devel - knotifications-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - qt6-declarative-devel - kcmutils-kf6-devel - packagekit-qt6-devel - libplasma-kf6-devel - - desktop/kde6/plasma/print-manager-kf6/pspec.xml - - - print-manager-kf6 - - kio-kf6 - cups - ki18n-kf6 - libgcc - kconfig-kf6 - kservice-kf6 - qt6-base - qt6-5compat - kdbusaddons-kf6 - kiconthemes-kf6 - kcoreaddons-kf6 - kwindowsystem-kf6 - knotifications-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - kcmutils-kf6 - packagekit-qt6 - system-config-printer - - - /usr/lib - /usr/share/doc - /usr/bin - /usr/share - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-13 - 6.0.2 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kde-gtk-config-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - GTK2 and GTK3 Configurator for KDE - Configuration dialog to adapt GTK+ applications appearance to your taste under KDE. - mirrors://kde/stable/plasma/6.2.5/kde-gtk-config-6.2.5.tar.xz - - qt6-base-devel - qt6-svg-devel - sassc - xsettingsd - libX11-devel - kio-kf6-devel - glib2-devel - ki18n-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - kwidgetsaddons-kf6-devel - kcmutils-kf6-devel - karchive-kf6-devel - kauth-kf6-devel - kconfigwidgets-kf6-devel - libXcursor-devel - knewstuff-kf6-devel - kguiaddons-kf6-devel - gtk2-devel - gtk3-devel - at-spi2-core-devel - extra-cmake-modules-kf6 - kdecorations-kf6-devel - kdbusaddons-kf6-devel - kcolorscheme-kf6-devel - kwindowsystem-kf6-devel - - - schemas.patch - - desktop/kde6/plasma/kde-gtk-config-kf6/pspec.xml - - - kde-gtk-config-kf6 - - qt6-base - qt6-svg - kconfig-kf6 - glib2 - kio-kf6 - ki18n-kf6 - xsettingsd - kcoreaddons-kf6 - kiconthemes-kf6 - kwidgetsaddons-kf6 - karchive-kf6 - knewstuff-kf6 - kguiaddons-kf6 - kconfigwidgets-kf6 - libXcursor - gtk2 - gtk3 - kdbusaddons-kf6 - kdecorations-kf6 - kcolorscheme-kf6 - kwindowsystem-kf6 - - - /usr/share - /etc/xdg/cgc* - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release. - Mustafa Cinasal - muscnsl@gmail.com - - - - - - bluedevil-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - KDE 5 Bluetooth Stack - Integrate the Bluetooth technology within KDE workspace and applications - https://download.kde.org/stable/plasma/6.2.5/bluedevil-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - shared-mime-info - libplasma-kf6-devel - bluez-qt-kf6-devel - kded-kf6-devel - ksvg-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kiconthemes-kf6-devel - kconfigwidgets-kf6-devel - kwindowsystem-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - kirigami-kf6-devel - bluez-qt-kf6-devel - kdeclarative-kf6-devel - extra-cmake-modules-kf6 - fwupd-devel - kcmutils-kf6-devel - purpose-kf6-devel - kdoctools-kf6-devel - kservice-kf6-devel - kjobwidgets-kf6-devel - - desktop/kde6/plasma/bluedevil-kf6/pspec.xml - - - bluedevil-kf6 - - kdoctools-kf6 - qt6-base - libgcc - ksvg-kf6 - bluez-qt-kf6 - kio-kf6 - ki18n-kf6 - kconfig-kf6 - kdeclarative-kf6 - qt6-declarative - kcmutils-kf6 - purpose-kf6 - kservice-kf6 - kjobwidgets-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - knotifications-kf6 - kwindowsystem-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ksystemstats-kf6 - https://kde.org/plasma-desktop-kf6/ - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv3 - library - desktop.kde6.plasma - ksystemstats-kf6 is a daemon that collects statistics about the running system - ksystemstats-kf6 is a daemon that collects statistics about the running system - ksystemstats-kf6, çalışan sistemle ilgili istatistikleri toplayan bir arka plan programıdır. - ksystemstats-kf6, çalışan sistemle ilgili istatistikleri toplayan bir arka plan programıdır. - https://download.kde.org/stable/plasma/6.2.5/ksystemstats-6.2.5.tar.xz - - kio-kf6-devel - eudev-devel - ki18n-kf6-devel - libnl-devel - solid-kf6-devel - libgcc - qt6-base-devel - lm_sensors-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - libksysguard-kf6-devel - kiconthemes-kf6-devel - libnsl-devel - libtirpc-devel - NetworkManager-devel - networkmanager-qt-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/plasma/ksystemstats-kf6/pspec.xml - - - ksystemstats-kf6 - - kio-kf6 - eudev - ki18n-kf6 - libnl - solid-kf6 - libgcc - qt6-base - lm_sensors - kcoreaddons-kf6 - kdbusaddons-kf6 - libksysguard-kf6 - networkmanager-qt-kf6 - - - /usr/bin - /usr/lib - /usr/share/dbus-1 - /usr/share/locale - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kwayland-kf6 - https://www.kde.org - - Stefan Gronewold(groni) - groni@pisilinux.org - - LGPLv3 - library - desktop.kde6.plasma - Qt-style Client and Server library wrapper for the Wayland libraries - Qt-style Client and Server library wrapper for the Wayland libraries - mirrors://kde/stable/plasma/6.2.5/kwayland-6.2.5.tar.xz - - qt6-base-devel - qt6-wayland-devel - libglvnd-devel - wayland-devel - wayland-protocols-devel - mesa-devel - extra-cmake-modules-kf6 - plasma-wayland-protocols-kf6 - - desktop/kde6/plasma/kwayland-kf6/pspec.xml - - - kwayland-kf6 - - qt6-base - qt6-wayland - libglvnd - wayland-client - wayland-server - - - /etc/xdg - /usr/lib - /usr/share/config - /usr/share/doc - /usr/share/qlogging-categories6 - /usr/share/qlogging-categories/org_kde_kwayland.categories - - - - kwayland-kf6-devel - - qt6-base-devel - kwayland-kf6 - - - /usr/lib/cmake - /usr/include - /usr/lib/pkgconfig - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release. - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-sdk-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - app:gui - desktop.kde6.plasma - Applications useful for Plasma development - Applications useful for Plasma development - mirrors://kde/stable/plasma/6.2.5/plasma-sdk-6.2.5.tar.xz - - qt6-base-devel - qt6-svg-devel - qt6-declarative-devel - qt6-5compat-devel - ksvg-kf6-devel - karchive-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - kparts-kf6-devel - libplasma-kf6-devel - kservice-kf6-devel - ktexteditor-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kxmlgui-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - kirigami-kf6-devel - plasma5-support-devel - kcolorscheme-kf6-devel - - desktop/kde6/plasma/plasma-sdk-kf6/pspec.xml - - - plasma-sdk-kf6 - - qt6-base - qt6-5compat - ktexteditor-kf6 - libplasma-kf6 - kio-kf6 - ksvg-kf6 - libgcc - ki18n-kf6 - kconfig-kf6 - karchive-kf6 - kpackage-kf6 - kservice-kf6 - qt6-declarative - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kdeclarative-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - plasma5-support - kcolorscheme-kf6 - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-workspace-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - app:gui - desktop.kde6.plasma - The kde6 Plasma Workspace Components - The kde6 Plasma Workspace Components - mirrors://kde/stable/plasma/6.2.5/plasma-workspace-6.2.5.tar.xz - - libgcc - icu4c-devel - cups-devel - appstream-devel - kded-kf6-devel - kio-kf6-devel - zlib-devel - baloo-kf6-devel - kauth-kf6-devel - ki18n-kf6-devel - libSM-devel - kquickcharts-kf6 - solid-kf6-devel - kdesu-kf6-devel - appmenu-gtk-module-devel - qt6-wayland-devel - kcrash-kf6-devel - libICE-devel - libX11-devel - libXau-devel - libxcb-devel - prison-kf6-devel - kconfig-kf6-devel - kpeople-kf6-devel - krunner-kf6-devel - kwallet-kf6-devel - kxmlgui-kf6-devel - libXtst-devel - kpackage-kf6-devel - kservice-kf6-devel - kunitconversion-kf6-devel - kwayland-kf6-devel - xcb-util-devel - kirigami-kf6-devel - kholidays-kf6-devel - kidletime-kf6-devel - xorg-app-devel - knewstuff-kf6-devel - iso-codes-devel - libXfixes-devel - kbookmarks-kf6-devel - kguiaddons-kf6-devel - libXrender-devel - qt6-phonon-devel - plasma-activities-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kiconthemes-kf6-devel - kitemmodels-kf6-devel - kjobwidgets-kf6-devel - ktexteditor-kf6-devel - extra-cmake-modules-kf6 - kdeclarative-kf6-devel - kglobalaccel-kf6-devel - ktextwidgets-kf6-devel - libqalculate-devel - appstream-qt6-devel - knotifyconfig-kf6-devel - kuserfeedback-kf6-devel - NetworkManager-devel - kconfigwidgets-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - xcb-util-image-devel - libplasma-kf6-devel - plasma-activities-stats-kf6-devel - networkmanager-qt-kf6-devel - oxygen-sounds-kf6 - kwin-kf6-devel - qt6-sql-odbc - qt6-sql-mysql - qt6-base-devel - qt6-shadertools-devel - qt6-sql-sqlite - libkscreen-kf6-devel - qt6-sql-postgresql - libksysguard-kf6-devel - kwindowsystem-kf6-devel - kscreenlocker-kf6-devel - qt6-declarative-devel - qt6-virtualkeyboard-devel - qt6-positioning-devel - gpsd-devel - libXft-devel - qt6-svg-devel - pipewire-devel - kdoctools-kf6-devel - kcmutils-kf6-devel - wayland-devel - wayland-server - wayland-client - wayland-cursor - breeze-gtk-kf6 - xorg-util - libXcursor-devel - libinput-devel - xcb-util-cursor-devel - xcb-util-wm-devel - plasma-wayland-protocols-kf6 - xcb-util-renderutil-devel - breeze-style-kf6 - breeze-cursors-kf6 - breeze-wallpapers-kf6 - kpipewire-kf6-devel - libkexiv2-kf6-devel - polkit-qt6-devel - libdrm-devel - ksvg-kf6-devel - packagekit-qt6-devel - libcanberra-devel - qt6-5compat-devel - plasma5-support-devel - kcolorscheme-kf6-devel - kstatusnotifieritem-kf6-devel - kirigami-addons-kf6 - kwin-wayland-kf6 - qcoro-qt6-devel - - desktop/kde6/plasma/plasma-workspace-kf6/pspec.xml - - - plasma-workspace-kf6 - - kio-kf6 - zlib - baloo-kf6 - icu4c - kauth-kf6 - ki18n-kf6 - libSM - solid-kf6 - kcrash-kf6 - libgcc - libICE - libX11 - libXau - libxcb - appstream - kded-kf6 - prison-kf6 - kconfig-kf6 - kpeople-kf6 - krunner-kf6 - kwallet-kf6 - kxmlgui-kf6 - libXtst - kunitconversion-kf6 - kpackage-kf6 - kpipewire-kf6 - kservice-kf6 - kwayland-kf6 - xcb-util - kholidays-kf6 - kidletime-kf6 - knewstuff-kf6 - packagekit-qt6 - polkit-qt6 - libXfixes - kbookmarks-kf6 - kguiaddons-kf6 - libXrender - libkscreen-kf6 - qt6-phonon - plasma-activities-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - ktexteditor-kf6 - kdeclarative-kf6 - kglobalaccel-kf6 - ktextwidgets-kf6 - libksysguard-kf6 - libqalculate - appstream-qt6 - knotifyconfig-kf6 - kscreenlocker-kf6 - kuserfeedback-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - xcb-util-image - libplasma-kf6 - plasma-activities-stats-kf6 - networkmanager-qt-kf6 - appmenu-gtk-module - oxygen-sounds-kf6 - qt6-base - qt6-shadertools - qt6-declarative - qt6-positioning - gpsd - kparts-kf6 - libXft - qt6-svg - freetype - karchive-kf6 - kcmutils-kf6 - libglvnd - pipewire - fontconfig - libXcursor - qt6-wayland - wayland-client - layer-shell-qt-kf6 - ksvg-kf6 - libcanberra - qt6-5compat - plasma5-support - kcolorscheme-kf6 - kstatusnotifieritem-kf6 - kirigami-addons-kf6 - qcoro-qt6 - - - /etc/pam.d - /etc/env.d - /etc/xdg - /usr/share - /usr/share/applications - /usr/share/locale - /usr/bin - /usr/lib/qt5/plugins - /usr/lib/qt5/qml - /usr/lib - /usr/share/doc - /usr/share/plasma/look-and-feel - - - kde.pam - kde-np.pam - kscreensaver.pam - - - - plasma-workspace-kf6-devel - Development files for kde6 plasma-workspace-kf6 - - plasma-workspace-kf6 - kio-kf6-devel - zlib-devel - baloo-kf6-devel - kauth-kf6-devel - ki18n-kf6-devel - libSM-devel - solid-kf6-devel - kcrash-kf6-devel - libICE-devel - libX11-devel - libXau-devel - libxcb-devel - prison-kf6-devel - kconfig-kf6-devel - kpeople-kf6-devel - krunner-kf6-devel - kwallet-kf6-devel - kxmlgui-kf6-devel - libXtst-devel - kpackage-kf6-devel - kservice-kf6-devel - kwayland-kf6-devel - xcb-util-devel - kholidays-kf6-devel - kidletime-kf6-devel - knewstuff-kf6-devel - libXfixes-devel - kbookmarks-kf6-devel - kguiaddons-kf6-devel - libXrender-devel - qt6-phonon-devel - plasma-activities-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kiconthemes-kf6-devel - kitemmodels-kf6-devel - kjobwidgets-kf6-devel - ktexteditor-kf6-devel - extra-cmake-modules-kf6 - kdeclarative-kf6-devel - kglobalaccel-kf6-devel - ktextwidgets-kf6-devel - libqalculate-devel - appstream-qt6-devel - knotifyconfig-kf6-devel - kuserfeedback-kf6-devel - kconfigwidgets-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - xcb-util-image-devel - libplasma-kf6-devel - plasma-activities-stats-kf6-devel - networkmanager-qt-kf6-devel - qt6-base-devel - libkscreen-kf6-devel - libksysguard-kf6-devel - kwindowsystem-kf6-devel - kscreenlocker-kf6-devel - qt6-declarative-devel - xcb-util-wm-devel - xcb-util-renderutil-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - plasma-workspace-wayland-kf6 - Wayland support for Plasma - - plasma-workspace-kf6 - xorg-xwayland - kwin-wayland-kf6 - - - /usr/bin/startplasma-wayland - /usr/share/wayland-sessions/plasmawayland.desktop - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-06-09 - 6.0.5.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-14 - 6.0.3 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kgamma-kf6 - https://projects.kde.org/kgamma-kf6 - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - Adjust your monitor's gamma settings. - Adjust your monitor's gamma settings. - mirrors://kde/stable/plasma/6.2.5/kgamma-6.2.5.tar.xz - - qt6-base-devel - libX11-devel - kdoctools-kf6-devel - kconfig-kf6-devel - kcmutils-kf6-devel - kconfigwidgets-kf6-devel - ki18n-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - libXxf86vm-devel - docbook-xsl - extra-cmake-modules-kf6 - - desktop/kde6/plasma/kgamma-kf6/pspec.xml - - - kgamma-kf6 - - qt6-base - kconfig-kf6 - libgcc - libX11 - ki18n-kf6 - kcmutils-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - libXxf86vm - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kpipewire-kf6 - https://kde.org/plasma-desktop-kf6/ - - PisiLinux Community - admins@pisilinux.org - - LGPLv3 - library - desktop.kde6.plasma - Components relating to pipewire use in Plasma - Components relating to pipewire use in Plasma - Components relating to pipewire use in Plasma - Components relating to pipewire use in Plasma - kpipewire-kf6 - https://download.kde.org/stable/plasma/6.2.5/kpipewire-6.2.5.tar.xz - - mesa-devel - libva-devel - ki18n-kf6-devel - ffmpeg-devel - libdrm-devel - libepoxy-devel - kwayland-kf6-devel - pipewire-devel - qt6-base-devel - kcoreaddons-kf6-devel - qt6-wayland-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - plasma-wayland-protocols-kf6 - - desktop/kde6/plasma/kpipewire-kf6/pspec.xml - - - kpipewire-kf6 - - mesa - libva - ki18n-kf6 - ffmpeg - libdrm - libepoxy - pipewire - qt6-base - kcoreaddons-kf6 - qt6-declarative - - - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - - kpipewire-kf6-devel - Development files for kpipewire-kf6 - - kpipewire-kf6 - pipewire-devel - libepoxy-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-27 - 6.1.5 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kscreenlocker-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - Library and components for secure lock screen architecture. - Library and components for secure lock screen architecture. - mirrors://kde/stable/plasma/6.2.5/kscreenlocker-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - libX11-devel - libxcb-devel - kio-kf6-devel - kcrash-kf6-devel - ki18n-kf6-devel - knotifications-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - solid-kf6-devel - kglobalaccel-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kdoctools-kf6-devel - kidletime-kf6-devel - kdeclarative-kf6-devel - kcmutils-kf6-devel - ksvg-kf6-devel - kwayland-kf6-devel - libXi-devel - ktextwidgets-kf6-devel - pam-devel - libseccomp-devel - libplasma-kf6-devel - extra-cmake-modules-kf6 - ConsoleKit-devel - wayland-protocols-devel - xcb-util-keysyms-devel - wayland-devel - wayland-client - wayland-server - wayland-cursor - libXcursor-devel - libkscreen-kf6-devel - layer-shell-qt-kf6-devel - plasma-wayland-protocols-kf6 - - desktop/kde6/plasma/kscreenlocker-kf6/pspec.xml - - - kscreenlocker-kf6 - - pam - libXi - qt6-base - libgcc - ksvg-kf6 - ki18n-kf6 - kcrash-kf6 - libX11 - libxcb - kconfig-kf6 - kcmutils-kf6 - kxmlgui-kf6 - kpackage-kf6 - kwayland-kf6 - kidletime-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - kglobalaccel-kf6 - kwindowsystem-kf6 - libseccomp - kio-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - wayland-client - wayland-server - ktextwidgets-kf6 - libplasma-kf6 - qt6-declarative - libkscreen-kf6 - layer-shell-qt-kf6 - xcb-util-keysyms - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kscreenlocker-kf6-devel - Development files for kscreenlocker-kf6 - - qt6-base-devel - layer-shell-qt-kf6-devel - kscreenlocker-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kwallet-pam-kf6 - https://projects.kde.org/kwallet-pam-kf6 - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - kwallet-kf6 PAM integration. - kwallet-kf6 PAM integration. - mirrors://kde/stable/plasma/6.2.5/kwallet-pam-6.2.5.tar.xz - - socat - pam-devel - kwallet-kf6-devel - libgcrypt-devel - extra-cmake-modules-kf6 - qt6-base-devel - - desktop/kde6/plasma/kwallet-pam-kf6/pspec.xml - - - kwallet-pam-kf6 - - pam - socat - qt6-base - libgcrypt - - - /etc/xdg/autostart - /lib - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdecorations-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv3 - library - desktop.kde6.plasma - Plugin based library to create window decorations - Plugin based library to create window decorations - mirrors://kde/stable/plasma/6.2.5/kdecoration-6.2.5.tar.xz - - qt6-base-devel - ki18n-kf6-devel - extra-cmake-modules-kf6 - kcoreaddons-kf6-devel - - desktop/kde6/plasma/kdecorations-kf6/pspec.xml - - - kdecorations-kf6 - - qt6-base - ki18n-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - kdecorations-kf6-devel - Development files for kdecorations-kf6 - - kdecorations-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ksshaskpass-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - ssh-add helper that uses kwallet-kf6 and kpassworddialog - ssh-add helper that uses kwallet-kf6 and kpassworddialog - mirrors://kde/stable/plasma/6.2.5/ksshaskpass-6.2.5.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kwallet-kf6-devel - kwidgetsaddons-kf6-devel - libxslt - docbook-xsl - extra-cmake-modules-kf6 - - desktop/kde6/plasma/ksshaskpass-kf6/pspec.xml - - - ksshaskpass-kf6 - - qt6-base - libgcc - kcoreaddons-kf6 - kwidgetsaddons-kf6 - ki18n-kf6 - kwallet-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/man - /usr/share/doc - - - ksshaskpass-kf6.sh - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - breeze-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - kde6 Plasma artwork - Artwork, styles and assets for the breeze-kf6 visual style for the Plasma Desktop - mirrors://kde/stable/plasma/6.2.5/breeze-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - libxcb-devel - frameworkintegration-kf6-devel - kdecorations-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kcmutils-kf6-devel - kwindowsystem-kf6-devel - kconfig-kf6-devel - kpackage-kf6-devel - kcolorscheme-kf6-devel - kwayland-kf6-devel - libplasma-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - breeze-icons-kf6 - fftw3-devel - kiconthemes-kf6-devel - kguiaddons-kf6-devel - kirigami-kf6-devel - - desktop/kde6/plasma/breeze-kf6/pspec.xml - - - breeze-style-kf6 - - qt6-base - qt6-declarative - libgcc - kconfig-kf6 - kirigami-kf6 - kguiaddons-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kcolorscheme-kf6 - breeze-cursors-kf6 - breeze-light-kf6 - breeze-wallpapers-kf6 - libxcb - frameworkintegration-kf6 - kcmutils-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kwindowsystem-kf6 - kwayland-kf6 - kiconthemes-kf6 - breeze-icons-kf6 - kdecorations-kf6 - - - /usr/bin - /usr/lib/qt6 - /usr/lib/cmake/Breeze/BreezeConfigVersion.cmake - /usr/lib/cmake/Breeze/BreezeConfig.cmake - /usr/share/color-schemes - /usr/share/doc - /usr/share/icons/hicolor/scalable/apps/breeze-settings.svgz - /usr/share/kconf_update - /usr/share/applications - /usr/share/metainfo/org.kde.breezedark.desktop.appdata.xml - /usr/share/metainfo/org.kde.breezetwilight.desktop.appdata.xml - /usr/share/kservice-kf6s5 - /usr/share/kstyle - /usr/share/locale - /usr/share/plasma - /usr/share/QtCurve - - - breeze-style-data - - - breeze-style-data - - - - breeze-cursors-kf6 - - /usr/share/icons/breeze_cursors - /usr/share/icons/breeze_Snow - - - - breeze-light-kf6 - - /usr/share/icons/Breeze_Light - - - - breeze-wallpapers-kf6 - - /usr/share/wallpapers/Next - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-21 - 6.0.4 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release. - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-activities-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - Library for KDE's Plasma Activities support - plasma-activities-kf6 provides an API for using and interacting with the Plasma Activities Manager. - mirrors://kde/stable/plasma/6.2.5/plasma-activities-6.2.5.tar.xz - - qt6-base-devel - mesa-devel - boost-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - kpackage-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kio-kf6-devel - kservice-kf6-devel - kbookmarks-kf6-devel - kwidgetsaddons-kf6-devel - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kitemviews-kf6-devel - solid-kf6-devel - kauth-kf6-devel - kcodecs-kf6-devel - kconfigwidgets-kf6-devel - kxmlgui-kf6-devel - kwindowsystem-kf6-devel - kglobalaccel-kf6-devel - kcmutils-kf6-devel - qt6-declarative-devel - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - extra-cmake-modules-kf6 - - desktop/kde6/plasma/plasma-activities-kf6/pspec.xml - - - plasma-activities-kf6 - - qt6-base - qt6-declarative - kconfig-kf6 - kcoreaddons-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - plasma-activities-kf6-devel - Development files for plasma-activities-kf6 - - qt6-base-devel - plasma-activities-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release. - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-vault-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - GPLv2 - library - desktop.kde6.plasma - Plasma applet and services for creating encrypted vaults - Plasma applet and services for creating encrypted vaults - Şifreli kasaları oluşturmak için kullanılan plazma uygulaması ve hizmetleri - Şifreli kasaları oluşturmak için kullanılan plazma uygulaması ve hizmetleri - https://download.kde.org/stable/plasma/6.2.5/plasma-vault-6.2.5.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - networkmanager-qt-kf6-devel - kwidgetsaddons-kf6-devel - plasma-activities-kf6-devel - kconfigwidgets-kf6-devel - libksysguard-kf6-devel - kdbusaddons-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - libplasma-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - encfs - kirigami-kf6-devel - kitemmodels-kf6-devel - kiconthemes-kf6-devel - NetworkManager-devel - - desktop/kde6/plasma/plasma-vault-kf6/pspec.xml - - - plasma-vault-kf6 - util.crypt - - qt6-base - kitemmodels-kf6 - kwidgetsaddons-kf6 - plasma-activities-kf6 - kconfigwidgets-kf6 - libksysguard-kf6 - kdbusaddons-kf6 - kconfig-kf6 - kcoreaddons-kf6 - libplasma-kf6 - kio-kf6 - ki18n-kf6 - libgcc - encfs - kirigami-kf6 - networkmanager-qt-kf6 - - - /usr/lib/qt6 - /usr/share - /usr/share/locale - /usr/share/kservice-kf6s5 - /usr/share/plasma - /usr/share/metainfo - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - discover-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - app:gui - desktop.kde6.plasma - KDE and Plasma resources management GUI - KDE and Plasma resources management GUI - plasmadiscover-kf6 - mirrors://kde/stable/plasma/6.2.5/discover-6.2.5.tar.xz - - kio-kf6-devel - fwupd-devel - attica-kf6-devel - karchive-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - discount-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kitemmodels-kf6-devel - knotifications-kf6-devel - kxmlgui-kf6-devel - kdeclarative-kf6-devel - libplasma-kf6-devel - knewstuff-kf6-devel - extra-cmake-modules-kf6 - kirigami-kf6-devel - kcmutils-kf6-devel - kidletime-kf6-devel - appstream-qt6-devel - purpose-kf6-devel - packagekit-qt6-devel - kstatusnotifieritem-kf6-devel - kirigami-addons-kf6 - kuserfeedback-kf6-devel - kiconthemes-kf6-devel - qcoro-qt6-devel - qt6-svg-devel - flatpak-devel - qt6-base-devel - qt6-webview-devel - qt6-declarative-devel - - desktop/kde6/plasma/discover-kf6/pspec.xml - - - discover-kf6 - - qt6-base - qt6-webview - kdeclarative-kf6 - kio-kf6 - fwupd - glib2 - attica-kf6 - kconfig-kf6 - kservice-kf6 - kcmutils-kf6 - kconfig-kf6 - discount - kitemmodels-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kjobwidgets-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - ki18n-kf6 - kcrash-kf6 - kxmlgui-kf6 - kidletime-kf6 - kwindowsystem-kf6 - kstatusnotifieritem-kf6 - qt6-declarative - knewstuff-kf6 - purpose-kf6 - appstream-qt6 - packagekit-qt6 - kuserfeedback-kf6 - kirigami-addons-kf6 - qcoro-qt6 - - - /etc - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/share - /usr/share/locale - - - - discover-kf6-plugin-flatpak - hardware.virtualization - - discover-kf6 - glib2 - flatpak - appstream-qt6 - qt6-base - kio-kf6 - ki18n-kf6 - kservice-kf6 - kconfig-kf6 - kcoreaddons-kf6 - gnupg - - - /usr/lib/qt6/plugins/discover-notifier/FlatpakNotifier.so - /usr/lib/qt6/plugins/discover/flatpak-backend.so - /usr/share/applications/org.kde.discover-flatpak - /usr/share/libdiscover/categories/flatpak-backend-categories.xml - /usr/share/metainfo/org.kde.discover.flatpak.appdata.xml - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - system-settings-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - kde6 system settings manager - system-settings-kf6 is a control panel for kde6 Plasma - mirrors://kde/stable/plasma/6.2.5/systemsettings-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kitemviews-kf6-devel - kpackage-kf6-devel - kservice-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - kdoctools-kf6-devel - kio-kf6-devel - kauth-kf6-devel - kcmutils-kf6-devel - docbook-xsl - plasma-activities-kf6-devel - plasma-activities-stats-kf6-devel - kirigami-kf6-devel - kguiaddons-kf6-devel - extra-cmake-modules-kf6 - kitemmodels-kf6-devel - kcrash-kf6-devel - kirigami-addons-kf6 - plasma-workspace-kf6-devel - - desktop/kde6/plasma/system-settings-kf6/pspec.xml - - - system-settings-kf6 - - qt6-base - qt6-declarative - kauth-kf6 - kcrash-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kcmutils-kf6 - kconfig-kf6 - kdbusaddons-kf6 - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - kitemviews-kf6 - kservice-kf6 - kwindowsystem-kf6 - kxmlgui-kf6 - kpackage-kf6 - plasma-activities-kf6 - kdeclarative-kf6 - kitemmodels-kf6 - plasma-activities-stats-kf6 - plasma-workspace-kf6 - kirigami-addons-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kinfocenter-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - kde6 info center - kde6 Utility that provides information about a computer system. - mirrors://kde/stable/plasma/6.2.5/kinfocenter-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - kcmutils-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - clinfo - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kpackage-kf6-devel - kservice-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - libraw1394-devel - libX11-devel - mesa-glu-devel - mesa-devel - pciutils-devel - kpipewire-kf6-devel - libplasma-kf6-devel - solid-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kwayland-kf6-devel - docbook-xsl - extra-cmake-modules-kf6 - kirigami-kf6-devel - libglvnd-devel - system-settings-kf6 - vulkan-tools - wayland-utils - util-linux - libusb-devel - mesa-demos - mesa-utils - fwupd-devel - xorg-app-devel - - desktop/kde6/plasma/kinfocenter-kf6/pspec.xml - - - kinfocenter-kf6 - - kcmutils-kf6 - kcompletion-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kdeclarative-kf6 - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - kservice-kf6 - kwayland-kf6 - kwidgetsaddons-kf6 - kxmlgui-kf6 - kcrash-kf6 - libraw1394 - libX11 - mesa-glu - mesa - clinfo - pciutils - kwindowsystem-kf6 - qt6-base - qt6-qdbusviewer - qt6-declarative - solid-kf6 - libglvnd - kirigami-kf6 - system-settings-kf6 - wayland-utils - libgcc - libusb - mesa-demos - mesa - mesa-utils - aha - fwupd - vulkan-tools - kpipewire-kf6 - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - /usr/share/about-distro - - - kcm-about-distrorc - pisilinux.svg - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - oxygen-sounds-kf6 - https://kde.org/plasma-desktop-kf6/ - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv3 - library - desktop.kde6.plasma - The oxygen-kf6 Sound Theme - The oxygen-kf6 Sound Theme - Oksijen Sesi Teması - Oksijen Sesi Teması - https://download.kde.org/stable/plasma/6.2.5/oxygen-sounds-6.2.5.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - - desktop/kde6/plasma/oxygen-sounds-kf6/pspec.xml - - - oxygen-sounds-kf6 - - /usr/share/sounds - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-welcome-kf6 - https://kde.org/plasma-desktop-kf6/ - - Mustafa Cinasal - muscnsl@gmail.com - - LGPLv3 - library - desktop.kde6.applications - A friendly onboarding wizard for Plasma - A friendly onboarding wizard for Plasma - Plazma için arkadaş canlısı bir yerleştirme sihirbazı - Plazma için arkadaş canlısı bir yerleştirme sihirbazı - https://download.kde.org/stable/plasma/6.2.5/plasma-welcome-6.2.5.tar.xz - - kio-kf6-devel - ki18n-kf6-devel - ksvg-kf6-devel - kconfig-kf6-devel - kcmutils-kf6-devel - kirigami-kf6-devel - kservice-kf6-devel - knewstuff-kf6-devel - qt6-base-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - kuserfeedback-kf6-devel - kwindowsystem-kf6-devel - knotifications-kf6-devel - libplasma-kf6-devel - qt6-declarative-devel - kaccounts-integration-kf6-devel - extra-cmake-modules-kf6 - kirigami-addons-kf6 - - desktop/kde6/plasma/plasma-welcome-kf6/pspec.xml - - - plasma-welcome-kf6 - - kio-kf6 - ksvg-kf6 - ki18n-kf6 - libgcc - kcmutils-kf6 - kconfig-kf6 - kservice-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - kdeclarative-kf6 - kwindowsystem-kf6 - knotifications-kf6 - qt6-declarative - - - /usr/bin - /etc - /usr/lib - /usr/share - /usr/share/applications - /usr/share/locale - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - xdg-desktop-portal-kde-kf6 - https://download.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.plasma - A backend implementation for xdg-desktop-portal using Qt/KF5 - A backend implementation for xdg-desktop-portal using Qt/KF5 - A backend implementation for xdg-desktop-portal using Qt/KF5 - A backend implementation for xdg-desktop-portal using Qt/KF5 - https://download.kde.org/stable/plasma/6.2.5/xdg-desktop-portal-kde-6.2.5.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-wayland-devel - qt6-declarative-devel - kdeclarative-kf6-devel - kirigami-kf6-devel - libplasma-kf6-devel - plasma-workspace-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kwidgetsaddons-kf6-devel - kwayland-kf6-devel - wayland-devel - wayland-client - wayland-server - wayland-cursor - libepoxy-devel - ki18n-kf6-devel - kio-kf6-devel - cups-devel - pipewire-devel - knotifications-kf6-devel - wayland-protocols-devel - plasma-wayland-protocols-kf6 - kglobalaccel-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - kstatusnotifieritem-kf6-devel - - desktop/kde6/plasma/xdg-desktop-portal-kde-kf6/pspec.xml - - - xdg-desktop-portal-kde-kf6 - - ki18n-kf6 - kio-kf6 - mesa - libgcc - kservice-kf6 - kwayland-kf6 - libepoxy - pipewire - kconfig-kf6 - kwindowsystem-kf6 - qt6-base - kcoreaddons-kf6 - kitemviews-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - wayland-client - kiconthemes-kf6 - kglobalaccel-kf6 - libxkbcommon - kstatusnotifieritem-kf6 - qt6-wayland - qt6-declarative - kdeclarative-kf6 - kirigami-kf6 - - - /usr/lib - /usr/share/dbus-1 - /usr/share - /usr/share/doc - /usr/share/locale - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kscreen-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - Provides the interface and basic tools for the KDE workspace - Provides the interface and basic tools for the KDE workspace - mirrors://kde/stable/plasma/6.2.5/kscreen-6.2.5.tar.xz - - qt6-base-devel - qt6-sensors-devel - qt6-declarative-devel - kglobalaccel-kf6-devel - libkscreen-kf6-devel - layer-shell-qt-kf6-devel - kconfigwidgets-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kwidgetsaddons-kf6-devel - kconfig-kf6-devel - kdoctools-kf6-devel - kxmlgui-kf6-devel - kiconthemes-kf6-devel - mesa-devel - extra-cmake-modules-kf6 - libplasma-kf6-devel - kdeclarative-kf6-devel - kcmutils-kf6-devel - libXi-devel - ksvg-kf6-devel - kwindowsystem-kf6-devel - - desktop/kde6/plasma/kscreen-kf6/pspec.xml - - - kscreen-kf6 - - qt6-base - qt6-sensors - libgcc - libkscreen-kf6 - qt6-declarative - kconfig-kf6 - kcoreaddons-kf6 - kglobalaccel-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kdbusaddons-kf6 - ki18n-kf6 - kxmlgui-kf6 - kdeclarative-kf6 - kcmutils-kf6 - libplasma-kf6 - kwindowsystem-kf6 - libXi - libX11 - libxcb - layer-shell-qt-kf6 - ksvg-kf6 - - - /usr/share - /etc/xdg - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-workspace-wallpapers-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - app:gui - desktop.kde6.plasma - The KDE Plasma Workspace Components - The KDE Plasma Workspace Components - mirrors://kde/stable/plasma/6.2.5/plasma-workspace-wallpapers-6.2.5.tar.xz - https://sourceforge.net/projects/pisilinux/files/source/blue.tar.gz - https://sourceforge.net/projects/pisilinux/files/source/Sweet-cat.tar.gz - https://github.com/prdsmehmetstc/pisi-crocus-ancyrensis/releases/download/v1.0/pisi-crocus-ancyrensis.tar.gz - - qt6-base-devel - extra-cmake-modules-kf6 - - desktop/kde6/plasma/plasma-workspace-wallpapers-kf6/pspec.xml - - - plasma-workspace-wallpapers-kf6 - - qt6-base - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - plasma-workspace-wallpapers-pisilinux-kf6 - - /usr/share/wallpapers/sweet-cat - /usr/share/wallpapers/pisilinux-blue - /usr/share/wallpapers/pisi-crocus-ancyrensis - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - breeze-plymouth-kf6 - https://www.kde.org - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - desktop.kde6.plasma - breeze-kf6 theme for Plymouth. - breeze-kf6 theme for Plymouth. - mirrors://kde/stable/plasma/6.2.5/breeze-plymouth-6.2.5.tar.xz - - extra-cmake-modules-kf6 - plymouth-devel - - desktop/kde6/plasma/breeze-plymouth-kf6/pspec.xml - - - breeze-plymouth-kf6 - breeze-kf6 theme for Plymouth. - - plymouth - grub2 - plymouth-core-libs - plymouth-theme-spinner - plymouth-graphics-libs - plymouth-plugin-script - - - /usr/lib - /usr/share - /usr/share/doc - - - pisi.logo.png - pisi.16bit.png - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-nm-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - Plasma applet written in QML for managing network connections - Plasma applet written in QML for managing network connections - mirrors://kde/stable/plasma/6.2.5/plasma-nm-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - qt6-designer - qt6-webengine-devel - libgcc - qcoro-qt6-devel - networkmanager-qt-kf6-devel - ModemManager-devel - cups-devel - kcompletion-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - ksvg-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kitemviews-kf6-devel - knotifications-kf6-devel - kservice-kf6-devel - kwallet-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - solid-kf6-devel - openconnect-devel - kdoctools-kf6-devel - NetworkManager-devel - mobile-broadband-provider-info - extra-cmake-modules-kf6 - libplasma-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - qca2-qt6-devel - prison-kf6-devel - kirigami-kf6-devel - openconnect-devel - libproxy-devel - kcmutils-kf6-devel - kcolorscheme-kf6-devel - modemmanager-qt-kf6-devel - - desktop/kde6/plasma/plasma-nm-kf6/pspec.xml - - - plasma-nm-kf6 - - qt6-base - kcmutils-kf6 - kdeclarative-kf6 - openconnect - kio-kf6 - ksvg-kf6 - libproxy - qca2-qt6 - qcoro-qt6 - networkmanager-qt-kf6 - ki18n-kf6 - solid-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - kservice-kf6 - prison-kf6 - kirigami-kf6 - kitemviews-kf6 - openconnect - kcolorscheme-kf6 - modemmanager-qt-kf6 - qt6-declarative - qt6-webengine - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - NetworkManager - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-29 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kactivitymanagerd-kf6 - https://www.kde.org - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - desktop.kde6.plasma - Core components for the KDE Activity concept. - System service to manage user's activities, track the usage patterns etc. - mirrors://kde/stable/plasma/6.2.5/kactivitymanagerd-6.2.5.tar.xz - - extra-cmake-modules-kf6 - boost-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - qt6-sql-mysql - qt6-sql-odbc - qt6-sql-postgresql - qt6-sql-sqlite - qt6-base-devel - qt6-5compat-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kwindowsystem-kf6-devel - kglobalaccel-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - kcrash-kf6-devel - - desktop/kde6/plasma/kactivitymanagerd-kf6/pspec.xml - - - kactivitymanagerd-kf6 - Core components for the KDE Activity concept. - - kio-kf6 - ki18n-kf6 - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - qt6-base - qt6-5compat - kcoreaddons-kf6 - kdbusaddons-kf6 - kglobalaccel-kf6 - kwindowsystem-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - /usr/share/locale - /usr/share/kservice-kf6s5 - /usr/share/kservice-kf6types5 - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libplasma-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - Plasma library and runtime components based upon KDE Frameworks 5 and Qt5 - Plasma library and runtime components based upon KF5 and Qt5 - mirrors://kde/stable/plasma/6.2.5/libplasma-6.2.5.tar.xz - - qt6-base-devel - qt6-wayland-devel - kdoctools-kf6-devel - qt6-svg-devel - qt6-declarative-devel - mesa-devel - libX11-devel - libxcb-devel - libglvnd-devel - plasma-wayland-protocols-kf6 - kauth-kf6-devel - kcodecs-kf6-devel - kirigami-kf6-devel - kwidgetsaddons-kf6-devel - kbookmarks-kf6-devel - kcompletion-kf6-devel - plasma-activities-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - solid-kf6-devel - knotifications-kf6-devel - kpackage-kf6-devel - karchive-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - kglobalaccel-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kparts-kf6-devel - kservice-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - kwayland-kf6-devel - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - docbook-xml - docbook-xsl - wayland-devel - wayland-client - ksvg-kf6-devel - kcmutils-kf6-devel - kcolorscheme-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/plasma/libplasma-kf6/pspec.xml - - - libplasma-kf6 - - qt6-base - qt6-svg - qt6-base - qt6-wayland - qt6-declarative - libX11 - libxcb - libglvnd - wayland-client - kconfig-kf6 - ksvg-kf6 - kcmutils-kf6 - kirigami-kf6 - plasma-activities-kf6 - knotifications-kf6 - kpackage-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - kglobalaccel-kf6 - kguiaddons-kf6 - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - kio-kf6 - kwindowsystem-kf6 - kcolorscheme-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - plasma-framework-kf6 - - - - libplasma-kf6-devel - Development files for libplasma-kf6 - - libplasma-kf6 - kpackage-kf6-devel - kservice-kf6-devel - kwindowsystem-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - plasma-framework-kf6-devel - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma5-support - https://kde.org/plasma-desktop/ - - Mustafa Cinasal - muscnsl@gmail.com - - LGPLv3 - library - desktop.kde6.plasma - Support components for porting from KF5/Qt5 to KF6/Qt6 - Support components for porting from KF5/Qt5 to KF6/Qt6 - KF5/Qt5'ten KF6/Qt6'ya geçiş için destek bileşenleri - KF5/Qt5'ten KF6/Qt6'ya geçiş için destek bileşenleri - https://download.kde.org/stable/plasma/6.2.5/plasma5support-6.2.5.tar.xz - - qt6-base-devel - qt6-sql-mysql - qt6-sql-odbc - qt6-sql-sqlite - qt6-sql-postgresql - kio-kf6-devel - ki18n-kf6-devel - solid-kf6-devel - kconfig-kf6-devel - kguiaddons-kf6-devel - knotifications-kf6-devel - kcoreaddons-kf6-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - libksysguard-kf6-devel - - desktop/kde6/plasma/plasma5-support/pspec.xml - - - plasma5-support - - qt6-base - qt6-sql-mysql - qt6-sql-odbc - qt6-sql-sqlite - qt6-sql-postgresql - kio-kf6 - ki18n-kf6 - solid-kf6 - kconfig-kf6 - kguiaddons-kf6 - knotifications-kf6 - kcoreaddons-kf6 - qt6-declarative - libksysguard-kf6 - - - /usr/lib - /usr/share/plasma5support - /usr/share/qlogging-categories6 - /usr/share/locale - /usr/share/doc - - - - plasma5-support-devel - Development files for plasma5-support - - plasma5-support - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-activities-stats-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - Library for KDE's Plasma Activities support - plasma-activities-kf6 provides an API for using and interacting with the Plasma Activities Manager. - mirrors://kde/stable/plasma/6.2.5/plasma-activities-stats-6.2.5.tar.xz - - qt6-base-devel - boost-devel - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - kconfig-kf6-devel - plasma-activities-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/plasma/plasma-activities-stats-kf6/pspec.xml - - - plasma-activities-stats-kf6 - - qt6-base - libgcc - kconfig-kf6 - plasma-activities-kf6 - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - plasma-activities-stats-kf6-devel - Development files for plasma-activities-stats-kf6 - - qt6-base-devel - kconfig-kf6-devel - plasma-activities-kf6-devel - plasma-activities-stats-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kwayland-integration-kf6 - https://www.kde.org - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv3 - library - desktop.kde6.plasma - Provides integration plugins for various KDE frameworks for the wayland windowing system - Provides integration plugins for various KDE frameworks for the wayland windowing system - mirrors://kde/stable/plasma/6.2.5/kwayland-integration-6.2.5.tar.xz - - kguiaddons5-devel - kwayland5-devel - qt5-base-devel - qt6-wayland-devel - qt6-wayland-devel - kwindowsystem5-devel - kidletime5-devel - extra-cmake-modules - qt5-wayland-devel - wayland-devel - wayland-client - wayland-cursor - wayland-server - wayland-protocols-devel - plasma-wayland-protocols - - desktop/kde6/plasma/kwayland-integration-kf6/pspec.xml - - - kwayland-integration-kf6 - - kwayland5 - kidletime5 - kwindowsystem5 - libgcc - qt5-base - kguiaddons5 - qt5-wayland - wayland - wayland-client - wayland-cursor - wayland-server - - - /usr/lib - /etc/xdg/kwindowsystem-kf6.kwayland-kf6.categories - /usr/share - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-browser-integration-kf6 - https://kde.org/plasma-desktop-kf6 - - Safa Arıman - safaariman@pisilinux.org - - GPLv3 - app - desktop.kde6.plasma - Plasma browser integration - Components necessary to integrate browsers into the Plasma Desktop. - https://download.kde.org/stable/plasma/6.2.5/plasma-browser-integration-6.2.5.tar.xz - - cmake - extra-cmake-modules-kf6 - kio-kf6-devel - ki18n-kf6-devel - kcrash-kf6-devel - kconfig-kf6-devel - krunner-kf6-devel - purpose-kf6-devel - kservice-kf6-devel - qt6-base-devel - plasma-activities-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - knotifications-kf6-devel - kfilemetadata-kf6-devel - kitemmodels-kf6-devel - plasma-workspace-kf6-devel - kjobwidgets-kf6-devel - kstatusnotifieritem-kf6-devel - qt6-declarative-devel - - desktop/kde6/plasma/plasma-browser-integration-kf6/pspec.xml - - - plasma-browser-integration-kf6 - - kio-kf6 - ki18n-kf6 - kcrash-kf6 - kconfig-kf6 - krunner-kf6 - purpose-kf6 - kservice-kf6 - qt6-base - kjobwidgets-kf6 - plasma-activities-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kfilemetadata-kf6 - knotifications-kf6 - kstatusnotifieritem-kf6 - plasma-workspace-kf6 - - - /usr/bin - /usr/lib - /usr/share/locale - /usr/share - /etc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-desktop-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - kde6 plasma workspace - Masaüstü için Plazma - This package contains the basic packages for a Plasma workspace. - Web'de gezinmek için Plasma'yı kullanın; meslektaşlarınız, arkadaşlarınız ve ailenizle iletişim halinde olun; dosyalarınızı yönetin, müzik ve videoların keyfini çıkarın; ve işte üretken olun. Hepsini gereksinimlerinize uyarlanan güzel bir ortamda ve en iyi Ücretsiz Açık Kaynak Yazılımın sunduğu güvenlik, gizlilik koruması ve gönül rahatlığı ile yapın. - plasma - mirrors://kde/stable/plasma/6.2.5/plasma-desktop-6.2.5.tar.xz - - kio-kf6-devel - scim-libs - scim-devel - kwin-kf6-devel - ibus-devel - kauth-kf6-devel - ki18n-kf6-devel - baloo-kf6-devel - glib2-devel - eudev-devel - boost-devel - libX11-devel - libXft-devel - libxcb-devel - breeze-style-kf6 - qt6-sql-odbc - signond-devel - krunner-kf6-devel - libXext-devel - xdg-user-dirs - ksvg-kf6-devel - kconfig-kf6-devel - qt6-sql-mysql - wayland-devel - wayland-client - kcmutils-kf6-devel - qt6-base-devel - qt6-sql-sqlite - xorg-app-devel - kpackage-kf6-devel - freetype-devel - knewstuff-kf6-devel - packagekit-devel - qt6-phonon-devel - libXcursor-devel - libxkbfile-devel - xkeyboard-config - kdbusaddons-kf6-devel - qt6-wayland-devel - xorg-server-devel - plasma-activities-kf6-devel - qt6-sql-postgresql - kglobalaccel-kf6-devel - kdeclarative-kf6-devel - qqc2-desktop-style-kf6 - libksysguard-kf6-devel - extra-cmake-modules-kf6 - qt6-5compat-devel - libusb-compat-devel - appstream-qt6-devel - knotifyconfig-kf6-devel - packagekit-qt6-devel - xcb-util-image-devel - knotifications-kf6-devel - libaccounts-qt6-devel - qt6-declarative-devel - pulseaudio-libs-devel - plasma-workspace-kf6-devel - xorg-input-evdev-devel - libplasma-kf6-devel - xcb-util-keysyms-devel - libaccounts-glib-devel - plasma-activities-stats-kf6-devel - wayland-protocols-devel - xorg-input-libinput-devel - signon-plugin-oauth2-devel - xorg-input-synaptics-devel - kdoctools-kf6-devel - plasma5-support-devel - kded-kf6-devel - libsdl2-devel - icu4c-devel - kirigami-kf6-devel - libcanberra-devel - kaccounts-integration-kf6-devel - - desktop/kde6/plasma/plasma-desktop-kf6/pspec.xml - - - plasma-desktop-kf6 - - kio-kf6 - ibus - baloo-kf6 - glib2 - kauth-kf6 - ki18n-kf6 - libXi - solid-kf6 - kcrash-kf6 - libX11 - libgcc - libxcb - sonnet-kf6 - kconfig-kf6 - kcodecs-kf6 - krunner-kf6 - kxmlgui-kf6 - kirigami-kf6 - kcmutils-kf6 - kpackage-kf6 - kservice-kf6 - qt6-base - plasma-nm-kf6 - knewstuff-kf6 - scim-libs - kpipewire-kf6 - kbookmarks-kf6 - kitemviews-kf6 - kguiaddons-kf6 - libXcursor - libxkbfile - qt6-phonon - plasma-activities-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - qt6-wayland - kdeclarative-kf6 - kdeplasma-addons-kf6 - kglobalaccel-kf6 - libksysguard-kf6 - libxkbcommon - knotifyconfig-kf6 - kwindowsystem-kf6 - qt6-5compat - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - packagekit-qt6 - wayland-client - libaccounts-qt6 - qt6-declarative - libplasma-kf6 - plasma-workspace-kf6 - xcb-util-keysyms - plasma-activities-stats-kf6 - qqc2-desktop-style-kf6 - ksvg-kf6 - kdoctools-kf6 - plasma5-support - libsdl2 - kirigami-kf6 - kirigami-addons-kf6 - libcanberra - - - /etc - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/cmake - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-22 - 6.2.0 - Add kdeplasma-addons as a dependency. - Bedirhan Kurt - bedirhan.kurt@outlook.com - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - qqc2-breeze-style - https://kde.org/plasma-desktop/ - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.plasma - Applications useful for Plasma development - Applications useful for Plasma development - Plazma geliştirme için yararlı uygulamalar - Plazma geliştirme için yararlı uygulamalar - qqc2-breeze-style - https://download.kde.org/stable/plasma/6.2.5/qqc2-breeze-style-6.2.5.tar.xz - - qt6-base-devel - kconfig-kf6-devel - kirigami-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - kcoreaddons-kf6-devel - kquickcharts-kf6 - qt6-declarative-devel - kcolorscheme-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/plasma/qqc2-breeze-style/pspec.xml - - - qqc2-breeze-style - - qt6-base - kconfig-kf6 - kirigami-kf6 - kguiaddons-kf6 - kiconthemes-kf6 - qt6-declarative - kcolorscheme-kf6 - - - /usr/lib - /usr/share - /usr/share/doc - - - - qqc2-breeze-style-devel - Development files for qqc2-breeze-style - - qqc2-breeze-style - - - /usr/lib/cmake - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-13 - 6.0.2 - First release - PisiLinux Community - admins@pisilinux.org - - - - - - drkonqi-kf6 - https://www.kde.org/ - - Mustafa Cinasal - muscnsl@gmail.com - - GPLv2 - library - desktop.kde6.plasma - The KDE crash handler - The KDE crash handler - The KDE crash handler - The KDE crash handler - https://download.kde.org/stable/plasma/6.2.5/drkonqi-6.2.5.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - ki18n-kf6-devel - kcoreaddons-kf6-devel - kservice-kf6-devel - kconfig-kf6-devel - kjobwidgets-kf6-devel - kio-kf6-devel - kcrash-kf6-devel - kcompletion-kf6-devel - kwidgetsaddons-kf6-devel - kwallet-kf6-devel - knotifications-kf6-devel - kidletime-kf6-devel - at-spi2-core-devel - xorg-server-xvfb - rubygems - ruby-devel - gdb-devel - python3-devel - python3-psutil - python3-pygdbmi - python3-sentry_sdk - kcmutils-kf6-devel - kwindowsystem-kf6-devel - syntax-highlighting-kf6-devel - qt6-declarative-devel - kdeclarative-kf6-devel - kirigami-kf6-devel - kitemmodels-kf6-devel - kuserfeedback-kf6-devel - kstatusnotifieritem-kf6-devel - elogind-devel - polkit-qt6-devel - - desktop/kde6/plasma/drkonqi-kf6/pspec.xml - - - drkonqi-kf6 - - qt6-base - qt6-declarative - libgcc - ki18n-kf6 - kcmutils-kf6 - kcoreaddons-kf6 - kservice-kf6 - kidletime-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kjobwidgets-kf6 - kio-kf6 - kcrash-kf6 - kcompletion-kf6 - kwidgetsaddons-kf6 - kwallet-kf6 - knotifications-kf6 - kwindowsystem-kf6 - syntax-highlighting-kf6 - kdeclarative-kf6 - kirigami-kf6 - kitemmodels-kf6 - kuserfeedback-kf6 - kstatusnotifieritem-kf6 - elogind - polkit-qt6 - - - /usr/bin - /etc/xdg - /usr/lib - /usr/share - /usr/share/locale - /usr/share/drkonqi-kf6 - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - milou-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - kded-kf6icated search application built on top of baloo-kf6 - Dedicated search application built on top of baloo-kf6 - mirrors://kde/stable/plasma/6.2.5/milou-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - kdoctools-kf6-devel - kdeclarative-kf6-devel - ksvg-kf6-devel - ki18n-kf6-devel - krunner-kf6-devel - libplasma-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - extra-cmake-modules-kf6 - kitemmodels-kf6-devel - - desktop/kde6/plasma/milou-kf6/pspec.xml - - - milou-kf6 - - qt6-base - qt6-declarative - krunner-kf6 - libgcc - ksvg-kf6 - kconfig-kf6 - kservice-kf6 - kcoreaddons-kf6 - kitemmodels-kf6 - - - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - oxygen-kf6 - https://projects.kde.org/projects/kde/workspace/oxygen-kf6 - - Ayhan Yalçınsoy - ayhanyalcinsoy@pisilinux.org - - LGPL - desktop.kde6.plasma - KDE oxygen-kf6 style - KDE oxygen-kf6 style - mirrors://kde/stable/plasma/6.2.5/oxygen-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - kcmutils-kf6-devel - frameworkintegration-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kservice-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - cairo-devel - libxcb-devel - kwayland-kf6-devel - gtk3-devel - kdoctools-kf6-devel - kdecorations-kf6-devel - plasma-workspace-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/plasma/oxygen-kf6/pspec.xml - - - oxygen-kf6 - - ki18n-kf6 - libgcc - libxcb - kconfig-kf6 - qt6-base - qt6-declarative - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdecorations-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kwayland-kf6 - frameworkintegration-kf6 - kcmutils-kf6 - - - /usr/bin/ - /usr/lib - /usr/share/color-schemes - /usr/share/sounds - /usr/share/icons - /usr/share/locale - /usr/share/plasma - /usr/share/kstyle - /usr/share/kservice-kf6s5 - /usr/share/applications - /usr/share/metainfo/org.kde.oxygen.appdata.xml - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libkscreen-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - kde6 screen management library - Dynamic display management library for KDE - mirrors://kde/stable/plasma/6.2.5/libkscreen-6.2.5.tar.xz - - qt6-base-devel - qt6-wayland-devel - libxcb-devel - doxygen - qt6-linguist - kwayland-kf6-devel - xcb-util-devel - xcb-util-image-devel - xcb-util-keysyms-devel - libXcursor-devel - libXrandr-devel - wayland-devel - wayland-client - wayland-cursor - wayland-server - extra-cmake-modules-kf6 - plasma-wayland-protocols-kf6 - kconfig-kf6-devel - - desktop/kde6/plasma/libkscreen-kf6/pspec.xml - - - libkscreen-kf6 - - qt6-base - qt6-wayland - kconfig-kf6 - kwayland-kf6 - libXrandr - libxcb - libgcc - wayland - wayland-client - wayland-cursor - wayland-server - - - /etc/xdg - /usr/bin/kscreen-doctor - /usr/lib/qt5 - /usr/lib - /usr/share/qlogging-categories6/libkscreen.categories - /usr/share/zsh - /usr/share/doc - /usr/share/dbus-1 - /usr/share/locale - - - - libkscreen-kf6-devel - Development files for libkscreen-kf6 - - qt6-base-devel - libkscreen-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - layer-shell-qt-kf6 - https://kde.org/plasma-desktop-kf6/ - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv3 - library - desktop.kde6.plasma - Qt component to allow applications to make use of the Wayland wl-layer-shell protocol - Qt component to allow applications to make use of the Wayland wl-layer-shell protocol - Uygulamaların Wayland wl-layer-shell protokolünü kullanmasını sağlayan Qt bileşeni - Uygulamaların Wayland wl-layer-shell protokolünü kullanmasını sağlayan Qt bileşeni - https://download.kde.org/stable/plasma/6.2.5/layer-shell-qt-6.2.5.tar.xz - - wayland-devel - wayland-client - wayland-cursor - wayland-server - qt6-wayland-devel - qt6-base-devel - extra-cmake-modules-kf6 - wayland-protocols-devel - qt6-declarative-devel - - desktop/kde6/plasma/layer-shell-qt-kf6/pspec.xml - - - layer-shell-qt-kf6 - - libgcc - qt6-base - qt6-wayland - wayland-client - - - /usr/lib - /usr/share/doc - - - - layer-shell-qt-kf6-devel - Development files for layer-shell-qt-kf6 - - layer-shell-qt-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild qt6 - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libksysguard-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - Task management and system monitoring library - Task management and system monitoring library - mirrors://kde/stable/plasma/6.2.5/libksysguard-6.2.5.tar.xz - - qt6-base-devel - qt6-webengine-devel - qt6-designer-devel - qt6-declarative-devel - qt6-5compat-devel - kcolorscheme-kf6-devel - kio-kf6-devel - solid-kf6-devel - kglobalaccel-kf6-devel - kpackage-kf6-devel - kjobwidgets-kf6-devel - kdeclarative-kf6-devel - kauth-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kservice-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kdoctools-kf6-devel - libX11-devel - libXres-devel - zlib-devel - libnsl-devel - libnl-devel - libcap-devel - knewstuff-kf6-devel - libplasma-kf6-devel - extra-cmake-modules-kf6 - attr-devel - pam-devel - libpcap-devel - lm_sensors-devel - - desktop/kde6/plasma/libksysguard-kf6/pspec.xml - - - libksysguard-kf6 - - kio-kf6 - solid-kf6 - libpcap - kservice-kf6 - kglobalaccel-kf6 - qt6-webengine - qt6-webchannel - qt6-base - qt6-declarative - qt6-5compat - kcolorscheme-kf6 - kpackage-kf6 - kjobwidgets-kf6 - kdeclarative-kf6 - libX11 - libgcc - zlib - libXres - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kconfig-kf6 - kauth-kf6 - kcoreaddons-kf6 - ki18n-kf6 - libnsl - libcap - libnl - lm_sensors - - - /etc - /usr/share - /usr/share/locale - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - libksysguard-kf6-devel - Development files for libksysguard-kf6 - - libksysguard-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kwrited-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - kde6 daemon listening for wall and write messages - kde6 daemon listening for wall and write messages - mirrors://kde/stable/plasma/6.2.5/kwrited-6.2.5.tar.xz - - qt6-base-devel - ki18n-kf6-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - knotifications-kf6-devel - kpty-kf6-devel - kdbusaddons-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/plasma/kwrited-kf6/pspec.xml - - - kwrited-kf6 - - qt6-base - kpty-kf6 - libgcc - kcoreaddons-kf6 - knotifications-kf6 - kdbusaddons-kf6 - - - /usr/share - /usr/lib/qt5 - /usr/lib - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-systemmonitor-kf6 - https://kde.org/plasma-desktop-kf6/ - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv3 - library - desktop.kde6.plasma - An interface for monitoring system sensors, process information and other system resources - Sistem sensörlerini, işlem bilgilerini ve diğer sistem kaynaklarını izlemek için bir arayüz - Sistem sensörlerini, işlem bilgilerini ve diğer sistem kaynaklarını izlemek için bir arayüz - Sistem sensörlerini, işlem bilgilerini ve diğer sistem kaynaklarını izlemek için bir arayüz - https://download.kde.org/stable/plasma/6.2.5/plasma-systemmonitor-6.2.5.tar.xz - - cmake - libgcc - kio-kf6-devel - ksystemstats-kf6 - kcrash-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - qt6-base-devel - kirigami-kf6-devel - knewstuff-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kitemmodels-kf6-devel - kiconthemes-kf6-devel - kdeclarative-kf6-devel - kglobalaccel-kf6-devel - qqc2-desktop-style-kf6 - extra-cmake-modules-kf6 - qt6-declarative-devel - kirigami-addons-kf6 - libksysguard-kf6-devel - - desktop/kde6/plasma/plasma-systemmonitor-kf6/pspec.xml - - - plasma-systemmonitor-kf6 - - kio-kf6 - kcrash-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kservice-kf6 - qt6-base - knewstuff-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kitemmodels-kf6 - kiconthemes-kf6 - kdeclarative-kf6 - kglobalaccel-kf6 - libksysguard-kf6 - kwindowsystem-kf6 - qt6-declarative - - - /usr/bin - /usr/lib - /usr/share - /usr/share/locale - /usr/share/config.kcfg - /usr/share/plasma-systemmonitor-kf6 - /usr/share/doc - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-06 - 6.1.2 - fix dependencies - Ali Cengiz Kurt - alicengizkurt@gmail.com - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release. - Mustafa Cinasal - muscnsl@gmail.com - - - - - - plasma-integration-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.plasma - kde6 Plasma artwork - Artwork, styles and assets for the breeze-kf6 visual style for the Plasma Desktop - mirrors://kde/stable/plasma/6.2.5/plasma-integration-6.2.5.tar.xz - - qt6-base-devel - qt6-declarative-devel - kxmlgui-kf6-devel - libxcb-devel - noto-fonts - breeze-style-kf6 - libXcursor-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kwayland-kf6-devel - qqc2-breeze-style-devel - kconfig-kf6-devel - kguiaddons-kf6-devel - kio-kf6-devel - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - libX11-devel - kiconthemes-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - kio-kf6-devel - kjobwidgets-kf6-devel - kwindowsystem-kf6-devel - qqc2-desktop-style-kf6 - qt6-wayland-devel - wayland-client - wayland-server - wayland-cursor - wayland-devel - plasma-wayland-protocols-kf6 - kservice-kf6-devel - kcolorscheme-kf6-devel - kstatusnotifieritem-kf6-devel - xdg-desktop-portal-kde-kf6 - qt5-base-devel - qt5-wayland-devel - qt5-declarative-devel - qt5-x11extras-devel - qt5-quickcontrols2-devel - kcompletion-devel - ki18n-devel - kxmlgui-devel - kiconthemes-devel - kwayland-devel - kconfig-devel - kguiaddons-devel - kio-devel - kservice-devel - kwindowsystem-devel - kcoreaddons-devel - kconfigwidgets-devel - kwidgetsaddons-devel - kjobwidgets-devel - knotifications-devel - - desktop/kde6/plasma/plasma-integration-kf6/pspec.xml - - - plasma-integration-kf6 - - qt6-base - qt6-wayland - qt6-declarative - libXcursor - kcompletion-kf6 - ki18n-kf6 - kiconthemes-kf6 - kwayland-kf6 - kconfig-kf6 - kguiaddons-kf6 - kio-kf6 - kxmlgui-kf6 - kwindowsystem-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - knotifications-kf6 - kjobwidgets-kf6 - breeze-style-kf6 - libgcc - libxcb - wayland-client - plasma-integration-data - kservice-kf6 - kcolorscheme-kf6 - kstatusnotifieritem-kf6 - qqc2-breeze-style - - - /usr/lib/qt6 - - - - plasma5-integration - - qt5-base - qt5-wayland - qt5-declarative - qt5-x11extras - qt5-quickcontrols2 - libXcursor - kcompletion - ki18n - kxmlgui - kiconthemes - kwayland - kconfig - kguiaddons - kio - kservice - kwindowsystem - kcoreaddons - kconfigwidgets - kwidgetsaddons - kjobwidgets - knotifications - libgcc - libxcb - wayland-client - plasma-integration-data - - - /usr/lib/qt5 - - - - plasma-integration-data - Development files for plasma-integration - - /usr/share/kconf_update - /usr/share/locale - - - - - 2025-01-01 - 6.2.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-26 - 6.2.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-06 - 6.2.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-01 - 6.2.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-08 - 6.2.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-10 - 6.1.5 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-06 - 6.1.4 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-16 - 6.1.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-03 - 6.1.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-26 - 6.1.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-25 - 6.1.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-09 - 6.0.5 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-21 - 6.0.5 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-16 - 6.0.4 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-26 - 6.0.3 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-12 - 6.0.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 6.0.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-02-28 - 6.0.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - katomic-kf6 - https://www.kde.org/applications/games/katomic/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Sokoban like logic game - Sokoban benzeri mantık oyunu - katomic-kf6 is both fun and educational game built around molecular geometry. - katomic-kf6 moleküler geometri hakkında hem eğlenceli hem de eğitici bir oyundur. - katomic-kf6 - mirrors://kde/stable/release-service/24.12.1/src/katomic-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - knewstuff-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/katomic-kf6/pspec.xml - - - katomic-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - knewstuff-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - calendarsupport-kf6 - https://community.kde.org/KDE_PIM - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - desktop.kde6.applications - Calendar support library - Calendar support library - mirrors://kde/stable/release-service/24.12.1/src/calendarsupport-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - akonadi-kf6-devel - kmime-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - kcodecs-kf6-devel - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kcoreaddons-kf6-devel - kservice-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kdoctools-kf6-devel - kunitconversion-kf6-devel - boost-devel - kcalutils-kf6-devel - kcalendarcore-kf6-devel - kidentitymanagement-kf6-devel - kholidays-kf6-devel - akonadi-calendar-kf6-devel - kcontacts-kf6-devel - pimcommon-kf6-devel - kimap-kf6-devel - cyrus-sasl-devel - akonadi-mime-kf6-devel - akonadi-contacts-kf6-devel - kguiaddons-kf6-devel - - desktop/kde6/applications/calendarsupport-kf6/pspec.xml - - - calendarsupport-kf6 - Calendar support library - - kio-kf6 - ki18n-kf6 - kmime-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kcalendarcore-kf6 - qt6-base - kcalutils-kf6 - kholidays-kf6 - pimcommon-kf6 - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - kwidgetsaddons-kf6 - akonadi-calendar-kf6 - kidentitymanagement-kf6 - - - /etc - /usr/lib/qt6 - /usr/lib - /usr/share - /usr/share/kservice-kf6types5 - /usr/share/locale - - - - calendarsupport-kf6-devel - Development files for calendarsupport-kf6 - - calendarsupport-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - blinken-kf6 - https://www.kde.org/applications/education/blinken/ - - Stefan Gronewold (groni) - groni@pisilinux.org - - FDL - GPL - LGPL - gui - desktop.kde.edu - blinken-kf6 - Memory Enhancement Game - Hafıza geliştirme oyunu. - blinken-kf6 is based on an electronic game released in 1978, which challenges players to remember sequences of increasing length. On the face of the device, there are 4 different color buttons, each one with their own distinctive sound. - Hafıza geliştirme oyunu. - mirrors://kde/stable/release-service/24.12.1/src/blinken-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - qt6-svg-devel - qt6-base-devel - qt6-phonon-devel - - desktop/kde6/applications/blinken-kf6/pspec.xml - - - blinken-kf6 - blinken-kf6 - Memory Enhancement Game - - kcrash-kf6 - kconfig-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kguiaddons-kf6 - ki18n-kf6 - kxmlgui-kf6 - libgcc - qt6-base - qt6-phonon - qt6-svg - - - /usr/bin - /usr/share - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - akonadi-contacts-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.applications - Libraries and daemons to implement Contact Management in Akonadi. - Libraries and daemons to implement Contact Management in Akonadi. - mirrors://kde/stable/release-service/24.12.1/src/akonadi-contacts-24.12.1.tar.xz - - qt6-base-devel - qt6-webengine-devel - libical-devel - ki18n-kf6-devel - prison-kf6-devel - gettext-devel - kdoctools-kf6-devel - boost-devel - kguiaddons-kf6-devel - akonadi-kf6-devel - extra-cmake-modules-kf6 - kio-kf6-devel - kmime-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - kitemmodels-kf6-devel - ktexttemplate-kf6-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - grantleetheme-kf6-devel - kunitconversion-kf6-devel - kcmutils-kf6-devel - ktextaddons-kf6-devel - - desktop/kde6/applications/akonadi-contacts-kf6/pspec.xml - - - akonadi-contacts-kf6 - - qt6-base - ki18n-kf6 - kcodecs-kf6 - kmime-kf6 - kio-kf6 - akonadi-kf6 - prison-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kjobwidgets-kf6 - kservice-kf6 - kcmutils-kf6 - kcompletion-kf6 - kcontacts-kf6 - qt6-webengine - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - kguiaddons-kf6 - grantleetheme-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - ktexttemplate-kf6 - ktextaddons-kf6-devel - - - /etc/xdg - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - akonadi-contacts-kf6-devel - Development files for akonadi-contacts-kf6 - - qt6-base-devel - akonadi-contacts-kf6 - grantleetheme-kf6-devel - ktexttemplate-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kmahjongg-kf6 - https://www.kde.org/applications/games/kmahjongg/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Mahjongg Solitaire - Mahjongg oyunu - kmahjongg-kf6 is a fun board game created after the famous oriental game of Mahjong. Unlike the original however, kmahjongg-kf6 is a tile matching game for one or two players, a variation usually known as Mahjong Solitaire. - Mahjong Solitaire oyununa benzer kmahjongg-kf6 bir veya iki oyuncunun birlekte oynayabileceği bir parça eşleştirme oyunudur. - kmahjongg-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kmahjongg-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-svg-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - kdoctools-kf6-devel - kcompletion-kf6-devel - knewstuff-kf6-devel - kxmlgui-kf6-devel - libkdegames-kf6-devel - libkmahjongg-kf6-devel - kcompletion-kf6-devel - qt6-declarative-devel - - desktop/kde6/applications/kmahjongg-kf6/pspec.xml - - - kmahjongg-kf6 - - ki18n-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - libkmahjongg-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - /etc/xdg/kmahjongg-kf6.categories - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdiagram-kf6 - http://www.kde.org/ - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - Powerful libraries for creating business diagrams - Powerful libraries for creating business diagrams - https://download.kde.org/stable/kdiagram/3.0.1/kdiagram-3.0.1.tar.xz - - doxygen - extra-cmake-modules-kf6 - qt6-assistant-devel - qt6-base-devel - qt6-designer-devel - qt6-linguist - qt6-svg-devel - qt6-sql-sqlite - qt6-sql-mysql - qt6-sql-postgresql - qt6-sql-odbc - - desktop/kde6/applications/kdiagram-kf6/pspec.xml - - - kdiagram-kf6 - Powerful libraries for creating business diagrams - - libgcc - qt6-base - qt6-svg - - - /usr/lib - /usr/lib/qt6 - /usr/share/locale - /usr/share/doc - - - - kdiagram-kf6-devel - Development files for kdiagram-kf6 - - kdiagram-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-10 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-12-15 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-11-07 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-07-04 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-06-27 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-23 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 3.0.1 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-06 - 3.0.1 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kmix-kf6 - http://kde.org/applications/multimedia/kmix/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.multimedia - kmix-kf6: KDE Digital Mixer - kmix-kf6: KDE için Dijital Mixer - kmix-kf6: KDE Digital Mixer - kmix-kf6: KDE için Dijital Mixer. - kmix-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kmix-24.12.1.tar.xz - - qt6-base-devel - kdoctools-devel - ki18n-devel - kcmutils-devel - kitemmodels-devel - kunitconversion-devel - libcanberra-devel - glib2-devel - solid-devel - alsa-lib-devel - kxmlgui-devel - knotifications-devel - kglobalaccel-devel - libplasma-devel - extra-cmake-modules - kstatusnotifieritem-devel - - desktop/kde6/applications/kmix-kf6/pspec.xml - - - kmix-kf6 - - qt6-base - alsa-lib - libcanberra - pulseaudio-libs - ki18n-kf6 - kconfig-kf6 - kxmlgui-kf6 - solid-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kglobalaccel-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - libgcc - libplasma-kf6 - kstatusnotifieritem-kf6 - - - /etc - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - /usr/include - /usr/bin - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kmbox-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.applications - MBox library support. - MBox library support. - mirrors://kde/stable/release-service/24.12.1/src/kmbox-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - kmime-kf6-devel - boost-devel - kcodecs-kf6-devel - - desktop/kde6/applications/kmbox-kf6/pspec.xml - - - kmbox-kf6 - - qt6-base - kmime-kf6 - libgcc - - - /usr/share - /usr/share/locale - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - kmbox-kf6-devel - Development files for kmbox-kf6 - - qt6-base-devel - kmbox-kf6 - - - /etc/xdg - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdepim-runtime-kf6 - https://community.kde.org/KDE_PIM - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - library - app:gui - desktop.kde6.applications - kde6 PIM Runtime Environment - kde6 PIM (Kişisel Bilgi Yönetimi) çalışma zamanı ortamı - kdepim-runtime-kf6 contains kde6 PIM (Personal Information Management) runtime environment like akonadi agents. - kdepim-runtime-kf6, kdelibs kullanarak yazılmış olan Akonadi ajanları da dahil olmak üzere kde6 PIM (Personal Information Management - Kişisel Bilgi Yönetimi) çalışma zamanı ortamını içerir. - kontact-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kdepim-runtime-24.12.1.tar.xz - - kdoctools-kf6-devel - boost-devel - shared-mime-info - akonadi-kf6-devel - akonadi-calendar-kf6-devel - akonadi-search-kf6-devel - kcmutils-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - knotifyconfig-kf6-devel - knotifications-kf6-devel - kmailtransport-kf6-devel - kidentitymanagement-kf6-devel - kalarm-kf6 - kcalutils-kf6-devel - kmbox-kf6-devel - kimap-kf6-devel - libkgapi-kf6-devel - kholidays-kf6-devel - ksyndication-kf6-devel - pimcommon-kf6-devel - cyrus-sasl-devel - qt6-declarative-devel - qt6-multimedia-devel - qt6-webengine-devel - extra-cmake-modules-kf6 - qt6-networkauth-devel - akonadi-mime-kf6-devel - akonadi-contacts-kf6-devel - qt6-speech-devel - kdav-kf6-devel - ffmpeg-devel - kldap-kf6-devel - libkdepim-kf6-devel - libXScrnSaver-devel - qca2-qt6-devel - qt6-keychain-devel - - desktop/kde6/applications/kdepim-runtime-kf6/pspec.xml - - - kdepim-runtime-kf6 - - akonadi-kf6 - libkgapi-kf6 - kio-kf6 - ki18n-kf6 - kimap-kf6 - kmbox-kf6 - kmime-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - kcalendarcore-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - kalarm-kf6 - kcalutils-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kitemmodels-kf6 - pimcommon-kf6 - kcontacts-kf6 - kjobwidgets-kf6 - knotifyconfig-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - ktextwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - qt6-speech - akonadi-calendar-kf6 - cyrus-sasl - akonadi-mime-kf6 - qt6-webengine - qt6-networkauth - qt6-multimedia - akonadi-contacts-kf6 - kidentitymanagement-kf6 - kdav-kf6 - kldap-kf6 - libkdepim-kf6 - qt6-keychain - - - /etc/xdg - /usr/lib - /usr/bin - /usr/share - /usr/share/mime - /usr/share/kservice-kf6types5 - /usr/share/kservices6 - /usr/share/knotifications6 - /usr/share/icons - /usr/share/dbus-1 - /usr/share/akonadi - /usr/share/ontology - /usr/share/autostart - /usr/share/applications - /usr/share/doc - /usr/share/locale - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - artikulate-kf6 - https://projects.kde.org/projects/kde/kdeedu/artikulate - - Osman Erkan - osman.erkan@pisilinux.org - - GPLv2 - LGPLv3 - FDLv1.2 - app:gui - desktop.kde.edu - Improve your pronunciation by listening to native speakers - artikulate-kf6, Improve your pronunciation by listening to native speakers. - artikulate-kf6 - mirrors://kde/stable/release-service/24.12.1/src/artikulate-24.12.1.tar.xz - - extra-cmake-modules-kf6 - ki18n-devel - kcrash-devel - kconfig-devel - karchive-devel - kcoreaddons-devel - knewstuff-devel - kirigami-devel - kdoctools-devel - qt5-declarative-devel - qt5-sql-postgresql - qt5-sql-mysql - qt5-sql-odbc - qt5-sql-sqlite - qt5-multimedia-devel - qt5-xmlpatterns-devel - - desktop/kde6/applications/artikulate-kf6/pspec.xml - - - artikulate-kf6 - - extra-cmake-modules-kf6 - ki18n - kcrash - kconfig - karchive - kcoreaddons - knewstuff - kirigami - kdoctools - qt5-declarative - qt5-sql-postgresql - qt5-sql-mysql - qt5-sql-odbc - qt5-sql-sqlite - qt5-multimedia - qt5-xmlpatterns - - - /etc - /usr/lib - /usr/share/doc - /usr/bin - /usr/share - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - falkon-kf6 - https://www.falkon-kf6.org/ - - Mustafa Cinasal - muscnsl@gmail.com - - GPLv3 - app:web - desktop.kde6.applications - Cross-platform QtWebKit browser - Cross-platform QtWebKit browser - falkon-kf6 is a new and very fast QtWebEngine browser - falkon-kf6 is a new and very fast QtWebEngine browser - https://download.kde.org/stable/release-service/24.12.1/src/falkon-24.12.1.tar.xz - - extra-cmake-modules-kf6 - kwallet-kf6-devel - qt6-base-devel - qt6-declarative-devel - qt6-webchannel-devel - qt6-webengine-devel - qt6-sql-postgresql - qt6-svg-devel - qt6-sql-mysql - qt6-sql-odbc - qt6-linguist - qt6-sql-sqlite - qt6-5compat-devel - libgnome-keyring - libxslt-devel - python3-devel - openssl-devel - libxcb-devel - nss-devel - cmake - llvm - kio-kf6-devel - purpose-kf6-devel - karchive-kf6-devel - openssl-devel - pyside6-devel - python3-devel - karchive-kf6-devel - python3-shiboken6-devel - - desktop/kde6/applications/falkon-kf6/pspec.xml - - - falkon-kf6 - - kio-kf6 - kcrash-kf6 - purpose-kf6 - kcoreaddons-kf6 - libxcb - libgnome-keyring - openssl - pyside6 - python3 - karchive-kf6 - shiboken6 - kwallet-kf6 - qt6-base - qt6-declarative - qt6-webchannel - qt6-webengine - qt6-5compat - qt6-sql-sqlite - - - /usr/bin - /usr/lib - /usr/include - /usr/share - /usr/share/locale - /usr/share/bash-completion - /usr/share/metainfo - /usr/share/pixmaps - /usr/share/icons - /usr/share/doc - - - qupzilla - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-25 - 24.02.2 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libkmahjongg-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:library - desktop.kde.games - Common code, backgrounds and tile sets for games using Mahjongg tiles - Common code, backgrounds and tile sets for games using Mahjongg tiles. - mirrors://kde/stable/release-service/24.12.1/src/libkmahjongg-24.12.1.tar.xz - - qt6-base-devel - qt6-svg-devel - extra-cmake-modules-kf6 - gettext-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcompletion-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kcoreaddons-kf6-devel - mesa-devel - - desktop/kde6/applications/libkmahjongg-kf6/pspec.xml - - - libkmahjongg-kf6 - - qt6-base - qt6-svg - libgcc - ki18n-kf6 - kconfig-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/lib - /usr/share/doc - - - - libkmahjongg-kf6-devel - Development files for libkmahjongg-kf6 - - libkmahjongg-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libkomparediff2-kf6 - https://projects.kde.org/projects/kde/kdesdk/libkomparediff2-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde.sdk - Library to compare files and strings - Library to compare files and strings - mirrors://kde/stable/release-service/24.12.1/src/libkomparediff2-24.12.1.tar.xz - - qt6-base-devel - qt6-5compat-devel - extra-cmake-modules-kf6 - python3-devel - gettext-devel - kcoreaddons-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kparts-kf6-devel - - desktop/kde6/applications/libkomparediff2-kf6/pspec.xml - - - libkomparediff2-kf6 - - qt6-base - qt6-5compat - kio-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - libkomparediff2-kf6-devel - Shared libraries for libkomparediff2-kf6. - - libkomparediff2-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kget-kf6 - https://apps.kde.org/kget-kf6 - - Mathias Freire - mathiasfreire45@gmail.com - - GPLv2 - app:gui - desktop.kde6.applications - Download manager for KDE - KDE için indirme yönetcisi. - kget-kf6 is an advanced download manager with support for Metalink and Bittorrent. - kget-kf6, Metalink ve BitTorrent desteği olan bir indirme yöneticisidir. - mirrors://kde/stable/release-service/24.12.1/src/kget-24.12.1.tar.xz - - kio-kf6-devel - gmp-devel - boost-devel - ki18n-kf6-devel - gpgme-devel - kcrash-kf6-devel - kparts-kf6-devel - libmms-devel - qt6-sql-odbc - sqlite-devel - kconfig-kf6-devel - qt6-sql-mysql - kwallet-kf6-devel - kxmlgui-kf6-devel - qca2-qt6-devel - qt6-base-devel - qt6-sql-sqlite - kcmutils-kf6-devel - libgcrypt-devel - gpgme-qt6-devel - kdoctools-kf6-devel - kitemviews-kf6-devel - kdbusaddons-kf6-devel - kiconthemes-kf6-devel - kcoreaddons-kf6-devel - libktorrent-kf6-devel - kcompletion-kf6-devel - qt6-sql-postgresql - ktextwidgets-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - knotifyconfig-kf6-devel - kwidgetsaddons-kf6-devel - kconfigwidgets-kf6-devel - knotifications-kf6-devel - kstatusnotifieritem-kf6-devel - plasma-workspace-kf6-devel - - desktop/kde6/applications/kget-kf6/pspec.xml - - - kget-kf6 - - kio-kf6 - gpgme - ki18n-kf6 - kparts-kf6 - libgcc - libmms - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - qca2-qt6 - gpgme-qt6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - libktorrent-kf6 - knotifyconfig-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kstatusnotifieritem-kf6 - plasma-workspace-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - /usr/share/locale - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kio-admin-kf6 - https://invent.kde.org/system/kio-admin-kf6 - - PisiLinux Community - admins@pisilinux.org - - FDL - app - desktop.kde6.applications - Manage files as administrator using the admin:// kio-kf6 protocol - Manage files as administrator using the admin:// kio-kf6 protocol - Admin:// kio-kf6 protokolünü kullanarak dosyaları yönetici olarak yönetin - Admin:// kio-kf6 protokolünü kullanarak dosyaları yönetici olarak yönetin - kio-admin-kf6 - https://download.kde.org/stable/release-service/24.12.1/src/kio-admin-24.12.1.tar.xz - - kio-kf6-devel - ki18n-kf6-devel - qt6-base-devel - polkit-qt6-devel - kcoreaddons-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/kio-admin-kf6/pspec.xml - - - kio-admin-kf6 - - kio-kf6 - ki18n-kf6 - qt6-base - polkit-qt6 - kcoreaddons-kf6 - - - /usr/lib - /usr/share/polkit-1 - /usr/share/dbus-1 - /usr/share/locale - /usr/share/metainfo - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdeconnect-kf6 - https://kdeconnect-kf6.kde.org/ - - Yusuf Aydemir - yusuf.aydemir@pisilinux.org - - GPLv2 - GPLv3 - app:gui - desktop.kde6.applications - Connect KDE with your smartphone - Cihazlarınızı KDE ile birleştirin - Connect KDE with your smartphone - Cihazlarınızı KDE ile birleştirin - kdeconnect-kf6 - https://download.kde.org/stable/release-service/24.12.1/src/kdeconnect-kde-24.12.1.tar.xz - - sshfs - dbus-devel - eudev-devel - kio-kf6-devel - ki18n-kf6-devel - solid-kf6-devel - kpeople-kf6-devel - kde-cli-tools-kf6 - libXtst-devel - kirigami-kf6-devel - qt6-base-devel - qt6-connectivity-devel - kcmutils-kf6-devel - kwayland-kf6-devel - qca2-qt6-devel - kdoctools-kf6-devel - libfakekey-devel - kdbusaddons-kf6-devel - kiconthemes-kf6-devel - kwindowsystem-kf6-devel - pulseaudio-qt6-devel - kirigami-addons-kf6 - extra-cmake-modules-kf6 - kconfigwidgets-kf6-devel - qt6-multimedia-devel - knotifications-kf6-devel - qt6-declarative-devel - qt6-5compat-devel - wayland-devel - wayland-server - wayland-client - wayland-cursor - qt6-wayland-devel - qqc2-desktop-style-kf6 - kpackage-kf6-devel - kguiaddons-kf6-devel - kstatusnotifieritem-kf6-devel - wayland-protocols-devel - plasma-wayland-protocols-kf6 - modemmanager-qt-kf6-devel - ModemManager-devel - - desktop/kde6/applications/kdeconnect-kf6/pspec.xml - - - kdeconnect-kf6 - - kio-kf6 - ki18n-kf6 - sshfs - solid-kf6 - libgcc - libX11 - libXtst - qt6-5compat - kconfig-kf6 - kpeople-kf6 - kcmutils-kf6 - kservice-kf6 - qca2-qt6 - qt6-base - kwayland-kf6 - kguiaddons-kf6 - libfakekey - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kwindowsystem-kf6 - pulseaudio-qt6 - kstatusnotifieritem-kf6 - qt6-multimedia - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - modemmanager-qt-kf6 - qt6-declarative - qt6-connectivity - qqc2-desktop-style-kf6 - - - /usr/bin - /etc - /usr/lib - /usr/include - /usr/share - /usr/share/locale - /usr/share/man - /usr/share/info - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-18 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kontact-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPL2 - desktop.kde6.applications - KDE Personal Information Manager - kontact-kf6 is the integrated Personal Information Manager of KDE, but can be used with other systems as well. -It supports email, address books, calendars, tasks, news feeds and much more. - http://download.kde.org/stable/release-service/24.12.1/src/kontact-24.12.1.tar.xz - - boost-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - kontactinterface-kf6-devel - mailcommon-kf6-devel - qt6-base-devel - qt6-webengine-devel - kdbusaddons-kf6-devel - kcmutils-kf6-devel - kpimtextedit-kf6-devel - akonadi-kf6-devel - kitemmodels-kf6-devel - kparts-kf6-devel - akonadi-mime-kf6-devel - messagelib-kf6-devel - kmime-kf6-devel - pimcommon-kf6-devel - kcontacts-kf6-devel - akonadi-contacts-kf6-devel - kimap-kf6-devel - cyrus-sasl-devel - kidentitymanagement-kf6-devel - libkleo-kf6-devel - gpgme-devel - grantleetheme-kf6-devel - libkdepim-kf6-devel - ffmpeg-devel - libXScrnSaver-devel - kguiaddons-kf6-devel - - desktop/kde6/applications/kontact-kf6/pspec.xml - - - kontact-kf6 - KDE Personal Information Manager - - kio-kf6 - ki18n-kf6 - kcrash-kf6 - kparts-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - libkdepim-kf6 - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - grantleetheme-kf6 - kwindowsystem-kf6 - qt6-webengine - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kontactinterface-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - mailimporter-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:library - desktop.kde6.applications - Mail importer library - Mail importer library - mirrors://kde/stable/release-service/24.12.1/src/mailimporter-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - pimcommon-kf6-devel - cmake - extra-cmake-modules-kf6 - openldap-client - cyrus-sasl-devel - kitemviews-kf6-devel - kio-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kmime-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - kldap-kf6-devel - libkdepim-kf6-devel - akonadi-search-kf6-devel - knewstuff-kf6-devel - kpimtextedit-kf6-devel - kimap-kf6-devel - akonadi-kf6-devel - boost-devel - karchive-kf6-devel - akonadi-mime-kf6-devel - akonadi-contacts-kf6-devel - - desktop/kde6/applications/mailimporter-kf6/pspec.xml - - - mailimporter-kf6 - - qt6-base - akonadi-mime-kf6 - libgcc - libkdepim-kf6 - ki18n-kf6 - kmime-kf6 - akonadi-kf6 - kconfig-kf6 - karchive-kf6 - kcoreaddons-kf6 - - - /etc - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - mailimporter-kf6-devel - Development files for mailimporter-kf6 - - mailimporter-kf6 - karchive-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - akonadi-import-wizard-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - CLI tools to manage akonadi calendars - Import data from other mail clients to kmail-kf6 - https://download.kde.org/stable/release-service/24.12.1/src/akonadi-import-wizard-24.12.1.tar.xz - - boost-devel - akonadi-kf6-devel - akonadi-calendar-kf6-devel - extra-cmake-modules-kf6 - kio-kf6-devel - kdoctools-kf6-devel - qt6-base-devel - qt6-keychain-devel - kcompletion-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - kiconthemes-kf6-devel - kunitconversion-kf6-devel - akonadi-contacts-kf6-devel - kcalutils-kf6-devel - libkdepim-kf6-devel - calendarsupport-kf6-devel - kmime-kf6-devel - kidentitymanagement-kf6-devel - kmailtransport-kf6-devel - akonadi-mime-kf6-devel - cyrus-sasl-devel - mailcommon-kf6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - kimap-kf6-devel - libkleo-kf6-devel - gpgme-devel - gpgme-qt6-devel - mailimporter-kf6-devel - ffmpeg-devel - libXScrnSaver-devel - - desktop/kde6/applications/akonadi-import-wizard-kf6/pspec.xml - - - akonadi-import-wizard-kf6 - Import data from other mail clients to kmail-kf6 - - ki18n-kf6 - kcrash-kf6 - libgcc - akonadi-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - qt6-base - qt6-keychain - kcontacts-kf6 - libkdepim-kf6 - pimcommon-kf6 - mailcommon-kf6 - messagelib-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - mailimporter-kf6 - kmailtransport-kf6 - kwidgetsaddons-kf6 - kidentitymanagement-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - /usr/lib - - - - akonadi-import-wizard-kf6-devel - Development files for akonadi-import-wizard-kf6 - - akonadi-import-wizard-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - bomber-kf6 - https://www.kde.org/applications/games/bomber/ - - Alihan Öztürk - alihan@pisilinux.org - - GPLv3 - app:gui - desktop.kde.games - A single player arcade game - bomber-kf6 is a single player arcade game. The player is invading various cities in a plane that is decreasing in height. - mirrors://kde/stable/release-service/24.12.1/src/bomber-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - mesa-devel - kxmlgui-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - ki18n-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kcompletion-kf6-devel - kunitconversion-kf6-devel - kcrash-kf6-devel - - desktop/kde6/applications/bomber-kf6/pspec.xml - - - bomber-kf6 - - ki18n-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-base - qt6-phonon - kcoreaddons-kf6 - kdbusaddons-kf6 - kcompletion-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/share/appdata - /usr/share/applications - /usr/share - /usr/share/bomber-kf6 - /usr/share/config.kcfg - /usr/share/icons - /usr/share/doc - /usr/share/kxmlgui-kf65 - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kig-kf6 - https://www.kde.org/applications/education/kig/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.edu - An interactive geometry application - Bir etkileşimli geometri uygulaması - kig-kf6 is an application for interactive geometry. - kig-kf6, bir etkileşimli geometri uygulamasıdır. - kig-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kig-24.12.1.tar.xz - - extra-cmake-modules - qt5-base-devel - qt5-svg-devel - boost-devel - ktexteditor5-devel - kdoctools5-devel - kemoticons5-devel - kitemmodels5-devel - qt5-xmlpatterns-devel - gettext-devel - pkgconfig - kcrash5-devel - karchive5-devel - - desktop/kde6/applications/kig-kf6/pspec.xml - - - kig-kf6 - - qt5-base - boost-python3 - kcrash5 - ktexteditor5 - qt5-xmlpatterns - qt5-svg - ki18n5 - kparts5 - ktexteditor5 - kiconthemes5 - kconfigwidgets5 - karchive5 - kxmlgui5 - libgcc - kcompletion5 - kcoreaddons5 - kwidgetsaddons5 - kconfig5 - - - /usr/lib - /usr/lib/qt6 - /usr/share/man - /usr/share/doc - /usr/bin - /usr/share - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - akonadiconsole-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - Akonadi management and debugging console - Akonadi management and debugging console - https://download.kde.org/stable/release-service/24.12.1/src/akonadiconsole-24.12.1.tar.xz - - akonadi-contacts-kf6-devel - akonadi-kf6-devel - akonadi-calendar-kf6-devel - pimcommon-kf6-devel - akonadi-mime-kf6-devel - calendarsupport-kf6-devel - extra-cmake-modules-kf6 - kimap-kf6-devel - kcalendarcore-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcontacts-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kitemmodels-kf6-devel - kmime-kf6-devel - kpimtextedit-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - kitemviews-kf6-devel - akonadi-search-kf6-devel - libkdepim-kf6-devel - libkleo-kf6-devel - messagelib-kf6-devel - qt6-base-devel - qt6-sql-mysql - qt6-sql-postgresql - qt6-sql-sqlite - qt6-sql-odbc - kunitconversion-kf6-devel - kidentitymanagement-kf6-devel - cyrus-sasl-devel - gpgme-devel - gpgme-qt6-devel - ffmpeg-devel - libXScrnSaver-devel - qt6-webengine-devel - - desktop/kde6/applications/akonadiconsole-kf6/pspec.xml - - - akonadiconsole-kf6 - Akonadi management and debugging console - - akonadi-kf6 - akonadi-contacts-kf6 - akonadi-mime-kf6 - calendarsupport-kf6 - kcalendarcore-kf6 - qt6-base - ki18n-kf6 - kmime-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kcontacts-kf6 - libkdepim-kf6 - kitemviews-kf6 - messagelib-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kitemmodels-kf6 - kpimtextedit-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - /usr/lib - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kolourpaint-kf6 - http://kde.org/applications/graphics/kolourpaint-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.graphics - An easy to use paint program - Kullanımı kolay bir çizim programı - kolourpaint-kf6 is a simple painting program to quickly create raster images. It is useful as a touch-up tool and simple image editing tasks. - kolourpaint-kf6, kullanımı kolay bir çizim programıdır. - kolourpaint-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kolourpaint-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - libkexiv2-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kguiaddons-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - ktextwidgets-kf6-devel - kjobwidgets-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - libksane-kf6-devel - - desktop/kde6/applications/kolourpaint-kf6/pspec.xml - - - kolourpaint-kf6 - - ki18n-kf6 - kio-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - qt6-base - kguiaddons-kf6 - libksane-kf6 - kjobwidgets-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/lib - /usr/share/applications - /usr/share/doc - /usr/share/icons/hicolor - /usr/share/kolourpaint/icons/ - /usr/share/kolourpaint-kf6 - /usr/share/kxmlgui-kf6 - /usr/share/metainfo - /usr/share/locale/ - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kpkpass-kf6 - https://download.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.applications - Apple Wallet Pass reader - Apple Wallet Pass reader - Apple Cüzdan Geçiş okuyucusu - Apple Cüzdan Geçiş okuyucusu - https://download.kde.org/stable/release-service/24.12.1/src/kpkpass-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - karchive-kf6-devel - shared-mime-info - - desktop/kde6/applications/kpkpass-kf6/pspec.xml - - - kpkpass-kf6 - - libgcc - karchive-kf6 - qt6-base - - - /etc/xdg - /usr/lib - /usr/share - /usr/share/doc - - - - kpkpass-kf6-devel - Development files for kpkpass-kf6 - - kpkpass-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kimap-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.applications - Job-based API for interacting with IMAP servers - API for interacting with IMAP servers - mirrors://kde/stable/release-service/24.12.1/src/kimap-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kmime-kf6-devel - boost-devel - kio-kf6-devel - ki18n-kf6-devel - kcoreaddons-kf6-devel - kitemmodels-kf6-devel - cyrus-sasl-devel - kunitconversion-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/kimap-kf6/pspec.xml - - - kimap-kf6 - - qt6-base - kmime-kf6 - kio-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - cyrus-sasl - kcoreaddons-kf6 - - - /etc/xdg - /usr/lib/qt6 - /usr/lib - /usr/share/doc - /usr/share/locale - /usr/share - - - - kimap-kf6-devel - Development files for kimap-kf6 - - qt6-base-devel - kimap-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - dolphin-plugins-kf6 - http://www.kde.org/ - - Pisi Linux Admins - admin@pisilinux.org - - GPLv2 - library - desktop.kde6.sdk - Extra dolphin-kf6 plugins - dolphin-kf6 eklentileri. - This package contains plugins that offer integration in dolphin-kf6 with the following version control systems: - dolphin-kf6 için VCS (Version Control System) eklentileri. - mirrors://kde/stable/release-service/24.12.1/src/dolphin-plugins-24.12.1.tar.xz - - qt6-base-devel - qt6-5compat-devel - kdoctools-kf6-devel - dolphin-kf6-devel - kio-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/dolphin-plugins-kf6/pspec.xml - - - dolphin-plugins-kf6 - - qt6-base - qt6-5compat - dolphin-kf6 - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - ktexteditor-kf6 - kwidgetsaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - ktextwidgets-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - akonadi-calendar-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.applications - Akonadi calendar integration - Calendar integration for Akonadi. - mirrors://kde/stable/release-service/24.12.1/src/akonadi-calendar-24.12.1.tar.xz - - qt6-base-devel - ki18n-kf6-devel - kcodecs-kf6-devel - kdoctools-kf6-devel - boost-devel - kio-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kmailtransport-kf6-devel - akonadi-kf6-devel - extra-cmake-modules-kf6 - akonadi-mime-kf6-devel - kmime-kf6-devel - cyrus-sasl-devel - kcontacts-kf6-devel - kidentitymanagement-kf6-devel - kcalendarcore-kf6-devel - kcalutils-kf6-devel - akonadi-contacts-kf6-devel - prison-kf6-devel - grantleetheme-kf6-devel - knotifications-kf6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - kimap-kf6-devel - libkleo-kf6-devel - libkdepim-kf6-devel - - desktop/kde6/applications/akonadi-calendar-kf6/pspec.xml - - - akonadi-calendar-kf6 - - qt6-base - ki18n-kf6 - kcodecs-kf6 - kio-kf6 - kmime-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kcalendarcore-kf6 - kcalutils-kf6 - kcontacts-kf6 - akonadi-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - kwidgetsaddons-kf6 - kidentitymanagement-kf6 - akonadi-mime-kf6 - akonadi-contacts-kf6 - prison-kf6 - knotifications-kf6 - grantleetheme-kf6 - messagelib-kf6 - pimcommon-kf6 - kimap-kf6 - libkleo-kf6 - libkdepim-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - /usr/bin - - - - akonadi-calendar-kf6-devel - Development files for akonadi-calendar-kf6 - - qt6-base-devel - akonadi-calendar-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - okular-kf6 - http://okular-kf6.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.graphics - A document viewer - Belge gösterici - okular-kf6 is a document viewer. - okular-kf6 bir belge göstericidir. - okular-kf6 - mirrors://kde/stable/release-service/24.12.1/src/okular-24.12.1.tar.xz - - qt6-base-devel - qt6-multimedia-devel - qt6-declarative-devel - qca2-qt6-devel - tiff-devel - purpose-kf6-devel - qt6-phonon-devel - qt6-speech-devel - poppler-qt6-devel - ebook-tools-devel - libkexiv2-kf6-devel - kdoctools-kf6-devel - threadweaver-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kbookmarks-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - plasma-activities-kf6-devel - libkscreen-kf6-devel - chmlib-devel - kjobwidgets-kf6-devel - libspectre-devel - djvu-devel - kpty-kf6-devel - kparts-kf6-devel - kdegraphics-mobipocket-kf6-devel - extra-cmake-modules-kf6 - kirigami-kf6-devel - libzip-devel - discount-devel - freetype-devel - qt6-svg-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - karchive-kf6-devel - kwallet-kf6-devel - openjpeg2-devel - libjpeg-turbo-devel - - desktop/kde6/applications/okular-kf6/pspec.xml - - - okular-kf6 - app:gui - - qt6-base - qca2-qt6 - tiff - kcrash-kf6 - libkexiv2-kf6 - poppler-qt6 - ebook-tools - libzip - discount - plasma-activities-kf6 - libjpeg-turbo - purpose-kf6 - kpty-kf6 - kio-kf6 - zlib - ki18n-kf6 - kparts-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - qt6-svg - freetype - karchive-kf6 - kservice-kf6 - ktextwidgets-kf6 - kbookmarks-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - threadweaver-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - qt6-multimedia - djvu - libspectre - qt6-phonon - chmlib - kjobwidgets-kf6 - qt6-speech - kdegraphics-mobipocket-kf6 - qt6-svg - - - /etc/xdg - /usr/lib - /usr/share/doc - /usr/share/man - /usr/bin - /usr/share - - - - okular-kf6-devel - Development files for okular-kf6 - okular-kf6 için geliştirme dosyaları - - okular-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdepim-addons-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - FDL - GPL - LGPL - desktop.kde6.applications - Addons for the KDE PIM apllications - Addons for the KDE PIM apllications - mirrors://kde/stable/release-service/24.12.1/src/kdepim-addons-24.12.1.tar.xz - - akonadi-calendar-kf6-devel - akonadi-kf6-devel - kldap-kf6-devel - akonadi-import-wizard-kf6-devel - boost-devel - calendarsupport-kf6-devel - cyrus-sasl-devel - eventviews-kf6-devel - extra-cmake-modules-kf6 - glibc-devel - grantleetheme-kf6-devel - incidenceeditor-kf6-devel - kholidays-kf6-devel - kcalutils-kf6-devel - kconfig-kf6-devel - kpkpass-kf6-devel - kitinerary-kf6-devel - kdeclarative-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - ktnef-kf6-devel - kxmlgui-kf6-devel - libgravatar-kf6-devel - libical-devel - libkdepim-kf6-devel - libkgapi-kf6-devel - libkleo-kf6-devel - mailcommon-kf6-devel - mailimporter-kf6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - python-devel - qt6-base-devel - qt6-declarative-devel - qt6-webengine-devel - kio-kf6-devel - kmime-kf6-devel - kcodecs-kf6-devel - kcalendarcore-kf6-devel - kservice-kf6-devel - kcontacts-kf6-devel - kitemviews-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - akonadi-mime-kf6-devel - kpimtextedit-kf6-devel - ktextwidgets-kf6-devel - kconfigwidgets-kf6-devel - kmailtransport-kf6-devel - kwidgetsaddons-kf6-devel - akonadi-contacts-kf6-devel - kidentitymanagement-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kimap-kf6-devel - gpgme-devel - gpgme-qt6-devel - kdiagram-kf6-devel - libksieve-kf6-devel - prison-kf6-devel - syntax-highlighting-kf6-devel - kparts-kf6-devel - kaddressbook-kf6-devel - kontactinterface-kf6-devel - kguiaddons-kf6-devel - - desktop/kde6/applications/kdepim-addons-kf6/pspec.xml - - - kdepim-addons-kf6 - Addons for the KDE PIM apllications - - akonadi-kf6 - akonadi-calendar-kf6 - prison-kf6 - calendarsupport-kf6 - eventviews-kf6 - grantleetheme-kf6 - incidenceeditor-kf6 - kcalutils-kf6 - kholidays-kf6 - kconfig-kf6 - kpkpass-kf6 - kdeclarative-kf6 - gpgme-qt6 - kitinerary-kf6 - ki18n-kf6 - ktnef-kf6 - kxmlgui-kf6 - libgcc - libgravatar-kf6 - libkdepim-kf6 - libkleo-kf6 - mailcommon-kf6 - messagelib-kf6 - pimcommon-kf6 - qt6-base - qt6-declarative - qt6-webengine - kio-kf6 - kmime-kf6 - kcodecs-kf6 - kcalendarcore-kf6 - kservice-kf6 - kcontacts-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - akonadi-mime-kf6 - kpimtextedit-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - kwidgetsaddons-kf6 - akonadi-contacts-kf6 - kidentitymanagement-kf6 - gpgme - kjobwidgets-kf6 - kimap-kf6 - libksieve-kf6 - kitemmodels-kf6 - mailimporter-kf6 - syntax-highlighting-kf6 - akonadi-import-wizard-kf6 - kontactinterface-kf6 - kaddressbook-kf6 - kguiaddons-kf6 - kldap-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - kde-baseapps - - - kde-baseapps - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libkdegames-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.games - Common code and data for many KDE games - Common code and data for many KDE games - mirrors://kde/stable/release-service/24.12.1/src/libkdegames-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kdnssd-kf6-devel - openal-devel - cmake - extra-cmake-modules-kf6 - python3 - kdeclarative-kf6-devel - knewstuff-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - libgcc - kconfig-kf6-devel - kxmlgui-kf6-devel - qt6-svg-devel - karchive-kf6-devel - kguiaddons-kf6-devel - libsndfile-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - qt6-declarative-devel - mesa-devel - kitemmodels-kf6-devel - kglobalaccel-devel - ktextwidgets-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/libkdegames-kf6/pspec.xml - - - libkdegames-kf6 - - qt6-base - kdnssd-kf6 - kdeclarative-kf6 - knewstuff-kf6 - kio-kf6 - ki18n-kf6 - libgcc - openal - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - karchive-kf6 - kguiaddons-kf6 - libsndfile - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kglobalaccel - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - - - /etc/xdg - /usr/share - /usr/bin - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - libkdegames-kf6-devel - Shared libraries for KDE games. - - libkdegames-kf6 - kcompletion-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdenetwork-filesharing-kf6 - http://www.kde.org/ - - Mathias Freire - mathiasfreire45@gmail.com - - GPLv2 - library - desktop.kde6.applications - Filesharing configuration modlue. - Dosya paylaşım konfigürasyon modülü. - Filesharing configuration modlue. - Dosya paylaşım konfigürasyon modülü. - kdenetwork-filesharing-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kdenetwork-filesharing-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kservice-kf6-devel - kdeclarative-kf6-devel - kwidgetsaddons-kf6-devel - samba-devel - qcoro-qt6-devel - - desktop/kde6/applications/kdenetwork-filesharing-kf6/pspec.xml - - - kdenetwork-filesharing-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - qcoro-qt6-devel - qt6-base - qt6-declarative - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - - - kdenetwork - - - kdenetwork - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - krfb-kf6 - http://www.kde.org/applications/system/krfb/ - - Mathias Freire - mathiasfreire45@gmail.com - - GPLv2 - app:gui - desktop.kde6.applications - Desktop sharing utility - Masaüstü paylaşım araçları. - KDE Desktop Sharing is a manager for easily sharing a desktop session with another system. The desktop session can be viewed or controlled remotely by any VNC or RFB client - krfb-kf6, masaüstünü uzaktaki bilgisayarlarla kolaylıkla paylaşmaya olanak sağlar. - mirrors://kde/stable/release-service/24.12.1/src/krfb-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-wayland-devel - ki18n-kf6-devel - kstatusnotifieritem-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdnssd-kf6-devel - kdoctools-kf6-devel - knotifications-kf6-devel - kwallet-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - libvncserver-devel - libX11-devel - libXdamage-devel - libxcb-devel - libXext-devel - libXtst-devel - kwindowsystem-kf6-devel - xcb-util-image-devel - kwayland-kf6-devel - kpipewire-kf6-devel - wayland-client - wayland-devel - pipewire-devel - plasma-wayland-protocols-kf6 - - desktop/kde6/applications/krfb-kf6/pspec.xml - - - krfb-kf6 - - ki18n-kf6 - kdnssd-kf6 - libX11 - libxcb - libgcc - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - libXtst - kwayland-kf6 - kpipewire-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libvncserver - kstatusnotifieritem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwindowsystem-kf6 - kwidgetsaddons-kf6 - xcb-util-image - wayland-client - qt6-wayland - - - /usr/bin - /usr/lib - /usr/share/applications - /usr/share/krfb-kf6 - /usr/share/kservice-kf6types5 - /usr/share/icons - /usr/share/doc - /usr/share/locale - /usr/share/metainfo - /usr/share/qlogging-categories6/krfb.categories - /usr/share/krfb/krfb.notifyrc - - - kdenetwork - - - kdenetwork - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ark-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - desktop.kde6.utils - KDE Archiving Tool - Ark is a program for managing various archive formats within the KDE environment. - mirrors://kde/stable/release-service/24.12.1/src/ark-24.12.1.tar.xz - - qt6-base-devel - rar - lzop - bzip2 - unrar - p7zip - xz-devel - lzo-devel - zlib-devel - zstd-devel - kparts-kf6-devel - libzip-devel - karchive-kf6-devel - kconfig-kf6-devel - kcrash-kf6-devel - kio-kf6-devel - kpty-kf6-devel - kfilemetadata-kf6-devel - xz-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - docbook-xsl - libarchive-devel - extra-cmake-modules-kf6 - kitemmodels-kf6-devel - kwindowsystem-kf6-devel - - desktop/kde6/applications/ark-kf6/pspec.xml - - - ark-kf6 - - qt6-base - zlib - libzip - libarchive - karchive-kf6 - kcrash-kf6 - kconfig-kf6 - kio-kf6 - unrar - kpty-kf6 - kfilemetadata-kf6 - ki18n-kf6 - libgcc - kxmlgui-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - kwidgetsaddons-kf6 - kparts-kf6 - kconfigwidgets-kf6 - kitemmodels-kf6 - p7zip - bzip2 - kwindowsystem-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/locale - /usr/lib - /usr/share/icons - /usr/share/man - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kmailtransport-kf6 - https://kde.org/ - - PisiLinux Community - admins@pisilinux.org - - LGPLv2.1 - library - desktop.kde6.applications - Mail Transport Service - Mail Transport Service - akonadi - mirrors://kde/stable/release-service/24.12.1/src/kmailtransport-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kcmutils-kf6-devel - kmime-kf6-devel - akonadi-mime-kf6-devel - akonadi-kf6-devel - cyrus-sasl-devel - extra-cmake-modules-kf6 - boost-devel - ksmtp-kf6-devel - kwallet-kf6-devel - libkgapi-kf6-devel - qt6-keychain-devel - - desktop/kde6/applications/kmailtransport-kf6/pspec.xml - - - kmailtransport-kf6 - app:console - - qt6-base - ki18n-kf6 - ksmtp-kf6 - kio-kf6 - libgcc - kmime-kf6 - kconfig-kf6 - kwallet-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - akonadi-kf6 - cyrus-sasl - akonadi-mime-kf6 - libkgapi-kf6 - qt6-keychain - - - /etc/xdg - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/kservice-kf6s5 - /usr/share/doc/ - /usr/share/config.kcfg - /usr/share/locale - - - - kmailtransport-kf6-devel - Development files for akonadi - - kmailtransport-kf6 - kwallet-kf6-devel - qt6-base-devel - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kross-interpreters-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.bindings - kross-kf6 interpreter plugins for programming languages - Language interpreters to enable in-process scripting with kross-kf6. - mirrors://kde/stable/release-service/24.12.1/src/kross-interpreters-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt5-base-devel - kdoctools-devel - kross-devel - kdesignerplugin - kemoticons-devel - kitemmodels-devel - kinit-devel - kunitconversion-devel - python-devel - ruby-devel - - desktop/kde6/applications/kross-interpreters-kf6/pspec.xml - - - kross-interpreters-kf6 - - qt5-base - libgcc - python - kross - ruby - - - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - kross-interpreters - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kanagram-kf6 - https://www.kde.org/applications/education/kanagram/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.edu - A letter order game - Bir harf sıralama oyunu - kanagram-kf6 is a game based on anagrams of words: the puzzle is solved when the letters of the scrambled word are put back in the correct order. There is no limit on either time taken, or the amount of attempts to solve the word. - kanagram-kf6, anagramlar üzerine bir oyundur. Dağınık yerleştirilmiş harfleri birleştirerek kelimeyi bulun. Zaman veya deneme sınırı yoktur. - kanagram-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kanagram-24.12.1.tar.xz - - qt6-base-devel - qt6-declarative - kdoctools-kf6-devel - knewstuff-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kcrash-kf6-devel - sonnet-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kxmlgui-kf6 - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - libkeduvocdocument-kf6-devel - qt6-multimedia-devel - - desktop/kde6/applications/kanagram-kf6/pspec.xml - - - kanagram-kf6 - - ki18n-kf6 - libgcc - sonnet-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-base - knewstuff-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - qt6-multimedia - kconfigwidgets-kf6 - qt6-declarative - libkeduvocdocument-kf6 - - - /etc/xdg - /usr/share - /usr/bin - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - pim-data-exporter-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - Import and export KDE PIM settings - Import and export KDE PIM settings - https://download.kde.org/stable/release-service/24.12.1/src/pim-data-exporter-24.12.1.tar.xz - - extra-cmake-modules-kf6 - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - akonadi-contacts-kf6-devel - akonadi-kf6-devel - akonadi-mime-kf6-devel - calendarsupport-kf6-devel - kalarm-kf6 - kcalendarcore-kf6-devel - kcontacts-kf6-devel - kmailtransport-kf6-devel - kpimtextedit-kf6-devel - qt6-base-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - boost-devel - kio-kf6-devel - ki18n-kf6-devel - kitemviews-kf6-devel - kunitconversion-kf6-devel - kmime-kf6-devel - kidentitymanagement-kf6-devel - akonadi-calendar-kf6-devel - kholidays-kf6-devel - mailcommon-kf6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - kimap-kf6-devel - cyrus-sasl-devel - libkleo-kf6-devel - gpgme-devel - gpgme-qt6-devel - libkdepim-kf6-devel - ffmpeg-devel - karchive-kf6-devel - libXScrnSaver-devel - knotifications-kf6-devel - kuserfeedback-kf6-devel - kstatusnotifieritem-kf6-devel - - desktop/kde6/applications/pim-data-exporter-kf6/pspec.xml - - - pim-data-exporter-kf6 - Import and export KDE PIM settings - - kio-kf6 - ki18n-kf6 - kmime-kf6 - kcrash-kf6 - libgcc - akonadi-kf6 - kconfig-kf6 - kxmlgui-kf6 - karchive-kf6 - qt6-base - kalarm-kf6 - kcontacts-kf6 - libkdepim-kf6 - pimcommon-kf6 - kitemviews-kf6 - mailcommon-kf6 - messagelib-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kpimtextedit-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kstatusnotifieritem-kf6 - kidentitymanagement-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ksmtp-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.applications - Bir SMTP sunucusu yoluyla e-posta göndermek için işe dayalı kütüphane - Bir SMTP sunucusu yoluyla e-posta göndermek için işe dayalı kütüphane - Job-based library to send email through an SMTP server - Job-based library to send email through an SMTP server - https://download.kde.org/stable/release-service/24.12.1/src/ksmtp-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - kcoreaddons-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kmime-kf6-devel - cyrus-sasl-devel - - desktop/kde6/applications/ksmtp-kf6/pspec.xml - - - ksmtp-kf6 - - kio-kf6 - ki18n-kf6 - kmime-kf6 - libgcc - kcoreaddons-kf6 - cyrus-sasl - qt6-base - - - /etc/xdg - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - - ksmtp-kf6-devel - Development files for ksmtp-kf6 - - ksmtp-kf6 - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kontactinterface-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:library - desktop.kde6.applications - kontact-kf6 Plugin Interface Library - This library provides the glue necessary for application "Parts" to be embedded as a kontact-kf6 component (or plugin). - mirrors://kde/stable/release-service/24.12.1/src/kontactinterface-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - kcoreaddons-kf6-devel - kparts-kf6-devel - kwindowsystem-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - kiconthemes-kf6-devel - - desktop/kde6/applications/kontactinterface-kf6/pspec.xml - - - kontactinterface-kf6 - - qt6-base - kio-kf6 - kparts-kf6 - libgcc - kxmlgui-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kwindowsystem-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - kontactinterface-kf6-devel - Development files for kontactinterface-kf6 - - qt6-base-devel - kontactinterface-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - akonadi-search-kf6 - https://kde.org/ - - PisiLinux Community - admins@pisilinux.org - - LGPLv2.1 - library - desktop.kde6.applications - Libraries and daemons to implement searching in Akonadi - Libraries and daemons to implement searching in Akonadi - akonadi - mirrors://kde/stable/release-service/24.12.1/src/akonadi-search-24.12.1.tar.xz - - qt6-base-devel - kcrash-kf6-devel - kconfig-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - akonadi-kf6-devel - kcontacts-kf6-devel - kmime-kf6-devel - kjobwidgets-kf6-devel - kservice-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kcalendarcore-kf6-devel - libical-devel - kcompletion-kf6-devel - boost-devel - kcmutils-kf6-devel - krunner-kf6-devel - xapian-core-devel - kdoctools-kf6-devel - ktextaddons-kf6-devel - extra-cmake-modules-kf6 - akonadi-mime-kf6-devel - - desktop/kde6/applications/akonadi-search-kf6/pspec.xml - - - akonadi-search-kf6 - app:console - - qt6-base - kio-kf6 - ki18n-kf6 - kmime-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kcalendarcore-kf6 - kcontacts-kf6 - kcoreaddons-kf6 - xapian-core - krunner-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - akonadi-kf6 - ktextaddons-kf6 - akonadi-mime-kf6 - - - /etc/akonadi - /etc/xdg - /usr/bin - /usr/lib - /usr/share/dbus-1 - /usr/share/config - /usr/share/mime - /usr/share/kde4 - /usr/share/doc/ - /usr/share/akonadi - /usr/share/kservice-kf6s5 - /usr/share/locale - /usr/share - - - - akonadi-search-kf6-devel - Development files for akonadi - - akonadi-search-kf6 - qt6-base-devel - ki18n-kf6-devel - kmime-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kcalendarcore-kf6-devel - kcontacts-kf6-devel - kcoreaddons-kf6-devel - xapian-core-devel - kcmutils-kf6-devel - krunner-kf6-devel - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - knetwalk-kf6 - https://www.kde.org/applications/games/knetwalk/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Network construction game - Ağ yapılandırma oyunu - knetwalk-kf6 is a single player logic game. The object of the game is to start the LAN, connecting all the terminals to the server, in as few turns as possible. - knetwalk-kf6 bir ağ kurma oyunudur. Dunucularla istemcileri mümkün olan en az kaynakla birleştirmeye çalışmak oyunun amacıdır. Bağımlılık yapması olasıdır. - knetwalk-kf6 - mirrors://kde/stable/release-service/24.12.1/src/knetwalk-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - ktextwidgets-kf6-devel - - desktop/kde6/applications/knetwalk-kf6/pspec.xml - - - knetwalk-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - ktextwidgets-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - konversation-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde6.applications - A user friendly IRC client for KDE - konversation-kf6 is a user-friendly Internet Relay Chat (IRC) client built on the KDE Platform. - https://download.kde.org/stable/release-service/24.12.1/src/konversation-24.12.1.tar.xz - - qt6-base-devel - qt6-5compat-devel - qt6-multimedia-devel - qt6-assistant-devel - qt6-qdbusviewer - qt6-phonon-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - kitemviews-kf6-devel - kbookmarks-kf6-devel - kconfig-kf6-devel - kcolorscheme-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kstatusnotifieritem-kf6-devel - knewstuff-kf6-devel - ki18n-kf6-devel - kidletime-kf6-devel - knotifyconfig-kf6-devel - kio-kf6-devel - kparts-kf6-devel - solid-kf6-devel - sonnet-kf6-devel - kwallet-kf6-devel - kwidgetsaddons-kf6-devel - kglobalaccel-kf6-devel - kdbusaddons-kf6-devel - knotifications-kf6-devel - kwindowsystem-kf6-devel - kiconthemes-kf6-devel - karchive-kf6-devel - qca2-qt6-devel - python3-devel - gettext-devel - docbook-xsl - kcrash-kf6-devel - - desktop/kde6/applications/konversation-kf6/pspec.xml - - - konversation-kf6 - - qt6-base - qt6-5compat - qt6-multimedia - qca2-qt6 - kidletime-kf6 - knewstuff-kf6 - knotifyconfig-kf6 - kparts-kf6 - kio-kf6 - kcrash-kf6 - libgcc - ki18n-kf6 - sonnet-kf6 - kcodecs-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - karchive-kf6 - kservice-kf6 - kbookmarks-kf6 - kitemviews-kf6 - qt6-phonon - kglobalaccel-kf6 - kcolorscheme-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kglobalaccel - kstatusnotifieritem-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/share - /usr/share/locale - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-22 - 24.08.1 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - picmi-kf6 - http://games.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - picmi-kf6 is a single player logic-based puzzle game - Resim çizme bulmacası - picmi-kf6 is a single player logic-based puzzle game. The goal is to color cells according to numbers given at the side of the board in order to uncover a hidden pattern or picture. - picmi-kf6, tablonun kenarında verilen sayılar kadar tabla üzerinde nokta koyarak bir resim tamamlama bulmacasıdır. - https://download.kde.org/stable/release-service/24.12.1/src/picmi-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-svg-devel - qt6-declarative-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - kxmlgui-kf6-devel - libkdegames-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/picmi-kf6/pspec.xml - - - picmi-kf6 - picmi-kf6 - - ki18n-kf6 - libgcc - kxmlgui-kf6 - qt6-svg - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - eventviews-kf6 - https://community.kde.org/KDE_PIM - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - desktop.kde6.applications - Library for creating events. - Library for creating events. - mirrors://kde/stable/release-service/24.12.1/src/eventviews-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - akonadi-kf6-devel - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kcoreaddons-kf6-devel - kservice-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kdoctools-kf6-devel - kunitconversion-kf6-devel - boost-devel - libkdepim-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - kcalutils-kf6-devel - calendarsupport-kf6-devel - kmime-kf6-devel - kidentitymanagement-kf6-devel - akonadi-calendar-kf6-devel - akonadi-contacts-kf6-devel - kdiagram-kf6-devel - kholidays-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - - desktop/kde6/applications/eventviews-kf6/pspec.xml - - - eventviews-kf6 - Library for creating events. - - ki18n-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kcalendarcore-kf6 - kdiagram-kf6 - kservice-kf6 - qt6-base - kcalutils-kf6 - kcontacts-kf6 - libkdepim-kf6 - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - calendarsupport-kf6 - akonadi-calendar-kf6 - - - /etc - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - /usr/share/kservice-kf6types5 - /usr/share/locale - - - - eventviews-kf6-devel - Development files for eventviews-kf6. - - eventviews-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ksystemlog-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde6.applications - System log viewer. - Sistem kayıt görüntüleyicisi. - ksystemlog-kf6 show all logs of your system, grouped by General (Default system log, Authentication, Kernel, X.org...), and optional Services (Apache, Cups, etc, ...). - ksystemlog-kf6, sistemin bütün hata kayıtlarını (genel ve opsiyonel) görüntülemmeye yarayan bir uygulamadır. - ksystemlog-kf6 - mirrors://kde/stable/release-service/24.12.1/src/ksystemlog-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-5compat-devel - kxmlgui-kf6-devel - kcoreaddons-kf6-devel - kwidgetsaddons-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kconfig-kf6-devel - karchive-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kcompletion-kf6-devel - ktextwidgets-kf6-devel - - desktop/kde6/applications/ksystemlog-kf6/pspec.xml - - - ksystemlog-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - karchive-kf6 - kservice-kf6 - qt6-base - qt6-5compat - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/share - /usr/share/applications - /usr/share/kxmlgui-kf65 - /usr/share/doc - /usr/share/locale - - - kdeadmin - - - kdeadmin - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kblackbox-kf6 - https://www.kde.org/applications/games/kblackbox/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Blackbox logic game - Blackbox mantık oyunu - kblackbox-kf6 is a game of hide and seek played on a grid of boxes. The computer has hidden several balls within this box. By shooting beams into the box and observing where they emerge it is possible to deduce the positions of the hidden balls. - kblackbox-kf6 yan yana dizilmiş kutularla oynanan bir saklambaç oyunudur. Bilgisayarın sakladığı topları kutuları lazerle kontrol ederek bulabilirsiniz. - kblackbox-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kblackbox-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-svg-devel - karchive-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - ki18n-kf6-devel - kcompletion-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - ktextwidgets-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/kblackbox-kf6/pspec.xml - - - kblackbox-kf6 - - ki18n-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - karchive-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kio-zeroconf-kf6 - https://apps.kde.org/zeroconf_ioslave/ - - Pisi Linux Admins - admin@pisilinux.org - - FDL,GPL - app - desktop.kde6.applications - Network Monitor for DNS-SD services (Zeroconf) - DNS-SD hizmetleri için Ağ İzleyicisi - https://download.kde.org/stable/release-service/24.12.1/src/kio-zeroconf-24.12.1.tar.xz - - kio-kf6-devel - ki18n-kf6-devel - kdnssd-kf6-devel - qt6-base-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/kio-zeroconf-kf6/pspec.xml - - - kio-zeroconf-kf6 - - kio-kf6 - ki18n-kf6 - kdnssd-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - - - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - zeroconf-ioslave - - - zeroconf-ioslave - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kgpg-kf6 - http://kde.org/applications/utilities/kgpg/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - LGPL - GPL - desktop.kde6.applications - A QtQuick plugin to render beautiful and interactive charts - kgpg-kf6 is a simple interface for GnuPG, a powerful encryption utility. - mirrors://kde/stable/release-service/24.12.1/src/kgpg-24.12.1.tar.xz - - akonadi-kf6-devel - boost-devel - akonadi-contacts-kf6-devel - gettext-devel - glibc-devel - gpgme-devel - karchive-kf6-devel - kcodecs-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kjobwidgets-kf6-devel - knotifications-kf6-devel - kservice-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kcalendarcore-kf6-devel - kcontacts-kf6-devel - ktexttemplate-kf6-devel - kstatusnotifieritem-kf6-devel - kunitconversion-kf6-devel - libical-devel - python-devel - libevent-devel - qt6-webengine-devel - qt6-base-devel - qt6-5compat-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/kgpg-kf6/pspec.xml - - - kgpg-kf6 - A GnuPG frontend - - gpgme - boost - qt6-base - qt6-5compat - kio-kf6 - ki18n-kf6 - kcrash-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - karchive-kf6 - kcontacts-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - ktexttemplate-kf6 - kwidgetsaddons-kf6 - akonadi-contacts-kf6 - kstatusnotifieritem-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kwordquiz-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.edu - kwordquiz-kf6 is a Flash Card Trainer - kwordquiz-kf6 is a tool that gives you a powerful way to master new vocabularies. It may be a language or any other kind of terminology.. - mirrors://kde/stable/release-service/24.12.1/src/kwordquiz-24.12.1.tar.xz - - qt6-svg-devel - qt6-base-devel - qt6-declarative-devel - qt6-multimedia-devel - gettext-devel - ki18n-kf6-devel - kcrash-kf6-devel - sonnet-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - kitemviews-kf6-devel - knotifyconfig-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - knotifications-kf6-devel - kxmlgui-kf6-devel - kdeclarative-kf6-devel - kcoreaddons-kf6-devel - kwindowsystem-kf6-devel - kwidgetsaddons-kf6-devel - qt6-phonon-devel - libkeduvocdocument-kf6-devel - extra-cmake-modules-kf6 - cmake - kitemmodels-kf6-devel - kirigami-addons-kf6 - kirigami-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/kwordquiz-kf6/pspec.xml - - - kwordquiz-kf6 - - qt6-svg - qt6-base - qt6-phonon - ki18n-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kguiaddons-kf6 - kiconthemes-kf6 - kitemviews-kf6 - knotifyconfig-kf6 - knewstuff-kf6 - knotifications-kf6 - kxmlgui-kf6 - libgcc - kcoreaddons-kf6 - kwindowsystem-kf6 - kwidgetsaddons-kf6 - libkeduvocdocument-kf6 - qt6-declarative - qt6-multimedia - - - /etc/xdg - /usr/bin - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libkcddb-kf6 - https://projects.kde.org/projects/kde/kdemultimedia/audiocd-kio-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.multimedia - KDE library for CDDB (Compact Disc Database) - CDDB için KDE kitaplığı (Compact Disc Database) - KDE library for CDDB (Compact Disc Database). - CDDB için KDE kitaplığı (Compact Disc Database). - mirrors://kde/stable/release-service/24.12.1/src/libkcddb-24.12.1.tar.xz - - extra-cmake-modules-kf6 - musicbrainz5-devel - kdoctools-kf6-devel - kconfig-kf6-devel - kcodecs-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kcmutils-kf6-devel - qt6-base-devel - qt6-5compat-devel - kwidgetsaddons-kf6-devel - - desktop/kde6/applications/libkcddb-kf6/pspec.xml - - - libkcddb-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kcmutils-kf6 - qt6-base - qt6-5compat - kcoreaddons-kf6 - musicbrainz5 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/kservice-kf6s5 - /usr/share/config.kcfg - /usr/lib - /usr/share/doc - /usr/include - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-25 - 24.08.3 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - klickety-kf6 - http://games.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - A kind of solitary game - Bir tür soliter oyunu - klickety-kf6 is a kind of solitary game that takes place on a Tetris-like board. - klickety-kf6 Tetris gibi tahta üzerinde yer alan bir tür soliter oyunu - klickety-kf6 - mirrors://kde/stable/release-service/24.12.1/src/klickety-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - kdoctools-kf6-devel - knotifyconfig-kf6-devel - kdbusaddons-kf6-devel - knotifications-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/klickety-kf6/pspec.xml - - - klickety-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - knotifyconfig-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/share/applications - /usr/share/icons - /usr/share/kconf_update - /usr/share/klickety - /usr/share/knotifications-kf65 - /usr/share/metainfo - /usr/share/kxmlgui-kf65 - /usr/share/sounds - /usr/share/doc - /usr/share/locale - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdeedu-data-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:library - desktop.kde6.applications - Common data for KDE Edu applications - Common data for KDE Edu applications. - mirrors://kde/stable/release-service/24.12.1/src/kdeedu-data-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/kdeedu-data-kf6/pspec.xml - - - kdeedu-data-kf6 - - /usr/share - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - khelpcenter-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.applications - KDE Help Center - KDE help center utility to read help documentation about various KDE applications. - khelpcenter-kf6 - mirrors://kde/stable/release-service/24.12.1/src/khelpcenter-24.12.1.tar.xz - - qt6-base-devel - qt6-webengine-devel - libxml2-devel - libdbusmenu-qt-devel - karchive-kf6-devel - kcmutils-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kbookmarks-kf6-devel - kcompletion-kf6-devel - kio-kf6-devel - kxmlgui-kf6-devel - ktexttemplate-kf6-devel - kwindowsystem-kf6-devel - docbook-xsl - xapian-core-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/khelpcenter-kf6/pspec.xml - - - khelpcenter-kf6 - - qt6-base - qt6-webengine - kio-kf6 - libgcc - libxml2 - karchive-kf6 - kbookmarks-kf6 - ki18n-kf6 - kparts-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcmutils-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - ktexttemplate-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/share - /usr/bin - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - akonadi-kf6 - https://userbase.kde.org/Akonadi - - PisiLinux Community - admins@pisilinux.org - - LGPLv2.1 - library - desktop.kde6.applications - PIM (Personal Information Management) Storage Service - akonadi is an extensible cross-desktop storage service for PIM data and meta data providing concurrent read, write, and query access. - akonadi - mirrors://kde/stable/release-service/24.12.1/src/akonadi-24.12.1.tar.xz - - qt6-base-devel - qt6-designer-devel - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - qt6-sql-postgresql - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - sqlite-devel - shared-mime-info - mariadb-client - mariadb-server - postgresql-server - libxslt-devel - boost-devel - kitemmodels-kf6-devel - kio-kf6-devel - kaccounts-integration-kf6-devel - libaccounts-qt6-devel - extra-cmake-modules-kf6 - libaccounts-glib-devel - xz-devel - - desktop/kde6/applications/akonadi-kf6/pspec.xml - - - akonadi-kf6 - app:console - - kio-kf6 - sqlite - libgcc - ki18n-kf6 - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - libxml2 - qt6-base - kitemmodels-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - mariadb-client - mariadb-server - postgresql-server - libaccounts-qt6 - kaccounts-integration-kf6 - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-postgresql - - - /etc - /etc/xdg - /usr/bin - /usr/lib - /usr/share/dbus-1 - /usr/share/mime - /usr/share - /usr/share/doc/ - - - - akonadi-kf6-devel - Development files for akonadi - akonadi için geliştirme dosyaları - - akonadi-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - filelight-kf6 - http://utils.kde.org/projects/filelight-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.utils - View disk usage information - View disk usage information - filelight-kf6 allows you to quickly understand exactly where your diskspace is being used by graphically representing your file system as a set of concentric segmented-rings. - filelight-kf6 allows you to quickly understand exactly where your diskspace is being used by graphically representing your file system as a set of concentric segmented-rings. - filelight-kf6 - mirrors://kde/stable/release-service/24.12.1/src/filelight-24.12.1.tar.xz - - qt6-base-devel - qt6-svg-devel - qt6-declarative-devel - kdoctools-kf6-devel - qqc2-desktop-style-kf6 - kirigami-addons-kf6 - extra-cmake-modules-kf6 - kio-kf6-devel - kparts-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kdeclarative-kf6-devel - mesa-devel - docbook-xsl - - desktop/kde6/applications/filelight-kf6/pspec.xml - - - filelight-kf6 - - qt6-svg - qt6-base - qt6-declarative - kparts-kf6 - kio-kf6 - ki18n-kf6 - solid-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qqc2-desktop-style-kf6 - kirigami-addons-kf6 - - - /usr/lib - /usr/lib/qt6 - /usr/share/doc - /usr/bin - /usr/share - /etc/xdg - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - rocs-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.edu - rocs-kf6 Graph Theory - rocs-kf6 aims to be a Graph Theory IDE for helping professors to show the results of a graph algorithm and also helping students to do the algorithms. rocs-kf6 has a scripting module, done in Qt Script, that interacts with the drawn graph and every change in the graph with the script is reflected on the drawn one.. - mirrors://kde/stable/release-service/24.12.1/src/rocs-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt5-base-devel - qt5-declarative-devel - qt5-webkit-devel - qt5-base-devel - qt5-xmlpatterns-devel - qt5-script-devel - kdoctools-devel - kdeclarative-devel - ki18n-devel - gettext-devel - kitemviews-devel - ktexteditor-devel - kxmlgui-devel - kconfig-devel - karchive-devel - kcompletion-devel - kcoreaddons-devel - kconfigwidgets-devel - kwidgetsaddons-devel - qt5-location-devel - grantlee-qt5-devel - boost-devel - qt5-svg-devel - - desktop/kde6/applications/rocs-kf6/pspec.xml - - - rocs-kf6 - - qt5-base - qt5-script - qt5-declarative - qt5-xmlpatterns - grantlee-qt5 - ktexteditor - kcrash - kparts - libgcc - ki18n - kconfig - karchive - kcompletion - kcoreaddons - ktextwidgets - kconfigwidgets - kwidgetsaddons - kxmlgui - kitemviews - - - /usr/bin - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - rocs - - - - rocs-kf6-devel - Development files for rocs-kf6 - - rocs-kf6 - - - /usr/include - /usr/lib/cmake - - - rocs-devel - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - marble-kf6 - http://edu.kde.org/applications/all/marble-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde6.applications - Virtual globe and eorld atlas - Sanal küre ve Dünya atlası - marble-kf6 is a virtual globe and world atlas that you can use to learn more about the Earth. - marble-kf6, sanal küre ve Dünya atlası uygulamasıdır. - marble-kf6 - mirrors://kde/stable/release-service/24.12.1/src/marble-24.12.1.tar.xz - - qt6-base-devel - qt6-designer-devel - qt6-svg-devel - qt6-declarative-devel - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-odbc - qt6-sql-sqlite - qt6-linguist - qt6-webengine-devel - qt6-5compat-devel - kdoctools-devel - qt6-phonon-devel - kio-devel - quazip-devel - kwallet-devel - knewstuff-devel - kparts-devel - kcoreaddons-devel - ki18n-devel - kconfig-devel - krunner-devel - kservice-devel - libwlocate-devel - shared-mime-info - qt6-serialport-devel - plasma-desktop - extra-cmake-modules - - desktop/kde6/applications/marble-kf6/pspec.xml - - - marble-kf6 - - kio-kf6 - zlib - ki18n-kf6 - kcrash-kf6 - kparts-kf6 - libgcc - kconfig-kf6 - krunner-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - knewstuff-kf6 - libwlocate - qt6-phonon - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - qt6-serialport - - - /usr/lib - /usr/bin - /usr/share - /usr/share/appdata - /usr/share/applications - /usr/share/config.kcfg - /usr/share/doc - /usr/share/icons - /usr/share/kservice-kf6s5 - /usr/share/kxmlgui-kf65 - /usr/share/marble-kf6 - /etc/xdg - - - - marble-kf6-devel - Development files for marble-kf6 - marble-kf6 için geliştirme dosyaları - - marble-kf6 - - - /usr/include - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kteatime-kf6 - http://www.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.utils - Timer for making tea. - Çay yapma zamanlayıcısı. - kteatime-kf6 is a handy timer for steeping tea. No longer will you have to guess at how long it takes for your tea to be ready. - kteatime-kf6 çay yapmak için kullanışlı bir uygulamadır. kteatime-kf6 ile çay demlemek için ne kadar beklemek gerektiğini düşünmenize gerek kalmaz. - mirrors://kde/stable/release-service/24.12.1/src/kteatime-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kconfig-kf6-devel - kcrash-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - knotifyconfig-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kguiaddons-kf6-devel - - desktop/kde6/applications/kteatime-kf6/pspec.xml - - - kteatime-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - knotifyconfig-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - - - /usr/bin - /usr/doc - /usr/share - - - kdetoys - - - kdetoys - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kldap-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.applications - LDAP access API for KDE - Allows LDAP accessing with a convenient Qt style C++ API. - mirrors://kde/stable/release-service/24.12.1/src/kldap-24.12.1.tar.xz - - qt6-base-devel - kcompletion-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kmbox-kf6-devel - kmime-kf6-devel - kwallet-kf6-devel - openldap-server - cyrus-sasl-devel - extra-cmake-modules-kf6 - qt6-keychain-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - - desktop/kde6/applications/kldap-kf6/pspec.xml - - - kldap-kf6 - - qt6-base - kcompletion-kf6 - kwallet-kf6 - ki18n-kf6 - kio-kf6 - libgcc - cyrus-sasl - openldap-client - kwidgetsaddons-kf6 - qt6-keychain - kconfig-kf6 - kcoreaddons-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - kldap-kf6-devel - Development files for kdelibs4-support - - qt6-base-devel - kldap-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kiten-kf6 - https://www.kde.org/applications/education/kiten/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.edu - A Japanese reference/study tool - Japonca referans ve alıştırma uygulaması - kiten-kf6 is a Japanese reference/study tool. - kiten-kf6, Japonca referans ve alıştırma uygulamasıdır. - kiten-kf6>kiten-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kiten-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - karchive-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kdoctools-kf6-devel - gettext-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - kparts-kf6-devel - kcrash-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - - desktop/kde6/applications/kiten-kf6/pspec.xml - - - kiten-kf6 - - qt6-base - karchive-kf6 - kcompletion-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kcoreaddons-kf6 - kdoctools-kf6 - gettext - ki18n-kf6 - kxmlgui-kf6 - kio-kf6 - kparts-kf6 - libgcc - kcrash-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - /usr/lib - /usr/share/doc - /usr/bin - /usr/share - - - - kiten-kf6-devel - Development files for kiten-kf6 - kiten-kf6 için geliştirme dosyaları - - kiten-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kate-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde6.applications - Advanced Text Editor - Plasma library and runtime components based upon KF5 and Qt5 - https://download.kde.org/stable/release-service/24.12.1/src/kate-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - plasma-activities-kf6-devel - kconfig-kf6-devel - kcrash-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kjobwidgets-kf6-devel - kparts-kf6-devel - ktexteditor-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - knewstuff-kf6-devel - threadweaver-kf6-devel - kitemmodels-kf6-devel - libplasma-kf6-devel - syntax-highlighting-kf6-devel - kuserfeedback-kf6-devel - kwallet-kf6-devel - kguiaddons-kf6-devel - kdbusaddons-kf6-devel - - desktop/kde6/applications/kate-kf6/pspec.xml - - - kate-kf6 - - qt6-base - libgcc - libgit2 - knewstuff-kf6 - ki18n-kf6 - kconfig-kf6 - kded-kf6 - kguiaddons-kf6 - plasma-activities-kf6 - kjobwidgets-kf6 - kitemmodels-kf6 - kio-kf6 - kcrash-kf6 - kparts-kf6 - ktexteditor-kf6 - kwindowsystem-kf6 - kxmlgui-kf6 - libplasma-kf6 - kwallet-kf6 - kservice-kf6 - kbookmarks-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - threadweaver-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kuserfeedback-kf6 - syntax-highlighting-kf6 - kio-kf6 - kconfig-kf6 - kwallet-kf6 - kcolorscheme-kf6 - - - /usr/share - /etc/xdg - /usr/bin - /usr/lib/qt6 - /usr/lib - /usr/share/man - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kio-extras-kf6 - https://www.kde.org - - Pisi Linux Admins - admins@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.network - Additional kio-kf6-slaves for kde6 applications - Additional kio-kf6-slaves for kde6 applications - mirrors://kde/stable/release-service/24.12.1/src/kio-extras-24.12.1.tar.xz - - qt6-phonon-devel - extra-cmake-modules-kf6 - karchive-kf6-devel - kbookmarks-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kdnssd-kf6-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kpty-kf6-devel - solid-kf6-devel - syntax-highlighting-kf6-devel - qt6-sql-postgresql - qt6-base-devel - qt6-sql-sqlite - qt6-sql-mysql - qt6-sql-odbc - qt6-svg-devel - qt6-5compat-devel - libssh - kded-kf6-devel - gperf - samba-devel - taglib-devel - libssh-devel - libmtp-devel - openexr-devel - plasma-activities-kf6-devel - qcoro-qt6-devel - kdsoap6-devel - libXcursor-devel - plasma-activities-stats-kf6-devel - libtirpc-devel - libappimage-devel - libkexiv2-kf6-devel - libplist-devel - kcmutils-kf6-devel - ktextwidgets-kf6-devel - libimobiledevice-devel - kdsoap-ws-discovery-client-devel - - desktop/kde6/applications/kio-extras-kf6/pspec.xml - - - kio-extras-kf6 - - kio-kf6 - kpty-kf6 - qcoro-qt6 - ki18n-kf6 - samba - solid-kf6 - kdnssd-kf6 - kparts-kf6 - libgcc - libmtp - libssh - taglib - kdsoap6 - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - libtirpc - karchive-kf6 - kservice-kf6 - qt6-base - libXcursor - kbookmarks-kf6 - kguiaddons-kf6 - qt6-phonon - plasma-activities-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - openexr-libs - qt6-sql-odbc - qt6-sql-mysql - qt6-sql-sqlite - qt6-5compat - kconfigwidgets-kf6 - libappimage - plasma-activities-stats-kf6 - qt6-sql-postgresql - syntax-highlighting-kf6 - kded-kf6 - libplist - kcmutils-kf6 - ktextwidgets-kf6 - libimobiledevice - kwidgetsaddons-kf6 - kdsoap-ws-discovery-client - - - /etc/xdg - /usr/share - /usr/share/locale - /usr/bin - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - kio-extras-kf6-devel - Development files for kio-extras-kf6 - - kio-extras-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kpimtextedit-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:gui - desktop.kde6.applications - A textedit with PIM-specific features. - Text Edit with KDE-PIM specific features. - kpimtextedit-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kpimtextedit-24.12.1.tar.xz - - qt6-base-devel - qt6-speech-devel - qt6-designer-devel - ki18n-kf6-devel - sonnet-kf6-devel - kcodecs-kf6-devel - syntax-highlighting-kf6-devel - kconfig-kf6-devel - kio-kf6-devel - kitemmodels-kf6-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - kunitconversion-kf6-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - ktextaddons-kf6-devel - kcolorscheme-kf6-devel - - desktop/kde6/applications/kpimtextedit-kf6/pspec.xml - - - kpimtextedit-kf6 - - qt6-base - qt6-speech - qt6-designer - ki18n-kf6 - kcodecs-kf6 - kio-kf6 - sonnet-kf6 - libgcc - kcompletion-kf6 - ktextwidgets-kf6 - kwidgetsaddons-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kconfigwidgets-kf6 - syntax-highlighting-kf6 - ktextaddons-kf6 - kcolorscheme-kf6 - - - /etc/xdg - /usr/lib/qt6 - /usr/lib - /usr/share - /usr/share/doc - /usr/share/locale - - - - kpimtextedit-kf6-devel - Development files for kpimtextedit-kf6 - - qt6-base-devel - kpimtextedit-kf6 - ktextwidgets-kf6-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kaccounts-integration-kf6 - https://projects.kde.org/projects/kdereview/kaccounts-integration-kf6 - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - app - desktop.kde6.network - Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - mirrors://kde/stable/release-service/24.12.1/src/kaccounts-integration-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - kcmutils-kf6-devel - ki18n-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - libaccounts-qt6-devel - libaccounts-glib-devel - gettext-devel - kdoctools-kf6-devel - kdeclarative-kf6-devel - kio-kf6-devel - signon-ui - kconfig-kf6-devel - kwallet-kf6-devel - qcoro-qt6-devel - signon-plugin-oauth2-devel - signond-qt6-devel - - desktop/kde6/applications/kaccounts-integration-kf6/pspec.xml - - - kaccounts-integration-kf6 - Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - - ki18n-kf6 - libgcc - intltool - signon-ui - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - kdeclarative-kf6 - kconfigwidgets-kf6 - libaccounts-qt6 - signon-plugin-oauth2 - qt6-declarative - kio-kf6 - kconfig-kf6 - kwallet-kf6 - qcoro-qt6 - signond-qt6 - - - /usr/share - /usr/share/kservice-kf6s5 - /usr/share/doc - /usr/lib/qt6 - /usr/lib/libkaccounts6.so* - - - - kaccounts-integration-kf6-devel - Development files for kaccounts-integration-kf6 - - kaccounts-integration-kf6 - signond-qt6-devel - libaccounts-qt6-devel - - - /usr/include - /usr/lib/cmake/KAccounts6 - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kjumpingcube-kf6 - https://www.kde.org/applications/games/kjumpingcube/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Territory capture game - Alan kapma oyunu - kjumpingcube-kf6 is a simple tactical game. - kjumpingcube-kf6 basit bir taktik oyunudur. - kjumpingcube-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kjumpingcube-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kitemmodels-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - knewstuff-kf6-devel - kdoctools-kf6-devel - kunitconversion-kf6-devel - libkdegames-kf6-devel - - desktop/kde6/applications/kjumpingcube-kf6/pspec.xml - - - kjumpingcube-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - kcoreaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - /etc/xdg/kjumpingcube-kf6.categories - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libgravatar-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.applications - KDE PIM library providing Gravatar support - KDE PIM library providing Gravatar support - mirrors://kde/stable/release-service/24.12.1/src/libgravatar-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - pimcommon-kf6-devel - cmake - extra-cmake-modules-kf6 - openldap-client - cyrus-sasl-devel - kitemviews-kf6-devel - kio-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - knewstuff-kf6-devel - kpimtextedit-kf6-devel - boost-devel - - desktop/kde6/applications/libgravatar-kf6/pspec.xml - - - libgravatar-kf6 - - qt6-base - kxmlgui-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kservice-kf6 - kcoreaddons-kf6 - pimcommon-kf6 - ktextwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/lib - /usr/bin - /usr/share - /usr/share/icons - /etc - - - - libgravatar-kf6-devel - Development files for libgravatar-kf6 - - libgravatar-kf6 - qt6-base-devel - kxmlgui-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - - - /usr/include - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - akonadi-calendar-tools-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - CLI tools to manage akonadi calendars - CLI tools to manage akonadi calendars - https://download.kde.org/stable/release-service/24.12.1/src/akonadi-calendar-tools-24.12.1.tar.xz - - boost-devel - akonadi-kf6-devel - akonadi-calendar-kf6-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - qt6-base-devel - kcompletion-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - kunitconversion-kf6-devel - akonadi-contacts-kf6-devel - kcalutils-kf6-devel - libkdepim-kf6-devel - calendarsupport-kf6-devel - kmime-kf6-devel - kidentitymanagement-kf6-devel - - desktop/kde6/applications/akonadi-calendar-tools-kf6/pspec.xml - - - akonadi-calendar-tools-kf6 - CLI tools to manage akonadi calendars - - ki18n-kf6 - libgcc - akonadi-kf6 - kconfig-kf6 - kcalendarcore-kf6 - qt6-base - kcalutils-kf6 - kcoreaddons-kf6 - calendarsupport-kf6 - akonadi-calendar-kf6 - akonadi-notes-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - analitza-kf6 - https://invent.kde.org/education/analitza - - PisiLinux Community - admins@pisilinux.org - - GPLv2+ - library - desktop.kde.edu - A KDE library for mathematical features - Matematiksel özellikler için bir KDE kitaplığı - analitza-kf6 is a library to add mathematical features to programs. - analitza-kf6, programlara matematiksel özellikler eklemek için bir kitaplıktır. - hi32-app-kalgebra-kf6 - mirrors://kde/stable/release-service/24.12.1/src/analitza-24.12.1.tar.xz - - cmake - eigen3 - cups-devel - mesa-devel - qt6-svg-devel - extra-cmake-modules-kf6 - qt6-base-devel - qt6-5compat-devel - qt6-declarative-devel - qt6-linguist - - desktop/kde6/applications/analitza-kf6/pspec.xml - - - analitza-kf6 - - mesa - libgcc - qt6-svg - qt6-base - qt6-declarative - - - /usr/lib - /usr/share/doc - /usr/share/libanalitza/ - /usr/share/locale - - - - analitza-kf6-devel - Development files for analitza-kf6 - analitza-kf6 için geliştirme dosyaları - - analitza-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kmines-kf6 - https://www.kde.org/applications/games/kmines/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Minesweeper like game - Mayın tarlası oyunu - kmines-kf6 is the classic Minesweeper game. The idea is to uncover all the squares without blowing up any mines. When a mine is blown up, the game is over. - kmines-kf6 klasik mayın tarlası oyununun bir türevidir. Oyunun amacı hiç bir mayına denk gelmemeye çalışarak kutuları açmaktır. Eğer bir mayın patlarsa oyun biter. - kmines-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kmines-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/kmines-kf6/pspec.xml - - - kmines-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ksanecore-kf6 - https://www.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - FDL - app - desktop.kde6.applications - Library providing logic to interface scanners - Library providing logic to interface scanners - Library providing logic to interface scanners - Library providing logic to interface scanners - ksanecore-kf6 - https://download.kde.org/stable/release-service/24.12.1/src/ksanecore-24.12.1.tar.xz - - ki18n-kf6-devel - qt6-base-devel - sane-backends-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/ksanecore-kf6/pspec.xml - - - ksanecore-kf6 - - ki18n-kf6 - qt6-base - sane-backends - - - /usr/lib - /usr/share/locale - /usr/share/doc - - - - ksanecore-kf6-devel - Development files for ksanecore-kf6 - - ksanecore-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - audiocd-kio-kf6 - https://www.kde.org/applications/multimedia/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - GPL - LGPL - desktop.kde6.applications - kio-kf6slave for accessing audio CDs - kio-kf6slave for accessing audio CDs - https://download.kde.org/stable/release-service/24.12.1/src/audiocd-kio-24.12.1.tar.xz - - cdparanoia-devel - flac-devel - gettext-devel - kconfig-kf6-devel - kdoctools-kf6-devel - kio-kf6-devel - lame-devel - libkcompactdisc-kf6-devel - libvorbis-devel - qt6-base-devel - qt6-5compat-devel - ki18n-kf6-devel - qt6-phonon-devel - extra-cmake-modules-kf6 - libogg-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - libkcddb-kf6 - kcmutils-kf6-devel - - desktop/kde6/applications/audiocd-kio-kf6/pspec.xml - - - audiocd-kio-kf6 - kio-kf6slave for accessing audio CDs - - cdparanoia - flac - lame - libkcompactdisc-kf6 - libvorbis - qt6-base - qt6-5compat - qt6-phonon - kio-kf6 - ki18n-kf6 - libgcc - libogg - kconfig-kf6 - kcmutils-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - libkcddb-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - - audiocd-kio-kf6-devel - Development files for audiocd-kio-kf6 - - audiocd-kio-kf6 - qt6-base-devel - - - /usr/include - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kbreakout-kf6 - https://www.kde.org/applications/games/kbreakout/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Breakout like game - Breakout benzeri oyun - kbreakout-kf6 is a Breakout like game. The object of the game is to destroy as many bricks as possible without losing the ball. - kbreakout-kf6 bir Breakout türevidir. Oyunun amacı topları yere düşürmeden olabildiğince çok tuğlayı yok etmektir. - kbreakout-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kbreakout-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kservice-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - libkdegames-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/kbreakout-kf6/pspec.xml - - - kbreakout-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-declarative - - - /usr/share - /usr/share/doc - /usr/bin - /etc/xdg/kbreakout-kf6.categories - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdf-kf6 - https://utils.kde.org/projects/kdf/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - GPL - LGPL - desktop.kde6.applications - View Disk Usage - KDiskFree displays the available file devices (hard drive partitions, floppy and CD drives, etc.) along with information on their capacity, free space, type and mount point. It also allows you to mount and unmount drives and view them in a file manager. - kdf-kf6 - http://download.kde.org/stable/release-service/24.12.1/src/kdf-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - kcmutils-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kstatusnotifieritem-kf6-devel - qt6-base-devel - qt6-5compat-devel - - desktop/kde6/applications/kdf-kf6/pspec.xml - - - kdf-kf6 - View Disk Usage - - kcmutils-kf6 - kconfigwidgets-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kiconthemes-kf6 - kio-kf6 - knotifications-kf6 - kxmlgui-kf6 - qt6-base - kstatusnotifieritem-kf6 - qt6-5compat - - - /etc/xdg - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - konsole-kf6 - https://projects.kde.org/projects/kde/applications/dolphin-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - desktop.kde6.applications - KDE konsole-kf6 - konsole-kf6 for kde6 - mirrors://kde/stable/release-service/24.12.1/src/konsole-24.12.1.tar.xz - - qt6-base-devel - qt6-5compat-devel - qt6-multimedia-devel - kpty-kf6-devel - kio-kf6-devel - kglobalaccel-kf6-devel - icu4c-devel - knotifyconfig-kf6-devel - kparts-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - docbook-xsl - extra-cmake-modules-kf6 - kdoctools-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - knewstuff-kf6-devel - kglobalacceld-devel - cmake - kguiaddons-kf6-devel - knotifications-kf6-devel - - desktop/kde6/applications/konsole-kf6/pspec.xml - - - konsole-kf6 - - libgcc - qt6-base - qt6-5compat - qt6-multimedia - kiconthemes-kf6 - knotifyconfig-kf6 - knotifications-kf6 - kparts-kf6 - kpty-kf6 - kio-kf6 - ki18n-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kcrash-kf6 - kdbusaddons-kf6 - kbookmarks-kf6 - knewstuff-kf6 - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kglobalacceld - kglobalaccel-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/lib - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - dolphin-kf6 - https://projects.kde.org/projects/kde/applications/dolphin-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - desktop.kde6.applications - KDE File Manager - dolphin-kf6 is the File Manager for KDE. - mirrors://kde/stable/release-service/24.12.1/src/dolphin-24.12.1.tar.xz - - baloo-kf6-devel - baloo-widgets-kf6-devel - kfilemetadata-kf6-devel - extra-cmake-modules-kf6 - plasma-activities-kf6-devel - kbookmarks-kf6-devel - kcmutils-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kguiaddons-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - knotifications-kf6-devel - kparts-kf6-devel - ktextwidgets-kf6-devel - solid-kf6-devel - qt6-base-devel - qt6-phonon-devel - kio-extras-kf6-devel - libxml2-devel - docbook-xsl - kuserfeedback-kf6-devel - packagekit-qt6-devel - - desktop/kde6/applications/dolphin-kf6/pspec.xml - - - dolphin-kf6 - - qt6-base - kfilemetadata-kf6 - baloo-kf6 - baloo-widgets-kf6 - knewstuff-kf6 - kio-kf6 - ki18n-kf6 - solid-kf6 - kparts-kf6 - libgcc - kcodecs-kf6 - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcmutils-kf6 - kservice-kf6 - kbookmarks-kf6 - kitemviews-kf6 - qt6-phonon - kguiaddons-kf6 - plasma-activities-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kuserfeedback-kf6 - packagekit-qt6 - kcolorscheme-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/lib - /usr/share/doc - - - - dolphin-kf6-devel - - dolphin-kf6 - qt6-base-devel - qt6-phonon-devel - kio-kf6-devel - kcmutils-kf6-devel - knewstuff-kf6-devel - plasma-activities-kf6-devel - baloo-kf6-devel - baloo-widgets-kf6-devel - kfilemetadata-kf6-devel - kparts-kf6-devel - ktexteditor-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - - /usr/include - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-17 - 24.02.2 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-28 - 24.02.1 - Rebuild. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-10 - 24.02.0 - Rebuild - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kqtquickcharts-kf6 - https://edu.kde.org/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - LGPL - GPL - desktop.kde6.applications - A QtQuick plugin to render beautiful and interactive charts - A QtQuick plugin to render beautiful and interactive charts - mirrors://kde/stable/release-service/24.12.1/src/kqtquickcharts-24.12.1.tar.xz - - extra-cmake-modules-kf6 - glibc-devel - qt6-base-devel - qt6-declarative-devel - qt5-base-devel - qt5-declarative-devel - - desktop/kde6/applications/kqtquickcharts-kf6/pspec.xml - - - kqtquickcharts-kf6 - A QtQuick plugin to render beautiful and interactive charts - - qt6-base - qt6-declarative - libgcc - qt5-base - qt5-declarative - - - /usr/lib/qt6 - /usr/lib/qt5 - /usr/share/doc - - - - kqtquickcharts-kf6-devel - Development files for kqtquickcharts-kf6 - - kqtquickcharts-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libksieve-kf6 - https://community.kde.org/KDE_PIM - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - desktop.kde6.applications - KDE PIM library for managing sieves. - KDE PIM library for managing sieves. - mirrors://kde/stable/release-service/24.12.1/src/libksieve-24.12.1.tar.xz - - kio-kf6-devel - extra-cmake-modules-kf6 - qt6-base-devel - akonadi-kf6-devel - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kcoreaddons-kf6-devel - kservice-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kdoctools-kf6-devel - kunitconversion-kf6-devel - boost-devel - pimcommon-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - kimap-kf6-devel - kmime-kf6-devel - cyrus-sasl-devel - knewstuff-kf6-devel - kidentitymanagement-kf6-devel - kmailtransport-kf6-devel - libkdepim-kf6-devel - qt6-webengine-devel - akonadi-contacts-kf6-devel - akonadi-mime-kf6-devel - kiconthemes-kf6-devel - karchive-kf6-devel - syntax-highlighting-kf6-devel - - desktop/kde6/applications/libksieve-kf6/pspec.xml - - - libksieve-kf6 - KDE PIM library for managing sieves. - - kio-kf6 - ki18n-kf6 - kmime-kf6 - libgcc - sonnet-kf6 - akonadi-kf6 - kconfig-kf6 - karchive-kf6 - qt6-base - knewstuff-kf6 - libkdepim-kf6 - pimcommon-kf6 - cyrus-sasl - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kpimtextedit-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kidentitymanagement-kf6 - syntax-highlighting-kf6 - qt6-webengine - - - /etc - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/sieve - /usr/share/doc/HTML - /usr/share/kservice-kf6s5 - /usr/share/locale - - - - libksieve-kf6-devel - Development files for libksieve-kf6. - - libksieve-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - krdc-kf6 - http://www.kde.org/applications/internet/krdc/ - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - app:gui - desktop.kde6.applications - Remote Desktop Client - Uzak masaüstü bağlantı istemcisi. - krdc-kf6 is a client application that allows you to view or even control the desktop session on another machine that is running a compatible server. VNC and RDP is supported. - krdc-kf6, uzaktaki bir masaüstü oturumunu görüntülemenizi ve kontrol etmenizi sağlar. RDP kullanan Windows Terminal Sunucuları'na ve VNC/RFB kullanan diğer pek çok platforma bağlanabilirç - mirrors://kde/stable/release-service/24.12.1/src/krdc-24.12.1.tar.xz - - qt6-base-devel - qt6-wayland-devel - extra-cmake-modules-kf6 - kio-kf6-devel - kconfig-kf6-devel - kcmutils-kf6-devel - kdnssd-kf6-devel - knotifyconfig-kf6-devel - knotifications-kf6-devel - kbookmarks-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kcompletion-kf6-devel - kwallet-kf6-devel - plasma-activities-kf6-devel - kstatusnotifieritem-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - libvncserver-devel - kdoctools-kf6-devel - kwindowsystem-kf6-devel - libssh-devel - freerdp2-devel - libvncserver-devel - - desktop/kde6/applications/krdc-kf6/pspec.xml - - - krdc-kf6 - - kio-kf6 - ki18n-kf6 - kdnssd-kf6 - libgcc - libssh - freerdp2 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - qt6-wayland - kbookmarks-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - libvncserver - knotifyconfig-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwindowsystem-kf6 - kwidgetsaddons-kf6 - plasma-activities-kf6 - kstatusnotifieritem-kf6 - - - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share/applications - /usr/share/config.kcfg - /usr/share/krdc-kf6 - /usr/share/kxmlgui-kf65 - /usr/share/kservice-kf6s5 - /usr/share/metainfo - /usr/share/kservice-kf6types5 - /usr/share/qlogging-categories6 - /usr/share/mime/packages/org.kde.krdc-mime.xml - /usr/share/doc - /usr/share/locale - /usr/share/kio-kf6/servicemenus/smb2rdc.desktop - - - - krdc-kf6-devel - - krdc-kf6 - - - /usr/include - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libksane-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde.graphics - SANE library interface for KDE - KDE için SANE kitaplık arayüzü - libksane-kf6 is a SANE library interface for KDE. - libksane-kf6, KDE için bir SANE kitaplık arayüzüdür. - mirrors://kde/stable/release-service/24.12.1/src/libksane-24.12.1.tar.xz - - ki18n-kf6-devel - kwallet-kf6-devel - qt6-base-devel - ktextwidgets-kf6-devel - sane-backends-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - ksanecore-kf6-devel - - desktop/kde6/applications/libksane-kf6/pspec.xml - - - libksane-kf6 - - ki18n-kf6 - kwallet-kf6 - libgcc - qt6-base - ktextwidgets-kf6 - sane-backends - kwidgetsaddons-kf6 - ksanecore-kf6 - - - /usr/lib - /usr/share/icons - /usr/share/locale - - - - libksane-kf6-devel - Development files for libksane-kf6 - libksane-kf6 için geliştirme dosyaları - - libksane-kf6 - ksanecore-kf6-devel - - - /usr/lib/cmake - /usr/include - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kcharselect-kf6 - http://utils.kde.org/projects/kcharselect-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.utils - A character selector - Bir karakter seçici - kcharselect-kf6 is a tool to select special characters from all installed fonts and copy them into the clipboard. - kcharselect-kf6, tüm yüklü yazı tiplerinden özel karakterleri seçmek ve bunları panoya yapıştırmak için bir araçtır. - kcharselect-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kcharselect-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kbookmarks-kf6-devel - cmake - extra-cmake-modules-kf6 - ki18n-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kcrash-kf6-devel - mesa-devel - - desktop/kde6/applications/kcharselect-kf6/pspec.xml - - - kcharselect-kf6 - - qt6-base - kxmlgui-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kcrash-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share/doc - /usr/bin - /usr/share - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdegraphics-thumbnailers-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.graphics - KDE thumbnailer library - KDE önizleme kitaplıkları - kdegraphics-thumbnailers-kf6 contains thumbnail-related libraries. - kdegraphics-thumbnailers-kf6, önizleme kitaplıklarını içerir. - mirrors://kde/stable/release-service/24.12.1/src/kdegraphics-thumbnailers-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kio-kf6-devel - libkdcraw-kf6-devel - libkexiv2-kf6-devel - kdegraphics-mobipocket-kf6-devel - karchive-kf6-devel - - desktop/kde6/applications/kdegraphics-thumbnailers-kf6/pspec.xml - - - kdegraphics-thumbnailers-kf6 - - kio-kf6 - libgcc - qt6-base - libkdcraw-kf6 - libkexiv2-kf6 - kdegraphics-mobipocket-kf6 - karchive-kf6 - - - /usr/lib - /usr/share/doc - /usr/share - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdebugsettings-kf6 - http://projects.kde.org/kdebugsettings-kf6 - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - app:gui - desktop.kde6.applications - An application to enable/disable qCDebug - KDebug control module for KDE. It provides a graphical frontend for the kdebug daemon, which allow enabling or disabling particular debug areas/messages. - mirrors://kde/stable/release-service/24.12.1/src/kdebugsettings-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - kwidgetsaddons-kf6-devel - kitemviews-kf6-devel - kcompletion-kf6-devel - kio-kf6-devel - - desktop/kde6/applications/kdebugsettings-kf6/pspec.xml - - - kdebugsettings-kf6 - An application to enable/disable qCDebug - - ki18n-kf6 - libgcc - kconfig-kf6 - qt6-base - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /etc - /usr/lib - /usr/share - /usr/share/applications - /usr/share/doc - /usr/share/locale - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - messagelib-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:library - desktop.kde6.applications - KDE PIM library providing support for mail applications - KDE PIM library providing support for mail applications - mirrors://kde/stable/release-service/24.12.1/src/messagelib-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - boost-devel - kdoctools-kf6-devel - mailimporter-kf6-devel - libgravatar-kf6-devel - kidentitymanagement-kf6-devel - kmailtransport-kf6-devel - kmbox-kf6-devel - akonadi-kf6-devel - solid-kf6-devel - kguiaddons-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kmime-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - akonadi-search-kf6-devel - syntax-highlighting-kf6-devel - kpimtextedit-kf6-devel - kimap-kf6-devel - kldap-kf6-devel - grantleetheme-kf6-devel - pimcommon-kf6-devel - libkleo-kf6-devel - libkdepim-kf6-devel - gpgme-devel - gpgme-qt6-devel - qt6-declarative-devel - qt6-webengine-devel - qca2-qt6-devel - akonadi-mime-kf6-devel - akonadi-contacts-kf6-devel - openldap-client - cyrus-sasl-devel - karchive-kf6-devel - kcodecs-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - kservice-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - sonnet-kf6-devel - knewstuff-kf6-devel - syntax-highlighting-kf6 - knotifications-kf6-devel - - desktop/kde6/applications/messagelib-kf6/pspec.xml - - - messagelib-kf6 - - qt6-base - qt6-webengine - libgcc - libkdepim-kf6 - mailimporter-kf6 - kio-kf6 - ki18n-kf6 - kmbox-kf6 - kmime-kf6 - sonnet-kf6 - akonadi-kf6 - gpgme - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - libkleo-kf6 - karchive-kf6 - kguiaddons-kf6 - kcalendarcore-kf6 - kservice-kf6 - kcontacts-kf6 - pimcommon-kf6 - akonadi-mime-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - libgravatar-kf6 - kpimtextedit-kf6 - ktextwidgets-kf6 - grantleetheme-kf6 - kwindowsystem-kf6 - akonadi-search-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - syntax-highlighting-kf6 - akonadi-contacts-kf6 - knewstuff-kf6 - kidentitymanagement-kf6 - qca2-qt6 - knotifications-kf6 - - - /etc - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - messagelib-kf6-devel - Development files for messagelib-kf6 - - messagelib-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - khangman-kf6 - https://www.kde.org/applications/education/khangman/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.edu - khangman-kf6 is a game for kids based on the well-known hangman game - Adam asmaca oyununun çocuklar için uyarlanmış, öğretici versiyonu - khangman-kf6 is a game based on the well-known hangman game. It is aimed at children aged six and over. The game has several categories of words to play with, for example: Animals (animals words) and three difficulty categories: Easy, Medium and Hard. - khangman-kf6, adam asmaca olarak bilinen oyunun 6 yaş ve üzeri için uyarlanmış bir uygulamasıdır. Oynamak için seçilebilecek değişik kate-kf6goriler ve 3 farklı zorluk seviyesi bulunuyor. - khangman-kf6 - mirrors://kde/stable/release-service/24.12.1/src/khangman-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kdeclarative-kf6-devel - knewstuff-kf6-devel - ki18n-kf6-devel - kcrash-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - knotifications-kf6-devel - kxmlgui-kf6-devel - kwidgetsaddons-kf6-devel - kio-kf6-devel - qt6-svg-devel - qt6-linguist - qt6-declarative-devel - libkeduvocdocument-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/khangman-kf6/pspec.xml - - - khangman-kf6 - - qt6-base - kdeclarative-kf6 - knewstuff-kf6 - ki18n-kf6 - kwidgetsaddons-kf6 - kconfig-kf6 - kcoreaddons-kf6 - kxmlgui-kf6 - qt6-declarative - libkeduvocdocument-kf6 - libgcc - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/man - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kmail-account-wizard-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - kmail-kf6 Account Wizard - kmail-kf6 Account Wizard - mirrors://kde/stable/release-service/24.12.1/src/kmail-account-wizard-24.12.1.tar.xz - - gpgme-devel - gpgme-qt6-devel - extra-cmake-modules-kf6 - kcmutils-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - prison-kf6-devel - akonadi-kf6-devel - akonadi-search-kf6-devel - grantleetheme-kf6-devel - kpimtextedit-kf6-devel - libkdepim-kf6-devel - libkleo-kf6-devel - pimcommon-kf6-devel - qt6-base-devel - knotifyconfig-kf6-devel - ktexteditor-kf6-devel - kitemmodels-kf6-devel - akonadi-contacts-kf6-devel - kidentitymanagement-kf6-devel - kldap-kf6-devel - cyrus-sasl-devel - kmailtransport-kf6-devel - akonadi-mime-kf6-devel - mailcommon-kf6-devel - messagelib-kf6-devel - kimap-kf6-devel - knewstuff-kf6-devel - knotifications-kf6-devel - - desktop/kde6/applications/kmail-account-wizard-kf6/pspec.xml - - - kmail-account-wizard-kf6 - kmail-kf6 Account Wizard - - kio-kf6 - gpgme - ki18n-kf6 - kldap-kf6 - kmime-kf6 - kcrash-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - libkleo-kf6 - kcmutils-kf6 - qt6-base - knewstuff-kf6 - libkdepim-kf6 - kitemviews-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - akonadi-mime-kf6 - kmailtransport-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kidentitymanagement-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kcalc-kf6 - http://kde.org/applications/utilities/kcalc-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde6.utils - A scientific calculator - Bir bilimsel hesap makinesi - kcalc-kf6 is a calculator which offers many more mathematical functions than meet the eye on a first glance. - kcalc-kf6, pek çok matematik fonksiyonu barındıran bir hesap makinesi uygulamasıdır. - kcalc-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kcalc-24.12.1.tar.xz - - qt6-base-devel - qt6-5compat-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - gmp-devel - cmake - mpfr-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kcrash-kf6-devel - knotifications-kf6-devel - kxmlgui-kf6-devel - mesa-devel - - desktop/kde6/applications/kcalc-kf6/pspec.xml - - - kcalc-kf6 - - qt6-base - gmp - ki18n-kf6 - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - kguiaddons-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - /usr/lib - /usr/share/doc - /usr/bin - /usr/share - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ksudoku-kf6 - https://apps.kde.org/ksudoku-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde6.applications - Sudoku game - Sudoku oyunu - ksudoku-kf6 is a logic-based symbol placement puzzle. - ksudoku-kf6 mantık temelli bir sembol yerleştirme oyunudur. - ksudoku-kf6 - https://download.kde.org/stable/release-service/24.12.1/src/ksudoku-24.12.1.tar.xz - - cmake - kio-kf6-devel - ki18n-kf6-devel - kcrash-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - qt6-svg-devel - qt6-base-devel - mesa-glu-devel - karchive-kf6-devel - libglvnd-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - libkdegames-kf6-devel - kcoreaddons-kf6-devel - kjobwidgets-kf6-devel - kiconthemes-kf6-devel - extra-cmake-modules-kf6 - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - qt6-declarative-devel - - desktop/kde6/applications/ksudoku-kf6/pspec.xml - - - ksudoku-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - mesa-glu - libglvnd - kguiaddons-kf6 - kjobwidgets-kf6 - kcoreaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib - /etc/xdg - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kalarm-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - Personal alarm scheduler - kalarm-kf6 is a personal alarm message, audio, command and email scheduler - http://download.kde.org/stable/release-service/24.12.1/src/kalarm-24.12.1.tar.xz - - akonadi-contacts-kf6-devel - akonadi-kf6-devel - akonadi-mime-kf6-devel - extra-cmake-modules-kf6 - kauth-kf6-devel - vlc-libs - vlc-devel - kcalendarcore-kf6-devel - kcalutils-kf6-devel - kcmutils-kf6-devel - kcodecs-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6 - kdbusaddons-kf6-devel - kglobalaccel-kf6-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - kholidays-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kidentitymanagement-kf6-devel - kio-kf6-devel - kjobwidgets-kf6-devel - kmime-kf6-devel - knotifications-kf6-devel - kpimtextedit-kf6-devel - kservice-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - libX11-devel - libkdepim-kf6-devel - libxslt-devel - mailcommon-kf6-devel - pimcommon-kf6-devel - qt6-base-devel - qt6-5compat-devel - qt6-phonon-devel - kunitconversion-kf6-devel - kitemmodels-kf6-devel - kcontacts-kf6-devel - messagelib-kf6-devel - kimap-kf6-devel - cyrus-sasl-devel - libkleo-kf6-devel - gpgme-devel - kmailtransport-kf6-devel - libcanberra-devel - kidletime-kf6-devel - knotifyconfig-kf6-devel - kstatusnotifieritem-kf6-devel - - desktop/kde6/applications/kalarm-kf6/pspec.xml - - - kalarm-kf6 - Personal alarm scheduler - - kio-kf6 - kauth-kf6 - ki18n-kf6 - kmime-kf6 - libgcc - vlc-libs - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcalendarcore-kf6 - kservice-kf6 - kcalutils-kf6 - kcontacts-kf6 - kholidays-kf6 - libkdepim-kf6 - pimcommon-kf6 - kguiaddons-kf6 - qt6-5compat - qt6-phonon - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - akonadi-mime-kf6 - kpimtextedit-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - akonadi-contacts-kf6 - kglobalaccel-kf6 - kidentitymanagement-kf6 - qt6-base - kidletime-kf6 - knotifyconfig-kf6 - kstatusnotifieritem-kf6 - - - /etc/dbus-1 - /etc/xdg - /usr/lib - /usr/bin - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - akonadi-mime-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.applications - Libraries and daemons to implement basic email handling - Libraries and daemons to implement basic email handling - mirrors://kde/stable/release-service/24.12.1/src/akonadi-mime-24.12.1.tar.xz - - qt6-base-devel - boost-devel - ki18n-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - gettext-devel - akonadi-kf6-devel - extra-cmake-modules-kf6 - kxmlgui-kf6-devel - libxslt-devel - extra-cmake-modules-kf6 - kmime-kf6-devel - kio-kf6-devel - shared-mime-info - - desktop/kde6/applications/akonadi-mime-kf6/pspec.xml - - - akonadi-mime-kf6 - - qt6-base - ki18n-kf6 - akonadi-kf6 - libgcc - kio-kf6 - kmime-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - akonadi-mime-kf6-devel - Development files for akonadi-mime-kf6 - - qt6-base-devel - akonadi-mime-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kollision-kf6 - https://www.kde.org/applications/games/kollision/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - A simple ball dodging game - Basit bir top sıçratma oyunu - kollision-kf6 is ball dodging game. Click on the empty field to start a game: a blue ball immediately replaces your mouse cursor, and a number of red balls start to fade into the field. - kollision-kf6 basit bir top sıçratma oyunudur. Boş bir alana fareyle tıkladığınızda oyun başlar ve fare imlecinizin yerini mavi bir top alır, ayrıca olayların gelişmesine vesile olacak kırmızı toplar da alandaki yerlerini alırlar. - kollision-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kollision-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - knewstuff-kf6-devel - libkdegames-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/kollision-kf6/pspec.xml - - - kollision-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kgeography-kf6 - https://www.kde.org/applications/education/kgeography/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.edu - kgeography-kf6 is a geography learning tool - Bir coğrafya uygulaması - kgeography-kf6 is a geography learning tool, which allows you to learn about the political divisions of some countries (divisions, capitals of those divisions and their associated flags if there are some). - kgeography-kf6, ülkeler hakkında çeşitli bilgiler sunan bir coğrafya uygulamasıdır. - kgeography-kf6 - https://download.kde.org/stable/release-service/24.12.1/src/kgeography-24.12.1.tar.xz - - qt6-base-devel - kconfig-kf6-devel - kcrash-kf6-devel - kdoctools-kf6-devel - kxmlgui-kf6-devel - kwidgetsaddons-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kservice-kf6-devel - kconfigwidgets-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/kgeography-kf6/pspec.xml - - - kgeography-kf6 - - qt6-base - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - kwidgetsaddons-kf6 - kcoreaddons-kf6 - ki18n-kf6 - kitemviews-kf6 - kiconthemes-kf6 - kconfigwidgets-kf6 - - - /usr/bin - /usr/share - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - killbots-kf6 - https://www.kde.org/applications/games/killbots/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Run for your life - Hayatta kalmak için kaçın - killbots-kf6 is a simple game of evading killer robots. Who created the robots and why they have been programmed to destroy, no one knows. All that is known is that the robots are numerous and their sole objective is to destroy you. - killbots-kf6 katil robotlardan kaçmaya çalıştığınız basit bir oyundur. Robotların kimin tarafından yaratıldığı veya neden yok etmek için programlandığı bilinmiyor. Tek gerçek şu ki bir çok robot var ve tek amaçları sizi yok etmek. - killbots-kf6 - mirrors://kde/stable/release-service/24.12.1/src/killbots-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - kcompletion-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/killbots-kf6/pspec.xml - - - killbots-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libkdcraw-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.graphics - A C++ interface around LibRaw library - LibRaw kitaplığı için C++ arayüzü - libkdcraw-kf6 is a C++ interface around LibRaw library used to decode RAW picture files. - libkdcraw-kf6, RAW resim dosyalarını çözmek için kullanılan LibRaW kitaplığının C++ arayüzüdür. - libkdcraw-kf6 - mirrors://kde/stable/release-service/24.12.1/src/libkdcraw-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - libraw-devel - kconfig-kf6-devel - ki18n-kf6-devel - cmake - extra-cmake-modules-kf6 - qca2-qt6-devel - - desktop/kde6/applications/libkdcraw-kf6/pspec.xml - - - libkdcraw-kf6 - - qt6-base - libraw - kconfig-kf6 - ki18n-kf6 - libgcc - - - /usr/lib - /usr/bin - /usr/share/icons - /usr/share/ - - - - libkdcraw-kf6-devel - Development files for libkdcraw-kf6 - libkdcraw-kf6 için geliştirme dosyaları - - libkdcraw-kf6 - qt6-base-devel - libraw-devel - kconfig-kf6-devel - ki18n-kf6-devel - - - /usr/include - /usr/lib/pkgconfig - /usr/share/apps/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdiamond-kf6 - https://www.kde.org/applications/games/kdiamond/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Three in a row game - Bir satırda üç oyunu - kdiamond-kf6 is a single player puzzle game. The object of the game is to build lines of three similar diamonds. - kdiamond-kf6 benzer elmaslardan üç tanesinin yan yana getirilmesini konu edinen tek kişilik bir bulmaca oyunudur. - kdiamond-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kdiamond-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - knotifications-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kcrash-kf6-devel - kcompletion-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - docbook-xsl - - desktop/kde6/applications/kdiamond-kf6/pspec.xml - - - kdiamond-kf6 - - ki18n-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - knotifyconfig-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - akregator-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - A KDE blogging client - akregator-kf6 helps you to keep informed about new stories on websites like KDE Dot News and Planet KDE blogs. The technology used is RSS and many sites support it. - https://download.kde.org/stable/release-service/24.12.1/src/akregator-24.12.1.tar.xz - - boost-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - kio-kf6-devel - ktexteditor-kf6-devel - python-devel - qt6-base-devel - qt6-webengine-devel - kcmutils-kf6-devel - knotifyconfig-kf6-devel - akonadi-mime-kf6-devel - akonadi-kf6-devel - kitemmodels-kf6-devel - grantleetheme-kf6-devel - kcontacts-kf6-devel - kontactinterface-kf6-devel - libkdepim-kf6-devel - akonadi-contacts-kf6-devel - libkleo-kf6-devel - gpgme-devel - gpgme-qt6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - kimap-kf6-devel - kmime-kf6-devel - cyrus-sasl-devel - kpimtextedit-kf6-devel - ksyndication-kf6-devel - ffmpeg-devel - knotifyconfig-kf6-devel - knotifications-kf6-devel - kuserfeedback-kf6-devel - libXScrnSaver-devel - kstatusnotifieritem-kf6-devel - - desktop/kde6/applications/akregator-kf6/pspec.xml - - - akregator-kf6 - A Feed Reader by KDE - - kio-kf6 - ki18n-kf6 - kcrash-kf6 - kparts-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - libkdepim-kf6 - pimcommon-kf6 - messagelib-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - kpimtextedit-kf6 - ksyndication-kf6 - ktextwidgets-kf6 - grantleetheme-kf6 - knotifyconfig-kf6 - qt6-webengine - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kontactinterface-kf6 - kstatusnotifieritem-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ktimer-kf6 - http://kde.org/applications/utilities/ktimer-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.utils - A countdown launcher - A countdown launcher - ktimer-kf6 is a little tool to execute programs after some time. It allows you to enter several tasks and to set a timer for each of them. The timers for each task can be started, stopped, changed, or looped. - ktimer-kf6 is a little tool to execute programs after some time. It allows you to enter several tasks and to set a timer for each of them. The timers for each task can be started, stopped, changed, or looped. - ktimer-kf6 - mirrors://kde/stable/release-service/24.12.1/src/ktimer-24.12.1.tar.xz - - qt6-base-devel - qt6-5compat-devel - kdoctools-kf6-devel - kstatusnotifieritem-kf6-devel - cmake - extra-cmake-modules-kf6 - ki18n-kf6-devel - kwidgetsaddons-kf6-devel - kio-kf6-devel - kiconthemes-kf6-devel - kdbusaddons-kf6-devel - knotifications-kf6-devel - mesa-devel - - desktop/kde6/applications/ktimer-kf6/pspec.xml - - - ktimer-kf6 - - qt6-base - qt6-5compat - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kstatusnotifieritem-kf6 - - - /usr/share/doc - /usr/bin - /usr/share - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - partitionmanager-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde6.applications - KDE Partition Manager is a utility program to help you manage the disk devices, partitions and file systems on your computer - KDE Disk Bölümü Yöneticisi - It allows you to easily create, copy, move, delete, resize without losing data, backup and restore partitions.. - KDE Disk Bölümü Yöneticisi, disklerinizi, bölümlerinizi ve dosya sistemlerinizi yönetmenize izin verir. Birçok dosya sistemini (ext2/3/4, reiserfs, NTFS, FAT32 ve daha fazlası) desteklemenin yanı sıra, yeni bölüm oluşturabilir ya da var olan bir bölüm üzerinde boyutlandırma, kopyalama, taşıma, yedekleme ve geri yükleme işlemlerini yapabilir. - mirrors://kde/stable/release-service/24.12.1/src/partitionmanager-24.12.1.tar.xz - - qt6-base-devel - libatasmart-devel - extra-cmake-modules-kf6 - parted-devel - libutil-linux-devel - ki18n-kf6-devel - kio-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - kjobwidgets-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kdoctools-kf6-devel - kpmcore-kf6-devel - e2fsprogs-devel - kdbusaddons-kf6-devel - polkit-qt6-devel - elogind-devel - - desktop/kde6/applications/partitionmanager-kf6/pspec.xml - - - partitionmanager-kf6 - - qt6-base - libgcc - libutil-linux - kio-kf6 - ki18n-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kpmcore-kf6 - kcrash-kf6 - e2fsprogs - kdbusaddons-kf6 - polkit-qt6 - kwindowsystem-kf6 - - - /usr/bin - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - step-kf6 - http://kde.org/applications/education/step/ - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.edu - Interactive Physical Simulator - step-kf6 is an interactive physical simulator. It allows you to explore the physical world through simulations. - mirrors://kde/stable/release-service/24.12.1/src/step-24.12.1.tar.xz - - qt6-base-devel - qt6-svg-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - mesa-devel - kconfig-kf6-devel - knewstuff-kf6-devel - kplotting-kf6-devel - eigen3 - pkgconfig - libqalculate-devel - cln-devel - kiconthemes-kf6-devel - ktextwidgets-kf6-devel - kio-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - qt6-linguist - gsl-devel - - desktop/kde6/applications/step-kf6/pspec.xml - - - step-kf6 - - qt6-base - cln - gsl - kcrash-kf6 - knewstuff-kf6 - kplotting-kf6 - libqalculate - kparts-kf6 - kio-kf6 - libgcc - kiconthemes-kf6 - ktextwidgets-kf6 - kio-kf6 - ki18n-kf6 - kconfig-kf6 - kxmlgui-kf6 - kjobwidgets-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kservice-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kompare-kf6 - http://www.kde.org/ - - Pisi Linux Admins - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.sdk - File difference viewer - Dosya karşılaştırma göstericisi. - Diff/Patch Frontend. - Dosya karşılaştırma göstericisi. - mirrors://kde/stable/release-service/24.12.1/src/kompare-24.12.1.tar.xz - - extra-cmake-modules-kf6 - kdoctools-kf6-devel - qt6-base-devel - gettext-devel - libkomparediff2-kf6-devel - kcoreaddons-kf6-devel - kcodecs-kf6-devel - kiconthemes-kf6-devel - kjobwidgets-kf6-devel - kconfig-kf6-devel - kparts-kf6-devel - ktexteditor-kf6-devel - kwidgetsaddons-kf6-devel - - desktop/kde6/applications/kompare-kf6/pspec.xml - - - kompare-kf6 - - qt6-base - libkomparediff2-kf6 - kio-kf6 - ki18n-kf6 - kparts-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - ktexteditor-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - /usr/bin - /usr/include - - - kdesdk - - - kdesdk - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - pimcommon-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.applications - Common libraries for KDE PIM - Common libraries for KDE PIM - mirrors://kde/stable/release-service/24.12.1/src/pimcommon-24.12.1.tar.xz - - qt6-base-devel - boost-devel - gpgme-devel - qt6-sql-sqlite - qt6-sql-mysql - qt6-sql-odbc - qt6-sql-postgresql - prison-kf6-devel - kmbox-kf6-devel - qt6-phonon-devel - akonadi-kf6-devel - libical-devel - libgpg-error-devel - libxslt-devel - openldap-client - cyrus-sasl-devel - kitemviews-kf6-devel - kio-kf6-devel - karchive-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kmime-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - kldap-kf6-devel - libkdepim-kf6-devel - extra-cmake-modules-kf6 - akonadi-contacts-kf6-devel - akonadi-search-kf6-devel - akonadi-mime-kf6-devel - qt6-webengine-devel - kdoctools-kf6-devel - knewstuff-kf6-devel - kpimtextedit-kf6-devel - kimap-kf6-devel - purpose-kf6-devel - ktextaddons-kf6-devel - - desktop/kde6/applications/pimcommon-kf6/pspec.xml - - - pimcommon-kf6 - - qt6-base - kio-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - kmime-kf6 - kldap-kf6 - kxmlgui-kf6 - kwallet-kf6 - karchive-kf6 - kjobwidgets-kf6 - qt6-webengine - kcalendarcore-kf6 - kcontacts-kf6 - kconfig-kf6 - libxml2 - kservice-kf6 - kguiaddons-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-phonon - prison-kf6 - akonadi-kf6 - libkdepim-kf6 - akonadi-contacts-kf6 - kdoctools-kf6 - knewstuff-kf6 - kpimtextedit-kf6 - kimap-kf6 - cyrus-sasl - purpose-kf6 - ktextaddons-kf6 - - - /etc/xdg - /usr/lib - /usr/share/doc - /usr/mkspecs/ - /usr/bin - /usr/share/mime - /usr/share/icons - /usr/share/dbus-1 - /usr/share/config.kcfg - /usr/share/kf5 - /usr/share/config - /usr/share/akonadi - /usr/share/akonadicontact/grantleetheme/default - /usr/share/locale - /usr/share - - - - pimcommon-kf6-devel - Development package for pimcommon-kf6 libraries - Contains development tools and header files for kdepim-common - - qt6-base-devel - boost-devel - ktextaddons-kf6-devel - pimcommon-kf6 - - - /usr/lib/cmake - /usr/include - /usr/lib/gpgmepp - /usr/share/kde4/apps/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kalgebra-kf6 - https://www.kde.org/applications/education/kalgebra/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2+ - app:gui - desktop.kde.edu - A graph calculator - Bir grafiksel hesap makinesi - kalgebra-kf6 is a fully featured calculator that lets you plot different types of 2D and 3D functions and to calculate easy and not so easy calculations, such as addition, trigonometric functions or derivatives. - kalgebra-kf6, farklı farklı 2B ve 3B fonksiyonları çizmek, kolay ve o kadar da kolay olmayan trigonometrik veya türev gibi hesaplamaları yapmak için bir uygulamadır. - kalgebra-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kalgebra-24.12.1.tar.xz - - mesa-devel - mesa-glu-devel - qt6-base-devel - qt6-declarative - qt6-svg-devel - qt6-5compat-devel - analitza-kf6-devel - kdoctools-kf6-devel - ncurses-devel - readline-devel - gettext-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kio-kf6-devel - extra-cmake-modules-kf6 - qt6-webengine-devel - ffmpeg-devel - libXScrnSaver-devel - - desktop/kde6/applications/kalgebra-kf6/pspec.xml - - - kalgebra-kf6 - - qt6-base - qt6-declarative - analitza-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - readline - kcoreaddons-kf6 - ki18n-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kio-kf6 - qt6-webengine - - - /usr/share/doc - /usr/bin - /usr/share - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ktuberling-kf6 - http://kde.org/applications/games/ktuberling/ - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - A simple constructor game suitable for children and adults alike - ktuberling-kf6 a simple constructor game suitable for children and adults alike. The idea of the game is based around a once popular doll making concept. - mirrors://kde/stable/release-service/24.12.1/src/ktuberling-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - qt6-multimedia-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kitemmodels-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - knewstuff-kf6-devel - kdoctools-kf6-devel - kunitconversion-kf6-devel - libkdegames-kf6-devel - - desktop/kde6/applications/ktuberling-kf6/pspec.xml - - - ktuberling-kf6 - A simple constructor game suitable for children and adults alike - - kio-kf6 - ki18n-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - qt6-multimedia - qt6-phonon - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/share/applications - /usr/share/icons - /usr/share/ktuberling - /usr/share/metainfo - /usr/share/kxmlgui-kf6 - /usr/share/doc - /usr/share/locale - /usr/share/qlogging-categories6 - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kalzium-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - app:console - desktop.kde6.applications - Periodic Table of Elements - Periodic Table of Elements - Elementlerin periyodik tablosu - Elementlerin periyodik tablosu - https://download.kde.org/stable/release-service/24.12.1/src/kalzium-24.12.1.tar.xz - - cmake - eigen3 - ocaml - kio-kf6-devel - ki18n-kf6-devel - karchive-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - qt6-svg-devel - qt6-base-devel - qt6-scxml-devel - qt6-5compat-devel - kitemmodels-kf6-devel - kplotting-kf6-devel - kitemviews-kf6-devel - kdoctools-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - ktextwidgets-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kunitconversion-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/kalzium-kf6/pspec.xml - - - kalzium-kf6 - - kio-kf6 - karchive-kf6 - ki18n-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - qt6-scxml - kplotting-kf6 - kitemviews-kf6 - qt6-5compat - kcompletion-kf6 - kcoreaddons-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kunitconversion-kf6 - - - /usr/bin - /etc - /usr/lib - /usr/share - /usr/share/locale - /usr/share/man - /usr/share/metainfo - /usr/share/doc - - - - kalzium-kf6-devel - Development files for kalzium-kf6 - - kalzium-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - knavalbattle-kf6 - https://www.kde.org/applications/games/knavalbattle/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Naval Battle game - Amiral Battı oyunu - knavalbattle-kf6 is a Battle Ship game for KDE. Ships are placed on a board which represents the sea. Players try to hit each others ships in turns without knowing where they are placed. The first player to destroy all ships wins the game. - KBattleship KDE için bir Amiral Battı oyunudur. Gemiler denizi temsil eden oyun tahtasına yerleştirilir ve oyuncular rakiplerinin gemilerinin yerleşimini tahmin ederek gemileri vurmaya çalışır. Rakibinin tüm gemilerini daha önce batıran oyuncu kazanır. - knavalbattle-kf6 - mirrors://kde/stable/release-service/24.12.1/src/knavalbattle-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcrash-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kdnssd-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - kdoctools-kf6-devel - ktextwidgets-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/knavalbattle-kf6/pspec.xml - - - knavalbattle-kf6 - - ki18n-kf6 - kdnssd-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - ktextwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/share/applications - /usr/share/icons - /usr/share/kconf_update - /usr/share/knavalbattle - /usr/share/kservice-kf6s5 - /usr/share/kxmlgui-kf65 - /usr/share/doc - /usr/share/locale - /usr/share/qlogging-categories6 - /usr/share/metainfo/org.kde.knavalbattle.appdata.xml - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kfourinline-kf6 - https://www.kde.org/applications/games/kfourinline/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Four in a row board game - Bir satırda dört tahta oyunu - kfourinline-kf6 is a board game for two players based on the Connect-Four game. - kfourinline-kf6 iki kişiyle oynanan Hedef 4 türevi bir oyundur. - kfourinline-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kfourinline-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kitemmodels-kf6-devel - kdbusaddons-kf6-devel - kdeclarative-kf6-devel - ki18n-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kcompletion-kf6-devel - kxmlgui-kf6-devel - kdnssd-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - kdoctools-kf6-devel - kunitconversion-kf6-devel - libkdegames-kf6-devel - - desktop/kde6/applications/kfourinline-kf6/pspec.xml - - - kfourinline-kf6 - - ki18n-kf6 - kdnssd-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - akonadi-notes-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.applications - Libraries and daemons to implement management of notes in Akonadi - Libraries and daemons to implement management of notes in Akonadi - mirrors://kde/stable/release-service/24.08.3/src/akonadi-notes-24.08.3.tar.xz - - qt6-base-devel - boost-devel - ki18n-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - gettext-devel - akonadi-kf6-devel - extra-cmake-modules-kf6 - kxmlgui-kf6-devel - libxslt-devel - extra-cmake-modules-kf6 - kmime-kf6-devel - shared-mime-info - - desktop/kde6/applications/akonadi-notes-kf6/pspec.xml - - - akonadi-notes-kf6 - - qt6-base - ki18n-kf6 - akonadi-kf6 - libgcc - kio-kf6 - kmime-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - akonadi-notes-kf6-devel - Development files for akonadi-notes-kf6 - - qt6-base-devel - akonadi-notes-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kwave-kf6 - http://kwave-kf6.sourceforge.net/ - - Stefan Gronewold - groni@pisilinux.org - - GPL - desktop.kde6.applications - A sound editor for KDE - With kwave-kf6 you can record, play back, import and edit many sorts of audio files including multi channel files.kwave-kf6 includes some plugins to transform audio files in several ways and presents a graphical view with a complete zoom- and scroll capability. - http://download.kde.org/stable/release-service/24.12.1/src/kwave-24.12.1.tar.xz - - doxygen - kdoctools-devel - librsvg-devel - qt6-base-devel - qt6-multimedia-devel - kwidgetsaddons-devel - kxmlgui-devel - kio-devel - audiofile-devel - libsamplerate-devel - alsa-lib-devel - flac-devel - libopus-devel - libogg-devel - libvorbis-devel - fftw3-devel - id3lib-devel - libmad-devel - karchive-devel - ktextwidgets-devel - kiconthemes-devel - pulseaudio-libs-devel - extra-cmake-modules - - desktop/kde6/applications/kwave-kf6/pspec.xml - - - kwave-kf6 - A sound editor for KDE - - kio-kf6 - flac - fftw3 - ki18n-kf6 - id3lib - libmad - kcrash-kf6 - karchive-kf6 - libgcc - libogg - kconfig-kf6 - kxmlgui-kf6 - libopus - alsa-lib - kservice-kf6 - qt6-base - audiofile - libvorbis - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - libsamplerate - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-multimedia - pulseaudio-libs - - - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kmplot-kf6 - http://kde.org/applications/education/kmplot/ - - Stefan Gronewold (groni) - groni@pisilinux.org - - FDL - GPL - LGPL - desktop.kde.edu - Mathematical Function Plotter - kmplot-kf6 is a program to draw graphs, their integrals or derivatives. It supports different systems of coordinates like the Cartesian or the polar coordinate system. The graphs can be colorized and the view is scalable, so that you are able to zoom to the level you need. - mirrors://kde/stable/release-service/24.12.1/src/kmplot-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kunitconversion-kf6-devel - kparts-kf6-devel - kwidgetsaddons-kf6-devel - kitemmodels-kf6-devel - qt6-base-devel - qt6-svg-devel - - desktop/kde6/applications/kmplot-kf6/pspec.xml - - - kmplot-kf6 - Mathematical Function Plotter - - ki18n-kf6 - kparts-kf6 - kwidgetsaddons-kf6 - qt6-base - qt6-svg - libgcc - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - - - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - /usr/share/man - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kmime-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.applications - KDE library for handling mail messages and newsgroup articles. - kmime-kf6 library for handling mail messages and newsgroup articles. - mirrors://kde/stable/release-service/24.12.1/src/kmime-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - boost-devel - ki18n-kf6-devel - kcodecs-kf6-devel - kdoctools-kf6-devel - - desktop/kde6/applications/kmime-kf6/pspec.xml - - - kmime-kf6 - - qt6-base - ki18n-kf6 - kcodecs-kf6 - libgcc - - - /usr/share - /usr/share/locale - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - kmime-kf6-devel - Development files for kmime-kf6 - - qt6-base-devel - kmime-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kturtle-kf6 - http://edu.kde.org/applications/all/kturtle-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.edu - An educational programming environment - Öğrenim amaçlı programlama ortamı - kturtle-kf6 is an educational programming environment that aims to make learning how to program as easily as possible. To achieve this kturtle-kf6 makes all programming tools available from the user interface. The programming language used is TurtleScript which allows its commands to be translated. - kturtle-kf6, programlama öğrenmeyi olabildiğince kolaylaştırmak için tasarlanmış bir programlama uygulamasıdır. Bu amaçla tasarlanan arayüz tüm gerekli araçları kullanıcıya sunar. Ayrıca kullanılan programlama dili olan TurtleScript başka dillere çevrilebilen bir yapıya sahiptir. - kturtle-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kturtle-24.12.1.tar.xz - - qt6-base-devel - qt6-svg-devel - qt6-5compat-devel - kdoctools-kf6-devel - knewstuff-kf6-devel - extra-cmake-modules-kf6 - kio-kf6-devel - kcoreaddons-kf6-devel - ktextwidgets-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kconfig-kf6-devel - gettext-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/kturtle-kf6/pspec.xml - - - kturtle-kf6 - - qt6-base - qt6-svg - qt6-5compat - ki18n-kf6 - knewstuff-kf6 - libgcc - kcoreaddons-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kxmlgui-kf6 - kconfig-kf6 - - - /etc/xdg - /usr/share/doc - /usr/bin - /usr/share - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kblocks-kf6 - https://www.kde.org/applications/games/kblocks/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Falling blocks game - Tetris - kblocks-kf6 is the classic falling blocks game. The idea is stack the falling blocks in a way that lines are completely filled. When a line is completed it is removed, and more space is available in the play area. When there is not enough space for blocks to fall, the game is over. - kblocks-kf6 klasikleşmiş tetrisin bir yeniden yapımıdır. Oyunun amacı düşen parçaları en uygun şekilde dizmektir. Bir satır tamamen dolduktan sonra silinmektedir ve daha fazla oyun alanı açılmaktadır. Yeni parçaları koyacak yeriniz kalmadığında oyun bitmektedir. - kblocks-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kblocks-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-svg-devel - qt6-base-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kcrash-kf6-devel - kcompletion-kf6-devel - kdbusaddons-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/kblocks-kf6/pspec.xml - - - kblocks-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - qt6-phonon - kcoreaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kcrash-kf6 - kdbusaddons-kf6 - kcompletion-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libkexiv2-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.applications - An Exiv2 wrapper library - Exiv2 sarmalayıcı kitaplığı - libkexiv2-kf6 is a wrapper around Exiv2 library to manipulate pictures metadata as EXIF/IPTC and XMP. - libkexiv2-kf6, EXIF/IPTC ve XMP gibi resim meta bilgilerini düzenlemek için kullanılan Exiv2 kitaplığını sarmalayan bir kitaplıktır. - mirrors://kde/stable/release-service/24.12.1/src/libkexiv2-24.12.1.tar.xz - - extra-cmake-modules-kf6 - cmake - exiv2-devel - qt6-base-devel - qt6-5compat-devel - - desktop/kde6/applications/libkexiv2-kf6/pspec.xml - - - libkexiv2-kf6 - - qt6-base - qt6-5compat - exiv2-libs - libgcc - - - /usr/lib - /usr/bin - /usr/share/qlogging-categories6/libkexiv2.categories - - - - libkexiv2-kf6-devel - Development files for libkexiv2-kf6 - libkexiv2-kf6 için geliştirme dosyaları - - libkexiv2-kf6 - - - /usr/include - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libkeduvocdocument-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:library - desktop.kde6.applications - Common libraries for KDE Edu applications - Libraries for KDE EDU applications. - mirrors://kde/stable/release-service/24.12.1/src/libkeduvocdocument-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - ki18n-kf6-devel - kio-kf6-devel - karchive-kf6-devel - mesa-devel - - desktop/kde6/applications/libkeduvocdocument-kf6/pspec.xml - - - libkeduvocdocument-kf6 - - qt6-base - karchive-kf6 - libgcc - ki18n-kf6 - kio-kf6 - kcoreaddons-kf6 - - - /usr/lib - /usr/share/doc - /usr/share/locale - - - - libkeduvocdocument-kf6-devel - Development files for libkeduvocdocument-kf6 - - libkeduvocdocument-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kfind-kf6 - http://kde.org/applications/utilities/kfind/ - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde.utils - Find Files/Folders - Find Files/Folders - kfind-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kfind-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - kio-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - karchive-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kdoctools-kf6-devel - python-devel - kfilemetadata-kf6-devel - qt6-base-devel - qt6-5compat-devel - - desktop/kde6/applications/kfind-kf6/pspec.xml - - - kfind-kf6 - Find Files/Folders - - karchive-kf6 - qt6-5compat - libgcc - qt6-base - kio-kf6 - ki18n-kf6 - kwidgetsaddons-kf6 - kxmlgui-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kjobwidgets-kf6 - kconfigwidgets-kf6 - kfilemetadata-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - /usr/share/man/man1 - - - kde-baseapps - - - kde-baseapps - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libktorrent-kf6 - https://apps.kde.org/ktorrent/ - - Kamil Atlı - suvari@pisilinux.org - - GPLv2 - library - desktop.kde6.applications - A BitTorrent protocol implementation - Bir BitTorrent protokol uygulaması - ktorrent-kf6 is a BitTorrent application by KDE which allows you to download files using the BitTorrent protocol. - ktorrent-kf6, KDE'nin BitTorrent protokolünü kullanarak dosya indirmenize izin veren bir BitTorrent uygulamasıdır. - https://download.kde.org/stable/release-service/24.12.1/src/libktorrent-24.12.1.tar.xz - - doxygen - gmp-devel - kio-kf6-devel - boost-devel - solid-kf6-devel - ki18n-kf6-devel - kcrash-kf6-devel - karchive-kf6-devel - qt6-base-devel - qt6-5compat-devel - qca2-qt6-devel - libgcrypt-devel - kcoreaddons-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/libktorrent-kf6/pspec.xml - - - libktorrent-kf6 - - gmp - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - qt6-base - qt6-5compat - qca2-qt6 - karchive-kf6 - libgcrypt - kcoreaddons-kf6 - - - /usr/share/locale - /usr/lib/libKTorrent6.so* - /usr/share/doc - - - - libktorrent-kf6-devel - libktorrent-kf6 development headers - libktorrent-kf6 için geliştirme dosyaları - - qt6-5compat-devel - libktorrent-kf6 - - - /usr/include - /usr/lib/cmake/KTorrent6 - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kde-dev-scripts-kf6 - https://projects.kde.org/projects/kde/kdesdk/kde-dev-scripts-kf6 - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - app - desktop.kde.sdk - Scripts and setting files useful during development of KDE software - Scripts and setting files useful during development of KDE software - mirrors://kde/stable/release-service/24.12.1/src/kde-dev-scripts-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - docbook-xml - - desktop/kde6/applications/kde-dev-scripts-kf6/pspec.xml - - - kde-dev-scripts-kf6 - Scripts and setting files useful during development of KDE software - - qt6-base - kdoctools-kf6 - - - /usr/bin - /usr/share - /usr/share/man - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - klines-kf6 - https://www.kde.org/applications/games/klines/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Kolor Lines - Renkli çizgiler - Kolor Lines is a simple but highly addictive, one player game for KDE. Kolor Lines has been inspired by well known game of Color Lines. The goal of Kolor Lines is quite plain. The player has to move the colored balls around the game board, gathering them into the lines of the same color by five. - Kolor Lines basit ama bağımlılık yapıcı bir oyundur. Dünyaca ünlü Color Lines'tan esinlenilen oyunda amacınız aynı renkli toplardan beş tanesini yan yana getirmektir. - klines-kf6 - mirrors://kde/stable/release-service/24.12.1/src/klines-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-declarative-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kservice-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - libkdegames-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/klines-kf6/pspec.xml - - - klines-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kcolorchooser-kf6 - http://www.kde.org/applications/graphics/kcolorchooser-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.graphics - A simple color chooser application - Basit bir renk seçme uygulaması - kcolorchooser-kf6 is a simple color chooser application. - kcolorchooser-kf6, basit bir renk seçme uygulamasıdır. - kcolorchooser-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kcolorchooser-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - ki18n-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kiconthemes-kf6-devel - - desktop/kde6/applications/kcolorchooser-kf6/pspec.xml - - - kcolorchooser-kf6 - - ki18n-kf6 - libgcc - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - - - /usr/bin - /usr/share/applications - /usr/share/icons - /usr/share/doc - /usr/share/metainfo - /usr/share/locale - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ffmpegthumbs-kf6 - https://projects.kde.org/projects/kde/kdemultimedia/ffmpegthumbs-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde.multimedia - ffmpeg based thumbnailer for KDE - KDE için ffmpeg tabanlı önizleme - FFmpeg-based thumbnail creator for video files - Video dosyaları için FFmpeg tabanlı önizleme oluşturur. - mirrors://kde/stable/release-service/24.12.1/src/ffmpegthumbs-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kio-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - taglib-devel - ffmpeg-devel - - desktop/kde6/applications/ffmpegthumbs-kf6/pspec.xml - - - ffmpegthumbs-kf6 - - kio-kf6 - ki18n-kf6 - kconfig-kf6 - ffmpeg - taglib - libgcc - qt6-base - - - /usr/share - /usr/lib - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - cantor-kf6 - http://edu.kde.org/cantor-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2+ - app:gui - desktop.kde.edu - A KDE frontend to mathematical softwares - Matematiksel uygulamalar için bir KDE önyüzü - cantor-kf6 is an application that lets you use your favorite mathematical applications from within a nice KDE-integrated Worksheet Interface. It offers assistant dialogs for common tasks and allows you to share your worksheets with others. - cantor-kf6; Sage, Maxima, R and kalgebra-kf6 gibi uygulamalara arayüz sağlayarak kullanımı kolaylaştırmayı amaçlar. Çok kullanılan işler için dialoglar sağlar ve çalışmalarınızı başkalarıyla paylaşabilmenize olanak tanır. - cantor-kf6 - mirrors://kde/stable/release-service/24.12.1/src/cantor-24.12.1.tar.xz - - qt6-base-devel - qt6-sql-sqlite - qt6-sql-odbc - qt6-sql-mysql - qt6-sql-postgresql - qt6-assistant-devel - mesa-devel - qt6-svg-devel - qt6-webengine-devel - qt6-5compat-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - ktexteditor-kf6-devel - knewstuff-kf6-devel - kpty-kf6-devel - analitza-kf6-devel - libqalculate-devel - cln-devel - libspectre-devel - libxslt-devel - python-devel - python3-devel - R-devel - luajit-devel - syntax-highlighting-kf6-devel - poppler-qt6-devel - karchive-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/cantor-kf6/pspec.xml - - - cantor-kf6 - - R - cln - kio-kf6 - kpty-kf6 - ki18n-kf6 - kparts-kf6 - kcrash-kf6 - libgcc - python - luajit - python3 - libxslt - kconfig-kf6 - kxmlgui-kf6 - analitza-kf6 - karchive-kf6 - kservice-kf6 - libspectre - knewstuff-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - ktexteditor-kf6 - ktextwidgets-kf6 - libqalculate - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-base - - - /etc - /usr/share - /usr/lib - /usr/share/man - /usr/share/doc - /usr/bin - /usr/share/locale - - - - cantor-kf6-devel - Development files for cantor-kf6 - cantor-kf6 için geliştirme dosyaları - - cantor-kf6 - - - /usr/include - /usr/share/kde6/apps/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - keditbookmarks-kf6 - https://github.com/KDE/keditbookmarks-kf6 - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - Bookmark Organizer and Editor - Bookmark Organizer and Editor - keditbookmarks-kf6 - mirrors://kde/stable/release-service/24.12.1/src/keditbookmarks-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - kbookmarks-kf6-devel - kcoreaddons-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kparts-kf6-devel - kwindowsystem-kf6-devel - python-devel - qt6-base-devel - - desktop/kde6/applications/keditbookmarks-kf6/pspec.xml - - - keditbookmarks-kf6 - Bookmark Organizer and Editor - - kbookmarks-kf6 - ki18n-kf6 - kio-kf6 - kparts-kf6 - qt6-base - libgcc - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - kde-baseapps - - - kde-baseapps - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - poxml-kf6 - http://www.kde.org/ - - Mathias Freire - mathiasfreire45@gmail.com - - GPLv2 - app:gui - desktop.kde.sdk - Tools for translating DocBook XML files with Gettex - DocBook XML dosyalarını çevirme araçları. - This is a collection of tools that facilitate translating DocBook XML files using Gettext message files (PO files). - poxml-kf6, DocBook XML dosyalarını (.po) Gettext yarımıyla çevirmeyi sağlayan bir programdır. - https://download.kde.org/stable/release-service/24.12.1/src/poxml-24.12.1.tar.xz - - qt6-base-devel - gettext-devel - kdoctools-kf6-devel - docbook-xsl - extra-cmake-modules-kf6 - - desktop/kde6/applications/poxml-kf6/pspec.xml - - - poxml-kf6 - - libgcc - gettext - qt6-base - - - /usr/bin - /usr/share/doc - /usr/share/man - - - kdesdk - - - kdesdk - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - gwenview-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - library - desktop.kde6.graphics - An image viewer - Resim görüntüleyici - gwenview-kf6 is an easy to use image viewer - gwenview-kf6, kullanımı kolay bir resim görüntüleyicisidir. - gwenview-kf6 - mirrors://kde/stable/release-service/24.12.1/src/gwenview-24.12.1.tar.xz - - exiv2-devel - qt6-base-devel - qt6-wayland-devel - qt6-svg-devel - qt6-phonon-devel - tiff-devel - purpose-kf6-devel - cfitsio-devel - kdoctools-kf6-devel - kio-kf6-devel - plasma-activities-kf6-devel - kded-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - baloo-kf6-devel - libkdcraw-kf6-devel - libpng-devel - zlib-devel - mesa-devel - docbook-xsl - extra-cmake-modules-kf6 - lcms2-devel - libX11-devel - kparts-kf6-devel - tiff-devel - purpose-kf6-devel - cfitsio-devel - libraw-devel - kguiaddons-kf6-devel - kcolorpicker-qt6-devel - kimageannotator-qt6-devel - packagekit-devel - packagekit-qt6-devel - wayland-protocols-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - knotifications-kf6-devel - kwindowsystem-kf6-devel - - desktop/kde6/applications/gwenview-kf6/pspec.xml - - - gwenview-kf6 - - qt6-base - exiv2-libs - solid-kf6 - plasma-activities-kf6 - libkdcraw-kf6 - kded-kf6 - tiff - purpose-kf6 - cfitsio - kio-kf6 - ki18n-kf6 - lcms2 - kparts-kf6 - libX11 - libgcc - libpng - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - kservice-kf6 - baloo-kf6 - kitemviews-kf6 - qt6-phonon - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 - libjpeg-turbo - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kfilemetadata-kf6 - kguiaddons-kf6 - libraw - wayland-client - kcolorscheme-kf6 - kimageannotator-qt6 - wayland-protocols - qt6-wayland - - - /usr/lib - /usr/share/doc - /usr/bin - /usr/share - /usr/share/icons - /usr/share/applications - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - granatier-kf6 - https://www.kde.org/applications/games/granatier/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - A bomber-kf6man game - Bombalama macera oyunu - granatier-kf6 is a clone of the classic bomber-kf6man game, inspired by the work of the Clanbomber-kf6 clone. - granatier-kf6, oyuncunun yüksekliği her turda azalan bir uçak içinde şehirlere hücum ettiği tek kişilik bir macera oyunudur. - granatier-kf6 - mirrors://kde/stable/release-service/24.12.1/src/granatier-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - mesa-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - knewstuff-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kdoctools-kf6-devel - kcompletion-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/granatier-kf6/pspec.xml - - - granatier-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - knewstuff-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - incidenceeditor-kf6 - https://community.kde.org/KDE_PIM - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:console - desktop.kde6.applications - KDE PIM incidence editor. - KDE PIM incidence editor. - http://download.kde.org/stable/release-service/24.12.1/src/incidenceeditor-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - akonadi-kf6-devel - kcompletion-kf6-devel - kjobwidgets-kf6-devel - kcoreaddons-kf6-devel - kservice-kf6-devel - solid-kf6-devel - kxmlgui-kf6-devel - kitemmodels-kf6-devel - kdoctools-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kunitconversion-kf6-devel - boost-devel - kmime-kf6-devel - kldap-kf6-devel - cyrus-sasl-devel - calendarsupport-kf6-devel - kidentitymanagement-kf6-devel - akonadi-calendar-kf6-devel - kcalendarcore-kf6-devel - kcontacts-kf6-devel - eventviews-kf6-devel - kcalutils-kf6-devel - kdiagram-kf6-devel - kmailtransport-kf6-devel - libkdepim-kf6-devel - akonadi-mime-kf6-devel - akonadi-contacts-kf6-devel - pimcommon-kf6-devel - kimap-kf6-devel - kiconthemes-kf6-devel - - desktop/kde6/applications/incidenceeditor-kf6/pspec.xml - - - incidenceeditor-kf6 - KDE PIM incidence editor. - - kio-kf6 - ki18n-kf6 - kldap-kf6 - kmime-kf6 - kimap-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kdiagram-kf6 - kservice-kf6 - kcalutils-kf6 - kcontacts-kf6 - libkdepim-kf6 - pimcommon-kf6 - eventviews-kf6 - kcompletion-kf6 - kguiaddons-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - kpimtextedit-kf6 - ktextwidgets-kf6 - akonadi-mime-kf6 - kcalendarcore-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - kwidgetsaddons-kf6 - calendarsupport-kf6 - akonadi-contacts-kf6 - akonadi-calendar-kf6 - kidentitymanagement-kf6 - qt6-base - - - /etc/xdg - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - /usr/share/locale - - - - incidenceeditor-kf6-devel - Development files for incidenceeditor-kf6. - - incidenceeditor-kf6 - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kwalletmanager-kf6 - https://userbase.kde.org/KDE_Wallet_Manager - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.utils - A wallet management tool - kwalletmanager-kf6 is a tool to manage the passwords on your system. By using the KDE wallet subsystem it not only allows you to keep your own secrets but also to access and manage the passwords of every application that integrates with the wallet. - kwallet-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kwalletmanager-24.12.1.tar.xz - - qt6-base - kdoctools-kf6-devel - cmake - extra-cmake-modules-kf6 - kcoreaddons-kf6-devel - kauth-kf6-devel - kwallet-kf6-devel - kservice-kf6-devel - kcmutils-kf6-devel - kio-kf6-devel - karchive-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kdbusaddons-kf6-devel - mesa-devel - kwindowsystem-kf6-devel - kstatusnotifieritem-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - knotifications-kf6-devel - - desktop/kde6/applications/kwalletmanager-kf6/pspec.xml - - - kwalletmanager-kf6 - - qt6-base - kcmutils-kf6 - kio-kf6 - kauth-kf6 - ki18n-kf6 - kio-kf6 - kjobwidgets-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - karchive-kf6 - kservice-kf6 - kitemviews-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kwindowsystem-kf6 - kstatusnotifieritem-kf6 - - - /etc/dbus-1/system.d/org.kde.kcontrol.kcmkwallet-kf65.conf - /etc/xdg - /usr/lib - /usr/lib/qt6 - /usr/share/doc - /usr/bin - /usr/share - /usr/share/icons - /usr/share/applications - /usr/share/polkit-1/actions/org.kde.kcontrol.kcmkwallet-kf65.policy - /usr/share/dbus-1/system-services/org.kde.kcontrol.kcmkwallet-kf65.service - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kcalutils-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:library - desktop.kde6.applications - The KDE calendar utility library - Calendar utility library for KDE - mirrors://kde/stable/release-service/24.12.1/src/kcalutils-24.12.1.tar.xz - - qt6-base-devel - kcalendarcore-kf6-devel - kidentitymanagement-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - ki18n-kf6-devel - kcodecs-kf6-devel - kidentitymanagement-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kwidgetsaddons-kf6-devel - kdoctools-kf6-devel - kiconthemes-kf6-devel - ktexttemplate-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/kcalutils-kf6/pspec.xml - - - kcalutils-kf6 - - qt6-base - kcalendarcore-kf6 - kidentitymanagement-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kwidgetsaddons-kf6 - ktexttemplate-kf6 - kidentitymanagement-kf6 - - - /etc/xdg - /usr/lib/qt6 - /usr/lib - /usr/share/doc - /usr/share/kcalendar - /usr/share/locale - /usr/share - - - - kcalutils-kf6-devel - Development files for kcalutils-kf6 - - qt6-base-devel - kcalutils-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kbruch-kf6 - https://www.kde.org/applications/education/kbruch/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.edu - Practice calculating with fractions and percentages - Ondalık ve kesirli sayılarla pratik yapın - kbruch-kf6 is a small program to practice calculating with fractions and percentages. Different exercises are provided for this purpose-kf6 and you can use the learning mode to practice with fractions. The program checks the user's input and gives feedback. - kbruch-kf6, ondalık ve kesirli sayılar üzerine işlemleri öğrenmeye ve egzersiz yapmaya yarayan bir uygulamadır. - kbruch-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kbruch-24.12.1.tar.xz - - qt6-base - kdoctools-kf6-devel - kconfig-kf6-devel - kcrash-kf6-devel - ki18n-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/kbruch-kf6/pspec.xml - - - kbruch-kf6 - - qt6-base - kxmlgui-kf6 - kconfig-kf6 - kcrash-kf6 - ki18n-kf6 - libgcc - kwidgetsaddons-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - - - /usr/bin - /usr/share - /usr/share/man/man1 - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kmail-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - KDE mail client - kmail-kf6 is the email component of kontact-kf6, the integrated personal information manager from KDE. - https://download.kde.org/stable/release-service/24.12.1/src/kmail-24.12.1.tar.xz - - gpgme-devel - extra-cmake-modules-kf6 - kbookmarks-kf6-devel - kcmutils-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kguiaddons-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - kitemviews-kf6-devel - kjobwidgets-kf6-devel - knotifications-kf6-devel - knotifyconfig-kf6-devel - kparts-kf6-devel - kservice-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - sonnet-kf6-devel - akonadi-contacts-kf6-devel - akonadi-kf6-devel - akonadi-mime-kf6-devel - akonadi-search-kf6-devel - kcalendarcore-kf6-devel - kcalutils-kf6-devel - kcontacts-kf6-devel - kidentitymanagement-kf6-devel - kldap-kf6-devel - kmailtransport-kf6-devel - kmime-kf6-devel - kpimtextedit-kf6-devel - ktnef-kf6-devel - libgravatar-kf6 - libkleo-kf6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - qt6-base-devel - qt6-webengine-devel - kitemmodels-kf6-devel - kstatusnotifieritem-kf6-devel - kunitconversion-kf6-devel - cyrus-sasl-devel - kontactinterface-kf6-devel - libksieve-kf6-devel - mailcommon-kf6-devel - kimap-kf6-devel - libgravatar-kf6-devel - libkdepim-kf6-devel - syntax-highlighting-kf6-devel - gpgme-qt6-devel - ffmpeg-devel - libXScrnSaver-devel - akonadi-calendar-kf6-devel - akonadi-import-wizard-kf6-devel - qt6-keychain-devel - kuserfeedback-kf6-devel - - desktop/kde6/applications/kmail-kf6/pspec.xml - - - kmail-kf6 - KDE mail client - - kio-kf6 - gpgme - ki18n-kf6 - kmime-kf6 - ktnef-kf6 - kcrash-kf6 - kparts-kf6 - libgcc - sonnet-kf6 - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - libkleo-kf6 - kcalendarcore-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - kcalutils-kf6 - kcontacts-kf6 - libkdepim-kf6 - libksieve-kf6 - pimcommon-kf6 - kbookmarks-kf6 - kguiaddons-kf6 - kitemviews-kf6 - mailcommon-kf6 - messagelib-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - libgravatar-kf6 - akonadi-mime-kf6 - kpimtextedit-kf6 - ktextwidgets-kf6 - knotifyconfig-kf6 - kwindowsystem-kf6 - akonadi-search-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - akonadi-contacts-kf6 - kontactinterface-kf6 - akonadi-calendar-kf6 - kidentitymanagement-kf6 - kmail-account-wizard-kf6 - akonadi-import-wizard-kf6 - qt6-keychain - kstatusnotifieritem-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdegraphics-mobipocket-kf6 - https://www.kde.org/applications/graphics/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - GPL - LGPL - desktop.kde6.applications - A collection of plugins to handle mobipocket files - A library to handle mobipocket files - A collection of plugins to handle mobipocket files - A library to handle mobipocket files - kdegraphics-mobipocket-kf6 - http://download.kde.org/stable/release-service/24.12.1/src/kdegraphics-mobipocket-24.12.1.tar.xz - - extra-cmake-modules-kf6 - kio-kf6-devel - qt6-base-devel - qt6-5compat-devel - - desktop/kde6/applications/kdegraphics-mobipocket-kf6/pspec.xml - - - kdegraphics-mobipocket-kf6 - A collection of plugins to handle mobipocket files - - kio-kf6 - qt6-base - - - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - kdegraphics-mobipocket-kf6-devel - Development headers for kdegraphics-mobipocket-kf6 - - kdegraphics-mobipocket-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - parley-kf6 - http://edu.kde.org/applications/all/parley-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.edu - parley-kf6 is a program to help you memorize things. - Tekrar yapmanıza yardım eden bir uygulama - parley-kf6 is a program to help you memorize things. parley-kf6 supports many language specific features but can be used for other learning tasks just as well. It uses the spaced repetition learning method, also known as flash cards. Creating new vocabulary collections with parley-kf6 is easy, but of course it is even better if you can use some of our premade files. Have a look at the KDE-Files.org page or use the "Download New Collections" feature directly in parley-kf6. - parley-kf6 ile yeni öğrendiğiniz şeyleri belli zaman aralıklarıyla tekrar ederek uzun zamanlı hafızanızda yer etmelerini sağlayabilirsiniz. parley-kf6, flaş kart denilen tekniği kullanır. Dil öğrenimi için özelleşmiş yetenekleri olmasına karşın diğer konularda da kullanıma uygundur. Kartları hazırlamak epey kolay olmakla beraber kde-files.org adresinden ulaşabileceğiniz hazır kart setlerini de kullanabilirsiniz. - parley-kf6 - mirrors://kde/stable/release-service/24.12.1/src/parley-24.12.1.tar.xz - - qt6-base-devel - qt6-svg-devel - qt6-multimedia-devel - qt6-webengine-devel - libxslt-devel - libXrender-devel - libxml2-devel - libkeduvocdocument-kf6-devel - kdoctools-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kcrash-kf6-devel - gettext-devel - ki18n-kf6-devel - kio-kf6-devel - knewstuff-kf6-devel - kcmutils-kf6-devel - kxmlgui-kf6-devel - sonnet-kf6-devel - kservice-kf6-devel - ktextwidgets-kf6-devel - kcompletion-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - knotifications-kf6-devel - extra-cmake-modules-kf6 - ffmpeg-devel - libXScrnSaver-devel - - desktop/kde6/applications/parley-kf6/pspec.xml - - - parley-kf6 - - qt6-base - qt6-svg - qt6-multimedia - qt6-webengine - libxslt - libXrender - libxml2 - libkeduvocdocument-kf6 - kdoctools-kf6 - kcoreaddons-kf6 - kconfig-kf6 - kcrash-kf6 - gettext - ki18n-kf6 - kio-kf6 - knewstuff-kf6 - kcmutils-kf6 - kxmlgui-kf6 - knotifications-kf6 - sonnet-kf6 - kservice-kf6 - libgcc - ktextwidgets-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/lib - /usr/share/doc - /usr/bin - /usr/share - /etc/xdg - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - grantleetheme-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.applications - Library for Grantlee theming support - Library for Grantlee theming support - mirrors://kde/stable/release-service/24.12.1/src/grantleetheme-24.12.1.tar.xz - - qt6-base-devel - boost-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - extra-cmake-modules-kf6 - kguiaddons-kf6-devel - knewstuff-kf6-devel - kcolorscheme-kf6-devel - ktexttemplate-kf6-devel - - desktop/kde6/applications/grantleetheme-kf6/pspec.xml - - - grantleetheme-kf6 - - qt6-base - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - knewstuff-kf6 - kguiaddons-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kwidgetsaddons-kf6 - kcolorscheme-kf6 - ktexttemplate-kf6 - - - /etc/xdg - /usr/lib - /usr/share/doc - /usr/mkspecs/ - /usr/bin - /usr/share/mime - /usr/share/icons - /usr/share/kservice-kf6s5 - /usr/share/kservice-kf6types5 - /usr/share/dbus-1 - /usr/share/config.kcfg - /usr/share/kf5 - /usr/share/config - /usr/share/akonadi - /usr/share - /usr/share/akonadicontact/grantleetheme/default - /usr/share/locale - - - - grantleetheme-kf6-devel - Development package for grantleetheme-kf6 libraries - Contains development tools and header files for grantleetheme-kf6 - - qt6-base-devel - boost-devel - ki18n-kf6-devel - ktexttemplate-kf6-devel - grantleetheme-kf6 - - - /usr/lib/cmake - /usr/include - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - grantlee-editor-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - Editor for Grantlee themes - Editor for Grantlee themes - mirrors://kde/stable/release-service/24.12.1/src/grantlee-editor-24.12.1.tar.xz - - qt6-webengine-devel - kcrash-kf6-devel - extra-cmake-modules-kf6 - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kxmlgui-kf6-devel - qt6-base-devel - ktexteditor-kf6-devel - kwallet-kf6-devel - knewstuff-kf6-devel - karchive-kf6-devel - pimcommon-kf6-devel - messagelib-kf6-devel - grantleetheme-kf6-devel - akonadi-mime-kf6-devel - kpimtextedit-kf6-devel - libkdepim-kf6-devel - syntax-highlighting-kf6-devel - libkleo-kf6-devel - kparts-kf6-devel - gpgme-devel - gpgme-qt6-devel - cyrus-sasl-devel - akonadi-kf6-devel - kitemmodels-kf6-devel - kcontacts-kf6-devel - akonadi-contacts-kf6-devel - kimap-kf6-devel - kmime-kf6-devel - ffmpeg-devel - libXScrnSaver-devel - - desktop/kde6/applications/grantlee-editor-kf6/pspec.xml - - - grantlee-editor-kf6 - Editor for Grantlee themes - - kio-kf6 - ki18n-kf6 - kmime-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - karchive-kf6 - qt6-base - kcontacts-kf6 - knewstuff-kf6 - pimcommon-kf6 - messagelib-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kpimtextedit-kf6 - qt6-webengine - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - akonadi-contacts-kf6 - syntax-highlighting-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - granatier-kf6 - https://www.kde.org/applications/games/granatier/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - A bomber-kf6man game - Bombalama macera oyunu - granatier-kf6 is a clone of the classic bomber-kf6man game, inspired by the work of the Clanbomber-kf6 clone. - granatier-kf6, oyuncunun yüksekliği her turda azalan bir uçak içinde şehirlere hücum ettiği tek kişilik bir macera oyunudur. - granatier-kf6 - mirrors://kde/stable/release-service/24.12.1/src/granatier-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - mesa-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - knewstuff-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kdoctools-kf6-devel - kcompletion-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/grantlee-editor-kf6/granatier-kf6/pspec.xml - - - granatier-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - knewstuff-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kcompletion-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libkcompactdisc-kf6 - https://www.kde.org/applications/multimedia/ - - Stefan Gronewold - groni@pisilinux.org - - GPL - LGPL - FDL - library - desktop.kde6.applications - A library for interfacing with CDs - A library for interfacing with CDs - mirrors://kde/stable/release-service/24.12.1/src/libkcompactdisc-24.12.1.tar.xz - - alsa-lib-devel - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - qt6-base-devel - solid-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - qt6-phonon-devel - - desktop/kde6/applications/libkcompactdisc-kf6/pspec.xml - - - libkcompactdisc-kf6 - A library for interfacing with CDs - - alsa-lib - kcoreaddons-kf6 - ki18n-kf6 - qt6-base - libgcc - qt6-phonon - solid-kf6 - - - /usr/lib - /usr/lib/qt6 - /usr/share/doc - /usr/share/locale - - - - libkcompactdisc-kf6-devel - Development files for libkcompactdisc-kf6 - - libkcompactdisc-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - minuet-kf6 - https://minuet-kf6.kde.org - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app:gui - desktop.kde6.applications - A KDE Software for Music Education - Music education Free Software, thoughtfully designed to push your musical skills to the next level. Enhance your ability to recognize intervals, chords, rhythm, and scales while enjoying all the power of Free Software. - https://download.kde.org/stable/release-service/24.12.1/src/minuet-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-svg-devel - qt6-base-devel - qt6-declarative-devel - ki18n-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - kcrash-kf6-devel - kdoctools-kf6-devel - alsa-lib-devel - drumstick-devel - fluidsynth-devel - - desktop/kde6/applications/minuet-kf6/pspec.xml - - - minuet-kf6 - A KDE Software for Music Education - - kio-kf6 - ki18n-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - alsa-lib - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - drumstick-libs - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - fluidsynth - qt6-svg - qt6-declarative - - - /usr/bin - /usr/share - /usr/share/appdata - /usr/share/applications - /usr/share/doc - /usr/share/icons - /usr/share/kxmlgui-kf65 - /usr/share/minuet-kf6 - /usr/lib - - - - minuet-kf6-devel - Development files for minuet-kf6 - - qt6-base-devel - minuet-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - bovo-kf6 - https://www.kde.org/applications/games/bovo/ - - Alihan Öztürk - alihan@pisilinux.org - - GPLv3 - app:gui - desktop.kde.games - A Gomoku like game for two players. - bovo-kf6 is a Gomoku like game for two players, where the opponents alternate in placing their respective pictogram on the game board. - bovo-kf6 - mirrors://kde/stable/release-service/24.12.1/src/bovo-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - mesa-devel - qt6-svg-devel - kxmlgui-kf6-devel - kdoctools-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - - desktop/kde6/applications/bovo-kf6/pspec.xml - - - bovo-kf6 - - ki18n-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/share - /usr/share/appdata - /usr/share/icons - /usr/share/kxmlgui-kf65 - /usr/share/applications - /usr/share/bovo-kf6 - /usr/share/doc - - - org.kde.bovo.desktop - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libkleo-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - library - desktop.kde6.applications - KDE PIM cryptographic library - KDE PIM cryptographic library - mirrors://kde/stable/release-service/24.12.1/src/libkleo-24.12.1.tar.xz - - qt6-base-devel - boost-devel - gpgme-qt6-devel - qt6-sql-sqlite - qt6-sql-mysql - qt6-sql-odbc - qt6-sql-postgresql - prison-kf6-devel - qt6-phonon-devel - libical-devel - libgpg-error-devel - libxslt-devel - openldap-client - cyrus-sasl-devel - kitemviews-kf6-devel - kio-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - extra-cmake-modules-kf6 - kpimtextedit-kf6-devel - - desktop/kde6/applications/libkleo-kf6/pspec.xml - - - libkleo-kf6 - - qt6-base - kio-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - kxmlgui-kf6 - kcalendarcore-kf6 - kcontacts-kf6 - kconfig-kf6 - libxml2 - kservice-kf6 - kguiaddons-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-phonon - prison-kf6 - gpgme - gpgme-qt6 - kpimtextedit-kf6 - kwindowsystem-kf6 - cyrus-sasl - - - /etc/xdg - /usr/lib - /usr/share/doc - /usr/mkspecs/ - /usr/bin - /usr/share/mime - /usr/share/icons - /usr/share/kservice-kf6s5 - /usr/share/kservice-kf6types5 - /usr/share/dbus-1 - /usr/share/config.kcfg - /usr/share/kf5 - /usr/share/config - /usr/share/akonadi - /usr/share/akonadicontact/grantleetheme/default - /usr/share/libkleopatra - /usr/share/KPim6Libkleo - /usr/share/locale - /usr/share/qlogging-categories6/libkleo.renamecategories - /usr/share/qlogging-categories6/libkleo.categories - - - - libkleo-kf6-devel - Development package for libkleo-kf6 libraries - Contains development tools and header files for libkleo-kf6 - - qt6-base-devel - boost-devel - gpgme-devel - gpgme-qt6-devel - libkleo-kf6 - - - /usr/lib/cmake - /usr/include - /usr/lib/gpgmepp - /usr/share/kde4/apps/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kpmcore-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde6.applications - Library for managing partitions. - Library for managing partitions. - mirrors://kde/stable/release-service/24.12.1/src/kpmcore-24.12.1.tar.xz - - ntfs-3g - udftools - ntfsprogs - fatresize - dosfstools - reiserfsprogs - smartmontools - xfsprogs-devel - qt6-base-devel - libatasmart-devel - extra-cmake-modules-kf6 - parted-devel - libutil-linux-devel - ki18n-kf6-devel - kio-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - kiconthemes-kf6-devel - kjobwidgets-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kdoctools-kf6-devel - kwidgetsaddons-kf6-devel - qca2-qt6-devel - polkit-devel - elogind-devel - polkit-qt6-devel - jfsutils - exfatprogs - f2fs-tools - nilfs-utils-devel - e2fsprogs-devel - - desktop/kde6/applications/kpmcore-kf6/pspec.xml - - - kpmcore-kf6 - - kio-kf6 - ki18n-kf6 - kauth-kf6 - ntfs-3g - qca2-qt6 - fatresize - udftools - fatresize - ntfsprogs - dosfstools - reiserfsprogs - smartmontools - xfsprogs - kwidgetsaddons-kf6 - libgcc - parted - kservice-kf6 - qt6-base - kcoreaddons-kf6 - kiconthemes-kf6 - libatasmart - libutil-linux - polkit-qt6 - jfsutils - exfatprogs - f2fs-tools - nilfs-utils - e2fsprogs - - - /usr/bin - /usr/share - /usr/lib - /usr/lib/qt6 - /usr/share/doc - - - - kpmcore-kf6-devel - Development files for kpmcore-kf6 - - kpmcore-kf6 - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - lokalize-kf6 - http://www.kde.org/ - - Pisi Linux Admins - admin@pisilinux.org - - GPLv2 - app:gui - desktop.kde.sdk - lokalize-kf6 is the localization tool for KDE and other open source software - Uygulama yerelleştirme yardımcısı. - lokalize-kf6 is also a general computer-aided translation system (CAT) with which you can translate OpenDocument files (*.odt). - lokalize-kf6, uygulamalar için kolaylıkla yerelleştirme yapabileceğiniz bir programdır. - mirrors://kde/stable/release-service/24.12.1/src/lokalize-24.12.1.tar.xz - - qt6-base-devel - hunspell-devel - kdoctools-devel - kio-devel - enchant-devel - kitemviews-devel - ki18n-devel - kparts-devel - sonnet-devel - kconfig-devel - kxmlgui-devel - kcompletion-devel - kcoreaddons-devel - kdbusaddons-devel - ktextwidgets-devel - kconfigwidgets-devel - knotifications-devel - kwidgetsaddons-devel - pkgconfig - qt6-sql-postgresql - qt6-sql-mysql - qt6-sql-sqlite - qt6-sql-odbc - extra-cmake-modules - - desktop/kde6/applications/lokalize-kf6/pspec.xml - - - lokalize-kf6 - - qt6-base - kio-kf6 - kitemviews-kf6 - ki18n-kf6 - kparts-kf6 - libgcc - sonnet-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - ktextwidgets-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - hunspell - - - /etc/xdg - /usr/share - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-13 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kiriki-kf6 - https://www.kde.org/applications/games/kiriki/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Yahtzee like dice game - Yahtzee benzeri zar oyunu - kiriki-kf6 is an addictive and fun dice game for KDE, designed to be played by as many as six players. - kiriki-kf6 KDE için alışkanlık yapan ve eğlenceli bir zar oyunudur. Altı oyuncuya kadar birlikte oynanabilir. - kiriki-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kiriki-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/kiriki-kf6/pspec.xml - - - kiriki-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kbounce-kf6 - https://www.kde.org/applications/games/kbounce/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Ball bouncing game - Top zıplatma oyunu - kbounce-kf6 is a single player arcade game with the elements of puzzle. It is played on a field, surrounded by walls, with two or more balls that move about in the field bouncing off of walls. The player can build new walls, decreasing the size of the active field. The goal of the game is to fill at least 75% of the field and advance to the next level. - kbounce-kf6, Volfied'in oynaniş tarzına benzeyen tek kişilik bir bulmaca - macera oyunudur. Oyuncu iki veya daha fazla topun oradan oraya zıpladığı duvarlarla kaplı bir alanda yeni duvarlar inşa ederek ve toplara yakalanmamaya çalışarak aktif alanın en azından %75'ini kapatmaya çalışmaktadır. - kbounce-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kbounce-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kwidgetsaddons-kf6-devel - kdbusaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kiconthemes-kf6-devel - kcompletion-kf6-devel - ktextwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/kbounce-kf6/pspec.xml - - - kbounce-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kaddressbook-kf6 - https://kontact-kf6.kde.org/ - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - KDE contact manager - Kişilerinizi kolayca yönetin - kaddressbook-kf6 reborn to make your data available to all your applications - kaddressbook-kf6, kişilerinizi kolayca yönetmenizi sağlar. Bir e-posta gönderirken veya bir toplantı daveti oluştururken kolayca kişileri seçmenize olanak tanıyan kontact-kf6'ın geri kalanıyla derinlemesine entegre edilmiştir. - mirrors://kde/stable/release-service/24.12.1/src/kaddressbook-24.12.1.tar.xz - - kimap-kf6-devel - kparts-kf6-devel - kcrash-kf6-devel - prison-kf6-devel - akonadi-kf6-devel - libkleo-kf6-devel - kcmutils-kf6-devel - qt6-base-devel - libkdepim-kf6-devel - pimcommon-kf6-devel - kldap-kf6-devel - kdoctools-kf6-devel - mailcommon-kf6-devel - messagelib-kf6-devel - kdbusaddons-kf6-devel - cyrus-sasl-devel - kitemmodels-kf6-devel - akonadi-mime-kf6-devel - kpimtextedit-kf6-devel - grantleetheme-kf6-devel - extra-cmake-modules-kf6 - akonadi-search-kf6-devel - kunitconversion-kf6-devel - kontactinterface-kf6-devel - akonadi-contacts-kf6-devel - kidentitymanagement-kf6-devel - kuserfeedback-kf6-devel - gpgme-devel - gpgme-qt6-devel - - desktop/kde6/applications/kaddressbook-kf6/pspec.xml - - - kaddressbook-kf6 - KDE contact manager - - ki18n-kf6 - kcrash-kf6 - kparts-kf6 - libgcc - akonadi-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcmutils-kf6 - qt6-base - kldap-kf6 - kcontacts-kf6 - libkdepim-kf6 - pimcommon-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - grantleetheme-kf6 - akonadi-search-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - akonadi-contacts-kf6 - kontactinterface-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - kaddressbook-kf6-devel - Development files for kaddressbook-kf6 - - kaddressbook-kf6 - - - /usr/include - /usr/lib/pkgconfig - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kamera-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde.graphics - Webcam support for KDE - KDE için web kamera-kf6 desteği - kamera-kf6 is a plugin for KDE to use webcam. - kamera-kf6, KDE için bir web kamera-kf6 eklentisidir. - mirrors://kde/stable/release-service/24.12.1/src/kamera-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-5compat-devel - kconfigwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcmutils-kf6-devel - kdoctools-kf6-devel - libgphoto2-devel - - desktop/kde6/applications/kamera-kf6/pspec.xml - - - kamera-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - kcmutils-kf6 - qt6-base - libgphoto2 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/lib - /usr/share/doc - /usr/share - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - korganizer-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - Calendar and scheduling Program - korganizer-kf6 is the calendar and scheduling component of kontact-kf6, the integrated personal information manager from KDE. - https://download.kde.org/stable/release-service/24.12.1/src/korganizer-24.12.1.tar.xz - - gpgme-devel - extra-cmake-modules-kf6 - kcmutils-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - prison-kf6-devel - akonadi-kf6-devel - akonadi-search-kf6-devel - grantleetheme-kf6-devel - kpimtextedit-kf6-devel - libkdepim-kf6-devel - libkleo-kf6-devel - pimcommon-kf6-devel - qt6-base-devel - kitemmodels-kf6-devel - akonadi-mime-kf6-devel - kunitconversion-kf6-devel - knewstuff-kf6-devel - akonadi-contacts-kf6-devel - kidentitymanagement-kf6-devel - kmailtransport-kf6-devel - cyrus-sasl-devel - kcalutils-kf6-devel - kholidays-kf6-devel - kldap-kf6-devel - akonadi-calendar-kf6-devel - kontactinterface-kf6-devel - mailcommon-kf6-devel - messagelib-kf6-devel - kimap-kf6-devel - incidenceeditor-kf6-devel - eventviews-kf6-devel - calendarsupport-kf6-devel - kparts-kf6-devel - kuserfeedback-kf6-devel - knotifications-kf6-devel - qt6-phonon-devel - - desktop/kde6/applications/korganizer-kf6/pspec.xml - - - korganizer-kf6 - Calendar and scheduling Program - - kio-kf6 - ki18n-kf6 - kmime-kf6 - kcrash-kf6 - kparts-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcalendarcore-kf6 - kcmutils-kf6 - kservice-kf6 - qt6-base - kcalutils-kf6 - kcontacts-kf6 - kholidays-kf6 - knewstuff-kf6 - libkdepim-kf6 - pimcommon-kf6 - eventviews-kf6 - kitemviews-kf6 - mailcommon-kf6 - qt6-phonon - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - akonadi-mime-kf6 - kpimtextedit-kf6 - kwindowsystem-kf6 - akonadi-search-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - calendarsupport-kf6 - incidenceeditor-kf6 - akonadi-calendar-kf6 - akonadi-contacts-kf6 - kontactinterface-kf6 - kidentitymanagement-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - baloo-widgets-kf6 - https://www.kde.org - - Yusuf Aydemir - yusuf.aydemir@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.applications - Framework for searching and managing metadata - Baloo is a framework for searching and managing metada - mirrors://kde/stable/release-service/24.12.1/src/baloo-widgets-24.12.1.tar.xz - - baloo-kf6-devel - extra-cmake-modules-kf6 - kconfig-kf6-devel - kdoctools-kf6-devel - kfilemetadata-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - qt6-base-devel - - desktop/kde6/applications/baloo-widgets-kf6/pspec.xml - - - baloo-widgets-kf6 - Development files for baloo-widgets-kf6 - - baloo-kf6 - kconfig-kf6 - kcoreaddons-kf6 - kfilemetadata-kf6 - ki18n-kf6 - kio-kf6 - kwidgetsaddons-kf6 - libgcc - qt6-base - - - /etc - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - /usr/share/locale - - - - baloo-widgets-kf6-devel - Development files for baloo-widgets-kf6 - - baloo-widgets-kf6 - qt6-base-devel - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kpat-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.games - Patience card game - To play kpat-kf6ience you need, as the name suggests, patience. For simple games, where the way the game goes depends only upon how the cards fall, your patience might be the only thing you need. - mirrors://kde/stable/release-service/24.12.1/src/kpat-24.12.1.tar.xz - - qt6-base-devel - qt6-declarative-devel - qt6-phonon-devel - kdoctools-kf6-devel - cmake - gettext-devel - kio-kf6-devel - kpackage-kf6-devel - kitemviews-kf6-devel - kunitconversion-kf6-devel - kiconthemes-kf6-devel - ktextwidgets-kf6-devel - kitemmodels-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - kdeclarative-kf6-devel - knewstuff-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - qt6-svg-devel - kguiaddons-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - shared-mime-info - extra-cmake-modules-kf6 - python3 - mesa-devel - black-hole-solver-devel - freecell-solver-devel - - desktop/kde6/applications/kpat-kf6/pspec.xml - - - kpat-kf6 - - qt6-base - libkdegames-kf6 - knewstuff-kf6 - ki18n-kf6 - kio-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - freecell-solver - black-hole-solver - - - /etc/xdg - /usr/share - /usr/bin - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libkdepim-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.applications - Libraries for KDE PIM applications - Libraries for KDE PIM applications - mirrors://kde/stable/release-service/24.12.1/src/libkdepim-24.12.1.tar.xz - - qt6-base-devel - qt6-designer-devel - kdoctools-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kxmlgui-kf6-devel - akonadi-kf6-devel - kjobwidgets-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - solid-kf6-devel - cmake - extra-cmake-modules-kf6 - boost-devel - kmime-kf6-devel - kcmutils-kf6-devel - kldap-kf6-devel - kio-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - cyrus-sasl-devel - kcontacts-kf6-devel - akonadi-contacts-kf6-devel - akonadi-search-kf6-devel - akonadi-mime-kf6-devel - - desktop/kde6/applications/libkdepim-kf6/pspec.xml - - - libkdepim-kf6 - - kio-kf6 - ki18n-kf6 - kldap-kf6 - libgcc - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kwallet-kf6 - kcmutils-kf6 - qt6-base - qt6-designer - kcontacts-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kjobwidgets-kf6 - akonadi-search-kf6 - akonadi-contacts-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/lib - /usr/bin - /usr/share - /usr/share/icons - /etc - - - - libkdepim-kf6-devel - Development files for libkdepim-kf6 - - libkdepim-kf6 - qt6-base-devel - qt6-designer-devel - kxmlgui-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kservice-kf6-devel - kcoreaddons-kf6-devel - - - /usr/include - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - pim-sieve-editor-kf6 - https://community.kde.org/KDE_PIM - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - Mail sieve editor - Mail sieve editor - https://download.kde.org/stable/release-service/24.12.1/src/pim-sieve-editor-24.12.1.tar.xz - - extra-cmake-modules-kf6 - kbookmarks-kf6-devel - kcrash-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kmailtransport-kf6-devel - kpimtextedit-kf6-devel - messagelib-kf6-devel - pimcommon-kf6-devel - qt6-base-devel - akonadi-mime-kf6-devel - akonadi-kf6-devel - kitemmodels-kf6-devel - kmime-kf6-devel - cyrus-sasl-devel - kcontacts-kf6-devel - akonadi-contacts-kf6-devel - kimap-kf6-devel - libksieve-kf6-devel - ffmpeg-devel - kuserfeedback-kf6-devel - libXScrnSaver-devel - qt6-keychain-devel - - desktop/kde6/applications/pim-sieve-editor-kf6/pspec.xml - - - pim-sieve-editor-kf6 - Mail sieve editor - - ki18n-kf6 - kcrash-kf6 - libgcc - kconfig-kf6 - kwallet-kf6 - kxmlgui-kf6 - qt6-base - libksieve-kf6 - pimcommon-kf6 - kbookmarks-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - qt6-keychain - - - /etc/xdg - /usr/bin - /usr/lib - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - libkgapi-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:library - desktop.kde6.applications - Google API library for KDE - A KDE-based library for accessing various Google services via their public API - https://download.kde.org/stable/release-service/24.12.1/src/libkgapi-24.12.1.tar.xz - - qt6-base-devel - kcoreaddons-kf6-devel - libical-devel - gettext-devel - extra-cmake-modules-kf6 - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kcontacts-kf6-devel - kwindowsystem-kf6-devel - kio-kf6-devel - kcalendarcore-kf6-devel - kdoctools-kf6-devel - qt6-linguist - qt6-webengine-devel - ffmpeg-devel - libXScrnSaver-devel - cyrus-sasl-devel - kwallet-kf6-devel - - desktop/kde6/applications/libkgapi-kf6/pspec.xml - - - libkgapi-kf6 - - qt6-base - kcalendarcore-kf6 - kcontacts-kf6 - kio-kf6 - libgcc - kwallet-kf6 - kwindowsystem-kf6 - qt6-webengine - - - /etc/xdg - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - libkgapi-kf6-devel - Development files for libkgapi-kf6 - - qt6-base-devel - kcalendarcore-kf6-devel - kcontacts-kf6-devel - kio-kf6-devel - kwindowsystem-kf6-devel - libkgapi-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - mimetreeparser - https://kontact.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - LGPLv2 - app - desktop.kde6.applications - Parser for MIME trees - Parser for MIME trees - Parser for MIME trees - Parser for MIME trees - mimetreeparser - https://download.kde.org/stable/release-service/24.12.1/src/mimetreeparser-24.12.1.tar.xz - - gpgme-devel - qt6-base-devel - gpgme-qt6-devel - ki18n-kf6-devel - kmbox-kf6-devel - kmime-kf6-devel - libkleo-kf6-devel - kcodecs-kf6-devel - qt6-declarative-devel - kcalendarcore-kf6-devel - kwidgetsaddons-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/mimetreeparser/pspec.xml - - - mimetreeparser - - gpgme - qt6-base - gpgme-qt6 - ki18n-kf6 - kmbox-kf6 - kmime-kf6 - libkleo-kf6 - kcodecs-kf6 - qt6-declarative - kcalendarcore-kf6 - kwidgetsaddons-kf6 - - - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - - mimetreeparser-devel - Development files for mimetreeparser - - kmbox-kf6-devel - mimetreeparser - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-05 - 24.02.0 - First release - PisiLinux Community - admins@pisilinux.org - - - - - - kcron-kf6 - https://www.kde.org - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde6.applications - Graphical task scheduler - Görev zamanlayıcı arayüzü. - kcron-kf6 is a graphical frontend to the cron system, used to schedule regular tasks on a Unix system. - kcron-kf6, cron görev zamanlayıcı altyapısının bir arayüzüdür. - kcron-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kcron-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - ki18n-kf6-devel - kdoctools-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kcmutils-kf6-devel - kxmlgui-kf6-devel - kiconthemes-kf6-devel - kirigami-addons-kf6 - - desktop/kde6/applications/kcron-kf6/pspec.xml - - - kcron-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - kcmutils-kf6 - qt6-base - kcoreaddons-kf6 - kiconthemes-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kirigami-addons-kf6 - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - - - kdeadmin - - - kdeadmin - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kitinerary-kf6 - https://download.kde.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - library - desktop.kde6.applications - Data model and extraction system for travel reservation information - Data model and extraction system for travel reservation information - Seyahat rezervasyon bilgisi için veri modeli ve ekstraksiyon sistemi - Seyahat rezervasyon bilgisi için veri modeli ve ekstraksiyon sistemi - https://download.kde.org/stable/release-service/24.12.1/src/kitinerary-24.12.1.tar.xz - - qt6-declarative-devel - qt6-base-devel - kcoreaddons-kf6-devel - poppler-cpp-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - libxml2-devel - kpkpass-kf6-devel - poppler-qt6-devel - ki18n-kf6-devel - kmime-kf6-devel - zlib-devel - kconfig-kf6-devel - kcodecs-kf6-devel - karchive-kf6-devel - extra-cmake-modules-kf6 - openssl-devel - zxing-cpp-devel - - desktop/kde6/applications/kitinerary-kf6/pspec.xml - - - kitinerary-kf6 - - zlib - ki18n-kf6 - kmime-kf6 - libgcc - kpkpass-kf6 - kcodecs-kf6 - poppler-qt6 - kcalendarcore-kf6 - kconfig-kf6 - kcontacts-kf6 - karchive-kf6 - libxml2 - openssl - zxing-cpp - qt6-base - qt6-declarative - - - /etc/xdg - /usr/lib - /usr/share - /usr/share/locale - /usr/share/doc - - - - kitinerary-kf6-devel - Development files for kitinerary-kf6 - - kitinerary-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdialog-kf6 - https://github.com/KDE/kdialog-kf6 - - Stefan Gronewold - groni@pisilinux.org - - GPLv2 - desktop.kde6.applications - kdialog-kf6 allows you to display dialog boxes from shell scripts - The syntax is very much inspired from the "dialog" command - (which shows text mode dialogs). - kdialog-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kdialog-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - kio-kf6-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - libICE-devel - libX11-devel - libXext-devel - python-devel - kdbusaddons-kf6-devel - kguiaddons-kf6-devel - kiconthemes-kf6-devel - knotifications-kf6-devel - ktextwidgets-kf6-devel - qt6-base-devel - - desktop/kde6/applications/kdialog-kf6/pspec.xml - - - kdialog-kf6 - kdialog-kf6 allows you to display dialog boxes from shell scripts - - kio-kf6 - qt6-base - ki18n-kf6 - libX11 - libgcc - kconfig-kf6 - kguiaddons-kf6 - kdbusaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - - - /usr/bin - /usr/share - /usr/share/doc - - - kde-baseapps - - - kde-baseapps - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ktnef-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:console - desktop.kde6.applications - API for handling TNEF data - The API permits access to the actual attachments, the message properties (TNEF/MAPI), and allows one to view/extract message formatted text in Rich Text Format format. - mirrors://kde/stable/release-service/24.12.1/src/ktnef-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kcalendarcore-kf6-devel - kcalutils-kf6-devel - kcontacts-kf6-devel - - desktop/kde6/applications/ktnef-kf6/pspec.xml - - - ktnef-kf6 - - qt6-base - kcalutils-kf6 - ki18n-kf6 - libgcc - kcalendarcore-kf6 - kcontacts-kf6 - - - /usr/lib/qt6 - /usr/lib - /usr/share - /usr/share/doc - /usr/share/locale - - - - ktnef-kf6-devel - Development files for ktnef-kf6 - - qt6-base-devel - ktnef-kf6 - - - /etc/xdg - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kaccounts-providers-kf6 - https://projects.kde.org/projects/playground/base/kde-accounts/kaccounts-providers-kf6 - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - app - desktop.kde6.network - Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - mirrors://kde/stable/release-service/24.12.1/src/kaccounts-providers-24.12.1.tar.xz - - extra-cmake-modules-kf6 - intltool - kaccounts-integration-kf6-devel - qt6-declarative-devel - qt6-webengine-devel - qt6-base-devel - kcoreaddons-kf6-devel - libaccounts-qt6-devel - libaccounts-glib-devel - kio-kf6-devel - ki18n-kf6-devel - kdeclarative-kf6-devel - kpackage-kf6-devel - signond-devel - signond-qt6-devel - qcoro-qt6-devel - - desktop/kde6/applications/kaccounts-providers-kf6/pspec.xml - - - kaccounts-providers-kf6 - Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - - kaccounts-integration-kf6 - libaccounts-glib - libgcc - kio-kf6 - ki18n-kf6 - kpackage-kf6 - kcoreaddons-kf6 - kdeclarative-kf6 - signond-qt6 - qcoro-qt6 - qt6-declarative - qt6-webengine - qt6-base - - - /etc - /usr/share - /usr/lib/qt6 - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - signon-kwallet-extension-kf6 - http://kde.org - - Alihan Öztürk - alihan@pisilinux.org - - LGPLv2 - app - desktop.kde6.network - kwallet-kf6 signon extension - kwallet-kf6 signon extension - mirrors://kde/stable/release-service/24.12.1/src/signon-kwallet-extension-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kwallet-kf6-devel - signond-devel - - desktop/kde6/applications/signon-kwallet-extension-kf6/pspec.xml - - - signon-kwallet-extension-kf6 - kwallet-kf6 signon extension - - libgcc - signond - kwallet-kf6 - qt6-base - - - /usr/lib/signon - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - dragonplayer-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.multimedia - Multimedia player - a multimedia player where the focus is on simplicity, instead of features. - mirrors://kde/stable/release-service/24.12.1/src/dragon-24.12.1.tar.xz - - qt6-base-devel - qt6-phonon-devel - kdoctools-kf6-devel - kio-kf6-devel - kcrash-kf6-devel - kparts-kf6-devel - docbook-xsl - kdbusaddons-kf6-devel - knotifications-kf6-devel - extra-cmake-modules-kf6 - - desktop/kde6/applications/dragonplayer-kf6/pspec.xml - - - dragonplayer-kf6 - - qt6-base - qt6-phonon - kio-kf6 - ki18n-kf6 - solid-kf6 - libgcc - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - qt6-phonon - kcoreaddons-kf6 - kdbusaddons-kf6 - kjobwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kparts-kf6 - - - /etc/xdg - /usr/share - /usr/bin - /usr/lib/qt6 - /usr/lib - /usr/share/doc - /usr/share/man/man1 - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kshisen-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde.games - Shisen-Sho Mahjongg like tile game - Shisen-Sho is a solitaire-like game played using the standard set of Mahjong tiles. Unlike Mahjong however, Shisen-Sho has only one layer of scrambled tiles. - mirrors://kde/stable/release-service/24.12.1/src/kshisen-24.12.1.tar.xz - - qt6-base-devel - qt6-declarative-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - ki18n-kf6-devel - kconfig-kf6-devel - kcompletion-kf6-devel - kconfigwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kcoreaddons-kf6-devel - kcoreaddons-kf6-devel - kdbusaddons-kf6-devel - libkdegames-kf6-devel - libkmahjongg-kf6-devel - knewstuff-kf6-devel - kdnssd-kf6-devel - kdeclarative-kf6-devel - kio-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/kshisen-kf6/pspec.xml - - - kshisen-kf6 - - qt6-base - qt6-declarative - libgcc - ki18n-kf6 - kconfig-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kxmlgui-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - libkmahjongg-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ksquares-kf6 - https://www.kde.org/applications/games/ksquares/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Connect the dots to create squares - Noktaları birleştirerek kare yapma oyunu - ksquares-kf6 is a fun and exciting game that modeled after the well known pen and paper based game of Dots and Boxes. - ksquares-kf6 sıkıcı derslerin kurtarıcısı, eğlenceli ve heyecanlı kare yapma oyununun KDE sürümüdür. - ksquares-kf6 - mirrors://kde/stable/release-service/24.12.1/src/ksquares-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kwidgetsaddons-kf6-devel - ki18n-kf6-devel - kguiaddons-kf6-devel - kconfigwidgets-kf6-devel - kitemviews-kf6-devel - kiconthemes-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - - desktop/kde6/applications/ksquares-kf6/pspec.xml - - - ksquares-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-base - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - mailcommon-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:library - desktop.kde6.applications - KDE PIM library providing support for mail applications - KDE PIM library providing support for mail applications - mirrors://kde/stable/release-service/24.12.1/src/mailcommon-24.12.1.tar.xz - - qt6-base-devel - qt6-phonon-devel - extra-cmake-modules-kf6 - boost-devel - glibc-devel - libical-devel - gettext-devel - qt6-designer-devel - kdoctools-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - mailimporter-kf6-devel - messagelib-kf6-devel - libgravatar-kf6-devel - kidentitymanagement-kf6-devel - kmailtransport-kf6-devel - kmbox-kf6-devel - akonadi-kf6-devel - kjobwidgets-kf6-devel - solid-kf6-devel - kitemmodels-kf6-devel - kcompletion-kf6-devel - kiconthemes-kf6-devel - kunitconversion-kf6-devel - kmime-kf6-devel - kcontacts-kf6-devel - kcalendarcore-kf6-devel - kpimtextedit-kf6-devel - kimap-kf6-devel - kldap-kf6-devel - grantleetheme-kf6-devel - pimcommon-kf6-devel - libkleo-kf6-devel - libkdepim-kf6-devel - gpgme-devel - gpgme-qt6-devel - akonadi-mime-kf6-devel - akonadi-contacts-kf6-devel - openldap-client - cyrus-sasl-devel - syntax-highlighting-kf6-devel - karchive-kf6-devel - kguiaddons-kf6-devel - qt6-webengine-devel - - desktop/kde6/applications/mailcommon-kf6/pspec.xml - - - mailcommon-kf6 - - qt6-base - qt6-webengine - akonadi-contacts-kf6 - libgcc - libkdepim-kf6 - akonadi-mime-kf6 - mailimporter-kf6 - kio-kf6 - ki18n-kf6 - kmime-kf6 - akonadi-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - karchive-kf6 - kcontacts-kf6 - pimcommon-kf6 - kitemviews-kf6 - messagelib-kf6 - qt6-phonon - kguiaddons-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kitemmodels-kf6 - kpimtextedit-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - kmailtransport-kf6 - kwidgetsaddons-kf6 - kidentitymanagement-kf6 - - - /etc - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - mailcommon-kf6-devel - Development files for mailcommon-kf6 - - qt6-webengine-devel - mailcommon-kf6 - - - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdenlive-kf6 - https://kdenlive-kf6.org/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.multimedia - A video editing GUI for KDE using the MLT video framework - MLT video yapısı kullanan, KDE için bir video düzenleme uygulaması - Nieliniowy edytor wideo - kdenlive-kf6 est multi-piste, gère une liste de clips et gère les doubles moniteurs vidéos. Il fournit également entre autres un support de couches personnalisables ainsi que des effets et des transitions de base. - kdenlive-kf6 provides dual video monitors, a multi-track timeline and clip list. Other features include customizable layout support, basic effects and transitions. - kdenlive-kf6, ikili video izleyicileri, çoklu parça zaman çizelgesi ve klip listesi sunmaktadır. Diğer özellikler arasında özelleştirilebilir düzenleme desteği, temel efektler ve geçişler sayılabilir. - kdenlive-kf6 jest nieliniowym pakietem do edycji wideo obsługującym DV, HDC i wiele innych formatów. - kdenlive-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kdenlive-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - ladspa-sdk-devel - qt6-svg-devel - karchive-kf6-devel - kbookmarks-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kdbusaddons-kf6-devel - kfilemetadata-kf6-devel - libv4l-devel - kio-kf6-devel - ffmpeg-devel - sdl-image-devel - kwidgetsaddons-kf6-devel - kplotting-kf6-devel - knotifyconfig-kf6-devel - knewstuff-kf6-devel - kxmlgui-kf6-devel - knotifications-kf6-devel - kguiaddons-kf6-devel - ktextwidgets-kf6-devel - kiconthemes-kf6-devel - kdoctools-kf6-devel - mlt-devel - purpose-kf6-devel - frei0r-plugins-devel - qt6-designer-devel - qt6-declarative-devel - qt6-multimedia-devel - qt6-webengine-devel - qt6-networkauth-devel - kdeclarative-kf6-devel - kcrash-kf6-devel - libmediainfo-devel - - desktop/kde6/applications/kdenlive-kf6/pspec.xml - - - kdenlive-kf6 - - kio-kf6 - mlt - cdrkit - ki18n-kf6 - solid-kf6 - kcrash-kf6 - libgcc - ffmpeg - kconfig-kf6 - kxmlgui-kf6 - kdeclarative-kf6 - qt6-svg - karchive-kf6 - kservice-kf6 - qt6-base - knewstuff-kf6 - kplotting-kf6 - sdl-image - dvdauthor - kbookmarks-kf6 - kguiaddons-kf6 - kitemviews-kf6 - ladspa-sdk - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 - kfilemetadata-kf6 - knotifyconfig-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - frei0r-plugins - purpose-kf6 - mediainfo - qt6-designer - qt6-declarative - qt6-multimedia - qt6-webengine - qt6-networkauth - - - /etc/xdg - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - /usr/share/man - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-17 - 24.08.2 - Rebuild. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdegraphics-svgpart-kf6 - https://www.kde.org/applications/graphics/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - GPL - LGPL - desktop.kde6.applications - A KPart for viewing SVGs - A KPart for viewing SVGs - kdegraphics-svgpart-kf6 - mirrors://kde/stable/release-service/24.12.1/src/svgpart-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - kcoreaddons-kf6-devel - kparts-kf6-devel - python-devel - qt6-base-devel - qt6-svg-devel - - desktop/kde6/applications/kdegraphics-svgpart-kf6/pspec.xml - - - kdegraphics-svgpart-kf6 - A KPart for viewing SVGs - - kcoreaddons-kf6 - kparts-kf6 - qt6-base - qt6-svg - ki18n-kf6 - libgcc - kxmlgui-kf6 - kconfigwidgets-kf6 - - - /usr/share - /usr/lib/qt6 - /usr/share/doc - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kleopatra-kf6 - https://www.kde.org/applications/utilities/kleopatra/ - - Alihan Öztürk - alihan@pisilinux.org - - GPLv2 - FDL-1.1 - LGPLv2 - app:gui - desktop.kde6.applications - Certificate Manager and Unified Crypto GUI - kleopatra-kf6 is a certificate manager and a universal crypto GUI. It supports managing X.509 and OpenPGP certificates in the GpgSM keybox and retrieving certificates from LDAP servers. - mirrors://kde/stable/release-service/24.12.1/src/kleopatra-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kwidgetsaddons-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - kguiaddons-kf6-devel - kdbusaddons-kf6-devel - kcmutils-kf6-devel - libkleo-kf6-devel - kdoctools-kf6-devel - kmime-kf6-devel - mimetreeparser-devel - libassuan-devel - gpgme-devel - gpgme-qt6-devel - kitemmodels-kf6-devel - ktextwidgets-kf6-devel - knotifications-kf6-devel - kstatusnotifieritem-kf6-devel - kidentitymanagement-kf6-devel - kmailtransport-kf6-devel - akonadi-mime-kf6-devel - akonadi-kf6-devel - - desktop/kde6/applications/kleopatra-kf6/pspec.xml - - - kleopatra-kf6 - Certificate Manager and Unified Crypto GUI - - gpgme - kio-kf6 - ki18n-kf6 - kmime-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - libkleo-kf6 - kcmutils-kf6 - kguiaddons-kf6 - qt6-base - libassuan - kcoreaddons-kf6 - kdbusaddons-kf6 - kiconthemes-kf6 - ktextwidgets-kf6 - libgpg-error - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - mimetreeparser - - - /usr/bin - /etc - /usr/lib - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kruler-kf6 - http://www.kde.org/applications/graphics/kruler-kf6 - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.graphics - A screen ruler and color measurement tool - Ekran cetveli ve renk ölçüm aracı - kruler-kf6 is a screen ruler and color measurement tool. - kruler-kf6, bir ekran cetveli ve renk ölçüm aracıdır. - kruler-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kruler-24.12.1.tar.xz - - qt6-base-devel - kstatusnotifieritem-kf6-devel - kdoctools-kf6-devel - kcrash-kf6-devel - cmake - extra-cmake-modules-kf6 - ki18n-kf6-devel - knotifications-kf6-devel - kwindowsystem-kf6-devel - kxmlgui-kf6-devel - python-devel - docbook-xsl - - desktop/kde6/applications/kruler-kf6/pspec.xml - - - kruler-kf6 - - qt6-base - kxmlgui-kf6 - knotifications-kf6 - ki18n-kf6 - libgcc - libxcb - kcrash-kf6 - kconfig-kf6 - kcoreaddons-kf6 - kwindowsystem-kf6 - kstatusnotifieritem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share/doc - /usr/bin - /usr/share - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - klettres-kf6 - https://www.kde.org/applications/education/klettres/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.edu - An alphabet learning application - Alfabe öğrenme uygulaması - klettres-kf6 is an application specially designed to help the user to learn alphabet in a new language and then to learn to read simple syllables. The user can be a young child aged from two and a half or an adult that wants to learn the basics of a foreign language. - klettres-kf6, kullanıcının yeni bir alfabeyi ve basit sesli sözleri öğrenmesi için geliştirilmiş bir uygulamadır. İki buçuk yaşındaki bir çocuk için yararlı olabileceği gibi, yeni bir dil öğrenen yetişkinler için de yardımcı olabilir. - klettres-kf6 - mirrors://kde/stable/release-service/24.12.1/src/klettres-24.12.1.tar.xz - - qt6-base-devel - qt6-svg-devel - kdoctools-kf6-devel - extra-cmake-modules-kf6 - kcompletion-kf6-devel - kitemmodels-kf6-devel - ki18n-kf6-devel - knewstuff-kf6-devel - kwidgetsaddons-kf6-devel - kconfigwidgets-kf6-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - kcrash-kf6-devel - qt6-phonon-devel - kpackage-kf6-devel - - desktop/kde6/applications/klettres-kf6/pspec.xml - - - klettres-kf6 - - qt6-base - qt6-svg - qt6-phonon - knewstuff-kf6 - ki18n-kf6 - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - libgcc - - - /usr/share/doc - /usr/bin - /usr/share - /etc/xdg - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - umbrello-kf6 - http://www.kde.org/ - - Mathias Freire - mathiasfreire45@gmail.com - - GPLv2 - app:gui - desktop.kde.sdk - UML modelling tool and code generator - UML modelleme aracı ve kod üreticisi. - umbrello-kf6 UML Modeller is a Unified Modelling Language diagram editor for KDE. - umbrello-kf6 UML (Unified Modellin Language) modelleme ve diyagram editörüdür. - mirrors://kde/stable/release-service/24.12.1/src/umbrello-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt5-base-devel - qt5-webkit-devel - libxslt-devel - qt5-svg-devel - kio-devel - kparts-devel - kinit-devel - kcompletion-devel - kxmlgui-devel - kauth-devel - kconfig-devel - ktexteditor-devel - kcoreaddons-devel - kdoctools-devel - docbook-xsl - kwindowsystem-devel - kdelibs4-support-devel - kdesignerplugin - kemoticons-devel - kitemmodels-devel - kunitconversion-devel - llvm - llvm-clang-devel - llvm-mlir - llvm-polly - - desktop/kde6/applications/umbrello-kf6/pspec.xml - - - umbrello-kf6 - - kio - ki18n - kcrash - libgcc - kconfig - kxmlgui - libxml2 - karchive - kcompletion - kcoreaddons - kiconthemes - kjobwidgets - ktextwidgets - kconfigwidgets - kwidgetsaddons - ktexteditor - libxslt - qt5-svg - qt5-base - - - /usr/share - /usr/share/doc - /usr/bin - - - umbrello - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - spectacle-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - app:gui - desktop.kde6.graphics - KDE screenshot capture utility - Ekran görüntüsü yakalama aracı - spectacle-kf6, a new screenshot application that aims to replace KSnapshot.. - spectacle-kf6 bir ekran görüntüsü yakalama aracıdır. - mirrors://kde/stable/release-service/24.12.1/src/spectacle-24.12.1.tar.xz - - qt6-base-devel - qt6-wayland-devel - extra-cmake-modules-kf6 - kdoctools-kf6-devel - kirigami-kf6-devel - kpipewire-kf6-devel - pipewire-devel - libxcb-devel - prison-kf6-devel - libkscreen-kf6-devel - xcb-util-devel - layer-shell-qt-kf6-devel - xcb-util-image-devel - xcb-util-cursor-devel - kxmlgui-kf6-devel - knewstuff-kf6-devel - kio-kf6-devel - purpose-kf6-devel - kwindowsystem-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kwidgetsaddons-kf6-devel - kdeclarative-kf6-devel - kwayland-kf6-devel - knotifications-kf6-devel - wayland-devel - wayland-client - kglobalaccel-kf6-devel - zxing-cpp-devel - opencv-devel - qt6-declarative-devel - qt6-svg-devel - kguiaddons-kf6-devel - kstatusnotifieritem-kf6-devel - plasma-wayland-protocols - - desktop/kde6/applications/spectacle-kf6/pspec.xml - - - spectacle-kf6 - - qt6-base - kio-kf6 - zxing-cpp - libkscreen-kf6 - purpose-kf6 - xcb-util-cursor - ki18n-kf6 - libgcc - prison-kf6 - kconfig-kf6 - kirigami-kf6 - kxmlgui-kf6 - knewstuff-kf6 - pipewire - kpipewire-kf6 - kdeclarative-kf6 - kservice-kf6 - kcoreaddons-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kwidgetsaddons-kf6 - kdbusaddons-kf6 - libxcb - xcb-util - kwayland-kf6 - layer-shell-qt-kf6 - xcb-util-image - qt6-declarative - qt6-wayland - qt6-svg - kglobalaccel-kf6 - kguiaddons-kf6 - kstatusnotifieritem-kf6 - - - /etc/xdg - /usr/bin - /usr/share - /usr/share/doc - /usr/lib - - - ksnapshot - - - ksnapshot - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kio-gdrive-kf6 - https://projects.kde.org/kio-gdrive-kf6 - - Stefan Gronewold - groni@pisilinux.org - - GPL - desktop.kde6.applications - Provides support for secure credentials storage - Google Drive'a erişmek için kio-kf6 Slave - kio-kf6 Slave to access Google Drive - Google Drive'a erişmek için kio-kf6 Slave - mirrors://kde/stable/release-service/24.12.1/src/kio-gdrive-24.12.1.tar.xz - - intltool - kio-kf6-devel - ki18n-kf6-devel - purpose-kf6-devel - libkgapi-kf6-devel - qt6-base-devel - kdoctools-kf6-devel - kitemmodels-kf6-devel - kcoreaddons-kf6-devel - qt6-keychain-devel - extra-cmake-modules-kf6 - kaccounts-providers-kf6 - knotifications-kf6-devel - kwidgetsaddons-kf6-devel - libaccounts-qt6-devel - kunitconversion-kf6-devel - libaccounts-glib-devel - kaccounts-integration-kf6-devel - - desktop/kde6/applications/kio-gdrive-kf6/pspec.xml - - - kio-gdrive-kf6 - kio-kf6 Slave to access Google Drive - - kio-kf6 - ki18n-kf6 - libgcc - purpose-kf6 - libkgapi-kf6 - qt6-base - kcoreaddons-kf6 - qt6-keychain - knotifications-kf6 - kwidgetsaddons-kf6 - libaccounts-qt6 - kaccounts-providers-kf6 - kaccounts-integration-kf6 - - - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - konqueror-kf6 - https://www.kde.org/applications/internet/konqueror/ - - Stefan Gronewold - groni@pisilinux.org - - FDL - GPL - LGPL - desktop.kde6.applications - konqueror-kf6 - KDE File Manager and Web Browser - konqueror-kf6 is KDE's Webbrowser and swiss-army-knife for any kind of file-management and file previewing. - mirrors://kde/stable/release-service/24.12.1/src/konqueror-24.12.1.tar.xz - - extra-cmake-modules-kf6 - gettext-devel - glibc-devel - plasma-activities-kf6-devel - karchive-kf6-devel - kbookmarks-kf6-devel - kcmutils-kf6-devel - kcrash-kf6-devel - kguiaddons-kf6-devel - kdesu-kf6-devel - kdoctools-kf6-devel - knotifications-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kparts-kf6-devel - kitemmodels-kf6-devel - kunitconversion-kf6-devel - kwidgetsaddons-kf6-devel - libICE-devel - libX11-devel - libXext-devel - python-devel - qt6-base-devel - qt6-declarative-devel - qt6-webchannel-devel - qt6-webengine-devel - tidy-devel - zlib-devel - libevent-devel - ffmpeg-devel - libXScrnSaver-devel - kwallet-kf6-devel - - desktop/kde6/applications/konqueror-kf6/pspec.xml - - - konqueror-kf6 - konqueror-kf6 - KDE File Manager and Web Browser - - kwallet-kf6 - karchive-kf6 - kbookmarks-kf6 - kcmutils-kf6 - kcrash-kf6 - kded-kf6 - kdesu-kf6 - knotifications-kf6 - kiconthemes-kf6 - kguiaddons-kf6 - kio-kf6 - kparts-kf6 - kwidgetsaddons-kf6 - libX11 - libXext - libgcc - qt6-base - qt6-declarative - qt6-webchannel - qt6-webengine - zlib - tidy - ki18n-kf6 - sonnet-kf6 - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kservice-kf6 - kitemviews-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kdbusaddons-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 - kwindowsystem-kf6 - kconfigwidgets-kf6 - - - /etc/xdg - /usr/bin - /usr/lib - /usr/lib/qt6 - /usr/share - /usr/share/doc - - - kde-baseapps - - - kde-baseapps - - - - konqueror-kf6-devel - Development files for konqueror-kf6 - - qt6-base-devel - konqueror-kf6 - - - /usr/include - /usr/lib/cmake - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kidentitymanagement-kf6 - https://www.kde.org - - Pisi Linux Admins - admin@pisilinux.org - - LGPLv2 - library - app:library - desktop.kde6.applications - KDE PIM libraries - Library for the KDE-PIM(Personal-Infomation-Management - mirrors://kde/stable/release-service/24.12.1/src/kidentitymanagement-24.12.1.tar.xz - - qt6-base-devel - kdoctools-kf6-devel - kpimtextedit-kf6-devel - kio-kf6-devel - kcodecs-kf6-devel - kconfig-kf6-devel - kxmlgui-kf6-devel - kcompletion-kf6-devel - kcoreaddons-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kitemmodels-kf6-devel - ktextaddons-kf6-devel - kpimtextedit-kf6-devel - kunitconversion-kf6-devel - kpimtextedit-kf6-devel - extra-cmake-modules-kf6 - python-devel - kiconthemes-kf6-devel - kirigami-kf6-devel - kirigami-addons-kf6 - - desktop/kde6/applications/kidentitymanagement-kf6/pspec.xml - - - kidentitymanagement-kf6 - - qt6-base - kpimtextedit-kf6 - kio-kf6 - ki18n-kf6 - libgcc - kcodecs-kf6 - kconfig-kf6 - kxmlgui-kf6 - kiconthemes-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - ktextwidgets-kf6 - kwidgetsaddons-kf6 - kpimtextedit-kf6 - ktextaddons-kf6 - kirigami-kf6 - kirigami-addons-kf6 - - - /usr/share - /usr/lib/qt6 - /usr/lib - /usr/share/doc - - - - kidentitymanagement-kf6-devel - Development files for kidentitymanagement-kf6 - - qt6-base-devel - kpimtextedit-kf6-devel - ktextwidgets-kf6-devel - kidentitymanagement-kf6 - - - /etc/xdg - /usr/include - /usr/lib/cmake - /usr/lib/pkgconfig - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kapptemplate-kf6 - http://www.kde.org/ - - Pisi Linux Admins - admin@pisilinux.org - - GPLv2 - app:gui - desktop.kde.sdk - Application template generator - Uygulama şablon oluşturucu. - kapptemplate-kf6 is a shell script that will create the necessary framework to develop several types of applications, including applications based on the KDE development platform. - kapptemplate-kf6, çeşitli uygulamaları geliştirmek için gerekli olabilecek şablonlar oluşturmayı sağlar. - mirrors://kde/stable/release-service/24.12.1/src/kapptemplate-24.12.1.tar.xz - - qt6-base-devel - extra-cmake-modules-kf6 - gettext - kcoreaddons-kf6-devel - kconfigwidgets-kf6-devel - kcompletion-kf6-devel - karchive-kf6-devel - kio-kf6-devel - ki18n-kf6-devel - kdoctools-kf6-devel - kirigami-addons-kf6 - - desktop/kde6/applications/kapptemplate-kf6/pspec.xml - - - kapptemplate-kf6 - - qt6-base - kio-kf6 - ki18n-kf6 - libgcc - kconfig-kf6 - karchive-kf6 - kcompletion-kf6 - kcoreaddons-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - kirigami-addons-kf6 - - - /usr/share - /usr/share/doc - /usr/bin - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - ktorrent-kf6 - https://apps.kde.org/ktorrent/ - - Kamil Atlı - suvari@pisilinux.org - - GPLv2 - app:gui - desktop.kde6.applications - A powerful BitTorrent client for KDE - KDE için güçlü bir BitTorrent istemcisi - A powerful BitTorrent client for KDE - KDE için güçlü bir BitTorrent istemcisi - https://download.kde.org/stable/release-service/24.12.1/src/ktorrent-24.12.1.tar.xz - - doxygen - kio-kf6-devel - boost-devel - geoip-devel - ki18n-kf6-devel - kparts-kf6-devel - kdnssd-kf6-devel - taglib-devel - kcrash-kf6-devel - kxmlgui-kf6-devel - qt6-base-devel - qt6-5compat-devel - kcmutils-kf6-devel - karchive-kf6-devel - libgcrypt-devel - kdoctools-kf6-devel - kplotting-kf6-devel - qt6-phonon-devel - kiconthemes-kf6-devel - libktorrent-kf6-devel - kdbusaddons-kf6-devel - kcoreaddons-kf6-devel - kcompletion-kf6-devel - ktextwidgets-kf6-devel - ksyndication-kf6-devel - qt6-webengine-devel - knotifyconfig-kf6-devel - kwindowsystem-kf6-devel - extra-cmake-modules-kf6 - kwidgetsaddons-kf6-devel - kconfigwidgets-kf6-devel - knotifications-kf6-devel - kstatusnotifieritem-kf6-devel - plasma-workspace-kf6-devel - - desktop/kde6/applications/ktorrent-kf6/pspec.xml - - - ktorrent-kf6 - - kio-kf6 - boost - geoip - ki18n-kf6 - libgcc - kparts-kf6 - kdnssd-kf6 - taglib - kcrash-kf6 - kconfig-kf6 - kxmlgui-kf6 - karchive-kf6 - qt6-base - kcmutils-kf6 - libgcrypt - kplotting-kf6 - qt6-phonon - qt6-5compat - kiconthemes-kf6 - libktorrent-kf6 - kdbusaddons-kf6 - kcoreaddons-kf6 - kcompletion-kf6 - ktextwidgets-kf6 - ksyndication-kf6 - qt6-webengine - knotifyconfig-kf6 - kwindowsystem-kf6 - kwidgetsaddons-kf6 - kconfigwidgets-kf6 - knotifications-kf6 - kstatusnotifieritem-kf6 - plasma-workspace-kf6 - - - /usr/bin - /usr/share/icons - /usr/share/knotifications5 - /usr/share/applications - /usr/share/kxmlgu5/ktorrent - /usr/share/ktorrent/ - /usr/share/kxmlgui5/ - /usr/share/metainfo - /usr/lib/libktcore.so* - /usr/lib/qt6/plugins/ktorrent_plugins - /usr/share/doc - /usr/share/locale - /usr/share/knotifications6 - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kapman-kf6 - https://www.kde.org/applications/games/kapman/ - - PisiLinux Community - admins@pisilinux.org - - GPLv2 - app:gui - desktop.kde.games - Pac-Man clone - Pac-Man klonu - kapman-kf6 is a clone of the well known game Pac-Man. You must go through the levels escaping ghosts in a maze. You lose a life when a ghost eats you, but you can eat the ghosts for a few seconds when eating an energizer. - kapman-kf6 dünyaca ünlü Pac-Man'in bir türevidir. Labirent içinde hayaletlerle köşe kapmaca oynayarak bölümleri geçmeye çalıştığınız oyunda eğer hayaletlere yakalanırsanız bir hakkınızı kaybediyorsunuz. Eğer bir enerji nesnesi alırsanız bu kez siz bir kaç saniyeliğine hayaletleri yiyebiliyorsunuz. - kapman-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kapman-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - qt6-svg-devel - kcoreaddons-kf6-devel - kconfig-kf6-devel - kdbusaddons-kf6-devel - kdoctools-kf6-devel - kwindowsystem-kf6-devel - ki18n-kf6-devel - kunitconversion-kf6-devel - kitemmodels-kf6-devel - kconfigwidgets-kf6-devel - kxmlgui-kf6-devel - kio-kf6-devel - knotifyconfig-kf6-devel - libkdegames-kf6-devel - qt6-declarative-devel - - desktop/kde6/applications/kapman-kf6/pspec.xml - - - kapman-kf6 - - ki18n-kf6 - libgcc - kconfig-kf6 - kxmlgui-kf6 - qt6-svg - qt6-base - kcoreaddons-kf6 - kdbusaddons-kf6 - libkdegames-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - - - /usr/share - /usr/lib - /usr/share/doc - /usr/bin - - - - - 2025-01-09 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - - - - kdesdk-thumbnailers-kf6 - http://www.kde.org/ - - Mathias Freire - mathiasfreire45@gmail.com - - GPLv2 - library - desktop.kde.sdk - Translation file thumbnail generators - Translation file thumbnail generators - kdesdk-thumbnailers-kf6 - mirrors://kde/stable/release-service/24.12.1/src/kdesdk-thumbnailers-24.12.1.tar.xz - - extra-cmake-modules-kf6 - qt6-base-devel - kconfig-kf6-devel - ki18n-kf6-devel - kio-kf6-devel - gettext-devel - - desktop/kde6/applications/kdesdk-thumbnailers-kf6/pspec.xml - - - kdesdk-thumbnailers-kf6 - - kio-kf6 - ki18n-kf6 - libgcc - gettext - kconfig-kf6 - qt6-base - kwidgetsaddons-kf6 - - - /usr/share/kservice-kf6s5 - /usr/share/config.kcfg - /usr/lib - /usr/share/doc - /usr/share/locale - - - kdesdk - - - kdesdk - - - - - 2025-01-10 - 24.12.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-12-15 - 24.12.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-11-07 - 24.08.3 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-10-10 - 24.08.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-09-12 - 24.08.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-08-27 - 24.08.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-07-04 - 24.05.2 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-06-27 - 24.05.1 - Version bump. - Pisi Linux Community - admin@pisilinux.org - - - 2024-05-23 - 24.05.0 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-04-13 - 24.02.2 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-21 - 24.02.1 - Version bump. - Mustafa Cinasal - muscnsl@gmail.com - - - 2024-03-03 - 24.02.0 - First release - Mustafa Cinasal - muscnsl@gmail.com - - - librsvg @@ -177838,6 +127127,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesqt6-base-devel kconfig-devel kconfigwidgets-devel + kguiaddons-devel /usr/include @@ -178947,25 +128237,27 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesAn open source text-based subtitle editor that supports basic and advanced editing operations, aiming to become an improved version of Subtitle Workshop for every platform supported by Plasma Frameworks. Metin tabanlı altyazı düzenleyicisi olan subtitlecomposer, metin, zaman ve biçim düzenleme gibi temel özellikleri desteklemenin yanında, gerçek zamanlı olarak yazım denetimi, zaman önizleyicisi gibi güzel özellikleri de barındırmaktadır. subtitlecomposer - mirrors://kde/stable/subtitlecomposer/subtitlecomposer-0.7.1.tar.xz + mirrors://kde/stable/subtitlecomposer/subtitlecomposer-0.8.1.tar.xz cmake kio-devel + qt6-5compat-devel ruby-devel icu4c-devel kauth-devel - kross-devel + openssl-devel ki18n-devel sonnet-devel - ffmpeg-devel + ffmpeg4-devel openal-devel kcodecs-devel kconfig-devel kxmlgui-devel python3-devel - qt5-base-devel + qt6-base-devel + qt6-declarative-devel gstreamer-devel - qt5-phonon-devel + qt6-phonon-devel kcompletion-devel kcoreaddons-devel ktextwidgets-devel @@ -178977,8 +128269,6 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces turkish.patch - 4f4f560e40ba0b760cf688eb024be3cc734ca347.patch - d8f9797d9c0d45fa9f4402f79c539544b74d2cc7.patch desktop/kde/utils/subtitlecomposer/pspec.xml @@ -178988,27 +128278,29 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskio icu4c kauth - kross ki18n libgcc sonnet - ffmpeg + ffmpeg4 openal + openssl python3 kcodecs kconfig kxmlgui - qt5-base + qt6-base gstreamer - qt5-phonon + qt6-phonon kcoreaddons kcompletion pocketsphinx ktextwidgets + qt6-5compat kwidgetsaddons kconfigwidgets gst-plugins-base xorg-server-xvfb + qt6-declarative /usr/bin @@ -179024,6 +128316,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-03 + 0.8.1 + Version bump. + Mustafa Cinasal + muscnsl@gmail.com + 2023-10-30 0.7.1 @@ -183934,6 +133233,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskirigami-addons kuserfeedback-devel kiconthemes-devel + kguiaddons-devel qcoro-qt6-devel qt6-svg-devel flatpak-devel @@ -183979,6 +133279,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskuserfeedback kirigami-addons qcoro-qt6 + kguiaddons /etc @@ -186450,7 +135751,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesLibrary providing logic to interface scanners Library providing logic to interface scanners ksanecore - https://download.kde.org/stable/release-service/24.12.2/src/ksanecore-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/ksanecore-24.12.3.tar.xz ki18n-devel qt6-base-devel @@ -186479,7 +135780,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesksanecore-devel Development files for ksanecore - ksanecore + ksanecore /usr/include @@ -186491,6 +135792,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -186522,7 +135830,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesUygulama yerelleştirme yardımcısı. lokalize is also a general computer-aided translation system (CAT) with which you can translate OpenDocument files (*.odt). lokalize, uygulamalar için kolaylıkla yerelleştirme yapabileceğiniz bir programdır. - mirrors://kde/stable/release-service/24.12.2/src/lokalize-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/lokalize-24.12.3.tar.xz qt6-base-devel hunspell-devel @@ -186583,6 +135891,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -186615,7 +135930,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskbreakout is a Breakout like game. The object of the game is to destroy as many bricks as possible without losing the ball. kbreakout bir Breakout türevidir. Oyunun amacı topları yere düşürmeden olabildiğince çok tuğlayı yok etmektir. kbreakout - mirrors://kde/stable/release-service/24.12.2/src/kbreakout-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kbreakout-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -186634,7 +135949,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskjobwidgets-devel kxmlgui-devel kio-devel - libkdegames-devel + libkdegames-devel kdoctools-devel kitemmodels-devel kunitconversion-devel @@ -186667,6 +135982,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -186696,11 +136018,11 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications Library for creating events. Library for creating events. - mirrors://kde/stable/release-service/24.12.2/src/eventviews-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/eventviews-24.12.3.tar.xz extra-cmake-modules qt6-base-devel - akonadi-devel + akonadi-devel kcompletion-devel kjobwidgets-devel kcoreaddons-devel @@ -186711,15 +136033,15 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskdoctools-devel kunitconversion-devel boost-devel - libkdepim-devel + libkdepim-devel kcontacts-devel kcalendarcore-devel - kcalutils-devel - calendarsupport-devel - kmime-devel - kidentitymanagement-devel - akonadi-calendar-devel - akonadi-contacts-devel + kcalutils-devel + calendarsupport-devel + kmime-devel + kidentitymanagement-devel + akonadi-calendar-devel + akonadi-contacts-devel kdiagram-devel kholidays-devel kguiaddons-devel @@ -186770,7 +136092,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceseventviews-devel Development files for eventviews. - eventviews + eventviews /usr/include @@ -186781,6 +136103,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -186814,14 +136143,14 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskdepim-runtime contains kde6 PIM (Personal Information Management) runtime environment like akonadi agents. kdepim-runtime, kdelibs kullanarak yazılmış olan Akonadi ajanları da dahil olmak üzere kde6 PIM (Personal Information Management - Kişisel Bilgi Yönetimi) çalışma zamanı ortamını içerir. kontact - mirrors://kde/stable/release-service/24.12.2/src/kdepim-runtime-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kdepim-runtime-24.12.3.tar.xz kdoctools-devel boost-devel shared-mime-info - akonadi-devel - akonadi-calendar-devel - akonadi-search-devel + akonadi-devel + akonadi-calendar-devel + akonadi-search-devel kcmutils-devel kio-devel ki18n-devel @@ -186829,16 +136158,16 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskunitconversion-devel knotifyconfig-devel knotifications-devel - kmailtransport-devel - kidentitymanagement-devel - kalarm - kcalutils-devel - kmbox-devel - kimap-devel - libkgapi-devel + kmailtransport-devel + kidentitymanagement-devel + kalarm + kcalutils-devel + kmbox-devel + kimap-devel + libkgapi-devel kholidays-devel ksyndication-devel - pimcommon-devel + pimcommon-devel cyrus-sasl-devel qt6-declarative-devel qt6-multimedia-devel @@ -186850,8 +136179,8 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesqt6-speech-devel kdav-devel ffmpeg-devel - kldap-devel - libkdepim-devel + kldap-devel + libkdepim-devel libXScrnSaver-devel qca2-qt6-devel qt6-keychain-devel @@ -186931,6 +136260,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -186963,7 +136299,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskmahjongg is a fun board game created after the famous oriental game of Mahjong. Unlike the original however, kmahjongg is a tile matching game for one or two players, a variation usually known as Mahjong Solitaire. Mahjong Solitaire oyununa benzer kmahjongg bir veya iki oyuncunun birlekte oynayabileceği bir parça eşleştirme oyunudur. kmahjongg - mirrors://kde/stable/release-service/24.12.2/src/kmahjongg-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kmahjongg-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -186977,8 +136313,8 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskcompletion-devel knewstuff-devel kxmlgui-devel - libkdegames-devel - libkmahjongg-devel + libkdegames-devel + libkmahjongg-devel kcompletion-devel qt6-declarative-devel @@ -187014,6 +136350,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -187045,7 +136388,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesA textedit with PIM-specific features. Text Edit with KDE-PIM specific features. kpimtextedit - mirrors://kde/stable/release-service/24.12.2/src/kpimtextedit-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kpimtextedit-24.12.3.tar.xz qt6-base-devel qt6-speech-devel @@ -187107,7 +136450,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesDevelopment files for kpimtextedit qt6-base-devel - kpimtextedit + kpimtextedit ktextwidgets-devel @@ -187120,6 +136463,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -187152,7 +136502,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacescantor is an application that lets you use your favorite mathematical applications from within a nice KDE-integrated Worksheet Interface. It offers assistant dialogs for common tasks and allows you to share your worksheets with others. cantor; Sage, Maxima, R and kalgebra gibi uygulamalara arayüz sağlayarak kullanımı kolaylaştırmayı amaçlar. Çok kullanılan işler için dialoglar sağlar ve çalışmalarınızı başkalarıyla paylaşabilmenize olanak tanır. cantor - mirrors://kde/stable/release-service/24.12.2/src/cantor-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/cantor-24.12.3.tar.xz qt6-base-devel qt6-sql-sqlite @@ -187170,7 +136520,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesktexteditor-devel knewstuff-devel kpty-devel - analitza-devel + analitza-devel libqalculate-devel cln-devel libspectre-devel @@ -187236,7 +136586,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesDevelopment files for cantor cantor için geliştirme dosyaları - cantor + cantor /usr/include @@ -187247,6 +136597,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -187279,7 +136636,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskiten is a Japanese reference/study tool. kiten, Japonca referans ve alıştırma uygulamasıdır. kiten>kiten - mirrors://kde/stable/release-service/24.12.2/src/kiten-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kiten-24.12.3.tar.xz qt6-base-devel kdoctools-devel @@ -187336,7 +136693,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesDevelopment files for kiten kiten için geliştirme dosyaları - kiten + kiten /usr/include @@ -187347,6 +136704,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -187376,7 +136740,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesBookmark Organizer and Editor Bookmark Organizer and Editor keditbookmarks - mirrors://kde/stable/release-service/24.12.2/src/keditbookmarks-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/keditbookmarks-24.12.3.tar.xz extra-cmake-modules gettext-devel @@ -187429,6 +136793,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -187457,21 +136828,21 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications Import and export KDE PIM settings Import and export KDE PIM settings - https://download.kde.org/stable/release-service/24.12.2/src/pim-data-exporter-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/pim-data-exporter-24.12.3.tar.xz extra-cmake-modules kcrash-devel kdbusaddons-devel kdoctools-devel - akonadi-contacts-devel - akonadi-devel - akonadi-mime-devel - calendarsupport-devel - kalarm + akonadi-contacts-devel + akonadi-devel + akonadi-mime-devel + calendarsupport-devel + kalarm kcalendarcore-devel kcontacts-devel - kmailtransport-devel - kpimtextedit-devel + kmailtransport-devel + kpimtextedit-devel qt6-base-devel ktextwidgets-devel kxmlgui-devel @@ -187481,19 +136852,19 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceski18n-devel kitemviews-devel kunitconversion-devel - kmime-devel - kidentitymanagement-devel - akonadi-calendar-devel + kmime-devel + kidentitymanagement-devel + akonadi-calendar-devel kholidays-devel - mailcommon-devel - messagelib-devel - pimcommon-devel - kimap-devel + mailcommon-devel + messagelib-devel + pimcommon-devel + kimap-devel cyrus-sasl-devel - libkleo-devel + libkleo-devel gpgme-devel gpgme-qt6-devel - libkdepim-devel + libkdepim-devel ffmpeg-devel karchive-devel libXScrnSaver-devel @@ -187546,6 +136917,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -187578,11 +136956,11 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskolourpaint is a simple painting program to quickly create raster images. It is useful as a touch-up tool and simple image editing tasks. kolourpaint, kullanımı kolay bir çizim programıdır. kolourpaint - mirrors://kde/stable/release-service/24.12.2/src/kolourpaint-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kolourpaint-24.12.3.tar.xz extra-cmake-modules qt6-base-devel - libkexiv2-devel + libkexiv2-devel ki18n-devel kio-devel kguiaddons-devel @@ -187593,7 +136971,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskdoctools-devel kitemmodels-devel kunitconversion-devel - libksane-devel + libksane-devel desktop/kde/applications/kolourpaint/pspec.xml @@ -187633,6 +137011,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -187662,11 +137047,11 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications KDE PIM incidence editor. KDE PIM incidence editor. - http://download.kde.org/stable/release-service/24.12.2/src/incidenceeditor-24.12.2.tar.xz + http://download.kde.org/stable/release-service/24.12.3/src/incidenceeditor-24.12.3.tar.xz extra-cmake-modules qt6-base-devel - akonadi-devel + akonadi-devel kcompletion-devel kjobwidgets-devel kcoreaddons-devel @@ -187680,23 +137065,23 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskguiaddons-devel kunitconversion-devel boost-devel - kmime-devel - kldap-devel + kmime-devel + kldap-devel cyrus-sasl-devel - calendarsupport-devel - kidentitymanagement-devel - akonadi-calendar-devel + calendarsupport-devel + kidentitymanagement-devel + akonadi-calendar-devel kcalendarcore-devel kcontacts-devel - eventviews-devel - kcalutils-devel + eventviews-devel + kcalutils-devel kdiagram-devel - kmailtransport-devel - libkdepim-devel - akonadi-mime-devel - akonadi-contacts-devel - pimcommon-devel - kimap-devel + kmailtransport-devel + libkdepim-devel + akonadi-mime-devel + akonadi-contacts-devel + pimcommon-devel + kimap-devel kiconthemes-devel desktop/kde/applications/incidenceeditor/pspec.xml @@ -187757,7 +137142,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesincidenceeditor-devel Development files for incidenceeditor. - incidenceeditor + incidenceeditor /usr/include @@ -187769,6 +137154,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -187887,7 +137279,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesKolor Lines is a simple but highly addictive, one player game for KDE. Kolor Lines has been inspired by well known game of Color Lines. The goal of Kolor Lines is quite plain. The player has to move the colored balls around the game board, gathering them into the lines of the same color by five. Kolor Lines basit ama bağımlılık yapıcı bir oyundur. Dünyaca ünlü Color Lines'tan esinlenilen oyunda amacınız aynı renkli toplardan beş tanesini yan yana getirmektir. klines - mirrors://kde/stable/release-service/24.12.2/src/klines-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/klines-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -187906,7 +137298,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskxmlgui-devel kio-devel knewstuff-devel - libkdegames-devel + libkdegames-devel kdoctools-devel kitemmodels-devel kunitconversion-devel @@ -187938,6 +137330,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -187967,7 +137366,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications Advanced Text Editor Plasma library and runtime components based upon KF5 and Qt5 - https://download.kde.org/stable/release-service/24.12.2/src/kate-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/kate-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -188053,6 +137452,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -188085,7 +137491,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesakonadi is an extensible cross-desktop storage service for PIM data and meta data providing concurrent read, write, and query access. Akonadi, PIM verisi ve meta veriler için eşzamanlı okuma, yazma ve sorgulama yapma imkanı sağlayan, masaüstü ortamından bağımsız, genişletilebilir bir depolama servisidir. akonadi - mirrors://kde/stable/release-service/24.12.2/src/akonadi-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/akonadi-24.12.3.tar.xz qt6-base-devel qt6-designer-devel @@ -188112,7 +137518,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesboost-devel kitemmodels-devel kio-devel - kaccounts-integration-devel + kaccounts-integration-devel libaccounts-qt6-devel extra-cmake-modules libaccounts-glib-devel @@ -188167,7 +137573,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesDevelopment files for akonadi akonadi için geliştirme dosyaları - akonadi + akonadi qt6-base-devel @@ -188180,6 +137586,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -188211,7 +137624,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesCDDB için KDE kitaplığı (Compact Disc Database) KDE library for CDDB (Compact Disc Database). CDDB için KDE kitaplığı (Compact Disc Database). - mirrors://kde/stable/release-service/24.12.2/src/libkcddb-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/libkcddb-24.12.3.tar.xz extra-cmake-modules musicbrainz5-devel @@ -188256,6 +137669,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -188287,7 +137707,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications Certificate Manager and Unified Crypto GUI kleopatra is a certificate manager and a universal crypto GUI. It supports managing X.509 and OpenPGP certificates in the GpgSM keybox and retrieving certificates from LDAP servers. - mirrors://kde/stable/release-service/24.12.2/src/kleopatra-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kleopatra-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -188304,10 +137724,10 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskguiaddons-devel kdbusaddons-devel kcmutils-devel - libkleo-devel + libkleo-devel kdoctools-devel - kmime-devel - mimetreeparser-devel + kmime-devel + mimetreeparser-devel libassuan-devel gpgme-devel gpgme-qt6-devel @@ -188316,9 +137736,9 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesknotifications-devel kstatusnotifieritem-devel kidentitymanagement-devel - kmailtransport-devel - akonadi-mime-devel - akonadi-devel + kmailtransport-devel + akonadi-mime-devel + akonadi-devel desktop/kde/applications/kleopatra/pspec.xml @@ -188361,6 +137781,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -188393,7 +137820,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskgeography is a geography learning tool, which allows you to learn about the political divisions of some countries (divisions, capitals of those divisions and their associated flags if there are some). kgeography, ülkeler hakkında çeşitli bilgiler sunan bir coğrafya uygulamasıdır. kgeography - https://download.kde.org/stable/release-service/24.12.2/src/kgeography-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/kgeography-24.12.3.tar.xz qt6-base-devel kconfig-devel @@ -188436,6 +137863,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -188468,7 +137902,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesKStars is a Desktop Planetarium for KDE. It provides an accurate graphical simulation of the night sky, from any location on Earth, at any date and time. The display includes up to 100 million stars, 13,000 deep-sky objects, all 8 planets, the Sun and Moon, and thousands of comets and asteroids. KStars, dünyanın herhangi bir yerinin herhangi bir anındaki gökyüzü yıldız haritasını gösterebilen bir uygulamadır. 100 milyon kadar yıldız, 13000 derin gök cismi, 8 gezegenin tümü, Güneş, Ay ile birçok kuyruklu yıldız ve astreoidi içeren bir veritabanı vardır. kstars - https://download.kde.org/stable/kstars/3.7.5/kstars-3.7.5.tar.xz + https://download.kde.org/stable/kstars/3.7.6/kstars-3.7.6.tar.xz qt5-base-devel qt5-datavis3d-devel @@ -188567,6 +138001,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 3.7.6 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 3.7.5 @@ -188603,7 +138044,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications KDE PIM library providing Gravatar support KDE PIM library providing Gravatar support - mirrors://kde/stable/release-service/24.12.2/src/libgravatar-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/libgravatar-24.12.3.tar.xz qt6-base-devel kdoctools-devel @@ -188611,7 +138052,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskconfig-devel kservice-devel kxmlgui-devel - pimcommon-devel + pimcommon-devel cmake extra-cmake-modules openldap-client @@ -188626,7 +138067,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesextra-cmake-modules kdoctools-devel knewstuff-devel - kpimtextedit-devel + kpimtextedit-devel boost-devel desktop/kde/applications/libgravatar/pspec.xml @@ -188660,7 +138101,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceslibgravatar-devel Development files for libgravatar - libgravatar + libgravatar qt6-base-devel kxmlgui-devel ki18n-devel @@ -188677,6 +138118,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -188800,7 +138248,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskblackbox is a game of hide and seek played on a grid of boxes. The computer has hidden several balls within this box. By shooting beams into the box and observing where they emerge it is possible to deduce the positions of the hidden balls. kblackbox yan yana dizilmiş kutularla oynanan bir saklambaç oyunudur. Bilgisayarın sakladığı topları kutuları lazerle kontrol ederek bulabilirsiniz. kblackbox - mirrors://kde/stable/release-service/24.12.2/src/kblackbox-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kblackbox-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -188815,7 +138263,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskguiaddons-devel kiconthemes-devel kxmlgui-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel kdoctools-devel kitemmodels-devel @@ -188853,6 +138301,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -188883,7 +138338,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications Libraries and daemons to implement Contact Management in Akonadi. Libraries and daemons to implement Contact Management in Akonadi. - mirrors://kde/stable/release-service/24.12.2/src/akonadi-contacts-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/akonadi-contacts-24.12.3.tar.xz qt6-base-devel qt6-webengine-devel @@ -188894,17 +138349,17 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskdoctools-devel boost-devel kguiaddons-devel - akonadi-devel + akonadi-devel extra-cmake-modules kio-devel - kmime-devel + kmime-devel kcontacts-devel kcalendarcore-devel kitemmodels-devel ktexttemplate-devel ktextwidgets-devel kiconthemes-devel - grantleetheme-devel + grantleetheme-devel kunitconversion-devel kcmutils-devel ktextaddons-devel @@ -188957,8 +138412,8 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesDevelopment files for akonadi-contacts qt6-base-devel - akonadi-contacts - grantleetheme-devel + akonadi-contacts + grantleetheme-devel ktexttemplate-devel @@ -188971,6 +138426,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -189301,7 +138763,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesKDE için güçlü bir BitTorrent istemcisi A powerful BitTorrent client for KDE KDE için güçlü bir BitTorrent istemcisi - https://download.kde.org/stable/release-service/24.12.2/src/ktorrent-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/ktorrent-24.12.3.tar.xz doxygen kio-devel @@ -189322,7 +138784,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskplotting-devel qt6-phonon-devel kiconthemes-devel - libktorrent-devel + libktorrent-devel kdbusaddons-devel kcoreaddons-devel kcompletion-devel @@ -189397,6 +138859,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -189427,16 +138896,16 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesLibraries and daemons to implement searching in Akonadi Libraries and daemons to implement searching in Akonadi akonadi - mirrors://kde/stable/release-service/24.12.2/src/akonadi-search-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/akonadi-search-24.12.3.tar.xz qt6-base-devel kcrash-devel kconfig-devel kio-devel ki18n-devel - akonadi-devel + akonadi-devel kcontacts-devel - kmime-devel + kmime-devel kjobwidgets-devel kservice-devel solid-devel @@ -189453,7 +138922,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskdoctools-devel ktextaddons-devel extra-cmake-modules - akonadi-mime-devel + akonadi-mime-devel desktop/kde/applications/akonadi-search/pspec.xml @@ -189503,10 +138972,10 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesakonadi-search-devel Development files for akonadi - akonadi-search + akonadi-search qt6-base-devel ki18n-devel - kmime-devel + kmime-devel kcodecs-devel kconfig-devel kcalendarcore-devel @@ -189526,6 +138995,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -189556,7 +139032,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications Akonadi calendar integration Calendar integration for Akonadi. - mirrors://kde/stable/release-service/24.12.2/src/akonadi-calendar-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/akonadi-calendar-24.12.3.tar.xz qt6-base-devel ki18n-devel @@ -189566,25 +139042,25 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskio-devel kitemmodels-devel kunitconversion-devel - kmailtransport-devel - akonadi-devel + kmailtransport-devel + akonadi-devel extra-cmake-modules - akonadi-mime-devel - kmime-devel + akonadi-mime-devel + kmime-devel cyrus-sasl-devel kcontacts-devel - kidentitymanagement-devel + kidentitymanagement-devel kcalendarcore-devel - kcalutils-devel - akonadi-contacts-devel + kcalutils-devel + akonadi-contacts-devel prison-devel - grantleetheme-devel + grantleetheme-devel knotifications-devel - messagelib-devel - pimcommon-devel - kimap-devel - libkleo-devel - libkdepim-devel + messagelib-devel + pimcommon-devel + kimap-devel + libkleo-devel + libkdepim-devel desktop/kde/applications/akonadi-calendar/pspec.xml @@ -189640,7 +139116,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesDevelopment files for akonadi-calendar qt6-base-devel - akonadi-calendar + akonadi-calendar /usr/include @@ -189652,6 +139128,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -189682,7 +139165,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications kioslave for accessing audio CDs kioslave for accessing audio CDs - https://download.kde.org/stable/release-service/24.12.2/src/audiocd-kio-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/audiocd-kio-24.12.3.tar.xz cdparanoia-devel flac-devel @@ -189691,7 +139174,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskdoctools-devel kio-devel lame-devel - libkcompactdisc-devel + libkcompactdisc-devel libvorbis-devel qt6-base-devel qt6-5compat-devel @@ -189747,7 +139230,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesaudiocd-kio-devel Development files for audiocd-kio - audiocd-kio + audiocd-kio qt6-base-devel @@ -189758,6 +139241,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -189790,7 +139280,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesImprove your pronunciation by listening to native speakers artikulate5, Improve your pronunciation by listening to native speakers. artikulate5 - mirrors://kde/stable/release-service/24.12.2/src/artikulate-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/artikulate-24.12.3.tar.xz boost-devel cmake @@ -189856,6 +139346,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -189886,11 +139383,11 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications MBox library support. MBox library support. - mirrors://kde/stable/release-service/24.12.2/src/kmbox-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kmbox-24.12.3.tar.xz qt6-base-devel extra-cmake-modules - kmime-devel + kmime-devel boost-devel kcodecs-devel @@ -189919,7 +139416,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesDevelopment files for kmbox qt6-base-devel - kmbox + kmbox /etc/xdg @@ -189932,6 +139429,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -189961,7 +139465,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.edu rocs5 Graph Theory rocs5 aims to be a Graph Theory IDE for helping professors to show the results of a graph algorithm and also helping students to do the algorithms. rocs5 has a scripting module, done in Qt Script, that interacts with the drawn graph and every change in the graph with the script is reflected on the drawn one.. - mirrors://kde/stable/release-service/24.12.2/src/rocs-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/rocs-24.12.3.tar.xz kdoctools5-devel kdeclarative5-devel @@ -190028,7 +139532,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesrocs-devel Development files for rocs - rocs + rocs /usr/include @@ -190039,6 +139543,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -190068,7 +139579,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications Network Monitor for DNS-SD services (Zeroconf) DNS-SD hizmetleri için Ağ İzleyicisi - https://download.kde.org/stable/release-service/24.12.2/src/kio-zeroconf-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/kio-zeroconf-24.12.3.tar.xz kio-devel ki18n-devel @@ -190105,6 +139616,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -190135,7 +139653,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications API for handling TNEF data The API permits access to the actual attachments, the message properties (TNEF/MAPI), and allows one to view/extract message formatted text in Rich Text Format format. - mirrors://kde/stable/release-service/24.12.2/src/ktnef-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/ktnef-24.12.3.tar.xz qt6-base-devel kdoctools-devel @@ -190143,7 +139661,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskitemmodels-devel kunitconversion-devel kcalendarcore-devel - kcalutils-devel + kcalutils-devel kcontacts-devel desktop/kde/applications/ktnef/pspec.xml @@ -190174,7 +139692,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesDevelopment files for ktnef qt6-base-devel - ktnef + ktnef /etc/xdg @@ -190187,6 +139705,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -190215,16 +139740,16 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications Akonadi management and debugging console Akonadi management and debugging console - https://download.kde.org/stable/release-service/24.12.2/src/akonadiconsole-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/akonadiconsole-24.12.3.tar.xz - akonadi-contacts-devel - akonadi-devel - akonadi-calendar-devel - pimcommon-devel - akonadi-mime-devel - calendarsupport-devel + akonadi-contacts-devel + akonadi-devel + akonadi-calendar-devel + pimcommon-devel + akonadi-mime-devel + calendarsupport-devel extra-cmake-modules - kimap-devel + kimap-devel kcalendarcore-devel kcompletion-devel kconfig-devel @@ -190235,8 +139760,8 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskdoctools-devel ki18n-devel kitemmodels-devel - kmime-devel - kpimtextedit-devel + kmime-devel + kpimtextedit-devel ktextwidgets-devel kwidgetsaddons-devel kxmlgui-devel @@ -190244,15 +139769,15 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskitemviews-devel akonadi-search-devel libkdepim-devel - libkleo-devel - messagelib-devel + libkleo-devel + messagelib-devel qt6-base-devel qt6-sql-mysql qt6-sql-postgresql qt6-sql-sqlite qt6-sql-odbc kunitconversion-devel - kidentitymanagement-devel + kidentitymanagement-devel cyrus-sasl-devel gpgme-devel gpgme-qt6-devel @@ -190303,6 +139828,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -190332,7 +139864,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde6.network Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - mirrors://kde/stable/release-service/24.12.2/src/kaccounts-integration-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kaccounts-integration-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -190393,7 +139925,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskaccounts-integration-devel Development files for kaccounts-integration - kaccounts-integration + kaccounts-integration signond-qt6-devel libaccounts-qt6-devel @@ -190406,6 +139938,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -190435,7 +139974,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications Common data for KDE Edu applications Common data for KDE Edu applications. - mirrors://kde/stable/release-service/24.12.2/src/kdeedu-data-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kdeedu-data-24.12.3.tar.xz qt6-base-devel extra-cmake-modules @@ -190453,6 +139992,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -190482,7 +140028,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.games Common code and data for many KDE games Common code and data for many KDE games - mirrors://kde/stable/release-service/24.12.2/src/libkdegames-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/libkdegames-24.12.3.tar.xz qt6-base-devel kdoctools-devel @@ -190558,7 +140104,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceslibkdegames-devel Shared libraries for KDE games. - libkdegames + libkdegames kcompletion-devel @@ -190571,6 +140117,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -190603,7 +140156,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskmines is the classic Minesweeper game. The idea is to uncover all the squares without blowing up any mines. When a mine is blown up, the game is over. kmines klasik mayın tarlası oyununun bir türevidir. Oyunun amacı hiç bir mayına denk gelmemeye çalışarak kutuları açmaktır. Eğer bir mayın patlarsa oyun biter. kmines - mirrors://kde/stable/release-service/24.12.2/src/kmines-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kmines-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -190618,7 +140171,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskxmlgui-devel kio-devel knotifyconfig-devel - libkdegames-devel + libkdegames-devel kdoctools-devel kitemmodels-devel kunitconversion-devel @@ -190651,6 +140204,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -190682,7 +140242,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications A library for interfacing with CDs A library for interfacing with CDs - mirrors://kde/stable/release-service/24.12.2/src/libkcompactdisc-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/libkcompactdisc-24.12.3.tar.xz alsa-lib-devel extra-cmake-modules @@ -190725,7 +140285,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceslibkcompactdisc-devel Development files for libkcompactdisc - libkcompactdisc + libkcompactdisc qt6-base-devel @@ -190737,6 +140297,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -190767,7 +140334,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications A QtQuick plugin to render beautiful and interactive charts A QtQuick plugin to render beautiful and interactive charts - mirrors://kde/stable/release-service/24.12.2/src/kqtquickcharts-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kqtquickcharts-24.12.3.tar.xz extra-cmake-modules glibc-devel @@ -190801,7 +140368,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskqtquickcharts-devel Development files for kqtquickcharts - kqtquickcharts + kqtquickcharts qt6-base-devel @@ -190813,6 +140380,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -190845,7 +140419,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskdiamond is a single player puzzle game. The object of the game is to build lines of three similar diamonds. kdiamond benzer elmaslardan üç tanesinin yan yana getirilmesini konu edinen tek kişilik bir bulmaca oyunudur. kdiamond - mirrors://kde/stable/release-service/24.12.2/src/kdiamond-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kdiamond-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -190861,7 +140435,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskxmlgui-devel knotifications-devel knotifyconfig-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel kcrash-devel kcompletion-devel @@ -190901,6 +140475,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -190932,7 +140513,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesCross-platform QtWebKit browser falkon is a new and very fast QtWebEngine browser falkon is a new and very fast QtWebEngine browser - https://download.kde.org/stable/release-service/24.12.2/src/falkon-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/falkon-24.12.3.tar.xz extra-cmake-modules kwallet-devel @@ -191008,6 +140589,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -191040,7 +140628,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskjumpingcube is a simple tactical game. kjumpingcube basit bir taktik oyunudur. kjumpingcube - mirrors://kde/stable/release-service/24.12.2/src/kjumpingcube-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kjumpingcube-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -191061,7 +140649,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesknewstuff-devel kdoctools-devel kunitconversion-devel - libkdegames-devel + libkdegames-devel desktop/kde/applications/kjumpingcube/pspec.xml @@ -191091,6 +140679,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -191119,17 +140714,17 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications Personal alarm scheduler kalarm is a personal alarm message, audio, command and email scheduler - http://download.kde.org/stable/release-service/24.12.2/src/kalarm-24.12.2.tar.xz + http://download.kde.org/stable/release-service/24.12.3/src/kalarm-24.12.3.tar.xz - akonadi-contacts-devel - akonadi-devel - akonadi-mime-devel + akonadi-contacts-devel + akonadi-devel + akonadi-mime-devel extra-cmake-modules kauth-devel vlc-libs vlc-devel kcalendarcore-devel - kcalutils-devel + kcalutils-devel kcmutils-devel kcodecs-devel kcompletion-devel @@ -191142,33 +140737,33 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskholidays-devel ki18n-devel kiconthemes-devel - kidentitymanagement-devel + kidentitymanagement-devel kio-devel kjobwidgets-devel - kmime-devel + kmime-devel knotifications-devel - kpimtextedit-devel + kpimtextedit-devel kservice-devel kwidgetsaddons-devel kwindowsystem-devel kxmlgui-devel libX11-devel - libkdepim-devel + libkdepim-devel libxslt-devel - mailcommon-devel - pimcommon-devel + mailcommon-devel + pimcommon-devel qt6-base-devel qt6-5compat-devel qt6-phonon-devel kunitconversion-devel kitemmodels-devel kcontacts-devel - messagelib-devel - kimap-devel + messagelib-devel + kimap-devel cyrus-sasl-devel - libkleo-devel + libkleo-devel gpgme-devel - kmailtransport-devel + kmailtransport-devel libcanberra-devel kidletime-devel knotifyconfig-devel @@ -191235,6 +140830,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -191267,7 +140869,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskmix: KDE Digital Mixer kmix: KDE için Dijital Mixer. kmix - mirrors://kde/stable/release-service/24.12.2/src/kmix-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kmix-24.12.3.tar.xz qt6-base-devel kdoctools-devel @@ -191326,6 +140928,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -191358,7 +140967,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesAdmin:// kio protokolünü kullanarak dosyaları yönetici olarak yönetin Admin:// kio protokolünü kullanarak dosyaları yönetici olarak yönetin kio-admin - https://download.kde.org/stable/release-service/24.12.2/src/kio-admin-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/kio-admin-24.12.3.tar.xz kio-devel ki18n-devel @@ -191391,6 +141000,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -191419,11 +141035,11 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications CLI tools to manage akonadi calendars CLI tools to manage akonadi calendars - https://download.kde.org/stable/release-service/24.12.2/src/akonadi-calendar-tools-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/akonadi-calendar-tools-24.12.3.tar.xz boost-devel - akonadi-devel - akonadi-calendar-devel + akonadi-devel + akonadi-calendar-devel extra-cmake-modules kdoctools-devel qt6-base-devel @@ -191433,12 +141049,12 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskcontacts-devel kcalendarcore-devel kunitconversion-devel - akonadi-contacts-devel - kcalutils-devel - libkdepim-devel - calendarsupport-devel - kmime-devel - kidentitymanagement-devel + akonadi-contacts-devel + kcalutils-devel + libkdepim-devel + calendarsupport-devel + kmime-devel + kidentitymanagement-devel desktop/kde/applications/akonadi-calendar-tools/pspec.xml @@ -191468,6 +141084,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -191500,7 +141123,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesksudoku is a logic-based symbol placement puzzle. ksudoku mantık temelli bir sembol yerleştirme oyunudur. ksudoku - https://download.kde.org/stable/release-service/24.12.2/src/ksudoku-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/ksudoku-24.12.3.tar.xz cmake kio-devel @@ -191558,6 +141181,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -191588,7 +141218,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde6.network Additional kio-slaves for kde6 applications Additional kio-slaves for kde6 applications - mirrors://kde/stable/release-service/24.12.2/src/kio-extras-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kio-extras-24.12.3.tar.xz qt6-phonon-devel extra-cmake-modules @@ -191629,7 +141259,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesplasma-activities-stats-devel libtirpc-devel libappimage-devel - libkexiv2-devel + libkexiv2-devel libplist-devel kcmutils-devel ktextwidgets-devel @@ -191704,7 +141334,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskio-extras-devel Development files for kio-extras - kio-extras + kio-extras /usr/include @@ -191715,6 +141345,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -191747,7 +141384,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskbruch is a small program to practice calculating with fractions and percentages. Different exercises are provided for this purpose and you can use the learning mode to practice with fractions. The program checks the user's input and gives feedback. kbruch, ondalık ve kesirli sayılar üzerine işlemleri öğrenmeye ve egzersiz yapmaya yarayan bir uygulamadır. kbruch - mirrors://kde/stable/release-service/24.12.2/src/kbruch-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kbruch-24.12.3.tar.xz qt6-base kdoctools-devel @@ -191786,6 +141423,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -191818,7 +141462,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceskhangman is a game based on the well-known hangman game. It is aimed at children aged six and over. The game has several categories of words to play with, for example: Animals (animals words) and three difficulty categories: Easy, Medium and Hard. khangman, adam asmaca olarak bilinen oyunun 6 yaş ve üzeri için uyarlanmış bir uygulamasıdır. Oynamak için seçilebilecek değişik kategoriler ve 3 farklı zorluk seviyesi bulunuyor. khangman - mirrors://kde/stable/release-service/24.12.2/src/khangman-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/khangman-24.12.3.tar.xz qt6-base-devel kdoctools-devel @@ -191837,7 +141481,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesqt6-svg-devel qt6-linguist qt6-declarative-devel - libkeduvocdocument-devel + libkeduvocdocument-devel extra-cmake-modules desktop/kde/applications/khangman/pspec.xml @@ -191869,6 +141513,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -191898,13 +141549,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.games A single player arcade game bomber is a single player arcade game. The player is invading various cities in a plane that is decreasing in height. - mirrors://kde/stable/release-service/24.12.2/src/bomber-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/bomber-24.12.3.tar.xz extra-cmake-modules qt6-base-devel mesa-devel kxmlgui-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel ki18n-devel kdbusaddons-devel @@ -191949,6 +141600,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -191981,7 +141639,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesanalitza is a library to add mathematical features to programs. analitza, programlara matematiksel özellikler eklemek için bir kitaplıktır. hi32-app-kalgebra - mirrors://kde/stable/release-service/24.12.2/src/analitza-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/analitza-24.12.3.tar.xz cmake eigen3 @@ -192020,7 +141678,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesDevelopment files for analitza analitza için geliştirme dosyaları - analitza + analitza /usr/include @@ -192031,6 +141689,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -192062,7 +141727,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesUygulama şablon oluşturucu. kapptemplate is a shell script that will create the necessary framework to develop several types of applications, including applications based on the KDE development platform. kapptemplate, çeşitli uygulamaları geliştirmek için gerekli olabilecek şablonlar oluşturmayı sağlar. - mirrors://kde/stable/release-service/24.12.2/src/kapptemplate-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kapptemplate-24.12.3.tar.xz qt6-base-devel extra-cmake-modules @@ -192103,6 +141768,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -192135,7 +141807,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesksystemlog show all logs of your system, grouped by General (Default system log, Authentication, Kernel, X.org...), and optional Services (Apache, Cups, etc, ...). ksystemlog, sistemin bütün hata kayıtlarını (genel ve opsiyonel) görüntülemmeye yarayan bir uygulamadır. ksystemlog - mirrors://kde/stable/release-service/24.12.2/src/ksystemlog-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/ksystemlog-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -192192,6 +141864,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -192222,7 +141901,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesAn interactive geometry application kig5 is an application for interactive geometry. kig5 - mirrors://kde/stable/release-service/24.12.2/src/kig-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kig-24.12.3.tar.xz boost-devel ktexteditor5-devel @@ -192276,6 +141955,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -192306,41 +141992,41 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications KDE PIM library providing support for mail applications KDE PIM library providing support for mail applications - mirrors://kde/stable/release-service/24.12.2/src/messagelib-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/messagelib-24.12.3.tar.xz qt6-base-devel extra-cmake-modules boost-devel kdoctools-devel - mailimporter-devel - libgravatar-devel - kidentitymanagement-devel - kmailtransport-devel - kmbox-devel - akonadi-devel + mailimporter-devel + libgravatar-devel + kidentitymanagement-devel + kmailtransport-devel + kmbox-devel + akonadi-devel solid-devel kguiaddons-devel kitemmodels-devel kunitconversion-devel - kmime-devel + kmime-devel kcontacts-devel kcalendarcore-devel - akonadi-search-devel + akonadi-search-devel syntax-highlighting-devel - kpimtextedit-devel - kimap-devel - kldap-devel - grantleetheme-devel - pimcommon-devel - libkleo-devel - libkdepim-devel + kpimtextedit-devel + kimap-devel + kldap-devel + grantleetheme-devel + pimcommon-devel + libkleo-devel + libkdepim-devel gpgme-devel gpgme-qt6-devel qt6-declarative-devel qt6-webengine-devel qca2-qt6-devel - akonadi-mime-devel - akonadi-contacts-devel + akonadi-mime-devel + akonadi-contacts-devel openldap-client cyrus-sasl-devel karchive-devel @@ -192430,7 +142116,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesmessagelib-devel Development files for messagelib - messagelib + messagelib /usr/include @@ -192442,6 +142128,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -192473,7 +142166,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesA KPart for viewing SVGs A KPart for viewing SVGs kdegraphics-svgpart - mirrors://kde/stable/release-service/24.12.2/src/svgpart-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/svgpart-24.12.3.tar.xz extra-cmake-modules gettext-devel @@ -192509,6 +142202,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -192538,7 +142238,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesdesktop.kde.applications Common libraries for KDE Edu applications Libraries for KDE EDU applications. - mirrors://kde/stable/release-service/24.12.2/src/libkeduvocdocument-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/libkeduvocdocument-24.12.3.tar.xz qt6-base-devel extra-cmake-modules @@ -192572,7 +142272,7 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaceslibkeduvocdocument-devel Development files for libkeduvocdocument - libkeduvocdocument + libkeduvocdocument /usr/include @@ -192584,6 +142284,13 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfaces + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -192613,34 +142320,34 @@ org.gnome.Shell.Screenshot or org.gnome.SessionManager D-Bus interfacesKDE Personal Information Manager kontact is the integrated Personal Information Manager of KDE, but can be used with other systems as well. It supports email, address books, calendars, tasks, news feeds and much more. - http://download.kde.org/stable/release-service/24.12.2/src/kontact-24.12.2.tar.xz + http://download.kde.org/stable/release-service/24.12.3/src/kontact-24.12.3.tar.xz boost-devel extra-cmake-modules kdoctools-devel - kontactinterface-devel - mailcommon-devel + kontactinterface-devel + mailcommon-devel qt6-base-devel qt6-webengine-devel kdbusaddons-devel kcmutils-devel - kpimtextedit-devel - akonadi-devel + kpimtextedit-devel + akonadi-devel kitemmodels-devel kparts-devel - akonadi-mime-devel - messagelib-devel - kmime-devel - pimcommon-devel + akonadi-mime-devel + messagelib-devel + kmime-devel + pimcommon-devel kcontacts-devel - akonadi-contacts-devel - kimap-devel + akonadi-contacts-devel + kimap-devel cyrus-sasl-devel - kidentitymanagement-devel - libkleo-devel + kidentitymanagement-devel + libkleo-devel gpgme-devel - grantleetheme-devel - libkdepim-devel + grantleetheme-devel + libkdepim-devel ffmpeg-devel libXScrnSaver-devel kguiaddons-devel @@ -192686,6 +142393,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -192715,7 +142429,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.games Patience card game To play kpatience you need, as the name suggests, patience. For simple games, where the way the game goes depends only upon how the cards fall, your patience might be the only thing you need. - mirrors://kde/stable/release-service/24.12.2/src/kpat-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kpat-24.12.3.tar.xz qt6-base-devel qt6-declarative-devel @@ -192731,7 +142445,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.ktextwidgets-devel kitemmodels-devel knotifyconfig-devel - libkdegames-devel + libkdegames-devel kdeclarative-devel knewstuff-devel ki18n-devel @@ -192788,6 +142502,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -192819,7 +142540,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Onaltılık dosya editörü. Okteta is a simple editor for the raw data of files. This type of program is also called hexadecimal editor or binary editor. Çalıştırılabilir dosyaları düzenlemeye yarayan editör. - https://download.kde.org/stable/okteta/0.26.19/src/okteta-0.26.19.tar.xz + https://download.kde.org/stable/okteta/0.26.20/src/okteta-0.26.20.tar.xz extra-cmake-modules qt5-base-devel @@ -192897,7 +142618,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.okteta-devel Development files for okteta - okteta + okteta /usr/include @@ -192906,6 +142627,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 0.26.20 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-02 0.26.19 @@ -192938,7 +142666,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kruler is a screen ruler and color measurement tool. kruler, bir ekran cetveli ve renk ölçüm aracıdır. kruler - mirrors://kde/stable/release-service/24.12.2/src/kruler-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kruler-24.12.3.tar.xz qt6-base-devel kstatusnotifieritem-devel @@ -192982,6 +142710,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -193013,14 +142748,14 @@ It supports email, address books, calendars, tasks, news feeds and much more.Bir SMTP sunucusu yoluyla e-posta göndermek için işe dayalı kütüphane Job-based library to send email through an SMTP server Job-based library to send email through an SMTP server - https://download.kde.org/stable/release-service/24.12.2/src/ksmtp-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/ksmtp-24.12.3.tar.xz qt6-base-devel extra-cmake-modules kcoreaddons-devel ki18n-devel kio-devel - kmime-devel + kmime-devel cyrus-sasl-devel desktop/kde/applications/ksmtp/pspec.xml @@ -193051,7 +142786,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.ksmtp-devel Development files for ksmtp - ksmtp + ksmtp /usr/include @@ -193063,6 +142798,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -193095,7 +142837,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.okular is a document viewer. okular bir belge göstericidir. okular - mirrors://kde/stable/release-service/24.12.2/src/okular-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/okular-24.12.3.tar.xz qt6-base-devel qt6-multimedia-devel @@ -193107,7 +142849,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.qt6-speech-devel poppler-qt6-devel ebook-tools-devel - libkexiv2-devel + libkexiv2-devel kdoctools-devel threadweaver-devel ki18n-devel @@ -193213,7 +142955,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for okular okular için geliştirme dosyaları - okular + okular /usr/include @@ -193224,6 +142966,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -193255,7 +143004,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Exiv2 sarmalayıcı kitaplığı libkexiv2 is a wrapper around Exiv2 library to manipulate pictures metadata as EXIF/IPTC and XMP. libkexiv2, EXIF/IPTC ve XMP gibi resim meta bilgilerini düzenlemek için kullanılan Exiv2 kitaplığını sarmalayan bir kitaplıktır. - mirrors://kde/stable/release-service/24.12.2/src/libkexiv2-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/libkexiv2-24.12.3.tar.xz extra-cmake-modules cmake @@ -193287,7 +143036,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for libkexiv2 libkexiv2 için geliştirme dosyaları - libkexiv2 + libkexiv2 /usr/include @@ -193298,6 +143047,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -193326,7 +143082,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Mail sieve editor Mail sieve editor - https://download.kde.org/stable/release-service/24.12.2/src/pim-sieve-editor-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/pim-sieve-editor-24.12.3.tar.xz extra-cmake-modules kbookmarks-devel @@ -193335,20 +143091,20 @@ It supports email, address books, calendars, tasks, news feeds and much more.kdoctools-devel kiconthemes-devel kio-devel - kmailtransport-devel - kpimtextedit-devel - messagelib-devel - pimcommon-devel + kmailtransport-devel + kpimtextedit-devel + messagelib-devel + pimcommon-devel qt6-base-devel - akonadi-mime-devel - akonadi-devel + akonadi-mime-devel + akonadi-devel kitemmodels-devel - kmime-devel + kmime-devel cyrus-sasl-devel kcontacts-devel - akonadi-contacts-devel - kimap-devel - libksieve-devel + akonadi-contacts-devel + kimap-devel + libksieve-devel ffmpeg-devel kuserfeedback-devel libXScrnSaver-devel @@ -193389,6 +143145,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -193419,7 +143182,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Google Drive'a erişmek için kio Slave kio Slave to access Google Drive Google Drive'a erişmek için kio Slave - mirrors://kde/stable/release-service/24.12.2/src/kio-gdrive-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kio-gdrive-24.12.3.tar.xz intltool kio-devel @@ -193470,6 +143233,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -193503,7 +143273,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Hafıza geliştirme oyunu. blinken is based on an electronic game released in 1978, which challenges players to remember sequences of increasing length. On the face of the device, there are 4 different color buttons, each one with their own distinctive sound. Hafıza geliştirme oyunu. - mirrors://kde/stable/release-service/24.12.2/src/blinken-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/blinken-24.12.3.tar.xz extra-cmake-modules gettext-devel @@ -193545,6 +143315,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -193576,7 +143353,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Çay yapma zamanlayıcısı. kteatime is a handy timer for steeping tea. No longer will you have to guess at how long it takes for your tea to be ready. kteatime çay yapmak için kullanışlı bir uygulamadır. kteatime ile çay demlemek için ne kadar beklemek gerektiğini düşünmenize gerek kalmaz. - mirrors://kde/stable/release-service/24.12.2/src/kteatime-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kteatime-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -193623,6 +143400,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -193653,7 +143437,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Google API library for KDE A KDE-based library for accessing various Google services via their public API - https://download.kde.org/stable/release-service/24.12.2/src/libkgapi-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/libkgapi-24.12.3.tar.xz qt6-base-devel kcoreaddons-devel @@ -193708,7 +143492,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kcontacts-devel kio-devel kwindowsystem-devel - libkgapi + libkgapi /usr/include @@ -193720,6 +143504,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -193752,7 +143543,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.knavalbattle is a Battle Ship game for KDE. Ships are placed on a board which represents the sea. Players try to hit each others ships in turns without knowing where they are placed. The first player to destroy all ships wins the game. KBattleship KDE için bir Amiral Battı oyunudur. Gemiler denizi temsil eden oyun tahtasına yerleştirilir ve oyuncular rakiplerinin gemilerinin yerleşimini tahmin ederek gemileri vurmaya çalışır. Rakibinin tüm gemilerini daha önce batıran oyuncu kazanır. knavalbattle - mirrors://kde/stable/release-service/24.12.2/src/knavalbattle-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/knavalbattle-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -193764,7 +143555,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kxmlgui-devel kdoctools-devel ktextwidgets-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel kitemmodels-devel kunitconversion-devel @@ -193806,6 +143597,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -193837,7 +143635,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Uzak masaüstü bağlantı istemcisi. krdc is a client application that allows you to view or even control the desktop session on another machine that is running a compatible server. VNC and RDP is supported. krdc, uzaktaki bir masaüstü oturumunu görüntülemenizi ve kontrol etmenizi sağlar. RDP kullanan Windows Terminal Sunucuları'na ve VNC/RFB kullanan diğer pek çok platforma bağlanabilirç - mirrors://kde/stable/release-service/24.12.2/src/krdc-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/krdc-24.12.3.tar.xz qt6-base-devel qt6-wayland-devel @@ -193918,7 +143716,7 @@ It supports email, address books, calendars, tasks, news feeds and much more. krdc-devel - krdc + krdc /usr/include @@ -193928,6 +143726,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -194244,7 +144049,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Periodic Table of Elements Elementlerin periyodik tablosu Elementlerin periyodik tablosu - https://download.kde.org/stable/release-service/24.12.2/src/kalzium-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/kalzium-24.12.3.tar.xz cmake eigen3 @@ -194311,7 +144116,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kalzium-devel Development files for kalzium - kalzium + kalzium /usr/include @@ -194322,6 +144127,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -194350,10 +144162,10 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications KDE File Manager dolphin is the File Manager for KDE. - mirrors://kde/stable/release-service/24.12.2/src/dolphin-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/dolphin-24.12.3.tar.xz baloo-devel - baloo-widgets-devel + baloo-widgets-devel kfilemetadata-devel extra-cmake-modules plasma-activities-devel @@ -194376,7 +144188,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.solid-devel qt6-base-devel qt6-phonon-devel - kio-extras-devel + kio-extras-devel libxml2-devel docbook-xsl kuserfeedback-devel @@ -194436,7 +144248,7 @@ It supports email, address books, calendars, tasks, news feeds and much more. dolphin-devel - dolphin + dolphin qt6-base-devel qt6-phonon-devel kio-devel @@ -194444,7 +144256,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.knewstuff-devel plasma-activities-devel baloo-devel - baloo-widgets-devel + baloo-widgets-devel kfilemetadata-devel kparts-devel ktexteditor-devel @@ -194459,6 +144271,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -194494,7 +144313,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kdenlive, ikili video izleyicileri, çoklu parça zaman çizelgesi ve klip listesi sunmaktadır. Diğer özellikler arasında özelleştirilebilir düzenleme desteği, temel efektler ve geçişler sayılabilir. kdenlive jest nieliniowym pakietem do edycji wideo obsługującym DV, HDC i wiele innych formatów. kdenlive - mirrors://kde/stable/release-service/24.12.2/src/kdenlive-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kdenlive-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -194594,6 +144413,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -194626,7 +144452,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kturtle is an educational programming environment that aims to make learning how to program as easily as possible. To achieve this kturtle makes all programming tools available from the user interface. The programming language used is TurtleScript which allows its commands to be translated. kturtle, programlama öğrenmeyi olabildiğince kolaylaştırmak için tasarlanmış bir programlama uygulamasıdır. Bu amaçla tasarlanan arayüz tüm gerekli araçları kullanıcıya sunar. Ayrıca kullanılan programlama dili olan TurtleScript başka dillere çevrilebilen bir yapıya sahiptir. kturtle - mirrors://kde/stable/release-service/24.12.2/src/kturtle-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kturtle-24.12.3.tar.xz qt6-base-devel qt6-svg-devel @@ -194674,6 +144500,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -194706,7 +144539,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kanagram is a game based on anagrams of words: the puzzle is solved when the letters of the scrambled word are put back in the correct order. There is no limit on either time taken, or the amount of attempts to solve the word. kanagram, anagramlar üzerine bir oyundur. Dağınık yerleştirilmiş harfleri birleştirerek kelimeyi bulun. Zaman veya deneme sınırı yoktur. kanagram - mirrors://kde/stable/release-service/24.12.2/src/kanagram-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kanagram-24.12.3.tar.xz qt6-base-devel qt6-declarative @@ -194723,7 +144556,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kxmlgui kwidgetsaddons-devel extra-cmake-modules - libkeduvocdocument-devel + libkeduvocdocument-devel qt6-multimedia-devel desktop/kde/applications/kanagram/pspec.xml @@ -194756,6 +144589,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -194785,7 +144625,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.games A simple constructor game suitable for children and adults alike ktuberling a simple constructor game suitable for children and adults alike. The idea of the game is based around a once popular doll making concept. - mirrors://kde/stable/release-service/24.12.2/src/ktuberling-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/ktuberling-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -194807,7 +144647,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.knewstuff-devel kdoctools-devel kunitconversion-devel - libkdegames-devel + libkdegames-devel desktop/kde/applications/ktuberling/pspec.xml @@ -194848,6 +144688,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -194877,7 +144724,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde6.utils KDE Archiving Tool Ark is a program for managing various archive formats within the KDE environment. - mirrors://kde/stable/release-service/24.12.2/src/ark-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/ark-24.12.3.tar.xz qt6-base-devel rar @@ -194954,6 +144801,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -194986,7 +144840,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kalgebra is a fully featured calculator that lets you plot different types of 2D and 3D functions and to calculate easy and not so easy calculations, such as addition, trigonometric functions or derivatives. kalgebra, farklı farklı 2B ve 3B fonksiyonları çizmek, kolay ve o kadar da kolay olmayan trigonometrik veya türev gibi hesaplamaları yapmak için bir uygulamadır. kalgebra - mirrors://kde/stable/release-service/24.12.2/src/kalgebra-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kalgebra-24.12.3.tar.xz mesa-devel mesa-glu-devel @@ -194994,7 +144848,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.qt6-declarative qt6-svg-devel qt6-5compat-devel - analitza-devel + analitza-devel kdoctools-devel ncurses-devel readline-devel @@ -195037,6 +144891,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -195066,7 +144927,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde6.network kwallet signon extension kwallet signon extension - mirrors://kde/stable/release-service/24.12.2/src/signon-kwallet-extension-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/signon-kwallet-extension-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -195093,6 +144954,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -195122,7 +144990,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Library for Grantlee theming support Library for Grantlee theming support - mirrors://kde/stable/release-service/24.12.2/src/grantleetheme-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/grantleetheme-24.12.3.tar.xz qt6-base-devel boost-devel @@ -195184,7 +145052,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.boost-devel ki18n-devel ktexttemplate-devel - grantleetheme + grantleetheme /usr/lib/cmake @@ -195195,6 +145063,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -195224,7 +145099,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.games Common code, backgrounds and tile sets for games using Mahjongg tiles Common code, backgrounds and tile sets for games using Mahjongg tiles. - mirrors://kde/stable/release-service/24.12.2/src/libkmahjongg-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/libkmahjongg-24.12.3.tar.xz qt6-base-devel qt6-svg-devel @@ -195268,7 +145143,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.libkmahjongg-devel Development files for libkmahjongg - libkmahjongg + libkmahjongg /usr/include @@ -195280,6 +145155,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -195312,7 +145194,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.granatier is a clone of the classic bomberman game, inspired by the work of the Clanbomber clone. granatier, oyuncunun yüksekliği her turda azalan bir uçak içinde şehirlere hücum ettiği tek kişilik bir macera oyunudur. granatier - mirrors://kde/stable/release-service/24.12.2/src/granatier-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/granatier-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -195325,7 +145207,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.ki18n-devel kxmlgui-devel knewstuff-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel kdoctools-devel kcompletion-devel @@ -195363,6 +145245,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -195395,7 +145284,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kcolorchooser is a simple color chooser application. kcolorchooser, basit bir renk seçme uygulamasıdır. kcolorchooser - mirrors://kde/stable/release-service/24.12.2/src/kcolorchooser-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kcolorchooser-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -195428,6 +145317,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -195460,7 +145356,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kollision is ball dodging game. Click on the empty field to start a game: a blue ball immediately replaces your mouse cursor, and a number of red balls start to fade into the field. kollision basit bir top sıçratma oyunudur. Boş bir alana fareyle tıkladığınızda oyun başlar ve fare imlecinizin yerini mavi bir top alır, ayrıca olayların gelişmesine vesile olacak kırmızı toplar da alandaki yerlerini alırlar. kollision - mirrors://kde/stable/release-service/24.12.2/src/kollision-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kollision-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -195477,7 +145373,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kio-devel knotifyconfig-devel knewstuff-devel - libkdegames-devel + libkdegames-devel kdoctools-devel kitemmodels-devel kunitconversion-devel @@ -195507,6 +145403,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -195536,7 +145439,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications KDE PIM cryptographic library KDE PIM cryptographic library - mirrors://kde/stable/release-service/24.12.2/src/libkleo-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/libkleo-24.12.3.tar.xz qt6-base-devel boost-devel @@ -195560,7 +145463,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kcontacts-devel kcalendarcore-devel extra-cmake-modules - kpimtextedit-devel + kpimtextedit-devel desktop/kde/applications/libkleo/pspec.xml @@ -195631,7 +145534,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.boost-devel gpgme-devel gpgme-qt6-devel - libkleo + libkleo /usr/lib/cmake @@ -195644,6 +145547,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -195674,7 +145584,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications KDE PIM library providing support for mail applications KDE PIM library providing support for mail applications - mirrors://kde/stable/release-service/24.12.2/src/mailcommon-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/mailcommon-24.12.3.tar.xz qt6-base-devel qt6-phonon-devel @@ -195687,33 +145597,33 @@ It supports email, address books, calendars, tasks, news feeds and much more.kdoctools-devel kio-devel ki18n-devel - mailimporter-devel - messagelib-devel - libgravatar-devel - kidentitymanagement-devel - kmailtransport-devel - kmbox-devel - akonadi-devel + mailimporter-devel + messagelib-devel + libgravatar-devel + kidentitymanagement-devel + kmailtransport-devel + kmbox-devel + akonadi-devel kjobwidgets-devel solid-devel kitemmodels-devel kcompletion-devel kiconthemes-devel kunitconversion-devel - kmime-devel + kmime-devel kcontacts-devel kcalendarcore-devel - kpimtextedit-devel - kimap-devel - kldap-devel - grantleetheme-devel - pimcommon-devel - libkleo-devel - libkdepim-devel + kpimtextedit-devel + kimap-devel + kldap-devel + grantleetheme-devel + pimcommon-devel + libkleo-devel + libkdepim-devel gpgme-devel gpgme-qt6-devel - akonadi-mime-devel - akonadi-contacts-devel + akonadi-mime-devel + akonadi-contacts-devel openldap-client cyrus-sasl-devel syntax-highlighting-devel @@ -195775,7 +145685,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for mailcommon qt6-webengine-devel - mailcommon + mailcommon /usr/include @@ -195787,6 +145697,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -195819,7 +145736,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.katomic is both fun and educational game built around molecular geometry. katomic moleküler geometri hakkında hem eğlenceli hem de eğitici bir oyundur. katomic - mirrors://kde/stable/release-service/24.12.2/src/katomic-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/katomic-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -195835,7 +145752,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kio-devel knotifyconfig-devel knewstuff-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel kdoctools-devel kitemmodels-devel @@ -195869,6 +145786,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -195899,7 +145823,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications KDE library for handling mail messages and newsgroup articles. kmime library for handling mail messages and newsgroup articles. - mirrors://kde/stable/release-service/24.12.2/src/kmime-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kmime-24.12.3.tar.xz qt6-base-devel extra-cmake-modules @@ -195934,7 +145858,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for kmime qt6-base-devel - kmime + kmime /usr/include @@ -195946,6 +145870,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -195978,7 +145909,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kiriki is an addictive and fun dice game for KDE, designed to be played by as many as six players. kiriki KDE için alışkanlık yapan ve eğlenceli bir zar oyunudur. Altı oyuncuya kadar birlikte oynanabilir. kiriki - mirrors://kde/stable/release-service/24.12.2/src/kiriki-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kiriki-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -195993,7 +145924,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kiconthemes-devel kxmlgui-devel kio-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel kitemmodels-devel kunitconversion-devel @@ -196026,6 +145957,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -196058,7 +145996,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Filesharing configuration modlue. Dosya paylaşım konfigürasyon modülü. kdenetwork-filesharing - mirrors://kde/stable/release-service/24.12.2/src/kdenetwork-filesharing-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kdenetwork-filesharing-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -196104,6 +146042,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -196136,7 +146081,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.libkdcraw is a C++ interface around LibRaw library used to decode RAW picture files. libkdcraw, RAW resim dosyalarını çözmek için kullanılan LibRaW kitaplığının C++ arayüzüdür. libkdcraw - mirrors://kde/stable/release-service/24.12.2/src/libkdcraw-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/libkdcraw-24.12.3.tar.xz qt6-base-devel kdoctools-devel @@ -196173,7 +146118,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for libkdcraw libkdcraw için geliştirme dosyaları - libkdcraw + libkdcraw qt6-base-devel libraw-devel kconfig-devel @@ -196189,6 +146134,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -196219,11 +146171,11 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications A QtQuick plugin to render beautiful and interactive charts kgpg is a simple interface for GnuPG, a powerful encryption utility. - mirrors://kde/stable/release-service/24.12.2/src/kgpg-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kgpg-24.12.3.tar.xz - akonadi-devel + akonadi-devel boost-devel - akonadi-contacts-devel + akonadi-contacts-devel gettext-devel glibc-devel gpgme-devel @@ -196301,6 +146253,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -196330,7 +146289,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.bindings kross5 interpreter plugins for programming languages Language interpreters to enable in-process scripting with kross5. - mirrors://kde/stable/release-service/24.12.2/src/kross-interpreters-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kross-interpreters-24.12.3.tar.xz extra-cmake-modules kdoctools5-devel @@ -196365,6 +146324,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -196396,7 +146362,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Resim çizme bulmacası picmi is a single player logic-based puzzle game. The goal is to color cells according to numbers given at the side of the board in order to uncover a hidden pattern or picture. picmi, tablonun kenarında verilen sayılar kadar tabla üzerinde nokta koyarak bir resim tamamlama bulmacasıdır. - https://download.kde.org/stable/release-service/24.12.2/src/picmi-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/picmi-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -196410,7 +146376,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kio-devel knewstuff-devel kxmlgui-devel - libkdegames-devel + libkdegames-devel kitemmodels-devel kunitconversion-devel @@ -196441,6 +146407,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -196471,34 +146444,34 @@ It supports email, address books, calendars, tasks, news feeds and much more.Kişilerinizi kolayca yönetin kaddressbook reborn to make your data available to all your applications kaddressbook, kişilerinizi kolayca yönetmenizi sağlar. Bir e-posta gönderirken veya bir toplantı daveti oluştururken kolayca kişileri seçmenize olanak tanıyan kontact'ın geri kalanıyla derinlemesine entegre edilmiştir. - mirrors://kde/stable/release-service/24.12.2/src/kaddressbook-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kaddressbook-24.12.3.tar.xz - kimap-devel + kimap-devel kparts-devel kcrash-devel prison-devel - akonadi-devel - libkleo-devel + akonadi-devel + libkleo-devel kcmutils-devel qt6-base-devel - libkdepim-devel - pimcommon-devel - kldap-devel + libkdepim-devel + pimcommon-devel + kldap-devel kdoctools-devel - mailcommon-devel - messagelib-devel + mailcommon-devel + messagelib-devel kdbusaddons-devel cyrus-sasl-devel kitemmodels-devel - akonadi-mime-devel - kpimtextedit-devel - grantleetheme-devel + akonadi-mime-devel + kpimtextedit-devel + grantleetheme-devel extra-cmake-modules - akonadi-search-devel + akonadi-search-devel kunitconversion-devel - kontactinterface-devel - akonadi-contacts-devel - kidentitymanagement-devel + kontactinterface-devel + akonadi-contacts-devel + kidentitymanagement-devel kuserfeedback-devel gpgme-devel gpgme-qt6-devel @@ -196548,7 +146521,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kaddressbook-devel Development files for kaddressbook - kaddressbook + kaddressbook /usr/include @@ -196560,6 +146533,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -196591,7 +146571,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.KDE için web kamera desteği kamera is a plugin for KDE to use webcam. kamera, KDE için bir web kamera eklentisidir. - mirrors://kde/stable/release-service/24.12.2/src/kamera-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kamera-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -196632,6 +146612,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -196661,7 +146648,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Common libraries for KDE PIM Common libraries for KDE PIM - mirrors://kde/stable/release-service/24.12.2/src/pimcommon-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/pimcommon-24.12.3.tar.xz qt6-base-devel boost-devel @@ -196671,9 +146658,9 @@ It supports email, address books, calendars, tasks, news feeds and much more.qt6-sql-odbc qt6-sql-postgresql prison-devel - kmbox-devel + kmbox-devel qt6-phonon-devel - akonadi-devel + akonadi-devel libical-devel libgpg-error-devel libxslt-devel @@ -196685,20 +146672,20 @@ It supports email, address books, calendars, tasks, news feeds and much more.kdoctools-devel kitemmodels-devel kunitconversion-devel - kmime-devel + kmime-devel kcontacts-devel kcalendarcore-devel - kldap-devel - libkdepim-devel + kldap-devel + libkdepim-devel extra-cmake-modules - akonadi-contacts-devel - akonadi-search-devel - akonadi-mime-devel + akonadi-contacts-devel + akonadi-search-devel + akonadi-mime-devel qt6-webengine-devel kdoctools-devel knewstuff-devel - kpimtextedit-devel - kimap-devel + kpimtextedit-devel + kimap-devel purpose-devel ktextaddons-devel @@ -196776,7 +146763,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.qt6-base-devel boost-devel ktextaddons-devel - pimcommon + pimcommon /usr/lib/cmake @@ -196789,6 +146776,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -196891,7 +146885,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kcharselect is a tool to select special characters from all installed fonts and copy them into the clipboard. kcharselect, tüm yüklü yazı tiplerinden özel karakterleri seçmek ve bunları panoya yapıştırmak için bir araçtır. kcharselect - mirrors://kde/stable/release-service/24.12.2/src/kcharselect-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kcharselect-24.12.3.tar.xz qt6-base-devel kdoctools-devel @@ -196929,6 +146923,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -196958,7 +146959,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications A KDE Software for Music Education Music education Free Software, thoughtfully designed to push your musical skills to the next level. Enhance your ability to recognize intervals, chords, rhythm, and scales while enjoying all the power of Free Software. - https://download.kde.org/stable/release-service/24.12.2/src/minuet-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/minuet-24.12.3.tar.xz extra-cmake-modules qt6-svg-devel @@ -197016,7 +147017,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for minuet qt6-base-devel - minuet + minuet /usr/include @@ -197028,6 +147029,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -197059,12 +147067,12 @@ It supports email, address books, calendars, tasks, news feeds and much more.dolphin eklentileri. This package contains plugins that offer integration in dolphin with the following version control systems: dolphin için VCS (Version Control System) eklentileri. - mirrors://kde/stable/release-service/24.12.2/src/dolphin-plugins-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/dolphin-plugins-24.12.3.tar.xz qt6-base-devel qt6-5compat-devel kdoctools-devel - dolphin-devel + dolphin-devel kio-devel extra-cmake-modules @@ -197098,6 +147106,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -197127,7 +147142,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications An application to enable/disable qCDebug KDebug control module for KDE. It provides a graphical frontend for the kdebug daemon, which allow enabling or disabling particular debug areas/messages. - mirrors://kde/stable/release-service/24.12.2/src/kdebugsettings-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kdebugsettings-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -197173,6 +147188,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -197205,7 +147227,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kfourinline is a board game for two players based on the Connect-Four game. kfourinline iki kişiyle oynanan Hedef 4 türevi bir oyundur. kfourinline - mirrors://kde/stable/release-service/24.12.2/src/kfourinline-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kfourinline-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -197227,7 +147249,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.knotifyconfig-devel kdoctools-devel kunitconversion-devel - libkdegames-devel + libkdegames-devel desktop/kde/applications/kfourinline/pspec.xml @@ -197259,6 +147281,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -197288,7 +147317,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.games Shisen-Sho Mahjongg like tile game Shisen-Sho is a solitaire-like game played using the standard set of Mahjong tiles. Unlike Mahjong however, Shisen-Sho has only one layer of scrambled tiles. - mirrors://kde/stable/release-service/24.12.2/src/kshisen-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kshisen-24.12.3.tar.xz qt6-base-devel qt6-declarative-devel @@ -197302,8 +147331,8 @@ It supports email, address books, calendars, tasks, news feeds and much more.kcoreaddons-devel kcoreaddons-devel kdbusaddons-devel - libkdegames-devel - libkmahjongg-devel + libkdegames-devel + libkmahjongg-devel knewstuff-devel kdnssd-devel kdeclarative-devel @@ -197340,6 +147369,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -197369,7 +147405,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications A user friendly IRC client for KDE konversation is a user-friendly Internet Relay Chat (IRC) client built on the KDE Platform. - https://download.kde.org/stable/release-service/24.12.2/src/konversation-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/konversation-24.12.3.tar.xz qt6-base-devel qt6-5compat-devel @@ -197460,6 +147496,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -197489,7 +147532,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.sdk Scripts and setting files useful during development of KDE software Scripts and setting files useful during development of KDE software - mirrors://kde/stable/release-service/24.12.2/src/kde-dev-scripts-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kde-dev-scripts-24.12.3.tar.xz qt6-base-devel extra-cmake-modules @@ -197516,6 +147559,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -197547,7 +147597,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Apple Wallet Pass reader Apple Cüzdan Geçiş okuyucusu Apple Cüzdan Geçiş okuyucusu - https://download.kde.org/stable/release-service/24.12.2/src/kpkpass-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/kpkpass-24.12.3.tar.xz qt6-base-devel extra-cmake-modules @@ -197577,7 +147627,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kpkpass-devel Development files for kpkpass - kpkpass + kpkpass /usr/include @@ -197588,6 +147638,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -197619,7 +147676,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.View Disk Usage KDiskFree displays the available file devices (hard drive partitions, floppy and CD drives, etc.) along with information on their capacity, free space, type and mount point. It also allows you to mount and unmount drives and view them in a file manager. kdf - http://download.kde.org/stable/release-service/24.12.2/src/kdf-24.12.2.tar.xz + http://download.kde.org/stable/release-service/24.12.3/src/kdf-24.12.3.tar.xz extra-cmake-modules gettext-devel @@ -197669,6 +147726,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -197697,11 +147761,11 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications CLI tools to manage akonadi calendars Import data from other mail clients to kmail - https://download.kde.org/stable/release-service/24.12.2/src/akonadi-import-wizard-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/akonadi-import-wizard-24.12.3.tar.xz boost-devel - akonadi-devel - akonadi-calendar-devel + akonadi-devel + akonadi-calendar-devel extra-cmake-modules kio-devel kdoctools-devel @@ -197714,23 +147778,23 @@ It supports email, address books, calendars, tasks, news feeds and much more.kcalendarcore-devel kiconthemes-devel kunitconversion-devel - akonadi-contacts-devel - kcalutils-devel - libkdepim-devel - calendarsupport-devel - kmime-devel - kidentitymanagement-devel - kmailtransport-devel - akonadi-mime-devel + akonadi-contacts-devel + kcalutils-devel + libkdepim-devel + calendarsupport-devel + kmime-devel + kidentitymanagement-devel + kmailtransport-devel + akonadi-mime-devel cyrus-sasl-devel - mailcommon-devel - messagelib-devel - pimcommon-devel - kimap-devel - libkleo-devel + mailcommon-devel + messagelib-devel + pimcommon-devel + kimap-devel + libkleo-devel gpgme-devel gpgme-qt6-devel - mailimporter-devel + mailimporter-devel ffmpeg-devel libXScrnSaver-devel @@ -197777,7 +147841,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.akonadi-import-wizard-devel Development files for akonadi-import-wizard - akonadi-import-wizard + akonadi-import-wizard /usr/include @@ -197788,6 +147852,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -197887,7 +147958,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Editor for Grantlee themes Editor for Grantlee themes - mirrors://kde/stable/release-service/24.12.2/src/grantlee-editor-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/grantlee-editor-24.12.3.tar.xz qt6-webengine-devel kcrash-devel @@ -197900,24 +147971,24 @@ It supports email, address books, calendars, tasks, news feeds and much more.kwallet-devel knewstuff-devel karchive-devel - pimcommon-devel - messagelib-devel - grantleetheme-devel - akonadi-mime-devel - kpimtextedit-devel - libkdepim-devel + pimcommon-devel + messagelib-devel + grantleetheme-devel + akonadi-mime-devel + kpimtextedit-devel + libkdepim-devel syntax-highlighting-devel - libkleo-devel + libkleo-devel kparts-devel gpgme-devel gpgme-qt6-devel cyrus-sasl-devel - akonadi-devel + akonadi-devel kitemmodels-devel kcontacts-devel - akonadi-contacts-devel - kimap-devel - kmime-devel + akonadi-contacts-devel + kimap-devel + kmime-devel ffmpeg-devel libXScrnSaver-devel @@ -197962,6 +148033,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -197993,13 +148071,13 @@ It supports email, address books, calendars, tasks, news feeds and much more.KDE önizleme kitaplıkları kdegraphics-thumbnailers contains thumbnail-related libraries. kdegraphics-thumbnailers, önizleme kitaplıklarını içerir. - mirrors://kde/stable/release-service/24.12.2/src/kdegraphics-thumbnailers-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kdegraphics-thumbnailers-24.12.3.tar.xz extra-cmake-modules qt6-base-devel kio-devel - libkdcraw-devel - libkexiv2-devel + libkdcraw-devel + libkexiv2-devel kdegraphics-mobipocket-devel karchive-devel @@ -198026,6 +148104,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -198057,7 +148142,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.KDE Help Center KDE help center utility to read help documentation about various KDE applications. khelpcenter - mirrors://kde/stable/release-service/24.12.2/src/khelpcenter-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/khelpcenter-24.12.3.tar.xz qt6-base-devel qt6-webengine-devel @@ -198119,6 +148204,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -198147,7 +148239,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications A sound editor for KDE With kwave you can record, play back, import and edit many sorts of audio files including multi channel files.kwave includes some plugins to transform audio files in several ways and presents a graphical view with a complete zoom- and scroll capability. - http://download.kde.org/stable/release-service/24.12.2/src/kwave-24.12.2.tar.xz + http://download.kde.org/stable/release-service/24.12.3/src/kwave-24.12.3.tar.xz doxygen kdoctools-devel @@ -198220,6 +148312,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -198250,7 +148349,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications kontact Plugin Interface Library This library provides the glue necessary for application "Parts" to be embedded as a kontact component (or plugin). - mirrors://kde/stable/release-service/24.12.2/src/kontactinterface-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kontactinterface-24.12.3.tar.xz qt6-base-devel kdoctools-devel @@ -198292,7 +148391,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for kontactinterface qt6-base-devel - kontactinterface + kontactinterface /usr/include @@ -198304,6 +148403,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -198336,7 +148442,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.klickety is a kind of solitary game that takes place on a Tetris-like board. klickety Tetris gibi tahta üzerinde yer alan bir tür soliter oyunu klickety - mirrors://kde/stable/release-service/24.12.2/src/klickety-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/klickety-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -198351,7 +148457,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.knotifyconfig-devel kdbusaddons-devel knotifications-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel kitemmodels-devel kunitconversion-devel @@ -198393,6 +148499,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -198422,11 +148535,11 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde6.network Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others Small system to administer web accounts for the sites and services across the KDE desktop, including: Google, Facebook, Owncloud, IMAP, Jabber and others - mirrors://kde/stable/release-service/24.12.2/src/kaccounts-providers-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kaccounts-providers-24.12.3.tar.xz extra-cmake-modules intltool - kaccounts-integration-devel + kaccounts-integration-devel qt6-declarative-devel qt6-webengine-devel qt6-base-devel @@ -198472,6 +148585,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -198504,7 +148624,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.ktimer is a little tool to execute programs after some time. It allows you to enter several tasks and to set a timer for each of them. The timers for each task can be started, stopped, changed, or looped. ktimer is a little tool to execute programs after some time. It allows you to enter several tasks and to set a timer for each of them. The timers for each task can be started, stopped, changed, or looped. ktimer - mirrors://kde/stable/release-service/24.12.2/src/ktimer-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/ktimer-24.12.3.tar.xz qt6-base-devel qt6-5compat-devel @@ -198548,6 +148668,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -198866,7 +148993,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications The KDE calendar utility library Calendar utility library for KDE - mirrors://kde/stable/release-service/24.12.2/src/kcalutils-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kcalutils-24.12.3.tar.xz qt6-base-devel kcalendarcore-devel @@ -198875,7 +149002,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kconfig-devel ki18n-devel kcodecs-devel - kidentitymanagement-devel + kidentitymanagement-devel kitemmodels-devel kunitconversion-devel kwidgetsaddons-devel @@ -198917,7 +149044,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for kcalutils qt6-base-devel - kcalutils + kcalutils /usr/include @@ -198929,6 +149056,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -198960,7 +149094,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.KDE için indirme yönetcisi. kget is an advanced download manager with support for Metalink and Bittorrent. kget, Metalink ve BitTorrent desteği olan bir indirme yöneticisidir. - mirrors://kde/stable/release-service/24.12.2/src/kget-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kget-24.12.3.tar.xz kio-devel gmp-devel @@ -198987,7 +149121,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kdbusaddons-devel kiconthemes-devel kcoreaddons-devel - libktorrent-devel + libktorrent-devel kcompletion-devel qt6-sql-postgresql ktextwidgets-devel @@ -199045,6 +149179,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -199075,7 +149216,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Translation file thumbnail generators Translation file thumbnail generators kdesdk-thumbnailers - mirrors://kde/stable/release-service/24.12.2/src/kdesdk-thumbnailers-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kdesdk-thumbnailers-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -199113,6 +149254,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -199143,11 +149291,11 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Job-based API for interacting with IMAP servers API for interacting with IMAP servers - mirrors://kde/stable/release-service/24.12.2/src/kimap-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kimap-24.12.3.tar.xz qt6-base-devel kdoctools-devel - kmime-devel + kmime-devel boost-devel kio-devel ki18n-devel @@ -199188,7 +149336,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for kimap qt6-base-devel - kimap + kimap /usr/include @@ -199200,6 +149348,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -199230,7 +149385,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.The syntax is very much inspired from the "dialog" command (which shows text mode dialogs). kdialog - mirrors://kde/stable/release-service/24.12.2/src/kdialog-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kdialog-24.12.3.tar.xz extra-cmake-modules gettext-devel @@ -199286,6 +149441,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -199318,7 +149480,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.ksquares is a fun and exciting game that modeled after the well known pen and paper based game of Dots and Boxes. ksquares sıkıcı derslerin kurtarıcısı, eğlenceli ve heyecanlı kare yapma oyununun KDE sürümüdür. ksquares - mirrors://kde/stable/release-service/24.12.2/src/ksquares-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/ksquares-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -199335,7 +149497,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kxmlgui-devel kio-devel knotifyconfig-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel kitemmodels-devel kunitconversion-devel @@ -199367,6 +149529,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -199400,7 +149569,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.gwenview is an easy to use image viewer gwenview, kullanımı kolay bir resim görüntüleyicisidir. gwenview - mirrors://kde/stable/release-service/24.12.2/src/gwenview-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/gwenview-24.12.3.tar.xz exiv2-devel qt6-base-devel @@ -199417,7 +149586,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kitemmodels-devel kunitconversion-devel baloo-devel - libkdcraw-devel + libkdcraw-devel libpng-devel zlib-devel mesa-devel @@ -199501,6 +149670,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -199533,7 +149709,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kbounce is a single player arcade game with the elements of puzzle. It is played on a field, surrounded by walls, with two or more balls that move about in the field bouncing off of walls. The player can build new walls, decreasing the size of the active field. The goal of the game is to fill at least 75% of the field and advance to the next level. kbounce, Volfied'in oynaniş tarzına benzeyen tek kişilik bir bulmaca - macera oyunudur. Oyuncu iki veya daha fazla topun oradan oraya zıpladığı duvarlarla kaplı bir alanda yeni duvarlar inşa ederek ve toplara yakalanmamaya çalışarak aktif alanın en azından %75'ini kapatmaya çalışmaktadır. kbounce - mirrors://kde/stable/release-service/24.12.2/src/kbounce-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kbounce-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -199551,7 +149727,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kxmlgui-devel kio-devel knotifyconfig-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel kdoctools-devel kitemmodels-devel @@ -199586,6 +149762,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -199617,13 +149800,13 @@ It supports email, address books, calendars, tasks, news feeds and much more.Dosya karşılaştırma göstericisi. Diff/Patch Frontend. Dosya karşılaştırma göstericisi. - mirrors://kde/stable/release-service/24.12.2/src/kompare-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kompare-24.12.3.tar.xz extra-cmake-modules kdoctools-devel qt6-base-devel gettext-devel - libkomparediff2-devel + libkomparediff2-devel kcoreaddons-devel kcodecs-devel kiconthemes-devel @@ -199673,6 +149856,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -199704,7 +149894,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.KDE için SANE kitaplık arayüzü libksane is a SANE library interface for KDE. libksane, KDE için bir SANE kitaplık arayüzüdür. - mirrors://kde/stable/release-service/24.12.2/src/libksane-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/libksane-24.12.3.tar.xz ki18n-devel kwallet-devel @@ -199713,7 +149903,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.sane-backends-devel kwidgetsaddons-devel extra-cmake-modules - ksanecore-devel + ksanecore-devel desktop/kde/applications/libksane/pspec.xml @@ -199727,7 +149917,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.ktextwidgets sane-backends kwidgetsaddons - ksanecore + ksanecore /usr/lib @@ -199743,7 +149933,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for libksane libksane için geliştirme dosyaları - libksane + libksane ksanecore-devel @@ -199756,6 +149946,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -199785,7 +149982,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.sdk Library to compare files and strings Library to compare files and strings - mirrors://kde/stable/release-service/24.12.2/src/libkomparediff2-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/libkomparediff2-24.12.3.tar.xz qt6-base-devel qt6-5compat-devel @@ -199830,7 +150027,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.libkomparediff2-devel Shared libraries for libkomparediff2. - libkomparediff2 + libkomparediff2 /usr/include @@ -199842,6 +150039,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -199874,7 +150078,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.knetwalk is a single player logic game. The object of the game is to start the LAN, connecting all the terminals to the server, in as few turns as possible. knetwalk bir ağ kurma oyunudur. Dunucularla istemcileri mümkün olan en az kaynakla birleştirmeye çalışmak oyunun amacıdır. Bağımlılık yapması olasıdır. knetwalk - mirrors://kde/stable/release-service/24.12.2/src/knetwalk-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/knetwalk-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -199891,7 +150095,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kxmlgui-devel kio-devel knotifyconfig-devel - libkdegames-devel + libkdegames-devel kdoctools-devel kitemmodels-devel kunitconversion-devel @@ -199926,6 +150130,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -199958,7 +150169,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.klettres is an application specially designed to help the user to learn alphabet in a new language and then to learn to read simple syllables. The user can be a young child aged from two and a half or an adult that wants to learn the basics of a foreign language. klettres, kullanıcının yeni bir alfabeyi ve basit sesli sözleri öğrenmesi için geliştirilmiş bir uygulamadır. İki buçuk yaşındaki bir çocuk için yararlı olabileceği gibi, yeni bir dil öğrenen yetişkinler için de yardımcı olabilir. klettres - mirrors://kde/stable/release-service/24.12.2/src/klettres-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/klettres-24.12.3.tar.xz qt6-base-devel qt6-svg-devel @@ -200007,6 +150218,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -200039,7 +150257,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kcron is a graphical frontend to the cron system, used to schedule regular tasks on a Unix system. kcron, cron görev zamanlayıcı altyapısının bir arayüzüdür. kcron - mirrors://kde/stable/release-service/24.12.2/src/kcron-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kcron-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -200083,6 +150301,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -200112,7 +150337,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Library for managing partitions. Library for managing partitions. - mirrors://kde/stable/release-service/24.12.2/src/kpmcore-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kpmcore-24.12.3.tar.xz ntfs-3g udftools @@ -200198,7 +150423,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kpmcore-devel Development files for kpmcore - kpmcore + kpmcore /usr/include @@ -200210,6 +150435,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -200242,7 +150474,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.marble is a virtual globe and world atlas that you can use to learn more about the Earth. marble, sanal küre ve Dünya atlası uygulamasıdır. marble - mirrors://kde/stable/release-service/24.12.2/src/marble-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/marble-24.12.3.tar.xz qt6-base-devel qt6-designer-devel @@ -200321,7 +150553,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for marble marble için geliştirme dosyaları - marble + marble /usr/include @@ -200331,6 +150563,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -200361,7 +150600,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.edu Mathematical Function Plotter kmplot is a program to draw graphs, their integrals or derivatives. It supports different systems of coordinates like the Cartesian or the polar coordinate system. The graphs can be colorized and the view is scalable, so that you are able to zoom to the level you need. - mirrors://kde/stable/release-service/24.12.2/src/kmplot-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kmplot-24.12.3.tar.xz extra-cmake-modules gettext-devel @@ -200409,6 +150648,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -200439,7 +150685,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.A wallet management tool kwalletmanager is a tool to manage the passwords on your system. By using the KDE wallet subsystem it not only allows you to keep your own secrets but also to access and manage the passwords of every application that integrates with the wallet. kwallet - mirrors://kde/stable/release-service/24.12.2/src/kwalletmanager-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kwalletmanager-24.12.3.tar.xz qt6-base kdoctools-devel @@ -200514,6 +150760,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -200544,22 +150797,22 @@ It supports email, address books, calendars, tasks, news feeds and much more.Mail Transport Service Mail Transport Service akonadi - mirrors://kde/stable/release-service/24.12.2/src/kmailtransport-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kmailtransport-24.12.3.tar.xz qt6-base-devel kdoctools-devel kitemmodels-devel kunitconversion-devel kcmutils-devel - kmime-devel - akonadi-mime-devel - akonadi-devel + kmime-devel + akonadi-mime-devel + akonadi-devel cyrus-sasl-devel extra-cmake-modules boost-devel - ksmtp-devel + ksmtp-devel kwallet-devel - libkgapi-devel + libkgapi-devel qt6-keychain-devel desktop/kde/applications/kmailtransport/pspec.xml @@ -200604,7 +150857,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kmailtransport-devel Development files for akonadi - kmailtransport + kmailtransport kwallet-devel qt6-base-devel @@ -200618,6 +150871,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -200650,7 +150910,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kapman is a clone of the well known game Pac-Man. You must go through the levels escaping ghosts in a maze. You lose a life when a ghost eats you, but you can eat the ghosts for a few seconds when eating an energizer. kapman dünyaca ünlü Pac-Man'in bir türevidir. Labirent içinde hayaletlerle köşe kapmaca oynayarak bölümleri geçmeye çalıştığınız oyunda eğer hayaletlere yakalanırsanız bir hakkınızı kaybediyorsunuz. Eğer bir enerji nesnesi alırsanız bu kez siz bir kaç saniyeliğine hayaletleri yiyebiliyorsunuz. kapman - mirrors://kde/stable/release-service/24.12.2/src/kapman-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kapman-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -200667,7 +150927,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kxmlgui-devel kio-devel knotifyconfig-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel desktop/kde/applications/kapman/pspec.xml @@ -200698,6 +150958,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -200729,7 +150996,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.KDE Disk Bölümü Yöneticisi It allows you to easily create, copy, move, delete, resize without losing data, backup and restore partitions.. KDE Disk Bölümü Yöneticisi, disklerinizi, bölümlerinizi ve dosya sistemlerinizi yönetmenize izin verir. Birçok dosya sistemini (ext2/3/4, reiserfs, NTFS, FAT32 ve daha fazlası) desteklemenin yanı sıra, yeni bölüm oluşturabilir ya da var olan bir bölüm üzerinde boyutlandırma, kopyalama, taşıma, yedekleme ve geri yükleme işlemlerini yapabilir. - mirrors://kde/stable/release-service/24.12.2/src/partitionmanager-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/partitionmanager-24.12.3.tar.xz qt6-base-devel libatasmart-devel @@ -200747,7 +151014,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kconfigwidgets-devel kwidgetsaddons-devel kdoctools-devel - kpmcore-devel + kpmcore-devel e2fsprogs-devel kdbusaddons-devel polkit-qt6-devel @@ -200790,6 +151057,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -200822,7 +151096,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.killbots is a simple game of evading killer robots. Who created the robots and why they have been programmed to destroy, no one knows. All that is known is that the robots are numerous and their sole objective is to destroy you. killbots katil robotlardan kaçmaya çalıştığınız basit bir oyundur. Robotların kimin tarafından yaratıldığı veya neden yok etmek için programlandığı bilinmiyor. Tek gerçek şu ki bir çok robot var ve tek amaçları sizi yok etmek. killbots - mirrors://kde/stable/release-service/24.12.2/src/killbots-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/killbots-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -200838,7 +151112,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kio-devel kcompletion-devel knotifyconfig-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel kdoctools-devel kitemmodels-devel @@ -200872,6 +151146,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -200901,12 +151182,12 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Calendar support library Calendar support library - mirrors://kde/stable/release-service/24.12.2/src/calendarsupport-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/calendarsupport-24.12.3.tar.xz extra-cmake-modules qt6-base-devel - akonadi-devel - kmime-devel + akonadi-devel + kmime-devel kio-devel ki18n-devel kcodecs-devel @@ -200920,17 +151201,17 @@ It supports email, address books, calendars, tasks, news feeds and much more.kdoctools-devel kunitconversion-devel boost-devel - kcalutils-devel + kcalutils-devel kcalendarcore-devel - kidentitymanagement-devel + kidentitymanagement-devel kholidays-devel - akonadi-calendar-devel + akonadi-calendar-devel kcontacts-devel - pimcommon-devel - kimap-devel + pimcommon-devel + kimap-devel cyrus-sasl-devel - akonadi-mime-devel - akonadi-contacts-devel + akonadi-mime-devel + akonadi-contacts-devel kguiaddons-devel desktop/kde/applications/calendarsupport/pspec.xml @@ -200976,7 +151257,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.calendarsupport-devel Development files for calendarsupport - calendarsupport + calendarsupport /usr/include @@ -200987,6 +151268,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -201019,7 +151307,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kcalc is a calculator which offers many more mathematical functions than meet the eye on a first glance. kcalc, pek çok matematik fonksiyonu barındıran bir hesap makinesi uygulamasıdır. kcalc - mirrors://kde/stable/release-service/24.12.2/src/kcalc-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kcalc-24.12.3.tar.xz qt6-base-devel qt6-5compat-devel @@ -201065,6 +151353,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -201094,7 +151389,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.edu Interactive Physical Simulator step is an interactive physical simulator. It allows you to explore the physical world through simulations. - mirrors://kde/stable/release-service/24.12.2/src/step-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/step-24.12.3.tar.xz qt6-base-devel qt6-svg-devel @@ -201158,6 +151453,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -201186,7 +151488,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications KDE konsole konsole for kde6 - mirrors://kde/stable/release-service/24.12.2/src/konsole-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/konsole-24.12.3.tar.xz qt6-base-devel qt6-5compat-devel @@ -201255,6 +151557,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -201284,7 +151593,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.edu kwordquiz is a Flash Card Trainer kwordquiz is a tool that gives you a powerful way to master new vocabularies. It may be a language or any other kind of terminology.. - mirrors://kde/stable/release-service/24.12.2/src/kwordquiz-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kwordquiz-24.12.3.tar.xz qt6-svg-devel qt6-base-devel @@ -201310,7 +151619,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kwindowsystem-devel kwidgetsaddons-devel qt6-phonon-devel - libkeduvocdocument-devel + libkeduvocdocument-devel extra-cmake-modules cmake kitemmodels-devel @@ -201357,6 +151666,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -201390,7 +151706,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.A collection of plugins to handle mobipocket files A library to handle mobipocket files kdegraphics-mobipocket - http://download.kde.org/stable/release-service/24.12.2/src/kdegraphics-mobipocket-24.12.2.tar.xz + http://download.kde.org/stable/release-service/24.12.3/src/kdegraphics-mobipocket-24.12.3.tar.xz extra-cmake-modules kio-devel @@ -201420,7 +151736,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kdegraphics-mobipocket-devel Development headers for kdegraphics-mobipocket - kdegraphics-mobipocket + kdegraphics-mobipocket /usr/include @@ -201431,6 +151747,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -201461,11 +151784,11 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications KDE PIM libraries Library for the KDE-PIM(Personal-Infomation-Management - mirrors://kde/stable/release-service/24.12.2/src/kidentitymanagement-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kidentitymanagement-24.12.3.tar.xz qt6-base-devel kdoctools-devel - kpimtextedit-devel + kpimtextedit-devel kio-devel kcodecs-devel kconfig-devel @@ -201476,9 +151799,9 @@ It supports email, address books, calendars, tasks, news feeds and much more.kwidgetsaddons-devel kitemmodels-devel ktextaddons-devel - kpimtextedit-devel + kpimtextedit-devel kunitconversion-devel - kpimtextedit-devel + kpimtextedit-devel extra-cmake-modules python-devel kiconthemes-devel @@ -201523,9 +151846,9 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for kidentitymanagement qt6-base-devel - kpimtextedit-devel + kpimtextedit-devel ktextwidgets-devel - kidentitymanagement + kidentitymanagement /etc/xdg @@ -201538,6 +151861,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -201570,7 +151900,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.parley is a program to help you memorize things. parley supports many language specific features but can be used for other learning tasks just as well. It uses the spaced repetition learning method, also known as flash cards. Creating new vocabulary collections with parley is easy, but of course it is even better if you can use some of our premade files. Have a look at the KDE-Files.org page or use the "Download New Collections" feature directly in parley. parley ile yeni öğrendiğiniz şeyleri belli zaman aralıklarıyla tekrar ederek uzun zamanlı hafızanızda yer etmelerini sağlayabilirsiniz. parley, flaş kart denilen tekniği kullanır. Dil öğrenimi için özelleşmiş yetenekleri olmasına karşın diğer konularda da kullanıma uygundur. Kartları hazırlamak epey kolay olmakla beraber kde-files.org adresinden ulaşabileceğiniz hazır kart setlerini de kullanabilirsiniz. parley - mirrors://kde/stable/release-service/24.12.2/src/parley-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/parley-24.12.3.tar.xz qt6-base-devel qt6-svg-devel @@ -201579,7 +151909,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.libxslt-devel libXrender-devel libxml2-devel - libkeduvocdocument-devel + libkeduvocdocument-devel kdoctools-devel kcoreaddons-devel kconfig-devel @@ -201645,6 +151975,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -201674,7 +152011,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.multimedia Multimedia player a multimedia player where the focus is on simplicity, instead of features. - mirrors://kde/stable/release-service/24.12.2/src/dragon-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/dragon-24.12.3.tar.xz qt6-base-devel qt6-phonon-devel @@ -201725,6 +152062,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -201757,7 +152101,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Application to take pictures and videos with your webcam Web kameranızla fotoğraf ve video çekmek için uygulama kamoso - mirrors://kde/stable/release-service/24.12.2/src/kamoso-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kamoso-24.12.3.tar.xz cmake kio5-devel @@ -201824,6 +152168,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -201855,7 +152206,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Bir BitTorrent protokol uygulaması ktorrent is a BitTorrent application by KDE which allows you to download files using the BitTorrent protocol. ktorrent, KDE'nin BitTorrent protokolünü kullanarak dosya indirmenize izin veren bir BitTorrent uygulamasıdır. - https://download.kde.org/stable/release-service/24.12.2/src/libktorrent-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/libktorrent-24.12.3.tar.xz doxygen gmp-devel @@ -201904,7 +152255,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.libktorrent için geliştirme dosyaları qt6-5compat-devel - libktorrent + libktorrent /usr/include @@ -201915,6 +152266,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -201943,7 +152301,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications A KDE blogging client akregator helps you to keep informed about new stories on websites like KDE Dot News and Planet KDE blogs. The technology used is RSS and many sites support it. - https://download.kde.org/stable/release-service/24.12.2/src/akregator-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/akregator-24.12.3.tar.xz boost-devel extra-cmake-modules @@ -201955,23 +152313,23 @@ It supports email, address books, calendars, tasks, news feeds and much more.qt6-webengine-devel kcmutils-devel knotifyconfig-devel - akonadi-mime-devel - akonadi-devel + akonadi-mime-devel + akonadi-devel kitemmodels-devel - grantleetheme-devel + grantleetheme-devel kcontacts-devel - kontactinterface-devel - libkdepim-devel - akonadi-contacts-devel - libkleo-devel + kontactinterface-devel + libkdepim-devel + akonadi-contacts-devel + libkleo-devel gpgme-devel gpgme-qt6-devel - messagelib-devel - pimcommon-devel - kimap-devel - kmime-devel + messagelib-devel + pimcommon-devel + kimap-devel + kmime-devel cyrus-sasl-devel - kpimtextedit-devel + kpimtextedit-devel ksyndication-devel ffmpeg-devel knotifyconfig-devel @@ -202029,6 +152387,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -202060,7 +152425,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Data model and extraction system for travel reservation information Seyahat rezervasyon bilgisi için veri modeli ve ekstraksiyon sistemi Seyahat rezervasyon bilgisi için veri modeli ve ekstraksiyon sistemi - https://download.kde.org/stable/release-service/24.12.2/src/kitinerary-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/kitinerary-24.12.3.tar.xz qt6-declarative-devel qt6-base-devel @@ -202069,10 +152434,10 @@ It supports email, address books, calendars, tasks, news feeds and much more.kcontacts-devel kcalendarcore-devel libxml2-devel - kpkpass-devel + kpkpass-devel poppler-qt6-devel ki18n-devel - kmime-devel + kmime-devel zlib-devel kconfig-devel kcodecs-devel @@ -202118,7 +152483,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kitinerary-devel Development files for kitinerary - kitinerary + kitinerary /usr/include @@ -202129,6 +152494,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -202159,7 +152531,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Libraries and daemons to implement basic email handling Libraries and daemons to implement basic email handling - mirrors://kde/stable/release-service/24.12.2/src/akonadi-mime-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/akonadi-mime-24.12.3.tar.xz qt6-base-devel boost-devel @@ -202167,12 +152539,12 @@ It supports email, address books, calendars, tasks, news feeds and much more.kdoctools-devel kitemmodels-devel gettext-devel - akonadi-devel + akonadi-devel extra-cmake-modules kxmlgui-devel libxslt-devel extra-cmake-modules - kmime-devel + kmime-devel kio-devel shared-mime-info @@ -202209,7 +152581,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for akonadi-mime qt6-base-devel - akonadi-mime + akonadi-mime /usr/include @@ -202221,6 +152593,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -202253,15 +152632,15 @@ It supports email, address books, calendars, tasks, news feeds and much more.Parser for MIME trees Parser for MIME trees mimetreeparser - https://download.kde.org/stable/release-service/24.12.2/src/mimetreeparser-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/mimetreeparser-24.12.3.tar.xz gpgme-devel qt6-base-devel gpgme-qt6-devel ki18n-devel - kmbox-devel - kmime-devel - libkleo-devel + kmbox-devel + kmime-devel + libkleo-devel kcodecs-devel qt6-declarative-devel kcalendarcore-devel @@ -202300,7 +152679,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for mimetreeparser kmbox-devel - mimetreeparser + mimetreeparser /usr/include @@ -202312,6 +152691,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -202345,7 +152731,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Connect KDE with your smartphone Cihazlarınızı KDE ile birleştirin kdeconnect - https://download.kde.org/stable/release-service/24.12.2/src/kdeconnect-kde-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/kdeconnect-kde-24.12.3.tar.xz sshfs dbus-devel @@ -202442,6 +152828,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -202470,7 +152863,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Calendar and scheduling Program korganizer is the calendar and scheduling component of kontact, the integrated personal information manager from KDE. - https://download.kde.org/stable/release-service/24.12.2/src/korganizer-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/korganizer-24.12.3.tar.xz gpgme-devel extra-cmake-modules @@ -202479,33 +152872,33 @@ It supports email, address books, calendars, tasks, news feeds and much more.kdbusaddons-devel kdoctools-devel prison-devel - akonadi-devel - akonadi-search-devel - grantleetheme-devel - kpimtextedit-devel - libkdepim-devel - libkleo-devel - pimcommon-devel + akonadi-devel + akonadi-search-devel + grantleetheme-devel + kpimtextedit-devel + libkdepim-devel + libkleo-devel + pimcommon-devel qt6-base-devel kitemmodels-devel - akonadi-mime-devel + akonadi-mime-devel kunitconversion-devel knewstuff-devel - akonadi-contacts-devel - kidentitymanagement-devel - kmailtransport-devel + akonadi-contacts-devel + kidentitymanagement-devel + kmailtransport-devel cyrus-sasl-devel - kcalutils-devel + kcalutils-devel kholidays-devel - kldap-devel - akonadi-calendar-devel - kontactinterface-devel - mailcommon-devel - messagelib-devel - kimap-devel - incidenceeditor-devel - eventviews-devel - calendarsupport-devel + kldap-devel + akonadi-calendar-devel + kontactinterface-devel + mailcommon-devel + messagelib-devel + kimap-devel + incidenceeditor-devel + eventviews-devel + calendarsupport-devel kparts-devel kuserfeedback-devel knotifications-devel @@ -202574,6 +152967,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -202606,7 +153006,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.filelight allows you to quickly understand exactly where your diskspace is being used by graphically representing your file system as a set of concentric segmented-rings. filelight allows you to quickly understand exactly where your diskspace is being used by graphically representing your file system as a set of concentric segmented-rings. filelight - mirrors://kde/stable/release-service/24.12.2/src/filelight-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/filelight-24.12.3.tar.xz qt6-base-devel qt6-svg-devel @@ -202662,6 +153062,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -202691,12 +153098,12 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications KDE PIM library for managing sieves. KDE PIM library for managing sieves. - mirrors://kde/stable/release-service/24.12.2/src/libksieve-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/libksieve-24.12.3.tar.xz kio-devel extra-cmake-modules qt6-base-devel - akonadi-devel + akonadi-devel kcompletion-devel kjobwidgets-devel kcoreaddons-devel @@ -202707,19 +153114,19 @@ It supports email, address books, calendars, tasks, news feeds and much more.kdoctools-devel kunitconversion-devel boost-devel - pimcommon-devel + pimcommon-devel kcontacts-devel kcalendarcore-devel - kimap-devel - kmime-devel + kimap-devel + kmime-devel cyrus-sasl-devel knewstuff-devel - kidentitymanagement-devel - kmailtransport-devel - libkdepim-devel + kidentitymanagement-devel + kmailtransport-devel + libkdepim-devel qt6-webengine-devel - akonadi-contacts-devel - akonadi-mime-devel + akonadi-contacts-devel + akonadi-mime-devel kiconthemes-devel karchive-devel syntax-highlighting-devel @@ -202772,7 +153179,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.libksieve-devel Development files for libksieve. - libksieve + libksieve /usr/include @@ -202783,6 +153190,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -202813,7 +153227,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.A Gomoku like game for two players. bovo is a Gomoku like game for two players, where the opponents alternate in placing their respective pictogram on the game board. bovo - mirrors://kde/stable/release-service/24.12.2/src/bovo-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/bovo-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -202821,7 +153235,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.qt6-svg-devel kxmlgui-devel kdoctools-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel kitemmodels-devel kunitconversion-devel @@ -202864,6 +153278,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -202894,7 +153315,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Framework for searching and managing metadata Baloo is a framework for searching and managing metada - mirrors://kde/stable/release-service/24.12.2/src/baloo-widgets-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/baloo-widgets-24.12.3.tar.xz baloo-devel extra-cmake-modules @@ -202940,7 +153361,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.baloo-widgets-devel Development files for baloo-widgets - baloo-widgets + baloo-widgets qt6-base-devel @@ -202953,6 +153374,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -202984,7 +153412,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.KDE için ffmpeg tabanlı önizleme FFmpeg-based thumbnail creator for video files Video dosyaları için FFmpeg tabanlı önizleme oluşturur. - mirrors://kde/stable/release-service/24.12.2/src/ffmpegthumbs-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/ffmpegthumbs-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -203017,6 +153445,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -203046,7 +153481,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Find Files/Folders Find Files/Folders kfind - mirrors://kde/stable/release-service/24.12.2/src/kfind-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kfind-24.12.3.tar.xz extra-cmake-modules gettext-devel @@ -203103,6 +153538,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -203133,7 +153575,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications konqueror - KDE File Manager and Web Browser konqueror is KDE's Webbrowser and swiss-army-knife for any kind of file-management and file previewing. - mirrors://kde/stable/release-service/24.12.2/src/konqueror-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/konqueror-24.12.3.tar.xz extra-cmake-modules gettext-devel @@ -203232,7 +153674,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for konqueror qt6-base-devel - konqueror + konqueror /usr/include @@ -203243,6 +153685,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -203274,7 +153723,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.UML modelleme aracı ve kod üreticisi. umbrello UML Modeller is a Unified Modelling Language diagram editor for KDE. umbrello UML (Unified Modellin Language) modelleme ve diyagram editörüdür. - mirrors://kde/stable/release-service/24.12.2/src/umbrello-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/umbrello-24.12.3.tar.xz libxslt-devel kio5-devel @@ -203338,6 +153787,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -203366,7 +153822,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications KDE mail client kmail is the email component of kontact, the integrated personal information manager from KDE. - https://download.kde.org/stable/release-service/24.12.2/src/kmail-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/kmail-24.12.3.tar.xz gpgme-devel extra-cmake-modules @@ -203392,41 +153848,41 @@ It supports email, address books, calendars, tasks, news feeds and much more.kwindowsystem-devel kxmlgui-devel sonnet-devel - akonadi-contacts-devel - akonadi-devel - akonadi-mime-devel - akonadi-search-devel + akonadi-contacts-devel + akonadi-devel + akonadi-mime-devel + akonadi-search-devel kcalendarcore-devel - kcalutils-devel + kcalutils-devel kcontacts-devel - kidentitymanagement-devel - kldap-devel - kmailtransport-devel - kmime-devel - kpimtextedit-devel - ktnef-devel + kidentitymanagement-devel + kldap-devel + kmailtransport-devel + kmime-devel + kpimtextedit-devel + ktnef-devel libgravatar - libkleo-devel - messagelib-devel - pimcommon-devel + libkleo-devel + messagelib-devel + pimcommon-devel qt6-base-devel qt6-webengine-devel kitemmodels-devel kstatusnotifieritem-devel kunitconversion-devel cyrus-sasl-devel - kontactinterface-devel - libksieve-devel - mailcommon-devel - kimap-devel - libgravatar-devel - libkdepim-devel + kontactinterface-devel + libksieve-devel + mailcommon-devel + kimap-devel + libgravatar-devel + libkdepim-devel syntax-highlighting-devel gpgme-qt6-devel ffmpeg-devel libXScrnSaver-devel - akonadi-calendar-devel - akonadi-import-wizard-devel + akonadi-calendar-devel + akonadi-import-wizard-devel qt6-keychain-devel kuserfeedback-devel @@ -203503,6 +153959,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -203533,15 +153996,15 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications LDAP access API for KDE Allows LDAP accessing with a convenient Qt style C++ API. - mirrors://kde/stable/release-service/24.12.2/src/kldap-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kldap-24.12.3.tar.xz qt6-base-devel kcompletion-devel kdoctools-devel ki18n-devel kio-devel - kmbox-devel - kmime-devel + kmbox-devel + kmime-devel kwallet-devel openldap-server cyrus-sasl-devel @@ -203581,7 +154044,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Development files for kdelibs4-support qt6-base-devel - kldap + kldap /usr/include @@ -203593,6 +154056,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -203624,7 +154094,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.DocBook XML dosyalarını çevirme araçları. This is a collection of tools that facilitate translating DocBook XML files using Gettext message files (PO files). poxml, DocBook XML dosyalarını (.po) Gettext yarımıyla çevirmeyi sağlayan bir programdır. - https://download.kde.org/stable/release-service/24.12.2/src/poxml-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/poxml-24.12.3.tar.xz qt6-base-devel gettext-devel @@ -203655,6 +154125,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -203683,7 +154160,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications kmail Account Wizard kmail Account Wizard - mirrors://kde/stable/release-service/24.12.2/src/kmail-account-wizard-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kmail-account-wizard-24.12.3.tar.xz gpgme-devel gpgme-qt6-devel @@ -203693,26 +154170,26 @@ It supports email, address books, calendars, tasks, news feeds and much more.kdbusaddons-devel kdoctools-devel prison-devel - akonadi-devel - akonadi-search-devel - grantleetheme-devel - kpimtextedit-devel - libkdepim-devel - libkleo-devel - pimcommon-devel + akonadi-devel + akonadi-search-devel + grantleetheme-devel + kpimtextedit-devel + libkdepim-devel + libkleo-devel + pimcommon-devel qt6-base-devel knotifyconfig-devel ktexteditor-devel kitemmodels-devel - akonadi-contacts-devel - kidentitymanagement-devel - kldap-devel + akonadi-contacts-devel + kidentitymanagement-devel + kldap-devel cyrus-sasl-devel - kmailtransport-devel - akonadi-mime-devel - mailcommon-devel - messagelib-devel - kimap-devel + kmailtransport-devel + akonadi-mime-devel + mailcommon-devel + messagelib-devel + kimap-devel knewstuff-devel knotifications-devel @@ -203760,6 +154237,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -203792,7 +154276,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kblocks is the classic falling blocks game. The idea is stack the falling blocks in a way that lines are completely filled. When a line is completed it is removed, and more space is available in the play area. When there is not enough space for blocks to fall, the game is over. kblocks klasikleşmiş tetrisin bir yeniden yapımıdır. Oyunun amacı düşen parçaları en uygun şekilde dizmektir. Bir satır tamamen dolduktan sonra silinmektedir ve daha fazla oyun alanı açılmaktadır. Yeni parçaları koyacak yeriniz kalmadığında oyun bitmektedir. kblocks - mirrors://kde/stable/release-service/24.12.2/src/kblocks-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kblocks-24.12.3.tar.xz extra-cmake-modules qt6-svg-devel @@ -203800,7 +154284,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kdoctools-devel ki18n-devel kxmlgui-devel - libkdegames-devel + libkdegames-devel qt6-declarative-devel kcrash-devel kcompletion-devel @@ -203840,6 +154324,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -203870,7 +154361,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Mail importer library Mail importer library - mirrors://kde/stable/release-service/24.12.2/src/mailimporter-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/mailimporter-24.12.3.tar.xz qt6-base-devel kdoctools-devel @@ -203878,7 +154369,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kconfig-devel kservice-devel kxmlgui-devel - pimcommon-devel + pimcommon-devel cmake extra-cmake-modules openldap-client @@ -203887,20 +154378,20 @@ It supports email, address books, calendars, tasks, news feeds and much more.kio-devel kitemmodels-devel kunitconversion-devel - kmime-devel + kmime-devel kcontacts-devel kcalendarcore-devel - kldap-devel - libkdepim-devel - akonadi-search-devel + kldap-devel + libkdepim-devel + akonadi-search-devel knewstuff-devel - kpimtextedit-devel - kimap-devel - akonadi-devel + kpimtextedit-devel + kimap-devel + akonadi-devel boost-devel karchive-devel - akonadi-mime-devel - akonadi-contacts-devel + akonadi-mime-devel + akonadi-contacts-devel desktop/kde/applications/mailimporter/pspec.xml @@ -203933,7 +154424,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.mailimporter-devel Development files for mailimporter - mailimporter + mailimporter karchive-devel @@ -203946,6 +154437,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -203975,7 +154473,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Libraries for KDE PIM applications Libraries for KDE PIM applications - mirrors://kde/stable/release-service/24.12.2/src/libkdepim-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/libkdepim-24.12.3.tar.xz qt6-base-devel qt6-designer-devel @@ -203984,7 +154482,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.kconfig-devel kservice-devel kxmlgui-devel - akonadi-devel + akonadi-devel kjobwidgets-devel kitemmodels-devel kunitconversion-devel @@ -203992,9 +154490,9 @@ It supports email, address books, calendars, tasks, news feeds and much more.cmake extra-cmake-modules boost-devel - kmime-devel + kmime-devel kcmutils-devel - kldap-devel + kldap-devel kio-devel kcompletion-devel kcoreaddons-devel @@ -204002,9 +154500,9 @@ It supports email, address books, calendars, tasks, news feeds and much more.kwidgetsaddons-devel cyrus-sasl-devel kcontacts-devel - akonadi-contacts-devel - akonadi-search-devel - akonadi-mime-devel + akonadi-contacts-devel + akonadi-search-devel + akonadi-mime-devel desktop/kde/applications/libkdepim/pspec.xml @@ -204049,7 +154547,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.libkdepim-devel Development files for libkdepim - libkdepim + libkdepim qt6-base-devel qt6-designer-devel kxmlgui-devel @@ -204067,6 +154565,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -204098,7 +154603,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Masaüstü paylaşım araçları. KDE Desktop Sharing is a manager for easily sharing a desktop session with another system. The desktop session can be viewed or controlled remotely by any VNC or RFB client krfb, masaüstünü uzaktaki bilgisayarlarla kolaylıkla paylaşmaya olanak sağlar. - mirrors://kde/stable/release-service/24.12.2/src/krfb-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/krfb-24.12.3.tar.xz extra-cmake-modules qt6-base-devel @@ -204183,6 +154688,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -204213,45 +154725,45 @@ It supports email, address books, calendars, tasks, news feeds and much more.desktop.kde.applications Addons for the KDE PIM apllications Addons for the KDE PIM apllications - mirrors://kde/stable/release-service/24.12.2/src/kdepim-addons-24.12.2.tar.xz + mirrors://kde/stable/release-service/24.12.3/src/kdepim-addons-24.12.3.tar.xz - akonadi-calendar-devel - akonadi-devel - kldap-devel - akonadi-import-wizard-devel + akonadi-calendar-devel + akonadi-devel + kldap-devel + akonadi-import-wizard-devel boost-devel - calendarsupport-devel + calendarsupport-devel cyrus-sasl-devel - eventviews-devel + eventviews-devel extra-cmake-modules glibc-devel - grantleetheme-devel - incidenceeditor-devel + grantleetheme-devel + incidenceeditor-devel kholidays-devel - kcalutils-devel + kcalutils-devel kconfig-devel - kpkpass-devel - kitinerary-devel + kpkpass-devel + kitinerary-devel kdeclarative-devel kdoctools-devel ki18n-devel - ktnef-devel + ktnef-devel kxmlgui-devel - libgravatar-devel + libgravatar-devel libical-devel - libkdepim-devel - libkgapi-devel - libkleo-devel - mailcommon-devel - mailimporter-devel - messagelib-devel - pimcommon-devel + libkdepim-devel + libkgapi-devel + libkleo-devel + mailcommon-devel + mailimporter-devel + messagelib-devel + pimcommon-devel python-devel qt6-base-devel qt6-declarative-devel qt6-webengine-devel kio-devel - kmime-devel + kmime-devel kcodecs-devel kcalendarcore-devel kservice-devel @@ -204260,26 +154772,26 @@ It supports email, address books, calendars, tasks, news feeds and much more.kcompletion-devel kcoreaddons-devel kiconthemes-devel - akonadi-mime-devel - kpimtextedit-devel + akonadi-mime-devel + kpimtextedit-devel ktextwidgets-devel kconfigwidgets-devel - kmailtransport-devel + kmailtransport-devel kwidgetsaddons-devel - akonadi-contacts-devel - kidentitymanagement-devel + akonadi-contacts-devel + kidentitymanagement-devel kitemmodels-devel kunitconversion-devel - kimap-devel + kimap-devel gpgme-devel gpgme-qt6-devel kdiagram-devel - libksieve-devel + libksieve-devel prison-devel syntax-highlighting-devel kparts-devel - kaddressbook-devel - kontactinterface-devel + kaddressbook-devel + kontactinterface-devel kguiaddons-devel desktop/kde/applications/kdepim-addons/pspec.xml @@ -204363,6 +154875,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-06 24.12.2 @@ -204759,12 +155278,12 @@ It supports email, address books, calendars, tasks, news feeds and much more.With KPhotoAlbum it is today possible for me to find any image I have in less than 5 seconds, let that be an image with a special person, an image from a special place, or even both. http://download.kde.org/stable/kphotoalbum/6.0.1/kphotoalbum-6.0.1.tar.xz - extra-cmake-modules-kf6 - kdoctools-kf6-devel - kparts-kf6-devel - libkexiv2-kf6-devel + extra-cmake-modules + kdoctools-devel + kparts-devel + libkexiv2-devel qt6-phonon-devel - libplasma-kf6-devel + libplasma-devel qt6-base-devel qt6-sql-mysql qt6-sql-postgresql @@ -204772,21 +155291,21 @@ It supports email, address books, calendars, tasks, news feeds and much more.qt6-sql-odbc libjpeg-turbo-devel exiv2-devel - libkdcraw-kf6-devel - karchive-kf6-devel - kcompletion-kf6-devel - kconfig-kf6-devel - kcoreaddons-kf6-devel - ki18n-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kjobwidgets-kf6-devel - ktextwidgets-kf6-devel - kwidgetsaddons-kf6-devel - kxmlgui-kf6-devel - purpose-kf6-devel - marble-kf6-devel - kcolorscheme-kf6-devel + libkdcraw-devel + karchive-devel + kcompletion-devel + kconfig-devel + kcoreaddons-devel + ki18n-devel + kiconthemes-devel + kio-devel + kjobwidgets-devel + ktextwidgets-devel + kwidgetsaddons-devel + kxmlgui-devel + purpose-devel + marble-devel + kcolorscheme-devel qt6-webengine-devel desktop/kde/graphics/kphotoalbum/pspec.xml @@ -204795,28 +155314,28 @@ It supports email, address books, calendars, tasks, news feeds and much more.kphotoalbum KDE Photo Album, picture collection manager - kio-kf6 - ki18n-kf6 + kio + ki18n libgcc - kconfig-kf6 - kxmlgui-kf6 - karchive-kf6 - kservice-kf6 + kconfig + kxmlgui + karchive + kservice qt6-base exiv2-libs qt6-phonon - kcompletion-kf6 - kcoreaddons-kf6 - kiconthemes-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 + kcompletion + kcoreaddons + kiconthemes + kjobwidgets + ktextwidgets libjpeg-turbo - kconfigwidgets-kf6 - kwidgetsaddons-kf6 - libkdcraw-kf6 - purpose-kf6 - marble-kf6 - kcolorscheme-kf6 + kconfigwidgets + kwidgetsaddons + libkdcraw + purpose + marble + kcolorscheme /etc/xdg @@ -204827,20 +155346,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. - - 2025-01-08 + + 2025-04-04 6.0.1 Version bump. Pisi Linux Community admin@pisilinux.org - - 2024-12-31 - 6.0.0 - Version bump. - Pisi Linux Community - admin@pisilinux.org - 2020-09-19 5.7.0 @@ -221362,7 +171874,7 @@ It supports email, address books, calendars, tasks, news feeds and much more.Güçlü bir sanallaştırma programı VirtualBox is a family of powerful x86 virtualization products for enterprise as well as home use. This is the Open Source Edition which lacks USB support and some other things. VirtualBox, ev kullanımı yanında kurumsal kullanım alanı da bulan güçlü bir xf86 sanallaştırma ürünleri ailesidir. Bu sürüm, USB ve birkaç özellik için desteği bulunmayan açık kodlu uyarlamasıdır. - http://download.virtualbox.org/virtualbox/7.1.4/VirtualBox-7.1.4.tar.bz2 + https://download.virtualbox.org/virtualbox/7.1.6/VirtualBox-7.1.6a.tar.bz2 dkms.conf dkms-guest.conf @@ -221461,8 +171973,8 @@ It supports email, address books, calendars, tasks, news feeds and much more.qt6-assistant qt6-scxml - module-virtualbox - virtualbox-dkms + module-virtualbox + virtualbox-dkms @@ -221504,8 +172016,8 @@ It supports email, address books, calendars, tasks, news feeds and much more.xorg-server libXcomposite - module-virtualbox-guest - virtualbox-guest-dkms + module-virtualbox-guest + virtualbox-guest-dkms @@ -221554,6 +172066,13 @@ It supports email, address books, calendars, tasks, news feeds and much more. + + 2025-02-03 + 7.1.6 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2024-12-20 7.1.4 @@ -223494,7 +174013,7 @@ from a wide variety of machine architectures. The official VirtualBox Guest Additions ISO image The official VirtualBox Guest Additions ISO image The official VirtualBox Guest Additions ISO image - https://download.virtualbox.org/virtualbox/7.1.4/VBoxGuestAdditions_7.1.4.iso + https://download.virtualbox.org/virtualbox/7.1.6/VBoxGuestAdditions_7.1.6.iso hardware/virtualization/virtualbox-guest-iso/pspec.xml @@ -223507,6 +174026,20 @@ from a wide variety of machine architectures. + + 2025-02-03 + 7.1.6 + Version bump. + Pisi Linux Community + admin@pisilinux.org + + + 2025-01-26 + 7.1.6 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-01-05 7.1.4 @@ -232809,7 +183342,7 @@ from a wide variety of machine architectures. KDE için CD/DVD yazma uygulaması K3b provides a comfortable user interface to perform most CD/DVD burning tasks. While the experienced user can take influence in all steps of the burning process the beginner may find comfort in the automatic settings and the reasonable k3b defaults which allow a quick start. K3b her türlü CD/DVD yazma işlevini rahat bir kullanıcı arayüzüyle sunar. Tecrübeli kullanıcılar yazma işleminin her adımına müdahale edebilirken, yeni başlayanlar ise k3b'nin sağladığı öntanımlı ayarlar sayesinde hızlı bir başlangıç yapabilirler. - https://download.kde.org/stable/release-service/24.12.2/src/k3b-24.12.2.tar.xz + https://download.kde.org/stable/release-service/24.12.3/src/k3b-24.12.3.tar.xz extra-cmake-modules karchive-devel @@ -232916,6 +183449,13 @@ from a wide variety of machine architectures. + + 2025-04-02 + 24.12.3 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-02-27 24.12.2 @@ -269074,104 +219614,87 @@ uses SIMD instructions (MMX, SSE2, etc.) to accelerate baseline JPEG compression - soundkonverter - https://www.opendesktop.org/p/1126634/ + soundconverter + https://soundconverter.org/ - Kamil Atlı - suvari@pisilinux.org + PisiLinux Community + admins@pisilinux.org - GPLv2 + GPLv3 app:gui multimedia.converter - SoundKonverter is a frontend to various audio converters. - Audio conversion, replay Gain calculation, CD ripping. It is extendable by plugins and supports many backends: soundKonverter supports reading and writing tags for many formats, so the tags are preserved when converting files. - soundkonverter - https://sourceforge.net/projects/pisilinux/files/source/soundkonverter-3.0.1.tar.gz + GNOME sound converter application. + A simple sound converter application for the GNOME environment. It reads anything the GStreamer library can read, and writes WAV, FLAC, MP3, and Ogg Vorbis files. + https://launchpad.net/soundconverter/trunk/4.0.5/+download/soundconverter-4.0.5.tar.gz - cmake - libkcddb - kio-devel - kinit-devel - ki18n-devel - solid-devel - taglib-devel - ffmpeg-devel - kconfig-devel - kxmlgui-devel - qt5-base-devel - kdesignerplugin - libvorbis-devel - kdoctools-devel - kemoticons-devel - qt5-phonon-devel - cdparanoia-devel - kitemmodels-devel - extra-cmake-modules - kconfigwidgets-devel - kwidgetsaddons-devel - kunitconversion-devel - kdelibs4-support-devel + intltool + gtk3-devel + python3-devel + gstreamer-devel + desktop-file-utils + python3-setuptools + python3-distutils-extra + python3-pygobject3-devel multimedia/converter/soundkonverter/pspec.xml - soundkonverter + soundconverter - kio - ki18n - solid - libgcc - taglib - kconfig - kxmlgui - kservice - libkcddb - qt5-base - cdparanoia - qt5-phonon - kcompletion - kcoreaddons - ktextwidgets - kconfigwidgets - knotifications - kwidgetsaddons - kdelibs4-support - sox - faac - flac - lame - faad2 - speex - ffmpeg - mplayer - libopus - twolame - wavpack - libvorbis - timidity - fluidsynth - vorbis-tools + gtk3 + python3 + gst-libav + gst-plugins-bad + gst-plugins-base + gst-plugins-ugly + gst-plugins-good + python3-setuptools + python3-pygobject3 /usr/bin /usr/lib /usr/share + /usr/share/locale + /usr/share/man + /usr/share/doc - - 2020-03-08 - 3.0.1 - Rebuild - Kamil Atlı - suvari@pisilinux.org + + 2024-08-18 + 4.0.5 + Version bump + fury + uglyside@yandex.ru + + + 2023-11-03 + 4.0.4 + Version bump + Mustafa Cinasal + muscnsl@gmail.com + + + 2021-10-28 + 4.0.2 + Version bump. + fury + uglyside@yandex.ru + + + 2021-05-18 + 4.0.1 + Version bump. + fury + uglyside@yandex.ru - 2018-12-03 - 3.0.1 - First release - Kamil Atlı - suvari@pisilinux.org + 2020-12-04 + 4.0.0 + First build + fury + uglyside@yandex.ru @@ -286946,10 +237469,9 @@ Bu Skype SILK codec ve Xiph.Org 's Celt codec teknolojisi dahil RFC 6716 ol Tellico is a KDE application for organizing your collections. It provides default templates for books, bibliographies, videos, music, video games, coins, stamps, trading cards, comic books, and wines. Tellico, koleksiyonlarınızı düzenlemek için kullanabileceğiniz bir KDE uygulamasıdır. Öntanımlı olarak; kitaplar, biyografiler, videolar, müzikler, oyunlar gibi bir çok şemayı destekler. tellico - http://tellico-project.org/files/tellico-3.3.tar.xz + https://tellico-project.org/files/tellico-4.1.1.tar.xz libkcddb - khtml-devel exempi-devel taglib-devel libxslt-devel @@ -286959,10 +237481,21 @@ Bu Skype SILK codec ve Xiph.Org 's Celt codec teknolojisi dahil RFC 6716 ol kdoctools-devel knewstuff-devel kitemmodels-devel - poppler-qt5-devel + kcolorscheme-devel + poppler-qt6-devel extra-cmake-modules kfilemetadata-devel libkcompactdisc-devel + qt6-base-devel + qt6-charts-devel + qt6-webengine-devel + icon-theme-hicolor + kio-devel + solid-devel + sonnet-devel + ktextwidgets-devel + kjobwidgets-devel + kiconthemes-devel office/misc/tellico/pspec.xml @@ -286970,7 +237503,6 @@ Bu Skype SILK codec ve Xiph.Org 's Celt codec teknolojisi dahil RFC 6716 ol tellico kio - khtml ki18n solid exempi @@ -286990,7 +237522,7 @@ Bu Skype SILK codec ve Xiph.Org 's Celt codec teknolojisi dahil RFC 6716 ol kservice libkcddb libksane - qt5-base + qt6-base knewstuff kguiaddons kcompletion @@ -286998,12 +237530,16 @@ Bu Skype SILK codec ve Xiph.Org 's Celt codec teknolojisi dahil RFC 6716 ol kiconthemes kitemmodels kjobwidgets - poppler-qt5 + poppler-qt6 + kcolorscheme ktextwidgets kfilemetadata kwindowsystem kconfigwidgets kwidgetsaddons + qt6-charts + qt6-webengine + icon-theme-hicolor /usr/bin @@ -287018,9 +237554,17 @@ Bu Skype SILK codec ve Xiph.Org 's Celt codec teknolojisi dahil RFC 6716 ol /usr/share/config.kcfg /usr/share/metainfo /usr/share/mime + /usr/share/knsrcfiles + + 2025-04-04 + 4.1.1 + Version bump. + Mustafa Cinasal + muscnsl@gmail.com + 2020-04-25 3.3 @@ -290960,20 +241504,20 @@ Bu Skype SILK codec ve Xiph.Org 's Celt codec teknolojisi dahil RFC 6716 ol yaml-cpp boost-devel boost-python3 - ki18n-kf6-devel - solid-kf6-devel + ki18n-devel + solid-devel parted-devel qt6-linguist qt6-svg-devel udisks2-devel libyaml-devel python3-devel - kconfig-kf6-devel + kconfig-devel qt6-base-devel polkit-qt6-devel qt6-webengine-devel libatasmart-devel - kcoreaddons-kf6-devel + kcoreaddons-devel qt6-designer-devel qt6-assistant-devel libutil-linux-devel @@ -290984,18 +241528,18 @@ Bu Skype SILK codec ve Xiph.Org 's Celt codec teknolojisi dahil RFC 6716 ol efibootmgr-devel rsync gptfdisk - extra-cmake-modules-kf6 - kpmcore-kf6-devel - kiconthemes-kf6-devel - kio-kf6-devel - kservice-kf6-devel - kconfig-kf6-devel - kparts-kf6-devel - kcrash-kf6-devel - kcompletion-kf6-devel - kbookmarks-kf6-devel - kwidgetsaddons-kf6-devel - libplasma-kf6-devel + extra-cmake-modules + kpmcore-devel + kiconthemes-devel + kio-devel + kservice-devel + kconfig-devel + kparts-devel + kcrash-devel + kcompletion-devel + kbookmarks-devel + kwidgetsaddons-devel + libplasma-devel pisilocalayar.patch @@ -291011,13 +241555,13 @@ Bu Skype SILK codec ve Xiph.Org 's Celt codec teknolojisi dahil RFC 6716 ol boost boost-python3 python3 - kcrash-kf6 + kcrash parted - solid-kf6 - ki18n-kf6 + solid + ki18n rsync - kconfig-kf6 - kcoreaddons-kf6 + kconfig + kcoreaddons qt6-svg libatasmart qt6-declarative @@ -291032,33 +241576,33 @@ Bu Skype SILK codec ve Xiph.Org 's Celt codec teknolojisi dahil RFC 6716 ol dosfstools libutil-linux util-linux - kpmcore-kf6 - partitionmanager-kf6 + kpmcore + partitionmanager qt6-webengine - kiconthemes-kf6 - kio-kf6 - kservice-kf6 - kconfig-kf6 - kparts-kf6 - kpackage-kf6 + kiconthemes + kio + kservice + kconfig + kparts + kpackage calamares-theme-pisilinux icu4c - kauth-kf6 + kauth libX11 - sonnet-kf6 - kcodecs-kf6 - kxmlgui-kf6 + sonnet + kcodecs + kxmlgui yaml-cpp - kcompletion-kf6 - kjobwidgets-kf6 - ktextwidgets-kf6 + kcompletion + kjobwidgets + ktextwidgets libpwquality qt6-location - kwindowsystem-kf6 - kconfigwidgets-kf6 - kwidgetsaddons-kf6 + kwindowsystem + kconfigwidgets + kwidgetsaddons qt6-webchannel - libplasma-kf6 + libplasma /usr/bin @@ -299687,7 +250231,7 @@ functionality to build high-performing, platform-independent programs.Mozilla Firefox – otwarta przeglądarka internetowa oparta na silniku Gecko, stworzona i rozwijana przez Korporację Mozilla oraz ochotników. Navegue por la web de forma rápida y segura. Navegador web de código abierto que se puede personalizar con características adicionales. firefox - https://ftp.mozilla.org/pub/firefox/releases/136.0.2/source/firefox-136.0.2.source.tar.xz + https://ftp.mozilla.org/pub/firefox/releases/137.0/source/firefox-137.0.source.tar.xz mozconfig-inst mozconfig-opt @@ -299825,7 +250369,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-az - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-az@firefox.mozilla.org.xpi @@ -299839,7 +250383,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-bs - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-bs@firefox.mozilla.org.xpi @@ -299853,7 +250397,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-ca - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-ca@firefox.mozilla.org.xpi @@ -299867,7 +250411,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-da - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-da@firefox.mozilla.org.xpi @@ -299881,7 +250425,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-de - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-de@firefox.mozilla.org.xpi @@ -299895,7 +250439,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-el - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-el@firefox.mozilla.org.xpi @@ -299909,7 +250453,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-en-US - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-en-US@firefox.mozilla.org.xpi @@ -299923,7 +250467,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-en-GB - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-en-GB@firefox.mozilla.org.xpi @@ -299937,7 +250481,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-es-AR - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-es-AR@firefox.mozilla.org.xpi @@ -299951,7 +250495,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-es-CL - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-es-CL@firefox.mozilla.org.xpi @@ -299965,7 +250509,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-es-ES - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-es-ES@firefox.mozilla.org.xpi @@ -299979,7 +250523,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-fi - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-fi@firefox.mozilla.org.xpi @@ -299993,7 +250537,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-fr - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-fr@firefox.mozilla.org.xpi @@ -300007,7 +250551,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-hr - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-hr@firefox.mozilla.org.xpi @@ -300021,7 +250565,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-hu - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-hu@firefox.mozilla.org.xpi @@ -300035,7 +250579,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-it - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-it@firefox.mozilla.org.xpi @@ -300049,7 +250593,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-lt - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-lt@firefox.mozilla.org.xpi @@ -300063,7 +250607,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-nl - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-nl@firefox.mozilla.org.xpi @@ -300077,7 +250621,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-pl - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-pl@firefox.mozilla.org.xpi @@ -300091,7 +250635,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-pt-BR - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-pt-BR@firefox.mozilla.org.xpi @@ -300105,7 +250649,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-pt-PT - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-pt-PT@firefox.mozilla.org.xpi @@ -300119,7 +250663,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-ro - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-ro@firefox.mozilla.org.xpi @@ -300133,7 +250677,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-ru - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-ru@firefox.mozilla.org.xpi @@ -300147,7 +250691,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-sr - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-sr@firefox.mozilla.org.xpi @@ -300161,7 +250705,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-sv-SE - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-sv-SE@firefox.mozilla.org.xpi @@ -300175,7 +250719,7 @@ functionality to build high-performing, platform-independent programs.system.locale lang-tr - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-tr@firefox.mozilla.org.xpi @@ -300189,13 +250733,20 @@ functionality to build high-performing, platform-independent programs.system.locale lang-uk - firefox + firefox /usr/lib/firefox/browser/extensions/langpack-uk@firefox.mozilla.org.xpi + + 2025-04-03 + 137.0 + Version bump. + Pisi Linux Community + admin@pisilinux.org + 2025-03-21 136.0.2 @@ -310201,7 +260752,7 @@ functionality to build high-performing, platform-independent programs.libnotify-devel toxcore-c-devel sqlcipher-devel - sonnet-kf6-devel + sonnet-devel libXScrnSaver-devel network/chat/qtox/pspec.xml @@ -310221,7 +260772,7 @@ functionality to build high-performing, platform-independent programs.libnotify toxcore-c sqlcipher - sonnet-kf6 + sonnet libXScrnSaver @@ -310233,7 +260784,7 @@ functionality to build high-performing, platform-independent programs. - + 2025-01-13 1.18.2 New upstream. diff --git a/pisi-index.xml.sha1sum b/pisi-index.xml.sha1sum index 05b6a6f77b..77a7cb1218 100644 --- a/pisi-index.xml.sha1sum +++ b/pisi-index.xml.sha1sum @@ -1 +1 @@ -f7c1e0e2fc0312dc92cf7bde43be0263d97e0608 \ No newline at end of file +b67068bb7b67cde31181e967416f33b568950900 \ No newline at end of file diff --git a/pisi-index.xml.xz b/pisi-index.xml.xz index 8a4d56c1fcfbd5fc9964a3f5787771efe605c884..ab4de789738fb20685b2a7cfe01f9f1b70f8ce6d 100644 GIT binary patch delta 1037340 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

l?ie(Ds!IN*Gn?38d=@vMLYKf+MR z2$ak2Zei6I@|sMd!@gL9_zH+Wzj-!_5rwtn0e^~C%O2cde!8`iAG06utuZUe6GzKY zv(WI*4O1?jpAz>i96K9@dBqX}D|tWA`NL)NY`+TgBRk$1MA7cc{6Z!)9ROGTz#)~#(pM(N>ZtO8xlBA02#>xTHneLo{Dg-XVqOvm!Ie2s z6MwwHy`-awRX{d3@pn~4qVjx{hCNj^b0}1WGTtnbz{vF=y|~dw>qVvelCCfu60{8m zdEEulcOYZn~2FLszu> zg;do1e>;lyhG0u8i4ewC27eOc!b&Pw2Yx}W&sHaRh2$Mw`e6K*Qdycr4Jb(N~ zQtiCKW9S3QO3=OT6Jhgq@`%UQB+sF>HNX_9eHJ{|0FpP^Hd`UWV#}ItSIQsMlYM$qI!3Zev^^_!<;4ho#SQt4@6r`{BF`M(L6X~d z8|^G=0QGx|Ms05wC(@?L*P$QDbQ=} z1e`Ya*`%7RFIee}G|;_4GhDfxO%{RO8+7PMGt`Ob05t(dA*xXQnL>rq zo##S}b!zHNMn18H2R2j3-PDm-98Fp?p(Pq?vM1k(Pu8onQ)hiqZ-0WvVSr2#i8YI! zYo`5vJuw_5AxOrp)S*lD4Y5*V)}Q4u9)u`0G^kutG7xcZWA^iQ{Js1lh%(Eh39XaT zZV{vn7%9;iGJF2O&bpfAKZ|C(UuW>A)Zn}k=SNtah4Te&>P)O73n+>S?g!t+DJ9j( zcqWv!@03HSq4G}jH}OopdKG-#8jtYks?f zuPOI21Lj=ab9%#(J`vff$bL)|A}7pzKKz&FnAfZSYn*JALlMT>@9yKW`9MWv!L`Nq ztM(#u9LYH}u|k*4KHT<|eCw}n`lAEK@m9FA=?Hng&{1oum466dSaA>ET_;OzOI@QS zltPHsUqUX7frgTIqK~b^r9$<<8F=*qGUhlf0=JPu$ibds6N?bJ@MI@-xF%)wZHO9! z-r6#5%^bNQqJeY{lLVsO>H^g5BYpc+IrrBsDjs{M8zAydZ`A2Gfk3QTXSuP^K<0ve z%!>$Hpm+1`6n`E&$flhx#)P^V@2*SjLLz}Uk5EG8CEAAamm;Qk;OUipu>`hgo*`d4 zozeu%uSu))>r%)tNtk-Ui{(MOV-a3ZtHiJiYCCcNrsJJf?$d7|p#Z~8??&eq0@WZT ze)E3{tGW#i$NJft0*VK&VSwg$I^BO# z%0ing?~4z88kv%nNBPOE8ORjtc{^8U;Y70G;PjHNtDM=yOTz^OZG#8R6xF&cB>MPN z#=Fin_kW=G0jyP~kHz)bS6TPvHDTOYG*>V#ZL&w>FpxqgJ}hCPColpM&f3#!Y@3!gf;6FonOkjXbsp71-az)T7 zSTA^IZMl!$+BDV~{VM;r8f0b1Y55+vqnIOD`;;76$oeY=K%?(Z-UQCLpbB+J8vd<{ zx_>?_GBF|LgxFf^3sEb}@)y-!%^$G6&Ov;)NB|a}7tuX`u&I8{&ibcNI5owdzp zF3IB%e|@k|w& zqIc~_ra^ErqNrkW?B-G$GVXq$aH<+HDE4I6V7vBX=GdxCooD7C6)!ulL5R_gX)N6u zZ?H^>TebPhz{0-~s3uvJQ}LhQGN_IR%RS$f3Ya%?!DwK>JoY^==IzWUhm-{_OMf>Q z_1a~fjb&JdIv6WFz&agvDBt~~#o~4tq^O`Q=e!|xQP=VBRx=kyEhu-z|6iZ?)&)U1 zp~T(vLcP-fUs}CZoc+swGdq*rvB#F#rM5Z-8)Br|W*@*awnNOK;7__}_c5=Cfn6*U zs&V!OPVHRRMkK;KZt{0glBEv4*?;{F_^NRzAJ^<~FzTe&{THY<&GAVbTr8;UAj>rSD}V%X&%0LieB@`c4 zocE3pAYZ4KvGI!s>3Y=_S3A(S*ufn0I|h0;y3I7Hk^Ug4IRLSAf_F3hCnM*OPt4nr zcZ@Ash}DuI#a&|)+f6tDB7a7YamOQuVYOnM?u2w_*NXPyFT>taSOOHBKBmMK#HZzy zz_0-qLAjQWuw@bq;SCqqejo|v*^4Zxi)wjFE0HGJx`8=13L)Dwd_T;|5}$@75MMBp z4Qx0FUHK!ZO}v0-R1I<-P;D!-QW~CvRR^#avUZmLqO$qds5N#_Rev#aE&*Mzy)kM` zN|_9QelO2x*LLtDAf9)4wma6^*VvmkUb28xUgGbiCYW^axrWX`;sq+v%gCGk z6iLWZf#?ZvE9dcFYf2Ew#$4wkrm1h|Pt(n^^bB>r(H^udJnlX?=|7q#sK7Gwa>oPI ztL%3S8~3JEGDhNdes&PQKFx88%>CSbwh!)CwpYR8s|``S z0sZ-FL z7*ajW$(s=|v*_2<-tmCNac46~JrbQz9LL z3x(b0@a7wU8ycEn+YzTpfSCg2`cd8wzP40TBOe)r(b2xq`2gaohrgE$?8PiFSMFQH zqsy;EJRNW~bWTkVvbh?2YxvMlgK^u-_?t-nXn&|hhyg~4_j5)0Z&LEv3(V1OFF0d( z5uYC^(Ge1tT=?GJy3(?X@;g1V2wkfKz>=}>MljQqKwro9|5CmF>-3uT#yVu+AiJYL^iv16#MPaS$0=MRgeEkzIoRPUhCRNFJ01%ZaYv4jh zvw!S{*#;4i1mcX>C7ol(liiGNcf%uzH~%*i~!r8OW^b66p>0U zqY&JZsTA`(j$G4|E$RpqdRO^6QYI5RR-h(xR~*s~AbswPT$eFaU97$k(1c0UD?h?C z@woL0@)OfzM;j|eLf2uZH^z&c5&_kkRexvf93f&5&hwYxp}MVsah0`WTWA#8;JY7L z2h7B&FRJXDL&>>cxVS@TC*)ccdh#$T3-xXJM}$P;)gxz}AOdd7ubWP4AkGefDFf@t zXOlaB=Umt`$T@#te-9YYLIYERk8`Z5c@i4N%>&AQEk)DS)*ArTKedvKG7+9NNq^Ic zftytnCyqcoI}#wt5RAeHsKe(Q%X4^hMR}x)$|5i6#1}_~_<5I3A$}|=e)~4?;UTB+ zw6fn0JZD5YeWlOFZC_2Qw%!g_8{q~@RIU?@Po*ZOMclGacv?1hKBwDe!V-J*w|PVLGPND-yu6)+K7cWU`+wLd5?h+e>XCh`9+%%ddnl=4qP0NcMjkCxM$buR z+XuRHwe${wT8XUkLQ)bpXY^96MBry_8swqdpd2Jd zq(V+=+D}q>0FLBBB&{ZiM&7cVWqWA2X`$*t@m*TKyzR(zQfphDTwgQpqsj4KF#5fZw_!_4cCKgXt?N{;Uo>^MSbOVbJtcd-NsJb3e6aSU!Zr1_#big;R?uM48CM8J)- zW%8N$cEeeGrPX}eZD%_>g{+Vkm`ZWRo4 z97l={Zh?k27X<6U&rQc!%HaXkx5x{WAHZDvCjSONh6oLmtWk-e)_;Fg1W0GEw`GDf z;)Mhm$%obYq|51`BD{Vj+WD{2PAvd`4zM08?EZL`zZE|1#Mlq$110yX-= zMbhBgUN%roiRag{`Q7jwOxPo2<(g`n8vLUB1kO#cGS+)cT<#inLt^6V;9;= zKINB(iQhINF2)7+Mt^q1)_=6iu-5R1xegr1?#!$;E&%mKyr+FYCJKnm&2(tI-UygH z>-J>I7&bB5usMquNIsfCI1&}#HWuRZb)hR_0}dQWKOt*EGXEcx{XFphf(hOn+urp2 zb-GBcnN&LYiu?%T)s_zpgb*x-m0G|gXoluNX*)A)owL|9P=Dua*JC<~nBX*9PhpL3j@vkgGG*YRt8yVY()a;)^@0MPBM75XO_K*caKuIpx5pE& zg<2o%yMG<JUFQI1^VCCpeM`pY zKS9a9!S9>)lP?#U{T94$y9yIX3OK$&CN75_xOU7V_J1g@J#L=()L|F%^n6Zzo3F$L z=WaFkL2%{~+u`6kDT~{wdzRlmaP#e*JkvuI8!~(YT%loq9B#|t6#YN(-_!dEu8@du zVlxr^7GKa z!VPufExo?9Dx@~y4gcXiuo!oD7A@*kx1jW7#eZ-qK9#V@X>iTwvxL%iE&#gcd?QV_ zc)R~xqz$|dZQ6@t8l9ie8l`Mpi3x(2BFQ8 zhnD=e5?>R~zhE$FnSbvFI0g#bzkb`}U9w>Q+mqRM=)yu{)JKXY zhMERjpzm>s8PLH$kR`~LXh>akc2HoP^B#hX50W+9yo?>x4WtUIUl|JU_IVLp;|qMb zc|^5bf77}FXNnVCqi;dybhf#GDDrVB1b@?dqC|27_gW3@w+=+Yc1YA@tM4kWJZ4hn z(IKVuoMx6)hi}fjY??G^G?BO9Md?B{>VxNvCCZc=@JsBFob0kZxzo=lmNztn-hbsA zi6+&d<4`)H>ieSfilk`M(v_4YJ~vONXIz=^;7(~Vw*PKDk#RM1Zw2Xxr<^sNJ%LMb zAt{0Es(|pv%?YF`QN#kfM#kl{K5$$F%zjsGiAMoR;Iu!XeyMZj(V&w?|5`~SkMSav z;hFuOc2r4NYLJ1>cg&T{h^RQ|Ykxu52K8o>37ZsuyRINgLJx{a9&?L*a=8{%^ZTM0 zEN)^#Nk1#P%91bzbN1scL-+k=DP)cQeaF#EZKLq910ig+gR(SXktbg5yAk8^SEd=- zY6AVf7X|cG-M(g@0FaGpPTE`>ssJh?eAe}`hLcYiYobmiv- zcTlAgXy|(em%0iseHj_P1@=^m;;5UU<-{Z*a{T`#VDUIw$hfutgGC0YE6siUjyXJ+z# zSx}D-d;Da&J!OIlUT~XFvDRQ3b)j8UNDF!pu!Y z0xr4!Qx6hIvfUeA_rycDjw(vLjhJ1`E|*qyZ#(0%=!8xLsFMp${C`g3R)AX9&(-3T z_N1R|7An|ghY%651;u9^@)ccKtVa9 zsP(YHcgVo$Q)9f=Gk>C=JoR-Fx?h@Lx`tE6?wO$L1jFv^uhwqpZXl7Y4Wbfu5jlxO zYZ~gg%&N8()mwG~>a#PFkT9mdt=klC1%K+zIU=>o^$lLez&*d=&fiYe-!Aj9kNv*m z5)`Qdr`Jk1`ysp>qpF+Ht2LFs*4lgCNoBjEED&#SeE9n5hkwO{M6gLPlF4-AGTvSv zj1C7g-B~}V7Bi?J>w%y<-YC95z1oriX~w8N`|JZv(^G{DhaEL^QLNJ_Mpr;xtz5yW z%xMlAiJeUuXH(|#t)}I2XUp51^j-9{kluj_Hcy$YpnEeybmE zpx=Cc2(E;RE1L}81H{ud`<~b>gwquTd9WKZ@S5YQ{VW5I6A@ys@M%=&Z6X&GJ*dW8g@!uz!QM7#x%dZDzpt&NySE0E;Zlq7w)! z+t$M(tmvOZ(jXRe092zGTzNa}fmd5v*NKLDSm7F$g#~$eoa&0ibrQKB-42=?W|q;U zaH}=|6lU=h8xBrWlz;3oU0_AOm_CZckgmp|98%?Wi0Qn-2{oA+ij<8`9&@>+LFRAs zQh)rQyLObT57fNMA5Tn~72~URC6CxY-CnZ6J_3ylrQH^5fLTnmugPXhCPcaK##pc_ zG!`r}xZi^nae8%-N~P*T&i#eY?G7XV*uq9RN5*_)W(D}`Iqvzne7TlYBO{BaP^DPW zn@s&VI_BV&kr_9Oy6{Rj76SS{gL4ltFn@yfy(ESERDUJEzNyYzUaUg434WN!?NRoz zWE0}&s$kX+!csp>tZ(F93M_PPzdE18&W3d1o73n@PUsep=d96P}{CKSBcEw3Aek7@5 zM9k|@pOC zfvkQzhuEfrw{C)cxuaEXua8#bXcU-X1-`wr@;{@39=Q+uCRR*-Sp!EMlJnm0Z}4pz zL+u4fPr^zl(Fbo6%*C)mnW_<7u`2Ie*MBv3#fT??_rotmn_gSE!c!ogoPYfd0C`q| zgD7Y6n@05+SL720?r$P-vS=F*cmP7Z*90efB?rXy0f&EeRte7mcY7)MU!kCVVM(Dj zmp{`*x*E!lSU<+*^YdRogAs0{9J5_=(Yc*Bgfqsz7N{-v5W3DZLSRVqYXA<#Sa)eE zr`7%Ai=fJa1FK-|W~wd}ihp|Y-3il>S0%{Jh&-cc+b*2mVBgRlqk^Sc84U+i`g4^W z+o=20{Vmgs_xS5CO=Z-EU_f-@+-Uv^iWoF*o0#&RRhUki2&# zVM(qCq1>}W-(OB_O@GL@W<)znijI+Tt1O>w)LE!+8^qNF_AV*UAUng)b>JP)UMxw3 z2i0T5Vy*?s%PWiL9G=CS`dOlc7# zEM1L2r#jeT!dDT8nIQ1iq&$za@1Hs~FN5uGWd7CK4Yw@hXBE=fCVIeB1aB~2qm6IO zg(!Ti%ro?_K!2Xnmy7WO8>rVpE{hVzqaqn6eX`(WT?)l`t|>7hb>-OoRz9d0>E#Ku z7K-Q8V*5&VLkr5VcAgz&J$r9B(y_n`l7lIxi^kLLjo$y(Ti3?KW)xUlMJV?6LbX^YoxAg@= z)p!=&N%CPAZ&XK{FQXDF6JJTaf9tO!Kzn)OK*G_8eaVoGO%?X$J!1l?!n-3`s`_P( z$@@6pU)_w;oUm$#GVjKI>1x5E#Wuh+hSR!wi>|HbY_lwzhqjVh3Z=Sb(=h*DTLY* zttv|Y=#q83#~bU!K(H`WI!^Wb>YGd9uF7g+z{I^PUA)8z3!ayGy*916T0I7~>4YvV zihsH;sJ`%X`N}OC=k0)z4gNnk?$^dnnD!;f=doI<$Kmb4(G^Woj4*m#3UK#=y5&kf21pZmvn*1)b$v9nXlKq+D z)L)t|*&%{zrI1{ibB$&WSMw%hIZiwtK7Wur&B7E7X$%RIaQ0sqb7tw}5~xKeJ|6+3 zAf0%yy3a`o;dr+!k^I&!QLY~ic{T270UoS3kU3cb+FqpJ?)g(9wsNO+q?#&7*AK4W z^4Qr!UImd|yv~6!1wPNYX-4#{Lm~@)H~04nx&&Z^d``DK0+fzd9e9W>6nd9Yu79MB z`4vtXpR*6r|Fx@mmJKqOSrzh6egDQ237((+f#bDpl6E+af$w1+-y9y{`zxI{T<_@@)jNUIbAJ?~I>?Jw|7OC!zYzzXoi~^(f-dFI12P7K;@lAt zxXe|0eHaS1g#;0MRV>HgKb4!P>uLGCG zFz1ebVzhZadil~n2H>JWdBEg4l0-)2Qd$``q~Ng8no8!3TpbF?*fM*xIe(zIE5b{e zMi@>(un`_Jea`Hmp&g)FGp;c~LrxM}hjRdj1J|e#zCm0Vvq5qhjNt?EGuSx>+dHsW zoQk{Vq}*Y?#jnQHS7Go}IiLudlWJE(tEwT?2R8b7iHQUzJEMMV%O=~x2AD<84PaVw)?}wj64-vzUSSwb1)Fy17FVC zTY$A<`tsfl@OK|7s8oj|LPt8LwmHsi7frE+(Q$ByebD8Az^nT|3vJzwJ9A#|7EM>j z$zdI=jCspp!sKCD?vvG^eGKoPGKxi&bOZ5527mittuI?zN+q$5#((~{8npp31^9Bv zWCy&3n*0f|@6J*A@U+TpC9TkpM4P)*84HCud@Uw#PYkQ9CVS`tp985zByVZQJxBjE z^VMz(mgtqa3M+EY69=+eSbMMeV(`#QGpsdUg*S7I>iQRySlj zw+UFAN#rg?g-*`w7k^|B;gt$k!bA}2y!xb1QJV?wQJzZkpxN;L5M>Ca`Ge9B{_P zvW0(6#JKJb(@!kv*A)CihRO`Z$43x7%I$1ZPR5M?+lQ-sBO zj7VIk+%H2wP#3nRdT@vmV;*!K(_LNlSHhb3LUz^v!pOXxcSgA)Kio*=KolgoJS`rhbM54w0{h%tcxa=N=E`eUQ1^Abao`T zkt|}=>&M(;#-!rg14&Ng!zMVVBuOnkHfeIUL|r8?7#)vX)!)LL~!8t=Lw*;t7mEGH^u&5(xZe@`opQ?(FgYO_APqe_Rx#I+Rm*mPr5ASRi zq4^WB(tlfVK~3Ghq_iL41BL&~f`S?s(qu4$0GY z^_2A_jqCblzQpoyv;rcO`@l}$7jR20 z0SM$x&)syd>n{;Py&;>teEI(CEib4|1b;thF<`3}%Us$bpwhrb9|4pL)otXz9A)Tx zLFS&)^hXtK$iPp5UO2-fqQj5nLraOqKjg!@BRR~D!->?PQxJN4Ljr|F~rO#xuS>9^l8ufA`8KkkAFMx zm?=@1Ac^sT>gGfAg>6!T6kOEBz+_FlK3f`S3uNG(-o&lp1v z-xqj}#+2o9NXKg7$xVNq#_(g)&woD5IY=y&{yO0OC)lz~xiq0lVYWKR>Llj(4(k+Vq0 zOErI$+na{5%-B3zlGncp$5Q(2AJHZhjeB$hvruHu2F261AnVthbAr1@U4Ii4vQ^dd zwEH!zrTaA`&g1?pxvlk}G0J~sbD;pM**S&j?cMHKFQ6(8%GgipW3r#bq}Q`Qw1kCl z;3LQ=K(^^hE8^hMfREK)}CZyg#1H zOw799-j_njJLB~O4PJd{U3KC(gz0~!;Z)9f;c9hcg^Gwnk3+G26Bg|=-%D*K{8Am= zO7*9f%^qVwsIjgI{Q`GFD26?;*m(y1R#(*j>peZ z8tnX8Y-^5$Pr8N!9T&Fbf2^EMpm}3cKFnRJ`0n5rxhk#Jx+IvrL~_fxlSY3mRC=!P z*onyIr(SYJh#Y**>J|!}R?M%F`a(Y>sCWuX=F)GDl&o=1-A`JmEd zV{=J8j^7R8qTU#?pDqTl5nhPg$QjP-gft4@6;{E{XDq55uF%0j{b0~*SJaeKs9prDtr3=xC$RyO8*s6P!NbLK$O zg+l7v?e`EH#f9|EFQb3E{ao&{8mF9cbQ1vkHcWr=3~U{=x>uq@(Mu&4@L^Y@I}{Gx zXe*shBpK3Dj>PJ`3}xz?4^^@6){-HwM|!ns32PrSnqz)yD2L6VLsJ|lDWVF$+D{*u z`JWY*IxhYZ*)UN2d`R0OhAM-YV<~Q4(UBoVi|}w)FZQ6Smc4)FTtKHMeGChtI4i(M zQ%O{pIxw_TgrxjKoff(pDlpx_vbZuj1>>IO{Aze=iJK@#zB9=pZ_Y{gy63ZO&g4V* zdIc~2PfhwOLfxf15;|WDW1HEQrW>Wyyaerwh(g07GU87U%1#P2p)z^jn9`%H#Xn+*13phx%jUv~@#q&}cCE z)qx1@9j8k=C;bF-LtWcmIcGy`mOZb4q3moNrnpoawkL~#f=a9R>}gc!CP8TmeG(6$ka$3p zl~rLy9p{@?=sFtCbDdP>$^)5$tt}idEt;hHj;n@*i*(%7w%>&_J-Ue!#^ow+{JHzV zA@ksfKU#mrxXrs8F%ty%;V>B?!73E?nCuA@TX| z^Krcq!_9fxjiCD#tutRbjo}+(=VS)$lx?&Srt^Od<6wq1ry62ZTG1-Z;$zB+x0}-$ z#pEZqVSztx&(vV&mb%-ylX30)8``e6?wJ3izNvZR_cQ2`2P}o6=g9=|@@pl+kxgm(lsw zWru$ivAnILuWMo0&ADvR8blekik3MXRv-uF)IMi3iV}V+^n+UAqv`pDIKvk`OZI$P z=l`{H?V)L!fwlx9?@#|h2wH709cS2zcF-#fXpd1-S*5F$4Q*h;XvhVq6S^MyLVfaR zO5P?xpQOn+1EYHu9P3>+7JL3sY@Ry|Yj%GawRg$3qt1yY!L`y2rNY209nIERQoOJS z(Cb~5exiYm$vifyw=7odnsb!@*!VJb4#g%vCHg+lw9h2lr1`(5dS8ShHm3e9Fx-$E z*h`ElcF&CY!04BZ(DUK!xU2$j`Z+^hKdjPRJ%k+u>BeJt;?!mls;QkO`8N+_EVuW?JpXHyBgaUZK( zBs>zHY(!4|2S`#*o0NdEWs`qa2gBK+!?l8tv%~6g@r(9$z7wrz1_%?P?D2a~UcH>+ z{6<0lt*bxj7B+K(A!w3D?kt%(6ud2)ujh+KoWKE(u)At5u>@_S%QKrK6RGC8AW!G? zD`*Dc$s!g=yjw9k6QFKftN9;Hl>SVuLYFz_h;-&;xdRcZX)fONjX8hFP7PAFjVNK| zqVv`QvqH|V5pyRW>_b~f2mm+3NXb}8@~$o!|n9jud*(Vz>{x_5qk*1#B8%6+8X zC}T0eki6>TNsDJ^^&qu)(6Pl4*@V2|ZGj4Jt-aEDZ}mso}mvE6@B@2lb317!QIvv$Js?-B?j8L6Zfz|Pc?1H0# zApKE}#XX^NiJ#(2pP!$YiSDamKEO#R!MvWZo+FBj#r-q4Fv@>13KxOE{5@5O4ryvp zTAX@1r1Jn8&i3_ugJ%9L-^0J00ssf@h&qhUY59OU68G&KA4DG$` zf+%%Fjwom7z`Ha}cHX9+GCD^-YXk@i(cJR4Hk)7nbOJ&IcK4pns93B54tZ{rhwfuo z)~^paR~aP2sxE(RBdjJDVDTzGK-%B6Gc6>I5!O>qysJsb3ys^-75qo6mpDw~V@6P=lBZ}yG0R*hJH8X3ZLDa0 z)dcj(xk|L3U;Rr78&rYVW%!MwT060&5Q4=W-fnXL=eMH{ zq>6vatMJ8_4wesA^rgQs%6(la7yPUTn?+FFlq4gP5Q)XUzPQmYhnz|6Ba_hVWY{JM z2;-=fZtKgeU!I9HQfn$i(2-Gy-@mmFwI1gYG2}2rD2t_evhc9Hu$~k1#O)tj-pNa8 zmL7S|Km0VOa-ua(WPc}d4ev=O%;~8*m12Ki!K&MCo8*saJPj1+xpV=}9%F^B4R_W8 zo?5HiEE0p#;C$ z7^1>-AIMHS%`EE41WbP_hnP;j1-La^j%%a)Y1SSCek^q7bYq|b<&}LGDIc9sa7yQy zxOXD4Z;6xOH(zS%tB)D`Fa3B@=+vj(US5(#%{It$7$uEQgg42!Rhw3S2O=8t;XyX# z84}r(qyLL=2(--T(;a)USLro7RZ@R49Vq(Jt4%<9gCzaYz%X}?&qnKF41~}AA=j<; zLe#MrHiK3%q!sckE+g^xjj>*HyG_0ro7j@?;rn}=yFMOFV*vP7NeKauPyEWjuGqTR zL8-VGD6ZM9W>n#llUxK##rvN5A%Rb7w^8xuN6)A;h>hAiIrj`X>pOiw`)hw_s+vKe zM4-nEf(B<5j)2eCQTXjhl8RUP!{0kyB4@Yc0g|m**5C_DQ|hij7lyk5Zdd_XOE0J9 zvjHB3ktMrVfkIp}^2<=ou6X%)C~0B7gGlBaCHa{t2636%Nhl(^&}YtURvfHLt8PdR zV3goY=M}u%<`CRQL2&&ms-Az4@Xr?|BmYH(Ya}iuM#z%|sbbXUwjEZlv8^p(Aff#B z6`3B*l!5rCTk#>LNu*qY3+j{hv-r(N&`YW6-NotEKaNr&6 z2nW6FzSO8SR3_^d`$>K`WycixCoDOnDzvV$GVDE}W0!fm#!$4`;arLZXH5Nsp z=~dzSvz*mdVSt5U5c;v|YuIUm1(B8+J9(%Sp1oUqb>bNSdx?(d2~CGcBE=?|YUI~C zFo$DO#%D0@mKo_A#&{;$quf2L;IFcB>1!%0Ep0G|x9gIHv4DRzi>gD`B3RQnoayyz zdm0_oGF}6G+9amsaVHu*(a8eeqGW#ReFoRfPXK}iftWlU-asn#vJ_(7iWk<|sl3J@ zRzh=tpc5Jy%*T=1l1DqFSN=}ecNH+5-;Ryiv&5=`I#&<(46{tlLsbwbYQ^74L~2PO zm5s`_45R0MuKs_qE*JuLIdQP7$7LpMc1!)%a^Zv~%NpO5{(N(Mh@xr%sK5Hzi!VQY zq2Sl)&ngnGn9{%TQTm!wq7F``QzTEvii%N`L;iZEEu|O>p8YV= z*a!d|-$OiR!xg=vrt%o4kfGZlul>L4vcB`{t_p%1(Pb9130xcJ)?sZF&`%gK%7JCf zc<>f;s-u795p^U{^R787R%J$Oj?@HwUppo5*ZpJoCe>l0E-bGtE*_V0ohS&JeQ1#~ z%;>rNU&d@}u!6ilfVR$_mA+BYgK-+VlQX|BPIlkUh-jP^zdzRDM1fl;ImTTRV1RAT z7IOfW+_u67Xp=Hy(C--YmAqG;e^r?4v(xB3=IDRv9J>nVXI=7nRppK_#5BcjrmfyE z7aN^eh&^sbQX57L-MxL4f4x@*DAdUn=b}Q${CM73g_t#>6s_g%7zvwVH%5PtsqKK$ z-m@FK-u(z*v@2vJ=AbkY3s!A+SX^nRyD}|9r~=U|2&P{#4OeK!!jH)NxTg$em_Gan zu^@l#Y$jmn{drp#bvQV}x@+N!d8tgAncuHUvM6JCch(b_-)Kkw-Btt$IVM=(`)DQd z%)83d$kZF%_hNCKnsFX;97Bhx@&%HqtY}#|VYp_1UN!AcJyF@zKwH6UE8#4NA}k1M ztN(Stx`?8x%Q;~g&S3!qTd+fe+BVu9<9dIoSJGkLl_qD7@}ol^MIvzX zTALW2e|d_W`vYvqud%HC7h_S_QRCD-wuchPd4K^dz4s2sw`}Y*gNM6T8F>ne@NIwl z!(1k~=tiJsV0BFBpOWTvN(oh`RE;QYY5~eY2$9~>k$xiG;>~Bvu=tO%(kH1brbUWFbO!Y*OL2e>?^`iiXnG$zrCHJAn)ICH0v&PtJ%@ zQ25e5*Sk;K@c$)NF$@3FDsae(_nxID`ScZ?GV{IBlT*I!7)FyJeKaG3cLzpNA2b^q zK&DcJz|n>oe2$po!n88nNmr* zcD0;Y-T)BY3s=@J@?DKDBS13?`>{`{$SoKv8IO*9`IRG(sP}}H7r*d3pvwxg0A^+j z7L4JZ*s%Kh?;$SPS6QlsDMFNaXdj(QS!^WZfn z9(5nEm1awrm=qavIhN|n*lzj?p8uCTB-s3G0k?+omi$3{mk8Sk&=A9axAMU={)p#T2o8wdqYcIb{$8^|{koU@fe zPTzhsk96~eibAZz-A4Jtp((PIF-lH3lJr$fm8t>k(2eWOOx5yu?Pk3w(aco}xljwv z;!vQ`9+CJpU5p_xH$>rr%$w*5ugP9>fvp4aC*6MlOB_>&Eqeo*>?!ZPON}ZB10VO` zz!PD;dwZusByK)h0sjb{Uls)|xJ~uIAFCv0oRQrMFdSe9qDFY>?Q`OxP}q>yJxMF- zhH6#1nU-L_ovLA#WFgXRxU{}U{P3ld;Uu5{94>CEtPv@TlMD#3u`aoz**BRPU01I=bPwpSNUY%ecN*xg!Sek!5y>mSb8_n^{Tn2oq_&8B~e zHWER-U=*fZo|O4i`hSUmn{6ZYP<}OlisWpFHF0%83@2!W!>dT#G>YHM9Ol0>PB70bx66E(8tXy0cBroK+F@7BqnIDBk zaOG7z7|(}kQ6$v+AujB1`U21-yJR6+sv5cZcMS&g*~mP>?}6 z5Vup1_s6?TZxtw;$9v(#Y&&Gkt^Q2Z>9Zg1OupemDq>_lXsb(j@x?1gj>{dPh{11d zOZu1l4cy+Ye!vBuNwwBXZE%)&UEvBM92*Fm%a_(Lt%mh^$J3r> z@GU7`7Fzx|2{cc9)m6zd7UzFPM6h*oB|j|_^(T6RzvsqJMSyd0U^~~6_gvR2SwvUL zx5O-fc^~gO$2iVaw(k?V7F-OwYRz~-LBJ2G*)Yj<%jXR%XeeBbg8{58-Al8vA=;9u zKN~_}m4S_Oa$rydE_HVjNk`uohR-%y}7@8ARje3#wVN~=-d6NR9qM5v~ z#G0tRF<~6>O52v%6nIsLI-;uv?zIj{pApE04kncS%`%KpDcrtZBACoMtEi2IjWibw zZdP^Wvl!`gSSrbBDh_|Tyu7_$kjKQ4lfuzPq<27G?6CIwPf6uJL5YooBLu*HI42KK zW|k)KaGQxOt*N74fLuR$m1o~vah3$}Vy@jaT6o2faw>ZEudd{o6X>w&mD!r={AIBV zT(7j0NWcS$yh{ZTSV8o~;wjk@?VC~qKb|bJu|*ysIgW+_L#==R6eS>(sbAqvE582= zzv)HI3h?q}QQ4ZHG?guBr!pa+hYg@JWR+_*9AjDej-~t9#;%8OX`V<$Z zx$LLsV1W$`rV>OY;0i=*GpdfWcl4b)h%wXlbY5sn1k``~UzGa7jbQU<6FhdeIwEK# zBVpdk>!8T;&7hkbdt3nYaT~H1+QY)rZ-uCbvZ~#e=iw-I7~Tl?u?^jh&c{td4?wD5 zX@LZ>&o7Df@yv#&47y(>2c-{94_y@M;Xf_^CQMRYHA3rx8V=d4Pc}9FJ1bfP3_mH! zUPMi6U2=caVzk%>!l;!y8(2Sp$|o|2ZK4L*NA|acocuAI{RuU`_K_SSHP*UTv!x_2 zb1p0z)$I5lTtl_-qYBPuQTgH@JX^QhClj^`yRvm~?u4-zbzsBB@4d+zsofrKV~eo~3Bc{h6yk8r!E*l3Xp6tQGIg{7_n4|gbeXogu{5))y&aFqF}@Es z_`QFo@b4=5FG=FNIDMZN{Ma?2sAj$5PkDG4Lv02p&q?*jVj8IlFpQpk$F-*gXubmZ zy&uNGHxW$pI5Ds|NjHjW(eWPdzHrxl$#9`v*!-T~VT+$*d+}ZF?L*LF?9ox&(d2@S zZv;!fx|DoFfC(`Yc+Qgv1=b5|MDC^0o63Kq1cb@;0HSMYX=KIc=WFaBFS}7ENO{Y1 zRcUgzY^o0d&)|fi4)^~9NY*0z4kRyEQ2j6^#e_oVgO7_h%M|&nm?#9RHf=Q(7IbCP zo7rC%k+UJ$3XM>OHIGguteE}eZIboMlO$9RHea4FnG|OrWkkL_td=q{FS>EsuD)SRil-p?nA|WB3zD1?&;>yh=RMj{hO9zwKDn^((mNI(} zxW4vpo>%)bdnQ45E3~{^e*Mfz?HGTAQ!pjz6s-YMqsCqgv~%@@we5DPxN(lTrjPy^ zFM}P&zvQ^{dukPm`=f^O_AdqclPHONSWQ)DWeC?b$A>ylT$q7jZ-6R-PSx=kW=9OJ zIj}=tmH~}3i7rbA*T?M_e(mrxH}YN#3+&{Un^`O;@p9QOD1*`O#UVzu@eO}%$c?#; zJ!*S+NnJ%2=cb2E8DpKO^TTn%*rFR)($&eV^d zqv8-{fVy3{SgVUTQ8n-;mhFrCPYbS0yRv#}UDLq*D(iw$+{E=fRANWYT9ixPzlh}N z&56f`hWnyjtM}{G$3s{24&Q&=9y~RRfHwhR9+i|3C%Oh$qn4CabK}CSc9yA^)`@Yl zGCwCys_nrDHx?@PX+TWcV?#?p>p!YSq;0q#v|H2iS*GHd^}V^~z8?2ZER(~i%Ie|q zDyED~R{@XrafcX3mEn}G&NP%-C1>KL?4MJwQcg-UZ@3>EK0AX%dSq8|nrK;q3Ao=7 z9;(iT6RxQLgG*2IC`SV(VEJ*<-L-FeZ?%1{obH!;T_QUZGQoeC6*|xiH-LKWaJ(I$ zN-^x5qErDU*1N;dD?Yt%Sgdi~v4jHwW3DPS#gAN9Vo!ti`6^2Pp^H!$O;{bfYrJGx znH--FPLj%&Cvq-1#>6Tz?YP_!Nr2r!!L9$ocesc{i~$6*M6Z8X?5jae+w`xV=}JCOu@H@LyJE^Dh7I zz5Y(@-j5Cf1IKrV^G2?BJ5COp+jXmVu>tW2#&u@*cx8W$%@NTk3*HU-wuaxRUda^6 zQy|*ht0))1b(;FX+14|d;Z)vW7H3p*Iwe*!;svEFi^3I%b^1aar3_lSWC=js z-o`uJyo7($AxAs0hv^k`HilVt9p0)U&zaER9m`SSg2{1J)0eJuG~Q*jph=-oDn9RU z8k~;S0yo8ifxlo{s`tnHrHfwC;)U|#f=MrLh!72d-xWx5nJw(;g^R@|f_~E4dUd?5 zO6BU{vCM?eX+$ZHS^A8iC%saQhqpID6xJ%@eZzm}xzjgdl+Guv`<(sjs20f@*+zH5 zPh|$eS;ofS3SVAnQE^!S2rRoHU5pXTS9axcEAd8O&sSWrN9H68Y_=bYyf{M>FMtMc z(WYG#PLfjtjd!jl8Xy*{k1&wOIw78R&$@rld>}ANUS7@(2x|K=ii@odrEU(ytLrr6 z{f>X5T9=us>5~qc>$d_bI@-ez9Q+G>uyD=J_bvMUEG%w?n|H^nJvJxUO~BBDp&*0Q zFYlu>0R92G^y_jz(08Z_NTt{`i+WlW?_1`FtB)6S{@t3CR1UuV$h+`W%0f zB?xTNf$ob%u;?UH>HSfa>*+`dEcsmBQ8HDP&ZZF$6Ixkog#C6NC)xu5?q zG9b4~E~TxSbd9cT-p9)`LE`+D8y3P@htFM?x=LZ+CvLg>ZjTcadc-^=>j2>8PG!Ei z1P=w1jY&Z5Eg9rOobyZKMP918%Hw~6nP&3$rEp^2KJW2e>_b7jo9TJLaO3(Qkf@3V z8L3U=jJR|OwWPs1NKY@=v!Y-7d|st4c~vImuP}Q;N>9aTR>;c|;s(+LKwI+F`YdGf zCgpR$AuOk%U7W0j_e|Xj7r34nAVNYwZ}Tqzdq6wXP8cQ-$P?pZa$<>_)lPq$Yexmz z)^<`aD(aeJ$oxdiJUznSnI>+66ty-XHc_|F&mJ`yWDw716_4SJND%PnidEN?@ur7c z$a*zL--|zXVcSjp$S8G|3Uy^j^O^ZvNKoj2GhDIr)h9^?*fLHAS+hcKXzEMCR%kh# zljD!cPwaV`U+@-nh6@aaQEz`L6i^(q^_yiS;}hX`Eyv*2vmPJxxRTSljv9ghD33g< zTY%ytK(gI)#07dT;rIOyD>N+`EhZGn)z7)5dkPEDDC&xiUJW}5xWXsvogc97=9-Ya zV2xsA37HFCRT1Pqi+!CGJ16S@0QGG-WB`Gda3SvB?XrUWMK)HWCdPjgOTntJo_Zo~ zG-UJ;r_Z9Q225DlKY^aZ(OK~Mv4^MXhRVtCr%SQ}QXjOj`^Z27MXNM-7S}M8U$_Lr*t|}zm(ZZqKk^pbQ^xw||G;q|S zh7eL(ZJT9(Mr}FU-l@d}d5uMZ)P!75PodDvRCbEJMx*fDZL>}}Oc*vMIV4tD)8};J zMMgaS^9s#fsXn6k9-McCxc*GuBQ(#6ZKz<>HEDmnXV{K*0cwB7s-T=dh@Z28E<_Wx z@h6p}hjQDpGoBj6pswJ>{P}8j_Z?UEhT3tTf+tTS1sd~=)+Ol^Y#(F>ks(Kd&1#lv zF?jKyL?>a6RxDCiQqlPF%TQcHR?70Ni8nz%p!+KPZxV(jVc(BLw_4{E1FUwgP_L*` z7*Z6WU}OU(y5xV{c+GAC@NZ;!=XGn-^qTyktxOr736;cnS0#kX$$jeFS_=Wsb;z9d zJ&lQwa>oqM8rz=Fp7k@L-^V1=rag!-5A-GOu6^Nr6j1~p+KKRa6LW8f5`P}Q_85xq z1FKM7S8~8I2=FQ2@Q$#w77KA~Tqi3Z?@&j#BM@s>gd=~D^;lvPr6Ep>-%}%{qhs(i z5^e|QksGcAkBBlTCkY)hy;Lr{_6U~xm-Sdf6RM(y$Z{hNON7ytvyA{v&)TDAbz^ji z8?JMvnU495XycX)(L>3`)whI!0D<6$fNl$i8R4bO#|| zw6*MrG46j?ih%UP)VRheENj<0RW5K~Oljvp20|LI%h^yR^0H9eW5F%BjywpqOL)h} zpvf~o@fP&Vk;#Vb#K@Y3+*qgxp>CW9lZkvSU`)g&bM+&hqM-+G5I(jYA^oSFG@baHYbQ{{H!uVep^qrDm8zhikNEiCMu3T7B8C(3Ge2R1A}1D zyd{6O ztEVIVk%#755@)3S3ROpa?|GBt+8Yt|GRb4O(e7sa;i&@YelnLZx@+S_q{=Zq6__%Q zTbX~Xlsc+j1EYd&6kwP%gESga6APMNp^+xnX}n=Z9yNOr-wGaai&QZ1gH6hdG?AdnfUN zVpD09%a4vobrUy(C%oDu@oQe6&;9p@5>fSA*FV6Hg>)j{ucWFy9YWOX6$Z3iYh6oY z2q3<^wd4??-FvFm0zZb}QK^}xHgOVGlK>bz5?ol^aU*ok02r9eorf21&Jn8iO?!WX zr7q_b(2NXI$*BJ{-$q55_y^Xypi(Z22KXSTQ&i)w~UT;F7dNE4;E|MQT9` z@PVS4bkNXbv+ljfsD>}7maA$Fu#VQ0h7ytY{P1%)e?yf{dvU(JaIIU1u1gbIx`0yPhV2OP^y zhs5{OAgsnAYhn?T@%INwlKrJ^cqV>8fvl<5VM*+vEa;{QDbw~ke3Sg6f2@Chd&^-} zC{K`I^#9$V6QbfX@ z;Ey*CkE1Y(1SOLQ3?DCy!^fe)Cphy7_(uj@Og?X^BEF>()m?^D#yceYj%*IWP|<<@Yn0FbrC%(xvYMC9#opLJ3#AVLzPEzUhOUeG9(0$DB$g#sF&}sA~7swxwHsz8V`S!;!dXnw8Oqc z0bMSy1}(9F7&STV)UZ{iN-RdK9+7YzF>IDrR8~6Qh$qSzioFg=r|Z z#JOpf?^i@Gr>r8A_5^f$A~ADUEnLl2O%hrtWTogB%DY9ul!|7e70I39GxiQ39$ryA zs~M4sx5deK4n2Rt$UG-w0m-1XM{N|H3IqvLnCg?N?7D+apqJd>rx;xhuC6_kMZZR) z0^{N$%st{EXoOQ+)?tUZ89vw=&$qQsq2hIZ)~{nMbDJ7JK}M4RF)?)mzt?Qr1SsJB zEB!9oPLfvj82%$wBsuz?L!g699eip6?64Arbp&S71gn4Fl9w^DocBV29WXN>YY@mE zwRvUDhVz1>5x((pxUA@B?!6gbAPc=b?&wa4z(8?clV3=RkZQ<8%7d%!qZk|S?W{&?fOn8UKvzzpE6hza`#L@5)50(!iE zlI5spb0mLjvDQj*_U_Z`_H)34H6eA9C@BdbvqP&U!z+!ES*h9{OYU6$%S_M z+}JP?CT43&GXYM@#vZ4KYmi)2i^29RtsdwK#o-cO&xG`bF$@`OWV(6 z*BpP0eZ;yCcu!vG_cR=cWr?>|NZ(kwEI~vVK=K(^el^#eCoETZZQ))fGJHKcYP?Yh)W9BeC0Tu@%o2 zXerwb%Uqd7$T8l;&=aGBXz9fzx&YDLE5oC8@B>VUNCN6XOoc&mZx_VO9y~EUAX$Hq zT0-cDXt!5)3`@6x2wUuJ%B4!GEw;FmF7L1w*h*=-EPKS$ANaWkg03FyvGxtvP%yT! zmj4C>Wer$ITPF1rVXV4Es6{r!=#R0A>ok~9*|(<;nM2JR6DSnis%%D=m%o2vRqueL z#ss6TPNasO`BgD0Q2yro7f@v{=-Axc;*YC8n6i!fT;3l%u;|)jQVo zGl4y^=OQz*_5O|;JqyK z%6F8qjo!j~BAL?A17v-OH8LyGV{-9I2!qPG227p$(;Z$O zMi5qS_CHWb7vDz}DQ%^G+nrbpULL>`v$4yKb^;!h*EE$UEYf;Pc!C!_-Nh6}nILx6 z%#z$5f=PlC5~NWYigrI{G;o-Ry9{RDW9V)UHEc1O3_osrkCas&rkQ_7Kq3Fe%}ii8 zm9Gsg_&0r<0sPd;EwpsdP-lnT1#uV{$5;=-x_IUi{*1;uyH(?3y|kB~vIw&`Wwg1n zz9R(^E~5JY9!c(^LsqDXXe-4Eh491wHYBv#}G9JpJ+hB`4)HSnoV44V7cXyEj!0z~TL0lOlrtfYHm z3ROHnvgYm!XKy;rxGDu#x()s6Nq{@i)Aj=N7}L`(0>O$o9|c^h2@;?e9rxxN3MR?q zd-)cb^Bl5&X!TRv&9+gBa(ZQ}52zbJ85^8t(6`p>+XH`8b`bfy36>&Hltb%=ne;$k z$Kj94Y!@`dS)_@$`+aH<%+b$vojuTdR!_BU_DV?ohAUn-g}I>|ZNU29M5+H-YaOH} z=G94%rOJOEAxcRZp6$oTYu^7yNYc4bhs*RS<&0IgbvSr4_^7qg!j@2VB=!!xKav^5-C zL?Z{^3HShERaM>BmRL4+M;`~}m1g?u9)V=LbS|fxoM(5X+%gt)mEA?Dgv8lrk6VaW z?4O^h$RjT%t@rTn<4D?rr4T}-DKUYEHc`lN{GNZM>VEf|S^ZT)YWYW#trfXm>Y(*- zX%yEe9MsLR_y`!#J&xN*B>l6Lh!PN)r`J}upHy~U`gauufD7440s|n3Mfug}RlIFn zDXh3+W;bL4TP>+8orFx=8 zRd;bDjkrlMRMRsW=<$mR#qz!IzM+}IMvxcc#0-S1T+x6i^O_HbUlSB!wfy({(0W>= z;VAa77AEt&^v3Yk0QzSc*)gfZOC|`s$WKy9N^KA?FSaZ-67T zJyp`Unop{52R8M^kN3_C%Tk)bHB}13JFK-SgYOq>aX_{IxJH5cay%8nCWH=>oK7?$ z+c|gOdq-qkK=6al%aBcnpxc)8jEB@4${cH6zjD}+b2<8gr~>%EO5=Zj-gyLlp22$s&CF0t&wWH5^ND%C$^685C;yOXHTd!R z5PocdZ9dSntmof~fh$Z1C)x|0c?8KCk0`^8*3KHBk&W zVCGL;=79MgN&sO|kOGmrvkE$POv@NZHlY7BrSe=Dm>P}5Y5RZaB<@8H4wlTUieeJ5 zygD!e_MF+S^z1x7GIv>qFmKHc)?b{P1CqHNxWpX874Ka= zM0I67$(|v|`(mxo>Z#RJd)%COI~Y5I9eG_%g$WqFrN`F$z~B_rvd! zbl>Mas*?5uTwQ-A%6XVLKSR*In?;g}p)WqB4Z~9mU{o@0xXIG|Z^iI4({TZVljG(C z!%WZDxGwkG#jS!?K?1i7>Od4Mqz5hK*PWJ6mt&RS?$2P&S9{z2<$}Myr{*|4K`YQL zkkFl8@FypwIK4Q|z<~Q;#5uR)MoBtdIV{|UD?}6g-H3lDY=6Rb|F>)pN>jN~)~-=p zE?PG_2{i$|n0ZC5%wXRWOT#JVl1#>M@n=EC2)*yGj3(OuXb7jMs!ssc6a?508GI0A z6joT(JCnaFA#07qvB>Fi?P&VM!Tt3RRX^?`WEM3|KAFr^9O{172u*j`#=yQfL>TPa z!8{2x+m(OVvU0wm1o?G?;-}s-(-4{?zE5`|b(XmNLAIY_^vL?^oWwm92HFj3c zp^<(AU5^P)C>iqNs!Lk)(5rX~y`@I*+sr$HM+tx4vTl{l?b>S=M}R=9N_d{|sk4`` zhQIMiW{ZE%zfWuCudY8e`0(75Qi zqRFF%vuD#T${AlUD8PF6kN$&h<(Hs-Nh)H;U9h%>ErFh)aDt=rr`s0kerIxbZ@T3E z39Ns3OfTUhjyiFv7_Z6$-uXk=+t+*~ethM^+=JsONw0s1(6vvpHDzS;t}@zMU&_%^ zSAbGn)H#dZ#@V-7mq+vAk;cKzNXoC012E?MBkY~gW;y$#H4pcxF4{Vs)(iNXE;B-A zJkv^Ufn?6Hr2G~*a2Q@LF#d1`sS+IM_^yBOkB#Q0{<>u2a4W@49hqFWOP)Z82uVNb z;tKguhe08Aj@bY;K+3;L2k#6N2?W0KbE2()1Fs#Ae0n85_DA{h;KDIf+Ji$~;{R=K&3ETYB&a4ZLkiNVV$hRx`8H~ zfY4ASFb-rhU#^B55vyirA}SO`s1lr&Q64c6qEvr3;abEq1MCOUTPy{dlMgu`Gm`v& z&hmE(BuNhn2ZYZ15+jPBP-@x*O-i08JYh}H^v;`MqK4atrPWYrIAZR2KC6SYM4(X8 zr$IS)Fxzv_yX^sW>y&cUIb28;;TJD9>(Z-{u6H)+s4 zQde4`Y)AJDB<(Q(22<6<(llt-5^v~#)IgfEM_FAvz9PrG8QDoc7@6sK6~4?jG+s=b z8NHMgU3?)Hy%3dM!T4(S=kCkEYs}f)p56Lk!BtdS%9{kmtO}Cjenf0G4bQ^A!xI5j zY^|$RhC*=_zprgff}i{zPlnc^G9-g}`s0QuD856Z4*6Fc1WQgXsjS<0{fY&D067g_ z_|?bd*-miCV%_Zc(WbSe-gLxNOpo86Wp+BZP<2gcfWWk^B&Vfgg{)G*gLtVmQp-%s z+9~7DiAx!K2KNPzaDrI_WIK9tc+%|WU3BX zmOo`*;7f*cObLKRtLv9()dY5bS7VKmCGWp{R(hbZ_@MNk*UG7jBY&ml=Skc?o^T|l zpGGB)5@wLid&M7jk*Ka`-+rC4mGbDpG5C80Ap@oLBc*JCzs2~Zp`W+zU<>#Eg-c@l zvIWRa_tuf5?RGq8dDIuFV;rxV;zd`}ra#!zvrA*h_C&gnZWMRojf?$%#FOZ5TO`>3 zdRi18a|=6%BWYI;=vQm?p}eYM)iu>YEad*6GTad|*SYQljW$Wd|LpH^*Tlk|H9s3j zJ2BrT_E|mN;5_sXw)~%ml$vk1cy!wpmtE<;bIFju|@`moOZepI3e57>RS1kIENLhQ?n~) zmaoGlU@c(&ahAm*ZrPxbuB2^2CafeUEJ6T6!i<(V9#ZroZ#5Gj^hpkRTM3(FTM3%& z3>Oz(9-3QH2#&hDPklvt5)XyDJpecW0HC$99SfWIYYhFGHcF*`VspAG&}BQ)jZ99#X3LFCq@>+{dhr&DQQkUj77&w`>R%+M z;_--Y`#u0iMk$(_Vkr3@85KIiB9SXxGUUpYE!g0thjb~?N*!6Kz~Tg($ps^xT)e_vq89&~HjQlHPgk|DVADp4=?&R;Sz5w;9o z9^limiw_Fbx#poyY4=bR?DC|se(<9Z(OXW4q#4J5j3YEAWbi{z8)+aq6=!L2xUTAN zP*s(YNCA9p$=f|Y0jNga3sTHCZ50zoB-G-_(K&_7&NDDCuWlfAeG#v52Te|u(1`O& zCBD*>3)jzzpL0+$;-XOh*Amy4-*+i5unX-IN6`8+UJxZ;)u1QM0%t^ftYpDTsatoC zz1~%S@%^s6cxldn&L#X9ya-+l^&n8=pofUm#5oJA}qC`4IYcxxXV5?$kG z667kaPoImQ$}3a^BuOPG+RDHn5gd%8WJu^L_xa>l!HNBLBEPAZimlN(5aZNyDK55H zn8cFX=~NmNy63?AAqnY`YCE|i5@z+(zWND&1<+3sHr%>+o_R;aFep=JI;wfTr_}VL zYW3cB;HS@U2fOJ-vnXmZqaM-|3=IPfD>poT{d*Gq(bWiz)fr@$Ym8hGqj}kv#>}(S z3;dFqedx2pX{=UeDhZp^{y)9N=ht0MFbx-xFh)uUA2D7mlwJk&iok&9n-MaTN`Pa3 z4xl=cKVI78Q0U92`a08*4}DwJ91c85h%MANefpBfOjek%$JP^t^U1YMeqgIT$Tt0X zjg@&`{IP2f*-E2u#%bXZtFU7>aWY{jl|7)sE=~XW8L@Q z-kaWMP|hruWKxBHa&&o(Z_uhd;F zS@$fgPP5?Q=voFd@9CaqN*7oN$o3B`K=Qj8sVNLCu##toMcIe|J|z@oXYcg^CSm+X z95mFpDNjnEjYk7cK@rY(qxLkBc*aOigRF8955h2E^m?p*m%l%4>R@aNS3@CxN%X)i z8`le?-(6<^-9=H#vKQc0^71i1{ZT`HFe6C9wJRokj!f)$y>GuwDxzZj)0ZdXtd{%& z7wgy7Y6LF}JcfUT#R1K?8gT9+_o2(r?-(h`{AS;T0(zUMKf$NBlZY&K;SHnTXF9%2ZxlO_+NZ^BuyR>GU z_jk_@x$Qc{bfZ!fiEnNOUV6#dFaQe7sZ0tP`LyfpL#4Qm0Yg}pmI#)c9p&%8So9;FF8fKeSROfq0;6jHGlqw?X2h<*8 zJW6QU4u@MLNh7kE?k}JZFQ_y*L2b>9=#ZM-n1C4N*5)DX)@@F{^Z+UG*}oAaQ&O;h zI}}yoq_%a`GyrCi>5_AQUAMz?YjIpkxYF0SCsmX+nhDVB%jY5x#hAlf6<=?Md7*K2 zjs2}LBRz!0KXNHAW%qxk@FhYH7`@@DYg~2|VzP=Jo9Dm_n-Oz|H&Horq~iWtJOw4I zS|gzp!BzFG+8iBU@ky7|WTQ@|_Sj~?$R*ll%6DQ)Y2NB08_~Oe8tvC7cD2{G>V|#5 zZ-P##b!)R~mkiv%5 zeoo^GME9RV0x6V>%yQ))41>C@E?0i`3cG9=V6_{XBv1ZQt#= z($(}s73L?y`_rk3-{HW#Lw1~Z7#x&%QhvU!oIj_KY)IuYd@@3;Xx z8*B~!tPqZWz1u#v9b=}ApyR&jouTR1Z3$e~rfR&%tc zo91ajHl`^n2SF07eq52+t<{Cky#BDt4-4=ViiZM>Ns%NB4KiY~7{~p6CvsA5mBtRA zUtkE!Cv30h*z(AOv%d5!%*1#~KUT6|axpgZ$x2**qG~MA#*r>ka%oxNW%&kVqo^lt zN7E^z5=Q)$#j;M2yqI?$Y^c*$A5R?Hddwx(-@YRmoL0~lzA`M1?t92MBC!}A#TI2V zy7*)pTC_S~F$%1Zy=nD{poWVbYEc$rHuj9fJduSq#fo`itN`kY4-Mr?2e$sSXbR>;@$ZVFM$s&))3zd6 zGK~|>JaBM3P?(<(+EPVW)ei%YAz+<_7O=LoLRk=7m@?_sKyIMIo&Zxm&L+|p&l)Vd zS{Q3bvh!M(HW=6(s!NXq-7Wjag!!+uGr_-qYm)!1X=WX?k#iek&Tr7Xe53I*id%7v zVyPO~+i@klUGPX~{Ce38@yspo)-5QKI`BO$xzn$iX;U{w)lVsVnxF0r2Hh(hOPwg2 zY84B@#nkf$2engeJ1mMZ(W2j`lgd^ebfK$ene!mEKh1vy(-PYWJMBb_d*qdg!M>D# z3S*%IM9w3%tz`|Ub}W=AqF(Zz8a#*yd9hO}wAVgRmc3?zbn(cO|5zcUcdVh@pA)M0 zY`gfD5Ks*2<5ZrMgs_#PK9g5|eyc6> zSY0yZ9$H<6Bo$5BEq0|G&8Ku)A8gKlTi@v?88c%5hZoz}kcBR3+IP9aL7w7{b8XdT zfEZ-^*BK$tIz>vF0$DXn*2wlJ`=^Bqk*P?jg7y$=8!N2XpBa=UDKP7^@`*1xjI@Yx z*LX^KN?2zQ(l=2)c|?&qqyd2Lzr(-FmMyTC8l&fOJZEAb`Gzy2ejS{48!h2~G$~~j zdXzOA*FWW>9b~=*u^6-vzBJns>V(VCVQrjl!y@}Zn_K(sE8KekUi5$T8IMeMaUIgS zev|dYw@8d=(ZPgjqsm@IoT6i$F47=A=r9H*$X_#~UntZE>eB#G=t1P97IoLzK|ym4 zJe?CvhUS%jyTMkKfCWx`h>*JHT?}(n!c0yOlyj^9LfX`Grk$xLz2hxp zug>6^uzcK@`7_G_k25aQ`E4GqtT?n3_iuJw-Nu;@+8Nr}T>$?FSlpxW01VUC5ktS{ zM1fh&M(1j+*Bw1FXCMt2bw$@d#N4`$D#<}i3Lr;T&z!BMudic&CDTt7=|j;7Z-uqz zNhRV%u&SdS(FxUCeINgUda{;VKUjmgJpZ?_xr&7At-nRNacR0#+d#mDebgW`UwTM^ zPcXaASUSJrLtXR3JYZ3rFbnC<4szg%LaAW^Zyu?ieUZ5@(()Pg>lyCk<`(E@oKP2- z08sDhe0P!vq|6e3oa>g=Kw4W83zK=AL(+Z0eQ>7;uoMWhAWhf&WFC--1wWM|T56W+ zsFj+>nv1?=gVm1#2U*OObZpKS)4LVEvdb3| ziVs42d~|lLbA3@);}vRZqT+|5nY{1o|EbtU4gwfU$)S{neqLi=_2W^6oNz&U@oMUk zOz^}h)D*m`3j?0#205waDe%~_mnDd>T>rTWAC?&2V)8?JAA1v4oF9<_R6zu6UnBdu zY4clbqOm%E$?wUAR^h2Ti#xiVXs6o3b_)_gR+4ay*=clAfunPjS!q44;{-eVO^EiMOuq&IS%l z*t||%j~C=j!3Nukhu|)iW}Q*pyBl;VrI~DSA}fmlY+QL;PE7oe*l*)wRtk)E&;t-$ zfTOE__~A^SxrI~z*h3dMzuo%`S_5EL8!7>EpzP2tV*q#4o~p{N>Dxk>{-h!+%Vt;_ z1D2I1vz`qqk#2vA595F(uZi3p+c?axPam}?;eVts<$UBRFoMzvOOreviSha`D6e%c zvDSTVS&t8T%|}X!$GJTp`XgB0!K}K9YXe<>IgK*A;(z7LfrQE@uzi(2d@bm|ZvDe% zW#)tGZGkuk9p&&nG<;1HrUZu-2k|S^vJ6b9fn_C0R~w@fI*otZv(X z;i-rW`5!jd zi6l?)#?E(*^c^9HVeU{8IqcuPS|su6m-VJb5W4Pm{zKnCGn1>QXQMxl{|oW(#BC-V z?1iBAiCHEfLpM_QY}YuVx4JGQPvSsK3I{@1`% z#%#GRUM`u4kFfjW8KsJJkLgOCI2)_ptGTyn_%+^F)wK6kcvP(uzT>|EV$bV;te?j~ zYQB&D4+hWF8cqRG5#^i@x&C0dL;RMW3bR*G@r5YEXi9drJ;s6OBtX;nfKU-f!Y6wjg+RqpH(QzChCd6!_D0DQ+0iqg9kTJvbRY8n5{hd2~V!6aLFMQ3Xd%LiuMhKA2OPcHm6InUx2rY4BGJQj6<5<~z+AG|EI%NM{W{W9ivzsQn?^&%VS=0Oex znCL^Evp8J+%mU|yEY2!4s|@P@WSp(hk_@;rt?BGVhdigRmiMRiVDI=C3F%$n#|kl3%{y_gq#!hzyVs4?mSbE zqM|I}AWLa_)!w6j=s%(mImQdmBTk?AobZ1gND7UfJtjE9(bU_J8lq{2qTvq8*?-T& zWM_W?l??e8hW^oI`d-@{0V&Dmc~|=;nR5J!b;ulB5u!g5sE><0k}zcFGeJOpJ}pN3 zLknuL@&r(s~bE&|-TiWhM?g za$&Rm0pDrVyfQM2*cnc9ccNxRG34}f9AGjOX^;RKY_C|`O=&vQvlFnP=Nf znY&TzcA=YpZT2eYw%1ZC?(uykLKXMnj@xU8RJAs7P!}jo=fd;o zJ_$fXW#zWWX}r+={rT>WL}vIjyBEOsL`-pIeWMtE?>C;i`?sTix^6!ukryHOgIGFJ zR?U8fd>zsPS3L9Gskev1M`^d3){$qgm=~;jHS@Kd2)zQCjJd-7OhrHBY8oh0&4>A} zQwMe56e(Y2MhJS^AwnO=yilCG$N;LGdZ^%;hcOuqvOaD4+8*LJ zI8WmwKs`?ZvFJDuYMNE+o8s*Q4cohK;K=kwTWp5Zmw!2u(15--E$ZyPaM$Cm*P+M8^}z=z6W>s~QDln9_;X`_u56OII_0 zM#W+AUg#qV-u_uII~k+gRkt_ZIVZzW=r7?>$w=Y-I^Uf88#G$-h{)nRpi;Ae)n7xJ zpN8Q|qgfP{%H;&6y!cUWBN#)T4;xl*{MnmTqz@`T1E4xGX5oROusZz0SGP=zm$~#B zhv&din_XUWn62wCJztxBJy3ilVc=wc@w9zzsWmwQd}JpK1(ptU%-Z!EHqJ-cZmi~c z0awt*3&9 z>s^VAnU3S8tTQs&RZk$NV-^Z)Z;6TcgrI+1XBzK~-PK|Oap`5gpra=*etdg>7+AHN zsRk$My=eE!#B8MEK%sHf6&zAqW$tv1rS?}cWgv7YEM~46YAj&Dp)f8oJ zP~&nz7GV;pB0pcQau6`=>lx~^@BQP&OzrNFx>-tGWWLw6xBg>HJgN0*vHsJpb5mQR zSQMvBqBm8J?5?be%NBNYuwC$f%AynBCX4z3#+Krcc1dOQ$bTMI#2ZE4twb(PI5Es< z%d>quYXb6|4gGjkHD3qTe#L0b;S?28{U){S$%P)Zyb9dchJ|PZsZ{7+S*g6V-82WC1w0S!C zqAyr=XhWZUi-*r!7H*uWUBW(45FfSkR>V~qv8Pe7HufCU8xUpK9$$06e^=ey_5gU5 zlfkaia8cl7`O@|W9bkn5+ZYpWEo9**_2zsN>!G&|CS>JrYuLMAk*2O@d$>9U`;}LU zfkst0MBx)n*+*Xyk;@T(N{>v4z1&_N;u!A=@$UNkoFO$v>9uX#b2nphRVvBh1{uxJ zB$#n;RGZ)biN6uV_|tBgWG@M5ks&?R0}vwdlT3@>%~IIR#0)fK5j)iu_}IE5Ako8yJqdFf zqZ6jE_O3}DfD2945aT@W6)Tja44V2i8O*U(jv^)Odfz|G#v}=hO7!?C5yF27!{@3} z&C?XJYLUw~<+~PX#uNCXF`8AcOH&CFxYYh)!i|!lw{y-(<`DW7a7J4xS@~5xc;=yP@xX+fLRE+)7+TfSS=>?;{a zV?Q^4lkPE^w+n8yQ^(%>*bsTOePM3BjV^lY&7F*^1Wo#X=#3)!z&_in9Qpq}xXAd2 z{|PIUSXj(kQ>5y}H^7H!9}X_)#otFsiNIgm9h*L-I%P~|?=3ykma^8|uSFAcAxl$e z>}Ro=F^XJ0_obXusCsFShu$c+S@|Pi${q~Mgwf#*j#V;mWmR{^GIG}Z{8;;!KW--b zDnLgFH5uZ6qd3NUMhF&~dNs{Y11_4U(3fSvFskO2IzMbN9u2f2Z-qQk4=6?!GOkB> zz=>QPr{s+f0c`gUUTS=2;y#Z13vGaG3Be?w9}u+xPK{Me>{^S+mPmA@iPA@q;})s_ zUTln)n2kbH^Um(BXm&ND+gDc1VubUz*4@1;Srm1 z=5@(Fw{bZy8w@}itUFQ*=scwTA=k(6EL@{4lOm)NxK{yoa{Opcd8|)1v~E5Kw;Zo* zovyooaK4sE@v08ps#sGr)co2n;AyhDPD-adt0R5ub7HvwuNH5|M{DSX%gzZUK|pK@ zVr`-}1fY(QefB{TgQ5nm0Q=L^f|_qml9>-Q#zez^Pjj%dA%0Lv$aiZz7ibET z{R%$=x&6Pk|oo4onrBwnM&k5&tE{$g#I=#3SP57NAkvV{~D*00lB>E!J4^4Y`Df@HcS6b27T-Zt^o z-t(D?822_O3sp#hy&;6)Hfkxv?^*Z}1@hz(cP>h>kZr%T7a8uSxPtJG9+;mL%yjYa zt6{0~lIv9S=YD~09^5&4_;B@q|9dcE&bXpy?&!(aq=@M;_?7jiUwwfRWa-A}qQ0kF zv;Ab;F7~7|K|$mi0BvxdBnAzqOwD!DW}Qmoc;-HFS>x{bp}M-Lw+qM6!0L=_Ybo|b zCSqZb?W_)kO{ry4v%re1=$t!~HVJ-nNl5(L<4p$@(Nf}-vhE4tn9FB>JH1z;)h^3>EErt@z{~$h7SM^VW^L&m`J1=AU5RQs#wp1kTRTv846{VcCsW=-@p?LWg zeX^O3q4N}NBrjhW-i6qISGR<^#g9r)jXU&}cQtEO37Ud-IsD)Wz3pOj>6jBA6=Q6$ z6IyV+FOIGxCrddSl4aASrBx^_%-&`HFC)I3i|4t?+;Klst^1nuT_d>gPrld@f3E(g9TmN3VTCZLHXOZce)k86o%9;T zYYS4KE&tRb?G-qf4r%X0eTVz?FB_ft35P67`jM|Gv-^^Vu_gHaYf{Q@XFi6J7yrp2 zPiO!EYY&AOic1B5>y0YS1gOwn8~w*#x&yi()}QfHBm=^n=6BK&;J{*y>BB}Mc9v5W z6TSxgqL^bn3?nrXcZnPkhJuzHyk{b4l{aEc`Z=*eD%vcq&E(E9nT|dm>(Yt(>5>Ox zudz8cjcDfe3U~AzLuNF$DQoGfeN~C6HfYQb${+D9di^VZuvrsar!*~gxEG#I=D|RX zvh2GAi^d%|=^_w4<{kxYG8;11nyGf;9pU+Nf9oxAKp<}pFpCuXgG zKsf$1|_At`Z3VTBDr!E9cD1)T)nwUBrEY)$E?S%mTRF zgYR7JgfRg=GK2W=k%HLyPL)e2Hw)-4YC%WeXn8Y#O8gr}V5<_vvtFc5vCm53B(Et? zh&x+GRKQQq7`rq0C#g^$+`Wsx6%isEND0pVX|!ODc%fmkcJ`Uy|DN;SvZ6i4ffaAX z4Mte}!a`By6^%QH?P)GzB=H0q9bS~;o6A>JjJQ^+e2VIX(S$w8FSbFEwG^ox+5E41 zh3(3Jm^L5$C3b*g^5lrWs%JvK2*$0Ia0GKXnYC4%3`y|IQC$Um%OtAbF@^od1mLbK zFjec~0mOh$)L|LmEus&`RxSBP;ezN+{b$dJRzGQ%viFG1&$o5{pw6B$Gn<~0oe_%5 zt&tj2>-vZ_FQt41M1~RIkD0WP2nB%-wZO7%2{ z+~1Kb!QHfyUTJgb3Vt5biA?F8vy={h#f1oJrUI7tfu`*+x>y-7eVc8X6xKa5)dDlA zSUZ!0tn3kWj`rDCn8;8yD*cRL59*PbbZMryL4FI!;%6#Ajp65~P4}{&!fvOR!W%9f zASZTm#29ll+hSgHzP!>Rz?`B0=sB0xpyQX^oWi%((R(?{E*)H%=kSxxN8ty5tjrE} zbwcWsgDDGoz3z~Xs+Ayh5fuS~6`B!=7kEQ_FwW*H7tyqbE2mJJeGu*d4pryN2vG%{ z@BzeowCYnxL%;OAUnj2$s$C?m_~XaI0VfO}p>qYmf#~NBlGZCMnFT-~q z2D`PB1|kO>cVKK`#r9Lj*)j@$4}WnZom+0&ypm4xBk1pn+DQ(#tV+S1-&=aX#-2az z6YZw{IJW#1ZiMu-wNA28qZv;3u95|fmX(;W!yl!l**u9B|4tVMKmqI(I70u&Rf4Bn zTR3WHWY3=I1y@CI&>}>=@=#IuXvwGSNY;!Mu)hh2lzaRiC6Rp{y13E=3 zI_Z#IV>DfV=yH~#VU3oh+lul@8K+r!~0_!W(#P#GC&FS(68{evd{_wnSLZEWjvX#uTLEshHb*z5m1QFkVr`j|!8U~U$rB&i) zE{X8*3@EU$exF5{!egkU>l1wrLIy&BNzyeT|MH0>_NW%ZIC88RowKV41?f*Sj}%X>$Xy79ll=yt@%KG=z-ReeuC8y+v6ssz9OquooLnBNdJ zUU~7SQS*jPJ>NioTp|XeJK72)3y0dlwVu-GVRyPi9AO!X(DT+JT0ix`+=whti$*FR z3^gnTw=63Qln(D`_*<;}2Zx0K7%jq;h*^w}E=)vR*HKZ`;cCVPACs0YhJOUVbzS0Y zt?Vt}MUCamoVxDi?|#|A>I3mwxh zfmiVrm=DLl&b8$i=CR@=9DmjRfMqAlox^gqv9U@EGfWWa2{WaCS~7+`h|Gkc>r;*D zm;?XJKiZijFbQ9pMdW|hRtn%O#y*2wokD?oF&+rCN24uXpWoa}IXaZm*z1EIZA1be zt;0N}D~xb|%2}2`TDBP4enL>wOy@A7D+% zwPQQu#F@7*a{@^GwmEpf!Xr$Ac7WPYGbxj1$if{5{*@erGF`s)o9yw{mR?8 zbNOyieO<^1aI|1e1U-!dALvIZ6SSrEc~pshMWI7~?dx0|pEc*oCWR}xqGz0|?yf$D zT{tSyrec@2#t;7Heu%)&roiI`Hd8ZGFd@R1W+%Av8ob{CT)h=iBbbVQp&3Y8-SFt% zKO@5lN{3eJuyE}N0!%gtPD~CSKCQ+L8NKu;fV+N5o-C^o=N1PhN$v4BF`q z(*4eV;=r383x&>Tm=P+o9okmMYIju+8WH|UfHz~LXpDPoX2H+VAO&|+?Srf#nYxZ- ztaEwSIHk^kf+5>AB|^IkGIaH+K$D$6ZH6t8DU zMY6G?ixI$XShJ=T*np?O(vt=Wqy0osu+Id5}BrHmElTS}1B_HxTaZbo2GA%y_i3`F!9Q4i_2^eizDr zSfcRd8DGwcmeTuVJ|0LljT-FdE9~F10ZsfI`k{V*YmpOomPi4Hsr# zdI-otv^eVRLzkhDJL*thZMiR9p@8T&rC6Y+R4tOh+>)zZxpL^$@GzKyKnq?eXKnE~ zu!|_L_e~|Fr&b~XcsZHnp}@Ufn3Ih#+;ex=I<%~bhom$j=&O%-sN})C%AI%`)+z9IRWWTN*;~%81~Vg?!o4z_TG(D zc;OQBfWIRbt1uwnOd#STS7qi477ZoNsGR&4Ewd#CSWF0^eW*Q9PPMQvQT854K@!)q zP3FjFwHfi4NrX8~7b+mrYap6HH(a>~m>Aa-Kth7HVJ{36{3&eoeJvf611 zQu`KjBrJUu9&sLzoz^pkdT88VW|gEz5F8}XmzaTJ`gu0P!iGn`ABKIF7GvP{)s%6( zZn~(faWD(rH;}u#*!!OIf=PWo+%G7CS}M4Ov>CN^VSWGRVEnmJa6IRKn<(cI_X;7@ zU&7}ZVZXN{`34U(Mi)tQRa}uC>jP#pL3#7Po}d{~hmr@prtkZP72G!t>1F!G&(`p? zY|Q8M16zR))9ze}RI)e*FF&gbht7A>*|c^hNFXtc|4F#~AP##jaA3nz&<%YTOI`tC z3L^AGvp7QV)HT{bzQNId1MhiGfO}M1NDWHfi?8hR=_5W9`J1Ohd^O_2%-1n5vgfda z0J;?b#*6GL%SH+_s2y?f2?pqGizBq| zJUbQZ6#Hsr75Hs+t+EA5b3Pccd5v4zvyc%!9}qLRoqi=}B1h4GkCY_)>-%YQ#_ugy zO+aa5T(0E`Qmfb8Xo|gTs(Tc_==e^Re^NiUW!=A06c5ouH0nEf?7ECQmO|3@3o?WR zYHVrgW$1JRZ)e4%B|-IIeT1z7h~N#7$@ivixcLo+T??wX%*n?(nx7o$qZQ_sGB=}4 z6ThcVFW)oyFcd$3z#TPLh`J#9-v}DHuoKGJ6nryvL^Mf1uyFllD_*=9ghL`ny>r$b zWg^2dq3JqqBu|Gu)%A7X?;3e?v35m;$~;||EH3)?$sRy`cM1exkO3|jRL)z|?FHPC zGZ5c&T5^^?k`=akp%^`^BDqljVgm(p6%^B=uUn}P7*WW7$&Ikx(NRKNK}0Y>f^^^? zTmKAiOP&F5;Q9#5aM0scVx($V7}3OZbiB~;J;&9BWYv5*@%|bIDboOMUWq65_}(`oHT zCgJ*NU=W*sK0Sib2d#fb0sF1_3VhUym~wA=7!rw_vJZpF9fpolRQjj$T)#JCjZrJV z;V4bAVJ2knFkdaV*qahfFx2zc1j0?i5z=~`N!I9(rhE6S&f!u+q-Q1$#TcQCI05TD zQ&?LcG0v!@D6+E_MOiYzI;_W&X1#ZQ$PugPgyq+Noe7=i?x6e+cI@mRMHEzl!ZH|I zF?BOElvKJoAD7G<9e^|HHe7Y-%XezLbK$B2Jq}tGletM}dYc{l0BH?MuX%`Uj7u}p zE8E^N=;q2g4%of=HpQ=lL9GoisH6?pM$R*yNQ(jGX->?P%(Zy0z;FlsV7x?_*Cm7?5XqHp z)8;|J+06`>r zGktxZ+o^!BuDDMg7KpP35H%vz-=hm%h+6-)xjn}9+4sMaq{5k-W_&mNf2M(dS^qCP zX!okdfrL82)3PE>TwXZXdzS{8^)W4zth(rreWqbAxS)&pp29dEhc*qNY)yQYg9zF# z{K*OuThF<{Hd4Y62EjI?Y51atI0zNqR10Y@cKo{;6!0BOT39C7UX-77jG2)InOWI^ z^rkb$(4yU%R4NVc-W>u^iL42K7l8rM87RCguO77YGp-A(6!zNRZjAdXKRMt2{|O<9 zfwzRGvm?WZbu{%*J>@#MOeEQhiKr11uw^Ka4cgtvQkpZ`^Ex%%4bB|C>btLI@biN_b;bU;st_Bufvv;MpVQ;<>Uwl`-md_6?Rq0 zq_;{OI%=hBT6!WpQD$i^ztRWFIh#k%ZPph0wb6A(@zqabBF=CC+%7hz65xv3v<-Un z70bm@6p>}hg0ulp2##B;<^$lL2`Lge5s#w_7e0$3`((I%eOaNIDRHZ5 z?_iFV6(@dUa9EX9Pwhw~EcV3}>U_Re{-w|DWotd+?5rz(*EQM2|BEn_AG-MSE@TuR_S%|_3 zCHJ>Ove;5I5Hk~hssfFCQhBiX%$IDqy(;r#)?vt)Ut5u3?Pu0Yl*|B`xxv*BUaqI+ zQluv{!#a7He@Y++gBNLf<%RIbH=7yV+3db!c>p8JG%6@@(GadIvJc_26K@jfD z%J|fc&*XATnq;WC7ZU>s_wOW#K0}bChpG%_p?>e!6{a zvWAJD9`d<=qeFoXBZN*@?d~_Rty!Xj;*E2y;9-%jc^Q6p_Q|p2>SM5+cD^FAM;WEa zhM~QSlXJEKHDZySMswOKa+-ZtiM3Op8jHMvp53X^802cJZ?J|1(6bcHvInpN!mztQ9Cg;P<95QCsI3`NWVhtvx_DGQ%JU0=+wMC zVpvzTDXH5$$Yc&Y6}>IrK$I^U_!LlJeX`7P={n}<9?{#T*UA?r@?BUdOYQGh@kZeX zigeU}8Y1@7B0vZMQn}Tp&7tsXPy(qg-4Zg->{1Xw%YM{)E?<2i&l2RyO07GQ5pmk9 z)V&V?pVW7z)NkC&tUWXIDa&2#+dRdW8Uk)s)_g={^;yX9ot=#E)QSP*3=c#1^Z;gC zJ1`e7iUu=xmhXe?V4>WE#eh*N7310r%Dy#!GiDhIHLv<_qNiwBVdARD#Qa@K4M-BK z%M>!Mi<Bmp@T}|K_rd+xI~ZZQfz{|nF1XgJ|7+YD7US4KlYWRJEjaJGn>!8f2foavO69Ua6T+9f3YZqV6bD zcfb~z;mki;tde+XMhk#t$dj7A7#^d4EN&K)^F}@IU3uQ|cly<71+n2GH39YKNRvc0 z55Xb6)ThU_7F`|vn$-8Rs4m2m+5`;*ziXIi;X*GOwZe~q411ZbukB|@=u3+fpLrZW zU7m^#8=7lZqm{oCnN&QMOK{K7=1|Q4N2OoRF*I4;k@avftr;;^h4nLDy~g!_UF;-G zY9BmhhL=Sb%e;5|x5QwzR2Ennw=4ED+>e$7ls4F(OF36|hN;@EbMfX{3Xpy#*^6vv z+#|1^Fi^sS^wVsmtvZ4a{C z32#j+3*xNHYY5!S5QBvp`I?cvLk`a`9KC}Fk1le%qtPjOZWXRos0O18CosoZe=--o z6z>AS>Hz@4-AhzAAa~u3e&hImaL^RWjs zNu?^(J@k=dJ(=!I|3w^V6$fq zP>xP+slk#Vwu*ZvjMr^zW*Cv)(W^{#oUS^b-*c<2@HSgWIQZb@aY`+slEt+6TkBjO zFa(sIZ4a(Wn`X6t<5#r}C&KPzHD7ERkiPBv@h8D-L}5ijH7DgrWK#ygQ&{QutRH*Rx{Dc4xnI@N7eq5J_dwy~Dxw!4^P@ljH@!ojHDz33<7`L!9uZ->t zIY;lyRpBO+fCglaueP8wsn0(l07F2$zkUE1(?EHw2&uwahx}`en)AYP+jHlrGa6;r zE$l{eVrjqOnohybe>;)i4AGuhO$q!^IPO%#rQy9}Qxd4$LfQGNB&)~2bnpc%{F60c zbscTWQz75rW~5e!m+4@hE%y^T2dG3?yW-wkL*?C@kM8Y(S&P#c&|xO8nEE0wp!sNi z)P#EJ6BY!UC3DN0MHzNm1a;#Y!Qs4Ei9o%Y&36NqQ+yw{f23@__&`zMl$-izQ(JAQ zGU?4qFNeD%m$p9au63I(l=;xU($wxFGacKWjru-A9k>{Oec+g(DkuNb75;CNm8@KI zhrqA1;N4)aMR;=Xn7)_g@(n_H{*!WOxQ(G^Q6Y_M<9&QCFoWu4jSgdXkm(voZjQWf z!Yrp~p^oLDf4y2(n3O@1xq&qf!WmYnYFvr$!FzjC*rK>} z4tQ?1NPmR`LU%euQ6rc&-9go+%#qVk$gfT8k>*VEfBvsdO1C!z=bH?d%7*;y>-?1dr|!xH$e;G3%pU^T9- zg4`@ev>uspZA0wEV&b8e(b+dYZjFvLa}fBZ&Y6Cl|l)afvp zf8{>CFG=W3{z;nS3R)l3z4PS18^@os6{&aB`?$NN+*+0t(uJdE)Gea8jI$J+s*hYaPWmKrM3)>i%d%I+Y5Hp*2KkbY@s z7onx1AOh>pfz#C4bErVxM#BGp@>Xuo-(K9Til2Q-pAlPFmOT$A{V-n$UM~Fcsgk9 zs(T!c3^uRccy7d`6i8!F;gW;?;tFeQlfPS?I0eT^{Cq&`!lw@xO7sNFq1}TkDY5WP zL0?rwgJ{8py#Ob{!_PU|83G#He>RCwNEtjpe}8d_Um!Pd8fguTbFl$yvgJ!91W&Bp zYlhgWTi@zNSRr_bCk2A{B;C&Zm|{vGyK_z_Baq{0F#!mJKf za(<_ImXRcS8;R(>UA{x)6YC|b9MJ%{ybOU64Rx=t(v{PL_j-?}zZtP?Gw*)GqS#qv zpfIN2G-zO0lvzWXJc|c&_L^h5$VsJa-;agJgf;|9fcMvNcA-|TTSyMExA<|XSjUVO{8yC0N~a;;%xXm?7{oz>7iF&{4)VI6zEzN9($X0;>DfIWVeq z2fr@2>p2M(saz*Ykq(7Tdk}p>+oAGxI`yDIY@i{;!gjOmV1SR@e`bTeH;+|=5OX>@ zKs+QN#r9l_m4t^=C)A)2$l$-$o4e)&`y~6#eUSV(BniOEKYTsQ^czoi7+Rw}qa^nc zM&^d9v7uF`_NNxGST=}H&xvUs&(TkSQxU+xv((q6x~wSVA{jR6QzdJGUcG_S-gg%L zOP;t0=I|S8*i~P;e*uMYr#~_)IHC_%7^W@&W;(nr1jWJHPas8ephi}-M8ekZN{2d& zW({GAJM}jW3aIcJ5ZC+8GXGmC%|b}u9O8sfvJ8E>qUQv+#fYZ!;^W>@+?P1f$2Yt-fAET6AI-H~j=F-@oBV8P z@NaU+D2&N=jl$$J+yV5nznYbbs7zem{R^rYOhxR1*T>r>2-*mw9kgOV9cjF88w!Fz zRy2i++Y5JPjvF>N0KUaPZjKy+ zKMQFOe2Ye3f5PD~E$_V+8w)raJ{^fWUiWCS5aI-JMIqC{BnBHW5eDkOrgt=e_*Knf9r1p0sfbl=yE@c zKl$_o6cjg(hHGiWtyGaU!T9b%J+vjgS?WCz{VMfz7z z8+gVLnQr93RX!N563tbHCwEFqv`p@KwI#RqDBW+1K@!Mis?o_-6P+R_X!3IyS~Mli zHVGb?e{z)Blh=LKlFGsd-tjaOFlV3s^n0uD5cDwpNiwx1B*~feV0HVZlf_P{zG{L% zZPEYQ!!Lz0DvoufDg55vj|U_IK;;MbiL7NM0aKt3esXsbHq4?Q#KQ2!I_Xz6xIDGe;5ccHKBV&xC+C^zMs2!bT%;e0--xB$EKNC0i=#KuQ4A|<@JDH zQB+2%_q8(zA(Ni3?E&(8+hu(42(C|r1kJ_Ev ze`zwZ6_y4Ut!+q4>zA@d@}*8aL1F1HvGtap(x+Er6P=%i`^6>QaFPpUW84QcdsCMi zgIQE59?L?dc;KE#CF#GeArwXb6yIfCkKXCt<=;lCjio(im2i99=;s>_OO~@(mmy?t zYm{8@2fdYNfV-#m+fB30>r0=3VIzynE#rm=Y2&+cev_wa$q}PMp zy@N#PPm^g7yiN=B21ctiSBzs4O<^XG-~@9{oo};s{;=;}6;ES6x6X_U5dan?Ldlc$ zUGP8s9z`y=lUe3OeUV+)nT;<&I{TOVfm?skZ!*z?(vxq!B-#Ug8mI-|Sf~K`DK| zp5lpm%AJr)o85VC3GnjHl7#|7B&f6q=-G1_nRS8U2e=i_?6oo)Z1yx3`d4-Y-JSI# zG7_It0t^#*%^Wl5UVnubG`$q6e};`i4Y^Bj-143FbF|UoNb~@26N9VO3MaJrM3YnX zx!Jyq%r-ra*5@K`UaWO7!z+{#pE4Md9kS2VlNCT2GwF%Jxz?>!E|g;EO}Nmd^%8iY z?W|Z)K}?HvD4QFg_xz@&+uj6@4SKkU0w!oq<82Dup|k-rSa<)%P%W2FtxH+_ zsbk<@|3(;7%ne@kU%BC0K1Rc!!O3BVM`df(igZ&SEM5WY0P;8G_#>iW*M8Ky5Wo>L zn_{@MXV9${`q~G>S9;Z)?W5K)jaTO^X$SE(iw)lS=AFTAvD|<wW@KYXz2*!42Kbrb&`el1aDlf4oS;XNQAR#5TW1^mJswDwFHX zVEZ47Ij3rDJw4T%=LXRgx{P`AD}W}ssHSWfU?xcT@BO4ZQAQyc*(54hefGm26t~V{ zA|n4F&YW*Om3{tlzn|OAnTO+Y`NRfsf&Ya_UhO{uPRkAOb53*FUb^9_aFIb<8{s%Y z2Gl-Of8r=Dl_=a@KVa-_l!omA7h8^>|B{`8LuKwR<<>}wT;c;yMeMcWLO9CDanfrG z+c9=o%o7W3es^oT^LWiD)I76r$In%r+Qe-kRG@@*esEcV^&v?v+wbeWn5y*Kr@~wq zyJ4Ua8js})eyz7ocfEQLit1)ct!55XlyTD+bpP9j1g;Q+f%($FaoKpL}kac{L z`Y;J$leeY9hvzBg+|M=nv&Fw(SWu5?e_M+tlYxCH61)3*0lb~F{wujUFM}mfs7{!^Z21cVC!tX;BK)QDo+A<|FmK&Twpa{q=_7`RedK z?btoSLJJml5PI^B3(K6%YE>pSQh>QHxie_w0+ z0D_@o#`e>1I&3Fd#G7_IwPA?+^%|^_i;8K9cpO*J|d}Pt}sA-@0Kj^qH_Ez$*m=l`8nD6`Y>+)!|^(GNqwx8KP6rKyv znuK*=J7j_XG@$41;4u{yjgVI?o{GNJ?P>$xSgJ7fBo>oR|-QU ziWl+_8+WA>&N{EWsR*{7^>m*{6AP?w#4vFWi}>74%~7!I7tDSl)4pWF!V z8|z%y;s(;#B<73R$O9M5f33=plQ)A_T_3JfrlfKc2ru!njG zgC2Rk++pAF&z)Ox3arK5h%&0+cRe%Y82}TVe-dDc;%uUVdH&9F z{*hCT>o0+OE2?ODENV3Ttn5dKA#td)-Y{vixUu`0j84)GU8+ZTV=~mM8`>I_X^aHD zBpxsJIxS9!`l+3v-1}|g=omtnQaK1pjspqMdmuj5rGtf2hQOo(%z#IXy3?S=tM5 zo(cx=PEzSo2e&+K6N=iX%x2}UPCvRKDsTLK{fY%xuHOb^DnyCtu~Cz)&Okiw@obF5 zGhmCr_n!aS^3-d{_D@JKtiKT7_We%DoYG*x*7&0W_q>pN zzs(#@x-*C9f1}SZXdN{;iMF2!uv?+Ui}(jkHS_#`O!e)tzJsqWMyns&5+e=7tfA&N z;aw&fE~n{KwU9fr%K<`RcmI-LSG4&ciKDyQZC8-xKTmWNDQ5fS`P+aMgfnEEQ%9ra)LQ;GMQsyUYL>Y9g1s?O|-YX-!AyrZqo7dqExkP7H`MRJ@rcMYPUf@L58iSjs+^pM_XB7OTJnNbi_JC&Po?@oSk( z73U`ve=p}&FCh%AEvyADn%93fwrUaSa`Azepd;|~yW}nSsrF#r^rOYx=|1#dC7!S` zny%*?Sbttrnlg%@20?6(Qtrkg&Yu!Hd=nh5Iqo+T@wsy2l&Vy)i82)!R4ae*!+$ZU zi*}<==5k@9%3#suP1f!m(Q~7s`YIiO#*gMVfB0kJ!NfjsKEZ6NbQR8L>P*@Y)Bf=} zXBWp@-4+tvMKO1vz}r+4{^@~;XDb{$8(AOa@{(q}DtM}C01CbO+qgR)r6E3B@1Il! zbOYW4oWO$fr1tqk)m;_bS-MvD_MPZxFCu)eS%GFqYtr4z7IgiY#V=8|pge+jC69NJ zf4W>nAW$i(o)ukA9W`~BAf^0XpYxRZ12`;J69_X!Loj>84uNfw)3a>Of#}AS{OjLX z9iQ7?=S-JbGFUYAx7&6IJnw~QH~=XBd2D>kU5aa`ib;Nt-=xVYV0AB?v~d|KzzOF~ zPeq>kKI?c2E~odU4T97yZ#*a{TiR&}fAM7d%rtC>@%33WakHy@)k_SnpOnj~&Afr` z?k!3Ik?1In-L@c>w4+_D4eU07lOJ}b-|+Ckzz1q^DKa9Z4U7KdBJQa`u-?`Zgbr{rts+{=^&g7 z*I5jq@rL4M7pTF=>3>{OGS4}ecsRENd5y|Wf8cw_*kAW%Z&sP3NhW4Kf?+imIj_AG zm`X^4vlKTq5|Av4%6Vw6J?{FY|&vtPMcyK2EyjQF#kX%mh7 zcZrkrExH3^i}kVL6voSdPf~e@!+qH@B>HpP$l9TJMCFjPRiQQPZE0FBf2*v!R(?bt zDgv?O7wpU%@WL-!$F(i!`>3Mo&28z)^@9uD@2SC+P!2{go7y^4t)-^f`n)iZv|ot+ z*jvjQ{8Ja6V<8@JLh+chD4XoZVikJgp(0fJe3C!pXfDZDSe<^F(#e5vRqC8;yPiNr z)5ex78+)#HoR(Nrz&Z{7e{{+MWQND^HWDHy*?_-7_@C9PE^DDNe$bwP0QW_4Lie3S zzVK}x>Ks=+J#S!eqW^im%(r`3j5Ffqpv}`zfIICLUQeu|FPJSIO;6dhhb5~b)Nke> zJV?t5D-@jl6kbhgnS|%6Tc`RG^g}w*#SW#0d+5?QQ0-eN@dy*(e}MAc%Bj1z`&<%@ z*ya)AAJ%3l;T)wTWhuF50?PQ0+H3_M=wHLF|sP>2B)A%~rW5k6luyj)T4|rG_$}1~cTHHVfe*K+f zayAce_<;B`+hk<7e~Chx5iW{;!{Tskns-lgsXt%ME~L}_EDfa^+Z^G^THj$oz4g~- z5HmKSP!S6?=ZS8wq9?U#Gh%l?ey3CCNws53??u{!>#Ee5Q)rV+x2aujuQo(JC#e;g zAw#m_N`WvscdSqMdYx;O3^ z2P&yrcUZcr5EnpkR`*4XoaW>H_hSZ_;8|dD4G&8UVhVqsZ#d(j zhaC{bGtxfqf42^pxSokx+v>{=6Pl@pVHHZBeI4gZI3%UEd`0^i$gae&U_KA1j`gU) z=}XZk04T4*-6}Z5?kb3<^e1HCi+hu$A@&J{GpyWUDf@Z2 z0Lx;+koq{&(=s3TI4G;Smnl7Vr_OCw`!bwR0w=SP70mLQ5MHLHg#a@V+N6Eb z$xhkHe-HV>AZljCw9wA&gOP%v6 z?4hT92rNC4VU&txvw23KQ6fx-i{`@^eChike7Sof<4&SKXbYSZ*5z|pf3Ek0 zQNfLTjML%TR;RG~s%=jx9e3V0VT^bZ?8sP1_Wu`vBHmfLLOu$dr|BZ~jie~!4);D& z`?2g5;$>IgyLdI7?I)LO%c0^Qz+j;0B$hzQ6E{7#U6YaV{se`k?L5_zb+{pG}P#^mI5UU7;Duc#hb2L)A#%9iBj zf?{tQRE~iX1piWXH=m$0>SaYRPg^0$9~FM-404j!xp!L{;@Q8DMdQ^;3}nEi_es{) z4V_TkD<}5sG9bCwP<)-T|H7XLRX-;*Q?hiu#D{dq;7;rXMUOq?RK(Qtf7i0Hh?O(% z|2k6YIp&4u^6y_Oi0ZtW*T>(8eAi7_RG3jCyDjp-m^??88;p92S8l>yS`gE;m@EM_UuNcMXU@ySs4FN z@uNrf93YtLmji_XMu=ZAf3s}`r~z(%JkOa1&gTwMhu>^ke!AYB2nZx^&I%FkoSrm+ zv=zzrv~hn@q|mrmLh(cgPvv20YvTc<_wpvC1^NTeCaL{=T zjTN(kX@2M&ZttSy10kEt0ip%0g@B-gHUKB`_pxl(h+#*Ck5eV`e^Qv1JuWZDWg^pG zrVXCEF!88p1G4P1h=!#Z88^tvWE{BC=`$?2klV7{EEJ`tF(JpkdWCLpZrvQJdC^$sr}RpU0EhaDNQ z%@P!;F%D}w+Aj>r@&h6uPthsDtU(8&|4Z5+ z%Vxv>BSx&yNuz0bFRT;#f67V5wMD$9S~3%7M|X5~Vl>HDPGf@ymDh5Qg&jG?zHIOW z|HLX?Slxyq_c|e)?3XLj6#hS}hLFC_@ZT+)1p}$xNsU+x?Hf;NuJ@YVFIXg+-YpmG z;#};?z!~TSe+n$XVAD@tQMZ#zA{dJRXlRCbBzBTDkcP}!S#WcbSF2lE8ui;J-J%`a zS98xNeHa_$oL!Xsn!jtf=r}O=&fNM>YJfI&@f&_g%@y>17;op+(6AWbfcYDU>Y2DX zel_0Nfa|>caRV+Aoyu+}azm zjjDma@eSA$99TDG<0&PSz%*k`US`yw6G2Dw#W-G?b!|b?bqU@-d8XO(u%?*S3YNOo z_n>A0f9%;Q>&=fG_Kn*~-z*6DlLL`@-tKNaAoE+zCS^WN3jwy~;#gCyxDVq%6X*FV zCZ#-9ghydKkN$b32sF}xRP{JbcBc?3BK3F%Q7tk?9CL#15@OZVK56LA`#j~SQmvR< zA5d@2tN`uHN3Ur~%Pw)8zlXDW;j$Jke|EQ1f2dUR{gDTXh!j1PcS0_ex<%gOfqV}5 zM;jVQcooPtI{P9qYnL%>PA??1J;#s9ml*tYiFR58tS!!oEzNv0cj+xtd+#vSmx&v3 zo*5GkUhnDq2vOGTl@OT`6JJhwA48rIl<6%0g zu@#Ags2Jme|NZ025bQvs2ZP8}5rQM+e?u{Y5`GKFjLt}k`2On8t%tsG@#pY_@NSWk z0KD-TC%JX{U|*&|BOiX?HjvQSh$RZu#dGazv&QxSpmR5M>6|Ao?iLs4#yi+1#5lDP~#+)YVqi@zA7+e}HpZrAZ;P}nrkeUIGhuJ!Z#)2_?|YdD}urPy5*e~0#6 zMVPQ{o)P&2`Vz$MOj$yz zJ4?HU?628{yzFsdKw^zgYWaPov3WA0M4t|r0=|Xb6|<|3=UVQqMwnSyH+eWaxw=uz zYQ2gXCXrB}r)A9zv{m5bjOfMRf3ok_F$CtDd+wUZy0gNIlltZ}Y2=8++^0Z3bahKlk}%64LnE6V73Peb^Z$PIx_f_ULbI=)kSR1p+-QPkaH+zrUSxS-`C1=TBv^ zthb&Qx=M!tE#Ee}vYL;k{oV&?c4^G&WqPuFNFH?5K|p#!v5KIh(L9&cf4taXt`)<^ z)6zSFvCMl!cP9f$mEQc+qUyprNiqPwW~rM*{m;_+=v#j6g3D4hHsMy&cb@bPlD6?% zbtKkLGu*oL{gTVW+1nw@{8?8k_aZP2F8j^S?T)07oWN}OAiyDI$@`ma5}V;Fu-nRj z&tDTP4oUL~-nKi85WwGvf9O8;Mp|Iy;uU!@(iG#wk;kaqo{}Ibb!P9)0TYz|g{%L& zJyMK4gRBm5uv3*3V@uWyP-4O-`H{J^M>qC3W+i0}-5JsWP(UK0kPJUmU5!0QxDN~l zol8>!NWTEBlx~=I-wT~#?*X(ZtM}Heyb$!6LW^e7T^U5MU?pz@e{7^g)6!5*7nMjTMDG0%mI~{202RzPF3oX%(+R@oEddqEfS?g&ecP?9N45G< zu2X+NXm|s*3-BL2kn)g+$KQrtzLt*7_(JzzgStDam`0*2e?=0$DP3OboxsMxvJ!}0 zwcxPEgn{>vn*pM<7}mTNB8R4rcS0VX-m|;^mL)yUnb;ZxLptDWS5%xpScWKB%hfP7 z^b2W5$ZmmGFw1Al;`*dzJ{7u)N%c?*fXLkF!MU_t;Gb{QP1^Xv0EI(N+75TY9=qzI zSAyaHc~p+jf1*QDZhjTh1|$*dVH?tt#@kJYO|e)N-AS#(q?*Mo3@mfw9_8uBja_36 zv4pt;)pgh0)tKgU)Sp1P8I@}h5=2ff&R9L)TB@<_{Hn(iV8VP?1YIdq7(rvaK95OF zW6u5{1!zkyQVP8J|C8)Kn6UpU1BTBW8hT5MjLFMEe}q}51w0t9dqr;-!hHVQ;_o8j z$^ubbxq`)-M@(^LKxap}RR_n*3cuH|*&5Iyf+(^_{`vwVz7yIvskLb*zgyCs&DiyS z+E62tTjD^=0}vmBPfouW*Mc4Ea0L&!OZRYZAn-Dlx(J6OKW>~LFsa7Q%FaoVdx@t? z@5r_le?AWKWyU~P>zmTt12fCH3u0VACOwZ}b*{+IrPL|yfd=`rYX?KF8UHIHG83-j z4Lqib1G6q7-yicwKGUPtaZ5-~5Yls7EEij}y2ubTzNEQMGUc)Z#ucP&8?yiMa#t@E$q)DU;(6ydQ806SzCM@BZzTQ?}ZAT@Dc@h=( zZ$)olT>vUnWT0TS-tQX8lBfH(btB#$^O(5LrvZZP&Hv0+$`WI1pde4fDqfHE7U`N$ ze}fZKOgy46-&Dw^wG%Ls`_`)Y9%Dom7&?BL^Tb_g`K~g<_>aOV!4Z(I}*R z3yHIa_1c*1k4ty;-qc5G55JhL{njmkj`Cfc1HbpkUk+^%6co0^deq_?9s#5y(o2j|xO)${P~5{Qz=MmF_`o@qFk%%lvd?1> zxZhuF8=Y22-m_N`7E#?Eq}H(3#HdWo_{A+d#lfwFF&pCjksi1gD*+D%5IbI7gl)A7 zp=w8@y~icPwKzXf1I8DMQcT$(m|Y_l)m91gMffYJ8VonlKJ#5fu*%F?rGt$Wf8bl* zbui|e9bhOKpc7G1Y1^2<*)GRiX^Qty3G- zy&LD~6Aj*|XSY}iHegWtwr~HTNpFkrrxO5c^{U};cNSiLI&h8;^F2DVe;aaV%!B8< zK!s3^CbVI^wx+04_F!sWb=SzyPguQqgB;dT>}}mWysid0uE~L(b6jDhupyIYnN}0P$jRfQFHAV^+Gg zXMGOmvtK?IE{!TBF&HmqN~UR}nrR zSM!OhMj@EsnI_jue{%VvD`Y)-in%ENv_W6~Pb*~@Dd)LK$IE@VUL71n;)niK6c;v0 zTkVbm#uV`nUFRHXO~+g}aZ%6)4;7{sBY*hgTeMGni0ot$i2Yokr9v_Y2k{1ZhlpmN zt{<>O?Y3o5g7ZGf!N9OGp$$$zRTYRHL4yQG^22Shmh2&Se{O&zBJW`RHjPC4u&?QL zFB{h1Dpfx?xuX$USaKo@6Az`O=jNv+ob;(wh0F$<+l<75#qcZJ1Dvf#C;0#PCHxsU zFgcFgA6}oSid)vd%omH{iPx4+L zD*h8-ubN7@ODRG+{Qp=YH?vK(x^r$s6gg3PwZzd7p@A0)+F-cRZ-^}w@0jdma3vEd z*R!*wWwWaHLiRammNCug>!f$K{|Y$jh7?1RWf0<}vhTJt8Fu7YYWT*WI0ajsEul=JW6b=iDO!^Swd z9;+l_b2vwYT6YjtJ18&mY#)b@R(1%y$cn@W;18fITLkqMOHqG~oca8$vT_S&GFgCScRC>03ETeJ( zf0&UT9%v-1m;Vmv_a%OMufnIheaI%x+@k|hblT-z|51m?O<%D7>n6Rc!&qirJ5^2G zi6#HY)4YYigE_tX_h+%9Y0SH;2Xpa0PL|$5N_xCuskXUBp#%ZjS{_+{SeSUyGOFEf z3o#m8!S;wvx${Gbr^tw0vA!R2x@L;=`!0X;}MtNO8*klBG^)su?Il!z!K?7MV z5x(XY1N%1GE_zd|LKrBE+(}n?!Nx4-al5@Y6ef0pR3|CXq#*goiV%^(P@a3$f58Xy z1NZ&=?FEf(Bed_IXxTGLP`22Hc_$t|}5Lzc3zhOBU`*@Po`B{g@}E`Q2aMkac{ zXtK=jBmx+qMAq~~hWC><#%(A!Z$PehX9Dj}7A()Du~o24F)xrlH@4Gr)(g@Gaq?k1NfAkW+$|YfHW`%4_DkX63WBUZ8WOv8ECMUDz-dRqaEyXFb zk|4kpJ}DY~Pfl8kC|g-}Mf)SEx8%R8fMzKdJ~Zb;1m8rHnm3b=fG(|pdKq1Vx+nh^ zC&PFFW;Mehih8M>>lSH{eH%_QR-rG}5X>w-%UOjFL2Qp$d9xH@e-+bGp06TmL>~~$ z=vPin7H(d2)m1`a|A;r|4Xw$LDtpUIM?O-c^C9+bN(9CEPNU!e{4!qjV$f#U4t-~@{+)sP17Ofm9F`78b|M^onA);>B%EYHfLiNo$g zLAp?emNw<_8}k^`e;k61_fecQEHq=aA4SnmwyWW~i1EuzYA9zNG5S;Sx#XD7?5IZ= zN%sdxAr~MBf48r`M{T{6Tyi=!SnyWMh<{$z${3Fe!wrD{*R8A`v*9+2$FsQTtAdw1 z3q2XxW1z2;xJ)qfGNCH0R`RsYtwYsp!G1!>SlKDkMS6NhM3gqACA>#SFjiq!cZg1+ z=;z#J2&3rn@!LC3^1Ff7xXLKh1uHCM9_>z*W_HQ_fABdWFxi+v3T;IGHi~zmP|oBD zUfz-Wg5%;mV(ErQ!F9bWo=EH=OTmyITz*WwpP>C7a2Ik{wwvS;X3Vdk#d;A_X^0!a zk^f^*cRi7dMx#j^;U6ubV^r@4W^O`q@&wG~=`i|z5x`)fQfTp4-r6&y_i|9gR!&kg z@V%i1e+0a$dnE+X)-G5Q)fX`^Fw3BzWcHCKo9ia`iMK@5l?(v58L9I!D>BkdjAmxD z%^|jtiBzmS@fSjjUyxJ((ihMmQRm?;z|=bre@)9R`ax*>O{CC{l@#`~T_F5zkT3(G z0Piu}_@tq<6+eFF7?dks*L(m%#SwoXn-BB}HDb)hg?fkwtg(|)w*OY7zhzd^<>DPI zOUemUzaSLn*+yC5>)T9h_K>yUCNbb737MF0-X5!x)+4~^l3k$vh9_n4&N=Oq!C*ITpZ-VXf z-?}I-L0Rbjn8kWP*D}*{L6`t;p)!9te|C?pv0e2De1H9rV!OSM*Zxr;jwV{;Zh0*~ zTcpvdNYWu=CNkrp3*Elmi{Hh|txVp5pMlA#fja`k-BUY|9I;zRVPVh&3I4+; zw#XcN+GCE+2mDE9s}TcxinIjo-aTgWzgbwlB2w-mdY9*OJa7)nkqo;-6u zbR-sM;3pp%4T{R!1*;5cZ!1aEe=1kmd)~aRi0R-t8ADU?=t#ECa`>kS$#N^u%CTfc z(<^g@`v6NOzq=TZJ71AUi(K?3jcgEJeWX85X4HVYC-o!uX5`~t0x9J`&of^3i1N`= z>DuwQo}4$tdlXRyqX7b+dWj9k(U+_Ech zWdVj~P_Kn#uIjSNe`SAHOzvJ|*H_(M2)BnOpVMvnF%SU*Ng&1ik>3tZ@J!n+uuvD{ zpI*E-8CrfQFzIMm2Vf_8e>|6xnsG4%@?q=dJ9;_j81rr2)<7oTR+^oRVW;%7i$E6( zv6>VEM2|?D^6H7mWH#6Hhnre}@mj3=<;Ko&V~l%*-t9wcB_Gmd9LQdX6P@h-)gJjgGL-n)T#fAPPU@f|Qk3EIFp zU(|2M5z!vXG@G&^S7b#I=J3*GEr{;0+(^CWHOB^uh8ehpr;^3ONw}>f7w7O@;3*4u z;j?LHf>Lp3?!%ZUx2(>)qi3f)=lij9P=)PUm}p9_=J#QT4qqwT!!@l(bNfl@MfAXK ztX7vAR9~)C$C2_~vxffa`I4hU!#g)Q>oEfV0_xTj^Uc(tqQ`!QdSk(E8dVK8LY z!D_2#s7+M%%E#;!|A9?LI1f+^+!Z&tLgUthZ}q~Okn>|FSMsJ|FePJN$jaz@`^6vu zKhaGtu9wPAxEPhorBS5$_V@YiFd%S=-cbpSUxCLWk(fDte;6*hgxbPPU=)2>zRjX-pO#_k7X#1 zJOx?pzM*A)e^|?Q++Z$ULyg)De3dXW+47OkZko?Tg{U#643~_g$z35|z5)@8_V6K4 z99#jv7C`xi)y{Q;*ERDUuh9{(bTzvX9h@zhRM<;SpjNHaod^(*igtMAPCH5Apn;OuxRfLotB`L) z!kjI$3C$f=R^dq>{lO-CQ>sF9>w^Tn_5?foy>X9uo7$AT$;-!f?zYg!4*M8#xk{l- z9rMTAW4Lb_3fDILI?Agh=O74 z&&c`wQ7*mIPI+9mkcE9ROP3!IB(w@4bA@HvZwZ#0g~-K!tO4#hAZx|kha%(;`_o}Z znCbMS?JJDs)l z1rflZK-o0idOq5_e1ZRmrFUN#dJ7PH4%#5)|C*@jxdMCdZF!qyJxoim4B-cW4FKxiCc^l*%+>?}prP^ky8e*4q9Udj=>IH8^LsTZi#a?!~wCC%o1~bvde*Ge;w;J9)0JeX6FcG%n-Oe=m{E^v zMJDQvirL{Bg6+BJ1 zZwd*bp5ggChJ)WHnU0zwiDY6cf3ny zI8xE>#s!gm#j_x)Fm#9V@V3x$1j2QaR{5{cM$_6N1=`n)q_uY2H-|ZLImHv{RcQ5t z+=x*Kb!mK-PJ^t{=iy+s&$cVHT|t!1WCCGq`FL+Uh7`C5iM)Z;y&f7Re1W7PdM@CWq|ONsPP+)0~wrPc4OG6_t@HP&Y;3rj+PBlO~Y$YGI2 zOmGmbHl$C}cF`y8`7Z?wzD7*T2Gq!yzqmMAu0d&^y7qTgZ3%h_y^JSxaJq5k!Ju76U-{p(Tp z3{QuQeaG%@POFrBS_%_ID$zuwB+u9%hn@BW&Oh(wI(>S1eXq1bubRD~q8r#|nD8>2 z>_Lv(T1UyT?h=2O(SOyk>X&O+(NJY- zie~??u)=TYeJNP$tPlmfR)6o%K;+7W@BX(YAvWPAUckL$Tc}p3;q>RwQ}cdu6S_64 zvAsg(UU_pnCeBu&@i}mQC0C*?cM?AU@|LW85=L&_mIM)k7xE5gx@?8Q{0jlBZxmwT zvig6`o{5Af3YxWpC+^qUR+pxU+2w-G;}M}98f!ZypmWl!vd7B~nSYo^G=F+^nE#G- zUuO5ur6?=XL3VV(!d@wXwx&o!)K;hNf?(fHPC#B^{pz^%RNeZ3sn`$;n0<+ZsJ8Ly zSW6w*TcG?tI}uFw`$|!8_`qBVcmo1P$hr8SKukU`w6JG zNcNa$g-j_X&B+RK6Ff~1!VY*IL8qi!kk@Pwnx+(#SH(pcx;iPOy6qwhY6ZN;Z?Nsd z5#x*D)H#vRT(JSN>`+j#i9IBM2EahDgeorgtiS^0)i_vChJRkY>fW&*(h7{ibsCul z-JtVGyZ$pDf6!!32s&LM9Nb_=|nHTNd${UTn4 z{0nktU~C8%&3~Ji!b~zl15j@?)zo5g5#daZFhd$bN^5FcaV@;u5w6N#1`1jr0@i|D zx-2}5SP1TA3O|+1ds!c%$l~P&KRIoE9)OYmd>%qKY2JP>6TzZHh8q`s5$&=fBL&&& zIZvUfLSV<}y2SXc4BduWRNRo8eL5@Q=){{k{$UEopMQUkn14Um`bsgAfQS7(KqM7$ zxgoY0U7_#=G=&hCa8BHx>h&L~MW-Y1J^v&Mw-V*71Q&X27Ak#PWXwN++tRw*eJsGv zRl%^o0O0!fltO2EVRxPs0J^^bZ33^gpyZ))(1rO2ut1ZHy2D~+^u`qCzbZEPmg1aL z))58{gnv}Qu0_*>kZw#dXe8`b6=D00mQ~tcVnFKhsk1#NKc1*~A6viB<;jm{lSwg> zByjRrcVo0CVwFYzZXeX?{ElaW)>?J<_MR>yV@aB7r7WHmk4ZK_7s0m|Ecbu+P&W1nn-i40dhG=PAM+qO*TU-@(zcz?{8)Wed2P)4QLHpOi&!N#>a&w|=4 z2Y4MQM7*Oyju$k8Vl03zfLnBdE*=$l$Ee@!VpT(e4UMLBipfLb>(-B_&69WuC+pJ- zr8L4G(2k7M{O{kJHUW^oxBKA!%aLoVFbe#+L0;MyEAb3z4nLG9F)jNGe5FWFRzgpD z_kZ*Xeqjc}GIew%v!P4x8-(VKRs{t9S|ACA5@r7Z5~A zG2SliLIJ&F>=q-k&BZX4ZkVr>6wJPVd4C69_Gm>qowV{F)~v%*N4t|AMx&duUt7=y zb&DU|vyyy~nrm|I)J}==D;XtG3#)}TBo2bVO?_qa6l*|LvXStS{$vD|#n}BOH z(G$X27a_vIxt4^CRE5Y_LIP7KUn*maoLWV+=lq^AZiTF0~P&JN2R_-3o)_*Iq zI`vCzjzOl=ORcCoE)I1eB)l<7_WPy|mub+`CuCzB!Bz&JA$JcqZ88uvr+V^hIl@iZ znZh_@l;eu@tP?rAucwcc6i_?vEt4%bBMqEo{NxRz zLg-*0lQN^&0$NqPl;6oNi(FN@>hzU%2sa+N6uGgx{7$U8(-yXd&%e6L%*HE~o%G!@J!8EjwM;&RyvmhB=^6@TqdtUxFi?v@!v z@E!5k<~ocOL)5h;Y<+=pP@&kvYY1vn{DtXq!8UY}Ig|V}rk%`eA_29Ldc~71KUD zq~vcOefhjxcY>5eOMk|$KCmjhFKRRl6c=TTt%|)tUkp2tz-T(@sM5KVV%K^xaWE~B zTv7*mj}&VQQfEX`7mv1_sRAbf1Ndl8jAq?$$Xj-}5qTXUn1S zTX)Qr5z5xRiI2W8Uwg;Oldf@i8{>?oO)cqv`wezQjPezk(jK&DJ*p5}-4q!qVmF!3 zJspHpYV(TL8Gq0<$jjTzvyosnl}Yi#L3Z4JOLZ~94$xqS_Aval_NNODt(9@UJv20)#5Q2~>Cc z)xDUS($wL&O@9%1?4#XJtm9yYOGZMcbQIctG{tPqf` z+Q^*(DINAQt#Uhn*J%#PQH(oi)UzA#rnT7iy~Yc7Ql+gXD+QDw$e=wTo>6=k`5jx> zT`QU=991(0@N+^}{Tu*e5wK00{REM0BBk!SRpnV*y<@COwkPSl$C~Qv)fx#d^7s!8 z?SF65saz=_Q^{-t!(&$royYwVhqZ(|BjHhYx0NMHE7>isbS6^mbT=RFY+vZqO`>== zDEU_)i-W4hYKk;?LEtg@{6flUi!u$;|4`-W7RfhNHBpvMrc-0%r0t%&y1&YZo|w!} zzQ!rxa9Z3=Y%szpIFiD50U%+&O^$MzKYxWgrRCFdqj9hTVi1F%N;Qb?*}-4e5*O%=ceYVh==DYJSRb+?h+rhjoI zn}f|!?vHX5hXzrlWMMmGAMUN1U_71*fGN8%AT3qVAc0fQ&*b7?Dm4~XLQw7NhxL>K zMytE{uoK}P;QK)fY;V2S-^xS^b`yZ13;vMO`MS|4hmaS5SK$l132J%dKjFyxqB3}0 z3&9)}G&|fOvQ>vcI3X?wiM-k|n18Q@m%_!!oI;vzcj{cp2GNi>73$}TVQ}Ax4KLMT zLmz|k5RdFy8AQ(0T5Y6XDJG~COSH^^_?IJl|ge!zOopLt^wyC@kJ zN%TPDjgX8JrW60yh1CY7O%-osIqMK48qpv_CK>wP#OmB1s>lSA4bl6LZhuKQh0OsR z1Dl{r1rfsLZG^WpWdyU5`7xs(YKugfX{#yw6ZHUI=QQQAh8vOsNWRt%J8>L7CHE|H z(lX%Fc;{itt?HX;)xJ>aAEI^#(-|yE(ZXY$s7yHPdJ$FxuxG%oipJ84>^?Ns*$h^M^tATdTme)F2KHD2sV^Phe zjExilPSx#o49GjyL`&`i&=?NS8QmlhScBKT3XIfvDF9T}Ml|ic%u~+MOF~l_wP?mx zxC3V=C-nC1PwS_&Pe*|2Y2DUXYDev#`!E^M6WC&zv`dv><^ueEa(~ORgDyX@Bk(o7 zW`b_*OUwNrN;#?r;Dh+T6CN+W^s$iAV8__ZDyvEG7JVOH?mnjhU>+Tj2@_hPt*Ye8 z4p4CaIB*CpqnHSQAl1D4dm8y2g2=4nib8@#9b$4i@SP)ouMrjcH?zKni%9d46fR^{ zJe%j_BE?0mR9eU9b#k+Hv?G7kFR)6m7EJhpP7SKkUN8Kl9qt|Ti zHGNE(nUl7zS2s)@j(~jnw?Q5=3S6?wHFq9HeD`LIcrdKQoKHYPA%_l_X96eM0a~`{ zNIx3}sGATO7=IB)oR@u!uE|$PI1m#ep1hv!4oHXgmxCO!ZIZ3s*0pe@-&5G7ful@4%8VY zvUts&y>UIH*G?k*yX$!B(Um0p(o$i?@Q$#DnF_T6&3`F0<2$rs#Lds>-M1QxcP(0! zN?~?u)t6*4RCEXfRb0yvlLq(-Qs643Sk$;Ko(%j151P6af57^7Fj=d$FN-I)0XVYm zEK&%&_g;H*%T*;Xe#5E~VJLo>mdz8|FodNz=$+L3ATCc9`RhDqzEtJ{`0BZt07jHL zdfC@7aDQ_x3Ht4}Dmt%$T_SkUWTaNH|94=?B^nR*f>wHb_n=MMYi?IP!6kFB7c^;q zD`ARndP&dcf=W?@{ve}H7SaXAIVhB0<-z=yk&MQ8uVV%jUOR74YLs=BYSQIx(E80@ zly)l<4a%fAWhsl=`=6~U_53%E0Rf*{Ex<8JwSQN2ef2TjQN8z-`~56Svv|OA27+wy zkoLT8*C}@k!D#$(m-wUfP(`DuBIr9a@1gpMNogI`Wb@|;OzTV7D2WB6$w;lWMBlK! zEJmHj5#vCNu(S+202Zp}?HUf^31Xd#EEbc^i6yTxwACCXH;il#6hAF{Fi4Wl{X{fv zO@H&QBbyIC%#nInY^TivQ@@DKVnjm)e=b0C50QS1LJ6k99Y~ZZ11)^Pr0O^tp!l6& zEMWVtA3;E2H^j3?YAFF7#4VYVfgd2nBn`WF1-3?=57@`NTv)B5F2_IVw3g(KEp(ph zw30C+_^e?7F4x56g>lcR$>yIkgu3H#nSU{Kf3i6p{ZaAa7E1XVlgrSNFwMq<2=(q5 zm2$#A{IyQ|`EeBpPGrT%WqoAU@-ZQ#n>ospBBKf7;P6|6wXfB_>Yq@b3B~wN{>ncj ze|Bf6`=ff34a9z|QP0bq?DJr#+{}UG(P@xb6}FD#VUoWfHm6;XQdK#M`XDh3wX&|5a^ioxk(G&#hcE1Ujs-1jL&1 zv2WJrDwC?hJPv_d76dQ?h(dHhRR*cL630*TpdYAwTK49q7_=fZE&$EMx?VlyugXB( zpy*@~ZNL$W!Tm78LQeNc>lyuDXj7IrRBJl>9ozwd3SVMd$GgWD8y-JvK!28a@^z7! zfO3jI64s1rN$T5^oPOMt%CpnU`N)qjOV|L}9_dWwXI)p_^<~a&x6VHm zq3Zqv!v5Ut&^mR0Ph&Q5Cx4JK^NnwK#(bkGN2#yJqmY;?#L6#!7JWYe(u~rcwby2@ z8kQx^pN?WX|0o9)&649n=E##f#Bq-{mjZ74(!3sjYYPVvWUC;I?5Ex=A98I$M5wWx z+=t&>?sHE>@7=><-ge{n(bs$gXl5XEJZWs(M`-@q43-%}5S#848h?J%RFOTeA`hbg zT}Z+yea{Xq_-VLqdN7fHuJu_2Q)-eSLfK?^hF<4&yo$KJ!Ct?4GN-xk@K%4LgdbjDxG| zrd8ySZevCMAjR8UMXmUkw3uEAL*IjfS;)p}GGF~EmAty$ zC`WgeSOFDp5OR$<0iX6ty{RAnYxHVD#6dJ)nV+LE+TW^{#D4_`S2iZ3xU*y11xz*4 zzUCy8P}A`kIgz00gLzbpE1$#hjVfP3+ekGEJwKxc9*=teZjYo5)nj!Abf?K!a>6b| zYxw8>X$?jtJn^H&=oVwIhHkFjAo5avs&ld7FP}$F_T1`1j}E%e7r_@+rO9WGa!xD; z@ZL5Y2PyGovw!5|*OpAr0GeEqv1cA{sDBTBq8=gO8g{!p5EAHb1F6V*FM)wgY6-=N zObc=cs$BFGj4U2O3HEjwW(xclc94?DBzu!DfCTR)I=4`bTX%nllWDPW< zA=B%ri(TZnyug@d&H>o|&e0<38w$lcUjcgcXsBQPB7fw+^e#fsVg;`W0t@pay3@`9 zwt+3~;3H)6a;{XulnXu~o1#X?mHj7HkRe*9X`KOdOeGo3mVTkB;{sl4ygk^3_45eo z`Krt|z!pp))E54r;6*V%qXjWW2gl*~@w0h(_m>H`%e{6#0vynBjiI!DTrq=ORcwJY zq3E3=>VMcH$A1P;pke@9pxSu`?=oq7?8t;%(<<65#F7M`c*u(sVLB+`j2&zzAq(FH zmnW>dH}=k+|D}O|bK&G-sxjx=z)R+>Y{NFTkCJ{>S~#q!=x^n=UkWCmrUF~T!FaY_ z-ye7tmq1+a3APuJwjhF1)m1*{%HnGSNk0m)1AhZ{CMP`_zgvNkR=L5^D6`END_Qp% z-U!k1BHqrSitu1#G^G)K)6INj1ogxW3C{$vRZ<1yATu=Ov^!@84HDl?c(~I0Y_|%o zd3#5Az~kIRoMFvp<#nPaR4lWP#=WYrzkAl&#}CZc0@h#xPzaT}DMrj_S&f=RAa8in z%6~mWCLNvqiCyVL=|eSk%EuXjh%J421OY8;c@wFRoEwMpYB)AHaI*wC#S7A#pB1cp zh6;kyRHU9AFC&fMuyRSA7~>-Mp3I%H8P?5?C{#5!`IRI|M_dSY_+8F+4w~@Of^fCq zO<)SJ!(_Z<%s$u3tjf)~6`A_Sfv+y)B7Y;}-v*CAGP*rIPCALKI=cBp9=p2Y-Rwn; zWMT_e?2xWpgRWjuPDdfF4%RvS#hQ1r?0%zW`hBy38TE|ZiM&Ty^j4BI6$T9eyGtlY z14CanD_X9P+7C(Q{$5T}r;3b*sFe6`|6BZ>1#0`k^SWI`@>%c2~~7AT61{*p$GLrhlnI9ZZs0 z#H1KIY|=K;0=KwETi&2jhH;P;xZ#n?Il?9=?}Iro4ag1ein+;!w2m7ZPaw}NO={?e ztN|i@zeCY|>Jd33^itKvu+d)m9TBWoSe1`~msS}{d;cui|83d^u2QP}4O6t^nK2sG zRmyYO6-Uv(+e2QXhCY@vIDd-}2|(?q4P0`s)cG&`)%3pM#4x-_BizFbF-!z{dXfpI z{&P4d>9K!e-WXQ+OJkQBVelk3BuauiT<4wQqsA`+gubVw*_PSjse++pY5ioc4 zd_|$eso+IR5HDOZZ-4a>qYCe-u?|AAMJvgyNX0lYj8EeU;!>Q_jyXFpBE1umNEx}} z?WZYMuNVa~9o8ng2u9LH%qGaCfVCIiSxYxhkDRpTsKmT{Mk9ilmEg}v%qL!p_n(F( zml|gTlM8U2RIt{{(q3T^a%nYKOx0_wnY?XUyl@sJ9}0Uwnt!DwZ*E&o0Ja&Jns*=O zS`qec__6yj?rgXH-2a@GcHvxNA!lrx{4UoC_M3{Ei}F~w(W2jVhyFxRzw%8B3X0Ix z1thz!p;_h#(jv~Bfcm%y1PVzR58hwn){0S{Uo}*ri$&S-P){HFyaHOd@{||y#f_rt z$??saoE!rf^MCDY1V?pN7Q=cC7Y~S;6EU7W2~NqRddp1VH!JU2QUZIW_wlj&aGY+# zvPRAz230&=F?#*uSN&Kufk-@u0aqNDxxKpF1AMVUGUBVeNo$58|3q}kWdFnL2E>9` zIbiuP`pAd^>u^I?9s{aDUOf$?}u0AB! zua?*b$}s0V1avSFqRxQ{daLguCN+({o-X?V*Uy^5z2L7C-}`~h{~qTJoW^baw2yis zdk-gE8E%Ql6amNIm(p?#3WUFA!8;_DKxO@yq9XP=_r6>c;=M`PffXcKI@w{< zD7rf?pnq}c5Dow2gJ0H#OlfYoZtcuN3X|qj~y~75V|7LV6>#%$@D|>M6Nhc-;3^vwyK%M>d8AR z{UXUDKW`dGjz-nfmKYkLRe#WhRv~h-2hU_JRl}FJRvv4aq#zZJ zL6QbY{su#4VwyC%5#dE;Zx0GvqCo?HZAl_6Xm-F^8n921xJ{%CR$Lw?h8uMNq*Cqf zO8&42RLjI-iC-zJgQx0o4_YkB*=29BT|5Azu|&1=+l(i|Fe`_T+ct{iEW8=C@G{|r zlYi^Wt%j&h?Cj$9Q~TI;`Hrm7uu6kAyjJEHA51qNcd0*NxU8%1<|>CeleSPIdIRxG z68&m6FHLIV0F&m2FVz?h8NGa}qLqkx9&Q|K!SWB(gO%VH8=v%>-akx2+=(C>?URU4ZGG ztfawpRJ~M$r%Z-vf6?%{1ZTqko;i$un)&$YKdPU3c;k6b$DL4pZ+!dkEYIvZTz?^> zF><5u=p=_c*h0{JlV*T8nPoqkFN_-hF>WJr+U6PAgv(Dd2~^?|i?XsJyEIA&pVxwf zwl;a5G76=>YNUllB^oJBC>)kY6vLwYAM$e+oZ|DJ`jIgCF%5}eH5+KepS()?--I=+ zd^7{!T8k)UgC1jsc&T1_q9;*CJ%8MoCgkUglG_cl_c;oPE7cP7J*M~I!vf#vnonYb zy)q)DfzhYAtM zIh_}Z98^Kn%&>B&A?yY!J>#7C(***nk_%7b?93Hq@H0KB1^q2lZ&(49N`DyCys(o4 z>y~25{^8QXQp;JV?40N<1+5j_&5$IDRqp(}V%H!s6ckP59{BXN&3 zz~sNlQbhIcpf@7e=UR5hL4V|OX5`fVXgF906c6F}Mzp6U2p;&EXUlNO9RU(-#+bt` zB2K@Z@bJqAk*-AR$(%^KDa)YSmA(KC570b?DY=3c;Rd4^_`&*LRC`;>M;g5=VZXdO%wNp=YmFmcH*q+}A92OcOQ-qDphL6!zw7kDH-GNrCE{vU3VxFW z*9Y2!>GgwXBbaWP#S_u#L~mHLNyPH@!Ch(wN@;W(oyRf=+o|tQsf|aAwmB{=6u1?R znjNU*GjJTWr#7!djoHqjI_prcf{C}{$QklKY1Gvtv$h$Ci)+v!JS_Zjme&t$`If`Q zHEn{35J!;;gd9J0gV$F#npo*`c)j&!y)GvtX?!$k4^T-{q zfNEUSvLU_F00AKq-S3R!0|?wBM&m(7u%A-Z9|gUXd}81rwSNFe*XiuYk!=Wlb@TOY zNBk)pM?jnUhYnv}uw63zXkBC+S_{lQ4s|x(DRe7dPu76ktqDHv`Pzt^8I`eTpmDlpV&$wdf%-#E%bywvt=v&_rU z*Rh>;aZ6Nq65v(R0fjgxvWzBsG(0sZXke9sb2xZ@QGZo*Ky+F~2fy%4c~`ii0@CYZ z3``oXmI`IYLGT63@t){==`ZyCHi5w3_C5bwKs`EY9z<-y!Grr zL=5yyEW>QnFurQHec#yfq5q9nbv4lg+Eni$c`Tfi5{$CK99w)$q?_l@o<52@M2-F>K7U(R@IINsR`hHw4^M5E_f+D>=P190 z%3begL#vDb;vEg{0ZCxSB3y+=*XDlcU;c9KP8Bk)@ePe=sJv2WD~@y=CjE40^%YKf zZWv^MEq5CW?Fz*%HrZj>pQ2TmzOuvq{VrN-6rAtul_~k6Wv;OA@v$Jx)dLHd*;{E` z%YP^_lpy?brsjM%KhG{{R)5=5 zU+@!>{rcJ7M)2%F^et2d27-7gSPt7G@6|^Ag|G6VK$gc3glIpr9uUShCgxZ@N9qPm zw=G4^C;g84Jq@awrrJEr9TqWJezR7-@o7Q7V~>CN@G`Elo>fYLSp~e^T1U zJP@$)GWPdI5laYpA(KDYiXS2j&VL4c;Mlh)QE~Imt{1Do7-ZmvDp6GD5o-UcR-%cO zCs*AQaS!9qG$`b@&rEM}_SKC)yj^>GoLdXrfVZA-OU{X|)=u<5`k>itRWGm?>{gCf zih#{Z)}~KtyftvBVQ8S_J z^gpi#cTgqTmqWi>@v_sE@mwt?TPhg}viB5_i>8h=GI5*V!D)G(yuM7;KlFvg{|(XGX4+7lm$$ zP5$i}wl!-V_T3(}LS`6S7k|}iYGFWfV2IlC?ZC$Dj$E>Daq|Ldb;TWC9`(TjKAUtEjzf+U=jix_E z%sYN|(HIA=_wvf=rwqH)$S;dX7r1gJSqVM02dK^khb~;k#0{IE9)A+x_aWF?($UEI zWW_FBGBn}3@Hivv&|T}%Qe zv4UP#6k#+j8x6IT`vWCN)7pdJnF@$}>G6>>I%tmf!w@-$DntK{*`IPjfKX-L)W3$* z5d?9*n@CXl9=BKDvVT0~`mWfB4o|f%K`a8D2V<>>mqn8QAABQF#6VMoY zo<*(=)>+X(I!}LtrZrL@HxlD^jE2hh z`Q{H_&l&>{wk5PEd(2QP9|n=a)paEc8}zt`mv|7L2o9g7@LXsS78LY-=y?;AwAMFDo0c~$NTt*Y~K`$0Tu zqXfx$^nV=rPQ;uy0VeJ;q1UD=|4w_@Ol4~BsgWvyP=@k^RObqqvDuPAQEO& z6h1Lg>DlPd+pI%MPM%YG$=FWpn3WzbT^Nu(T{azU3W&&~Kd-Zv=|=M^ndBmZ;T51_ zY_aErNJIMz=&n({Q#J&>oG}=GFsD*t!Wy`E2Y+<1Jo_+UyF0J>5dux_*?#HZrgP(2 zTsEAN>RTe=ilDOW0X7xD{b$XjR!Gm~_w%ktfPO})3EnWSwrkxk&gh2@%bH=6hjc`I zTY7B!rFq}70aHb%bU^fUfeE}gUF?-VD})c4k+-${(xNpV?-JPFX!X-)4IL3b*3`ib zXMehdsw_e7UQKnGuueKw$P-)HG{*dJ$lq%QaX~944_7Jo{F<};c~`tRx1PHryUhea z@gE_ms8H&DMjX-~WFyC-?Zs8KT-6zT2+S|GlrxzJG@^s^;{sg$S~hYqLm8KV2;Ykk z7ScKE<>J|_SrvLD8X+FK0YF7tGwQ=YrGJk}9AeMWP-M50fK6Q%-VCkKDCWAEzs=u` zchvYQE{>Em^M{)88T2~!_0BjHr+s9Tfkzlq;jLWZQS<Q`?x}J2Js=YigZe%I+ z_fHhb!bz=whr5X)!imh(xCW?0LXod}i;Isqnwo*+wIdD}~r z%`BT`Qz4(LHNfIGO1kKf>-)dnE`OqX!S+T?pqM)3IA_k--o*!T3Iz7DGME)rt#On+ zB_N{u((-v2`EaUwEmy&dRngPdm}(jNH+s7Xt%m&c@2ENoyG@9(Daf@gPqm{L%Ac4M zFrV$Is@v*%iS#J=Dx1u16agA`L$HZ~>TA*X*w7GP$a>itx6CqU>*&WgsehE2j?|Nl zwFuV`*<^}6q@7A<82NbV8+S(xwTur}I>rpc=9T=9E0yf3jT}kIsfezVVwNEJn*5_K ztJx5k)3AZbXq%>^Z5#F{H_i`Ts+p+m-)LeGu2<;hGw<<0E>m~x264au7=?EVT^3IN z!*<84)3Pz1uBVHq@!-)MJAY)%uAEHC2;X<&BKd4wpx&N0D_cY56 z_@R(@sk9oQ4tDLtjy>zlB+xOSG5(q9Y2GLD7GY{G#MvvZ0rY8ER>&ki2siKsn2LNE z{5;m*wT2xn`%L57^H#*VIrA*%0bjBrklVrP4C|ftJIH$N2suP(Vs~l z1qAu@xc>p*z6y}kKYtb^>5v==0xX#+#|Ay9YL+x$O6V8?EQ8?ztQkg_ttq;b{!7fo zUUB};$HR%hJ9Q=JCj+kw@>j-oUg9ztq%aJl){W0T@BRQR-aF@>y_7LQ_&D^F^?Djf zJMJ;=6mKZ`h^tCpy}-r@Fqq8k`iXdU(n^Y3Y;+#zAR`5P=6^h^uxK_p-IP_ShKhsT z$y2Vu7|sdQC3XnadJ?bol@p3_H$No}v_%}_cP&2|IOyaVkQlHm9TT!yOj$y8mEuDh zvbIlvnT%W4)nX$=Sa3!nJ0orCNah;-;3p)aeT&Y!%z?8z3y!!fnP=H+IO^v?qL#;0 zZNREtu?Nd*KYzOEXvJ#CW$5w&yMqX?(GoBV)1(@3g@jTPj@>)IAnxo0kEhn)hh}k{ zb)|S@^sQ2vj&g%1qr$AkU2t)|GzOOO+_J)I?DR`uFh&Ce7ekOe<6dOb^yvDb&w)p| zzS0`+LFJz!Aa#|nol3U|>_e?SMPsM{Y|*~W;0q4x=LMYAbLHh*~e|a zsz0-GYCnNZ2P5UVEGdQ1NyFWx*lqfKJ?TV*A)NwyQ^Oc&wN5f{!p)a-D3&*953Uy7Gar?D&?i;%;uxOXthUZ4sVfaZHTV4|_Qz+?j9FrLr zZw&!R$A9RYE)RdN#CglEawdV=9PmZj+5kF~2GubT)p?s2VF*_e$%W`Ry9RZ5s9Ykw z=gVue@eSb3c@vTPW5`}K2gK2?>91PxEjW>_OykKC;Bd-8_mknm2R+H8$;o(|W#med zplC66ehhI*8a<|I(v!eP4w7rr!Lz^agNcNGx_{VhsvdEna2&{_r{JyYhChw*n*6Yj zV;`e4Roo z_#NFo8VJnG(8N##47X`30*v?a7oLg%Np+1f_!<5(Qadgtm4w@>3hZPW8zaGbsF3~B z`TxqegcuPUEuWsPHbn#}^diat*sqYUV}H`#%0pun^7!C>#?rx!As4)Tdnzqn_~7oo zZgMu%ZLHn}Js~I7VTdP94ZkP>YyXQ_Vp#^zc_PKheScYU zK@x`?1*%GJL0jVIT&F}|ci!lK3mnw=XILjD-<5IB2K3gG&h8j&ruZSpv}Uz|HXqDO z143u40kE07u%e^oY21ltXmh^tI-fk+6C=~!vBl!rJVFwSBIS$36@zr##eIEmD@!tm z)J0}FZb2pQ^Q}$TyCO3&HTHsK5=sjY ze&E3l(ibNqioV}w@yneOnuYG3EzJIH1!#1M7&YY4;}yM=B%lVY9Lbma=3)(Ct`=#U96LM+lNoL)JTeHenvMV1ut@l-G-I!iob^;?qkkYf7SBja zgH7=-B78mO6a~ib3zx#UOfYRRp;wGdi}yx)(> zm+1k2PYIF5OzZZ87VcyHKSvpT)+&fY%}sX1p?@G=?-;sP?Ec@h3p+Xwhv_TV(HwD%2)A}@^J1@_s z5@^7{Fr4Q>Pboj)^VAM%Mi`-d}9JUM@ zW?%Qjr#48TigySU3q7AB#|_GxMykKNF;E%yKufBUhsqYLffeY*WNf$E8g6!s&+L6C zfdGOJ;3j}i+m1yilHhXCVZq7U7dnrOw&gg?+j{_7?)`_kRezT%k7ofw>2jLmNl-8$ zP}uZ27DO)D^bMU}rLlZ98rGVcCR=y5e}>QND{-eabjhyaZ7w8auc3ddL{oM}#MSs0m3AvnxLpvJXA(dKoJd;$F}Jj7W^6z-}yR;;9t=MKjMxK@3mDFZh#(#+@lSy+JfR7!hnVPyiK5P=I5K8lm z0ng2oY1t17I*@yV#`q}vNRbh3k;Y+Nb6o{{2O1hysu!do$FcIT2Rn= zPT)GTfY8=hM?ivlw@~az7!^`A9^#6R(h!3*Abm#w!OCHH40KI*BJ~+1> z;YE!;FR;EVnp^*Fy9@DEJ1~OGz)ene^N3eTi8u*)M-ibA`Q^50p-PJg?2sVk=6}GT zMGWhj48>pE*`n~?40~2%f%EbyM2yJI5l4>j!L;JXfysLMifz+7cqCjuPFuz#S~YD? zW)t;gqqsWIiHbp(ZH#%BP8g208v2I);t4EOP3H1bbtDy;zVzg!h2CS>mMO~G6oP`J zx`=pQksA=~we{~Yg4R&yn23zwet(rkS#-;sE8x%Pq*vPpKoNo7|MrH+OUe}Bthl1fiT1#FkQMi3a#Z);w1!_7+mpPRki=6V14d- z7M?M7Zi3=8$m#SW=I-4D^VxcNJB%lQwB1t4ZeMO*IP*wU|fL~t)H zIx5FjF6qnqW3RL;RcVWF`~Qek>1dacE|XN>yUI|@zfdXWS7H2-Eqk3%i$jE_$9w~&XC^WA7-5>0!$+AnRcb5Jh(_eXcT7MBUr;a4M91*zq)^DRWW!kFo^Nb9q zo7R-LMrOQ^j|L35U4IVXW?tsdVjnBmVY2X+J$`avRnS17_Hi$=D>`V_|0J&%ApeRl zn0lo16$gn#p%5q|1&H0uq-W$uzhW0iALs>)i+nc?J!<|uSQ+99DU{B{G^f61Tg%sJ zVOhnC+;%n`11Pjp=y}7$-qm8IcQjpz^AnJY$*WB*sRiJQ6MtrP`f3)M8OBk?4+nNp zp@OwA1pG@L&AR((XlF#k@Gz>ZK(+Mp{PXa*Pil zD|U{5X0t%HbANXc8i#&yC_vFWL6PPz3k$rPpgO7zD(CjH$dnlLcMCFe@fLtZaXqoW zun`X~Jxa=5ZXNVdsv)X-4M`nT@wd>NWAq8ugL|Vu&3H`z?cF{wu9#5=2Q3L5GE6-5 z40>{&ANsXf?ceiqojPIy`dhR@Lh39=0KJE%DgD<`Tz`##z%zS!>~T(6w*~?BMJzTa z0lGV>`0TE2P2r>bDj~*Y!km`8$sKq6*zc}h!t3@kr)f!%;yO&-I{UoQ)kMn$BA*+K zv1uXXM>XCJ>plA+$OMS6=`SyK?i@&K58H-ofX&t>8mDHw7mnBOWFOvjVxvUdf(p?a z;oHi3Eq_d1GO2)dhR7$*AsfxEC<7u#F`L_c5k=dn+0-#aX z=%g98M`V)|M?Ar&HX1CZ8lc-k0O=zFc5o?_ymh8N#8Rbe&(e|EQgP}ayq+jjccZ+K z$}GsX58A}^m7eCGR!F5Ma2dDJJ{FibP>5f#(dVPRDPc}^r5$uyXHaT@gv(zN>hw9? z6MsJVTs6JZUCx!fT}ML-^S7*Qgg0X0-{-2wi9Pnk_28H&XRS0d{TxrnHR1vqFTOSu z-OE7@hC0g+#b!VL3>A>u5a4#UP+?9*xF@ z6xJWhg$I2jQ=Pe@mcz%E5FCf=8=Hc{6o3A6C|nkspj(JdY5G93@d<>dXUf1-Rf`>; zdRwXj`h6W~o|rm4QBu;a0s4$6!FJ|hWb8DA@Hb~GiGaUK*qo7;LOv{TR>H}%DY>!39ovTqx);ZjDNCFGa8o+%kx?I0MWAr@DQYrxYFLf`D;=-Od8~){DpSV`+c)4hBICE;dW-LU3)wm*M~w_EyT0mEiZqj z=hVrmhdbl9-1_a*-*&JC020Phy+Q#H)PXSSjeh;2=IbJ9Jr@8b-xDauycC#j@2++< z5}BZAaJLL{0R1D-5v#+kJrv5upLE z5sLYbQvQ;KRsD{NN^kC%E0mnd{j|TkUtNDf%?^Z5k=BHNirC+&Qka*VB~vF*Pdi^8 zx*mA#THK{z{V;dO**a>yGHfZ@G#UWZ^{`gFTsWb`dPA!>(oI87y@6K+CFp-8vXK@D z%~2szY6|gOPy^`;ekR>6paL`X^wt-+vaH-#5)K@zjW!`f#W(=eu?l(jhN{4H5nxNWn=cVEy?(KSp7M;u*U~eWBV+$v{7=RW3b1b)y}aRlnx%pG zhXnM5Ka8l`7g{ILv2)gXeNca0l}ab<(6M_x4y>L$4eUV<*A+_}`2Zi-H{D%r*zUkY_ltGF`-*>=7MsKgO`PV> z-&tVV65zuah7Sr(?E;(s0OPmp`7X)fluLfMUu_B|);!OH=#X7J=8Yk7Z97bRl;8&O5nV=x&QFLz+B z4bRD_L1`v0!TA6?$Bus_&wLS9%OLK&4cbY0^x;{~cRYPoU)8vZ1Vtn~WVIP8kQH2% zmc5;h<8dM}I0!VZ&i8KLs=0UI?0TJ?DyebX()Jx7-mXb0iA5&tLe*{D!sFF034a4z zTXD4O@-)Y6(yDw)3l*IJrU{l>Hm6u@X^=T=#(vF;(*d|2M3sO0Psg~50nBx1GMz7^ z7iw|738A@>3NF&xinZ&%p%4ilJzu0r+IFD*da`%bA(B6nSG|nA6jH-qYbU5Nf~TBe zi0txc!^%&_xDb;4DUt^AkD`{7Bx9P0N~5d@yT}Skh#*^@xX12_zf6;fD{T!6T@tY% z`saM#zy+mcF&uwV*Hr@LOwUlT4;FM)@n9Q4f)WsEx&y4r z{7Y_TTi;#3G?7QyjNY|4_-Ug2a2Ge~LI(KM7CE~<>;$XLz2B;0?WhE{!eU0h&-$a^ zEaUT5Ey5O#Tnqm6a+?MFbzL$Xqx?@Nq_l(c(J(y4j4gj?TOR-SNLwnP;%#ucR34C- z>3|4wh7Ep731C*x=)Q$G&cBOAqu2-B4EL^oxpRQy4NEUnr>p&@LTW|F*-h-H^+Dnt z;k$M&M5W?%L{R7_(vbRCH?+Nmvpn;Fr2b!;1SQ~{ZOlwRHj~D|H($2J_U^4&j)J@` z0nJ{)c36M*<*Y-@WR?55!2G)lH~xAM2Z_W9;y6VFT+mT&tGq@~OudtHBGlM~au6f^ zKrSkj9i=fbl8z)L>ua_vv2OIZN+0S&DL*q?h@cKQ`i1%>-mTCA!&(Eul3EMD4|W-6mcTs8C~>B=5YlaK37N}}B`!j4En%wj8zrKJ!B!%BKu2G~Vq zhD<1$d9Nzrm^9zgwq{e>_Y#tyQqZ!X4_lY?cv@c>dm;lZ9y9H%CW=+%%U}gu|F0TK z@Re~MUS;rkQkJA+3-J{9P-gs8Z$+W=$1dzDRLTH?Q5*>f{6hE|djIr6iJABN)gqx;SYoF|@!D(UZDL!nl z_uQN+g|PgGo^+A-7OH98nKbU_-G%G%OE{9j^HXa<3&6au{GWPTRQrFx3XOiDLW~UEc z1(=EzuL*P@GRc}_^4F@)+4g@*?7yd#01mODtZ%UrkASKBjh4q3*@JBB9?O}W_-HfAGNmGAE4s=R;eoIyd zM>v#Mr#q_1KvBrQ+*QITsWrdJ8TOPYwxkbmyK?4kxH8{e+xkS*A|wzn$9I@0ulYCI zhc|vWo?CkhBbOmAh~yXXyxwxLebkqoj;>(Y6GM0QIV_?A+iIg90FtpYg~6C@Xm{a6 znn~E};`BS)F6Bsh(no)H`=7|Nu0EX8)!aX#tg>07WYy84RRg<RS^OWRod=fC;B*WGaG^muv9lH`nP7jU_b0Om4$sbN6nWKj z*iUzMu>y@W^l6v(rjR%_CUD*ciD)W7AT7L|v(8 zO>xqGwla)vds}7!V+VB1<=L%6Z+LJ zhT=kp1|M*@P-fp)BmVS(9myC4lwnC8DlOwnP#>+PUqpYKox>Cijb-321}^QudhoyH zeQat88LcmR3TF!$XE%J~*%xUWmJ| zE?ELkmVEZDPMNNzkkp>98jB_V;{kTBO7xNk9<}FdTsNhEo*+136l zel=wL=v{?yDdeHyln8UFuiRG_45Rch>944-)MbB?kH+>uI3Pvva^VVl11LM24N|mK z{p}>svPuFwyRn|GlJVj*iPzo+gxO>Ikf2*#Bu@bty(KraEUUS#gA#a?Ry|}(_j(tH zPc=f86FW@QZ_f~za=qt1R339(#i2HS(0dh%f+9a7IDI~K_z0o=8*UEuBPM`PrpiZZ zwTFKjX!Ko@X6FhONyxRwje^n~g=Lgalx2Cu3LExWskJfDH^r$-tV)yJIYSa>SGJv& za72xzj2L?ssI~-Sh|P&w`IPY)D*l5y2-*gLTJMuEq+Y3Y{<-QprC~TVGb-W57A1>c z)6~7NzabIhP}c`qbthaBnF}&JbaW6kgcpB}`2eBEzf6slEqDfANrqd7nXavwwb-`)V!t7&FVbwnjkGG}3A!*?g+!FD=-riN+)!|kh z6o;)+`F6#G%fi&`qS>$o-pPsBOe<-=K_8@L@GkN7Rb`Ert(#(DPBZGRbV2Xdd zY}UMPD*WuE~UrRGT}!hDh^*ua}$v z{3%He{?d?rDn3T9mTdt>enw2ib|`w`f>iD?h33NflyzDYu0pom2sd!}yCt8(+B$no zd?_>~WL~|+c|ts%A+gB8T8?uSJ<88+!7CRM}%;=;def8$iBV`yW1EKn>4WPO-XNCIg>}T4{I`t z!}IHx4?Q>}Oe{Ivv$UZv@F3_DUf+bB3km2w#91WR8qZFt@7A&5C*gm3o(22&%-izH zhw7(sjvN#SR@EU#5Qt|gFM32n z(iMp90mS~xIDZy_&v55evYOHx%KX#G5KM?NbsoXHAC+?$* zXm16#j=m}d4>bJm7s)m5m7LbM(P;p-7>+#_(5)uWUSSrC-forL*{kuhBiZ)e4A?eA z)PtoB{FReXY6VwZP4aD^^!sA#zyJ}pJkq^pbrPh`W@`IME~K6c%Jcgu3m*_GPbF$x zi#@50in;w8h)aLUk-~_3DC~5*p#$n1#)t`1Lf401HJ4VMDbGv4+w+czoz&gjlK57J zg=3oFlA&wG{@zz5hxukPn)ANo`68eOwb0% zVWCAf&72Yk7$L76u>gbW%A5cCsh_}WrXcq$5)C;EX&?YOQSe7eiy=)-d#aFh!h4Ys z@RbXi`-p#9{-T-A-{9gh+$ZxN`fbO2m##Zg4mEJe8&3p_21sFZARkC^zjWXSAoz?f zB`3d8)j)?##i8glkJPKAwik*1kMVq>;*S0HIS)?1jc6^PBIKk$FO>RP3 zM|WCg{^#uZ>q##DY6Ngw5kF3YY;s&wrAFQ12hXU=?DNj ze8#jANIt&?0@u@2cMv^bdKbLxS>uQpz!dD38zbCa;W;2e;pKlc<^*JO-b-!x9k7LM z6dNtMoO~n)%mqdHNyW#nJYN=`HEdJ5c8}fEgae+<&v7 z`GtR>8`o5&jnDjV%Tt~xrnU4Pm6NuTWR_`H%P1;gPW)Nx3nLS>iYjy|bc4=A%~maP z5*9^Cvn-@~hDpQmbuyTNgjsRqFd6Ftl1I&Yh&?b033q&LXi&Gad`HoSC@&Xt+Yg!v zNW5v*(&B&&3xU#WunZ7OpMMU1uN3KfE4hEA8Qcbez*9_dawdTdut6i{E{CbuD)-qr zEy?}!A8>%Brc-baa@Unn`vN!o7L9fd4TCGK?C0YqWJL@%RsF`7*lz`{-&gO#gmYJC zMl+)7F_XbhI*b+5Vo*X8Oi-fTIZsQd3UVgfeI+%zW`nDJco0a5RH=qd?ApHc33-1U z788)4`z`pA!^z6SqUqshqWSLY*+%lo7#sa992#=9UdyBS5~c=52tDC|xvQ+nXO#fm zo8o_cMILYYmy{xFf_7;g4~%4{*BGdQoQ{}u8>I-b_SE(5*O&nNV&x*sUU7YxCn0)0 zg_CxIw)%)AdX#QVJp7xCxdzTLG*o{Twxb%mJ95Gz*NyyG*SmF1#A%7dvbp}R%H#^3W1*Ie^(xPT zx)!*T`xG~sYpf=cS; z6mSf-!FeI%v!;fga>6yek^RJn(oxhXkZb=&;S-&ys#sA)z;Kg)xFf?#xOGSauUr@h zyN?e`944CX8LD7XxsmGtLoViDMHZG0jIFHP^i zRh=?%sJa`*rOfsyj52?Av?99Rjy@kW5Sj!v{AabqZq|Mu7W8MuQMI@|kFFTZef#sb zJ><;ek(Jy8pu^-lS<=N_`w!gC`~O&%M{MQ&tsn|qfHwYvS^_K?h~hHE!1^mAsS_O=35zZvaX{wt1!*K*r=;qG>!p~;3Xuf=PZgMiS8{ zYyR(DnSCL1J$9`&XfRZvmj5!W$i*IGPko_XV{Ct4*F47R6Zco&5hUbRz`^VYuUILA zWGLqs1=`n*?DQJq1XtWvF>~1;XL4vGx!JZH5ll+KJmJ!&&f!bXc-DuOe2X^{Uoeye z&j~bCm$a9Ox|3)we(~TmohhsyYd#9v*+(aSH~fcs&7n?iOz&)=|D*A4JN?BO-}}X$ zf((DOc7752G~IP94}rWofIvh8a!c3xRB?1LcsC&*F)$`wyMOkh^OK}+8g-eVv7V3V zZ6@6MweCwd{C+RMvAOA$_J#K6mdowJ400lhjlDXW;A(n82<4O`x@Xv7bS$L?m+ML3 zggN!Yqws=Q9UK(16esef^B`RhpXp!daI$~&I(nraM!I3(f$TFhNfouHC}#+Nd0pKO z+!XvJ$A4+fTxux&H9F*-jE3oneN!PY$PIq0_>m)NnXk2N|y`m z?U)WpmyeaSm~s(5BOfI-LA4^oIu_Ez9QVLNA4X_S*TG6=8s4} z(MQ_XTFCd222F2uh-gw>)##cSAZ>ruGf|1W*35=9tj-WV3505c$avNyT@ns_VZ@Mj zMP)nrKg1DW;B|69@c%=vv42Q1+{JLaVoYQz1zFl{v!!0-gi)xB^_ahP7c|=U%!Y8c zR3jBgdkEcp#1lI9?xG_SY+JSj^yZD0s02);2<((CUr52)3qd2V+Pk1vvbcZ3{(OD3 zh8;Roz+slUC?x+W(>9HkdJeIoWEi?aR%BkyQ)|~hqUw%8OG?AJv4U~I&`bZmAPa}& zP2S$4BeY+{L4~o&b`DdoMHcn3{sFY;({@}J$vXl`RX~}kx+&Rt?NR6MrSn|G4jyCn643SE=JWEb6lbFeg`?@qjxBd=2oqg#|2^i{qJ9| z1mShB7QJ6smC#fDbR4-KS=(G{HvR4I@rfm2xN%Qy(Z>T1TZ&F>hM*rJd!l_M9!>y) z)}4-7A^b$ee5HT)Hh_O2g0#Bz3QWo%2E6MQL|-Sxb|%iG8-)Z-gl#L&ITz(-t58+g zb*k>TUGG!td>I^twPl_AYs{f49|Y>xg~1ygCh?%}m?}vp?L>Dd7cAnpTNzJk*J|an z0u`G1cA-@1Er0#D<2aagcnnYozN4|by|?WQ{q0VMv6aYn#o2$zI*Xnc7sJ*Cd2UL@ zo0M9Vp0R@chkowM=b-j%I2GC%n1FHa`nqPMH9`bC?1Ci|xer#kd}o?oerEUsZyP6-DH^A=b|F4vNDGUg_r_kH*!m-6GRpkH2MEy9%lWe7cxk zBFFTzJBU<=k1NXCv<60rI^uF*Wz!PumPW6EsE=H9RGBYi^H$_2!wy~*?T)Aa8|*lKR&|H-l;0{ z$L`$+HzXQxuH)zBKY(C|&I~Gn>o9EV4&9P1`Z5wvIL0Cx|E2cu_@XLE<&e>BP5w zA6fSzX|8`LzQjlsHAk$oKJ{)mopTs{E>4QmSqmp}D#&r7zQREF1){p+0UF^{{5APE zpLCZxVK=sl%Kr}<<0s)QI73;5+hv)e_tSJaW;sLW!HTA1d0%?W*#H{{p3uR)`xuEv z$FM_yJQfJj8aw#}tHX);zkF=(f5RE_ci)(EH}QWlfY*6wwUxcs$E6D5f=t`3L*^>d zPpFP?D^reeT48~ZAsLjCD8};Mt|BiMxYe4(f?L6_XhXLuDwi5MaGoA>R zl>1UcR7avWS}{uXC7{$O-+Xv8eqGDw#eI8rFMI4XH7NhPXpFQoH+GOou5g=wwZJ3e zwp7_%2FZf0gRtPyIo^f8rek~V*>cM+BFKN;bU|R#V#szv=>KYE!$S2PTyzzHhMsja zB?4Fb^}8=3wv@LGr6dEy^OJ_RnMD3`se)HCDHdB$TK6H@_so=E*{L`M4*Mk zN6pda`cva^s!Yfs5AJ6kQV-PN_YeoVLwCbc$TP3TY%C-%U1##87FX;E1`Z5e2o--) zt+g++3s@jh=yfNV=aAz^;(v1)rz6KLMbqby0T6Q(*aH=4WIgm$A^hi%f}kapV7Al$ zcsdO`I7t_*r5)Kl-T>(p_1ge!9RC~tBe7s$2^<#IW8M-V$g#JLZG_-_thnzu@liut zzZ(bayq?ioJFTD%Pa%t)@Q5S6U2T6}MohcA-u2DP^#Yos;PptMYp@};C*C#|-+QQN zGay#+v8;`e73%?(K4oAonO?DY&@^XxTQs88f3^NtgkzLr}%8(HrK~AULu>>0Pt%15_+DLon|7 zJ(o3H(-U!Hd*gQ_CtsdtB4HK6+~<;_!ZWSoGO>w6HQT$T!O-tK4|@#{b;`5<2ltYZ zekcf1B2-+Zou1!%!k!P0oE3lhG@0Xp0V zotMV{HjPu}tsKSMAa&9)kypMCvLp~YRQl+HcOx>&`n8^n0EX&WR`rfe8VK{Z{G)4L z43EDHZi1N%dmwR~=raxL|9|-efzK)gl1+F#Y2wgtL8%Y`ovVzC6V<`q+Bg*>Dl7Y@ zKKF;IAG_#Y94|@qcC~+uB1Dxzz-{Tz)PotbTjkDkDY$7Np>*a5(D%<-wgjJ$HH!BU z7+1d(omf$(xs=jN528F}c~$WYsOzzTeP!bbZ`M=ncUOvsPrn?57Arf-TUQSq^`MYv^3^UYz?%BANW?dtY&Z2ke;Dy(VlTJeyaa%5OmtXLJZ*z|z(n z)MLC;Gs2H{i7(&u%hG;fnB2C5bVLGGmtzom>dumi@+MuOl&?&my>3ngW>fK2vpRb9 zi@jIzqy*5(oEM33hMDne_s^`oTmHBIemv{UmS7d&H^hHoQ7#07yQNFzO`5`*Ge*fP zfI8ihWwv{zbnW_VH?eoYI7<+#FuCY4rOP39t0bSW9eFc=;Wm-b4+1#RcRYzBlGj?r$RI|eL9-lL4v0&<{W>*#9mk9K@7Jtvqi-x*)*N-M(XFL z*XCHf6;Dqa1Z42SInW;;&h|@;{^^AkL1~ax!a|>52-uGMHmxo%?ExhrU~h?Og-jBLiLGvw2(JjTWgi=4-iwdp>I!hf%U2 z{jYz`p^P<`&-1HuPTq08Ubk{_mHFhf_gyY;_KqIF(*#&LeBWll(_2r7imL#f15=jym_t$Ig8kmF%x);X0lTCpdlKyG7MKWHu=j93^7_I*eGQ z=eCH>)zHj3l&A=&u_-U*CkB!02@^FHM8Y20mIdrU+5rUKUnwW}8uixciU5=uF_z(qB#Iq&xW&zvctp6=Ez}M+c zRNq~Nx^5$GY>r;_wAXu=!sPotE+4~p@e+nT%hR1886}J0=zfB6k2L@K_zo2o*d>u%P~x65Y7Oqq3NkivhPB8C`UjHf5k#D+ z#Bf>?)_*nCa6#MMMDLkm%$^Fon&UHwTwg-Ii8Zdm@zIYAxdT{+p>8*>|AS{SXAKb! zUb&ObSbPt<*Q*e4KGcTj^(=oRWFyVvjC^G%4=9jMVndR{v1+`s zFGJe(=axoWTV<%V6?BZGNF6*G{W8ec-x@NdfHC5$si5l=v$!3JkQUt(?)5iO?vBgL zjuKW32esOBAauuZ8nnN8eT}ef3%Jx8P>MzmMjOZau5l`};YRxY22p={7_pOZSMY%XMyzs znOdM2%h-N?!YTJ)$CgAi8`c*jD8r_Xa#wEY9=yqILvIY=Y65?WB;xWrI1wjc(3af~ z`AwR}BeMIE_{1Pnsyv!Ffv>LgKkq6Cz+!U%4G4UqICvYE%u|rs7`B1QBTJ)WR6w1) zdYi&IEK;~bFAN$G7aCE$0?8nyBIsqUH82SQzM|Ulkx>pBz>uffr36yu^{-KG;27j%*JPq6Ru}b+DrmTKAFck5i z9j(lC887V4fRgJ;pyN zM^G4T(mj7h)$OndAAWrE>$lKtD|~FO8v~rI1n((o1M8D%83yFw_S)%6q+$}#E5!oH zq7UAN%hXS9+|izo?b+?MD!|p8hoKHHN2X4^>3blTG^cIiVc&J4wKkul^ouP8D$RbL z-;JGc=y>xg8whSbx?pv4!vO1_LPH_j^=c9M^ICt))?be_Gm@M3C?_WQhX7NY8GD2G zV^oR{G@DdP)9{w`<$!;hS}qL-9r;a%6BHG`t^x)b1rZrxpjt z+ZkZcXCVDsuk-~^$K!grdeRPKGYKJ9wcnnyF81HmvWLV)8((R*Q&e^YYn;BiQ>*>H zPRxH*fFBDfNq)y@?a6gB`o#xhs!eE3%H6WH#}c?f>k87~d5FZi?V|^lM#YI*M@uDZ zq4w-5F93$$PO{w^Fz02rRUBX8-D%rqzMvDEwHh^K&Vewpp=Mh2if>gJk>UwWmpGv9 z{jNGQ7sbz#uD9#mK;VpzG`IuxB}>|v(C2@8#t?T|(ZYk>N(4P6Cj%g4@_K07aW-#% zh3)a)d@Ro!l**50OKAk9eTKo!me+2ek5$S_nHC{uQ!|kc)-1jWPn2?Lx{T{+Q2Jr* z9FYRF(?~tU7oGjD2p-O^ju<|bQ{uBbzNQEgL#9}7M8T4fFJ-#nA6zel&g905Dv5u3 zuz|b8V~}_&fNBozs5#=2Oimo;5&vuU_y`9CL|bxu_EbBL7AfnGUGcY5?#g&X8Rsm+ z?Fm?AbB{JMxc-W(3eM`t`;ckVbuZb4DRImw=_nm2va=PYjCqjp>T3#LY@IWSqRxNv z&Ux<#NMcxYJZaezF}CvNH%7JdP9c9y0>7rZ$MOk>NW)&6`9sdRL$w^7;mGSXluq)2IF%Om;Gm;N3)HrhGCpAl(Y z6EU!gt4z55TtoY6unmGGVzPt2sD4PU5_FixTb?(l=TJ8iU5zcDcM^ge!-jw0nl@A# zT=$V1w-GDWadV(KDq7>()L7(;l}ecc{;GnH`UT}BkQ@{*KT|nLo#bErUIaoQ!(Npk zWxC65o}-?`MIwfd>1{z-nHFaGh%w!VSJITn{(SKQk#6moyLE@8lQ7BFhh@2se|Eb;yB{%!_Q-u&OGk9LVuNuS2` z9FH;;p6<9RxhvR3V7sAZHuC(2iC*5FAmd&?&H`j|l(o0`Qyd}ocm$5Mm(AH+MujW1 zfuqJlL%J~9pI9bdznhL$XHRS`m`XFei$QX({wgsuaE{ix-w`zt8@_+otQdWZ!Q84i z85t%V-jc{^m2dQ^Jh&SDi9;LP-AAfGTsj1ImYME$5zTPlhkN$9Pm3dDZ4oIKLvxcR zS1cD1$X0p6=@!|BHr31KL51I`BAVoi_Vt_g-b3-^LzQnOq9p7N5TZTbl0GB8^8OMS z>D521mv_6Arhhj${8oPo$%j*Fy>^3Aa2=^f~{vGmUT;?C@W1?BL*%Dx^i$%i@2Qa;DpcM#OZbU3TW{ zS~UZ}N_5&=ds>;i zpQVdk>nGI8GG5Bq-?^49LG){Z$f)aa@V)e{ux0PSIZ{4!hGq69E6;Te4MofXcbcaM z-En&hQ7oNvMNEJHzP*s#JFE|F&z0b{OW~_#Af8FwYLWJ+fO~2Sr6#!?A5tNj%RqscK1#~RRSY$W{##VjQ|a$NAi=6eiY{%j6+UiTmzK_vDgPLU0a7A4 zSo5lgZrf;;f^^_*(}p1nmD10Vug+1+;Ld?f9wE_mZj$?R66JTs--TL&j~qO8D~%d#s@_t zAcm)OP78m?<-rr@b$)bhOu`O^RjvjzjVBJCF53BTF2ohf{T(LbKUvw*^B?%DJ=8%_ z-uY?_+Q!Z%l(Ly3X;E|w4#8mJlngiI(2kPDSo717rpds#sQ5gbvE>T`)8~yqUBYi* z{3EkCV7g~o(s-d%{722@IBwi(6bcgGgx&bRfhB*vTcrF|9gG<%Gwm)ZKP|^F4C0`x zt#l^!tFt}(FW6d*R^pIYSc^PJv3LoKTq6cQx&;8HjCRHx>JVn9d9RSU7(Wht$_*~2 zh+3poNFFuZi3Y^lND&TJ4#-D<(`RAZUt$(ByxJe^3oWQd2X1t}96#pq zHxXXlmg(auDkXnx=+QZl$(Wv9m0Ey`FARDFC%0K9YwcwT{i6_c(L&!uNVV#yNu*gl z0IvORxSKw3YAUsN5y`(Tc*9ZCJ2hiY;?;k_rf`kp`&ynFM1CH}>TByl3oKxP@9zXc zB!?(4&k|sZ)Iq?hEb`5KrK*RyBqNgJ?`;a9ZWY6f0nWB@6yi4hEB@|Og1+H@IT|Oa z>Pykde};XZuiWPT`ul~9ggpKdU6wOgACmiFLLvU^7Z`k@$erAer~rS@ zZbwSeVMDBVq!TIbAyi^l*6+lC>@aSzvSe%e_`LgvI>}RM8Py~<+1sH+5ZIwRJ6-6S z`BNdbgsSx0b=+yZ?B0_H6a7d|nt(T;8}QqWM;HUxY!7a6%pqDKb0wrgn(QfL&8Zyw zn6U;cnztE9r-qsL;-*;^Bm{Men+$(e#|~lQB9jlDaIAPGd|@a4U7Jq>cbY(o{;Pk_ zxE3^74d?GL>WWTlpxS9)O_`M)lG5O*W+)JR0=Y2p%KQY%Jt4sBu1e(AqiIk8}e={*Tp5$slo{P?HGTk*PUWZ zsUU`Q_4xaq)H5L^BUrwFMI>Hn;x*`wJgRLyw_dR5DFS4IsYgQ>{T(vFJKW}l>B!do zPJTay)>N)RtStkqt~Jd&NB}rXaeN}4xlCmuiYV?i40@+|zDG2RAmfvwyv7Th45GLO z!*(nGf-RvzIO9^5&9M~nR1 z3ssbnw#>am2RYM#FW1=wtFqy@^=PHF59Fz^J1(vN1`VUv)?l8dI*BJyLL$hMjX=NN zDMWV=^&UxB#MmUjO-3R(pRGt==3T+1PV=3~%PQw4HB}A-Le$1D?52M`lbJ?XVpuFx zPnm>=ugFq&(E4@0`TiR-N#Lwps=^y3QyGJ1zY*Z=0Qg=W7IoOJFhHP4IsXYHl71?U z2cX>W>V!h3*4aej>F%4RY8EFaAP9_OC^xw~2GM6_t)~Mm?Od+)(vjkYecOYohgXHI z(C3^fft1ja;;mFeimHE3LRs_TmEUeG4l+pqdYF;9%0GF#B{!QA%fuJ+)CN4SitPB( zg&v!ul%|i{838ytR6ZOJE_9^ZP5^ta-H)1!u6h*}xmS~OyLU${4t`otnNr-w-ksXy zq?Db$_I4A5mMW*>)6<0=z4J}jHvB!~J5n9xGkT&G&nKA{t%`r~3gM0$l+doBT9cJt zP`jxVR1$USXA$HCUQPr|VM3f-L=>kd4J19oDY-@y%Sl za-C9!{3v(j4Jo}XYtsmf7z#Qomy;um&jH@2B0RuiEN$gBaa!XZ_5D*WTlN#9CHPT0 zHX^rgwY72jh_ina+eX-UdlxK(nTkN?c?rIl%5JojuA`S(xj~Bs7d`1zm4gUnXpm_l z*|}o&l#7N5fPjor`0oVcBfVK*VIAS+P-VH?sn_Y-H_$wo!{YyuwT|8C>`}FEpr8M^ zgd~;+{RD=Z{v*C}%Q$RvURk;;nU~P@y*p;fyb^??s-=HMV*PWUJTp6uPXIy13!~$@ ztw>g~)AlvgdwjA_oF#({&wE3h9?d@Z7NVlkCW|I~o1}L|imve#0pW#!)#|XEjeu%_ zu1=qa1BdUS-^#hp@Xji)nq(f(E)FyGgI|ScJv6(;J6Lb6ElCaNWg40&d>VW{?WUk%<0pR(Dnx# zg$=|L-OBU?=qmGDZq+lF%>) z?F-^%Eh}TOIqp5;MtTcx=DjobP9ARaNp;{Ui~K@=i%{X|egyY`z^^zxxUjqgVn%<{ zVPc!t@e3WO%P3@z-nSD=-+#}im!uwlmS)Wiq!d3h^Mc%pupB9*w2u6+P}&tFS_4J0 z^rw0dJXF#LkLb^~pn|B?Y=6BQBDB>>bq3^MkY-4UJG63u_vbQk}& zhm&ewVE0Sw)9TwyVJiF_coM^K!osRO_Gg-@4c}OPDKB8i}BaT^S73NS{y9M>vdqe1WQm@SfFA5EFqX85v8_?`J_bJB{zTo)>^ki(O461u!! zSvm*^eskY-eZA--;_W~X`WJttg@`XnaF)JSy)CGc`gtw&JM{AG+2QM`4txn*>SWwt z2K@7SqrOTb#=&N|u| z%+`FY{y$=Nx9xuNpI5 z(m2TYFNKiqI}zBmg#9+YY77$w;UrUl7*D6oxZzq|f7E^89>~0}5J_OvOU1LP2Y8G&2}`ZLgyzi=s|E3vSRYi z-SU_^2`Dd9?#oj0*T;Ww2`w+5rQAzvTXC3XYX|-%Ht1=>cewSW;zA_S-2dl%TRse^ z8h>I?hi zt$9nSIeS53%qOK(PV^QDa?_V~BMpFl?(Etz{hN7b;NRHWKd?Lz(XE@>q8z*GXUw!s zB$Om;{_A$6Pf&#;KXCIKYc~zKXXKB};AKA#f_wlU@#29u#a}A%IsXxc0Sm&CC*GA5 zE`(nsSZ8|=AGv=}Ho&`=``o-L`%%q_I;~?h-*ExF{}rGc!*>?hF#UyWg?qlcbLv0K zy%O_RqFJq&+rpNgGUO9~w&USssEEGmS0*24jK)K*YzoO9gKaSYdH)#oAf9X7gaS*B zta3tjltP@Wmg5J^%vF!79xfDFgcCk?Q~vXcEP-p&acO@qp5ALJy5Vg6sepSuho!?f zDu}g1IRcX=6r`O-l&9h<6ZcM^q5ArXp`vZ8X>yg=r#}U%(r)m8*8lt|S+5N=hP#Vm z&K~_BMBDhlko5)fT zZtEz^c0qO?b;iuq6bxyRkn(HCINfT7pUrXp_24U9MzfO2wijTQR#KpG-8oGWvd_qkH_LRr{9SjM0nn17=x z_&=QG$OaKA^JK8_J*~-l2XY$4iFTYJ;zOh_57ax@RuRMspSpvNIJm2=FU&VOzpj6z zEA)Z0Q}$D>>fReduHnK_M@14JpRKG<&~X=RCx;V%vz6n`QQa*NKOUCmSVyB~1hMM? zY?#VwLV`V4-cRDN9^zy%d%k@4`}#GrEH6;3%m0w4B{M&wlV`;Q4obocLPFL8-VFJS z3tzl0_z2aTx)#C_ip7Q-nlv4!7>y=$+t_9TyPU+Slbr}2?{qY6XPFm14gtD zCXW?=?y7fdo;EzO%`1NT!+|;ubM)57Lrr8(gl_H2#N~M3FON{gNRY%&ea$9&+DXZf zHsqP_N7Qq#OQ8#lOfNZsu{Ts@K*5+IMd4cQzr@{`(is87u97!t?!sMF~w-2oIJ;)+t|`w;E`n731q611U%&#;gXmzUPlPV@RDrOH(WETNr%EEH_|(! zdGz76lbOk}89GJ%IPFsD6mo{!BiC+WH}NYRxHpb}?f!W#T5Noz-G^sO#F6Z{Jsg0| zdZ;iDSoGBZ#InJ3OBtW5VB5xwYmv-{{)ze&gZhH|n>b~YKojVQyOX|XQV+mX=E^9QO^w(GP zu&cL6kJqx!)RtG27}|y+`$H9GpAdGpd+IzN-sA5=*tL)q{qFI9LKFOy zPQ~9ocqoKBW7HyLD>015mig1iuk+Dd99zwEZ6J9JJ!%T^2gt63PZ#B3E$NJPqz#d} z5PJ@qc@KOcmAv8w5hk)2F^wTm%I9q2YZWtBZqC5;p^n z&TjqJS|aDZ$YM#8z7(a!5hIU1-mnEivP}K#m$2zm7O@JJmL@Z=em(3VLa#C?oIb039*r5DpkwH4)1pTJ|Cylzrl;~PGv`ZBdzRm<}vh}-0nc2#&aMDpnfX{c&n(B6or`ctie z_QvV7h!#=!6%~eO(Wj>V@-XDmUS|5&*I}Pu;{0nt*Z{0MCYl*bohSnwbUO$Q4>2LP zA&l11)DFSLIOimPim*pvC>q6k`1M61Ho`TwcEiY+YSbYgxCVHyN5U(#mAwA&;1jz! zP1z(WWOjk_yVRN`=})ugzB%T<1Z;3mnQ-;lWoE^xLlZcdK(pm*!t3a-`WO?<$}$gK zQydQq5oAG4JuP}Gnrdv*a81+ly|1NNwTY+{$)zAILV7iSGaq0%oJZNcWBSc^BUEbu z#gs)0X?};k+wz^ILt1CRwt;%wII{T(ZlSWo?Gi`VUnkOnMu%lV#$BZ9V8G|$+angv zauVi{r#^~I^w%=qmG~jw#H9abUR;i8j3bDFwwXpA9Pe-m>&H(WP9-42w(x+MkfWko+=vAgIb`q=Hq@Hf#KXUy~@uGtzTM2BRA_^i*j z4i*X?*6dc6*p}Vn960OFQ@fZcvCE`_tP?xfJI&3+7RbPUJ-_53xK#Q2xia5^RgX^o zJ2ES>+2PGLJ(A$Zo`=wdJ&qV9rS{sD9qaE9T9-h79UthS;poJ;p@Xa;g#mVcHUOF) z-Q9$-clIN$zUqiv#@O3+@xFjP5QYp+nA?~}mfWJM6#PPA``~64^R&sUr~0neuj9SS z?HmCgghp15&!ewv$dV?u!^S2Yi><+R-2zJy33mleoHU*^)0(1T5CQFlrfVsY+g|Xl z2N*Gbl(#azuuuto{4&?)w6pZFosUH#G~v2@(EaOH#JXW(lZX`&!q#RClAZr{j5@O~ zLhb&q0&I?4zk=*de{r}&=Lr4&t6%non~ooltN4EmreQOo2Tc5r2=q;gyxNu9z!NTs z4F#Mv4`?Hr#+nxk&e0`<0X;ba+@62gIdGGIU@Kg#ae*2yb-)2xa>jQ08Hv~mT^ktO zx0H%X&O?#Sk`tiCNLga6B%jwwfFi~Go%yRDut(l=GaNTp5xkOu>}FYVfW7|bkhi5< z?Ev&D9BRK?4AGA1Z~4pKo=J-&!vH#Io??GMd6p_Z`376Pqzncz12H)Qzi>T_W_N>s zt8sPIcC3m_BZ4pyF3JtcBEd_OXtCmIsJK(9H#Me!A)%;FzlI!TuKKD!D@C$y>~FNu0Or#Ed&h!eq8C#1X8>pee@IT1ej5)x@Zyb{Uqp39xbK);6u z7bSW#>Pq;J0W5QjQQ~`GUwkpc=qL1lR-jJ9_xmzz%HK*mT-o>Ro71D){p7o#mj~|R zL<(r`1Kx*?4Z_VG!z}0O#pCSytlPuh2*=Q51e#-+kjTyVot`;~&>fSmYedYD;~Hqi z$6ozQo<&4wRw`>z;#k-m6B)}QfOOJ=syrx^3dEGzv=Pk1f+*p0yRmIMA9B2ZDDeZ} z%oED}D_h`=>nODyQYBm@<2< z=)Z}^r5hiRrDt+F{6}#XxffXca1S<9X#gEK15KYP6I_hVWbAjnkVpi zmjCvKB0_gS!e)|I1!OAzN^y~Yt!b&2NL9$VPsts!|0LA$-%VHv3@0LNsF zw->a>kKM_QC8BR+GyWdm%hEadCNef(@#xU^Rz{5Y!GHEqFl_lpg-Z_fCEZImO|k0m zmj1xT%C1ysYHa(GXG;K zVV9ipK5vUgx%Y*D95Kd!_J|tak8tyREE>zOV@?b<;wgb3;F}!wO*IRsf~G08B&eZo z-pBRJnvA=eY3>VK?lQ^8J=(J&u7wzr#c6yQ;2Ky&aW+3MsCAE&GQ5!TKJBVXr0v;xbFS4Z2a)U)K(;N$RFkzA5CC};+NR1OFy#_INLOuo=+ z2!4l&5Fu{5sDg%nB&fJHUIux)*9|k2kTj| zbEnuLq8?M3uxru-lgFAIWF+&AR4^f@jc!-@aiMsx} zYJ@HXHwIN~JciX;EgY@|*`4r2uB7iKyXK#5-&(=FVDim>F0A@7y=ISW1i>&ly%Ay!Bn)u2{fVyXFyY0 zA*{E5>S2f;294HJR6j(3X#@Ms3u>4eLF%khg8TkovP~GuE~*=^1qgLZ{Par1o5Y2@qKz4#Lr68C<2tzMil*KThLZ>isX+B12MeqEj2`vVyBuS85wSk|Qpy zIWPh>X|(r*iYP^Vh->~M-oVX3jS%O+(95bqF&g?6qOLV&O6$-#h{-knKif%kJ&@qekIpASVnH)m?c!D5b!D|gMnof1t>G*Jm0cVKvCp)~y|QQn`bvRqvO z(lt$gCpTzR*Wv16_x+?UVh5`k@b(7j*n~|9^lu z0PM)r20Zj#2C?r3fTb(ZZesv3!k)x6ID^Pt7In6ik0do~06AzD9QA&p`yvt8wzNZ0Ovqjm_TsOCNzi%5Ha z!*ShrNokI14tE7pvbe!()%%p+*h1sRC57*bvS6YCcI%P~x2HYT%?zM)1d#diBA?B> z=^-{*rFXF0&8SRHpq1)mEr`BL{7-TZkCM()Qf64z3VPDg^-M&h{uqd);9*L1`4{ud zU&%OQ+?i!3^vGgRfx6UZ{q=7?(WH5l%IPw+=3SM4PqHOf8wnqXbvOGwXn1AZgE;cnvdoQFZf)M{c5Zs+jdN^U&3-wAPeN)Uws^~P3JVAE^&lEGw$U2~4)Ay(8JVX{fgA!qXY%|P> z+^x|do@%xlkHn5Ut)VoK_i9@vz;mwYF~#mT=km#)-!t89xPdAY{ANyX&jAFzEIJ9o$p8S+n>5Y8nE9T01nm}I zS{!*?4Y0TDJRXE0V|NUTHeH5)bv0Kkj6XazIL`r|`?V6bF$QBz>J(8WZG%^d|Epo5 zAY>vcfCgyknzZ?^0NmYXN1zW_;E9s~h68v}yaN-BjYh+lUDduC%(vDVUiJbHiKQ@| zrnQgfi%VW&`rDieWDxJd!BJNL?BHc{Us^dL&sC4@X9F%S>!wr!HxBxLuRvA6qzx0h zp2bL6C?aTsU2S9o2GXg1hjF@O`geNW$4t}2_9|k)uy;-@BW%lt5D%}+9}UdPZouKJ zK)g*XZEe#I+|zd`y*^EXeB1`|g0bJYtx9P=vzrK;?uU;`{iQ$tdlYn7_9hDKwJD6k z-E7KzIRg|)<3N8js+;eBSTI#pHTo)Z^*y2>?&wxSRbVX!LmXH2!9Egc@ru>Q`dmUx zWtVukhO{zf&GCuNbGAsL80;_IPEC{6q5xVB&NF2P*c@H7KXewGC#iYeJDx-!wE9tZ za2igcH}o0zg8#zIA0FllPi**1*Wp#PvbAO)cxvE}O_3pn_N?ZAEA5$4NhQ{Quj;OM zN{SBVXs?x@mLHS&?3LPg2r{h9hsafAy-Dsb68hb3TtRu|*ky{mq{H9ywnS3%DSs|< zJGxvPJ$+&PD9w~lC7Z!C;2e{FGUuK$r-X?y+Q??0sVG4}i~^$xjj<)7jB{^6!fw}< z04Vdhp)qL=chy{fVS(&6(P0HU*~vBr8F&V@pPqzR!S!B{B3`B6(BDvfVf1rW6v(7e z4LMaBJlo&mOXFuxJ5@OVmYCf1=!#14^Z7vE3o<*lV|HuRe*aQY~~NHlAVYPfaqhJBt}5=3+fmf+=o&|OnmiC$@Yh!vbX9JFpy zdxCAr_0UPL;>v|BC5C%6(Jq#WzRi8z>$}^)a;&BI?J+84-e5PlR(3MJI}C*(B>Ev2 z{6iC7ENh4B;A%NURw2gk)HX<*9Csd5=p|A+DBfyQ9j-|7+)`tFx*+ge>)w+8gmrx0 zl%6uR00c&VyDYtoc&g!A?+*jT0~E6ZgpwPAQll^UF0T$tHS-vcd+ZB3$U#{Q8t zPB6pI7&IL67XqGry_$fk`ve^adCO8I2ZmMqA?cZyD>(|?&gL!41|)i?5(Zc0lPW=P zCI;%Wl&|PVt*9lmbIsBj0Xg~X0PmviT~Gk(?9>x~@$Zw%n_@cAkIOw)WUXba0E)8tI*oK~@_E2h*B$}vTDgR^QWaP9U z3~E)f90nK0dG-S*5Z*oY;k(6(<3aD10#eg)N&9L@_cSzI)07>&zTa9VzU~EWwN=a+q04h73cYkn1?;Ggg7<_a0h(}#H#mB?Ew z1cH%LY}hUnCOe-~yVfK~I2a@A+$oCF!t&Pw?YrOh0(g1#2No;Pga}FS2sc?qLnfsB znLy?KB!AMUnTwQ@Hb}{nP(xIbEvEh(L4<~XC)?w0tjeQ)RY6zYHzN|l2ditF?+;Yz zPER7`qEBTdeSRh0BmT-gkkdU!c}33HIxUnMWd-(E`&*?n2PmZqtEYJ{%y=%xnMc6Z zfh}ja3{gM(HMcn~4uBe6TOSiW}&K48F8e#XEt^rTt^Ytiy z+7jPaOw{d<0K*D7z`mf7TVLu8aHNZ@nEC$)c0I>}K^s(e8+jb&O|H5|c9IEueR!qs zSPvQ{A+ygR0>d5~gH;}B(WC1UKa>k-FGPpb9kLYrB|{s z+i>4d;ioTI{OH}sVqvT_Gc))K(hru$VMMSoLOCGxQ~xXD-dpv5{kDY>B-zD(R*FD- zKSE3inMf)CalM?1bFnOAT2uzVdt>+k+Ek$)x~Ha&x#8A$vP(67boM}nRM4hmor;|nX(7rq9x)Uprp30d*5Qyd8thXF|+8|mh z%B;gL7awl7_;gtXgK(1Qus~3MpXNyPFN1gig~RPo2aI?>rPP5>WMmL~G6CL2k9zOK z7jYzpE!kM1tB6uskqNBdut@aeTSEy^AKhHu)*a!K9;>hHB(70eX<&1zHV|pbGklpW zDa}|6wz(F0Z_e;)K4&{!1T>i~{cISuw~1UnQqT1iD|ieeCEdLyl+T|hwQ!uf5?|fF+8(5oI}jWthKZi zJcP&38>JdDeMNwA6zT6h=w}a%jHv#hjDaR#jaF!2R4j6bMl;Bp`JLf?MRU!8^pj>dYKVf|e>sH& zVP0?^cJR`MV1D9%0rpYY?1=(zGAByDXKD>6==B{*u(q4l-m-j&hh*Pmw~d3WmwWst zAcjb@zC`viTIK}ePM7Hs98J-Ll5G7m=RvkVI%LqPeKf9{H%6f+kGaQ3Go_nkCs4`r zxq5$4fW8+Qq$_nQlpK9S{qc;^R!v#+`vIpL5TNG1iiEp=MzKN5f)k2F7o>_^{l&?{ zPTcPZ1%rh{7=77&;3+Vm0NJB$cHcAwwyZ}Y2+DDgzvPPqCS|(@sn7X+TzKFJ5IRn5 zxZadO5j?XJIciefS>R38|HxE=puH`!lm?TzVT5d#nQHXmB zSkATyS`Ov)m9&)M(^J8KRHadscmvEoa)$4Z(-ko(sG z>Z=>)`fAx#5=m?f4SM=F9?Qyla`@YbNa?uH_15Luf7}6&ibjf#yC{mc5XRHAX(=5k zWKVP@fMR6wB|0r%RfycO3_zPMs`2{s_o|P7d)r*d+v%wQ$c9rVX8i?@5jRzUp%AKiQ^v278QZdf-=ruO+1mj|@fR!P zYXjn$PtO{;60vVz=BM8+b`kcLvSvpdAEgymF#y`OqVrN$q8%i$gF8pDKCG&cz zjwwA;*Z{h6z2uexFHl5u>g~pV8M%*fwM^ALDT|av)`$Z7;C*Vr|C6?-Wfl zRKk=4A4DcIJwcY}8~hyk#z&8tnnHIno{9pg;c0^Haa<%@P^v9`j$ERD`OlEeYdTDpq|*cT$CIc^VOYC)ZmAheemn!+Y3daG4(R?h3xrF&JK3! zWCJ{=E40YMCs;~L@M3rQcEQdC9N6_#VmOc@Er*^%RdDSIT=dV7G8oV@b=iyHj8La__Tu{$}FJy_ zH4wB00Xu{s9Zc+h1`~>jCvJ5zj1StYiUxn%;;c44|AHY{sJ}dN!q`uVQ!AhsS>xoC zAy%eLMbgAOVK|-}cGN$i#p8NVH0>0VfMs;}H&V_hM?oG}i)*o`rlBQ_y(+hJ2tZgo zn?}gv=(&P2gx0?!{!nn>@0dbaCRz6`)TfYGm0Pm!UtGP z?lNNe`xFxAF-s+h?2AL8w$y4F;PLWoZos#O~ z32Te>u#%*q7ygH8`4kV*YK!w>10-fAr+6Tdw;QakE{;rjTDa%dV}n?#k|ZMm%yL2* zC^;E01Nj4EBLr-(jM_UdbCZPA@EMZ6-^f@L8>aefAr^NRL3 zZ4U&}8wda_dmL(sue+f{1fHN4S$tsS;wsSXiP-N3 zK5Pb_CTqGSv2a&ZxFBurxT&Cmr~}PMK!|`rGxH6zmgCjib4xMWvPGci#nmSI%`tt> z1{K$nOphU{X8P>;wV@60e|xIVa{dMzN4S>vABfSOtZda?FgBYA&|T!S?w~x)Vn9ZJ z4baKr?W}p6>3Z~ne>`Ot76YQ8OiBT}5dz362DM6oZrN?t5wV4}DdR!NxK(E*A-~pz zX7KAZ$!0-_5AUN^mk0g&8_RARKH+I}x0$01Dug1gU}3&Rn&a8wqBphq*#+OE4Ssf+^^Tr&Io(bj_mbMu0%3jfT;f|>3NjsgYoHx4jrK|@)aK8p52CBkMLyBPWs?sfVy%GeQ!JkyhSf5S$Z!Y_ zCcYz*d!3%N!0xLsh{0yb*FPA4>#4*^mHlBwBEC(xa?X=9X=`f)x9(3BWZ&9O?mqcy z?^z(U9bOkPFsi|i6x(O-sDA82bYEqGJ+(^%5xXMsAytnIbTCoFcg0CPmcer8irC!~ zEMdp((ves?FGCUz3}FvU${jfS7LR695=_)J>_^Tv==P>o4buX_2m~g7?7U)OxI1{} zAI=t+@q=zqN?9?3{2sdmDqc|Q(k1Q+DgL@|AvhkLw55p-RB0G6)S|hyKY$A~7~hp5 zQWhjud&K{dj)(0&(<*u8%k=Pt~56g&e5RbB&sLrYb=*8`_^9q3G7 zVhyIE>PAFz=!ox-VwU)GIS>3?#HlhraJg{BQzWv#AT`xmfK^to^i`=(=R&Ae8@4@0+ORFg}$qAY` z1(HKg1WpDF!9#WSESJf6qk8*v6x)(OD|48y;ECk~(N6Bu!ze+!5J38OWaQ%6>gIP$ zKIdVBtV@b3;N{jW>s)&^zEu_%;uC}v0jDPH%BT#-1zfkg3k-=irfMtm~6 z5&1NHadc{bZ-#3~DA8<3E##6fU4L-gJ=AoRuLRAz7;$19B^?(3Z73=@(B?2LaB>|S zqn-y)*rMDc%rE&xt8jUmp-x@s36zdqJHU-Tu7v!UZy8`ad2O>jDc}mX$RZQmAcYYd zZ4^&x7;U{MW8=NTyu2zhSDJ8q^^|`cAgCA{guy|7nOS^1?z~eboRHbGT%Wesoo@jY zP_HOTnu#OX0LjR1aplnRQkyxOl}ceFX`nDZY42htuWVfSJ$>{en&mTX$DeX6e5ekh zM-UBv%z#ZNW{|9U5>8KWid8~4br0ZGw4~$IFr`6!;^~GC+W(60_Q=0;Tup}}4|pAA z@Ln_?=}vPcq2hI+#%2V67PS>_d~ zq`J2Q+=Xxhw+E*MdO)(!Mp;`2NWq2Qg|Co*moOnJufElB?233k1D)=(hUp4sJe+A} zX$x1$E>e8|F4|v&K5g{ItL=1G$OcevZ>w#_jlDC2BHV+2`4c#ZhQk1=Qm9UB+CYqd zz=eyuTj37EnTSsyNeB~w(V-!0NvGjY;Z4>YY+QIW-go zj%=MPhtJ3u(xniMn9JTzE>qojxs_Vz^iI7?`3qWA00|oL%=R8}$!2K= z#Ff1KpFSMHwB13;5Wm_}(6`64QTfk*~V8?Uk!3=oDDtV z!#r|q?fVpChyNQOfYrW@A!(Wy&P(8tcRf};^@C$qT{F7_5vhBcgGrBlEmfLIl>&=tMW5x4L^ z_y;-C)yAPRa6*?eozU%HYb97|F+z&OXqI!Jbb*>(Ti0XORR4}`Y*5VMrw67mUi5|t zZ~~9vi2VcVvptQoYiwh$P&pSELodf3mUDzhQ0iO#_^AZ8q})20Uns7BS%enikMgs> zErn@j_@&cdolNdLE4W;^;(ksqej%sDFeWoQcUTMlN5n<|s0*p;{f)((xNVS;AeB5F z&L%f4Pph*^Z|hJf^JR*~LY+@nh9FK}S;ENjK3V+db$$&Ab{xaQ3QmKt#)c{~%hv1Q z%PuPjQ=h{VDB~gwlF{;iUlx;UJ`AD^Ed;!zf0jc1%_g&wHbMK~@h|y);ZKJAF(kIB zND|zA;2R_cSfKO}4`@ zvR0q50pxk0d$wyy919dF-SGb59}Yawni<%9$HQq@S!-?y*}l|&-ERnJFr3#J-?$@a zZch;HuMXS~YGvd;NCa^;<(VV?+!4vte4>Mn{4#D^Uc!%RIIK^|P~RHM5t^6+hXN62 zc=Tcx5ycZKt*+WVB=oMwHK+zaNQT;tKFv_>MB8+#_5`uO{ug0f=2nK*FjUO#9}O_? zlnH4r`vXQR&EZym#in|9afFt6G=xt;NI=^lz;z&MTn$ct5#Cji_}QRZ5ky8eOF`nR zOjZ}A83ZZYJqAt7?9jOA-MW;P;IkG0j5xfxgnHz5H`Bo z%yb$^kr@wDjtEDI56N+mee8)Ef%JX3%QqgL&o7|V1h4w6?OCH)$OOj7CRptRog4u` ze@qGK(R6m=#k;u_6&>&y7*t|B`dZb-m)QHacsRjqyV!^G;?Y$=IbyBpJ4 zgRT_qI0Uo%LAW8DmBwR|9IJ)VbYYw52{#mELlt4=G<}{Tu)kgrA{sw?vS41=SqZvr z@%zIm-OWuFTi7y+b*;377?fG3N#aviKO|wS6Ejp=uu|pR19^2 z5zYSq)9=s*OF?zwbZ4KLPK0-ycZe*0q=0}>ixgiGcA_%xLBUma6b{T0!)`ycU7EMJ zn_GOiNxV*NI8}1g`f)YsBAxIgtL))?_TWE%DIV!mUr)t`f}0{qwe80JIfVttT*ACF zps>d^hr};!Y=e$uR$YVQStj)=9gcPBjF7%KY`@`tp&#MC6j*va%H{nAjozA(njc$2 zgQ9|rxd;|+Jf&h;bVJX0NuE6yAo-={AkRSOM1DbN99)Nu!&p;ulOzKMZiSnBeT>9^ zs2-A1pVXo)@rtJLc@v6w42AO{l^vNt?qv~fEj+w6b!qL&$VejUc@hXJ41Sr)wx>_X zLvHDNt>?^?!QZfql-5h+Owg3R{-k#K!lyIT$#r9W2l0}$k;`=ws*7Vua%6bD)rhjw z)>WvKlxo9uE=MgG6Cy!p&X2}~$L64av;PG#qT%^dAQtLgw z;k5z!fji;Ldtp;BVdvgpvj#D%z^jt@hVy*mb5X(+_3Vv&P^0HI0%1gYf4FK};uE)+ zn&VrFp{XsNag_PwXgJ$OJcK80B7>Y$Wn(86;XO?E>HcJTz-f|?);;iTavztEufo=T z;jSq;wZWt=U$#;nHv9iXQI4m7Qc=!T2$yD#Q&n8QxA+1PxzO)Cm%@Iy^xODxi;_M9MXyrFSrF-u>kUF}Bi#lT~#cKhCFrGQtEX#o%dU zyf5z%0fZwdyhOXuq~W zHE;ZKUB%Q{9`2(&;`U~wzt5RcX7sT@=(l9zZSl?totH(_Ad!cE+z~p|far?VanM5_ z$qUX(T^;*9UIj{+YXb7o;bq1_+?ypYXsyfCJ;qUSMzylr}o61Xx;m!->@&YC~B*mc#j4dd;y_Y z0+jwE`BK9~Jv9=b#czyV$X314Ov@4h5i!?JciRI>q59(J>@x#*Bopj)hrdy7A7>Gt zUs|yvp-Jn1N*3WaAx$)yXsV$*OWqU$?b(D9dwCYMkS@*E>GL>u;rX22E(93m@dalCJ z2n(=AVztoJcLO-(EviANZ@@bHwh{$IXl8ekB@oSjktpX^ZCsR;-;1do9d^_y!i~0m zvcPQn_w~$ckWqvj+cVrSd5V6ldbN{4Rh+O>Sl>$ucCFmqXyuy1KcYRnmuPJ#By$kI zWp?$tN;doi+%fM@8CjtO8ObQ}p}(y4lmTC@7}#<+SPFO)df3f|p3riq;=Amv{UJF= z?C@59bSEeix?FMiiw!!c@P*IloKM+xu!4vx{39QnvK#cf#9*Ml?;DNGqxNL6lYZbr zk*ckfaul5;3+`Umx;I2uVqdB&3V3Bq{*Iys{?yZy@>$;fwQ*QPp>F;eU9ik$zUg!N zkr_x@5b3^)q##FdPjuP2yfMV4-!B4M$!bYf_&H61Zt8q{NBwZ>Ci%!v2fMCu< zF=i5}LI@Y9pkIS9X|cpfb*-z7yjZa7A)fFi`#R|z#5g>%jK3j|TD#7f&Q*M@s_R^R`0XVTFlqZ-ZN#Pv}H={3@F?uC=xC*8X43}|(K zmbt|awujGjCbXCJmTV_?C1QLe{6wMaK+82Q#+>OsM*H61t}a%|vBq8~-EF^ofz+whh%ep2|viS{}A$Oj?! z6*389jQ#|(ObG?MmSy5`wke~j4uwW)V>k!FTT{zY(?pk0{tY0GY1k;IZ_|!J>&)k) z`)UZGW}O^&`Xb40(qWQpFZ@H%>%)lxX zj{avJ298&eL@!%uKBY+2Uhood4h>O>m4iq-=&s%yCAvxEKU|178qviqVbj5@9Abzs z4>7?-Q+JGP4Y%5I%f=9w4-J|EPN9*Q25Ld?F&{i2hO}_dX+H4Fe)u4;= z@yI!1F_@uK1{orGbB%*xM=8&c%YR?L`t10TONFfPv)dQo{|4O9pV`cNcwck!74>2( zq1J=+%4NS?W0WnPYkLWa=@*XpDh*4!m2Q-rakY11?*5MYCf5WoZuINGrIXw&RrHzk zUr8Sl(cFa|xN{4CBM@}gy0{h&z^lpqtAr?4e*kGVmVq5?$)r@~PK}69zg%$&D#3}} z81|@t<6Z(u1MVcJ#aU;yhC)jKazzf&_#+H0Paglk?nPXQPy?F~JXa*Ck0A^`P?17S zXJEK1Ruqy(7H#UcLI^#OfnR=tWax~MP(Ra9Ta9TO*hjg46D{Cb)`|eX1$asZaseGi zdSJc$XD8igOUu^EWTh5)(r%FLGGAOjo5B>NYIolyro#KZJa*M9fVX<#7*)zkKXjs) z)_R1V4X9$%@l73dd9i^)`GRoj^xf4K@1su_5@H{ywx>OD=_Dl(39yiU#EB2`Y*+dn zj;99i`!-E~<&|6Q`lfJ^zB!EJKm(@wfBQCYjhW87UOU1rO9)iohsY=(GPAj|?IqdP z;?V~r4n7Q0X4S9ue}LgmkAC7g(Bp~y@H;`N;YT`~hT9%b@;(+}&#biv(Hv3`A?-{nHkWueUzx?EYpf2F!I*VnP)!pwGFMQQwJu0``)PUMfkS!maI~k?~PJvpLI}U zgV@CXOik(tI9Aej=*e0cK9t0+ZyhSZ)R^_|$_$D$mHelYi$8hzuRnRw5r|M@-P(n5 z-HDXWuY7>JZA6<<-^TSZWNo2jGBTgcQ6bIguzZqBs)ze8iv;kx_^=-l&pPGelDB|D zjMig+vGB7T%uORc5dgkLE`OvchktOY(?;iV_YFpm2ozN8$|Twr{}nQHWHs4FYE@@m z*k{U79v=5&>9Y>pHH5_n7)kEZvNfY=I2%HKX1~uw4$2o=rnTNUqUgffcKOW?NHlHKxC5Ld^LpW%}@c zTsx{jV^C{l%!{=v=8E?b(yDBtaq(w)32rw@Q6b2P|Lf%D$pF@X<#IahV?a028&^%) z$m*6Lh|)c*+?0*6e6QzCUWmjvX|Su#XtKqm*a1Jd(BCyiS+{1zpUrWG9qPOdBCyvb~mLwomb#?;mC7SUnGNiU2 ziS2BGB5>p`6A?eC;aF(bG1^9*wGQ!AGqQwClaQX%4sIl8#y$8zXg`lqC0ZwcK5aYI z0e(5P@&C;=Q5<#=-9(RJ9T4L%%D^fJ#-I;bd&h_dgO2MW6<6`0I+7N=eEyu)J^uwn zz14_>JSxG@n{RhGHQ(nS-x7&wUzEj^YyAtOnNdYJuJI)4;Xgk->_c5f6IF4m8!q4X zA5n`wX-%lfq8>%V!k`#4l&Ot>VLR$Y4A!$U3R~j`(uUR0FO`mP_sN%wP^0LJU2U`! zWl{xS6}a)jNxooau1TfrI0LWRI5rh@)e_)cCCJcn>nuOeCm6$(ib;UtxtLPpzb-jcTCB0Q+AU&#y6tLc1NAM) z?Zo(~{f}uzD`sh5fAEmAnut|NYjAdpE%&6Iw-^8&6lK~kFPpi7C#hJU9k|Af-;h3VrVT0Fn+k5*bcqz(X6 zK&-#{w#e#Buc2tzxHg=R9G6wd4wf9K))Yqeq` z;gk`Vy1OXlc_79H-ZYj7nB%8eJ2mCB`?)%vlCL=f!d}>kxb0af_3_!V)liUT!>j}|G8sQe*^XkmA?W<4#GAF z3-a*#e`pP9!#9B^b&-nZ)OE>?aW+=8G=|NyR$E4xK@lxs41K#BJ8r&=Z$%tKt7U?v zkt~xAz?#TPuV0(~wZgrH(0(6!<=Hrhd@_A0t&87hJWBP2Ww`ibF4udgP4JZZP9U`&;H@?88XO8x&BV?ySC!w-b;D+cDlCj7{APH zLB1xsE#l=e-$A`xAH&gYY-tKTqJ9JWE${jTi*#N7g2o=g$31A^ofKa&XU9#N;;}`0 zPwgRoWxKg|3{En!t}kC{$ePVp@S21S8vu#{A4=8nYvE*=eV0*L=ViK|0 zIWDoU>9KAjaU)OZO(K)M0~xTPt>-K;leIBr^xk#7+9_XFd2C+y8t$&WhO1!kqW1Be)e+VmQdE|dwgs~j~BCuXx=R!pBbG@VUb? zPGlPLe@f=E#@3;|*buvnfvNx#v$xraUh4@1%Nm<6vh^R+N3e`54_YCj`*sC&fI(HX zb8g+lI6fjd0$`Rn`{mwUt18PqihMTkO2<}U`;ta|nWpBHS-3aYc23WM9HRyRgJur( z6$8T*rqX8#N;UrDbx$98X5lQJCoSKHG$*h3f5DN6e^z0%!Vz-{;?!&!-@PvD@NS2D zyLxCkFpUI3O6PDAqZl1E!F``dheW~os^TRSItMo_c0}PS6IGx5&jDiuGB0O#K9L|) zm8S>CjtjTmC;F<>cp$gyQD)-=g^tMp1xdK2AwmaSs!Q$m#m@O0rY&%JR@ar==N>9l ze_E#)J5rXKV)?6FoN{U&Wlg@x#6T;hf(C$k`3g^bAfw2fzH>G1NP>CEb(2P4K5OY! zK6N4jJptQU^kblCj21Z;SNNnVgLM-l!kUzD2LoZfEmh$N@TQ~Rt%uMX<-Gk;C_Y?j zLupJAxxE?OrLDqmBB-=3PQz@2(eKZTf9Z9#C1W!7R>}wbXcXUb7XH<43+CypI)D3P zASAi=C!AZFMBaOb`KBXTiYOz+%7Zh&aVxn!TTc6Yq0E5vHsB}9Pizrzvt6~>g4SSR zKC|60yWSZQo#YH_Zj$<`ZD28ha4p# zoyi^wEro66U6`K{OCTo4LxC{ zm89B(k<8f1;9fsmZC1qGv29!pc}ai!L`(C+BJZQ`_-5bzUdsnun2e zpm}r&)SN#dCHht4q;vQHK9uZGczAA;1C$t0JUdL=+2$cmpydZ1(7 zQry7wWTUXMQX=+lT>wDEQI%chP@8wgXv0eL-yt!(QpD;NA*t$Se_3d~2uX75Bedca zjhKs63!wA@KAb)@q%Ip7@(q?WFO&aMl2#;}{;ip)sG!Axy|e^?;hrze?QD!lLbrF3 z`Zr#kh%~qAvM>=tjX*BuRg#(iqr31+lnN{KWFp~VsoE#Z%Jw%07(|Z1X|eM}*wU41 z+;lL4JP5H2SOaVNe`ph}{8QhQ@v(e`aDQQA+)W-z**UDpP|E z#|dQp@P;tv>B2S$6fX7okW=+~1ZYjDQ+nv%iXKgyPwx(8Bru$j11~abl6tf6R}WMl zn0&5=81`+-JU<{v{(utKGWq85^KMk4AX2zs3jm=L0kNW}lxzb7K55mwQnr(8VU5`Q zTxW9V@9fgWe_rf`5MNJyp~MXnQX@QFSh?QIZl4CA-Y z-PmL1FKd4!0E>-FMn$%0&T`V*3L+ZWVu`k;49TWUe>BXlS5bK(yR6M~E}Walf|43~ zk*QXKElFQ`7mOJW)ut1Fbg+K-R(XQnXgHZn5YZ--Z3=!g!DL`fV_UkE=sIi}@JO0u ziER1Xo>}RE9PX*iwY8iEb`E++GeELx0fREM>qlzJfxm*phXOn?eA#qDkq`NkPfk2a zPUdz*e-g-92uSK-?vj|mbVCS!Z8aeg69vyA?$aJFoW4o-4pAydu}>TzhcLafvbI+p zLW8@6W;@C1L91OO`O+auJ#z@&!h2!$hrqM;I%*+&?T;_K>kp@DX7fM-G`&IhQk}d9 zJe`<)h}b^eDi;f<4Ql@7yJX#;&=sO$6`blhf26f7=a1QdM#|bg-6ZntY^x4+9y68d zv$^LL_Mi(nw7f;qBruEjD;vpM8||TEd~xSJIAq3U?;B2BKYX5!(XHjz#=a3)RJJxm z%j-rO^2+dVxiVe_iIk^qL0!;;V~E7#(sdwUZBr}SPEarX*_G`m4G=~;u$&??7b`L= ze|vQa2=^H z`~9Zh{0^JNTUgb&x=9n@ShI(Tg{nNo-cF^Y{(|shMRAx66Ga}5BNZh(QDWwQwj2Zhsk;(x7q5$1eLGir*CWm<~~VHa?>i8 zNq-08q|^JpO+C8o7_Pp#F-+Q?e?}YX+vI4`0PAJ+T6NiOgA6(-r5={j{<^gV4(R`5 zTx6Q|x65~^T~_m(?7`NJ?g+oQ93_9XzZwSBYT;n&$CI0G1FZ|;dmjaq9zalQ0Gp~8 zY{4~xgShFa&^Uu`TM7hqVsihyKVO{S`?T!&b!sJ#Le9$>jjkfPfBtX)e=5VuZW2r# zP@?A83Y~zL|Drf?zW6_Vt-~DU|4s1ALH>0TfC5L^WzW>W;bjuorGoLDg%co9S3xJ& zsXHWP=%JCM{nJ~Q!R%AgcIjGV{I&k7{{yzTx&LZ-; z&-ADi+L19n+HY>1zRQ_UaAm@*T@Jjhuxd9pF?elU1m*pYrP^PJf3Cf8gr2t3El3>L z>7fHW1JGuNtO+(qKY<}LdDXyeD5=63i8Q$_g0z1OZ5W;qrIG;7@z_rc04)|c?nJ(l zxOMten}I>W4cu+pl%Q6)(?%(US!#lvFXe7S`!B=M+n)qsnUzGIg!I=?AE4(N>}1j% zqWUpn{?Abu1;inze{PWxvhX10eO6U%{Tr{X+VY!Jn7U54trt~d2(qI~1O=gjgJxkc zmLh?(#=v`BKLzm8BQ60}h*ZH)eU>pZgO07{%?l;+kb}OcP2E4Jo#AaorrS5QwKA7g zY(o^NxICH&3fViSM6VdiX&uV>_``*js9?=#*e$qqJJs#>fBe~9tGdDjN42W6LW@^* z2E!|&r1ikbCD!=f?(bH=Utw279zyuO87~fx$aj#ItaWWkA@bboqG@+I;PeW^`DnH$ z*tKZJ%Gk<@dS5j^TH1%Gw-)&9#KfI^o$~H#yO427oP*iGfprTOc*A$wvf~mGVLa!5 zA`01G0Mb@Sf4kdk#J;sRP)2TjZPR1`iOk1x(0g6XYQpK*9wk++Ow(rM;2)InS^1XP zV5ZcHjBR73?OC@ss(PDuC+bzD!6Ku;dW}0hiu3Gh0r!m`h-x|E?6fB74({vspnW#iuAvL( z*Jr=Zf1kI@8dbr*qEsG-NdbKEmilS8Vb!#Lp}v$?EETDm0R_fBJcz&8ro79WOoCr>y|`8TEUWowIKg zW?g=*2h?FO*DH~kSg*^Lc#C5>f z5|}154*rrnF(y{a{@+0(;sKgDoFs(xf4DY9Visn#af;D-&{HE$1o!Y+s>(PByHLLZ z4iCb2dx~q#tedZbl_=E`%8UJI#CW#F+V@B>3}%BwO)b^i45R$R9m$u-`~L-a(P^cs z1vb1P-rBTH)d}lP12^)J2O)hzNvpj^Lc&eQ_;lc^u5LR1Mu&J$OXR$zv;Z_le+rUm z*wOxLUB-fnQA^ve=0xZ^@u|+M<0%4G<3BL4_)batgq=rE_8!REQ>f$KCJeLll!MnBA6fGaKT z?-)(kV4EvCUf4$Oac+*{g^!y3e=3`1Knxc|wZwz6_hW#*?m$fBpTt3mwfn;*1^_H9 zaQ!EB2qh-CFeHG-AcyhmwsV~xwuS3o9O|^w{I2I7*fX%~P@j@@rmO;9*~~%BlAdd&5L?Vx)}kf98p%!th5=OJaW+v^7P?3i?bjz#R?P{EU*)8;8rHf0=HDlDD6k z;*J`{Olyl9R}?LWjCqD7?~trKN*amaA`?J!)S3E}`D(qPjj1+XNf1eIcM~SO2mzz;f zV^XE}r(dk&&d#SloUn1AnNl+1Q&&e0?+1B`0j_@k5W<3gY&Nm*f9w#zK*V!&NzFYQ z{L+5fypDC*K1iP=RirU(REaF1@cJ?yi>hLXdK$Uw1Se{mH zpj)CpTC$kCd28IFwGm;K!?saN@BT~a8M9qe0`0@eG1dhD(-1E$F@1ns7)%x-k6m#a z=3EPgHZorDWB$d@M>aI<;*U9tLl>W`K;;1?JaaPrgE2dNe}?lcmOQ#ijUqcLzL&YZ zOwiZ3x$d$blP*!dy*)dy)nNEi%l_;}h5?q7(PiB`3 zL0$yRza}g3j5y=J@Q8%KOku``?0K`sbEvb;X2?%{vv=RtIaf2Wu+=5;^-k)}$-`ys zuj8}Y9fkE;e`<0rrvUOZxlvO=5-d0(VNtnD%LS9N-j;=Gb`VjrIf?5^M)%Qq0_~=sHmn)hZ2SZ;SE+kBh^)j1QVh-o*?F&6 z&qhomwGH$>xy;9QEau;N0&@RKr$fpWlu-vp_y%s^e-b2-5C!i!dEH-7XkbBSe^SRg zC0|@+=^fQqH4snFe7cMb#YAt#w=)-v_S}@tW4Z3NDM*{MdUMDMETAfM9_xaL)vuj8 zcJA(MP^q0!cb9u&LquN|E+Au7AyC}|j>nQ=3Jqchtl^`>#xpOKO;V80Qj@~)b2}0gm8nGu2xBFf5umPMFEu^k#uPW)TMX0&=(nL>%nr* z@*@(34PcVT{Jn()@JOM6i~~3w&C=w*%Kr9?)0%J9BmPAny{EWxgDkvU}g1 z@##@GJGaU_i8xoI>{bgKJP|YAoKNRKAMRe>OHV;p2_4d^9b%#gVo8Nu(qs1CF9ALz(BD)DE z*(`uZwHmSrzAf78W_F{&Q+--(f4aVT6%s5`g<1k*=Ns#qJNdnQ9`rN?5?I#sZ&nxo z_)Y}(7d@((?7Vain?--+ION&?Y5=z>rr{@ZQn%neyp88w$r8T=JlC1OBaS--;$pYF z{3vV^R>~TUOiWAS*vBe|5$&HjqPeizt0Fg;BecAnMA{#FEdC(&7Zbree?s3enm=>| zA$Dtjx-!mkcW=OQtw?6c^8(Ww_YUBp6w^U-KLwei!!W5bR6cvaY)KzxB;WcV25$er z*L_e^(X6iPUW}PEv>esA%p;;|DRd4Yt?>bw{>N3UXVe+jJoK~)ipA)N6Vk9NRPN%Grl(LwrrD(G=qKf-Z#yVQaT zk&rx|vtlY=yUw~Zqpw*z1>%C0f3h*>F!7ya;*57z+!n$>z2$<5{Z*hMPFd9#)KCdX*7RsfiM)prTYWT}xcJp7~jy=6jIXYojq}#h#k>k(&8gRHS zSYXGH2l^I}AMMK57q5=b87Kg}>ISnO$kGC-{&7`Z=&vUQRD^*5)q(4>5|fwnKx0;8pU#e_>;eS;s%ig zrI~XF*C5p<3b+Eru&e9b&Y042@>p>UIAShZ6$`lfAL><<+$|Ea^3AR`6<3*}A#vWJ z#jH}5#C1UNe+>L1onR8>b$lHti(oWQc(Rf&LVk($t^QrM0G#U?Cz&TMvu29D3WPFr zCEr(N=HU7o5A9J&IkR2t4~xi+aM+F3N2}-v+JoJf=rkie`5jV{1oQq#`0?YoD&DbFldmE z2-C%yn*T_5yxyP^e3nw{8BjUBXf__2`~RCvl$OZ$muENa(QVG~RiSI0XcQaqhnO!p z^^OG^XAbzXO1W!jmDfOlQOs@Rt(p)AfM|&!KIc7?ApMV)>wS+sOC2rO&Q-?zieRK4 zwZlK!e}OE@X~}T1AFZtQ!#wYG$C31l0FkTV0}|Aw4ccFpIc3XeB^cJEFo7mZ|-q< zxWNr5d}!1y?q2m^J@Nv_+_?*;|fm@sE$u)c+PS z1uHNY0tAYWav%Z6gvYNevD_MAhF%Of5M=+0e8M{J8iWvD~sJH%LRnvqqoJ z>b)6txAmhJWB9OjZ#W}*5GTDkfBsNk9PMiV)nAvP615Dh3KHn!+!*o|&;=)m)!Ry1 z*9(ysW`$!-?e^|~yE30N>L!1KPQ5?|S+}8cCHX=6$kQ}RU(9eBb2G{8g%Zc&b&gd& z0G8UqOD60C;?D`9)ixSzau+haYZJJTvLRs=loj3!$*ilx8vnNUH^@OEe=gPjpXh3Q zN`18@z`T(`!encguisX`Rbj&VJawuJL#0Vn5EyEY^>%plmZbw4HfEU;*%8)xM*@s- z$}_m_yLQv~g+$p;Y^XWJ%s%>vv{y2PL?c)Nm}~jHs`~l$QV*VSWEiln>F!JWw_{Tt zsZJ=9_h3*SYVT(EndP>Re($5}i;y_0dywQ*B2(vaHVB`isUVN=Ye2J|4RC`vvm=L?er95jF9Y2^cEvMqV+tiA zaNW$;8niRdL(;)=c^V}e%xxuKkj;GJ7?yP4%|xsdwT2`!BQO9Be{ZptIR z0t-55MAe&N>*U>4f9@x`4lw+%WbJ!0KxyNDdA{qDzH;7cbce)4nFZNPdLpHn5w8<_ zMz*0d5XLULlzzEC?{`7>eV{`b0?p4?-PBITE~G0!dd|KN|g^Le}Y0^Yl{#t!?QNXoiN#4uy+N3BSZCKe=iq)m>jpp$Q?{!L`eAJ)X&jdd6g^&@#q-G=3v8?Z5L)_~lnFlkr}}Prf$`+>g_ST|ggyZ95uEm8rgn za3vZYi&J0bu3SlU6;>?kjo5}1Wr}i00rtbc0eMdUxW?mn)L0;Oy*F8JB1kx2kHWV%76H)!3^-%wJ%QO4gM0K{sui%#)@Q9%OcF$`j}|Fvo|}xRz7qOnW7soD+5%HXIE9+Cw z{c*sh)ZPQz#SeK?Sc3$1f6RqH1)5;|VXdo?$^HPHJi09QL=ejFRFI0#q|MT&Pjv=O z*>r#t%V1q8Ol`m9b!s7JQVX+7} zw;*64Y4`Psxyn|O4N?#oC-$n$#Zoz2%p&+=D?GSo6bNG{Iqug5aTc~hX4hLC2{pXS ze_rC7UYw(zn@WtnXZ`gd6Ve1`S=SW^*QeE-d!wZb`|q6;zBuAS0b|$8KCleg7yj)U zbAfL<)`OHkAFx4S@J0$^y)be?(_@nNjDCC5;eDCNu){kcCh_E;~P7bJgfxOJUYrbg5H8}(p48Uv}z_8sg z^=7J)L>8!69(w$XMI$>;Kh010CypRtLiQ`xZSV`8Ni<|qn<)|{OEtVhqh zA{M(#K;Qjf;ayqzN{jP}naB2we+P{M5U`YK3juY?IdLK5WsLKRYg@C%%QUfwkRXN3 z-(LavUIcQnA1adxAlDAYf*MWE1_K{t4`{_zBHuQf8Hm;W+>Ju2afR2sGce-UC&BDzH1 z{oiIvU9C84<<)fZf$}d*d{%P#FBzFj4Zi$@gU8}QJD-}jctmFsS9AI#tkmOtx_!&` z@LR~&8YXkdyHA<$2hno=G}X`H5GhUzslxZqqIZoI8O`LNX2^6`&Ev}aqCZ9D`PAy8C>hx2@BUl z;66!|IESU_3K+Y^j|dsX`6?W} zX%g*EBWc5WjiA-&;n(%yNh?WlAo>O{8M~m_(L!{0BKy4}=rvzz1LbVEC~*7@6Tn&P zlOH^(?FR?;t%0L?!^ZfGV!mL&Bv~wTiWqYukwZ*U%MfT+e?fqA4DM^zSsRDfG6AuO zD7l3^wh&L&WrARh0%Ek-Wp+m?O74Yk8g?AjaNnVKra06AXxJKh7eReC0NSzJOH8I8 zsv{PGj`&XRIccV5we-Lbw4hiA3ZpwvUcqvg7>}NQ`_oh8)Fq!!s zJrv%psjju+e?a%QYf9Sktl-{1>qv0T7qVc+tFPTxo=BmaVw2x}@F@_Xn-q1RYO8t< zil3<#IL!gQyudylv-%_DyY(6~D01G~G42v0n)WRG6CzKoU@c{;I82)2y>-8l%P>-9 zNxFpsS~?vFd@CXX;7;e*bezweS?$3-I_VA&{~Qg`fAkpT#AH&1TD$+3_`?qH*9Bn> zzceZ_yz>|4K;vhfMQ9tq%P4|5X>?xU>&drAaj3lq;y=55urH>nM^g%N?f({9@;6f? ze!q1UhAZqYrEhtxm^y;M@L^yf=)gqj6Nmu4*_xN8?hCO%2oj`-yubpfUq)K_J$HM| z^~@Coe`TCPjM=N75R zo0N%%m4F}cl}qV?@n&LGf%P06@lRh>u(Ckse<)fgzbq40YqLYeQk@hO`x9kAcyK|} zS&}UqzOt7si#9x5oDht_@~M^91)$oR-7NwVtwnvM0z%IodvJUrWecjap6e4f9|3+H z5tio!Pc}y`|4-T0U;9OgBf8!TLUoD|iun@wbNd7*+sd(rjrziOmYF}Cotld3g?!2o zf1a~5Q?`QA{ns~cB7+MD`2kj2G}Ir{{$~6d3GKKRrsr+QUUe6kOJnkHm^og=7|m4#7S^wHS0sAf9jfj?pYVg;UMr2+`9nyt#m7$Oj0N|?#hMN zgO>s*wS!0mhR~(C44Ruh*oj&F@ z9|+|}&-^JAmQ&K1fULrjdV%fZ+`{>Et*h+!$JOH4v1yR4%J4}>$AJe5kRY?Re}-$K zti`M*4FGWVn!QEa@t96-k2#2N^q}nK)&mJi!T9J5&4sU9Uj2;|q&|Fe8prtuLRZP!m zYQps(dwdhxUaDP_7Q&(jF@1gOnsBI@_cJ0K_5N9XTMq)W=$V zb^8&UZPHK?waeZL`wQabPf{9ff=&!s$f)~`-sa~VEK?W~9aN4i+-F>Je_CGj0ued| z6=_&{y&a?9>v7Rj_(^S;vvps@>iFvPumH1pR2I%$X9Z6mhp3+&xsugNODee+Z=Jj$ zAD1K478+*IB@v=<&a}_aOL?(}9Bzb+2j~q7(xTUSXGc%ad{{Fgn2eaKv9c-5%dcZk zcLjcFZQ}(#I~0g8U(-&!f7pfeteuBB1+8Xlz6>X){ET>%?Vig@CNbS@_&};di}@fx zQGZGj@NwRDvJEmSN%@w?~Rjt{CmYNQ#YdpZq8OP5)IW`n`sq}k%_|AlANIq zqnfrQ^_?1!XTM(diPls7faG9c{cX58FOG#T*YHbnWeIwZE<1JApyBiw^a|_N$Uk*27Y7G>;-zsR6hyutx+-;iNJUj?iHpItgdjy-R4 zg+gX2^$EOZ^JU3YYq=P3HL2aJ_IPi#52)FE0W`0gARJiaqM$MEyU9r^amIXdc{lm| ze*7`B%rw4-zTIoV+S<)G&&v!@`Ftb|Bd@u`pj-Eg(iprbe|-g+V+wMsNU)uzx-!%K zC!mhv;8!B6gL)mll!0AQ>;1On{0jfr_5M)oF9-@QUMw<5uX=d3=nw5)g(-q>WKnr= z8}jRQJytGIKNF|=V@w@JjlowbhobU~uE}jm*2nW;9D4=*>LY~MDO0QY2OwVjUf{lG z6oB%hx+XErf6q>)uT8aMYIEuutJ$c17!#y6YHE&iizt7vODiPcV$J(`Cv33`ke4H9 zRBxI+C?FEE0zGDbcG}j|#qhCi@W+P*b&;Lk8s;o32+z^J<=pg5fjl3dt`x3FwP`<@ zNY)4hIa-pn$TO&Xo5N?Bl9Sh%7d`QV)>}0L#4}orf7Ie{odju)mxN?PKyID(lw|w& z+8a{>m-T&sL&WZ0o8P~Ao}-B8s}MONl&k|mAx4fgcu}NY#v8e#|i=W?3zA$@Jrzt{#Y-|s5neIG>x;w#!UIyS`Fu!EI06egK8Hc?Kuok|A+?2;D@%B02XD%==X^Y+ zXxy)|2;H!VVF7p`$rV&wn$8Wa4qz0zpBq?BowZm9>MQq;tr$**fps{Lo{OJfL|jf0 zg427EewgVzVMiZEBSgz*CJibQyy+d7uC-YGe>$Z_`TeErEJY{vK&h-rK0LY*0WJJ| zP_y3Wi%RB3t;;#C?sr$&>1KO=f4q zY*4~Ru}_ zf4B^va`sIUuo=w_x=vr>St@iEx-DRnf*l@In~-P}0Jldrphl!n;mKu4`n)5Me1=GHNn}pF*@j>|&LMi`H8ojOEdWsfqNK8J@(1Ks*lGcI=Sqd;ltCIqhl|k!4a#C+} zJ{e-r?OW}oc!6E@l7t;h0O*e2me?wLQ4e|{%MGokg^ z=ImMqT)bk=CwTrzA(Ic+l6jpW%n#fHWa>*>L~L7>(e`y+v!ed^TDE0mY-n#qW?bue zEtt2>&v2r`b=U4)6)go^r=f>$i{Ge6^<>%hM4}$p@SE$J&Q0_}d^jH;LzIe+&dR8K+^?N3;9t z%tprT3zDt%27=d59-FSEI9@^DQx z^BFcz88!bSC1Ivn0E;{>2~O`ORUHU(#L0lzlj-gCw66*S-&mV>j>kD`6zev7`SKV4 zboL^eY6&|YB^+mERr9wU?yo75$fm}uzQTO$+Nzek7@{WxHQhMg73asR?>oZIMy%lc zSQf}|1&1G8f2}hf43rf4>1U0h0ZJCoI0LRbF02c~buJyL58_>eZ077R56x%0j50f% z@l)xfbrcD4f%BNC=>&M?*FgKajOd)3Gyf$VBwjO2rh*hqvTRQ-v@?E)fKo$-6XT1j zi$>Vl_JNRK5gSBejRWJHihmLZxpFyteP|{^NSP4qe~X!=P`O8(e-)~R6DdR4aBzx} zJqDFddmq!}&-RfA0KSd2cG`3?{jEN*_LQZ?f|7=nZ3|e3{Ww9gw+ZR|1=- zGwk`Z{>j~}KA*gfUInS0RZ~_cqgJo|{a|Jvlk`x~mW;hvE1c%YS)7DWv!ptiyg)oY ze^^NSI@7?Kg+CgVE_Z=dTem1~pxMlgo1M`#AbzB!(RZaGsfXzKsE}3RPrNM(v~o{_ z48DHD8%m@z*qs?mOSTP*sK%HNJ|tf^%DYSeFH&w-k@`M|u&~gQ z^T;yQ*yR{0LYL=_>;bcLgYBm9f9)x@0rXk8RwNJ{tpUs}^>*1VM0(+WMq**azMR+H ziCOurTXh4G$G%0_j`{W`%i#U1btFJ>Tb++4m;|Ti%i+dkHRtrBn3W9Qu$}Ic6h-EV z&>~t__*U5ol!T29s+wRX5YRINYSYb1iZvrfeGU2k%C-#vRB8_b~34pH}74#ZfSxM6gkpx1wt#%;PeqkF>9|=)UoDvTkD+xsP6F$ z^_I~3|Dv16^hY_bI=Y8*HMwT=1=IpRZ_ z1GtWW*vNL3vPHFF3G;!Pf7e!|2T+;InC79emchnH>%>R>LIdLfG0aSAYYM;PIK>6w zMiu2uWwY%|azjBJ?s{4PCrk>OmmJB1nc}Tt^M632?ux%#sloqxDCXab`*}CCNp~Jj za#>@%2nQl^E%=E>T)QGujjYya5P;zZ@!htiF-@(lb_Uh`i2}38e;R^8*1B4v4X{&k zne`0RNYXTm8$>7T5?dIwSzCGJ3S8+@uayWob9(ls%`PAAYj-X=rY?xL9GjaVj)1Hl z1zGsDL6-KfIf2~rz<21VeKpaW+j!B4Xm^%q^B|J%X^Jou#7wevi8!>MFTBgr&}*XZ z23&bDfcL#iJEKl0e*#O$XQT%JVE<-wEJ62DCTb%(Ff*S|-7QgVWnK}{9*7@A%eFK) z?Xba9^-5Q1p%j}WH-{py4@^I*Z|o?7NMNCPXu!zf_}bA~*rd7wV#)QP>exJL10Hk4 zu!F2>2OXMTk;4``-aL^XUc#v%HBjdZoh(b{yWvrvN?X`5fG+^;oT+0n#DF@S`wq1a>R}b>gAYrc*vJuN+lS*-tNEWBwJp4?Jo5`B}o` zFskSZLDDXKf7{#1&E&#d#t~;X(S$FpqOk{MspQW#Xit%BE+6RRc?U|pfMs3~6Z`G` zw=1Kq)L)H^e6=)J*=!-5F}OseK52+G0ebFMChsntAcF`;Kz&vpOaN0frk#Mn}dr;LeE8e~}_u z7xoNWf9J`D2QR7gi${}7h|gngvZc)V`(Kf|4%(|Tmy}qjPKE9W+O3Y3VPM#=M|T#V zbtF1GHw#uBwi$EBW@iF-77@z}vYF|J6dl|Cm^RjSu3Ro~skeiO9Unb>ZJ=yBC<~r) z8k0BO8z-3BMJ0%(LcB0_ybst71PRY;i&NE5f0-i9UHkeT9KJ!6CCkGHL{BByO(2dX z??@8dFp{naQ|_#9Y+uvXssl{O)4N4*ZLPE%IU^ZWMeuS&!<4!@5uBV3gYw<&?z1 zfBn36Nvz78SqG?i<(VhUYX5gZoD`=FKOU8WedfKTsM*1$q#k^Y?irZCWj-=4ExUld z`oAb?dTRw~!9yIdgLkF6qZJsrz6V1>KU=DRl{r`u7!hrWaB9 z8`!KY0T@JwxvZA%d-Sr`0n4!MhO&U6zAzQ<7`Ws3V%YJ)Zzrz#xh9!Gf!?!H zh=>>JHeHQoH;WBNJil{&C^WxZE|}cH0DrUc0H%{_E>iR#Ph)p2ndSezs4aY(QMG(L zoH*!BsQ}z&X=#!edl4O!5H)Y%$$|GmF6(TxP=(bI-F1xlH_`v8v zq%Op+D0apSr%xg8n?yduodS}*YkCVB4mSB`+MHdoux%4G4nv$=nB{Jl)x{{zDSs=@ zsW5AYA+YhV2GQ{Kw~hY6x__e?jIQO!guRK7IKLIx+vlzwipn$lHK0V>q@(A4#>9(W z0q!YXcgG~XpDU@j)jT%InGst9kPVK3^1v z^IOCoGG%wVVtXA7l}so0*%h)uC4EV28ccW zhcgXN20%0Xd;^<~48AN-Y*~zWZ4T_G+gW*7@Zz_-_4NIpHlNWW`vX_j1%Ld4vR1*n`DN5` z{Av8$IE3DXVa~r6Tx{(@=?kUA(qerSN1)ET*?+in9cUkb)tP$B zqs?f0mGZ#)?4@hBvpfO8h_ZH%@DoINzKn?f$r86NX*Ujo~fV(dyW=Dj^gN-`YX1#Q<)-~ zZ9o@P@Pm{38E@VJ1t3LtylA9AjC?qvXP}{SlqB*rYVLPZlY3bGt#GQ_9ph+lthRO! zpd%=Wwk6|+zUAVe`e4N6VU!CWJ z(|VRw%4%#g8&GDNpU~7PuDi-o}Y9SL7FhV{0^tM z=P<=0L~aN;Jb#Yvao6DIXMvA}S_Q#?mIJD~V|Dz_4-=2$5WVhjfT?#&_*DH$l7P3s znFLCRUE@lB(5kS*D&&`)$_#`55iDBY@RGQPLZjT395&fkcmmL3S~4Z`5ME|C|1SdN zq0+2?hxvL4hY;!Qhbj1&@Kcn27o<60`MwHaqAze$ihn$?vS(MIp9?g4ibrYf7ds3| z=t-L(kBQ>Qb3l&JoPY(xygR)(J^@h?k9b9H(^{l6Nva;cGKnNeCW_3MrEc?&xg2<;bH*$<` z@!vVbNb(ORq;z-}mMol0Y&f+smTVfH_#K|CuYbEi;g`u!SX%6+>5DOE*|aQhJCw?4KVA9 zGJ^`(8$@ePLG=xB5=WIYNypGgpL&-;W+~&Vk0oyhE+x9Oq7B6@-WfWOp~*ppj8n54 zojXdmr_|cJ<{8+FG2nD|HTCX3-PceM(|{gBOcTn20g)`}w@(!-{HweVmq(w_$Q8JgaeXNuz}28VENHzC{7 z6j#;w@dtkXMejyLDS`|FovLbYTGmYn9)EscpvblI-rs%-_7I#AEK;rt9BP9p?tf)Q zc;8AIhLlCWP2`N9DkF`XVH0V)oCOrSZOgRrHL^R=-p&6ZQ{w3S&@{Q43Phb$>7fu4MgF z0R6q}wt}ohmf6Jr?Uub9=kN)g!4YBcT&V!?pla1Y0i~*E81q{W($x^5iQ;-kfq^Ji zU)eVXe8O1Z#M^Oa1!F6?ONXx!%=FoAohg}6Ww`SBDGb)ts&9DWQ-#cY`p~#%Ak27& z{S*)@WAhwaFNCW|N`0Vd$A5O_t5udTd>^%_Bb^YJZB-31RY#cic%bV(RlN zT3%0vZ^B5N)L*YN`8Xag`T#)dD!E}szFVG}1e+pna_M{gS544eMSpIgToGoZ!{ub% zz1<_bZ$);%3H5-^p0KoMlx}Lzh#U^b4JrRxEK_fHmqjakA`I_puJp8?A0^*Xu+f*L zVqD@`T{|9NZMxGYpu9!;yBHxHgKf%#)&Y{O@!N~tLrjzfvt5%CF&f4nmW4AwPJ9;n zbLUDg^?kIP|4}Pm(0`jc0PgHfmmTJ@<&jVFT5j7uJm^ptTP!{b+sXr{zqjEH^E!p1 zc_IVDJo5ML0T42B7-zDMVWyLEL2nfc-bWeL>HjzE7YL4aD@MKYxYa1;4aBS!gDex5@MD z_^<3`JQFZA6>~q{t5I9mT?Tq8NyL+yY)ZA)6b!b*EmVzuTIV(5GjlppBx@hzVl7kl z&?+DV)N4F15L=3)7p^A_ug(VH{{y%{+g}9fKq(j!&Hr!smpC0pSSu;ybReSr7KZx~ zBvwM#M4Qsdb$^URu6g{~fFxbj#t)rY^{@RL9J1dRZpB^37%efosc7kdp#aiZ4jNn+eE7$_{%)D)lA$IAR~qZN$wp z;{E*T!$V>*Hqp<3P-zkNB|GrAuk`XVo{oQ?(i9FHhJO!;J;{&OTM?oqtByouW+f>7 z0JOCz$)0!h?3R&pltH_szwpA(9_QVs`Hmno+UqRQziXFQX1qQjJu=`;u{BA|4@>Bz zm$ap$8{63+rn#)zg(8P;A;AvLZpEcaM>JEU1FsGX^`tmjZzDtYrk(=|#~Fhv^rZuw z_KgnYhkxN}o=rk19fZX}=193z>pN^E*UBO$_bEqNl0Caf$jlZ9EZ>G$?M(y%)!IY8 zK#8$mx(cgf&u_2nX~6}{{`ryK_IU#BZ$|nq;tHENQsd5ZG841Jif+HZex;91MF>k_ z0>U(nYd{H1CgI_{+J0)IgTxLn2^(cZ5|T7@zJGz5^_Gt{hdk9FULYQKlgp<@PO}uM z;#T89b`6!WwFWS>_DJzRCg_a1UVSOag-*y^U3lL!gHtXXkO`w(&{K4LiNxDF&@PDN1B`C& zHGlcYZhK)r=Y>&;Tf5;%;NQSB3pOIzlvu_Mm?wE)dy`XEJKOyn)#=1K?&*8ghclqn z>fYrr!klkBcdKil2dq4%X~#D?SwN)HtW}3YR$OOD503822i?54u7UnGJ7)vKR)W^~ zRLZA=%{pk|tJ3F8VnZ%$7s{VQ0PhG7#DBAhU)1q>IHDh7N8vJ134{FoX<`M6L_m${ zY4I>A5c{?OWT^Nns$I|=aR1`Nj^f!lno7eSz!-HK<11~+ZEXB*keyjnLUNm0I|uUh zG^*$wS94AG7Ns(hso$PO6e|fNMjUYN8FE1Nawh{7<0sz}#7s7j&7fcoZ~EyO)qmfh z`oWh}P8%cr(N0LXF0%M;e4J6clV2S_qmpaQU|~v-r<|#@@42Btzm+Hwdksnqn6La; znAEXTl{{2=o_Nfv{$dq1>*27g)0n)=ia6*2PJ*eo*^{QwNX$zmRBI8@C+es80V z!Xo%RZtNj1yJ_p~xQJO7Pn{iiSblOb1-3J9c;~TS{P|lD%H=|3I)4P_DnpAy&%iP# z<(OXhUW^7b4OhrGsFF3xy{P~28rQv@Zlq^|4tq;fFHWqTU!6SER#7FyE`O&Pykq0b zIWm47!My+?T=Zh&Ji8Sz$npSwG!(k_m$l$56t|pd*P3*!a|OF(F`Y{V)#01_D zvRBgzU~@xD89km9mPqLQ`{in27{B>tKromBajga*!&_#*tltv=oPQ&^?_XCiTC_ts zG}&ZD?~O0%Dd}M~O%E;E4{}R47N-KxDf9!}Mscf9xwWCv3g4{xP;*h}h~iROBk?Np zM=ELW7}6z~xp+3Rv?pAK*WfI{%v^G@tj_ImP|>aMSn5Lbt{GP6*scT-$-aUepMpM} zrp}4mj{3{oj!Nr_g?~`n67r|Qg)SmT*!f~ANqYl$Hz(2v#bY&z+&-!~M~YH$R7cH~ z7qO>bM(4wQ5J-b3D)BGFBM7ZY4u|@obN0AUecyb)cizVn*ECTyz_1TGasJq*W}aJ9 zbk&6ktO0AMKUdWiqTXG7X9?<2E(t}WTQF0ASg`Bez<4NcA%7X7h^=iB_`&u@_koT6 zUe^k=-a0kRR55)DE8Q+|xDM9*y9kNwowgIeDtELZ0?HYkt7gKI%B>(s-PfnIX!W5|g8nYh13kgW?3{U6IWGf5w&o zW73v2Dd@Ea`P9-ifRqt%6BNL&zk#=Xu0h%Jc$n2m9TLiiI6C{a8WyTO9M3OFIJs&) zcy02Oe~w6_;?_1?syWEkq@qD_%T6SL@VKX0`k?R8YOcBN>v>rLliUf9xHv%w~cgBfz z-4Y4UX@5farky;aGgZ=YpMTe&tjqM3m9wc-AVUDx9Qe6706&B@tBcx=O_G6B2O9n8 zCZiUm?g58nvRFQ@YvMeQp?~{Y_abShknwLl#E&B+#sN)}9l}5ZLDb|ck+v}Ch*RjI z)V=z21qMV%CI}noEJAOjF?m7i@jXL@gu{)pU4@m zXoJbt0*A-i)@D1~5;P2#lwI37N zT*zmIyS>fKgc#-9{0Yrwv)1$&3|aD>uc{FyN+>$50*N-ed9Ve2DO54Q&4#E<^;@j^=1ndS3b)@pja-VBK5NEY&-=V+GO^ z1Qi2cc2E6WEJ`m7Uylt^%)r;|If_`7^V?cuX9fYb-M=Bwm_7r9JyEI%w|_RUd4Ka_ zatDbU2M4BDHKs0Q*6?+g^S+pw=*){H#9lXb`(SvXTMqOQ-HalTkbpQ%@IVVWk9A;I zeXlX=Wy!H2V6PeZQ%Y7ME?%&TTuMrE91*4=FCDD=oZxQlU;A4+9WRl4f;MtHZY2Pg zR7RZQS4ZyUo(7wR(}NE~?AYM0tbgy!LCd#Ihl>!1ZW0aC`(TU&(@omO1hVsm+V~Wd z@Qv(bx+XU0Ct$z|i(vmV#+tD5$J19wGtrBb@%6ltX?fo7qY%0*iHgq>%0UK_I@jqY zdCXr<`lPzC^@d%p@eJ)@;d2Rdc$rV3d)8^|v>xo#8NF9hTaMZIV8lKEdAUX781&J{TjF5DK$v_!mt(+oz2@a{-<*O#9UHU(?@0k6Oj zSiQu>)7BLQlm>$G<}UmF2n2YQtuI1~y)YfZk8dCNtK!B|B3r$3YBuU2-O@?fGqc*S zza2X+3<_}bwJ^~0i2`~SKz}6yP9`#@Y`tzh0w?hsSWa%HlhZcIo{Vg?bo@3AwAkUn zBeLn%JN9sSd|!tbHhDo)EGttSK9fLn|9pDT_#x_qJ2^u-sLXGQBXvBlQl9rM+@z}x z&0IZqdbw3)<^q(m$LF}0G)UugT5mgRlWhL;*=?lDB-5*?#+M*s(|=8fW&@L~FZ8@> z)9&JJuEB*Y#XjLayo&EgNE5sGctF?u7Ms%4#FX!8Ko*<`FJ>e;%YOBCCe}yn@DzZ- zYo|zeYI2W-G8ynTuZzQbXNQ$4wcT*N54O5gLxPKWP)~i=blC|)sUBE+``*g^AkJ>vk6-hY0qh8M~FY+rm4vFz#2Ph>O4ffm$ z6Nt)%zNUZD4W?E~BzB^-28K|qlRCzS(o3RslUEyw>phxIt$)^7&{C<)yW}mxtNrLQ zo=>Cd{dhP9#56tJiPrUy>pZ|D#`HpM*N7{BBmW|j>hL5su(N4`pQd_=2sBYQYs3ZN zcr;9O{4~xli9Dvguxo+)s5m!|O4bU|xk8g=*anSYvaZ{rmhMK>pMl9zd$ZK|t3 z#HJi=3a3Ti9CD|dOmM*cCJLq>W`iKfG;~9jkBbupx%0gkSCs4r*RM1`tLf*5V>zsY zcI5^xNURiBSgp#6EQ-yU-ev4@f&6+`-`kJBP&8L*su=8_0DngEow? z68K(}oq*Nd6MY^c4q%IKLAVHxH`VnTjX&L`P<^p-Ne{K#+Zda0KIbU;ZAJq3XfG%zM=heP)(3%l=zdDXjGh!9jTB)F43AOpgf4np;q zRvFWp>o8ezDZL;-o)scxE0^;y+}d0d}KgnZrlXTYqp4w2em1Dq7>^Ex8NCNUXLqHXna38aCmH zxmw+ezdJknyRV4zX1P;=|Z#giQNS(JNk6y06BlCQIQZ1h0pDDOZFZH3Pv7v8~ zTb0{fAho`7a?m^xXt_HA4~~8f7Ntim!F08SNODHl)>fwJ73Vi9TsTuc5Yw!W6@Lnr zzJR1EpNwHZlBYS7>&8PoW7)yIkQkhq)-@~=GUIjIe)EQzs%jLVJgkJmN87Mq;}9?3 z&*$=vgZ)OBc~l$1sWFoJ+te)J9o~BrjQCHPZRpA)9&Lqw>8wP zQqg1o4pAPgZi-}pE^_BzI&D-gqkkZ$h*n;ckx`1u9{Fzsjx?Png$Gb9XM;lpl*Udj z>SY863=3-HoT|sQRoI8+*duP|!phgTz`+ARV>y9?SkCw-#6^-IfdbqfyuqyJWs)55 z+Qwof!IMHXH?v@m~GC(;;n@ZCS`T-9TnqHmJ`MVt<*~$X87| z%u1japv@jU9N#+nCtq2sZFbk9sXC+I3IY34`Ii=ar;3tM4YmE8<0;{KZEeg97@WA7 z7qXhB9l^k_boNsP(YB3YJAoz7Ql*xmSK^tnvzzfkS$tQyp@RJaFB1)5RPFk&E~hOdY&!N()Ejrs zqNiEO14a}d?%%jtR_srDsW0_nP};2;ln?qlGc)*vJ2Wbu*k4y|Gwihm%jEMf;m@ew zg4U2WTE9(n&Pc+|L1H8iEH*Il`ceJRgg5zfR0Z?o!+N&m6*7iueSbi;A?3JdPv#VV zC+kq!g=|7WimyLq^`C&NZ4v$E=54{mc5Lsm=a82!AWE>HHze}5{t_AXx7QytDd~{| zy{K+RVl4Tc=Uq9=57XG@t$3Iw-~H|Sow?TF;YTQz$vmPt(qNj{r77)c&#GKa5*Cr% z_M2Fxo3;RJBP6l0Rey5_`PQmeZBTnP8|_+9vxnvKNUny5dQe}tKgwEoDnJbV8gN&{ z#2Ki=a#Z<=`MU(G%N>H-eYT=pGFx^ih9A49DveEIrY$ap#c7FuEwE`m=G!Ho>mm=LO z1JzQ;ILOVwt?JZmf9L!cTLHL=?Mk`yY!|G+_jM|JeoOzF=$|rcyvlv3nizD~59bQ@ zI?1M?vSQ>CV4~N2UwaQh+p1$kr{(R20u_G$e&iY%1@j%2LScn4A)7WhVhQYBgt_+a z9Wsz&Dvc)YwSU#alPgv)Ud`JI9iV3>I*fbmsO4DsCUit`svw0c1@rhQSGEC(rQ>hF zU@6nFERAmM1HU8bC0Uk&^yIqdYY01Hk;fF=CQ0Vc)1wY8|5THBxxWQGHh;E|NRcJDwn&=iEBO+6m@qVO5(dAPi%pl*|mv#P9U z*08^ zOCfVA)q6AjcEv68pYdzFH1vQ}8jK3lqY{7aDW!5yciUEjP}q^9VOYkD$(hjk!LqAX zbAK`Tv-vUToSfZh{2;A`!#J|vMSLf6sP}Iz0QT%l?}nwhtZmwd3zhpSUY8{f@Bsj% zz{Qyy^vLx?WHB{5%OUEIu6(Ke7A%W+4G97ti~tfo2fki3dRPk;MppPHTv`WAi+!p!y&;x$K)l3xe^z0w8X zSdUdmDpi;n7Uz< zB8X4z!TBk5L(+?5p!VIsW(NFa0&5Z$?ZMCDAS<;J|zqk3%$2E zh`&_z+f=q4r0SZU8Z0! z0|+CS9S(TAddlHf3JGUjaJf_iLDv)}7G0VOFW1P9joTQD{|LS{YESjB^?x1%GrSc% z5YU%(c(!J(waaI>+_`F&pytU*DML5BKC4Z=N#b4eR;2*Il2B^G28R_`7;ptiRC5Q0O6)nI1!L>`QMlPz5lx|Upm9F`|{ zD}eKxEb_>}bjEnwCfGYqK!0+Ps(YP(uMM5LYuE+w3`AgKn#l~I=*bg??gL9~FL(z7 z2+7*?_R_!P_(nULqwP!Fu&Nty*dui@c8vE(^1K=AEjM5fF>)vZc8GVx798J|Xvi`a9e)wnL)WbsdP&4o zJCR_(b^b#E;c|^x0(yk1tx%#yDwwn_|9Lu7s+Q)(Swy>)Taw=2o0C_!#zXe1>6~n6 z`}ncX?w>0J+)bQtI#1;U5oe217O7M)Ny;!T)`ap6KSvjBd2?)y&&Ap&0NZsdl_V~p=v#l}?qd?I7DlLli zm?*k@jTn8nM#Jb4a$8wX9y(0zsbl`)U_FnvPc>Cb0fHf+r`TkR83uX#v4xZu#c-z+fbUHgQR^S(KB8W;b5+(#b-uL4ISX z14UAnNa-(>Qfl_1%>AnC_W|BhHAt+fLT5yyvl{v+4BQe(H~wcSH4t*nbl0-fdiUFVVLzH?OfP4 z^qrI()Bd`k!fW9?=cC5H2M6D1^(hZh(|l|o?g-DmedP900LpmekmybKfq-0STvc*Q zh1T1`?(3DKHblJj`i0F#8EN)i@jVL;QBC$WI+BU9r%D>Rp4C7Q`Ite?u#M~ z=`St_NH`}hZQ8)D2A>TPY5zQ2C;sUOB|%YK2A?Y?qG6N{ELTc?5{yo$2z*f_$cgcp30Y zfd{#Wp0VyLX6k#uJ2ph@zB4dPk|d6}ctfu25o7|f1BEtJ_RZGmAj`W|rGR3cG?4(S z2^26;%IvOyekjX9l?DU{xsp8(X;p|7BOM`>vpeHVy_bngBRth*N%-do+s6X-8|TN= zUw>H{XhwxW{+Cd=8Hg?g#0pz)^{;Y+u7hUJdrl_iaiuaU+LM6z**isvEX`=kWhV@i zy{-9`2_N*)A2i3l=w8zi>P-8<-;YzP(|J)C=7P!0Nsl}s&Jf#HFhfVB{a;s1oNdd> zX?yyy;FbGHHpdS6adn%iX)K9(pEV?nn}42&imH(%n(l0Der*&|4X4*RX>8I1FfB75 zoG0$*Qw!$fBw2MzIRE`5o&VDFF@&sP%jf%rwW1!)ogqjGma8h+RGelz*s} zwQwDDz}acOfUbh1<=UA-g@uh)!6T#x+htnxcB^#5Ppm9rDg}!zOB_tD3a?~2 zBkp#}mfkER=cXMjD536qqq8t9=|3+u*>>T6FGGrq^z}Q3P6o6$r8op6=wq{yRZ|`H zZ_HyenYdE3J!fFLZKo$mH&cWA<9|K*WDSlPmfSz(RJpW~o!<*x@-U8QWDje?vgY7? zy|Fnnja=x<40!zs-0#||*?M`MOqI>3lpM%>ToPf#h!r%MeA{z%8fPU9B!67>X@hmA zC9kU!<8iGv%TS^{ic7X%&I^pa|2e8XTR$?j2uhl4buk4TpS89)s7;brrC9<7=USUG zK3i*O%@D}Uy3oj{QVdPXbr9SqSCVi)7t#`!xy4W>g4+f|rh4Ar{) z!A@7b)BZS%`6qH^{i^tHcjJT>Hq@9qOXp_Mn$G8Y36-EX1n09E-JDdsAdhp5v!uPk z40Ezab;J^CcKhTT$wLbXq40Og9ldVfK0a_euYyoscI zXu@IkkT$1fb05lkz#EnyUL%%(*S}QX^VgPhNjD1bo+%13NGjJZ`;$w2D*GMU7YTuqCQmuNjlI5;h; z)}FG%uLO%xAQ_SqRDV_<4O4+`_;KF*`Reb_^Q7rV6V9aH?#bef%L&@R;qAnSp30(5 z&>i=42R(61I~`aMY>X{)%~5_$vkjsOl-4Oq#b69J5X71`_uHPyXNBOGVCR|7^Q2Zl5Gq$yKcMM*`RVD;+BpJi(x3L zSyA`@MmOzdS+p6ulZuG|>d?zso>PMuO`0aQ0z&Z6Le|Da!BSz{u4M(aYP&^)n+Q78 z2*Ry6MKhFw$$zuFNep}n z?E)lG-eH2xzw-%X2|GM&$}7Y|h)P8hc+gdl)aUaC6Mu$?f*;Vn9}iI?eBpB!ccV)4 z1!ve(rnfCT*oEyc#j4} zBX4*o4a;^Na6#lfH#i{=TX|~{h&LXxH>Y!zj(=$+`mE&qsFTJb>_wgwq9kHr-YoG(kbfn`p&I4P(;L^TTnxSD%G?79`%nwY z1=W2n|IpW`d%^*lR6kU_f)b7yz3&uMKb-El5PMGf_E+bwpZ22)}&&8?4Du3 zyOkq=g2u!5o+ga#VLO4l3(9z$Aj-TN-4G@AfpM$+lesg6xNG@SDRPSvJ6(fsVDQLw zQ{7{^EfQDDWk-Absqt1iJhufcDoF#+SjwRW+mQPW7?|9vVuP$(oiD$_@#lLfq<=l| zb7LR#*zA+4n*VxQ@EsmqJTig4nN0ke_HI1FYu$GVTEku(JH0JSK;%~sG!gBZSaH&{ z9t#CKY#`=+uf?t{3?`b?a zU{p=#X564z4MPQzWOmW4$h~FmIvvXp2v1bheJQLQIF;u5TjNRhGBmETDLR4?{NOo{ z0TipKe^ma4hy}YT#45I5p;XAKJFgr_PWSpD2|6sGmWy7(^X=^$q&8hU;D2EsC|%jE zj9q)ii$b>i4c}=&y{yXvlMG>kRlk7G)3fGerYUN+WDjD@)C1I_YHE2AmjS_gZu;yl zf`?QuPZPY=({+(K^=Erl4ocVCdu}Yx5%V@#I;5LF0rWsHNw$QoRjY8oUx)Qq_-UX( z#NbvA;8Moq2r;(rgGD|$|9_GUaH>2LjsZi*hWJFV9d72t`7i51LZ3|~*e@HCOIZi{ ze?(W~TJvZ<692Nf#jXe24DQ~7rm`*z%q^GBRa-|rbTP!+6V7MIm%h!-Kg56q7c#lY zJy$OPQ@OA?QE%W%(B26*-_Y3*93YRQJwGVixkM|bl_=k_VfFy5oqyXe4#h8Hxbb~q z5B~b(f>YcQA}OMW?*jVQ%(`w|<|+Etb|HyD;xz1b-Ql2Rkmuj1W5DrHMM951AnDCR zA*&oe&oxuKA))tBDKc0{sa-DlPx-oL;;Hfggbvh0a9L!P!}h2+0iecY<9cUv&@hx- z9|J4{5jr2F-M2)VH-G)QtFbv>0v*BMTbPkwEBv`zY5y4Kv~UVWlOzl08}X^Amz1%0H31T9a{d$sLpDqJP+3$Ve+}$()(OMj{Ag z&`uux(-HtgF?j?)@ao0apgKtE^`4+6yVNiXiaGV=5zDBVnH>sIyL5!Lx0JufhUCY2 z?a|N>4@?v7U?|t$4d`%R+sseJ)NG8-HrL8ujRD1|V=GiM<*?fiTw?sH>IE%<5TZt9 zsoUs_9_3APAAcdTbRVdBJiyguYC?kSf!o+jh+oQv4Z}!ucIN0x*geo{6^CfRN8P*n zvI~6Es)5^?n-D?UOZF>{YpSiQSP&&!P`ApWmgq2x5iw?Z%N`x6wdeM4Red&&>$=P_ zoqI;qmI!j4rEo`*XAG*75^QObty5Umg#E$4H?9f6+<&Ah_1hI$w80m&d@kil+5dEs zDjg~>@2d>nt1pY@VVj=SkDzd$sj(wHA~xZccQ=rbg!=^Z+by7P3U_8rD7uYb;#Wjv58ydo zF>=E^pMToYf4klAXTx9tE^ky6scFwDpB})wl7cAi$ABpID*^H)Mk}^DP4-IGrUL*y zovA_UmxV~16DCRU?{zR=fisEq#S=)S)7L)iWQkdJCbiHMe!6OD=prQ?Ix96cbZh%6 zStROGw?9%_T5;J>zG^&N=%fvc=tzJ&PaoJu%75sxG`C+Qi7T$gc$l5!@)B_Sq&K5~ zC#tHY4eBZC{|ATxv!R|SDfJAZU?5eOr*PT}GR$o8HDx4lPCkSI-@}#E%KG*DJIFCkb_vGxchH)ZcFHU`PU56_C=@$Z6t(?{?v{BqsLjb4B~Yq?PWwsU)4(&^7%%AEVB$U;$G?`u@9DTISAXyD z%1)esNt9UuO596%3mRQ31Tu0Y26J0*s&DE*jWa2#Eq(!LtohqT+@ZFKZN;oFlLVum zcq!~{n&zIJKGYj*n{PV9UwJgGJXFfpe}|R!*h*d;(UZO&iZGwKt=90HT#05?nZ)9` z%ZnCh(;OI8SlyAS^Dm*g$tUvBQW zq<~z;&}=FB)NV*^o5Z`1a48U+wMp0*9${_H>K9~#3j*9t?hY}t3a7O^bBgYTq*u(a zABUmFZQGgT@$?-rav8OtF@%t!;l}EsWtE|+jXsLXy<4bd?&8$HR2;EYqknsBsx0LI z01qF(W_q&jH_Pew9BYzvnzIeTowo!X5jzY|WodpTYiTlk@2Enj)~aQj&3X;i+dy1( zsrjuz^e|fhbwn_gG9d4Q(jWFG$)mI&m5~297FGDaMyO@{xch5dq?_ zcFx%UzN(!I$6Cw(=CMDN`hTnCpgEadyZX&}0UK8J4<&C%TD>|8%;8&BxV#xyzwp%y zB{c~AI;MNF0g^G`-_VYVffn4G(`E6U`U*wL5ML-}_cd52c+H0A^Lq>u&#A&|j69bL2FtM$$`Zv>GTm#6-vz3xhfTZvU0= zC$#j`-t|AHDlJ-aEq{kijKHF)b^&IzRWWR&wNiJsRTeZ!Mw8ti#LGus9_-tfe%}dg z^2Vh_-@4}U&tD;9Sz*rj19%rm*m$-MG1f!OB}+C5OMQLY3|4q;qoSN6+Le^Y^}von zORKaj$J~l(D(wPg;YSH!F;{;*coX~16`vDyXNjr;xCMypWPjk5Kc;^VJFkYI_neYG z?ofUi4EQsN>!zX`7z&Z`k;)&;+77N|Y#4r<4A&=$>Zct- zx5NjqM2QH@Hq~((eVOBI-4SxYHy@3ld?YszR(d9Y5q~Cq+^lXCL{r0+80_LZxHkT4 zjYBk$0Fg2_QGm*kH4@*0r_m%&>?Ap>r_a{Z)Qt@=Hl>co+*5`S0`a6!SAf01iPLa`jQpibgEv0^F^ z1LRv$S&RMZFZdl`%|bt=E%iL5@aQ1gP;T$W%NV-kNHO3injJk=g(sR_jm`qpM|%dM z6W?=5P6Z@v>(9mLO3R!Kvxsd(TURWV!fI zr+@YrEaBU;a}!k3b{DnpO`E~r_4aG`Cgm)nt{;1Umc2uo4`a5Rzitj&VtFd=hwApN zbF3&O^$)$d7SzWTsnp9iZpuUusqJ{reE1zrV#ISd&?(EMj6yQn$HKXkKB&S@Q{gB6 z%^xqCmkCT`9UF-FZ>hdBaPn#x_+35W$bas3bY4e^O2!fo=#=My`wWGUI=B&&UZE%4 zhDZhVq~?YAM|KE^6w9BARUz_WZatPpnDCAG4Se`U%1glmaJ9HiP)u`HUScWKi5qHH zQmQr`Qly_pBN?H2tSV;xUz#qfjw`yg`&keuSB4S)6+y!~(T4+H>lR* zNf2eEMvY@uh*Qwb$2gGL9$0QqvVU?nE*vv^wV{TNW%oQ)q+3gI2(;BGgi92?30~Ed zc!)E`o8D|1ws>fw_B>#O|4u`Dsk$ES?8$r~++z!^CHyzapUjnq#iCf?amRS*GgY6C z$vlu;44quo%@!gBvlh%dfx^8Cd^_9^z20O{5I?Wv9mKzQ{-=oL&=?dc&wo!DQ-ZM9 z7q-3AUsEJjIqaJ^Ei`Z?-&&1-VV^TBppN-)D=_*gh{Fnb8CwrUZXf>%iULwwj(c2o z9<2jr`&>=otzW5zkVO1a?zG1vceGVo)!Owa|9?`r=X@Ro1(ZmHNs>0H$)|Okf%#O}QLA=oCY;19D#{(b z2ZYT_*>@`R1aFlQ6?l2(evLHxn=DTmqP{j_!Fez}644w@tjkPVUG%NRC!b&}pAB1q z-0x6#W~FhgA&EZ#e44q#v~Js5Q{Q5%lF2}u}|lpy@7@(f1q zT2TWrRwo!u4ky|u)1Dh0m~DuU`_(fxrBfvNPJHiV>_3oJ%)@38Tr#NL{SNz|{qMo( z1XR&0t5jSsFDl6&(cS&91Q_iivGOv7Hw2$~Qj_33XZ%Yijel=!^B{x&d!r^KCMb>| zoUex)VMFnAX|iz-%!&m-T~Fey^5^H_As@2QhEKzr%Fi=*W5>>T@zTixhP`FjwAh== zv6-cu>dhDkj%ASuJ>b&+*d@<%!O?n@gYn)Ods7`37Q$_=*|5bwDiO)3)$r%cPt&Lq z)h%y+T?h=FvVZL+!_xzadTWMKB#_C%>Qf=O3h;=!KkO*&G3DJ@_z;~_pv{lK3A538 z6^Au=|1cwDXx4TMRzdnl2IaSjh!WCeMIML%xSQ%4sC3qSiMW1qgf!o$1MDZ`*7Z)% z8w_|+Yy4JwU*$S0+RORCxLIRRpIc`2f*22 ziZN{eim@y}C&p~#R!a5KC&_f6wOChd&=*lC2I{Vv7M3z|5^MCV~tj z!&1wqAq}eEG)&-Lf9r{@Yt1pRxc*08)El2#DncuBHTW&HPB|6w^fPRfu&`_0PQt>7 znFfs&~K!2fF~DZltU$ts5u)ckH61mD0byDb^7C zycARrP-xhh8hWx6X=am;`XgkM(s`=;r4tz0bc&7sme~Ov9k4TPPHg=mHPuP?8(C?MD`uu3!#4=c>>wax(S`G^!d4jxDzRS%K8eaR(B4f zZ7@R0{dHKSxalt%X(?MZBx-LdUw4s%nYjQ1?tLr+r;`RFLh0E5&Dhq(Q~{>Oe@)?~ zo%<(CwwKyZkZ)i6Hw{0RgU7S67o6IOh{9$e+^$WE#}NI&gm$ z9~NlwxE8w-@d0y$a?tw=E!=u>ZIsTY^>n_2xB`8DX5#{iO>HLr`U7Ub9EuN9UDOX{ zp?o^hQMVWD4#3FVC$e78bBf4OEP>-ru13l>06Rh?Z6g!L$3cy!R_3y-Er~7oe(p_@ zrH`qbe}2T!An_BUp`eXqM$b~ZW1W8ov5^l%@BF=!ZagF8F}Jk{Cdgg#{0`n6mX9Ow z78}k?kycao;8F0X+;PX6?od6%4rpW-;f`Y%okt@Li2=dc)}d(!RyL~d);|CC6<@gk zEAj~IH9EVG@U%4ajmv!a>2@amd@=g8hKpB9KoXWJIVv__FWd9#tp^W`RiNYk=BD5^IrRQI z`AG^jIhkX!?;Pq){_RxH=9@?%xKLPKdBb6bgo9hH%6uyI4P!O*0BS+~72CmYIc%~& zPm`A?vH&|t`@n6o4tghY20bY>ua6xfplM9*fc#VwV)U`K z{)&b(UG<+9{-4l^^KF$*?Mm2gR%>5820DVuydMG7SC3godBjmniot*6kYFdpxz=>vsA%c6AuGGtbn3SP@uBA*Tg^u)hqTGJj zPWX5Lw`aFI|1H-;Q2CwKf@+q-B{_VtS>Mc9W%4{-7IqZ|5-;rQC;eeQp%$r3Bj?~iMeX!E;U5U1= z_V|=$RJ449sm7VIgr*9CZ_Vkc1eRdq(QbG7JCDXly1hLnDPnjojF23|ogi3@8#-_V zPzUylq9`YPIx2XpgjdWz!$trRU2^gDK~&;DFBsF=T&AQ#}bs_J{^}8k+^c z4^|1<3{=;%OQt^gsZbLGBvNY|61BfaH^-_rxu%;-;O1ISl0sPHS!)lp;?ti&k}RaE z^(r~-I0^_|VcP|{HaeToxOJ8YVEZsj(Iw0V$JE6OT$gN4i?)8Tz`7Gw_7%Hx;a*sA zZ=Yp?wGr7Q#ZG^S%5DOxn_0+wJ?ZDNf%9lL^tFEsQMMB|3(VYZ*g&sx4MH3yNj(A^ zO&bhW)%0^P9q9PR%p*~pZ(6}Hm&w_QRjJc+y2n%fIu!}ftSH1B{#9U+()SQcS zRnXi+&hBP|SmpO!4#ffs1AZ3H|7Ql!B0^3|w405^UTncLxd`I_XJL zXku9~rg4ATG5_>r9juEmhBUgo=J3FKY>uAi`4YZ)B6iV%I4aqbUSz_<1b@A^XQ+=&-E8f>~z|xsUD=2|m z=!iysnX}vS20zqBa+pK|c+5`>asgre+~7ZA-{TqdDl=G6EL{j-==IMznjVx}=~^~2 zG#Y=nZ226`^^&R?U4l>$LVZq-{Q)-y=h^>>Y+z+``)bBRh+W3^RmL)gxfvYLckN-p z&phuSu1VM9IW_4$3ky2?SND*7P)${V0B%Onh~;$F?M`DOkKDzaK{;W@m4$<~6#9>+ z7ikX8sZzfx5WQn(VOo5HJ*d=nH=DsHp67oJM4dj;rQ7>z=WQI2{+N%ONyehn)I(>K zsBJ_ zKlF3H1X*v<)WFaDc&6Ui^oc6Y0oK34PyT~|d71g+abcV+4Qw36$7N_G9e_bMNi`VB43%gALUcu*oW9}EmM)f=q-<40 z)X%rDiKZC3VIv3u4L3r4v;r(mietY~$()H;EQJZj*sAPSlO0O{u=F*{o7W(WUQeg| zo?Rq#NnSyEn)X$J+_k$2E~mU#^MZdUd0wHC0GrnOcD9SqN8`^GyIY#}8) z^q>aom@9zt@?SD6(y!9F*hbsS+SU7}LSs?%ksT=jHuYn*WaNm-oo~@-RsMe|kT8bo zB}CHQmaIf`huoR$hmaiQKF({Da^esg(+h~eg2RX+0p<5w;yHkIcV z{B!;=B7<%G!0>Qy^*E&YA?qD8=l_6r{W=_ruJYRTOgo7#QOk*hQul*!i%DOcC|*}w zji}tq8R3e|GRNLX@z-{1?#h4aiyg$?pYv~?nwX7dws>_>AjDxICSZ3BV_nhJI^a_)>07cF)2`k(k7YP|D`N$>#83_I-S zv{-HEhS7JmIvQz$;eUTlj=%oxZ4RW`mzS6E9>+#E2Q}hJY2Z$z zvLrIF1F+@zu~lWL^X(2f<^|~a$RP-;YeH|(q#rVc()6(l=9GVq{*N!wL;`^B3_l^I ztQDi1(H#9c^+={?=0<@vniL@<<34F+58V97+lZCsx*98b&jvGJQ!5W;Uav~q>mKx` zMaYqSQmmk|(toV~RrFBtQE1+p#O6!MfP(HyHkN{vjJy64W;hj+~EJ%Mx}&?WoOTHF{m)<3+^!MZNR8hAZOsEpr0-d9oSSDeWV`voKI6$-2;r<^^PW|c|dU$*ZQ^^^d zM!_20ETn(-aQym`x%%6@ksRWW^JX$hy;@wbGs1s6`v0bD6j|`lS7BZM)`2OD0m&3n zVr|#j>N;)OLIEjGYHN5oMhe7{-;*eNeZUSo>IOP*W*!+PAB#)pbxvH??(UMN8c5wZ zLFn)i;AD(DPLZ=GwoQUP{lgyheo2vQpyGkAj}3o_tsU)l^rQ+yOy+UVQ~KRT4DF1j z4TRBjK3`te_E^q!#g@?&HmYRX7~a}yQQF3xt^{&5MZh1#qp#>z&Y$}&6iy}uf@pVl z31VzMH3(l8NDc$TBBW30jRs?8NSsKbugW$RIB_V@Vqbxf<{a(VK|tZJz77q}F%vMJ zIK+Qv!|6&G{gLK2Zxu2b;gez9BY;p`WN~*Pm5{z;M#RCc9}fsFQnV5A z34V$(i&vJTQI-k%lN(t1n@DsB?C|Gb&Q6$HpN0!fm3kYs7FWQD3i>NRqI($zykfmZ z`LkzGiV!FBFt_7392vq(_f*PH<|wO}NG*S~R1oq5nCItCniH7peUUMsC-OxelQ%UX zeC1$@HpTVfN4GcvWv}I4&dS4I$nGvg?C7ezgTFnp#f?6n`mEGPas18{NA68NbtV~( zvOg}s2KE)Hrz?eMZ-twQOLa8CALKCy$^8dtmV!Y8zltM2VmnvaMQvs!MKF(osCj=o zbG;7AdrSe--pqV_*gEvE zNDi$}Ze}=}_53o)8g+Gq*)Nv`0F=CCUto9knym6u2A?eP97qtEgOM}6L@ITFLg~$% zd|6sCn%1fBD(iI<_BIBAXmIDQ6@pBd%WxB?Xeol{Wno+ffnv8Wm^j>mu5_sK!W zMc1HmV?14DW`Ale2+C;e&WwD)5mp!~7)z^7?K8^pu6n5XGcdTfNRbX8b*!?ViyJ_} zvO%o?{R;Tw%(<4&hyX^c2@QeBRFV#R;RW~YH`?8D>ES9#*u^k@;gYQ4OM2R_rJ` zvL2uAG=>ilV#-TnC8E0!y&|<$NjE?>9i%vqp9%fj)=`gA9IRY{9^V8aP?Ul2niikZ zK6(#Yz9?68WFW&;JY}Aa69}uEia$!zj`Uta%b#|Kxk$6a*TOf0R%m~kkZZIZ>>b8h zy)OnA?oo8eW-Gak;t)W2XhI05XdLf$omR*dF+{)lh7SzX&(jc$bpi}l$lLxrvgtbo zQ_Y@`Ij1VakiZW^VF$bl2+ui04f;3&*>1d-b<=!RGVX*Zz!0-$g&MGye#ZsdJ*^O4 z*vpqv_IaRDZI~!BlaqhYm8bnd%LSP?1*zWM+q^`bF}K;hg{oDAy~paKh_)T@T?IeI z4VU+IpB?&HyO8(18xBwu7#<`6UQT7w{j#cIwC|YK5De2;~^A5G5@&bY) z%Y=i!-#HV6pqqE*z5K5^x9KqcQKeL+MXkge)zNKds^M940uO&q0)qFpIIU56`APHR zm@h*s7^H)`SCy@nBbZ!gf4w)>>-bDC`^;F8zD~Ruv472V+_6iGtK0kS0D}UhcmxzJ z((M#Fwo~f37`Ju+>r|@3vBf)fDkuggD$TpH&W{G-AqqJ~HHBznXn>W0LEOGqR+G>)B^(inV5 zDVz+#aVee=*?Nm;7hzSTOisMV{{y(MG*e)*B#|4%TKV^;jzjr_+66D#Ih`qZk81dR zQmBiG!YY^@M&LPG=E6!93pyjm@COUu3+Sd*fP{n~=qpT=xolM-+ZMef>Gs?d zz!8Fp$c)gE#AX#W3vW-+^aR`mgWACR?`O|NF_c#g%zn{1au4p~M-ZL{76%^1+9q{WX9|B9@T5Fsya^>h`DhsEAdYACR2B&_;wFMGA_Z!@udkNEqLWllWel@?id>*9Sn%>6S z;#PkR#CbzxjJfx?;)ho1!Tk_yc9B@6NyW(Zjt3Vx8 zNH&QaFJVjcdUp0do@m}F)|eD)x?CdDXvTjp1`@V4n=T3MG7@H&%$2q+7K_~-HK=ac zhWDrTb+0_bI@pL(q1#|ARkr)tubJwzHuq)-r=77Y3I^Z{WifQ!>36`SimR-kZdzym zgAPnC$7KxjVp}(wn}5VL0{%pACSpg=!Lp(Xgl{UhyIZ^tQ8zu&NsMK|naxQm3yz#OuSVExnC2PdBWj2#T7?((AKf1n=o_9X{e_%jZ$gX!9Qk_WVjX#& z8Cf<`7HI)%XM?UUcg5@@5G}}E9AnDa?BdDNvLaep*BJ}lRQ*sGSR3Z$k0@+bSXf!F zCj6l24Bk<-_}+-6RYS#63qKxvTN;1DwQZrWTd5o)!kbWL&R1JXjm#r1%PUkxgtg&m zLVmT2sZin%cgrCXr_7QXA9cKyAxLcQYzqiP&%d0cY7mI?k;z#Jd#STeWe*l<&q(bQ zmPT_*4PV4hEx)#;ioVv0q#wO}oBsOImcD?^4_wGQ-X|9V!!24X+rpGnvuuCO^zR}e z3tmLk!UR+dYJ{rhzUDuC5uRI1-%O60FY6}GCJVO;6={pItE!FqPZ*vc4waEBxWHOP zj(?j-o;oXrUM}7$S?ie9%y{-c8?LGdT61c;)M|?BJWRLaUtsTzWPXMNXj2-1O9%_| zm~c!4ikNz$rL#Rq^kJ3@7`}h&1`;K-cy~-<10(FA>Td}C;-nvedAR;^xHo4V2L!Fy z9Amnz5Q{U|DdQ1HbY?aG+kBhP#fwYkH6hp@MmWkg#lK zn#|n^ER({6Ux13hVRwC2`-L_x1dpfW6@)uJE>ckI{h*iB6CfBfb8~njhg?XiXJ5I% z-eDn}X-RKX%JYao#_WGS-n%R=F+v{*wLsSW`^n{*Qq1&vY2ElAs<-mZh1D?F*Y5x# zn{c+uQ0IVJJ9OJHD+rNjLWSI~P=afOAI^z?%%pyNU)UF*N}q?PNZncpU~EG9vJiTh zdN=XxJ1M|k@=>=-iDVCNu?8Yk_I(bLcHV1#4h(;GI8$YmIXQoi0r>|cU&7mngmyuS zX1}fgv#p|#@qaC3k})gXMjQ&B2xWO7MxO8>{4D1*xSAC{`l+Vlfxr?dkoO4-DZV&ecv%;7$-cu-mvuJS2IK z7OXKCBW8HboII#Wrl<302h;rq(~yp2IoixC2zp2Bg9xTG-8!15rqaNS%%3oa{nn41 zIBXk1rydpO=v{Zd7K2OlZWMVvgs+)r-g+fX@xzAYjr=zmXV2^4odp?CpH=- z3bRvTD$j8GQ$luuv-= zreIl9U`RLfuQ5+`oVHt}8N#{{M@CgZuTS6uEWNHEBQNZ$KcCn>7g$lEK>_gQT`{PI z^J&vRVuz&I&P?ik)jlT+dd@1K+(eTg75uq3&O9rB}c;s$ff$ zxr2Xqtv0*$^3;(UD5FGZ2w4^xiROS_(6E^Pk2M)SLi5RaWrcQ7b-I`z3fZ_&Bh}W< z631hlz68nWQb$Yv;B&{AlSO|FB_+Y!c<)#vfQU`Nc%##L!*N5bm@_Nw0}~i`)6x z5~AtQyZT6}cN}UK5Q|*{r_#kDqfmb(U*<07IyWu{R9#kt4j#YAmnH29aBxoX(;-aV z_nH@U0C9D|&A!6+V_`S_i241{N=0Bd1QLJA43^!)^m@J>R<0;#t_cWcmZ~;)r6NX( zB5%_F$%qp2)ec+CMhG;I=b^o#LTrO$07(x%JFS8!JY!3dc%OFz7pRmQ_Wpm;caM#m zfMC4KSJ=c>8&k7>o+R?qalHkcD6k;9^al$9P=Fnq`?`TxqOH3Sk$G+tHRT)18CgFC z>y07-==4k)jing!`vN$E@&+Gcd37+{vwdsj^oqZWOYv?x7jw(h)>pcCS*I*1M{zNKNx2Ms!bjQPS@Mg(QUzavjcKy#f7D1_oy~ecw zJ!Qk3fz~LB^_vJ0NH`ryrMf*`f;N&(fZgsG|E%{ePJLE{QPtO^Ak}|{s~Z2S<}NR4 z|2kuL_(|oWD%f$zdrbeYwgm+E6zMK`HsGS=4(RlUTXgUUNymT-kgu~X%rHAOTp+FV zB<+`qX1h{4dC1+K84?U2`^YnOCeYy3$I8XmC$1&X%mWlN51UK!)Smmh+oez?5TKJO zzF3Mq>=~VXn74O=hh2X*_LrXqO(=Tu`!tU9GX?Ih*Jzv13|mtm(sh$nN(Rund2uEN z5jp$pK5SS{(MWyW4-+yOl|kcF8*OpRe`X}zin@3LPzyW2n~`(8YaF|C#^;W6=J}-U znD>nNIlsmW3@%TJq}p)L4=>>t*uUvIp32GZW7god$}4zcgQ|5Zzttk3K;FrV`>Rp|H{~QwO;b4G?X&%IOhvScAYc#WOus{1XxVSk z#lBD2l%GJMO^D$wN6=G$Xt_QVN4zju{h3N&+3)r=8T5>y9N9>o(j3OYD-D#yu6D2s8jDO`7=u^q3G8kxk&$WM4hHt!QlZ{i$j8%H>5w1Hk zmMOri^TG`tPWok`m@jVQc5Tn=edj#gvPYFK?h8%nd62xkD_ThwshT*#8~HCq8VNm= zw>1WEF1?x0+1C0A`tE;Ua(GVdn3NOyXe36$-wlac8T1MZ9RyIqC~zuyR5_E)g@eRn zT&(=tL0o_HfrzR<`};8#wmWjxcG}qbH1ME}BKSyUNRcFUS(mJrhS!1jmgJOYVTc8< z8~`Hts{zw&QjPrnIK*q`GS`{5m~eIn0R!>V~wi?4M6?IzIY4QHnDeuw&ZV30Oa*WGTYkT`GW4v{)QS_jUx-(_9xGQ%WF zt_iuNs7K4Kh7MweH2l+b$8|7Gt1IoGgekT`M17gmMcEi1u0uOxUNXA*L6}4@LORy3 zk@tUQI(U>bDkyLfl&Yh$v0$TR1sLt?NXTabsC_+#ohc&)*00H=N;w@@!XvZL?nV(; z+D?YY;%YkKi08-`waWT>Eehq?ldBUpUf%ngrzkAzwJf2>-8w0!=?dEeZc8>EP1}AA z5Uh*pio$mN4=07r9yp4*Ny9=hjTr+hX1;$<5H8mwm{I3#a3NvcNTpK~1fpp)oW>@1 zK(yaO$Y@@uxhh~8c^NG)kfg|4_l#%fp5x#1i3CQ%CddqH@u?6;y7L=O(M=}~95f8u zu#-n2P(jfjq4p`0dgFYiwjVMLy6Wx6@6v|-Qr-F6{zTp}zKdA0)Di}?>S1moPi=pT z4h_bzIQ{c}_faQo9<2yr129JeAE?TUCi=Pu>v#h)OuJsxD@cy0V0i>5!dtg))@QNN z2KBKR2p|vYgHnK%UG(9>0VDlD^_SI>5F9AYT^QE+^WwG;L;1M&rH>GFI*6thpu%N$j&2>DY&->fz7NZlFeCLoxc#ttl%bP;p05 zJM-k(O0gFd&%Elp$cRULONR!1krCzD8kPWC%X7P!n}WD;|mNK=yM6A+?0=W>vd|9lPRqi`Okj^Nyvv_8Q|+! z*2}_ZVzl?pS!GqD!J%s~`24LSCTKY{9h6)tHF+!{7TF>o^3%(5r4nh2U(WeWb{Nf>`5XoDypkPLe;{yE0@f1#kP(rCW_)5P50B3pe)B<5n#@Y{fb8U^3?xoiT)ms8^s}5&`N@ zPoY()AaRxX#Z0p*w1tzsZ;#v-VJ`;rj&S#qw-LsqVJLrNP*(h@G=88jq~>_u)uf*A zWmC6%91S~PG*LNp;2Yy3$|;~mGj{2|WrAX?=1_D(98boygVnN6N;nV=If`@22c4AK z?`q!rk)m=k@?&~OwV7X?_=!SyJuWo%5ZY2UFsM%x1x;IXP}MjST|=_pXjV%FL!hH| z$1U@GQ67KSP|UrWdKzxFWNR$<$q134rM*C9Y@0&fLF~k_Pxj$!Wy1X)ymlfhTn$Yc z2_o44gK38}RUrP+C*Nwd!C4iR?mZ3+6Assj>}I8E6Gk4?(lOYj>!?4R12e@&VKQd? z2s@CGF_SUi?@StEVM1RKFp%nA9Ct9}btBd|dU~#!+E$-Jc!hGrGwz`hk_R_n z{#1X4(NqBW-|dC`lN}0oU0y>_wWLQjdi4_%=|u~`SuBOOx(?uEZ??X@7qJqjdx8vA z7e4xKF42exyszh651pM)|Gqho9~72ysu2a7_fW{iG64C4XNd0_))NVf#+I#COiB;X zhtV*JkO>7r0M;Fw$M@Q#$$Ns5c4OOgru~2D^q_M6B3zP2+LGbmEJn{%^fOss_LlpQ zn4U@sIjaOEjn%9%T4t;LE}1lGByy0gVRY`YA|E2_KXJ9qdD9HHIGwD{e)QBt;=8!f9!wM zCLZaF3w7H~lN9%y2sPCjG5f-=nejAZmG!k>j^@jT8!sAoZIJmxIPHJm!YTCy^7*?c zYn%nlv>7sJ<%a$lks{lRZ4>m0GWi8Giu$tG5KLp@B^>MYbKSnAh`wTYA50x~^5c^r zHdaI-&bCAud=W%+*OADe&zB0ow4;B4Bb~3+Eg?ErSZzC;0e2(OSWkL%0mUgga<>O( zgE{|3#|MfgFR^WQ{g2Px|c3ATS7FI}g`S9!$q`l4Y zo151=If>ft5p{@@`3AtPS4j>LKRXh9HYNXCZCPmRT@Ftgx-*5+3F9}^7O4b}MtGTb z94{A?)O$pq6_->ztCD}+xRzivdBy`k2d@W2kAoJ6JgQ#Xq2&N%E6OkBprz_((Xlfd*tJU*ON^>FkR078G0@m?-vG zLMnQ}n}TlHc&=8`q}26T8b>?Ur4`!{E=8qe##QVGPfq8h&%J*;IJo8crUgzk``V|O z>T0P!!|W~HYi67eM(opEdcP6f4l~8zhPUZJfREv0lO4scUCfO;j?7~|{PJkvQ)M{< zx+qKl!fcgLqJ0da4szC*b)-Tld-hIbidIuaTV@Qv+M~1sO!O1O0kFJ(I@Obno6j`# zpsoB_aBschcISVGAd@gQX@#OFq#0-gT;N&pybtfZo}FB-$nDE~tDU?T=~cHKG=yoZAJOU*hwqlv_LouWN{*Jc^a7@Jhq#YEX&$rf^`&s(XEC6{l6lCS3 zC5L-Et5Ja4l{752rv0nod6EW~=q1Aj-DjNP^T1Xa4;X)=;6KnaFbfNb?z*m|BW^%i zMH3*UzO)Ypv+bcH3(j=riTY5Kf$={6+4+XU9@gSiK+2vF*_8WdPKnJQPz>2Iibg29 zPH_x$8{51i_kh9-={I<^*&}4bs%@sKnm1+o^7TLx>;Elk#S9AjZ*lP0*UDc%xssfA7y_N?5>7{6_|VS<93?<|bc zvo%*w33p8_p9wFt`B3!sqNlm?2RIs$r5exrIF{2`g4=$>bR1PdC`7l)4trwTP~}wt zmY^bR-CT)FZ$-|W7Suf|C&pt5O*MuR1#Bl3K!1NO?x_6+M`;ifUCCOnEP2M$DA;_iRf`1p zmxKmCTW@xJu3|=%q|{==g2bbI>Fj;67wNtP@`;856%$E_?6MF7_e@) zJreug{AxSXaz4{XHUkUWGV7}+uAYI$&jEjf!TIhJHOe{X!Pwis43*!@MFX*HWrCM3 zGuB4OW%N?s(0~>?A4(L^tU)h#HPZfa(1hg(jA5@E(hm3T`H5ZLnaeWc9U2mTIsRGW zn}nrn*Oi8943xi(Ls*^BlU+>}n=O0sR+DTpE}5IJ!m$wWqrCK$KqV{Hfh+!Og23YUGt=G?}z45(h1*uZ2cOFOB!Z? zaqM@ar>{>C+f*`t1Ti|Z^jn+xUg%AT&OpV)GXNRuXYoFz0KlB)kMK15$Z0w>S(KhY z-}@@CPu{?n+A2udn@B&5kenVdSwDXfM%Dhb$+z3xW?~bdC>wDkimlQ1C}myEygI*Z zvX&h2wIImiG}Z}5@}%m~wFY=pJIXpL%kF2MTJ!px>#u2aQH~mgNo;>+OryJz16+va zW%IGc_rTgS&pq$PA$JSo`AUakBxQ55EMCXPDUq+d-Wx6TJtk8_f(>^zhU9+_6@&tk ztPszNk1q4AEA-*Q($wVKNV{cZ+lvU!BaUeJ@oTeN&V&OWwrguMX30%f`8d2l+ghel z6Zpo4kKR(Le>&rJ&)p}YsyfE#O1Hb&L(nyE^`#z-h!^;j)gtgW)Ku`M4jh$B0vbMY zJ8tK;5R=~6?k*$m@zkm(1G0azszEa0Anc}TDsg-=0LfkWb8`=zK7qe@mp~^K=?b3N zkxs}3oi%j`yU%}HKV@>Bb#PmYD&g&>+{ov+jnq;17+dgKe^N!f@y-jmey#^D8$>;c ze;$|LcjLkGza&oaIRD>MwSGV^`iMDK69ZU5YewE05GH?Vle&vqah!j>`GPsGEbF!e z5dDR%h)5+2YNTQe;W7-xq8cgZ5J|rCV?vR6JgKYcglYiT5k~7lm}bK$L#sP9X>3=q zx;W-KNLAKMd1NzXK8OaN-Usw_xciG#V(m1akg2?I_s)JzGm`{`Qa<@Ve$5vTY1lj!{$t) zEE0c}I3VL*K!ATCfNFhPCcqDtY6Z3kQ`dIfvk~&qU*6r%I>&aOB-ozkA}==vONnYX z_f4eWh{UnW(KGM12mF1kVC@h$-TVchwm8}f|C8%FnLt0{-6)F_#P${71R)xX3D}a( zA(qZ0JP9|Q!0?nd!=Dve(OdN&-KNB>32$j#bUp$F~qNVZAz7h|Qe>xy9pq)dj-l4L=4 zBT~fv2l!amzX%-r0Hsk_UNHp90!%svus-ZFzBpBg2EYz~h3~}VHJPA9rAI~I()3vMa>ji#33+VM6c8ZPMwHXY04La>-N;XhMhN;|NFXB%*9>X z%G=$kL9aNe->j;yAGwiBzR^*ffkXgQidD^Y&(8mN4d?a^1(pF(>Fn0FqR5ugH}_ow zeonwb$(Fa$pFP_K(5A(_V5gEs@?hI*qsYHJFzJ89^unt%`yV_HOzWX?pBeR=KM}1; zOmg9QdZ{MFZLgd#~%n-yuUZoL*?{ zJlDFo?BDWg3sp0S#Dg~FM!JoTvdn!oepW#DoD0aT(kdXO|3Lh#Vu`E3GcST2hl?(7x||;Tdw^ zb?eQ$fZaA~gt?o!POjXg{u4s?B)7N}_g-eeNlI`jz=;5#uOHlJdbmZDw{=^)0<6GX z+6q@MgrY_WGiBe+HlvcZL^z>7h9ik2W2S$cS->E8BZpC1sfZ3CNPCX9S@@mPHzEF4 zETs*HWCXw>d(+D^Xg)Jwosd#fr&bP~ooL+UThD1^JC zbpP~f4_G8}b21Tr=s#wAS24D)dW#5#SYj_@dOzTV16IsfzYz8B!{L>8k_%xg>6m|_ zt^TeeB}4gSw4``$!HjRRX{m;%@^hORB(&SKrqs3#F#@M79R-S_O>)k7XoI;t%+nj| z6^qk(Nsz#yYg*{OtI^sb&kle)J4CETLb<2pIyOhi4sFZphBHGt1o}=GjS5t{t_g0+Z6z@x9f{Y!sNM?gWere-kY-gm|eeRP5^l@+!htkYX^K92od z^=-I9kXA^Sm1$ZvQBh(MGOKb{JYzL0=JWZJ^72%`zQt}QP*Mrk6@{h97#9TWfy!)S zmT6;BB5C7NkQ?TNE|Zk)O3Ne?QdPzb*N-&E3iK3#>#L4hknoq$z8&kUmg;{f@vlnI zP5oWCkK|RwbG{L+)sKyoa)DJjWCihr+&2Y))uynH&49JdgXn@#xk6s|WI>*}+y@48rhFStE(yk1qzd}<(}QdI-IxVS4L|BEZ- z3+G7`1D*g&E{e@Dq3nrTL4yAg~KZTPU6Z%w1MT(zDxXI^(N z;N7m|dOuk7vD<8UrFQcZU(G6eW851A$pfwvfI*B8;}k~sAQ3S%KakyGetOAWo}4sc z&-Q?Ru?t?zx?7JE$$wg3m%eatTYOv7cACC!dKJ)N2o|k1siec9U1)zWBIqx9qu9x< zE~R%#Yc+E<-7!VNQ{zX;K&=cjCiYUtuB<92A2D3%BrcnQ#r+S3TjfHbu#lfDXgbx{ zHEHua_a7&>jGdnHVY0ZfWF~*cOd}~2G`IY#h-%&VjMc+BQWa{&uh#O0ct4)Zn))>d z$qS~#_2WPsV%ZCbFf)G>qm3a78Y-ia0F|s1RJ!bcE0g_)4LNMH=(_z+h9ll<0S2T+ zMRz0-C^_HC7n~)`pp2SV&%vi1{gWFTH{nkWpyrq+_c69r^T$kdvb20>85hwfFcJ%- zhpRWF6LX@^g=q?Qvjq!aicbXHe5iqqiQ)jqch3L+%b>-ac+r2%%^~lP_vEQY)7RWD z+v6LN9GgCqo~6>~8`sSnB1lf;_4mYg9)y$ce*lkfJvJ8AgxRL6H+bjhy<=4W-TQk8 z1<~;uGeew9!SK?5k$*s0(YA~l-RmCd@~270q7Rp{rkHNollSFgt$d zN`j>GJI?;iRK|Z$?`Yej09vLo=lDld*BT+N)v8=vudX(ZI9ATkX(ZGcnAcm;vwW_! zqJFBGDoMF09^m?^INTrxterzwdXC>gg(|o48<~Hg&j*aIy&|ND#3vwLG){Zf z&__RDF}{fe8G!8Juu{n36se=GUhDWeJ~`K*?8Vj}uR)NQP;VO24 zY*}la*=q$W7-^q$vK?3!r*NN54i%Bq%eE=C-R6Jg2y2PYz5*4t02>^Y1?BziGAmIb zWa}Z&;FQ9<^E-lS0OH=X03c`$?s1E*A)ep7&Pzf29cztR&fzCNU%)jb8IyVxFeHMY zWB0}sq81f0AJw`&CW(^`5j#j0W}$0?D4@W&7p`0J0F4@E3&jcEL~^I|kBt&yQKgVzz#guq^!#+?2Tl=W{O!@iK7 z=ZtK479Cw&2`hkP29 zUXdG+XqFTlD|1@%BbS(QFqhpWMKZu1s9VLij&SUL3Ae zJ)@##AI;V|oPI7{QT4{eSymHU!Zv?60S-HdvO)Z`H``XFrStOtMAP2@690;5IA1Wf3A%Ka)i;1!d>;I^&PEvS0^Ick`P?*ix@3{~vvz-(j;1+m zg;L@YrVomyGy0!W#DAlc(FFt13%XmujCm9Z*EqMwG=7T+2MBKN>U3AQpA8M}<uM_Wy?_P~`Y%k`5o(-X1b=&{mvSoIVzMv{-f!+?>qe z2dIRJaIySpB=KAB@$Z19)Yj6 zq!)qcZY8D!a^N{Qglm6^g_;9)-i*Eb{6)j84fMoN%oNxl7{;5Bff5OGDamz9Nu_QS z-lfGApjM7TODqU>(Eg{Ko}xsYiS61s8Xw26kBSuSL$EmFNm>|9E;Zkb+YvFbvTs`8 zcPo!qeDV~nDFb)Daoiq3>0yb)RGf*SFK_)GHUfHe^?_N}dP9G(o0$LkFy#^f`<@oa zpOPs{QebE^{RFi}#BcPUPuKuLK)t^l5_@Sg+M)6Huk*vw|ByPN;B8JPPN+g^(@a;; zFf<2iNOr&fj=Udnes{%m366?5SOPtv=VdQc-Y)9|k|Uh{4tT6OBA#1Duk$(2CP545Y{KU~Jw=l@&;pp8$J~65xQc zL1qbt$~=~nOqiL03#3Pb;Y`_h7-7KD6Qx-H7wf8|lN*0JjUfJi@RLA$503E{m2>g) z54hHm{cJ8O%yrMz%^5Rt1#N~{j4+s%^_E)aA;I|)gXS{d>zK*w`ccLZdRn&{w0ctP zmy#u{9>T56wf)~S`k(heK8V1gb80@Azx8j>exRit5gx?_MHvvq=*SR0te?DM0krNq z5ix_|)_`1?ca3R(2bb4wOtEE97+;7<+(0y-kZdRJ`DTeoXT%1@HnW?wm_j zD!qgnV9hssyu5_l_bcR+dC})`#}*&u&)Y7uUySgHV42o1PyuwSL3f2zC>G;J_00zS zgp$DOL8hvgA(u4}q*nt~tJ5PQ2$yP{VaFd#Yt?$4jn@!=5&V-Y+Q4YjP|^@V9wB5F<5!Ku{8Th51Knh)#Zt=|pS+gBLV>eq^(PJ4ya@0te-S_;M^ z!w-NGHf;!hzBoN2_GAzVY`p^hXnbVb*Lm;(g1BPM-7e?y7ti-HioxSv8G6#tS@C15huWo z(E2a7>V+HjYvUDo_%n9nN13poadPZQX)`=%98!FpQu^oLX0;vZohu#+xt#=7xP=MV zhCnxBhs~nuuNQiKlzmnCA1YgdBm?oa^i5rV%uIIdIO4|pgD&09HV9F124y|?`jq)0 z$6hgf5H{bg{MIle?w|3GAK@QncRub24a2Lbou|u>>}Ra}r1B>St&D7!kBpq>ptGOR^vmT6aKk2E&azEFjPM*yS>Y3KHLt7H!opv<;8{ z2`jZ87-U3*5dQE7A{`WF69NsbyZ{!yGzZ5iJx0UFsETQC z`5kRj0;2urx1Wwtx|PX#^pSE`3rmy3OBE2sk#E($bZHkbJk z^Np32Fel#G%6YqzUe6{nd?-NLLNj*5oy~z%$0!hKuy^!-M+!e5M{mf!R-wLbN_W#x?#;djykKH9-0}fXCQmc)YOLYd zQjJw`7IZ!sKP{#C-&}vPono>2FH#?i4P3S|e?-fkPT7s#7ul1cPx$OLvoh62K}eSf zEogYHFP3mhryuDB9ujNmXTHPn{3*$Q>dbU#kg!(8I}+WT zk<9`ZaL7$uPJWU7YT!fE*t{Mf?SOj#PepNG7#;eeXsBB^9ObrU<4In1 znvQ~o2!PS;2nrd01&{)~lE#7^+|2I_=~dV0WZHCByjm-5bLo=$>pRmTXPm$Raa&<> zN`G%-!!4#flzJ4s1r^$hreF&uI}2n0TRk&7M;RI7zs?!rH8r?CnQHe^rOBy9P1FEx zKIYLhm}9kTf6yo3#O03}+ewLu=6gmaMWn{0OCKd&oET4kDFBfviID+GvH%Chn#rH4 z_u~nW9oP#w+2ZY<_Ja^cVM*-%cN=*R$VVE<79*_6xE{otO2g)B!PEr~!QdKXBgPjC z$nABJ4U4tFvmsw=@PEg|An|>NWRTVAuyD#{p&VSp030}YMM~4Sw4wzBt{YuUUsAAd z(oEzA#>^~#j=Lv%-ozL4vd+@j?Yk~4hdn+wyM1EYiOKv~{lp&+M7`oFtI&YW(5)Qy zR!+dl>tR`Qet4s1C~%iu2zG|$QZYKe*?bQOT~BL%HKot2&MQEb)u?Yu zHKv0y4y@yFvf*uv^hY*5SRnH98Q>$#l8b2uPE)dfqcu@kEF+$|!f)>@={IK40&jB* z%^1!AZ;Zql$1hM& zJNix)E^|=xu-z-1hlJ?~j0XwvU|r|B^>AGo7`TOR!PN92^``(G7eB{&i?S6|s-yKuN%;Qk0A&T4DjR>B? zo`v*}kmo!V#BvvPu_1|t-x{faxJ!HZ)s$6cuGayzoDUI!a z_YG)E6&aQ79YoANSy4SQyn5TAL0F-L$ ztbzEilO4>gfPji-)1j2U0sq9&{YZ{~xDg9#z;2@rMWI~SF-7)l76!NC&KHhqhISbo z5$}|ymuEaNl6b2eqEhOuQtweymtxpzNbqZDtBh)UWf^#VUNYNQWmfJ{ca;uFl5!nC zb_B^Zj7>s&SNXLOeG)QX@YL}6vwPqOaaj&k3nc9+OE@=OdB?VYaAF#LY8Zuk&)@7uZvSOOxnkYm}Be>13APM5w3#t~1*z59~b;}~iQ<}Q4r0+zG@ zr?UqF@}SSGkMlWyVED+N#QFhwNXR?;b{3J^Wu^Jf2!9q4M1{&X&6S{_Y;g+D_DD|E zq_V`to2TD6!~d-qIxq2mcN&{v@J(3uSsbagcMuH=i;%;1oa>Mn1@M5%1Qmle4BnQ1 zQ_PX`bllySy;Q_5%XRJdT`$TT7VoTX#cEOpn8AmQakdoYN!3kvP$sdZoG*tkAvupf z=1f~A$q4?JrHA7jf*AghNtK^f76DQ6qM_`(e>qX*kuSE+-!1 z_83pK|AJCHw&R0;-;1$!H(}F83W^AG+Q9hdS*#lKv2`*QF5N8(=Gam*V`K-$kWpKx zV7Q-q{arxB(_vk;47MvB3$k$W@r*T1)QBR9ju7tU?(*=~GzN+>6fU!YAmD#eTu~5f z8NX}%yi@s$vSdZyPrZX?D?Pj#ruQ?+P84l9%t0-(H^s$&Ta|AtoC;7dk+?>w-%wUh zZ-B&1_n+N=V0WGt)zyou2~b1&LRA=t=Ss`CAHXZjc49T|@HxH6RjeJ@$&F}&{eXAh zzu&IO*0|e}M_yayAjt6x8^^$%=33>b3)iU*D;*NeI42*= z%^v1jf-_EkbZ|Gh(fQG^0*fpoY_;f+Bm~4bg=Qy`?U-5Lx3ESD`7WjO_OXLyWp3~< z7|7=Ct)`yLC2;D$*9i)e#Cktb`z-Fee2G3g@3$l0{yw09e3``#)XB-Rdz!;ftgd%w zWK5&>mU1fT@Y^aMwhJPqLu>qMMyAhxtS74YG4At!3>7p&xY_I-eq9(18(AB-IaJXJ z^Y1#D6lHILGi__M*nnb?%!Jaa4W`8roS6 zRon??T#)t? zW#B)5OkF-?bgPaBtK29!q0Qw7vW%3yIef}+%6F)DZuI*`ZbW3ub%MN3F#ta92ZuSk z4Ln9$-ZU$CQD@HOHJ0}nyEiyChNvF-t|}2V!fV zfpK{*r;fMIsC-_zU#{c~%EDkPCah>< zIQ6DcBv#JcvL(bKAVnk&`GHTo*Dy{Hkn1c#vZCqXK0q%jl^2k{+`Hi4Ikr!yq>@yU zg9V~M1Xkan5=}G=N?YIZQ0Pj4H)&7O^+tH!J;RUq*-~bAXXZ^>;OCI?Iz3NzuuJ}b zeM5jKm{o3R!tp-Uk#oF06fL);M$!qODonL>@^zU>I<=!S*;gt2J|xt={Gl3}u3aa; zZ4G?d=9Tdt__}So@;9PfhPx0UN;?BQ)X4Oh*?tdRrY=rh0wqRw?qOj(aAHpb{84Oz zPXRFHXWTioYr98!qdtJbM8cRwoC27|8toi-kgMPO(vTfrN^evf{>UT>HSj+vrmfUzXqM{v5H} z(x<|o*54%-y#9mcpI#LvZ5CF4I2;3#PJ(+$E%jl2gh88$ua13AbrzVjK-5tP7^%{n zxC9qHdh!jrvJW4I8v8=mIxB;5dUph$ody@yE)W3yWZ#RmJn5{J31`xj_WCL~Ny7ps zda0Ce-L|O6!rYy#FKoe+5{$=F`kq*PkG~ zK3o0N9+6(pcl)~zqF{o5epWMlO)Iox&f*JHf2-#hU=^DvcwPu4;?#HX7xg)lv_@H7 zxTbJTe@7*80sU-!yG*4`6$xtfvO+-l)-=`ndGb=-JXo%gZI$&n%5(ZfxHFZp$_n=L zVI{sGAoh*S@^M%$AXei^O01B8FJ@u=UN}VVaHzk;T6OD2ftMn7(rl z?1!g?LYP=dh>!ne#jBx}Kb4HA+((;V)4d1uW`Hk6KH${_QJ8=S;!!?*{xU^#?o#V& zpgjAnxon=DT0+VU*xfJ&oqG%nMl|Ope2l*2d1@nY>8Szax>e1UsLv#jYBL|d?hpkoKMRDao#B%HgL$SLosiKihIyu;z*kH3j87G zfrIsK52^h@_q3j1a2*DD zgG(_$iN??8w>wk_z4s7Mm-e?54^DCdDEQBHK&&QW33RZ3EBx0sW1T&O35}jjv|cM( zW_F8VDcKm(Cfz(6A|X}T#JhlgZBJi%6}uDompnjoh5McoA)a5T5y(wmh_F6uC-yiS z9JW?(>mG|@x5^44vIh7ie6)?LsAMs}T3K*3(iq3kD&tVzq>~IeN3zhkDv6?8cz=L* zE}YU#1bY5|cfLAXn7CZ)@l))~&n~C%9(zooL<1?00Ee~SnQ+1(9*mbAVp>$7Gxcs_;X+Zv4#dre$75g#h_gnveEZ|`U<+@_mmupP$8N&{zU}y+1 ziESYyjZ-r#^;OV(@x9+PL^W3a?_W+K-Eq(;Y)$u+&EUxupb=8;aDd$lmcK64v{^Aa zu=aEh-)-YWybYqZUs#{l<#8YC^RPdxgr>ZS)baA#h}?xk{AR{{-nCt;I2-JJtwCbd5JvN zCE`<1^9-;}tt-4aQ?AjU$`SwnJ(hESpuDZ|m}b121F%CeRcs`U-wO7eK0e*h-MA+` zKIn~&kl@yMwr@$UvjA}9!Qsq*^han?Qh~|W(yc+|>}_25tSPrwtQ!HenqVNig&`q{ z{V>k}bYUVakO;lkubho|l&tK$ zM?Nfr)`JFyRFjNqzvK>5wY?T6fbS2Lupd^l`N$0@YSlu^)gtL6~kE7MdEf;gfPK5o{sv|8=guDvdluV;Fd+S5;2Q1s1)kT*e}Kb&32 zIW<$bn4cIJAq@f^@}+V^U)vmiZm9esq9zQNr?I?-duQNK#T5xV6A4gDF6LV{)bRTk zB4yZABWX(Z%T`eT`mWz2w`*+eic&1{DBV%jy@`p@U>vjGjG|P6d`XYmA*Ip=;6IgS zT8RkITb+4eC?;74H2ka^zw%WNE5kJc-j+&@L!@98dlnV3`c)C5?MqdEGew!~sKSpC zbl(C#9M?@n!xQ6FgbzD0mhmM1EzI2JZqY800xTyhX}BUkRy>8NzB}xceJXU4W0{5S z%b5!W&To4S1vOSty-eIN@%7NQC?XTeV>T*#?0|IC4jg1&E zC;~ZYRCL{lw|Dv)s|cTeuOaVBb*YMY$>eNcs?LPKpT+{Mk_Nactnk^Wqgt#IleILD zQXx(qs8wROXTPzBNR*4w6VQe9@LOr~TL!JFiA_RLQ~*;0{zzo*EjnK7~Sk8e@D z8kK$sxD$0)D9Kkqp3f|geURsFpVw@z5FkgWm(f7{UC-s-M70o3sa4C)W;3%d>8hFV z#_{=)$3{y+rs?1Df}syt@CGg0f(Exm?Jo*Lav%TMYm(b^cQV85q|N9A*#8KG*}gbQ z|0^2C3;!GPq4_9(E0K>|s}_zHvGX9PCE^Bt!eLUeyS($&pa-=*kJ|qc)zgE5$C6iV z=Pf!TzoTBiEvcfh(^v`pMrgM?pNxoK5a1q&4)p$7&P-5JOAe z(_{XVKld2RPURXx+0#O^NwNWr!qsjR-W57s=Ak*;105LLJ_u8z{eOFp8jUE)udmvz0fuWrC|n*^T_Rxp0s)WZoZdQSqIm_r-lsRJVtZ!+r5P}} z%LJ+y@l@Ha6648=o?ZGL_Taa_sX^nZLXT!&YJ$iHL>_i|LIA?^emy=%8dG7Vuy{ zXKOc;P7SYt%Z|QbUoU*8HvG;^VQGsEPN~X#@yasV~(o6`u9@4PTHDaN7kkSD+ibiu1ctxsZef<$x?G@zHV%M#I z-Ngl}0O}>UOr&J_%$V0nneS`>-j}uYjP>;SW6 z@(M@l*kw$;%`M`m+T?4c?#XSv@8Wt8{)fog2lCuCGKc|CCRa>0s3W)Tr4HXsj*vja zj{9sp+6j}7Pp*OV+@#`+;Q|9A0R#|#>C;qL0lGMd8wUQkBZ>5=O_F=TCLhkvveh*g zwsG#^JLlXKyE87HjHl0I+RtO{lQM~dyEd{(4=n_d#-CwGObAXbm_bVxA|exOpRJ;_ zhQ}rhadL?%6up2_{LBwT*FlWxx2S&>Po+@Z$-er}&c}0iU%Fj*p%rmI`4lmKXI*1g z3M7U0nzma9SITjFs?n|6Vp&m@4M~^qDkuK&D5iAuZCN*ANLa9k83!vEV3S!mNTK6V z|6*+-c2+@HK=iKwWH#p1$*iS0M%B?h>(#;@V)DA{qqQ#*Efqf@cG~|(I-A#IvV|*{5~)9a z9W2gJQ&os9tM$7n5uYl5HJhZQSC>1@P%T>H=1k!0l9xJE{XZ$kK9Hf;^}!%b4$bP{ zg{4m|up|}k8j_hVMIumxi*|0N-Yf)Yb8ODZxU`ajS6RO&j4-RuDJ91esO)wjTQZYx zd)ALmSkwB1i5@N3M7Z?&(_*EcpR`j9k7RRgB0}FS@t+-B7L)OR9v#cvM@J@(vL;`7 zIk6KhRtz)sMt_Yla6DK6ypRQ4svd=rlJtm*>~Pm;Wt#Dl%aqS6d%`cvC<*05t4@0J zm|1*H!M4UtJsfv2fcNKt2&pRLaR?&g?_Y--sjlWQ(7O=_j>b2b3A*yo1j;PJJD)}y z@<`5H){HdijDJXf4=>E6)t{l3Pu0?|7U&L`G_cfPcPtn#6@m7JqeA>MLt(`(Tz(OY zrq=`fZ@SQzTeAPj@_kaQT&5p((`j7cJAE#fm}SgdF(ooEPEA<32%A#I=r`Nz#>z5C zC^cg$P7=xZMhszOo*%{`688ZCx+(({qgp_BL&AAri>-@)n4DjfXDpH0T**KGV~t8+ z80)ml@pyt}PL~6OH*xA?5GMT}W|E9zzZU0_SA@>quw)=i6XvN%pEQr?ci;9-9ksJ4 zr|Gq+CmQcWk{p0pSZcLGzZWi?o?sg_r{P(}Ob}f%_bIpWC!uo|(UnF>aVHhHIYvwI zfK7`JMGCQhKMR&+YQM@C095xCl6UIGbrF;30gJi31@aNYI<&?WL#KaM^i3Z(DiS+t z?RGYK(m|JEI1ry>Oz-|aE+4>r{zzF;j|3wXis3+tR==2Wq$r<+8%!Dv2akI3!qh_^ zS(sAje%`vszaSIFSr~hjP|9@{D#w!vN|w>Xq5VF87LI6fxBxQ>EEefdkb|g-$79y) ztOjD?`O0*YA6g$IRNJxSz+Vnxq1=$u(A(5{^$)mJ__J!!YRMT}^C*mvSc zhW8CWM)7kuR}?L?-+@Wymt{m2u*i2y(|nH91+a%QLSvtn5bU|^>w2`K(zyg_5{CGH z&qUu$^n>TQJ$}yLe`dPN!avgNN^mc1N-^aN&w0Iz!s>M^Dul_i_XuDw{&*-T(9<1# z1mr(j#2m!3+hNePA!Vs+3+vL`(g5{Y4fr6Mpu-WfxRcc@iIr|(8y7{iD;&!|5YIjZ zrU^%8C!PD)+g4J->hJzM{S?qpaf9rCWqK3F+(VP6M?tyALI$(Poi9?6ExPD<#axT# zW>Eiuw9E#MFAjDl?Vl>7YMN9$Glk=46?>X0 zS2G^=0jZH`43T?J0BC6qC|SKi`gDF2Cqg^jgG3@o=@4JCqs5PTlBOX)e9#doBSh2{ zCd8)5g;Cvh8;vCNwY_e8ie&@H4*Jj<>M!3szq4t*|C`dg{lN#Gk-Ry7M+RuP2AUS_ zq$zP`3I7@HE4fS?iV8x=kyoQr`#1Yw8cd;hV>n`9cFFAIon{c=oo2|1!{*yat2T?! zhlTmd<3Qf!w5;-rYj#Dh zxw&mE;3U#2l4qMQm2NY1T3(C94M$EF`j(4)OtFyIo}8*_JX!8KSrW!S6=rPo*K?Jj z>Sn%nh&zXeV_~`K(R)YRGTjzV6r|)*0DwzD-(6UCHpw92-7=kjm#k_8{M8zMC=_v~ zquA$nHF8}6xC#lxciKywrald)*V@=3@?)^0yLVx^YpVt#kUV?-lq+}Lr!tI?{al)Am_XwZSTr)O6$1%;*QZWF{3TOKSUL3l;#4L+teF zORe6wg0&yjRm?Ac77v|stF6I8z;BRbD90!-o z!0+P#u_3^kHBW6mQkp%bXbW`A;ZsxvIW^{bc%Q)6HsCD6<11u4*YTPS=h+h9&S=g@ zU){ckA>^POEW7sXTsR9iS(U~0S%jVX(!jO4Afn27w;p+awY7(qm5}^tJmQ&h#qwG5 zTYQ4g1%`dvxWp7xi(X~t-yIMdsfuA_*`_Dz#ZHwokXT*c#HbgV&Z|@+M{^pQjU2>A zNrb*;@fe$vdqX8-2rlgcyk^QecGPiDaKtLnX|$`UoW|iFy94BAjGew|WrHB%E^+8Y z9fda*36lx3EN21Rd3-y9 z&qc_8*=iLQ%cw-3@(@=0=hNbcT7BLuNx~04-MXKoKzGlaMMblMx5i*m63beu(fz)! zjDvsK35GsZ)H>o~C->+0nVxmsmoG$haD}h<0WK*{;BpIn`9nX?y;~Xrv3H8olFIjF z$eS2k3S^v-O^+YenALUv!poSO)dzI$$EuirTRh{v%KA)LjVuYUgcPY~hM2#Mm^=)X zckj>_3rcdjTT4rJcf3OM0g@p}t)R?Z4j6xJ}~kXbz5oyt*+ON!Kg+;?o>!L2`QL{8m&9t#4u< zrYp0E;+?0SP8{e*w5L>DaOkQzvwm-#8Vq^^VJ)UMvKY2GT|%lo%4C*RzhlFO(|scO zJhui)S0)W&OsYoFkx?NW?UzY^6m^oLy<;oI_#P%_BdKi{)EEh|#}+Npv9bW~v~a%f z^ipR@SV1(MevBuD7~H5K^NnuB|KC@S+WR1tu*7XVHj7Xn-OCH($DaHNRoYZsx5Wy& z58|GYLn@M-BZT*Dcb_+xXvOKec3M}o<^odU)i7d2U69tJDh$xxPH>NZ)QDfEn8xRy zmEWc%fRR%rOG$ora=@vKH4KNq&I z+O42#A7;WH6sp){h@pEAFN;(?S(o#d;h$~96}fVbJ{Yjee#%iCPeY!NxLQ~zo1S{k zFV1O=PmnYkAcc0G>WX-O1yI41eC%o?e(xr@;<*EN(9VG`_ni;JVYRynwB9MC?GpmQ zva)#5)R|K;O$|>aKgelF*t?=w`SYPz><1R=Ez5|SVE+b>q26zDgdrU}L=^dhvaVDJ z<`5u^jXdGWrMCjcll-o(p!c85yjefJ1pzjlkEqIZd zj?u%N*n$0`kPjmsHTy|7Lh-^P7$VXJ$T=%nko-Z=-1+$GADw_Z`cY^pNY#i_7w1if zOidIA{hU%An07#a`{23+Rnr>%hge%W(AYDjL!=#LVUZCDY;>#ovpPHw$xcEtwcT}j zRiOZp<5D!)b@oH3)fh;1*)zwsN6nVaa9~VEGK&f?=^L_)@aasNO(zeeDyQljun&I& zDrmN-7#05g%9uN!2*8W59F61K7S8>bVbVg^RYpnDn*61IGf|+T#H7EOa`*%XsCZb< zDfQMHr$xFNYa!{wWb7i{;DD*4w+Uj^*uy@DN(}R)(ge_x{FlfTetk~exl0UL=3M47 z1NMX!Za+VcW%bkm1PLQW3tISP!7Tp$Vd{=Y@PJ%@W?Kt`1_gJE+J>K)$T0}j3W=ng z59y$I$(E&m)ng98eJuPI31Zh8!p`Mfj6eWr)q1AE4^En+|1_x`l+3;_&e$@Ce6Oj4 zPKOr*8)^!3$@j`86(_8hc`AAFkT$t1qXJF~!V_W>_|7Sr>3rAoX(pdKDwObksa(!I zdMddU{=>WZTL!z#@~7)sAot6&P|eWc-_TBl|ll6F@1gj=E#F8+x&~4QE$(NIIk$q`%RX=vPlniB7prsE5#Kms8qBWy7d=aLw#M%aNB9 z%s4`S9!^f%JaZbYJcE2?2k*nKGQV7}mMN;JcB&OWQu@T8=5}s6Hcf&xhJg+KQeV{5 zp4i`=X({R#`?7T>GS-fsnEX|6x~3_1i}-N_d3h0QNcrb3?78I87G~;-rn9a{RY113 z>+FkKi*bwrng}MNEU{561Z9J#?!aQ*z+Yz%MP!t4q4g$IYDf!D@30DD4@SlF z#u(3+liZ9?#9Qy*EI!#HZ%Eu z6dvt&?21;c8<~=X-Zw@j^Am2Q1RMUFi7dcn*0H#dST$JARV=!y2dfZy*;X<{|y)33~n~$k(-Cd8PXdS$2XT$ zmr@gB^SLdX89LM*(;#v?ibE?RD;Rx$DFsZh0f0%UD~WEsXgYhYZ_lSHW2CmhWsC=b zmV?xy(5HGc+qDE3wGb1DGB{$)ex?n54N13H=R?b#92}E>1^OMEv+NZt$1p6~)Qg7h z6aoB;o0zzK5qp@G-V-?NLhBDL!@BX+Uo~C9Zf_ue{BBnoF;31%w2ja4lfeLg^;iqf zVZ?9+Ij5g|L(hGm;)H*|7mc!Riz+z|b}VLt8iu&^jaW@5ZyK(*fYl(V7qj*G2O!M! zr{roxjI|rN?p`xAk4rw>hMJBG3XmW;i%XI^oCl4?jIRu=vTpi`)+lOQ$hPV zQ{%@6?tks&OgMDO+jf4toDl~b~xcx zKfa#&i>059VI3WnpSGWWSoRMvqa>;^P!cAwu!P_Ckc3CeY(R{sEL7YQ$ui^x>vOg) zsZ;+iNkC(^oWEDcn`VfqKI9oZ+=1^sMeR#6qR!U45*TS{w3!hl{(QuHHJ@~ ze|)AmVA@B#8DQ8r+bv)D)w}!*o6=GNM-zdNVn4sXq?&VfjL)8^FLm*w<;@RN5OJxw z(RRIWhICeMg`tXg<}%*({Ln!T z8kTeYmzl{(?Xu6s()8uDhB{I(Ivzv+aPpS)Ch7|a(d@cYs|pipnxb~wT*&k$?=JXt z>=g60d|K)Uvt9gl*u7#QIb_&w4ngseTcdgj2S@;`s zZ!;U{6BKBFk^OY^YjRoH{O0l}UE9M^FuwNDb zVPj{<5yn1r=-;m9OMGk)ahT0jYt!bt(rdNrD@|CS02ld{Q|z%QYLJCG1~ur9Z=yN`-hZDveu6kV96Ytu4; zWYhmU#W%pLhO&`1)2B$$9%tfx8Q-<8K)L6CjhlgMd$AUOiNr)GQjmw1jS!nv#7vnL zomCLxkii(;qG0z1%d1&eGy3pDr!j?D({Bbf9*gY25QbJn#;I5tOgx>K@NwA^&0aB~vF|pj%T}}lz;D}gY1S2+>hQ>?cb>Ju-20eI8 zw27g|%VQ7(BR|S{l~F|a5O?u?-Jg~_SDUp^d!6Mf2yO}a3EmI6G!b^t+FU*XbM&%p zW%J>^b18e#7npV(Bh*(rjHOqLWFupL6hFtqB6bbbShQ9SwLkN7>u}#JM4(_&A_EW# z#xYeuzgW~7Jr1#%Tyx{*ydY}CO7r=JUJqO-##)K~+{4_UnT)J6torbMxnS?X>(_<)25@6qA1)z^oc?42&Z0ow*oiEQ*d_EeS1306cOM=hU|Zz*{9b}RprxfK;T z#Zbgt@4g9hvCqA{z>U{zv-}R-ARk_oi@27`J}^J{9VEup6iEVYb>ubhb>3ni(v-IV zGXCC=ZMvQnpUl6!dy6D(WhUdH_O^@oL7i--M$C>%5Ed-#LtKGDA8! z-x(}kAu7@+geK=L6xf7OPs7@t;#c{`u^9IJZ47Up@4 z!F+W0x!-Ci9!;}|0_s7!j~s8n6j-iG7t#Aox1?>R*MWG8+OD|u&?(Vq?iM>?x|e>e zg%MKxZyx24#}@H3u1SOr4g|5Ea=t5h%yJEnhB1U+QRFyI_YQ@BT_2PcU{a7|kPfUK z*gOwn>;*GmYtG@CCEr}EkcHakwUqc>*gc34=C)mx7{zlFnwvmBnVViy2GJx$ogO+8 ziWll)R!Df)e(wBC3?a$8svG+r31?`JS9GL)nRK_AL5poVJhjj0*=^N#|GBMFj9_o% ztzXo49)CeO`3OCKxNDtdBo63?(tjjzDG7XFr&|m~dPmq&=oji>N7oS~DHEw{kzZ-* z+{!b%LY&W61;+YF(KpLnY-bFKlWss%(qUBx&wwm^-3UTKBAsnYH<|^RmH>)0c3n1C zPMhBeCtuemK*mcOuXrJ3V2e%qiZVeP&YgQwWJAaZ0530p5fD0_7}Doa#VLFo+rC(X z0j}5TAsPN3qHVczpU|qswgqMN3vHVK1y>z%?0ZYbdFu~u;r+TMKS!lKVew<~W{sVp zrK1T*ALuuz-n)e_9ym@2K0#S~rf0x|YW5HhwlPGdCxXj!X%Otom517ojK}3eLGn=gL-h0RT z)#2H7I9GuvUk8APMVDtHw8bq`S}JJtDL4aDsllge4evkJLtChRrQZE8sXEZWux4{3 zky{jdalq?a2gtedFV?7~8`*YTd`+Z^*3^N?7-}Ma1DUV!bch5?=Hrb}0SRu^@^FkS zyJq#|gJ41QXLW^qEhvk&76yP-PUfK&Z9dV*m*zPlB=`NMZGYt?y!Xs}vnmu~vC z!xuT{SMjCg1{!{)2~NJoh&zt~S{VG4cR5zlLeYP+6bW5P-}|gew9(A0%-feL_;h`v#ZP+w8s&+IDOpTpuF4tOiV2+nsMqiTzm# z6&L*;9$9A(YF#_X{pkzB?f6}e0sJ|C@?pSL+M& zM;B!Nq-UViCL?jIj6|ggGz*tkrZBAaLGm7(K4x2^M=6YyF*m00; z10d6W0NVmrw@h{z8Vv%u0yCoLL2yKxte^i7vQ%LCLT6p7pm)=I;fyaP2o%~M3+F*LJTt;h`;j^%&~WWnwq72gJu3YecMRlK3nD|V zH*jU&{Zbi-faKd#?n8~Y-0l%x-ZORXrEir3dH3>(ygsX)H$6we&R%MvoI_WfNJ<5{ zZazDFSz^P9smWHxaHsZ;74zp5AWQr?MjE1B7OnvQLBx^)#ISHj=w*(FtfeMZ3T-uH zOgt(O=sxGi>6?d;-(YE}J1Wxzf69n=;27*Wj`@TQvni(y({9?b!JIG$p?c@$yje4a zUI!~wgO<9U3ywz7Y`7pnp4wNvdavpKso>8-aRJNXNnDXm0zA3C&3j{f

(qsl^Pi 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
xg+TnaHX7SrqqipCW?-uB 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�$$t?vsH&vRnP;W#`s$cX8=P06 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 `@qLluy!Fr~qC`B!VelNXDS+NNjw>kQ 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
wD*a-2-J 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çUN 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 T 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

-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