main.qml Example File

flat/main.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.0
  import QtQuick.Controls 1.4
  import QtQuick.Controls.Styles.Flat 1.0 as Flat
  import QtQuick.Extras 1.4
  import QtQuick.Extras.Private 1.0

  ApplicationWindow {
      id: window
      width: 480
      height: 860
      title: "Flat Example"
      visible: true

      readonly property bool contentLoaded: contentLoader.item
      readonly property alias anchorItem: controlsMenu
      property int currentMenu: -1
      readonly property int textMargins: Math.round(32 * Flat.FlatStyle.scaleFactor)
      readonly property int menuMargins: Math.round(13 * Flat.FlatStyle.scaleFactor)
      readonly property int menuWidth: Math.min(window.width, window.height) * 0.75

      onCurrentMenuChanged: {
          xBehavior.enabled = true;
          anchorCurrentMenu();
      }

      onMenuWidthChanged: anchorCurrentMenu()

      function anchorCurrentMenu() {
          switch (currentMenu) {
          case -1:
              anchorItem.x = -menuWidth;
              break;
          case 0:
              anchorItem.x = 0;
              break;
          case 1:
              anchorItem.x = -menuWidth * 2;
              break;
          }
      }

      Item {
          id: container
          anchors.fill: parent

          Item {
              id: loadingScreen
              anchors.fill: parent
              visible: !contentLoaded

              Timer {
                  running: true
                  interval: 100
                  // TODO: Find a way to know when the loading screen has been rendered instead
                  // of using an abritrary amount of time.
                  onTriggered: contentLoader.sourceComponent = Qt.createComponent("Content.qml")
              }

              Column {
                  anchors.centerIn: parent
                  spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)

                  BusyIndicator {
                      anchors.horizontalCenter: parent.horizontalCenter
                  }

                  Label {
                      text: "Loading Light Flat UI..."
                      width: Math.min(loadingScreen.width, loadingScreen.height) * 0.8
                      height: font.pixelSize
                      anchors.horizontalCenter: parent.horizontalCenter
                      renderType: Text.QtRendering
                      font.pixelSize: Math.round(26 * Flat.FlatStyle.scaleFactor)
                      horizontalAlignment: Text.AlignHCenter
                      fontSizeMode: Text.Fit
                      font.family: Flat.FlatStyle.fontFamily
                      font.weight: Font.Light
                  }
              }
          }

          Rectangle {
              id: controlsMenu
              x: container.x - width
              z: contentContainer.z + 1
              width: menuWidth
              height: parent.height

              // Don't let the menus become visible when resizing the window
              Binding {
                  target: controlsMenu
                  property: "x"
                  value: container.x - controlsMenu.width
                  when: !xBehavior.enabled && !xNumberAnimation.running && currentMenu == -1
              }

              Behavior on x {
                  id: xBehavior
                  enabled: false
                  NumberAnimation {
                      id: xNumberAnimation
                      easing.type: Easing.OutExpo
                      duration: 500
                      onRunningChanged: xBehavior.enabled = false
                  }
              }

              Rectangle {
                  id: controlsTitleBar
                  width: parent.width
                  height: toolBar.height
                  color: Flat.FlatStyle.defaultTextColor

                  Label {
                      text: "Controls"
                      font.family: Flat.FlatStyle.fontFamily
                      font.pixelSize: Math.round(16 * Flat.FlatStyle.scaleFactor)
                      renderType: Text.QtRendering
                      color: "white"
                      anchors.left: parent.left
                      anchors.leftMargin: menuMargins
                      anchors.verticalCenter: parent.verticalCenter
                  }
              }

              ListView {
                  id: controlView
                  width: parent.width
                  anchors.top: controlsTitleBar.bottom
                  anchors.bottom: parent.bottom
                  clip: true
                  currentIndex: 0
                  model: contentLoaded ? contentLoader.item.componentModel : null
                  delegate: MouseArea {
                      id: delegateItem
                      width: parent.width
                      height: 64 * Flat.FlatStyle.scaleFactor
                      onClicked: {
                          if (controlView.currentIndex != index)
                              controlView.currentIndex = index;

                          currentMenu = -1;
                      }

                      Rectangle {
                          width: parent.width
                          height: Flat.FlatStyle.onePixel
                          anchors.bottom: parent.bottom
                          color: Flat.FlatStyle.lightFrameColor
                      }

                      Label {
                          text: delegateItem.ListView.view.model[index].name
                          font.pixelSize: Math.round(15 * Flat.FlatStyle.scaleFactor)
                          font.family: Flat.FlatStyle.fontFamily
                          renderType: Text.QtRendering
                          color: delegateItem.ListView.isCurrentItem ? Flat.FlatStyle.styleColor : Flat.FlatStyle.defaultTextColor
                          anchors.left: parent.left
                          anchors.leftMargin: menuMargins
                          anchors.verticalCenter: parent.verticalCenter
                      }
                  }

                  Rectangle {
                      width: parent.height
                      height: 8 * Flat.FlatStyle.scaleFactor
                      rotation: 90
                      anchors.left: parent.right
                      transformOrigin: Item.TopLeft

                      gradient: Gradient {
                          GradientStop {
                              color: Qt.rgba(0, 0, 0, 0.15)
                              position: 0
                          }
                          GradientStop {
                              color: Qt.rgba(0, 0, 0, 0.05)
                              position: 0.5
                          }
                          GradientStop {
                              color: Qt.rgba(0, 0, 0, 0)
                              position: 1
                          }
                      }
                  }
              }
          }

          Item {
              id: contentContainer
              anchors.top: parent.top
              anchors.bottom: parent.bottom
              anchors.left: controlsMenu.right
              width: parent.width

              ToolBar {
                  id: toolBar
                  visible: !loadingScreen.visible
                  width: parent.width
                  height: 54 * Flat.FlatStyle.scaleFactor
                  z: contentLoader.z + 1
                  style: Flat.ToolBarStyle {
                      padding.left: 0
                      padding.right: 0
                  }

                  RowLayout {
                      anchors.fill: parent

                      MouseArea {
                          id: controlsButton
                          Layout.preferredWidth: toolBar.height + textMargins
                          Layout.preferredHeight: toolBar.height
                          onClicked: currentMenu = currentMenu == 0 ? -1 : 0

                          Column {
                              id: controlsIcon
                              anchors.left: parent.left
                              anchors.leftMargin: textMargins
                              anchors.verticalCenter: parent.verticalCenter
                              spacing: Math.round(2 * Flat.FlatStyle.scaleFactor)

                              Repeater {
                                  model: 3

                                  Rectangle {
                                      width: Math.round(4 * Flat.FlatStyle.scaleFactor)
                                      height: width
                                      radius: width / 2
                                      color: Flat.FlatStyle.defaultTextColor
                                  }
                              }
                          }
                      }

                      Text {
                          text: "Light Flat UI Demo"
                          font.family: Flat.FlatStyle.fontFamily
                          font.pixelSize: Math.round(16 * Flat.FlatStyle.scaleFactor)
                          horizontalAlignment: Text.AlignHCenter
                          color: "#666666"
                          Layout.fillWidth: true
                      }

                      MouseArea {
                          id: settingsButton
                          Layout.preferredWidth: controlsButton.Layout.preferredWidth
                          Layout.preferredHeight: controlsButton.Layout.preferredHeight
                          onClicked: currentMenu = currentMenu == 1 ? -1 : 1

                          SettingsIcon {
                              width: Math.round(32 * Flat.FlatStyle.scaleFactor)
                              height: Math.round(32 * Flat.FlatStyle.scaleFactor)
                              anchors.verticalCenter: parent.verticalCenter
                              anchors.right: parent.right
                              anchors.rightMargin: textMargins - Math.round(8 * Flat.FlatStyle.scaleFactor)
                          }
                      }
                  }
              }

              Loader {
                  id: contentLoader
                  anchors.left: parent.left
                  anchors.right: parent.right
                  anchors.top: toolBar.bottom
                  anchors.bottom: parent.bottom

                  property QtObject settingsData: QtObject {
                      readonly property bool checks: disableSingleItemsAction.checked
                      readonly property bool frames: !greyBackgroundAction.checked
                      readonly property bool allDisabled: disableAllAction.checked
                  }
                  property QtObject controlData: QtObject {
                      readonly property int componentIndex: controlView.currentIndex
                      readonly property int textMargins: window.textMargins
                  }

                  MouseArea {
                      enabled: currentMenu != -1
                      // We would be able to just set this to true here, if it weren't for QTBUG-43083.
                      hoverEnabled: enabled
                      anchors.fill: parent
                      preventStealing: true
                      onClicked: currentMenu = -1
                      focus: enabled
                      z: 1000
                  }
              }
          }

          Rectangle {
              id: settingsMenu
              z: contentContainer.z + 1
              width: menuWidth
              height: parent.height
              anchors.left: contentContainer.right

              Rectangle {
                  id: optionsTitleBar
                  width: parent.width
                  height: toolBar.height
                  color: Flat.FlatStyle.defaultTextColor

                  Label {
                      text: "Options"
                      font.family: Flat.FlatStyle.fontFamily
                      font.pixelSize: Math.round(16 * Flat.FlatStyle.scaleFactor)
                      renderType: Text.QtRendering
                      color: "white"
                      anchors.left: parent.left
                      anchors.leftMargin: menuMargins
                      anchors.verticalCenter: parent.verticalCenter
                  }
              }

              Action {
                  id: disableAllAction
                  checkable: true
                  checked: false
              }

              Action {
                  id: disableSingleItemsAction
                  checkable: true
                  checked: false
              }

              Action {
                  id: greyBackgroundAction
                  checkable: true
                  checked: false
              }

              ListView {
                  id: optionsListView
                  width: parent.width
                  anchors.top: optionsTitleBar.bottom
                  anchors.bottom: parent.bottom
                  clip: true
                  interactive: delegateHeight * count > height

                  readonly property int delegateHeight: 64 * Flat.FlatStyle.scaleFactor

                  model: [
                      { name: "Disable all", action: disableAllAction },
                      { name: "Disable single items", action: disableSingleItemsAction },
                      { name: "Grey background", action: greyBackgroundAction },
                      { name: "Exit", action: null }
                  ]
                  delegate: Rectangle {
                      id: optionDelegateItem
                      width: parent.width
                      height: optionsListView.delegateHeight

                      Rectangle {
                          width: parent.width
                          height: Flat.FlatStyle.onePixel
                          anchors.bottom: parent.bottom
                          color: Flat.FlatStyle.lightFrameColor
                      }

                      Loader {
                          sourceComponent: optionText !== "Exit"
                              ? optionsListView.checkBoxComponent : optionsListView.exitComponent
                          anchors.fill: parent
                          anchors.leftMargin: menuMargins

                          property string optionText: optionsListView.model[index].name
                          property int optionIndex: index
                      }
                  }

                  property Component checkBoxComponent: Item {
                      Label {
                          text: optionText
                          font.family: Flat.FlatStyle.fontFamily
                          font.pixelSize: Math.round(15 * Flat.FlatStyle.scaleFactor)
                          fontSizeMode: Text.Fit
                          renderType: Text.QtRendering
                          verticalAlignment: Text.AlignVCenter
                          color: Flat.FlatStyle.defaultTextColor
                          height: parent.height
                          anchors.left: parent.left
                          anchors.right: checkBox.left
                          anchors.rightMargin: Flat.FlatStyle.twoPixels
                      }

                      CheckBox {
                          id: checkBox
                          checked: optionsListView.model[optionIndex].action.checked
                          anchors.right: parent.right
                          anchors.rightMargin: menuMargins
                          anchors.verticalCenter: parent.verticalCenter
                          onCheckedChanged: optionsListView.model[optionIndex].action.checked = checkBox.checked
                      }
                  }

                  property Component exitComponent: MouseArea {
                      anchors.fill: parent
                      onClicked: Qt.quit()

                      Label {
                          text: optionText
                          font.family: Flat.FlatStyle.fontFamily
                          font.pixelSize: Math.round(15 * Flat.FlatStyle.scaleFactor)
                          renderType: Text.QtRendering
                          color: Flat.FlatStyle.defaultTextColor
                          anchors.verticalCenter: parent.verticalCenter
                      }
                  }

                  Rectangle {
                      width: parent.height
                      height: 8 * Flat.FlatStyle.scaleFactor
                      rotation: -90
                      anchors.right: parent.left
                      transformOrigin: Item.TopRight

                      gradient: Gradient {
                          GradientStop {
                              color: Qt.rgba(0, 0, 0, 0.15)
                              position: 0
                          }
                          GradientStop {
                              color: Qt.rgba(0, 0, 0, 0.05)
                              position: 0.5
                          }
                          GradientStop {
                              color: Qt.rgba(0, 0, 0, 0)
                              position: 1
                          }
                      }
                  }
              }
          }
      }
  }