rework menu system

This commit is contained in:
2026-03-28 00:28:43 -07:00
parent 4baadd4c3e
commit 4368aeb4a0
5 changed files with 99 additions and 41 deletions

View File

@@ -404,8 +404,16 @@ function canStartCanvasRightDragZoom(target) {
}
function compareMenuNodes(a, b) {
const orderA = Number.isFinite(a?.def?.menu_order) ? a.def.menu_order : Number.MAX_SAFE_INTEGER;
const orderB = Number.isFinite(b?.def?.menu_order) ? b.def.menu_order : Number.MAX_SAFE_INTEGER;
const orderA = Number.isFinite(a?.menu_order)
? a.menu_order
: Number.isFinite(a?.def?.menu_order)
? a.def.menu_order
: Number.MAX_SAFE_INTEGER;
const orderB = Number.isFinite(b?.menu_order)
? b.menu_order
: Number.isFinite(b?.def?.menu_order)
? b.def.menu_order
: Number.MAX_SAFE_INTEGER;
if (orderA !== orderB) return orderA - orderB;
const nameA = (a?.def?.display_name || a?.className || '').toLowerCase();
@@ -615,19 +623,37 @@ function ContextMenu({ x, y, nodeDefs, onAdd, onClose, filterType, filterDirecti
if (!hasMatch) continue;
}
}
const cat = def.category || 'uncategorized';
if (!cats[cat]) {
cats[cat] = {
name: cat,
order: Number.isFinite(def.category_order) ? def.category_order : Number.MAX_SAFE_INTEGER,
items: [],
};
const menuCategories = Array.isArray(def.menu_categories) && def.menu_categories.length > 0
? def.menu_categories
: [{
category: def.category || 'uncategorized',
category_order: def.category_order,
menu_order: def.menu_order,
}];
for (const menuCategory of menuCategories) {
const cat = menuCategory?.category || def.category || 'uncategorized';
if (!cats[cat]) {
cats[cat] = {
name: cat,
order: Number.isFinite(menuCategory?.category_order)
? menuCategory.category_order
: Number.MAX_SAFE_INTEGER,
items: [],
};
}
cats[cat].order = Math.min(
cats[cat].order,
Number.isFinite(menuCategory?.category_order)
? menuCategory.category_order
: Number.MAX_SAFE_INTEGER,
);
cats[cat].items.push({
className,
def,
menu_order: Number.isFinite(menuCategory?.menu_order) ? menuCategory.menu_order : def.menu_order,
});
}
cats[cat].order = Math.min(
cats[cat].order,
Number.isFinite(def.category_order) ? def.category_order : Number.MAX_SAFE_INTEGER,
);
cats[cat].items.push({ className, def });
}
return Object.values(cats)
.map((category) => ({
@@ -642,10 +668,15 @@ function ContextMenu({ x, y, nodeDefs, onAdd, onClose, filterType, filterDirecti
if (!search.trim()) return null;
const q = search.toLowerCase();
const results = [];
const seen = new Set();
for (const category of categories) {
for (const { className, def } of category.items) {
if (seen.has(className)) continue;
const name = (def.display_name || className).toLowerCase();
if (name.includes(q)) results.push({ className, def });
if (name.includes(q)) {
results.push({ className, def });
seen.add(className);
}
}
}
return results;