[gnome-shell/wip/exalm/gestures: 20/23] appDisplay: Use SwipeTracker
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/wip/exalm/gestures: 20/23] appDisplay: Use SwipeTracker
- Date: Tue, 2 Jul 2019 12:45:55 +0000 (UTC)
commit a215048b2430e2bee3436eaaa0d10cb86155f0b3
Author: Alexander Mikhaylenko <exalm7659 gmail com>
Date: Sun Jun 30 17:15:37 2019 +0500
appDisplay: Use SwipeTracker
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/605
js/ui/appDisplay.js | 142 +++++++++++++++++++++++++++++-----------------------
1 file changed, 78 insertions(+), 64 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 661b0f98c..a4b5f050c 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -14,6 +14,7 @@ const PageIndicators = imports.ui.pageIndicators;
const PopupMenu = imports.ui.popupMenu;
const Tweener = imports.ui.tweener;
const Search = imports.ui.search;
+const SwipeTracker = imports.ui.swipeTracker;
const Params = imports.misc.params;
const Util = imports.misc.util;
const SystemActions = imports.misc.systemActions;
@@ -243,7 +244,9 @@ var AllView = class AllView extends BaseAppView {
(indicators, pageIndex) => {
this.goToPage(pageIndex);
});
- this._pageIndicators.connect('scroll-event', this._onScroll.bind(this));
+ this._pageIndicators.connect('scroll-event', (actor, event) =>
+ this._scrollView.event (event, false)
+ );
this.actor.add_actor(this._pageIndicators);
this.folderIcons = [];
@@ -261,13 +264,14 @@ var AllView = class AllView extends BaseAppView {
this._scrollView.connect('scroll-event', this._onScroll.bind(this));
- let panAction = new Clutter.PanAction({ interpolate: false });
- panAction.connect('pan', this._onPan.bind(this));
- panAction.connect('gesture-cancel', this._onPanEnd.bind(this));
- panAction.connect('gesture-end', this._onPanEnd.bind(this));
- this._panAction = panAction;
- this._scrollView.add_action(panAction);
- this._panning = false;
+ let allowedModes = Shell.ActionMode.OVERVIEW;
+ let swipeTracker = new SwipeTracker.SwipeTracker(this._scrollView, allowedModes);
+ swipeTracker.connect('begin', this._swipeBegin.bind(this));
+ swipeTracker.connect('update', this._swipeUpdate.bind(this));
+ swipeTracker.connect('end', this._swipeEnd.bind(this));
+ swipeTracker.connect('cancel', this._swipeCancel.bind(this));
+
+ this._gestureActive = false;
this._clickAction = new Clutter.ClickAction();
this._clickAction.connect('clicked', () => {
if (!this._currentPopup)
@@ -307,6 +311,7 @@ var AllView = class AllView extends BaseAppView {
global.stage.disconnect(this._keyPressEventId);
this._keyPressEventId = 0;
}
+ swipeTracker.enabled = this.actor.mapped;
});
this._redisplayWorkId = Main.initializeDeferredWork(this.actor, this._redisplay.bind(this));
@@ -451,43 +456,16 @@ var AllView = class AllView extends BaseAppView {
if (this._displayingPopup && this._currentPopup)
this._currentPopup.popdown();
- let velocity;
- if (!this._panning)
- velocity = 0;
- else
- velocity = Math.abs(this._panAction.get_velocity(0)[2]);
- // Tween the change between pages.
- // If velocity is not specified (i.e. scrolling with mouse wheel),
- // use the same speed regardless of original position
- // if velocity is specified, it's in pixels per milliseconds
- let diffToPage = this._diffToPage(pageNumber);
- let childBox = this._scrollView.get_allocation_box();
- let totalHeight = childBox.y2 - childBox.y1;
- let time;
- // Only take the velocity into account on page changes, otherwise
- // return smoothly to the current page using the default velocity
- if (this._grid.currentPage != pageNumber) {
- let minVelocity = totalHeight / (PAGE_SWITCH_TIME * 1000);
- velocity = Math.max(minVelocity, velocity);
- time = (diffToPage / velocity) / 1000;
- } else {
- time = PAGE_SWITCH_TIME * diffToPage / totalHeight;
- }
- // When changing more than one page, make sure to not take
- // longer than PAGE_SWITCH_TIME
- time = Math.min(time, PAGE_SWITCH_TIME);
-
this._grid.currentPage = pageNumber;
- Tweener.addTween(this._adjustment,
- { value: this._grid.getPageY(this._grid.currentPage),
- time: time,
- transition: 'easeOutQuad' });
- this._pageIndicators.setCurrentPage(pageNumber);
- }
- _diffToPage(pageNumber) {
- let currentScrollPosition = this._adjustment.value;
- return Math.abs(currentScrollPosition - this._grid.getPageY(pageNumber));
+ if (!this._gestureActive)
+ // Tween the change between pages.
+ Tweener.addTween(this._adjustment,
+ { value: this._grid.getPageY(this._grid.currentPage),
+ time: PAGE_SWITCH_TIME,
+ transition: 'easeOutCubic' });
+
+ this._pageIndicators.setCurrentPage(pageNumber);
}
openSpaceForPopup(item, side, nRows) {
@@ -510,6 +488,9 @@ var AllView = class AllView extends BaseAppView {
if (this._displayingPopup || !this._scrollView.reactive)
return Clutter.EVENT_STOP;
+ if (event.get_scroll_source() == Clutter.ScrollSource.FINGER ||
event.get_source_device().get_device_type() == Clutter.InputDeviceType.TOUCHPAD_DEVICE) // TODO: remove this
and handle it in SwipeTracker too
+ return Clutter.EVENT_PROPAGATE;
+
let direction = event.get_scroll_direction();
if (direction == Clutter.ScrollDirection.UP)
this.goToPage(this._grid.currentPage - 1);
@@ -519,34 +500,67 @@ var AllView = class AllView extends BaseAppView {
return Clutter.EVENT_STOP;
}
- _onPan(action) {
- if (this._displayingPopup)
- return false;
- this._panning = true;
- this._clickAction.release();
- let [dist, dx, dy] = action.get_motion_delta(0);
- let adjustment = this._adjustment;
- adjustment.value -= (dy / this._scrollView.height) * adjustment.page_size;
- return false;
- }
+ _swipeBegin(tracker, monitor) {
+ if (monitor != Main.layoutManager.primaryIndex)
+ return;
- _onPanEnd(action) {
- if (this._displayingPopup)
+ if (this._gestureActive) {
+ let adjustment = this._adjustment;
+ Tweener.removeTweens(adjustment);
+
+ let progress = this._adjustment.value / adjustment.page_size - this._grid.currentPage;
+ tracker.continueSwipe(progress);
return;
+ }
- let pageHeight = this._grid.getPageHeight();
+ let canSwipeForward = this._grid.currentPage > 0;
+ let canSwipeBack = this._grid.currentPage < this._grid.nPages() - 1;
+ tracker.confirmSwipe(canSwipeBack, canSwipeForward, this._scrollView.height, 0, 0);
- // Calculate the scroll value we'd be at, which is our current
- // scroll plus any velocity the user had when they released
- // their finger.
+ this._gestureActive = true;
+ }
- let velocity = -action.get_velocity(0)[2];
- let endPanValue = this._adjustment.value + velocity;
+ _swipeUpdate(tracker, progress) {
+ let adjustment = this._adjustment;
+ adjustment.value = (this._grid.currentPage + progress) * adjustment.page_size;
+ }
- let closestPage = Math.round(endPanValue / pageHeight);
- this.goToPage(closestPage);
+ _swipeEnd(tracker, duration, isBack) {
+ let adjustment = this._adjustment;
+ let page = this._grid.currentPage + (isBack ? 1 : -1);
+ let value = page * adjustment.page_size;
+
+ Tweener.addTween(adjustment,
+ { value: value,
+ time: duration,
+ transition: 'easeOutCubic',
+ onComplete: () => {
+ this.goToPage(page);
+ this._gestureActive = false;
+ },
+ onCompleteScope: this
+ });
+ }
+
+ _swipeCancel(tracker, duration) {
+ let adjustment = this._adjustment;
+ let value = this._grid.currentPage * adjustment.page_size;
- this._panning = false;
+ if (duration == 0) {
+ adjustment.value = value;
+ this._gestureActive = false;
+ return;
+ }
+
+ Tweener.addTween(adjustment,
+ { value: value,
+ time: duration,
+ transition: 'easeOutCubic',
+ onComplete: () => {
+ this._gestureActive = false;
+ },
+ onCompleteScope: this
+ });
}
_onKeyPressEvent(actor, event) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]