diff --git a/browser/src/core/Socket.js b/browser/src/core/Socket.js index 1ad6c60174db..df347f13e205 100644 --- a/browser/src/core/Socket.js +++ b/browser/src/core/Socket.js @@ -1166,6 +1166,10 @@ app.definitions.Socket = L.Class.extend({ // Switching modes. window.location.reload(false); } + else if (textMsg.startsWith('tooltip: ')) { + var tooltipInfo = JSON.parse(textMsg.substring(textMsg.indexOf('{'))); + this._map.showDocumentTooltip(tooltipInfo, $('.leaflet-layer')); + } else if (!textMsg.startsWith('tile:') && !textMsg.startsWith('delta:') && !textMsg.startsWith('renderfont:') && !textMsg.startsWith('windowpaint:')) { diff --git a/browser/src/map/Map.js b/browser/src/map/Map.js index 0ce2b83ce6e5..1efef5b5591e 100644 --- a/browser/src/map/Map.js +++ b/browser/src/map/Map.js @@ -424,6 +424,24 @@ L.Map = L.Evented.extend({ } }, + showDocumentTooltip: function(tooltipInfo, elem) { + var split = tooltipInfo.rectangle.split(','); + var latlng = this._docLayer._twipsToLatLng(new L.Point(+split[0], +split[1])); + var pt = this.latLngToContainerPoint(latlng); + + elem.tooltip(); + elem.tooltip('enable'); + elem.tooltip('option', 'content', tooltipInfo.text); + elem.tooltip('option', 'items', elem[0]); + elem.tooltip('option', 'position', { my: 'left bottom', at: 'left+' + pt.x + ' top+' + pt.y, collision: 'fit fit' }); + elem.tooltip('open'); + document.addEventListener('mousemove', function closeTooltip() { + elem.tooltip('close'); + elem.tooltip('disable'); + document.removeEventListener('mousemove', closeTooltip); + }); + }, + updateModificationIndicator: function(newModificationTime) { var timeout;