HorizontalFactValueGrid.qml 8.84 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/****************************************************************************
 *
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

import QtQuick          2.12
import QtQuick.Layouts  1.2
import QtQuick.Controls 2.5
import QtQml            2.12

import QGroundControl.Templates     1.0 as T
import QGroundControl.Controls      1.0
import QGroundControl.ScreenTools   1.0
import QGroundControl.Controllers   1.0
import QGroundControl.Palette       1.0
import QGroundControl.FlightMap     1.0
import QGroundControl               1.0

// Note: This control will spit out qWarnings like this: "QGridLayoutEngine::addItem: Cell (0, 1) already taken"
// This is due to Qt bug https://bugreports.qt.io/browse/QTBUG-65121
// If this becomes a problem I'll implement our own grid layout control

T.HorizontalFactValueGrid {
28 29 30
    id:                     _root
    Layout.preferredWidth:  topLevelRowLayout.width
    Layout.preferredHeight: topLevelRowLayout.height
31 32 33 34 35 36 37 38 39 40 41 42

    property bool   settingsUnlocked:       false

    property real   _margins:               ScreenTools.defaultFontPixelWidth / 2
    property int    _rowMax:                2
    property real   _rowButtonWidth:        ScreenTools.minTouchPixels
    property real   _rowButtonHeight:       ScreenTools.minTouchPixels / 2
    property real   _editButtonSpacing:     2

    QGCPalette { id: qgcPal; colorGroupEnabled: enabled }

    RowLayout {
43
        id: topLevelRowLayout
44 45

        Item {
46 47 48 49 50
            id:                     lockItem
            Layout.fillHeight:      true
            Layout.preferredWidth:  ScreenTools.minTouchPixels
            visible:                settingsUnlocked
            enabled:                settingsUnlocked
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

            QGCColoredImage {
                anchors.centerIn:   parent
                source:             "/res/LockOpen.svg"
                mipmap:             true
                width:              parent.width * 0.75
                height:             width
                sourceSize.width:   width
                color:              qgcPal.text
                fillMode:           Image.PreserveAspectFit
            }

            QGCMouseArea {
                fillItem:   parent
                onClicked:  settingsUnlocked = false
            }
        }

        ColumnLayout {
            Layout.fillHeight:  true

            GridLayout {
73
                id:         valueGrid
74
                rows:       _root.columns.count
75
                rowSpacing: 0
76 77

                Repeater {
78
                    model: _root.columns
79 80 81 82 83 84 85 86

                    Repeater {
                        id:     labelRepeater
                        model:  object

                        property real _index: index

                        InstrumentValueLabel {
87 88
                            Layout.row:             index
                            Layout.column:          labelRepeater._index * 3
89 90 91 92 93 94 95 96
                            Layout.fillHeight:      true
                            Layout.alignment:       Qt.AlignRight
                            instrumentValueData:    object
                        }
                    }
                }

                Repeater {
97
                    model: _root.columns
98 99 100 101 102

                    Repeater {
                        id:     valueRepeater
                        model:  object

103 104 105 106 107 108 109 110 111 112 113
                        property real   _index:     index
                        property real   maxWidth:   0
                        property var    lastCheck:  new Date().getTime()

                        function recalcWidth() {
                            var newMaxWidth = 0
                            for (var i=0; i<valueRepeater.count; i++) {
                                newMaxWidth = Math.max(newMaxWidth, valueRepeater.itemAt(0).contentWidth)
                            }
                            maxWidth = Math.min(maxWidth, newMaxWidth)
                        }
114 115

                        InstrumentValueValue {
116 117
                            Layout.row:             index
                            Layout.column:          (valueRepeater._index * 3) + 1
118 119
                            Layout.fillHeight:      true
                            Layout.alignment:       Qt.AlignLeft
120
                            Layout.preferredWidth:  maxWidth
121
                            instrumentValueData:    object
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138

                            property real lastContentWidth

                            Component.onCompleted:  {
                                maxWidth = Math.max(maxWidth, contentWidth)
                                lastContentWidth = contentWidth
                            }

                            onContentWidthChanged: {
                                maxWidth = Math.max(maxWidth, contentWidth)
                                lastContentWidth = contentWidth
                                var currentTime = new Date().getTime()
                                if (currentTime - lastCheck > 30 * 1000) {
                                    lastCheck = currentTime
                                    valueRepeater.recalcWidth()
                                }
                            }
139 140 141
                        }
                    }
                }
142 143

                Repeater {
144
                    model: _root.columns
145 146 147 148 149 150 151 152

                    Repeater {
                        id:     spacerRepeater
                        model:  object.count > 1 ? object : 0

                        property real _index: index

                        Item {
153 154
                            Layout.row:             index
                            Layout.column:          (spacerRepeater._index * 3) + 2
155 156 157 158 159
                            Layout.preferredWidth:  ScreenTools.defaultFontPixelWidth
                            Layout.preferredHeight: 1
                        }
                    }
                }
160 161 162
            }

            RowLayout {
163 164 165 166 167 168
                id:                     rowButtons
                Layout.preferredHeight: ScreenTools.minTouchPixels / 2
                Layout.fillWidth:       true
                spacing:                1
                visible:                settingsUnlocked
                enabled:                settingsUnlocked
169 170 171 172 173 174 175 176 177 178 179 180

                QGCButton {
                    Layout.fillWidth:       true
                    Layout.preferredHeight: parent.height
                    text:                   qsTr("+")
                    onClicked:              appendRow()
                }

                QGCButton {
                    Layout.fillWidth:       true
                    Layout.preferredHeight: parent.height
                    text:                   qsTr("-")
181
                    enabled:                _root.rowCount > 1
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
                    onClicked:              deleteLastRow()
                }
            }
        }

        ColumnLayout {
            Layout.fillHeight:      true
            Layout.bottomMargin:    rowButtons.height
            Layout.preferredWidth:  ScreenTools.minTouchPixels / 2
            spacing:                1
            visible:                settingsUnlocked
            enabled:                settingsUnlocked

            QGCButton {
                Layout.fillHeight:      true
                Layout.preferredHeight: ScreenTools.minTouchPixels
                Layout.preferredWidth:  parent.width
                text:                   qsTr("+")
                onClicked:              appendColumn()
            }

            QGCButton {
                Layout.fillHeight:      true
                Layout.preferredHeight: ScreenTools.minTouchPixels
                Layout.preferredWidth:  parent.width
                text:                   qsTr("-")
208
                enabled:                _root.columns.count > 1
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
                onClicked:              deleteLastColumn()
            }
        }
    }

    QGCMouseArea {
        x:          valueGrid.x + lockItem.width + topLevelRowLayout.spacing
        y:          valueGrid.y
        width:      valueGrid.width
        height:     valueGrid.height
        visible:    settingsUnlocked
        onClicked: {
            var item = valueGrid.childAt(mouse.x, mouse.y)
            //console.log(item, item ? item.instrumentValueData : "null", item && item.parent ? item.parent.instrumentValueData : "null")
            if (item && item.instrumentValueData !== undefined) {
224
                mainWindow.showPopupDialogFromComponent(valueEditDialog, { instrumentValueData: item.instrumentValueData })
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
            }
        }

        /*Rectangle {
            anchors.fill: parent
            border.color: "green"
            border.width: 1
            color: "transparent"
        }*/
    }

    Component {
        id: valueEditDialog

        InstrumentValueEditDialog { }
    }
}