[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36582] branches/bmesh/blender/source/ blender/editors: =bmesh=
Joseph Eagar
joeedh at gmail.com
Mon May 9 23:38:55 CEST 2011
Revision: 36582
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36582
Author: joeedh
Date: 2011-05-09 21:38:55 +0000 (Mon, 09 May 2011)
Log Message:
-----------
=bmesh=
added modal keymap for knife tool.
I'm not sure how to handle the panning
pass-through, it's still hardcoded to
happen on MIDDLEMOUSE.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/editors/mesh/knifetool.c
branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h
branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c
branches/bmesh/blender/source/blender/editors/transform/transform.c
Modified: branches/bmesh/blender/source/blender/editors/mesh/knifetool.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/knifetool.c 2011-05-09 21:34:52 UTC (rev 36581)
+++ branches/bmesh/blender/source/blender/editors/mesh/knifetool.c 2011-05-09 21:38:55 UTC (rev 36582)
@@ -1750,6 +1750,61 @@
return OPERATOR_RUNNING_MODAL;
}
+enum {
+ KNF_MODAL_CANCEL=1,
+ KNF_MODAL_CONFIRM,
+ KNF_MODAL_MIDPOINT_ON,
+ KNF_MODAL_MIDPOINT_OFF,
+ KNF_MODAL_NEW_CUT,
+ KNF_MODEL_IGNORE_SNAP_ON,
+ KNF_MODEL_IGNORE_SNAP_OFF,
+ KNF_MODAL_ADD_CUT,
+};
+
+wmKeyMap* knifetool_modal_keymap(wmKeyConfig *keyconf)
+{
+ static EnumPropertyItem modal_items[] = {
+ {KNF_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""},
+ {KNF_MODAL_CONFIRM, "CONFIRM", 0, "Confirm", ""},
+ {KNF_MODAL_MIDPOINT_ON, "SNAP_MIDPOINTS_ON", 0, "Snap To Midpoints On", ""},
+ {KNF_MODAL_MIDPOINT_OFF, "SNAP_MIDPOINTS_OFF", 0, "Snap To Midpoints Off", ""},
+ {KNF_MODEL_IGNORE_SNAP_ON, "IGNORE_SNAP_ON", 0, "Ignore Snapping On", ""},
+ {KNF_MODEL_IGNORE_SNAP_OFF, "IGNORE_SNAP_OFF", 0, "Ignore Snapping Off", ""},
+ {KNF_MODAL_NEW_CUT, "NEW_CUT", 0, "End Current Cut", ""},
+ {KNF_MODAL_ADD_CUT, "ADD_CUT", 0, "Add Cut", ""},
+
+ {0, NULL, 0, NULL, NULL}};
+
+ wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "Knife Tool Modal Map");
+
+ /* this function is called for each spacetype, only needs to add map once */
+ if(keymap) return NULL;
+
+ keymap= WM_modalkeymap_add(keyconf, "Transform Modal Map", modal_items);
+
+ /* items for modal map */
+ WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, KNF_MODAL_CONFIRM);
+ WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_ANY, 0, KNF_MODAL_ADD_CUT);
+ WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_PRESS, KM_ANY, 0, KNF_MODAL_CONFIRM);
+ WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, KNF_MODAL_CONFIRM);
+ WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, KNF_MODAL_CONFIRM);
+ WM_modalkeymap_add_item(keymap, EKEY, KM_PRESS, 0, 0, KNF_MODAL_NEW_CUT);
+
+ WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, KNF_MODAL_MIDPOINT_ON);
+ WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, KNF_MODAL_MIDPOINT_OFF);
+ WM_modalkeymap_add_item(keymap, RIGHTCTRLKEY, KM_PRESS, KM_ANY, 0, KNF_MODAL_MIDPOINT_ON);
+ WM_modalkeymap_add_item(keymap, RIGHTCTRLKEY, KM_RELEASE, KM_ANY, 0, KNF_MODAL_MIDPOINT_OFF);
+
+ WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, KNF_MODEL_IGNORE_SNAP_ON);
+ WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_RELEASE, KM_ANY, 0, KNF_MODEL_IGNORE_SNAP_OFF);
+ WM_modalkeymap_add_item(keymap, RIGHTSHIFTKEY, KM_PRESS, KM_ANY, 0, KNF_MODEL_IGNORE_SNAP_ON);
+ WM_modalkeymap_add_item(keymap, RIGHTSHIFTKEY, KM_RELEASE, KM_ANY, 0, KNF_MODEL_IGNORE_SNAP_OFF);
+
+ WM_modalkeymap_assign(keymap, "MESH_OT_knifetool");
+
+ return keymap;
+}
+
static int knifetool_modal (bContext *C, wmOperator *op, wmEvent *event)
{
Object *obedit;
@@ -1768,84 +1823,91 @@
if (kcd->mode == MODE_PANNING)
kcd->mode = kcd->prevmode;
- kcd->snap_midpoints = event->ctrl;
- kcd->ignore_vert_snapping = kcd->ignore_edge_snapping = event->shift;
-
- switch (event->type) {
- case ESCKEY:
- case RETKEY: /* confirm */ // XXX hardcoded
- if (event->val == KM_RELEASE) {
- if (kcd->mode == MODE_DRAGGING && event->type == ESCKEY) {
- kcd->mode = MODE_IDLE;
- ED_region_tag_redraw(kcd->ar);
- } else {
- /* finish */
- ED_region_tag_redraw(kcd->ar);
-
- knifetool_finish(C, op);
- knifetool_exit(C, op);
-
- return OPERATOR_FINISHED;
+ /* handle modal keymap */
+ if (event->type == EVT_MODAL_MAP) {
+ switch (event->val) {
+ case KNF_MODAL_CANCEL:
+ /* finish */
+ ED_region_tag_redraw(kcd->ar);
+
+ knifetool_exit(C, op);
+
+ return OPERATOR_CANCELLED;
+ case KNF_MODAL_CONFIRM:
+ /* finish */
+ ED_region_tag_redraw(kcd->ar);
+
+ knifetool_finish(C, op);
+ knifetool_exit(C, op);
+
+ return OPERATOR_FINISHED;
+ case KNF_MODAL_MIDPOINT_ON:
+ ED_region_tag_redraw(kcd->ar);
+ kcd->snap_midpoints = 1;
+ break;
+ case KNF_MODAL_MIDPOINT_OFF:
+ ED_region_tag_redraw(kcd->ar);
+ kcd->snap_midpoints = 0;
+ break;
+ case KNF_MODEL_IGNORE_SNAP_ON:
+ ED_region_tag_redraw(kcd->ar);
+ kcd->ignore_vert_snapping = kcd->ignore_edge_snapping = 1;
+ break;
+ case KNF_MODEL_IGNORE_SNAP_OFF:
+ ED_region_tag_redraw(kcd->ar);
+ kcd->ignore_vert_snapping = kcd->ignore_edge_snapping = 0;
+ break;
+ case KNF_MODAL_NEW_CUT:
+ ED_region_tag_redraw(kcd->ar);
+ knife_finish_cut(kcd);
+ kcd->mode = MODE_IDLE;
+ break;
+ case KNF_MODAL_ADD_CUT:
+ knife_recalc_projmat(kcd);
+
+ if (kcd->mode == MODE_DRAGGING) {
+ knife_add_cut(kcd);
+ if (!kcd->extend) {
+ knife_finish_cut(kcd);
+ kcd->mode = MODE_IDLE;
+ }
+ } else if (kcd->mode != MODE_PANNING) {
+ knife_start_cut(kcd);
+ kcd->mode = MODE_DRAGGING;
}
- }
-
- ED_region_tag_redraw(kcd->ar);
- return OPERATOR_RUNNING_MODAL;
- case WHEELUPMOUSE:
- case WHEELDOWNMOUSE:
- return OPERATOR_PASS_THROUGH;
- case MIDDLEMOUSE:
- if (event->val != KM_RELEASE) {
- if (kcd->mode != MODE_PANNING)
- kcd->prevmode = kcd->mode;
- kcd->mode = MODE_PANNING;
- } else {
- kcd->mode = kcd->prevmode;
+ ED_region_tag_redraw(kcd->ar);
+ break;
}
-
- ED_region_tag_redraw(kcd->ar);
- return OPERATOR_PASS_THROUGH;
-
- case LEFTMOUSE:
- knife_recalc_projmat(kcd);
- if (event->val != KM_RELEASE)
- break;
-
- if (kcd->mode == MODE_DRAGGING) {
- knife_add_cut(kcd);
- if (!kcd->extend) {
- knife_finish_cut(kcd);
- kcd->mode = MODE_IDLE;
+ } else { /*non-modal-mapped events*/
+ switch (event->type) {
+ case WHEELUPMOUSE:
+ case WHEELDOWNMOUSE:
+ return OPERATOR_PASS_THROUGH;
+ case MIDDLEMOUSE:
+ if (event->val != KM_RELEASE) {
+ if (kcd->mode != MODE_PANNING)
+ kcd->prevmode = kcd->mode;
+ kcd->mode = MODE_PANNING;
+ } else {
+ kcd->mode = kcd->prevmode;
}
- } else if (kcd->mode != MODE_PANNING) {
- knife_start_cut(kcd);
- kcd->mode = MODE_DRAGGING;
- }
-
- ED_region_tag_redraw(kcd->ar);
- return OPERATOR_RUNNING_MODAL;
-
- case EKEY:
- kcd->extend = event->val==KM_RELEASE;
- if (event->val == KM_RELEASE) {
- knife_finish_cut(kcd);
- kcd->mode = MODE_IDLE;
- }
- return OPERATOR_RUNNING_MODAL;
- case LEFTCTRLKEY:
- case RIGHTCTRLKEY:
- case MOUSEMOVE: /* mouse moved somewhere to select another loop */
- if (kcd->mode != MODE_PANNING) {
- knife_recalc_projmat(kcd);
- kcd->vc.mval[0] = event->mval[0];
- kcd->vc.mval[1] = event->mval[1];
- if (knife_update_active(kcd))
- ED_region_tag_redraw(kcd->ar);
- }
-
- break;
+ ED_region_tag_redraw(kcd->ar);
+ return OPERATOR_PASS_THROUGH;
+
+ case MOUSEMOVE: /* mouse moved somewhere to select another loop */
+ if (kcd->mode != MODE_PANNING) {
+ knife_recalc_projmat(kcd);
+ kcd->vc.mval[0] = event->mval[0];
+ kcd->vc.mval[1] = event->mval[1];
+
+ if (knife_update_active(kcd))
+ ED_region_tag_redraw(kcd->ar);
+ }
+
+ break;
+ }
}
/* keep going until the user confirms */
Modified: branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h 2011-05-09 21:34:52 UTC (rev 36581)
+++ branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h 2011-05-09 21:38:55 UTC (rev 36582)
@@ -192,6 +192,8 @@
extern int EM_view3d_poll(struct bContext *C);
+struct wmKeyMap* knifetool_modal_keymap(struct wmKeyConfig *keyconf);
+
/* ******************* knifetool.c */
void MESH_OT_knife_cut(struct wmOperatorType *ot);
Modified: branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c 2011-05-09 21:34:52 UTC (rev 36581)
+++ branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c 2011-05-09 21:38:55 UTC (rev 36582)
@@ -338,5 +338,6 @@
}
ED_object_generic_keymap(keyconf, keymap, 3);
+ knifetool_modal_keymap(keyconf);
}
Modified: branches/bmesh/blender/source/blender/editors/transform/transform.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/transform/transform.c 2011-05-09 21:34:52 UTC (rev 36581)
+++ branches/bmesh/blender/source/blender/editors/transform/transform.c 2011-05-09 21:38:55 UTC (rev 36582)
@@ -1577,21 +1577,22 @@
{
wmKeyMap *keymap = WM_keymap_active(CTX_wm_manager(C), op->type->modalkeymap);
wmKeyMapItem *kmi;
-
- for (kmi = keymap->items.first; kmi; kmi = kmi->next)
- {
- if (kmi->propvalue == TFM_MODAL_SNAP_INV_ON && kmi->val == KM_PRESS)
+
+ if (keymap) {
+ for (kmi = keymap->items.first; kmi; kmi = kmi->next)
{
- if ((ELEM(kmi->type, LEFTCTRLKEY, RIGHTCTRLKEY) && event->ctrl) ||
- (ELEM(kmi->type, LEFTSHIFTKEY, RIGHTSHIFTKEY) && event->shift) ||
- (ELEM(kmi->type, LEFTALTKEY, RIGHTALTKEY) && event->alt) ||
- (kmi->type == OSKEY && event->oskey)) {
- t->modifiers |= MOD_SNAP_INVERT;
+ if (kmi->propvalue == TFM_MODAL_SNAP_INV_ON && kmi->val == KM_PRESS)
+ {
+ if ((ELEM(kmi->type, LEFTCTRLKEY, RIGHTCTRLKEY) && event->ctrl) ||
+ (ELEM(kmi->type, LEFTSHIFTKEY, RIGHTSHIFTKEY) && event->shift) ||
+ (ELEM(kmi->type, LEFTALTKEY, RIGHTALTKEY) && event->alt) ||
+ (kmi->type == OSKEY && event->oskey)) {
+ t->modifiers |= MOD_SNAP_INVERT;
+ }
+ break;
}
- break;
}
}
-
}
initSnapping(t, op); // Initialize snapping data AFTER mode flags
More information about the Bf-blender-cvs
mailing list