@@ -55,7 +55,7 @@ SpreadDelegate {
5555 var compensation = root.progress * spreadView.width
5656
5757 // Calculating the small movement of the first tile
58− var progress = root.progress
58+ var progress = root.animatedProgress
5959 var progressDiff = spreadView.positionMarker2
6060 var translateDiff = -spreadView.width * 0.25
6161 // progress : progressDiff = translate : translateDiff
@@ -65,12 +65,22 @@ SpreadDelegate {
6565 } else if (spreadView.stage == 1){
6666 // Need to compensate the flickable movement (fixing first tile at the left edge)
6767 var compensation = spreadView.contentX - spreadRow.x
68− translation = compensation;
68+
69+ // When we start, we need to continue from where state 0 left
70+ var stage0Movement = -spreadView.width * 0.25
71+
72+ var progress = root.progress - spreadView.positionMarker2
73+ var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
74+ var translateDiff = -stage0Movement;
75+
76+ var movement = progress * translateDiff / progressDiff
77+
78+ translation = compensation + stage0Movement + movement;
6979 } else { // Stage 2
7080 // Move the first tile a bit to the left to be aligned with the others
7181 translation += spreadView.contentX - spreadRow.x + spreadView.width
7282 // apply the same animation as with the rest
73− translation += -xTranslateEasing.value * spreadView.width
83+ translation += -easingCurve.value * spreadView.width
7484 }
7585 break;
7686 case 1:
@@ -81,18 +91,39 @@ SpreadDelegate {
8191 // Calculate movemoent for the first app coming from the right
8292 var progress = root.animatedProgress
8393 var progressDiff = spreadView.positionMarker2
84− var translateDiff = -spreadView.width
94+ var translateDiff = -spreadView.width * spreadView.snapPosition
8595 // progress : progressDiff = translate : translateDiff
8696 var movement = progress * translateDiff / progressDiff
8797
8898 translation = compensation + movement;
8999 break;
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
103+
104+ // Add where stage 0 has moved it to
105+ var stage0Movement = -spreadView.width * spreadView.snapPosition;
106+
107+ // Calclulate animation between stage0Movement and targetTranslate
108+ var progress = root.progress
109+ var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
110+
111+ // find where the main easing would be when reaching positionMarker4
112+ helperEasingCurve.progress = progressDiff;
113+ var targetTranslate = -helperEasingCurve.value * spreadView.width + root.endDistance
114+
115+ var translateDiff = targetTranslate - stage0Movement;
116+ var movement = progress * translateDiff / progressDiff
117+
118+ translation = compensation + stage0Movement + movement;
119+ break;
90120 }
121+
91122 default:
92123 // Fix it at the right edge...
93124 translation += spreadView.contentX - spreadRow.x - ((index - 1) * root.startDistance)
94125 // ...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)
96127 if (isSelected) {
97128 var progressDiff = negativeProgress + selectedProgress
98129 var progress = progressDiff - (root.progress + negativeProgress);
@@ -117,17 +148,20 @@ SpreadDelegate {
117148 switch (index) {
118149 case 0:
119150 if (spreadView.stage == 0) {
120− var progress = root.progress;
151+ var progress = root.animatedProgress;
121152 var progressDiff = spreadView.positionMarker2;
122− var angleDiff = root.endAngle;
153+ var angleDiff = root.endAngle * spreadView.snapPosition;
123154 // progress : progressDiff = angle : angleDiff
124155 newAngle = progress * angleDiff / progressDiff;
125156 break;
126− } else if (spreadView.stage == 1){
157+ } else if (spreadView.stage == 1) {
158+ var stage0Angle = root.endAngle * spreadView.snapPosition;
159+
127160 var progress = root.progress - spreadView.positionMarker2;
128161 var angleDiff = root.endAngle;
129162 var progressDiff = 1 - spreadView.positionMarker2;
130− newAngle = progress * angleDiff / progressDiff;
163+ var angleTransform = progress * angleDiff / progressDiff;
164+ newAngle = stage0Angle + angleTransform;
131165 newAngle = Math.min(root.endAngle, newAngle);
132166 break;
133167 }
@@ -135,16 +169,28 @@ SpreadDelegate {
135169 if (spreadView.stage == 0) {
136170 var progress = root.animatedProgress;
137171 var progressDiff = spreadView.positionMarker2;
138− var angleDiff = root.startAngle
172+ var angleDiff = root.startAngle * spreadView.snapPosition
139173
140174 // progress : progressDiff = angle : angleDiff
141175 var angleTranslate = progress * angleDiff / progressDiff;
142176
143177 newAngle = root.startAngle - angleTranslate;
144178 break;
179+ } else if (spreadView.stage == 1) {
180+ var stage0Angle = root.startAngle - (root.startAngle * spreadView.snapPosition)
181+
182+ var progress = root.progress
183+ var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
184+ var angleDiff = root.endAngle - stage0Angle;
185+
186+ // progress : progressDiff = angle : angleDiff
187+ var angleTranslate = progress * angleDiff / progressDiff;
188+ newAngle = stage0Angle + angleTranslate;
189+ break;
145190 }
191+
146192 default:
147− newAngle = root.startAngle - xTranslateEasing.value * (root.startAngle - root.endAngle)
193+ newAngle = root.startAngle - easingCurve.value * (root.startAngle - root.endAngle)
148194 if (isSelected) {
149195 var progressDiff = negativeProgress + selectedProgress
150196 var progress = progressDiff - (root.progress + negativeProgress);
@@ -164,11 +210,18 @@ SpreadDelegate {
164210 case 0:
165211 if (spreadView.stage == 0) {
166212 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);
219+
167220 } else {
168221 var progress = root.progress - spreadView.positionMarker2;
169222 var scaleDiff = 1 - root.endScale;
170223 var progressDiff = 1 - spreadView.positionMarker2;
171−// // progress : progressDiff = angle : angleDiff
224+ // progress : progressDiff = angle : angleDiff
172225 newScale = 1 - (progress * scaleDiff / progressDiff);
173226 newScale = Math.max(root.endScale, newScale);
174227 }
@@ -178,16 +231,33 @@ SpreadDelegate {
178231 if (spreadView.stage == 0) {
179232 var progress = root.animatedProgress;
180233 var progressDiff = spreadView.positionMarker2;
181− var scaleDiff = root.startScale - 1
234+ var scaleDiff = (root.startScale - 1) * spreadView.snapPosition
182235
183236 // progress : progressDiff = angle : angleDiff
184237 var scaleTranslate = progress * scaleDiff / progressDiff;
185238
186239 newScale = root.startScale - scaleTranslate;
187240 break;
241+ } else if (spreadView.stage == 1) {
242+ var stage0Scale = root.startScale - (root.startScale - 1) * spreadView.snapPosition
243+
244+ var progress = root.progress
245+ var progressDiff = spreadView.positionMarker4 - spreadView.positionMarker2
246+
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)
250+
251+ var scaleDiff = stage0Scale - targetScale;
252+
253+ // progress : progressDiff = angle : angleDiff
254+ var scaleTranslate = progress * scaleDiff / progressDiff;
255+
256+ return stage0Scale - scaleTranslate;
188257 }
258+
189259 default:
190− newScale = root.startScale - xTranslateEasing.value * (root.startScale - root.endScale)
260+ newScale = root.startScale - easingCurve.value * (root.startScale - root.endScale)
191261 if (isSelected) {
192262 var progressDiff = negativeProgress + selectedProgress
193263 var progress = progressDiff - (root.progress + negativeProgress);
@@ -220,9 +290,17 @@ SpreadDelegate {
220290 ]
221291
222292 EasingCurve {
223− id: xTranslateEasing
293+ id: easingCurve
224294 type: EasingCurve.OutQuad
225295 period: 1 - spreadView.positionMarker2
226296 progress: root.animatedProgress
227297 }
298+
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...
301+ EasingCurve {
302+ id: helperEasingCurve
303+ type: easingCurve.type
304+ period: easingCurve.period
305+ }
228306}