on xenial help sign in
fix selecting/switching to app
6c54360Michael Zanetti
qml/Stages/PhoneStage.qml+13−5
@@ -277,19 +277,21 @@ Item {
277 snapAnimation.targetContentX = 0;
277 snapAnimation.targetContentX = 0;
278 snapAnimation.start();
278 snapAnimation.start();
279 } else if (contentX < positionMarker2 * width) {
279 } else if (contentX < positionMarker2 * width) {
280+ print("selecting tile 1")
280 snapTo(1)
281 snapTo(1)
281 } else if (contentX < positionMarker3 * width) {
282 } else if (contentX < positionMarker3 * width) {
282 print("snappoing to stage1")
283 print("snappoing to stage1")
283− snapAnimation.targetContentX = width * positionMarker2 + 1;
284+ snapTo(1)
284− snapAnimation.start();
285 } else if (stage < 2){
285 } else if (stage < 2){
286 print("snappoing to stage2")
286 print("snappoing to stage2")
287+ // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
287− snapAnimation.targetContentX = width * positionMarker4;
288+ snapAnimation.targetContentX = width * positionMarker4 + 1;
288 snapAnimation.start();
289 snapAnimation.start();
289 }
290 }
290 }
291 }
291 function snapTo(index) {
292 function snapTo(index) {
293+ spreadRepeater.itemAt(index).selected = true
292− snapAnimation.targetContentX = width * positionMarker2;
294+ snapAnimation.targetContentX = 0//width * positionMarker2;
293 snapAnimation.toIndex = index;
295 snapAnimation.toIndex = index;
294 snapAnimation.start();
296 snapAnimation.start();
295 }
297 }
@@ -303,18 +305,23 @@ Item {
303 target: spreadView
305 target: spreadView
304 property: "contentX"
306 property: "contentX"
305 to: snapAnimation.targetContentX
307 to: snapAnimation.targetContentX
306− duration: UbuntuAnimation.FastDuration
308+// duration: UbuntuAnimation.FastDuration
309+ duration: UbuntuAnimation.SleepyDuration
307 }
310 }
308 ScriptAction {
311 ScriptAction {
309 script: {
312 script: {
310 print("animation finished: stage", spreadView.stage, "contentX", spreadView.contentX, "focused app", ApplicationManager.get(0).appId, ApplicationManager.get(1).appId)
313 print("animation finished: stage", spreadView.stage, "contentX", spreadView.contentX, "focused app", ApplicationManager.get(0).appId, ApplicationManager.get(1).appId)
311 if (snapAnimation.toIndex >= 0) {
314 if (snapAnimation.toIndex >= 0) {
312 print("switching to app", snapAnimation.toIndex, ApplicationManager.get(snapAnimation.toIndex).name)
315 print("switching to app", snapAnimation.toIndex, ApplicationManager.get(snapAnimation.toIndex).name)
316+ spreadRepeater.itemAt(snapAnimation.toIndex).selected = false;
313 ApplicationManager.focusApplication(ApplicationManager.get(snapAnimation.toIndex).appId);
317 ApplicationManager.focusApplication(ApplicationManager.get(snapAnimation.toIndex).appId);
318+ print("unselecting item", snapAnimation.toIndex);
319+ print("unselecting item", spreadRepeater.itemAt(snapAnimation.toIndex));
314 snapAnimation.toIndex = -1;
320 snapAnimation.toIndex = -1;
315 spreadView.contentX = 0;
321 spreadView.contentX = 0;
316 }
322 }
317 if (spreadView.contentX == spreadView.width * spreadView.positionMarker2) {
323 if (spreadView.contentX == spreadView.width * spreadView.positionMarker2) {
324+ spreadView.stage = 4;
318 spreadView.stage = 0;
325 spreadView.stage = 0;
319 spreadView.contentX = 0;
326 spreadView.contentX = 0;
320 }
327 }
@@ -331,6 +338,7 @@ Item {
331 x: spreadView.contentX
338 x: spreadView.contentX
332
339
333 Repeater {
340 Repeater {
341+ id: spreadRepeater
334 model: ApplicationManager
342 model: ApplicationManager
335 delegate: TransformedSpreadDelegate {
343 delegate: TransformedSpreadDelegate {
336 startAngle: 45
344 startAngle: 45
qml/Stages/TransformedSpreadDelegate.qml+28−30
@@ -5,6 +5,8 @@ import Ubuntu.Components 0.1
5SpreadDelegate {
5SpreadDelegate {
6 id: root
6 id: root
7
7
8+ property bool selected: false
9+
8 property real progress: 0
10 property real progress: 0
9 property real animatedProgress: 0
11 property real animatedProgress: 0
10
12
@@ -18,20 +20,16 @@ SpreadDelegate {
18 property real startDistance: units.gu(5)
20 property real startDistance: units.gu(5)
19 property real endDistance: units.gu(.5)
21 property real endDistance: units.gu(.5)
20
22
21− onClicked: {
23+ onSelectedChanged: {
24+ if (selected) {
22− priv.selectedProgress = root.progress
25+ priv.selectedProgress = root.progress
23− priv.selectedXTranslate = priv.xTranslate;
26+ priv.selectedXTranslate = priv.xTranslate;
24− priv.selectedAngle = priv.angle;
27+ priv.selectedAngle = priv.angle;
25− priv.selectedScale = priv.scale;
28+ priv.selectedScale = priv.scale;
26− priv.isSelected = true;
29+ priv.isSelected = true;
27− }
30+ print("tile", index, "selected!!!!!!!!!!!!!!!!")
28−
31+ } else {
29− Connections {
30− target: spreadView
31− onStageChanged: {
32− if (stage == 0) {
33− priv.isSelected = false;
32+ priv.isSelected = false;
34− }
35 }
33 }
36 }
34 }
37
35
@@ -44,12 +42,10 @@ SpreadDelegate {
44 property real selectedScale
42 property real selectedScale
45
43
46 property real negativeProgress: {
44 property real negativeProgress: {
47− if (index == 0) {
45+ if (index < 2) {
48− return spreadView.positionMarker2;
46+ return 0;
49− } else if (index == 1) {
50− return spreadView.positionMarker2 - (spreadView.tileDistance / spreadView.width);
51 }
47 }
52− return -(index - 2) * (spreadView.tileDistance / spreadView.width);
48+ return -spreadView.positionMarker2 -(index - 2) * (spreadView.tileDistance / spreadView.width);
53 }
49 }
54
50
55 function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
51 function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
@@ -67,6 +63,7 @@ SpreadDelegate {
67 var translation = 0;
63 var translation = 0;
68 switch (index) {
64 switch (index) {
69 case 0:
65 case 0:
66+ print("+++++++++++++++++++++++++++", spreadView.stage, priv.isSelected)
70 if (spreadView.stage == 0) {
67 if (spreadView.stage == 0) {
71 translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * .25, root.animatedProgress)
68 translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * .25, root.animatedProgress)
72 break;
69 break;
@@ -75,22 +72,22 @@ SpreadDelegate {
75 var targetTranslate = easingAnimation(0, spreadView.positionMarker4, 0, -spreadView.width, spreadView.positionMarker4) + spreadView.width
72 var targetTranslate = easingAnimation(0, spreadView.positionMarker4, 0, -spreadView.width, spreadView.positionMarker4) + spreadView.width
76 translation = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, -spreadView.width * .25, targetTranslate, root.progress)
73 translation = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, -spreadView.width * .25, targetTranslate, root.progress)
77 break;
74 break;
78− } else if (!isSelected){ // Stage 2
75+ } else if (!priv.isSelected){ // Stage 2
79 // Move the first tile a bit to the right to be aligned with the others
76 // Move the first tile a bit to the right to be aligned with the others
80 translation += spreadView.width
77 translation += spreadView.width
81 // apply the same animation as with the rest
78 // apply the same animation as with the rest
82 translation += -easingCurve.value * spreadView.width
79 translation += -easingCurve.value * spreadView.width
83 break;
80 break;
84− } else if (isSelected) {
81+ } else if (priv.isSelected) {
85 translation = linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, 0, root.progress)
82 translation = linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, 0, root.progress)
86 break;
83 break;
87 }
84 }
88
85
89 case 1:
86 case 1:
90− if (spreadView.stage == 0) {
87+ if (spreadView.stage == 0 && !priv.isSelected) {
91 translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * spreadView.snapPosition, root.animatedProgress)
88 translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * spreadView.snapPosition, root.animatedProgress)
92 break;
89 break;
93− } else if (spreadView.stage == 1) {
90+ } else if (spreadView.stage == 1 && !priv.isSelected) {
94 // find where the main easing would be when reaching stage 2
91 // find where the main easing would be when reaching stage 2
95 var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
92 var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
96 targetTranslate = easingAnimation(0, stage2Progress, 0, -spreadView.width + root.endDistance, stage2Progress);
93 targetTranslate = easingAnimation(0, stage2Progress, 0, -spreadView.width + root.endDistance, stage2Progress);
@@ -106,9 +103,10 @@ SpreadDelegate {
106 translation += -((index - 1) * root.startDistance)
103 translation += -((index - 1) * root.startDistance)
107 // ...and use our easing to move them to the left. Stop a bit earlier for each tile
104 // ...and use our easing to move them to the left. Stop a bit earlier for each tile
108 translation += -easingCurve.value * spreadView.width + (index * root.endDistance)
105 translation += -easingCurve.value * spreadView.width + (index * root.endDistance)
109− if (isSelected) {
106+ if (priv.isSelected) {
110 // Distance to left edge
107 // Distance to left edge
111 var targetTranslate = -spreadView.width - ((index - 1) * root.startDistance)
108 var targetTranslate = -spreadView.width - ((index - 1) * root.startDistance)
109+ print("selectedProgress:", selectedProgress, "negativeProgress:", negativeProgress, "progress", root.progress)
112 translation = linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, targetTranslate, root.progress)
110 translation = linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, targetTranslate, root.progress)
113 }
111 }
114 }
112 }
@@ -126,10 +124,10 @@ SpreadDelegate {
126 break;
124 break;
127 }
125 }
128 case 1:
126 case 1:
129− if (spreadView.stage == 0) {
127+ if (spreadView.stage == 0 && !priv.isSelected) {
130 newAngle = linearAnimation(0, spreadView.positionMarker2, root.startAngle, root.startAngle * (1-spreadView.snapPosition), root.animatedProgress)
128 newAngle = linearAnimation(0, spreadView.positionMarker2, root.startAngle, root.startAngle * (1-spreadView.snapPosition), root.animatedProgress)
131 break;
129 break;
132− } else if (spreadView.stage == 1) {
130+ } else if (spreadView.stage == 1 && !priv.isSelected) {
133 // find where the main easing would be when reaching stage 2
131 // find where the main easing would be when reaching stage 2
134 var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
132 var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
135 var targetAngle = easingAnimation(0, stage2Progress, root.startAngle, root.endAngle, stage2Progress)
133 var targetAngle = easingAnimation(0, stage2Progress, root.startAngle, root.endAngle, stage2Progress)
@@ -139,7 +137,7 @@ SpreadDelegate {
139
137
140 default:
138 default:
141 newAngle = root.startAngle - easingCurve.value * (root.startAngle - root.endAngle)
139 newAngle = root.startAngle - easingCurve.value * (root.startAngle - root.endAngle)
142− if (isSelected) {
140+ if (priv.isSelected) {
143 newAngle = linearAnimation(selectedProgress, negativeProgress, selectedAngle, 0, root.progress)
141 newAngle = linearAnimation(selectedProgress, negativeProgress, selectedAngle, 0, root.progress)
144 }
142 }
145 }
143 }
@@ -158,10 +156,10 @@ SpreadDelegate {
158 break;
156 break;
159 }
157 }
160 case 1:
158 case 1:
161− if (spreadView.stage == 0) {
159+ if (spreadView.stage == 0 && !priv.isSelected) {
162 newScale = linearAnimation(0, spreadView.positionMarker2, root.tile1StartScale, 1, root.animatedProgress)
160 newScale = linearAnimation(0, spreadView.positionMarker2, root.tile1StartScale, 1, root.animatedProgress)
163 break;
161 break;
164− } else if (spreadView.stage == 1) {
162+ } else if (spreadView.stage == 1 && !priv.isSelected) {
165 // find where the main easing would be when reaching positionMarker4
163 // find where the main easing would be when reaching positionMarker4
166 var targetScale = easingAnimation(0, spreadView.positionMarker4, root.startScale, root.endScale, spreadView.positionMarker4);
164 var targetScale = easingAnimation(0, spreadView.positionMarker4, root.startScale, root.endScale, spreadView.positionMarker4);
167 newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, targetScale, root.progress)
165 newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, targetScale, root.progress)
@@ -170,7 +168,7 @@ SpreadDelegate {
170
168
171 default:
169 default:
172 newScale = root.startScale - easingCurve.value * (root.startScale - root.endScale)
170 newScale = root.startScale - easingCurve.value * (root.startScale - root.endScale)
173− if (isSelected) {
171+ if (priv.isSelected) {
174 newScale = linearAnimation(selectedProgress, negativeProgress, selectedScale, 1, root.progress)
172 newScale = linearAnimation(selectedProgress, negativeProgress, selectedScale, 1, root.progress)
175 }
173 }
176 }
174 }