]> git.openstreetmap.org Git - rails.git/commitdiff
Layers work
authorJohn Firebaugh <john.firebaugh@gmail.com>
Tue, 11 Jun 2013 20:48:12 +0000 (13:48 -0700)
committerJohn Firebaugh <john.firebaugh@gmail.com>
Thu, 18 Jul 2013 17:45:13 +0000 (10:45 -0700)
app/assets/javascripts/index.js
app/assets/javascripts/index/export.js
app/assets/javascripts/index/key.js
app/assets/javascripts/leaflet.layers.js
app/assets/javascripts/templates/map/layers.jst.ejs
app/assets/stylesheets/common.css.scss

index 753cf474013e2519e86104dc2b8450358b74f5d1..184b57419770a5d750bb5456d5be4b5bfec275ee 100644 (file)
@@ -9,38 +9,6 @@
 //= require index/key
 //= require index/notes
 
-function allLayers() {
-  return [{
-    layer: new L.OSM.Mapnik({
-      attribution: '',
-      code: "M"
-    }),
-    keyid: "mapnik",
-    name: I18n.t("javascripts.map.base.standard")
-  }, {
-    layer: new L.OSM.CycleMap({
-      attribution: "Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
-      code: "C"
-    }),
-    keyid: "cyclemap",
-    name: I18n.t("javascripts.map.base.cycle_map")
-  }, {
-    layer: new L.OSM.TransportMap({
-      attribution: "Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
-      code: "T"
-    }),
-    keyid: "transportmap",
-    name: I18n.t("javascripts.map.base.transport_map")
-  }, {
-    layer: new L.OSM.MapQuestOpen({
-      attribution: "Tiles courtesy of <a href='http://www.mapquest.com/' target='_blank'>MapQuest</a> <img src='http://developer.mapquest.com/content/osm/mq_logo.png'>",
-      code: "Q"
-    }),
-    keyid: "mapquest",
-    name: I18n.t("javascripts.map.base.mapquest")
-  }];
-}
-
 $(document).ready(function () {
   var params = OSM.mapParams();
 
@@ -51,9 +19,34 @@ $(document).ready(function () {
 
   map.attributionControl.setPrefix('');
 
-  var layers = allLayers();
+  var layers = [
+    new L.OSM.Mapnik({
+      attribution: '',
+      code: "M",
+      keyid: "mapnik",
+      name: I18n.t("javascripts.map.base.standard")
+    }),
+    new L.OSM.CycleMap({
+      attribution: "Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
+      code: "C",
+      keyid: "cyclemap",
+      name: I18n.t("javascripts.map.base.cycle_map")
+    }),
+    new L.OSM.TransportMap({
+      attribution: "Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
+      code: "T",
+      keyid: "transportmap",
+      name: I18n.t("javascripts.map.base.transport_map")
+    }),
+    new L.OSM.MapQuestOpen({
+      attribution: "Tiles courtesy of <a href='http://www.mapquest.com/' target='_blank'>MapQuest</a> <img src='http://developer.mapquest.com/content/osm/mq_logo.png'>",
+      code: "Q",
+      keyid: "mapquest",
+      name: I18n.t("javascripts.map.base.mapquest")
+    })
+  ];
 
-  layers[0].layer.addTo(map);
+  layers[0].addTo(map);
 
   $("#map").on("resized", function () {
     map.invalidateSize();
@@ -105,15 +98,15 @@ $(document).ready(function () {
   if (params.layers) {
     var foundLayer = false;
     for (var i = 0; i < layers.length; i++) {
-      if (params.layers.indexOf(layers[i].layer.options.code) >= 0) {
-        map.addLayer(layers[i].layer);
+      if (params.layers.indexOf(layers[i].options.code) >= 0) {
+        map.addLayer(layers[i]);
         foundLayer = true;
       } else {
-        map.removeLayer(layers[i].layer);
+        map.removeLayer(layers[i]);
       }
     }
     if (!foundLayer) {
-      map.addLayer(layers[0].layer);
+      map.addLayer(layers[0]);
     }
   }
 
@@ -154,11 +147,11 @@ $(document).ready(function () {
   }
 });
 
-// non-scoped utilities
-function getMapBaseLayer() {
-  for (var i = 0; i < layers.length; i++) {
-    if (map.hasLayer(layers[i].layer)) {
-      return layers[i];
+function getMapBaseLayerId(map) {
+  for (var i in map._layers) { // TODO: map.eachLayer
+    var layer = map._layers[i];
+    if (layer.options && layer.options.keyid) {
+      return layer.options.keyid;
     }
   }
 }
index 52af96ebb7ad20d120ce60b9c84e234a17b104df..3715cbf9970a57a185dafe3c8f0ee1c68f832722 100644 (file)
@@ -38,7 +38,7 @@ $(document).ready(function () {
 
     openSidebar();
 
-    if (getMapBaseLayer().keyid == "mapnik") {
+    if (getMapBaseLayerId() == "mapnik") {
       $("#format_mapnik").prop("checked", true);
     }
 
@@ -186,7 +186,7 @@ $(document).ready(function () {
 
     function htmlUrlChanged() {
       var bounds = getBounds();
-      var layerName = getMapBaseLayer().keyid;
+      var layerName = getMapBaseLayerId();
 
       var url = "http://" + OSM.SERVER_URL + "/export/embed.html?bbox=" + bounds.toBBoxString() + "&amp;layer=" + layerName;
       var markerUrl = "";
index 9722cf4cf0511f684c95ff7b651a4d06393cf9dd..5592a296022ff10fed4f762ba968a6034d18a6f2 100644 (file)
@@ -6,7 +6,7 @@ $(document).ready(function () {
         title = $(this).text();
 
     function updateMapKey() {
-      var mapLayer = getMapBaseLayer().keyid,
+      var mapLayer = getMapBaseLayerId(),
           mapZoom = map.getZoom();
 
       $(".mapkey-table-entry").each(function () {
index ce0fcd9f329efc1dc220b81565945cc2e26497cc..15f114a5caa8d6711da4f37f58cd8406b3e4a380 100644 (file)
@@ -7,58 +7,82 @@ L.OSM.Layers = L.Control.extend({
     return this._container;
   },
 
-  _initLayout: function (map) {
+  _initLayout: function () {
     var className = 'leaflet-control-map-ui',
       container = this._container = L.DomUtil.create('div', className);
 
-    var link = this._layersLink = L.DomUtil.create('a', 'leaflet-map-ui-layers', container);
+    var link = L.DomUtil.create('a', 'control-button', container);
+    link.innerHTML = "<span class='icon layers'></span>";
     link.href = '#';
     link.title = 'Layers';
 
-    this._uiPane = this.options.uiPane;
+    this._ui = $(L.DomUtil.create('div', 'layers-ui', this.options.uiPane))
+      .html(JST["templates/map/layers"]());
 
-    $(link).on('click', $.proxy(this.toggleLayers, this));
-  },
-
-  toggleLayers: function (e) {
-    e.stopPropagation();
-    e.preventDefault();
+    var list = this._ui.find('.base-layers ul');
 
-    var controlContainer = $('.leaflet-control-container .leaflet-top.leaflet-right');
-
-    if ($(this._uiPane).is(':visible')) {
-      $(this._uiPane).hide();
-      controlContainer.css({paddingRight: '0'});
-    } else {
-      $(this._uiPane)
-        .show()
-        .html(JST["templates/map/layers"]());
-
-      var list = $(this._uiPane).find('.base-layers ul');
+    this.options.layers.forEach(function(layer) {
+      var item = $('<li></li>')
+        .appendTo(list);
 
-      var layers = this.options.layers;
-      for (var i = 0; i < layers.length; i++) {
-        var item = $('<li></li>')
-          .appendTo(list);
+      if (this._map.hasLayer(layer)) {
+        item.addClass('active');
+      }
 
-        var div = $('<div></div>')
-            .appendTo(item);
+      var div = $('<div></div>')
+        .appendTo(item);
 
+      this._map.whenReady(function() {
         var map = L.map(div[0], {attributionControl: false, zoomControl: false})
           .setView(this._map.getCenter(), Math.max(this._map.getZoom() - 2, 0))
-          .addLayer(new layers[i].layer.constructor);
+          .addLayer(new layer.constructor);
 
         map.dragging.disable();
         map.touchZoom.disable();
         map.doubleClickZoom.disable();
         map.scrollWheelZoom.disable();
+      }, this);
+
+      var label = $('<label></label>')
+        .text(layer.options.name)
+        .appendTo(item);
+
+      item.on('click', function() {
+        this.options.layers.forEach(function(other) {
+          if (other === layer) {
+            this._map.addLayer(other);
+          } else {
+            this._map.removeLayer(other);
+          }
+        }, this);
+      }.bind(this));
+
+      this._map.on('layeradd', function(e) {
+        if (e.layer === layer) {
+          item.addClass('active');
+        }
+      }).on('layerremove', function(e) {
+        if (e.layer === layer) {
+          item.removeClass('active');
+        }
+      });
+    }, this);
 
-        var label = $('<label></label>')
-          .text(layers[i].name)
-          .appendTo(item);
-      }
+    $(link).on('click', $.proxy(this.toggleLayers, this));
+  },
 
-      controlContainer.css({paddingRight: '200px'});
+  toggleLayers: function (e) {
+    e.stopPropagation();
+    e.preventDefault();
+
+    var controlContainer = $('.leaflet-control-container .leaflet-top.leaflet-right');
+
+    if ($(this._ui).is(':visible')) {
+      $(this.options.uiPane).hide();
+      controlContainer.css({paddingRight: '0'});
+    } else {
+      $(this.options.uiPane).show();
+      controlContainer.css({paddingRight: '230px'});
     }
   }
 });
index cbda1d6967144ee0e33602befb5ff4341902d62c..76835c15c2ca8203917566656527507f3a49d4ec 100644 (file)
@@ -1,11 +1,13 @@
 <h2><%= I18n.t('javascripts.map.layers.header') %></h2>
-<div class='overlay-layers'>
+<section class='overlay-layers'>
     <p><%= I18n.t('javascripts.map.layers.overlays') %></p>
-    <label><input type='checkbox' id='notes-layer-checkbox'><%= I18n.t('javascripts.map.layers.notes') %></label>
-    <label><input type='checkbox' id='data-layer-checkbox'><%= I18n.t('javascripts.map.layers.data') %></label>
-</div>
-<div class='base-layers'>
+    <ul>
+        <li><label><input type='checkbox' id='notes-layer-checkbox'><%= I18n.t('javascripts.map.layers.notes') %></label></li>
+        <li><label><input type='checkbox' id='data-layer-checkbox'><%= I18n.t('javascripts.map.layers.data') %></label></li>
+    </ul>
+</section>
+<section class='base-layers'>
     <p><%= I18n.t('javascripts.map.layers.base') %></p>
     <ul>
     </ul>
-</div>
+</section>
index dd29b813dfbec0b0a31a6c155d306909ee5d4b33..915647735a7d4c6bbb2a728ea39dfb34baca2398 100644 (file)
@@ -569,10 +569,40 @@ a.donate {
   width: 200px;
   height: 100%;
   background: white;
+}
 
-  .leaflet-container {
-    width: 100%;
-    height: 50px;
+.layers-ui {
+  section {
+    border-top: 1px solid #868e85;
+    padding: 15px;
+  }
+
+  li {
+    margin-bottom: 10px;
+  }
+
+  label {
+    border-radius: 4px;
+    display: block;
+    padding: 5px;
+    background-color: #868e85;
+  }
+
+  li.active label {
+    background-color: #68c879;
+  }
+
+  .base-layers {
+    label {
+      border-radius: 0px 0px 4px 4px;
+    }
+
+    .leaflet-container {
+      border-radius: 4px 4px 0px 0px;
+      width: 100%;
+      height: 50px;
+      cursor: pointer;
+    }
   }
 }