@@ -6,6 +6,7 @@ SpreadDelegate {
66 id: root
77
88 property bool selected: false
9+ property bool otherSelected: false
910
1011 property real progress: 0
1112 property real animatedProgress: 0
@@ -22,24 +23,59 @@ SpreadDelegate {
2223
2324 onSelectedChanged: {
2425 if (selected) {
25− priv.selectedProgress = root.progress
26− priv.selectedXTranslate = priv.xTranslate;
27− priv.selectedAngle = priv.angle;
28− priv.selectedScale = priv.scale;
29− priv.isSelected = true;
30− print("tile", index, "selected!!!!!!!!!!!!!!!!")
31− } else {
32− priv.isSelected = false;
26+ priv.snapshot();
27+ }
28+ print("setting selected to", selected)
29+ priv.isSelected = selected;
30+ }
31+
32+ onOtherSelectedChanged: {
33+ if (otherSelected) {
34+ priv.snapshot();
35+ }
36+ priv.otherSelected = otherSelected;
37+ }
38+
39+ Connections {
40+ target: spreadView
41+ onStageChanged: {
42+ if (spreadView.stage == 1) {
43+ if (index == 0) {
44+ priv.stage2startTranslate = priv.easingAnimation(0, spreadView.positionMarker4, 0, -spreadView.width, spreadView.positionMarker4) + spreadView.width;
45+ } else if (index == 1) {
46+ // find where the main easing for Tile 1 would be when reaching stage 2
47+ var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
48+ priv.stage2startTranslate = priv.easingAnimation(0, stage2Progress, 0, -spreadView.width + root.endDistance, stage2Progress);
49+ priv.stage2startAngle = priv.easingAnimation(0, stage2Progress, root.startAngle, root.endAngle, stage2Progress)
50+ priv.stage2startScale = priv.easingAnimation(0, stage2Progress, root.startScale, root.endScale, stage2Progress);
51+ }
52+ }
3353 }
3454 }
3555
3656 QtObject {
3757 id: priv
3858 property bool isSelected: false
59+ property bool otherSelected: false
3960 property real selectedProgress
4061 property real selectedXTranslate
4162 property real selectedAngle
4263 property real selectedScale
64+ property real selectedOpacity
65+
66+ // Those values are needed as target values for the end of stage 1.
67+ // As they are static values, lets caluclate them once when entering stage 1 instead of calculating them in each animation pass.
68+ property real stage2startTranslate
69+ property real stage2startAngle
70+ property real stage2startScale
71+
72+ function snapshot() {
73+ selectedProgress = root.progress;
74+ selectedXTranslate = xTranslate;
75+ selectedAngle = angle;
76+ selectedScale = scale;
77+ selectedOpacity = opacity;
78+ }
4379
4480 property real negativeProgress: {
4581 if (index < 2) {
@@ -63,14 +99,11 @@ SpreadDelegate {
6399 var translation = 0;
64100 switch (index) {
65101 case 0:
66− print("+++++++++++++++++++++++++++", spreadView.stage, priv.isSelected)
67102 if (spreadView.stage == 0) {
68103 translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * .25, root.animatedProgress)
69104 break;
70105 } else if (spreadView.stage == 1){
71− // find where the main easing would be when reaching stage 2
72− var targetTranslate = easingAnimation(0, spreadView.positionMarker4, 0, -spreadView.width, spreadView.positionMarker4) + spreadView.width
73− translation = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, -spreadView.width * .25, targetTranslate, root.progress)
106+ translation = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, -spreadView.width * .25, priv.stage2startTranslate, root.progress)
74107 break;
75108 } else if (!priv.isSelected){ // Stage 2
76109 // Move the first tile a bit to the right to be aligned with the others
@@ -88,13 +121,8 @@ SpreadDelegate {
88121 translation = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.width * spreadView.snapPosition, root.animatedProgress)
89122 break;
90123 } else if (spreadView.stage == 1 && !priv.isSelected) {
91− // find where the main easing would be when reaching stage 2
92− var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
93− targetTranslate = easingAnimation(0, stage2Progress, 0, -spreadView.width + root.endDistance, stage2Progress);
94−
95124 translation = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
96− -spreadView.width * spreadView.snapPosition, targetTranslate, root.progress);
97−
125+ -spreadView.width * spreadView.snapPosition, priv.stage2startTranslate, root.progress);
98126 break;
99127 }
100128
@@ -106,7 +134,6 @@ SpreadDelegate {
106134 if (priv.isSelected) {
107135 // Distance to left edge
108136 var targetTranslate = -spreadView.width - ((index - 1) * root.startDistance)
109− print("selectedProgress:", selectedProgress, "negativeProgress:", negativeProgress, "progress", root.progress)
110137 translation = linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, targetTranslate, root.progress)
111138 }
112139 }
@@ -128,10 +155,7 @@ SpreadDelegate {
128155 newAngle = linearAnimation(0, spreadView.positionMarker2, root.startAngle, root.startAngle * (1-spreadView.snapPosition), root.animatedProgress)
129156 break;
130157 } else if (spreadView.stage == 1 && !priv.isSelected) {
131− // find where the main easing would be when reaching stage 2
132− var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
133− var targetAngle = easingAnimation(0, stage2Progress, root.startAngle, root.endAngle, stage2Progress)
134− newAngle = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.startAngle * (1-spreadView.snapPosition), targetAngle, root.progress)
158+ newAngle = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.startAngle * (1-spreadView.snapPosition), priv.stage2startAngle, root.progress)
135159 break;
136160 }
137161
@@ -160,9 +184,7 @@ SpreadDelegate {
160184 newScale = linearAnimation(0, spreadView.positionMarker2, root.tile1StartScale, 1, root.animatedProgress)
161185 break;
162186 } else if (spreadView.stage == 1 && !priv.isSelected) {
163− // find where the main easing would be when reaching positionMarker4
164− var targetScale = easingAnimation(0, spreadView.positionMarker4, root.startScale, root.endScale, spreadView.positionMarker4);
165− newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, targetScale, root.progress)
187+ newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, priv.stage2startScale, root.progress)
166188 break;
167189 }
168190
@@ -174,6 +196,22 @@ SpreadDelegate {
174196 }
175197 return newScale;
176198 }
199+
200+ property real opacity: {
201+ if (otherSelected) {
202+ return linearAnimation (selectedProgress, selectedProgress - .5, selectedOpacity, 0, root.progress)
203+ }
204+ if (index == 0) {
205+ switch (spreadView.stage) {
206+ case 0:
207+ return linearAnimation(0, spreadView.positionMarker2, 1, .3, root.animatedProgress)
208+ case 1:
209+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, .3, 1, root.animatedProgress)
210+ }
211+ }
212+
213+ return 1;
214+ }
177215 }
178216
179217 transform: [
@@ -191,6 +229,7 @@ SpreadDelegate {
191229 x: priv.xTranslate
192230 }
193231 ]
232+ opacity: priv.opacity
194233
195234 EasingCurve {
196235 id: easingCurve