Commit af733332 authored by J-P Nurmi's avatar J-P Nurmi
Browse files

Rewrite the gallery example


A much simpler, scalable and mobile friendly UI.

Some of the more complex controls, such as TextArea and TableView,
are intentionally left out. They are scrollable on their own, so
they wouldn't play nice inside scrollable pages. Furthermore, adding
them as standlone pages would increase the amount of tabs too much.
Those controls are demonstrated in the Text Editor and Table View
examples, respectively.

Task-number: QTBUG-41307
Change-Id: Ib3efb346e621e388087f3f14c73b3b54279db280
Reviewed-by: default avatarMitch Curtis <mitch.curtis@digia.com>
Reviewed-by: default avatarCaroline Chao <caroline.chao@theqtcompany.com>
Showing with 26 additions and 689 deletions
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt Quick Controls module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** 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 Digia Plc and its Subsidiary(-ies) 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.2
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1
import QtQuick.Controls.Styles 1.1
Item {
id: flickable
anchors.fill: parent
enabled: enabledCheck.checked
property int tabPosition: tabPositionGroup.current === r2 ? Qt.BottomEdge : Qt.TopEdge
property string loremIpsum:
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor "+
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor "+
"incididunt ut labore et dolore magna aliqua.\n Ut enim ad minim veniam, quis nostrud "+
"exercitation ullamco laboris nisi ut aliquip ex ea commodo cosnsequat. ";
ListModel {
id: choices
ListElement { text: "Banana" }
ListElement { text: "Orange" }
ListElement { text: "Apple" }
ListElement { text: "Coconut" }
}
RowLayout {
id: contentRow
anchors.fill:parent
anchors.margins: 8
spacing: 16
ColumnLayout {
id: firstColumn
Layout.minimumWidth: implicitWidth
Layout.fillWidth: false
RowLayout {
id: buttonrow
Button {
id: button1
text: "Button 1"
tooltip:"This is an interesting tool tip"
Layout.fillWidth: true
}
Button {
id:button2
text:"Button 2"
Layout.fillWidth: true
menu: Menu {
MenuItem { text: "This Button" }
MenuItem { text: "Happens To Have" }
MenuItem { text: "A Menu Assigned" }
}
}
}
ComboBox {
id: combo
model: choices
currentIndex: 2
Layout.fillWidth: true
}
ComboBox {
model: Qt.fontFamilies()
Layout.fillWidth: true
currentIndex: 47
}
ComboBox {
id: editableCombo
editable: true
model: choices
Layout.fillWidth: true
currentIndex: 2
onAccepted: {
if (editableCombo.find(currentText) === -1) {
choices.append({text: editText})
currentIndex = editableCombo.find(editText)
}
}
}
RowLayout {
SpinBox {
id: t1
Layout.fillWidth: true
minimumValue: -50
value: -20
}
SpinBox {
id: t2
Layout.fillWidth: true
}
}
TextField {
id: t3
placeholderText: "This is a placeholder for a TextField"
Layout.fillWidth: true
}
ProgressBar {
// normalize value [0.0 .. 1.0]
value: (slider.value - slider.minimumValue) / (slider.maximumValue - slider.minimumValue)
Layout.fillWidth: true
}
ProgressBar {
indeterminate: true
Layout.fillWidth: true
}
Slider {
id: slider
value: 0.5
Layout.fillWidth: true
tickmarksEnabled: tickmarkCheck.checked
stepSize: tickmarksEnabled ? 0.1 : 0
}
MouseArea {
id: busyCheck
Layout.fillWidth: true
Layout.fillHeight: true
hoverEnabled:true
Layout.preferredHeight: busyIndicator.height
BusyIndicator {
id: busyIndicator
running: busyCheck.containsMouse
anchors.horizontalCenter: parent.horizontalCenter
}
}
}
ColumnLayout {
id: rightcol
Layout.fillWidth: true
anchors {
top: parent.top
bottom: parent.bottom
}
GroupBox {
id: group1
title: "CheckBox"
Layout.fillWidth: true
RowLayout {
Layout.fillWidth: true
CheckBox {
id: frameCheckbox
text: "Text frame"
checked: true
Layout.minimumWidth: 100
}
CheckBox {
id: tickmarkCheck
text: "Tickmarks"
checked: false
Layout.minimumWidth: 100
}
CheckBox {
id: wrapCheck
text: "Word wrap"
checked: true
Layout.minimumWidth: 100
}
}
}
GroupBox {
id: group2
title:"Tab Position"
Layout.fillWidth: true
RowLayout {
ExclusiveGroup { id: tabPositionGroup }
RadioButton {
id: r1
text: "Top"
checked: true
exclusiveGroup: tabPositionGroup
Layout.minimumWidth: 100
}
RadioButton {
id: r2
text: "Bottom"
exclusiveGroup: tabPositionGroup
Layout.minimumWidth: 100
}
}
}
TextArea {
id: area
frameVisible: frameCheckbox.checked
text: loremIpsum + loremIpsum
textFormat: Qt.RichText
wrapMode: wrapCheck.checked ? TextEdit.WordWrap : TextEdit.NoWrap
Layout.fillWidth: true
Layout.fillHeight: true
menu: editmenu
}
}
}
ExclusiveGroup {
id: textFormatGroup
Action {
id: a1
text: "Align &Left"
checkable: true
Component.onCompleted: checked = true
}
Action {
id: a2
text: "&Center"
checkable: true
}
Action {
id: a3
text: "Align &Right"
checkable: true
}
}
Component {
id: editmenu
Menu {
MenuItem { action: cutAction }
MenuItem { action: copyAction }
MenuItem { action: pasteAction }
MenuSeparator {}
Menu {
title: "Text &Format"
MenuItem { action: a1 }
MenuItem { action: a2 }
MenuItem { action: a3 }
MenuSeparator { }
MenuItem { text: "Allow &Hyphenation"; checkable: true }
}
Menu {
title: "Font &Style"
MenuItem { text: "&Bold"; checkable: true }
MenuItem { text: "&Italic"; checkable: true }
MenuItem { text: "&Underline"; checkable: true }
}
}
}
}
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt Quick Controls module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** 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 Digia Plc and its Subsidiary(-ies) 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.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.1
import QtQuick.Particles 2.0
import QtQuick.Layouts 1.0
Item {
id: root
width: 300
height: 200
property int columnWidth: 120
GridLayout {
rowSpacing: 12
columnSpacing: 30
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
anchors.margins: 30
Button {
text: "Push me"
style: ButtonStyle { }
implicitWidth: columnWidth
}
Button {
text: "Push me"
style: ButtonStyle {
background: BorderImage {
source: control.pressed ? "../images/button-pressed.png" : "../images/button.png"
border.left: 4 ; border.right: 4 ; border.top: 4 ; border.bottom: 4
}
}
implicitWidth: columnWidth
}
Button {
text: "Push me"
style: buttonStyle
implicitWidth: columnWidth
}
TextField {
Layout.row: 1
style: TextFieldStyle { }
implicitWidth: columnWidth
}
TextField {
style: TextFieldStyle {
background: BorderImage {
source: "../images/textfield.png"
border.left: 4 ; border.right: 4 ; border.top: 4 ; border.bottom: 4
}
}
implicitWidth: columnWidth
}
TextField {
style: textfieldStyle
implicitWidth: columnWidth
}
Slider {
id: slider1
Layout.row: 2
value: 0.5
implicitWidth: columnWidth
style: SliderStyle { }
}
Slider {
id: slider2
value: 0.5
implicitWidth: columnWidth
style: SliderStyle {
groove: BorderImage {
height: 6
border.top: 1
border.bottom: 1
source: "../images/progress-background.png"
border.left: 6
border.right: 6
BorderImage {
anchors.verticalCenter: parent.verticalCenter
source: "../images/progress-fill.png"
border.left: 5 ; border.top: 1
border.right: 5 ; border.bottom: 1
width: styleData.handlePosition
height: parent.height
}
}
handle: Item {
width: 13
height: 13
Image {
anchors.centerIn: parent
source: "../images/slider-handle.png"
}
}
}
}
Slider {
id: slider3
value: 0.5
implicitWidth: columnWidth
style: sliderStyle
}
ProgressBar {
Layout.row: 3
value: slider1.value
implicitWidth: columnWidth
style: ProgressBarStyle{ }
}
ProgressBar {
value: slider2.value
implicitWidth: columnWidth
style: progressBarStyle
}
ProgressBar {
value: slider3.value
implicitWidth: columnWidth
style: progressBarStyle2
}
CheckBox {
text: "CheckBox"
style: CheckBoxStyle{}
Layout.row: 4
implicitWidth: columnWidth
}
RadioButton {
style: RadioButtonStyle{}
text: "RadioButton"
implicitWidth: columnWidth
}
ComboBox {
model: ["Paris", "Oslo", "New York"]
style: ComboBoxStyle{}
implicitWidth: columnWidth
}
TabView {
Layout.row: 5
Layout.columnSpan: 3
Layout.fillWidth: true
implicitHeight: 30
Tab { title: "One" ; Item {}}
Tab { title: "Two" ; Item {}}
Tab { title: "Three" ; Item {}}
Tab { title: "Four" ; Item {}}
style: TabViewStyle {}
}
TabView {
Layout.row: 6
Layout.columnSpan: 3
Layout.fillWidth: true
implicitHeight: 30
Tab { title: "One" ; Item {}}
Tab { title: "Two" ; Item {}}
Tab { title: "Three" ; Item {}}
Tab { title: "Four" ; Item {}}
style: tabViewStyle
}
}
// Style delegates:
property Component buttonStyle: ButtonStyle {
background: Rectangle {
implicitHeight: 22
implicitWidth: columnWidth
color: control.pressed ? "darkGray" : control.activeFocus ? "#cdd" : "#ccc"
antialiasing: true
border.color: "gray"
radius: height/2
Rectangle {
anchors.fill: parent
anchors.margins: 1
color: "transparent"
antialiasing: true
visible: !control.pressed
border.color: "#aaffffff"
radius: height/2
}
}
}
property Component textfieldStyle: TextFieldStyle {
background: Rectangle {
implicitWidth: columnWidth
implicitHeight: 22
color: "#f0f0f0"
antialiasing: true
border.color: "gray"
radius: height/2
Rectangle {
anchors.fill: parent
anchors.margins: 1
color: "transparent"
antialiasing: true
border.color: "#aaffffff"
radius: height/2
}
}
}
property Component sliderStyle: SliderStyle {
handle: Rectangle {
width: 18
height: 18
color: control.pressed ? "darkGray" : "lightGray"
border.color: "gray"
antialiasing: true
radius: height/2
Rectangle {
anchors.fill: parent
anchors.margins: 1
color: "transparent"
antialiasing: true
border.color: "#eee"
radius: height/2
}
}
groove: Rectangle {
height: 8
implicitWidth: columnWidth
implicitHeight: 22
antialiasing: true
color: "#ccc"
border.color: "#777"
radius: height/2
Rectangle {
anchors.fill: parent
anchors.margins: 1
color: "transparent"
antialiasing: true
border.color: "#66ffffff"
radius: height/2
}
}
}
property Component progressBarStyle: ProgressBarStyle {
background: BorderImage {
source: "../images/progress-background.png"
border.left: 2 ; border.right: 2 ; border.top: 2 ; border.bottom: 2
}
progress: Item {
clip: true
BorderImage {
anchors.fill: parent
anchors.rightMargin: (control.value < control.maximumValue) ? -4 : 0
source: "../images/progress-fill.png"
border.left: 10 ; border.right: 10
Rectangle {
width: 1
color: "#a70"
opacity: 0.8
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.bottomMargin: 1
anchors.right: parent.right
visible: control.value < control.maximumValue
anchors.rightMargin: -parent.anchors.rightMargin
}
}
ParticleSystem{ id: bubbles; running: visible }
ImageParticle{
id: fireball
system: bubbles
source: "../images/bubble.png"
opacity: 0.7
}
Emitter{
system: bubbles
anchors.bottom: parent.bottom
anchors.margins: 4
anchors.bottomMargin: -4
anchors.left: parent.left
anchors.right: parent.right
size: 4
sizeVariation: 4
acceleration: PointDirection{ y: -6; xVariation: 3 }
emitRate: 6 * control.value
lifeSpan: 3000
}
}
}
property Component progressBarStyle2: ProgressBarStyle {
background: Rectangle {
implicitWidth: columnWidth
implicitHeight: 24
color: "#f0f0f0"
border.color: "gray"
}
progress: Rectangle {
color: "#ccc"
border.color: "gray"
Rectangle {
color: "transparent"
border.color: "#44ffffff"
anchors.fill: parent
anchors.margins: 1
}
}
}
property Component tabViewStyle: TabViewStyle {
tabOverlap: 16
frameOverlap: 4
tabsMovable: true
frame: Rectangle {
gradient: Gradient{
GradientStop { color: "#e5e5e5" ; position: 0 }
GradientStop { color: "#e0e0e0" ; position: 1 }
}
border.color: "#898989"
Rectangle { anchors.fill: parent ; anchors.margins: 1 ; border.color: "white" ; color: "transparent" }
}
tab: Item {
property int totalOverlap: tabOverlap * (control.count - 1)
implicitWidth: Math.min ((styleData.availableWidth + totalOverlap)/control.count - 4, image.sourceSize.width)
implicitHeight: image.sourceSize.height
BorderImage {
id: image
anchors.fill: parent
source: styleData.selected ? "../images/tab_selected.png" : "../images/tab.png"
border.left: 30
smooth: false
border.right: 30
}
Text {
text: styleData.title
anchors.centerIn: parent
}
}
leftCorner: Item { implicitWidth: 12 }
}
}
QT += qml quick TEMPLATE = app
TARGET = gallery TARGET = gallery
!no_desktop: QT += widgets
include(src/src.pri) SOURCES += \
include(../shared/shared.pri) main.cpp
RESOURCES += \
gallery.qrc
OTHER_FILES += \ OTHER_FILES += \
main.qml \ main.qml \
content/AboutDialog.qml \ qml/ButtonPage.qml \
content/Controls.qml \ qml/InputPage.qml \
content/ImageViewer.qml \ qml/ProgressPage.qml \
content/ModelView.qml \ qml/UI.js \
content/Styles.qml qml/+android/UI.js \
qml/+ios/UI.js \
qml/+osx/UI.js
RESOURCES += \ include(../shared/shared.pri)
resources.qrc
import QmlProject 1.1
Project {
mainFile: "main.qml"
/* Include .qml, .js, and image files from current directory and subdirectories */
QmlFiles {
directory: "."
}
JavaScriptFiles {
directory: "."
}
ImageFiles {
directory: "."
}
}
<RCC>
<qresource prefix="/">
<file>main.qml</file>
<file>qml/ButtonPage.qml</file>
<file>qml/InputPage.qml</file>
<file>qml/ProgressPage.qml</file>
<file>qml/UI.js</file>
<file>qml/+android/UI.js</file>
<file>qml/+ios/UI.js</file>
<file>qml/+osx/UI.js</file>
</qresource>
</RCC>
examples/quick/controls/gallery/images/bubble.png

214 Bytes

examples/quick/controls/gallery/images/button-pressed.png

3.02 KB

examples/quick/controls/gallery/images/button.png

3.09 KB

examples/quick/controls/gallery/images/document-open.png

1.51 KB

examples/quick/controls/gallery/images/document-open@2x.png

3.28 KB

examples/quick/controls/gallery/images/document-save-as.png

1.79 KB

examples/quick/controls/gallery/images/document-save-as@2x.png

4.39 KB

examples/quick/controls/gallery/images/folder_new.png

1.17 KB

examples/quick/controls/gallery/images/go-next.png

1.19 KB

examples/quick/controls/gallery/images/go-previous.png

1.17 KB

examples/quick/controls/gallery/images/preferences-system.png

2.08 KB

examples/quick/controls/gallery/images/process-stop.png

1.88 KB

examples/quick/controls/gallery/images/progress-background.png

456 Bytes

examples/quick/controls/gallery/images/progress-fill.png

507 Bytes

examples/quick/controls/gallery/images/slider-handle.png

3.44 KB

Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment