Warning, /maui/mauikit/src/controls.5/private/SideBar.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.15
0021 import QtQuick.Controls 2.15
0022 import QtQml 2.15
0023 import org.mauikit.controls 1.3 as Maui
0024 import QtQuick.Templates 2.15 as T
0025 import QtQuick.Window 2.15
0026 
0027 /**
0028  * SideBar
0029  * A global sidebar for the application window that can be collapsed.
0030  *
0031  *
0032  *
0033  *
0034  *
0035  *
0036  */
0037 T.Pane
0038 {
0039   id: control
0040   
0041   Maui.Theme.colorSet: Maui.Theme.Window
0042   Maui.Theme.inherit: false
0043   
0044   readonly property alias position : _private.position
0045   readonly property bool peeking : control.collapsed && control.position > 0
0046   readonly property bool resizing: _dragHandler.active
0047   
0048   visible: position > 0
0049   
0050   width: position * constrainedWidth
0051   
0052   /*!
0053    *      \qmlproperty Item AbstractSideBar::content
0054    * 
0055    *      The main content is added to an Item contents, it can anchored or sized normally.
0056    */
0057   default property alias content : _content.data
0058     
0059     
0060     /*!
0061      *      If the sidebar should be collapsed or not, this property can be used to dynamically collapse
0062      *      the sidebar on constrained spaces.
0063      */
0064     property bool collapsed: false    
0065     property bool resizeable : !Maui.Handy.isMobile
0066   /*!
0067      *   If when collapsed the sidebar should automatically hide or stay in place
0068      */
0069     property bool autoHide: false
0070     property bool autoShow: true
0071     
0072     /*!
0073      *      preferredWidth : int
0074      *      The preferred width of the sidebar in the expanded state.
0075      */
0076     readonly property int constrainedWidth : Math.min(control.preferredWidth, control.Window.window.width*0.9)
0077     property int preferredWidth : Maui.Style.units.gridUnit * 12
0078     property int maximumWidth:  Maui.Style.units.gridUnit * 20
0079     property int minimumWidth:  Maui.Style.units.gridUnit * 4
0080     /*!
0081      *      \qmlproperty MouseArea AbstractSideBar::overlay
0082      * 
0083      *      When the application has a constrained width to fit the sidebar and main contain,
0084      *      the sidebar is in a constrained state, and the app main content gets dimmed by an overlay.
0085      *      This property gives access to such ovelay element drawn on top of the app contents.
0086      */
0087     //readonly property alias overlay : _overlayLoader.item
0088     
0089     clip: true
0090     
0091     padding: 0
0092     topPadding: 0
0093     bottomPadding: 0
0094     leftPadding: 0
0095     rightPadding: 0    
0096     
0097     signal opened()
0098     signal closed()    
0099     
0100     background: Rectangle
0101     {
0102       opacity: Maui.Style.translucencyAvailable && Maui.Style.enableEffects ? 0.8 :  1
0103       color: Maui.Theme.backgroundColor
0104       Behavior on color
0105       {
0106         Maui.ColorTransition{}
0107       }
0108     }
0109     
0110 //     Component.onCompleted:
0111 //     {
0112 //       if(control.autoShow && control.collapsed)
0113 //         control.open()
0114 //     }
0115 //     
0116     QtObject
0117     {
0118       id: _private
0119       property bool initial: true
0120       property double position       
0121       property int resizeValue
0122       property int finalWidth : control.constrainedWidth + _dragHandler.centroid.position.x
0123       
0124       //       Binding on resizeValue
0125       //       {
0126       //         //delayed: true
0127       // //         when: _dragHandler.active
0128       //         value: 
0129       //         restoreMode: Binding.RestoreBindingOrValue
0130       //       }      
0131       //       
0132       Binding on position
0133       {
0134         // when: control.autoHide
0135         value: control.enabled ? (!control.autoShow ? 0 : (control.collapsed && control.autoHide ? 0 : 1)) : 0
0136         restoreMode: Binding.RestoreBindingOrValue
0137       }
0138       
0139       Behavior on position
0140       {
0141         enabled: Maui.Style.enableEffects
0142         
0143         NumberAnimation
0144         {
0145           duration: Maui.Style.units.shortDuration
0146           easing.type: Easing.InOutQuad
0147         }
0148       }
0149     }   
0150     
0151     onCollapsedChanged:
0152     {
0153       if(control.collapsed || !control.enabled)
0154       {
0155 if(control.autoHide)
0156         {
0157 control.close()
0158 }
0159       }
0160       else
0161       {
0162         
0163         if(control.autoShow)
0164         {
0165          control.open()
0166         }
0167         
0168       }
0169     }
0170     
0171     contentItem: Item
0172     {
0173       
0174       Item
0175       {
0176         id: _content
0177         width: control.constrainedWidth
0178         anchors.top: parent.top
0179         anchors.bottom: parent.bottom
0180         anchors.right: parent.right        
0181       }        
0182       
0183       Loader
0184       {
0185         
0186         active: control.resizing       
0187         sourceComponent: Item
0188         {
0189           Rectangle
0190           {
0191              parent: control.parent
0192             id: _resizeTarget
0193             width: Math.max(Math.min(_private.finalWidth, control.maximumWidth), control.minimumWidth)
0194             height: parent.height
0195             color: Maui.Theme.alternateBackgroundColor
0196             
0197             HoverHandler
0198             {
0199               cursorShape: Qt.SizeHorCursor
0200             }            
0201             
0202             Maui.Separator
0203             {
0204               anchors.top: parent.top
0205               anchors.bottom: parent.bottom
0206               anchors.right: parent.right  
0207               weight: Maui.Separator.Weight.Light
0208               opacity: 0.4
0209               
0210               Behavior on color
0211               {
0212                 Maui.ColorTransition{}
0213               }
0214             }
0215           }
0216           
0217           Rectangle
0218           {
0219              parent: control.parent
0220             id: _resizeTarget2
0221             anchors.leftMargin:  _resizeTarget.width
0222             width: parent.width
0223             height: parent.height
0224             color: Maui.Theme.backgroundColor
0225           }
0226         }
0227       }
0228       
0229       Rectangle
0230       {
0231         visible: control.resizeable
0232         height: parent.height
0233         width : 6
0234         anchors.right: parent.right
0235         color:  _dragHandler.active ? Maui.Theme.highlightColor : "transparent"
0236                 
0237         HoverHandler
0238         {
0239           cursorShape: Qt.SizeHorCursor     
0240         }        
0241         
0242         DragHandler
0243         {
0244           id: _dragHandler
0245           enabled: control.resizeable
0246           yAxis.enabled: false
0247           xAxis.enabled: true
0248           xAxis.minimum: control.minimumWidth - control.constrainedWidth
0249           xAxis.maximum: control.maximumWidth - control.constrainedWidth
0250           target: null
0251           cursorShape: Qt.SizeHorCursor
0252           
0253           onActiveChanged:
0254           {
0255             let value = control.preferredWidth + _dragHandler.centroid.position.x 
0256             if(!active)
0257             {
0258               if(value > control.maximumWidth)
0259               {
0260                 control.preferredWidth = control.maximumWidth
0261                 return
0262               }
0263               
0264               if( value < control.minimumWidth)
0265               {
0266                 control.preferredWidth = control.minimumWidth
0267                 return
0268               }
0269               control.preferredWidth = value      
0270             }
0271           }          
0272         }
0273       }
0274       
0275       Maui.Separator
0276       {
0277         anchors.top: parent.top
0278         anchors.bottom: parent.bottom
0279         anchors.right: parent.right  
0280         weight: Maui.Separator.Weight.Light
0281         
0282         Behavior on color
0283         {
0284           Maui.ColorTransition{}
0285         }
0286       }   
0287     }    
0288     
0289     function open()
0290     {
0291       _private.position = 1
0292     }
0293     
0294     function close()
0295     {
0296       _private.position = 0
0297     }
0298     
0299     function toggle()
0300     {
0301       if(_private.position === 0)
0302       {
0303         control.open()
0304       }else
0305       {
0306         control.close()
0307       }
0308     }
0309 }
0310