Replacement for the "Active Node" panel in node editor properties sidebar. This panel is now defined in space_node.py instead of node_buttons.c. The properties have been split up into generic properties

(name, label), custom colors (closed by default) and input parameters (extra options + unlinked input socket values).
This commit is contained in:
Lukas Toenne 2013-05-29 12:43:37 +00:00
parent 9eb93a9d9c
commit 902dbbe301
2 changed files with 99 additions and 122 deletions

@ -231,8 +231,106 @@ class NODE_MT_node(Menu):
layout.operator("node.read_fullsamplelayers")
class NODE_MT_node_color_presets(Menu):
"""Predefined node color"""
bl_label = "Color Presets"
preset_subdir = "node_color"
preset_operator = "script.execute_preset"
draw = Menu.draw_preset
class NODE_MT_node_color_specials(Menu):
bl_label = "Node Color Specials"
def draw(self, context):
layout = self.layout
layout.operator("node.node_copy_color", icon='COPY_ID')
class NODE_PT_active_node_generic(Panel):
bl_space_type = 'NODE_EDITOR'
bl_region_type = 'UI'
bl_label = "Node"
# bl_options = {'HIDE_HEADER'}
@classmethod
def poll(cls, context):
space = context.space_data
return context.active_node is not None
def draw(self, context):
layout = self.layout
node = context.active_node
layout.prop(node, "name", icon='NODE')
layout.prop(node, "label", icon='NODE')
class NODE_PT_active_node_color(Panel):
bl_space_type = 'NODE_EDITOR'
bl_region_type = 'UI'
bl_label = "Color"
bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
space = context.space_data
return context.active_node is not None
def draw_header(self, context):
node = context.active_node
self.layout.prop(node, "use_custom_color", text="")
def draw(self, context):
layout = self.layout
node = context.active_node
layout.enabled = node.use_custom_color
row = layout.row()
col = row.column()
col.menu("NODE_MT_node_color_presets")
col.prop(node, "color", text="")
col = row.column(align=True)
col.operator("node.node_color_preset_add", text="", icon='ZOOMIN').remove_active = False
col.operator("node.node_color_preset_add", text="", icon='ZOOMOUT').remove_active = True
col.menu("NODE_MT_node_color_specials", text="", icon='DOWNARROW_HLT')
class NODE_PT_active_node_properties(Panel):
bl_space_type = 'NODE_EDITOR'
bl_region_type = 'UI'
bl_label = "Properties"
@classmethod
def poll(cls, context):
space = context.space_data
return context.active_node is not None
def draw(self, context):
layout = self.layout
node = context.active_node
# set "node" context pointer for the panel layout
layout.context_pointer_set("node", node)
if hasattr(node, "draw_buttons_ext"):
node.draw_buttons_ext(context, layout)
elif hasattr(node, "draw_buttons"):
node.draw_buttons(context, layout)
# XXX this could be filtered further to exclude socket types which don't have meaningful input values (e.g. cycles shader)
value_inputs = [socket for socket in node.inputs if socket.enabled and not socket.hide and not socket.is_linked]
if value_inputs:
layout.separator()
layout.label("Inputs:")
for socket in value_inputs:
row = layout.row()
socket.draw(context, row, node, socket.name)
# Node Backdrop options
class NODE_PT_properties(Panel):
class NODE_PT_backdrop(Panel):
bl_space_type = 'NODE_EDITOR'
bl_region_type = 'UI'
bl_label = "Backdrop"
@ -291,23 +389,6 @@ class NODE_PT_quality(bpy.types.Panel):
col.prop(snode, "use_hidden_preview")
class NODE_MT_node_color_presets(Menu):
"""Predefined node color"""
bl_label = "Color Presets"
preset_subdir = "node_color"
preset_operator = "script.execute_preset"
draw = Menu.draw_preset
class NODE_MT_node_color_specials(Menu):
bl_label = "Node Color Specials"
def draw(self, context):
layout = self.layout
layout.operator("node.node_copy_color", icon='COPY_ID')
class NODE_UL_interface_sockets(bpy.types.UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
socket = item

@ -65,102 +65,6 @@ static int active_nodetree_poll(const bContext *C, PanelType *UNUSED(pt))
return (snode && snode->nodetree);
}
/* poll callback for active node */
static int active_node_poll(const bContext *C, PanelType *UNUSED(pt))
{
SpaceNode *snode = CTX_wm_space_node(C);
return (snode && snode->edittree && nodeGetActive(snode->edittree));
}
/* active node */
static void active_node_panel(const bContext *C, Panel *pa)
{
SpaceNode *snode = CTX_wm_space_node(C);
bNodeTree *ntree = (snode) ? snode->edittree : NULL;
bNode *node = (ntree) ? nodeGetActive(ntree) : NULL; // xxx... for editing group nodes
bNodeSocket *sock;
uiLayout *layout, *row, *col, *sub;
PointerRNA ptr, opptr;
bool show_inputs;
/* verify pointers, and create RNA pointer for the node */
if (ELEM(NULL, ntree, node))
return;
//if (node->id) /* for group nodes */
// RNA_pointer_create(node->id, &RNA_Node, node, &ptr);
//else
RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
layout = uiLayoutColumn(pa->layout, FALSE);
uiLayoutSetContextPointer(layout, "node", &ptr);
/* draw this node's name, etc. */
uiItemR(layout, &ptr, "label", 0, NULL, ICON_NODE);
uiItemS(layout);
uiItemR(layout, &ptr, "name", 0, NULL, ICON_NODE);
uiItemS(layout);
uiItemO(layout, NULL, 0, "NODE_OT_hide_socket_toggle");
uiItemS(layout);
uiItemS(layout);
row = uiLayoutRow(layout, FALSE);
col = uiLayoutColumn(row, TRUE);
uiItemM(col, (bContext *)C, "NODE_MT_node_color_presets", NULL, 0);
uiItemR(col, &ptr, "use_custom_color", UI_ITEM_R_ICON_ONLY, NULL, ICON_NONE);
sub = uiLayoutRow(col, FALSE);
if (!(node->flag & NODE_CUSTOM_COLOR))
uiLayoutSetEnabled(sub, FALSE);
uiItemR(sub, &ptr, "color", 0, "", ICON_NONE);
col = uiLayoutColumn(row, TRUE);
uiItemO(col, "", ICON_ZOOMIN, "node.node_color_preset_add");
opptr = uiItemFullO(col, "node.node_color_preset_add", "", ICON_ZOOMOUT, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS);
RNA_boolean_set(&opptr, "remove_active", 1);
uiItemM(col, (bContext *)C, "NODE_MT_node_color_specials", "", ICON_DOWNARROW_HLT);
/* draw this node's settings */
if (node->typeinfo && node->typeinfo->uifuncbut) {
uiItemS(layout);
uiItemS(layout);
node->typeinfo->uifuncbut(layout, (bContext *)C, &ptr);
}
else if (node->typeinfo && node->typeinfo->uifunc) {
uiItemS(layout);
uiItemS(layout);
node->typeinfo->uifunc(layout, (bContext *)C, &ptr);
}
uiItemS(layout);
/* socket input values */
/* XXX this is not quite perfect yet, it still shows sockets without meaningful input values
* and does not yet use the socket link template - but better than nothing.
* Eventually could move this panel to python
* and leave it up to the individual node system implementation.
*/
show_inputs = false;
for (sock = node->inputs.first; sock; sock = sock->next) {
if (!nodeSocketIsHidden(sock) && !(sock->flag & SOCK_IN_USE)) {
show_inputs = true;
break;
}
}
if (show_inputs) {
uiItemL(layout, "Inputs:", 0);
for (sock = node->inputs.first; sock; sock = sock->next) {
if (!nodeSocketIsHidden(sock) && !(sock->flag & SOCK_IN_USE)) {
uiLayout *row = uiLayoutRow(layout, false);
PointerRNA sock_ptr;
RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &sock_ptr);
sock->typeinfo->draw((bContext *)C, row, &sock_ptr, &ptr, sock->name);
}
}
}
}
static int node_sockets_poll(const bContext *C, PanelType *UNUSED(pt))
{
SpaceNode *snode = CTX_wm_space_node(C);
@ -275,14 +179,6 @@ void node_buttons_register(ARegionType *art)
{
PanelType *pt;
pt = MEM_callocN(sizeof(PanelType), "spacetype node panel active node");
strcpy(pt->idname, "NODE_PT_item");
strcpy(pt->label, N_("Active Node"));
strcpy(pt->translation_context, BLF_I18NCONTEXT_DEFAULT_BPYRNA);
pt->draw = active_node_panel;
pt->poll = active_node_poll;
BLI_addtail(&art->paneltypes, pt);
pt = MEM_callocN(sizeof(PanelType), "spacetype node panel node sockets");
strcpy(pt->idname, "NODE_PT_sockets");
strcpy(pt->label, N_("Sockets"));