@@ -43,7 +43,14 @@ SpreadDelegate {
43 property real selectedAngle
43 property real selectedAngle
44 property real selectedScale
44 property real selectedScale
46− property real negativeProgress: (index - 1) * spreadView.positionMarker1
46+ property real negativeProgress: {
48+ return spreadView.positionMarker2;
49+ } else if (index == 1) {
50+ return spreadView.positionMarker2 - (spreadView.tileDistance / spreadView.width);
52+ return -(index - 2) * (spreadView.tileDistance / spreadView.width);
48 function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
55 function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
49 // progress : progressDiff = value : valueDiff
56 // progress : progressDiff = value : valueDiff
@@ -62,23 +69,29 @@ SpreadDelegate {
63 if (spreadView.stage == 0) {
70 if (spreadView.stage == 0) {
64 translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * .25, root.animatedProgress)
71 translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * .25, root.animatedProgress)
65 } else if (spreadView.stage == 1){
73 } else if (spreadView.stage == 1){
66 // find where the main easing would be when reaching stage 2
74 // 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
75 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)
76 translation = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, -spreadView.width * .25, targetTranslate, root.progress)
69− } else { // Stage 2
78+ } else if (!isSelected){ // Stage 2
70−// // Move the first tile a bit to the right to be aligned with the others
79+ // Move the first tile a bit to the right to be aligned with the others
71 translation += spreadView.width
80 translation += spreadView.width
72 // apply the same animation as with the rest
81 // apply the same animation as with the rest
73 translation += -easingCurve.value * spreadView.width
82 translation += -easingCurve.value * spreadView.width
84+ } else if (isSelected) {
85+ translation = linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, 0, root.progress)
77 if (spreadView.stage == 0) {
90 if (spreadView.stage == 0) {
78 translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * spreadView.snapPosition, root.animatedProgress)
91 translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * spreadView.snapPosition, root.animatedProgress)
80 } else if (spreadView.stage == 1) {
93 } else if (spreadView.stage == 1) {
81−// // find where the main easing would be when reaching stage 2
94+ // find where the main easing would be when reaching stage 2
82 var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
95 var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
83 targetTranslate = easingAnimation(0, stage2Progress, 0, -spreadView.width + root.endDistance, stage2Progress);
96 targetTranslate = easingAnimation(0, stage2Progress, 0, -spreadView.width + root.endDistance, stage2Progress);
@@ -89,25 +102,14 @@ SpreadDelegate {
92−// // Fix it at the right edge...
105+ // Fix it at the right edge...
93 translation += -((index - 1) * root.startDistance)
106 translation += -((index - 1) * root.startDistance)
94 // ...and use our easing to move them to the left. Stop a bit earlier for each tile
107 // ...and use our easing to move them to the left. Stop a bit earlier for each tile
95 translation += -easingCurve.value * spreadView.width + (index * root.endDistance)
108 translation += -easingCurve.value * spreadView.width + (index * root.endDistance)
96 if (isSelected) {
109 if (isSelected) {
97− var progressDiff = negativeProgress + selectedProgress
98− var progress = progressDiff - (root.progress + negativeProgress);
99− var translateDiff = spreadView.width - (selectedXTranslate - translation)
101− // Fix it where it was when selected
102− translation = selectedXTranslate - progress * spreadView.width
104 // Distance to left edge
110 // Distance to left edge
105− var targetTranslate = spreadView.contentX - spreadView.width - spreadRow.x - ((index - 1) * root.startDistance)
111+ var targetTranslate = -spreadView.width - ((index - 1) * root.startDistance)
106−
112+ translation = linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, targetTranslate, root.progress)
107− // The distance to animate is from the selection position to the left edge
108− var translateDiff = targetTranslate - translation
110− translation += progress * translateDiff / progressDiff;
113 return translation;
115 return translation;
@@ -129,9 +131,8 @@ SpreadDelegate {
130 } else if (spreadView.stage == 1) {
132 } else if (spreadView.stage == 1) {
131 // find where the main easing would be when reaching stage 2
133 // find where the main easing would be when reaching stage 2
132− helperEasingCurve.progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
134+ var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
133− var targetAngle = root.startAngle - helperEasingCurve.value * (root.startAngle - root.endAngle)
135+ var targetAngle = easingAnimation(0, stage2Progress, root.startAngle, root.endAngle, stage2Progress)
135 newAngle = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.startAngle * (1-spreadView.snapPosition), targetAngle, root.progress)
136 newAngle = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.startAngle * (1-spreadView.snapPosition), targetAngle, root.progress)
@@ -139,13 +140,7 @@ SpreadDelegate {
140 newAngle = root.startAngle - easingCurve.value * (root.startAngle - root.endAngle)
141 newAngle = root.startAngle - easingCurve.value * (root.startAngle - root.endAngle)
141 if (isSelected) {
142 if (isSelected) {
142− var progressDiff = negativeProgress + selectedProgress
143+ newAngle = linearAnimation(selectedProgress, negativeProgress, selectedAngle, 0, root.progress)
143− var progress = progressDiff - (root.progress + negativeProgress);
144− var angleDiff = -selectedAngle;
145− var angleTranslate = progress * angleDiff / progressDiff;
147− newAngle = selectedAngle + angleTranslate;
@@ -167,9 +162,7 @@ SpreadDelegate {
167 newScale = linearAnimation(0, spreadView.positionMarker2, root.tile1StartScale, 1, root.animatedProgress)
162 newScale = linearAnimation(0, spreadView.positionMarker2, root.tile1StartScale, 1, root.animatedProgress)
169 } else if (spreadView.stage == 1) {
164 } else if (spreadView.stage == 1) {
170−// // find where the main easing would be when reaching positionMarker4
165+ // 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);
166 var targetScale = easingAnimation(0, spreadView.positionMarker4, root.startScale, root.endScale, spreadView.positionMarker4);
174 newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, targetScale, root.progress)
167 newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, targetScale, root.progress)
@@ -178,14 +171,7 @@ SpreadDelegate {
179 newScale = root.startScale - easingCurve.value * (root.startScale - root.endScale)
172 newScale = root.startScale - easingCurve.value * (root.startScale - root.endScale)
180 if (isSelected) {
173 if (isSelected) {
181− var progressDiff = negativeProgress + selectedProgress
174+ newScale = linearAnimation(selectedProgress, negativeProgress, selectedScale, 1, root.progress)
182− var progress = progressDiff - (root.progress + negativeProgress);
183− var scaleDiff = 1 - selectedScale
185− // progress : progressDiff = angle : angleDiff
186− var scaleTranslate = progress * scaleDiff / progressDiff;
188− newScale = selectedScale + scaleTranslate;
191 return newScale;
177 return newScale;