Fix T58404: Node/Socket grabbing with Lasso tool
Reviewers: brecht Differential Revision: https://developer.blender.org/D4108
This commit is contained in:
parent
7d8f57e0c0
commit
b047866459
Notes:
blender-bot
2023-02-14 04:49:42 +01:00
Referenced by issue #58404, Node input/output grabbing (Lasso)
|
@ -5080,9 +5080,9 @@ def km_node_editor_tool_select_lasso(params):
|
|||
{"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
|
||||
{"items": [
|
||||
("node.select_lasso", {"type": params.tool_mouse, "value": 'PRESS'},
|
||||
{"properties": [("deselect", False)]}),
|
||||
{"properties": [("deselect", False), ("tweak", True)]}),
|
||||
("node.select_lasso", {"type": params.tool_mouse, "value": 'PRESS', "ctrl": True},
|
||||
{"properties": [("deselect", True)]}),
|
||||
{"properties": [("deselect", True), ("tweak", True)]}),
|
||||
]},
|
||||
)
|
||||
|
||||
|
|
|
@ -89,6 +89,30 @@ static bNode *node_under_mouse_tweak(bNodeTree *ntree, int mx, int my)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static bool is_position_over_node_or_socket(SpaceNode *snode, float mouse[2])
|
||||
{
|
||||
if (node_under_mouse_tweak(snode->edittree, mouse[0], mouse[1])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bNode *node;
|
||||
bNodeSocket *sock;
|
||||
if (node_find_indicated_socket(snode, &node, &sock, mouse, SOCK_IN | SOCK_OUT)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool is_event_over_node_or_socket(bContext *C, const wmEvent *event)
|
||||
{
|
||||
SpaceNode *snode = CTX_wm_space_node(C);
|
||||
ARegion *ar = CTX_wm_region(C);
|
||||
float mouse[2];
|
||||
UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &mouse[0], &mouse[1]);
|
||||
return is_position_over_node_or_socket(snode, mouse);
|
||||
}
|
||||
|
||||
static void node_toggle(bNode *node)
|
||||
{
|
||||
nodeSetSelected(node, !(node->flag & SELECT));
|
||||
|
@ -559,26 +583,8 @@ static int node_box_select_invoke(bContext *C, wmOperator *op, const wmEvent *ev
|
|||
{
|
||||
const bool tweak = RNA_boolean_get(op->ptr, "tweak");
|
||||
|
||||
if (tweak) {
|
||||
/* prevent initiating the box select if the mouse is over a node or
|
||||
* node socket. this allows box select on empty space, but drag-translate
|
||||
* on nodes */
|
||||
SpaceNode *snode = CTX_wm_space_node(C);
|
||||
ARegion *ar = CTX_wm_region(C);
|
||||
float mouse[2];
|
||||
|
||||
UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &mouse[0], &mouse[1]);
|
||||
|
||||
if (node_under_mouse_tweak(snode->edittree, mouse[0], mouse[1])) {
|
||||
return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH;
|
||||
}
|
||||
|
||||
bNode *node;
|
||||
bNodeSocket *sock;
|
||||
|
||||
if (node_find_indicated_socket(snode, &node, &sock, mouse, SOCK_IN | SOCK_OUT)) {
|
||||
return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH;
|
||||
}
|
||||
if (tweak && is_event_over_node_or_socket(C, event)) {
|
||||
return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH;
|
||||
}
|
||||
|
||||
return WM_gesture_box_invoke(C, op, event);
|
||||
|
@ -663,6 +669,17 @@ void NODE_OT_select_circle(wmOperatorType *ot)
|
|||
|
||||
/* ****** Lasso Select ****** */
|
||||
|
||||
static int node_lasso_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
|
||||
{
|
||||
const bool tweak = RNA_boolean_get(op->ptr, "tweak");
|
||||
|
||||
if (tweak && is_event_over_node_or_socket(C, event)) {
|
||||
return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH;
|
||||
}
|
||||
|
||||
return WM_gesture_lasso_invoke(C, op, event);
|
||||
}
|
||||
|
||||
static bool do_lasso_select_node(bContext *C, const int mcords[][2], short moves, bool select, bool extend)
|
||||
{
|
||||
SpaceNode *snode = CTX_wm_space_node(C);
|
||||
|
@ -733,7 +750,7 @@ void NODE_OT_select_lasso(wmOperatorType *ot)
|
|||
ot->idname = "NODE_OT_select_lasso";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke = WM_gesture_lasso_invoke;
|
||||
ot->invoke = node_lasso_select_invoke;
|
||||
ot->modal = WM_gesture_lasso_modal;
|
||||
ot->exec = node_lasso_select_exec;
|
||||
ot->poll = ED_operator_node_active;
|
||||
|
@ -744,6 +761,7 @@ void NODE_OT_select_lasso(wmOperatorType *ot)
|
|||
|
||||
/* properties */
|
||||
WM_operator_properties_gesture_lasso_select(ot);
|
||||
RNA_def_boolean(ot->srna, "tweak", 0, "Tweak", "Only activate when mouse is not over a node - useful for tweak gesture");
|
||||
}
|
||||
|
||||
/* ****** Select/Deselect All ****** */
|
||||
|
|
Loading…
Reference in New Issue