/* SPDX-FileCopyrightText: 2016 Marco Martin SPDX-License-Identifier: LGPL-2.0-or-later */ import QtQuick import QtQuick.Window import QtQuick.Controls import QtQuick.Templates as T import org.kde.ksvg as KSvg //NOTE: importing PlasmaCore is necessary in order to make KSvg load the current Plasma Theme import org.kde.plasma.core as PlasmaCore import org.kde.kirigami as Kirigami T.Menu { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, contentItem ? contentItem.implicitWidth + leftPadding + rightPadding : 0) implicitHeight: Math.max(background ? background.implicitHeight : 0, contentItem ? contentItem.implicitHeight : 0) + topPadding + bottomPadding delegate: MenuItem { width: parent.width; onImplicitWidthChanged: control.contentItem.contentItem.childrenChanged() } margins: 0 topPadding: (background as KSvg.FrameSvgItem)?.margins.top ?? undefined leftPadding: (background as KSvg.FrameSvgItem)?.margins.left ?? undefined rightPadding: (background as KSvg.FrameSvgItem)?.margins.right ?? undefined bottomPadding: (background as KSvg.FrameSvgItem)?.margins.bottom ?? undefined contentItem: ListView { implicitHeight: contentHeight property bool hasCheckables: false property bool hasIcons: false model: control.contentModel implicitWidth: { var maxWidth = 0; for (var i = 0; i < contentItem.children.length; ++i) { maxWidth = Math.max(maxWidth, contentItem.children[i].implicitWidth); } return maxWidth; } interactive: Window.window ? contentHeight + control.topPadding + control.bottomPadding > Window.window.height : false clip: true currentIndex: control.currentIndex || 0 keyNavigationEnabled: true keyNavigationWraps: true T.ScrollBar.vertical: ScrollBar {} } Connections { target: control.contentItem.contentItem function onChildrenChanged() { for (var i in control.contentItem.contentItem.children) { var child = control.contentItem.contentItem.children[i]; if (child.checkable) { control.contentItem.hasCheckables = true; } if (child.icon && child.icon.hasOwnProperty("name") && (child.icon.name.length > 0 || child.icon.source.length > 0)) { control.contentItem.hasIcons = true; } } } } enter: Transition { NumberAnimation { property: "opacity" from: 0 to: 1 easing.type: Easing.InOutQuad duration: Kirigami.Units.shortDuration } } exit: Transition { NumberAnimation { property: "opacity" from: 1 to: 0 easing.type: Easing.InOutQuad duration: Kirigami.Units.shortDuration } } background: KSvg.FrameSvgItem { imagePath: "widgets/background" implicitWidth: Kirigami.Units.gridUnit * 8 implicitHeight: Kirigami.Units.gridUnit * 2 } }