ThemedComboBox.qml 2.5 KB
import QtQuick
import QtQuick.Controls.Basic
import "../" as App

ComboBox {
    id: control
    implicitHeight: App.Theme.controlHLg
    font.family: App.Theme.fontFamily
    font.pointSize: App.Theme.fontBase
    leftPadding: 14
    rightPadding: 32

    contentItem: Text {
        text: control.displayText
        font: control.font
        color: App.Theme.textPrimary
        verticalAlignment: Text.AlignVCenter
        elide: Text.ElideRight
    }

    background: Rectangle {
        radius: App.Theme.radiusMd
        color: App.Theme.bgSurface
        border.width: control.activeFocus ? 2 : 1
        border.color: control.activeFocus
            ? App.Theme.accent
            : (control.hovered ? App.Theme.borderStrong : App.Theme.borderDefault)

        Behavior on border.color {
            ColorAnimation { duration: 100 }
        }
    }

    indicator: Canvas {
        id: chevron
        width: 12; height: 8
        x: control.width - width - 14
        y: control.topPadding + (control.availableHeight - height) / 2
        contextType: "2d"
        onPaint: {
            var ctx = getContext("2d")
            ctx.reset()
            ctx.strokeStyle = App.Theme.textSecondary
            ctx.lineWidth = 1.5
            ctx.lineCap = "round"
            ctx.lineJoin = "round"
            ctx.beginPath()
            ctx.moveTo(2, 2)
            ctx.lineTo(width / 2, height - 2)
            ctx.lineTo(width - 2, 2)
            ctx.stroke()
        }
    }

    popup: Popup {
        y: control.height + 4
        width: control.width
        padding: 4

        background: Rectangle {
            color: App.Theme.bgElevated
            radius: App.Theme.radiusMd
            border.width: 1
            border.color: App.Theme.borderDefault
        }

        contentItem: ListView {
            clip: true
            implicitHeight: Math.min(contentHeight, 240)
            model: control.popup.visible ? control.delegateModel : null
            currentIndex: control.highlightedIndex
            ScrollBar.vertical: ScrollBar {}
        }
    }

    delegate: ItemDelegate {
        width: control.width
        height: 32
        font: control.font

        contentItem: Text {
            text: modelData
            font: control.font
            color: App.Theme.textPrimary
            verticalAlignment: Text.AlignVCenter
            leftPadding: 10
        }

        background: Rectangle {
            radius: App.Theme.radiusSm
            color: hovered ? App.Theme.accentSubtle : "transparent"
        }
    }
}