Content.qml Example File

flat/Content.qml
 /****************************************************************************
 **
 ** Copyright (C) 2016 The Qt Company Ltd.
 ** Contact: https://www.qt.io/licensing/
 **
 ** This file is part of the examples of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:BSD$
 ** Commercial License Usage
 ** Licensees holding valid commercial Qt licenses may use this file in
 ** accordance with the commercial license agreement provided with the
 ** Software or, alternatively, in accordance with the terms contained in
 ** a written agreement between you and The Qt Company. For licensing terms
 ** and conditions see https://www.qt.io/terms-conditions. For further
 ** information use the contact form at https://www.qt.io/contact-us.
 **
 ** BSD License Usage
 ** Alternatively, you may use this file under the terms of the BSD license
 ** as follows:
 **
 ** "Redistribution and use in source and binary forms, with or without
 ** modification, are permitted provided that the following conditions are
 ** met:
 **   * Redistributions of source code must retain the above copyright
 **     notice, this list of conditions and the following disclaimer.
 **   * Redistributions in binary form must reproduce the above copyright
 **     notice, this list of conditions and the following disclaimer in
 **     the documentation and/or other materials provided with the
 **     distribution.
 **   * Neither the name of The Qt Company Ltd nor the names of its
 **     contributors may be used to endorse or promote products derived
 **     from this software without specific prior written permission.
 **
 **
 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
 **
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/

 import QtQuick 2.4
 import QtQuick.Layouts 1.1
 import QtQuick.Controls 1.4
 import QtQuick.Controls.Styles.Flat 1.0 as Flat
 import QtQuick.Extras 1.4
 import QtQuick.XmlListModel 2.0

 Item {
     anchors.fill: parent

     Text {
         id: text
         visible: false
     }

     FontMetrics {
         id: fontMetrics
         font.family: Flat.FlatStyle.fontFamily
     }

     readonly property int layoutSpacing: Math.round(5 * Flat.FlatStyle.scaleFactor)

     property var componentModel: [
         { name: "Buttons", component: buttonsComponent },
         { name: "Calendar", component: calendarComponent },
         { name: "DelayButton", component: delayButtonComponent },
         { name: "Dial", component: dialComponent },
         { name: "Input", component: inputComponent },
         { name: "PieMenu", component: pieMenuComponent },
         { name: "Progress", component: progressComponent },
         { name: "TableView", component: tableViewComponent },
         { name: "TextArea", component: textAreaComponent },
         { name: "Tumbler", component: tumblerComponent }
     ]

     Loader {
         id: componentLoader
         anchors.fill: parent
         sourceComponent: componentModel[controlData.componentIndex].component
     }

     property Component buttonsComponent: ScrollView {
         id: scrollView
         horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff

         Flickable {
             anchors.fill: parent
             contentWidth: viewport.width
             contentHeight: buttoncolumn.implicitHeight + textMargins * 1.5
             ColumnLayout {
                 id: buttoncolumn
                 anchors.fill: parent
                 anchors.margins: textMargins
                 anchors.topMargin: textMargins / 2
                 spacing: textMargins / 2
                 enabled: !settingsData.allDisabled

                 GroupBox {
                     title: "Button"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     GridLayout {
                         columns: Math.max(1, Math.floor(scrollView.width / button.implicitWidth - 0.5))
                         Button {
                             id: button
                             text: "Normal"
                         }
                         Button {
                             text: "Default"
                             isDefault: true
                         }
                         Button {
                             text: "Checkable"
                             checkable: true
                         }
                         Button {
                             text: "Menu"
                             menu: Menu {
                                 MenuItem { text: "Normal"; shortcut: "Ctrl+N" }
                                 MenuSeparator { }
                                 MenuItem { text: "Checkable 1"; checkable: true; checked: true }
                                 MenuItem { text: "Checkable 2"; checkable: true; checked: true }
                                 MenuSeparator { }
                             }
                             visible: Qt.application.supportsMultipleWindows
                         }
                     }
                 }

                 GroupBox {
                     title: "RadioButton"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     ExclusiveGroup { id: radiobuttongroup }
                     ColumnLayout {
                         anchors.fill: parent
                         Repeater {
                             model: ["First", "Second", "Third"]
                             RadioButton {
                                 text: modelData
                                 checked: index === 0
                                 exclusiveGroup: radiobuttongroup
                                 Layout.fillWidth: true
                             }
                         }
                     }
                 }

                 GroupBox {
                     title: "CheckBox"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     ColumnLayout {
                         anchors.fill: parent
                         Repeater {
                             model: ["First", "Second", "Third"]
                             CheckBox {
                                 text: modelData
                                 checked: index === 0
                                 Layout.fillWidth: true
                             }
                         }
                     }
                 }

                 GroupBox {
                     title: "Switch"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     ColumnLayout {
                         anchors.fill: parent
                         Repeater {
                             model: ["First", "Second", "Third"]
                             RowLayout {
                                 spacing: layoutSpacing * 2
                                 Label {
                                     text: modelData
                                     font.family: Flat.FlatStyle.fontFamily
                                     renderType: Text.QtRendering
                                     Layout.preferredWidth: fontMetrics.advanceWidth("Second")
                                 }
                                 Switch { checked: index == 0 }
                             }
                         }
                     }
                 }

                 GroupBox {
                     title: "ToggleButton"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     GridLayout {
                         columns: Math.max(1, !!children[0] ? Math.floor(scrollView.width / children[0].implicitWidth - 0.5) : children.length)
                         ToggleButton {
                             text: "Pump 1"
                             checked: true
                         }
                         ToggleButton {
                             text: "Pump 2"
                             checked: false
                         }
                     }
                 }

                 GroupBox {
                     title: "StatusIndicator"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     GridLayout {
                         columns: Math.max(1, Math.floor(scrollView.width / recordButton.implicitWidth - 0.5))
                         columnSpacing: layoutSpacing * 4

                         Button {
                             id: recordButton
                             text: "Record"
                             Layout.alignment: Qt.AlignTop
                             onClicked: recordStatusIndicator.active = !recordStatusIndicator.active

                             StatusIndicator {
                                 id: recordStatusIndicator
                                 active: false
                                 anchors.left: parent.left
                                 anchors.leftMargin: Math.max(6, Math.round(text.implicitHeight * 0.4))
                                 anchors.verticalCenter: parent.verticalCenter
                                 rotation: 90
                             }
                         }
                         ColumnLayout {
                             Repeater {
                                 model: 3
                                 delegate: RowLayout {
                                     Layout.alignment: Qt.AlignCenter
                                     StatusIndicator {
                                         active: true
                                         color: "#f09116"
                                     }
                                     Label {
                                         text: "Camera " + (index + 1)
                                         font.family: Flat.FlatStyle.fontFamily
                                         renderType: Text.QtRendering
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }

     property Component progressComponent: ScrollView {
         id: scrollView
         horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
         Flickable {
             anchors.fill: parent
             contentWidth: viewport.width
             contentHeight: progresscolumn.implicitHeight + textMargins * 1.5
             ColumnLayout {
                 id: progresscolumn
                 anchors.fill: parent
                 anchors.leftMargin: textMargins
                 anchors.rightMargin: textMargins
                 anchors.bottomMargin: textMargins
                 anchors.topMargin: textMargins / 2
                 spacing: textMargins / 2
                 enabled: !settingsData.allDisabled

                 GroupBox {
                     title: "BusyIndicator"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     BusyIndicator {
                         id: busyindicator
                         anchors.centerIn: parent
                         running: scrollView.visible
                     }
                 }

                 GroupBox {
                     title: "ProgressBar"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     ColumnLayout {
                         anchors.fill: parent
                         ProgressBar {
                             value: slider.value
                             maximumValue: slider.maximumValue
                             Layout.fillWidth: true
                         }
                         ProgressBar {
                             indeterminate: true
                             value: slider.value
                             maximumValue: slider.maximumValue
                             Layout.fillWidth: true
                         }
                     }
                 }

                 GroupBox {
                     title: "Slider"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     ColumnLayout {
                         anchors.fill: parent
                         Slider {
                             id: slider
                             // TODO: can't use maximumValue / 2 here, otherwise the gauges
                             // initially show up as empty; find out why.
                             value: 50
                             // If we use the default value of 1 here, we run into QTBUG-42358,
                             // even though that report specifically uses 100 as an example...
                             maximumValue: 100
                             Layout.fillWidth: true
                         }
                     }
                 }

                 GroupBox {
                     title: "Gauge"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     Gauge {
                         id: gauge
                         value: slider.value * 1.4
                         orientation: window.width < window.height ? Qt.Vertical : Qt.Horizontal
                         minimumValue: slider.minimumValue * 1.4
                         maximumValue: slider.maximumValue * 1.4
                         tickmarkStepSize: 20

                         anchors.centerIn: parent
                     }
                 }

                 GroupBox {
                     title: "CircularGauge"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     Layout.minimumWidth: 0
                     CircularGauge {
                         id: circularGauge
                         value: slider.value * 3.2
                         minimumValue: slider.minimumValue * 3.2
                         maximumValue: slider.maximumValue * 3.2

                         anchors.centerIn: parent
                         width: Math.min(implicitWidth, parent.width)
                         height: Math.min(implicitHeight, parent.height)

                         style: Flat.CircularGaugeStyle {
                             tickmarkStepSize: 20
                             labelStepSize: 40
                             minorTickmarkCount: 2
                         }

                         Column {
                             anchors.centerIn: parent

                             Label {
                                 text: Math.floor(circularGauge.value)
                                 anchors.horizontalCenter: parent.horizontalCenter
                                 renderType: Text.QtRendering
                                 font.pixelSize: unitLabel.font.pixelSize * 2
                                 font.family: Flat.FlatStyle.fontFamily
                                 font.weight: Font.Light
                             }
                             Label {
                                 id: unitLabel
                                 text: "km/h"
                                 renderType: Text.QtRendering
                                 font.family: Flat.FlatStyle.fontFamily
                                 anchors.horizontalCenter: parent.horizontalCenter
                             }
                         }
                     }
                 }
             }
         }
     }

     property Component inputComponent: ScrollView {
         id: scrollView
         horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
         Flickable {
             anchors.fill: parent
             contentWidth: viewport.width
             contentHeight: inputcolumn.implicitHeight + textMargins * 1.5
             ColumnLayout {
                 id: inputcolumn
                 anchors.fill: parent
                 anchors.margins: textMargins
                 spacing: textMargins / 2
                 enabled: !settingsData.allDisabled

                 GroupBox {
                     title: "TextField"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     ColumnLayout {
                         anchors.fill: parent
                         TextField {
                             z: 1
                             placeholderText: "TextField"
                             Layout.fillWidth: true
                         }
                         TextField {
                             placeholderText: "Password"
                             echoMode: TextInput.Password // TODO: PasswordEchoOnEdit
                             Layout.fillWidth: true
                         }
                     }
                 }

                 GroupBox {
                     title: "ComboBox"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     visible: Qt.application.supportsMultipleWindows
                     ColumnLayout {
                         anchors.fill: parent
                         ComboBox {
                             model: ["Option 1", "Option 2", "Option 3"]
                             Layout.fillWidth: true
                         }
                         ComboBox {
                             editable: true
                             model: ListModel {
                                 id: combomodel
                                 ListElement { text: "Option 1" }
                                 ListElement { text: "Option 2" }
                                 ListElement { text: "Option 3" }
                             }
                             onAccepted: {
                                 if (find(currentText) === -1) {
                                     combomodel.append({text: editText})
                                     currentIndex = find(editText)
                                 }
                             }
                             Layout.fillWidth: true
                         }
                     }
                 }

                 GroupBox {
                     title: "SpinBox"
                     checkable: settingsData.checks
                     flat: !settingsData.frames
                     Layout.fillWidth: true
                     GridLayout {
                         anchors.fill: parent
                         columns: Math.max(1, Math.floor(scrollView.width / spinbox.implicitWidth - 0.5))
                         SpinBox {
                             id: spinbox
                             Layout.fillWidth: true
                         }
                         SpinBox {
                             decimals: 1
                             Layout.fillWidth: true
                         }
                     }
                 }
             }
         }
     }

     Component {
         id: tableViewComponent
         TableView {
             id: view
             enabled: !settingsData.allDisabled
             TableViewColumn {
                 role: "title"
                 title: "Title"
                 width: view.width / 2
                 resizable: false
                 movable: false
             }
             TableViewColumn {
                 role: "author"
                 title: "Author"
                 width: view.width / 2
                 resizable: false
                 movable: false
             }

             frameVisible: false
             backgroundVisible: true
             alternatingRowColors: false
             model: ListModel {
                 ListElement {
                     title: "Moby-Dick"
                     author: "Herman Melville"
                 }
                 ListElement {
                     title: "The Adventures of Tom Sawyer"
                     author: "Mark Twain"
                 }
                 ListElement {
                     title: "Cat’s Cradle"
                     author: "Kurt Vonnegut"
                 }
                 ListElement {
                     title: "Fahrenheit 451"
                     author: "Ray Bradbury"
                 }
                 ListElement {
                     title: "It"
                     author: "Stephen King"
                 }
                 ListElement {
                     title: "On the Road"
                     author: "Jack Kerouac"
                 }
                 ListElement {
                     title: "Of Mice and Men"
                     author: "John Steinbeck"
                 }
                 ListElement {
                     title: "Do Androids Dream of Electric Sheep?"
                     author: "Philip K. Dick"
                 }
                 ListElement {
                     title: "Uncle Tom’s Cabin"
                     author: "Harriet Beecher Stowe"
                 }
                 ListElement {
                     title: "The Call of the Wild"
                     author: "Jack London"
                 }
                 ListElement {
                     title: "The Old Man and the Sea"
                     author: "Ernest Hemingway"
                 }
                 ListElement {
                     title: "A Streetcar Named Desire"
                     author: "Tennessee Williams"
                 }
                 ListElement {
                     title: "Catch-22"
                     author: "Joseph Heller"
                 }
                 ListElement {
                     title: "One Flew Over the Cuckoo’s Nest"
                     author: "Ken Kesey"
                 }
                 ListElement {
                     title: "The Murders in the Rue Morgue"
                     author: "Edgar Allan Poe"
                 }
                 ListElement {
                     title: "Breakfast at Tiffany’s"
                     author: "Truman Capote"
                 }
                 ListElement {
                     title: "Death of a Salesman"
                     author: "Arthur Miller"
                 }
                 ListElement {
                     title: "Post Office"
                     author: "Charles Bukowski"
                 }
                 ListElement {
                     title: "Herbert West—Reanimator"
                     author: "H. P. Lovecraft"
                 }
             }
         }
     }
     Component {
         id: calendarComponent
         Item {
             enabled: !settingsData.allDisabled
             Calendar {
                 anchors.centerIn: parent
                 weekNumbersVisible: true
                 frameVisible: settingsData.frames
             }
         }
     }
     Component {
         id: textAreaComponent
         TextArea {
             enabled: !settingsData.allDisabled
             frameVisible: false
             flickableItem.flickableDirection: Flickable.VerticalFlick
             text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum quis justo a sem faucibus mattis nec vitae nisi. Fusce fringilla nulla a tellus vehicula sodales. Etiam volutpat suscipit erat vitae adipiscing. Sed vestibulum massa nisl, eget posuere urna porta ac. Morbi at nunc ligula. Cras et mauris aliquet ligula sodales suscipit eget imperdiet augue. Ut eget dui eu magna malesuada imperdiet. Donec imperdiet urna eu consequat ornare. Cras at metus tristique, ullamcorper nisl ut, faucibus mauris. Fusce in euismod arcu. Donec tristique rutrum porta. Praesent mattis ac tortor quis scelerisque. Integer luctus nulla ut lacinia tempus."
         }
     }
     Component {
         id: pieMenuComponent
         Item {
             enabled: !settingsData.allDisabled

             Column {
                 anchors.fill: parent
                 anchors.bottom: parent.bottom
                 anchors.bottomMargin: controlData.textMargins
                 spacing: Math.round(controlData.textMargins * 0.5)

                 Image {
                     id: pieMenuImage
                     source: "qrc:/images/piemenu-image-rgb.jpg"
                     fillMode: Image.PreserveAspectFit
                     width: parent.width
                     height: Math.min((width / sourceSize.width) * sourceSize.height, (parent.height - parent.spacing) * 0.88)
                 }
                 Item {
                     width: parent.width
                     height: parent.height - pieMenuImage.height - parent.spacing

                     Text {
                         id: instructionText
                         anchors.fill: parent
                         anchors.leftMargin: controlData.textMargins
                         anchors.rightMargin: controlData.textMargins
                         horizontalAlignment: Text.AlignHCenter
                         verticalAlignment: Text.AlignVCenter
                         text: "Tap and hold to open menu"
                         font.family: Flat.FlatStyle.fontFamily
                         font.pixelSize: Math.round(20 * Flat.FlatStyle.scaleFactor)
                         fontSizeMode: Text.Fit
                         color: Flat.FlatStyle.lightFrameColor
                     }
                 }
             }
             MouseArea {
                 id: mouseArea
                 anchors.fill: parent
                 onPressAndHold: pieMenu.popup(mouse.x, mouse.y)
             }
             PieMenu {
                 id: pieMenu
                 triggerMode: TriggerMode.TriggerOnClick

                 MenuItem {
                     iconSource: "qrc:/images/piemenu-rgb-" + (pieMenu.currentIndex === 0 ? "pressed" : "normal") + ".png"
                     onTriggered: pieMenuImage.source = "qrc:/images/piemenu-image-rgb.jpg"
                 }
                 MenuItem {
                     iconSource: "qrc:/images/piemenu-bw-" + (pieMenu.currentIndex === 1 ? "pressed" : "normal") + ".png"
                     onTriggered: pieMenuImage.source = "qrc:/images/piemenu-image-bw.jpg"
                 }
                 MenuItem {
                     iconSource: "qrc:/images/piemenu-sepia-" + (pieMenu.currentIndex === 2 ? "pressed" : "normal") + ".png"
                     onTriggered: pieMenuImage.source = "qrc:/images/piemenu-image-sepia.jpg"
                 }
             }
         }
     }
     Component {
         id: delayButtonComponent
         Item {
             enabled: !settingsData.allDisabled
             DelayButton {
                 text: progress < 1 ? "START" : "STOP"
                 anchors.centerIn: parent
             }
         }
     }
     Component {
         id: dialComponent
         Item {
             enabled: !settingsData.allDisabled
             Dial {
                 anchors.centerIn: parent
             }
         }
     }
     Component {
         id: tumblerComponent
         Item {
             enabled: !settingsData.allDisabled
             Tumbler {
                 anchors.centerIn: parent
                 TumblerColumn {
                     model: {
                         var hours = [];
                         for (var i = 1; i <= 24; ++i)
                             hours.push(i < 10 ? "0" + i : i);
                         hours;
                     }
                 }
                 TumblerColumn {
                     model: {
                         var minutes = [];
                         for (var i = 0; i < 60; ++i)
                             minutes.push(i < 10 ? "0" + i : i);
                         minutes;
                     }
                 }
             }
         }
     }
 }