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:
@@ -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'}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user