Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2009-11-20 07:19:57 +0300
committerJoshua Leung <aligorith@gmail.com>2009-11-20 07:19:57 +0300
commite6d382bd5353e526c21d3f3f021560fd58d07c41 (patch)
tree43d51f9c7b9df4c16b281a0a09510cbc35c4c6d1 /source/blender/editors/space_node/node_select.c
parent3d1e618864422cacfd73442f2847bbe68d96fada (diff)
Node Editor: Various usability and code tidyups
* Fixed a nasty bug which meant that it was impossible to set an active node. Was caused by ntreeCopyTree() getting called when compo updates were done and clearing the active flags. The active flag clearing is only really needed for the "internal_select" case which is only used for duplicating selected nodes (from Shift-D duplicate). * Recoded click-selection code. Was a mess of old code, bad exceptions from the old code half ported, duplicate operators, unnecessary flags/modes. * Fixed bug #19927: compositing node groups can't be access via "tab" or ungrouped via "alt+g". Was probably related to the active group not being able to be set. * Made resizing nodes work again. Again, this was due to the active node bug. * Made adding a new group with Ctrl-G correctly update the views
Diffstat (limited to 'source/blender/editors/space_node/node_select.c')
-rw-r--r--source/blender/editors/space_node/node_select.c140
1 files changed, 31 insertions, 109 deletions
diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c
index 67c7915694d..87bd6075ec5 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -61,48 +61,28 @@ static bNode *node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, shor
bNode *node;
float mx, my;
+ /* get mouse coordinates in view2d space */
mx= (float)mval[0];
my= (float)mval[1];
UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &mx, &my);
+ /* find the closest visible node */
for(next_node(snode->edittree); (node=next_node(NULL));) {
-
- /* first check for the headers or scaling widget */
- /* XXX if(node->flag & NODE_HIDDEN) {
- if(do_header_hidden_node(snode, node, mx, my))
- return 1;
- }
- else {
- if(do_header_node(snode, node, mx, my))
- return 1;
- }*/
-
- /* node body */
- if(BLI_in_rctf(&node->totr, mx, my))
+ /* node body (header and scale are in other operators) */
+ if (BLI_in_rctf(&node->totr, mx, my))
break;
}
- if(node) {
- if((extend & KM_SHIFT)==0)
+
+ if (node) {
+ if (extend == 0) {
node_deselectall(snode);
-
- if(extend & KM_SHIFT) {
- if(node->flag & SELECT)
- node->flag &= ~SELECT;
- else
- node->flag |= SELECT;
+ node->flag |= SELECT;
}
else
- node->flag |= SELECT;
-
+ node->flag ^= SELECT;
+
node_set_active(snode, node);
-
- /* viewer linking */
- if(extend & KM_CTRL)
- ;// node_link_viewer(snode, node);
-
- //std_rmouse_transform(node_transform_ext); /* does undo push for select */
-
}
return node;
@@ -110,27 +90,23 @@ static bNode *node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, shor
static int node_select_exec(bContext *C, wmOperator *op)
{
- // XXX wmWindow *window= CTX_wm_window(C);
SpaceNode *snode= CTX_wm_space_node(C);
ARegion *ar= CTX_wm_region(C);
- int select_type;
short mval[2];
short extend;
bNode *node= NULL;
-
- select_type = RNA_enum_get(op->ptr, "select_type");
- switch (select_type) {
- case NODE_SELECT_MOUSE:
- mval[0] = RNA_int_get(op->ptr, "mouse_x");
- mval[1] = RNA_int_get(op->ptr, "mouse_y");
- extend = RNA_boolean_get(op->ptr, "extend");
- node= node_mouse_select(snode, ar, mval, extend);
- break;
- }
+ /* get settings from RNA properties for operator */
+ mval[0] = RNA_int_get(op->ptr, "mouse_x");
+ mval[1] = RNA_int_get(op->ptr, "mouse_y");
+
+ extend = RNA_boolean_get(op->ptr, "extend");
+
+ /* perform the select */
+ node= node_mouse_select(snode, ar, mval, extend);
/* need refresh/a notifier vs compo notifier */
- // XXX WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL); /* Do we need to pass the scene? */
+ WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL); /* Do we need to pass the scene? */
/* WATCH THIS, there are a few other ways to change the active material */
if(node) {
@@ -138,9 +114,7 @@ static int node_select_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_MATERIAL|ND_SHADING_DRAW, node->id);
}
}
-
- ED_region_tag_redraw(ar);
-
+
/* send notifiers */
WM_event_add_notifier(C, NC_NODE|ND_NODE_SELECT, NULL);
@@ -148,27 +122,6 @@ static int node_select_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH;
}
-static int node_select_modal(bContext *C, wmOperator *op, wmEvent *event)
-{
- /* execute the events */
- switch (event->type) {
- case MOUSEMOVE:
- printf("%d %d\n", event->x, event->y);
- break;
- case SELECTMOUSE:
- //if (event->val==KM_RELEASE) {
- /* calculate overall delta mouse-movement for redo */
- printf("done translating\n");
- //WM_cursor_restore(CTX_wm_window(C));
-
- return OPERATOR_FINISHED;
- //}
- break;
- }
-
- return OPERATOR_RUNNING_MODAL;
-}
-
static int node_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
@@ -183,56 +136,21 @@ static int node_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
return node_select_exec(C,op);
}
-static int node_extend_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- RNA_boolean_set(op->ptr, "extend", KM_SHIFT);
-
- return node_select_invoke(C, op, event);
-}
-
-/* operators */
-
-static EnumPropertyItem prop_select_items[] = {
- {NODE_SELECT_MOUSE, "NORMAL", 0, "Normal Select", "Select using the mouse"},
- {0, NULL, 0, NULL, NULL}};
-
-void NODE_OT_select_extend(wmOperatorType *ot)
-{
- // XXX - Todo - This should just be a toggle option for NODE_OT_select not its own op
- /* identifiers */
- ot->name= "Activate/Select (Shift)";
- ot->idname= "NODE_OT_select_extend";
-
- /* api callbacks */
- ot->invoke= node_extend_select_invoke;
- ot->poll= ED_operator_node_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "select_type", prop_select_items, 0, "Select Type", "");
-
- RNA_def_int(ot->srna, "mouse_x", 0, INT_MIN, INT_MAX, "Mouse X", "", INT_MIN, INT_MAX);
- RNA_def_int(ot->srna, "mouse_y", 0, INT_MIN, INT_MAX, "Mouse Y", "", INT_MIN, INT_MAX);
- RNA_def_boolean(ot->srna, "extend", 0, "Extend", "");
-}
void NODE_OT_select(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Activate/Select";
+ ot->name= "Select";
ot->idname= "NODE_OT_select";
/* api callbacks */
ot->invoke= node_select_invoke;
ot->poll= ED_operator_node_active;
- ot->modal= node_select_modal;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
-
- RNA_def_enum(ot->srna, "select_type", prop_select_items, 0, "Select Type", "");
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* properties */
RNA_def_int(ot->srna, "mouse_x", 0, INT_MIN, INT_MAX, "Mouse X", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "mouse_y", 0, INT_MIN, INT_MAX, "Mouse Y", "", INT_MIN, INT_MAX);
RNA_def_boolean(ot->srna, "extend", 0, "Extend", "");
@@ -346,13 +264,15 @@ static int node_select_linked_to_exec(bContext *C, wmOperator *op)
for (node=snode->edittree->nodes.first; node; node=node->next)
node->flag &= ~NODE_TEST;
- for (link=snode->edittree->links.first; link; link=link->next)
+ for (link=snode->edittree->links.first; link; link=link->next) {
if (link->fromnode->flag & NODE_SELECT)
link->tonode->flag |= NODE_TEST;
+ }
- for (node=snode->edittree->nodes.first; node; node=node->next)
+ for (node=snode->edittree->nodes.first; node; node=node->next) {
if (node->flag & NODE_TEST)
node->flag |= NODE_SELECT;
+ }
WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL);
return OPERATOR_FINISHED;
@@ -384,13 +304,15 @@ static int node_select_linked_from_exec(bContext *C, wmOperator *op)
for(node=snode->edittree->nodes.first; node; node=node->next)
node->flag &= ~NODE_TEST;
- for(link=snode->edittree->links.first; link; link=link->next)
+ for(link=snode->edittree->links.first; link; link=link->next) {
if(link->tonode->flag & NODE_SELECT)
link->fromnode->flag |= NODE_TEST;
+ }
- for(node=snode->edittree->nodes.first; node; node=node->next)
+ for(node=snode->edittree->nodes.first; node; node=node->next) {
if(node->flag & NODE_TEST)
node->flag |= NODE_SELECT;
+ }
WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL);
return OPERATOR_FINISHED;