[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