QmlTest.qml 29 KB
Newer Older
1 2 3
import QtQuick                  2.11
import QtQuick.Controls         2.4
import QtQuick.Controls.Styles  1.4
4
import QtQuick.Layouts          1.2
Don Gagne's avatar
Don Gagne committed
5

6 7 8
import QGroundControl.Palette       1.0
import QGroundControl.Controls      1.0
import QGroundControl.ScreenTools   1.0
Don Gagne's avatar
Don Gagne committed
9 10

Rectangle {
11
    id: _root
12 13 14
    anchors.fill:       parent
    anchors.margins:    ScreenTools.defaultFontPixelWidth
    color:              "white"
15

16
    property var palette: QGCPalette { colorGroupEnabled: true }
17 18
    property var enabledPalette: QGCPalette { colorGroupEnabled: true }
    property var disabledPalette: QGCPalette { colorGroupEnabled: false }
19

20 21 22 23 24
    QGCFlickable {
        anchors.fill:           parent
        contentWidth:           _rootCol.width
        contentHeight:          _rootCol.height
        clip:                   true
Don Gagne's avatar
Don Gagne committed
25

26 27
        Column {
            id:         _rootCol
Don Gagne's avatar
Don Gagne committed
28

29
            Rectangle {
30
                id: _header
31 32 33 34
                width:  parent.width
                height: themeChoice.height * 2
                color:  palette.window
                QGCLabel {
35
                    id: windowColorLabel
36 37 38 39
                    text: qsTr("Window Color")
                    anchors.left:           parent.left
                    anchors.leftMargin:     20
                }
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 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 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169

                function exportPaletteColors(pal) {
                    var objToExport = {}
                    for(var clrName in pal) {
                        if(pal[clrName].r !== undefined) {
                            objToExport[clrName] = pal[clrName].toString();
                        }
                    }
                    return objToExport;
                }

                function fillPalette(pal, colorsObj) {
                    for(var clrName in colorsObj) {
                        pal[clrName] = colorsObj[clrName];
                    }
                }

                function exportTheme() {
                    var themeObj = {"light": {}, "dark":{}}
                    var oldTheme = palette.globalTheme;

                    palette.globalTheme = QGCPalette.Light
                    palette.colorGroupEnabled = true
                    themeObj.light["enabled"] = exportPaletteColors(palette);
                    palette.colorGroupEnabled = false
                    themeObj.light["disabled"] = exportPaletteColors(palette);
                    palette.globalTheme = QGCPalette.Dark
                    palette.colorGroupEnabled = true
                    themeObj.dark["enabled"] = exportPaletteColors(palette);
                    palette.colorGroupEnabled = false
                    themeObj.dark["disabled"] = exportPaletteColors(palette);

                    palette.globalTheme = oldTheme;
                    palette.colorGroupEnabled = true;

                    var jsonString = JSON.stringify(themeObj);

                    themeImportExportEdit.text = jsonString
                    paletteImportExportPopup.open()
                }

                function importTheme(jsonStr) {
                    var jsonObj = JSON.parse(jsonStr)
                    var themeObj = {"light": {}, "dark":{}}
                    var oldTheme = palette.globalTheme;

                    palette.globalTheme = QGCPalette.Light
                    palette.colorGroupEnabled = true
                    fillPalette(palette, jsonObj.light.enabled)
                    palette.colorGroupEnabled = false
                    fillPalette(palette, jsonObj.light.disabled);
                    palette.globalTheme = QGCPalette.Dark
                    palette.colorGroupEnabled = true
                    fillPalette(palette, jsonObj.dark.enabled);
                    palette.colorGroupEnabled = false
                    fillPalette(palette, jsonObj.dark.disabled);

                    palette.globalTheme = oldTheme;
                    palette.colorGroupEnabled = true;

                    paletteImportExportPopup.close()
                }

                Popup {
                    id: paletteImportExportPopup
                    focus: true
                    parent: Overlay.overlay
                    x: (_root.width - width)/2
                    y: (_root.height - height)/2
                    width:  _root.width  * 0.666
                    height: _root.height * 0.666
                    modal:  true
                    Column {
                        anchors.fill: parent
                        spacing: 5

                        Rectangle {
                            width: parent.width
                            height: parent.height - importButton.height
                            border.width: 1

                            Flickable {
                                id: flick

                                anchors.fill: parent
                                contentWidth: themeImportExportEdit.paintedWidth
                                contentHeight: themeImportExportEdit.paintedHeight
                                clip: true

                                function ensureVisible(r)
                                {
                                   if (contentX >= r.x)
                                       contentX = r.x;
                                   else if (contentX+width <= r.x+r.width)
                                       contentX = r.x+r.width-width;
                                   if (contentY >= r.y)
                                       contentY = r.y;
                                   else if (contentY+height <= r.y+r.height)
                                       contentY = r.y+r.height-height;
                                }

                                TextEdit {
                                   id: themeImportExportEdit
                                   width: flick.width
                                   focus: true
                                   wrapMode: TextEdit.Wrap
                                   onCursorRectangleChanged: flick.ensureVisible(cursorRectangle)
                                }
                            }
                        }
                        Button {
                            id: importButton
                            text: "Import"
                            onPressed: {
                                _header.importTheme(themeImportExportEdit.text);
                            }
                        }
                    }
                }

                Button {
                    id: exportButton
                    text: "Import/Export"
                    width: 200
                    height: 30
                    anchors.left: windowColorLabel.right
                    anchors.leftMargin: 20
                    onPressed: _header.exportTheme()
                }

170 171 172 173 174
                Row {
                    id: themeChoice
                    anchors.centerIn: parent
                    anchors.margins: 20
                    spacing:         20
175 176

                    ButtonGroup { id: themeGroup; exclusive: true }
177 178 179
                    QGCRadioButton {
                        text: qsTr("Light")
                        checked: palette.globalTheme === QGCPalette.Light
180
                        ButtonGroup.group: themeGroup
181 182 183 184 185
                        onClicked: { palette.globalTheme = QGCPalette.Light }
                    }
                    QGCRadioButton {
                        text: qsTr("Dark")
                        checked: palette.globalTheme === QGCPalette.Dark
186
                        ButtonGroup.group: themeGroup
187
                        onClicked: { palette.globalTheme = QGCPalette.Dark }
Don Gagne's avatar
Don Gagne committed
188 189
                    }
                }
Gus Grubba's avatar
Gus Grubba committed
190 191
            }

192 193 194
            Row {
                spacing: 30

195 196 197 198 199
                // Edit theme GroupBox
                GroupBox {
                    title: "Preview and edit theme"
                Column {
                    id: editRoot
200
                    spacing: 5
201
                    property size cellSize: "90x25"
Gus Grubba's avatar
Gus Grubba committed
202

203 204
                    // Header row
                    Row {
Gus Grubba's avatar
Gus Grubba committed
205
                        Text {
206 207 208 209 210 211
                            width: editRoot.cellSize.width * 2
                            height: editRoot.cellSize.height
                            text: ""
                        }
                        Text {
                            width: editRoot.cellSize.width; height: editRoot.cellSize.height
Gus Grubba's avatar
Gus Grubba committed
212
                            color: "black"
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
                            horizontalAlignment: Text.AlignLeft
                            text: qsTr("Enabled")
                        }
                        Text {
                            width: editRoot.cellSize.width; height: editRoot.cellSize.height
                            color: "black"
                            horizontalAlignment: Text.AlignHCenter
                            text: qsTr("Value")
                        }
                        Text {
                            width: editRoot.cellSize.width; height: editRoot.cellSize.height
                            color: "black"
                            horizontalAlignment: Text.AlignHCenter
                            text: qsTr("Disabled")
                        }
                        Text {
                            width: editRoot.cellSize.width; height: editRoot.cellSize.height
                            color: "black"
                            horizontalAlignment: Text.AlignHCenter
                            text: qsTr("Value")
Gus Grubba's avatar
Gus Grubba committed
233
                        }
234
                    }
Gus Grubba's avatar
Gus Grubba committed
235

236 237 238 239 240 241 242
                    // Populate the model with all color names in the global palette
                    Component.onCompleted: {
                        for(var colorNameStr in palette) {
                            if(palette[colorNameStr].r !== undefined) {
                                paletteColorList.append({ colorName: colorNameStr });
                            }
                        }
243 244
                    }

245 246
                    ListModel {
                        id: paletteColorList
247 248
                    }

249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
                    // Reproduce all the models
                    Repeater {
                        model: paletteColorList
                        delegate: Row {
                            spacing: 5
                            Text {
                                width: editRoot.cellSize.width * 2
                                height: editRoot.cellSize.height
                                horizontalAlignment: Text.AlignRight
                                verticalAlignment: Text.AlignVCenter
                                color: "black"
                                text: colorName
                            }
                            ClickableColor {
                                id: enabledColorPicker
                                color: enabledPalette[colorName]
                                onColorSelected: enabledPalette[colorName] = color
                            }
                            TextField {
                                id: enabledTextField
                                width: editRoot.cellSize.width; height: editRoot.cellSize.height
                                inputMask: "\\#>HHHHHHhh;"
                                horizontalAlignment: Text.AlignLeft
                                text: enabledPalette[colorName]
                                onEditingFinished: enabledPalette[colorName] = text
                            }
                            ClickableColor {
                                id: disabledColorPicker
                                color: disabledPalette[colorName]
                                onColorSelected: disabledPalette[colorName] = color
                            }
                            TextField {
                                width: editRoot.cellSize.width; height: editRoot.cellSize.height
                                inputMask: enabledTextField.inputMask
                                horizontalAlignment: Text.AlignLeft
                                text: disabledPalette[colorName]
                                onEditingFinished: disabledPalette[colorName] = text
                            }
                        }
288
                    }
289 290
                } // Column
                } // GroupBox { title: "Preview and edit theme"
291 292

                // QGC controls preview
293
                GroupBox { title: "Controls preview"
294 295
                Column {
                    id: ctlPrevColumn
296 297
                    property real _colWidth: ScreenTools.defaultFontPointSize * 18
                    property real _height: _colWidth*0.15
298 299 300 301 302 303 304 305 306 307 308 309
                    property color _bkColor: qgcPal.window
                    spacing: 10
                    width: previewGrid.width
                    Grid {
                        id: previewGrid
                        columns: 3
                        spacing: 10

                        Component {
                            id: ctlRowHeader

                            Rectangle {
310
                                width: ctlPrevColumn._colWidth
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
                                height: ctlPrevColumn._height
                                color: "white"
                                Text {
                                    anchors.fill: parent
                                    horizontalAlignment: Text.AlignRight
                                    verticalAlignment: Text.AlignVCenter
                                    color: "black"

                                    text: parent.parent.text
                                }
                            }
                        }

                        // Header row
                        Text {
326
                            width: ctlPrevColumn._colWidth
327 328 329 330 331 332
                            height: ctlPrevColumn._height
                            color: "black"
                            horizontalAlignment: Text.AlignHCenter
                            text: qsTr("QGC name")
                        }
                        Text {
333
                            width: ctlPrevColumn._colWidth
334 335 336 337 338 339
                            height: ctlPrevColumn._height
                            color: "black"
                            horizontalAlignment: Text.AlignHCenter
                            text: qsTr("Enabled")
                        }
                        Text {
340
                            width: ctlPrevColumn._colWidth
341 342 343 344 345 346 347 348 349 350 351 352
                            height: ctlPrevColumn._height
                            color: "black"
                            horizontalAlignment: Text.AlignHCenter
                            text: qsTr("Disabled")
                        }

                        // QGCLabel
                        Loader {
                            sourceComponent: ctlRowHeader
                            property string text: "QGCLabel"
                        }
                        Rectangle {
353
                            width: ctlPrevColumn._colWidth
354 355 356 357 358 359 360 361 362
                            height: ctlPrevColumn._height
                            color: ctlPrevColumn._bkColor
                            QGCLabel {
                                anchors.fill: parent
                                anchors.margins: 5
                                text: qsTr("Label")
                            }
                        }
                        Rectangle {
363
                            width: ctlPrevColumn._colWidth
364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
                            height: ctlPrevColumn._height
                            color: ctlPrevColumn._bkColor
                            QGCLabel {
                                anchors.fill: parent
                                anchors.margins: 5
                                text: qsTr("Label")
                                enabled: false
                            }
                        }

                        // QGCButton
                        Loader {
                            sourceComponent: ctlRowHeader
                            property string text: "QGCButton"
                        }
                        QGCButton {
380
                            width: ctlPrevColumn._colWidth
381 382 383 384
                            height: ctlPrevColumn._height
                            text: qsTr("Button")
                        }
                        QGCButton {
385
                            width: ctlPrevColumn._colWidth
386 387 388 389 390 391 392 393 394 395 396
                            height: ctlPrevColumn._height
                            text: qsTr("Button")
                            enabled: false
                        }

                        // QGCButton - primary
                        Loader {
                            sourceComponent: ctlRowHeader
                            property string text: "QGCButton(primary)"
                        }
                        QGCButton {
397
                            width: ctlPrevColumn._colWidth
398 399 400 401 402
                            height: ctlPrevColumn._height
                            primary: true
                            text: qsTr("Button")
                        }
                        QGCButton {
403
                            width: ctlPrevColumn._colWidth
404 405 406 407 408 409 410 411 412 413 414 415
                            height: ctlPrevColumn._height
                            text: qsTr("Button")
                            primary: true
                            enabled: false
                        }

                        // QGCHoverButton
                        Loader {
                            sourceComponent: ctlRowHeader
                            property string text: "QGCHoverButton"
                        }
                        QGCHoverButton {
416
                            width: ctlPrevColumn._colWidth
417 418 419 420 421 422
                            height: ctlPrevColumn._height * 2
                            text: qsTr("Hover Button")
                            radius: ScreenTools.defaultFontPointSize
                            imageSource: "/qmlimages/Gears.svg"
                        }
                        QGCHoverButton {
423
                            width: ctlPrevColumn._colWidth
424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448
                            height: ctlPrevColumn._height * 2
                            text: qsTr("Hover Button")
                            radius: ScreenTools.defaultFontPointSize
                            imageSource: "/qmlimages/Gears.svg"
                            enabled: false
                        }

                        // QGCButton - menu
                        Loader {
                            sourceComponent: ctlRowHeader
                            property string text: "QGCButton(menu)"
                        }
                        Menu {
                            id: buttonMenu
                            MenuItem {
                                text: qsTr("Item 1")
                            }
                            MenuItem {
                                text: qsTr("Item 2")
                            }
                            MenuItem {
                                text: qsTr("Item 3")
                            }
                        }
                        QGCButton {
449
                            width: ctlPrevColumn._colWidth
450 451
                            height: ctlPrevColumn._height
                            text: qsTr("Button")
452
                            onClicked: buttonMenu.popup()
453 454
                        }
                        QGCButton {
455
                            width: ctlPrevColumn._colWidth
456 457 458
                            height: ctlPrevColumn._height
                            text: qsTr("Button")
                            enabled: false
459
                            onClicked: buttonMenu.popup()
460 461 462 463 464 465 466 467
                        }

                        // QGCRadioButton
                        Loader {
                            sourceComponent: ctlRowHeader
                            property string text: "QGCRadioButton"
                        }
                        Rectangle {
468
                            width: ctlPrevColumn._colWidth
469 470 471 472 473 474 475 476 477
                            height: ctlPrevColumn._height
                            color: ctlPrevColumn._bkColor
                            QGCRadioButton {
                                anchors.fill: parent
                                anchors.margins: 5
                                text: qsTr("Radio")
                            }
                        }
                        Rectangle {
478
                            width: ctlPrevColumn._colWidth
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494
                            height: ctlPrevColumn._height
                            color: ctlPrevColumn._bkColor
                            QGCRadioButton {
                                anchors.fill: parent
                                anchors.margins: 5
                                text: qsTr("Radio")
                                enabled: false
                            }
                        }

                        // QGCCheckBox
                        Loader {
                            sourceComponent: ctlRowHeader
                            property string text: "QGCCheckBox"
                        }
                        Rectangle {
495
                            width: ctlPrevColumn._colWidth
496 497 498 499 500 501 502 503 504
                            height: ctlPrevColumn._height
                            color: ctlPrevColumn._bkColor
                            QGCCheckBox {
                                anchors.fill: parent
                                anchors.margins: 5
                                text: qsTr("Check Box")
                            }
                        }
                        Rectangle {
505
                            width: ctlPrevColumn._colWidth
506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521
                            height: ctlPrevColumn._height
                            color: ctlPrevColumn._bkColor
                            QGCCheckBox {
                                anchors.fill: parent
                                anchors.margins: 5
                                text: qsTr("Check Box")
                                enabled: false
                            }
                        }

                        // QGCTextField
                        Loader {
                            sourceComponent: ctlRowHeader
                            property string text: "QGCTextField"
                        }
                        QGCTextField {
522
                            width: ctlPrevColumn._colWidth
523 524 525 526
                            height: ctlPrevColumn._height
                            text: "QGCTextField"
                        }
                        QGCTextField {
527
                            width: ctlPrevColumn._colWidth
528 529 530 531 532 533 534 535 536 537 538
                            height: ctlPrevColumn._height
                            text: "QGCTextField"
                            enabled: false
                        }

                        // QGCComboBox
                        Loader {
                            sourceComponent: ctlRowHeader
                            property string text: "QGCComboBox"
                        }
                        QGCComboBox {
539
                            width: ctlPrevColumn._colWidth
540 541 542 543
                            height: ctlPrevColumn._height
                            model: [ qsTr("Item 1"), qsTr("Item 2"), qsTr("Item 3") ]
                        }
                        QGCComboBox {
544
                            width: ctlPrevColumn._colWidth
545 546 547 548 549 550 551 552 553 554 555
                            height: ctlPrevColumn._height
                            model: [ qsTr("Item 1"), qsTr("Item 2"), qsTr("Item 3") ]
                            enabled: false
                        }

                        // SubMenuButton
                        Loader {
                            sourceComponent: ctlRowHeader
                            property string text: "SubMenuButton"
                        }
                        SubMenuButton {
556 557
                            width: ctlPrevColumn._colWidth
                            height: ctlPrevColumn._colWidth/3
558 559 560
                            text: qsTr("SUB MENU")
                        }
                        SubMenuButton {
561 562
                            width: ctlPrevColumn._colWidth
                            height: ctlPrevColumn._colWidth/3
563 564 565 566 567 568 569 570 571 572 573 574 575
                            text: qsTr("SUB MENU")
                            enabled: false
                        }
                    }
                    Rectangle {
                        width:  previewGrid.width
                        height: 60
                        radius: 3
                        color:  palette.alertBackground
                        border.color: palette.alertBorder
                        anchors.horizontalCenter: parent.horizontalCenter
                        Label {
                            text: "Alert Message"
576
                            palette.text: palette.alertText
577 578 579
                            anchors.centerIn: parent
                        }
                    }
580 581
                } // Column
                } // GroupBox { title: "Controls preview"
582
            }
583 584 585 586

            Item{
                height: 10;
                width:  1;
587
            }
588

589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656
            Component {
                id: arbBox
                Rectangle {
                    width:  arbGrid.width  * 1.5
                    height: arbGrid.height * 1.5
                    color:  backgroundColor
                    border.color: qgcPal.text
                    border.width: 1
                    anchors.horizontalCenter: parent.horizontalCenter
                    GridLayout {
                        id: arbGrid
                        columns: 4
                        rowSpacing: 10
                        anchors.centerIn: parent
                        QGCColoredImage {
                            color:                      qgcPal.colorGreen
                            width:                      ScreenTools.defaultFontPixelWidth * 2
                            height:                     width
                            sourceSize.height:          width
                            mipmap:                     true
                            fillMode:                   Image.PreserveAspectFit
                            source:                     "/qmlimages/Gears.svg"
                        }
                        Label { text: "colorGreen"; color: qgcPal.colorGreen; }
                        QGCColoredImage {
                            color:                      qgcPal.colorOrange
                            width:                      ScreenTools.defaultFontPixelWidth * 2
                            height:                     width
                            sourceSize.height:          width
                            mipmap:                     true
                            fillMode:                   Image.PreserveAspectFit
                            source:                     "/qmlimages/Gears.svg"
                        }
                        Label { text: "colorOrange"; color: qgcPal.colorOrange; }
                        QGCColoredImage {
                            color:                      qgcPal.colorRed
                            width:                      ScreenTools.defaultFontPixelWidth * 2
                            height:                     width
                            sourceSize.height:          width
                            mipmap:                     true
                            fillMode:                   Image.PreserveAspectFit
                            source:                     "/qmlimages/Gears.svg"
                        }
                        Label { text: "colorRed"; color: qgcPal.colorRed; }
                        QGCColoredImage {
                            color:                      qgcPal.colorGrey
                            width:                      ScreenTools.defaultFontPixelWidth * 2
                            height:                     width
                            sourceSize.height:          width
                            mipmap:                     true
                            fillMode:                   Image.PreserveAspectFit
                            source:                     "/qmlimages/Gears.svg"
                        }
                        Label { text: "colorGrey"; color: qgcPal.colorGrey;  }
                        QGCColoredImage {
                            color:                      qgcPal.colorBlue
                            width:                      ScreenTools.defaultFontPixelWidth * 2
                            height:                     width
                            sourceSize.height:          width
                            mipmap:                     true
                            fillMode:                   Image.PreserveAspectFit
                            source:                     "/qmlimages/Gears.svg"
                        }
                        Label { text: "colorBlue"; color: qgcPal.colorBlue; }
                    }
                }
            }

657 658 659 660 661 662 663 664 665 666 667 668 669 670 671
            Row {
                spacing: 10
                anchors.horizontalCenter: parent.horizontalCenter
                Loader {
                    property color backgroundColor: qgcPal.window
                    sourceComponent: arbBox
                }
                Loader {
                    property color backgroundColor: qgcPal.windowShade
                    sourceComponent: arbBox
                }
                Loader {
                    property color backgroundColor: qgcPal.windowShadeDark
                    sourceComponent: arbBox
                }
672
            }
673

674 675
        }

Don Gagne's avatar
Don Gagne committed
676 677
    }
}