Warning, /plasma/latte-dock/declarativeimports/abilities/items/BasicItem.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2021 Michail Vourlakos <mvourlakos@gmail.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 import QtQuick 2.8
0007 import QtGraphicalEffects 1.0
0008 
0009 import org.kde.plasma.plasmoid 2.0
0010 import org.kde.plasma.core 2.0 as PlasmaCore
0011 import org.kde.plasma.components 2.0 as PlasmaComponents
0012 
0013 import org.kde.latte.core 0.2 as LatteCore
0014 
0015 import org.kde.latte.abilities.items 0.1 as AbilityItems
0016 
0017 import "./basicitem" as BasicItemParts
0018 
0019 Item{
0020     id: abilityItem
0021     signal mousePressed(int x, int y, int button);
0022     signal mouseReleased(int x, int y, int button);
0023     signal shortcutRequestedActivate();
0024     signal shortcutRequestedNewInstance();
0025     signal taskLauncherActivated();
0026     signal taskGroupedWindowAdded();
0027     signal taskGroupedWindowRemoved();
0028 
0029     anchors.bottom: (parent && abilityItem.location === PlasmaCore.Types.BottomEdge) ? parent.bottom : undefined
0030     anchors.top: (parent && abilityItem.location === PlasmaCore.Types.TopEdge) ? parent.top : undefined
0031     anchors.left: (parent && abilityItem.location === PlasmaCore.Types.LeftEdge) ? parent.left : undefined
0032     anchors.right: (parent && abilityItem.location === PlasmaCore.Types.RightEdge) ? parent.right : undefined
0033 
0034     width: {
0035         if (!visible)
0036             return 0;
0037 
0038         if (isSeparator) {
0039             if (abilityItem.isVertical) {
0040                 return abilityItem.abilities.metrics.totals.thickness + abilityItem.abilities.metrics.margin.screenEdge;
0041             } else {
0042                 if (isSeparatorInRealLength) {
0043                     return LatteCore.Environment.separatorLength+2*abilityItem.abilities.metrics.margin.length;
0044                 }
0045             }
0046 
0047             return 0;
0048         }
0049 
0050         if (plasmoid.formFactor === PlasmaCore.Types.Vertical) {
0051             return _parabolicItem.width;
0052         } else {
0053             return hiddenSpacerLeft.width + _parabolicItem.width + hiddenSpacerRight.width;
0054         }
0055     }
0056 
0057     height: {
0058         if (!visible)
0059             return 0;
0060 
0061         if (isSeparator) {
0062             if (abilityItem.isHorizontal) {
0063                 return abilityItem.abilities.metrics.totals.thickness + abilityItem.abilities.metrics.margin.screenEdge;
0064             } else {
0065                 if (isSeparatorInRealLength) {
0066                     return LatteCore.Environment.separatorLength+2*abilityItem.abilities.metrics.margin.length;
0067                 }
0068             }
0069 
0070             return 0;
0071         }
0072 
0073         if (plasmoid.formFactor === PlasmaCore.Types.Vertical) {
0074             return hiddenSpacerLeft.height + abilityItem.parabolicItem.height + hiddenSpacerRight.height;
0075         } else {
0076             return _parabolicItem.height;
0077         }
0078     }
0079 
0080     property bool isMonochromaticForcedContentItem: false
0081 
0082     property bool isHiddenSpacerAnimated: true
0083     property bool isHiddenSpacerForcedShow: false
0084 
0085     property bool isHidden: false
0086     property bool isSeparator: false
0087     property bool isSeparatorInRealLength: false
0088     property bool isSeparatorHidden: false
0089     readonly property bool isSeparatorVisible: isSeparator && !isSeparatorHidden && !tailItemIsSeparator
0090     property bool preserveIndicatorInInitialPosition: false
0091 
0092     property bool containsMouse: false
0093 
0094     property string thinTooltipText: ""
0095 
0096     property Item abilities: null
0097     property Item contentItem: null
0098     property Item monochromizedItem: null
0099 
0100     readonly property bool isHorizontal: !isVertical
0101     readonly property bool isVertical: plasmoid.formFactor === PlasmaCore.Types.Vertical
0102     readonly property bool parabolicAreaContainsMouse: parabolicEventsAreaLoader.active && parabolicEventsAreaLoader.item.containsMouse
0103     readonly property int parabolicAreaLastMousePos: {
0104         if (parabolicEventsAreaLoader.active) {
0105             return Math.round(plasmoid.formFactor === PlasmaCore.Types.Horizontal ? parabolicEventsAreaLoader.item.lastMouseX : parabolicEventsAreaLoader.item.lastMouseY);
0106         }
0107 
0108         return 0;
0109     }
0110 
0111     readonly property int location: {
0112         if (plasmoid.location === PlasmaCore.Types.LeftEdge
0113                 || plasmoid.location === PlasmaCore.Types.RightEdge
0114                 || plasmoid.location === PlasmaCore.Types.TopEdge) {
0115             return plasmoid.location;
0116         }
0117 
0118         return PlasmaCore.Types.BottomEdge;
0119     }
0120 
0121     readonly property bool isFirstItemInContainer: abilityItem.abilities.containment.isFirstAppletInContainment && (index === abilityItem.abilities.indexer.firstVisibleItemIndex)
0122     readonly property bool isLastItemInContainer: abilityItem.abilities.containment.isLastAppletInContainment && (index === abilityItem.abilities.indexer.lastVisibleItemIndex)
0123 
0124     readonly property int itemIndex: index
0125     readonly property int animationTime: (abilityItem.abilities.animations.active ? abilityItem.abilities.animations.speedFactor.current : 2) * (1.2 * abilityItem.abilities.animations.duration.small)
0126     property int iconAnimatedOffsetX: 0
0127     property int iconAnimatedOffsetY: 0
0128     readonly property int iconOffsetX: iconAnimatedOffsetX + indicatorBackLayer.level.requested.iconOffsetX
0129     readonly property int iconOffsetY: iconAnimatedOffsetY + indicatorBackLayer.level.requested.iconOffsetY
0130     readonly property int iconTransformOrigin: indicatorBackLayer.level.requested.iconTransformOrigin
0131     readonly property real iconOpacity: indicatorBackLayer.level.requested.iconOpacity
0132     readonly property real iconRotation: indicatorBackLayer.level.requested.iconRotation
0133     readonly property real iconScale: indicatorBackLayer.level.requested.iconScale
0134 
0135     readonly property bool isIndicatorTaskLauncherAnimationRunning: (indicatorBackLayer.level.requested.isTaskLauncherAnimationRunning
0136                                                                      || indicatorFrontLayer.level.requested.isTaskLauncherAnimationRunning)
0137 
0138     readonly property alias indicator: abilityIndicatorObj
0139     readonly property alias parabolicItem: _parabolicItem
0140     readonly property alias restoreAnimation: _restoreAnimation
0141     readonly property alias tooltipVisualParent: _parabolicItem.titleTooltipVisualParent
0142 
0143     Component.onCompleted: {
0144         abilityItem.abilities.parabolic.sglClearZoom.connect(slotClearZoom);
0145     }
0146 
0147     Component.onDestruction: {
0148         abilityItem.abilities.parabolic.sglClearZoom.disconnect(slotClearZoom);
0149     }
0150 
0151     Connections {
0152         target: abilityItem.abilities.shortcuts
0153         onSglActivateEntryAtIndex: {
0154             if (!abilityItem.abilities.shortcuts.isEnabled) {
0155                 return;
0156             }
0157 
0158             var shortcutIndex = abilityItem.abilities.shortcuts.shortcutIndex(abilityItem.itemIndex);
0159 
0160             if (shortcutIndex === entryIndex) {
0161                 abilityItem.shortcutRequestedActivate();
0162             }
0163         }
0164 
0165         onSglNewInstanceForEntryAtIndex: {
0166             if (!abilityItem.abilities.shortcuts.isEnabled) {
0167                 return;
0168             }
0169 
0170             var shortcutIndex = abilityItem.abilities.shortcuts.shortcutIndex(taskItem.itemIndex);
0171 
0172             if (shortcutIndex === entryIndex) {
0173                 abilityItem.shortcutRequestedNewInstance();
0174             }
0175         }
0176     }
0177 
0178     //! separators flags
0179     readonly property bool tailItemIsSeparator: {
0180         if (isSeparator || index < 0 ) {
0181             return false;
0182         }
0183 
0184         var tail = index - 1;
0185 
0186         while(tail>=0
0187               && abilityItem.abilities.indexer.hidden.indexOf(tail)>=0 /*ignore hidden items but not hidden separators*/
0188               && abilityItem.abilities.indexer.separators.indexOf(tail)<0) {
0189             tail = tail - 1;
0190         }
0191 
0192         var hasTailItemSeparator = abilityItem.abilities.indexer.separators.indexOf(tail)>=0;
0193 
0194         if (!hasTailItemSeparator && itemIndex === abilityItem.abilities.indexer.firstVisibleItemIndex){
0195             return abilityItem.abilities.indexer.tailAppletIsSeparator;
0196         }
0197 
0198         return hasTailItemSeparator;
0199     }
0200 
0201     readonly property bool tailItemIsVisibleSeparator: {
0202         if (isSeparator || index < 0 || !tailItemIsSeparator ) {
0203             return false;
0204         }
0205 
0206         var tail = index - 1;
0207 
0208         while(tail>=0 && abilityItem.abilities.indexer.hidden.indexOf(tail)>=0) {
0209             tail = tail - 1;
0210         }
0211 
0212         var hasTailItemSeparator = abilityItem.abilities.indexer.separators.indexOf(tail)>=0 && abilityItem.abilities.indexer.hidden.indexOf(tail)<0;
0213 
0214         if (!hasTailItemSeparator && itemIndex === abilityItem.abilities.indexer.firstVisibleItemIndex){
0215             return abilityItem.abilities.indexer.tailAppletIsSeparator;
0216         }
0217 
0218         return hasTailItemSeparator;
0219     }
0220 
0221     readonly property bool headItemIsSeparator: {
0222         if (isSeparator || index < 0 ) {
0223             return false;
0224         }
0225 
0226         var head = index + 1;
0227 
0228         while(head>=0
0229               && abilityItem.abilities.indexer.hidden.indexOf(head)>=0 /*ignore hidden items but not hidden separators*/
0230               && abilityItem.abilities.indexer.separators.indexOf(head)<0) {
0231             head = head + 1;
0232         }
0233 
0234         var hasHeadItemSeparator = abilityItem.abilities.indexer.separators.indexOf(head)>=0;
0235 
0236         if (!hasHeadItemSeparator && itemIndex === abilityItem.abilities.indexer.lastVisibleItemIndex){
0237             return abilityItem.abilities.indexer.headAppletIsSeparator;
0238         }
0239 
0240         return hasHeadItemSeparator;
0241     }
0242 
0243     readonly property bool headItemIsVisibleSeparator: {
0244         if (isSeparator || index < 0 || !headItemIsSeparator) {
0245             return false;
0246         }
0247 
0248         var head = index + 1;
0249 
0250         while(head>=0 && abilityItem.abilities.indexer.hidden.indexOf(head)>=0) {
0251             head = head + 1;
0252         }
0253 
0254         var hasHeadItemSeparator = abilityItem.abilities.indexer.separators.indexOf(head)>=0 && abilityItem.abilities.indexer.hidden.indexOf(head)<0;
0255 
0256         if (!hasHeadItemSeparator && itemIndex === abilityItem.abilities.indexer.lastVisibleItemIndex){
0257             return abilityItem.abilities.indexer.headAppletIsSeparator;
0258         }
0259 
0260         return hasHeadItemSeparator;
0261     }
0262 
0263 
0264 
0265     Behavior on opacity {
0266         NumberAnimation { duration: abilityItem.abilities.animations.speedFactor.current * abilityItem.abilities.animations.duration.large }
0267     }
0268 
0269     Loader{
0270         anchors.fill: parent
0271         active: abilityItem.abilities.debug.graphicsEnabled
0272 
0273         sourceComponent: Rectangle{
0274             anchors.fill: parent
0275             color: "transparent"
0276             border.color:  "blue"
0277             border.width: 1
0278         }
0279     }
0280 
0281     BasicItemParts.SeparatorItem {}
0282 
0283     Flow{
0284         width: parent.width
0285         height: parent.height
0286         z:10
0287 
0288         BasicItemParts.HiddenSpacer{ id:hiddenSpacerLeft}
0289 
0290         Item{
0291             width: _parabolicItem.width
0292             height: _parabolicItem.height
0293 
0294             AbilityItems.IndicatorObject {
0295                 id: abilityIndicatorObj
0296                 animations: abilityItem.abilities.animations
0297                 metrics: abilityItem.abilities.metrics
0298                 host: abilityItem.abilities.indicators
0299 
0300                 iconBackgroundColor: "transparent"
0301                 iconGlowColor: "transparent"
0302             }
0303 
0304             //! Indicator Back Layer
0305             BasicItemParts.IndicatorLevel{
0306                 id: indicatorBackLayer
0307                 level.isBackground: true
0308                 level.indicator: abilityIndicatorObj
0309 
0310                 Loader{
0311                     anchors.fill: parent
0312                     active: abilityItem.abilities.debug.graphicsEnabled
0313                     sourceComponent: Rectangle{
0314                         color: "transparent"
0315                         border.width: 1
0316                         border.color: "purple"
0317                         opacity: 0.4
0318                     }
0319                 }
0320             }
0321 
0322             BasicItemParts.ParabolicItem{id: _parabolicItem}
0323 
0324             //! Indicator Front Layer
0325             BasicItemParts.IndicatorLevel{
0326                 id: indicatorFrontLayer
0327                 level.isForeground: true
0328                 level.indicator: abilityIndicatorObj
0329             }
0330         }
0331 
0332         BasicItemParts.HiddenSpacer{ id:hiddenSpacerRight; rightSpacer: true }
0333     }// Flow with hidden spacers inside
0334 
0335     Loader {
0336         id: parabolicEventsAreaLoader
0337         active: isParabolicEnabled || isThinTooltipEnabled
0338         width: abilityItem.isHorizontal ? abilityItem.width : abilityItem.abilities.metrics.mask.thickness.zoomedForItems
0339         height: abilityItem.isHorizontal ? abilityItem.abilities.metrics.mask.thickness.zoomedForItems : abilityItem.height
0340         z:10000       
0341         sourceComponent: BasicItemParts.ParabolicEventsArea{}
0342 
0343         readonly property bool isParabolicEnabled: abilityItem.abilities.parabolic.isEnabled
0344         readonly property bool isThinTooltipEnabled: abilityItem.abilities.thinTooltip.isEnabled && abilityItem.thinTooltipText !== ""
0345 
0346         states:[
0347             State{
0348                 name: "top"
0349                 when: abilityItem.location === PlasmaCore.Types.TopEdge
0350 
0351                 AnchorChanges{
0352                     target: parabolicEventsAreaLoader
0353                     anchors.horizontalCenter: parent.horizontalCenter; anchors.verticalCenter: undefined;
0354                     anchors.right: undefined; anchors.left: undefined; anchors.top: parent.top; anchors.bottom: undefined;
0355                 }
0356             },
0357             State{
0358                 name: "left"
0359                 when: abilityItem.location === PlasmaCore.Types.LeftEdge
0360 
0361                 AnchorChanges{
0362                     target: parabolicEventsAreaLoader
0363                     anchors.horizontalCenter: undefined; anchors.verticalCenter: parent.verticalCenter;
0364                     anchors.right: undefined; anchors.left: parent.left; anchors.top: undefined; anchors.bottom: undefined;
0365                 }
0366             },
0367             State{
0368                 name: "right"
0369                 when: abilityItem.location === PlasmaCore.Types.RightEdge
0370 
0371                 AnchorChanges{
0372                     target: parabolicEventsAreaLoader
0373                     anchors.horizontalCenter: undefined; anchors.verticalCenter: parent.verticalCenter;
0374                     anchors.right: parent.right; anchors.left: undefined; anchors.top: undefined; anchors.bottom: undefined;
0375                 }
0376             },
0377             State{
0378                 name: "bottom"
0379                 when: abilityItem.location === PlasmaCore.Types.BottomEdge
0380 
0381                 AnchorChanges{
0382                     target: parabolicEventsAreaLoader
0383                     anchors.horizontalCenter: parent.horizontalCenter; anchors.verticalCenter: undefined;
0384                     anchors.right: undefined; anchors.left: undefined; anchors.top: undefined; anchors.bottom: parent.bottom;
0385                 }
0386             }
0387         ]
0388     }
0389 
0390     BasicItemParts.RestoreAnimation{id: _restoreAnimation}
0391 
0392     function slotClearZoom(){
0393         restoreAnimation.start();
0394     }
0395 
0396     //BEGIN states
0397     states: [
0398         State {
0399             name: "grid"
0400             when: abilityItem.parent && abilities.isLayoutGridContainer
0401 
0402             AnchorChanges {
0403                 target: abilityItem
0404                 anchors{ top:undefined; bottom:undefined; left:undefined; right:undefined;}
0405             }
0406         },
0407         State {
0408             name: "left"
0409             when: abilityItem.parent && !abilities.isLayoutGridContainer && (abilities.location === PlasmaCore.Types.LeftEdge)
0410 
0411             AnchorChanges {
0412                 target: abilityItem
0413                 anchors{ top:undefined; bottom:undefined; left:parent.left; right:undefined;}
0414             }
0415         },
0416         State {
0417             name: "right"
0418             when: abilityItem.parent && !abilities.isLayoutGridContainer && (abilities.location === PlasmaCore.Types.RightEdge)
0419 
0420             AnchorChanges {
0421                 target: abilityItem
0422                 anchors{ top:undefined; bottom:undefined; left:undefined; right:parent.right;}
0423             }
0424         },
0425         State {
0426             name: "bottom"
0427             when: abilityItem.parent && !abilities.isLayoutGridContainer && (abilities.location === PlasmaCore.Types.BottomEdge)
0428 
0429             AnchorChanges {
0430                 target: abilityItem
0431                 anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:undefined;}
0432             }
0433         },
0434         State {
0435             name: "top"
0436             when: abilityItem.parent && !abilities.isLayoutGridContainer && (abilities.location === PlasmaCore.Types.TopEdge)
0437 
0438             AnchorChanges {
0439                 target: abilityItem
0440                 anchors{ top:parent.top; bottom:undefined; left:undefined; right:undefined;}
0441             }
0442         }
0443     ]
0444     //END states
0445 }