Warning, /frameworks/kirigami/src/controls/private/globaltoolbar/PageRowGlobalToolBarUI.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  *  SPDX-FileCopyrightText: 2018 Marco Martin <mart@kde.org>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 import QtQuick
0008 import QtQuick.Controls as QQC2
0009 import QtQuick.Layouts
0010 import org.kde.kirigami as Kirigami
0011 import "../../templates" as KT
0012 import "../../templates/private" as TP
0013 import "../" as P
0014 
0015 Kirigami.AbstractApplicationHeader {
0016     id: header
0017     readonly property int leftReservedSpace: (buttonsLayout.visible && buttonsLayout.visibleChildren.length > 0 ? buttonsLayout.width + Kirigami.Units.smallSpacing : 0) // Take into account the layout margins the nav buttons have
0018         + (leftHandleAnchor.visible ? leftHandleAnchor.width : 0)
0019         + (menuButton.visible ? menuButton.width : 0)
0020     readonly property int rightReservedSpace: rightHandleAnchor.visible ? rightHandleAnchor.width + Kirigami.Units.smallSpacing : 0
0021 
0022     readonly property alias leftHandleAnchor: leftHandleAnchor
0023     readonly property alias rightHandleAnchor: rightHandleAnchor
0024 
0025     readonly property bool breadcrumbVisible: layerIsMainRow && breadcrumbLoader.active
0026     readonly property bool layerIsMainRow: (root.layers.currentItem.hasOwnProperty("columnView")) ? root.layers.currentItem.columnView === root.columnView : false
0027     readonly property Item currentItem: layerIsMainRow ? root.columnView : root.layers.currentItem
0028 
0029     function __shouldHandleAnchorBeVisible(handleAnchor: Item, drawerProperty: string, itemProperty: string): bool {
0030         if (typeof applicationWindow === "undefined") {
0031             return false;
0032         }
0033         const w = applicationWindow();
0034         if (!w) {
0035             return false;
0036         }
0037         const drawer = w[drawerProperty] as KT.OverlayDrawer;
0038         if (!drawer || !drawer.enabled || !drawer.handleVisible || drawer.handle.handleAnchor !== handleAnchor) {
0039             return false;
0040         }
0041         const item = breadcrumbLoader.pageRow?.[itemProperty] as Item;
0042         const style = item?.globalToolBarStyle ?? Kirigami.ApplicationHeaderStyle.None;
0043         return globalToolBar.canContainHandles || style === Kirigami.ApplicationHeaderStyle.ToolBar;
0044     }
0045 
0046     height: visible ? implicitHeight : 0
0047     minimumHeight: globalToolBar.minimumHeight
0048     preferredHeight: globalToolBar.preferredHeight
0049     maximumHeight: globalToolBar.maximumHeight
0050     separatorVisible: globalToolBar.separatorVisible
0051 
0052     Kirigami.Theme.colorSet: globalToolBar.colorSet
0053     Kirigami.Theme.textColor: currentItem ? currentItem.Kirigami.Theme.textColor : parent.Kirigami.Theme.textColor
0054 
0055     RowLayout {
0056         anchors.fill: parent
0057         spacing: 0
0058 
0059         Item {
0060             Layout.preferredWidth: applicationWindow().pageStack.globalToolBar.leftReservedSpace
0061             visible: applicationWindow().pageStack !== root
0062         }
0063 
0064         Item {
0065             id: leftHandleAnchor
0066             visible: header.__shouldHandleAnchorBeVisible(leftHandleAnchor, "globalDrawer", "leadingVisibleItem")
0067 
0068             Layout.preferredHeight: Math.max(backButton.implicitHeight, parent.height)
0069             Layout.preferredWidth: height
0070         }
0071 
0072         P.PrivateActionToolButton {
0073             id: menuButton
0074             visible: !Kirigami.Settings.isMobile && applicationWindow().globalDrawer && "isMenu" in applicationWindow().globalDrawer && applicationWindow().globalDrawer.isMenu
0075             icon.name: "open-menu-symbolic"
0076             showMenuArrow: false
0077 
0078             Layout.preferredHeight: Math.min(backButton.implicitHeight, parent.height)
0079             Layout.preferredWidth: height
0080             Layout.leftMargin: Kirigami.Units.smallSpacing
0081 
0082             action: Kirigami.Action {
0083                 children: applicationWindow().globalDrawer && applicationWindow().globalDrawer.actions ? applicationWindow().globalDrawer.actions : []
0084                 tooltip: checked ? qsTr("Close menu") : qsTr("Open menu")
0085             }
0086             Accessible.name: action.tooltip
0087 
0088             Connections {
0089                 // Only target the GlobalDrawer when it *is* a GlobalDrawer, since
0090                 // it can be something else, and that something else probably
0091                 // doesn't have an isMenuChanged() signal.
0092                 target: applicationWindow().globalDrawer as Kirigami.GlobalDrawer
0093                 function onIsMenuChanged() {
0094                     if (!applicationWindow().globalDrawer.isMenu && menuButton.menu) {
0095                         menuButton.menu.dismiss()
0096                     }
0097                 }
0098             }
0099         }
0100 
0101         RowLayout {
0102             id: buttonsLayout
0103             Layout.fillHeight: true
0104             Layout.preferredHeight: Math.max(backButton.visible ? backButton.implicitHeight : 0, forwardButton.visible ? forwardButton.implicitHeight : 0)
0105 
0106             Layout.leftMargin: leftHandleAnchor.visible ? Kirigami.Units.smallSpacing : 0
0107 
0108             visible: (globalToolBar.showNavigationButtons !== Kirigami.ApplicationHeaderStyle.NoNavigationButtons || applicationWindow().pageStack.layers.depth > 1 && !(applicationWindow().pageStack.layers.currentItem instanceof Kirigami.PageRow || header.layerIsMainRow))
0109                 && globalToolBar.actualStyle !== Kirigami.ApplicationHeaderStyle.None
0110 
0111             Layout.maximumWidth: visibleChildren.length > 0 ? Layout.preferredWidth : 0
0112 
0113             TP.BackButton {
0114                 id: backButton
0115                 Layout.leftMargin: leftHandleAnchor.visible ? 0 : Kirigami.Units.smallSpacing
0116                 Layout.minimumWidth: implicitHeight
0117                 Layout.minimumHeight: implicitHeight
0118                 Layout.maximumHeight: buttonsLayout.height
0119             }
0120             TP.ForwardButton {
0121                 id: forwardButton
0122                 Layout.minimumWidth: implicitHeight
0123                 Layout.minimumHeight: implicitHeight
0124                 Layout.maximumHeight: buttonsLayout.height
0125             }
0126         }
0127 
0128         QQC2.ToolSeparator {
0129             visible: (menuButton.visible || (buttonsLayout.visible && buttonsLayout.visibleChildren.length > 0)) && breadcrumbVisible && pageRow.depth > 1
0130         }
0131 
0132         Loader {
0133             id: breadcrumbLoader
0134             Layout.fillWidth: true
0135             Layout.fillHeight: true
0136             Layout.minimumHeight: -1
0137             Layout.preferredHeight: -1
0138             property Kirigami.PageRow pageRow: root
0139 
0140             asynchronous: true
0141 
0142             active: globalToolBar.actualStyle === Kirigami.ApplicationHeaderStyle.Breadcrumb
0143                 && header.currentItem
0144                 && header.currentItem.globalToolBarStyle !== Kirigami.ApplicationHeaderStyle.None
0145 
0146             source: Qt.resolvedUrl("BreadcrumbControl.qml")
0147         }
0148 
0149         Item {
0150             id: rightHandleAnchor
0151             visible: header.__shouldHandleAnchorBeVisible(rightHandleAnchor, "contextDrawer", "trailingVisibleItem")
0152 
0153             Layout.preferredHeight: Math.max(backButton.implicitHeight, parent.height)
0154             Layout.preferredWidth: height
0155         }
0156     }
0157     background.opacity: breadcrumbLoader.active ? 1 : 0
0158 }