on xenial help sign in
add scaling of apps to compensate difference between fullscreen and regular apps

some more fixes

commit0ccba8f712411b1dd8f33b07a9c4e1f2cf60b06d authorMichael Zanetti <michael.zanetti@canonical.com> dateThu 30 Jan 2014, 23:29 (13 years ago) parentc055fc2
3 files changed+60−51
qml/Stages/PhoneStage.qml+16−47 qml/Stages/SpreadDelegate.qml+8−1 qml/Stages/TransformedSpreadDelegate.qml+36−3
qml/Stages/PhoneStage.qml+16−47
@@ -240,7 +240,7 @@ Item {
240240
241241 property int tileDistance: width / 4
242242
243− property real positionMarker1: 0.35
243+ property real positionMarker1: 0.3
244244 property real positionMarker2: 0.45
245245 property real positionMarker3: 0.6
246246 property real positionMarker4: .9
@@ -339,12 +339,14 @@ Item {
339339 id: spreadRepeater
340340 model: ApplicationManager
341341 delegate: TransformedSpreadDelegate {
342+ id: appDelegate
342343 startAngle: 45
343344 endAngle: 5
344345 startScale: 1
345346 endScale: 0.6
346347 startDistance: spreadView.tileDistance
347348 endDistance: units.gu(.5)
349+ width: spreadView.width
348350 height: spreadView.height
349351 selected: spreadView.selectedIndex == index
350352 otherSelected: spreadView.selectedIndex >= 0 && !selected
@@ -352,19 +354,6 @@ Item {
352354 z: index
353355 x: index == 0 ? 0 : spreadView.width + (index - 1) * spreadView.tileDistance
354356
355− width: {
356− switch (index) {
357− case 0:
358− return spreadView.width;
359− case 1:
360− if (spreadView.stage == 0) {
361− return spreadView.width * spreadView.positionMarker2;
362− }
363− default:
364− return spreadView.tileDistance;
365− }
366− }
367−
368357 progress: {
369358 switch (index) {
370359 case 0:
@@ -383,47 +372,27 @@ Item {
383372 }
384373
385374 animatedProgress: {
386− if (spreadView.stage < 2 && index < 2) {
387− if (spreadView.contentX < spreadView.width * spreadView.positionMarker1) {
388− return spreadView.contentX / spreadView.width
389− } else if (spreadView.stage == 0){
375+ if (spreadView.stage == 0 && index < 2) {
376+ if (progress < spreadView.positionMarker1) {
377+ return progress;
378+ } else if (progress < spreadView.positionMarker1 + .05){
379+ return spreadView.positionMarker1 + snappingCurve.value * 3
380+ } else {
390381 return spreadView.positionMarker2
391382 }
392383 }
393384 return progress;
394385 }
395386
396− onClicked: {
397− spreadView.snapTo(index);
398− }
399−
400− // This timer is to decouple the application reordering with the enabling of the SmoothedAnimation
401− // If both are done in same event loop pass, the reordering would animate.
402− Connections {
403− target: spreadView
404− onStageChanged: {
405− if (spreadView.stage == 0) {
406− enableAnimationTimer.start();
407− } else {
408− stage1Animation.enabled = false;
409− }
410− }
411− }
412− Timer {
413− id: enableAnimationTimer
414− interval: 1
415− onTriggered: {
416− stage1Animation.enabled = true;
417− }
387+ EasingCurve {
388+ id: snappingCurve
389+ type: EasingCurve.OutQuad
390+ period: 0.05//spreadView.positionMarker2 - spreadView.positionMarker1
391+ progress: appDelegate.progress - spreadView.positionMarker1
418392 }
419393
420− Behavior on animatedProgress {
421− id: stage1Animation
422− SmoothedAnimation {
423− velocity: .5;
424−// duration: UbuntuAnimation.BriskDuration;
425−// easing: UbuntuAnimation.StandardEasing
426− }
394+ onClicked: {
395+ spreadView.snapTo(index);
427396 }
428397 }
429398 }
qml/Stages/SpreadDelegate.qml+8−1
@@ -5,6 +5,13 @@ Item {
55
66 signal clicked()
77
8+ property real topMarginProgress
9+
10+ QtObject {
11+ id: priv
12+ property real heightDifference: root.height - appImage.implicitHeight
13+ }
14+
815 Image {
916 id: dropShadow
1017 anchors.fill: appImage
@@ -13,7 +20,7 @@ Item {
1320 }
1421 Image {
1522 id: appImage
16− anchors { left: parent.left; bottom: parent.bottom }
23+ anchors { left: parent.left; bottom: parent.bottom; top: parent.top; topMargin: priv.heightDifference * Math.max(0, 1 - root.topMarginProgress) }
1724 source: model.screenshot
1825 scale: 1
1926 }
qml/Stages/TransformedSpreadDelegate.qml+36−3
@@ -4,6 +4,7 @@ import Ubuntu.Components 0.1
44
55SpreadDelegate {
66 id: root
7+ clip: true
78
89 property bool selected: false
910 property bool otherSelected: false
@@ -42,12 +43,16 @@ SpreadDelegate {
4243 if (spreadView.stage == 1) {
4344 if (index == 0) {
4445 priv.stage2startTranslate = priv.easingAnimation(0, spreadView.positionMarker4, 0, -spreadView.width, spreadView.positionMarker4) + spreadView.width;
46+ priv.stage2startAngle = priv.easingAnimation(0, spreadView.positionMarker4, root.startAngle, root.endAngle, spreadView.positionMarker4)
47+ priv.stage2startScale = priv.easingAnimation(0, spreadView.positionMarker4, root.startScale, root.endScale, spreadView.positionMarker4)
48+ priv.stage2startTopMarginProgress = priv.linearAnimation(0, 1, 0, 1, spreadView.positionMarker4)
4549 } else if (index == 1) {
4650 // find where the main easing for Tile 1 would be when reaching stage 2
4751 var stage2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
4852 priv.stage2startTranslate = priv.easingAnimation(0, stage2Progress, 0, -spreadView.width + root.endDistance, stage2Progress);
4953 priv.stage2startAngle = priv.easingAnimation(0, stage2Progress, root.startAngle, root.endAngle, stage2Progress)
5054 priv.stage2startScale = priv.easingAnimation(0, stage2Progress, root.startScale, root.endScale, stage2Progress);
55+ priv.stage2startTopMarginProgress = priv.linearAnimation(0, 1, 0, spreadView.positionMarker4, stage2Progress)
5156 }
5257 }
5358 }
@@ -62,12 +67,14 @@ SpreadDelegate {
6267 property real selectedAngle
6368 property real selectedScale
6469 property real selectedOpacity
70+ property real selectedTopMarginProgress
6571
6672 // Those values are needed as target values for the end of stage 1.
6773 // As they are static values, lets caluclate them once when entering stage 1 instead of calculating them in each animation pass.
6874 property real stage2startTranslate
6975 property real stage2startAngle
7076 property real stage2startScale
77+ property real stage2startTopMarginProgress
7178
7279 function snapshot() {
7380 selectedProgress = root.progress;
@@ -75,6 +82,7 @@ SpreadDelegate {
7582 selectedAngle = angle;
7683 selectedScale = scale;
7784 selectedOpacity = opacity;
85+ selectedTopMarginProgress = topMarginProgress;
7886 }
7987
8088 property real negativeProgress: {
@@ -85,7 +93,7 @@ SpreadDelegate {
8593 }
8694
8795 function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
88− // progress : progressDiff = value : valueDiff
96+ // progress : progressDiff = value : valueDiff => value = progress * valueDiff / progressDiff
8997 return (progress - startProgress) * (endValue - startValue) / (endProgress - startProgress) + startValue;
9098 }
9199
@@ -147,7 +155,7 @@ SpreadDelegate {
147155 newAngle = linearAnimation(0, spreadView.positionMarker2, 0, root.endAngle * spreadView.snapPosition, root.animatedProgress)
148156 break;
149157 } else if (spreadView.stage == 1) {
150− newAngle = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.endAngle * spreadView.snapPosition, root.endAngle, root.progress)
158+ newAngle = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.endAngle * spreadView.snapPosition, stage2startAngle, root.progress)
151159 break;
152160 }
153161 case 1:
@@ -176,7 +184,7 @@ SpreadDelegate {
176184 newScale = 1;
177185 break
178186 } else if(spreadView.stage == 1) {
179− newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, root.endScale, root.progress)
187+ newScale = linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 1, stage2startScale, root.progress)
180188 break;
181189 }
182190 case 1:
@@ -212,6 +220,30 @@ SpreadDelegate {
212220
213221 return 1;
214222 }
223+
224+ property real topMarginProgress: {
225+ if (selected) {
226+ return linearAnimation(selectedProgress, negativeProgress, selectedTopMarginProgress, 0, root.progress);
227+ }
228+
229+ switch (index) {
230+ case 0:
231+ if (spreadView.stage == 0) {
232+ return 0;
233+ } else if (spreadView.stage == 1) {
234+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 0, priv.stage2startTopMarginProgress, root.progress);
235+ }
236+ break;
237+ case 1:
238+ if (spreadView.stage == 0) {
239+ return 0;
240+ } else if (spreadView.stage == 1) {
241+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 0, priv.stage2startTopMarginProgress, root.progress);
242+ }
243+ }
244+
245+ return root.progress;
246+ }
215247 }
216248
217249 transform: [
@@ -230,6 +262,7 @@ SpreadDelegate {
230262 }
231263 ]
232264 opacity: priv.opacity
265+ topMarginProgress: priv.topMarginProgress
233266
234267 EasingCurve {
235268 id: easingCurve