diff options
author | Joshua Leung <aligorith@gmail.com> | 2009-11-21 00:04:41 +0300 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2009-11-21 00:04:41 +0300 |
commit | 03cfcc60078032f61ccf7906b401e374aa19a898 (patch) | |
tree | 803cf6f2ab7c93de9e2ebac9d7455dbe1240e082 /source/blender/editors | |
parent | acf0fbbf705219c2654b087270a076f410531a09 (diff) |
Node Editor - More Cleanups (Reshuffling):
- removing duplicate chunks of code -> hide unused sockets now works
- moving some functions to the files that they get called from -> view all/home
- made duplicate a macro operator like the other places that work like this, eliminating the unnecessary transform-related property there still
- removed a few chunks of unused code
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/include/ED_node.h | 5 | ||||
-rw-r--r-- | source/blender/editors/space_api/spacetypes.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_draw.c | 1 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_edit.c | 275 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_intern.h | 2 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_ops.c | 13 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_select.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_state.c | 103 |
8 files changed, 135 insertions, 268 deletions
diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h index 667a4ecb144..8922a38e875 100644 --- a/source/blender/editors/include/ED_node.h +++ b/source/blender/editors/include/ED_node.h @@ -44,7 +44,10 @@ void ED_node_changed_update(struct ID *id, struct bNode *node); /* node_edit.c */ void ED_node_shader_default(struct Material *ma); void ED_node_composit_default(struct Scene *sce); -void ED_node_texture_default(struct Tex *tex);; +void ED_node_texture_default(struct Tex *tex); + +/* node ops.c */ +void ED_operatormacros_node(void); #endif /* ED_NODE_H */ diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c index da92e450ed5..8cf56ae3eda 100644 --- a/source/blender/editors/space_api/spacetypes.c +++ b/source/blender/editors/space_api/spacetypes.c @@ -45,6 +45,7 @@ #include "ED_gpencil.h" #include "ED_markers.h" #include "ED_mesh.h" +#include "ED_node.h" #include "ED_object.h" #include "ED_physics.h" #include "ED_render.h" @@ -111,6 +112,7 @@ void ED_spacetypes_init(void) * maybe we'll need to have them go after python operators too? */ ED_operatormacros_armature(); ED_operatormacros_mesh(); + ED_operatormacros_node(); ED_operatormacros_object(); } diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index 1cdad0b746c..59085ce19cd 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -1031,6 +1031,7 @@ static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bN else strcpy(showname, ngroup->id.name+2); + // XXX this shows some scaling artifacts UI_DrawString(rect.xmin+8.0f, rect.ymax+5.0f, showname); /* links from groupsockets to the internal nodes */ diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index c328947d5af..d5bcb9aabd6 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -762,6 +762,19 @@ void node_set_active(SpaceNode *snode, bNode *node) } } +/* when links in groups change, inputs/outputs change, nodes added/deleted... */ +void node_tree_verify_groups(bNodeTree *nodetree) +{ + bNode *gnode; + + gnode= node_tree_get_editgroup(nodetree); + + /* does all materials */ + if(gnode) + nodeVerifyGroup((bNodeTree *)gnode->id); + +} + /* ***************** Edit Group operator ************* */ void snode_make_group_editable(SpaceNode *snode, bNode *gnode) @@ -892,81 +905,6 @@ void NODE_OT_group_ungroup(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; } -/* when links in groups change, inputs/outputs change, nodes added/deleted... */ -static void node_tree_verify_groups(bNodeTree *nodetree) -{ - bNode *gnode; - - gnode= node_tree_get_editgroup(nodetree); - - /* does all materials */ - if(gnode) - nodeVerifyGroup((bNodeTree *)gnode->id); - -} - -#if 0 - -static void node_addgroup(SpaceNode *snode) -{ - bNodeTree *ngroup; - int tot= 0, offs, val; - char *strp; - - if(snode->edittree!=snode->nodetree) { - error("Can not add a Group in a Group"); - return; - } - - /* construct menu with choices */ - for(ngroup= G.main->nodetree.first; ngroup; ngroup= ngroup->id.next) { - if(ngroup->type==snode->treetype) - tot++; - } - if(tot==0) { - error("No groups available in database"); - return; - } - strp= MEM_mallocN(32*tot+32, "menu"); - strcpy(strp, "Add Group %t"); - offs= strlen(strp); - - for(tot=0, ngroup= G.main->nodetree.first; ngroup; ngroup= ngroup->id.next, tot++) { - if(ngroup->type==snode->treetype) - offs+= sprintf(strp+offs, "|%s %%x%d", ngroup->id.name+2, tot); - } - - val= pupmenu(strp); - if(val>=0) { - ngroup= BLI_findlink(&G.main->nodetree, val); - if(ngroup) { - bNode *node= nodeAddNodeType(snode->edittree, NODE_GROUP, ngroup, NULL); - - /* generics */ - if(node) { - float locx, locy; - short mval[2]; - - node_deselectall(snode, 0); - - getmouseco_areawin(mval); - areamouseco_to_ipoco(G.v2d, mval, &locx, &locy); - - node->locx= locx; - node->locy= locy + 60.0f; // arbitrary.. so its visible - node->flag |= SELECT; - - id_us_plus(node->id); - - node_set_active(snode, node); - } - } - } - MEM_freeN(strp); -} - -#endif /* 0 */ - /* ************************** Node generic ************** */ /* allows to walk the list in order of visibility */ @@ -1035,56 +973,6 @@ static bNode *visible_node(SpaceNode *snode, rctf *rct) return tnode; } -void snode_home(ScrArea *sa, ARegion *ar, SpaceNode* snode) -{ - bNode *node; - rctf *cur, *tot; - float oldwidth, oldheight, width, height; - int first= 1; - - cur= &ar->v2d.cur; - tot= &ar->v2d.tot; - - oldwidth= cur->xmax - cur->xmin; - oldheight= cur->ymax - cur->ymin; - - cur->xmin= cur->ymin= 0.0f; - cur->xmax=ar->winx; - cur->xmax= ar->winy; - - if(snode->edittree) { - for(node= snode->edittree->nodes.first; node; node= node->next) { - if(first) { - first= 0; - ar->v2d.cur= node->totr; - } - else { - BLI_union_rctf(cur, &node->totr); - } - } - } - - snode->xof= 0; - snode->yof= 0; - width= cur->xmax - cur->xmin; - height= cur->ymax- cur->ymin; - if(width > height) { - float newheight; - newheight= oldheight * width/oldwidth; - cur->ymin= cur->ymin - newheight/4; - cur->ymax= cur->ymin + newheight; - } - else { - float newwidth; - newwidth= oldwidth * height/oldheight; - cur->xmin= cur->xmin - newwidth/4; - cur->xmax= cur->xmin + newwidth; - } - - ar->v2d.tot= ar->v2d.cur; - UI_view2d_curRect_validate(&ar->v2d); -} - #if 0 static void snode_bg_viewmove(SpaceNode *snode) { @@ -1324,127 +1212,6 @@ int node_has_hidden_sockets(bNode *node) return 0; } - -static void node_hide_unhide_sockets(SpaceNode *snode, bNode *node) -{ - bNodeSocket *sock; - - /* unhide all */ - if( node_has_hidden_sockets(node) ) { - for(sock= node->inputs.first; sock; sock= sock->next) - sock->flag &= ~SOCK_HIDDEN; - for(sock= node->outputs.first; sock; sock= sock->next) - sock->flag &= ~SOCK_HIDDEN; - } - else { - bNode *gnode= node_tree_get_editgroup(snode->nodetree); - - /* hiding inside group should not break links in other group users */ - if(gnode) { - nodeGroupSocketUseFlags((bNodeTree *)gnode->id); - for(sock= node->inputs.first; sock; sock= sock->next) - if(!(sock->flag & SOCK_IN_USE)) - if(sock->link==NULL) - sock->flag |= SOCK_HIDDEN; - for(sock= node->outputs.first; sock; sock= sock->next) - if(!(sock->flag & SOCK_IN_USE)) - if(nodeCountSocketLinks(snode->edittree, sock)==0) - sock->flag |= SOCK_HIDDEN; - } - else { - /* hide unused sockets */ - for(sock= node->inputs.first; sock; sock= sock->next) { - if(sock->link==NULL) - sock->flag |= SOCK_HIDDEN; - } - for(sock= node->outputs.first; sock; sock= sock->next) { - if(nodeCountSocketLinks(snode->edittree, sock)==0) - sock->flag |= SOCK_HIDDEN; - } - } - } - - // allqueue(REDRAWNODE, 1); - node_tree_verify_groups(snode->nodetree); - -} - -// XXX duplicate function -/*static*/ int do_header_node(SpaceNode *snode, bNode *node, float mx, float my) -{ - rctf totr= node->totr; - - totr.ymin= totr.ymax-20.0f; - - totr.xmax= totr.xmin+15.0f; - if(BLI_in_rctf(&totr, mx, my)) { - node->flag |= NODE_HIDDEN; - // allqueue(REDRAWNODE, 0); - return 1; - } - - totr.xmax= node->totr.xmax; - totr.xmin= totr.xmax-18.0f; - if(node->typeinfo->flag & NODE_PREVIEW) { - if(BLI_in_rctf(&totr, mx, my)) { - node->flag ^= NODE_PREVIEW; - // allqueue(REDRAWNODE, 0); - return 1; - } - totr.xmin-=18.0f; - } - if(node->type == NODE_GROUP) { - if(BLI_in_rctf(&totr, mx, my)) { - snode_make_group_editable(snode, node); - return 1; - } - totr.xmin-=18.0f; - } - if(node->typeinfo->flag & NODE_OPTIONS) { - if(BLI_in_rctf(&totr, mx, my)) { - node->flag ^= NODE_OPTIONS; - // allqueue(REDRAWNODE, 0); - return 1; - } - totr.xmin-=18.0f; - } - /* hide unused sockets */ - if(BLI_in_rctf(&totr, mx, my)) { - node_hide_unhide_sockets(snode, node); - } - - - totr= node->totr; - totr.xmin= totr.xmax-10.0f; - totr.ymax= totr.ymin+10.0f; - if(BLI_in_rctf(&totr, mx, my)) { -// scale_node(snode, node); - return 1; - } - return 0; -} - -// XXX duplicate function -/*static*/ int do_header_hidden_node(SpaceNode *snode, bNode *node, float mx, float my) -{ - rctf totr= node->totr; - - totr.xmax= totr.xmin+15.0f; - if(BLI_in_rctf(&totr, mx, my)) { - node->flag &= ~NODE_HIDDEN; - // allqueue(REDRAWNODE, 0); - return 1; - } - - totr.xmax= node->totr.xmax; - totr.xmin= node->totr.xmax-15.0f; - if(BLI_in_rctf(&totr, mx, my)) { -// scale_node(snode, node); - return 1; - } - return 0; -} - static void node_link_viewer(SpaceNode *snode, bNode *tonode) { bNode *node; @@ -1738,17 +1505,6 @@ static int node_duplicate_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int node_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event) -{ - node_duplicate_exec(C, op); - - // todo... remove this - this is for a modal op instead! - RNA_int_set(op->ptr, "mode", TFM_TRANSLATION); - WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr); - - return OPERATOR_FINISHED; -} - void NODE_OT_duplicate(wmOperatorType *ot) { /* identifiers */ @@ -1757,16 +1513,11 @@ void NODE_OT_duplicate(wmOperatorType *ot) ot->idname= "NODE_OT_duplicate"; /* api callbacks */ - ot->invoke= node_duplicate_invoke; ot->exec= node_duplicate_exec; - ot->poll= ED_operator_node_active; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - /* to give to transform */ - RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX); } /* *************************** add link op ******************** */ diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index e09554667cc..c7988525372 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -76,11 +76,11 @@ bNode *next_node(bNodeTree *ntree); bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float locy); void snode_set_context(SpaceNode *snode, Scene *scene); void snode_make_group_editable(SpaceNode *snode, bNode *gnode); -void snode_home(ScrArea *sa, ARegion *ar, SpaceNode *snode); void node_set_active(SpaceNode *snode, bNode *node); void node_deselectall(SpaceNode *snode); void snode_composite_job(const struct bContext *C, ScrArea *sa); bNode *node_tree_get_editgroup(bNodeTree *ntree); +void node_tree_verify_groups(bNodeTree *nodetree); void snode_autoconnect(SpaceNode *snode, bNode *node_to, int flag); void NODE_OT_duplicate(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c index bf34ce9e049..cd92e2c0d78 100644 --- a/source/blender/editors/space_node/node_ops.c +++ b/source/blender/editors/space_node/node_ops.c @@ -75,6 +75,17 @@ void node_operatortypes(void) WM_operatortype_append(NODE_OT_group_edit); } +void ED_operatormacros_node(void) +{ + wmOperatorType *ot; + wmOperatorTypeMacro *otmacro; + + ot= WM_operatortype_append_macro("NODE_OT_duplicate_move", "Add Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER); + WM_operatortype_macro_define(ot, "NODE_OT_duplicate"); + otmacro= WM_operatortype_macro_define(ot, "TFM_OT_translate"); + RNA_enum_set(otmacro->ptr, "proportional", 0); +} + void node_keymap(struct wmKeyConfig *keyconf) { wmKeyMap *keymap; @@ -107,7 +118,7 @@ void node_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, 0, 0); WM_keymap_add_menu(keymap, "NODE_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0); - WM_keymap_add_item(keymap, "NODE_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "NODE_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "NODE_OT_hide", HKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_mute", MKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index 87bd6075ec5..c81cfb47f5b 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -56,6 +56,8 @@ #include "node_intern.h" +/* ****** Click Select ****** */ + static bNode *node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, short extend) { bNode *node; diff --git a/source/blender/editors/space_node/node_state.c b/source/blender/editors/space_node/node_state.c index 2a2952f392c..286e95cf9bd 100644 --- a/source/blender/editors/space_node/node_state.c +++ b/source/blender/editors/space_node/node_state.c @@ -55,7 +55,50 @@ #include "node_intern.h" -// XXX duplicate function +/* **************** Node Header Buttons ************** */ + +static void node_hide_unhide_sockets(SpaceNode *snode, bNode *node) +{ + bNodeSocket *sock; + + /* unhide all */ + if( node_has_hidden_sockets(node) ) { + for(sock= node->inputs.first; sock; sock= sock->next) + sock->flag &= ~SOCK_HIDDEN; + for(sock= node->outputs.first; sock; sock= sock->next) + sock->flag &= ~SOCK_HIDDEN; + } + else { + bNode *gnode= node_tree_get_editgroup(snode->nodetree); + + /* hiding inside group should not break links in other group users */ + if(gnode) { + nodeGroupSocketUseFlags((bNodeTree *)gnode->id); + for(sock= node->inputs.first; sock; sock= sock->next) + if(!(sock->flag & SOCK_IN_USE)) + if(sock->link==NULL) + sock->flag |= SOCK_HIDDEN; + for(sock= node->outputs.first; sock; sock= sock->next) + if(!(sock->flag & SOCK_IN_USE)) + if(nodeCountSocketLinks(snode->edittree, sock)==0) + sock->flag |= SOCK_HIDDEN; + } + else { + /* hide unused sockets */ + for(sock= node->inputs.first; sock; sock= sock->next) { + if(sock->link==NULL) + sock->flag |= SOCK_HIDDEN; + } + for(sock= node->outputs.first; sock; sock= sock->next) { + if(nodeCountSocketLinks(snode->edittree, sock)==0) + sock->flag |= SOCK_HIDDEN; + } + } + } + + node_tree_verify_groups(snode->nodetree); +} + static int do_header_node(SpaceNode *snode, bNode *node, float mx, float my) { rctf totr= node->totr; @@ -93,13 +136,12 @@ static int do_header_node(SpaceNode *snode, bNode *node, float mx, float my) } /* hide unused sockets */ if(BLI_in_rctf(&totr, mx, my)) { - // XXX node_hide_unhide_sockets(snode, node); + node_hide_unhide_sockets(snode, node); } return 0; } -// XXX duplicate function static int do_header_hidden_node(SpaceNode *snode, bNode *node, float mx, float my) { rctf totr= node->totr; @@ -172,6 +214,7 @@ void NODE_OT_visibility_toggle(wmOperatorType *ot) /* identifiers */ ot->name= "Toggle Visibility"; ot->idname= "NODE_OT_visibility_toggle"; + ot->description= "Handle clicks on node header buttons."; /* api callbacks */ ot->invoke= node_toggle_visibility_invoke; @@ -184,13 +227,67 @@ void NODE_OT_visibility_toggle(wmOperatorType *ot) RNA_def_int(ot->srna, "mouse_y", 0, INT_MIN, INT_MAX, "Mouse Y", "", INT_MIN, INT_MAX); } +/* **************** View All Operator ************** */ + +static void snode_home(ScrArea *sa, ARegion *ar, SpaceNode* snode) +{ + bNode *node; + rctf *cur, *tot; + float oldwidth, oldheight, width, height; + int first= 1; + + cur= &ar->v2d.cur; + tot= &ar->v2d.tot; + + oldwidth= cur->xmax - cur->xmin; + oldheight= cur->ymax - cur->ymin; + + cur->xmin= cur->ymin= 0.0f; + cur->xmax=ar->winx; + cur->xmax= ar->winy; + + if(snode->edittree) { + for(node= snode->edittree->nodes.first; node; node= node->next) { + if(first) { + first= 0; + ar->v2d.cur= node->totr; + } + else { + BLI_union_rctf(cur, &node->totr); + } + } + } + + snode->xof= 0; + snode->yof= 0; + width= cur->xmax - cur->xmin; + height= cur->ymax- cur->ymin; + if(width > height) { + float newheight; + newheight= oldheight * width/oldwidth; + cur->ymin= cur->ymin - newheight/4; + cur->ymax= cur->ymin + newheight; + } + else { + float newwidth; + newwidth= oldwidth * height/oldheight; + cur->xmin= cur->xmin - newwidth/4; + cur->xmax= cur->xmin + newwidth; + } + + ar->v2d.tot= ar->v2d.cur; + UI_view2d_curRect_validate(&ar->v2d); +} + static int node_view_all_exec(bContext *C, wmOperator *op) { ScrArea *sa= CTX_wm_area(C); ARegion *ar= CTX_wm_region(C); SpaceNode *snode= CTX_wm_space_node(C); + snode_home(sa, ar, snode); ED_region_tag_redraw(ar); + return OPERATOR_FINISHED; } |