From b35cbc765843d0e79ac6655660dc6d553e8a04a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristian=20M=C4=83gheru=C8=99an-Stanciu?= Date: Sun, 21 Sep 2014 02:21:07 +0200 Subject: [PATCH] Ported some of the qtquickcontrols examples --- examples/controls/.gitignore | 5 + examples/controls/README.md | 8 + .../controls/basiclayouts/basiclayouts.go | 29 ++ examples/controls/basiclayouts/main.qml | 116 +++++ .../controls/gallery/content/AboutDialog.qml | 48 +++ .../controls/gallery/content/ChildWindow.qml | 122 ++++++ .../controls/gallery/content/Controls.qml | 229 ++++++++++ .../controls/gallery/content/ImageViewer.qml | 58 +++ examples/controls/gallery/content/Layouts.qml | 107 +++++ .../controls/gallery/content/ModelView.qml | 103 +++++ examples/controls/gallery/content/Styles.qml | 387 +++++++++++++++++ examples/controls/gallery/gallery.go | 29 ++ examples/controls/gallery/images/bubble.png | Bin 0 -> 214 bytes .../gallery/images/button-pressed.png | Bin 0 -> 3094 bytes examples/controls/gallery/images/button.png | Bin 0 -> 3164 bytes .../controls/gallery/images/document-open.png | Bin 0 -> 1550 bytes .../gallery/images/document-open@2x.png | Bin 0 -> 3355 bytes .../gallery/images/document-save-as.png | Bin 0 -> 1837 bytes .../gallery/images/document-save-as@2x.png | Bin 0 -> 4500 bytes .../controls/gallery/images/folder_new.png | Bin 0 -> 1199 bytes examples/controls/gallery/images/go-next.png | Bin 0 -> 1219 bytes .../controls/gallery/images/go-previous.png | Bin 0 -> 1200 bytes .../gallery/images/preferences-system.png | Bin 0 -> 2129 bytes .../controls/gallery/images/process-stop.png | Bin 0 -> 1927 bytes .../gallery/images/progress-background.png | Bin 0 -> 456 bytes .../controls/gallery/images/progress-fill.png | Bin 0 -> 507 bytes .../controls/gallery/images/slider-handle.png | Bin 0 -> 3523 bytes examples/controls/gallery/images/tab.png | Bin 0 -> 9877 bytes .../controls/gallery/images/tab_selected.png | Bin 0 -> 10184 bytes .../controls/gallery/images/textfield.png | Bin 0 -> 3023 bytes .../gallery/images/toplevel_window.png | Bin 0 -> 3690 bytes .../controls/gallery/images/view-refresh.png | Bin 0 -> 2024 bytes .../controls/gallery/images/window-new.png | Bin 0 -> 671 bytes .../controls/gallery/images/window-new@2x.png | Bin 0 -> 1900 bytes examples/controls/gallery/main.qml | 266 ++++++++++++ examples/controls/splitview/main.qml | 82 ++++ examples/controls/splitview/splitview.go | 29 ++ examples/controls/tableview/images/header.png | Bin 0 -> 356 bytes .../controls/tableview/images/selectedrow.png | Bin 0 -> 303 bytes examples/controls/tableview/main.qml | 405 ++++++++++++++++++ examples/controls/tableview/tableview.go | 29 ++ .../touch/content/AndroidDelegate.qml | 92 ++++ .../controls/touch/content/ButtonPage.qml | 176 ++++++++ examples/controls/touch/content/ListPage.qml | 82 ++++ .../touch/content/ProgressBarPage.qml | 114 +++++ .../controls/touch/content/SliderPage.qml | 106 +++++ .../controls/touch/content/TabBarPage.qml | 102 +++++ .../controls/touch/content/TextInputPage.qml | 106 +++++ examples/controls/touch/images/NOTICE.txt | 2 + .../controls/touch/images/button_default.png | Bin 0 -> 1406 bytes .../controls/touch/images/button_pressed.png | Bin 0 -> 1694 bytes .../touch/images/navigation_next_item.png | Bin 0 -> 1341 bytes .../touch/images/navigation_previous_item.png | Bin 0 -> 1343 bytes .../controls/touch/images/tab_selected.png | Bin 0 -> 217 bytes .../controls/touch/images/tabs_standard.png | Bin 0 -> 1230 bytes examples/controls/touch/images/textinput.png | Bin 0 -> 4132 bytes examples/controls/touch/images/toolbar.png | Bin 0 -> 1643 bytes examples/controls/touch/main.qml | 147 +++++++ examples/controls/touch/touch.go | 29 ++ 59 files changed, 3008 insertions(+) create mode 100644 examples/controls/.gitignore create mode 100644 examples/controls/README.md create mode 100644 examples/controls/basiclayouts/basiclayouts.go create mode 100644 examples/controls/basiclayouts/main.qml create mode 100644 examples/controls/gallery/content/AboutDialog.qml create mode 100644 examples/controls/gallery/content/ChildWindow.qml create mode 100644 examples/controls/gallery/content/Controls.qml create mode 100644 examples/controls/gallery/content/ImageViewer.qml create mode 100644 examples/controls/gallery/content/Layouts.qml create mode 100644 examples/controls/gallery/content/ModelView.qml create mode 100644 examples/controls/gallery/content/Styles.qml create mode 100644 examples/controls/gallery/gallery.go create mode 100644 examples/controls/gallery/images/bubble.png create mode 100644 examples/controls/gallery/images/button-pressed.png create mode 100644 examples/controls/gallery/images/button.png create mode 100644 examples/controls/gallery/images/document-open.png create mode 100644 examples/controls/gallery/images/document-open@2x.png create mode 100644 examples/controls/gallery/images/document-save-as.png create mode 100644 examples/controls/gallery/images/document-save-as@2x.png create mode 100644 examples/controls/gallery/images/folder_new.png create mode 100644 examples/controls/gallery/images/go-next.png create mode 100644 examples/controls/gallery/images/go-previous.png create mode 100644 examples/controls/gallery/images/preferences-system.png create mode 100644 examples/controls/gallery/images/process-stop.png create mode 100644 examples/controls/gallery/images/progress-background.png create mode 100644 examples/controls/gallery/images/progress-fill.png create mode 100644 examples/controls/gallery/images/slider-handle.png create mode 100644 examples/controls/gallery/images/tab.png create mode 100644 examples/controls/gallery/images/tab_selected.png create mode 100644 examples/controls/gallery/images/textfield.png create mode 100644 examples/controls/gallery/images/toplevel_window.png create mode 100644 examples/controls/gallery/images/view-refresh.png create mode 100644 examples/controls/gallery/images/window-new.png create mode 100644 examples/controls/gallery/images/window-new@2x.png create mode 100644 examples/controls/gallery/main.qml create mode 100644 examples/controls/splitview/main.qml create mode 100644 examples/controls/splitview/splitview.go create mode 100644 examples/controls/tableview/images/header.png create mode 100644 examples/controls/tableview/images/selectedrow.png create mode 100644 examples/controls/tableview/main.qml create mode 100644 examples/controls/tableview/tableview.go create mode 100644 examples/controls/touch/content/AndroidDelegate.qml create mode 100644 examples/controls/touch/content/ButtonPage.qml create mode 100644 examples/controls/touch/content/ListPage.qml create mode 100644 examples/controls/touch/content/ProgressBarPage.qml create mode 100644 examples/controls/touch/content/SliderPage.qml create mode 100644 examples/controls/touch/content/TabBarPage.qml create mode 100644 examples/controls/touch/content/TextInputPage.qml create mode 100644 examples/controls/touch/images/NOTICE.txt create mode 100644 examples/controls/touch/images/button_default.png create mode 100644 examples/controls/touch/images/button_pressed.png create mode 100644 examples/controls/touch/images/navigation_next_item.png create mode 100644 examples/controls/touch/images/navigation_previous_item.png create mode 100644 examples/controls/touch/images/tab_selected.png create mode 100644 examples/controls/touch/images/tabs_standard.png create mode 100644 examples/controls/touch/images/textinput.png create mode 100644 examples/controls/touch/images/toolbar.png create mode 100644 examples/controls/touch/main.qml create mode 100644 examples/controls/touch/touch.go diff --git a/examples/controls/.gitignore b/examples/controls/.gitignore new file mode 100644 index 00000000..309fbb35 --- /dev/null +++ b/examples/controls/.gitignore @@ -0,0 +1,5 @@ +basiclayouts/basiclayouts +gallery/gallery +splitview/splitview +tableview/tableview +touch/touch diff --git a/examples/controls/README.md b/examples/controls/README.md new file mode 100644 index 00000000..201846d8 --- /dev/null +++ b/examples/controls/README.md @@ -0,0 +1,8 @@ +These examples were ported from [qtquickcontrols](git@gitorious.org:qt/qtquickcontrols.git). + +Only the basic ones were ported, in order to demonstrate how easy it is to create a full-fledged UI with Go and QML. + +There were a few more, but they that had native modules and those were omitted due to laziness. + +In order to run them you might need some extra Qt5 plugins. On Ubuntu those can be installed using this command: + sudo apt-get install qtdeclarative5-controls-plugin qtdeclarative5-xmllistmodel-plugin diff --git a/examples/controls/basiclayouts/basiclayouts.go b/examples/controls/basiclayouts/basiclayouts.go new file mode 100644 index 00000000..a16b6b1a --- /dev/null +++ b/examples/controls/basiclayouts/basiclayouts.go @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "gopkg.in/qml.v1" + "os" +) + +func main() { + if err := qml.Run(run); err != nil { + fmt.Fprintf(os.Stderr, "error: %v\n", err) + os.Exit(1) + } +} + +func run() error { + engine := qml.NewEngine() + + controls, err := engine.LoadFile("main.qml") + if err != nil { + return err + } + + window := controls.CreateWindow(nil) + + window.Show() + window.Wait() + return nil +} diff --git a/examples/controls/basiclayouts/main.qml b/examples/controls/basiclayouts/main.qml new file mode 100644 index 00000000..ecbbb75a --- /dev/null +++ b/examples/controls/basiclayouts/main.qml @@ -0,0 +1,116 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + + + + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Layouts 1.0 + +ApplicationWindow { + visible: true + title: "Basic layouts" + property int margin: 11 + width: mainLayout.implicitWidth + 2 * margin + height: mainLayout.implicitHeight + 2 * margin + minimumWidth: mainLayout.Layout.minimumWidth + 2 * margin + minimumHeight: mainLayout.Layout.minimumHeight + 2 * margin + + ColumnLayout { + id: mainLayout + anchors.fill: parent + anchors.margins: margin + GroupBox { + id: rowBox + title: "Row layout" + Layout.fillWidth: true + + RowLayout { + id: rowLayout + anchors.fill: parent + TextField { + placeholderText: "This wants to grow horizontally" + Layout.fillWidth: true + } + Button { + text: "Button" + } + } + } + + GroupBox { + id: gridBox + title: "Grid layout" + Layout.fillWidth: true + + GridLayout { + id: gridLayout + rows: 3 + flow: GridLayout.TopToBottom + anchors.fill: parent + + Label { text: "Line 1" } + Label { text: "Line 2" } + Label { text: "Line 3" } + + TextField { } + TextField { } + TextField { } + + TextArea { + text: "This widget spans over three rows in the GridLayout.\n" + + "All items in the GridLayout are implicitly positioned from top to bottom." + Layout.rowSpan: 3 + Layout.fillHeight: true + Layout.fillWidth: true + } + } + } + TextArea { + id: t3 + text: "This fills the whole cell" + Layout.minimumHeight: 30 + Layout.fillHeight: true + Layout.fillWidth: true + } + } +} diff --git a/examples/controls/gallery/content/AboutDialog.qml b/examples/controls/gallery/content/AboutDialog.qml new file mode 100644 index 00000000..aec7b604 --- /dev/null +++ b/examples/controls/gallery/content/AboutDialog.qml @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.2 +import QtQuick.Dialogs 1.1 + +MessageDialog { + icon: StandardIcon.Information + text: "QtQuick.Controls gallery example" + detailedText: "This example demonstrates most of the available Qt Quick Controls." + title: "About Gallery" +} diff --git a/examples/controls/gallery/content/ChildWindow.qml b/examples/controls/gallery/content/ChildWindow.qml new file mode 100644 index 00000000..08925f63 --- /dev/null +++ b/examples/controls/gallery/content/ChildWindow.qml @@ -0,0 +1,122 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + + + + +import QtQuick 2.2 +import QtQuick.Window 2.1 +import QtQuick.Controls 1.1 + +Window { + id: window1 + + width: 400 + height: 400 + + title: "child window" + flags: Qt.Dialog + + Rectangle { + color: syspal.window + anchors.fill: parent + + Label { + id: dimensionsText + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + width: parent.width + horizontalAlignment: Text.AlignHCenter + } + + Label { + id: availableDimensionsText + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: dimensionsText.bottom + width: parent.width + horizontalAlignment: Text.AlignHCenter + } + + Label { + id: closeText + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: availableDimensionsText.bottom + text: "This is a new Window, press the\nbutton below to close it again." + } + Button { + anchors.horizontalCenter: closeText.horizontalCenter + anchors.top: closeText.bottom + id: closeWindowButton + text:"Close" + width: 98 + tooltip:"Press me, to close this window again" + onClicked: window1.visible = false + } + Button { + anchors.horizontalCenter: closeText.horizontalCenter + anchors.top: closeWindowButton.bottom + id: maximizeWindowButton + text:"Maximize" + width: 98 + tooltip:"Press me, to maximize this window again" + onClicked: window1.visibility = Window.Maximized; + } + Button { + anchors.horizontalCenter: closeText.horizontalCenter + anchors.top: maximizeWindowButton.bottom + id: normalizeWindowButton + text:"Normalize" + width: 98 + tooltip:"Press me, to normalize this window again" + onClicked: window1.visibility = Window.Windowed; + } + Button { + anchors.horizontalCenter: closeText.horizontalCenter + anchors.top: normalizeWindowButton.bottom + id: minimizeWindowButton + text:"Minimize" + width: 98 + tooltip:"Press me, to minimize this window again" + onClicked: window1.visibility = Window.Minimized; + } + } +} + diff --git a/examples/controls/gallery/content/Controls.qml b/examples/controls/gallery/content/Controls.qml new file mode 100644 index 00000000..b7e46188 --- /dev/null +++ b/examples/controls/gallery/content/Controls.qml @@ -0,0 +1,229 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + + + + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +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 + + 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 + MouseArea { + id: contextMenu + parent: area.viewport + anchors.fill: parent + acceptedButtons: Qt.RightButton + onPressed: editmenu.popup() + } + } + } + } +} diff --git a/examples/controls/gallery/content/ImageViewer.qml b/examples/controls/gallery/content/ImageViewer.qml new file mode 100644 index 00000000..01f24ab3 --- /dev/null +++ b/examples/controls/gallery/content/ImageViewer.qml @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.2 +import QtQuick.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/examples/controls/gallery/content/Layouts.qml b/examples/controls/gallery/content/Layouts.qml new file mode 100644 index 00000000..0cb234c3 --- /dev/null +++ b/examples/controls/gallery/content/Layouts.qml @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Layouts 1.0 + +Item { + id:root + anchors.fill: parent + anchors.margins: 8 + + ColumnLayout { + id: mainLayout + anchors.fill: parent + spacing: 4 + GroupBox { + id: rowBox + title: "Row layout" + Layout.fillWidth: true + RowLayout { + id: rowLayout + anchors.fill: parent + TextField { + placeholderText: "This wants to grow horizontally" + Layout.fillWidth: true + } + Button { + text: "Button" + } + } + } + + GroupBox { + id: gridBox + title: "Grid layout" + Layout.fillWidth: true + + GridLayout { + id: gridLayout + anchors.fill: parent + rows: 3 + flow: GridLayout.TopToBottom + + Label { text: "Line 1" } + Label { text: "Line 2" } + Label { text: "Line 3" } + + TextField { } + TextField { } + TextField { } + + TextArea { + text: "This widget spans over three rows in the GridLayout.\n" + + "All items in the GridLayout are implicitly positioned from top to bottom." + Layout.rowSpan: 3 + Layout.fillHeight: true + Layout.fillWidth: true + } + } + } + TextArea { + id: t3 + text: "This fills the whole cell" + Layout.minimumHeight: 30 + Layout.fillHeight: true + Layout.fillWidth: true + } + } +} diff --git a/examples/controls/gallery/content/ModelView.qml b/examples/controls/gallery/content/ModelView.qml new file mode 100644 index 00000000..be334458 --- /dev/null +++ b/examples/controls/gallery/content/ModelView.qml @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + + + + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +//import QtQuick.XmlListModel 2.1 + +Item { + id: root + width: 600 + height: 300 + anchors.fill: parent + anchors.margins: Qt.platform.os === "osx" ? 12 : 6 + +// XmlListModel { +// id: flickerModel +// source: "http://api.flickr.com/services/feeds/photos_public.gne?format=rss2&tags=" + "Cat" +// query: "/rss/channel/item" +// namespaceDeclarations: "declare namespace media=\"http://search.yahoo.com/mrss/\";" +// XmlRole { name: "title"; query: "title/string()" } +// XmlRole { name: "imagesource"; query: "media:thumbnail/@url/string()" } +// XmlRole { name: "credit"; query: "media:credit/string()" } +// } + + 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/examples/controls/gallery/content/Styles.qml b/examples/controls/gallery/content/Styles.qml new file mode 100644 index 00000000..ed237d82 --- /dev/null +++ b/examples/controls/gallery/content/Styles.qml @@ -0,0 +1,387 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + + + + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +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/examples/controls/gallery/gallery.go b/examples/controls/gallery/gallery.go new file mode 100644 index 00000000..a16b6b1a --- /dev/null +++ b/examples/controls/gallery/gallery.go @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "gopkg.in/qml.v1" + "os" +) + +func main() { + if err := qml.Run(run); err != nil { + fmt.Fprintf(os.Stderr, "error: %v\n", err) + os.Exit(1) + } +} + +func run() error { + engine := qml.NewEngine() + + controls, err := engine.LoadFile("main.qml") + if err != nil { + return err + } + + window := controls.CreateWindow(nil) + + window.Show() + window.Wait() + return nil +} diff --git a/examples/controls/gallery/images/bubble.png b/examples/controls/gallery/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`PlBg3pY5H=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/examples/controls/gallery/images/button-pressed.png b/examples/controls/gallery/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/examples/controls/gallery/images/document-save-as.png b/examples/controls/gallery/images/document-save-as.png new file mode 100644 index 0000000000000000000000000000000000000000..5c9f6b343bdff4e1295342362486b2cc37387ecb GIT binary patch literal 1837 zcmV+|2h#Y7P)W5YejnogQRf&kAw6ru-H~|Vtq)@O46<|mV0o#}a z?Bi~Ix4Sdb57<}RkYbvk{-x2*>^*wschAiHH4Fb|i8}>Uu6VIt8?jCb(+DDnAZ3(3 zj1jMP@7wb3Jp(9P(pG5O?jNF&oH?^uKz#9J|QnC2i$pz7d-u^^Q*QNeL*9V;K*9TLtcVE65K6Ade@_~wyfE}>N zxQb-jqcA^0EE)=bcbCAthFs{B{S`oCF(q*mw)`19~~b3d&SaUK3P~4 z{q6ddb8@fW$lxoDF@}=DD8GB{aN?7}p}BXv6ms;yx{;n`gt_Qz_4xS70lNRT^^e!C z4gKkCcfYbNiRWuFo+dTq@wG2kL@msQyO|uuRiJ$N_Ep-5nul{w>^8={90&v!Se7*g za?pz~H0ePWHOA??mc&;#_d+Nr+5N^_d_C_B#+YopQc8KA_nPB4>-X*3ml+RWj~-}k zU6k7Yr`Gz{>(;GX*xcNVlro#p7(>#@@aX1OkP=*9qqX72kVi>jKGKe`bLUQsF{7Kc zYuBzP+S}XT2VVNG02xnToL%+t4RKA(Uc7iQe}21@@3p;oOWAB&B80&86j~d!G2{d+ zQfZeNtA8~n_8ar7dA4;K?d|QGfE|DtlWX*#|G@KCf|FK#tLd@F3N6c`entsD**KS1 z-sogu!&eB0f>=^uTM_}do<*i%hDKG}!>-dP?zN>uqn={GJ&!@Jwwps|W zaL=AS2R;*ESR0ovT}m>U#Pd9s)K}1d&0+7+fAQ!ewe$}R;iP>G24ik6i<9wr{opyA zj8D9}1m8__@^m-9`Tjz*@=2vqELyaPQ>RXS2N(k|W`nI-wd(%j;^KuD2#;|xRD{@ zxF~&dNlS}zsk|?b14lpL2W#V0-j|0l1|bB-7(CCTsi`R#2n06V7GS}G1-204>3BR& zGMU7-ZHzG}rSN?p<$L^e!)$_hobSHOLo=oj4BRx*yl9YzYD#$P=m#{|lU1G5qb#-->9UUEuZvhZO ze0#}~B_t9F0DRxa7?Vw6j6rKnz%u-NL!7hcFLG@l!HP#J>H4Ub#K0iWG*{!gE}rM% zc^Gap~2Q#Z-ikV5JIet$KxD1a)geK4t(Ed zqFNt^uFfNLb>2DFwr%R_>Zq@;XaD~FPXWIeF`_TUVlj>%KhBypYsksTnJ~cJD3i&s zd-rY{8XC}AKLG!6!W`Fi(ONTU(j*QZJUF3*^XJc}w6v6-o}LNChr?mC*7WuDW%o(e zibu*GjYhHU+d1^DibkVjo)guTD_64p>`Ws>xw*Ln0)Yu7%FWFk^PH$g=7Lc^F!~a4 zucegA_QzCU#4?+koByX|caq~cNGZouAPboNU1wGq1=d5(WSI$uvu4_fOpK*%00%@23%*zuB-vh1Gx^>I>4 zUFz@ee*p-N+=@fMWS{`Z1A@TBj>5#{a`Qtd4J3f8z}3;$asfn#TZr3yHGNL`!z~RY bhk^JvK%sGhfx2y<00000NkvXXu0mjf^huI9 literal 0 HcmV?d00001 diff --git a/examples/controls/gallery/images/document-save-as@2x.png b/examples/controls/gallery/images/document-save-as@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a15e34c924abc6f343e2a3ff35368035930488d6 GIT binary patch literal 4500 zcmV;F5o_*=P)V8d565niv$SIh?oQj;UN!)#{{Frx{e^~%#N<*E?bU| zotn%#xulk0h zXw;;D*vpCdCxv_et-a-O{gx#lf7w5zNs_Sz5F0a6-DXu~p*p!V2WdVxCZ!R>V_F7IE2a=cQGMc0GyN%2?P)T7#AZ12mul6ix?46 z#u3sCI2;P5SL91k-SqXGA81OeT=HN2$94^VD+wt6-j>?|@%t5Zliyptc;>;V!QEOk znl?BX%IWU8;63wIztTS(q7VWemjcxx0{{$@k7@!J5HZbQLO|0^m`tFuB%4OGi0kb6 z;pOhid0U5%?KW;E0rKU(P_pEgsho@doH=R2-UrsseW$(a{M2_pJzjUD{cL_u|4>9Q za##>?27nJB(^ZA0O)kx2cg!f3d?_vrhN3YIK>TiL#ZXv>fWX3mIW&%Wf<31p*Z1EFQ%d)legPQLT`#RPLPMS`=_4L1D z_wLIG_j3#!-}Q;FeCdgfuAX(}6SLv-IuVK(aqvQnI!DF@OvX`GkU{nzIhCDK+WPUp z@m)71D$wyhD82I+1&Si)7v=i9KR(cP8|UQvUpH~-eCw%K7{{;P`{an}bjXk;8VAp8 z8o-6Xh2aPkMaHyAg{A<1=w_L~xC9t7ol%hO`|6#&r*ceY{;sp-sg|o*z);2WonKyv z_MRJnTa^?2fGs?ljH7Qbf+^*>G8JU?#D&eyZ!8KdT-Yq10?8N(>Ctc~a$14+x7KG( zO-&MGY%?L`J^=Zbcch=;v{XoscAUW-)s&&(IST!!daKv1 zGp`UwSP1d9BuPKnwr$(FYbM~d!;_}UA~dLl`>DcrwZAcXa1lbhsH*A{4?g%Hii?XO zNuzE=#K4Sw-gmSYzutBLbwq$tAZm<)kLL&i7z!Jpl%i-t8tSI3NolMvO*)@7X5B-f zP~eR>-q_gD(NWUe+`Opyk`DR`2p|%77>xHb6TI`SXFdm>wRS&~bN=Jan>SsIjpTgb;*6A+#Ro#?DVqT?9TE2?k>@Oa_1?*nc7k0$gx76bVO9 z_v7#W<>Ta8hHYMlBH@Q?ry(^}M{R8_wr}6QpsA^8%C>FW+O9eZbZ`4>jR%!;*me)I z#u^(N=Kz>mQ&R&?(*OW9)AC?4fsYP$Bf==6P@uyBld3R?0|r&Ws1sarqGom(9Eu!w zcnM+9t`Qu_%SuJfta5mKsqm%-;PnUK@%iEQrNWhx3Rj9B17VKV17~piZg1O$Wt1O$c{QE|q3eAh=K!H6Fi2u9#fabjX&7K9)GMk574keTX2-#`!_ z?mdRTY?_JsS^1D<8JecSBohZ{M(D#foQJT3Yn0CcwV?O-)TM&iQ?-SFeU? znutUqAcTNY3Wr0+bC1l!qc85nr~BG*+ssJ_YEkqJjvNsLVh11*dx{^51bD1)GTP_( zqN_h4OxiW1cIpHK!#cLL>_Nlq0<5f=2#3P~&PP&gP18_SRRu*+(mfu}Y5?1=IuWur z#@K2_QBtQ&nSxL#6t_duG{HHCOO^4fCl;f(ZxDyRIEf6O6F!eRveR(@93~U-F*~r4 zJ_i@Ed6_`eV9<0E5#5AtFib1XKz5o7|MT`|m{jP;kJrr@DZFqF(;P_`G);r5s#vgK z0fZ2nt|=27#rZ)E=LW(U2flrzpp=3!X5T32 zx{jKf8UR?@*w|Qf%>=Ajv!(#R(uRfx=(?V;pd?996eS)3GE!am$IW-*|GqellU-*~ zkmZHfrNl@OV2qD~XB?VtU@)kow?B;D{xF8aQ5a@o4pW%z!<@<-e6Z&W3yximL7H?ID%aZpNQUY*A?w7g6& zp8wGTeE3;AjXc$TY+G?487Z%LO!~V8Y zXlp-<=YKd4KDXndaA^4>0MK>yKu|NF=_aBkhq%mv+UIs)adiODga4qsPy)aD^jIjhwv`Dbh@<=3tnKNgCQkpM>xbvzBXl!h(C4`h$S63qx3XNoR zk_18sIOkxD!8FYTp{(cIDl+lR59Z*LeaA64FofHupt8^p!!Y7&S?hDo;{;fm5Q#+K@pv$2&Ya6SLwY&qH+Sw_cs!m2=Vu2z7PxhB z&T+@o96Y$H3LotG0=gE#9aASjRW4nJl_HCRVHgRESwdKSYj><2v4mS)SB!fa z%CYN%&mowB+G!IYOLQEx_0%m@4OwjT}aM3*3}ndarFf3c>f@rGB9si9wd74 z* zlp-7s#}}0(DS>&r4URprS*#I!gM!PoH`*tv@BH`)v(-8~>@$ScMD9=wt_nGtf!>7ma^q);fcEBB< z(*kJ+n`|vbQIL|70>d!k@>!dv>pChbD&X~cU6LfNzwCQ~Kp@bdD9YoTHf@5YY4Hi| ziH~6zP*oL9r}HA49ItR;2~8=5>X0$JJRPs^Zbxt55I#9@5Tolh(NX^PF@qnm68t&h9?kyQmZkX6D5;$_`MLWyrD||GhQt zcDoS>1mJW!5e|owg0~2WMx&^%t_FbWb?es68n+%0vypX+7A=CNX&4+FM1OyOf<4=9 z(TWNdc5(vMfVU6v(n14|Vp!tX(!s z9*4t$jEoFqWo4nHqy!xu9h(3=mXrWlmcO5#p6)6rD8QR+5ms*fAVAas&$(E<|BrVbX%CR}+*{Q&Z8^)fF#x-01e`qmSaHmtI0aLBWlC|0m1foI_C* z=(-L{sX873@|iPd;BYwN@f83LA3luU-rnmfR903NrcRxjP+7WB&B_ql+uJQ?Y>cY` zj4^1M7EdiL0mo)u*ZhYGHqe%LzmXbX7zX3sPu;mNmYk)oN{Vr-iEOoy!6Bv8Ho-Ns-=|(jxD@>*V zbUXsS3mKrD>@i34OA}xnc)m*nSoML}0cl(UWcw-VyGp>NqCip;C@CpHZf@>%70Tsu z-E;zM&q`09Ty_G6hlg?Y?AhzS z^JCjZVc5Kg{J$tOL zkQfuL*yUcfY}w-;kLLj)g!LkxT)pN|_qQb!3L#9>G(Tx?Z{OV3)^-wr20$aW`lKu7 z7@RSGpxPpXgpq#-l5e))9*@WAcDujUK_M3A2qAIkvK$MKh z0h~7AcJMT&2@-CNW_eW+OL~mh6$PNj2r$P}Zz)EC6(Q&?NC1n0w+LW10un;bCNQD>QB+fyb_-?f(JYV-DmU(CSVA00000000NbVXQnL3MO!Z*l-k zVQ_CCLt$)TZDDR?a%E}Xks2xh001d;MObu1WpiV4X>fFDZ*BlWVRL0g`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)M1JDx=aIqXmef0C9hk*2YO{UlA4_C6ix|QhDZT75Y{knO;zV zv+nIDwr*o+XkIedjUM9eK|1T0*i-^A_6{Jg5fY7Kn>iICt z0`2?LKBu5iorT^=AeXh&5TG%mXZ?KsMa$kgwrf2GxI;;lnGC<)NYV01`m za%95-+3-3-lf~!|tqgdDcY;eT&3cV34c@%}hFh{|2rA&Q3Ns=Tray N002ovPDHLkV1nxxBC7xZ literal 0 HcmV?d00001 diff --git a/examples/controls/gallery/images/go-next.png b/examples/controls/gallery/images/go-next.png new file mode 100644 index 0000000000000000000000000000000000000000..a68e2db77531cb15a2cddd62f567f030513b60fa GIT binary patch literal 1219 zcmV;!1U&nRP)Fd(Ls*Wa_5Q6f;u`ihh?a=O`)@EeXr|Ly9sZ zC=5b3BMHKwqR9S{L?bMO)t&cFZZhGEqz3tp@_}5zJx)hL7Fu!o|&;^gZF(;OA_T|6Jgd0l0 zQ!YoFtGH)szVrIL_irC&WgjdkwrAWh0$K+ogE&WzfXLJ-$IL-MSSuAOasO zUW;WpNF+iC1OlQMW=di6=cym@wTspYgC;v`G*d=DNO?_Zvij)GJxLkNulYHuasf`17F3`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`BrDJ-@t5M)`FKpTs@ zMm|o=9Y;y&2KV28F0QHlMy&(|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-*oR-4&_N(%y0 z5>0!N*ydiwAf#TXK|#&u+I8MN-n)D6dFaLezuUdn zt@c3g_Jtq6Kj+W+{l4e-bPh~m3X{a*Mpa+k;JJzJmy_@&-_4*5MM?B?En1DCl4OLCdP2wL~vvkw^MfWcAl~faU4&#hKb))y# zbnn)-H&(y1@ZriOetXwRtkaVsFy;tE8`Sz)GiQIa^~L5gZ+fMZirm! zX(y4oiggBS4aRAtkTk#c3D#L02J37n1{Z2$4ez$RIW(>a)NGH;cfuTAyKLi}MU_wZ z9bG3#X8LfroMGz>vA@2>SdFn79cp8LEuYP}Ar=UgG=Tt*hHHWA>f% zMBC*b$(nTd*Ws`r92SGc;H1W)aW2rqF)Z5E>^93kF=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%$jQVE0eKqI`+;L&rJi zLF$6qDTsJM)JJMV3CL3|x^3PPmK?K(TW=(~?p|8;O6hOi2Z^WuMCCbISxMj(d^M~U}#=vBJDZBI{MqIT6&Ya^XQzjA)?mw<#9)WLfnH2<5K ze2i%nyO5m&Z0|LOPJC##WjA(i{$ik|Va=-g$nE9jobEq_P$rk-zU@?5)7sQNni*_7dh2=V#2i?Mte=T z5x!mgjJqHe2QR12tca+xvPTv?qe@gMM`K607_;veow%4pHY8WjhNIPh3k}#j(SUdE zXWc$C)X O0000vW`Lad_VL}O~L?M$bw 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 literal 0 HcmV?d00001 diff --git a/examples/controls/gallery/images/slider-handle.png b/examples/controls/gallery/images/slider-handle.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4d4a0d981cf7257756d5ecd7951154b70b87d5 GIT binary patch literal 3523 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 z zq)MeirBaD>UGHS6RH90yLZ)fb$;nAmQIu@}lf8f#5&1Ov^t@6O<-^|I-WSe!*f0z{ z)jW(b#N%<8rg@jiWYlan`xU^QPahGH58?xaWm$f+zrX)|Zf-78tJUz_h{a;4R;#V8 zt*v*5hle_VdjJj*xx#~19ZRRvpCn0&)a!K&6NX`6c6K(hv$ONrql|gI#Du`037m5& znM`ijwv9nU`eav-Tne;(cmJnSsr6_yI^J%#F-o-CZA7Ed@l-0c9;_<_ z&v0>ZaY+yaIF2(Ch~qdA1ObUeVmYV~T_BN2Bt9%ny=a@Bo{secp;oI^|Eq_i1!D}2 zM&p++o{vB-E-ubo*F`848VMj23c+<?|dwWVp=uBXZ!kLlV80H;tW6g5rzXj#_1BuN8z#27;?7DJ=axX)xV z=|Z7U^mVIqF8x$kQIzfD9XHJ&bY9!u*5l+ xEX%50US6K{a>jrS(?9k2|94w?>3i3o0RZ1U8blv$D8>K)002ovPDHLkV1kt{o6`UQ literal 0 HcmV?d00001 diff --git a/examples/controls/gallery/images/tab.png b/examples/controls/gallery/images/tab.png new file mode 100644 index 0000000000000000000000000000000000000000..74fefab78a719e4883756d2bcc1b968835dd4fa0 GIT binary patch literal 9877 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 e>ji&^9V literal 0 HcmV?d00001 diff --git a/examples/controls/gallery/images/tab_selected.png b/examples/controls/gallery/images/tab_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..665400ccfd2da9264fa4cf0e653e2573a8f7daf7 GIT binary patch literal 10184 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 FV1isSCa3@a literal 0 HcmV?d00001 diff --git a/examples/controls/gallery/images/window-new@2x.png b/examples/controls/gallery/images/window-new@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..36503018ef4157fa20f6cfdaf9fb851137384c53 GIT binary patch literal 1900 zcmV-y2b1`TP)Dzc_jFQd##dSKIBDn4MW5ma_wa5wm1vvEu>QBC+rrSV+h_R=ff1 zSXc;|2QYgys~L}EE}m{rcU5;?@_K?rW;J#33}8Gcn+z$Xl(I5Q@#i0Z{Bd+rxW%E0 za88$)E*=qS7@+0_`d)^6`zC?oIgd)5$can=^`cq_3N~9)Fp^6k$i@@3rzloh`))De<=V@pFZuR zX&N;(`42w$B>3=Ke>xow=XZTuOnvK)JYRj6#fs!a(m$}UI!d&EqJ)h5q zpMQ4t%}+l1=(qD70G>Q~GLGZ;H$_qW05DBVUPKx6X7qb=y74vLctzY<6NM>Zm|?vF zV;mI#hN85jX+V;OtkxZttC;1g&-G&Hmg~tM*X#7hj~_ptTYxYOe;x$E_Z~fZWWq3P zpLDic<{hKJw4^)muKWf*{tMA2>dewb53B-@V#?N`?k zg>y>^my(wmd8w4@ac?^1{z>RBt{43Zs?DF6iuphLaz445D zlR3xZYo@~$K`_LaF~%DL;SB(;oa5XjS@svs=NFt^p7HvNSN!Bh_wntD!C>CG0YIw& zpw|f-1%QY$87fBu$5FpvJjfaMbH=@lFzjQzyBO~nV~!9yRi|K$m5#+z1Mpgad0=mNYM>SCgxq!X2(DaI67n|oXk*nb)fZ6pKYD5Kl)=|mn; zAcVf)TQDZTNPw6KV>%dbgt6bK@5({npc-K`Kuv&eQ$k;W0ucpOgT)?{z@Qs8i~$*O z6c7bIfp4+aV8md=)kekvTD3s8s_!ZQt*?O*hY^FdrnWu;h@j|ON}y>P;E1A-zz^|k zh>-xrf@BB@um67Oo+T0Xw|kwR%jX5y>o@?73dp8XXIs%QhSK$qS~b>Lz1*ph-@*y zxvE|s{qWlj905eMGyUA?O)!0a5}>kea=kg0}#j16?|uW5#lV%6*UldEQ~Q zPO}{+xY0pvnhgYC1dI^50$rdamC~aKGjNw6b81PeL{J?_A7upG0giw%$e1iY<7y$v z4FDSvRMmz8AaxS!+UJ+`@MBRTpa;4E1)vKOf%NL6Cn(3j6qu6buj}V*S>b&qG%p6I zP7%qdyt=6;T}LYcK;gF-6rO;-Tsz z#6TZpfs!IM0E$=ZL9YUi5y%wPV+_-J#t=Cufo3yc6UV3q2ob9NS{GJ8hHk9~KmZa~ z?N3Ii-l^Gelc(&6V6!z~KZYnhL}sX7R~>+q&El^j)o85UEg|$^E598EY>&gYCp?r1 z$OOnhQ}jjz{kjB#uNbrUN?_vyZXXbJ!uWgMVaMR^Cx3H(-~?|c0RPFdy1rEdZjlJS zuazc|)-pgu4!gkZ)_`{^1F2S=_k2K$;;;?2Ndyl7Xp;yYw84!JXbS`C<2GC2_uK~C zR067sG3JH=t?dE_MyM?suw{mJ0ciG`;Mea2TVsXyiZuOl!NqTZf^xIl&D8tsRCAtZ>^(V8;lx z%?cj?(EJS&UmpX^z7=js2e>(Jy$G89HrN&h?6g7WoN0pqZbzQy0T3F%&$7(6tpuEN zKG3y5uwj6R5XW&FlE*pcvH4!WIhV|4v;5VoSH89Oogez&jHmz0`(D0$StLpF>Ba}- zFJ8R(^}~k`zx(|8^Y8HfKAUqu_8x^Rd545`?-?p0nx^T;&z?Q|6_9NjqDQrrI;@YN zK5Tt$v(etWWo+N*YOWh?fFZP#U6P80000W z7}6Lff2wOX1&VMMctjR6FmMZlFeAgPITAoY_7YEDSN7YiB79tOD^GkB2MS4+xJHyX z=jZ08=9Mrw7o{eaq^2m8XO?6rxO@5rgg5em6z%tPaSVw#{5I?&*I@;oJw1Q^tN-HG zK2Z~t&z~BweBE8E7LoT0IpQ8aoivNfQ=+BVuh)xxfu?HrE@uv@dV>F(*u#>-!8bDZG(C%!&AZJOU6Q*}+}Jn;&_9hHv`l*e4m{qjv@mpSY*F)i(cZbG>p%UNdia{&_eURuluy3dnpdTgXm+OJ&Kj@;Pged?3 literal 0 HcmV?d00001 diff --git a/examples/controls/tableview/images/selectedrow.png b/examples/controls/tableview/images/selectedrow.png new file mode 100644 index 0000000000000000000000000000000000000000..71192ea4e2b72d820f7afa745d50275fa8a1fb82 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-S!2~34eBFHkNHG=%xjQkeJ16rJ$YD$Jc6VVg zV@P9|{Hdd9u5x{>`#VLEnAyZgM3Yj~thCwDh^WP*K0.5 ? "Male" : "Female"}) + } + } + + Column { + anchors.top: toolbar.bottom + anchors.right: parent.right + anchors.left: parent.left + anchors.bottom: parent.bottom + anchors.margins: 8 + + TabView { + id:frame + focus:true + enabled: enabledCheck.checked + + property int margins: Qt.platform.os === "osx" ? 16 : 0 + + height: parent.height - 34 + anchors.right: parent.right + anchors.left: parent.left + anchors.margins: margins + + Tab { + title: "XmlListModel" + + TableView { + model: flickerModel + anchors.fill: parent + anchors.margins: 12 + + TableViewColumn { + role: "title" + title: "Title" + width: 120 + } + TableViewColumn { + role: "credit" + title: "Credit" + width: 120 + } + TableViewColumn { + role: "imagesource" + title: "Image source" + width: 200 + visible: true + } + + frameVisible: frameCheckbox.checked + headerVisible: headerCheckbox.checked + sortIndicatorVisible: sortableCheckbox.checked + alternatingRowColors: alternateCheckbox.checked + } + } + Tab { + title: "Multivalue" + + TableView { + model: nestedModel + anchors.fill: parent + anchors.margins: 12 + + TableViewColumn { + role: "content" + title: "Text and Color" + width: 220 + } + + itemDelegate: Item { + Rectangle{ + color: styleData.value.get(0).color + anchors.top:parent.top + anchors.right:parent.right + anchors.bottom:parent.bottom + anchors.margins: 4 + width:32 + border.color:"#666" + } + Text { + width: parent.width + anchors.margins: 4 + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + elide: styleData.elideMode + text: styleData.value.get(0).description + color: styleData.textColor + } + } + + frameVisible: frameCheckbox.checked + headerVisible: headerCheckbox.checked + sortIndicatorVisible: sortableCheckbox.checked + alternatingRowColors: alternateCheckbox.checked + } + } + Tab { + title: "Generated" + + TableView { + model: largeModel + anchors.margins: 12 + anchors.fill: parent + TableViewColumn { + role: "name" + title: "Name" + width: 120 + } + TableViewColumn { + role: "age" + title: "Age" + width: 120 + } + TableViewColumn { + role: "gender" + title: "Gender" + width: 120 + } + frameVisible: frameCheckbox.checked + headerVisible: headerCheckbox.checked + sortIndicatorVisible: sortableCheckbox.checked + alternatingRowColors: alternateCheckbox.checked + } + } + + Tab { + title: "Delegates" + Item { + anchors.fill: parent + + Component { + id: delegate1 + Item { + clip: true + Text { + width: parent.width + anchors.margins: 4 + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + elide: styleData.elideMode + text: styleData.value !== undefined ? styleData.value : "" + color: styleData.textColor + } + } + } + + Component { + id: delegate2 + Text { + width: parent.width + anchors.margins: 4 + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + elide: styleData.elideMode + text: styleData.value !== undefined ? styleData.value : "" + color: styleData.textColor + } + } + + Component { + id: editableDelegate + Item { + + Text { + width: parent.width + anchors.margins: 4 + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + elide: styleData.elideMode + text: styleData.value !== undefined ? styleData.value : "" + color: styleData.textColor + visible: !styleData.selected + } + Loader { // Initialize text editor lazily to improve performance + id: loaderEditor + anchors.fill: parent + anchors.margins: 4 + Connections { + target: loaderEditor.item + onAccepted: { + if (typeof styleData.value === 'number') + largeModel.setProperty(styleData.row, styleData.role, Number(parseFloat(loaderEditor.item.text).toFixed(0))) + else + largeModel.setProperty(styleData.row, styleData.role, loaderEditor.item.text) + } + } + sourceComponent: styleData.selected ? editor : null + Component { + id: editor + TextInput { + id: textinput + color: styleData.textColor + text: styleData.value + MouseArea { + id: mouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: textinput.forceActiveFocus() + } + } + } + } + } + } + TableView { + model: largeModel + anchors.margins: 12 + anchors.fill:parent + frameVisible: frameCheckbox.checked + headerVisible: headerCheckbox.checked + sortIndicatorVisible: sortableCheckbox.checked + alternatingRowColors: alternateCheckbox.checked + + TableViewColumn { + role: "name" + title: "Name" + width: 120 + } + TableViewColumn { + role: "age" + title: "Age" + width: 120 + } + TableViewColumn { + role: "gender" + title: "Gender" + width: 120 + } + + headerDelegate: BorderImage{ + source: "images/header.png" + border{left:2;right:2;top:2;bottom:2} + Text { + text: styleData.value + anchors.centerIn:parent + color:"#333" + } + } + + rowDelegate: Rectangle { + height: (delegateChooser.currentIndex == 1 && styleData.selected) ? 30 : 20 + Behavior on height{ NumberAnimation{} } + + color: styleData.selected ? "#448" : (styleData.alternate? "#eee" : "#fff") + BorderImage{ + id: selected + anchors.fill: parent + source: "images/selectedrow.png" + visible: styleData.selected + border{left:2; right:2; top:2; bottom:2} + SequentialAnimation { + running: true; loops: Animation.Infinite + NumberAnimation { target:selected; property: "opacity"; to: 1.0; duration: 900} + NumberAnimation { target:selected; property: "opacity"; to: 0.5; duration: 900} + } + } + } + + itemDelegate: { + if (delegateChooser.currentIndex == 2) + return editableDelegate; + else + return delegate1; + } + } + } + } + } + Row{ + x: 12 + height: 34 + CheckBox{ + id: alternateCheckbox + checked: true + text: "Alternate" + anchors.verticalCenter: parent.verticalCenter + } + CheckBox{ + id: sortableCheckbox + checked: false + text: "Sort indicator" + anchors.verticalCenter: parent.verticalCenter + } + CheckBox{ + id: frameCheckbox + checked: true + text: "Frame" + anchors.verticalCenter: parent.verticalCenter + } + CheckBox{ + id: headerCheckbox + checked: true + text: "Headers" + anchors.verticalCenter: parent.verticalCenter + } + } + } +} diff --git a/examples/controls/tableview/tableview.go b/examples/controls/tableview/tableview.go new file mode 100644 index 00000000..a16b6b1a --- /dev/null +++ b/examples/controls/tableview/tableview.go @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "gopkg.in/qml.v1" + "os" +) + +func main() { + if err := qml.Run(run); err != nil { + fmt.Fprintf(os.Stderr, "error: %v\n", err) + os.Exit(1) + } +} + +func run() error { + engine := qml.NewEngine() + + controls, err := engine.LoadFile("main.qml") + if err != nil { + return err + } + + window := controls.CreateWindow(nil) + + window.Show() + window.Wait() + return nil +} diff --git a/examples/controls/touch/content/AndroidDelegate.qml b/examples/controls/touch/content/AndroidDelegate.qml new file mode 100644 index 00000000..21ee8e68 --- /dev/null +++ b/examples/controls/touch/content/AndroidDelegate.qml @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + + + + +import QtQuick 2.2 + +Item { + id: root + width: parent.width + height: 88 + + property alias text: textitem.text + signal clicked + + Rectangle { + anchors.fill: parent + color: "#11ffffff" + visible: mouse.pressed + } + + Text { + id: textitem + color: "white" + font.pixelSize: 32 + text: modelData + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: 30 + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: 15 + height: 1 + color: "#424246" + } + + Image { + anchors.right: parent.right + anchors.rightMargin: 20 + anchors.verticalCenter: parent.verticalCenter + source: "../images/navigation_next_item.png" + } + + MouseArea { + id: mouse + anchors.fill: parent + onClicked: root.clicked() + + } +} diff --git a/examples/controls/touch/content/ButtonPage.qml b/examples/controls/touch/content/ButtonPage.qml new file mode 100644 index 00000000..6058671c --- /dev/null +++ b/examples/controls/touch/content/ButtonPage.qml @@ -0,0 +1,176 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + + + + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +Item { + width: parent.width + height: parent.height + + property real progress: 0 + SequentialAnimation on progress { + loops: Animation.Infinite + running: true + NumberAnimation { + from: 0 + to: 1 + duration: 3000 + } + NumberAnimation { + from: 1 + to: 0 + duration: 3000 + } + } + + Column { + spacing: 40 + anchors.centerIn: parent + + Button { + text: "Press me" + style: touchStyle + } + + Button { + style: touchStyle + text: "Press me too" + } + + Button { + anchors.margins: 20 + style: touchStyle + text: "Don't press me" + onClicked: if (stackView) stackView.pop() + } + + Row { + spacing: 20 + Switch { + style: switchStyle + } + Switch { + style: switchStyle + } + } + + } + + Component { + id: touchStyle + ButtonStyle { + panel: Item { + implicitHeight: 50 + implicitWidth: 320 + BorderImage { + anchors.fill: parent + antialiasing: true + border.bottom: 8 + border.top: 8 + border.left: 8 + border.right: 8 + anchors.margins: control.pressed ? -4 : 0 + source: control.pressed ? "../images/button_pressed.png" : "../images/button_default.png" + Text { + text: control.text + anchors.centerIn: parent + color: "white" + font.pixelSize: 23 + renderType: Text.NativeRendering + } + } + } + } + } + + Component { + id: switchStyle + SwitchStyle { + + groove: Rectangle { + implicitHeight: 50 + implicitWidth: 1.1 + Rectangle { + anchors.top: parent.top + anchors.left: parent.left + anchors.bottom: parent.bottom + width: parent.width/2 - 2 + height: 20 + anchors.margins: 2 + color: control.checked ? "#468bb7" : "#222" + Behavior on color {ColorAnimation {}} + Text { + font.pixelSize: 23 + color: "white" + anchors.centerIn: parent + text: "ON" + } + } + Item { + width: parent.width/2 + height: parent.height + anchors.right: parent.right + Text { + font.pixelSize: 23 + color: "white" + anchors.centerIn: parent + text: "OFF" + } + } + color: "#222" + border.color: "#444" + border.width: 2 + } + handle: Rectangle { + width: parent.parent.width/2 + height: control.height + color: "#444" + border.color: "#555" + border.width: 2 + } + } + } +} diff --git a/examples/controls/touch/content/ListPage.qml b/examples/controls/touch/content/ListPage.qml new file mode 100644 index 00000000..65dc99f5 --- /dev/null +++ b/examples/controls/touch/content/ListPage.qml @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + + + + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +ScrollView { + width: parent.width + height: parent.height + + flickableItem.interactive: true + + ListView { + anchors.fill: parent + model: 100 + delegate: AndroidDelegate { + text: "Item #" + modelData + } + } + + style: ScrollViewStyle { + transientScrollBars: true + handle: Item { + implicitWidth: 14 + implicitHeight: 26 + Rectangle { + color: "#424246" + anchors.fill: parent + anchors.topMargin: 6 + anchors.leftMargin: 4 + anchors.rightMargin: 4 + anchors.bottomMargin: 6 + } + } + scrollBarBackground: Item { + implicitWidth: 14 + implicitHeight: 26 + } + } +} diff --git a/examples/controls/touch/content/ProgressBarPage.qml b/examples/controls/touch/content/ProgressBarPage.qml new file mode 100644 index 00000000..019d7206 --- /dev/null +++ b/examples/controls/touch/content/ProgressBarPage.qml @@ -0,0 +1,114 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + + + + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +Item { + width: parent.width + height: parent.height + + property real progress: 0 + SequentialAnimation on progress { + loops: Animation.Infinite + running: true + NumberAnimation { + from: 0 + to: 1 + duration: 3000 + } + NumberAnimation { + from: 1 + to: 0 + duration: 3000 + } + } + + Column { + spacing: 40 + anchors.centerIn: parent + + ProgressBar { + anchors.margins: 20 + style: touchStyle + width: 400 + value: progress + } + + ProgressBar { + anchors.margins: 20 + style: touchStyle + width: 400 + value: 1 - progress + } + + ProgressBar { + anchors.margins: 20 + style: touchStyle + value: 1 + width: 400 + } + + } + + Component { + id: touchStyle + ProgressBarStyle { + panel: Rectangle { + implicitHeight: 15 + implicitWidth: 400 + color: "#444" + opacity: 0.8 + Rectangle { + antialiasing: true + radius: 1 + color: "#468bb7" + height: parent.height + width: parent.width * control.value / control.maximumValue + } + } + } + } +} diff --git a/examples/controls/touch/content/SliderPage.qml b/examples/controls/touch/content/SliderPage.qml new file mode 100644 index 00000000..95009e4f --- /dev/null +++ b/examples/controls/touch/content/SliderPage.qml @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + + + + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +Item { + width: parent.width + height: parent.height + + Column { + spacing: 12 + anchors.centerIn: parent + + Slider { + anchors.margins: 20 + style: touchStyle + value: 0 + } + Slider { + anchors.margins: 20 + style: touchStyle + value: 0.5 + } + Slider { + anchors.margins: 20 + style: touchStyle + value: 1.0 + } + + } + + Component { + id: touchStyle + SliderStyle { + handle: Rectangle { + width: 30 + height: 30 + radius: height + antialiasing: true + color: Qt.lighter("#468bb7", 1.1) + } + + groove: Item { + implicitHeight: 50 + implicitWidth: 400 + Rectangle { + height: 8 + width: parent.width + anchors.verticalCenter: parent.verticalCenter + color: "#444" + opacity: 0.8 + Rectangle { + antialiasing: true + radius: 1 + color: "#468bb7" + height: parent.height + width: parent.width * control.value / control.maximumValue + } + } + } + } + } +} diff --git a/examples/controls/touch/content/TabBarPage.qml b/examples/controls/touch/content/TabBarPage.qml new file mode 100644 index 00000000..c9bebccd --- /dev/null +++ b/examples/controls/touch/content/TabBarPage.qml @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + + + + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +Item { + width: parent.width + height: parent.height + + TabView { + anchors.fill: parent + style: touchStyle + Tab { + title: "Buttons" + ButtonPage{ visible: true } + } + Tab { + title: "Sliders" + SliderPage{ visible: true } + } + Tab { + title: "Progress" + ProgressBarPage{ visible: true } + } + } + + Component { + id: touchStyle + TabViewStyle { + tabsAlignment: Qt.AlignVCenter + tabOverlap: 0 + frame: Item { } + tab: Item { + implicitWidth: control.width/control.count + implicitHeight: 50 + BorderImage { + anchors.fill: parent + border.bottom: 8 + border.top: 8 + source: styleData.selected ? "../images/tab_selected.png":"../images/tabs_standard.png" + Text { + anchors.centerIn: parent + color: "white" + text: styleData.title.toUpperCase() + font.pixelSize: 16 + } + Rectangle { + visible: index > 0 + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.margins: 10 + width:1 + color: "#3a3a3a" + } + } + } + } + } +} diff --git a/examples/controls/touch/content/TextInputPage.qml b/examples/controls/touch/content/TextInputPage.qml new file mode 100644 index 00000000..0eeea03a --- /dev/null +++ b/examples/controls/touch/content/TextInputPage.qml @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + + + + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +Item { + width: parent.width + height: parent.height + + property real progress: 0 + SequentialAnimation on progress { + loops: Animation.Infinite + running: true + NumberAnimation { + from: 0 + to: 1 + duration: 3000 + } + NumberAnimation { + from: 1 + to: 0 + duration: 3000 + } + } + + Column { + spacing: 40 + anchors.centerIn: parent + + TextField { + anchors.margins: 20 + text: "Text input" + style: touchStyle + } + + TextField { + anchors.margins: 20 + text: "Readonly Text input" + style: touchStyle + readOnly: true + } + } + Component { + id: touchStyle + + TextFieldStyle { + textColor: "white" + font.pixelSize: 28 + background: Item { + implicitHeight: 50 + implicitWidth: 320 + BorderImage { + source: "../images/textinput.png" + border.left: 8 + border.right: 8 + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + } + } + } + } +} diff --git a/examples/controls/touch/images/NOTICE.txt b/examples/controls/touch/images/NOTICE.txt new file mode 100644 index 00000000..93a9afc8 --- /dev/null +++ b/examples/controls/touch/images/NOTICE.txt @@ -0,0 +1,2 @@ +Notice some of these images are derived from Google applications resources. They were provided under the following license: +You may use the materials in this directory without restriction to develop your apps and to use in your apps. diff --git a/examples/controls/touch/images/button_default.png b/examples/controls/touch/images/button_default.png new file mode 100644 index 0000000000000000000000000000000000000000..6d6cfd9ad25d629e34c4341542fce7fab8bd685a GIT binary patch literal 1406 zcmeAS@N?(olHy`uVBq!ia0vp^wm_`O!3HGTR25Tz6lZ})WHAE+w=f7ZGR&GI!N9e?g*F{zaLoz;FhIrk$aUK86^Q z55aPgL8-<0Ii+Cr=0;Er$b#q^obz)Fic*VR> zydB(G$bwJ}R156XicB1V4U)kOY>=oGI88*jWag&kfy2WL7~)tZkh}+$ch1krFA6S5 zOir~kGc`2^h9kN#x(={akqE0yP^?0dz#A}--~#4cJ1$`Qg_Qz!Trx@YqT@i}*& zo!xwU$EsD{k<*@Qbd{OCd3|}?TT>I?;4iiH^2a}>9^p1Do%8(XJ&W#y1J%r_>}Aut zyG!q-%zJM7A(uJ3@Lme@f(DI@6)h$cGJ`fYs9p}>%v89%B#F^`*+QX94$C}`GEMVw zR$bEQGr5aZXJ(t12lGrdQSJyM-l-GVjC{4kHl#>tDe|Vw3eib8X%gZjb;4w2#DOT^ z+plYQ)LRbr8%wq+zTTy$oWi2=yyRZM^{>gZmI>cc;JswB_h)|X7RwtfLFek%Y_GN1 YKU>(9<>GXYS)dZq)78&qol`;+0G?sUi2wiq literal 0 HcmV?d00001 diff --git a/examples/controls/touch/images/button_pressed.png b/examples/controls/touch/images/button_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..ab78b6ea363a132ed3210c611bc2622984601e90 GIT binary patch literal 1694 zcmeAS@N?(olHy`uVBq!ia0vp^Ejq&N#aB8wRqxP?KOkzv*x2?hoh zjm(gUk_cZPtK|G#y~LFKq*T3%+ybC#1_ql7DKQ57aVaP$*c7FtSp~VcLA3*Uwn`Z#B?VUc`sL;2 zdgaD?`9*7iAWdWaj57fXq!y z$}cUkRZ;?31P4%e<`%#$$}5KY3g|!mio^naLp=k1xXD0`Hb6gG`R1o&rd7HmmZaJl z85kPt8W`#tnuHjdSs55wnOoZEqp3mI3D)ggl$uzQUlfv`pJNx0S&^EP3*ssm0YkzB zq8C{ORI`mf$QMYy0tXq$L1^NHd|Q&4h6q;_?}B77{R2 z*6QV1q=hz-c1FB{MfQ4;&t57B>1=C6K%amUqt2$u9~n zNK8((Gcz?c28JWLFuD$~Rgnm*Oi-*slE51f8Hb zYQ4)b>C}}*+dW+tH>wpylyUSZwQrr)d;2q6iA~st=GA(BE|X&p=IY}8I33BJ_v~X_F;H9F(OwL6nH%nTk^n2}BF}7&2{L7bEnf7o|qXGL8i4d1n7ri#Ep6qNc zlOtk2<(G%Ys+;d#o|~lm?8<^Wt?reAelOBa$G@oi#9h8WH1FX%7nkJ;Ri&3sH`J}Z z8vEvZ(%H0yVKW!U|5(pg7OtneQ~qB(!{z5Ij2QUYct88gyc6G*U-RQ`=9!CT40-}d uzYp$RTK8I!?cejS?=w2~^L?B5{XN5ax!s9|^H*DeY7kFXKbLh*2~7YeJyo&* literal 0 HcmV?d00001 diff --git a/examples/controls/touch/images/navigation_next_item.png b/examples/controls/touch/images/navigation_next_item.png new file mode 100644 index 0000000000000000000000000000000000000000..6665c9d85b8ac4717ccfa7ae07d06c188cd93735 GIT binary patch literal 1341 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 literal 0 HcmV?d00001 diff --git a/examples/controls/touch/images/tab_selected.png b/examples/controls/touch/images/tab_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..2345f7a8ef06a6ed09d6c14d7988e24a279da70b GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^fEamT(fRh;MqVaEp4Nx|UBiNc6z(#tjA-amm6+&yqrK}N*Eti97bOo>%tOjvE zUvu}oA>WP1HFwqS3o2)SPVAb?)ALl+w0`&N$A7nF)$FsEGA(4;!+1wr&XxN_+)1Fb O7(8A5T-G@yGywo&no&Fe literal 0 HcmV?d00001 diff --git a/examples/controls/touch/images/tabs_standard.png b/examples/controls/touch/images/tabs_standard.png new file mode 100644 index 0000000000000000000000000000000000000000..7140ab7b75b2ae40deb654405a6632964705c11c GIT binary patch literal 1230 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 literal 0 HcmV?d00001 diff --git a/examples/controls/touch/images/toolbar.png b/examples/controls/touch/images/toolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..e9eba4c7442d595517fe863682e58535226eaae4 GIT binary patch literal 1643 zcmeAS@N?(olHy`uVBq!ia0vp^@<1%j!2~3^V-HsVDb50q$YLN*7=#%aX3ddcU|`Y6 z42dX-@b$4u&d=3LOvz75)vL%Y0IFtSu&J;DGILW)5)~?PbMlI0o zV7bVk)Z+Y{Qm}e+V1Qr{W(nL)Xu{~aA`tR+ zaAzS4LN!n=uv05CaRfF<1~afhqE_HE5#f@Vo04`X16W0gSi9$4NvKPSH^xF9h( z)y~Y+)EF3!=)&kaz*a>ftTHl3whBoCZ@@r;3z&25xPa*wRtng0d0NkxW?*1^>FMGa z;=wyN^mgD81A*@1f6G~SEnu!%B(jS4(!M>?>IaMGDQ??3sqC*+)a~!Nw{JD}Z+XW2 zo}btB`4-(B3mhtZgp#-PUi)v-5o*8F=fKUC+ybq=yFxTm+fFu`#BepHWgm!`ppYoF z+VL&3{qnf^&(C_TiraosX`%sJkmBMMk+Wpm9k?RqYTV&pytI~G#yhC}x&EuYnvzy~ z)pos4dR$s1e~(}8;7aE04ZHc)>o!;kSMjkb-rRmdzxc~Mj_8SH&l2aV?O5l~bY0PA z*%XGOvH7;|lTNMc4p_yy$@Xy0&k)(m9)InQYHdDqY2~vwt<9cQigI3@JD-;EyjINaO&!(VFm|1u@k~(m z!}I-}%X+0He>zVN$`Y#)ezu3P^69LOCv#T^Zfu^S*`dEhXzQlV6T4;SE%|Y#I%>no zb8{Sdb!*ZSU3Wd1`pMuC=hjbmY>q0vpSXEPSz1boj$drd!8-Z>M$Zz|*7amR3@Ev_ zXvMtjbBr>QZ@=DpsJj0%dqQWC|Mz&- QpP=f%)78&qol`;+0Qv(+s{jB1 literal 0 HcmV?d00001 diff --git a/examples/controls/touch/main.qml b/examples/controls/touch/main.qml new file mode 100644 index 00000000..c794f7dc --- /dev/null +++ b/examples/controls/touch/main.qml @@ -0,0 +1,147 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import "content" + +ApplicationWindow { + visible: true + width: 800 + height: 1280 + + Rectangle { + color: "#212126" + anchors.fill: parent + } + + toolBar: BorderImage { + border.bottom: 8 + source: "images/toolbar.png" + width: parent.width + height: 100 + + Rectangle { + id: backButton + width: opacity ? 60 : 0 + anchors.left: parent.left + anchors.leftMargin: 20 + opacity: stackView.depth > 1 ? 1 : 0 + anchors.verticalCenter: parent.verticalCenter + antialiasing: true + height: 60 + radius: 4 + color: backmouse.pressed ? "#222" : "transparent" + Behavior on opacity { NumberAnimation{} } + Image { + anchors.verticalCenter: parent.verticalCenter + source: "images/navigation_previous_item.png" + } + MouseArea { + id: backmouse + anchors.fill: parent + anchors.margins: -10 + onClicked: stackView.pop() + } + } + + Text { + font.pixelSize: 42 + Behavior on x { NumberAnimation{ easing.type: Easing.OutCubic} } + x: backButton.x + backButton.width + 20 + anchors.verticalCenter: parent.verticalCenter + color: "white" + text: "Widget Gallery" + } + } + + ListModel { + id: pageModel + ListElement { + title: "Buttons" + page: "content/ButtonPage.qml" + } + ListElement { + title: "Sliders" + page: "content/SliderPage.qml" + } + ListElement { + title: "ProgressBar" + page: "content/ProgressBarPage.qml" + } + ListElement { + title: "Tabs" + page: "content/TabBarPage.qml" + } + ListElement { + title: "TextInput" + page: "content/TextInputPage.qml" + } + ListElement { + title: "List" + page: "content/ListPage.qml" + } + } + + StackView { + id: stackView + anchors.fill: parent + // Implements back key navigation + focus: true + Keys.onReleased: if (event.key === Qt.Key_Back && stackView.depth > 1) { + stackView.pop(); + event.accepted = true; + } + + initialItem: Item { + width: parent.width + height: parent.height + ListView { + model: pageModel + anchors.fill: parent + delegate: AndroidDelegate { + text: title + onClicked: stackView.push(Qt.resolvedUrl(page)) + } + } + } + } + +} diff --git a/examples/controls/touch/touch.go b/examples/controls/touch/touch.go new file mode 100644 index 00000000..a16b6b1a --- /dev/null +++ b/examples/controls/touch/touch.go @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "gopkg.in/qml.v1" + "os" +) + +func main() { + if err := qml.Run(run); err != nil { + fmt.Fprintf(os.Stderr, "error: %v\n", err) + os.Exit(1) + } +} + +func run() error { + engine := qml.NewEngine() + + controls, err := engine.LoadFile("main.qml") + if err != nil { + return err + } + + window := controls.CreateWindow(nil) + + window.Show() + window.Wait() + return nil +}