diff options
Diffstat (limited to 'source/blender/editors/space_node/node_buttons.c')
-rw-r--r-- | source/blender/editors/space_node/node_buttons.c | 182 |
1 files changed, 89 insertions, 93 deletions
diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c index 0aba45ceafc..c9a0c827a09 100644 --- a/source/blender/editors/space_node/node_buttons.c +++ b/source/blender/editors/space_node/node_buttons.c @@ -93,59 +93,35 @@ static bool node_tree_interface_poll(const bContext *C, PanelType *UNUSED(pt)) (snode->edittree->inputs.first || snode->edittree->outputs.first)); } -static bool node_tree_find_active_socket(bNodeTree *ntree, - bNodeSocket **r_sock, - eNodeSocketInOut *r_in_out) +static bNodeSocket *node_tree_find_active_socket(bNodeTree *ntree, const eNodeSocketInOut in_out) { - LISTBASE_FOREACH (bNodeSocket *, socket, &ntree->inputs) { + ListBase *sockets = (in_out == SOCK_IN) ? &ntree->inputs : &ntree->outputs; + LISTBASE_FOREACH (bNodeSocket *, socket, sockets) { if (socket->flag & SELECT) { - *r_sock = socket; - *r_in_out = SOCK_IN; - return true; + return socket; } } - LISTBASE_FOREACH (bNodeSocket *, socket, &ntree->outputs) { - if (socket->flag & SELECT) { - *r_sock = socket; - *r_in_out = SOCK_OUT; - return true; - } - } - - *r_sock = NULL; - *r_in_out = 0; - return false; + return NULL; } -static void node_tree_interface_panel(const bContext *C, Panel *panel) +static void draw_socket_list(const bContext *C, + uiLayout *layout, + bNodeTree *ntree, + const eNodeSocketInOut in_out) { - SpaceNode *snode = CTX_wm_space_node(C); /* NULL checked in poll function. */ - bNodeTree *ntree = snode->edittree; /* NULL checked in poll function. */ - uiLayout *layout = panel->layout; - - PointerRNA ptr; - RNA_id_pointer_create((ID *)ntree, &ptr); - - bNodeSocket *socket; - eNodeSocketInOut in_out; - node_tree_find_active_socket(ntree, &socket, &in_out); - PointerRNA sockptr; - RNA_pointer_create((ID *)ntree, &RNA_NodeSocketInterface, socket, &sockptr); - - uiLayout *row = uiLayoutRow(layout, false); + PointerRNA tree_ptr; + RNA_id_pointer_create((ID *)ntree, &tree_ptr); - uiLayout *split = uiLayoutRow(row, true); - uiLayout *col = uiLayoutColumn(split, true); - wmOperatorType *ot = WM_operatortype_find("NODE_OT_tree_socket_add", false); - uiItemL(col, IFACE_("Inputs:"), ICON_NONE); - uiTemplateList(col, + uiLayout *split = uiLayoutRow(layout, false); + uiLayout *list_col = uiLayoutColumn(split, true); + uiTemplateList(list_col, (bContext *)C, "NODE_UL_interface_sockets", - "inputs", - &ptr, - "inputs", - &ptr, - "active_input", + (in_out == SOCK_IN) ? "inputs" : "outputs", + &tree_ptr, + (in_out == SOCK_IN) ? "inputs" : "outputs", + &tree_ptr, + (in_out == SOCK_IN) ? "active_input" : "active_output", NULL, 0, 0, @@ -154,70 +130,90 @@ static void node_tree_interface_panel(const bContext *C, Panel *panel) false, false); PointerRNA opptr; - uiItemFullO_ptr(col, ot, "", ICON_PLUS, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr); - RNA_enum_set(&opptr, "in_out", SOCK_IN); + uiLayout *ops_col = uiLayoutColumn(split, false); + uiLayout *add_remove_col = uiLayoutColumn(ops_col, true); + wmOperatorType *ot = WM_operatortype_find("NODE_OT_tree_socket_add", false); + uiItemFullO_ptr(add_remove_col, ot, "", ICON_ADD, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr); + RNA_enum_set(&opptr, "in_out", in_out); + ot = WM_operatortype_find("NODE_OT_tree_socket_remove", false); + uiItemFullO_ptr(add_remove_col, ot, "", ICON_REMOVE, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr); + RNA_enum_set(&opptr, "in_out", in_out); - col = uiLayoutColumn(split, true); - uiItemL(col, IFACE_("Outputs:"), ICON_NONE); - uiTemplateList(col, - (bContext *)C, - "NODE_UL_interface_sockets", - "outputs", - &ptr, - "outputs", - &ptr, - "active_output", - NULL, - 0, - 0, - 0, - 0, - false, - false); - uiItemFullO_ptr(col, ot, "", ICON_PLUS, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr); - RNA_enum_set(&opptr, "in_out", SOCK_OUT); + uiItemS(ops_col); + uiLayout *up_down_col = uiLayoutColumn(ops_col, true); ot = WM_operatortype_find("NODE_OT_tree_socket_move", false); - col = uiLayoutColumn(row, true); - uiItemFullO_ptr(col, ot, "", ICON_TRIA_UP, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr); + uiItemFullO_ptr(up_down_col, ot, "", ICON_TRIA_UP, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr); RNA_enum_set(&opptr, "direction", 1); - uiItemFullO_ptr(col, ot, "", ICON_TRIA_DOWN, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr); + RNA_enum_set(&opptr, "in_out", in_out); + uiItemFullO_ptr(up_down_col, ot, "", ICON_TRIA_DOWN, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr); RNA_enum_set(&opptr, "direction", 2); + RNA_enum_set(&opptr, "in_out", in_out); - if (socket) { - row = uiLayoutRow(layout, true); - uiItemR(row, &sockptr, "name", 0, NULL, ICON_NONE); - uiItemO(row, "", ICON_X, "NODE_OT_tree_socket_remove"); + bNodeSocket *socket = node_tree_find_active_socket(ntree, in_out); + if (socket != NULL) { + uiLayoutSetPropSep(layout, true); + uiLayoutSetPropDecorate(layout, false); + PointerRNA socket_ptr; + RNA_pointer_create((ID *)ntree, &RNA_NodeSocketInterface, socket, &socket_ptr); + uiItemR(layout, &socket_ptr, "name", 0, NULL, ICON_NONE); if (socket->typeinfo->interface_draw) { - uiItemS(layout); - socket->typeinfo->interface_draw((bContext *)C, layout, &sockptr); + socket->typeinfo->interface_draw((bContext *)C, layout, &socket_ptr); } } } +static void node_tree_interface_inputs_panel(const bContext *C, Panel *panel) +{ + SpaceNode *snode = CTX_wm_space_node(C); /* NULL checked in poll function. */ + bNodeTree *ntree = snode->edittree; /* NULL checked in poll function. */ + + draw_socket_list(C, panel->layout, ntree, SOCK_IN); +} + +static void node_tree_interface_outputs_panel(const bContext *C, Panel *panel) +{ + SpaceNode *snode = CTX_wm_space_node(C); /* NULL checked in poll function. */ + bNodeTree *ntree = snode->edittree; /* NULL checked in poll function. */ + + draw_socket_list(C, panel->layout, ntree, SOCK_OUT); +} + /* ******************* node buttons registration ************** */ void node_buttons_register(ARegionType *art) { - PanelType *pt; - - pt = MEM_callocN(sizeof(PanelType), "spacetype node panel node sockets"); - strcpy(pt->idname, "NODE_PT_sockets"); - strcpy(pt->category, N_("Node")); - strcpy(pt->label, N_("Sockets")); - strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA); - pt->draw = node_sockets_panel; - pt->poll = node_sockets_poll; - pt->flag |= PANEL_TYPE_DEFAULT_CLOSED; - BLI_addtail(&art->paneltypes, pt); - - pt = MEM_callocN(sizeof(PanelType), "spacetype node panel tree interface"); - strcpy(pt->idname, "NODE_PT_node_tree_interface"); - strcpy(pt->category, N_("Node")); - strcpy(pt->label, N_("Interface")); - strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA); - pt->draw = node_tree_interface_panel; - pt->poll = node_tree_interface_poll; - BLI_addtail(&art->paneltypes, pt); + { + PanelType *pt = MEM_callocN(sizeof(PanelType), __func__); + strcpy(pt->idname, "NODE_PT_sockets"); + strcpy(pt->category, N_("Node")); + strcpy(pt->label, N_("Sockets")); + strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA); + pt->draw = node_sockets_panel; + pt->poll = node_sockets_poll; + pt->flag |= PANEL_TYPE_DEFAULT_CLOSED; + BLI_addtail(&art->paneltypes, pt); + } + + { + PanelType *pt = MEM_callocN(sizeof(PanelType), __func__); + strcpy(pt->idname, "NODE_PT_node_tree_interface_inputs"); + strcpy(pt->category, N_("Node")); + strcpy(pt->label, N_("Inputs")); + strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA); + pt->draw = node_tree_interface_inputs_panel; + pt->poll = node_tree_interface_poll; + BLI_addtail(&art->paneltypes, pt); + } + { + PanelType *pt = MEM_callocN(sizeof(PanelType), __func__); + strcpy(pt->idname, "NODE_PT_node_tree_interface_outputs"); + strcpy(pt->category, N_("Node")); + strcpy(pt->label, N_("Outputs")); + strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA); + pt->draw = node_tree_interface_outputs_panel; + pt->poll = node_tree_interface_poll; + BLI_addtail(&art->paneltypes, pt); + } } |