@@ -55,7 +55,7 @@ SpreadDelegate {
55 var compensation = root.progress * spreadView.width
55 var compensation = root.progress * spreadView.width
57 // Calculating the small movement of the first tile
57 // Calculating the small movement of the first tile
58− var progress = root.progress
58+ var progress = root.animatedProgress
59 var progressDiff = spreadView.positionMarker2
59 var progressDiff = spreadView.positionMarker2
60 var translateDiff = -spreadView.width * 0.25
60 var translateDiff = -spreadView.width * 0.25
61 // progress : progressDiff = translate : translateDiff
61 // progress : progressDiff = translate : translateDiff
@@ -65,12 +65,22 @@ SpreadDelegate {
65 } else if (spreadView.stage == 1){
65 } else if (spreadView.stage == 1){
66 // Need to compensate the flickable movement (fixing first tile at the left edge)
66 // Need to compensate the flickable movement (fixing first tile at the left edge)
67 var compensation = spreadView.contentX - spreadRow.x
67 var compensation = spreadView.contentX - spreadRow.x
69+ // When we start, we need to continue from where state 0 left
70+ var stage0Movement = -spreadView.width * 0.25
72+ var progress = root.progress - spreadView.positionMarker2
73+ var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
74+ var translateDiff = -stage0Movement;
76+ var movement = progress * translateDiff / progressDiff
68− translation = compensation;
78+ translation = compensation + stage0Movement + movement;
69 } else { // Stage 2
79 } else { // Stage 2
70 // Move the first tile a bit to the left to be aligned with the others
80 // Move the first tile a bit to the left to be aligned with the others
71 translation += spreadView.contentX - spreadRow.x + spreadView.width
81 translation += spreadView.contentX - spreadRow.x + spreadView.width
72 // apply the same animation as with the rest
82 // apply the same animation as with the rest
73− translation += -xTranslateEasing.value * spreadView.width
83+ translation += -easingCurve.value * spreadView.width
@@ -81,18 +91,39 @@ SpreadDelegate {
81 // Calculate movemoent for the first app coming from the right
91 // Calculate movemoent for the first app coming from the right
82 var progress = root.animatedProgress
92 var progress = root.animatedProgress
83 var progressDiff = spreadView.positionMarker2
93 var progressDiff = spreadView.positionMarker2
84− var translateDiff = -spreadView.width
94+ var translateDiff = -spreadView.width * spreadView.snapPosition
85 // progress : progressDiff = translate : translateDiff
95 // progress : progressDiff = translate : translateDiff
86 var movement = progress * translateDiff / progressDiff
96 var movement = progress * translateDiff / progressDiff
88 translation = compensation + movement;
98 translation = compensation + movement;
100+ } else if (spreadView.stage == 1) {
101+ // Need to compensate the flickable movement (fix it to the right edge)
102+ var compensation = root.progress * spreadView.width + spreadView.width/2
104+ // Add where stage 0 has moved it to
105+ var stage0Movement = -spreadView.width * spreadView.snapPosition;
107+ // Calclulate animation between stage0Movement and targetTranslate
108+ var progress = root.progress
109+ var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
111+ // find where the main easing would be when reaching positionMarker4
112+ helperEasingCurve.progress = progressDiff;
113+ var targetTranslate = -helperEasingCurve.value * spreadView.width + root.endDistance
115+ var translateDiff = targetTranslate - stage0Movement;
116+ var movement = progress * translateDiff / progressDiff
118+ translation = compensation + stage0Movement + movement;
92 // Fix it at the right edge...
123 // Fix it at the right edge...
93 translation += spreadView.contentX - spreadRow.x - ((index - 1) * root.startDistance)
124 translation += spreadView.contentX - spreadRow.x - ((index - 1) * root.startDistance)
94 // ...and use our easing to move them to the left. Stop a bit earlier for each tile
125 // ...and use our easing to move them to the left. Stop a bit earlier for each tile
95− translation += -xTranslateEasing.value * spreadView.width + (index * root.endDistance)
126+ translation += -easingCurve.value * spreadView.width + (index * root.endDistance)
96 if (isSelected) {
127 if (isSelected) {
97 var progressDiff = negativeProgress + selectedProgress
128 var progressDiff = negativeProgress + selectedProgress
98 var progress = progressDiff - (root.progress + negativeProgress);
129 var progress = progressDiff - (root.progress + negativeProgress);
@@ -117,17 +148,20 @@ SpreadDelegate {
117 switch (index) {
148 switch (index) {
119 if (spreadView.stage == 0) {
150 if (spreadView.stage == 0) {
120− var progress = root.progress;
151+ var progress = root.animatedProgress;
121 var progressDiff = spreadView.positionMarker2;
152 var progressDiff = spreadView.positionMarker2;
122− var angleDiff = root.endAngle;
153+ var angleDiff = root.endAngle * spreadView.snapPosition;
123 // progress : progressDiff = angle : angleDiff
154 // progress : progressDiff = angle : angleDiff
124 newAngle = progress * angleDiff / progressDiff;
155 newAngle = progress * angleDiff / progressDiff;
126− } else if (spreadView.stage == 1){
157+ } else if (spreadView.stage == 1) {
158+ var stage0Angle = root.endAngle * spreadView.snapPosition;
127 var progress = root.progress - spreadView.positionMarker2;
160 var progress = root.progress - spreadView.positionMarker2;
128 var angleDiff = root.endAngle;
161 var angleDiff = root.endAngle;
129 var progressDiff = 1 - spreadView.positionMarker2;
162 var progressDiff = 1 - spreadView.positionMarker2;
130− newAngle = progress * angleDiff / progressDiff;
163+ var angleTransform = progress * angleDiff / progressDiff;
164+ newAngle = stage0Angle + angleTransform;
131 newAngle = Math.min(root.endAngle, newAngle);
165 newAngle = Math.min(root.endAngle, newAngle);
@@ -135,16 +169,28 @@ SpreadDelegate {
135 if (spreadView.stage == 0) {
169 if (spreadView.stage == 0) {
136 var progress = root.animatedProgress;
170 var progress = root.animatedProgress;
137 var progressDiff = spreadView.positionMarker2;
171 var progressDiff = spreadView.positionMarker2;
138− var angleDiff = root.startAngle
172+ var angleDiff = root.startAngle * spreadView.snapPosition
140 // progress : progressDiff = angle : angleDiff
174 // progress : progressDiff = angle : angleDiff
141 var angleTranslate = progress * angleDiff / progressDiff;
175 var angleTranslate = progress * angleDiff / progressDiff;
143 newAngle = root.startAngle - angleTranslate;
177 newAngle = root.startAngle - angleTranslate;
179+ } else if (spreadView.stage == 1) {
180+ var stage0Angle = root.startAngle - (root.startAngle * spreadView.snapPosition)
182+ var progress = root.progress
183+ var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
184+ var angleDiff = root.endAngle - stage0Angle;
186+ // progress : progressDiff = angle : angleDiff
187+ var angleTranslate = progress * angleDiff / progressDiff;
188+ newAngle = stage0Angle + angleTranslate;
147− newAngle = root.startAngle - xTranslateEasing.value * (root.startAngle - root.endAngle)
193+ newAngle = root.startAngle - easingCurve.value * (root.startAngle - root.endAngle)
148 if (isSelected) {
194 if (isSelected) {
149 var progressDiff = negativeProgress + selectedProgress
195 var progressDiff = negativeProgress + selectedProgress
150 var progress = progressDiff - (root.progress + negativeProgress);
196 var progress = progressDiff - (root.progress + negativeProgress);
@@ -164,11 +210,18 @@ SpreadDelegate {
165 if (spreadView.stage == 0) {
211 if (spreadView.stage == 0) {
166 newScale = 1;
212 newScale = 1;
213+ } else if(spreadView.stage == 1) {
214+ var progress = root.progress - spreadView.positionMarker2
215+ var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
216+ var scaleDiff = 1 - root.endScale;
217+ // progress : progressDiff = angle : angleDiff
218+ newScale = 1 - (progress * scaleDiff / progressDiff);
168 var progress = root.progress - spreadView.positionMarker2;
221 var progress = root.progress - spreadView.positionMarker2;
169 var scaleDiff = 1 - root.endScale;
222 var scaleDiff = 1 - root.endScale;
170 var progressDiff = 1 - spreadView.positionMarker2;
223 var progressDiff = 1 - spreadView.positionMarker2;
171−// // progress : progressDiff = angle : angleDiff
224+ // progress : progressDiff = angle : angleDiff
172 newScale = 1 - (progress * scaleDiff / progressDiff);
225 newScale = 1 - (progress * scaleDiff / progressDiff);
173 newScale = Math.max(root.endScale, newScale);
226 newScale = Math.max(root.endScale, newScale);
@@ -178,16 +231,33 @@ SpreadDelegate {
178 if (spreadView.stage == 0) {
231 if (spreadView.stage == 0) {
179 var progress = root.animatedProgress;
232 var progress = root.animatedProgress;
180 var progressDiff = spreadView.positionMarker2;
233 var progressDiff = spreadView.positionMarker2;
181− var scaleDiff = root.startScale - 1
234+ var scaleDiff = (root.startScale - 1) * spreadView.snapPosition
183 // progress : progressDiff = angle : angleDiff
236 // progress : progressDiff = angle : angleDiff
184 var scaleTranslate = progress * scaleDiff / progressDiff;
237 var scaleTranslate = progress * scaleDiff / progressDiff;
186 newScale = root.startScale - scaleTranslate;
239 newScale = root.startScale - scaleTranslate;
241+ } else if (spreadView.stage == 1) {
242+ var stage0Scale = root.startScale - (root.startScale - 1) * spreadView.snapPosition
244+ var progress = root.progress
245+ var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
247+ // find where the main easing would be when reaching positionMarker4
248+ helperEasingCurve.progress = progressDiff;
249+ var targetScale = root.startScale - helperEasingCurve.value * (root.startScale - root.endScale)
251+ var scaleDiff = stage0Scale - targetScale;
253+ // progress : progressDiff = angle : angleDiff
254+ var scaleTranslate = progress * scaleDiff / progressDiff;
256+ return stage0Scale - scaleTranslate;
190− newScale = root.startScale - xTranslateEasing.value * (root.startScale - root.endScale)
260+ newScale = root.startScale - easingCurve.value * (root.startScale - root.endScale)
191 if (isSelected) {
261 if (isSelected) {
192 var progressDiff = negativeProgress + selectedProgress
262 var progressDiff = negativeProgress + selectedProgress
193 var progress = progressDiff - (root.progress + negativeProgress);
263 var progress = progressDiff - (root.progress + negativeProgress);
@@ -220,9 +290,17 @@ SpreadDelegate {
222 EasingCurve {
292 EasingCurve {
223− id: xTranslateEasing
293+ id: easingCurve
224 type: EasingCurve.OutQuad
294 type: EasingCurve.OutQuad
225 period: 1 - spreadView.positionMarker2
295 period: 1 - spreadView.positionMarker2
226 progress: root.animatedProgress
296 progress: root.animatedProgress
299+ // This is used as a calculation helper to figure values for progress other than the current one
300+ // Do not bind anything to this...
302+ id: helperEasingCurve
303+ type: easingCurve.type
304+ period: easingCurve.period