Warning, /frameworks/qqc2-desktop-style/org.kde.desktop/Menu.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2017 Marco Martin <mart@kde.org> 0003 SPDX-FileCopyrightText: 2017 The Qt Company Ltd. 0004 SPDX-FileCopyrightText: 2023 ivan tkachenko <me@ratijas.tk> 0005 0006 SPDX-License-Identifier: LGPL-3.0-only OR GPL-2.0-or-later 0007 */ 0008 0009 0010 import QtQuick 0011 import QtQuick.Layouts 0012 import QtQuick.Controls 0013 import QtQuick.Templates as T 0014 import org.kde.kirigami as Kirigami 0015 import org.kde.qqc2desktopstyle.private as StylePrivate 0016 0017 T.Menu { 0018 id: control 0019 0020 z: Kirigami.OverlayZStacking.z 0021 0022 implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, 0023 contentWidth + leftPadding + rightPadding) 0024 implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, 0025 contentHeight + topPadding + bottomPadding) 0026 0027 margins: 0 0028 0029 rightPadding: (scrollbar.visible && !mirrored) ? scrollbar.width : undefined 0030 leftPadding: (scrollbar.visible && mirrored) ? scrollbar.width : undefined 0031 horizontalPadding: style.pixelMetric("menuhmargin") 0032 verticalPadding: style.pixelMetric("menuvmargin") 0033 0034 StylePrivate.StyleItem { 0035 id: style 0036 visible: false 0037 } 0038 0039 delegate: MenuItem {} 0040 0041 contentItem: ListView { 0042 id: listview 0043 property bool hasCheckables: false 0044 property bool hasIcons: false 0045 0046 implicitWidth: contentItem.children 0047 .reduce((maxWidth, child) => Math.max(maxWidth, child.implicitWidth), 0) 0048 // Some non-zero value, so the whole menu does not get stuck zero 0049 // sized. Otherwise in RTL environment ListView just refuses to 0050 // report any usable contentHeight -- just zero. 0051 implicitHeight: Math.max(1, contentHeight) 0052 model: control.contentModel 0053 0054 spacing: 0 // Hardcoded to the Breeze theme value 0055 0056 interactive: Window.window 0057 ? contentHeight + control.topPadding + control.bottomPadding > Window.window.height 0058 : false 0059 clip: true 0060 currentIndex: control.currentIndex 0061 0062 keyNavigationEnabled: true 0063 keyNavigationWraps: true 0064 0065 ScrollBar.vertical: ScrollBar { 0066 id: scrollbar 0067 parent: listview.parent 0068 anchors.top: listview.top 0069 anchors.left: listview.right 0070 anchors.bottom: listview.bottom 0071 } 0072 0073 // mimic qtwidgets behaviour regarding menu highlighting 0074 Connections { 0075 target: control.contentItem.currentItem 0076 0077 function onHoveredChanged() { 0078 const item = control.contentItem.currentItem; 0079 if (item instanceof T.MenuItem && item.highlighted 0080 && !item.subMenu && !item.hovered) { 0081 control.currentIndex = -1 0082 } 0083 } 0084 } 0085 } 0086 0087 Connections { 0088 target: control.contentItem.contentItem 0089 0090 function onVisibleChildrenChanged() { 0091 const children = control.contentItem.contentItem.visibleChildren; 0092 let hasCheckables = control.contentItem.hasCheckables; 0093 let hasIcons = control.contentItem.hasIcons; 0094 for (const child of children) { 0095 if (child.checkable) { 0096 hasCheckables = true; 0097 } 0098 if (child.icon && child.icon.hasOwnProperty("name") 0099 && (child.icon.name !== "" || child.icon.source.toString() !== "")) { 0100 hasIcons = true; 0101 } 0102 } 0103 control.contentItem.hasCheckables = hasCheckables; 0104 control.contentItem.hasIcons = hasIcons; 0105 } 0106 } 0107 0108 enter: Transition { 0109 NumberAnimation { 0110 property: "opacity" 0111 from: 0 0112 to: 1 0113 easing.type: Easing.InOutQuad 0114 duration: Kirigami.Units.shortDuration 0115 } 0116 } 0117 0118 exit: Transition { 0119 NumberAnimation { 0120 property: "opacity" 0121 from: 1 0122 to: 0 0123 easing.type: Easing.InOutQuad 0124 duration: Kirigami.Units.shortDuration 0125 } 0126 } 0127 0128 background: Kirigami.ShadowedRectangle { 0129 radius: 3 0130 implicitWidth: Kirigami.Units.gridUnit * 8 0131 color: Kirigami.Theme.backgroundColor 0132 0133 border.color: Kirigami.ColorUtils.linearInterpolation(Kirigami.Theme.backgroundColor, Kirigami.Theme.textColor, Kirigami.Theme.frameContrast) 0134 border.width: 1 0135 0136 shadow.xOffset: 0 0137 shadow.yOffset: 2 0138 shadow.color: Qt.rgba(0, 0, 0, 0.3) 0139 shadow.size: 8 0140 } 0141 }