Add support for minzoom attribute on marker sets - hide markers below configurable zoom for each marker set

This commit is contained in:
Mike Primm 2011-12-23 03:08:40 +08:00 committed by mikeprimm
parent 7373de85a2
commit eafbe62c46
6 changed files with 98 additions and 21 deletions

View File

@ -84,6 +84,7 @@ public class MarkersComponent extends ClientComponent {
offlineset = api.createMarkerSet(OFFLINE_PLAYERS_SETID, configuration.getString("offlinelabel", "Offline"), null, true); offlineset = api.createMarkerSet(OFFLINE_PLAYERS_SETID, configuration.getString("offlinelabel", "Offline"), null, true);
} }
offlineset.setHideByDefault(configuration.getBoolean("offlinehidebydefault", true)); offlineset.setHideByDefault(configuration.getBoolean("offlinehidebydefault", true));
offlineset.setMinZoom(configuration.getInteger("offlineminzoom", 0));
offlineicon = api.getMarkerIcon(configuration.getString("offlineicon", "offlineuser")); offlineicon = api.getMarkerIcon(configuration.getString("offlineicon", "offlineuser"));

View File

@ -178,9 +178,13 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
public String msg; public String msg;
public String id; public String id;
public String label; public String label;
public int layerprio;
public int minzoom;
public MarkerSetUpdated(MarkerSet markerset, boolean deleted) { public MarkerSetUpdated(MarkerSet markerset, boolean deleted) {
this.id = markerset.getMarkerSetID(); this.id = markerset.getMarkerSetID();
this.label = markerset.getMarkerSetLabel(); this.label = markerset.getMarkerSetLabel();
this.layerprio = markerset.getLayerPriority();
this.minzoom = markerset.getMinZoom();
if(deleted) if(deleted)
msg = "setdeleted"; msg = "setdeleted";
else else
@ -642,6 +646,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
private static final String ARG_ICON = "icon"; private static final String ARG_ICON = "icon";
private static final String ARG_SET = "set"; private static final String ARG_SET = "set";
private static final String ARG_PRIO = "prio"; private static final String ARG_PRIO = "prio";
private static final String ARG_MINZOOM = "minzoom";
private static final String ARG_STROKEWEIGHT = "weight"; private static final String ARG_STROKEWEIGHT = "weight";
private static final String ARG_STROKECOLOR = "color"; private static final String ARG_STROKECOLOR = "color";
private static final String ARG_STROKEOPACITY = "opacity"; private static final String ARG_STROKEOPACITY = "opacity";
@ -712,7 +717,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
public static boolean onCommand(DynmapPlugin plugin, CommandSender sender, Command cmd, String commandLabel, String[] args) { public static boolean onCommand(DynmapPlugin plugin, CommandSender sender, Command cmd, String commandLabel, String[] args) {
String id, setid, file, label, newlabel, iconid, prio; String id, setid, file, label, newlabel, iconid, prio, minzoom;
String val; String val;
if(api == null) { if(api == null) {
@ -961,6 +966,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
id = parms.get(ARG_ID); id = parms.get(ARG_ID);
label = parms.get(ARG_LABEL); label = parms.get(ARG_LABEL);
prio = parms.get(ARG_PRIO); prio = parms.get(ARG_PRIO);
minzoom = parms.get(ARG_MINZOOM);
if((id == null) && (label == null)) { if((id == null) && (label == null)) {
sender.sendMessage("<label> or id:<marker-id> required"); sender.sendMessage("<label> or id:<marker-id> required");
return true; return true;
@ -991,6 +997,13 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
sender.sendMessage("Invalid priority: " + prio); sender.sendMessage("Invalid priority: " + prio);
} }
} }
if(minzoom != null) {
try {
set.setMinZoom(Integer.valueOf(minzoom));
} catch (NumberFormatException nfx) {
sender.sendMessage("Invalid max zoom out: " + minzoom);
}
}
sender.sendMessage("Added set id:'" + set.getMarkerSetID() + "' (" + set.getMarkerSetLabel() + ")"); sender.sendMessage("Added set id:'" + set.getMarkerSetID() + "' (" + set.getMarkerSetLabel() + ")");
} }
} }
@ -1006,6 +1019,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
id = parms.get(ARG_ID); id = parms.get(ARG_ID);
label = parms.get(ARG_LABEL); label = parms.get(ARG_LABEL);
prio = parms.get(ARG_PRIO); prio = parms.get(ARG_PRIO);
minzoom = parms.get(ARG_MINZOOM);
if((id == null) && (label == null)) { if((id == null) && (label == null)) {
sender.sendMessage("<label> or id:<set-id> required"); sender.sendMessage("<label> or id:<set-id> required");
return true; return true;
@ -1046,6 +1060,13 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
sender.sendMessage("Invalid priority: " + prio); sender.sendMessage("Invalid priority: " + prio);
} }
} }
if(minzoom != null) {
try {
set.setMinZoom(Integer.valueOf(minzoom));
} catch (NumberFormatException nfx) {
sender.sendMessage("Invalid min zoom: " + minzoom);
}
}
sender.sendMessage("Set '" + set.getMarkerSetID() + "' updated"); sender.sendMessage("Set '" + set.getMarkerSetID() + "' updated");
} }
else { else {
@ -1097,7 +1118,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
Set<String> setids = new TreeSet<String>(api.markersets.keySet()); Set<String> setids = new TreeSet<String>(api.markersets.keySet());
for(String s : setids) { for(String s : setids) {
MarkerSet set = api.markersets.get(s); MarkerSet set = api.markersets.get(s);
sender.sendMessage(set.getMarkerSetID() + ": label:\"" + set.getMarkerSetLabel() + "\", hide:" + set.getHideByDefault() + ", prio:" + set.getLayerPriority()); sender.sendMessage(set.getMarkerSetID() + ": label:\"" + set.getMarkerSetLabel() + "\", hide:" + set.getHideByDefault() + ", prio:" + set.getLayerPriority() + ", minzoom:" + set.getMinZoom());
} }
} }
/* Add new icon */ /* Add new icon */
@ -1505,6 +1526,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
msdata.put("label", ms.getMarkerSetLabel()); msdata.put("label", ms.getMarkerSetLabel());
msdata.put("hide", ms.getHideByDefault()); msdata.put("hide", ms.getHideByDefault());
msdata.put("layerprio", ms.getLayerPriority()); msdata.put("layerprio", ms.getLayerPriority());
msdata.put("minzoom", ms.getMinZoom());
HashMap<String, Object> markers = new HashMap<String, Object>(); HashMap<String, Object> markers = new HashMap<String, Object>();
for(Marker m : ms.getMarkers()) { for(Marker m : ms.getMarkers()) {
if(m.getWorld().equals(wname) == false) continue; if(m.getWorld().equals(wname) == false) continue;

View File

@ -25,6 +25,7 @@ class MarkerSetImpl implements MarkerSet {
private boolean hide_by_def; private boolean hide_by_def;
private boolean ispersistent; private boolean ispersistent;
private int prio = 0; private int prio = 0;
private int minzoom = 0;
MarkerSetImpl(String id) { MarkerSetImpl(String id) {
setid = id; setid = id;
@ -250,6 +251,7 @@ class MarkerSetImpl implements MarkerSet {
setnode.put("areas", anode); setnode.put("areas", anode);
setnode.put("hide", hide_by_def); setnode.put("hide", hide_by_def);
setnode.put("layerprio", prio); setnode.put("layerprio", prio);
setnode.put("minzoom", minzoom);
return setnode; return setnode;
} }
@ -297,6 +299,7 @@ class MarkerSetImpl implements MarkerSet {
} }
hide_by_def = node.getBoolean("hide", false); hide_by_def = node.getBoolean("hide", false);
prio = node.getInt("layerprio", 0); prio = node.getInt("layerprio", 0);
minzoom = node.getInt("minzoom", 0);
ispersistent = true; ispersistent = true;
return true; return true;
@ -370,4 +373,18 @@ class MarkerSetImpl implements MarkerSet {
return match; return match;
} }
@Override
public void setMinZoom(int minzoom) {
if(this.minzoom != minzoom) {
this.minzoom = minzoom;
MarkerAPIImpl.markerSetUpdated(this, MarkerUpdate.UPDATED);
if(ispersistent)
MarkerAPIImpl.saveMarkers();
}
}
@Override
public int getMinZoom() {
return this.minzoom;
}
} }

View File

@ -69,6 +69,7 @@ components:
#offlinelabel: "Offline" #offlinelabel: "Offline"
#offlineicon: offlineuser #offlineicon: offlineuser
#offlinehidebydefault: true #offlinehidebydefault: true
#offlineminzoom: 0
- class: org.dynmap.ClientComponent - class: org.dynmap.ClientComponent
type: chat type: chat

View File

@ -140,10 +140,10 @@ DynMap.prototype = {
}); });
window.map = map; // Placate Leaflet need for top-level 'map'.... window.map = map; // Placate Leaflet need for top-level 'map'....
map.zoom_changed = function() { map.on('zoomend', function() {
me.maptype.updateTileSize(me.map.zoom); me.maptype.updateTileSize(me.map.getZoom());
$(me).trigger('zoomchanged'); $(me).trigger('zoomchanged');
}; });
/*google.maps.event.addListener(map, 'dragstart', function(mEvent) { /*google.maps.event.addListener(map, 'dragstart', function(mEvent) {
me.followPlayer(null); me.followPlayer(null);

View File

@ -24,7 +24,7 @@ componentconstructors['markers'] = function(dynmap, configuration) {
$.each(data.sets, function(name, markerset) { $.each(data.sets, function(name, markerset) {
var ms = dynmapmarkersets[name]; var ms = dynmapmarkersets[name];
if(!ms) { if(!ms) {
ms = { id: name, label: markerset.label, hide: markerset.hide, layerprio: markerset.layerprio, markers: {}, areas: {} } ; ms = { id: name, label: markerset.label, hide: markerset.hide, layerprio: markerset.layerprio, minzoom: markerset.minzoom, markers: {}, areas: {} } ;
createMarkerSet(ms, ts); createMarkerSet(ms, ts);
} }
else { else {
@ -92,7 +92,8 @@ componentconstructors['markers'] = function(dynmap, configuration) {
$(popup).addClass('MarkerPopup').append(marker.desc); $(popup).addClass('MarkerPopup').append(marker.desc);
marker.our_marker.bindPopup(popup, {}); marker.our_marker.bindPopup(popup, {});
} }
set.layergroup.addLayer(marker.our_marker); if((set.minzoom < 1) || (dynmap.map.getZoom() >= set.minzoom))
set.layergroup.addLayer(marker.our_marker);
} }
function createMarkerSet(set, ts) { function createMarkerSet(set, ts) {
@ -138,7 +139,8 @@ componentconstructors['markers'] = function(dynmap, configuration) {
} }
area.our_area.bindPopup(popup, {}); area.our_area.bindPopup(popup, {});
} }
set.layergroup.addLayer(area.our_area); if((set.minzoom < 1) || (dynmap.map.getZoom() >= set.minzoom))
set.layergroup.addLayer(area.our_area);
} }
// Helper functions // Helper functions
@ -242,18 +244,21 @@ componentconstructors['markers'] = function(dynmap, configuration) {
} }
else if(msg.msg == 'setupdated') { else if(msg.msg == 'setupdated') {
if(!dynmapmarkersets[msg.id]) { if(!dynmapmarkersets[msg.id]) {
dynmapmarkersets[msg.id] = { id: msg.id, label: msg.label, layerprio: msg.layerprio, markers:{} }; dynmapmarkersets[msg.id] = { id: msg.id, label: msg.label, layerprio: msg.layerprio, minzoom: msg.minzoom, markers:{} };
createMarkerSet(dynmapmarkersets[msg.id]); createMarkerSet(dynmapmarkersets[msg.id]);
} }
else { else {
if(dynmapmarkersets[msg.id].label != msg.label) { if((dynmapmarkersets[msg.id].label != msg.label) || (dynmapmarkersets[msg.id].layerprio != msg.layerprio)) {
dynmapmarkersets[msg.id].label = msg.label; dynmapmarkersets[msg.id].label = msg.label;
dynmapmarkersets[msg.id].layerprio = msg.layerprio;
//dynmap.layercontrol.removeLayer(dynmapmarkersets[msg.id].layergroup); //dynmap.layercontrol.removeLayer(dynmapmarkersets[msg.id].layergroup);
//dynmap.layercontrol.addOverlay(dynmapmarkersets[msg.id].layergroup, dynmapmarkersets[msg.id].label); //dynmap.layercontrol.addOverlay(dynmapmarkersets[msg.id].layergroup, dynmapmarkersets[msg.id].label);
dynmap.addToLayerSelector(dynmapmarkersets[msg.id].layergroup, dynmapmarkersets[msg.id].label, dynmap.addToLayerSelector(dynmapmarkersets[msg.id].layergroup, dynmapmarkersets[msg.id].label,
dynmapmarkersets[msg.id].layerprio || 0); dynmapmarkersets[msg.id].layerprio || 0);
} }
if(dynmapmarkersets[msg.id].minzoom != msg.minzoom) {
dynmapmarkersets[msg.id].minzoom = msg.minzoom;
}
} }
} }
else if(msg.msg == 'setdeleted') { else if(msg.msg == 'setdeleted') {
@ -297,19 +302,50 @@ componentconstructors['markers'] = function(dynmap, configuration) {
}); });
// Remove marker on map change - let update place it again // Remove marker on map change - let update place it again
$(dynmap).bind('mapchanged', function(event) { $(dynmap).bind('mapchanged', function(event) {
var zoom = dynmap.map.getZoom();
$.each(dynmapmarkersets, function(setname, set) { $.each(dynmapmarkersets, function(setname, set) {
$.each(set.markers, function(mname, marker) { if((set.minzoomout < 1) || (zoom >= set.minzoom)) {
var marker = set.markers[mname]; $.each(set.markers, function(mname, marker) {
var markerPosition = getPosition(marker); var marker = set.markers[mname];
marker.our_marker.setLatLng(markerPosition); var markerPosition = getPosition(marker);
if(dynmap.map.hasLayer(marker.our_marker) == false) marker.our_marker.setLatLng(markerPosition);
set.layergroup.addLayer(marker.our_marker); if(dynmap.map.hasLayer(marker.our_marker) == false)
}); set.layergroup.addLayer(marker.our_marker);
$.each(set.areas, function(aname, area) { });
createArea(set, area, area.timestamp); $.each(set.areas, function(aname, area) {
}); createArea(set, area, area.timestamp);
});
}
}); });
}); });
$(dynmap).bind('zoomchanged', function(event) {
var zoom = dynmap.map.getZoom();
$.each(dynmapmarkersets, function(setname, set) {
if(set.minzoom > 0) {
if(zoom >= set.minzoom) {
$.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);
});
$.each(set.areas, function(aname, area) {
createArea(set, area, area.timestamp);
});
}
else {
$.each(set.markers, function(mname, marker) {
set.layergroup.removeLayer(marker.our_marker);
});
$.each(set.areas, function(aname, area) {
set.layergroup.removeLayer(area.our_area);
});
}
}
});
});
// Load markers for new world // Load markers for new world
$(dynmap).bind('worldchanged', function(event) { $(dynmap).bind('worldchanged', function(event) {
loadmarkers(this.world.name); loadmarkers(this.world.name);