Warning, /plasma/latte-dock/declarativeimports/abilities/client/Indexer.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.0
0007 
0008 import org.kde.latte.abilities.definition 0.1 as AbilityDefinition
0009 
0010 AbilityDefinition.Indexer {
0011     id: _indexer
0012     property Item bridge: null
0013     property Item layout: null
0014 
0015     property bool updateIsBlocked: false
0016 
0017     readonly property bool isActive: bridge !== null
0018     readonly property bool inMarginsArea: isActive ? bridge.indexer.inMarginsArea : false
0019     readonly property bool tailAppletIsSeparator: isActive ? bridge.indexer.tailAppletIsSeparator : false
0020     readonly property bool headAppletIsSeparator: isActive ? bridge.indexer.headAppletIsSeparator : false
0021     readonly property bool isReady: !updateIsBlocked
0022     readonly property int maxIndex: 99999
0023     readonly property alias firstTailItemIsSeparator: _privates.firstTailItemIsSeparator
0024     readonly property alias lastHeadItemIsSeparator: _privates.lastHeadItemIsSeparator
0025     readonly property alias itemsCount: _privates.itemsCount
0026     readonly property alias visibleItemsCount: _privates.visibleItemsCount
0027     readonly property alias firstVisibleItemIndex: _privates.firstVisibleItemIndex
0028     readonly property alias lastVisibleItemIndex: _privates.lastVisibleItemIndex
0029 
0030     QtObject {
0031         id: _privates
0032         property bool firstTailItemIsSeparator: false
0033         property bool lastHeadItemIsSeparator: false
0034         property int firstVisibleItemIndex: -1
0035         property int lastVisibleItemIndex: -1
0036         property int itemsCount: 0
0037         property int visibleItemsCount: 0
0038     }
0039 
0040     onIsActiveChanged: {
0041         if (isActive) {
0042             bridge.indexer.client = indexer;
0043         }
0044     }
0045 
0046     Component.onCompleted: {
0047         if (isActive) {
0048             bridge.indexer.client = indexer;
0049         }
0050     }
0051 
0052     Component.onDestruction: {
0053         if (isActive) {
0054             bridge.indexer.client = null;
0055         }
0056     }
0057 
0058     Binding {
0059         target: _privates
0060         property: "firstTailItemIsSeparator"
0061         when: isReady
0062         value: {
0063             if (_indexer.visibleItemsCount === _indexer.layout.children.length) {
0064                 return false;
0065             }
0066 
0067             for(var i=0; i<_indexer.firstVisibleItemIndex; ++i) {
0068                 if (_indexer.separators.indexOf(i)>=0 && _indexer.hidden.indexOf(i)<0) {
0069                     return true;
0070                 }
0071             }
0072 
0073             return false;
0074         }
0075     }
0076 
0077     Binding {
0078         target: _privates
0079         property: "lastHeadItemIsSeparator"
0080         when: isReady
0081         value: {
0082             if (_indexer.visibleItemsCount === _indexer.layout.children.length) {
0083                 return false;
0084             }
0085 
0086             var len = _indexer.layout.children.length;
0087 
0088             for(var i=len-1; i>_indexer.lastVisibleItemIndex; --i) {
0089                 if (_indexer.separators.indexOf(i)>=0 && _indexer.hidden.indexOf(i)<0) {
0090                     return true;
0091                 }
0092             }
0093 
0094             return false;
0095         }
0096     }
0097 
0098     Binding {
0099         target: _privates
0100         property: "firstVisibleItemIndex"
0101         when: isReady
0102         value: {
0103             var ind = maxIndex;
0104             for(var i=0; i<layout.children.length; ++i) {
0105                 var item = layout.children[i];
0106                 if (item && item.itemIndex>=0
0107                         && !item.isSeparator /*not using "separators" array to avoid binding loops*/
0108                         && !(item.isHidden || item.isSeparatorHidden) /*not using "hidden" array to avoid binding loops*/
0109                         && item.itemIndex < ind) {
0110                     ind = item.itemIndex;
0111                 }
0112             }
0113 
0114             return ind === maxIndex ? -1 : ind;
0115         }
0116     }
0117 
0118     Binding {
0119         target: _privates
0120         property: "lastVisibleItemIndex"
0121         when: isReady
0122         value: {
0123             var ind = -1;
0124 
0125             for(var i=0; i<layout.children.length; ++i) {
0126                 var item = layout.children[i];
0127 
0128                 if (item && item.itemIndex>=0
0129                         && !item.isSeparator /*not using "separators" array to avoid binding loops*/
0130                         && !(item.isHidden || item.isSeparatorHidden) /*not using "hidden" array to avoid binding loops*/
0131                         && item.itemIndex > ind) {
0132                      //console.log("org/kde/latte SETTING UP ::: " + item.itemIndex + " / " + layout.children.length);
0133                     ind = item.itemIndex;
0134                 }
0135             }
0136 
0137             return ind;
0138         }
0139     }
0140 
0141     Binding {
0142         target: _privates
0143         property: "visibleItemsCount"
0144         value: {
0145             var count = 0;
0146             for(var i=0; i<layout.children.length; ++i) {
0147                 var item = layout.children[i];
0148                 if (item && item.itemIndex>=0
0149                         && separators.indexOf(item.itemIndex)<0
0150                         && hidden.indexOf(item.itemIndex)<0) {
0151                     count = count + 1;
0152                 }
0153             }
0154 
0155             return count;
0156         }
0157     }
0158 
0159     Binding {
0160         target: _privates
0161         property: "itemsCount"
0162         value: {
0163             var count = 0;
0164             for(var i=0; i<layout.children.length; ++i) {
0165                 var item = layout.children[i];
0166                 if (item && item.itemIndex>=0) {
0167                     count = count + 1;
0168                 }
0169             }
0170 
0171             return count;
0172         }
0173     }
0174 
0175     Binding {
0176         target: _indexer
0177         property: "hidden"
0178         when: isReady
0179         value: {
0180             var hdns = [];
0181 
0182             for (var i=0; i<layout.children.length; ++i){
0183                 var item = layout.children[i];
0184                 if (item && (item.isHidden || item.isSeparatorHidden) && item.itemIndex>=0 && hdns.indexOf(item.itemIndex) < 0) {
0185                     hdns.push(item.itemIndex);
0186                 }
0187             }
0188 
0189             return hdns;
0190         }
0191     }
0192 
0193     Binding {
0194         target: _indexer
0195         property: "separators"
0196         when: isReady
0197         value: {
0198             var seps = [];
0199 
0200             for (var i=0; i<layout.children.length; ++i){
0201                 var item = layout.children[i];
0202                 if (item && item.isSeparator && item.itemIndex>=0 && seps.indexOf(item.itemIndex) < 0) {
0203                     seps.push(item.itemIndex);
0204                 }
0205             }
0206 
0207             return seps;
0208         }
0209     }
0210 
0211     function visibleIndex(taskIndex) {
0212         if (taskIndex<firstVisibleItemIndex
0213                 || taskIndex>lastVisibleItemIndex
0214                 || hidden.indexOf(taskIndex) >= 0
0215                 || separators.indexOf(taskIndex) >= 0) {
0216             return -1;
0217         }
0218 
0219         var vindex = -1;
0220         if (bridge) {
0221             vindex = bridge.indexer.host.visibleIndex(bridge.indexer.appletIndex);
0222         }
0223 
0224         for (var i=0; i<layout.children.length; ++i){
0225             var item = layout.children[i];
0226             if (hidden.indexOf(item.itemIndex)>=0 || separators.indexOf(item.itemIndex)>=0) {
0227                 continue;
0228             }
0229 
0230             if (item.itemIndex<taskIndex) {
0231                 vindex = vindex + 1;
0232             }
0233         }
0234 
0235         return vindex;
0236     }
0237 }