loleaflet/src/control/Control.Header.js | 118 +++++++++++++++++++++++++++----- 1 file changed, 101 insertions(+), 17 deletions(-)
New commits: commit 8049e28aaf2178a0c261b50ac88d82193f7e7a25 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Sun Jul 7 21:14:05 2019 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Mon Jul 8 02:00:16 2019 +0200 tdf#124156 gesture support in Calc row/column header for resizing The headers only worked when resizing with the mouse and the code assumes that some variables are set when traveling with the mouse over the header with mousemove. This adds pan gestures to resize the row and column and refactors code so that it works without the need for the varables (it recalculates then when gestrue starts). Mouse events should still work as before. Change-Id: I55d136497bed06f1be81be7709d34f95b17ab816 Reviewed-on: https://gerrit.libreoffice.org/75176 Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> Tested-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/loleaflet/src/control/Control.Header.js b/loleaflet/src/control/Control.Header.js index e6be95ee0..81e784dcd 100644 --- a/loleaflet/src/control/Control.Header.js +++ b/loleaflet/src/control/Control.Header.js @@ -2,6 +2,7 @@ /* * Control.Header */ +/* global L Hammer */ L.Control.Header = L.Control.extend({ options: { @@ -24,6 +25,7 @@ L.Control.Header = L.Control.extend({ this._lastMouseOverIndex = undefined; this._hitResizeArea = false; this._overHeaderArea = false; + this._hammer = null; this._selectionBackgroundGradient = [ '#3465A4', '#729FCF', '#004586' ]; @@ -117,6 +119,14 @@ L.Control.Header = L.Control.extend({ }, mouseInit: function (element) { + var self = this; + if (this._hammer == null) { + this._hammer = new Hammer(element); + this._hammer.add(new Hammer.Pan({ threshold: 0, pointers: 0 })); + this._hammer.on('panstart panmove panend', function (event) { + self._onPan(event); + }); + } L.DomEvent.on(element, 'mousedown', this._onMouseDown, this); }, @@ -256,6 +266,82 @@ L.Control.Header = L.Control.extend({ this._current = entry && !zeroSizeEntry ? entry.index : -1; }, + _onPan: function (event) { + if (event.pointerType != 'touch') + return; + + if (event.type == 'panstart') + this._onPanStart(event); + else if (event.type == 'panmove') { + this._onPanMove(event); + } + else if (event.type == 'panend') { + this._onPanEnd(event); + } + }, + + _entryAtPoint: function(point) { + var position = this._getParallelPos(point); + position = position - this._position; + + var eachEntry = this._data.getFirst(); + while (eachEntry) { + var start = eachEntry.pos - eachEntry.size; + var end = eachEntry.pos; + if (position > start && position <= end) { + var resizeAreaStart = Math.max(start, end - 3); + if (this.isHeaderSelected(eachEntry.index)) { + resizeAreaStart = end - this._resizeHandleSize; + } + var isMouseOverResizeArea = (position > resizeAreaStart); + return {entry: eachEntry, hit: isMouseOverResizeArea}; + } + eachEntry = this._data.getNext(); + } + return null; + }, + + _onPanStart: function (event) { + if (this._hitOutline(event)) + return; + + var target = event.target || event.srcElement; + if (!target) + return false; + + var result = this._entryAtPoint(this._hammerEventToCanvasPos(this._canvas, event)); + if (!result) + return false; + + this._mouseOverEntry = result.entry; + var rectangle = this.getHeaderEntryBoundingClientRect(result.entry.index); + if (!rectangle) + return; + + L.DomUtil.disableImageDrag(); + L.DomUtil.disableTextSelection(); + + this._start = new L.Point(rectangle.left, rectangle.top); + this._offset = new L.Point(rectangle.right - event.center.x, rectangle.bottom - event.center.y); + this._item = target; + this.onDragStart(this._item, this._start, this._offset, {clientX: event.center.x, clientY: event.center.y}); + }, + + _onPanMove: function (event) { + this.onDragMove(this._item, this._start, this._offset, {clientX: event.center.x, clientY: event.center.y}); + }, + + _onPanEnd: function (event) { + L.DomUtil.enableImageDrag(); + L.DomUtil.enableTextSelection(); + + this.onDragEnd(this._item, this._start, this._offset, {clientX: event.center.x, clientY: event.center.y}); + + this._mouseOverEntry = null; + this._item = this._start = this._offset = null; + this._dragging = false; + }, + _mouseEventToCanvasPos: function(canvas, evt) { var rect = canvas.getBoundingClientRect(); return { @@ -264,6 +350,14 @@ L.Control.Header = L.Control.extend({ }; }, + _hammerEventToCanvasPos: function(canvas, event) { + var rect = canvas.getBoundingClientRect(); + return { + x: event.center.x - rect.left, + y: event.center.y - rect.top + }; + }, + _onMouseOut: function (e) { if (this._hitOutline(e)) return; @@ -297,25 +391,15 @@ L.Control.Header = L.Control.extend({ this._overHeaderArea = true; } + var mouseOverIndex = this._mouseOverEntry ? this._mouseOverEntry.index : null; var isMouseOverResizeArea = false; - var pos = this._getParallelPos(this._mouseEventToCanvasPos(this._canvas, e)); - pos = pos - this._position; + var result = this._entryAtPoint(this._mouseEventToCanvasPos(this._canvas, e)); - var mouseOverIndex = this._mouseOverEntry ? this._mouseOverEntry.index : undefined; var entry = this._data.getFirst(); - while (entry) { - var start = entry.pos - entry.size; - var end = entry.pos; - if (pos > start && pos <= end) { - mouseOverIndex = entry.index; - var resizeAreaStart = Math.max(start, end - 3); - if (this.isHeaderSelected(entry.index)) { - resizeAreaStart = end - this._resizeHandleSize; - } - isMouseOverResizeArea = (pos > resizeAreaStart); - break; - } - entry = this._data.getNext(); + if (result) { + isMouseOverResizeArea = result.hit; + mouseOverIndex = result.entry.index; + entry = result.entry; } if (mouseOverIndex && (!this._mouseOverEntry || mouseOverIndex !== this._mouseOverEntry.index)) { @@ -441,7 +525,7 @@ L.Control.Header = L.Control.extend({ this._offset = new L.Point(rect.right - e.clientX, rect.bottom - e.clientY); this._item = target; - this.onDragStart(this.item, this._start, this._offset, e); + this.onDragStart(this._item, this._start, this._offset, e); }, _onMouseMoveForDragging: function (e) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits