complete range prototype
This commit is contained in:
parent
081a3205bf
commit
1447dd5336
2 changed files with 72 additions and 31 deletions
|
|
@ -682,44 +682,67 @@
|
|||
}
|
||||
|
||||
// set process override values for a range
|
||||
function updateRange(lo, hi, values, noadd) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
function updateRange(lo, hi, values, add) {
|
||||
let ranges = settings.process.ranges;
|
||||
// clear out empty ranges
|
||||
if (empty.length) {
|
||||
for (let range of empty) {
|
||||
let pos = ranges.indexOf(range);
|
||||
if (pos >= 0) {
|
||||
ranges.splice(pos,1);
|
||||
let slices = {};
|
||||
let min = lo;
|
||||
let max = hi;
|
||||
|
||||
// just remove values from matching ranges
|
||||
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);
|
||||
return;
|
||||
}
|
||||
// add values to matched range or new range
|
||||
if (!exact) {
|
||||
exact = { lo, hi, fields: {} };
|
||||
ranges.push(exact);
|
||||
|
||||
// flatten ranges
|
||||
ranges.push({lo, hi, fields: values});
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
@ -727,6 +750,7 @@
|
|||
|
||||
// updates editable fields that are range dependent
|
||||
function updateFieldsFromRange() {
|
||||
return;
|
||||
if (settings.mode !== 'FDM' || viewMode !== VIEWS.SLICE || !settings.process.ranges) {
|
||||
let okeys = Object.keys(overrides);
|
||||
if (okeys.length) {
|
||||
|
|
@ -1997,6 +2021,14 @@
|
|||
}
|
||||
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;
|
||||
}
|
||||
|
|
@ -2009,6 +2041,8 @@
|
|||
return console.trace("missing scope");
|
||||
}
|
||||
|
||||
let lastChange = UC.lastChange();
|
||||
|
||||
// for each key in setrec object
|
||||
for (let key in setrec) {
|
||||
if (!setrec.hasOwnProperty(key)) {
|
||||
|
|
@ -2041,6 +2075,9 @@
|
|||
} else {
|
||||
continue;
|
||||
}
|
||||
if (lastChange === uie) {
|
||||
if (changes) changes[key] = nval;
|
||||
}
|
||||
if (!isEquals(setrec[key], nval)) {
|
||||
setrec[key] = nval;
|
||||
if (changes) {
|
||||
|
|
@ -2114,7 +2151,7 @@
|
|||
}
|
||||
updateSettingsFromFields(values, undefined, changes);
|
||||
if (range) {
|
||||
updateRange(range.lo, range.hi, changes, !add);
|
||||
updateRange(range.lo, range.hi, changes, add);
|
||||
}
|
||||
} else {
|
||||
updateSettingsFromFields(process);
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
prefix = "tab",
|
||||
state = {},
|
||||
units = 1,
|
||||
lastChange = null,
|
||||
lastBtn = null,
|
||||
lastTxt = null,
|
||||
lastPop = null,
|
||||
|
|
@ -40,6 +41,7 @@
|
|||
KIRI.ui = {
|
||||
prefix: function(pre) { prefix = pre; return kiri.ui },
|
||||
inputAction: function(fn) { inputAction = fn; return kiri.ui },
|
||||
lastChange: function() { return lastChange },
|
||||
checkpoint,
|
||||
restore,
|
||||
refresh,
|
||||
|
|
@ -684,6 +686,7 @@
|
|||
}
|
||||
});
|
||||
ip.addEventListener('blur', function(event) {
|
||||
lastChange = ip;
|
||||
action(event);
|
||||
if (opt.trigger) {
|
||||
refresh();
|
||||
|
|
@ -762,6 +765,7 @@
|
|||
}
|
||||
ip.setVisible = row.setVisible;
|
||||
ip.onchange = function(ev) {
|
||||
lastChange = ip;
|
||||
action();
|
||||
};
|
||||
ip.onclick = (ev) => {
|
||||
|
|
|
|||
Loading…
Reference in a new issue