loleaflet/src/layer/tile/CalcTileLayer.js |   35 +++++++++++++++++++++++++++++-
 loleaflet/src/layer/tile/TileLayer.js     |    2 -
 loleaflet/src/map/Map.js                  |   11 +++++++++
 3 files changed, 46 insertions(+), 2 deletions(-)

New commits:
commit d60bebc7ad22ea949248e367f76b5bcf33fb5628
Author:     Dennis Francis <dennis.fran...@collabora.com>
AuthorDate: Fri Jun 26 09:56:41 2020 +0530
Commit:     Dennis Francis <dennis.fran...@collabora.com>
CommitDate: Wed Jul 8 16:47:15 2020 +0200

    calc-zoom: preserve the top-left document position on zoom
    
    which is the behaviour in LibreOffice Calc desktop. This is now possible
    because we can accurarately determine the pixel position of any cell at
    any zoom level from the global sheetGeometry data we get from core.
    
    Change-Id: I5af41770e94c65d803fa9f99906b4ee1ca2f6ac7
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/98328
    Tested-by: Jenkins
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Dennis Francis <dennis.fran...@collabora.com>

diff --git a/loleaflet/src/layer/tile/CalcTileLayer.js 
b/loleaflet/src/layer/tile/CalcTileLayer.js
index 31398abb4..5c80d35f3 100644
--- a/loleaflet/src/layer/tile/CalcTileLayer.js
+++ b/loleaflet/src/layer/tile/CalcTileLayer.js
@@ -1116,6 +1116,17 @@ L.SheetGeometry = L.Class.extend({
                        this._rows.getSize(unit));
        },
 
+       // Returns the CSS pixel position/size of the requested cell at a 
specified zoom.
+       getCellRect: function (columnIndex, rowIndex, zoomScale) {
+               var horizPosSize = this._columns.getElementData(columnIndex, 
false /* devicePixels */, zoomScale);
+               var vertPosSize  = this._rows.getElementData(rowIndex, false /* 
devicePixels */, zoomScale);
+
+               var topLeft = new L.Point(horizPosSize.startpos, 
vertPosSize.startpos);
+               var size = new L.Point(horizPosSize.size, vertPosSize.size);
+
+               return new L.Bounds(topLeft, topLeft.add(size));
+       },
+
        _testValidity: function (sheetGeomJSON, checkCompleteness) {
 
                if (!sheetGeomJSON.hasOwnProperty('commandName')) {
@@ -1307,7 +1318,29 @@ L.SheetDimension = L.Class.extend({
        },
 
        // returns the element pos/size in css pixels by default.
-       getElementData: function (index, useDevicePixels) {
+       getElementData: function (index, useDevicePixels, zoomScale) {
+               if (zoomScale !== undefined) {
+                       var startpos = 0;
+                       var size = 0;
+                       this._visibleSizes.forEachSpanInRange(0, index, 
function (spanData) {
+                               var count = spanData.end - spanData.start + 1;
+                               var sizeOneCSSPx = Math.floor(spanData.size * 
zoomScale / 15.0);
+                               if (index > spanData.end) {
+                                       startpos += (sizeOneCSSPx * count);
+                               }
+                               else if (index >= spanData.start && index <= 
spanData.end) {
+                                       // final span
+                                       startpos += (sizeOneCSSPx * (index - 
spanData.start));
+                                       size = sizeOneCSSPx;
+                               }
+                       });
+
+                       return {
+                               startpos: startpos,
+                               size: size
+                       };
+               }
+
                var span = this._visibleSizes.getSpanDataByIndex(index);
                if (span === undefined) {
                        return undefined;
diff --git a/loleaflet/src/layer/tile/TileLayer.js 
b/loleaflet/src/layer/tile/TileLayer.js
index ec1d425d7..a53074498 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -3318,7 +3318,7 @@ L.TileLayer = L.GridLayer.extend({
        // Cells can change position during changes of zoom level in calc
        // hence we need to request an updated cell cursor position for this 
level.
        _onCellCursorShift: function (force) {
-               if (this._cellCursorMarker || force) {
+               if ((this._cellCursorMarker && 
!this.options.sheetGeometryDataEnabled) || force) {
                        this._map._socket.sendMessage('commandvalues 
command=.uno:CellCursor'
                                             + '?outputHeight=' + 
this._tileWidthPx
                                             + '&outputWidth=' + 
this._tileHeightPx
diff --git a/loleaflet/src/map/Map.js b/loleaflet/src/map/Map.js
index 66103df1c..c3ba4e260 100644
--- a/loleaflet/src/map/Map.js
+++ b/loleaflet/src/map/Map.js
@@ -468,6 +468,17 @@ L.Map = L.Evented.extend({
                        // for spreadsheets, when the document is smaller than 
the viewing area
                        // we want it to be glued to the row/column headers 
instead of being centered
                        this._docLayer._checkSpreadSheetBounds(zoom);
+                       var calcLayer = this._docLayer;
+                       if (calcLayer.options.sheetGeometryDataEnabled && 
calcLayer.sheetGeometry) {
+                               var sheetGeom = calcLayer.sheetGeometry;
+                               var cellRange = sheetGeom.getViewCellRange();
+                               var col = cellRange.columnrange.start, row = 
cellRange.rowrange.start;
+                               var zoomScaleAbs = Math.pow(1.2, (zoom - 
this.options.zoom));
+                               var newTopLeftPx = sheetGeom.getCellRect(col, 
row, zoomScaleAbs).getTopLeft();
+                               var newCenterPx = 
newTopLeftPx.add(this.getSize().divideBy(2)._floor());
+                               var newCenterLatLng = 
this.unproject(newCenterPx, zoom);
+                               return this.setView(newCenterLatLng, zoom, 
{zoom: options});
+                       }
                }
                var curCenter = this.getCenter();
                if (this._docLayer && this._docLayer._visibleCursor && 
this.getBounds().contains(this._docLayer._visibleCursor.getCenter())) {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to