From e6cc20efb5dcfcb227490ba5c58cc0398946994b Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 18 Jun 2013 15:19:04 -0700 Subject: [PATCH] Faster Feature List (fixes #1604) --- js/id/renderer/map.js | 3 +-- js/id/ui/feature_list.js | 48 ++++++++++++++++++---------------------- 2 files changed, 23 insertions(+), 28 deletions(-) diff --git a/js/id/renderer/map.js b/js/id/renderer/map.js index 84a85631b..763d6a0f2 100644 --- a/js/id/renderer/map.js +++ b/js/id/renderer/map.js @@ -47,7 +47,7 @@ iD.Map = function(context) { var dataLayer = supersurface.append('div') .attr('class', 'layer-layer layer-data'); - surface = dataLayer.append('svg') + map.surface = surface = dataLayer.append('svg') .on('mousedown.zoom', function() { if (d3.event.button == 2) { d3.event.stopPropagation(); @@ -88,7 +88,6 @@ iD.Map = function(context) { }); map.size(selection.size()); - map.surface = surface; labels.supersurface(supersurface); mouse = iD.util.fastMouse(supersurface.node()); diff --git a/js/id/ui/feature_list.js b/js/id/ui/feature_list.js index 7c0deb1c1..1f787d7cd 100644 --- a/js/id/ui/feature_list.js +++ b/js/id/ui/feature_list.js @@ -35,8 +35,6 @@ iD.ui.FeatureList = function(context) { var list = listWrap.append('div') .attr('class', 'feature-list fillL cf'); - drawList(); - context.history() .on('change.feature-list', drawList); @@ -50,40 +48,38 @@ iD.ui.FeatureList = function(context) { } function features() { - var result = [], + var entities = {}, + result = [], graph = context.graph(), q = search.property('value').toLowerCase(); - if (!context.map().editable()) { - return result; - } + function addEntity(entity) { + if (entity.id in entities || result.length > 200) + return; - var entities = context.intersects(context.extent()); - for (var i = 0; i < entities.length; i++) { - var entity = entities[i]; + entities[entity.id] = true; - if (entity.geometry(graph) === 'vertex') - continue; - - if (context.surface().selectAll(iD.util.entityOrMemberSelector([entity.id], graph)).empty()) - continue; - - var preset = context.presets().match(entity, context.graph()), + var preset = context.presets().match(entity, graph), name = iD.util.displayName(entity) || ''; - if (q && name.toLowerCase().indexOf(q) === -1 && - preset.name().toLowerCase().indexOf(q) === -1) - continue; + if (!q || name.toLowerCase().indexOf(q) >= 0 || + preset.name().toLowerCase().indexOf(q) >= 0) { + result.push({ + entity: entity, + geometry: context.geometry(entity.id), + preset: preset, + name: name + }); + } - result.push({ - entity: entity, - geometry: context.geometry(entity.id), - preset: preset, - name: name + graph.parentRelations(entity).forEach(function(parent) { + addEntity(parent); }); + } - if (result.length > 200) - break; + var visible = context.surface().selectAll('.point, .line, .area')[0]; + for (var i = 0; i < visible.length && result.length <= 200; i++) { + addEntity(visible[i].__data__); } return result;