on xenial help sign in
fix selecting of tiles, improve performance, kill a binding loop
commitc055fc2e8f99141300126963caae2a96d20aab12 authorMichael Zanetti <michael.zanetti@canonical.com> dateThu 30 Jan 2014, 14:01 (13 years ago) parent6c54360
2 files changed+84−47
qml/Stages/PhoneStage.qml+19−21 qml/Stages/TransformedSpreadDelegate.qml+65−26
qml/Stages/PhoneStage.qml+19−21
@@ -254,6 +254,8 @@ Item {
254254 // 2: The list is dragged further and snaps into the spread view when entering stage 2
255255 property int stage: 0
256256
257+ property int selectedIndex: -1
258+
257259 onStageChanged: print("*******stage cahnged", stage)
258260
259261 onContentXChanged: {
@@ -290,34 +292,30 @@ Item {
290292 }
291293 }
292294 function snapTo(index) {
293− spreadRepeater.itemAt(index).selected = true
294− snapAnimation.targetContentX = 0//width * positionMarker2;
295− snapAnimation.toIndex = index;
295+ spreadView.selectedIndex = index;
296+
297+ snapAnimation.targetContentX = 0;
296298 snapAnimation.start();
297299 }
298300
299301 SequentialAnimation {
300302 id: snapAnimation
301303 property int targetContentX: 0
302− property int toIndex: -1
303304
304305 UbuntuNumberAnimation {
305306 target: spreadView
306307 property: "contentX"
307308 to: snapAnimation.targetContentX
308−// duration: UbuntuAnimation.FastDuration
309− duration: UbuntuAnimation.SleepyDuration
309+ duration: UbuntuAnimation.FastDuration
310+// duration: UbuntuAnimation.SleepyDuration
310311 }
311312 ScriptAction {
312313 script: {
313314 print("animation finished: stage", spreadView.stage, "contentX", spreadView.contentX, "focused app", ApplicationManager.get(0).appId, ApplicationManager.get(1).appId)
314− if (snapAnimation.toIndex >= 0) {
315− print("switching to app", snapAnimation.toIndex, ApplicationManager.get(snapAnimation.toIndex).name)
316− spreadRepeater.itemAt(snapAnimation.toIndex).selected = false;
317− ApplicationManager.focusApplication(ApplicationManager.get(snapAnimation.toIndex).appId);
318− print("unselecting item", snapAnimation.toIndex);
319− print("unselecting item", spreadRepeater.itemAt(snapAnimation.toIndex));
320− snapAnimation.toIndex = -1;
315+ if (spreadView.selectedIndex >= 0) {
316+ print("switching to app", snapAnimation.toIndex, ApplicationManager.get(spreadView.selectedIndex).name)
317+ ApplicationManager.focusApplication(ApplicationManager.get(spreadView.selectedIndex).appId);
318+ spreadView.selectedIndex = -1
321319 spreadView.contentX = 0;
322320 }
323321 if (spreadView.contentX == spreadView.width * spreadView.positionMarker2) {
@@ -342,12 +340,14 @@ Item {
342340 model: ApplicationManager
343341 delegate: TransformedSpreadDelegate {
344342 startAngle: 45
345− endAngle: 10
343+ endAngle: 5
346344 startScale: 1
347− endScale: 0.7
345+ endScale: 0.6
348346 startDistance: spreadView.tileDistance
349347 endDistance: units.gu(.5)
350348 height: spreadView.height
349+ selected: spreadView.selectedIndex == index
350+ otherSelected: spreadView.selectedIndex >= 0 && !selected
351351
352352 z: index
353353 x: index == 0 ? 0 : spreadView.width + (index - 1) * spreadView.tileDistance
@@ -419,12 +419,10 @@ Item {
419419
420420 Behavior on animatedProgress {
421421 id: stage1Animation
422− SequentialAnimation {
423− SmoothedAnimation {
424− velocity: 2;
425− duration: UbuntuAnimation.BriskDuration;
426− easing: UbuntuAnimation.StandardEasing
427− }
422+ SmoothedAnimation {
423+ velocity: .5;
424+// duration: UbuntuAnimation.BriskDuration;
425+// easing: UbuntuAnimation.StandardEasing
428426 }
429427 }
430428 }
qml/Stages/TransformedSpreadDelegate.qml+65−26
@@ -6,6 +6,7 @@ SpreadDelegate {
66 id: root
77
88 property bool selected: false
9+ property bool otherSelected: false
910
1011 property real progress: 0
1112 property real animatedProgress: 0
@@ -22,24 +23,59 @@ SpreadDelegate {
2223
2324 onSelectedChanged: {
2425 if (selected) {
25− priv.selectedProgress = root.progress
26− priv.selectedXTranslate = priv.xTranslate;
27− priv.selectedAngle = priv.angle;
28− priv.selectedScale = priv.scale;
29− priv.isSelected = true;
30− print("tile", index, "selected!!!!!!!!!!!!!!!!")
31− } else {
32− priv.isSelected = false;
26+ priv.snapshot();
27+ }
28+ print("setting selected to", selected)
29+ priv.isSelected = selected;
30+ }
31+
32+ onOtherSelectedChanged: {
33+ if (otherSelected) {
34+ priv.snapshot();
35+ }
36+ priv.otherSelected = otherSelected;
37+ }
38+
39+ Connections {
40+ target: spreadView
41+ onStageChanged: {
42+ if (spreadView.stage == 1) {
43+ if (index == 0) {
44+ priv.stage2startTranslate = priv.easingAnimation(0, spreadView.positionMarker4, 0, -spreadView.width, spreadView.positionMarker4) + spreadView.width;
45+ } else if (index == 1) {
46+ // find where the main easing for Tile 1 would be when reaching stage 2
47+ var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
48+ priv.stage2startTranslate = priv.easingAnimation(0, stage2Progress, 0, -spreadView.width + root.endDistance, stage2Progress);
49+ priv.stage2startAngle = priv.easingAnimation(0, stage2Progress, root.startAngle, root.endAngle, stage2Progress)
50+ priv.stage2startScale = priv.easingAnimation(0, stage2Progress, root.startScale, root.endScale, stage2Progress);
51+ }
52+ }
3353 }
3454 }
3555
3656 QtObject {
3757 id: priv
3858 property bool isSelected: false
59+ property bool otherSelected: false
3960 property real selectedProgress
4061 property real selectedXTranslate
4162 property real selectedAngle
4263 property real selectedScale
64+ property real selectedOpacity
65+
66+ // Those values are needed as target values for the end of stage 1.
67+ // As they are static values, lets caluclate them once when entering stage 1 instead of calculating them in each animation pass.
68+ property real stage2startTranslate
69+ property real stage2startAngle
70+ property real stage2startScale
71+
72+ function snapshot() {
73+ selectedProgress = root.progress;
74+ selectedXTranslate = xTranslate;
75+ selectedAngle = angle;
76+ selectedScale = scale;
77+ selectedOpacity = opacity;
78+ }
4379
4480 property real negativeProgress: {
4581 if (index < 2) {
@@ -63,14 +99,11 @@ SpreadDelegate {
6399 var translation = 0;
64100 switch (index) {
65101 case 0:
66− print("+++++++++++++++++++++++++++", spreadView.stage, priv.isSelected)
67102 if (spreadView.stage == 0) {
68103 translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * .25, root.animatedProgress)
69104 break;
70105 } else if (spreadView.stage == 1){
71− // find where the main easing would be when reaching stage 2
72− var targetTranslate = easingAnimation(0, spreadView.positionMarker4, 0, -spreadView.width, spreadView.positionMarker4) + spreadView.width
73− translation = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, -spreadView.width * .25, targetTranslate, root.progress)
106+ translation = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, -spreadView.width * .25, priv.stage2startTranslate, root.progress)
74107 break;
75108 } else if (!priv.isSelected){ // Stage 2
76109 // Move the first tile a bit to the right to be aligned with the others
@@ -88,13 +121,8 @@ SpreadDelegate {
88121 translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * spreadView.snapPosition, root.animatedProgress)
89122 break;
90123 } else if (spreadView.stage == 1 && !priv.isSelected) {
91− // find where the main easing would be when reaching stage 2
92− var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
93− targetTranslate = easingAnimation(0, stage2Progress, 0, -spreadView.width + root.endDistance, stage2Progress);
94−
95124 translation = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
96− -spreadView.width * spreadView.snapPosition, targetTranslate, root.progress);
97−
125+ -spreadView.width * spreadView.snapPosition, priv.stage2startTranslate, root.progress);
98126 break;
99127 }
100128
@@ -106,7 +134,6 @@ SpreadDelegate {
106134 if (priv.isSelected) {
107135 // Distance to left edge
108136 var targetTranslate = -spreadView.width - ((index - 1) * root.startDistance)
109− print("selectedProgress:", selectedProgress, "negativeProgress:", negativeProgress, "progress", root.progress)
110137 translation = linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, targetTranslate, root.progress)
111138 }
112139 }
@@ -128,10 +155,7 @@ SpreadDelegate {
128155 newAngle = linearAnimation(0, spreadView.positionMarker2, root.startAngle, root.startAngle * (1-spreadView.snapPosition), root.animatedProgress)
129156 break;
130157 } else if (spreadView.stage == 1 && !priv.isSelected) {
131− // find where the main easing would be when reaching stage 2
132− var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
133− var targetAngle = easingAnimation(0, stage2Progress, root.startAngle, root.endAngle, stage2Progress)
134− newAngle = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.startAngle * (1-spreadView.snapPosition), targetAngle, root.progress)
158+ newAngle = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.startAngle * (1-spreadView.snapPosition), priv.stage2startAngle, root.progress)
135159 break;
136160 }
137161
@@ -160,9 +184,7 @@ SpreadDelegate {
160184 newScale = linearAnimation(0, spreadView.positionMarker2, root.tile1StartScale, 1, root.animatedProgress)
161185 break;
162186 } else if (spreadView.stage == 1 && !priv.isSelected) {
163− // find where the main easing would be when reaching positionMarker4
164− var targetScale = easingAnimation(0, spreadView.positionMarker4, root.startScale, root.endScale, spreadView.positionMarker4);
165− newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, targetScale, root.progress)
187+ newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, priv.stage2startScale, root.progress)
166188 break;
167189 }
168190
@@ -174,6 +196,22 @@ SpreadDelegate {
174196 }
175197 return newScale;
176198 }
199+
200+ property real opacity: {
201+ if (otherSelected) {
202+ return linearAnimation (selectedProgress, selectedProgress - .5, selectedOpacity, 0, root.progress)
203+ }
204+ if (index == 0) {
205+ switch (spreadView.stage) {
206+ case 0:
207+ return linearAnimation(0, spreadView.positionMarker2, 1, .3, root.animatedProgress)
208+ case 1:
209+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, .3, 1, root.animatedProgress)
210+ }
211+ }
212+
213+ return 1;
214+ }
177215 }
178216
179217 transform: [
@@ -191,6 +229,7 @@ SpreadDelegate {
191229 x: priv.xTranslate
192230 }
193231 ]
232+ opacity: priv.opacity
194233
195234 EasingCurve {
196235 id: easingCurve