Warning, /maui/mauikit/src/controls.6/SplitViewItem.qml is written in an unsupported language. File is not indexed.

0001 // Copyright 2018-2020 Camilo Higuita <milo.h@aol.com>
0002 // Copyright 2018-2020 Nitrux Latinoamericana S.C.
0003 //
0004 // SPDX-License-Identifier: GPL-3.0-or-later
0005 
0006 
0007 import QtQuick
0008 import QtQuick.Controls
0009 import QtQml.Models
0010 import Qt5Compat.GraphicalEffects
0011 
0012 import org.mauikit.controls 1.3 as Maui
0013 
0014 /**
0015  * @inherit QtQuick.Controls.Pane
0016  * @brief An item to be used as a view container for the MauiKit SplitView.
0017  * <a href="https://doc.qt.io/qt-6/qml-qtquick-controls-pane.html">This controls inherits from QQC2 Pane, to checkout its inherited properties refer to the Qt Docs.</a>
0018  * This is the preferred control to use when adding a new view into the SplitView, since it follows the Maui Style HIG.
0019  * @see SplitView
0020  * 
0021  * @note When this element is being resized by the SplitView handle, and reaches the minimum width, an action to close the view is then suggested and triggered if the pressed event of the handle is released at that minimum width.
0022  */
0023 Pane
0024 {
0025     id: control
0026     
0027     Maui.Theme.colorSet: Maui.Theme.Window
0028     Maui.Theme.inherit: false
0029     
0030     /**
0031      * @brief By default the children content of this item needs to be positioned manually.
0032      * @property list<QtObject> SplitViewItem::content
0033      */
0034     default property alias content: _container.data
0035         
0036         /**
0037          * @brief The index of this view in the SplitView control.
0038          */
0039         readonly property int splitIndex : ObjectModel.index
0040         
0041         /**
0042          * @brief The minimum width of this view when resizing the SplitView.
0043          * By default this is set to a fixed value of `200`.
0044          */
0045         property int minimumWidth : 200
0046         
0047         /**
0048          * @brief The minimum height of this view when resizing the SplitView.
0049          * By default this is set to a fixed value of `100`.
0050          */
0051         property int minimumHeight : 100
0052         
0053         /**
0054          * @brief Whether the style of this view will be more compact. A compact style has not border corners or styling.
0055          * While a non-compact mode means there is more than on view in the parent SplitView and the views will have rounded corners.
0056          * This is `true` for mobile devices and one there is a single item in the SplitView.
0057          */
0058         readonly property bool compact : Maui.Handy.isMobile || SplitView.view.count === 1
0059         
0060         SplitView.fillHeight: true
0061         SplitView.fillWidth: true
0062         
0063         SplitView.preferredHeight: SplitView.view.orientation === Qt.Vertical ? SplitView.view.height / (SplitView.view.count) :  SplitView.view.height
0064         SplitView.minimumHeight: SplitView.view.orientation === Qt.Vertical ?  minimumHeight : 0
0065         
0066         SplitView.preferredWidth: SplitView.view.orientation === Qt.Horizontal ? SplitView.view.width / (SplitView.view.count) : SplitView.view.width
0067         SplitView.minimumWidth: SplitView.view.orientation === Qt.Horizontal ? minimumWidth :  0
0068         
0069         clip: SplitView.view.orientation === Qt.Vertical && SplitView.view.count === 2 && splitIndex > 0
0070         
0071         padding: compact ? 0 : Maui.Style.contentMargins
0072         Behavior on padding
0073         {
0074             NumberAnimation
0075             {
0076                 duration: Maui.Style.units.shortDuration
0077                 easing.type: Easing.InQuad
0078             }
0079         }
0080         
0081         
0082         contentItem: Item
0083         {                
0084             Item
0085             {
0086                 id:  _container
0087                 anchors.fill: parent
0088             }                  
0089             
0090             Loader
0091             {
0092                 asynchronous: true
0093                 anchors.fill: parent
0094                 active: control.SplitView.view.resizing
0095                 visible: active
0096                 sourceComponent: Rectangle
0097                 {
0098                     color: Maui.Theme.backgroundColor
0099                     opacity: (control.minimumWidth) / control.width
0100                 }
0101             }
0102             
0103             Loader
0104             {
0105                 asynchronous: true
0106                 anchors.bottom: parent.bottom
0107                 anchors.left: parent.left
0108                 anchors.right: parent.right
0109                 height: 2
0110                 active: control.SplitView.view.currentIndex === splitIndex && control.SplitView.view.count > 1
0111                 visible: active
0112                 sourceComponent: Rectangle
0113                 {
0114                     color: Maui.Theme.highlightColor
0115                 }
0116             }
0117             
0118             Loader
0119             {
0120                 asynchronous: true
0121                 anchors.centerIn: parent
0122                 active: control.SplitView.view.resizing && control.width < control.minimumWidth + 60
0123                 visible: active
0124                 sourceComponent: Maui.Chip
0125                 {
0126                     opacity: (control.minimumWidth) / control.width
0127                     
0128                     Maui.Theme.backgroundColor: Maui.Theme.negativeTextColor
0129                     label.text: i18nd("mauikit", "Close Split")
0130                 }
0131             }
0132             
0133             Loader
0134             {
0135                 asynchronous: true
0136                 anchors.centerIn: parent
0137                 active: control.SplitView.view.resizing && control.height < control.minimumHeight + 60
0138                 visible: active
0139                 sourceComponent: Maui.Chip
0140                 {
0141                     opacity: (control.minimumHeight) / control.height
0142                     
0143                     Maui.Theme.backgroundColor: Maui.Theme.negativeTextColor
0144                     label.text: i18nd("mauikit", "Close Split")
0145                 }
0146             }            
0147             
0148             MouseArea
0149             {
0150                 anchors.fill: parent
0151                 propagateComposedEvents: true
0152                 preventStealing: false
0153                 cursorShape: undefined
0154                 
0155                 onPressed: (mouse) =>
0156                 {
0157                     control.SplitView.view.currentIndex = control.splitIndex
0158                     mouse.accepted = false
0159                 }
0160             }    
0161             
0162             layer.enabled: !control.compact   
0163             layer.smooth: true
0164             layer.effect: OpacityMask
0165             {
0166                 maskSource: Rectangle
0167                 {
0168                     width: _container.width
0169                     height: _container.height
0170                     radius: Maui.Style.radiusV
0171                 }
0172             }     
0173         }
0174         
0175         Connections
0176         {
0177             target: control.SplitView.view
0178             function onResizingChanged()
0179             {
0180                 if(control.width === control.minimumWidth && !control.SplitView.view.resizing)
0181                 {
0182                     control.SplitView.view.closeSplit(control.splitIndex)
0183                 }
0184                 
0185                 if(control.height === control.minimumHeight && !control.SplitView.view.resizing)
0186                 {
0187                     control.SplitView.view.closeSplit(control.splitIndex)
0188                 }
0189             }
0190         }
0191         
0192         /**
0193          * @brief Forces to focus this item in the SplitView, and marks it as the current view.
0194          */
0195         function focusSplitItem()
0196         {
0197             control.SplitView.view.currentIndex = control.splitIndex
0198         }
0199 }