From fd542d2b33106c8e5fda7279c981af3e87686e01 Mon Sep 17 00:00:00 2001 From: FrozenCow Date: Thu, 21 Jul 2011 01:23:35 +0200 Subject: [PATCH] Fixed chatballoons for Leaflet. --- web/css/dynmap_style.css | 9 +++-- web/js/chatballoon.js | 74 ++++++++++++++++++++++++---------------- 2 files changed, 51 insertions(+), 32 deletions(-) diff --git a/web/css/dynmap_style.css b/web/css/dynmap_style.css index 5aa9d7ae..e5e8b58c 100644 --- a/web/css/dynmap_style.css +++ b/web/css/dynmap_style.css @@ -703,6 +703,11 @@ top: -3px; left: 0px; } -.infowindow { -color:black; + +.leaflet-popup { + color: black; } + +.balloonmessage { + word-wrap: break-word; +} \ No newline at end of file diff --git a/web/js/chatballoon.js b/web/js/chatballoon.js index 6dc928f2..f52966f3 100644 --- a/web/js/chatballoon.js +++ b/web/js/chatballoon.js @@ -1,50 +1,64 @@ componentconstructors['chatballoon'] = function(dynmap, configuration) { var me = this; me.chatpopups = {}; + $(dynmap).bind('playerupdated', function(event, player) { + var popup = me.chatpopups[player.name]; + if (popup) { + var markerPosition = dynmap.getProjection().fromLocationToLatLng(player.location); + popup.layer.setLatLng(markerPosition); + } + }); + $(dynmap).bind('worldchanged', function() { + $.each(me.chatpopups, function(name, popup) { + popup.close(); + }); + }); $(dynmap).bind('chat', function(event, message) { if (message.source != 'player') { return; } var player = dynmap.players[message.name]; - var playerMarker = player && player.marker; - if (!playerMarker) { - return; - } - if (player.location.world != dynmap.world) { + if (dynmap.world !== player.location.world) { return; } + var popupPosition = dynmap.getProjection().fromLocationToLatLng(player.location); + console.log('popupPosition', popupPosition); var popup = me.chatpopups[message.name]; if (!popup) { - popup = { lines: [ message.text ] }; - } else { - popup.lines[popup.lines.length] = message.text; + me.chatpopups[message.name] = popup = { + layer: new L.Popup({autopan: false, closeButton: false}), + content: $('
').addClass('balloonmessages')[0] + }; + popup.layer.setContent(popup.content); + + popup.close = function() { + if (popup.timeout) { window.clearTimeout(popup.timeout); } + dynmap.map.removeLayer(popup.layer); + delete me.chatpopups[message.name]; + }; + + popup.layer.setLatLng(popupPosition); + dynmap.map.addLayer(popup.layer); } + + // Add line to balloon. + $('
').addClass('balloonmessage').text(message.text).appendTo(popup.content); - var MAX_LINES = 5; - if (popup.lines.length > MAX_LINES) { - popup.lines = popup.lines.slice(1); + // Remove older lines when too many messages are shown. + var children = $(popup.content).children(); + if (children.length > 5) { + $(children[0]).remove(); } - var htmlMessage = '
' + message.name + "

"; - var line; - for (line in popup.lines) { - htmlMessage = htmlMessage + popup.lines[line] + "
"; - } - htmlMessage = htmlMessage + "
"; - if (!popup.infoWindow) { - popup.infoWindow = new google.maps.InfoWindow({ - disableAutoPan: !(configuration.focuschatballoons || false), - content: htmlMessage - }); - } else { - popup.infoWindow.setContent(htmlMessage); - } - popup.infoWindow.open(dynmap.map, playerMarker); - me.chatpopups[message.name] = popup; + + popup.layer.setContent(popup.content); + if (popup.timeout) { window.clearTimeout(popup.timeout); } popup.timeout = window.setTimeout(function() { - popup.infoWindow.close(); - popup.infoWindow = null; - delete me.chatpopups[message.name]; + popup.close(); }, 8000); + + if (configuration.focuschatballoons) { + dynmap.panToLatLng(popupPosition); + } }); }; \ No newline at end of file