on xenial help sign in
sync TabletStage changes from work on trunk
commit35fa704916e48ef0bd635cb63433fd642e78f4ce authorMichael Zanetti <michael.zanetti@canonical.com> dateFri 30 May 2014, 12:21 (12 years ago) parent85e5aa0
2 files changed+102−41
qml/Stages/TabletStage.qml+95−23 qml/Stages/TransformedTabletSpreadDelegate.qml+7−18
qml/Stages/TabletStage.qml+95−23
@@ -36,9 +36,7 @@ Item {
3636 property bool fullscreen: true
3737 property bool overlayMode: false
3838
39− readonly property int overlayWidth: priv.overlayOverride ? 0 : spreadView.sideStageWidth
40−
41− property real maximizedAppTopMargin
39+ readonly property int overlayWidth: priv.overlayOverride ? 0 : priv.sideStageWidth
4240
4341 QtObject {
4442 id: priv
@@ -74,20 +72,56 @@ Item {
7472 }
7573 return -1;
7674 }
75+
76+ function evaluateOneWayFlick(gesturePoints) {
77+ // Need to have at least 3 points to recognize it as a flick
78+ if (gesturePoints.length < 3) {
79+ print("not enough points...")
80+ return false;
81+ }
82+ // Need to have a movement of at least 2 grid units to recognize it as a flick
83+ if (Math.abs(gesturePoints[gesturePoints.length - 1] - gesturePoints[0]) < units.gu(2)) {
84+ print("not moved far enough")
85+ return false;
86+ }
87+
88+ var oneWayFlick = true;
89+ var smallestX = gesturePoints[0];
90+ var leftWards = gesturePoints[1] < gesturePoints[0];
91+ print("is leftwards", leftWards)
92+ for (var i = 1; i < gesturePoints.length; i++) {
93+ print("point is", gesturePoints[i])
94+ if ((leftWards && gesturePoints[i] >= smallestX)
95+ || (!leftWards && gesturePoints[i] <= smallestX)) {
96+ print("found jitter", leftWards, gesturePoints[i], smallestX)
97+ oneWayFlick = false;
98+ break;
99+ }
100+ smallestX = gesturePoints[i];
101+ }
102+ return oneWayFlick;
103+ }
77104 }
78105
79106 Connections {
80107 target: ApplicationManager
81108 onFocusRequested: {
82− if (spreadView.visible) {
109+ printStack()
110+ if (spreadView.interactive) {
83111 spreadView.snapTo(priv.indexOf(appId));
84112 } else {
85− priv.switchToApp(appId);
113+// priv.switchToApp(appId);
86114 ApplicationManager.focusApplication(appId)
87115 }
88116 }
89117 }
90118
119+ function printStack() {
120+ for (var i = 0; i < ApplicationManager.count; i++) {
121+ print("AppMan item", i, ":", ApplicationManager.get(i).appId)
122+ }
123+ }
124+
91125 Flickable {
92126 id: spreadView
93127 anchors.fill: parent
@@ -291,8 +325,6 @@ Item {
291325 selected: spreadView.selectedIndex == index
292326 otherSelected: spreadView.selectedIndex >= 0 && !selected
293327 isInSideStage: priv.sideStageAppId == model.appId
294− interactive: !spreadView.interactive
295− maximizedAppTopMargin: root.maximizedAppTopMargin
296328
297329 progress: {
298330 var tileProgress = (spreadView.contentX - zIndex * spreadView.tileDistance) / spreadView.width;
@@ -325,7 +357,6 @@ Item {
325357
326358 onClicked: {
327359 if (spreadView.phase == 2) {
328− print("selected index", index, "appId", ApplicationManager.get(index))
329360 if (ApplicationManager.focusedApplicationId == ApplicationManager.get(index).appId) {
330361 spreadView.snapTo(index);
331362 } else {
@@ -359,31 +390,52 @@ Item {
359390
360391 Rectangle {
361392 id: sideStageDragHandle
362− color: "red"
393+ color: "transparent"
363394 anchors { top: parent.top; bottom: parent.bottom; right: parent.right; rightMargin: spreadView.sideStageWidth }
364395 width: units.gu(2)
365− visible: spreadView.phase <= 0 && spreadView.sideStageVisible
396+ opacity: spreadView.phase <= 0 && spreadView.sideStageVisible ? 1 : 0
366397 property real progress: 0
367398 property bool dragging: false
368399
369− onProgressChanged: print("prigress is", progress)
400+ Behavior on opacity { UbuntuNumberAnimation {} }
401+
402+ Connections {
403+ target: spreadView
404+ onSideStageVisibleChanged: {
405+ if (spreadView.sideStageVisible) {
406+ sideStageDragHandle.progress = 0;
407+ }
408+ }
409+ }
410+
411+ Image {
412+ anchors.centerIn: parent
413+ anchors.horizontalCenterOffset: parent.progress * spreadView.sideStageWidth - (width - parent.width) / 2
414+ width: sideStageDragHandleMouseArea.pressed ? parent.width * 2 : parent.width
415+ height: parent.height
416+ source: "graphics/sidestage_handle@20.png"
417+ Behavior on width { UbuntuNumberAnimation {} }
418+ }
370419
371420 MouseArea {
372421 id: sideStageDragHandleMouseArea
373422 anchors.fill: parent
374423 property int startX
424+ property var gesturePoints: new Array()
375425 onPressed: {
426+ gesturePoints = [];
376427 startX = mouseX;
377428 sideStageDragHandle.progress = 0;
378429 sideStageDragHandle.dragging = true;
379− print("sideStageDragHandle pressed")
380430 }
381431 onMouseXChanged: {
382− sideStageDragHandle.progress = (-startX + mouseX) / spreadView.sideStageWidth
383− print("foooo", -spreadView.sideStageWidth + spreadView.sideStageWidth * spreadView.sideStageDragProgress)
432+ sideStageDragHandle.progress = Math.max(0, (-startX + mouseX) / spreadView.sideStageWidth)
433+ gesturePoints.push(mouseX);
384434 }
385435 onReleased: {
386− sideStageDragSnapAnimation.to = sideStageDragHandle.progress < 0.5 ? 0 : 1
436+ var oneWayFlick = priv.evaluateOneWayFlick(gesturePoints);
437+ gesturePoints = [];
438+ sideStageDragSnapAnimation.to = sideStageDragHandle.progress > 0.5 || oneWayFlick ? 1 : 0
387439 sideStageDragSnapAnimation.start();
388440 }
389441 }
@@ -405,9 +457,10 @@ Item {
405457 anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
406458 width: root.dragAreaWidth
407459
408− Rectangle { anchors.fill: parent; color: "#4400FF00"}
460+// Rectangle { anchors.fill: parent; color: "#4400FF00"}
409461
410462 property bool attachedToView: false
463+ property var gesturePoints: new Array()
411464
412465 onTouchXChanged: {
413466 if (!dragging) {
@@ -422,18 +475,37 @@ Item {
422475 spreadView.snap();
423476 }
424477 }
478+ gesturePoints.push(touchX);
479+ }
480+
481+ onStatusChanged: {
482+ if (status == DirectionalDragArea.Recognized) {
483+ attachedToView = true;
484+ }
425485 }
426486
427487 onDraggingChanged: {
428488 if (dragging) {
429− attachedToView = true;
430− } else {
431− print("released on contentX", spreadView.contentX)
432− if (spreadView.contentX /spreadView.width < spreadView.positionMarker1) {
433− print("rleased in phase 1")
489+ // Gesture recognized. Start recording this gesture
490+ gesturePoints = [];
491+ return;
492+ }
493+
494+ // Ok. The user released. Find out if it was a one-way movement.
495+ var oneWayFlick = priv.evaluateOneWayFlick(gesturePoints);
496+ gesturePoints = [];
497+
498+ if (oneWayFlick && spreadView.contentX < spreadView.positionMarker1 * spreadView.width) {
499+ // If it was a short one-way movement, do the Alt+Tab switch
500+ // no matter if we didn't cross positionMarker1 yet.
501+ spreadView.snapTo(spreadView.nextInStack);
502+ } else if (!dragging && attachedToView) {
503+ if (spreadView.contentX / spreadView.width < spreadView.positionMarker1) {
434504 spreadView.snap();
435− } else if (spreadView.contentX / spreadView.width < spreadView.positionMarker3) {
436− spreadView.snapTo(spreadView.nextInStack)
505+ } else {
506+ // otherwise snap to the closest snap position we can find
507+ // (might be back to start, to app 1 or to spread)
508+ spreadView.snapTo(spreadView.nextInStack);
437509 }
438510 }
439511 }
qml/Stages/TransformedTabletSpreadDelegate.qml+7−18
@@ -44,9 +44,9 @@ SpreadDelegate {
4444 property bool isInSideStage: false
4545
4646 onSelectedChanged: {
47− print("selected changed:", selected)
47+// print("selected changed:", selected)
4848 if (selected) {
49− print("snappsshotting", index)
49+// print("snappsshotting", index)
5050 priv.snapshot();
5151 }
5252 priv.isSelected = selected;
@@ -66,14 +66,11 @@ SpreadDelegate {
6666 if (spreadView.phase == 1) {
6767 var phase2Progress = spreadView.positionMarker4 - (root.zIndex * spreadView.tileDistance / spreadView.width);
6868 priv.phase2StartTranslate = priv.easingAnimation(0, 1, 0, -spreadView.width + (root.zIndex * root.endDistance), phase2Progress);
69− print("calculating end value for", root.zIndex, priv.phase2StartTranslate, "startprogress:", phase2Progress)
69+// print("calculating end value for", root.zIndex, priv.phase2StartTranslate, "startprogress:", phase2Progress)
7070
7171 priv.phase2StartScale = priv.easingAnimation(0, 1, root.startScale, root.endScale, phase2Progress)
7272 priv.phase2StartAngle = priv.easingAnimation(0, 1, root.startAngle, root.endAngle, phase2Progress)
7373 }
74− if (spreadView.phase == 2) {
75− print("phase 2 entered: progress for index", root.zIndex, "is", root.progress)
76− }
7774 }
7875 }
7976
@@ -101,8 +98,8 @@ SpreadDelegate {
10198 selectedAngle = angle;
10299 selectedScale = priv.scale;
103100 selectedOpacity = priv.opacityTransform;
104− print("snapshotting at phase", spreadView.phase, negativeProgress);
105− print("snapshotted", root.zIndex, "prog:", selectedProgress, "translate:", selectedXTranslate, "angle", selectedAngle, "scale", selectedScale)
101+// print("snapshotting at phase", spreadView.phase, negativeProgress);
102+// print("snapshotted", root.zIndex, "prog:", selectedProgress, "translate:", selectedXTranslate, "angle", selectedAngle, "scale", selectedScale)
106103// selectedTopMarginProgress = topMarginProgress;
107104 }
108105
@@ -135,7 +132,7 @@ SpreadDelegate {
135132 }
136133
137134 if (isSelected) {
138− print("progress:", root.progress, negativeProgress)
135+// print("progress:", root.progress, negativeProgress)
139136 if (model.stage == ApplicationInfoInterface.MainStage) {
140137 return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, -spreadView.width, root.progress)
141138 } else {
@@ -184,13 +181,11 @@ SpreadDelegate {
184181 var startProgress = spreadView.positionMarker2 - (zIndex * spreadView.positionMarker2 / 2)
185182 var endProgress = spreadView.positionMarker4 - (zIndex * spreadView.tileDistance / spreadView.width)
186183 newTranslate = linearAnimation(startProgress, endProgress, 0, priv.phase2StartTranslate, root.progress);
187− if (root.zIndex == 2) print("********** progress:", root.progress, "startProgress:", startProgress, "newTranslate", newTranslate)
188184 }
189185 }
190186
191187 if (spreadView.phase == 2) {
192188 newTranslate = -easingCurve.value * (spreadView.width - root.zIndex * animatedEndDistance)
193− if (root.zIndex == 2) print("index", zIndex, "translate", newTranslate, "progress:", root.progress)
194189 }
195190
196191 return newTranslate;
@@ -278,17 +273,12 @@ SpreadDelegate {
278273 }
279274
280275 property real opacityTransform: {
281− if (otherSelected) {
282−// if (active && root.progress == 0) {
283−// fadeBackInAnimation.start()
284−// }
276+ if (otherSelected && spreadView.phase == 2) {
285277 return linearAnimation(selectedProgress, negativeProgress, selectedOpacity, 0, root.progress)
286278 }
287279
288280 return 1;
289281 }
290−
291−// onXTranslateChanged: print("xtrnslate changed", xTranslate)
292282 }
293283
294284 states: [
@@ -297,7 +287,6 @@ SpreadDelegate {
297287 PropertyChanges { target: priv; xTranslate: -spreadView.sideStageWidth + spreadView.sideStageWidth * spreadView.sideStageDragProgress }
298288 }
299289 ]
300− onStateChanged: print("jfdksjflkdsajfklsdjlfsdaklfjdsalkfjsad", state)
301290
302291 transform: [
303292 Rotation {