Warning, /plasma/latte-dock/containment/package/contents/ui/layouts/EnvironmentActions.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2019 Michail Vourlakos <mvourlakos@gmail.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 import QtQuick 2.7
0007 
0008 import org.kde.plasma.core 2.0 as PlasmaCore
0009 import org.kde.plasma.plasmoid 2.0
0010 
0011 import org.kde.latte.core 0.2 as LatteCore
0012 
0013 import org.kde.latte.private.containment 0.1 as LatteContainment
0014 
0015 import org.kde.latte.abilities.items 0.1 as AbilityItem
0016 
0017 import "loaders" as Loaders
0018 
0019 Loader {
0020     id: environmentLoader
0021 
0022     width: root.isHorizontal ? length : localThickness
0023     height: root.isVertical ? length :  localThickness
0024 
0025     property int alignment: LatteCore.Types.BottomEdgeCenterAlign
0026 
0027     readonly property bool useAllLayouts: root.myView.alignment === LatteCore.Types.Justify
0028 
0029     readonly property int localThickness: active ? metrics.totals.thickness + metrics.margin.screenEdge : 0
0030     readonly property int length: {
0031         if (!active) {
0032             return 0;
0033         }
0034 
0035         if (screenEdgeMarginEnabled && root.floatingInternalGapIsForced) {
0036             return root.isHorizontal ? root.width : root.height;
0037         }
0038 
0039         return useAllLayouts ? root.maxLength : background.totals.visualLength;
0040     }
0041 
0042     sourceComponent: MouseArea{
0043         id: mainArea
0044         acceptedButtons: Qt.LeftButton | Qt.MidButton
0045         hoverEnabled: true
0046 
0047         property bool wheelIsBlocked: false
0048 
0049         property int lastPressX: -1
0050         property int lastPressY: -1
0051 
0052         onClicked: {
0053             if (root.closeActiveWindowEnabled && mouse.button === Qt.MidButton) {
0054                 selectedWindowsTracker.lastActiveWindow.requestClose();
0055             }
0056         }
0057 
0058         onPressed: {
0059             if (!root.dragActiveWindowEnabled) {
0060                 return;
0061             }
0062 
0063             if (mouse.button === Qt.LeftButton && selectedWindowsTracker.lastActiveWindow.canBeDragged()) {
0064                 lastPressX = mouse.x;
0065                 lastPressY = mouse.y;
0066                 dragWindowTimer.start();
0067             }
0068         }
0069 
0070         onReleased: {
0071             lastPressX = -1;
0072             lastPressY = -1;
0073         }
0074 
0075         onPositionChanged: {
0076             if (!root.dragActiveWindowEnabled || !(mainArea.pressedButtons & Qt.LeftButton)) {
0077                 return;
0078             }
0079 
0080             var stepX = Math.abs(lastPressX-mouse.x);
0081             var stepY = Math.abs(lastPressY-mouse.y);
0082             var threshold = 5;
0083 
0084             var tryDrag = mainArea.pressed && (stepX>threshold || stepY>threshold);
0085 
0086             if ( tryDrag && selectedWindowsTracker.lastActiveWindow.canBeDragged()) {
0087                 dragWindowTimer.stop();
0088                 activateDragging();
0089             }
0090         }
0091 
0092         onDoubleClicked: {
0093             if (!root.dragActiveWindowEnabled) {
0094                 return;
0095             }
0096 
0097             dragWindowTimer.stop();
0098             selectedWindowsTracker.lastActiveWindow.requestToggleMaximized();
0099         }
0100 
0101         onWheel: {
0102             if (wheelIsBlocked) {
0103                 return;
0104             }
0105 
0106             if (root.scrollAction === LatteContainment.Types.ScrollNone) {
0107                 root.emptyAreasWheel(wheel);
0108                 return;
0109             }
0110 
0111             wheelIsBlocked = true;
0112             scrollDelayer.start();
0113 
0114             var delta = 0;
0115 
0116             if (wheel.angleDelta.y>=0 && wheel.angleDelta.x>=0) {
0117                 delta = Math.max(wheel.angleDelta.y, wheel.angleDelta.x);
0118             } else {
0119                 delta = Math.min(wheel.angleDelta.y, wheel.angleDelta.x);
0120             }
0121 
0122             var angle = delta / 8;
0123 
0124             var ctrlPressed = (wheel.modifiers & Qt.ControlModifier);
0125 
0126             if (angle>10) {
0127                 //! upwards
0128                 if (root.scrollAction === LatteContainment.Types.ScrollDesktops) {
0129                     latteView.windowsTracker.switchToPreviousVirtualDesktop();
0130                 } else if (root.scrollAction === LatteContainment.Types.ScrollActivities) {
0131                     latteView.windowsTracker.switchToPreviousActivity();
0132                 } else if (root.scrollAction === LatteContainment.Types.ScrollToggleMinimized) {
0133                     if (!ctrlPressed) {
0134                         tasksLoader.item.activateNextPrevTask(true);
0135                     } else if (!selectedWindowsTracker.lastActiveWindow.isMaximized){
0136                         selectedWindowsTracker.lastActiveWindow.requestToggleMaximized();
0137                     }
0138                 } else if (tasksLoader.active) {
0139                     tasksLoader.item.activateNextPrevTask(true);
0140                 }
0141             } else if (angle<-10) {
0142                 //! downwards
0143                 if (root.scrollAction === LatteContainment.Types.ScrollDesktops) {
0144                     latteView.windowsTracker.switchToNextVirtualDesktop();
0145                 } else if (root.scrollAction === LatteContainment.Types.ScrollActivities) {
0146                     latteView.windowsTracker.switchToNextActivity();
0147                 } else if (root.scrollAction === LatteContainment.Types.ScrollToggleMinimized) {
0148                     if (!ctrlPressed) {
0149                         if (selectedWindowsTracker.lastActiveWindow.isValid
0150                                 && !selectedWindowsTracker.lastActiveWindow.isMinimized
0151                                 && selectedWindowsTracker.lastActiveWindow.isMaximized){
0152                             //! maximized
0153                             selectedWindowsTracker.lastActiveWindow.requestToggleMaximized();
0154                         } else if (selectedWindowsTracker.lastActiveWindow.isValid
0155                                    && !selectedWindowsTracker.lastActiveWindow.isMinimized
0156                                    && !selectedWindowsTracker.lastActiveWindow.isMaximized) {
0157                             //! normal
0158                             selectedWindowsTracker.lastActiveWindow.requestToggleMinimized();
0159                         }
0160                     } else if (selectedWindowsTracker.lastActiveWindow.isMaximized) {
0161                         selectedWindowsTracker.lastActiveWindow.requestToggleMaximized();
0162                     }
0163                 } else if (tasksLoader.active) {
0164                     tasksLoader.item.activateNextPrevTask(false);
0165                 }
0166             }
0167         }
0168 
0169         Loaders.Tasks{
0170             id: tasksLoader
0171         }
0172 
0173         function activateDragging(){
0174             selectedWindowsTracker.requestMoveLastWindow(mainArea.mouseX, mainArea.mouseY);
0175             mainArea.lastPressX = -1;
0176             mainArea.lastPressY = -1;
0177         }
0178 
0179         //! Timers
0180         Timer {
0181             id: dragWindowTimer
0182             interval: 500
0183             onTriggered: {
0184                 if (mainArea.pressed && selectedWindowsTracker.lastActiveWindow.canBeDragged()) {
0185                     mainArea.activateDragging();
0186                 }
0187             }
0188         }
0189 
0190         //! A timer is needed in order to handle also touchpads that probably
0191         //! send too many signals very fast. This way the signals per sec are limited.
0192         //! The user needs to have a steady normal scroll in order to not
0193         //! notice a annoying delay
0194         Timer{
0195             id: scrollDelayer
0196 
0197             interval: 200
0198             onTriggered: mainArea.wheelIsBlocked = false;
0199         }
0200 
0201         //! Background Indicator
0202         AbilityItem.IndicatorLevel {
0203             id: indicatorBackLayer
0204             anchors.fill: parent
0205 
0206             level.isDrawn: root.indicators.isEnabled
0207             level.isBackground: true
0208             level.indicator: AbilityItem.IndicatorObject{
0209                 animations: root.animations
0210                 metrics: root.metrics
0211                 host: root.indicators
0212 
0213                 isEmptySpace: true
0214                 isPressed: mainArea.pressed
0215                 panelOpacity: root.background.currentOpacity
0216                 shadowColor: root.myView.itemShadow.shadowSolidColor
0217                 palette: colorizerManager.applyTheme
0218 
0219                 iconBackgroundColor: "brown"
0220                 iconGlowColor: "pink"
0221             }
0222 
0223             Connections {
0224                 target: mainArea
0225                 enabled: root.indicators.info.needsMouseEventCoordinates
0226                 onPressed: indicatorBackLayer.level.mousePressed(mouse.x, mouse.y, mouse.button);
0227                 onReleased: indicatorBackLayer.level.mouseReleased(mouse.x, mouse.y, mouse.button);
0228             }
0229         }
0230     }
0231 
0232     states:[
0233         State {
0234             name: "bottomCenter"
0235             when: (alignment === LatteCore.Types.BottomEdgeCenterAlign)
0236 
0237             AnchorChanges {
0238                 target: environmentLoader
0239                 anchors{ top:undefined; bottom:_mainLayout.bottom; left:undefined; right:undefined;
0240                     horizontalCenter: _mainLayout.horizontalCenter; verticalCenter:undefined}
0241             }
0242         },
0243         State {
0244             name: "bottomLeft"
0245             when: (alignment === LatteCore.Types.BottomEdgeLeftAlign)
0246 
0247             AnchorChanges {
0248                 target: environmentLoader
0249                 anchors{ top:undefined; bottom:_mainLayout.bottom; left:_mainLayout.left; right:undefined;
0250                     horizontalCenter: undefined; verticalCenter:undefined}
0251             }
0252         },
0253         State {
0254             name: "bottomRight"
0255             when: (alignment === LatteCore.Types.BottomEdgeRightAlign)
0256 
0257             AnchorChanges {
0258                 target: environmentLoader
0259                 anchors{ top:undefined; bottom: _mainLayout.bottom; left:undefined; right:_mainLayout.right;
0260                     horizontalCenter: undefined; verticalCenter:undefined}
0261             }
0262         },
0263         State {
0264             name: "topCenter"
0265             when: (alignment === LatteCore.Types.TopEdgeCenterAlign)
0266 
0267             AnchorChanges {
0268                 target: environmentLoader
0269                 anchors{ top: _mainLayout.top; bottom:undefined; left:undefined; right:undefined;
0270                     horizontalCenter: _mainLayout.horizontalCenter; verticalCenter:undefined}
0271             }
0272         },
0273         State {
0274             name: "topLeft"
0275             when: (alignment === LatteCore.Types.TopEdgeLeftAlign)
0276 
0277             AnchorChanges {
0278                 target: environmentLoader
0279                 anchors{ top: _mainLayout.top; bottom:undefined; left: _mainLayout.left; right:undefined;
0280                     horizontalCenter: undefined; verticalCenter:undefined}
0281             }
0282         },
0283         State {
0284             name: "topRight"
0285             when: (alignment === LatteCore.Types.TopEdgeRightAlign)
0286 
0287             AnchorChanges {
0288                 target: environmentLoader
0289                 anchors{ top: _mainLayout.top; bottom:undefined; left:undefined; right: _mainLayout.right;
0290                     horizontalCenter: undefined; verticalCenter:undefined}
0291             }
0292         },
0293         State {
0294             name: "leftCenter"
0295             when: (alignment === LatteCore.Types.LeftEdgeCenterAlign)
0296 
0297             AnchorChanges {
0298                 target: environmentLoader
0299                 anchors{ top:undefined; bottom:undefined; left: _mainLayout.left; right:undefined;
0300                     horizontalCenter:undefined; verticalCenter: _mainLayout.verticalCenter}
0301             }
0302         },
0303         State {
0304             name: "leftTop"
0305             when: (alignment === LatteCore.Types.LeftEdgeTopAlign)
0306 
0307             AnchorChanges {
0308                 target: environmentLoader
0309                 anchors{ top:mainLayout.top; bottom:undefined; left: _mainLayout.left; right:undefined;
0310                     horizontalCenter:undefined; verticalCenter: undefined}
0311             }
0312         },
0313         State {
0314             name: "leftBottom"
0315             when: (alignment === LatteCore.Types.LeftEdgeBottomAlign)
0316 
0317             AnchorChanges {
0318                 target: environmentLoader
0319                 anchors{ top:undefined; bottom:_mainLayout.bottom; left: _mainLayout.left; right:undefined;
0320                     horizontalCenter:undefined; verticalCenter: undefined}
0321             }
0322         },
0323         State {
0324             name: "rightCenter"
0325             when: (alignment === LatteCore.Types.RightEdgeCenterAlign)
0326 
0327             AnchorChanges {
0328                 target: environmentLoader
0329                 anchors{ top:undefined; bottom:undefined; left:undefined; right: _mainLayout.right;
0330                     horizontalCenter:undefined; verticalCenter: _mainLayout.verticalCenter}
0331             }
0332         },
0333         State {
0334             name: "rightTop"
0335             when: (alignment === LatteCore.Types.RightEdgeTopAlign)
0336 
0337             AnchorChanges {
0338                 target: environmentLoader
0339                 anchors{ top:_mainLayout.top; bottom:undefined; left:undefined; right: _mainLayout.right;
0340                     horizontalCenter:undefined; verticalCenter: undefined}
0341             }
0342         },
0343         State {
0344             name: "rightBottom"
0345             when: (alignment === LatteCore.Types.RightEdgeBottomAlign)
0346 
0347             AnchorChanges {
0348                 target: environmentLoader
0349                 anchors{ top:undefined; bottom:_mainLayout.bottom; left:undefined; right: _mainLayout.right;
0350                     horizontalCenter:undefined; verticalCenter: undefined}
0351             }
0352         }
0353     ]
0354 }