ToolStrip.qml 4.15 KB
Newer Older
1 2
/****************************************************************************
 *
Gus Grubba's avatar
Gus Grubba committed
3
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
4 5 6 7 8 9
 *
 * 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
10
import QtQuick          2.11
11
import QtQuick.Controls 2.2
12

Gus Grubba's avatar
Gus Grubba committed
13
import QGroundControl               1.0
14 15
import QGroundControl.ScreenTools   1.0
import QGroundControl.Palette       1.0
16
import QGroundControl.Controls      1.0
17 18 19

Rectangle {
    id:         _root
20
    color:      qgcPal.toolbarBackground
21
    width:      _idealWidth < repeater.contentWidth ? repeater.contentWidth : _idealWidth
DonLakeFlyer's avatar
DonLakeFlyer committed
22
    height:     Math.min(maxHeight, toolStripColumn.height + (flickable.anchors.margins * 2))
23
    radius:     ScreenTools.defaultFontPixelWidth / 2
24 25

    property alias  model:              repeater.model
26
    property real   maxHeight           ///< Maximum height for control, determines whether text is hidden to make control shorter
27
    property alias  title:              titleLabel.text
28

DonLakeFlyer's avatar
DonLakeFlyer committed
29
    function simulateClick(buttonIndex) {
30
        buttonIndex = buttonIndex + 1 // skip over title
31
        toolStripColumn.children[buttonIndex].clicked()
DonLakeFlyer's avatar
DonLakeFlyer committed
32 33
    }

34
    // Ensure we don't get narrower than content
35
    property real _idealWidth: (ScreenTools.isMobile ? ScreenTools.minTouchPixels : ScreenTools.defaultFontPixelWidth * 8) + toolStripColumn.anchors.margins * 2
36

37
    signal dropped(int index)
38

39 40 41 42 43
    DeadMouseArea {
        anchors.fill: parent
    }

    QGCFlickable {
DonLakeFlyer's avatar
DonLakeFlyer committed
44
        id:                 flickable
45
        anchors.margins:    ScreenTools.defaultFontPixelWidth * 0.4
46 47 48
        anchors.top:        parent.top
        anchors.left:       parent.left
        anchors.right:      parent.right
49 50 51
        height:             parent.height
        contentHeight:      toolStripColumn.height
        flickableDirection: Flickable.VerticalFlick
52
        clip:               true
53 54 55 56 57 58 59

        Column {
            id:             toolStripColumn
            anchors.left:   parent.left
            anchors.right:  parent.right
            spacing:        ScreenTools.defaultFontPixelWidth * 0.25

60 61 62 63 64 65 66 67 68
            QGCLabel {
                id:                     titleLabel
                anchors.left:           parent.left
                anchors.right:          parent.right
                horizontalAlignment:    Text.AlignHCenter
                font.pointSize:         ScreenTools.smallFontPointSize
                visible:                title != ""
            }

69 70 71 72 73 74 75 76 77 78 79 80 81
            Repeater {
                id: repeater

                QGCHoverButton {
                    id:             buttonTemplate

                    anchors.left:   toolStripColumn.left
                    anchors.right:  toolStripColumn.right
                    height:         width
                    radius:         ScreenTools.defaultFontPixelWidth / 2
                    fontPointSize:  ScreenTools.smallFontPointSize
                    autoExclusive:  true

82 83
                    enabled:        modelData.enabled
                    visible:        modelData.visible
84
                    imageSource:    modelData.showAlternateIcon ? modelData.alternateIconSource : modelData.iconSource
85 86 87
                    text:           modelData.text
                    checked:        modelData.checked
                    checkable:      modelData.dropPanelComponent || modelData.checkable
88

89
                    onCheckedChanged: modelData.checked = checked
90 91

                    onClicked: {
92 93 94
                        dropPanel.hide()
                        if (!modelData.dropPanelComponent) {
                            modelData.triggered(this)
95 96
                        } else if (checked) {
                            var panelEdgeTopPoint = mapToItem(_root, width, 0)
97 98
                            dropPanel.show(panelEdgeTopPoint, modelData.dropPanelComponent, this)
                            checked = true
99 100
                            _root.dropped(index)
                        }
101 102
                    }
                }
103 104 105 106 107 108 109 110 111
            }
        }
    }

    DropPanel {
        id:         dropPanel
        toolStrip:  _root
    }
}