summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2014-11-04 15:32:27 +0100
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2014-11-04 16:26:52 +0100
commit389d091ea25f123cecc7d63379ce8fb2ce16ebd9 (patch)
tree4609df744f55887abd53f10299d1eb85aa05ad94
parent9c6a5d4757810f5993316015778fa63c22465287 (diff)
downloadqtquickcontrols-389d091ea25f123cecc7d63379ce8fb2ce16ebd9.tar.gz
Workshop manual test (the former Gallery example)
Change-Id: Ib62be83b1652777e7603a262a8a89c132d3766e7 Reviewed-by: Mitch Curtis <mitch.curtis@digia.com> Reviewed-by: Caroline Chao <caroline.chao@theqtcompany.com>
-rw-r--r--tests/manual/workshop/content/AboutDialog.qml49
-rw-r--r--tests/manual/workshop/content/Controls.qml280
-rw-r--r--tests/manual/workshop/content/ImageViewer.qml59
-rw-r--r--tests/manual/workshop/content/ModelView.qml88
-rw-r--r--tests/manual/workshop/content/Styles.qml382
-rw-r--r--tests/manual/workshop/images/bubble.pngbin0 -> 214 bytes
-rw-r--r--tests/manual/workshop/images/button-pressed.pngbin0 -> 3094 bytes
-rw-r--r--tests/manual/workshop/images/button.pngbin0 -> 3164 bytes
-rw-r--r--tests/manual/workshop/images/document-open.pngbin0 -> 1550 bytes
-rw-r--r--tests/manual/workshop/images/document-open@2x.pngbin0 -> 3355 bytes
-rw-r--r--tests/manual/workshop/images/document-save-as.pngbin0 -> 1837 bytes
-rw-r--r--tests/manual/workshop/images/document-save-as@2x.pngbin0 -> 4500 bytes
-rw-r--r--tests/manual/workshop/images/folder_new.pngbin0 -> 1199 bytes
-rw-r--r--tests/manual/workshop/images/go-next.pngbin0 -> 1219 bytes
-rw-r--r--tests/manual/workshop/images/go-previous.pngbin0 -> 1200 bytes
-rw-r--r--tests/manual/workshop/images/preferences-system.pngbin0 -> 2129 bytes
-rw-r--r--tests/manual/workshop/images/process-stop.pngbin0 -> 1927 bytes
-rw-r--r--tests/manual/workshop/images/progress-background.pngbin0 -> 456 bytes
-rw-r--r--tests/manual/workshop/images/progress-fill.pngbin0 -> 507 bytes
-rw-r--r--tests/manual/workshop/images/slider-handle.pngbin0 -> 3523 bytes
-rw-r--r--tests/manual/workshop/images/tab.pngbin0 -> 9877 bytes
-rw-r--r--tests/manual/workshop/images/tab_selected.pngbin0 -> 10184 bytes
-rw-r--r--tests/manual/workshop/images/textfield.pngbin0 -> 3023 bytes
-rw-r--r--tests/manual/workshop/images/toplevel_window.pngbin0 -> 3690 bytes
-rw-r--r--tests/manual/workshop/images/view-refresh.pngbin0 -> 2024 bytes
-rw-r--r--tests/manual/workshop/images/window-new@2x.pngbin0 -> 1900 bytes
-rw-r--r--tests/manual/workshop/main.qml169
-rw-r--r--tests/manual/workshop/src/main.cpp57
-rw-r--r--tests/manual/workshop/src/src.pri2
-rw-r--r--tests/manual/workshop/workshop.pro18
-rw-r--r--tests/manual/workshop/workshop.qrc24
31 files changed, 1128 insertions, 0 deletions
diff --git a/tests/manual/workshop/content/AboutDialog.qml b/tests/manual/workshop/content/AboutDialog.qml
new file mode 100644
index 00000000..c4d87ee0
--- /dev/null
+++ b/tests/manual/workshop/content/AboutDialog.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 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.Dialogs 1.1
+
+MessageDialog {
+ icon: StandardIcon.Information
+ title: "Qt Quick Controls Workshop"
+ text: "Qt Quick Controls Workshop"
+ detailedText: "A manual test for most of the available Qt Quick Controls"
+}
diff --git a/tests/manual/workshop/content/Controls.qml b/tests/manual/workshop/content/Controls.qml
new file mode 100644
index 00000000..1abd57e4
--- /dev/null
+++ b/tests/manual/workshop/content/Controls.qml
@@ -0,0 +1,280 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 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 }
+ }
+ }
+ }
+}
diff --git a/tests/manual/workshop/content/ImageViewer.qml b/tests/manual/workshop/content/ImageViewer.qml
new file mode 100644
index 00000000..26d2da17
--- /dev/null
+++ b/tests/manual/workshop/content/ImageViewer.qml
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 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.Window 2.1
+
+Window {
+ id: imageViewer
+ minimumWidth: viewerImage.width
+ minimumHeight: viewerImage.height
+ function open(source) {
+ viewerImage.source = source
+ width = viewerImage.implicitWidth + 20
+ height = viewerImage.implicitHeight + 20
+ title = source
+ visible = true
+ }
+ Image {
+ id: viewerImage
+ anchors.centerIn: parent
+ }
+}
diff --git a/tests/manual/workshop/content/ModelView.qml b/tests/manual/workshop/content/ModelView.qml
new file mode 100644
index 00000000..eb9f720d
--- /dev/null
+++ b/tests/manual/workshop/content/ModelView.qml
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 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
+
+Item {
+ id: root
+ width: 600
+ height: 300
+ anchors.fill: parent
+ anchors.margins: Qt.platform.os === "osx" ? 12 : 6
+
+ ListModel {
+ id: dummyModel
+ Component.onCompleted: {
+ for (var i = 0 ; i < 100 ; ++i) {
+ append({"index": i, "title": "A title " + i, "imagesource" :"http://someurl.com", "credit" : "N/A"})
+ }
+ }
+ }
+
+ TableView{
+ model: dummyModel
+ anchors.fill: parent
+
+ TableViewColumn {
+ role: "index"
+ title: "#"
+ width: 36
+ resizable: false
+ movable: false
+ }
+ TableViewColumn {
+ role: "title"
+ title: "Title"
+ width: 120
+ }
+ TableViewColumn {
+ role: "credit"
+ title: "Credit"
+ width: 120
+ }
+ TableViewColumn {
+ role: "imagesource"
+ title: "Image source"
+ width: 200
+ visible: true
+ }
+ }
+}
diff --git a/tests/manual/workshop/content/Styles.qml b/tests/manual/workshop/content/Styles.qml
new file mode 100644
index 00000000..d490e2b5
--- /dev/null
+++ b/tests/manual/workshop/content/Styles.qml
@@ -0,0 +1,382 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 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 }
+ }
+}
diff --git a/tests/manual/workshop/images/bubble.png b/tests/manual/workshop/images/bubble.png
new file mode 100644
index 00000000..62aa1efe
--- /dev/null
+++ b/tests/manual/workshop/images/bubble.png
Binary files differ
diff --git a/tests/manual/workshop/images/button-pressed.png b/tests/manual/workshop/images/button-pressed.png
new file mode 100644
index 00000000..d64cdaa7
--- /dev/null
+++ b/tests/manual/workshop/images/button-pressed.png
Binary files differ
diff --git a/tests/manual/workshop/images/button.png b/tests/manual/workshop/images/button.png
new file mode 100644
index 00000000..8ab41cc8
--- /dev/null
+++ b/tests/manual/workshop/images/button.png
Binary files differ
diff --git a/tests/manual/workshop/images/document-open.png b/tests/manual/workshop/images/document-open.png
new file mode 100644
index 00000000..f35f2583
--- /dev/null
+++ b/tests/manual/workshop/images/document-open.png
Binary files differ
diff --git a/tests/manual/workshop/images/document-open@2x.png b/tests/manual/workshop/images/document-open@2x.png
new file mode 100644
index 00000000..9fdbb665
--- /dev/null
+++ b/tests/manual/workshop/images/document-open@2x.png
Binary files differ
diff --git a/tests/manual/workshop/images/document-save-as.png b/tests/manual/workshop/images/document-save-as.png
new file mode 100644
index 00000000..5c9f6b34
--- /dev/null
+++ b/tests/manual/workshop/images/document-save-as.png
Binary files differ
diff --git a/tests/manual/workshop/images/document-save-as@2x.png b/tests/manual/workshop/images/document-save-as@2x.png
new file mode 100644
index 00000000..a15e34c9
--- /dev/null
+++ b/tests/manual/workshop/images/document-save-as@2x.png
Binary files differ
diff --git a/tests/manual/workshop/images/folder_new.png b/tests/manual/workshop/images/folder_new.png
new file mode 100644
index 00000000..8d8bb9bd
--- /dev/null
+++ b/tests/manual/workshop/images/folder_new.png
Binary files differ
diff --git a/tests/manual/workshop/images/go-next.png b/tests/manual/workshop/images/go-next.png
new file mode 100644
index 00000000..a68e2db7
--- /dev/null
+++ b/tests/manual/workshop/images/go-next.png
Binary files differ
diff --git a/tests/manual/workshop/images/go-previous.png b/tests/manual/workshop/images/go-previous.png
new file mode 100644
index 00000000..c37bc041
--- /dev/null
+++ b/tests/manual/workshop/images/go-previous.png
Binary files differ
diff --git a/tests/manual/workshop/images/preferences-system.png b/tests/manual/workshop/images/preferences-system.png
new file mode 100644
index 00000000..6e52db7c
--- /dev/null
+++ b/tests/manual/workshop/images/preferences-system.png
Binary files differ
diff --git a/tests/manual/workshop/images/process-stop.png b/tests/manual/workshop/images/process-stop.png
new file mode 100644
index 00000000..e7a8d172
--- /dev/null
+++ b/tests/manual/workshop/images/process-stop.png
Binary files differ
diff --git a/tests/manual/workshop/images/progress-background.png b/tests/manual/workshop/images/progress-background.png
new file mode 100644
index 00000000..55a069df
--- /dev/null
+++ b/tests/manual/workshop/images/progress-background.png
Binary files differ
diff --git a/tests/manual/workshop/images/progress-fill.png b/tests/manual/workshop/images/progress-fill.png
new file mode 100644
index 00000000..b588c958
--- /dev/null
+++ b/tests/manual/workshop/images/progress-fill.png
Binary files differ
diff --git a/tests/manual/workshop/images/slider-handle.png b/tests/manual/workshop/images/slider-handle.png
new file mode 100644
index 00000000..ac4d4a0d
--- /dev/null
+++ b/tests/manual/workshop/images/slider-handle.png
Binary files differ
diff --git a/tests/manual/workshop/images/tab.png b/tests/manual/workshop/images/tab.png
new file mode 100644
index 00000000..74fefab7
--- /dev/null
+++ b/tests/manual/workshop/images/tab.png
Binary files differ
diff --git a/tests/manual/workshop/images/tab_selected.png b/tests/manual/workshop/images/tab_selected.png
new file mode 100644
index 00000000..665400cc
--- /dev/null
+++ b/tests/manual/workshop/images/tab_selected.png
Binary files differ
diff --git a/tests/manual/workshop/images/textfield.png b/tests/manual/workshop/images/textfield.png
new file mode 100644
index 00000000..1d4a38ab
--- /dev/null
+++ b/tests/manual/workshop/images/textfield.png
Binary files differ
diff --git a/tests/manual/workshop/images/toplevel_window.png b/tests/manual/workshop/images/toplevel_window.png
new file mode 100644
index 00000000..4dc6a8ce
--- /dev/null
+++ b/tests/manual/workshop/images/toplevel_window.png
Binary files differ
diff --git a/tests/manual/workshop/images/view-refresh.png b/tests/manual/workshop/images/view-refresh.png
new file mode 100644
index 00000000..606ea9eb
--- /dev/null
+++ b/tests/manual/workshop/images/view-refresh.png
Binary files differ
diff --git a/tests/manual/workshop/images/window-new@2x.png b/tests/manual/workshop/images/window-new@2x.png
new file mode 100644
index 00000000..36503018
--- /dev/null
+++ b/tests/manual/workshop/images/window-new@2x.png
Binary files differ
diff --git a/tests/manual/workshop/main.qml b/tests/manual/workshop/main.qml
new file mode 100644
index 00000000..723a8886
--- /dev/null
+++ b/tests/manual/workshop/main.qml
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 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.0
+import QtQuick.Dialogs 1.0
+import "content"
+
+ApplicationWindow {
+ visible: true
+ title: "Qt Quick Controls Workshop"
+
+ width: 640
+ height: 420
+ minimumHeight: 400
+ minimumWidth: 600
+
+ ImageViewer { id: imageViewer }
+
+ FileDialog {
+ id: fileDialog
+ nameFilters: [ "Image files (*.png *.jpg)" ]
+ onAccepted: imageViewer.open(fileUrl)
+ }
+
+ AboutDialog { id: aboutDialog }
+
+ Action {
+ id: openAction
+ text: "&Open"
+ shortcut: StandardKey.Open
+ iconSource: "images/document-open.png"
+ onTriggered: fileDialog.open()
+ tooltip: "Open an image"
+ }
+
+ Action {
+ id: copyAction
+ text: "&Copy"
+ shortcut: StandardKey.Copy
+ iconName: "edit-copy"
+ enabled: (!!activeFocusItem && !!activeFocusItem["copy"])
+ onTriggered: activeFocusItem.copy()
+ }
+
+ Action {
+ id: cutAction
+ text: "Cu&t"
+ shortcut: StandardKey.Cut
+ iconName: "edit-cut"
+ enabled: (!!activeFocusItem && !!activeFocusItem["cut"])
+ onTriggered: activeFocusItem.cut()
+ }
+
+ Action {
+ id: pasteAction
+ text: "&Paste"
+ shortcut: StandardKey.Paste
+ iconName: "edit-paste"
+ enabled: (!!activeFocusItem && !!activeFocusItem["paste"])
+ onTriggered: activeFocusItem.paste()
+ }
+
+ toolBar: ToolBar {
+ id: toolbar
+ RowLayout {
+ id: toolbarLayout
+ spacing: 0
+ anchors.fill: parent
+ ToolButton { action: openAction }
+ ToolButton {
+ Accessible.name: "Save as"
+ iconSource: "images/document-save-as.png"
+ tooltip: "(Pretend to) Save as..."
+ }
+ Item { Layout.fillWidth: true }
+ CheckBox {
+ id: enabledCheck
+ text: "Enabled"
+ checked: true
+ }
+ }
+ }
+
+ menuBar: MenuBar {
+ Menu {
+ title: "&File"
+ MenuItem { action: openAction }
+ MenuItem {
+ text: "E&xit"
+ shortcut: StandardKey.Quit
+ onTriggered: Qt.quit()
+ }
+ }
+ Menu {
+ title: "&Edit"
+ MenuItem { action: cutAction }
+ MenuItem { action: copyAction }
+ MenuItem { action: pasteAction }
+ }
+ Menu {
+ title: "&Help"
+ MenuItem {
+ text: "About..."
+ onTriggered: aboutDialog.open()
+ }
+ }
+ }
+
+ TabView {
+ id:frame
+ enabled: enabledCheck.checked
+ tabPosition: controlPage.item ? controlPage.item.tabPosition : Qt.TopEdge
+ anchors.fill: parent
+ anchors.margins: Qt.platform.os === "osx" ? 12 : 2
+
+ Tab {
+ id: controlPage
+ title: "Controls"
+ Controls { }
+ }
+ Tab {
+ title: "Itemviews"
+ ModelView { }
+ }
+ Tab {
+ title: "Styles"
+ Styles { anchors.fill: parent }
+ }
+ }
+}
diff --git a/tests/manual/workshop/src/main.cpp b/tests/manual/workshop/src/main.cpp
new file mode 100644
index 00000000..d8b3665c
--- /dev/null
+++ b/tests/manual/workshop/src/main.cpp
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 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$
+**
+****************************************************************************/
+
+#include "qt_quick_controls_testapp.h"
+#include <QtQml/QQmlApplicationEngine>
+#include <QtGui/QSurfaceFormat>
+#include <QtQuick/QQuickWindow>
+
+int main(int argc, char *argv[])
+{
+ QtQuickControlsTestApp app(argc, argv);
+ if (QCoreApplication::arguments().contains(QLatin1String("--coreprofile"))) {
+ QSurfaceFormat fmt;
+ fmt.setVersion(4, 4);
+ fmt.setProfile(QSurfaceFormat::CoreProfile);
+ QSurfaceFormat::setDefaultFormat(fmt);
+ }
+ QQmlApplicationEngine engine(QUrl("qrc:/main.qml"));
+ return app.exec();
+}
diff --git a/tests/manual/workshop/src/src.pri b/tests/manual/workshop/src/src.pri
new file mode 100644
index 00000000..66d903ea
--- /dev/null
+++ b/tests/manual/workshop/src/src.pri
@@ -0,0 +1,2 @@
+SOURCES += \
+ $$PWD/main.cpp
diff --git a/tests/manual/workshop/workshop.pro b/tests/manual/workshop/workshop.pro
new file mode 100644
index 00000000..c3abc14c
--- /dev/null
+++ b/tests/manual/workshop/workshop.pro
@@ -0,0 +1,18 @@
+QT += qml quick
+TARGET = workshop
+!no_desktop: QT += widgets
+
+include(src/src.pri)
+
+INCLUDEPATH += ../../shared
+
+OTHER_FILES += \
+ main.qml \
+ content/AboutDialog.qml \
+ content/Controls.qml \
+ content/ImageViewer.qml \
+ content/ModelView.qml \
+ content/Styles.qml
+
+RESOURCES += \
+ workshop.qrc
diff --git a/tests/manual/workshop/workshop.qrc b/tests/manual/workshop/workshop.qrc
new file mode 100644
index 00000000..57d803b2
--- /dev/null
+++ b/tests/manual/workshop/workshop.qrc
@@ -0,0 +1,24 @@
+<RCC>
+ <qresource prefix="/">
+ <file>main.qml</file>
+ <file>content/AboutDialog.qml</file>
+ <file>content/Controls.qml</file>
+ <file>content/ImageViewer.qml</file>
+ <file>content/ModelView.qml</file>
+ <file>content/Styles.qml</file>
+ <file>images/document-open.png</file>
+ <file>images/document-open@2x.png</file>
+ <file>images/document-save-as.png</file>
+ <file>images/document-save-as@2x.png</file>
+ <file>images/folder_new.png</file>
+ <file>images/tab.png</file>
+ <file>images/tab_selected.png</file>
+ <file>images/bubble.png</file>
+ <file>images/button-pressed.png</file>
+ <file>images/button.png</file>
+ <file>images/progress-background.png</file>
+ <file>images/progress-fill.png</file>
+ <file>images/textfield.png</file>
+ <file>images/slider-handle.png</file>
+ </qresource>
+</RCC>