on xenial help sign in
override some Qt Components definitions so we can have sane default values for flick speeds
c693856Andrea Cimitan
qml/Components/Carousel.qml+1−2
@@ -17,6 +17,7 @@
17import QtQuick 2.4
17import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19import "carousel.js" as CarouselJS
19import "carousel.js" as CarouselJS
20+import "."
20
21
21/*! The Carousel component presents the items of a model in a carousel view. It's similar to a
22/*! The Carousel component presents the items of a model in a carousel view. It's similar to a
22 cover flow. But it stops at it's boundaries (therefore no PathView is used).
23 cover flow. But it stops at it's boundaries (therefore no PathView is used).
@@ -141,8 +142,6 @@ Item {
141
142
142 boundsBehavior: Flickable.DragOverBounds
143 boundsBehavior: Flickable.DragOverBounds
143 cacheBuffer: carousel.cacheBuffer
144 cacheBuffer: carousel.cacheBuffer
144− flickDeceleration: Math.max(1500 * Math.pow(realWidth / referenceWidth, 1.5), 1500) // 1500 is platform default
145− maximumFlickVelocity: Math.max(2500 * Math.pow(realWidth / referenceWidth, 1.5), 2500) // 2500 is platform default
146 orientation: ListView.Horizontal
145 orientation: ListView.Horizontal
147
146
148 function getXFromContinuousIndex(index) {
147 function getXFromContinuousIndex(index) {
qml/Components/Flickable.qmlnew file+24
@@ -0,0 +1,24 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.4 as QtQuick
18+import Ubuntu.Components 1.3
19+import "flickableUtils.js" as FlickableUtilsJS
20+
21+QtQuick.Flickable {
22+ flickDeceleration: FlickableUtilsJS.getFlickDeceleration(units.gridUnit)
23+ maximumFlickVelocity: FlickableUtilsJS.getMaximumFlickVelocity(units.gridUnit)
24+}
qml/Components/FloatingFlickable.qml+1
@@ -17,6 +17,7 @@
17import QtQuick 2.4
17import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19import Ubuntu.Gestures 0.1
19import Ubuntu.Gestures 0.1
20+import "."
20
21
21/*
22/*
22 A Flickable that can be put in front of the item to be flicked and
23 A Flickable that can be put in front of the item to be flicked and
qml/Components/GridView.qmlnew file+24
@@ -0,0 +1,24 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.4 as QtQuick
18+import Ubuntu.Components 1.3
19+import "flickableUtils.js" as FlickableUtilsJS
20+
21+QtQuick.GridView {
22+ flickDeceleration: FlickableUtilsJS.getFlickDeceleration(units.gridUnit)
23+ maximumFlickVelocity: FlickableUtilsJS.getMaximumFlickVelocity(units.gridUnit)
24+}
qml/Components/ListView.qmlnew file+24
@@ -0,0 +1,24 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.4 as QtQuick
18+import Ubuntu.Components 1.3
19+import "flickableUtils.js" as FlickableUtilsJS
20+
21+QtQuick.ListView {
22+ flickDeceleration: FlickableUtilsJS.getFlickDeceleration(units.gridUnit)
23+ maximumFlickVelocity: FlickableUtilsJS.getMaximumFlickVelocity(units.gridUnit)
24+}
qml/Components/ResponsiveGridView.qml+1
@@ -16,6 +16,7 @@
16
16
17import QtQuick 2.4
17import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19+import "."
19
20
20/*
21/*
21 Essentially a GridView
22 Essentially a GridView
qml/Components/ZoomableImage.qml+1−1
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.4
17import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19−import "../Components"
19+import "."
20
20
21/*! \brief Zoomable for image.
21/*! \brief Zoomable for image.
22
22
qml/Components/flickableUtils.jsnew file+28
@@ -0,0 +1,28 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+.pragma library
18+
19+/* TODO the "8" is is DEFAULT_GRID_UNIT_PX, we use it to normalize the values with the current grid unit size.
20+ Add a way to fetch this default grid unit px value from UITK. */
21+
22+function getFlickDeceleration(gridUnit) {
23+ return 1500 * gridUnit / 8;
24+}
25+
26+function getMaximumFlickVelocity(gridUnit) {
27+ return 2500 * gridUnit / 8;
28+}
qml/Dash/DashContent.qml−2
@@ -112,8 +112,6 @@ Item {
112 anchors.fill: parent
112 anchors.fill: parent
113 orientation: ListView.Horizontal
113 orientation: ListView.Horizontal
114 boundsBehavior: Flickable.DragAndOvershootBounds
114 boundsBehavior: Flickable.DragAndOvershootBounds
115− flickDeceleration: units.gu(625)
116− maximumFlickVelocity: width * 5
117 snapMode: ListView.SnapOneItem
115 snapMode: ListView.SnapOneItem
118 highlightMoveDuration: 250
116 highlightMoveDuration: 250
119 highlightRangeMode: ListView.StrictlyEnforceRange
117 highlightRangeMode: ListView.StrictlyEnforceRange
qml/Dash/DashNavigation.qml+1
@@ -17,6 +17,7 @@
17import QtQuick 2.4
17import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19import Dash 0.1
19import Dash 0.1
20+import "../Components"
20
21
21Item {
22Item {
22 id: root
23 id: root
qml/Dash/FiltersPopover.qml+1
@@ -19,6 +19,7 @@ import Ubuntu.Components 1.3
19import Ubuntu.Components.Popups 1.3
19import Ubuntu.Components.Popups 1.3
20import Ubuntu.Components.ListItems 1.3 as ListItems
20import Ubuntu.Components.ListItems 1.3 as ListItems
21import "Filters" as Filters
21import "Filters" as Filters
22+import "../Components"
22
23
23Popover {
24Popover {
24 id: root
25 id: root
qml/Dash/PageHeaderExtraPanel.qml+1
@@ -18,6 +18,7 @@ import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19import Ubuntu.Components.ListItems 1.3 as ListItems
19import Ubuntu.Components.ListItems 1.3 as ListItems
20import "Filters" as Filters
20import "Filters" as Filters
21+import "../Components"
21
22
22Item {
23Item {
23 id: root
24 id: root
qml/Dash/ScopeListView.qml+4−2
@@ -15,11 +15,13 @@
15 */
15 */
16
16
17import QtQuick 2.4
17import QtQuick 2.4
18+import Ubuntu.Components 1.3
18import Dash 0.1
19import Dash 0.1
20+import "../Components/flickableUtils.js" as FlickableUtilsJS
19
21
20ListViewWithPageHeader {
22ListViewWithPageHeader {
23+ flickDeceleration: FlickableUtilsJS.getFlickDeceleration(units.gridUnit)
21− maximumFlickVelocity: height * 10
24+ maximumFlickVelocity: FlickableUtilsJS.getMaximumFlickVelocity(units.gridUnit)
22− flickDeceleration: height * 2
23 // 1073741823 is s^30 -1. A quite big number so that you have "infinite" cache, but not so
25 // 1073741823 is s^30 -1. A quite big number so that you have "infinite" cache, but not so
24 // big so that if you add if with itself you're outside the 2^31 int range
26 // big so that if you add if with itself you're outside the 2^31 int range
25 cacheBuffer: 1073741823
27 cacheBuffer: 1073741823
qml/Dash/ScopesList.qml+2
@@ -15,7 +15,9 @@
15 */
15 */
16
16
17import QtQuick 2.4
17import QtQuick 2.4
18+import Ubuntu.Components 1.3
18import Dash 0.1
19import Dash 0.1
20+import "../Components"
19
21
20Item {
22Item {
21 id: root
23 id: root
qml/Dash/ScopesListCategory.qml+1
@@ -17,6 +17,7 @@
17import QtQuick 2.4
17import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19import Dash 0.1
19import Dash 0.1
20+import "../Components"
20import "../Components/ListItems" as ListItems
21import "../Components/ListItems" as ListItems
21
22
22Item {
23Item {
qml/Greeter/LoginList.qml−1
@@ -152,7 +152,6 @@ StyledItem {
152 preferredHighlightEnd: userList.height / 2 - root.highlightedHeight / 2
152 preferredHighlightEnd: userList.height / 2 - root.highlightedHeight / 2
153 highlightRangeMode: ListView.StrictlyEnforceRange
153 highlightRangeMode: ListView.StrictlyEnforceRange
154 highlightMoveDuration: root.moveDuration
154 highlightMoveDuration: root.moveDuration
155− flickDeceleration: 10000
156 interactive: count > 1
155 interactive: count > 1
157
156
158 readonly property bool movingInternally: moveTimer.running || userList.moving
157 readonly property bool movingInternally: moveTimer.running || userList.moving
qml/Launcher/LauncherPanel.qml+1−1
@@ -19,7 +19,7 @@ import Ubuntu.Components 1.3
19import Unity.Launcher 0.1
19import Unity.Launcher 0.1
20import Ubuntu.Components.Popups 1.3
20import Ubuntu.Components.Popups 1.3
21import "../Components/ListItems"
21import "../Components/ListItems"
22−import "../Components/"
22+import "../Components"
23
23
24Rectangle {
24Rectangle {
25 id: root
25 id: root
qml/Panel/IndicatorPage.qml+1
@@ -17,6 +17,7 @@
17import QtQuick 2.4
17import QtQuick 2.4
18import Ubuntu.Components 1.3 as Components
18import Ubuntu.Components 1.3 as Components
19import Unity.Indicators 0.1 as Indicators
19import Unity.Indicators 0.1 as Indicators
20+import "../Components"
20import "Indicators"
21import "Indicators"
21
22
22IndicatorBase {
23IndicatorBase {
qml/Panel/Indicators/client/IndicatorsList.qml+1
@@ -22,6 +22,7 @@ import Ubuntu.Components 1.3
22import Ubuntu.Components.ListItems 1.3 as ListItem
22import Ubuntu.Components.ListItems 1.3 as ListItem
23import Unity.Indicators 0.1 as Indicators
23import Unity.Indicators 0.1 as Indicators
24import "../.."
24import "../.."
25+import "../../../Components"
25
26
26Page {
27Page {
27 id: page
28 id: page
qml/Panel/Indicators/client/IndicatorsTree.qml+1
@@ -21,6 +21,7 @@ import QtQuick 2.4
21import Ubuntu.Components 1.3
21import Ubuntu.Components 1.3
22import Unity.Indicators 0.1 as Indicators
22import Unity.Indicators 0.1 as Indicators
23import ".."
23import ".."
24+import "../../../Components"
24
25
25IndicatorBase {
26IndicatorBase {
26 id: root
27 id: root
qml/Wizard/Pages/10-welcome.qml+1
@@ -20,6 +20,7 @@ import Ubuntu.Components.ListItems 1.3
20import Ubuntu.SystemSettings.LanguagePlugin 1.0
20import Ubuntu.SystemSettings.LanguagePlugin 1.0
21import Wizard 0.1
21import Wizard 0.1
22import ".." as LocalComponents
22import ".." as LocalComponents
23+import "../../Components"
23
24
24LocalComponents.Page {
25LocalComponents.Page {
25 objectName: "languagePage"
26 objectName: "languagePage"
qml/Wizard/Pages/20-keyboard.qml+1
@@ -23,6 +23,7 @@ import AccountsService 0.1
23import Unity.InputInfo 0.1
23import Unity.InputInfo 0.1
24import Unity.Application 0.1
24import Unity.Application 0.1
25import ".." as LocalComponents
25import ".." as LocalComponents
26+import "../../Components"
26
27
27LocalComponents.Page {
28LocalComponents.Page {
28 objectName: "keyboardPage"
29 objectName: "keyboardPage"
qml/Wizard/Pages/30-wifi.qml+1
@@ -22,6 +22,7 @@ import Wizard 0.1
22import Ubuntu.Connectivity 1.0
22import Ubuntu.Connectivity 1.0
23import Ubuntu.SystemImage 0.1
23import Ubuntu.SystemImage 0.1
24import ".." as LocalComponents
24import ".." as LocalComponents
25+import "../../Components"
25
26
26LocalComponents.Page {
27LocalComponents.Page {
27 id: wifiPage
28 id: wifiPage
qml/Wizard/Pages/50-timezone.qml+1
@@ -21,6 +21,7 @@ import Wizard 0.1
21import Ubuntu.SystemSettings.TimeDate 1.1
21import Ubuntu.SystemSettings.TimeDate 1.1
22import Utils 0.1 as Utils
22import Utils 0.1 as Utils
23import ".." as LocalComponents
23import ".." as LocalComponents
24+import "../../Components"
24
25
25LocalComponents.Page {
26LocalComponents.Page {
26 id: tzPage
27 id: tzPage
qml/Wizard/Pages/70-passwd-type.qml+1
@@ -19,6 +19,7 @@ import Ubuntu.Components 1.3
19import Ubuntu.Components.ListItems 1.3
19import Ubuntu.Components.ListItems 1.3
20import Ubuntu.SystemSettings.SecurityPrivacy 1.0
20import Ubuntu.SystemSettings.SecurityPrivacy 1.0
21import ".." as LocalComponents
21import ".." as LocalComponents
22+import "../../Components"
22
23
23/**
24/**
24 * One quirk with this page: we don't actually set the password. We avoid
25 * One quirk with this page: we don't actually set the password. We avoid
qml/Wizard/Pages/passcode-confirm.qml+2−2
@@ -18,7 +18,7 @@ import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19import Ubuntu.SystemSettings.SecurityPrivacy 1.0
19import Ubuntu.SystemSettings.SecurityPrivacy 1.0
20import ".." as LocalComponents
20import ".." as LocalComponents
21−import "../../Components" as UnityComponents
21+import "../../Components"
22
22
23/**
23/**
24 * See the main passwd-type page for an explanation of why we don't actually
24 * See the main passwd-type page for an explanation of why we don't actually
@@ -34,7 +34,7 @@ LocalComponents.Page {
34 // If we are entering this page, clear any saved password and get focus
34 // If we are entering this page, clear any saved password and get focus
35 onEnabledChanged: if (enabled) lockscreen.clear(false)
35 onEnabledChanged: if (enabled) lockscreen.clear(false)
36
36
37− UnityComponents.Lockscreen {
37+ Lockscreen {
38 id: lockscreen
38 id: lockscreen
39 anchors {
39 anchors {
40 fill: content
40 fill: content
qml/Wizard/Pages/passcode-desktop.qml+1
@@ -18,6 +18,7 @@ import QtQuick 2.4
18import QtQuick.Layouts 1.1
18import QtQuick.Layouts 1.1
19import Ubuntu.Components 1.3
19import Ubuntu.Components 1.3
20import ".." as LocalComponents
20import ".." as LocalComponents
21+import "../../Components"
21
22
22/**
23/**
23 * See the main passwd-type page for an explanation of why we don't actually
24 * See the main passwd-type page for an explanation of why we don't actually
qml/Wizard/Pages/passcode-set.qml+2−2
@@ -18,7 +18,7 @@ import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19import Ubuntu.SystemSettings.SecurityPrivacy 1.0
19import Ubuntu.SystemSettings.SecurityPrivacy 1.0
20import ".." as LocalComponents
20import ".." as LocalComponents
21−import "../../Components" as UnityComponents
21+import "../../Components"
22
22
23/**
23/**
24 * See the main passwd-type page for an explanation of why we don't actually
24 * See the main passwd-type page for an explanation of why we don't actually
@@ -45,7 +45,7 @@ LocalComponents.Page {
45 onTriggered: pageStack.load(Qt.resolvedUrl("passcode-confirm.qml"));
45 onTriggered: pageStack.load(Qt.resolvedUrl("passcode-confirm.qml"));
46 }
46 }
47
47
48− UnityComponents.Lockscreen {
48+ Lockscreen {
49 id: lockscreen
49 id: lockscreen
50 anchors {
50 anchors {
51 fill: content
51 fill: content
qml/Wizard/Pages/password-set.qml+1
@@ -18,6 +18,7 @@ import QtQuick 2.4
18import QtQuick.Layouts 1.1
18import QtQuick.Layouts 1.1
19import Ubuntu.Components 1.3
19import Ubuntu.Components 1.3
20import ".." as LocalComponents
20import ".." as LocalComponents
21+import "../../Components"
21
22
22/**
23/**
23 * See the main passwd-type page for an explanation of why we don't actually
24 * See the main passwd-type page for an explanation of why we don't actually
qml/Wizard/WizardItemSelector.qml+1
@@ -17,6 +17,7 @@
17import QtQuick 2.4
17import QtQuick 2.4
18import Ubuntu.Components 1.3
18import Ubuntu.Components 1.3
19import Ubuntu.Components.ListItems 1.3 as ListItem
19import Ubuntu.Components.ListItems 1.3 as ListItem
20+import "../Components"
20
21
21Rectangle {
22Rectangle {
22 id: optionToggle
23 id: optionToggle
tests/imports/check_imports.py+58
@@ -81,6 +81,53 @@ def scan_for_bad_import(file_path, all_pat, good_pats):
81 print("%s: bad import version in multiple lines" % file_path)
81 print("%s: bad import version in multiple lines" % file_path)
82 return bool(errors)
82 return bool(errors)
83
83
84+# Flickable matches
85+flickable_pat = re.compile(r'.*\s*Flickable\s*{')
86+listview_pat = re.compile(r'.*\s*ListView\s*{')
87+gridview_pat = re.compile(r'.*\s*GridView\s*{')
88+flickable_pats = [flickable_pat, listview_pat, gridview_pat]
89+unity_components_pat = re.compile(r'.*import ".*Components"')
90+components_import_pat = re.compile(r'.*import "."')
91+components_path = re.compile(r'.*qml/Components.*')
92+skip_components_flickable_path = re.compile(r'.*qml/Components/Flickable.qml')
93+skip_components_listview_path = re.compile(r'.*qml/Components/ListView.qml')
94+skip_components_gridview_path = re.compile(r'.*qml/Components/GridView.qml')
95+skip_mocks_path = re.compile(r'.*tests/mocks.*')
96+
97+def scan_for_flickable_imports(file_path, component_pats, qtquick_pat, unitycomponents_pat):
98+ errors = []
99+ with open(file_path, 'rt', encoding='utf-8') as ifile, open(file_path, 'rt', encoding='utf-8') as i2file:
100+ flickable_found = False
101+ for lino, line in enumerate(ifile, start=1):
102+ for component_pat in component_pats:
103+ if component_pat.match(line):
104+ flickable_found = True
105+ if flickable_found:
106+ qtquick_found = False
107+ unitycomponents_found = False
108+ for lino, line in enumerate(i2file, start=1):
109+ if not qtquick_found and qtquick_pat.match(line):
110+ qtquick_found = True
111+ if unitycomponents_pat.match(line):
112+ unitycomponents_found = True
113+ if not qtquick_found:
114+ errors.append(lino)
115+ else:
116+ return
117+ if not unitycomponents_found:
118+ errors.append(lino)
119+ if 0 < len(errors) <= 10:
120+ if len(errors) > 1:
121+ plural = 's'
122+ else:
123+ plural = ''
124+ print(
125+ "%s: missing/wrong order of Components import in line%s %s" % (
126+ file_path, plural, ", ".join((str(i) for i in errors))))
127+ elif errors:
128+ print("%s: missing/wrong order of Components imports in multiple lines" % file_path)
129+ return bool(errors)
130+
84# Parse args
131# Parse args
85
132
86parser = argparse.ArgumentParser(
133parser = argparse.ArgumentParser(
@@ -116,6 +163,17 @@ try:
116 found_bad_import = True
163 found_bad_import = True
117 if scan_for_bad_import(path, ubuntu_components_pat, [ubuntu_good_components_pat]):
164 if scan_for_bad_import(path, ubuntu_components_pat, [ubuntu_good_components_pat]):
118 found_bad_import = True
165 found_bad_import = True
166+ if skip_mocks_path.match(path) or \
167+ skip_components_flickable_path.match(path) or \
168+ skip_components_listview_path.match(path) or \
169+ skip_components_gridview_path.match(path):
170+ break
171+ if not components_path.match(path):
172+ if scan_for_flickable_imports(path, flickable_pats, quick_good_pat, unity_components_pat):
173+ found_bad_import = True
174+ else:
175+ if scan_for_flickable_imports(path, flickable_pats, quick_good_pat, components_import_pat):
176+ found_bad_import = True
119
177
120except OSError as e:
178except OSError as e:
121 error("cannot create file list for \"" + dir + "\": " + e.strerror)
179 error("cannot create file list for \"" + dir + "\": " + e.strerror)
tests/qmltests/Dash/Previews/tst_PreviewRatingDisplayCreationRanges.qml+1
@@ -18,6 +18,7 @@ import QtQuick 2.4
18import QtTest 1.0
18import QtTest 1.0
19import Ubuntu.Components 1.3
19import Ubuntu.Components 1.3
20import "../../../../qml/Dash/Previews"
20import "../../../../qml/Dash/Previews"
21+import "../../../../qml/Components"
21import Unity.Test 0.1 as UT
22import Unity.Test 0.1 as UT
22
23
23Flickable {
24Flickable {
tests/qmltests/tst_OrientedShell.qml+1
@@ -28,6 +28,7 @@ import Unity.InputInfo 0.1
28import Utils 0.1
28import Utils 0.1
29
29
30import "../../qml"
30import "../../qml"
31+import "../../qml/Components"
31import "Stages"
32import "Stages"
32
33
33Rectangle {
34Rectangle {