diff --git a/Libraries/zui b/Libraries/zui index 5505ea57..28108ff3 160000 --- a/Libraries/zui +++ b/Libraries/zui @@ -1 +1 @@ -Subproject commit 5505ea57a51bb1816d5bd55a6b58ea3c25037aa1 +Subproject commit 28108ff3a503cf3564df0a995507b56dd24e0ea9 diff --git a/Sources/arm/Config.hx b/Sources/arm/Config.hx index a07dbd2c..3200589a 100644 --- a/Sources/arm/Config.hx +++ b/Sources/arm/Config.hx @@ -55,6 +55,7 @@ class Config { C.keymap.toggle_node_editor = "tab"; C.keymap.import_assets = "ctrl+shift+i"; C.keymap.export_textures = "ctrl+shift+e"; + C.keymap.node_search = "space"; } return C; diff --git a/Sources/arm/ui/UINodes.hx b/Sources/arm/ui/UINodes.hx index a0cf59bd..87d90bc7 100644 --- a/Sources/arm/ui/UINodes.hx +++ b/Sources/arm/ui/UINodes.hx @@ -52,6 +52,9 @@ class UINodes extends iron.Trait { var mstartedlast = false; public var changed = false; var recompileMat = false; // Mat preview + var nodeSearchSpawn:TNode = null; + var nodeSearchOffset = 0; + var nodeSearchLast = ""; public var grid:kha.Image = null; public var hwnd = Id.handle(); @@ -228,6 +231,64 @@ class UINodes extends iron.Trait { if (keyboard.started("up")) for (n in nodes.nodesSelected) n.y -= 1; else if (keyboard.started("down")) for (n in nodes.nodesSelected) n.y += 1; } + + // Node search popup + if (keyboard.started("space")) { + var searchHandle = Id.handle(); + var first = true; + UIMenu.show(function(ui:Zui) { + ui.fill(0, 0, ui._w, ui.t.ELEMENT_H * 8, ui.t.WINDOW_BG_COL); + ui.textInput(searchHandle, ""); + ui.changed = false; + if (first) { + first = false; + ui.startTextEdit(searchHandle); // Focus search bar + ui.textSelectedCurrentText = searchHandle.text; + searchHandle.text = ""; + nodeSearchLast = ""; + + } + var search = ui.textSelectedCurrentText.toLowerCase(); + if (searchHandle.text != "") search = searchHandle.text; + if (search != nodeSearchLast) { + nodeSearchOffset = 0; + nodeSearchLast = search; + } + if (ui.isKeyDown) { // Move selection + if (ui.key == kha.input.KeyCode.Down && nodeSearchOffset < 6) nodeSearchOffset++; + if (ui.key == kha.input.KeyCode.Up && nodeSearchOffset > 0) nodeSearchOffset--; + } + var enter = keyboard.down("enter"); + var count = 0; + var BUTTON_COL = ui.t.BUTTON_COL; + for (list in NodeCreator.list) { + for (n in list) { + if (n.name.toLowerCase().indexOf(search) >= 0) { + ui.t.BUTTON_COL = count == nodeSearchOffset ? ui.t.HIGHLIGHT_COL : ui.t.WINDOW_BG_COL; + if (ui.button(n.name, Left) || (enter && count == nodeSearchOffset)) { + nodeSearchSpawn = makeNode(n, nodes, canvas); // Spawn selected node + canvas.nodes.push(nodeSearchSpawn); + nodes.nodesSelected = [nodeSearchSpawn]; + nodes.nodesDrag = true; + hwnd.redraws = 2; + if (enter) { + ui.changed = true; + count = 6; // Trigger break + } + } + if (++count > 6) break; + } + } + if (count > 6) break; + } + ui.t.BUTTON_COL = BUTTON_COL; + }); + } + if (nodeSearchSpawn != null) { + ui.inputX = mouse.x + App.x(); // Fix inputDX after popup removal + ui.inputY = mouse.y + App.y(); + nodeSearchSpawn = null; + } } public function getNodeX():Int { diff --git a/Sources/arm/ui/UITrait.hx b/Sources/arm/ui/UITrait.hx index d1da43e7..8ef4c8b7 100644 --- a/Sources/arm/ui/UITrait.hx +++ b/Sources/arm/ui/UITrait.hx @@ -1798,6 +1798,7 @@ class UITrait extends iron.Trait { hwnd2.redraws = 2; }); } + // var gridSnap = ui.check(Id.handle({selected: false}), "Node Grid Snap"); } ui.separator();