Skip to content
Snippets Groups Projects
Commit 3fbd1f8d authored by Alexander Rose's avatar Alexander Rose
Browse files

StructureElementSelectionManager.tryGetRange in both directions

parent f03ce685
No related branches found
No related tags found
No related merge requests found
......@@ -108,22 +108,7 @@ class StructureElementSelectionManager {
}
if (!e) return;
let predIdx = OrderedSet.findPredecessorIndex(e.indices, OrderedSet.min(xs.indices));
if (predIdx === 0) return;
let fst;
if (predIdx < OrderedSet.size(e.indices)) {
fst = OrderedSet.getAt(e.indices, predIdx)
if (fst > OrderedSet.min(xs.indices)) fst = OrderedSet.getAt(e.indices, predIdx - 1) + 1 as StructureElement.UnitIndex;
} else {
fst = OrderedSet.getAt(e.indices, predIdx - 1) + 1 as StructureElement.UnitIndex;
}
return StructureElement.Loci(entry.selection.structure, [{
unit: e.unit,
indices: OrderedSet.ofRange(fst, OrderedSet.max(xs.indices))
}]);
return tryGetElementRange(entry.selection.structure, e, xs)
}
private prevHighlight: StructureElement.Loci | undefined = void 0;
......@@ -186,4 +171,34 @@ function remapSelectionEntry(e: SelectionEntry, s: Structure): SelectionEntry {
return {
selection: StructureElement.Loci.remap(e.selection, s)
};
}
/**
* Assumes `ref` and `ext` belong to the same unit in the same structure
*/
function tryGetElementRange(structure: Structure, ref: StructureElement.Loci['elements'][0], ext: StructureElement.Loci['elements'][0]) {
const refMin = OrderedSet.min(ref.indices)
const refMax = OrderedSet.max(ref.indices)
const extMin = OrderedSet.min(ext.indices)
const extMax = OrderedSet.max(ext.indices)
let min: number
let max: number
if (refMax < extMin) {
min = refMax + 1
max = extMax
} else if (extMax < refMin) {
min = extMin
max = refMin - 1
} else {
// TODO handle range overlap cases
return
}
return StructureElement.Loci(structure, [{
unit: ref.unit,
indices: OrderedSet.ofRange(min as StructureElement.UnitIndex, max as StructureElement.UnitIndex)
}]);
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment