import QtQuick import qs.Common import qs.Widgets Rectangle { id: root property string text: "" property string description: "" property string currentValue: "" property var options: [] signal valueChanged(string value) width: parent.width height: 60 radius: Theme.cornerRadius color: Qt.rgba(Theme.surfaceVariant.r, Theme.surfaceVariant.g, Theme.surfaceVariant.b, 0.08) Column { anchors.left: parent.left anchors.right: dropdown.left anchors.verticalCenter: parent.verticalCenter anchors.leftMargin: Theme.spacingM anchors.rightMargin: Theme.spacingM spacing: Theme.spacingXS Text { text: root.text font.pixelSize: Theme.fontSizeMedium color: Theme.surfaceText font.weight: Font.Medium } Text { text: root.description font.pixelSize: Theme.fontSizeSmall color: Theme.surfaceVariantText visible: description.length > 0 wrapMode: Text.WordWrap width: parent.width } } Rectangle { id: dropdown width: 180 height: 36 anchors.right: parent.right anchors.rightMargin: Theme.spacingM anchors.verticalCenter: parent.verticalCenter radius: Theme.cornerRadiusSmall color: dropdownArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : Theme.contentBackground() border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) border.width: 1 Row { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter anchors.leftMargin: Theme.spacingM anchors.rightMargin: Theme.spacingS Text { text: root.currentValue font.pixelSize: Theme.fontSizeMedium color: Theme.surfaceText anchors.verticalCenter: parent.verticalCenter width: parent.width - 24 elide: Text.ElideRight } DankIcon { name: "expand_more" size: 20 color: Theme.surfaceVariantText anchors.verticalCenter: parent.verticalCenter } } MouseArea { id: dropdownArea anchors.fill: parent hoverEnabled: true cursorShape: Qt.PointingHandCursor onClicked: { if (typeof globalDropdownWindow !== 'undefined') { // Get global position of the dropdown button var globalPos = dropdown.mapToGlobal(0, 0); globalDropdownWindow.showAt(root, globalPos.x, globalPos.y + dropdown.height + 4, root.options, root.currentValue); // Connect to value selection (with cleanup) globalDropdownWindow.valueSelected.connect(function(value) { root.currentValue = value; root.valueChanged(value); }); } } } } }