[Bf-blender-cvs] [5eace12ac09] soc-2021-curves: Added modal keymaps

dilithjay noreply at git.blender.org
Wed Jun 16 19:35:40 CEST 2021


Commit: 5eace12ac090cf2285c60905d5fc6f6018ef3260
Author: dilithjay
Date:   Wed Jun 16 23:05:23 2021 +0530
Branches: soc-2021-curves
https://developer.blender.org/rB5eace12ac090cf2285c60905d5fc6f6018ef3260

Added modal keymaps

===================================================================

M	release/scripts/modules/bl_keymap_utils/keymap_hierarchy.py
M	release/scripts/presets/keyconfig/keymap_data/blender_default.py
M	source/blender/editors/curve/curve_intern.h
M	source/blender/editors/curve/curve_ops.c
M	source/blender/editors/curve/editcurve_pen.c

===================================================================

diff --git a/release/scripts/modules/bl_keymap_utils/keymap_hierarchy.py b/release/scripts/modules/bl_keymap_utils/keymap_hierarchy.py
index 0784a91d174..7580d90bc0a 100644
--- a/release/scripts/modules/bl_keymap_utils/keymap_hierarchy.py
+++ b/release/scripts/modules/bl_keymap_utils/keymap_hierarchy.py
@@ -55,11 +55,13 @@ _km_hierarchy = [
     ('Window', 'EMPTY', 'WINDOW', []),  # file save, window change, exit
     ('Screen', 'EMPTY', 'WINDOW', [     # full screen, undo, screenshot
         ('Screen Editing', 'EMPTY', 'WINDOW', []),    # re-sizing, action corners
-        ('Region Context Menu', 'EMPTY', 'WINDOW', []),      # header/footer/navigation_bar stuff (per region)
+        # header/footer/navigation_bar stuff (per region)
+        ('Region Context Menu', 'EMPTY', 'WINDOW', []),
     ]),
 
     ('View2D', 'EMPTY', 'WINDOW', []),    # view 2d navigation (per region)
-    ('View2D Buttons List', 'EMPTY', 'WINDOW', []),  # view 2d with buttons navigation
+    # view 2d with buttons navigation
+    ('View2D Buttons List', 'EMPTY', 'WINDOW', []),
 
     ('User Interface', 'EMPTY', 'WINDOW', []),
 
@@ -116,6 +118,7 @@ _km_hierarchy = [
         ('Paint Stroke Modal', 'EMPTY', 'WINDOW', []),
         ('Sculpt Expand Modal', 'EMPTY', 'WINDOW', []),
         ('Paint Curve', 'EMPTY', 'WINDOW', []),
+        ('Curve Pen Modal Map', 'EMPTY', 'WINDOW', []),
 
         ('Object Non-modal', 'EMPTY', 'WINDOW', []),  # mode change
 
@@ -222,7 +225,8 @@ _km_hierarchy = [
     ('Mask Editing', 'EMPTY', 'WINDOW', []),
     ('Frames', 'EMPTY', 'WINDOW', []),    # frame navigation (per region)
     ('Markers', 'EMPTY', 'WINDOW', []),    # markers (per region)
-    ('Animation', 'EMPTY', 'WINDOW', []),    # frame change on click, preview range (per region)
+    # frame change on click, preview range (per region)
+    ('Animation', 'EMPTY', 'WINDOW', []),
     ('Animation Channels', 'EMPTY', 'WINDOW', []),
 
     ('View3D Gesture Circle', 'EMPTY', 'WINDOW', []),
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index 8d3c4eba292..3733b6a7fdf 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -5645,6 +5645,22 @@ def km_sculpt_expand_modal(_params):
     ])
     return keymap
 
+def km_curve_pen_modal_map(_params):
+    items = []
+    keymap = (
+        "Curve Pen Modal Map",
+        {"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
+        {"items": items},
+    )
+
+    items.extend([
+        ("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
+        ("CANCEL", {"type": 'RIGHTMOUSE', "value": 'PRESS', "any": True}, None),
+        ("FREE_MOVE_HANDLE", {"type": 'LEFT_SHIFT', "value": 'PRESS', "any": True}, None),
+    ])
+
+    return keymap
+
 
 # Fallback for gizmos that don't have custom a custom key-map.
 def km_generic_gizmo(_params):
@@ -6468,9 +6484,9 @@ def km_3d_view_tool_edit_curve_pen(params):
         {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
         {"items": [
             ("curve.pen", {"type": params.tool_mouse, "value": 'PRESS'},
-             {"properties": [("wait_for_input", False)]}),
+             {"properties": [("wait_for_input", False), ("cut_or_delete", False)]}),
             ("curve.pen", {"type": params.tool_mouse, "value": 'PRESS', "ctrl": True},
-             {"properties": [("ctrl", True)]}),
+             {"properties": [("cut_or_delete", True)]}),
         ]},
     )
 
@@ -7173,6 +7189,7 @@ def generate_keymaps(params=None):
         km_view3d_dolly_modal(params),
         km_paint_stroke_modal(params),
         km_sculpt_expand_modal(params),
+        km_curve_pen_modal_map(params),
 
         # Gizmos.
         km_generic_gizmo(params),
diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h
index 4bed6c36a45..ebf91e145e6 100644
--- a/source/blender/editors/curve/curve_intern.h
+++ b/source/blender/editors/curve/curve_intern.h
@@ -199,4 +199,4 @@ void CURVE_OT_draw(struct wmOperatorType *ot);
 
 /* editcurve_pen.c */
 void CURVE_OT_pen(struct wmOperatorType *ot);
-// struct wmKeyMap *edit_curve_tool_modal_keymap(struct wmKeyConfig *keyconf);
+struct wmKeyMap *curve_pen_modal_keymap(struct wmKeyConfig *keyconf);
diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c
index 174b095584e..e509b0ff5d6 100644
--- a/source/blender/editors/curve/curve_ops.c
+++ b/source/blender/editors/curve/curve_ops.c
@@ -167,4 +167,6 @@ void ED_keymap_curve(wmKeyConfig *keyconf)
   /* only set in editmode curve, by space_view3d listener */
   keymap = WM_keymap_ensure(keyconf, "Curve", 0, 0);
   keymap->poll = ED_operator_editsurfcurve;
+
+  curve_pen_modal_keymap(keyconf);
 }
diff --git a/source/blender/editors/curve/editcurve_pen.c b/source/blender/editors/curve/editcurve_pen.c
index f139b9af255..f3298d008d0 100644
--- a/source/blender/editors/curve/editcurve_pen.c
+++ b/source/blender/editors/curve/editcurve_pen.c
@@ -486,12 +486,6 @@ static void move_bezt_handles_to_mouse(BezTriple *bezt,
     bezt->h2 = HD_ALIGN;
   }
 
-  /* Set handle type to free when moved with shift. */
-  if (event->shift && bezt->h1 != HD_FREE) {
-    bezt->h1 = HD_FREE;
-    bezt->h2 = HD_FREE;
-  }
-
   /* Obtain world space mouse location. */
   float location[3];
   mouse_location_to_worldspace(event->mval, bezt->vec[1], vc, location);
@@ -682,6 +676,37 @@ static BPoint *get_closest_bp_to_point(Nurb *nu, float point[2], ViewContext vc)
   return NULL;
 }
 
+enum {
+  PEN_MODAL_CANCEL = 1,
+  PEN_MODAL_FREE_MOVE_HANDLE,
+};
+
+wmKeyMap *curve_pen_modal_keymap(wmKeyConfig *keyconf)
+{
+  static const EnumPropertyItem modal_items[] = {
+      {PEN_MODAL_CANCEL, "CANCEL", 0, "Cancel", "Cancel pen"},
+      {PEN_MODAL_FREE_MOVE_HANDLE,
+       "FREE_MOVE_HANDLE",
+       0,
+       "Free Move handle",
+       "Move handle of newly added point freely"},
+      {0, NULL, 0, NULL, NULL},
+  };
+
+  wmKeyMap *keymap = WM_modalkeymap_find(keyconf, "Curve Pen Modal Map");
+
+  /* This function is called for each spacetype, only needs to add map once */
+  if (keymap && keymap->modal_items) {
+    return NULL;
+  }
+
+  keymap = WM_modalkeymap_ensure(keyconf, "Curve Pen Modal Map", modal_items);
+
+  WM_modalkeymap_assign(keymap, "CURVE_OT_pen");
+
+  return keymap;
+}
+
 static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
   bool extend = RNA_boolean_get(op->ptr, "extend");
@@ -700,15 +725,27 @@ static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
   Nurb *nu;
 
   bool retval = false;
-  int mval[2];
 
-  RNA_int_get_array(op->ptr, "location", mval);
   view3d_operator_needs_opengl(C);
   BKE_object_update_select_id(CTX_data_main(C));
 
   int ret = OPERATOR_RUNNING_MODAL;
   bool dragging = RNA_boolean_get(op->ptr, "dragging");
 
+  bool picked = false;
+  if (event->type == EVT_MODAL_MAP) {
+    if (event->val == PEN_MODAL_FREE_MOVE_HANDLE) {
+      short hand;
+      copy_v2_v2_int(vc.mval, event->mval);
+      ED_curve_pick_vert(&vc, 1, &nu, &bezt, &bp, &hand, &basact);
+      picked = true;
+
+      if (bezt) {
+        bezt->h1 = bezt->h2 = HD_FREE;
+      }
+    }
+  }
+
   if (ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) {
     if (!dragging && WM_event_drag_test(event, &event->prevclickx) && event->val == KM_PRESS) {
       RNA_boolean_set(op->ptr, "dragging", true);
@@ -717,11 +754,12 @@ static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
     if (dragging) {
       /* Move handle point with mouse cursor if dragging a new control point. */
       if (RNA_boolean_get(op->ptr, "new")) {
-        short hand;
-
-        copy_v2_v2_int(vc.mval, mval);
-        /* Get pointer to new control point. */
-        ED_curve_pick_vert(&vc, 1, &nu, &bezt, &bp, &hand, &basact);
+        if (!picked) {
+          short hand;
+          copy_v2_v2_int(vc.mval, event->mval);
+          /* Get pointer to new control point. */
+          ED_curve_pick_vert(&vc, 1, &nu, &bezt, &bp, &hand, &basact);
+        }
         if (bezt) {
           move_bezt_handles_to_mouse(bezt, nu->bezt + nu->pntsu - 1 == bezt, event, vc);
 
@@ -731,7 +769,7 @@ static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
       /* Move entire control point with mouse cursor if dragging an existing control point. */
       else {
         short hand;
-
+        int mval[2];
         mval[0] = event->prevx;
         mval[1] = event->prevy;
         copy_v2_v2_int(vc.mval, mval);
@@ -781,15 +819,17 @@ static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
   }
   else if (ELEM(event->type, LEFTMOUSE)) {
     if (event->val == KM_PRESS) {
-      retval = ED_curve_editnurb_select_pick(C, mval, extend, deselect, toggle);
+      retval = ED_curve_editnurb_select_pick(C, event->mval, extend, deselect, toggle);
       RNA_boolean_set(op->ptr, "new", !retval);
+      bool cut_or_delete = RNA_boolean_get(op->ptr, "cut_or_delete");
+
       /* Check if point underneath mouse. Get point if any. */
       if (retval) {
-        if (event->ctrl) {
+        if (cut_or_delete) {
           /* Delete retrieved control point. */
           short hand;
 
-          copy_v2_v2_int(vc.mval, mval);
+          copy_v2_v2_int(vc.mval, event->mval);
           // ED_curve_pick_vert(&vc, 1, &nu, &bezt, &bp, &hand, &basact);
 
           ListBase *nurbs = BKE_curve_editNurbs_get(cu);
@@ -813,7 +853,7 @@ static int curve_pen_modal(bContext *C, wmOperator *op, const wmEvent *event)
         }
       }
       else {
-        if (event->ctrl) {
+        if (cut_or_delete) {
           /* If curve segment is nearby, add control point at the snapped point
           between the adjacent control points in the curve data structure. */
           EditNurb *editnurb = cu->editnurb;
@@ -997,8 +1037,6 @@ static int curve_pen_exec(bContext *C, wmOperator *op)
 
 static int curve_pen_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
-  RNA_int_set_array(op->ptr, "location", event->mval)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list