Files
drawNET/static/js/modules/graph/styles/registry.js
T

55 lines
1.7 KiB
JavaScript

import { logger } from '../../utils/logger.js';
/**
* graph/styles/registry.js - Central registry for custom X6 shapes (Plugin System)
*/
class ShapeRegistry {
constructor() {
this.shapes = new Map();
}
/**
* Registers a new shape plugin
* @param {string} type - Node type name (e.g., 'browser', 'triangle')
* @param {Object} options - Shape configuration
* @param {string} options.shape - The X6 shape name to register (e.g., 'drawnet-browser')
* @param {Object} options.definition - The X6 registration object (inherit, markup, attrs, etc.)
* @param {Object} options.mapping - Custom mapping logic or attribute overrides
* @param {string} options.icon - Default FontAwesome icon (if applicable)
*/
register(type, options) {
this.shapes.set(type.toLowerCase(), {
type,
...options
});
}
get(type) {
return this.shapes.get(type.toLowerCase());
}
getAll() {
return Array.from(this.shapes.values());
}
/**
* Internal X6 registration helper
*/
install(X6) {
if (!X6) return;
const registeredShapes = new Set();
this.shapes.forEach((plugin) => {
if (plugin.shape && plugin.definition && !registeredShapes.has(plugin.shape)) {
try {
X6.Graph.registerNode(plugin.shape, plugin.definition);
registeredShapes.add(plugin.shape);
} catch (e) {
logger.high(`Shape [${plugin.shape}] registration failed:`, e);
}
}
});
}
}
export const shapeRegistry = new ShapeRegistry();