From 389d091ea25f123cecc7d63379ce8fb2ce16ebd9 Mon Sep 17 00:00:00 2001
From: J-P Nurmi <jpnurmi@theqtcompany.com>
Date: Tue, 4 Nov 2014 15:32:27 +0100
Subject: [PATCH] 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>
---
 tests/manual/workshop/content/AboutDialog.qml |  49 +++
 tests/manual/workshop/content/Controls.qml    | 280 +++++++++++++
 tests/manual/workshop/content/ImageViewer.qml |  59 +++
 tests/manual/workshop/content/ModelView.qml   |  88 ++++
 tests/manual/workshop/content/Styles.qml      | 382 ++++++++++++++++++
 tests/manual/workshop/images/bubble.png       | Bin 0 -> 214 bytes
 .../manual/workshop/images/button-pressed.png | Bin 0 -> 3094 bytes
 tests/manual/workshop/images/button.png       | Bin 0 -> 3164 bytes
 .../manual/workshop/images/document-open.png  | Bin 0 -> 1550 bytes
 .../workshop/images/document-open@2x.png      | Bin 0 -> 3355 bytes
 .../workshop/images/document-save-as.png      | Bin 0 -> 1837 bytes
 .../workshop/images/document-save-as@2x.png   | Bin 0 -> 4500 bytes
 tests/manual/workshop/images/folder_new.png   | Bin 0 -> 1199 bytes
 tests/manual/workshop/images/go-next.png      | Bin 0 -> 1219 bytes
 tests/manual/workshop/images/go-previous.png  | Bin 0 -> 1200 bytes
 .../workshop/images/preferences-system.png    | Bin 0 -> 2129 bytes
 tests/manual/workshop/images/process-stop.png | Bin 0 -> 1927 bytes
 .../workshop/images/progress-background.png   | Bin 0 -> 456 bytes
 .../manual/workshop/images/progress-fill.png  | Bin 0 -> 507 bytes
 .../manual/workshop/images/slider-handle.png  | Bin 0 -> 3523 bytes
 tests/manual/workshop/images/tab.png          | Bin 0 -> 9877 bytes
 tests/manual/workshop/images/tab_selected.png | Bin 0 -> 10184 bytes
 tests/manual/workshop/images/textfield.png    | Bin 0 -> 3023 bytes
 .../workshop/images/toplevel_window.png       | Bin 0 -> 3690 bytes
 tests/manual/workshop/images/view-refresh.png | Bin 0 -> 2024 bytes
 .../manual/workshop/images/window-new@2x.png  | Bin 0 -> 1900 bytes
 tests/manual/workshop/main.qml                | 169 ++++++++
 tests/manual/workshop/src/main.cpp            |  57 +++
 tests/manual/workshop/src/src.pri             |   2 +
 tests/manual/workshop/workshop.pro            |  18 +
 tests/manual/workshop/workshop.qrc            |  24 ++
 31 files changed, 1128 insertions(+)
 create mode 100644 tests/manual/workshop/content/AboutDialog.qml
 create mode 100644 tests/manual/workshop/content/Controls.qml
 create mode 100644 tests/manual/workshop/content/ImageViewer.qml
 create mode 100644 tests/manual/workshop/content/ModelView.qml
 create mode 100644 tests/manual/workshop/content/Styles.qml
 create mode 100644 tests/manual/workshop/images/bubble.png
 create mode 100644 tests/manual/workshop/images/button-pressed.png
 create mode 100644 tests/manual/workshop/images/button.png
 create mode 100644 tests/manual/workshop/images/document-open.png
 create mode 100644 tests/manual/workshop/images/document-open@2x.png
 create mode 100644 tests/manual/workshop/images/document-save-as.png
 create mode 100644 tests/manual/workshop/images/document-save-as@2x.png
 create mode 100644 tests/manual/workshop/images/folder_new.png
 create mode 100644 tests/manual/workshop/images/go-next.png
 create mode 100644 tests/manual/workshop/images/go-previous.png
 create mode 100644 tests/manual/workshop/images/preferences-system.png
 create mode 100644 tests/manual/workshop/images/process-stop.png
 create mode 100644 tests/manual/workshop/images/progress-background.png
 create mode 100644 tests/manual/workshop/images/progress-fill.png
 create mode 100644 tests/manual/workshop/images/slider-handle.png
 create mode 100644 tests/manual/workshop/images/tab.png
 create mode 100644 tests/manual/workshop/images/tab_selected.png
 create mode 100644 tests/manual/workshop/images/textfield.png
 create mode 100644 tests/manual/workshop/images/toplevel_window.png
 create mode 100644 tests/manual/workshop/images/view-refresh.png
 create mode 100644 tests/manual/workshop/images/window-new@2x.png
 create mode 100644 tests/manual/workshop/main.qml
 create mode 100644 tests/manual/workshop/src/main.cpp
 create mode 100644 tests/manual/workshop/src/src.pri
 create mode 100644 tests/manual/workshop/workshop.pro
 create mode 100644 tests/manual/workshop/workshop.qrc

diff --git a/tests/manual/workshop/content/AboutDialog.qml b/tests/manual/workshop/content/AboutDialog.qml
new file mode 100644
index 000000000..c4d87ee03
--- /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 000000000..1abd57e4c
--- /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 000000000..26d2da173
--- /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 000000000..eb9f720d3
--- /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 000000000..d490e2b5e
--- /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 0000000000000000000000000000000000000000..62aa1efe54c76991fdaea3a103d362bcc635e5c6
GIT binary patch
literal 214
zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE(~)SY8aIDBX`UIif|Tq
zL>4nJa0`PlBg3pY5<o%r5>H=O_PcDXyxg)u2ilr|Ldl*kjv*44ThDJ4JZ!+@e9?Vw
zHvdHLg@z%OdgrHlB`>)o5b2N^aU!p$tKDC&vB5Ikxj3}HLypt`jRa@>kB4_Y6&+{4
zAG5;Zf|pcsW072d%?cg+*N?7$$$2sJ@qyoBn~n#cwKskxC7pKh=vtt444$rjF6*2U
FngDAvM$-TQ

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/button-pressed.png b/tests/manual/workshop/images/button-pressed.png
new file mode 100644
index 0000000000000000000000000000000000000000..d64cdaa7876296e8ff5fe0953c5f364a0a6be118
GIT binary patch
literal 3094
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

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/button.png b/tests/manual/workshop/images/button.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ab41cc804991d9da9d2c0dd2140579b8a405cf7
GIT binary patch
literal 3164
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
Czt&*@

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/document-open.png b/tests/manual/workshop/images/document-open.png
new file mode 100644
index 0000000000000000000000000000000000000000..f35f2583540678b7a544d9175245096082f302af
GIT binary patch
literal 1550
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
AC;$Ke

literal 0
HcmV?d00001

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 0000000000000000000000000000000000000000..9fdbb6657744a38310d3fa4ab8b7558e5966987e
GIT binary patch
literal 3355
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

literal 0
HcmV?d00001

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 0000000000000000000000000000000000000000..5c9f6b343bdff4e1295342362486b2cc37387ecb
GIT binary patch
literal 1837
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
bhk^JvK%sGhfx2y<00000NkvXXu0mjf^huI9

literal 0
HcmV?d00001

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 0000000000000000000000000000000000000000..a15e34c924abc6f343e2a3ff35368035930488d6
GIT binary patch
literal 4500
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

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/folder_new.png b/tests/manual/workshop/images/folder_new.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d8bb9bd768d8e8ab785d95483ead02ae6800dc5
GIT binary patch
literal 1199
zcmV;g1W@~lP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H101k9TSaeirbZlh+MsI9nWpZ;NRH|S>0000NbVXQnL3MO!Z*l-k
zVQ_CCLt$)TZDDR?a%E}Xks2xh001d;MObu1WpiV4X>fFDZ*BlWVRL0<Aa7<MN?~ht
zVjxp=Wod3@av)@7b7^O8po9f;000BJNkl<ZNQteLO^6&t6vuznRnt8)&TMwwuc%3g
z2L+Xg#E;-dLX;fTm|zS9BAz685^_-q9uyG|f}n_a(2IhCBC^TJQ#K*NgBpV$m_(v6
zF_>g`c6MfW=cA{)s-B0L%+9*2hHM@b)l|QFzxV#Hs#}Q&%d^*l_WY_}>aDt3Kzece
zdac!cscYUPuC`9W*HJk92_px7S~kFycI-lAJK{H5*Ic8E&yrT&@tI8VfYQZJ^~l(l
zmwip|#uxVO*{fCXra&~m+D)M1J<q-M(o_YJ-N2KO!4!9)i@N~{((3y=LS69o(vGrO
zId*svK%9I1q0Ns(S_gRVJHz3<CyrYKCr=*#c)D6YRLJYc6$)i;#1wY6Gc7ztQu%<|
z%y&DLl1=G}{I<c{8{aGdSnG2joc`^XMY0r&{j9rVbuJV9ywwc6OOU;Hp@YhjUvn5_
zmSlGSu)Fa5e&B{+0l-;iW~wBuWYH*3O%mybvOb5M`wVbPbq9Q%v^M5~Aos%}iJWyz
zPnT&lnhUmh??_V18P(#pwbv7wBlyxQWQX7A(KiM^NB!bn;@KZtgZ+2Eya-^er8GH7
zlC*j|g9-v3-n@mitA`mX97b^#d=1<bC_pSCF-RR`hQG?I@|iw=uCEvH;=Vmk_YbTv
z^=7?SSd7u!zu^H^j*c=>Dx=aIqXmef0C9hk*2YO{UlA4_C6ix|QhDZT75Y{knO;zV
zv+nIDwr*o+Xk<RT0tAvIrcx~-;+dSeiBNA~Me-5N@`spkluS5CYx+HE6D1(W!Ed+l
z;A8C=T|gYSMuNaIIeC7G=JoW+8O}}J!${vsiuq|GV&Vj1n`bT_pe1)QG4*-ZzYDO|
z5=A+jv;PSIur9}i$}L25F=3`HX`JRsZH}R#eyp88Ve^30k;@fGlK6iC-D=3tOpEiu
z3}|hzc0S22AnjCOOy-IKOPPqrrb_^9>IedjUM9eK|1T0*i-^A_6{Jg5fY7Kn>iICt
z0`2?LKBu5iorT^=AeX<i(tZ*V>h&5TG%mXZ?KsMa$kgwrf2GxI;;lnGC<)NYV01`m
za%95-+3-3-lf~!|tqgdDcY;eT&3cV<f1E+Ql$25iz$m2@5LK(QhsMXppV_!^MhC$^
z)4eit&U5tW_pVy49t0w#lrtSQ^zq{-zHrWOI)DDs%~ut@W6fss?6G5~#sE!6WCeu4
zAaHAEUXE3OQ$QI=l!%~|3TQVxL#HpxFb|}F6%pV4>34c@%}hFh{|2rA&Q3Ns=Tray
N002ovPDHLkV1nxxBC7xZ

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/go-next.png b/tests/manual/workshop/images/go-next.png
new file mode 100644
index 0000000000000000000000000000000000000000..a68e2db77531cb15a2cddd62f567f030513b60fa
GIT binary patch
literal 1219
zcmV;!1U&nRP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS000DfNkl<ZScUDDe`r-@7{@>Fd(Ls*Wa_5Q6f;u`ihh?a=O`)@EeXr|Ly9sZ
zC=5b3BMHKwqR9S{L?bMO<qxEV7-g(!vo_pvD(0`y&6!g-o7%R!yL*1T@7o{uoOyTM
z=A7VPd*Hdx%RT3LzTfkGp7Xv325ry=Xaz;KnNe&#cfEDw^(0Rod*{Z&VtXYZ23o@!
zXyPpea^;7weQU>)t&cFZZhGEqz3tp@_}5zJx)hL7Fu!o|&;^gZF(;OA_T|6Jgd0l0
zQ!YoFtGH)szVrIL_irC&WgjdkwrAWh0$K+ogE&W<Dj7LqxP1GCk8(y0A6s6q%v#jn
z8a)nAL6L0`boQBPh<*CjcN}Oe!&5HCXvSnuWK3)lo6FWD>zfXLJ-$IL-MSSuAOasO
zUW;WpNF+iC1OlQMW=di6=cym@wTspYgC;v`G*d=DNO?_Zvij)GJxLkNul<bH-U!&e
zQ#0&7u?Z=xE*C<ik-02|)*5XL+9+B&PSc*ez@rb%9Xcv!Y~jyUoBzsRE}yLa+&$hC
zOs_MbjKWtQzV-;Thp%0Hm0AaQC_Ho+mGDr)MUlGR?p~ng)OIFLxXpfP&XNhkoUGcJ
zMfOwIM8FuG0#hEoa`Ckrf`l%70^y;Aj}|@(m$=`;#bhJrJ5F-0t&ZKtH{n@v@#?&H
zvU5h{ZJW8=S=#RwXsrmehd?5w#1>YHuasf`1<C|;c$a8Pwvh1K(Mq9}NpooayMa6M
zrt|XLC9!Q4B_C6Kd{*VE;F+ru@U=_AYr~Q@j^hw$g9#Ky1q8;$)p0zPzz6_?v<YVf
zQa>7F3`RqsJv{BAO(1|N{Zb&|wbRsAkC0$F63Z4?wm{kfX$hnR>7?EXgTQEmj=+Th
zBftpm9{&V+vB_-Nv97bV{o?A%Rl$m@5$HA-(h^83jJCiEqm%*>-f0XN9VuV{gDqk_
zJn32dxHjLHZRkvNbiP@=T5SSMUj#(@e?q4Adnv=Gj=;NA5Fr7B(czN=!<<~E-TXZD
zC+mWWnzFXmMzi41W>rh-@Kfm|G6~3Z1zvn$MHf({f{-csg-rFk?97+=fs0nDnqy)U
zxi|M|D);X84j!qkJM~Af@JtP7!@A)lU)~*iYJmV)yXBJ}E_Ju!B`dHTfewf7*6jP3
z6w7D(FQv(b(+xY1Y*fqITZpIEC1dx^Bwzqt^+hlo7y>w<r>`BrDJ-@t5M)`FKpTs@
zMm|o=9Y;y&2KV28F0QHlMy&(<ux7e<I~y_y=+G4qglr@4BG^?#2!>|e#QnLmxOBGD
zl>D?laqd`h>9HTwt}s7xmA3A42uTCJLYcHe7Jw~=FfC^x`}gk)cK!ZqOXEKM%E@wd
zA_Lq{i&uOx^+dn`UI-Wg2jRUI(I5$o@}aDv+&yq)@4@;V{-UPC{FgyAiZ1kgEcfSQ
z(!K&5WI>UAAuo5F-*o<L$)WY?y?C5}%PovZ`@I48r9h@dQbx1T^{O^EH!a_@T75<L
h0gF@{v_b2a{SV9&9x2I+Scw1t002ovPDHLkV1o1PM3evk

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/go-previous.png b/tests/manual/workshop/images/go-previous.png
new file mode 100644
index 0000000000000000000000000000000000000000..c37bc0414c24b6e4f34096d0c0f20fbe0bf84045
GIT binary patch
literal 1200
zcmV;h1W)^kP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS000DMNkl<ZScUDDZD`e19LGQBod18j&diD&q$0z#6%iC!v)!p>R-4&_N(%y0
z5>0!N*ydiwAf#TXK|#<H%r`|%$}sRnN|xwF1BnId7G>&u+I8MN-n)D6dFaLezuUdn
zt@c3g_Jtq6Kj+W+{l4e-bPh~m3X{a*Mpa+k;JJzJmy_@<qC32u3+}pqukV#k*vNzk
zJl)9jnkMhS;`>&-_4*5MM?B?En1DCl4OLCdP2wL~vvkw^MfWcAl~faU4&#hKb))y#
zbnn)-H&(y1@ZriOetXwRtkaVsFy;tE8`Sz)GiQIa^~L5g<tsY6PLeTc93a5_e*~J5
z(WJM#a?V3rHq`Bi^kw3l@BSTQHO^UZ4hL#1op5}&7ULoiZDIz4-u{{g>Z+fMZirm!
zX(y4oiggBS4aRAtkTk#c3D#L02J37n1{Z2$4ez$RIW(>a)NGH;cfuTAyKLi}MU_wZ
z9bG3#X8LfroMGz>vA@2>SdFn79cp8<Xq(OH<@dZg>LEuYP}Ar=UgG=Tt*hHHWA>f%
zMBC*b$(nTd*Ws`r92SGc;H1W)aW2rq<g7C|EY6Ldotp?m8~iPI%q-utu6Fx0=|kJ)
zBSEf(KnM^L5C9e{3>F)Z5E>^9<fSJFzXmK0M(o!D0?{V_tBUf<=hv@nj9ltFOK104
z1Og!hQU+Q8LJ*t`OUm?<%=9v(lW3F18i#NS>3kF=VQpA&j5w_d2v}>Yg$IL~1bsu-
z(Ix`~&Xo`W861O|9{MwJ`m@)`*i_I74x9yR9acN6aTx9Jh>+H)v87<{c~fzYv%5at
zzjO1mOJ6Ee(&x;z7^NjX(gQ;pEz%$jQVE0<cv9dH;2hS1FkyxO=OCL+<r7d8&5VLc
z*xHIYwo7mC?MrOk_ru<#Z_3=G6?LTTAOqQMG7KV=MR^kCi9mdT=Zk;Vlt6j{sRUAi
zR0XZ?Q&bBhjba(wW4`XclBxavr+tYlSFh?P7p~{FvRR?gz=854$`>eKqI`+;L&rJi
zLF$6qDTsJM)JJMV3CL3|x^3PPmK?K(TW=(~?p|8;O6hOi2Z^WuMCCbIS<wKFum*xO
z1lnPBSQEw-*bc>xMj(d^M~U}#=vBJDZBI{MqIT6&Ya^XQzjA)?mw<#9)WLfnH2<5K
ze2i%nyO5m&Z0|LOPJC##WjA(i{$ik|Va=-g$nE9jobEq_P$rk-<GXbf(4l1WB$M}T
z^X%tBQVdfh8qlXc*PnKt?%DL^H!TB$ap$Va>zU@?5)7sQNni*_7dh2=V#2i?Mte=T
z5x!mgjJqHe2QR12tca+xvPTv?qe@gMM`K607_;veow%4pHY8WjhNIPh3k}#j(SUdE
zXWc$<iRI27{j94yUbVWmK9U!K;qVqmaG20dm%@L&r-mJyaI*n)GC}HM%(j*;xG}xs
zkM;+XLj&H$nB7@)@^qd|?%7lX5fb+RfAKc;a`+hW!?oOXHH9gR1%CsLV@9Tom>C)X
O0000<MNUMnLSTYFF-HFY

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/preferences-system.png b/tests/manual/workshop/images/preferences-system.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e52db7cfd482e228dae640a7717ea1dcaf523e8
GIT binary patch
literal 2129
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
Hu0mjfPcQ*~

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/process-stop.png b/tests/manual/workshop/images/process-stop.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7a8d1722f328be5fa649f774e2fa6bcf049ebef
GIT binary patch
literal 1927
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
N002ovPDHLkV1lnLttkKi

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/progress-background.png b/tests/manual/workshop/images/progress-background.png
new file mode 100644
index 0000000000000000000000000000000000000000..55a069dfce0cba716f426a78c04346cadb60cfad
GIT binary patch
literal 456
zcmV;(0XP1MP)<h;3K|Lk000e1NJLTq004#n000>X1^@s6^hs6+00006VoOIv0G$AQ
z03$D1xR?L{010qNS#tmY3ljhU3ljkVnw%H_000McNliru-3A2=F9gPcrPBZa0aZyv
zK~!ko?b)$v!!QsA;9o+Xx&`tEeuB`+tM~4Gfe>iv+&NPp!LQKCL!n!ScF>q1OXf_0
z7&2r?K;d+qY-*fBN<usM|G;>(bvjNb$&AP2bTXMdc<-OkW&y+t-<OD2`iK7-!!^J2
z7h?qgWLfrF6vfmmm&=!`svbw9(G95g=JR<q91f?ZEX$bZxnW4CHk-}V0f2}w8r10{
zh&mhqs462tObj|RF=C921hL1UGb)Cva#unvstRsbiAxFnVkrqBV7J>b64VGGuwu{;
z6+=Xt?W(H67+#z7wc)JiUPQVFTs-XRcXBipqs|ak3;Lb|O=4JUSuLnJx^N<b`XOq1
z3{~Y_33Zkf$7(?*D+a*ZRqAp8a5x-VI}$db{c>vV-G0A++iW&>gTa6iB5b!?c<(>m
yVzIbS)AVDtTHPLxM@FW{k|e=;y?(dWK7RpGO4a*{$2V610000<MNUMnLSTZ|M7m=D

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/progress-fill.png b/tests/manual/workshop/images/progress-fill.png
new file mode 100644
index 0000000000000000000000000000000000000000..b588c9586d9c9ba0d07966f448c19e23320bf6e3
GIT binary patch
literal 507
zcmV<X0R;YuP)<h;3K|Lk000e1NJLTq004#n000>X1^@s6^hs6+00006VoOIv0G$AQ
z03$D1xR?L{010qNS#tmY3ljhU3ljkVnw%H_000McNliru-3A2=E;biU#S#Dj0f<RN
zK~!ko?U_AD!%!53&kN5Y=vEyZg@UU{2f^9Zy?a4H5l6wTAn4|(=q`d=!NtjfxQL5%
zaFEhTrL;&bYLoZlkj5mof?(0%oo~q!NZz@ZbAO)LEl%W$D;ukKmj~-e;{h<geEtSA
zq<{FYGYs=Pe{og-z|6w($<h8^Njz5%citN}YuWtP7>M&UueTeclXE3eKb<#Ii^qbJ
zkcfx#f|USZO_yqr6cS-(PzlnX7}i=ULFgFdr;cF)Dna^o70EG{IFIQ$hE=edjzJPw
z)hi{M<0=_gN(lMVd>X%vpnXpzNZe)kZH}wtJIBy|Jg!;;2v!$28_qcPM*ERtsPqfO
z-Q<WIBbrLAwGe`rtWM`eA_wAe)yweCgnX_pq|#wcf%d5i0RSisNNX)%m=q*kQl!${
ze3Ai<5jLZ|D<Nql0O+>{AY{Tz6qRv_0kM}auc|Dcs!QY9X)d^&ZY;vscbYYnuR0Z3
xx$PEabFB-%-pcy{$5offj0n^ogEP+)n;+LZ&ue)7Pl5md002ovPDHLkV1m7^)K~xj

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/slider-handle.png b/tests/manual/workshop/images/slider-handle.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac4d4a0d981cf7257756d5ecd7951154b70b87d5
GIT binary patch
literal 3523
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

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/tab.png b/tests/manual/workshop/images/tab.png
new file mode 100644
index 0000000000000000000000000000000000000000..74fefab78a719e4883756d2bcc1b968835dd4fa0
GIT binary patch
literal 9877
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

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/tab_selected.png b/tests/manual/workshop/images/tab_selected.png
new file mode 100644
index 0000000000000000000000000000000000000000..665400ccfd2da9264fa4cf0e653e2573a8f7daf7
GIT binary patch
literal 10184
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
b^E0#tYFFn$sSL*Nmu6{k1+j7wqk#VhN-ggt

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/textfield.png b/tests/manual/workshop/images/textfield.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d4a38ab38bea53d34f71c84e4f88669b99f3447
GIT binary patch
literal 3023
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
R;yM5T002ovPDHLkV1mLVmXQDe

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/toplevel_window.png b/tests/manual/workshop/images/toplevel_window.png
new file mode 100644
index 0000000000000000000000000000000000000000..4dc6a8cee217d45990972ff43f27d06c6a851b61
GIT binary patch
literal 3690
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
IM6N<$g0L_WG5`Po

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/images/view-refresh.png b/tests/manual/workshop/images/view-refresh.png
new file mode 100644
index 0000000000000000000000000000000000000000..606ea9eba46b82eea04678e64369b97e595f9da5
GIT binary patch
literal 2024
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
GLSTY33DUU$

literal 0
HcmV?d00001

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 0000000000000000000000000000000000000000..36503018ef4157fa20f6cfdaf9fb851137384c53
GIT binary patch
literal 1900
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

literal 0
HcmV?d00001

diff --git a/tests/manual/workshop/main.qml b/tests/manual/workshop/main.qml
new file mode 100644
index 000000000..723a8886b
--- /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 000000000..d8b3665ca
--- /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 000000000..66d903eac
--- /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 000000000..c3abc14ce
--- /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 000000000..57d803b22
--- /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>
-- 
GitLab