From 179d00fb9cc2a6746c3cc3e31f6573380fc02195 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 1 Aug 2012 13:28:19 +0000 Subject: [PATCH] make node select_all consistent with other select operators, also add Ctrl+I, select inverse to node space. --- release/scripts/startup/bl_ui/space_node.py | 3 +- source/blender/editors/include/ED_node.h | 11 ++---- source/blender/editors/space_node/drawnode.c | 4 +- source/blender/editors/space_node/node_edit.c | 12 ++++++ source/blender/editors/space_node/node_ops.c | 6 ++- .../blender/editors/space_node/node_select.c | 38 ++++++++++++------- .../editors/transform/transform_snap.c | 4 +- .../windowmanager/intern/wm_init_exit.c | 2 +- 8 files changed, 52 insertions(+), 28 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py index ccdf44a7dc2..e66d8f70c81 100644 --- a/release/scripts/startup/bl_ui/space_node.py +++ b/release/scripts/startup/bl_ui/space_node.py @@ -135,7 +135,8 @@ class NODE_MT_select(Menu): layout.operator("node.select_border") layout.separator() - layout.operator("node.select_all") + layout.operator("node.select_all").action = 'TOGGLE' + layout.operator("node.select_all", text="Inverse").action = 'INVERT' layout.operator("node.select_linked_from") layout.operator("node.select_linked_to") layout.operator("node.select_same_type") diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h index 6f86d01fb98..8c79ad8f3e8 100644 --- a/source/blender/editors/include/ED_node.h +++ b/source/blender/editors/include/ED_node.h @@ -51,9 +51,9 @@ typedef enum { } NodeBorder; /* drawnode.c */ -void ED_init_node_butfuncs(void); - -void drawnodesnap(struct View2D *v2d, const float cent[2], float size, NodeBorder border); +void ED_node_init_butfuncs(void); +void ED_node_sample_set(const float col[4]); +void ED_node_draw_snap(struct View2D *v2d, const float cent[2], float size, NodeBorder border); /* node_draw.c */ void ED_node_tree_update(struct SpaceNode *snode, struct Scene *scene); @@ -67,13 +67,10 @@ void ED_node_composit_default(struct Scene *sce); void ED_node_texture_default(struct Tex *tex); void ED_node_link_intersect_test(struct ScrArea *sa, int test); void ED_node_link_insert(struct ScrArea *sa); - +int ED_node_select_check(ListBase *lb); void ED_node_post_apply_transform(struct bContext *C, struct bNodeTree *ntree); - void ED_node_set_active(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node); -void ED_node_sample_set(const float col[4]); - /* node ops.c */ void ED_operatormacros_node(void); diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 8688bee0a73..c3d9336ae64 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -2950,7 +2950,7 @@ static void node_texture_set_butfunc(bNodeType *ntype) /* ******* init draw callbacks for all tree types, only called in usiblender.c, once ************* */ -void ED_init_node_butfuncs(void) +void ED_node_init_butfuncs(void) { bNodeTreeType *treetype; bNodeType *ntype; @@ -3498,7 +3498,7 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link) // node_draw_link_straight(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3); } -void drawnodesnap(View2D *v2d, const float cent[2], float size, NodeBorder border) +void ED_node_draw_snap(View2D *v2d, const float cent[2], float size, NodeBorder border) { glBegin(GL_LINES); diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index b3ef4561b72..f020b306db3 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -3505,6 +3505,18 @@ void ED_node_link_intersect_test(ScrArea *sa, int test) selink->flag |= NODE_LINKFLAG_HILITE; } +int ED_node_select_check(ListBase *lb) +{ + bNode *node; + + for (node = lb->first; node; node = node->next) { + if (node->flag & NODE_SELECT) { + return TRUE; + } + } + + return FALSE; +} /* ******************************** */ // XXX some code needing updating to operators... diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c index ff1661f0327..0ce72848c56 100644 --- a/source/blender/editors/space_node/node_ops.c +++ b/source/blender/editors/space_node/node_ops.c @@ -261,7 +261,11 @@ void node_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "NODE_OT_delete", DELKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_delete_reconnect", XKEY, KM_PRESS, KM_CTRL, 0); - WM_keymap_add_item(keymap, "NODE_OT_select_all", AKEY, KM_PRESS, 0, 0); + kmi = WM_keymap_add_item(keymap, "NODE_OT_select_all", AKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "action", SEL_TOGGLE); + kmi = WM_keymap_add_item(keymap, "NODE_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0); + RNA_enum_set(kmi->ptr, "action", SEL_INVERT); + WM_keymap_add_item(keymap, "NODE_OT_select_linked_to", LKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "NODE_OT_select_linked_from", LKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_select_same_type", GKEY, KM_PRESS, KM_SHIFT, 0); diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index 1ea763a413d..603603b9f07 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -537,26 +537,34 @@ void NODE_OT_select_border(wmOperatorType *ot) /* ****** Select/Deselect All ****** */ -static int node_select_all_exec(bContext *C, wmOperator *UNUSED(op)) +static int node_select_all_exec(bContext *C, wmOperator *op) { SpaceNode *snode = CTX_wm_space_node(C); - bNode *first = snode->edittree->nodes.first; + ListBase *node_lb = &snode->edittree->nodes; bNode *node; - int count= 0; + int action = RNA_enum_get(op->ptr, "action"); - for (node=first; node; node=node->next) - if (node->flag & NODE_SELECT) - count++; + if (action == SEL_TOGGLE) { + if (ED_node_select_check(node_lb)) + action = SEL_DESELECT; + else + action = SEL_SELECT; + } - if (count) { - for (node=first; node; node=node->next) - node_deselect(node); + for (node = node_lb->first; node; node = node->next) { + switch (action) { + case SEL_SELECT: + node_select(node); + break; + case SEL_DESELECT: + node_deselect(node); + break; + case SEL_INVERT: + ((node->flag & SELECT) ? node_deselect : node_select)(node); + break; + } } - else { - for (node=first; node; node=node->next) - node_select(node); - } - + ED_node_sort(snode->edittree); WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); @@ -576,6 +584,8 @@ void NODE_OT_select_all(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; + + WM_operator_properties_select_all(ot); } /* ****** Select Linked To ****** */ diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 66736548875..278acb72511 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -246,13 +246,13 @@ void drawSnapping(const struct bContext *C, TransInfo *t) glColor4ubv(col); } - drawnodesnap(&ar->v2d, p->co, size, 0); + ED_node_draw_snap(&ar->v2d, p->co, size, 0); } if (t->tsnap.status & POINT_INIT) { glColor4ubv(activeCol); - drawnodesnap(&ar->v2d, t->tsnap.snapPoint, size, t->tsnap.snapNodeBorder); + ED_node_draw_snap(&ar->v2d, t->tsnap.snapPoint, size, t->tsnap.snapNodeBorder); } glDisable(GL_BLEND); diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 6297c337335..5bf6c34cfb3 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -142,7 +142,7 @@ void WM_init(bContext *C, int argc, const char **argv) ED_spacetypes_init(); /* editors/space_api/spacetype.c */ ED_file_init(); /* for fsmenu */ - ED_init_node_butfuncs(); + ED_node_init_butfuncs(); BLF_init(11, U.dpi); /* Please update source/gamengine/GamePlayer/GPG_ghost.cpp if you change this */ BLF_lang_init();