complete range prototype

This commit is contained in:
Stewart Allen 2021-02-10 16:10:18 -05:00
commit 1447dd5336
2 changed files with 72 additions and 31 deletions

View file

@ -682,44 +682,67 @@
} }
// set process override values for a range // set process override values for a range
function updateRange(lo, hi, values, noadd) { function updateRange(lo, hi, values, add) {
let exact;
let empty = [];
// remove matching values from overlapping ranges
for (let range of getOverlappingRanges(lo, hi)) {
if (range.lo === lo && range.hi === hi) {
exact = range;
}
for (let key of Object.keys(values)) {
delete range.fields[key];
}
if (Object.keys(range.fields).length === 0) {
empty.push(range);
}
}
let ranges = settings.process.ranges; let ranges = settings.process.ranges;
// clear out empty ranges let slices = {};
if (empty.length) { let min = lo;
for (let range of empty) { let max = hi;
let pos = ranges.indexOf(range);
if (pos >= 0) { // just remove values from matching ranges
ranges.splice(pos,1); if (!add) {
for (let range of getOverlappingRanges(lo, hi)) {
for (let key of Object.keys(values)) {
delete range.fields[key];
}
if (Object.keys(range.fields).length === 0) {
let pos = ranges.indexOf(range);
if (pos >= 0) {
ranges.splice(pos,1);
}
} }
} }
}
// noadd flag present when range is 0-max
if (noadd) {
API.event.emit("range.updates", ranges); API.event.emit("range.updates", ranges);
return; return;
} }
// add values to matched range or new range
if (!exact) { // flatten ranges
exact = { lo, hi, fields: {} }; ranges.push({lo, hi, fields: values});
ranges.push(exact); for (let range of ranges) {
min = Math.min(range.lo, min);
max = Math.max(range.hi, max);
for (let i=range.lo; i<=range.hi; i++) {
let slice = slices[i];
if (!slice) {
slice = slices[i] = {};
}
for (let [key,val] of Object.entries(range.fields)) {
slice[key] = val;
}
}
} }
for (let key of Object.keys(values)) {
exact.fields[key] = values[key]; // merge contiguous matching ranges
ranges.length = 0;
let range;
for (let i=min; i<=max; i++) {
let slice = slices[i];
if (slice && !range) {
range = {lo: i, hi: i, fields: slice};
} else if (slice && range && isEquals(range.fields, slice)) {
range.hi = i;
} else if (range) {
ranges.push(range);
if (slice) {
range = {lo: i, hi: i, fields: slice};
} else {
range = undefined;
}
}
} }
ranges.push(range);
updateFieldsFromSettings(settings.process);
API.show.alert("update ranges", 2);
API.event.emit("range.updates", ranges); API.event.emit("range.updates", ranges);
} }
@ -727,6 +750,7 @@
// updates editable fields that are range dependent // updates editable fields that are range dependent
function updateFieldsFromRange() { function updateFieldsFromRange() {
return;
if (settings.mode !== 'FDM' || viewMode !== VIEWS.SLICE || !settings.process.ranges) { if (settings.mode !== 'FDM' || viewMode !== VIEWS.SLICE || !settings.process.ranges) {
let okeys = Object.keys(overrides); let okeys = Object.keys(overrides);
if (okeys.length) { if (okeys.length) {
@ -1997,6 +2021,14 @@
} }
return true; return true;
} }
} else if (typeof(o1) === 'object' && typeof(o2) === 'object') {
let keys = Object.keys(Object.assign({}, o1, o2));
for (let key of keys) {
if (o1[key] !== o2[key]) {
return false;
}
}
return true;
} }
return false; return false;
} }
@ -2009,6 +2041,8 @@
return console.trace("missing scope"); return console.trace("missing scope");
} }
let lastChange = UC.lastChange();
// for each key in setrec object // for each key in setrec object
for (let key in setrec) { for (let key in setrec) {
if (!setrec.hasOwnProperty(key)) { if (!setrec.hasOwnProperty(key)) {
@ -2041,6 +2075,9 @@
} else { } else {
continue; continue;
} }
if (lastChange === uie) {
if (changes) changes[key] = nval;
}
if (!isEquals(setrec[key], nval)) { if (!isEquals(setrec[key], nval)) {
setrec[key] = nval; setrec[key] = nval;
if (changes) { if (changes) {
@ -2114,7 +2151,7 @@
} }
updateSettingsFromFields(values, undefined, changes); updateSettingsFromFields(values, undefined, changes);
if (range) { if (range) {
updateRange(range.lo, range.hi, changes, !add); updateRange(range.lo, range.hi, changes, add);
} }
} else { } else {
updateSettingsFromFields(process); updateSettingsFromFields(process);

View file

@ -30,6 +30,7 @@
prefix = "tab", prefix = "tab",
state = {}, state = {},
units = 1, units = 1,
lastChange = null,
lastBtn = null, lastBtn = null,
lastTxt = null, lastTxt = null,
lastPop = null, lastPop = null,
@ -40,6 +41,7 @@
KIRI.ui = { KIRI.ui = {
prefix: function(pre) { prefix = pre; return kiri.ui }, prefix: function(pre) { prefix = pre; return kiri.ui },
inputAction: function(fn) { inputAction = fn; return kiri.ui }, inputAction: function(fn) { inputAction = fn; return kiri.ui },
lastChange: function() { return lastChange },
checkpoint, checkpoint,
restore, restore,
refresh, refresh,
@ -684,6 +686,7 @@
} }
}); });
ip.addEventListener('blur', function(event) { ip.addEventListener('blur', function(event) {
lastChange = ip;
action(event); action(event);
if (opt.trigger) { if (opt.trigger) {
refresh(); refresh();
@ -762,6 +765,7 @@
} }
ip.setVisible = row.setVisible; ip.setVisible = row.setVisible;
ip.onchange = function(ev) { ip.onchange = function(ev) {
lastChange = ip;
action(); action();
}; };
ip.onclick = (ev) => { ip.onclick = (ev) => {