54 lines
1.4 KiB
QML
54 lines
1.4 KiB
QML
import QtQuick 2.15
|
|
import QtQuick.Layouts 1.15
|
|
import QtQuick.Controls 2.15
|
|
|
|
Popup {
|
|
id: menu
|
|
y: -(height + root.font.pointSize / 2)
|
|
|
|
property var model
|
|
property var delegate
|
|
property alias interactive: flickable.interactive
|
|
property real delegateHeight: fontSize * 3
|
|
|
|
// maximum number of options to show at once, scroll/flick to see the rest
|
|
// adding .5 works as a visual hint there's more options by displaying half of the next button
|
|
property real max_size: 5.5
|
|
|
|
padding: 0
|
|
topPadding: background.radius
|
|
bottomPadding: background.radius
|
|
|
|
background: Rectangle {
|
|
color: root.palette.button
|
|
radius: 8
|
|
}
|
|
|
|
contentItem: Flickable {
|
|
id: flickable
|
|
clip: true
|
|
implicitWidth: contentWidth
|
|
implicitHeight: interactive ? Math.min(contentHeight, menu.max_size * (menu.delegateHeight + delegate_container.spacing)) : contentHeight
|
|
contentWidth: delegate_container.width
|
|
contentHeight: delegate_container.height
|
|
|
|
flickableDirection: Flickable.VerticalFlick
|
|
ScrollBar.vertical: ScrollBar { }
|
|
|
|
ColumnLayout {
|
|
id: delegate_container
|
|
spacing: 4
|
|
Repeater {
|
|
model: menu.model
|
|
}
|
|
}
|
|
}
|
|
|
|
enter: Transition {
|
|
NumberAnimation { property: "height"; from: 0.0; to: implicitHeight; duration: 50 * root.animationsEnabled }
|
|
}
|
|
exit: Transition {
|
|
NumberAnimation { property: "height"; from: implicitHeight; to: 0.0; duration: 50 * root.animationsEnabled }
|
|
}
|
|
|
|
}
|