appDisplay: Reimplement drag motion using page indicators

This simplified the _handleDragOvershoot() callback quite a lot.
Instead of transforming point positions and checking them against
grid coordinates, merely check if the drop target is one of the
page indicators.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2335>
This commit is contained in:
Georges Basile Stavracas Neto 2022-06-28 19:47:06 -03:00 committed by Marge Bot
parent ca9a19dfbe
commit 09b975fabf

View File

@ -43,7 +43,6 @@ const PAGE_PREVIEW_ANIMATION_TIME = 150;
const PAGE_INDICATOR_FADE_TIME = 200; const PAGE_INDICATOR_FADE_TIME = 200;
const PAGE_PREVIEW_RATIO = 0.20; const PAGE_PREVIEW_RATIO = 0.20;
const OVERSHOOT_THRESHOLD = 20;
const OVERSHOOT_TIMEOUT = 1000; const OVERSHOOT_TIMEOUT = 1000;
const DELAYED_MOVE_TIMEOUT = 200; const DELAYED_MOVE_TIMEOUT = 200;
@ -548,7 +547,7 @@ var BaseAppView = GObject.registerClass({
style_class: 'page-navigation-hint next', style_class: 'page-navigation-hint next',
opacity: 0, opacity: 0,
visible: false, visible: false,
reactive: false, reactive: true,
x_expand: true, x_expand: true,
y_expand: true, y_expand: true,
x_align: Clutter.ActorAlign.FILL, x_align: Clutter.ActorAlign.FILL,
@ -559,7 +558,7 @@ var BaseAppView = GObject.registerClass({
style_class: 'page-navigation-hint previous', style_class: 'page-navigation-hint previous',
opacity: 0, opacity: 0,
visible: false, visible: false,
reactive: false, reactive: true,
x_expand: true, x_expand: true,
y_expand: true, y_expand: true,
x_align: Clutter.ActorAlign.FILL, x_align: Clutter.ActorAlign.FILL,
@ -641,7 +640,6 @@ var BaseAppView = GObject.registerClass({
() => this._redisplay(), this); () => this._redisplay(), this);
// Drag n' Drop // Drag n' Drop
this._lastOvershoot = -1;
this._lastOvershootTimeoutId = 0; this._lastOvershootTimeoutId = 0;
this._delayedMoveData = null; this._delayedMoveData = null;
@ -846,54 +844,37 @@ var BaseAppView = GObject.registerClass({
if (this._lastOvershootTimeoutId) if (this._lastOvershootTimeoutId)
GLib.source_remove(this._lastOvershootTimeoutId); GLib.source_remove(this._lastOvershootTimeoutId);
this._lastOvershootTimeoutId = 0; this._lastOvershootTimeoutId = 0;
this._lastOvershoot = -1;
} }
_handleDragOvershoot(dragEvent) { _handleDragOvershoot(dragEvent) {
const [gridX, gridY] = this.get_transformed_position();
const [gridWidth, gridHeight] = this.get_transformed_size();
const vertical = this._orientation === Clutter.Orientation.VERTICAL;
const gridStart = vertical ? gridY : gridX;
const gridEnd = vertical
? gridY + gridHeight - OVERSHOOT_THRESHOLD
: gridX + gridWidth - OVERSHOOT_THRESHOLD;
// Already animating // Already animating
if (this._adjustment.get_transition('value') !== null) if (this._adjustment.get_transition('value') !== null)
return; return;
// Within the grid boundaries const {targetActor} = dragEvent;
const dragPosition = vertical ? dragEvent.y : dragEvent.x;
if (dragPosition > gridStart && dragPosition < gridEnd) {
// Check whether we moved out the area of the last switch
if (Math.abs(this._lastOvershoot - dragPosition) > OVERSHOOT_THRESHOLD)
this._resetOvershoot();
if (targetActor !== this._prevPageIndicator &&
targetActor !== this._nextPageIndicator) {
this._resetOvershoot();
return; return;
} }
// Still in the area of the previous page switch if (this._lastOvershootTimeoutId > 0)
if (this._lastOvershoot >= 0)
return; return;
const rtl = this.get_text_direction() === Clutter.TextDirection.RTL; let targetPage;
if (dragPosition <= gridStart) if (dragEvent.targetActor === this._prevPageIndicator)
this.goToPage(this._grid.currentPage + (rtl ? 1 : -1)); targetPage = this._grid.currentPage - 1;
else if (dragPosition >= gridEnd)
this.goToPage(this._grid.currentPage + (rtl ? -1 : 1));
else else
targetPage = this._grid.currentPage + 1;
if (targetPage < 0 || targetPage >= this._grid.nPages)
return; // don't go beyond first/last page return; // don't go beyond first/last page
this._lastOvershoot = dragPosition;
if (this._lastOvershootTimeoutId > 0)
GLib.source_remove(this._lastOvershootTimeoutId);
this._lastOvershootTimeoutId = this._lastOvershootTimeoutId =
GLib.timeout_add(GLib.PRIORITY_DEFAULT, OVERSHOOT_TIMEOUT, () => { GLib.timeout_add(GLib.PRIORITY_DEFAULT, OVERSHOOT_TIMEOUT, () => {
this._resetOvershoot(); this._resetOvershoot();
this._handleDragOvershoot(dragEvent); this.goToPage(targetPage);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(this._lastOvershootTimeoutId, GLib.Source.set_name_by_id(this._lastOvershootTimeoutId,