@@ -21,25 +21,24 @@ import "../Components"
24+ // Properties passed by parent
24 property real progress: 0
25 property real progress: 0
25 property var scope: null
26 property var scope: null
26− property bool forceDisableDashEater: false
27+ property int currentIndex: 0
28+ property real scopeScale: 1
30+ // Properties used by parent
31+ property bool growingDashFromPos: false
32+ readonly property bool showingNonFavoriteScope: tempScopeItem.scope != null
33+ readonly property alias currentTab: tabBar.currentTab
27− property var dashItemEater: {
34+ readonly property var dashItemEater: {
28− if (!forceDisableDashEater && tabBar.currentTab == 0 && middleItems.count > 0) {
35+ if (!forceXYScalerEater && tabBar.currentTab == 0 && middleItems.count > 0) {
29 var loaderItem = middleItems.itemAt(0).item;
36 var loaderItem = middleItems.itemAt(0).item;
30 return loaderItem && loaderItem.currentItem ? loaderItem.currentItem : null;
37 return loaderItem && loaderItem.currentItem ? loaderItem.currentItem : null;
32− return null;
39+ return scopesOverviewXYScaler;
34− property int currentIndex: 0
35− property real scopeScale: 1
36− property real overrideOpacity: -1
37− property QtObject scopeStyle: QtObject {
38− property string headerLogo: ""
39− property color foreground: "white"
40− property color background: "transparent"
42− property size allCardSize: {
41+ readonly property size allCardSize: {
43 if (middleItems.count > 1) {
42 if (middleItems.count > 1) {
44 var loaderItem = middleItems.itemAt(1).item;
43 var loaderItem = middleItems.itemAt(1).item;
45 if (loaderItem) {
44 if (loaderItem) {
@@ -50,12 +49,57 @@ Item {
50 return Qt.size(0, 0);
49 return Qt.size(0, 0);
52+ // Internal properties
53+ property bool forceXYScalerEater: false
54+ property QtObject scopeStyle: QtObject {
55+ property string headerLogo: ""
56+ property color foreground: "white"
57+ property color background: "transparent"
53 signal done()
61 signal done()
54 signal favoriteSelected(int index)
62 signal favoriteSelected(int index)
55 signal allFavoriteSelected(var scopeId)
63 signal allFavoriteSelected(var scopeId)
56 signal allSelected(var scopeId, var pos)
64 signal allSelected(var scopeId, var pos)
57 signal searchSelected(var scopeId, var pos, var size)
65 signal searchSelected(var scopeId, var pos, var size)
67+ function showTemporaryScope(scope, itemPos, itemSize) {
68+ scopesOverviewXYScaler.restorePosition = itemPos;
69+ scopesOverviewXYScaler.restoreSize = itemSize;
70+ scopesOverviewXYScaler.scale = itemSize.width / scopesOverviewXYScaler.width;
71+ scopesOverviewXYScaler.x = itemPos.x -(scopesOverviewXYScaler.width - scopesOverviewXYScaler.width * scopesOverviewXYScaler.scale) / 2;
72+ scopesOverviewXYScaler.y = itemPos.y -(scopesOverviewXYScaler.height - scopesOverviewXYScaler.height * scopesOverviewXYScaler.scale) / 2;
73+ scopesOverviewXYScaler.opacity = 0;
74+ tempScopeItem.scope = scope;
75+ middleItems.overrideOpacity = 0;
76+ scopesOverviewXYScaler.scale = 1;
77+ scopesOverviewXYScaler.x = 0;
78+ scopesOverviewXYScaler.y = 0;
79+ scopesOverviewXYScaler.opacity = 1;
82+ function animateDashFromAll(scopeId) {
83+ var currentScopePos = allScopeCardPosition(scopeId);
84+ if (currentScopePos) {
85+ showDashFromPos(currentScopePos, allCardSize);
87+ console.log("Warning: Could not find Dash OverView All card position for scope", dashContent.currentScopeId);
91+ function showDashFromPos(itemPos, itemSize) {
92+ scopesOverviewXYScaler.scale = itemSize.width / scopesOverviewXYScaler.width;
93+ scopesOverviewXYScaler.x = itemPos.x -(scopesOverviewXYScaler.width - scopesOverviewXYScaler.width * scopesOverviewXYScaler.scale) / 2;
94+ scopesOverviewXYScaler.y = itemPos.y -(scopesOverviewXYScaler.height - scopesOverviewXYScaler.height * scopesOverviewXYScaler.scale) / 2;
95+ scopesOverviewXYScaler.opacity = 0;
96+ root.growingDashFromPos = true;
97+ scopesOverviewXYScaler.scale = 1;
98+ scopesOverviewXYScaler.x = 0;
99+ scopesOverviewXYScaler.y = 0;
100+ scopesOverviewXYScaler.opacity = 1;
59 function allScopeCardPosition(scopeId) {
103 function allScopeCardPosition(scopeId) {
60 if (middleItems.count > 1) {
104 if (middleItems.count > 1) {
61 var loaderItem = middleItems.itemAt(1).item;
105 var loaderItem = middleItems.itemAt(1).item;
@@ -89,11 +133,11 @@ Item {
89 // Need this in order, otherwise something gets unhappy in rendering
133 // Need this in order, otherwise something gets unhappy in rendering
90 // of the overlay in carousels because the parent of the dash dies for
134 // of the overlay in carousels because the parent of the dash dies for
91 // a moment, this way we make sure it's reparented first
135 // a moment, this way we make sure it's reparented first
92− // by forceDisableDashEater making dashItemEater return null and
136+ // by forceXYScalerEater making dashItemEater return scopesOverviewXYScaler
93− // then really kill the parent by updating scope.searchQuery
137+ // before we kill the previous parent by scope.searchQuery
94− root.forceDisableDashEater = true;
138+ root.forceXYScalerEater = true;
95 root.scope.searchQuery = pageHeader.searchQuery;
139 root.scope.searchQuery = pageHeader.searchQuery;
96− root.forceDisableDashEater = false;
140+ root.forceXYScalerEater = false;
@@ -107,11 +151,13 @@ Item {
107 PageHeader {
151 PageHeader {
108 id: pageHeader
152 id: pageHeader
154+ readonly property real yDisplacement: pageHeader.height + tabBar.height + tabBar.anchors.margins
111 if (root.progress < 0.5) {
157 if (root.progress < 0.5) {
112− return -height;
158+ return -yDisplacement;
114− return -height + (root.progress - 0.5) * height * 2;
160+ return -yDisplacement + (root.progress - 0.5) * yDisplacement * 2;
117 width: parent.width
163 width: parent.width
@@ -135,11 +181,12 @@ Item {
136 enabled: opacity == 1
182 enabled: opacity == 1
137 opacity: !scope || scope.searchQuery == "" ? 1 : 0
183 opacity: !scope || scope.searchQuery == "" ? 1 : 0
138− Behavior on opacity { UbuntuNumberAnimation {} }
184+ Behavior on opacity { UbuntuNumberAnimation { } }
141 Repeater {
187 Repeater {
142 id: middleItems
188 id: middleItems
189+ property real overrideOpacity: -1
143 model: scope && scope.searchQuery == "" ? scope.categories : null
190 model: scope && scope.searchQuery == "" ? scope.categories : null
144 delegate: Loader {
191 delegate: Loader {
145 id: loader
192 id: loader
@@ -172,8 +219,8 @@ Item {
172 scale: index == 0 ? scopeScale : 1
219 scale: index == 0 ? scopeScale : 1
174 opacity: {
221 opacity: {
175− if (root.overrideOpacity >= 0)
222+ if (middleItems.overrideOpacity >= 0)
176− return root.overrideOpacity;
223+ return middleItems.overrideOpacity;
178 if (tabBar.currentTab != index)
225 if (tabBar.currentTab != index)
179 return 0;
226 return 0;
@@ -255,9 +302,10 @@ Item {
255 showPageHeader: false
302 showPageHeader: false
256 clip: true
303 clip: true
257 opacity: searchResultsViewer.scope ? 1 : 0
304 opacity: searchResultsViewer.scope ? 1 : 0
258− Behavior on opacity { UbuntuNumberAnimation {} }
305+ Behavior on opacity { UbuntuNumberAnimation { } }
260 clickOverride: function (index, result, item, itemModel) {
307 clickOverride: function (index, result, item, itemModel) {
308+ // TODO Make sure pageheader suggestions popup is hidden
261 if (itemModel.scopeId) {
309 if (itemModel.scopeId) {
262 root.searchSelected(itemModel.scopeId, item.mapToItem(null, 0, 0), Qt.size(item.width, item.height));
310 root.searchSelected(itemModel.scopeId, item.mapToItem(null, 0, 0), Qt.size(item.width, item.height));
@@ -278,7 +326,7 @@ Item {
278 width: parent.width
326 width: parent.width
279 enabled: opacity == 0.4
327 enabled: opacity == 0.4
280 opacity: scope && scope.searchQuery == "" ? 0.4 : 0
328 opacity: scope && scope.searchQuery == "" ? 0.4 : 0
281− Behavior on opacity { UbuntuNumberAnimation {} }
329+ Behavior on opacity { UbuntuNumberAnimation { } }
283 if (root.progress < 0.5) {
331 if (root.progress < 0.5) {
284 return parent.height;
332 return parent.height;
@@ -323,4 +371,74 @@ Item {
323 height: parent.height
371 height: parent.height
324 anchors.left: scopesOverviewContent.right
372 anchors.left: scopesOverviewContent.right
378+ id: scopesOverviewXYScaler
380+ height: parent.height
385+ property bool animationsEnabled: root.showingNonFavoriteScope || root.growingDashFromPos
387+ property var restorePosition
388+ property var restoreSize
391+ enabled: scopesOverviewXYScaler.animationsEnabled
392+ UbuntuNumberAnimation { }
395+ enabled: scopesOverviewXYScaler.animationsEnabled
396+ UbuntuNumberAnimation { }
398+ Behavior on opacity {
399+ enabled: scopesOverviewXYScaler.animationsEnabled
400+ UbuntuNumberAnimation { }
403+ enabled: scopesOverviewXYScaler.animationsEnabled
404+ UbuntuNumberAnimation {
407+ if (root.showingNonFavoriteScope && scopesOverviewXYScaler.scale != 1) {
408+ tempScopeItem.scope = null;
409+ } else if (root.growingDashFromPos) {
410+ root.growingDashFromPos = false;
419+ anchors.fill: tempScopeItem
420+ visible: tempScopeItem.visible
421+ parent: tempScopeItem.parent
428+ height: parent.height
429+ scale: dash.contentScale
431+ visible: scope != null
435+ var v = scopesOverviewXYScaler.restoreSize.width / tempScopeItem.width;
436+ scopesOverviewXYScaler.scale = v;
437+ scopesOverviewXYScaler.x = scopesOverviewXYScaler.restorePosition.x -(tempScopeItem.width - tempScopeItem.width * v) / 2;
438+ scopesOverviewXYScaler.y = scopesOverviewXYScaler.restorePosition.y -(tempScopeItem.height - tempScopeItem.height * v) / 2;
439+ scopesOverviewXYScaler.opacity = 0;
440+ scopesOverview.middleItems = -1;