Move more inspector logic to Inspector

This commit is contained in:
John Firebaugh
2013-03-17 20:07:44 -07:00
parent 13b5cc4c4d
commit fdcb96e8d6
3 changed files with 48 additions and 87 deletions

View File

@@ -17,14 +17,6 @@ iD.modes.Select = function(context, selection, initial) {
var wrap = context.container()
.select('.inspector-wrap');
function changeTags(d, tags) {
if (!_.isEqual(singular().tags, tags)) {
context.perform(
iD.actions.ChangeTags(d.id, tags),
t('operations.change_tags.annotation'));
}
}
function singular() {
if (selection.length === 1) {
return context.entity(selection[0]);
@@ -57,8 +49,6 @@ iD.modes.Select = function(context, selection, initial) {
};
mode.enter = function() {
var entity = singular();
behaviors.forEach(function(behavior) {
context.install(behavior);
});
@@ -87,41 +77,20 @@ iD.modes.Select = function(context, selection, initial) {
id: selection.join(',')
}), true));
if (entity) {
if (singular()) {
wrap.call(inspector);
if (d3.event) {
// Pan the map if the clicked feature intersects with the position
// of the inspector
var inspectorSize = wrap.size(),
mapSize = context.map().size(),
offset = 50,
shiftLeft = d3.event.clientX - mapSize[0] + inspectorSize[0] + offset,
center = (mapSize[0] / 2) + shiftLeft + offset;
if (shiftLeft > 0 && inspectorSize[1] > d3.event.clientY) {
context.map().centerEase(context.projection.invert([center, mapSize[1]/2]));
}
}
inspector
.on('changeTags', changeTags)
.on('close', function() { context.enter(iD.modes.Browse(context)); });
}
context.history()
.on('undone.select', updateInspector)
.on('redone.select', updateInspector);
.on('undone.select', update)
.on('redone.select', update);
function updateInspector() {
function update() {
context.surface().call(radialMenu.close);
if (_.any(selection, function(id) { return !context.entity(id); })) {
// Exit mode if selected entity gets undone
context.enter(iD.modes.Browse(context));
} else if (singular()) {
inspector.tags(context.entity(selection[0]).tags);
}
}

View File

@@ -1,6 +1,24 @@
iD.ui.Inspector = function(context, entity) {
var event = d3.dispatch('changeTags', 'close', 'change'),
tagEditor;
var tagEditor;
function changeTags(tags) {
if (!_.isEqual(entity.tags, tags)) {
context.perform(
iD.actions.ChangeTags(entity.id, tags),
t('operations.change_tags.annotation'));
}
}
function browse() {
context.enter(iD.modes.Browse(context));
}
function update() {
entity = context.entity(entity.id);
if (entity) {
tagEditor.tags(entity.tags);
}
}
function inspector(selection) {
selection
@@ -24,9 +42,7 @@ iD.ui.Inspector = function(context, entity) {
.classed('pane', true);
var presetGrid = iD.ui.PresetGrid(context, entity)
.on('close', function() {
event.close();
})
.on('close', browse)
.on('choose', function(preset) {
panewrap
.transition()
@@ -37,12 +53,8 @@ iD.ui.Inspector = function(context, entity) {
tagEditor = iD.ui.TagEditor(context, entity)
.tags(entity.tags)
.on('changeTags', function(tags) {
event.changeTags(entity, tags);
})
.on('close', function() {
event.close(entity);
})
.on('changeTags', changeTags)
.on('close', browse)
.on('choose', function() {
panewrap
.transition()
@@ -60,6 +72,23 @@ iD.ui.Inspector = function(context, entity) {
panewrap.style('right', '-0%');
tagLayer.call(tagEditor);
}
if (d3.event) {
// Pan the map if the clicked feature intersects with the position
// of the inspector
var inspectorSize = selection.size(),
mapSize = context.map().size(),
offset = 50,
shiftLeft = d3.event.clientX - mapSize[0] + inspectorSize[0] + offset,
center = (mapSize[0] / 2) + shiftLeft + offset;
if (shiftLeft > 0 && inspectorSize[1] > d3.event.clientY) {
context.map().centerEase(context.projection.invert([center, mapSize[1]/2]));
}
}
context.history()
.on('change.inspector', update);
}
inspector.close = function(selection) {
@@ -74,12 +103,10 @@ iD.ui.Inspector = function(context, entity) {
// Firefox incorrectly implements blur, so typeahead elements
// are not correctly removed. Remove any stragglers manually.
d3.selectAll('div.typeahead').remove();
context.history()
.on('change.inspector', null);
};
inspector.tags = function() {
tagEditor.tags.apply(this, arguments);
return inspector;
};
return d3.rebind(inspector, event, 'on');
return inspector;
};

View File

@@ -1,37 +1,2 @@
describe("iD.ui.Inspector", function () {
var inspector, element,
tags = {highway: 'residential'},
entity, context;
beforeEach(function () {
entity = iD.Entity({type: 'node', id: "n12345", tags: tags});
context = iD();
inspector = iD.ui.Inspector(context, entity);
element = d3.select('body')
.append('div')
.attr('id', 'inspector-wrap')
.call(inspector);
});
afterEach(function () {
element.remove();
});
it("emits a close event when the apply button is clicked", function () {
var spy = sinon.spy();
inspector.on('close', spy);
element.select('.apply').trigger('click');
expect(spy).to.have.been.calledWith(entity);
});
xit("emits a changeTags event when the apply button is clicked", function () {
var spy = sinon.spy();
inspector.on('changeTags', spy);
element.select('.apply').trigger('click');
expect(spy).to.have.been.calledWith(entity, tags);
});
});