loleaflet/src/geo/LatLngBounds.js | 4 ++ loleaflet/src/layer/tile/TileLayer.js | 54 +++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 16 deletions(-)
New commits: commit 05c4a034c360033eebadefeba039030b055c62b1 Author: Marco Cecchetti <marco.cecche...@collabora.com> Date: Sat Feb 20 12:58:08 2016 +0100 loleaflet - user view does not follow cell cursor - fixed corner cases Change-Id: If6497d46c5d4457493864fdea04c28bb917865c0 Reviewed-on: https://gerrit.libreoffice.org/22519 Reviewed-by: Andras Timar <andras.ti...@collabora.com> Tested-by: Andras Timar <andras.ti...@collabora.com> (cherry picked from commit 27d4b4b75aeaddac550b5c2bdf04fcde744c87fe) Reviewed-on: https://gerrit.libreoffice.org/22518 diff --git a/loleaflet/src/geo/LatLngBounds.js b/loleaflet/src/geo/LatLngBounds.js index c76936d..da0a57c 100644 --- a/loleaflet/src/geo/LatLngBounds.js +++ b/loleaflet/src/geo/LatLngBounds.js @@ -151,6 +151,10 @@ L.LatLngBounds.prototype = { } }; +L.LatLngBounds.createDefault = function() { + return new L.LatLngBounds(new L.LatLng(0, 0), new L.LatLng(0, 0)); +}; + //TODO International date line? L.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng) diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js index d3c1425..09f4bea 100644 --- a/loleaflet/src/layer/tile/TileLayer.js +++ b/loleaflet/src/layer/tile/TileLayer.js @@ -92,7 +92,8 @@ L.TileLayer = L.GridLayer.extend({ // Original rectangle of cell cursor in twips this._cellCursorTwips = new L.Bounds(new L.Point(0, 0), new L.Point(0, 0)); // Rectangle for cell cursor - this._cellCursor = new L.LatLngBounds(new L.LatLng(0, 0), new L.LatLng(0, 0)); + this._cellCursor = L.LatLngBounds.createDefault(); + this._prevCellCursor = L.LatLngBounds.createDefault(); // Position and size of the selection start (as if there would be a cursor caret there). this._lastValidPart = -1; @@ -427,9 +428,15 @@ L.TileLayer = L.GridLayer.extend({ }, _onCellCursorMsg: function (textMsg) { + if (!this._cellCursor) { + this._cellCursor = L.LatLngBounds.createDefault(); + } + if (!this._prevCellCursor) { + this._prevCellCursor = L.LatLngBounds.createDefault(); + } if (textMsg.match('EMPTY')) { this._cellCursorTwips = new L.Bounds(new L.Point(0, 0), new L.Point(0, 0)); - this._cellCursor = new L.LatLngBounds(new L.LatLng(0, 0), new L.LatLng(0, 0)); + this._cellCursor = L.LatLngBounds.createDefault(); } else { var strTwips = textMsg.match(/\d+/g); @@ -442,7 +449,18 @@ L.TileLayer = L.GridLayer.extend({ this._twipsToLatLng(bottomRightTwips, this._map.getZoom())); } - this._onUpdateCellCursor(); + var horizontalDirection = 0, + verticalDirection = 0; + if (!this._isEmptyRectangle(this._prevCellCursor) && !this._isEmptyRectangle(this._cellCursor)) { + horizontalDirection = Math.sign(this._cellCursor.getWest() - this._prevCellCursor.getWest()); + verticalDirection = Math.sign(this._cellCursor.getNorth() - this._prevCellCursor.getNorth()); + } + + if (!this._isEmptyRectangle(this._cellCursor) && !this._prevCellCursor.equals(this._cellCursor)) { + this._prevCellCursor = new L.LatLngBounds(this._cellCursor.getSouthWest(), this._cellCursor.getNorthEast()); + } + + this._onUpdateCellCursor(horizontalDirection, verticalDirection); }, _onMousePointerMsg: function (textMsg) { @@ -929,30 +947,34 @@ L.TileLayer = L.GridLayer.extend({ } }, - _onUpdateCellCursor: function () { + _onUpdateCellCursor: function (horizontalDirection, verticalDirection) { if (this._cellCursor && !this._isEmptyRectangle(this._cellCursor)) { var mapBounds = this._map.getBounds(); if (!mapBounds.contains(this._cellCursor)) { var spacingX = Math.abs((this._cellCursor.getEast() - this._cellCursor.getWest())) / 4.0; var spacingY = Math.abs((this._cellCursor.getSouth() - this._cellCursor.getNorth())) / 4.0; var scrollX = 0, scrollY = 0; - if (this._cellCursor.getWest() < mapBounds.getWest()) { + if (horizontalDirection === -1 && this._cellCursor.getWest() < mapBounds.getWest()) { scrollX = this._cellCursor.getWest() - mapBounds.getWest() - spacingX; - } else if (this._cellCursor.getEast() > mapBounds.getEast()) { + } else if (horizontalDirection === 1 && this._cellCursor.getEast() > mapBounds.getEast()) { scrollX = this._cellCursor.getEast() - mapBounds.getEast() + spacingX; - } else if (this._cellCursor.getNorth() > mapBounds.getNorth()) { + } + if (verticalDirection === 1 && this._cellCursor.getNorth() > mapBounds.getNorth()) { scrollY = this._cellCursor.getNorth() - mapBounds.getNorth() + spacingY; - } else if (this._cellCursor.getSouth() < mapBounds.getSouth()) { + } else if (verticalDirection === -1 && this._cellCursor.getSouth() < mapBounds.getSouth()) { scrollY = this._cellCursor.getSouth() - mapBounds.getSouth() - spacingY; } - var newCenter = mapBounds.getCenter(); - newCenter.lng += scrollX; - newCenter.lat += scrollY; - var center = this._map.project(newCenter); - center = center.subtract(this._map.getSize().divideBy(2)); - center.x = Math.round(center.x < 0 ? 0 : center.x); - center.y = Math.round(center.y < 0 ? 0 : center.y); - this._map.fire('scrollto', {x: center.x, y: center.y}); + + if (scrollX !== 0 || scrollY !== 0) { + var newCenter = mapBounds.getCenter(); + newCenter.lng += scrollX; + newCenter.lat += scrollY; + var center = this._map.project(newCenter); + center = center.subtract(this._map.getSize().divideBy(2)); + center.x = Math.round(center.x < 0 ? 0 : center.x); + center.y = Math.round(center.y < 0 ? 0 : center.y); + this._map.fire('scrollto', {x: center.x, y: center.y}); + } } if (this._cellCursorMarker) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits