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:
parent
ca9a19dfbe
commit
09b975fabf
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user