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
}
}
}
}
}
}
}