Files
racket-wiki/static/cmap/engine/drawing-collections.js
T
2026-09-03 08:40:15 +02:00

87 lines
1.9 KiB
JavaScript

/**
* Maintain renderer component order and coordinate hit-test priority.
* Derived from ionstage/cmap 0.1.3, (c) 2015 iOnStage, MIT License.
*/
import { Connector, DrawingLink as Link, DrawingNode as Node } from "./drawing-components.js";
import { Component, helper } from "./drawing-support.js";
class ComponentList extends helper.List {
constructor() {
super();
}
toFront(component) {
var data = this.data;
var index = data.indexOf(component);
if (index === -1)
return;
data.splice(index, 1);
data.push(component);
}
fromPoint(ctor, x, y) {
var data = this.data;
// The visual stack is connector controls, concepts and finally relations.
// Use that same priority for coordinate hit testing so a relation that is
// hidden behind a concept can never steal the concept's click.
var types = (ctor === Component) ? [Connector, Node, Link] : [ctor];
for (var toleranceIndex = 0; toleranceIndex < 2; toleranceIndex++) {
var tolerance = toleranceIndex === 0 ? 0 : 8;
for (var typeIndex = 0; typeIndex < types.length; typeIndex++) {
for (var i = data.length - 1; i >= 0; i--) {
var component = data[i];
if (!(component instanceof types[typeIndex]))
continue;
if (component.visible === false)
continue;
if (component.contains(x, y, tolerance))
return component;
}
}
}
return null;
}
}
class DisabledConnectorList extends helper.List {
constructor() {
super();
}
add(type, link) {
super.add( {
type: type,
link: link
});
}
remove(type, link) {
super.remove( {
type: type,
link: link
});
}
contains(type, link) {
return super.contains( {
type: type,
link: link
});
}
equal(a, b) {
return a.type === b.type && a.link === b.link;
}
}
export { ComponentList, DisabledConnectorList };