loleaflet/dist/leaflet.css | 7 +- loleaflet/src/core/LOUtil.js | 21 ++++++ loleaflet/src/core/Socket.js | 3 loleaflet/src/layer/marker/Cursor.js | 12 ++- loleaflet/src/layer/tile/CalcTileLayer.js | 1 loleaflet/src/layer/tile/ImpressTileLayer.js | 1 loleaflet/src/layer/tile/TileLayer.js | 86 ++++++++++++++++++++++++++- loleaflet/src/layer/tile/WriterTileLayer.js | 1 8 files changed, 126 insertions(+), 6 deletions(-)
New commits: commit 3fdd2cb15126e0f482e41b2505404a5b7950d38c Author: Pranav Kant <pran...@collabora.co.uk> Date: Sun Aug 7 18:56:43 2016 +0530 loleaflet: Handle 'viewcursorvisible' message diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js index 0adf21c..f76128b 100644 --- a/loleaflet/src/layer/tile/TileLayer.js +++ b/loleaflet/src/layer/tile/TileLayer.js @@ -354,6 +354,9 @@ L.TileLayer = L.GridLayer.extend({ else if (textMsg.startsWith('invalidateviewcursor:')) { this._onInvalidateViewCursorMsg(textMsg); } + else if (textMsg.startsWith('viewcursorvisible:')) { + this._onViewCursorVisibleMsg(textMsg); + } }, _onCommandValuesMsg: function (textMsg) { @@ -542,6 +545,23 @@ L.TileLayer = L.GridLayer.extend({ this._onUpdateViewCursor(viewId); }, + _onViewCursorVisibleMsg: function(textMsg) { + textMsg = textMsg.substring('viewcursorvisible:'.length + 1); + var obj = JSON.parse(textMsg); + var viewId = parseInt(obj.viewId); + + // Ignore if viewid=0 or is same as ours + if (viewId === 0 || viewId === this._viewId) { + return; + } + + if (typeof this._viewCursors[viewId] !== 'undefined') { + this._viewCursors[viewId].visible = (obj.visible === 'true'); + } + + this._onUpdateViewCursor(viewId); + }, + _onPartPageRectanglesMsg: function (textMsg) { textMsg = textMsg.substring(19); var pages = textMsg.split(';'); commit d307315f758ff26f16545077cc6a9fd6c1434b6e Author: Pranav Kant <pran...@collabora.co.uk> Date: Sun Aug 7 18:51:25 2016 +0530 loleaflet: Ignore irrelevant view messages coming from server View callbacks with viewid = 0 seems strange; it always lurks around but is never attached to any view. Also, view callbacks with viewid = our own viewid should not be sent from the server, lets ignore them for now. diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js index 3374f02..0adf21c 100644 --- a/loleaflet/src/layer/tile/TileLayer.js +++ b/loleaflet/src/layer/tile/TileLayer.js @@ -522,6 +522,11 @@ L.TileLayer = L.GridLayer.extend({ var obj = JSON.parse(textMsg); var viewId = parseInt(obj.viewId); + // Ignore if viewid=0 or is same as ours + if (viewId === 0 || viewId === this._viewId) { + return; + } + var strTwips = obj.rectangle.match(/\d+/g); var topLeftTwips = new L.Point(parseInt(strTwips[0]), parseInt(strTwips[1])); var offset = new L.Point(parseInt(strTwips[2]), parseInt(strTwips[3])); commit 6ff4cd69f0740604a8fdd5a5fa5e5aea2edb1b69 Author: Pranav Kant <pran...@collabora.co.uk> Date: Sun Aug 7 18:49:47 2016 +0530 loleaflet: Handle 'invalidateviewcursor' and show colored cursors ... for different views based on view ids received from the server. diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js index 15d95b6..3374f02 100644 --- a/loleaflet/src/layer/tile/TileLayer.js +++ b/loleaflet/src/layer/tile/TileLayer.js @@ -95,6 +95,10 @@ L.TileLayer = L.GridLayer.extend({ this._prevCellCursor = L.LatLngBounds.createDefault(); // Position and size of the selection start (as if there would be a cursor caret there). + // View cursors with viewId to 'cursor info' mapping + // Eg: 1: {rectangle: 'x, y, w, h', visible: false} + this._viewCursors = {}; + this._lastValidPart = -1; // Cursor marker this._cursorMarker = null; @@ -347,6 +351,9 @@ L.TileLayer = L.GridLayer.extend({ else if (textMsg.startsWith('contextmenu:')) { this._onContextMenuMsg(textMsg); } + else if (textMsg.startsWith('invalidateviewcursor:')) { + this._onInvalidateViewCursorMsg(textMsg); + } }, _onCommandValuesMsg: function (textMsg) { @@ -510,6 +517,26 @@ L.TileLayer = L.GridLayer.extend({ this._onUpdateCursor(); }, + _onInvalidateViewCursorMsg: function (textMsg) { + textMsg = textMsg.substring('invalidateviewcursor:'.length + 1); + var obj = JSON.parse(textMsg); + var viewId = parseInt(obj.viewId); + + var strTwips = obj.rectangle.match(/\d+/g); + var topLeftTwips = new L.Point(parseInt(strTwips[0]), parseInt(strTwips[1])); + var offset = new L.Point(parseInt(strTwips[2]), parseInt(strTwips[3])); + var bottomRightTwips = topLeftTwips.add(offset); + + this._viewCursors[viewId] = this._viewCursors[viewId] || {}; + this._viewCursors[viewId].bounds = new L.LatLngBounds( + this._twipsToLatLng(topLeftTwips, this._map.getZoom()), + this._twipsToLatLng(bottomRightTwips, this._map.getZoom())), + this._viewCursors[viewId].part = obj.part; + this._viewCursors[viewId].visible = true; + + this._onUpdateViewCursor(viewId); + }, + _onPartPageRectanglesMsg: function (textMsg) { textMsg = textMsg.substring(19); var pages = textMsg.split(';'); @@ -883,6 +910,38 @@ L.TileLayer = L.GridLayer.extend({ } }, + // Update colored non-blinking view cursor + _onUpdateViewCursor: function(viewId) { + if (typeof this._viewCursors[viewId] !== 'object' || + typeof this._viewCursors[viewId].bounds !== 'object') { + return; + } + + var pixBounds = L.bounds(this._map.latLngToLayerPoint(this._viewCursors[viewId].bounds.getSouthWest()), + this._map.latLngToLayerPoint(this._viewCursors[viewId].bounds.getNorthEast())); + var viewCursorPos = this._viewCursors[viewId].bounds.getNorthWest(); + var viewCursorMarker = this._viewCursors[viewId].marker; + var viewCursorVisible = this._viewCursors[viewId].visible; + + if (viewCursorVisible && !this._isEmptyRectangle(this._viewCursors[viewId].bounds)) { + if (viewCursorMarker) { + this._map.removeLayer(viewCursorMarker); + } + var viewCursorOptions = { + color: L.LOUtil.getViewIdHexColor(viewId), + blink: false + }; + viewCursorMarker = L.cursor(viewCursorPos, viewCursorOptions); + this._map.addLayer(viewCursorMarker); + viewCursorMarker.setSize(pixBounds.getSize().multiplyBy(this._map.getZoomScale(this._map.getZoom()))); + + } else if (viewCursorMarker) { + this._map.removeLayer(this._viewCursors[viewId].marker); + } + + this._viewCursors[viewId].marker = viewCursorMarker; + }, + // Update dragged graphics selection resize. _onGraphicEdit: function (e) { if (!e.handle) { return; } commit 0284235da150ddf6dac70c0add2f304deaa5f0fe Author: Pranav Kant <pran...@collabora.co.uk> Date: Sun Aug 7 18:49:16 2016 +0530 loleaflet: Support for non-blinking colored cursors diff --git a/loleaflet/src/layer/marker/Cursor.js b/loleaflet/src/layer/marker/Cursor.js index f5a7033..faa5177 100644 --- a/loleaflet/src/layer/marker/Cursor.js +++ b/loleaflet/src/layer/marker/Cursor.js @@ -49,8 +49,14 @@ L.Cursor = L.Layer.extend({ _initLayout: function () { this._container = L.DomUtil.create('div', 'leaflet-cursor-container'); - // a black rectangle - this._cursor = L.DomUtil.create('div', 'leaflet-cursor blinking-cursor', this._container); + this._cursor = L.DomUtil.create('div', 'leaflet-cursor', this._container); + if (this.options.blink) { + L.DomUtil.addClass(this._cursor, 'blinking-cursor'); + } + + if (this.options.color) { + L.DomUtil.setStyle(this._cursor, 'background', this.options.color); + } L.DomEvent .disableClickPropagation(this._cursor) diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js index f2dfdef..15d95b6 100644 --- a/loleaflet/src/layer/tile/TileLayer.js +++ b/loleaflet/src/layer/tile/TileLayer.js @@ -872,7 +872,7 @@ L.TileLayer = L.GridLayer.extend({ this._map.removeLayer(this._cursorMarker); } - this._cursorMarker = L.cursor(cursorPos); + this._cursorMarker = L.cursor(cursorPos, {blink: true}); this._map.addLayer(this._cursorMarker); this._cursorMarker.setSize(pixBounds.getSize().multiplyBy( this._map.getZoomScale(this._map.getZoom()))); commit 726b213dcfcf0d2a6feff39774d6f9e87bd0e90a Author: Pranav Kant <pran...@collabora.co.uk> Date: Sun Aug 7 18:43:15 2016 +0530 loleaflet: Add viewId to color mapping; using colordata.hxx diff --git a/loleaflet/src/core/LOUtil.js b/loleaflet/src/core/LOUtil.js index cbdce2a..8b11379 100644 --- a/loleaflet/src/core/LOUtil.js +++ b/loleaflet/src/core/LOUtil.js @@ -3,6 +3,21 @@ */ L.LOUtil = { + // Based on core.git's colordata.hxx: COL_AUTHOR1_DARK...COL_AUTHOR9_DARK + // consisting of arrays of RGB values + // Maybe move the color logic to separate file when it becomes complex + darkColors: [ + [198, 146, 0], + [6, 70, 162], + [87, 157, 28], + [105, 43, 157], + [197, 0, 11], + [0, 128, 128], + [140, 132, 0], + [53, 85, 107], + [209, 118, 0] + ], + startSpinner: function (spinnerCanvas, spinnerSpeed) { var spinnerInterval; spinnerCanvas.width = 50; @@ -26,5 +41,11 @@ L.LOUtil = { }, 1); return spinnerInterval; + }, + + getViewIdHexColor: function(viewId) { + var color = this.darkColors[(viewId + 1) % this.darkColors.length]; + var hex = color[2] | (color[1] << 8) | (color[0] << 16); + return '#' + ('000000' + hex.toString(16)).slice(-6); } }; commit 8dd2987871906e1af3e4c5e463f8f075284a74bc Author: Pranav Kant <pran...@collabora.co.uk> Date: Sun Aug 7 18:39:20 2016 +0530 loleaflet: Store viewId of the view received in 'status:' command diff --git a/loleaflet/src/core/Socket.js b/loleaflet/src/core/Socket.js index 2f258d3..87f1ce6 100644 --- a/loleaflet/src/core/Socket.js +++ b/loleaflet/src/core/Socket.js @@ -381,6 +381,9 @@ L.Socket = L.Class.extend({ else if (tokens[i].substring(0, 5) === 'font=') { command.font = window.decodeURIComponent(tokens[i].substring(5)); } + else if (tokens[i].substring(0, 7) === 'viewid=') { + command.viewid = tokens[i].substring(7); + } } if (command.tileWidth && command.tileHeight && this._map._docLayer) { var defaultZoom = this._map.options.zoom; diff --git a/loleaflet/src/layer/tile/CalcTileLayer.js b/loleaflet/src/layer/tile/CalcTileLayer.js index 9b067f3..2641a12 100644 --- a/loleaflet/src/layer/tile/CalcTileLayer.js +++ b/loleaflet/src/layer/tile/CalcTileLayer.js @@ -147,6 +147,7 @@ L.CalcTileLayer = L.TileLayer.extend({ this._docType = command.type; this._parts = command.parts; this._selectedPart = command.selectedPart; + this._viewId = command.viewid; var mapSize = this._map.getSize(); var width = this._docWidthTwips / this._tileWidthTwips * this._tileSize; var height = this._docHeightTwips / this._tileHeightTwips * this._tileSize; diff --git a/loleaflet/src/layer/tile/ImpressTileLayer.js b/loleaflet/src/layer/tile/ImpressTileLayer.js index 2d8e8c0..8f2358a 100644 --- a/loleaflet/src/layer/tile/ImpressTileLayer.js +++ b/loleaflet/src/layer/tile/ImpressTileLayer.js @@ -119,6 +119,7 @@ L.ImpressTileLayer = L.TileLayer.extend({ this._updateMaxBounds(true); this._documentInfo = textMsg; this._parts = command.parts; + this._viewId = command.viewid; this._selectedPart = command.selectedPart; this._resetPreFetching(true); this._update(); diff --git a/loleaflet/src/layer/tile/WriterTileLayer.js b/loleaflet/src/layer/tile/WriterTileLayer.js index a42b67d..ab604aa 100644 --- a/loleaflet/src/layer/tile/WriterTileLayer.js +++ b/loleaflet/src/layer/tile/WriterTileLayer.js @@ -122,6 +122,7 @@ L.WriterTileLayer = L.TileLayer.extend({ this._parts = 1; this._currentPage = command.selectedPart; this._pages = command.parts; + this._viewId = parseInt(command.viewid); this._map.fire('pagenumberchanged', { currentPage: this._currentPage, pages: this._pages, commit d144d4ac4765252f84c6b1cf67ef67b34ad7b378 Author: Pranav Kant <pran...@collabora.co.uk> Date: Sun Aug 7 15:56:40 2016 +0530 loleaflet: Separate blinking-cursor property from cursor ... so that it is possibe to make cursor non-blinking whenever we want. This will be used in subsequent commits for view cursors. diff --git a/loleaflet/dist/leaflet.css b/loleaflet/dist/leaflet.css index e3c12b3..eeeb24c 100644 --- a/loleaflet/dist/leaflet.css +++ b/loleaflet/dist/leaflet.css @@ -559,15 +559,18 @@ a.leaflet-control-buttons:hover:first-child { border: 1px solid #666; } -.leaflet-cursor { +.leaflet-cursor-container { position: absolute; text-align: center; } -.blinking-cursor { +.leaflet-cursor { background: black; width: 2px; pointer-events: none; + } + +.blinking-cursor { -webkit-animation: 1s blink step-end 0s infinite; -moz-animation: 1s blink step-end 0s infinite; -ms-animation: 1s blink step-end 0s infinite; diff --git a/loleaflet/src/layer/marker/Cursor.js b/loleaflet/src/layer/marker/Cursor.js index 4fb32c2..f5a7033 100644 --- a/loleaflet/src/layer/marker/Cursor.js +++ b/loleaflet/src/layer/marker/Cursor.js @@ -48,9 +48,9 @@ L.Cursor = L.Layer.extend({ }, _initLayout: function () { - this._container = L.DomUtil.create('div', 'leaflet-cursor'); + this._container = L.DomUtil.create('div', 'leaflet-cursor-container'); // a black rectangle - this._cursor = L.DomUtil.create('div', 'blinking-cursor', this._container); + this._cursor = L.DomUtil.create('div', 'leaflet-cursor blinking-cursor', this._container); L.DomEvent .disableClickPropagation(this._cursor) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits