diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 8689e62a2..cc7881c6e 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -43,7 +43,6 @@ const PAGE_PREVIEW_ANIMATION_TIME = 150; const PAGE_INDICATOR_FADE_TIME = 200; const PAGE_PREVIEW_RATIO = 0.20; -const OVERSHOOT_THRESHOLD = 20; const OVERSHOOT_TIMEOUT = 1000; const DELAYED_MOVE_TIMEOUT = 200; @@ -548,7 +547,7 @@ var BaseAppView = GObject.registerClass({ style_class: 'page-navigation-hint next', opacity: 0, visible: false, - reactive: false, + reactive: true, x_expand: true, y_expand: true, x_align: Clutter.ActorAlign.FILL, @@ -559,7 +558,7 @@ var BaseAppView = GObject.registerClass({ style_class: 'page-navigation-hint previous', opacity: 0, visible: false, - reactive: false, + reactive: true, x_expand: true, y_expand: true, x_align: Clutter.ActorAlign.FILL, @@ -641,7 +640,6 @@ var BaseAppView = GObject.registerClass({ () => this._redisplay(), this); // Drag n' Drop - this._lastOvershoot = -1; this._lastOvershootTimeoutId = 0; this._delayedMoveData = null; @@ -846,54 +844,37 @@ var BaseAppView = GObject.registerClass({ if (this._lastOvershootTimeoutId) GLib.source_remove(this._lastOvershootTimeoutId); this._lastOvershootTimeoutId = 0; - this._lastOvershoot = -1; } _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 if (this._adjustment.get_transition('value') !== null) return; - // Within the grid boundaries - 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(); + const {targetActor} = dragEvent; + if (targetActor !== this._prevPageIndicator && + targetActor !== this._nextPageIndicator) { + this._resetOvershoot(); return; } - // Still in the area of the previous page switch - if (this._lastOvershoot >= 0) + if (this._lastOvershootTimeoutId > 0) return; - const rtl = this.get_text_direction() === Clutter.TextDirection.RTL; - if (dragPosition <= gridStart) - this.goToPage(this._grid.currentPage + (rtl ? 1 : -1)); - else if (dragPosition >= gridEnd) - this.goToPage(this._grid.currentPage + (rtl ? -1 : 1)); + let targetPage; + if (dragEvent.targetActor === this._prevPageIndicator) + targetPage = this._grid.currentPage - 1; else + targetPage = this._grid.currentPage + 1; + + if (targetPage < 0 || targetPage >= this._grid.nPages) return; // don't go beyond first/last page - this._lastOvershoot = dragPosition; - - if (this._lastOvershootTimeoutId > 0) - GLib.source_remove(this._lastOvershootTimeoutId); - this._lastOvershootTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, OVERSHOOT_TIMEOUT, () => { this._resetOvershoot(); - this._handleDragOvershoot(dragEvent); + this.goToPage(targetPage); return GLib.SOURCE_REMOVE; }); GLib.Source.set_name_by_id(this._lastOvershootTimeoutId,