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 }