Fix: wasn't able to rename node group nodetree name, or access the nodetree at all...
authorMatt Ebb <matt@mke3.net>
Wed, 13 Jan 2010 06:35:12 +0000 (06:35 +0000)
committerMatt Ebb <matt@mke3.net>
Wed, 13 Jan 2010 06:35:12 +0000 (06:35 +0000)
can switch between them too.

Wrapped group nodes in RNA as part of this.

source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface_templates.c
source/blender/editors/space_node/drawnode.c
source/blender/editors/space_node/node_draw.c
source/blender/editors/space_node/node_intern.h
source/blender/makesrna/RNA_access.h
source/blender/makesrna/intern/rna_nodetree.c

index 0b7499b..5344c1a 100644 (file)
@@ -642,6 +642,8 @@ void uiTemplateHeader(uiLayout *layout, struct bContext *C, int menus);
 void uiTemplateDopeSheetFilter(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
 void uiTemplateID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
        char *newop, char *openop, char *unlinkop);
+void uiTemplateIDBrowse(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
+                                 char *newop, char *openop, char *unlinkop);
 void uiTemplateIDPreview(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
        char *newop, char *openop, char *unlinkop, int rows, int cols);
 void uiTemplateAnyID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, 
index 106875e..e00cd89 100644 (file)
@@ -446,12 +446,11 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
        uiBlockEndAlign(block);
 }
 
-static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, int previews, int prv_rows, int prv_cols)
+static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, int flag, int prv_rows, int prv_cols)
 {
        TemplateID *template;
        PropertyRNA *prop;
        StructRNA *type;
-       int flag;
 
        prop= RNA_struct_find_property(ptr, propname);
 
@@ -466,14 +465,10 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char
        template->prv_rows = prv_rows;
        template->prv_cols = prv_cols;
        
-       flag= UI_ID_BROWSE|UI_ID_RENAME|UI_ID_DELETE;
-
        if(newop)
                flag |= UI_ID_ADD_NEW;
        if(openop)
                flag |= UI_ID_OPEN;
-       if(previews)
-               flag |= UI_ID_PREVIEWS;
        
        type= RNA_property_pointer_type(ptr, prop);
        template->idlb= wich_libbase(CTX_data_main(C), RNA_type_to_ID_code(type));
@@ -492,12 +487,17 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char
 
 void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop)
 {
-       ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, 0, 0, 0);
+       ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_DELETE, 0, 0);
+}
+
+void uiTemplateIDBrowse(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop)
+{
+       ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, UI_ID_BROWSE|UI_ID_RENAME, 0, 0);
 }
 
 void uiTemplateIDPreview(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, int rows, int cols)
 {
-       ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, 1, rows, cols);
+       ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_DELETE|UI_ID_PREVIEWS, rows, cols);
 }
 
 /************************ ID Chooser Template ***************************/
index 7f8bf26..5c5e316 100644 (file)
 
 #include "node_intern.h"
 
-/* ****************** GENERAL CALLBACKS FOR NODES ***************** */
-
-#if 0
-/* XXX not used yet, make compiler happy :) */
-static void node_group_alone_cb(bContext *C, void *node_v, void *unused_v)
-{
-       bNode *node= node_v;
-       
-       nodeCopyGroup(node);
-
-       // allqueue(REDRAWNODE, 0);
-}
 
 /* ****************** BUTTON CALLBACKS FOR ALL TREES ***************** */
 
-static void node_buts_group(uiLayout *layout, bContext *C, PointerRNA *ptr)
+void node_buts_group(uiLayout *layout, bContext *C, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutAbsoluteBlock(layout);
-       bNode *node= ptr->data;
-       rctf *butr= &node->butr;
-
-       if(node->id) {
-               uiBut *bt;
-               short width;
-               
-               uiBlockBeginAlign(block);
-               
-               /* name button */
-               width= (short)(butr->xmax-butr->xmin - (node->id->us>1?19.0f:0.0f));
-               bt= uiDefBut(block, TEX, B_NOP, "NT:",
-                                        (short)butr->xmin, (short)butr->ymin, width, 19, 
-                                        node->id->name+2, 0.0, 19.0, 0, 0, "NodeTree name");
-               uiButSetFunc(bt, node_ID_title_cb, node, NULL);
-               
-               /* user amount */
-               if(node->id->us>1) {
-                       char str1[32];
-                       sprintf(str1, "%d", node->id->us);
-                       bt= uiDefBut(block, BUT, B_NOP, str1, 
-                                                (short)butr->xmax-19, (short)butr->ymin, 19, 19, 
-                                                NULL, 0, 0, 0, 0, "Displays number of users.");
-                       uiButSetFunc(bt, node_group_alone_cb, node, NULL);
-               }
-               
-               uiBlockEndAlign(block);
-       }       
+       uiTemplateIDBrowse(layout, C, ptr, "nodetree", NULL, NULL, "");
 }
-#endif
 
 static void node_buts_value(uiLayout *layout, bContext *C, PointerRNA *ptr)
 {
index 14c127c..ad897e1 100644 (file)
@@ -265,7 +265,7 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
 
        /* XXX ugly hack, typeinfo for group is generated */
        if(node->type == NODE_GROUP)
-               ; // XXX node->typeinfo->uifunc= node_buts_group;
+               node->typeinfo->uifunc= node_buts_group;
        
        /* buttons rect? */
        if((node->flag & NODE_OPTIONS) && node->typeinfo->uifunc) {
index 1ff2f7d..8f6d2c8 100644 (file)
@@ -69,6 +69,8 @@ void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int t
 int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, float coord_array[][2], int resol);
 void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage);
 
+void node_buts_group(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
+
 /* node_edit.c */
 void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *treetype);
 void snode_handle_recalc(bContext *C, SpaceNode *snode);
index efd4287..ba2d272 100644 (file)
@@ -317,6 +317,7 @@ extern StructRNA RNA_NearSensor;
 extern StructRNA RNA_NlaStrip;
 extern StructRNA RNA_NlaTrack;
 extern StructRNA RNA_Node;
+extern StructRNA RNA_NodeGroup;
 extern StructRNA RNA_NodeSocket;
 extern StructRNA RNA_NodeTree;
 extern StructRNA RNA_NoiseTexture;
index 9922f09..646a741 100644 (file)
@@ -63,6 +63,9 @@ static StructRNA *rna_Node_refine(struct PointerRNA *ptr)
                
                #undef DefNode
                
+               case NODE_GROUP:
+                       return &RNA_NodeGroup;
+                       
                default:
                        return &RNA_Node;
        }
@@ -177,6 +180,16 @@ static void rna_Node_update(Main *bmain, Scene *scene, PointerRNA *ptr)
        node_update(bmain, scene, ntree, node);
 }
 
+static void rna_NodeGroup_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+       bNodeTree *ntree= (bNodeTree*)ptr->id.data;
+       bNode *node= (bNode*)ptr->data;
+       
+       nodeVerifyGroup((bNodeTree *)node->id);
+       
+       node_update(bmain, scene, ntree, node);
+}
+
 static void rna_Node_update_name(Main *bmain, Scene *scene, PointerRNA *ptr)
 {
        bNodeTree *ntree= (bNodeTree*)ptr->id.data;
@@ -474,7 +487,7 @@ static EnumPropertyItem node_filter_items[] = {
 
 enum
 {
-       Category_NoCategory,
+       Category_GroupNode,
        Category_ShaderNode,
        Category_CompositorNode,
        Category_TextureNode
@@ -521,6 +534,8 @@ static void init(void)
        
        #undef DefNode
        #undef Str
+       
+       reg_node(NODE_GROUP, Category_GroupNode, "GROUP", "NodeGroup", "Node", "Group", "");
 }
 
 static StructRNA* def_node(BlenderRNA *brna, int node_id)
@@ -567,6 +582,13 @@ static EnumPropertyItem* alloc_node_type_items(int category)
        
        item++;
        
+       item->value = NODE_GROUP;
+       item->identifier = "GROUP";
+       item->name = "Group";
+       item->description = "";
+       
+       item++;
+       
        memset(item, 0, sizeof(EnumPropertyItem));
        
        return items;
@@ -575,6 +597,19 @@ static EnumPropertyItem* alloc_node_type_items(int category)
 
 /* -- Common nodes ---------------------------------------------------------- */
 
+static void def_group(StructRNA *srna)
+{
+       PropertyRNA *prop;
+       
+       prop = RNA_def_property(srna, "nodetree", PROP_POINTER, PROP_NONE);
+       RNA_def_property_pointer_sdna(prop, NULL, "id");
+       RNA_def_property_struct_type(prop, "NodeTree");
+       RNA_def_property_flag(prop, PROP_EDITABLE);
+       RNA_def_property_ui_text(prop, "Node Tree", "");
+       RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroup_update");
+}
+
+
 static void def_math(StructRNA *srna)
 {
        PropertyRNA *prop;
@@ -2106,13 +2141,15 @@ void RNA_def_nodetree(BlenderRNA *brna)
        rna_def_shader_node(brna);
        rna_def_compositor_node(brna);
        rna_def_texture_node(brna);
-       
+               
        #define DefNode(Category, ID, DefFunc, EnumName, StructName, UIName, UIDesc) \
                define_specific_node(brna, ID, DefFunc);
                
        #include "rna_nodetree_types.h"
        
        #undef DefNode
+       
+       define_specific_node(brna, NODE_GROUP, def_group);
 }
 
 #endif