@@ -6,7 +6,6 @@ SpreadDelegate {
8 property real progress: 0
8 property real progress: 0
9−// onProgressChanged: if (index == 0) print("tile", index, "progress changed:", progress)
10 property real animatedProgress: 0
9 property real animatedProgress: 0
12 property real startAngle: 0
11 property real startAngle: 0
@@ -46,83 +45,52 @@ SpreadDelegate {
47 property real negativeProgress: (index - 1) * spreadView.positionMarker1
46 property real negativeProgress: (index - 1) * spreadView.positionMarker1
48+ function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
49+ // progress : progressDiff = value : valueDiff
50+ return (progress - startProgress) * (endValue - startValue) / (endProgress - startProgress) + startValue;
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;
50 property real xTranslate: {
59 property real xTranslate: {
51 var translation = 0;
60 var translation = 0;
52 switch (index) {
61 switch (index) {
54 if (spreadView.stage == 0) {
63 if (spreadView.stage == 0) {
55− // Need to compensate the flickable movement (fixing first tile at the left edge)
64+ translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * .25, root.animatedProgress)
56− var compensation = root.progress * spreadView.width
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
65− translation = compensation + movement;
66 } else if (spreadView.stage == 1){
65 } else if (spreadView.stage == 1){
67− // Need to compensate the flickable movement (fixing first tile at the left edge)
66+ // find where the main easing would be when reaching stage 2
68− var compensation = spreadView.contentX - spreadRow.x
67+ var targetTranslate = easingAnimation(0, spreadView.positionMarker4, 0, -spreadView.width, spreadView.positionMarker4) + spreadView.width
69−
68+ translation = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, -spreadView.width * .25, targetTranslate, root.progress)
70− // When we start, we need to continue from where state 0 left
71− var stage0Movement = -spreadView.width * 0.25
73− var progress = root.progress - spreadView.positionMarker2
74− var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
75− var translateDiff = -stage0Movement;
77− var movement = progress * translateDiff / progressDiff
79− translation = compensation + stage0Movement + movement;
80 } else { // Stage 2
69 } else { // Stage 2
81− // Move the first tile a bit to the left to be aligned with the others
70+// // Move the first tile a bit to the right to be aligned with the others
82− translation += spreadView.contentX - spreadRow.x + spreadView.width
71+ translation += spreadView.width
83 // apply the same animation as with the rest
72 // apply the same animation as with the rest
84 translation += -easingCurve.value * spreadView.width
73 translation += -easingCurve.value * spreadView.width
88 if (spreadView.stage == 0) {
77 if (spreadView.stage == 0) {
89− // Need to compensate the flickable movement (fix it to the right edge)
90− var compensation = root.progress * spreadView.width
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
78+ translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * spreadView.snapPosition, root.animatedProgress)
96− // progress : progressDiff = translate : translateDiff
97− var movement = progress * translateDiff / progressDiff
99− translation = compensation + movement;
101 } else if (spreadView.stage == 1) {
80 } 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
105− // Add where stage 0 has moved it to
106− var stage0Movement = -spreadView.width * spreadView.snapPosition;
108− // Calclulate animation between stage0Movement and targetTranslate
109− var progress = root.progress
110− var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
112− // find where the main easing would be when reaching positionMarker4
81+// // find where the main easing would be when reaching stage 2
113− helperEasingCurve.progress = progressDiff;
82+ var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
114− var targetTranslate = -helperEasingCurve.value * spreadView.width + root.endDistance
83+ targetTranslate = easingAnimation(0, stage2Progress, 0, -spreadView.width + root.endDistance, stage2Progress);
116− var translateDiff = targetTranslate - stage0Movement;
85+ translation = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
117− var movement = progress * translateDiff / progressDiff
86+ -spreadView.width * spreadView.snapPosition, targetTranslate, root.progress);
119− translation = compensation + stage0Movement + movement;
124− // Fix it at the right edge...
92+// // Fix it at the right edge...
125− translation += spreadView.contentX - spreadRow.x - ((index - 1) * root.startDistance)
93+ translation += -((index - 1) * root.startDistance)
126 // ...and use our easing to move them to the left. Stop a bit earlier for each tile
94 // ...and use our easing to move them to the left. Stop a bit earlier for each tile
127 translation += -easingCurve.value * spreadView.width + (index * root.endDistance)
95 translation += -easingCurve.value * spreadView.width + (index * root.endDistance)
128 if (isSelected) {
96 if (isSelected) {
@@ -149,44 +117,22 @@ SpreadDelegate {
149 switch (index) {
117 switch (index) {
151 if (spreadView.stage == 0) {
119 if (spreadView.stage == 0) {
152− var progress = root.animatedProgress;
153− var progressDiff = spreadView.positionMarker2;
154− var angleDiff = root.endAngle * spreadView.snapPosition;
120+ newAngle = linearAnimation(0, spreadView.positionMarker2, 0, root.endAngle * spreadView.snapPosition, root.animatedProgress)
155− // progress : progressDiff = angle : angleDiff
156− newAngle = progress * angleDiff / progressDiff;
158 } else if (spreadView.stage == 1) {
122 } else if (spreadView.stage == 1) {
159− var stage0Angle = root.endAngle * spreadView.snapPosition;
123+ newAngle = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.endAngle * spreadView.snapPosition, root.endAngle, root.progress)
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);
170 if (spreadView.stage == 0) {
127 if (spreadView.stage == 0) {
171− var progress = root.animatedProgress;
128+ newAngle = linearAnimation(0, spreadView.positionMarker2, root.startAngle, root.startAngle * (1-spreadView.snapPosition), root.animatedProgress)
172− var progressDiff = spreadView.positionMarker2;
173− var angleDiff = root.startAngle * spreadView.snapPosition
175− // progress : progressDiff = angle : angleDiff
176− var angleTranslate = progress * angleDiff / progressDiff;
178− newAngle = root.startAngle - angleTranslate;
180 } else if (spreadView.stage == 1) {
130 } else if (spreadView.stage == 1) {
181− var stage0Angle = root.startAngle - (root.startAngle * spreadView.snapPosition)
131+ // find where the main easing would be when reaching stage 2
183− var progress = root.progress
184− var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
132+ helperEasingCurve.progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
185− var angleDiff = root.endAngle - stage0Angle;
133+ var targetAngle = root.startAngle - helperEasingCurve.value * (root.startAngle - root.endAngle)
187− // progress : progressDiff = angle : angleDiff
135+ newAngle = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.startAngle * (1-spreadView.snapPosition), targetAngle, root.progress)
188− var angleTranslate = progress * angleDiff / progressDiff;
189− newAngle = stage0Angle + angleTranslate;
@@ -213,40 +159,20 @@ SpreadDelegate {
213 newScale = 1;
159 newScale = 1;
215 } else if(spreadView.stage == 1) {
161 } else if(spreadView.stage == 1) {
216− var progress = root.progress - spreadView.positionMarker2
162+ newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, root.endScale, root.progress)
217− var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
218− var scaleDiff = 1 - root.endScale;
219− // progress : progressDiff = angle : angleDiff
220− newScale = 1 - (progress * scaleDiff / progressDiff);
224 if (spreadView.stage == 0) {
166 if (spreadView.stage == 0) {
225− var progress = root.animatedProgress;
167+ newScale = linearAnimation(0, spreadView.positionMarker2, root.tile1StartScale, 1, root.animatedProgress)
226− var progressDiff = spreadView.positionMarker2;
227− var scaleDiff = (root.tile1StartScale - 1) * spreadView.snapPosition
229− // progress : progressDiff = angle : angleDiff
230− var scaleTranslate = progress * scaleDiff / progressDiff;
232− newScale = root.tile1StartScale - scaleTranslate;
234 } else if (spreadView.stage == 1) {
169 } else if (spreadView.stage == 1) {
235− var stage0Scale = root.tile1StartScale - (root.tile1StartScale - 1) * spreadView.snapPosition
237− var progress = root.progress
238− var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
240− // find where the main easing would be when reaching positionMarker4
170+// // find where the main easing would be when reaching positionMarker4
241− helperEasingCurve.progress = progressDiff;
171+// helperEasingCurve.progress = spreadView.positionMarker4;
242− var targetScale = root.startScale - helperEasingCurve.value * (root.startScale - root.endScale)
172+// var targetScale = root.startScale - helperEasingCurve.value * (root.startScale - root.endScale)
243−
173+ var targetScale = easingAnimation(0, spreadView.positionMarker4, root.startScale, root.endScale, spreadView.positionMarker4);
244− var scaleDiff = stage0Scale - targetScale;
174+ newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, targetScale, root.progress)
246− // progress : progressDiff = angle : angleDiff
247− var scaleTranslate = progress * scaleDiff / progressDiff;
249− return stage0Scale - scaleTranslate;