QGCComboBox.qml 5.38 KB
Newer Older
1 2
/****************************************************************************
 *
Don Gagne's avatar
Don Gagne committed
3
 *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
4 5 6 7
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
Don Gagne's avatar
Don Gagne committed
8
 ****************************************************************************/
9

Don Gagne's avatar
Don Gagne committed
10
import QtQuick                  2.11
DonLakeFlyer's avatar
DonLakeFlyer committed
11 12 13 14
import QtQuick.Window           2.3
import QtQuick.Controls         2.4
import QtQuick.Controls.impl    2.4
import QtQuick.Templates        2.4 as T
15 16

import QGroundControl.ScreenTools   1.0
Don Gagne's avatar
Don Gagne committed
17
import QGroundControl.Palette       1.0
DonLakeFlyer's avatar
DonLakeFlyer committed
18
import QGroundControl.Controls      1.0
19

Don Gagne's avatar
Don Gagne committed
20 21 22 23
T.ComboBox {
    id:             control
    padding:        ScreenTools.comboBoxPadding
    spacing:        ScreenTools.defaultFontPixelWidth
24 25
    font.pointSize: ScreenTools.defaultFontPointSize
    font.family:    ScreenTools.normalFontFamily
DonLakeFlyer's avatar
DonLakeFlyer committed
26
    implicitWidth:  Math.max(background ? background.implicitWidth : 0,
DonLakeFlyer's avatar
DonLakeFlyer committed
27
                             contentItem.implicitWidth + leftPadding + rightPadding + padding)
DonLakeFlyer's avatar
DonLakeFlyer committed
28
    implicitHeight: Math.max(background ? background.implicitHeight : 0,
DonLakeFlyer's avatar
DonLakeFlyer committed
29
                             Math.max(contentItem.implicitHeight, indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding)
Don Gagne's avatar
Don Gagne committed
30 31
    leftPadding:    padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
    rightPadding:   padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width)
32

Don Gagne's avatar
Don Gagne committed
33 34 35
    property bool   centeredLabel:  false
    property bool   sizeToContents: false
    property string alternateText:  ""
Don Gagne's avatar
Don Gagne committed
36

Don Gagne's avatar
Don Gagne committed
37 38 39
    property var    _qgcPal:           QGCPalette { colorGroupEnabled: enabled }
    property real   _largestTextWidth: 0
    property real   _popupWidth:       sizeToContents ? _largestTextWidth + leftPadding + rightPadding : control.width
Don Gagne's avatar
Don Gagne committed
40

Don Gagne's avatar
Don Gagne committed
41
    TextMetrics {
42 43
        id:         textMetrics
        font:       control.font
44
    }
Yasen's avatar
Yasen committed
45

Don Gagne's avatar
Don Gagne committed
46 47 48 49 50 51 52 53 54
    onModelChanged: {
        if (sizeToContents) {
            _largestTextWidth = 0
            for (var i = 0; i < model.length; i++){
                textMetrics.text = model[i]
                _largestTextWidth = Math.max(textMetrics.width, _largestTextWidth)
            }
        }
    }
Yasen's avatar
Yasen committed
55

Don Gagne's avatar
Don Gagne committed
56
    // The items in the popup
57
    delegate: ItemDelegate {
58 59
        width:  _popupWidth
        height: Math.round(popupItemMetrics.height * 1.75)
60

Don Gagne's avatar
Don Gagne committed
61
        property string _text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
Yasen's avatar
Yasen committed
62

Don Gagne's avatar
Don Gagne committed
63
        TextMetrics {
64 65 66
            id:             popupItemMetrics
            font:           control.font
            text:           _text
Don Gagne's avatar
Don Gagne committed
67
        }
68

Don Gagne's avatar
Don Gagne committed
69 70 71 72 73
        contentItem: Text {
            text:                   _text
            font:                   control.font
            color:                  control.currentIndex === index ? _qgcPal.buttonHighlightText : _qgcPal.buttonText
            verticalAlignment:      Text.AlignVCenter
74
        }
75

Don Gagne's avatar
Don Gagne committed
76 77 78 79 80 81 82
        background: Rectangle {
            color:                  control.currentIndex === index ? _qgcPal.buttonHighlight : _qgcPal.button
        }

        highlighted:                control.highlightedIndex === index
    }

DonLakeFlyer's avatar
DonLakeFlyer committed
83 84 85 86 87 88 89 90
    indicator: QGCColoredImage {
        anchors.rightMargin:    control.padding
        anchors.right:          parent.right
        anchors.verticalCenter: parent.verticalCenter
        height:                 ScreenTools.defaultFontPixelWidth
        width:                  height
        source:                 "/qmlimages/arrow-down.png"
        color:                  _qgcPal.text
Don Gagne's avatar
Don Gagne committed
91 92 93
    }

    // The label of the button
94 95 96
    contentItem: Item {
        implicitWidth:                  text.implicitWidth
        implicitHeight:                 text.implicitHeight
Yasen's avatar
Yasen committed
97

98 99 100 101
        QGCLabel {
            id:                         text
            anchors.verticalCenter:     parent.verticalCenter
            anchors.horizontalCenter:   centeredLabel ? parent.horizontalCenter : undefined
Don Gagne's avatar
Don Gagne committed
102 103
            text:                       control.alternateText === "" ? control.currentText : control.alternateText
            font:                       control.font
Don Gagne's avatar
Don Gagne committed
104
            color:                      _qgcPal.text
105 106
        }
    }
Don Gagne's avatar
Don Gagne committed
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144

    background: Rectangle {
        implicitWidth:  ScreenTools.implicitComboBoxWidth
        implicitHeight: ScreenTools.implicitComboBoxHeight
        color:          _qgcPal.window
        border.width:   enabled ? 1 : 0
        border.color:   "#999"
    }

    popup: T.Popup {
        y:              control.height
        width:          _popupWidth
        height:         Math.min(contentItem.implicitHeight, control.Window.height - topMargin - bottomMargin)
        topMargin:      6
        bottomMargin:   6

        contentItem: ListView {
            clip:                   true
            implicitHeight:         contentHeight
            model:                  control.delegateModel
            currentIndex:           control.highlightedIndex
            highlightMoveDuration:  0

            Rectangle {
                z:              10
                width:          parent.width
                height:         parent.height
                color:          "transparent"
                border.color:   _qgcPal.text
            }

            T.ScrollIndicator.vertical: ScrollIndicator { }
        }

        background: Rectangle {
            color: control.palette.window
        }
    }
145
}