Warning, /plasma/kdeplasma-addons/applets/quicklaunch/package/contents/ui/IconItem.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  *  SPDX-FileCopyrightText: 2015 David Rosca <nowrep@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 import QtQuick 2.15
0008 import org.kde.plasma.core as PlasmaCore
0009 import org.kde.kirigami 2.20 as Kirigami
0010 import org.kde.ksvg 1.0 as KSvg
0011 import org.kde.plasma.components 3.0 as PlasmaComponents3
0012 import org.kde.plasma.plasmoid 2.0
0013 import org.kde.draganddrop 2.0 as DragAndDrop
0014 import org.kde.plasma.extras 2.0 as PlasmaExtras
0015 
0016 import "layout.js" as LayoutManager
0017 
0018 Item {
0019     id: iconItem
0020 
0021     readonly property int itemIndex : index
0022     property bool dragging : false
0023     property bool isPopupItem : false
0024     readonly property var launcher : logic.launcherData(url)
0025     readonly property string iconName : launcher.iconName || "fork"
0026 
0027     width: isPopupItem ? LayoutManager.popupItemWidth() : grid.cellWidth
0028     height: isPopupItem ? LayoutManager.popupItemHeight() : grid.cellHeight
0029 
0030     Keys.onPressed: {
0031         switch (event.key) {
0032         case Qt.Key_Space:
0033         case Qt.Key_Enter:
0034         case Qt.Key_Return:
0035         case Qt.Key_Select:
0036             logic.openUrl(url);
0037             break;
0038         case Qt.Key_Menu:
0039             contextMenu.refreshActions();
0040             contextMenu.open(0,0);
0041             event.accepted = true;
0042             break;
0043         case Qt.Key_Backspace:
0044         case Qt.Key_Delete:
0045             removeLauncher();
0046             event.accepted = true;
0047             break;
0048         }
0049 
0050         // BEGIN Arrow keys
0051         if (!(event.modifiers & Qt.ControlModifier) || !(event.modifiers & Qt.ShiftModifier)) {
0052             return;
0053         }
0054 
0055         switch (event.key) {
0056         case Qt.Key_Up: {
0057             if (iconItem.isPopupItem && iconItem.itemIndex === 0 && Plasmoid.location === PlasmaCore.Types.TopEdge) {
0058                 iconItem.ListView.view.moveItemToGrid(iconItem, url);
0059                 break;
0060             } else if (!iconItem.isPopupItem && Plasmoid.location === PlasmaCore.Types.BottomEdge) {
0061                 iconItem.GridView.view.moveItemToPopup(iconItem, url);
0062                 break;
0063             }
0064 
0065             decreaseIndex();
0066             break;
0067         }
0068 
0069         case Qt.Key_Down: {
0070             if (iconItem.isPopupItem && iconItem.itemIndex === iconItem.ListView.view.count - 1 && Plasmoid.location === PlasmaCore.Types.BottomEdge) {
0071                 iconItem.ListView.view.moveItemToGrid(iconItem, url);
0072                 break;
0073             } else if (!iconItem.isPopupItem && Plasmoid.location === PlasmaCore.Types.TopEdge) {
0074                 iconItem.GridView.view.moveItemToPopup(iconItem, url);
0075                 break;
0076             }
0077 
0078             increaseIndex();
0079             break;
0080         }
0081 
0082         case Qt.Key_Left: {
0083             if (iconItem.isPopupItem && Plasmoid.location === PlasmaCore.Types.LeftEdge) {
0084                 iconItem.ListView.view.moveItemToGrid(iconItem, url);
0085                 break;
0086             } else if (!iconItem.isPopupItem && Plasmoid.location === PlasmaCore.Types.RightEdge) {
0087                 iconItem.GridView.view.moveItemToPopup(iconItem, url);
0088                 break;
0089             }
0090 
0091             decreaseIndex();
0092             break;
0093         }
0094         case Qt.Key_Right: {
0095             if (iconItem.isPopupItem && Plasmoid.location === PlasmaCore.Types.RightEdge) {
0096                 iconItem.ListView.view.moveItemToGrid(iconItem, url);
0097                 break;
0098             } else if (!iconItem.isPopupItem && Plasmoid.location === PlasmaCore.Types.LeftEdge) {
0099                 iconItem.GridView.view.moveItemToPopup(iconItem, url);
0100                 break;
0101             }
0102 
0103             increaseIndex();
0104             break;
0105         }
0106         default:
0107             return;
0108         }
0109 
0110         event.accepted = true;
0111         // END Arrow keys
0112     }
0113 
0114     function decreaseIndex() {
0115         const newIndex = iconItem.itemIndex - 1;
0116         if (newIndex < 0) {
0117             return;
0118         }
0119         if (iconItem.isPopupItem) {
0120             popupModel.moveUrl(iconItem.itemIndex, newIndex);
0121             iconItem.ListView.view.currentIndex = newIndex;
0122         } else {
0123             launcherModel.moveUrl(iconItem.itemIndex, newIndex);
0124             iconItem.GridView.view.currentIndex = newIndex;
0125         }
0126     }
0127 
0128     function increaseIndex() {
0129         const newIndex = iconItem.itemIndex + 1;
0130         if (newIndex === (iconItem.isPopupItem ? iconItem.ListView.view.count : iconItem.GridView.view.count)) {
0131             return;
0132         }
0133         if (iconItem.isPopupItem) {
0134             popupModel.moveUrl(iconItem.itemIndex, newIndex);
0135             iconItem.ListView.view.currentIndex = newIndex;
0136         } else {
0137             launcherModel.moveUrl(iconItem.itemIndex, newIndex);
0138             iconItem.GridView.view.currentIndex = newIndex;
0139         }
0140     }
0141 
0142     DragAndDrop.DragArea {
0143         id: dragArea
0144         width: Math.min(iconItem.width, iconItem.height)
0145         height: width
0146         enabled: !plasmoid.immutable
0147         defaultAction: Qt.MoveAction
0148         supportedActions: Qt.IgnoreAction | Qt.MoveAction
0149         delegate: icon
0150 
0151         mimeData {
0152             url: url
0153             source: iconItem
0154         }
0155 
0156         onDragStarted: {
0157             dragging = true;
0158         }
0159 
0160         onDrop: {
0161             dragging = false;
0162 
0163             if (action == Qt.MoveAction) {
0164                 removeLauncher();
0165             }
0166         }
0167 
0168         MouseArea {
0169             id: mouseArea
0170             anchors.fill: parent
0171             anchors.margins: LayoutManager.itemPadding()
0172             hoverEnabled: true
0173             acceptedButtons: Qt.LeftButton | Qt.RightButton
0174 
0175             activeFocusOnTab: true
0176             Accessible.name: iconItem.launcher.applicationName
0177             Accessible.description: i18n("Launch %1", iconItem.launcher.genericName || iconItem.launcher.applicationName)
0178             Accessible.role: Accessible.Button
0179 
0180             onActiveFocusChanged: {
0181                 if (activeFocus) {
0182                     entered();
0183                 }
0184             }
0185 
0186             onEntered: {
0187                 if (iconItem.ListView.view) {
0188                     iconItem.ListView.view.currentIndex = iconItem.itemIndex;
0189                 }
0190             }
0191 
0192             onPressed: {
0193                 if (mouse.button == Qt.RightButton) {
0194                     contextMenu.refreshActions();
0195                     contextMenu.open(mouse.x, mouse.y);
0196                 }
0197             }
0198 
0199             onClicked: {
0200                 if (mouse.button == Qt.LeftButton) {
0201                     logic.openUrl(url)
0202                 }
0203             }
0204 
0205             Kirigami.Icon {
0206                 id: icon
0207 
0208                 anchors {
0209                     top: parent.top
0210                     left: parent.left
0211                 }
0212 
0213                 width: Kirigami.Units.iconSizes.medium
0214                 height: width
0215                 source: url == "quicklaunch:drop" ? "" : iconName
0216                 active: mouseArea.containsMouse
0217             }
0218 
0219             PlasmaComponents3.Label {
0220                 id: label
0221 
0222                 anchors {
0223                     bottom : parent.bottom
0224                     right : parent.right
0225                 }
0226 
0227                 text: iconItem.launcher.applicationName
0228                 textFormat: Text.PlainText
0229                 maximumLineCount: 1
0230                 wrapMode: Text.Wrap
0231             }
0232 
0233             KSvg.FrameSvgItem {
0234                 anchors.fill: parent
0235                 imagePath: "widgets/viewitem"
0236                 prefix: "hover"
0237                 visible: dragging || url == "quicklaunch:drop"
0238             }
0239 
0240             PlasmaCore.ToolTipArea {
0241                 anchors.fill: parent
0242                 active: !dragging
0243                 mainText: iconItem.launcher.applicationName
0244                 subText: iconItem.launcher.genericName
0245                 icon: iconName
0246             }
0247 
0248             PlasmaExtras.Menu {
0249                 id: contextMenu
0250 
0251                 property var jumpListItems : []
0252 
0253                 visualParent: mouseArea
0254 
0255                 PlasmaExtras.MenuItem {
0256                     id: jumpListSeparator
0257                     separator: true
0258                 }
0259 
0260                 PlasmaExtras.MenuItem {
0261                     text: i18nc("@action:inmenu", "Add Launcher…")
0262                     icon: "list-add"
0263                     onClicked: addLauncher()
0264                 }
0265 
0266                 PlasmaExtras.MenuItem {
0267                     text: i18nc("@action:inmenu", "Edit Launcher…")
0268                     icon: "document-edit"
0269                     onClicked: editLauncher()
0270                 }
0271 
0272                 PlasmaExtras.MenuItem {
0273                     text: i18nc("@action:inmenu", "Remove Launcher")
0274                     icon: "list-remove"
0275                     onClicked: removeLauncher()
0276                 }
0277 
0278                 PlasmaExtras.MenuItem {
0279                     separator: true
0280                 }
0281 
0282                 PlasmaExtras.MenuItem {
0283                     action: Plasmoid.internalAction("configure")
0284                 }
0285 
0286                 PlasmaExtras.MenuItem {
0287                     action: Plasmoid.internalAction("remove")
0288                 }
0289 
0290                 function refreshActions() {
0291                     for (var i = 0; i < jumpListItems.length; ++i) {
0292                         var item = jumpListItems[i];
0293                         removeMenuItem(item);
0294                         item.destroy();
0295                     }
0296                     jumpListItems = [];
0297 
0298                     for (var i = 0; i < launcher.jumpListActions.length; ++i) {
0299                         var action = launcher.jumpListActions[i];
0300                         var item = menuItemComponent.createObject(iconItem, {
0301                             "text": action.name,
0302                             "icon": action.icon
0303                         });
0304                         item.clicked.connect(function() {
0305                             logic.openExec(this.exec);
0306                         }.bind(action));
0307 
0308                         addMenuItem(item, jumpListSeparator);
0309                         jumpListItems.push(item);
0310                     }
0311                 }
0312             }
0313 
0314             Component {
0315                 id: menuItemComponent
0316                 PlasmaExtras.MenuItem { }
0317             }
0318         }
0319     }
0320 
0321     states: [
0322         State {
0323             name: "popup"
0324             when: isPopupItem
0325 
0326             AnchorChanges {
0327                 target: dragArea
0328                 anchors.left: dragArea.parent.left
0329                 anchors.right: dragArea.parent.right
0330                 anchors.top: dragArea.parent.top
0331                 anchors.bottom: dragArea.parent.bottom
0332             }
0333 
0334             AnchorChanges {
0335                 target: icon
0336                 anchors.right: undefined
0337                 anchors.bottom: undefined
0338             }
0339 
0340             AnchorChanges {
0341                 target: label
0342                 anchors.top: label.parent.top
0343                 anchors.left: icon.right
0344             }
0345 
0346             PropertyChanges {
0347                 target: label
0348                 horizontalAlignment: Text.AlignHLeft
0349                 visible: true
0350                 elide: Text.ElideRight
0351                 anchors.leftMargin: Kirigami.Units.smallSpacing
0352                 anchors.rightMargin: Kirigami.Units.smallSpacing
0353             }
0354         },
0355 
0356         State {
0357             name: "grid"
0358             when: !isPopupItem
0359 
0360             AnchorChanges {
0361                 target: dragArea
0362                 anchors.verticalCenter: dragArea.parent.verticalCenter
0363                 anchors.horizontalCenter: dragArea.parent.horizontalCenter
0364             }
0365 
0366             AnchorChanges {
0367                 target: icon
0368                 anchors.right: icon.parent.right
0369                 anchors.bottom: label.visible ? label.top : icon.parent.bottom
0370             }
0371 
0372             AnchorChanges {
0373                 target: label
0374                 anchors.top: undefined
0375                 anchors.left: label.parent.left
0376             }
0377 
0378             PropertyChanges {
0379                 target: label
0380                 horizontalAlignment: Text.AlignHCenter
0381                 visible: showLauncherNames
0382                 elide: Text.ElideNone
0383             }
0384         }
0385     ]
0386 
0387     function addLauncher()
0388     {
0389         logic.addLauncher(isPopupItem);
0390     }
0391 
0392     function editLauncher()
0393     {
0394         logic.editLauncher(url, itemIndex, isPopupItem);
0395     }
0396 
0397     function removeLauncher()
0398     {
0399         var m = isPopupItem ? popupModel : launcherModel;
0400         m.removeUrl(itemIndex);
0401     }
0402 }