Skip to content

Commit

Permalink
Fix responsiveness issue when selecting features on iPad
Browse files Browse the repository at this point in the history
Implement an alternative solution for openstreetmap#6028 that doesn't rely on timeouts
  • Loading branch information
quincylvania authored and zlavergne committed Mar 10, 2020
1 parent b7e6bb2 commit 6e85a33
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 14 deletions.
11 changes: 2 additions & 9 deletions modules/behavior/select.js
Original file line number Diff line number Diff line change
Expand Up @@ -109,17 +109,10 @@ export function behaviorSelect(context) {
_p1 = null;
if (dist > tolerance) return;

// Defer processing the click,
// because this click may trigger a blur event,
// and the blur event may trigger a tag change,
// and we really want that tag change to go to the already selected entity
// and not the one that we are about to select with the click #6028, #5878
// (Be very careful entering modeSelect anywhere that might also blur a field!)
var datum = d3_event.target.__data__ || (_lastMouse && _lastMouse.target.__data__);
var isMultiselect = d3_event.shiftKey || d3_select('#surface .lasso').node();
window.setTimeout(function() {
processClick(datum, isMultiselect);
}, 20); // delay > whatever raw_tag_editor.js `scheduleChange` does (10ms).

processClick(datum, isMultiselect);
}


Expand Down
7 changes: 4 additions & 3 deletions modules/ui/entity_editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -166,11 +166,12 @@ export function uiEntityEditor(context) {

// Tag changes that fire on input can all get coalesced into a single
// history operation when the user leaves the field. #2342
function changeTags(changed, onInput) {
// Use explicit entityIDs in case the selection changes before the event is fired.
function changeTags(entityIDs, changed, onInput) {

var actions = [];
for (var i in _entityIDs) {
var entityID = _entityIDs[i];
for (var i in entityIDs) {
var entityID = entityIDs[i];
var entity = context.entity(entityID);

var tags = Object.assign({}, entity.tags); // shallow copy
Expand Down
2 changes: 1 addition & 1 deletion modules/ui/sections/preset_fields.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ export function uiSectionPresetFields(context) {
_fieldsArr.forEach(function(field) {
field
.on('change', function(t, onInput) {
dispatch.call('change', field, t, onInput);
dispatch.call('change', field, _entityIDs, t, onInput);
})
.on('revert', function(keys) {
dispatch.call('revert', field, keys);
Expand Down
7 changes: 6 additions & 1 deletion modules/ui/sections/raw_tag_editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -553,9 +553,14 @@ export function uiSectionRawTagEditor(id, context) {
}

function scheduleChange() {
// Cache IDs in case the editor is reloaded before the change event is called. - #6028
var entityIDs = _entityIDs;

// Delay change in case this change is blurring an edited combo. - #5878
window.setTimeout(function() {
dispatch.call('change', this, _pendingChange);
if (!_pendingChange) return;

dispatch.call('change', this, entityIDs, _pendingChange);
_pendingChange = null;
}, 10);
}
Expand Down

0 comments on commit 6e85a33

Please sign in to comment.