[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