[Libreoffice-commits] online.git: 3 commits - loleaflet/src

Andrzej Hunt andrzej.hunt at collabora.com
Wed Oct 28 10:27:53 UTC 2015


 loleaflet/src/control/Control.Scroll.js |   34 +++++++++++++++++++++++++++
 loleaflet/src/dom/Draggable.js          |    6 ++++
 loleaflet/src/layer/tile/TileLayer.js   |   40 +++++++++++++++++++++++++++++---
 loleaflet/src/map/handler/Map.Mouse.js  |    5 ++++
 4 files changed, 82 insertions(+), 3 deletions(-)

New commits:
commit acb39fc057db157b988f2cabf50809ab7a582dcd
Author: Andrzej Hunt <andrzej.hunt at collabora.com>
Date:   Wed Oct 28 11:26:09 2015 +0100

    fdo#94610 autoscroll document for selection
    
    This works for both the selection "handles"/cursors, and also
    for normal (desktop-like?) click+drag selection.

diff --git a/loleaflet/src/control/Control.Scroll.js b/loleaflet/src/control/Control.Scroll.js
index 8115292..a869951 100644
--- a/loleaflet/src/control/Control.Scroll.js
+++ b/loleaflet/src/control/Control.Scroll.js
@@ -12,6 +12,7 @@ L.Control.Scroll = L.Control.extend({
 		map.on('scrollto', this._onScrollTo, this);
 		map.on('scrollby', this._onScrollBy, this);
 		map.on('scrollvelocity', this._onScrollVelocity, this);
+		map.on('handleautoscroll', this._onHandleAutoScroll, this);
 		map.on('docsize', this._onUpdateSize, this);
 		map.on('updatescrolloffset', this._onUpdateScrollOffset, this);
 
@@ -92,6 +93,24 @@ L.Control.Scroll = L.Control.extend({
 		}
 	},
 
+	_onHandleAutoScroll: function (e) {
+		var vx = 0;
+		var vy = 0;
+
+		if (e.pos.y > e.map._size.y - 50) {
+			vy = 50;
+		} else if (e.pos.y < 50) {
+			vy = -50;
+		}
+		if (e.pos.x > e.map._size.x - 50) {
+			vx = 50;
+		} else if (e.pos.x < 50 + e.map._container.getBoundingClientRect().x) {
+			vx = -50;
+		}
+
+		this._onScrollVelocity({vx: vx, vy: vy});
+	},
+
 	_onUpdateSize: function (e) {
 		this._ignoreScroll = true;
 		setTimeout(L.bind(function() {this._ignoreScroll = null;}, this), 200);
diff --git a/loleaflet/src/dom/Draggable.js b/loleaflet/src/dom/Draggable.js
index 3df1342..7b65378 100644
--- a/loleaflet/src/dom/Draggable.js
+++ b/loleaflet/src/dom/Draggable.js
@@ -67,6 +67,12 @@ L.Draggable = L.Evented.extend({
 
 		this._startPoint = new L.Point(first.clientX, first.clientY);
 		this._startPos = this._newPos = L.DomUtil.getPosition(this._element);
+		var startBoundingRect = this._element.getBoundingClientRect();
+		// Store offset between mouse selection position, and top left
+		// We don't use this internally, but it is needed for external
+		// manipulation of the cursor position, e.g. when adjusting
+		// for scrolling during cursor dragging.
+		this.startOffset = this._startPoint.subtract(new L.Point(startBoundingRect.x, startBoundingRect.y));
 
 		L.DomEvent
 		    .on(document, L.Draggable.MOVE[e.type], this._onMove, this)
diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 99a5199..16271d1 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -605,7 +605,11 @@ L.TileLayer = L.GridLayer.extend({
 			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._selectionHandles.start && this._selectionHandles.start.isDragged) &&
+			    !(this._selectionHandles.end && this._selectionHandles.end.isDragged)) {
+				this._map.fire('scrollto', {x: center.x, y: center.y});
+			}
 		}
 
 		if (this._permission === 'edit' && this._isCursorVisible && this._isCursorOverlayVisible
@@ -657,16 +661,10 @@ L.TileLayer = L.GridLayer.extend({
 			var cursorPos = L.point(boundingrect.x - e.target._icon.offsetLeft,
 					      boundingrect.y - e.target._icon.offsetTop);
 
-			var expectedPos = L.point(e.originalEvent.pageX, e.originalEvent.pageY);
+			var expectedPos = L.point(e.originalEvent.pageX, e.originalEvent.pageY).subtract(e.target.dragging._draggable.startOffset);
 
 			// If the map has been scrolled, but the cursor hasn't been updated yet, then
 			// the current mouse position differs.
-			// In reality there should be a small offset between the top-left of the cursor,
-			// and where the mouse was when the cursor was selected - this is accounted
-			// for by the offset in Draggable, however that gets lost once the map
-			// starts scrolling.
-			// TODO: decide whether we really want to take account of the offset (this
-			// will be even messier, and probably require modifying Draggable too).
 			if (!expectedPos.equals(cursorPos)) {
 				var correction = expectedPos.subtract(cursorPos);
 
@@ -676,10 +674,16 @@ L.TileLayer = L.GridLayer.extend({
 
 				e.target.dragging._draggable._updatePosition();
 			}
+
+			var containerPos = new L.point(expectedPos.x - this._map._container.getBoundingClientRect().x,
+				expectedPos.y - this._map._container.getBoundingClientRect().y);
+
+			this._map.fire('handleautoscroll', { pos: containerPos, map: this._map });
 		}
 		if (e.type === 'dragend') {
 			e.target.isDragged = false;
 			this._textArea.focus();
+			this._map.fire('scrollvelocity', {vx: 0, vy: 0});
 		}
 
 		var aPos = this._latLngToTwips(e.target.getLatLng());
diff --git a/loleaflet/src/map/handler/Map.Mouse.js b/loleaflet/src/map/handler/Map.Mouse.js
index c0345a4..b3f9eba 100644
--- a/loleaflet/src/map/handler/Map.Mouse.js
+++ b/loleaflet/src/map/handler/Map.Mouse.js
@@ -112,6 +112,8 @@ L.Map.Mouse = L.Handler.extend({
 					}
 				}
 			}
+
+			this._map.fire('scrollvelocity', {vx: 0, vy: 0});
 		}
 		else if (e.type === 'mousemove' && this._mouseDown) {
 			if (this._holdMouseEvent) {
@@ -132,12 +134,15 @@ L.Map.Mouse = L.Handler.extend({
 			if (!this._map.dragging.enabled()) {
 				mousePos = docLayer._latLngToTwips(e.latlng);
 				docLayer._postMouseEvent('move', mousePos.x, mousePos.y, 1, buttons, modifier);
+
 				for (key in docLayer._selectionHandles) {
 					handle = docLayer._selectionHandles[key];
 					if (handle._icon) {
 						L.DomUtil.addClass(handle._icon, 'leaflet-not-clickable');
 					}
 				}
+
+				this._map.fire('handleautoscroll', { pos: e.containerPoint, map: this._map });
 			}
 		}
 		else if (e.type === 'dblclick') {
commit c2493177437ac2596bb8b8fc6714afe4e9e0d60d
Author: Andrzej Hunt <andrzej.hunt at collabora.com>
Date:   Tue Oct 27 19:44:31 2015 +0100

    Implement scrollvelocity
    
    This is needed for e.g. fdo#94610

diff --git a/loleaflet/src/control/Control.Scroll.js b/loleaflet/src/control/Control.Scroll.js
index 7b4c4d2..8115292 100644
--- a/loleaflet/src/control/Control.Scroll.js
+++ b/loleaflet/src/control/Control.Scroll.js
@@ -11,6 +11,7 @@ L.Control.Scroll = L.Control.extend({
 
 		map.on('scrollto', this._onScrollTo, this);
 		map.on('scrollby', this._onScrollBy, this);
+		map.on('scrollvelocity', this._onScrollVelocity, this);
 		map.on('docsize', this._onUpdateSize, this);
 		map.on('updatescrolloffset', this._onUpdateScrollOffset, this);
 
@@ -77,6 +78,20 @@ L.Control.Scroll = L.Control.extend({
 		$('.scroll-container').mCustomScrollbar('scrollTo', [y, x]);
 	},
 
+	_onScrollVelocity: function (e) {
+		if (e.vx == 0 && e.vy == 0) {
+			clearInterval(this._autoScrollTimer);
+			this._autoScrollTimer = null;
+			this._map.isAutoScrolling = false;
+		} else {
+			clearInterval(this._autoScrollTimer);
+			this._map.isAutoScrolling = true;
+			this._autoScrollTimer = setInterval(L.bind(function() {
+				this._onScrollBy({x: e.vx, y: e.vy});
+			}, this), 100);
+		}
+	},
+
 	_onUpdateSize: function (e) {
 		this._ignoreScroll = true;
 		setTimeout(L.bind(function() {this._ignoreScroll = null;}, this), 200);
commit c10713fac281aa65482143e66a025318c6fbead2
Author: Andrzej Hunt <andrzej.hunt at collabora.com>
Date:   Tue Oct 27 19:44:17 2015 +0100

    Make currently dragged cursor follow map scroll
    
    Previously the cursor would become offset from the mouse position
    if the window was scrolled during dragging.
    
    Related: fdo#94610

diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 34ef53e..99a5199 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -644,16 +644,46 @@ L.TileLayer = L.GridLayer.extend({
 
 	// Update dragged text selection.
 	_onSelectionHandleDrag: function (e) {
-		var aPos = this._latLngToTwips(e.target.getLatLng());
-
 		if (e.type === 'drag') {
 			e.target.isDragged = true;
+
+			// This is rather hacky, but it seems to be the only way to make the
+			// marker follow the mouse cursor if the document is autoscrolled under
+			// us. (This can happen when we're changing the selection if the cursor
+			// moves somewhere that is considered off screen.)
+
+			// Onscreen position of the cursor, i.e. relative to the browser window
+			var boundingrect = e.target._icon.getBoundingClientRect();
+			var cursorPos = L.point(boundingrect.x - e.target._icon.offsetLeft,
+					      boundingrect.y - e.target._icon.offsetTop);
+
+			var expectedPos = L.point(e.originalEvent.pageX, e.originalEvent.pageY);
+
+			// If the map has been scrolled, but the cursor hasn't been updated yet, then
+			// the current mouse position differs.
+			// In reality there should be a small offset between the top-left of the cursor,
+			// and where the mouse was when the cursor was selected - this is accounted
+			// for by the offset in Draggable, however that gets lost once the map
+			// starts scrolling.
+			// TODO: decide whether we really want to take account of the offset (this
+			// will be even messier, and probably require modifying Draggable too).
+			if (!expectedPos.equals(cursorPos)) {
+				var correction = expectedPos.subtract(cursorPos);
+
+				e.target.dragging._draggable._startPoint = e.target.dragging._draggable._startPoint.add(correction);
+				e.target.dragging._draggable._startPos = e.target.dragging._draggable._startPos.add(correction);
+				e.target.dragging._draggable._newPos = e.target.dragging._draggable._newPos.add(correction);
+
+				e.target.dragging._draggable._updatePosition();
+			}
 		}
 		if (e.type === 'dragend') {
 			e.target.isDragged = false;
 			this._textArea.focus();
 		}
 
+		var aPos = this._latLngToTwips(e.target.getLatLng());
+
 		if (this._selectionHandles.start === e.target) {
 			this._postSelectTextEvent('start', aPos.x, aPos.y);
 		}


More information about the Libreoffice-commits mailing list