Nodes: Deactivate viewer if shortcut exists and viewer is active

Original right click select:
https://blender.community/c/rightclickselect/wRzz/

Pressing 1,2,3,... to activate a viewer with shortcut now toggles that
viewer instead of always activating it. See PR description for examples

The code is generic but the compositor requires one viewer to be active
so only geometry nodes viewers are supported.

Pull Request: https://projects.blender.org/blender/blender/pulls/145509
This commit is contained in:
Habib Gahbiche
2025-09-10 15:17:16 +02:00
parent c954d6cdfd
commit ac84e076db
4 changed files with 51 additions and 2 deletions

View File

@@ -690,7 +690,7 @@ class NODE_OT_viewer_shortcut_set(Operator):
class NODE_OT_viewer_shortcut_get(Operator):
"""Activate a specific viewer node using 1,2,..,9 keys"""
"""Toggle a specific viewer node using 1,2,..,9 keys"""
bl_idname = "node.viewer_shortcut_get"
bl_label = "Fast Preview"
bl_options = {'REGISTER', 'UNDO'}
@@ -724,7 +724,7 @@ class NODE_OT_viewer_shortcut_get(Operator):
return {'CANCELLED'}
with bpy.context.temp_override(node=viewer_node):
bpy.ops.node.activate_viewer()
bpy.ops.node.toggle_viewer()
return {'FINISHED'}

View File

@@ -1927,6 +1927,53 @@ void NODE_OT_deactivate_viewer(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
static wmOperatorStatus node_toggle_viewer_exec(bContext *C, wmOperator * /*op*/)
{
SpaceNode *snode = CTX_wm_space_node(C);
WorkSpace *workspace = CTX_wm_workspace(C);
PointerRNA ptr = CTX_data_pointer_get(C, "node");
bNode *node = nullptr;
bNodeTree *ntree = nullptr;
wmOperatorStatus ret = OPERATOR_FINISHED;
if (ptr.data) {
node = static_cast<bNode *>(ptr.data);
ntree = reinterpret_cast<bNodeTree *>(ptr.owner_id);
}
else if (snode && snode->edittree) {
ntree = snode->edittree;
node = bke::node_get_active(*ntree);
}
if (!node) {
return OPERATOR_CANCELLED;
}
bNode *active_viewer = viewer_path::find_geometry_nodes_viewer(workspace->viewer_path, *snode);
if (node == active_viewer) {
ret = WM_operator_name_call(
C, "NODE_OT_deactivate_viewer", wm::OpCallContext::InvokeDefault, nullptr, nullptr);
}
else {
ret = WM_operator_name_call(
C, "NODE_OT_activate_viewer", wm::OpCallContext::InvokeDefault, nullptr, nullptr);
}
return ret;
}
void NODE_OT_toggle_viewer(wmOperatorType *ot)
{
ot->name = "Toggle Viewer Node";
ot->description = "Toggle selected viewer node in compositor and geometry nodes";
ot->idname = "NODE_OT_toggle_viewer";
ot->exec = node_toggle_viewer_exec;
ot->poll = ED_operator_node_active;
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
static wmOperatorStatus node_options_toggle_exec(bContext *C, wmOperator * /*op*/)
{
SpaceNode *snode = CTX_wm_space_node(C);

View File

@@ -385,6 +385,7 @@ void NODE_OT_options_toggle(wmOperatorType *ot);
void NODE_OT_node_copy_color(wmOperatorType *ot);
void NODE_OT_deactivate_viewer(wmOperatorType *ot);
void NODE_OT_activate_viewer(wmOperatorType *ot);
void NODE_OT_toggle_viewer(wmOperatorType *ot);
void NODE_OT_test_inlining_shader_nodes(wmOperatorType *ot);
void NODE_OT_read_viewlayers(wmOperatorType *ot);

View File

@@ -45,6 +45,7 @@ void node_operatortypes()
WM_operatortype_append(NODE_OT_node_copy_color);
WM_operatortype_append(NODE_OT_deactivate_viewer);
WM_operatortype_append(NODE_OT_activate_viewer);
WM_operatortype_append(NODE_OT_toggle_viewer);
WM_operatortype_append(NODE_OT_test_inlining_shader_nodes);
WM_operatortype_append(NODE_OT_duplicate);