From d6bc3029baed2997ddb6b7c2e01b8e706c9b86c5 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Mon, 25 Feb 2013 11:46:16 -0500 Subject: [PATCH] Add basic category support for presets --- js/id/presetdata.js | 23 +++++++++++++++++------ js/id/ui/presetgrid.js | 37 +++++++++++++++++++++++++------------ presets/presets.json | 15 ++++++++++++++- 3 files changed, 56 insertions(+), 19 deletions(-) diff --git a/js/id/presetdata.js b/js/id/presetdata.js index 9380f63f2..aec3e6b4d 100644 --- a/js/id/presetdata.js +++ b/js/id/presetdata.js @@ -1,31 +1,42 @@ iD.presetData = function() { var presets = {}, data = [], + categories = {}, defaults = { node: [], area: [], line: [] }; + function getPreset(name) { + return _.find(data.concat(categories), function(d) { + return d.name === name; + }); + } + presets.data = function(_) { if (!arguments.length) return data; data = _.presets; + categories = _.categories; defaults = _.defaults; return presets; }; presets.defaults = function(entity) { var type = entity.type == 'node' ? 'node' : entity.geometry(); - return defaults[type].map(function(def) { - return _.find(data, function(d) { - return d.name === def; - }); - }); + return defaults[type].map(getPreset); + }; + + presets.categories = function(category) { + if (!arguments.length) return categories; + return _.find(categories, function(d) { + return d.name === category; + }).members.map(getPreset); }; presets.match = function(entity) { var type = entity.type == 'node' ? 'node' : entity.geometry(); - return data.filter(function(d) { + return data.concat(categories).filter(function(d) { return _.contains(d.match.type, type); }); }; diff --git a/js/id/ui/presetgrid.js b/js/id/ui/presetgrid.js index db771b1ea..e025913be 100644 --- a/js/id/ui/presetgrid.js +++ b/js/id/ui/presetgrid.js @@ -22,15 +22,17 @@ iD.ui.PresetGrid = function() { .attr('class', 'preset-grid-search') .attr('type', 'search') .on('keyup', function() { - var value = search.property('value'), - presets = filter(value); - event.message('' + presets.length + ' results for ' + value); - grid.call(drawGrid, presets); - grid.classed('filtered', value.length); - }) - .on('change', function() { - var chosen = grid.selectAll('.grid-entry:first-child').datum(); - if (chosen) event.choose(chosen); + // enter + if (d3.event.keyCode === 13) { + var chosen = grid.selectAll('.grid-entry:first-child').datum(); + if (chosen) event.choose(chosen); + } else { + var value = search.property('value'), + presets = filter(value); + event.message('' + presets.length + ' results for ' + value); + grid.call(drawGrid, presets); + grid.classed('filtered', value.length); + } }); search.node().focus(); @@ -58,14 +60,25 @@ iD.ui.PresetGrid = function() { .append('button') .attr('class', 'grid-entry col3') .on('click', function(d) { - event.choose(d); + // Category + if (d.members) { + drawGrid(selection, presetData.categories(d.name)); + + // Preset + } else { + event.choose(d); + } }); entered.append('div') .attr('class', function(d) { var s = 'preset-icon-fill ' + entity.geometry(context.graph()); - for (var i in d.match.tags) { - s += ' tag-' + i + ' tag-' + i + '-' + d.match.tags[i]; + if (d.members) { + s += 'category'; + } else { + for (var i in d.match.tags) { + s += ' tag-' + i + ' tag-' + i + '-' + d.match.tags[i]; + } } return s; }); diff --git a/presets/presets.json b/presets/presets.json index 7c9ee6640..4b1063f31 100644 --- a/presets/presets.json +++ b/presets/presets.json @@ -711,5 +711,18 @@ "supermarket", "other" ] - } + }, + "categories": [ + { + "match": { + "type": "line" + }, + "icon": "road", + "name": "roads", + "members": [ + "residential road", + "primary road" + ] + } + ] }