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

0001 import QtQuick
0002 import QtQuick.Controls
0003 
0004 import org.mauikit.controls 1.3 as Maui
0005 import "private" as Private
0006 
0007 /**
0008  * @brief A view with a collapsible sidebar.
0009  * 
0010  * <a href="https://doc.qt.io/qt-6/qml-qtquick-controls-item.html">This controls inherits from QQC2 Item, to checkout its inherited properties refer to the Qt Docs.</a>
0011  * 
0012  * The SideBarView is a convenient way for organizing the application contents into view alongside with a side-bar, which can be resized, collased, hidden and tweaked further. This control adapts to small screen spaces.
0013  * 
0014  * @image html SideBarView/sidebar_empty.png
0015  *  
0016  * @section sections Sections
0017  * The SideBarView is divided into two sections, the sidebar container and the main contents area.
0018  * 
0019  * @subsection sidebar SideBar
0020  * The sidebar area can contain any number children items, and its positioning must be handled manually, either by anchoring or using the size and coordinates properties - anchoring to fill its parent is the best way to go, since the sidebar container can changed its size and positioning.
0021  * 
0022  * Once a child item has been set, other properties can be visited, such as setting the sidebar preferred and minimum width, or deciding if the sidebar will be resize-able or not. Those properties can be accessed via the alias property of the sidebar.
0023  * @see sideBar
0024  * 
0025  * The sidebar can be hidden at the application startup, to tweak this behaviour the auto hide properties can be set accordingly.
0026  * The sidebar can also be collapsed, and this behavior can be fine-tuned, by either deciding if when collapsing the sidebar should stay visible or not.
0027  * 
0028  * Tweaking the look of the sidebar can also be achieved by changing its background and padding properties. Those all properties are accessible via the alias property `sideBar` - and a few more methods for closing or opening the sidebar.
0029  * @see SideBar
0030  *  
0031  * @image html SideBarView/sidebar_collapsed.png "The sidebar is collapsed and expanded, shifting the main area content"
0032  * 
0033  * @subsection maincontent Content
0034  * The position of the main content of the SideBarView has to be done by the child item.
0035  * The default behaviour of the main content is be to shifted/moved when the sidebar being collapsed is expanded.
0036  *      
0037  * @code
0038  * Maui.SideBarView
0039  * {
0040  *    id: _sideBar
0041  *    anchors.fill: parent
0042  * 
0043  *    sideBarContent: Maui.Page
0044  *    {
0045  *        Maui.Theme.colorSet: Maui.Theme.Window
0046  *        anchors.fill: parent
0047  * 
0048  *        headBar.leftContent: Maui.ToolButtonMenu
0049  *        {
0050  *            icon.name: "application-menu"
0051  *            MenuItem
0052  *            {
0053  *                text: "About"
0054  *                icon.name: "info-dialog"
0055  *                onTriggered: root.about()
0056  *            }
0057  *        }
0058  * 
0059  *        Maui.Holder
0060  *        {
0061  *            anchors.fill: parent
0062  *            title: "SideBar"
0063  *            body: "Collapsable."
0064  *            emoji: "folder"
0065  *        }
0066  *    }
0067  * 
0068  *    Maui.Page
0069  *    {
0070  *        anchors.fill: parent
0071  *        Maui.Controls.showCSD: true
0072  * 
0073  *        headBar.leftContent: ToolButton
0074  *        {
0075  *            icon.name: _sideBar.sideBar.visible ? "sidebar-collapse" : "sidebar-expand"
0076  *            onClicked: _sideBar.sideBar.toggle()
0077  *        }
0078  * 
0079  *        Maui.Holder
0080  *        {
0081  *            anchors.fill: parent
0082  *            title: "Page"
0083  *            body: "Page main content."
0084  *            emoji: "application-x-addon-symbolic"
0085  *        }
0086  *    }
0087  * }
0088  * @endcode
0089  * 
0090  * @section notes Notes
0091  * 
0092  * The width of the sidebar section will always be restrained to a maximum value less than the window width - by reserving a sane margin to be able to close the sidebar by clicking/pressing outside of it. 
0093  * 
0094  * To place an item in the sidebar, use the exposed alias property.
0095  * @see sideBarContent
0096  * 
0097  * <a href="https://invent.kde.org/maui/mauikit/-/blob/qt6-2/examples/SideBarView.qml">You can find a more complete example at this link.</a>
0098  * 
0099  */
0100 Item
0101 {
0102     id: control
0103     
0104     /**
0105      * @brief
0106      * All child items declared will become part of the main area section.
0107      * @property list<QtObject> SideBarView::content
0108      */
0109     default property alias content : _content.data
0110         
0111         /**
0112          * @brief Convenient property to easily add items to the sidebar section.
0113          * @property list<QtObject> SideBarView::sideBarContent
0114          */    
0115         property alias sideBarContent: _sideBar.content
0116         
0117         /**
0118          * @brief This is an alias exposed to access all the sidebar section properties.
0119          * To know more about the available properties visit the control documentation.
0120          * @see SideBar
0121          * 
0122          * @code
0123          * SideBarView
0124          * {
0125          *      sideBar.collapsed: width < 800
0126          *      sideBar.resizeable: false
0127          *      sideBar.autoHide: true
0128          * }
0129          * @endcode
0130          */
0131         readonly property alias sideBar : _sideBar
0132         
0133         Private.SideBar
0134         {
0135             id: _sideBar
0136             height: parent.height
0137             collapsed: control.width < (preferredWidth * 2.5)
0138             sideBarView: control
0139         }
0140         
0141         Item
0142         {
0143             anchors.fill: parent
0144             clip: true
0145             transform: Translate
0146             {
0147                 x: control.sideBar.collapsed ? control.sideBar.position * (control.sideBar.width) : 0
0148             }
0149             
0150             anchors.leftMargin: control.sideBar.collapsed ? 0 : control.sideBar.width  * control.sideBar.position
0151             
0152             Item
0153             {
0154                 id: _content
0155                 anchors.fill: parent
0156             }
0157             
0158             Loader
0159             {
0160                 anchors.fill: parent
0161                 active: _sideBar.collapsed && _sideBar.position === 1
0162                 // asynchronous: true
0163                 
0164                 sourceComponent: MouseArea
0165                 {
0166                     onClicked: _sideBar.close()
0167                     
0168                     Rectangle
0169                     {
0170                         anchors.fill: parent
0171                         color: "#333"
0172                         opacity : visible ?  0.5 : 0
0173                         
0174                         Behavior on opacity
0175                         {
0176                             NumberAnimation 
0177                             {
0178                                 duration: 500
0179                                 easing.type: Easing.InOutQuad
0180                             }
0181                         }
0182                     }
0183                 }
0184             }
0185         }
0186 }
0187