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

0001 /*
0002     SPDX-FileCopyrightText: 2020 Michail Vourlakos <mvourlakos@gmail.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 import QtQuick 2.7
0007 import org.kde.plasma.plasmoid 2.0
0008 
0009 import org.kde.latte.abilities.definition 0.1 as AbilityDefinition
0010 
0011 AbilityDefinition.Indexer {
0012     id: indxr
0013     property Item layouts: null
0014     property bool updateIsBlocked: false
0015 
0016     property var clients: []
0017     property var clientsBridges: []
0018 
0019     property var marginsAreaSeparators: []
0020 
0021     property int clientsTrackingWindowsCount: 0
0022 
0023     Binding{
0024         target: indxr
0025         property: "separators"
0026         when: !updateIsBlocked
0027         value: {
0028             var seps = [];
0029 
0030             var sLayout = layouts.startLayout;
0031             for (var i=0; i<sLayout.children.length; ++i){
0032                 var appletItem = sLayout.children[i];
0033                 if (appletItem && appletItem.isSeparator && appletItem.index>=0) {
0034                     seps.push(appletItem.index);
0035                 }
0036             }
0037 
0038             var mLayout = layouts.mainLayout;
0039             for (var i=0; i<mLayout.children.length; ++i){
0040                 var appletItem = mLayout.children[i];
0041                 if (appletItem && appletItem.isSeparator && appletItem.index>=0) {
0042                     seps.push(appletItem.index);
0043                 }
0044             }
0045 
0046             var eLayout = layouts.endLayout;
0047             for (var i=0; i<eLayout.children.length; ++i){
0048                 var appletItem = eLayout.children[i];
0049                 if (appletItem && appletItem.isSeparator && appletItem.index>=0) {
0050                     seps.push(appletItem.index);
0051                 }
0052             }
0053 
0054             return seps;
0055         }
0056     }
0057 
0058     Binding {
0059         target: indxr
0060         property: "hidden"
0061         when: !updateIsBlocked
0062         value: {
0063             var hdn = [];
0064 
0065             var sLayout = layouts.startLayout;
0066             for (var i=0; i<sLayout.children.length; ++i){
0067                 var appletItem = sLayout.children[i];
0068                 if (appletItem && appletItem.isHidden && appletItem.index>=0) {
0069                     hdn.push(appletItem.index);
0070                 }
0071             }
0072 
0073             var mLayout = layouts.mainLayout;
0074             for (var i=0; i<mLayout.children.length; ++i){
0075                 var appletItem = mLayout.children[i];
0076                 if (appletItem && appletItem.isHidden && appletItem.index>=0) {
0077                     hdn.push(appletItem.index);
0078                 }
0079             }
0080 
0081             var eLayout = layouts.endLayout;
0082             for (var i=0; i<eLayout.children.length; ++i){
0083                 var appletItem = eLayout.children[i];
0084                 if (appletItem && appletItem.isHidden && appletItem.index>=0) {
0085                     hdn.push(appletItem.index);
0086                 }
0087             }
0088 
0089             return hdn;
0090         }
0091     }
0092 
0093     Binding{
0094         target: indxr
0095         property: "marginsAreaSeparators"
0096         when: !updateIsBlocked
0097         value: {
0098             var seps = [];
0099             var grid;
0100 
0101             for (var l=0; l<=2; ++l) {
0102                 if (l===0) {
0103                     grid = layouts.startLayout;
0104                 } else if (l===1) {
0105                     grid = layouts.mainLayout;
0106                 } else if (l===2) {
0107                     grid = layouts.endLayout;
0108                 }
0109 
0110                 for (var i=0; i<grid.children.length; ++i){
0111                     var appletItem = grid.children[i];
0112                     if (appletItem
0113                             && appletItem.isMarginsAreaSeparator
0114                             && appletItem.index>=0) {
0115                         seps.push(appletItem.index);
0116                     }
0117                 }
0118             }
0119 
0120             return seps;
0121         }
0122     }
0123 
0124     Binding {
0125         target: indxr
0126         property: "clients"
0127         when: !updateIsBlocked
0128         value: {
0129             var clns = [];
0130 
0131             var sLayout = layouts.startLayout;
0132             for (var i=0; i<sLayout.children.length; ++i){
0133                 var appletItem = sLayout.children[i];
0134                 if (appletItem
0135                         && appletItem.index>=0
0136                         && appletItem.communicator
0137                         && appletItem.communicator.indexerIsSupported) {
0138                     clns.push(appletItem.index);
0139                 }
0140             }
0141 
0142             var mLayout = layouts.mainLayout;
0143             for (var i=0; i<mLayout.children.length; ++i){
0144                 var appletItem = mLayout.children[i];
0145                 if (appletItem
0146                         && appletItem.index>=0
0147                         && appletItem.communicator
0148                         && appletItem.communicator.indexerIsSupported) {
0149                     clns.push(appletItem.index);
0150                 }
0151             }
0152 
0153             var eLayout = layouts.endLayout;
0154             for (var i=0; i<eLayout.children.length; ++i){
0155                 var appletItem = eLayout.children[i];
0156                 if (appletItem
0157                         && appletItem.index>=0
0158                         && appletItem.communicator
0159                         && appletItem.communicator.indexerIsSupported) {
0160                     clns.push(appletItem.index);
0161                 }
0162             }
0163 
0164             return clns;
0165         }
0166     }
0167 
0168     Binding {
0169         target: indxr
0170         property: "clientsBridges"
0171         when: !updateIsBlocked
0172         value: {
0173             var bdgs = [];
0174 
0175             var sLayout = layouts.startLayout;
0176             for (var i=0; i<sLayout.children.length; ++i){
0177                 var appletItem = sLayout.children[i];
0178                 if (appletItem
0179                         && appletItem.index>=0
0180                         && appletItem.communicator
0181                         && appletItem.communicator.indexerIsSupported
0182                         && appletItem.communicator.bridge
0183                         && appletItem.communicator.bridge.indexer) {
0184                     bdgs.push(appletItem.communicator.bridge.indexer);
0185                 }
0186             }
0187 
0188             var mLayout = layouts.mainLayout;
0189             for (var i=0; i<mLayout.children.length; ++i){
0190                 var appletItem = mLayout.children[i];
0191                 if (appletItem
0192                         && appletItem.index>=0
0193                         && appletItem.communicator
0194                         && appletItem.communicator.indexerIsSupported
0195                         && appletItem.communicator.bridge
0196                         && appletItem.communicator.bridge.indexer) {
0197                     bdgs.push(appletItem.communicator.bridge.indexer);
0198                 }
0199             }
0200 
0201             var eLayout = layouts.endLayout;
0202             for (var i=0; i<eLayout.children.length; ++i){
0203                 var appletItem = eLayout.children[i];
0204                 if (appletItem
0205                         && appletItem.index>=0
0206                         && appletItem.communicator
0207                         && appletItem.communicator.indexerIsSupported
0208                         && appletItem.communicator.bridge
0209                         && appletItem.communicator.bridge.indexer) {
0210                     bdgs.push(appletItem.communicator.bridge.indexer);
0211                 }
0212             }
0213 
0214             return bdgs;
0215         }
0216     }
0217 
0218     Binding{
0219         target: indxr
0220         property: "clientsTrackingWindowsCount"
0221         when: !(root.appletIsDragged || updateIsBlocked)
0222         value: {
0223             var cnts = 0;
0224             var grid;
0225 
0226             for (var l=0; l<=2; ++l) {
0227                 if (l===0) {
0228                     grid = layouts.startLayout;
0229                 } else if (l===1) {
0230                     grid = layouts.mainLayout;
0231                 } else if (l===2) {
0232                     grid = layouts.endLayout;
0233                 }
0234 
0235                 for (var i=0; i<grid.children.length; ++i){
0236                     var appletItem = grid.children[i];
0237                     if (appletItem
0238                             && appletItem.communicator
0239                             && appletItem.communicator.requires.windowsTrackingEnabled) {
0240                         cnts = cnts + 1;
0241                     }
0242                 }
0243             }
0244 
0245             return cnts;
0246         }
0247     }
0248 
0249     function visibleItemsBeforeCount(layout, actualIndex) {
0250         var visibleItems = 0;
0251 
0252         for (var i=0; i<layout.children.length; ++i){
0253             var appletItem = layout.children[i];
0254             if (appletItem && appletItem.index<actualIndex) {
0255                 if ((separators.indexOf(appletItem.index) >= 0)
0256                         || (marginsAreaSeparators.indexOf(appletItem.index)>=0)
0257                         || (hidden.indexOf(appletItem.index) >= 0)) {
0258                     //! ignore hidden and separators applets
0259                     continue;
0260                 } else if (!appletItem.communicator || !appletItem.communicator.indexerIsSupported) {
0261                     //! single item applet
0262                     visibleItems = visibleItems + 1;
0263                 } else if (appletItem.communicator && appletItem.communicator.indexerIsSupported) {
0264                     //! multi items applet
0265                     visibleItems = visibleItems + appletItem.communicator.bridge.indexer.client.visibleItemsCount;
0266                 }
0267             }
0268         }
0269 
0270         return visibleItems;
0271     }
0272 
0273     function visibleIndex(actualIndex) {
0274         if ((separators.indexOf(actualIndex) >= 0) || (hidden.indexOf(actualIndex) >= 0)) {
0275             return -1;
0276         }
0277 
0278         var visibleItems = visibleItemsBeforeCount(layouts.startLayout, actualIndex) +
0279                 visibleItemsBeforeCount(layouts.mainLayout, actualIndex) +
0280                 visibleItemsBeforeCount(layouts.endLayout, actualIndex);
0281 
0282         return visibleItems + 1;
0283     }
0284 
0285     function visibleIndexBelongsAtApplet(applet, itemVisibleIndex) {
0286         if (itemVisibleIndex<0 || !applet) {
0287             return false;
0288         }
0289 
0290         var vIndexBase = visibleIndex(applet.index);
0291 
0292         if (vIndexBase === itemVisibleIndex) {
0293             return true;
0294         } else if (applet.communicator
0295                    && applet.communicator.indexerIsSupported
0296                    && applet.communicator.bridge
0297                    && applet.communicator.bridge.indexer) {
0298             if (itemVisibleIndex >= vIndexBase
0299                     && itemVisibleIndex< (vIndexBase + applet.communicator.bridge.indexer.client.visibleItemsCount)) {
0300                 return true;
0301             }
0302         }
0303 
0304         return false;
0305     }
0306 }