mirror of
https://github.com/alicevision/Meshroom.git
synced 2025-08-06 10:18:42 +02:00
[ui] add support for node categories
This commit is contained in:
parent
3adb825f2a
commit
3d33134ca9
4 changed files with 68 additions and 17 deletions
|
@ -420,6 +420,7 @@ class Node(object):
|
|||
size = StaticNodeSize(1)
|
||||
parallelization = None
|
||||
documentation = ''
|
||||
category = 'Other'
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
|
|
@ -117,7 +117,7 @@ class MeshroomApp(QApplication):
|
|||
components.registerTypes()
|
||||
|
||||
# expose available node types that can be instantiated
|
||||
self.engine.rootContext().setContextProperty("_nodeTypes", sorted(nodesDesc.keys()))
|
||||
self.engine.rootContext().setContextProperty("_nodeTypes", {n: {"category": nodesDesc[n].category} for n in sorted(nodesDesc.keys())})
|
||||
|
||||
# instantiate Reconstruction object
|
||||
self._undoStack = commands.UndoStack(self)
|
||||
|
|
|
@ -34,6 +34,11 @@ FocusScope {
|
|||
focus: true
|
||||
Layout.fillWidth: true
|
||||
selectByMouse: true
|
||||
|
||||
// ensure the field has focus when the text is modified
|
||||
onTextChanged: {
|
||||
forceActiveFocus()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -134,6 +134,22 @@ Item {
|
|||
// add node via the proper command in uigraph
|
||||
var node = uigraph.addNewNode(nodeType, spawnPosition)
|
||||
selectNode(node)
|
||||
close()
|
||||
}
|
||||
|
||||
function parseCategories()
|
||||
{
|
||||
// organize nodes based on their category
|
||||
// {"category1": ["node1", "node2"], "category2": ["node3", "node4"]}
|
||||
let categories = {};
|
||||
for (const [name, data] of Object.entries(root.nodeTypesModel)) {
|
||||
let category = data["category"];
|
||||
if (categories[category] === undefined) {
|
||||
categories[category] = [];
|
||||
}
|
||||
categories[category].push(name)
|
||||
}
|
||||
return categories
|
||||
}
|
||||
|
||||
onVisibleChanged: {
|
||||
|
@ -150,11 +166,10 @@ Item {
|
|||
width: parent.width
|
||||
}
|
||||
|
||||
Repeater {
|
||||
model: root.nodeTypesModel
|
||||
|
||||
// Create Menu items from available node types model
|
||||
delegate: MenuItem {
|
||||
// menuItemDelegate is wrapped in a component so it can be used in both the search bar and sub-menus
|
||||
Component {
|
||||
id: menuItemDelegateComponent
|
||||
MenuItem {
|
||||
id: menuItemDelegate
|
||||
font.pointSize: 8
|
||||
padding: 3
|
||||
|
@ -169,17 +184,20 @@ Item {
|
|||
Keys.forwardTo: [searchBar.textField]
|
||||
Keys.onPressed: {
|
||||
event.accepted = false;
|
||||
switch(event.key)
|
||||
{
|
||||
switch(event.key) {
|
||||
case Qt.Key_Return:
|
||||
case Qt.Key_Enter:
|
||||
// create node on validation (Enter/Return keys)
|
||||
newNodeMenu.createNode(modelData);
|
||||
newNodeMenu.close();
|
||||
event.accepted = true;
|
||||
break;
|
||||
case Qt.Key_Up:
|
||||
case Qt.Key_Down:
|
||||
case Qt.Key_Left:
|
||||
case Qt.Key_Right:
|
||||
break; // ignore if arrow key was pressed to let the menu be controlled
|
||||
default:
|
||||
searchBar.textField.forceActiveFocus();
|
||||
searchBar.forceActiveFocus();
|
||||
}
|
||||
}
|
||||
// Create node on mouse click
|
||||
|
@ -199,6 +217,33 @@ Item {
|
|||
]
|
||||
}
|
||||
}
|
||||
|
||||
Repeater {
|
||||
id: nodeMenuRepeater
|
||||
model: searchBar.text != "" ? Object.keys(root.nodeTypesModel) : undefined
|
||||
|
||||
// create Menu items from available items
|
||||
delegate: menuItemDelegateComponent
|
||||
}
|
||||
|
||||
// Dynamically add the menu categories
|
||||
Instantiator {
|
||||
model: !(searchBar.text != "") ? Object.keys(newNodeMenu.parseCategories()) : undefined
|
||||
onObjectAdded: newNodeMenu.insertMenu(index+1, object ) // add sub-menu under the search bar
|
||||
onObjectRemoved: newNodeMenu.removeMenu(object)
|
||||
|
||||
delegate: Menu {
|
||||
title: modelData
|
||||
id: newNodeSubMenu
|
||||
|
||||
Instantiator {
|
||||
model: newNodeMenu.visible && newNodeSubMenu.activeFocus ? newNodeMenu.parseCategories()[modelData] : undefined
|
||||
onObjectAdded: newNodeSubMenu.insertItem(index, object)
|
||||
onObjectRemoved: newNodeSubMenu.removeItem(object)
|
||||
delegate: menuItemDelegateComponent
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Informative contextual menu when graph is read-only
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue