Warning, /maui/mauikit/src/controls.5/ListBrowser.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * Copyright 2018 Camilo Higuita <milo.h@aol.com> 0003 * 0004 * This program is free software; you can redistribute it and/or modify 0005 * it under the terms of the GNU Library General Public License as 0006 * published by the Free Software Foundation; either version 2, or 0007 * (at your option) any later version. 0008 * 0009 * This program is distributed in the hope that it will be useful, 0010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0012 * GNU General Public License for more details 0013 * 0014 * You should have received a copy of the GNU Library General Public 0015 * License along with this program; if not, write to the 0016 * Free Software Foundation, Inc., 0017 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 0018 */ 0019 0020 import QtQuick 2.14 0021 import QtQuick.Controls 2.14 0022 0023 import org.mauikit.controls 1.3 as Maui 0024 0025 /** 0026 * ListBrowser 0027 * A global sidebar for the application window that can be collapsed. 0028 * 0029 * 0030 * 0031 * 0032 * 0033 * 0034 */ 0035 Item 0036 { 0037 id: control 0038 focus: true 0039 clip: false 0040 0041 implicitHeight: contentHeight + topPadding + bottomPadding 0042 implicitWidth: contentWidth + leftPadding + rightPadding 0043 0044 /** 0045 * model : var 0046 */ 0047 property alias model : _listView.model 0048 0049 /** 0050 * delegate : Component 0051 */ 0052 property alias delegate : _listView.delegate 0053 0054 /** 0055 * section : ListView.section 0056 */ 0057 property alias section : _listView.section 0058 0059 /** 0060 * contentY : int 0061 */ 0062 property alias contentY: _listView.contentY 0063 0064 /** 0065 * contentX : int 0066 */ 0067 property alias contentX: _listView.contentX 0068 0069 0070 /** 0071 * currentIndex : int 0072 */ 0073 property alias currentIndex : _listView.currentIndex 0074 0075 /** 0076 * currentItem : Item 0077 */ 0078 property alias currentItem : _listView.currentItem 0079 0080 /** 0081 * count : int 0082 */ 0083 property alias count : _listView.count 0084 0085 /** 0086 * cacheBuffer : int 0087 */ 0088 property alias cacheBuffer : _listView.cacheBuffer 0089 0090 /** 0091 * orientation : ListView.orientation 0092 */ 0093 property alias orientation: _listView.orientation 0094 0095 /** 0096 * snapMode : ListView.snapMode 0097 */ 0098 property alias snapMode: _listView.snapMode 0099 0100 /** 0101 * spacing : int 0102 */ 0103 property alias spacing: _listView.spacing 0104 0105 /** 0106 * flickable : Flickable 0107 */ 0108 property alias flickable : _listView 0109 0110 /** 0111 * scrollView : ScrollView 0112 */ 0113 property alias scrollView : _scrollView 0114 0115 /** 0116 * contentHeight : int 0117 */ 0118 property alias contentHeight : _listView.contentHeight 0119 0120 /** 0121 * contentWidth : int 0122 */ 0123 property alias contentWidth : _listView.contentWidth 0124 0125 /** 0126 * atYEnd : bool 0127 */ 0128 property alias atYEnd : _listView.atYEnd 0129 0130 /** 0131 * atYBeginning : bool 0132 */ 0133 property alias atYBeginning : _listView.atYBeginning 0134 0135 /** 0136 * topPadding : int 0137 */ 0138 property alias topPadding: _scrollView.topPadding 0139 0140 /** 0141 * bottomPadding : int 0142 */ 0143 property alias bottomPadding: _scrollView.bottomPadding 0144 0145 /** 0146 * rightPadding : int 0147 */ 0148 property alias rightPadding: _scrollView.rightPadding 0149 0150 /** 0151 * leftPadding : int 0152 */ 0153 property alias leftPadding: _scrollView.leftPadding 0154 0155 /** 0156 * padding : int 0157 */ 0158 property alias padding: _scrollView.padding 0159 0160 /** 0161 * leftMargin : int 0162 */ 0163 property int verticalScrollBarPolicy: 0164 { 0165 if(control.orientation === ListView.Horizontal) 0166 return ScrollBar.AlwaysOff 0167 0168 switch(Maui.Style.scrollBarPolicy) 0169 { 0170 case Maui.Style.AlwaysOn: return ScrollBar.AlwaysOn; 0171 case Maui.Style.AlwaysOff: return ScrollBar.AlwaysOff; 0172 case Maui.Style.AsNeeded: return ScrollBar.AsNeeded; 0173 case Maui.Style.AutoHide: return ScrollBar.AsNeeded; 0174 } 0175 } 0176 0177 /** 0178 * horizontalScrollBarPolicy : ScrollBar.policy 0179 */ 0180 property int horizontalScrollBarPolicy: 0181 { 0182 if(control.orientation === ListView.Vertical) 0183 return ScrollBar.AlwaysOff 0184 0185 switch(Maui.Style.scrollBarPolicy) 0186 { 0187 case Maui.Style.AlwaysOn: return ScrollBar.AlwaysOn; 0188 case Maui.Style.AlwaysOff: return ScrollBar.AlwaysOff; 0189 case Maui.Style.AsNeeded: return ScrollBar.AsNeeded; 0190 case Maui.Style.AutoHide: return ScrollBar.AsNeeded; 0191 } 0192 } 0193 0194 /** 0195 * holder : Holder 0196 */ 0197 property alias holder : _holder 0198 0199 /** 0200 * enableLassoSelection : bool 0201 */ 0202 property bool enableLassoSelection : false 0203 0204 /** 0205 * selectionMode : bool 0206 */ 0207 property bool selectionMode: false 0208 0209 /** 0210 * lassoRec : Rectangle 0211 */ 0212 property alias lassoRec : selectLayer 0213 0214 property alias header : _listView.header 0215 property alias footer : _listView.footer 0216 0217 property alias availableWidth: _listView.width 0218 0219 property alias availableHeight: _listView.height 0220 0221 /** 0222 * itemsSelected : 0223 */ 0224 signal itemsSelected(var indexes) 0225 0226 /** 0227 * areaClicked : 0228 */ 0229 signal areaClicked(var mouse) 0230 0231 /** 0232 * areaRightClicked : 0233 */ 0234 signal areaRightClicked() 0235 0236 /** 0237 * keyPress : 0238 */ 0239 signal keyPress(var event) 0240 0241 Keys.enabled : true 0242 Keys.forwardTo : _listView 0243 0244 ScrollView 0245 { 0246 id: _scrollView 0247 anchors.fill: parent 0248 clip: control.clip 0249 // visible: !_holder.visible 0250 focus: true 0251 padding: Maui.Style.contentMargins 0252 orientation: _listView.orientation 0253 0254 ScrollBar.horizontal.policy: control.horizontalScrollBarPolicy 0255 ScrollBar.vertical.policy: control.verticalScrollBarPolicy 0256 0257 ListView 0258 { 0259 id: _listView 0260 focus: true 0261 property var selectedIndexes : [] 0262 0263 clip: control.clip 0264 0265 spacing: Maui.Style.defaultSpacing 0266 0267 snapMode: ListView.NoSnap 0268 0269 0270 displayMarginBeginning: Maui.Style.toolBarHeight * 4 0271 displayMarginEnd: Maui.Style.toolBarHeight * 4 0272 0273 boundsBehavior: Flickable.StopAtBounds 0274 boundsMovement: Flickable.StopAtBounds 0275 0276 interactive: Maui.Handy.isTouch 0277 highlightFollowsCurrentItem: true 0278 highlightMoveDuration: 0 0279 highlightResizeDuration : 0 0280 0281 keyNavigationEnabled : true 0282 keyNavigationWraps : true 0283 Keys.onPressed: control.keyPress(event) 0284 0285 Maui.Holder 0286 { 0287 id: _holder 0288 visible: false 0289 anchors.fill : parent 0290 0291 anchors.topMargin: _listView.headerItem ? _listView.headerItem.height : 0 0292 anchors.bottomMargin: _listView.footerItem ? _listView.footerItem.height : 0 0293 } 0294 0295 Loader 0296 { 0297 asynchronous: true 0298 z: -1 0299 anchors.fill: parent 0300 active: !Maui.Handy.hasTransientTouchInput && !Maui.Handy.isMobile 0301 0302 sourceComponent: MouseArea 0303 { 0304 id: _mouseArea 0305 0306 propagateComposedEvents: true 0307 // preventStealing: true 0308 acceptedButtons: Qt.RightButton | Qt.LeftButton 0309 0310 onClicked: 0311 { 0312 control.areaClicked(mouse) 0313 control.forceActiveFocus() 0314 0315 if(mouse.button === Qt.RightButton) 0316 { 0317 control.areaRightClicked() 0318 return 0319 } 0320 } 0321 0322 onPositionChanged: 0323 { 0324 if(_mouseArea.pressed && control.enableLassoSelection && selectLayer.visible) 0325 { 0326 if(mouseX >= selectLayer.newX) 0327 { 0328 selectLayer.width = (mouseX + 10) < (control.x + control.width) ? (mouseX - selectLayer.x) : selectLayer.width; 0329 } else { 0330 selectLayer.x = mouseX < control.x ? control.x : mouseX; 0331 selectLayer.width = selectLayer.newX - selectLayer.x; 0332 } 0333 0334 if(mouseY >= selectLayer.newY) { 0335 selectLayer.height = (mouseY + 10) < (control.y + control.height) ? (mouseY - selectLayer.y) : selectLayer.height; 0336 if(!_listView.atYEnd && mouseY > (control.y + control.height)) 0337 _listView.contentY += 10 0338 } else { 0339 selectLayer.y = mouseY < control.y ? control.y : mouseY; 0340 selectLayer.height = selectLayer.newY - selectLayer.y; 0341 0342 if(!_listView.atYBeginning && selectLayer.y === 0) 0343 _listView.contentY -= 10 0344 } 0345 } 0346 } 0347 0348 onPressed: 0349 { 0350 if (mouse.source === Qt.MouseEventNotSynthesized && control.enableLassoSelection && mouse.button === Qt.LeftButton && control.count > 0) 0351 { 0352 selectLayer.visible = true; 0353 selectLayer.x = mouseX; 0354 selectLayer.y = mouseY; 0355 selectLayer.newX = mouseX; 0356 selectLayer.newY = mouseY; 0357 selectLayer.width = 0 0358 selectLayer.height = 0; 0359 } 0360 } 0361 0362 onPressAndHold: 0363 { 0364 if ( mouse.source !== Qt.MouseEventNotSynthesized && control.enableLassoSelection && !selectLayer.visible && !Maui.Handy.hasTransientTouchInput && !Maui.Handy.isAndroid) 0365 { 0366 selectLayer.visible = true; 0367 selectLayer.x = mouseX; 0368 selectLayer.y = mouseY; 0369 selectLayer.newX = mouseX; 0370 selectLayer.newY = mouseY; 0371 selectLayer.width = 0 0372 selectLayer.height = 0; 0373 mouse.accepted = true 0374 }else 0375 { 0376 mouse.accepted = false 0377 } 0378 } 0379 0380 onReleased: 0381 { 0382 if(mouse.button !== Qt.LeftButton || !control.enableLassoSelection || !selectLayer.visible) 0383 { 0384 mouse.accepted = false 0385 return; 0386 } 0387 0388 if(selectLayer.y > _listView.contentHeight) 0389 { 0390 return selectLayer.reset(); 0391 } 0392 0393 var lassoIndexes = [] 0394 var limitY = mouse.y === lassoRec.y ? lassoRec.y+lassoRec.height : mouse.y 0395 0396 for(var y = lassoRec.y; y < limitY; y+=10) 0397 { 0398 const index = _listView.indexAt(_listView.width/2,y+_listView.contentY) 0399 if(!lassoIndexes.includes(index) && index>-1 && index< _listView.count) 0400 lassoIndexes.push(index) 0401 } 0402 0403 control.itemsSelected(lassoIndexes) 0404 selectLayer.reset() 0405 } 0406 } 0407 } 0408 0409 Maui.Rectangle 0410 { 0411 id: selectLayer 0412 property int newX: 0 0413 property int newY: 0 0414 height: 0 0415 width: 0 0416 x: 0 0417 y: 0 0418 visible: false 0419 color: Qt.rgba(control.Maui.Theme.highlightColor.r,control.Maui.Theme.highlightColor.g, control.Maui.Theme.highlightColor.b, 0.2) 0420 opacity: 0.7 0421 0422 borderColor: control.Maui.Theme.highlightColor 0423 borderWidth: 2 0424 solidBorder: false 0425 0426 function reset() 0427 { 0428 selectLayer.x = 0; 0429 selectLayer.y = 0; 0430 selectLayer.newX = 0; 0431 selectLayer.newY = 0; 0432 selectLayer.visible = false; 0433 selectLayer.width = 0; 0434 selectLayer.height = 0; 0435 } 0436 } 0437 } 0438 } 0439 } 0440 0441