on xenial help sign in
sync TabletStage changes from work on trunk
35fa704Michael Zanetti
qml/Stages/TabletStage.qml+95−23
@@ -36,9 +36,7 @@ Item {
36 property bool fullscreen: true
36 property bool fullscreen: true
37 property bool overlayMode: false
37 property bool overlayMode: false
38
38
39− readonly property int overlayWidth: priv.overlayOverride ? 0 : spreadView.sideStageWidth
39+ readonly property int overlayWidth: priv.overlayOverride ? 0 : priv.sideStageWidth
40−
41− property real maximizedAppTopMargin
42
40
43 QtObject {
41 QtObject {
44 id: priv
42 id: priv
@@ -74,20 +72,56 @@ Item {
74 }
72 }
75 return -1;
73 return -1;
76 }
74 }
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+ }
77 }
104 }
78
105
79 Connections {
106 Connections {
80 target: ApplicationManager
107 target: ApplicationManager
81 onFocusRequested: {
108 onFocusRequested: {
109+ printStack()
82− if (spreadView.visible) {
110+ if (spreadView.interactive) {
83 spreadView.snapTo(priv.indexOf(appId));
111 spreadView.snapTo(priv.indexOf(appId));
84 } else {
112 } else {
85− priv.switchToApp(appId);
113+// priv.switchToApp(appId);
86 ApplicationManager.focusApplication(appId)
114 ApplicationManager.focusApplication(appId)
87 }
115 }
88 }
116 }
89 }
117 }
90
118
119+ function printStack() {
120+ for (var i = 0; i < ApplicationManager.count; i++) {
121+ print("AppMan item", i, ":", ApplicationManager.get(i).appId)
122+ }
123+ }
124+
91 Flickable {
125 Flickable {
92 id: spreadView
126 id: spreadView
93 anchors.fill: parent
127 anchors.fill: parent
@@ -291,8 +325,6 @@ Item {
291 selected: spreadView.selectedIndex == index
325 selected: spreadView.selectedIndex == index
292 otherSelected: spreadView.selectedIndex >= 0 && !selected
326 otherSelected: spreadView.selectedIndex >= 0 && !selected
293 isInSideStage: priv.sideStageAppId == model.appId
327 isInSideStage: priv.sideStageAppId == model.appId
294− interactive: !spreadView.interactive
295− maximizedAppTopMargin: root.maximizedAppTopMargin
296
328
297 progress: {
329 progress: {
298 var tileProgress = (spreadView.contentX - zIndex * spreadView.tileDistance) / spreadView.width;
330 var tileProgress = (spreadView.contentX - zIndex * spreadView.tileDistance) / spreadView.width;
@@ -325,7 +357,6 @@ Item {
325
357
326 onClicked: {
358 onClicked: {
327 if (spreadView.phase == 2) {
359 if (spreadView.phase == 2) {
328− print("selected index", index, "appId", ApplicationManager.get(index))
329 if (ApplicationManager.focusedApplicationId == ApplicationManager.get(index).appId) {
360 if (ApplicationManager.focusedApplicationId == ApplicationManager.get(index).appId) {
330 spreadView.snapTo(index);
361 spreadView.snapTo(index);
331 } else {
362 } else {
@@ -359,31 +390,52 @@ Item {
359
390
360 Rectangle {
391 Rectangle {
361 id: sideStageDragHandle
392 id: sideStageDragHandle
362− color: "red"
393+ color: "transparent"
363 anchors { top: parent.top; bottom: parent.bottom; right: parent.right; rightMargin: spreadView.sideStageWidth }
394 anchors { top: parent.top; bottom: parent.bottom; right: parent.right; rightMargin: spreadView.sideStageWidth }
364 width: units.gu(2)
395 width: units.gu(2)
365− visible: spreadView.phase <= 0 && spreadView.sideStageVisible
396+ opacity: spreadView.phase <= 0 && spreadView.sideStageVisible ? 1 : 0
366 property real progress: 0
397 property real progress: 0
367 property bool dragging: false
398 property bool dragging: false
368
399
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+ }
370
419
371 MouseArea {
420 MouseArea {
372 id: sideStageDragHandleMouseArea
421 id: sideStageDragHandleMouseArea
373 anchors.fill: parent
422 anchors.fill: parent
374 property int startX
423 property int startX
424+ property var gesturePoints: new Array()
375 onPressed: {
425 onPressed: {
426+ gesturePoints = [];
376 startX = mouseX;
427 startX = mouseX;
377 sideStageDragHandle.progress = 0;
428 sideStageDragHandle.progress = 0;
378 sideStageDragHandle.dragging = true;
429 sideStageDragHandle.dragging = true;
379− print("sideStageDragHandle pressed")
380 }
430 }
381 onMouseXChanged: {
431 onMouseXChanged: {
382− sideStageDragHandle.progress = (-startX + mouseX) / spreadView.sideStageWidth
432+ sideStageDragHandle.progress = Math.max(0, (-startX + mouseX) / spreadView.sideStageWidth)
383− print("foooo", -spreadView.sideStageWidth + spreadView.sideStageWidth * spreadView.sideStageDragProgress)
433+ gesturePoints.push(mouseX);
384 }
434 }
385 onReleased: {
435 onReleased: {
436+ var oneWayFlick = priv.evaluateOneWayFlick(gesturePoints);
437+ gesturePoints = [];
386− sideStageDragSnapAnimation.to = sideStageDragHandle.progress < 0.5 ? 0 : 1
438+ sideStageDragSnapAnimation.to = sideStageDragHandle.progress > 0.5 || oneWayFlick ? 1 : 0
387 sideStageDragSnapAnimation.start();
439 sideStageDragSnapAnimation.start();
388 }
440 }
389 }
441 }
@@ -405,9 +457,10 @@ Item {
405 anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
457 anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
406 width: root.dragAreaWidth
458 width: root.dragAreaWidth
407
459
408− Rectangle { anchors.fill: parent; color: "#4400FF00"}
460+// Rectangle { anchors.fill: parent; color: "#4400FF00"}
409
461
410 property bool attachedToView: false
462 property bool attachedToView: false
463+ property var gesturePoints: new Array()
411
464
412 onTouchXChanged: {
465 onTouchXChanged: {
413 if (!dragging) {
466 if (!dragging) {
@@ -422,18 +475,37 @@ Item {
422 spreadView.snap();
475 spreadView.snap();
423 }
476 }
424 }
477 }
478+ gesturePoints.push(touchX);
479+ }
480+
481+ onStatusChanged: {
482+ if (status == DirectionalDragArea.Recognized) {
483+ attachedToView = true;
484+ }
425 }
485 }
426
486
427 onDraggingChanged: {
487 onDraggingChanged: {
428 if (dragging) {
488 if (dragging) {
429− attachedToView = true;
489+ // Gesture recognized. Start recording this gesture
430− } else {
490+ gesturePoints = [];
431− print("released on contentX", spreadView.contentX)
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) {
432− if (spreadView.contentX /spreadView.width < spreadView.positionMarker1) {
503+ if (spreadView.contentX / spreadView.width < spreadView.positionMarker1) {
433− print("rleased in phase 1")
434 spreadView.snap();
504 spreadView.snap();
435− } else if (spreadView.contentX / spreadView.width < spreadView.positionMarker3) {
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)
436− spreadView.snapTo(spreadView.nextInStack)
508+ spreadView.snapTo(spreadView.nextInStack);
437 }
509 }
438 }
510 }
439 }
511 }
qml/Stages/TransformedTabletSpreadDelegate.qml+7−18
@@ -44,9 +44,9 @@ SpreadDelegate {
44 property bool isInSideStage: false
44 property bool isInSideStage: false
45
45
46 onSelectedChanged: {
46 onSelectedChanged: {
47− print("selected changed:", selected)
47+// print("selected changed:", selected)
48 if (selected) {
48 if (selected) {
49− print("snappsshotting", index)
49+// print("snappsshotting", index)
50 priv.snapshot();
50 priv.snapshot();
51 }
51 }
52 priv.isSelected = selected;
52 priv.isSelected = selected;
@@ -66,14 +66,11 @@ SpreadDelegate {
66 if (spreadView.phase == 1) {
66 if (spreadView.phase == 1) {
67 var phase2Progress = spreadView.positionMarker4 - (root.zIndex * spreadView.tileDistance / spreadView.width);
67 var phase2Progress = spreadView.positionMarker4 - (root.zIndex * spreadView.tileDistance / spreadView.width);
68 priv.phase2StartTranslate = priv.easingAnimation(0, 1, 0, -spreadView.width + (root.zIndex * root.endDistance), phase2Progress);
68 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)
70
70
71 priv.phase2StartScale = priv.easingAnimation(0, 1, root.startScale, root.endScale, phase2Progress)
71 priv.phase2StartScale = priv.easingAnimation(0, 1, root.startScale, root.endScale, phase2Progress)
72 priv.phase2StartAngle = priv.easingAnimation(0, 1, root.startAngle, root.endAngle, phase2Progress)
72 priv.phase2StartAngle = priv.easingAnimation(0, 1, root.startAngle, root.endAngle, phase2Progress)
73 }
73 }
74− if (spreadView.phase == 2) {
75− print("phase 2 entered: progress for index", root.zIndex, "is", root.progress)
76− }
77 }
74 }
78 }
75 }
79
76
@@ -101,8 +98,8 @@ SpreadDelegate {
101 selectedAngle = angle;
98 selectedAngle = angle;
102 selectedScale = priv.scale;
99 selectedScale = priv.scale;
103 selectedOpacity = priv.opacityTransform;
100 selectedOpacity = priv.opacityTransform;
104− print("snapshotting at phase", spreadView.phase, negativeProgress);
101+// print("snapshotting at phase", spreadView.phase, negativeProgress);
105− print("snapshotted", root.zIndex, "prog:", selectedProgress, "translate:", selectedXTranslate, "angle", selectedAngle, "scale", selectedScale)
102+// print("snapshotted", root.zIndex, "prog:", selectedProgress, "translate:", selectedXTranslate, "angle", selectedAngle, "scale", selectedScale)
106// selectedTopMarginProgress = topMarginProgress;
103// selectedTopMarginProgress = topMarginProgress;
107 }
104 }
108
105
@@ -135,7 +132,7 @@ SpreadDelegate {
135 }
132 }
136
133
137 if (isSelected) {
134 if (isSelected) {
138− print("progress:", root.progress, negativeProgress)
135+// print("progress:", root.progress, negativeProgress)
139 if (model.stage == ApplicationInfoInterface.MainStage) {
136 if (model.stage == ApplicationInfoInterface.MainStage) {
140 return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, -spreadView.width, root.progress)
137 return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, -spreadView.width, root.progress)
141 } else {
138 } else {
@@ -184,13 +181,11 @@ SpreadDelegate {
184 var startProgress = spreadView.positionMarker2 - (zIndex * spreadView.positionMarker2 / 2)
181 var startProgress = spreadView.positionMarker2 - (zIndex * spreadView.positionMarker2 / 2)
185 var endProgress = spreadView.positionMarker4 - (zIndex * spreadView.tileDistance / spreadView.width)
182 var endProgress = spreadView.positionMarker4 - (zIndex * spreadView.tileDistance / spreadView.width)
186 newTranslate = linearAnimation(startProgress, endProgress, 0, priv.phase2StartTranslate, root.progress);
183 newTranslate = linearAnimation(startProgress, endProgress, 0, priv.phase2StartTranslate, root.progress);
187− if (root.zIndex == 2) print("********** progress:", root.progress, "startProgress:", startProgress, "newTranslate", newTranslate)
188 }
184 }
189 }
185 }
190
186
191 if (spreadView.phase == 2) {
187 if (spreadView.phase == 2) {
192 newTranslate = -easingCurve.value * (spreadView.width - root.zIndex * animatedEndDistance)
188 newTranslate = -easingCurve.value * (spreadView.width - root.zIndex * animatedEndDistance)
193− if (root.zIndex == 2) print("index", zIndex, "translate", newTranslate, "progress:", root.progress)
194 }
189 }
195
190
196 return newTranslate;
191 return newTranslate;
@@ -278,17 +273,12 @@ SpreadDelegate {
278 }
273 }
279
274
280 property real opacityTransform: {
275 property real opacityTransform: {
281− if (otherSelected) {
276+ if (otherSelected && spreadView.phase == 2) {
282−// if (active && root.progress == 0) {
283−// fadeBackInAnimation.start()
284−// }
285 return linearAnimation(selectedProgress, negativeProgress, selectedOpacity, 0, root.progress)
277 return linearAnimation(selectedProgress, negativeProgress, selectedOpacity, 0, root.progress)
286 }
278 }
287
279
288 return 1;
280 return 1;
289 }
281 }
290−
291−// onXTranslateChanged: print("xtrnslate changed", xTranslate)
292 }
282 }
293
283
294 states: [
284 states: [
@@ -297,7 +287,6 @@ SpreadDelegate {
297 PropertyChanges { target: priv; xTranslate: -spreadView.sideStageWidth + spreadView.sideStageWidth * spreadView.sideStageDragProgress }
287 PropertyChanges { target: priv; xTranslate: -spreadView.sideStageWidth + spreadView.sideStageWidth * spreadView.sideStageDragProgress }
298 }
288 }
299 ]
289 ]
300− onStateChanged: print("jfdksjflkdsajfklsdjlfsdaklfjdsalkfjsad", state)
301
290
302 transform: [
291 transform: [
303 Rotation {
292 Rotation {