Warning, /plasma/kwin/src/kcms/decoration/ui/Buttons.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
0003     SPDX-FileCopyrightText: 2019 Valerio Pilo <vpilo@coldshock.net>
0004 
0005     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006 */
0007 import QtQuick
0008 import QtQuick.Layouts
0009 import QtQuick.Controls as QQC2
0010 
0011 import org.kde.kcmutils as KCM
0012 import org.kde.kirigami 2.20 as Kirigami
0013 import org.kde.kwin.private.kdecoration as KDecoration
0014 
0015 // Fake Window
0016 Rectangle {
0017     id: baseLayout
0018 
0019     readonly property int buttonIconSize: Kirigami.Units.iconSizes.medium
0020     readonly property int titleBarSpacing: Kirigami.Units.largeSpacing
0021     readonly property bool draggingTitlebarButtons: leftButtonsView.dragActive || rightButtonsView.dragActive
0022     readonly property bool hideDragHint: draggingTitlebarButtons || availableButtonsGrid.dragActive
0023 
0024     color: palette.base
0025     radius: Kirigami.Units.smallSpacing
0026 
0027     KDecoration.Bridge {
0028         id: bridgeItem
0029         plugin: "org.kde.breeze"
0030     }
0031     KDecoration.Settings {
0032         id: settingsItem
0033         bridge: bridgeItem.bridge
0034     }
0035 
0036     ColumnLayout {
0037         anchors.fill: parent
0038 
0039         // Fake titlebar
0040         Rectangle {
0041             Layout.fillWidth: true
0042             implicitHeight: buttonPreviewRow.implicitHeight + 2 * baseLayout.titleBarSpacing
0043             radius: Kirigami.Units.smallSpacing
0044             gradient: Gradient {
0045                 GradientStop { position: 0.0; color: palette.midlight }
0046                 GradientStop { position: 1.0; color: palette.window }
0047             }
0048 
0049             RowLayout {
0050                 id: buttonPreviewRow
0051                 anchors {
0052                     margins: baseLayout.titleBarSpacing
0053                     left: parent.left
0054                     right: parent.right
0055                     top: parent.top
0056                 }
0057 
0058                 ButtonGroup {
0059                     id: leftButtonsView
0060                     iconSize: baseLayout.buttonIconSize
0061                     model: kcm.leftButtonsModel
0062                     key: "decoButtonLeft"
0063 
0064                     Rectangle {
0065                         visible: stateBindingButtonLeft.nonDefaultHighlightVisible
0066                         anchors.fill: parent
0067                         Layout.margins: Kirigami.Units.smallSpacing
0068                         color: "transparent"
0069                         border.color: Kirigami.Theme.neutralTextColor
0070                         border.width: 1
0071                         radius: Kirigami.Units.smallSpacing
0072                     }
0073 
0074                     KCM.SettingStateBinding {
0075                         id: stateBindingButtonLeft
0076                         configObject: kcm.settings
0077                         settingName: "buttonsOnLeft"
0078                     }
0079                 }
0080 
0081                 QQC2.Label {
0082                     Layout.fillWidth: true
0083                     horizontalAlignment: Text.AlignHCenter
0084                     font.bold: true
0085                     text: i18n("Titlebar")
0086                 }
0087                 ButtonGroup {
0088                     id: rightButtonsView
0089                     iconSize: baseLayout.buttonIconSize
0090                     model: kcm.rightButtonsModel
0091                     key: "decoButtonRight"
0092 
0093                     Rectangle {
0094                         visible: stateBindingButtonRight.nonDefaultHighlightVisible
0095                         anchors.fill: parent
0096                         Layout.margins: Kirigami.Units.smallSpacing
0097                         color: "transparent"
0098                         border.color: Kirigami.Theme.neutralTextColor
0099                         border.width: 1
0100                         radius: Kirigami.Units.smallSpacing
0101                     }
0102 
0103                     KCM.SettingStateBinding {
0104                         id: stateBindingButtonRight
0105                         configObject: kcm.settings
0106                         settingName: "buttonsOnRight"
0107                     }
0108                 }
0109             }
0110             DropArea {
0111                 id: titleBarDropArea
0112                 anchors {
0113                     fill: parent
0114                     margins: -baseLayout.titleBarSpacing
0115                 }
0116                 keys: [ "decoButtonAdd", "decoButtonRight", "decoButtonLeft" ]
0117                 onEntered: {
0118                     drag.accept();
0119                 }
0120                 onDropped: {
0121                     var view = undefined;
0122                     var left = drag.x - (leftButtonsView.x + leftButtonsView.width);
0123                     var right = drag.x - rightButtonsView.x;
0124                     if (Math.abs(left) <= Math.abs(right)) {
0125                         if (leftButtonsView.enabled) {
0126                             view = leftButtonsView;
0127                         }
0128                     } else {
0129                         if (rightButtonsView.enabled) {
0130                             view = rightButtonsView;
0131                         }
0132                     }
0133                     if (!view) {
0134                         return;
0135                     }
0136                     var point = mapToItem(view, drag.x, drag.y);
0137                     var index = 0
0138                     for(var childIndex = 0 ; childIndex < (view.count - 1) ; childIndex++) {
0139                         var child = view.contentItem.children[childIndex]
0140                         if (child.x > point.x) {
0141                             break
0142                         }
0143                         index = childIndex + 1
0144                     }
0145                     if (drop.keys.indexOf("decoButtonAdd") !== -1) {
0146                         view.model.add(index, drag.source.type);
0147                     } else if (drop.keys.indexOf("decoButtonLeft") !== -1) {
0148                         if (view === leftButtonsView) {
0149                             // move in same view
0150                             if (index !== drag.source.itemIndex) {
0151                                 drag.source.buttonsModel.move(drag.source.itemIndex, index);
0152                             }
0153                         } else  {
0154                             // move to right view
0155                             view.model.add(index, drag.source.type);
0156                             drag.source.buttonsModel.remove(drag.source.itemIndex);
0157                         }
0158                     } else if (drop.keys.indexOf("decoButtonRight") !== -1) {
0159                         if (view === rightButtonsView) {
0160                             // move in same view
0161                             if (index !== drag.source.itemIndex) {
0162                                 drag.source.buttonsModel.move(drag.source.itemIndex, index);
0163                             }
0164                         } else {
0165                             // move to left view
0166                             view.model.add(index, drag.source.type);
0167                             drag.source.buttonsModel.remove(drag.source.itemIndex);
0168                         }
0169                     }
0170                 }
0171             }
0172         }
0173         GridView {
0174             id: availableButtonsGrid
0175             property bool dragActive: false
0176             Layout.fillWidth: true
0177             Layout.fillHeight: true
0178             Layout.minimumHeight: availableButtonsGrid.cellHeight * 2
0179             Layout.margins: Kirigami.Units.largeSpacing
0180             cellWidth: Kirigami.Units.gridUnit * 6
0181             cellHeight: Kirigami.Units.gridUnit * 6
0182             model: kcm.availableButtonsModel
0183             interactive: false
0184 
0185             delegate: ColumnLayout {
0186                 width: availableButtonsGrid.cellWidth - Kirigami.Units.largeSpacing
0187                 height: availableButtonsGrid.cellHeight - Kirigami.Units.largeSpacing
0188                 opacity: baseLayout.draggingTitlebarButtons ? 0.15 : 1.0
0189 
0190                 Rectangle {
0191                     Layout.alignment: Qt.AlignHCenter
0192                     color: palette.window
0193                     radius: Kirigami.Units.smallSpacing
0194                     implicitWidth: baseLayout.buttonIconSize + Kirigami.Units.largeSpacing
0195                     implicitHeight: baseLayout.buttonIconSize + Kirigami.Units.largeSpacing
0196 
0197                     KDecoration.Button {
0198                         id: availableButton
0199                         anchors.centerIn: Drag.active ? undefined : parent
0200                         bridge: bridgeItem.bridge
0201                         settings: settingsItem
0202                         type: model["button"]
0203                         width: baseLayout.buttonIconSize
0204                         height: baseLayout.buttonIconSize
0205                         Drag.keys: [ "decoButtonAdd" ]
0206                         Drag.active: dragArea.drag.active
0207                         Drag.onActiveChanged: availableButtonsGrid.dragActive = Drag.active
0208                         color: palette.windowText
0209                     }
0210                     MouseArea {
0211                         id: dragArea
0212                         anchors.fill: availableButton
0213                         drag.target: availableButton
0214                         cursorShape: Qt.SizeAllCursor
0215                         onReleased: {
0216                             if (availableButton.Drag.target) {
0217                                 availableButton.Drag.drop();
0218                             } else {
0219                                 availableButton.Drag.cancel();
0220                             }
0221                         }
0222                     }
0223                 }
0224                 QQC2.Label {
0225                     id: iconLabel
0226                     text: model["display"]
0227                     Layout.fillWidth: true
0228                     Layout.fillHeight: true
0229                     horizontalAlignment: Text.AlignHCenter
0230                     verticalAlignment: Text.AlignTop
0231                     elide: Text.ElideRight
0232                     wrapMode: Text.Wrap
0233                 }
0234             }
0235             DropArea {
0236                 anchors.fill: parent
0237                 keys: [ "decoButtonRemove" ]
0238                 onEntered: {
0239                     drag.accept();
0240                 }
0241                 onDropped: {
0242                     drag.source.buttonsModel.remove(drag.source.itemIndex);
0243                 }
0244                 Kirigami.Heading {
0245                     text: i18n("Drop button here to remove it")
0246                     font.weight: Font.Bold
0247                     level: 2
0248                     anchors.centerIn: parent
0249                     opacity: baseLayout.draggingTitlebarButtons ? 1.0 : 0.0
0250                 }
0251             }
0252         }
0253         Text {
0254             id: dragHint
0255             readonly property real dragHintOpacitiy: enabled ? 1.0 : 0.3
0256             color: palette.windowText
0257             opacity: baseLayout.hideDragHint ? 0.0 : dragHintOpacitiy
0258             Layout.fillWidth: true
0259             Layout.margins: Kirigami.Units.gridUnit * 3
0260             horizontalAlignment: Text.AlignHCenter
0261             text: i18n("Drag buttons between here and the titlebar")
0262         }
0263     }
0264 }