WM: add checker_interval utility functions
authorCampbell Barton <ideasman42@gmail.com>
Sun, 27 Dec 2015 06:46:55 +0000 (17:46 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Sun, 27 Dec 2015 07:01:11 +0000 (18:01 +1100)
source/blender/editors/curve/editcurve_select.c
source/blender/editors/include/ED_curve.h
source/blender/editors/mesh/editmesh_select.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/intern/wm_operator_props.c

index 34ac3b8bb97ea6bacb97cfc3add23066b929946f..4855f9d1e6c22d66d4a14c805553c491d6061b2b 100644 (file)
@@ -1075,7 +1075,7 @@ void CURVE_OT_select_random(wmOperatorType *ot)
 
 /********************* every nth number of point *******************/
 
-static void select_nth_bezt(Nurb *nu, BezTriple *bezt, int nth, int skip, int offset)
+static void select_nth_bezt(Nurb *nu, BezTriple *bezt, const struct CheckerIntervalParams *params)
 {
        int a, start;
 
@@ -1085,7 +1085,7 @@ static void select_nth_bezt(Nurb *nu, BezTriple *bezt, int nth, int skip, int of
 
        while (a--) {
                const int depth = abs(start - a);
-               if ((offset + depth) % (skip + nth) >= skip) {
+               if (WM_operator_properties_checker_interval_test(params, depth)) {
                        select_beztriple(bezt, DESELECT, SELECT, HIDDEN);
                }
 
@@ -1093,7 +1093,7 @@ static void select_nth_bezt(Nurb *nu, BezTriple *bezt, int nth, int skip, int of
        }
 }
 
-static void select_nth_bp(Nurb *nu, BPoint *bp, int nth, int skip, int offset)
+static void select_nth_bp(Nurb *nu, BPoint *bp, const struct CheckerIntervalParams *params)
 {
        int a, startrow, startpnt;
        int row, pnt;
@@ -1108,7 +1108,7 @@ static void select_nth_bp(Nurb *nu, BPoint *bp, int nth, int skip, int offset)
 
        while (a--) {
                const int depth = abs(pnt - startpnt) + abs(row - startrow);
-               if ((offset + depth) % (skip + nth) >= skip) {
+               if (WM_operator_properties_checker_interval_test(params, depth)) {
                        select_bpoint(bp, DESELECT, SELECT, HIDDEN);
                }
 
@@ -1122,7 +1122,7 @@ static void select_nth_bp(Nurb *nu, BPoint *bp, int nth, int skip, int offset)
        }
 }
 
-bool ED_curve_select_nth(Curve *cu, int nth, int skip, int offset)
+static bool ed_curve_select_nth(Curve *cu, const struct CheckerIntervalParams *params)
 {
        Nurb *nu = NULL;
        void *vert = NULL;
@@ -1131,10 +1131,10 @@ bool ED_curve_select_nth(Curve *cu, int nth, int skip, int offset)
                return false;
 
        if (nu->bezt) {
-               select_nth_bezt(nu, vert, nth, skip, offset);
+               select_nth_bezt(nu, vert, params);
        }
        else {
-               select_nth_bp(nu, vert, nth, skip, offset);
+               select_nth_bp(nu, vert, params);
        }
 
        return true;
@@ -1143,14 +1143,11 @@ bool ED_curve_select_nth(Curve *cu, int nth, int skip, int offset)
 static int select_nth_exec(bContext *C, wmOperator *op)
 {
        Object *obedit = CTX_data_edit_object(C);
-       const int nth = RNA_int_get(op->ptr, "nth") - 1;
-       const int skip = RNA_int_get(op->ptr, "skip");
-       int offset = RNA_int_get(op->ptr, "offset");
+       struct CheckerIntervalParams op_params;
 
-       /* so input of offset zero ends up being (nth - 1) */
-       offset = mod_i(offset, nth + skip);
+       WM_operator_properties_checker_interval_from_op(op, &op_params);
 
-       if (!ED_curve_select_nth(obedit->data, nth, skip, offset)) {
+       if (!ed_curve_select_nth(obedit->data, &op_params)) {
                if (obedit->type == OB_SURF) {
                        BKE_report(op->reports, RPT_ERROR, "Surface has not got active point");
                }
@@ -1180,9 +1177,7 @@ void CURVE_OT_select_nth(wmOperatorType *ot)
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
-       RNA_def_int(ot->srna, "nth", 2, 2, INT_MAX, "Nth Selection", "", 2, 100);
-       RNA_def_int(ot->srna, "skip", 1, 1, INT_MAX, "Skip", "", 1, 100);
-       RNA_def_int(ot->srna, "offset", 0, INT_MIN, INT_MAX, "Offset", "", -100, 100);
+       WM_operator_properties_checker_interval(ot, false);
 }
 
 
index ad3b41577c38b686d2b3def8a96e438fa1af1089..278e3f97ba797a70313c45f54a4c5f712c2624af 100644 (file)
@@ -71,7 +71,6 @@ bool ED_curve_select_check(struct Curve *cu, struct EditNurb *editnurb);
 void ED_curve_deselect_all(struct EditNurb *editnurb);
 void ED_curve_select_all(struct EditNurb *editnurb);
 void ED_curve_select_swap(struct EditNurb *editnurb, bool hide_handles);
-bool ED_curve_select_nth(struct Curve *cu, int nth, int skip, int offset);
 
 /* editfont.h */
 void    undo_push_font(struct bContext *C, const char *name);
index f318c38e3bbd714b440493f100d8c8788c3f4c45..fba775518c71d75601e2fad74c0e1fa6aeb60c3e 100644 (file)
@@ -3162,7 +3162,9 @@ static bool bm_edge_is_select_isolated(BMEdge *e)
 /* Walk all reachable elements of the same type as h_act in breadth-first
  * order, starting from h_act. Deselects elements if the depth when they
  * are reached is not a multiple of "nth". */
-static void walker_deselect_nth(BMEditMesh *em, int nth, int skip, int offset, BMHeader *h_act)
+static void walker_deselect_nth(
+        BMEditMesh *em, const struct CheckerIntervalParams *op_params,
+        BMHeader *h_act)
 {
        BMElem *ele;
        BMesh *bm = em->bm;
@@ -3229,7 +3231,7 @@ static void walker_deselect_nth(BMEditMesh *em, int nth, int skip, int offset, B
                if (!BM_elem_flag_test(ele, BM_ELEM_TAG)) {
                        /* Deselect elements that aren't at "nth" depth from active */
                        const int depth = BMW_current_depth(&walker) - 1;
-                       if ((offset + depth) % (skip + nth) >= skip) {
+                       if (WM_operator_properties_checker_interval_test(op_params, depth)) {
                                BM_elem_select_set(bm, ele, false);
                        }
                        BM_elem_flag_enable(ele, BM_ELEM_TAG);
@@ -3296,7 +3298,7 @@ static void deselect_nth_active(BMEditMesh *em, BMVert **r_eve, BMEdge **r_eed,
        }
 }
 
-static bool edbm_deselect_nth(BMEditMesh *em, int nth, int skip, int offset)
+static bool edbm_deselect_nth(BMEditMesh *em, const struct CheckerIntervalParams *op_params)
 {
        BMVert *v;
        BMEdge *e;
@@ -3305,15 +3307,15 @@ static bool edbm_deselect_nth(BMEditMesh *em, int nth, int skip, int offset)
        deselect_nth_active(em, &v, &e, &f);
 
        if (v) {
-               walker_deselect_nth(em, nth, skip, offset, &v->head);
+               walker_deselect_nth(em, op_params, &v->head);
                return true;
        }
        else if (e) {
-               walker_deselect_nth(em, nth, skip, offset, &e->head);
+               walker_deselect_nth(em, op_params, &e->head);
                return true;
        }
        else if (f) {
-               walker_deselect_nth(em, nth, skip, offset, &f->head);
+               walker_deselect_nth(em, op_params, &f->head);
                return true;
        }
 
@@ -3324,14 +3326,11 @@ static int edbm_select_nth_exec(bContext *C, wmOperator *op)
 {
        Object *obedit = CTX_data_edit_object(C);
        BMEditMesh *em = BKE_editmesh_from_object(obedit);
-       const int nth = RNA_int_get(op->ptr, "nth") - 1;
-       const int skip = RNA_int_get(op->ptr, "skip");
-       int offset = RNA_int_get(op->ptr, "offset");
+       struct CheckerIntervalParams op_params;
 
-       /* so input of offset zero ends up being (nth - 1) */
-       offset = mod_i(offset, nth + skip);
+       WM_operator_properties_checker_interval_from_op(op, &op_params);
 
-       if (edbm_deselect_nth(em, nth, skip, offset) == false) {
+       if (edbm_deselect_nth(em, &op_params) == false) {
                BKE_report(op->reports, RPT_ERROR, "Mesh has no active vert/edge/face");
                return OPERATOR_CANCELLED;
        }
@@ -3356,9 +3355,7 @@ void MESH_OT_select_nth(wmOperatorType *ot)
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
-       RNA_def_int(ot->srna, "nth", 2, 2, INT_MAX, "Nth Selection", "", 2, 100);
-       RNA_def_int(ot->srna, "skip", 1, 1, INT_MAX, "Skip", "", 1, 100);
-       RNA_def_int(ot->srna, "offset", 0, INT_MIN, INT_MAX, "Offset", "", -100, 100);
+       WM_operator_properties_checker_interval(ot, false);
 }
 
 void em_setup_viewcontext(bContext *C, ViewContext *vc)
index 9d1f445701382433c34a3d0e8ef6f9f1dc1b1333..3f89140888be2192b60fcc64238ec1ddf6bfeb60 100644 (file)
@@ -302,6 +302,16 @@ void        WM_operator_properties_select_all(struct wmOperatorType *ot);
 void        WM_operator_properties_select_action(struct wmOperatorType *ot, int default_action);
 void        WM_operator_properties_select_action_simple(struct wmOperatorType *ot, int default_action);
 void        WM_operator_properties_select_random(struct wmOperatorType *ot);
+struct CheckerIntervalParams {
+       int nth;  /* bypass when set to zero */
+       int skip;
+       int offset;
+};
+void        WM_operator_properties_checker_interval(struct wmOperatorType *ot, bool nth_can_disable);
+void        WM_operator_properties_checker_interval_from_op(
+        struct wmOperator *op, struct CheckerIntervalParams *op_params);
+bool        WM_operator_properties_checker_interval_test(
+        const struct CheckerIntervalParams *op_params, int depth);
 
 
 /* MOVE THIS SOMEWHERE ELSE */
index a59fbf9d52812e049338631a319fc1a37151fd9b..c74bb46356d71d1a6c10f59946bc3cd92874265e 100644 (file)
@@ -31,6 +31,7 @@
 #include "DNA_space_types.h"
 
 #include "BLI_rect.h"
+#include "BLI_math_base.h"
 
 #include "UI_resources.h"
 
@@ -248,3 +249,34 @@ void WM_operator_properties_gesture_straightline(wmOperatorType *ot, int cursor)
                RNA_def_property_flag(prop, PROP_HIDDEN);
        }
 }
+
+/**
+ * \param nth_can_disable: Enable if we want to be able to select no interval at all.
+ */
+void WM_operator_properties_checker_interval(wmOperatorType *ot, bool nth_can_disable)
+{
+       const int nth_default = nth_can_disable ? 1 : 2;
+       const int nth_min =  min_ii(nth_default, 2);
+       RNA_def_int(ot->srna, "nth", nth_default, nth_min, INT_MAX, "Nth Selection", "", nth_min, 100);
+       RNA_def_int(ot->srna, "skip", 1, 1, INT_MAX, "Skip", "", 1, 100);
+       RNA_def_int(ot->srna, "offset", 0, INT_MIN, INT_MAX, "Offset", "", -100, 100);
+}
+
+void WM_operator_properties_checker_interval_from_op(
+        struct wmOperator *op, struct CheckerIntervalParams *op_params)
+{
+       const int nth = RNA_int_get(op->ptr, "nth") - 1;
+       const int skip = RNA_int_get(op->ptr, "skip");
+       int offset = RNA_int_get(op->ptr, "offset");
+
+       op_params->nth = nth;
+       op_params->skip = skip;
+       op_params->offset = mod_i(offset, nth + skip);  /* so input of offset zero ends up being (nth - 1) */
+}
+
+bool WM_operator_properties_checker_interval_test(
+        const struct CheckerIntervalParams *op_params, int depth)
+{
+       return ((op_params->nth == 0) ||
+               ((op_params->offset + depth) % (op_params->skip + op_params->nth) >= op_params->skip));
+}