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:
Diffstat (limited to 'source/blender/editors/mask/mask_select.c')
-rw-r--r--source/blender/editors/mask/mask_select.c1324
1 files changed, 671 insertions, 653 deletions
diff --git a/source/blender/editors/mask/mask_select.c b/source/blender/editors/mask/mask_select.c
index 89a15ec316d..076f8d067b9 100644
--- a/source/blender/editors/mask/mask_select.c
+++ b/source/blender/editors/mask/mask_select.c
@@ -38,12 +38,12 @@
#include "ED_screen.h"
#include "ED_select_utils.h"
-#include "ED_mask.h" /* own include */
+#include "ED_mask.h" /* own include */
#include "RNA_access.h"
#include "RNA_define.h"
-#include "mask_intern.h" /* own include */
+#include "mask_intern.h" /* own include */
/* -------------------------------------------------------------------- */
/** \name Public Mask Selection API
@@ -52,157 +52,156 @@
/* 'check' select */
bool ED_mask_spline_select_check(MaskSpline *spline)
{
- int i;
+ int i;
- for (i = 0; i < spline->tot_point; i++) {
- MaskSplinePoint *point = &spline->points[i];
+ for (i = 0; i < spline->tot_point; i++) {
+ MaskSplinePoint *point = &spline->points[i];
- if (MASKPOINT_ISSEL_ANY(point))
- return true;
- }
+ if (MASKPOINT_ISSEL_ANY(point))
+ return true;
+ }
- return false;
+ return false;
}
bool ED_mask_layer_select_check(MaskLayer *masklay)
{
- MaskSpline *spline;
+ MaskSpline *spline;
- if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
- return false;
- }
+ if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
+ return false;
+ }
- for (spline = masklay->splines.first; spline; spline = spline->next) {
- if (ED_mask_spline_select_check(spline)) {
- return true;
- }
- }
+ for (spline = masklay->splines.first; spline; spline = spline->next) {
+ if (ED_mask_spline_select_check(spline)) {
+ return true;
+ }
+ }
- return false;
+ return false;
}
bool ED_mask_select_check(Mask *mask)
{
- MaskLayer *masklay;
+ MaskLayer *masklay;
- for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
- if (ED_mask_layer_select_check(masklay)) {
- return true;
- }
- }
+ for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
+ if (ED_mask_layer_select_check(masklay)) {
+ return true;
+ }
+ }
- return false;
+ return false;
}
/* 'sel' select */
void ED_mask_spline_select_set(MaskSpline *spline, const bool do_select)
{
- int i;
+ int i;
- if (do_select)
- spline->flag |= SELECT;
- else
- spline->flag &= ~SELECT;
+ if (do_select)
+ spline->flag |= SELECT;
+ else
+ spline->flag &= ~SELECT;
- for (i = 0; i < spline->tot_point; i++) {
- MaskSplinePoint *point = &spline->points[i];
+ for (i = 0; i < spline->tot_point; i++) {
+ MaskSplinePoint *point = &spline->points[i];
- BKE_mask_point_select_set(point, do_select);
- }
+ BKE_mask_point_select_set(point, do_select);
+ }
}
void ED_mask_layer_select_set(MaskLayer *masklay, const bool do_select)
{
- MaskSpline *spline;
+ MaskSpline *spline;
- if (masklay->restrictflag & MASK_RESTRICT_SELECT) {
- if (do_select == true) {
- return;
- }
- }
+ if (masklay->restrictflag & MASK_RESTRICT_SELECT) {
+ if (do_select == true) {
+ return;
+ }
+ }
- for (spline = masklay->splines.first; spline; spline = spline->next) {
- ED_mask_spline_select_set(spline, do_select);
- }
+ for (spline = masklay->splines.first; spline; spline = spline->next) {
+ ED_mask_spline_select_set(spline, do_select);
+ }
}
void ED_mask_select_toggle_all(Mask *mask, int action)
{
- MaskLayer *masklay;
-
- if (action == SEL_TOGGLE) {
- if (ED_mask_select_check(mask))
- action = SEL_DESELECT;
- else
- action = SEL_SELECT;
- }
-
- for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
-
- if (masklay->restrictflag & MASK_RESTRICT_VIEW) {
- continue;
- }
-
- if (action == SEL_INVERT) {
- /* we don't have generic functions for this, its restricted to this operator
- * if one day we need to re-use such functionality, they can be split out */
-
- MaskSpline *spline;
- if (masklay->restrictflag & MASK_RESTRICT_SELECT) {
- continue;
- }
- for (spline = masklay->splines.first; spline; spline = spline->next) {
- int i;
- for (i = 0; i < spline->tot_point; i++) {
- MaskSplinePoint *point = &spline->points[i];
- BKE_mask_point_select_set(point, !MASKPOINT_ISSEL_ANY(point));
- }
- }
-
- }
- else {
- ED_mask_layer_select_set(masklay, (action == SEL_SELECT) ? true : false);
- }
- }
+ MaskLayer *masklay;
+
+ if (action == SEL_TOGGLE) {
+ if (ED_mask_select_check(mask))
+ action = SEL_DESELECT;
+ else
+ action = SEL_SELECT;
+ }
+
+ for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
+
+ if (masklay->restrictflag & MASK_RESTRICT_VIEW) {
+ continue;
+ }
+
+ if (action == SEL_INVERT) {
+ /* we don't have generic functions for this, its restricted to this operator
+ * if one day we need to re-use such functionality, they can be split out */
+
+ MaskSpline *spline;
+ if (masklay->restrictflag & MASK_RESTRICT_SELECT) {
+ continue;
+ }
+ for (spline = masklay->splines.first; spline; spline = spline->next) {
+ int i;
+ for (i = 0; i < spline->tot_point; i++) {
+ MaskSplinePoint *point = &spline->points[i];
+ BKE_mask_point_select_set(point, !MASKPOINT_ISSEL_ANY(point));
+ }
+ }
+ }
+ else {
+ ED_mask_layer_select_set(masklay, (action == SEL_SELECT) ? true : false);
+ }
+ }
}
void ED_mask_select_flush_all(Mask *mask)
{
- MaskLayer *masklay;
-
- for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
- MaskSpline *spline;
-
- for (spline = masklay->splines.first; spline; spline = spline->next) {
- int i;
-
- spline->flag &= ~SELECT;
-
- /* intentionally _dont_ do this in the masklay loop
- * so we clear flags on all splines */
- if (masklay->restrictflag & MASK_RESTRICT_VIEW) {
- continue;
- }
-
- for (i = 0; i < spline->tot_point; i++) {
- MaskSplinePoint *cur_point = &spline->points[i];
-
- if (MASKPOINT_ISSEL_ANY(cur_point)) {
- spline->flag |= SELECT;
- }
- else {
- int j;
-
- for (j = 0; j < cur_point->tot_uw; j++) {
- if (cur_point->uw[j].flag & SELECT) {
- spline->flag |= SELECT;
- break;
- }
- }
- }
- }
- }
- }
+ MaskLayer *masklay;
+
+ for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
+ MaskSpline *spline;
+
+ for (spline = masklay->splines.first; spline; spline = spline->next) {
+ int i;
+
+ spline->flag &= ~SELECT;
+
+ /* intentionally _dont_ do this in the masklay loop
+ * so we clear flags on all splines */
+ if (masklay->restrictflag & MASK_RESTRICT_VIEW) {
+ continue;
+ }
+
+ for (i = 0; i < spline->tot_point; i++) {
+ MaskSplinePoint *cur_point = &spline->points[i];
+
+ if (MASKPOINT_ISSEL_ANY(cur_point)) {
+ spline->flag |= SELECT;
+ }
+ else {
+ int j;
+
+ for (j = 0; j < cur_point->tot_uw; j++) {
+ if (cur_point->uw[j].flag & SELECT) {
+ spline->flag |= SELECT;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
}
/** \} */
@@ -213,33 +212,33 @@ void ED_mask_select_flush_all(Mask *mask)
static int select_all_exec(bContext *C, wmOperator *op)
{
- Mask *mask = CTX_data_edit_mask(C);
- int action = RNA_enum_get(op->ptr, "action");
+ Mask *mask = CTX_data_edit_mask(C);
+ int action = RNA_enum_get(op->ptr, "action");
- ED_mask_select_toggle_all(mask, action);
- ED_mask_select_flush_all(mask);
+ ED_mask_select_toggle_all(mask, action);
+ ED_mask_select_flush_all(mask);
- WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+ WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
void MASK_OT_select_all(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "(De)select All";
- ot->description = "Change selection of all curve points";
- ot->idname = "MASK_OT_select_all";
+ /* identifiers */
+ ot->name = "(De)select All";
+ ot->description = "Change selection of all curve points";
+ ot->idname = "MASK_OT_select_all";
- /* api callbacks */
- ot->exec = select_all_exec;
- ot->poll = ED_maskedit_mask_poll;
+ /* api callbacks */
+ ot->exec = select_all_exec;
+ ot->poll = ED_maskedit_mask_poll;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
- /* properties */
- WM_operator_properties_select_all(ot);
+ /* properties */
+ WM_operator_properties_select_all(ot);
}
/** \} */
@@ -250,152 +249,164 @@ void MASK_OT_select_all(wmOperatorType *ot)
static int select_exec(bContext *C, wmOperator *op)
{
- Mask *mask = CTX_data_edit_mask(C);
- MaskLayer *masklay;
- MaskSpline *spline;
- MaskSplinePoint *point = NULL;
- float co[2];
- bool extend = RNA_boolean_get(op->ptr, "extend");
- bool deselect = RNA_boolean_get(op->ptr, "deselect");
- bool toggle = RNA_boolean_get(op->ptr, "toggle");
- eMaskWhichHandle which_handle;
- const float threshold = 19;
-
- RNA_float_get_array(op->ptr, "location", co);
-
- point = ED_mask_point_find_nearest(C, mask, co, threshold, &masklay, &spline, &which_handle, NULL);
-
- if (extend == false && deselect == false && toggle == false)
- ED_mask_select_toggle_all(mask, SEL_DESELECT);
-
- if (point) {
- if (which_handle != MASK_WHICH_HANDLE_NONE) {
- if (extend) {
- masklay->act_spline = spline;
- masklay->act_point = point;
-
- BKE_mask_point_select_set_handle(point, which_handle, true);
- }
- else if (deselect) {
- BKE_mask_point_select_set_handle(point, which_handle, false);
- }
- else {
- masklay->act_spline = spline;
- masklay->act_point = point;
-
- if (!MASKPOINT_ISSEL_HANDLE(point, which_handle)) {
- BKE_mask_point_select_set_handle(point, which_handle, true);
- }
- else if (toggle) {
- BKE_mask_point_select_set_handle(point, which_handle, false);
- }
- }
- }
- else {
- if (extend) {
- masklay->act_spline = spline;
- masklay->act_point = point;
-
- BKE_mask_point_select_set(point, true);
- }
- else if (deselect) {
- BKE_mask_point_select_set(point, false);
- }
- else {
- masklay->act_spline = spline;
- masklay->act_point = point;
-
- if (!MASKPOINT_ISSEL_ANY(point)) {
- BKE_mask_point_select_set(point, true);
- }
- else if (toggle) {
- BKE_mask_point_select_set(point, false);
- }
- }
- }
-
- masklay->act_spline = spline;
- masklay->act_point = point;
-
- ED_mask_select_flush_all(mask);
-
- WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
-
- return OPERATOR_FINISHED;
- }
- else {
- MaskSplinePointUW *uw;
-
- if (ED_mask_feather_find_nearest(C, mask, co, threshold, &masklay, &spline, &point, &uw, NULL)) {
-
- if (extend) {
- masklay->act_spline = spline;
- masklay->act_point = point;
-
- if (uw) uw->flag |= SELECT;
- }
- else if (deselect) {
- if (uw) uw->flag &= ~SELECT;
- }
- else {
- masklay->act_spline = spline;
- masklay->act_point = point;
-
- if (uw) {
- if (!(uw->flag & SELECT)) {
- uw->flag |= SELECT;
- }
- else if (toggle) {
- uw->flag &= ~SELECT;
- }
- }
- }
-
- ED_mask_select_flush_all(mask);
-
- WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
-
- return OPERATOR_FINISHED;
- }
- }
-
- return OPERATOR_PASS_THROUGH;
+ Mask *mask = CTX_data_edit_mask(C);
+ MaskLayer *masklay;
+ MaskSpline *spline;
+ MaskSplinePoint *point = NULL;
+ float co[2];
+ bool extend = RNA_boolean_get(op->ptr, "extend");
+ bool deselect = RNA_boolean_get(op->ptr, "deselect");
+ bool toggle = RNA_boolean_get(op->ptr, "toggle");
+ eMaskWhichHandle which_handle;
+ const float threshold = 19;
+
+ RNA_float_get_array(op->ptr, "location", co);
+
+ point = ED_mask_point_find_nearest(
+ C, mask, co, threshold, &masklay, &spline, &which_handle, NULL);
+
+ if (extend == false && deselect == false && toggle == false)
+ ED_mask_select_toggle_all(mask, SEL_DESELECT);
+
+ if (point) {
+ if (which_handle != MASK_WHICH_HANDLE_NONE) {
+ if (extend) {
+ masklay->act_spline = spline;
+ masklay->act_point = point;
+
+ BKE_mask_point_select_set_handle(point, which_handle, true);
+ }
+ else if (deselect) {
+ BKE_mask_point_select_set_handle(point, which_handle, false);
+ }
+ else {
+ masklay->act_spline = spline;
+ masklay->act_point = point;
+
+ if (!MASKPOINT_ISSEL_HANDLE(point, which_handle)) {
+ BKE_mask_point_select_set_handle(point, which_handle, true);
+ }
+ else if (toggle) {
+ BKE_mask_point_select_set_handle(point, which_handle, false);
+ }
+ }
+ }
+ else {
+ if (extend) {
+ masklay->act_spline = spline;
+ masklay->act_point = point;
+
+ BKE_mask_point_select_set(point, true);
+ }
+ else if (deselect) {
+ BKE_mask_point_select_set(point, false);
+ }
+ else {
+ masklay->act_spline = spline;
+ masklay->act_point = point;
+
+ if (!MASKPOINT_ISSEL_ANY(point)) {
+ BKE_mask_point_select_set(point, true);
+ }
+ else if (toggle) {
+ BKE_mask_point_select_set(point, false);
+ }
+ }
+ }
+
+ masklay->act_spline = spline;
+ masklay->act_point = point;
+
+ ED_mask_select_flush_all(mask);
+
+ WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+
+ return OPERATOR_FINISHED;
+ }
+ else {
+ MaskSplinePointUW *uw;
+
+ if (ED_mask_feather_find_nearest(
+ C, mask, co, threshold, &masklay, &spline, &point, &uw, NULL)) {
+
+ if (extend) {
+ masklay->act_spline = spline;
+ masklay->act_point = point;
+
+ if (uw)
+ uw->flag |= SELECT;
+ }
+ else if (deselect) {
+ if (uw)
+ uw->flag &= ~SELECT;
+ }
+ else {
+ masklay->act_spline = spline;
+ masklay->act_point = point;
+
+ if (uw) {
+ if (!(uw->flag & SELECT)) {
+ uw->flag |= SELECT;
+ }
+ else if (toggle) {
+ uw->flag &= ~SELECT;
+ }
+ }
+ }
+
+ ED_mask_select_flush_all(mask);
+
+ WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+
+ return OPERATOR_FINISHED;
+ }
+ }
+
+ return OPERATOR_PASS_THROUGH;
}
static int select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- ScrArea *sa = CTX_wm_area(C);
- ARegion *ar = CTX_wm_region(C);
+ ScrArea *sa = CTX_wm_area(C);
+ ARegion *ar = CTX_wm_region(C);
- float co[2];
+ float co[2];
- ED_mask_mouse_pos(sa, ar, event->mval, co);
+ ED_mask_mouse_pos(sa, ar, event->mval, co);
- RNA_float_set_array(op->ptr, "location", co);
+ RNA_float_set_array(op->ptr, "location", co);
- return select_exec(C, op);
+ return select_exec(C, op);
}
void MASK_OT_select(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Select";
- ot->description = "Select spline points";
- ot->idname = "MASK_OT_select";
-
- /* api callbacks */
- ot->exec = select_exec;
- ot->invoke = select_invoke;
- ot->poll = ED_maskedit_mask_poll;
-
- /* flags */
- ot->flag = OPTYPE_UNDO;
-
- /* properties */
- WM_operator_properties_mouse_select(ot);
-
- RNA_def_float_vector(ot->srna, "location", 2, NULL, -FLT_MAX, FLT_MAX,
- "Location", "Location of vertex in normalized space", -1.0f, 1.0f);
+ /* identifiers */
+ ot->name = "Select";
+ ot->description = "Select spline points";
+ ot->idname = "MASK_OT_select";
+
+ /* api callbacks */
+ ot->exec = select_exec;
+ ot->invoke = select_invoke;
+ ot->poll = ED_maskedit_mask_poll;
+
+ /* flags */
+ ot->flag = OPTYPE_UNDO;
+
+ /* properties */
+ WM_operator_properties_mouse_select(ot);
+
+ RNA_def_float_vector(ot->srna,
+ "location",
+ 2,
+ NULL,
+ -FLT_MAX,
+ FLT_MAX,
+ "Location",
+ "Location of vertex in normalized space",
+ -1.0f,
+ 1.0f);
}
/** \} */
@@ -406,86 +417,86 @@ void MASK_OT_select(wmOperatorType *ot)
static int box_select_exec(bContext *C, wmOperator *op)
{
- ScrArea *sa = CTX_wm_area(C);
- ARegion *ar = CTX_wm_region(C);
+ ScrArea *sa = CTX_wm_area(C);
+ ARegion *ar = CTX_wm_region(C);
- Mask *mask = CTX_data_edit_mask(C);
- MaskLayer *masklay;
- int i;
+ Mask *mask = CTX_data_edit_mask(C);
+ MaskLayer *masklay;
+ int i;
- rcti rect;
- rctf rectf;
- bool changed = false;
+ rcti rect;
+ rctf rectf;
+ bool changed = false;
- const eSelectOp sel_op = RNA_enum_get(op->ptr, "mode");
- const bool select = (sel_op != SEL_OP_SUB);
- if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
- ED_mask_select_toggle_all(mask, SEL_DESELECT);
- changed = true;
- }
+ const eSelectOp sel_op = RNA_enum_get(op->ptr, "mode");
+ const bool select = (sel_op != SEL_OP_SUB);
+ if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
+ ED_mask_select_toggle_all(mask, SEL_DESELECT);
+ changed = true;
+ }
- /* get rectangle from operator */
- WM_operator_properties_border_to_rcti(op, &rect);
+ /* get rectangle from operator */
+ WM_operator_properties_border_to_rcti(op, &rect);
- ED_mask_point_pos(sa, ar, rect.xmin, rect.ymin, &rectf.xmin, &rectf.ymin);
- ED_mask_point_pos(sa, ar, rect.xmax, rect.ymax, &rectf.xmax, &rectf.ymax);
+ ED_mask_point_pos(sa, ar, rect.xmin, rect.ymin, &rectf.xmin, &rectf.ymin);
+ ED_mask_point_pos(sa, ar, rect.xmax, rect.ymax, &rectf.xmax, &rectf.ymax);
- /* do actual selection */
- for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
- MaskSpline *spline;
+ /* do actual selection */
+ for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
+ MaskSpline *spline;
- if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
- continue;
- }
+ if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
+ continue;
+ }
- for (spline = masklay->splines.first; spline; spline = spline->next) {
- MaskSplinePoint *points_array = BKE_mask_spline_point_array(spline);
+ for (spline = masklay->splines.first; spline; spline = spline->next) {
+ MaskSplinePoint *points_array = BKE_mask_spline_point_array(spline);
- for (i = 0; i < spline->tot_point; i++) {
- MaskSplinePoint *point = &spline->points[i];
- MaskSplinePoint *point_deform = &points_array[i];
+ for (i = 0; i < spline->tot_point; i++) {
+ MaskSplinePoint *point = &spline->points[i];
+ MaskSplinePoint *point_deform = &points_array[i];
- /* TODO: handles? */
- /* TODO: uw? */
- if (BLI_rctf_isect_pt_v(&rectf, point_deform->bezt.vec[1])) {
- BKE_mask_point_select_set(point, select);
- BKE_mask_point_select_set_handle(point, MASK_WHICH_HANDLE_BOTH, select);
- changed = true;
- }
- }
- }
- }
+ /* TODO: handles? */
+ /* TODO: uw? */
+ if (BLI_rctf_isect_pt_v(&rectf, point_deform->bezt.vec[1])) {
+ BKE_mask_point_select_set(point, select);
+ BKE_mask_point_select_set_handle(point, MASK_WHICH_HANDLE_BOTH, select);
+ changed = true;
+ }
+ }
+ }
+ }
- if (changed) {
- ED_mask_select_flush_all(mask);
+ if (changed) {
+ ED_mask_select_flush_all(mask);
- WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+ WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
- return OPERATOR_FINISHED;
- }
+ return OPERATOR_FINISHED;
+ }
- return OPERATOR_CANCELLED;
+ return OPERATOR_CANCELLED;
}
void MASK_OT_select_box(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Box Select";
- ot->description = "Select curve points using box selection";
- ot->idname = "MASK_OT_select_box";
-
- /* api callbacks */
- ot->invoke = WM_gesture_box_invoke;
- ot->exec = box_select_exec;
- ot->modal = WM_gesture_box_modal;
- ot->poll = ED_maskedit_mask_poll;
-
- /* flags */
- ot->flag = OPTYPE_UNDO;
-
- /* properties */
- WM_operator_properties_gesture_box(ot);
- WM_operator_properties_select_operation_simple(ot);
+ /* identifiers */
+ ot->name = "Box Select";
+ ot->description = "Select curve points using box selection";
+ ot->idname = "MASK_OT_select_box";
+
+ /* api callbacks */
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = box_select_exec;
+ ot->modal = WM_gesture_box_modal;
+ ot->poll = ED_maskedit_mask_poll;
+
+ /* flags */
+ ot->flag = OPTYPE_UNDO;
+
+ /* properties */
+ WM_operator_properties_gesture_box(ot);
+ WM_operator_properties_select_operation_simple(ot);
}
/** \} */
@@ -494,112 +505,117 @@ void MASK_OT_select_box(wmOperatorType *ot)
/** \name Lasso Select Operator
* \{ */
-static bool do_lasso_select_mask(bContext *C, const int mcords[][2], short moves, const eSelectOp sel_op)
+static bool do_lasso_select_mask(bContext *C,
+ const int mcords[][2],
+ short moves,
+ const eSelectOp sel_op)
{
- ScrArea *sa = CTX_wm_area(C);
- ARegion *ar = CTX_wm_region(C);
-
- Mask *mask = CTX_data_edit_mask(C);
- MaskLayer *masklay;
- int i;
-
- rcti rect;
- bool changed = false;
-
- const bool select = (sel_op != SEL_OP_SUB);
- if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
- ED_mask_select_toggle_all(mask, SEL_DESELECT);
- changed = true;
- }
-
- /* get rectangle from operator */
- BLI_lasso_boundbox(&rect, mcords, moves);
-
- /* do actual selection */
- for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
- MaskSpline *spline;
-
- if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
- continue;
- }
-
- for (spline = masklay->splines.first; spline; spline = spline->next) {
- MaskSplinePoint *points_array = BKE_mask_spline_point_array(spline);
-
- for (i = 0; i < spline->tot_point; i++) {
- MaskSplinePoint *point = &spline->points[i];
- MaskSplinePoint *point_deform = &points_array[i];
-
- /* TODO: handles? */
- /* TODO: uw? */
-
- if (MASKPOINT_ISSEL_ANY(point) && select) {
- continue;
- }
-
- float screen_co[2];
-
- /* point in screen coords */
- ED_mask_point_pos__reverse(sa, ar,
- point_deform->bezt.vec[1][0], point_deform->bezt.vec[1][1],
- &screen_co[0], &screen_co[1]);
-
- if (BLI_rcti_isect_pt(&rect, screen_co[0], screen_co[1]) &&
- BLI_lasso_is_point_inside(mcords, moves, screen_co[0], screen_co[1], INT_MAX))
- {
- BKE_mask_point_select_set(point, select);
- BKE_mask_point_select_set_handle(point, MASK_WHICH_HANDLE_BOTH, select);
- changed = true;
- }
- }
- }
- }
-
- if (changed) {
- ED_mask_select_flush_all(mask);
-
- WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
- }
-
- return changed;
+ ScrArea *sa = CTX_wm_area(C);
+ ARegion *ar = CTX_wm_region(C);
+
+ Mask *mask = CTX_data_edit_mask(C);
+ MaskLayer *masklay;
+ int i;
+
+ rcti rect;
+ bool changed = false;
+
+ const bool select = (sel_op != SEL_OP_SUB);
+ if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
+ ED_mask_select_toggle_all(mask, SEL_DESELECT);
+ changed = true;
+ }
+
+ /* get rectangle from operator */
+ BLI_lasso_boundbox(&rect, mcords, moves);
+
+ /* do actual selection */
+ for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
+ MaskSpline *spline;
+
+ if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
+ continue;
+ }
+
+ for (spline = masklay->splines.first; spline; spline = spline->next) {
+ MaskSplinePoint *points_array = BKE_mask_spline_point_array(spline);
+
+ for (i = 0; i < spline->tot_point; i++) {
+ MaskSplinePoint *point = &spline->points[i];
+ MaskSplinePoint *point_deform = &points_array[i];
+
+ /* TODO: handles? */
+ /* TODO: uw? */
+
+ if (MASKPOINT_ISSEL_ANY(point) && select) {
+ continue;
+ }
+
+ float screen_co[2];
+
+ /* point in screen coords */
+ ED_mask_point_pos__reverse(sa,
+ ar,
+ point_deform->bezt.vec[1][0],
+ point_deform->bezt.vec[1][1],
+ &screen_co[0],
+ &screen_co[1]);
+
+ if (BLI_rcti_isect_pt(&rect, screen_co[0], screen_co[1]) &&
+ BLI_lasso_is_point_inside(mcords, moves, screen_co[0], screen_co[1], INT_MAX)) {
+ BKE_mask_point_select_set(point, select);
+ BKE_mask_point_select_set_handle(point, MASK_WHICH_HANDLE_BOTH, select);
+ changed = true;
+ }
+ }
+ }
+ }
+
+ if (changed) {
+ ED_mask_select_flush_all(mask);
+
+ WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+ }
+
+ return changed;
}
static int clip_lasso_select_exec(bContext *C, wmOperator *op)
{
- int mcords_tot;
- const int (*mcords)[2] = WM_gesture_lasso_path_to_array(C, op, &mcords_tot);
+ int mcords_tot;
+ const int(*mcords)[2] = WM_gesture_lasso_path_to_array(C, op, &mcords_tot);
- if (mcords) {
- const eSelectOp sel_op = RNA_enum_get(op->ptr, "mode");
- do_lasso_select_mask(C, mcords, mcords_tot, sel_op);
+ if (mcords) {
+ const eSelectOp sel_op = RNA_enum_get(op->ptr, "mode");
+ do_lasso_select_mask(C, mcords, mcords_tot, sel_op);
- MEM_freeN((void *)mcords);
+ MEM_freeN((void *)mcords);
- return OPERATOR_FINISHED;
- }
- return OPERATOR_PASS_THROUGH;
+ return OPERATOR_FINISHED;
+ }
+ return OPERATOR_PASS_THROUGH;
}
void MASK_OT_select_lasso(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Lasso Select";
- ot->description = "Select curve points using lasso selection";
- ot->idname = "MASK_OT_select_lasso";
-
- /* api callbacks */
- ot->invoke = WM_gesture_lasso_invoke;
- ot->modal = WM_gesture_lasso_modal;
- ot->exec = clip_lasso_select_exec;
- ot->poll = ED_maskedit_mask_poll;
- ot->cancel = WM_gesture_lasso_cancel;
-
- /* flags */
- ot->flag = OPTYPE_UNDO;
-
- /* properties */
- WM_operator_properties_gesture_lasso(ot);
- WM_operator_properties_select_operation_simple(ot);
+ /* identifiers */
+ ot->name = "Lasso Select";
+ ot->description = "Select curve points using lasso selection";
+ ot->idname = "MASK_OT_select_lasso";
+
+ /* api callbacks */
+ ot->invoke = WM_gesture_lasso_invoke;
+ ot->modal = WM_gesture_lasso_modal;
+ ot->exec = clip_lasso_select_exec;
+ ot->poll = ED_maskedit_mask_poll;
+ ot->cancel = WM_gesture_lasso_cancel;
+
+ /* flags */
+ ot->flag = OPTYPE_UNDO;
+
+ /* properties */
+ WM_operator_properties_gesture_lasso(ot);
+ WM_operator_properties_select_operation_simple(ot);
}
/** \} */
@@ -608,108 +624,110 @@ void MASK_OT_select_lasso(wmOperatorType *ot)
/** \name Circle Select Operator
* \{ */
-static int mask_spline_point_inside_ellipse(BezTriple *bezt, const float offset[2], const float ellipse[2])
+static int mask_spline_point_inside_ellipse(BezTriple *bezt,
+ const float offset[2],
+ const float ellipse[2])
{
- /* normalized ellipse: ell[0] = scaleX, ell[1] = scaleY */
- float x, y;
+ /* normalized ellipse: ell[0] = scaleX, ell[1] = scaleY */
+ float x, y;
- x = (bezt->vec[1][0] - offset[0]) * ellipse[0];
- y = (bezt->vec[1][1] - offset[1]) * ellipse[1];
+ x = (bezt->vec[1][0] - offset[0]) * ellipse[0];
+ y = (bezt->vec[1][1] - offset[1]) * ellipse[1];
- return x * x + y * y < 1.0f;
+ return x * x + y * y < 1.0f;
}
static int circle_select_exec(bContext *C, wmOperator *op)
{
- ScrArea *sa = CTX_wm_area(C);
- ARegion *ar = CTX_wm_region(C);
+ ScrArea *sa = CTX_wm_area(C);
+ ARegion *ar = CTX_wm_region(C);
- Mask *mask = CTX_data_edit_mask(C);
- MaskLayer *masklay;
- int i;
+ Mask *mask = CTX_data_edit_mask(C);
+ MaskLayer *masklay;
+ int i;
- float zoomx, zoomy, offset[2], ellipse[2];
- int width, height;
- bool changed = false;
+ float zoomx, zoomy, offset[2], ellipse[2];
+ int width, height;
+ bool changed = false;
- /* get operator properties */
- const int x = RNA_int_get(op->ptr, "x");
- const int y = RNA_int_get(op->ptr, "y");
- const int radius = RNA_int_get(op->ptr, "radius");
+ /* get operator properties */
+ const int x = RNA_int_get(op->ptr, "x");
+ const int y = RNA_int_get(op->ptr, "y");
+ const int radius = RNA_int_get(op->ptr, "radius");
- /* compute ellipse and position in unified coordinates */
- ED_mask_get_size(sa, &width, &height);
- ED_mask_zoom(sa, ar, &zoomx, &zoomy);
- width = height = max_ii(width, height);
+ /* compute ellipse and position in unified coordinates */
+ ED_mask_get_size(sa, &width, &height);
+ ED_mask_zoom(sa, ar, &zoomx, &zoomy);
+ width = height = max_ii(width, height);
- ellipse[0] = width * zoomx / radius;
- ellipse[1] = height * zoomy / radius;
+ ellipse[0] = width * zoomx / radius;
+ ellipse[1] = height * zoomy / radius;
- ED_mask_point_pos(sa, ar, x, y, &offset[0], &offset[1]);
+ ED_mask_point_pos(sa, ar, x, y, &offset[0], &offset[1]);
- const eSelectOp sel_op = ED_select_op_modal(
- RNA_enum_get(op->ptr, "mode"), WM_gesture_is_modal_first(op->customdata));
- const bool select = (sel_op != SEL_OP_SUB);
- if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
- ED_mask_select_toggle_all(mask, SEL_DESELECT);
- changed = true;
- }
+ const eSelectOp sel_op = ED_select_op_modal(RNA_enum_get(op->ptr, "mode"),
+ WM_gesture_is_modal_first(op->customdata));
+ const bool select = (sel_op != SEL_OP_SUB);
+ if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
+ ED_mask_select_toggle_all(mask, SEL_DESELECT);
+ changed = true;
+ }
- /* do actual selection */
- for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
- MaskSpline *spline;
+ /* do actual selection */
+ for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
+ MaskSpline *spline;
- if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
- continue;
- }
+ if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
+ continue;
+ }
- for (spline = masklay->splines.first; spline; spline = spline->next) {
- MaskSplinePoint *points_array = BKE_mask_spline_point_array(spline);
+ for (spline = masklay->splines.first; spline; spline = spline->next) {
+ MaskSplinePoint *points_array = BKE_mask_spline_point_array(spline);
- for (i = 0; i < spline->tot_point; i++) {
- MaskSplinePoint *point = &spline->points[i];
- MaskSplinePoint *point_deform = &points_array[i];
+ for (i = 0; i < spline->tot_point; i++) {
+ MaskSplinePoint *point = &spline->points[i];
+ MaskSplinePoint *point_deform = &points_array[i];
- if (mask_spline_point_inside_ellipse(&point_deform->bezt, offset, ellipse)) {
- BKE_mask_point_select_set(point, select);
- BKE_mask_point_select_set_handle(point, MASK_WHICH_HANDLE_BOTH, select);
+ if (mask_spline_point_inside_ellipse(&point_deform->bezt, offset, ellipse)) {
+ BKE_mask_point_select_set(point, select);
+ BKE_mask_point_select_set_handle(point, MASK_WHICH_HANDLE_BOTH, select);
- changed = true;
- }
- }
- }
- }
+ changed = true;
+ }
+ }
+ }
+ }
- if (changed) {
- ED_mask_select_flush_all(mask);
+ if (changed) {
+ ED_mask_select_flush_all(mask);
- WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+ WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
- return OPERATOR_FINISHED;
- }
+ return OPERATOR_FINISHED;
+ }
- return OPERATOR_CANCELLED;
+ return OPERATOR_CANCELLED;
}
void MASK_OT_select_circle(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Circle Select";
- ot->description = "Select curve points using circle selection";
- ot->idname = "MASK_OT_select_circle";
-
- /* api callbacks */
- ot->invoke = WM_gesture_circle_invoke;
- ot->modal = WM_gesture_circle_modal;
- ot->exec = circle_select_exec;
- ot->poll = ED_maskedit_mask_poll;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* properties */
- WM_operator_properties_gesture_circle(ot);
- WM_operator_properties_select_operation_simple(ot);
+ /* identifiers */
+ ot->name = "Circle Select";
+ ot->description = "Select curve points using circle selection";
+ ot->idname = "MASK_OT_select_circle";
+
+ /* api callbacks */
+ ot->invoke = WM_gesture_circle_invoke;
+ ot->modal = WM_gesture_circle_modal;
+ ot->exec = circle_select_exec;
+ ot->poll = ED_maskedit_mask_poll;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* properties */
+ WM_operator_properties_gesture_circle(ot);
+ WM_operator_properties_select_operation_simple(ot);
}
/** \} */
@@ -720,56 +738,56 @@ void MASK_OT_select_circle(wmOperatorType *ot)
static int mask_select_linked_pick_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- ScrArea *sa = CTX_wm_area(C);
- ARegion *ar = CTX_wm_region(C);
+ ScrArea *sa = CTX_wm_area(C);
+ ARegion *ar = CTX_wm_region(C);
- Mask *mask = CTX_data_edit_mask(C);
- MaskLayer *masklay;
- MaskSpline *spline;
- MaskSplinePoint *point = NULL;
- float co[2];
- bool do_select = !RNA_boolean_get(op->ptr, "deselect");
- const float threshold = 19;
- bool changed = false;
+ Mask *mask = CTX_data_edit_mask(C);
+ MaskLayer *masklay;
+ MaskSpline *spline;
+ MaskSplinePoint *point = NULL;
+ float co[2];
+ bool do_select = !RNA_boolean_get(op->ptr, "deselect");
+ const float threshold = 19;
+ bool changed = false;
- ED_mask_mouse_pos(sa, ar, event->mval, co);
+ ED_mask_mouse_pos(sa, ar, event->mval, co);
- point = ED_mask_point_find_nearest(C, mask, co, threshold, &masklay, &spline, NULL, NULL);
+ point = ED_mask_point_find_nearest(C, mask, co, threshold, &masklay, &spline, NULL, NULL);
- if (point) {
- ED_mask_spline_select_set(spline, do_select);
- masklay->act_spline = spline;
- masklay->act_point = point;
+ if (point) {
+ ED_mask_spline_select_set(spline, do_select);
+ masklay->act_spline = spline;
+ masklay->act_point = point;
- changed = true;
- }
+ changed = true;
+ }
- if (changed) {
- ED_mask_select_flush_all(mask);
+ if (changed) {
+ ED_mask_select_flush_all(mask);
- WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+ WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
- return OPERATOR_FINISHED;
- }
+ return OPERATOR_FINISHED;
+ }
- return OPERATOR_CANCELLED;
+ return OPERATOR_CANCELLED;
}
void MASK_OT_select_linked_pick(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Select Linked";
- ot->idname = "MASK_OT_select_linked_pick";
- ot->description = "(De)select all points linked to the curve under the mouse cursor";
+ /* identifiers */
+ ot->name = "Select Linked";
+ ot->idname = "MASK_OT_select_linked_pick";
+ ot->description = "(De)select all points linked to the curve under the mouse cursor";
- /* api callbacks */
- ot->invoke = mask_select_linked_pick_invoke;
- ot->poll = ED_maskedit_mask_poll;
+ /* api callbacks */
+ ot->invoke = mask_select_linked_pick_invoke;
+ ot->poll = ED_maskedit_mask_poll;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
- RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "");
+ RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "");
}
/** \} */
@@ -780,51 +798,51 @@ void MASK_OT_select_linked_pick(wmOperatorType *ot)
static int mask_select_linked_exec(bContext *C, wmOperator *UNUSED(op))
{
- Mask *mask = CTX_data_edit_mask(C);
- MaskLayer *masklay;
+ Mask *mask = CTX_data_edit_mask(C);
+ MaskLayer *masklay;
- bool changed = false;
+ bool changed = false;
- /* do actual selection */
- for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
- MaskSpline *spline;
+ /* do actual selection */
+ for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
+ MaskSpline *spline;
- if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
- continue;
- }
+ if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
+ continue;
+ }
- for (spline = masklay->splines.first; spline; spline = spline->next) {
- if (ED_mask_spline_select_check(spline)) {
- ED_mask_spline_select_set(spline, true);
- changed = true;
- }
- }
- }
+ for (spline = masklay->splines.first; spline; spline = spline->next) {
+ if (ED_mask_spline_select_check(spline)) {
+ ED_mask_spline_select_set(spline, true);
+ changed = true;
+ }
+ }
+ }
- if (changed) {
- ED_mask_select_flush_all(mask);
+ if (changed) {
+ ED_mask_select_flush_all(mask);
- WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+ WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
- return OPERATOR_FINISHED;
- }
+ return OPERATOR_FINISHED;
+ }
- return OPERATOR_CANCELLED;
+ return OPERATOR_CANCELLED;
}
void MASK_OT_select_linked(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Select Linked All";
- ot->idname = "MASK_OT_select_linked";
- ot->description = "Select all curve points linked to already selected ones";
+ /* identifiers */
+ ot->name = "Select Linked All";
+ ot->idname = "MASK_OT_select_linked";
+ ot->description = "Select all curve points linked to already selected ones";
- /* api callbacks */
- ot->exec = mask_select_linked_exec;
- ot->poll = ED_maskedit_mask_poll;
+ /* api callbacks */
+ ot->exec = mask_select_linked_exec;
+ ot->poll = ED_maskedit_mask_poll;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/** \} */
@@ -835,118 +853,118 @@ void MASK_OT_select_linked(wmOperatorType *ot)
static int mask_select_more_less(bContext *C, bool more)
{
- Mask *mask = CTX_data_edit_mask(C);
- MaskLayer *masklay;
-
- for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
- MaskSpline *spline;
-
- if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
- continue;
- }
-
- for (spline = masklay->splines.first; spline; spline = spline->next) {
- const bool cyclic = (spline->flag & MASK_SPLINE_CYCLIC) != 0;
- bool start_sel, end_sel, prev_sel, cur_sel;
- int i;
-
- /* reselect point if any handle is selected to make the result more predictable */
- for (i = 0; i < spline->tot_point; i++) {
- BKE_mask_point_select_set(spline->points + i, MASKPOINT_ISSEL_ANY(spline->points + i));
- }
-
- /* select more/less does not affect empty/single point splines */
- if (spline->tot_point < 2) {
- continue;
- }
-
- if (cyclic) {
- start_sel = !!MASKPOINT_ISSEL_KNOT(spline->points);
- end_sel = !!MASKPOINT_ISSEL_KNOT(&spline->points[spline->tot_point - 1]);
- }
- else {
- start_sel = false;
- end_sel = false;
- }
-
- for (i = 0; i < spline->tot_point; i++) {
- if (i == 0 && !cyclic) {
- continue;
- }
-
- prev_sel = (i > 0) ? !!MASKPOINT_ISSEL_KNOT(&spline->points[i - 1]) : end_sel;
- cur_sel = !!MASKPOINT_ISSEL_KNOT(&spline->points[i]);
-
- if (cur_sel != more) {
- if (prev_sel == more) {
- BKE_mask_point_select_set(&spline->points[i], more);
- }
- i++;
- }
- }
-
- for (i = spline->tot_point - 1; i >= 0; i--) {
- if (i == spline->tot_point - 1 && !cyclic) {
- continue;
- }
-
- prev_sel = (i < spline->tot_point - 1) ? !!MASKPOINT_ISSEL_KNOT(&spline->points[i + 1]) : start_sel;
- cur_sel = !!MASKPOINT_ISSEL_KNOT(&spline->points[i]);
-
- if (cur_sel != more) {
- if (prev_sel == more) {
- BKE_mask_point_select_set(&spline->points[i], more);
- }
- i--;
- }
- }
- }
- }
-
- WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
-
- return OPERATOR_FINISHED;
+ Mask *mask = CTX_data_edit_mask(C);
+ MaskLayer *masklay;
+
+ for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
+ MaskSpline *spline;
+
+ if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
+ continue;
+ }
+
+ for (spline = masklay->splines.first; spline; spline = spline->next) {
+ const bool cyclic = (spline->flag & MASK_SPLINE_CYCLIC) != 0;
+ bool start_sel, end_sel, prev_sel, cur_sel;
+ int i;
+
+ /* reselect point if any handle is selected to make the result more predictable */
+ for (i = 0; i < spline->tot_point; i++) {
+ BKE_mask_point_select_set(spline->points + i, MASKPOINT_ISSEL_ANY(spline->points + i));
+ }
+
+ /* select more/less does not affect empty/single point splines */
+ if (spline->tot_point < 2) {
+ continue;
+ }
+
+ if (cyclic) {
+ start_sel = !!MASKPOINT_ISSEL_KNOT(spline->points);
+ end_sel = !!MASKPOINT_ISSEL_KNOT(&spline->points[spline->tot_point - 1]);
+ }
+ else {
+ start_sel = false;
+ end_sel = false;
+ }
+
+ for (i = 0; i < spline->tot_point; i++) {
+ if (i == 0 && !cyclic) {
+ continue;
+ }
+
+ prev_sel = (i > 0) ? !!MASKPOINT_ISSEL_KNOT(&spline->points[i - 1]) : end_sel;
+ cur_sel = !!MASKPOINT_ISSEL_KNOT(&spline->points[i]);
+
+ if (cur_sel != more) {
+ if (prev_sel == more) {
+ BKE_mask_point_select_set(&spline->points[i], more);
+ }
+ i++;
+ }
+ }
+
+ for (i = spline->tot_point - 1; i >= 0; i--) {
+ if (i == spline->tot_point - 1 && !cyclic) {
+ continue;
+ }
+
+ prev_sel = (i < spline->tot_point - 1) ? !!MASKPOINT_ISSEL_KNOT(&spline->points[i + 1]) :
+ start_sel;
+ cur_sel = !!MASKPOINT_ISSEL_KNOT(&spline->points[i]);
+
+ if (cur_sel != more) {
+ if (prev_sel == more) {
+ BKE_mask_point_select_set(&spline->points[i], more);
+ }
+ i--;
+ }
+ }
+ }
+ }
+
+ WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+
+ return OPERATOR_FINISHED;
}
static int mask_select_more_exec(bContext *C, wmOperator *UNUSED(op))
{
- return mask_select_more_less(C, true);
+ return mask_select_more_less(C, true);
}
void MASK_OT_select_more(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Select More";
- ot->idname = "MASK_OT_select_more";
- ot->description = "Select more spline points connected to initial selection";
+ /* identifiers */
+ ot->name = "Select More";
+ ot->idname = "MASK_OT_select_more";
+ ot->description = "Select more spline points connected to initial selection";
- /* api callbacks */
- ot->exec = mask_select_more_exec;
- ot->poll = ED_maskedit_mask_poll;
+ /* api callbacks */
+ ot->exec = mask_select_more_exec;
+ ot->poll = ED_maskedit_mask_poll;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
static int mask_select_less_exec(bContext *C, wmOperator *UNUSED(op))
{
- return mask_select_more_less(C, false);
+ return mask_select_more_less(C, false);
}
void MASK_OT_select_less(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Select Less";
- ot->idname = "MASK_OT_select_less";
- ot->description = "Deselect spline points at the boundary of each selection region";
+ /* identifiers */
+ ot->name = "Select Less";
+ ot->idname = "MASK_OT_select_less";
+ ot->description = "Deselect spline points at the boundary of each selection region";
- /* api callbacks */
- ot->exec = mask_select_less_exec;
- ot->poll = ED_maskedit_mask_poll;
+ /* api callbacks */
+ ot->exec = mask_select_less_exec;
+ ot->poll = ED_maskedit_mask_poll;
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-
/** \} */