From 9f8ab5da039929b049049aeab4946c43fd4746d6 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Sun, 4 Sep 2011 14:11:48 -0500 Subject: [PATCH] Add icons on to map display, and marker update logic --- .../dynmap/markers/impl/MarkerAPIImpl.java | 10 ++- web/css/dynmap_style.css | 32 ++++++++ web/js/markers.js | 75 +++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java b/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java index b5a46d65..7838b9d6 100644 --- a/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java +++ b/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java @@ -40,6 +40,7 @@ import org.dynmap.web.Json; */ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { private File markerpersist; + private File markerpersist_old; private File markerdir; /* Local store for markers (internal) */ private File markertiledir; /* Marker directory for web server (under tiles) */ private HashMap markericons = new HashMap(); @@ -113,6 +114,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { api.server = plugin.getServer(); /* Initialize persistence file name */ api.markerpersist = new File(plugin.getDataFolder(), "markers.yml"); + api.markerpersist_old = new File(plugin.getDataFolder(), "markers.yml.old"); /* Load persistence */ api.loadMarkers(); /* Fill in default icons and sets, if needed */ @@ -308,6 +310,9 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { } } conf.setProperty("sets", sets); + /* And shift old file file out */ + if(api.markerpersist_old.exists()) api.markerpersist_old.delete(); + if(api.markerpersist.exists()) api.markerpersist.renameTo(api.markerpersist_old); /* And write it out */ if(!conf.save()) Log.severe("Error writing markers - " + api.markerpersist.getPath()); @@ -467,6 +472,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { Map markerdata = new HashMap(); File f = new File(markertiledir, "marker_" + wname + ".json"); + File fnew = new File(markertiledir, "marker_" + wname + ".json.new"); Map worlddata = new HashMap(); worlddata.put("timestamp", Long.valueOf(System.currentTimeMillis())); /* Add timestamp */ @@ -495,7 +501,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { FileOutputStream fos = null; try { - fos = new FileOutputStream(f); + fos = new FileOutputStream(fnew); fos.write(Json.stringifyJson(worlddata).getBytes()); } catch (FileNotFoundException ex) { Log.severe("Exception while writing JSON-file.", ex); @@ -503,6 +509,8 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { Log.severe("Exception while writing JSON-file.", ioe); } finally { if(fos != null) try { fos.close(); } catch (IOException x) {} + if(f.exists()) f.delete(); + fnew.renameTo(f); } } diff --git a/web/css/dynmap_style.css b/web/css/dynmap_style.css index 2f7b9aa3..6ae16017 100644 --- a/web/css/dynmap_style.css +++ b/web/css/dynmap_style.css @@ -747,3 +747,35 @@ .balloonmessage { word-wrap: break-word; } + +/* Marker styles */ +.dynmap .mapMarker .markerName { + display: none; + z-index: 101; +} + +.dynmap .mapMarker:hover .markerName, +.dynmap .mapMarker .markerName-show { + display: block; + position: absolute; + top: -8px; + left: 10px; + z-index: 18; + + white-space: nowrap; + + color: #fff; + background: rgba(0,0,0,0.6); + padding: 2px; + + -moz-border-radius: 3px; + border-radius: 3px; + +} + +.dynmap .mapMarker .markerIcon16x16 { + position: absolute; + top: -8px; + left: -8px; + z-index: 18; +} diff --git a/web/js/markers.js b/web/js/markers.js index 7d24715f..ad155a11 100644 --- a/web/js/markers.js +++ b/web/js/markers.js @@ -4,25 +4,100 @@ var dynmapmarkersets = {}; componentconstructors['markers'] = function(dynmap, configuration) { var me = this; + function removeall() { + $.each(dynmapmarkersets, function(setname, set) { + $.each(set.markers, function(mname, marker) { + set.layergroup.removeLayer(marker.our_marker); + }); + dynmap.layercontrol.removeLayer(set.layergroup); + }); + } + function loadmarkers(world) { + removeall(); dynmapmarkersets = {}; $.getJSON(dynmap.options.tileUrl+'_markers_/marker_'+world+'.json', function(data) { var ts = data.timestamp; $.each(data.sets, function(name, markerset) { dynmapmarkersets[name] = markerset; + createMarkerSet(markerset); + $.each(markerset.markers, function(name, marker) { + createMarker(markerset, marker); + }); }); }); } + function getPosition(marker) { + return dynmap.getProjection().fromLocationToLatLng({ x: marker.x, y: marker.y, z: marker.z }); + } + + function createMarker(set, marker) { + var markerPosition = getPosition(marker); + marker.our_marker = new L.CustomMarker(markerPosition, { elementCreator: function() { + var div = document.createElement('div'); + + var markerPosition = getPosition(marker); + marker.our_marker.setLatLng(markerPosition); + + $(div) + .addClass('Marker') + .addClass('mapMarker') + .append($('').addClass('markerIcon16x16').attr({ src: dynmap.options.tileUrl+'_markers_/'+marker.icon+'.png' })) + .append($('') + .addClass('markerName') + .text(marker.label)); + return div; + }}); + + set.layergroup.addLayer(marker.our_marker); + } + + function createMarkerSet(set) { + set.layergroup = new L.LayerGroup(); + dynmap.map.addLayer(set.layergroup); + dynmap.layercontrol.addOverlay(set.layergroup, set.label); + } + $(dynmap).bind('component.markers', function(event, msg) { console.log('got marker event - ' + msg.ctype + ', ' + msg.msg); + if(msg.msg == 'markerupdated') { + var marker = dynmapmarkersets[msg.set].markers[msg.id]; + if(marker && marker.our_marker) { + dynmapmarkersets[msg.set].layergroup.removeLayer(marker.our_marker); + } + marker = { x: msg.x, y: msg.y, z: msg.z, icon: msg.icon, label: msg.label }; + dynmapmarkersets[msg.set].markers[msg.id] = marker; + createMarker(dynmapmarkersets[msg.set], marker); + } + else if(msg.msg == 'markerdeleted') { + var marker = dynmapmarkersets[msg.set].markers[msg.id]; + if(marker && marker.our_marker) { + dynmapmarkersets[msg.set].layergroup.removeLayer(marker.our_marker); + } + delete dynmapmarkersets[msg.set].markers[msg.id]; + } }); // Remove marker on start of map change $(dynmap).bind('mapchanging', function(event) { + $.each(dynmapmarkersets, function(setname, set) { + $.each(set.markers, function(mname, marker) { + set.layergroup.removeLayer(marker.our_marker); + }); + }); }); // Remove marker on map change - let update place it again $(dynmap).bind('mapchanged', function(event) { + $.each(dynmapmarkersets, function(setname, set) { + $.each(set.markers, function(mname, marker) { + var marker = set.markers[mname]; + var markerPosition = getPosition(marker); + marker.our_marker.setLatLng(markerPosition); + if(dynmap.map.hasLayer(marker.our_marker) == false) + set.layergroup.addLayer(marker.our_marker); + }); + }); }); // Load markers for new world $(dynmap).bind('worldchanged', function(event) {