Warning, /plasma/qqc2-breeze-style/style/qtquickcontrols/MenuItem.qml is written in an unsupported language. File is not indexed.

0001 /* SPDX-FileCopyrightText: 2017 The Qt Company Ltd.
0002  * SPDX-FileCopyrightText: 2017 Marco Martin <mart@kde.org>
0003  * SPDX-FileCopyrightText: 2020 Noah Davis <noahadvs@gmail.com>
0004  * SPDX-License-Identifier: LicenseRef-KDE-Accepted-LGPL
0005  */
0006 
0007 import QtQuick
0008 import QtQuick.Layouts
0009 import QtQuick.Templates as T
0010 import QtQuick.Controls as Controls
0011 import org.kde.kirigami as Kirigami
0012 import org.kde.breeze.impl as Impl
0013 
0014 T.MenuItem {
0015     id: control
0016 
0017     // We can't do `control: control` inside a Component due to scoping issues, so set up an alias
0018     // to be used by the radio/check indicator components.
0019     property alias __controlRoot: control
0020 
0021     property bool __reserveSpaceForIndicator: menu?.__hasIndicators ?? false
0022     property bool __reserveSpaceForIcon: menu?.__hasIcons ?? false
0023     property bool __reserveSpaceForArrow: menu?.__hasArrows ?? false
0024 
0025     Kirigami.Theme.colorSet: control.down || control.highlighted ? Kirigami.Theme.Button : -1
0026     Kirigami.Theme.inherit: !background || !background.visible && !(control.highlighted || control.down)
0027 
0028     implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
0029                             implicitContentWidth + leftPadding + rightPadding,
0030                             implicitIndicatorWidth + leftPadding + rightPadding)
0031     implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
0032                              implicitContentHeight + topPadding + bottomPadding,
0033                              implicitIndicatorHeight + topPadding + bottomPadding)
0034     baselineOffset: contentItem.y + contentItem.baselineOffset
0035 
0036 //     width: parent ? parent.width : implicitWidth
0037 
0038     // Note: Binding height here to make sure menu items that are not visible are
0039     // properly collapsed, otherwise they will still occupy space inside the menu.
0040     height: visible ? undefined : 0
0041 
0042     icon.width: Kirigami.Units.iconSizes.sizeForLabels
0043     icon.height: Kirigami.Units.iconSizes.sizeForLabels
0044 
0045     Layout.fillWidth: true
0046 
0047     spacing: Kirigami.Units.mediumSpacing
0048     padding: Kirigami.Units.mediumSpacing
0049     leftPadding: {
0050         if (!control.indicator.visible
0051             && ((!contentItem.hasIcon && contentItem.textBesideIcon) // False if contentItem has been replaced
0052                 || display == T.AbstractButton.TextOnly
0053                 || display == T.AbstractButton.TextUnderIcon)) {
0054             return Impl.Units.mediumHorizontalPadding
0055         } else {
0056             return control.horizontalPadding
0057         }
0058     }
0059     rightPadding: {
0060         if (!control.arrow.visible
0061             && contentItem.hasLabel // False if contentItem has been replaced
0062             && display != T.AbstractButton.IconOnly) {
0063             return Impl.Units.mediumHorizontalPadding
0064         } else {
0065             return control.horizontalPadding
0066         }
0067     }
0068 
0069     Kirigami.MnemonicData.enabled: control.enabled && control.visible
0070     Kirigami.MnemonicData.controlType: Kirigami.MnemonicData.MenuItem
0071     Kirigami.MnemonicData.label: control.text
0072     Shortcut {
0073         //in case of explicit & the button manages it by itself
0074         enabled: !(RegExp(/\&[^\&]/).test(control.text))
0075         sequence: control.Kirigami.MnemonicData.sequence
0076         onActivated: {
0077             if (control.checkable) {
0078                 control.toggle();
0079             } else {
0080                 control.clicked();
0081             }
0082         }
0083     }
0084 
0085     indicator: Loader {
0086         visible: control.checkable
0087         active: visible
0088         sourceComponent: control.autoExclusive ? radioIndicator : checkIndicator
0089 
0090         Component {
0091             id: checkIndicator
0092             Impl.CheckIndicator {
0093                 control: __controlRoot
0094                 checkState: control.checked ? Qt.Checked : Qt.Unchecked
0095             }
0096         }
0097         Component {
0098             id: radioIndicator
0099             Impl.RadioIndicator {
0100                 control: __controlRoot
0101             }
0102         }
0103     }
0104 
0105     arrow: Kirigami.Icon {
0106         anchors {
0107             right: control.right
0108             rightMargin: control.rightPadding
0109             verticalCenter: control.verticalCenter
0110         }
0111         source: control.mirrored ? "arrow-left" : "arrow-right"
0112         implicitWidth: Kirigami.Units.iconSizes.sizeForLabels
0113         implicitHeight: Kirigami.Units.iconSizes.sizeForLabels
0114         visible: control.subMenu
0115     }
0116 
0117     contentItem: Impl.IconLabelShortcutContent {
0118         control: control
0119         text: control.Kirigami.MnemonicData.richTextLabel
0120         alignment: Qt.AlignLeft | Qt.AlignVCenter
0121         reserveSpaceForIndicator: control.__reserveSpaceForIndicator
0122         reserveSpaceForIcon: control.__reserveSpaceForIcon
0123         reserveSpaceForArrow: control.__reserveSpaceForArrow
0124     }
0125 
0126     background: Impl.MenuItemBackground {
0127         control: control
0128     }
0129 }