Files
drawNET_test/static/js/modules/graph/events/selection.js
T
2026-04-22 12:05:03 +09:00

56 lines
2.2 KiB
JavaScript

import { state } from '../../state.js';
export function initSelectionEvents() {
if (!state.graph) return;
state.graph.on('cell:selected', ({ cell }) => {
if (cell.isNode()) {
if (!state.selectionOrder.includes(cell.id)) {
state.selectionOrder.push(cell.id);
}
} else if (cell.isEdge()) {
// Add vertices tool for manual routing control (unless locked)
if (!cell.getData()?.locked) {
cell.addTools([{ name: 'vertices' }]);
}
// ADD S/T labels for clear identification of Start and Target
const currentLabels = cell.getLabels() || [];
cell.setLabels([
...currentLabels,
{ id: 'selection-source-label', position: { distance: 0.05 }, attrs: { text: { text: 'S', fill: '#10b981', fontSize: 10, fontWeight: 'bold' }, rect: { fill: '#ffffff', stroke: '#10b981', strokeWidth: 1, rx: 2, ry: 2 } } },
{ id: 'selection-target-label', position: { distance: 0.95 }, attrs: { text: { text: 'T', fill: '#ef4444', fontSize: 10, fontWeight: 'bold' }, rect: { fill: '#ffffff', stroke: '#ef4444', strokeWidth: 1, rx: 2, ry: 2 } } }
]);
}
});
state.graph.on('cell:unselected', ({ cell }) => {
const isLocked = cell.getData()?.locked;
if (cell.isEdge()) {
if (!isLocked) {
cell.removeTools();
} else {
// Keep boundary if locked, but remove selection-only tools if any
cell.removeTools(['vertices']);
}
// Remove selection labels safely
const labels = cell.getLabels() || [];
const filteredLabels = labels.filter(l =>
l.id !== 'selection-source-label' && l.id !== 'selection-target-label'
);
cell.setLabels(filteredLabels);
} else if (cell.isNode()) {
if (!isLocked) {
cell.removeTools();
}
}
state.selectionOrder = state.selectionOrder.filter(id => id !== cell.id);
});
state.graph.on('blank:click', () => {
state.selectionOrder = [];
});
}