diff --git a/js/id/actions/modes.js b/js/id/actions/modes.js index 7a94e21c7..650b893d5 100644 --- a/js/id/actions/modes.js +++ b/js/id/actions/modes.js @@ -100,7 +100,7 @@ iD.modes.AddRoad = { if (t.data() && t.data()[0] && t.data()[0].type === 'node') { // continue an existing way var id = t.data()[0].id; - var parents = this.map.history.graph().parents(id); + var parents = this.map.history().graph().parents(id); if (parents.length && parents[0].nodes[0] === id) { way = parents[0]; direction = 'backward'; @@ -115,7 +115,7 @@ iD.modes.AddRoad = { var index = iD.modes.chooseIndex(t.data()[0], d3.mouse(surface.node()), this.map); node = iD.modes._node(this.map.projection.invert( d3.mouse(surface.node()))); - var connectedWay = this.map.history.graph().entity(t.data()[0].id); + var connectedWay = this.map.history().graph().entity(t.data()[0].id); connectedWay.nodes.splice(index, 0, node.id); this.map.perform(iD.actions.addWayNode(connectedWay, node)); } else { @@ -160,7 +160,7 @@ iD.modes.DrawRoad = function(way_id, direction) { nextnode = iD.modes._node([NaN, NaN]); var nextnode_id = nextnode.id; - var way = this.map.history.graph().entity(way_id), + var way = this.map.history().graph().entity(way_id), firstNode = way.nodes[0], lastNode = _.last(way.nodes); way.nodes[push](nextnode_id); @@ -168,11 +168,11 @@ iD.modes.DrawRoad = function(way_id, direction) { function mousemove() { var ll = this.map.projection.invert(d3.mouse(surface.node())); - var way = this.map.history.graph().entity(way_id); - var node = iD.Entity(this.map.history.graph().entity(nextnode_id), { + var way = this.map.history().graph().entity(way_id); + var node = iD.Entity(this.map.history().graph().entity(nextnode_id), { lon: ll[0], lat: ll[1] }); - this.map.history.replace(iD.actions.addWayNode(way, node)); + this.map.history().replace(iD.actions.addWayNode(way, node)); var only = iD.Util.trueObj([way.id].concat(_.pluck(way.nodes, 'id'))); this.map.redraw(only); } @@ -182,18 +182,18 @@ iD.modes.DrawRoad = function(way_id, direction) { d3.event.stopPropagation(); if (t.data() && t.data()[0] && t.data()[0].type === 'node') { if (t.data()[0].id == firstNode || t.data()[0].id == lastNode) { - var l = this.map.history.graph().entity(way.nodes[pop]()); + var l = this.map.history().graph().entity(way.nodes[pop]()); this.map.perform(iD.actions.removeWayNode(way, l)); // If this is drawing a loop and this is not the drawing // end of the stick, finish the circle if (direction === 'forward' && t.data()[0].id == firstNode) { way.nodes[push](firstNode); this.map.perform(iD.actions.addWayNode(way, - this.map.history.graph().entity(firstNode))); + this.map.history().graph().entity(firstNode))); } else if (direction === 'backward' && t.data()[0].id == lastNode) { way.nodes[push](lastNode); this.map.perform(iD.actions.addWayNode(way, - this.map.history.graph().entity(lastNode))); + this.map.history().graph().entity(lastNode))); } delete way.tags.elastic; this.map.perform(iD.actions.changeTags(way, way.tags)); @@ -208,14 +208,14 @@ iD.modes.DrawRoad = function(way_id, direction) { var index = iD.modes.chooseIndex(t.data()[0], d3.mouse(surface.node()), this.map); node = iD.modes._node(this.map.projection.invert( d3.mouse(surface.node()))); - var connectedWay = this.map.history.graph().entity(t.data()[0].id); + var connectedWay = this.map.history().graph().entity(t.data()[0].id); connectedWay.nodes.splice(1, 0, node.id); this.map.perform(iD.actions.addWayNode(connectedWay, node)); } else { node = iD.modes._node(this.map.projection.invert( d3.mouse(surface.node()))); } - var old = this.map.history.graph().entity(way.nodes[pop]()); + var old = this.map.history().graph().entity(way.nodes[pop]()); this.map.perform(iD.actions.removeWayNode(way, old)); way.nodes[push](node.id); this.map.perform(iD.actions.addWayNode(way, node)); @@ -304,7 +304,7 @@ iD.modes.DrawArea = function(way_id) { nextnode = iD.modes._node([NaN, NaN]); var surface = this.map.surface, - way = this.map.history.graph().entity(way_id), + way = this.map.history().graph().entity(way_id), firstnode_id = _.first(way.nodes), nextnode_id = nextnode.id; @@ -313,12 +313,12 @@ iD.modes.DrawArea = function(way_id) { function mousemove() { var ll = this.map.projection.invert(d3.mouse(surface.node())); - var way = this.map.history.graph().entity(way_id); - var node = iD.Entity(this.map.history.graph().entity(nextnode_id), { + var way = this.map.history().graph().entity(way_id); + var node = iD.Entity(this.map.history().graph().entity(nextnode_id), { lon: ll[0], lat: ll[1] }); - this.map.history.replace(iD.actions.addWayNode(way, node)); + this.map.history().replace(iD.actions.addWayNode(way, node)); var only = iD.Util.trueObj([way.id].concat(_.pluck(way.nodes, 'id'))); this.map.redraw(only); } @@ -328,11 +328,11 @@ iD.modes.DrawArea = function(way_id) { d3.event.stopPropagation(); if (t.data() && t.data()[0] && t.data()[0].type === 'node') { if (t.data()[0].id == firstnode_id) { - var l = this.map.history.graph().entity(way.nodes.pop()); + var l = this.map.history().graph().entity(way.nodes.pop()); this.map.perform(iD.actions.removeWayNode(way, l)); way.nodes.push(way.nodes[0]); this.map.perform(iD.actions.addWayNode(way, - this.map.history.graph().entity(way.nodes[0]))); + this.map.history().graph().entity(way.nodes[0]))); delete way.tags.elastic; this.map.perform(iD.actions.changeTags(way, way.tags)); // End by clicking on own tail @@ -345,7 +345,7 @@ iD.modes.DrawArea = function(way_id) { node = iD.modes._node(this.map.projection.invert( d3.mouse(surface.node()))); } - var old = this.map.history.graph().entity(way.nodes.pop()); + var old = this.map.history().graph().entity(way.nodes.pop()); this.map.perform(iD.actions.removeWayNode(way, old)); way.nodes.push(node.id); this.map.perform(iD.actions.addWayNode(way, node)); diff --git a/js/id/id.js b/js/id/id.js index a8600c42c..148968e6d 100644 --- a/js/id/id.js +++ b/js/id/id.js @@ -1,8 +1,10 @@ var iD = function(container) { var connection = iD.Connection() .url('http://api06.dev.openstreetmap.org'), + history = iD.History(), map = iD.Map() - .connection(connection), + .connection(connection) + .history(history), controller = iD.Controller(map); map.background.source(iD.Background.Bing); @@ -75,9 +77,9 @@ var iD = function(container) { function save(e) { d3.select('.shaded').remove(); var l = iD.loading('uploading changes to openstreetmap'); - connection.putChangeset(map.history.changes(), e.comment, function() { + connection.putChangeset(history.changes(), e.comment, function() { l.remove(); - map.history = iD.History(); + map.history(iD.History()); map.flush().redraw(); }); } @@ -89,7 +91,7 @@ var iD = function(container) { }); var modal = shaded.append('div') .attr('class', 'modal commit-pane') - .datum(map.history.changes()); + .datum(history.changes()); modal.call(iD.commit() .on('cancel', function() { shaded.remove(); @@ -117,8 +119,8 @@ var iD = function(container) { "/ imagery © 2012 Bing, GeoEye, Getmapping, Intermap, Microsoft.

"); map.on('update', function() { - var undo = map.history.undoAnnotation(), - redo = map.history.redoAnnotation(); + var undo = history.undoAnnotation(), + redo = history.redoAnnotation(); bar.select('#undo') .property('disabled', !undo) diff --git a/js/id/renderer/map.js b/js/id/renderer/map.js index cd8c4d908..7a720838d 100644 --- a/js/id/renderer/map.js +++ b/js/id/renderer/map.js @@ -1,5 +1,5 @@ iD.Map = function() { - var connection, + var connection, history, dimensions = [], dispatch = d3.dispatch('move', 'update'), inspector = iD.Inspector(), @@ -33,12 +33,12 @@ iD.Map = function() { if (!dragging) { dragging = true; only = iD.Util.trueObj([entity.id].concat( - _.pluck(map.history.graph().parents(entity.id), 'id'))); - map.history.perform(iD.actions.noop()); + _.pluck(history.graph().parents(entity.id), 'id'))); + history.perform(iD.actions.noop()); } var to = projection.invert([d3.event.x, d3.event.y]); - map.history.replace(iD.actions.move(entity, to)); + history.replace(iD.actions.move(entity, to)); redraw(only); }) @@ -132,8 +132,6 @@ iD.Map = function() { map.surface = surface; } - map.history = iD.History(); - function prefixMatch(p) { // via mbostock var i = -1, n = p.length, s = document.body.style; while (++i < n) if (p[i] + 'Transform' in s) return '-' + p[i].toLowerCase() + '-'; @@ -163,7 +161,7 @@ iD.Map = function() { if (surface.style(transformProp) != 'none') return; var all = [], ways = [], areas = [], points = [], waynodes = [], extent = map.extent(), - graph = map.history.graph(); + graph = history.graph(); if (!only) { all = graph.intersects(extent); @@ -404,7 +402,7 @@ iD.Map = function() { if (result instanceof Error) { // TODO: handle } else { - map.history.merge(result); + history.merge(result); drawVector(iD.Util.trueObj(Object.keys(result.entities))); } }); @@ -439,7 +437,7 @@ iD.Map = function() { selection = entity.id; d3.select('.inspector-wrap') .style('display', 'block') - .datum(map.history.graph().fetch(entity.id)) + .datum(history.graph().fetch(entity.id)) .call(inspector); redraw(); } @@ -454,7 +452,7 @@ iD.Map = function() { function removeEntity(entity) { // Remove this node from any ways that is a member of - map.history.graph().parents(entity.id) + history.graph().parents(entity.id) .filter(function(d) { return d.type === 'way'; }) .forEach(function(parent) { parent.nodes = _.without(parent.nodes, entity.id); @@ -464,7 +462,7 @@ iD.Map = function() { } inspector.on('changeTags', function(d, tags) { - var entity = map.history.graph().entity(d.id); + var entity = history.graph().entity(d.id); map.perform(iD.actions.changeTags(entity, tags)); }).on('changeWayDirection', function(d) { map.perform(iD.actions.changeWayDirection(d)); @@ -518,21 +516,21 @@ iD.Map = function() { } map.perform = function(action) { - map.history.perform(action); + history.perform(action); map.update(); redraw(); return map; }; map.undo = function() { - map.history.undo(); + history.undo(); map.update(); redraw(); return map; }; map.redo = function() { - map.history.redo(); + history.redo(); map.update(); redraw(); return map; @@ -611,9 +609,15 @@ iD.Map = function() { }; map.connection = function(_) { - if (!arguments.length) return connection; - connection = _; - return map; + if (!arguments.length) return connection; + connection = _; + return map; + }; + + map.history = function (_) { + if (!arguments.length) return history; + history = _; + return map; }; map.background = background; diff --git a/test/spec/Map.js b/test/spec/Map.js index 63054d7a4..82ff270d5 100644 --- a/test/spec/Map.js +++ b/test/spec/Map.js @@ -66,6 +66,11 @@ describe('Map', function() { beforeEach(function () { spy = sinon.spy(); + map.history({ + perform: function () {}, + undo: function () {}, + redo: function () {} + }); map.on('update', spy); });