on xenial help sign in
code improvements
commit1d3b58e3a56fe0c3797be68f936de2eb2ef91259 authorMichael Zanetti <michael.zanetti@canonical.com> dateWed 29 Jan 2014, 11:46 (13 years ago) parente3f9656
2 files changed+66−140
qml/Stages/PhoneStage.qml+27−27 qml/Stages/TransformedSpreadDelegate.qml+39−113
qml/Stages/PhoneStage.qml+27−27
@@ -206,10 +206,10 @@ Item {
206206 if (dragging && !priv.waitingForScreenshot && attachedToView) {
207207 spreadView.contentX = -touchX
208208 }
209−// if (attachedToView && spreadView.contentX >= spreadView.width * spreadView.positionMarker3) {
210−// attachedToView = false;
211−// spreadView.snap();
212−// }
209+ if (attachedToView && spreadView.contentX >= spreadView.width * spreadView.positionMarker3) {
210+ attachedToView = false;
211+ spreadView.snap();
212+ }
213213 }
214214
215215 onDraggingChanged: {
@@ -240,10 +240,10 @@ Item {
240240
241241 property int tileDistance: width / 4
242242
243− property real positionMarker1: 0.25
244− property real positionMarker2: 0.5
245− property real positionMarker3: 0.7
246− property real positionMarker4: 1.25
243+ property real positionMarker1: 0.35
244+ property real positionMarker2: 0.45
245+ property real positionMarker3: 0.6
246+ property real positionMarker4: .9
247247
248248 // This is where the first app snaps to when bringing it in to the right.
249249 property real snapPosition: 0.75
@@ -279,9 +279,11 @@ Item {
279279 } else if (contentX < positionMarker2 * width) {
280280 snapTo(1)
281281 } else if (contentX < positionMarker3 * width) {
282+ print("snappoing to stage1")
282283 snapAnimation.targetContentX = width * positionMarker2 + 1;
283284 snapAnimation.start();
284285 } else if (stage < 2){
286+ print("snappoing to stage2")
285287 snapAnimation.targetContentX = width * positionMarker4;
286288 snapAnimation.start();
287289 }
@@ -312,18 +314,21 @@ Item {
312314 snapAnimation.toIndex = -1;
313315 spreadView.contentX = 0;
314316 }
315− if (spreadView.stage == 1) {
317+ if (spreadView.contentX == spreadView.width * spreadView.positionMarker2) {
316318 spreadView.stage = 0;
317319 spreadView.contentX = 0;
318320 }
321+ print("snapping done. stage:", spreadView.stage)
319322 }
320323 }
321324 }
322325
323326
324− Row {
327+ Item {
325328 id: spreadRow
326− width: implicitWidth + (spreadView.width * spreadView.positionMarker2) + (spreadView.width - spreadView.tileDistance)
329+ width: ApplicationManager.count * spreadView.tileDistance + (spreadView.width - spreadView.tileDistance) * 1.5 //(spreadView.width * spreadView.positionMarker2) + (spreadView.width - spreadView.tileDistance)
330+
331+ x: spreadView.contentX
327332
328333 Repeater {
329334 model: ApplicationManager
@@ -334,16 +339,18 @@ Item {
334339 endScale: 0.7
335340 startDistance: spreadView.tileDistance
336341 endDistance: units.gu(.5)
342+ height: spreadView.height
337343
338344 z: index
339− height: spreadView.height
345+ x: index == 0 ? 0 : spreadView.width + (index - 1) * spreadView.tileDistance
346+
340347 width: {
341348 switch (index) {
342349 case 0:
343350 return spreadView.width;
344351 case 1:
345352 if (spreadView.stage == 0) {
346− return spreadView.width / 2;
353+ return spreadView.width * spreadView.positionMarker2;
347354 }
348355 default:
349356 return spreadView.tileDistance;
@@ -353,30 +360,25 @@ Item {
353360 progress: {
354361 switch (index) {
355362 case 0:
356− var progress = spreadView.contentX / spreadView.width;
357− if (spreadView.stage == 2) {
358− progress -= spreadView.positionMarker1;
359− }
360−
361− return progress;
363+ return spreadView.contentX / spreadView.width;
362364 case 1:
363365 var progress = spreadView.contentX / spreadView.width;
364− if (spreadView.stage != 0) {
365− progress -= spreadView.positionMarker2;
366+ if (spreadView.stage == 2) {
367+ progress -= spreadView.tileDistance / spreadView.width;
366368 }
367−
368369 return Math.max(0, progress);
369370 }
370− return (spreadView.contentX - (spreadView.positionMarker2 * spreadView.width) - spreadView.tileDistance * (index - 1)) / spreadView.width;
371+ // This delays the progress for all tiles > 1 for the duration of stage 1
372+ var stage1Distance = spreadView.positionMarker2 * spreadView.width;
373+ var tileDistance = (index - 2) * spreadView.tileDistance;
374+ return (spreadView.contentX - stage1Distance - tileDistance) / spreadView.width;
371375 }
372376
373377 animatedProgress: {
374378 if (spreadView.stage < 2 && index < 2) {
375379 if (spreadView.contentX < spreadView.width * spreadView.positionMarker1) {
376− if (index == 0) print("*********************", spreadView.contentX / spreadView.width)
377380 return spreadView.contentX / spreadView.width
378381 } else if (spreadView.stage == 0){
379− if (index == 0) print("!!!!!!!!!!!!!!!11!", spreadView.positionMarker2)
380382 return spreadView.positionMarker2
381383 }
382384 }
@@ -393,10 +395,8 @@ Item {
393395 target: spreadView
394396 onStageChanged: {
395397 if (spreadView.stage == 0) {
396− print("************************ enabling")
397398 enableAnimationTimer.start();
398399 } else {
399− print("************************ disabling")
400400 stage1Animation.enabled = false;
401401 }
402402 }
qml/Stages/TransformedSpreadDelegate.qml+39−113
@@ -6,7 +6,6 @@ SpreadDelegate {
66 id: root
77
88 property real progress: 0
9−// onProgressChanged: if (index == 0) print("tile", index, "progress changed:", progress)
109 property real animatedProgress: 0
1110
1211 property real startAngle: 0
@@ -46,83 +45,52 @@ SpreadDelegate {
4645
4746 property real negativeProgress: (index - 1) * spreadView.positionMarker1
4847
48+ function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
49+ // progress : progressDiff = value : valueDiff
50+ return (progress - startProgress) * (endValue - startValue) / (endProgress - startProgress) + startValue;
51+ }
52+
53+ function easingAnimation(startProgress, endProgress, startValue, endValue, progress) {
54+ helperEasingCurve.progress = progress - startProgress;
55+ helperEasingCurve.period = endProgress - startProgress;
56+ return helperEasingCurve.value * (endValue - startValue) + startValue;
57+ }
4958
5059 property real xTranslate: {
5160 var translation = 0;
5261 switch (index) {
5362 case 0:
5463 if (spreadView.stage == 0) {
55− // Need to compensate the flickable movement (fixing first tile at the left edge)
56− var compensation = root.progress * spreadView.width
57−
58− // Calculating the small movement of the first tile
59− var progress = root.animatedProgress
60− var progressDiff = spreadView.positionMarker2
61− var translateDiff = -spreadView.width * 0.25
62− // progress : progressDiff = translate : translateDiff
63− var movement = progress * translateDiff / progressDiff
64−
65− translation = compensation + movement;
64+ translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * .25, root.animatedProgress)
6665 } else if (spreadView.stage == 1){
67− // Need to compensate the flickable movement (fixing first tile at the left edge)
68− var compensation = spreadView.contentX - spreadRow.x
69−
70− // When we start, we need to continue from where state 0 left
71− var stage0Movement = -spreadView.width * 0.25
72−
73− var progress = root.progress - spreadView.positionMarker2
74− var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
75− var translateDiff = -stage0Movement;
76−
77− var movement = progress * translateDiff / progressDiff
78−
79− translation = compensation + stage0Movement + movement;
66+ // find where the main easing would be when reaching stage 2
67+ var targetTranslate = easingAnimation(0, spreadView.positionMarker4, 0, -spreadView.width, spreadView.positionMarker4) + spreadView.width
68+ translation = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, -spreadView.width * .25, targetTranslate, root.progress)
8069 } else { // Stage 2
81− // Move the first tile a bit to the left to be aligned with the others
82− translation += spreadView.contentX - spreadRow.x + spreadView.width
70+// // Move the first tile a bit to the right to be aligned with the others
71+ translation += spreadView.width
8372 // apply the same animation as with the rest
8473 translation += -easingCurve.value * spreadView.width
8574 }
8675 break;
8776 case 1:
8877 if (spreadView.stage == 0) {
89− // Need to compensate the flickable movement (fix it to the right edge)
90− var compensation = root.progress * spreadView.width
91−
92− // Calculate movemoent for the first app coming from the right
93− var progress = root.animatedProgress
94− var progressDiff = spreadView.positionMarker2
95− var translateDiff = -spreadView.width * spreadView.snapPosition
96− // progress : progressDiff = translate : translateDiff
97− var movement = progress * translateDiff / progressDiff
98−
99− translation = compensation + movement;
78+ translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * spreadView.snapPosition, root.animatedProgress)
10079 break;
10180 } else if (spreadView.stage == 1) {
102− // Need to compensate the flickable movement (fix it to the right edge)
103− var compensation = root.progress * spreadView.width + spreadView.width/2
104−
105− // Add where stage 0 has moved it to
106− var stage0Movement = -spreadView.width * spreadView.snapPosition;
107−
108− // Calclulate animation between stage0Movement and targetTranslate
109− var progress = root.progress
110− var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
111−
112− // find where the main easing would be when reaching positionMarker4
113− helperEasingCurve.progress = progressDiff;
114− var targetTranslate = -helperEasingCurve.value * spreadView.width + root.endDistance
81+// // find where the main easing would be when reaching stage 2
82+ var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
83+ targetTranslate = easingAnimation(0, stage2Progress, 0, -spreadView.width + root.endDistance, stage2Progress);
11584
116− var translateDiff = targetTranslate - stage0Movement;
117− var movement = progress * translateDiff / progressDiff
85+ translation = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
86+ -spreadView.width * spreadView.snapPosition, targetTranslate, root.progress);
11887
119− translation = compensation + stage0Movement + movement;
12088 break;
12189 }
12290
12391 default:
124− // Fix it at the right edge...
125− translation += spreadView.contentX - spreadRow.x - ((index - 1) * root.startDistance)
92+// // Fix it at the right edge...
93+ translation += -((index - 1) * root.startDistance)
12694 // ...and use our easing to move them to the left. Stop a bit earlier for each tile
12795 translation += -easingCurve.value * spreadView.width + (index * root.endDistance)
12896 if (isSelected) {
@@ -149,44 +117,22 @@ SpreadDelegate {
149117 switch (index) {
150118 case 0:
151119 if (spreadView.stage == 0) {
152− var progress = root.animatedProgress;
153− var progressDiff = spreadView.positionMarker2;
154− var angleDiff = root.endAngle * spreadView.snapPosition;
155− // progress : progressDiff = angle : angleDiff
156− newAngle = progress * angleDiff / progressDiff;
120+ newAngle = linearAnimation(0, spreadView.positionMarker2, 0, root.endAngle * spreadView.snapPosition, root.animatedProgress)
157121 break;
158122 } else if (spreadView.stage == 1) {
159− var stage0Angle = root.endAngle * spreadView.snapPosition;
160−
161− var progress = root.progress - spreadView.positionMarker2;
162− var angleDiff = root.endAngle;
163− var progressDiff = 1 - spreadView.positionMarker2;
164− var angleTransform = progress * angleDiff / progressDiff;
165− newAngle = stage0Angle + angleTransform;
166− newAngle = Math.min(root.endAngle, newAngle);
123+ newAngle = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.endAngle * spreadView.snapPosition, root.endAngle, root.progress)
167124 break;
168125 }
169126 case 1:
170127 if (spreadView.stage == 0) {
171− var progress = root.animatedProgress;
172− var progressDiff = spreadView.positionMarker2;
173− var angleDiff = root.startAngle * spreadView.snapPosition
174−
175− // progress : progressDiff = angle : angleDiff
176− var angleTranslate = progress * angleDiff / progressDiff;
177−
178− newAngle = root.startAngle - angleTranslate;
128+ newAngle = linearAnimation(0, spreadView.positionMarker2, root.startAngle, root.startAngle * (1-spreadView.snapPosition), root.animatedProgress)
179129 break;
180130 } else if (spreadView.stage == 1) {
181− var stage0Angle = root.startAngle - (root.startAngle * spreadView.snapPosition)
182−
183− var progress = root.progress
184− var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
185− var angleDiff = root.endAngle - stage0Angle;
131+ // find where the main easing would be when reaching stage 2
132+ helperEasingCurve.progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
133+ var targetAngle = root.startAngle - helperEasingCurve.value * (root.startAngle - root.endAngle)
186134
187− // progress : progressDiff = angle : angleDiff
188− var angleTranslate = progress * angleDiff / progressDiff;
189− newAngle = stage0Angle + angleTranslate;
135+ newAngle = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.startAngle * (1-spreadView.snapPosition), targetAngle, root.progress)
190136 break;
191137 }
192138
@@ -213,40 +159,20 @@ SpreadDelegate {
213159 newScale = 1;
214160 break
215161 } else if(spreadView.stage == 1) {
216− var progress = root.progress - spreadView.positionMarker2
217− var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
218− var scaleDiff = 1 - root.endScale;
219− // progress : progressDiff = angle : angleDiff
220− newScale = 1 - (progress * scaleDiff / progressDiff);
162+ newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, root.endScale, root.progress)
221163 break;
222164 }
223165 case 1:
224166 if (spreadView.stage == 0) {
225− var progress = root.animatedProgress;
226− var progressDiff = spreadView.positionMarker2;
227− var scaleDiff = (root.tile1StartScale - 1) * spreadView.snapPosition
228−
229− // progress : progressDiff = angle : angleDiff
230− var scaleTranslate = progress * scaleDiff / progressDiff;
231−
232− newScale = root.tile1StartScale - scaleTranslate;
167+ newScale = linearAnimation(0, spreadView.positionMarker2, root.tile1StartScale, 1, root.animatedProgress)
233168 break;
234169 } else if (spreadView.stage == 1) {
235− var stage0Scale = root.tile1StartScale - (root.tile1StartScale - 1) * spreadView.snapPosition
236−
237− var progress = root.progress
238− var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
239−
240− // find where the main easing would be when reaching positionMarker4
241− helperEasingCurve.progress = progressDiff;
242− var targetScale = root.startScale - helperEasingCurve.value * (root.startScale - root.endScale)
243−
244− var scaleDiff = stage0Scale - targetScale;
245−
246− // progress : progressDiff = angle : angleDiff
247− var scaleTranslate = progress * scaleDiff / progressDiff;
248−
249− return stage0Scale - scaleTranslate;
170+// // find where the main easing would be when reaching positionMarker4
171+// helperEasingCurve.progress = spreadView.positionMarker4;
172+// var targetScale = root.startScale - helperEasingCurve.value * (root.startScale - root.endScale)
173+ var targetScale = easingAnimation(0, spreadView.positionMarker4, root.startScale, root.endScale, spreadView.positionMarker4);
174+ newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, targetScale, root.progress)
175+ break;
250176 }
251177
252178 default: