mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-13 17:23:02 +00:00
when contents are "equivalent" in a given context, e.g. for numeric values with potentially different formatting in number fields
48 lines
1.4 KiB
JavaScript
48 lines
1.4 KiB
JavaScript
// Like selection.property('value', ...), but avoids no-op value sets,
|
|
// which can result in layout/repaint thrashing in some situations.
|
|
/** @returns {string} */
|
|
export function utilGetSetValue(selection, value, shouldUpdate) {
|
|
function setValue(value, shouldUpdate) {
|
|
function valueNull() {
|
|
delete this.value;
|
|
}
|
|
|
|
function valueConstant() {
|
|
if (shouldUpdate(this.value, value)) {
|
|
this.value = value;
|
|
}
|
|
}
|
|
|
|
function valueFunction() {
|
|
var x = value.apply(this, arguments);
|
|
if (x === null || x === undefined) {
|
|
delete this.value;
|
|
} else if (shouldUpdate(this.value, x)) {
|
|
this.value = x;
|
|
}
|
|
}
|
|
|
|
return (value === null || value === undefined)
|
|
? valueNull : (typeof value === 'function'
|
|
? valueFunction : valueConstant);
|
|
}
|
|
|
|
function stickyCursor(func) {
|
|
return function() {
|
|
const cursor = { start: this.selectionStart, end: this.selectionEnd };
|
|
func.apply(this, arguments);
|
|
this.setSelectionRange(cursor.start, cursor.end);
|
|
};
|
|
}
|
|
|
|
if (arguments.length === 1) {
|
|
return selection.property('value');
|
|
}
|
|
|
|
if (shouldUpdate === undefined) {
|
|
shouldUpdate = (a, b) => a !== b;
|
|
}
|
|
|
|
return selection.each(stickyCursor(setValue(value, shouldUpdate)));
|
|
}
|