[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21925] branches/blender2.5/blender/source /blender: 2.5

Ton Roosendaal ton at blender.org
Sun Jul 26 14:52:47 CEST 2009


Revision: 21925
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21925
Author:   ton
Date:     2009-07-26 14:52:39 +0200 (Sun, 26 Jul 2009)

Log Message:
-----------
2.5

First step towards keymap editor!
Before getting too excited:
- doesn't save yet
- no rna properties can be defined
- no insert/remove keymap options yet
- no option yet to set 'key press/release'

But what does work;
- Keymap list is in outliner, new category 
  (Keymaps are listed in order as being created now)
- enable/disable a keymap entry: click on dot icon
- it displays python api names for ops
- browse new operator for keymap (menu button)
- set keymap to use other keys, mouse or tweak events
- four modifier key options

I first intent to test it all well, there are still
quite some modal map conflicts (like border select) and
there's problems assigning items to tweaks

Another issue is that a visual editor for keymaps might be
quite hard to use... the amount of data and options is just not
so fun for a buttons menu. There are ways to improve this though.
Maybe do this via a script?

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/animation/anim_markers.c
    branches/blender2.5/blender/source/blender/editors/interface/interface.c
    branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c
    branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c
    branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c
    branches/blender2.5/blender/source/blender/editors/space_outliner/outliner_header.c
    branches/blender2.5/blender/source/blender/editors/space_outliner/outliner_intern.h
    branches/blender2.5/blender/source/blender/makesdna/DNA_space_types.h
    branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_wm.c
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_keymap.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: branches/blender2.5/blender/source/blender/editors/animation/anim_markers.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_markers.c	2009-07-26 12:49:43 UTC (rev 21924)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_markers.c	2009-07-26 12:52:39 UTC (rev 21925)
@@ -85,6 +85,7 @@
 }
 
 /* Get the marker that is closest to this point */
+/* XXX for select, the min_dist should be small */
 TimeMarker *ED_markers_find_nearest_marker (ListBase *markers, float x) 
 {
 	TimeMarker *marker, *nearest=NULL;
@@ -828,6 +829,7 @@
 	/* XXX marker context */
 	for(marker= markers->first; marker; marker= marker->next) {
 		if ((marker->frame > xminf) && (marker->frame <= xmaxf)) {
+			/* XXX weak... */
 			switch (event_type) {
 				case LEFTMOUSE:
 					if ((marker->flag & SELECT) == 0) 

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface.c	2009-07-26 12:49:43 UTC (rev 21924)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface.c	2009-07-26 12:52:39 UTC (rev 21925)
@@ -740,7 +740,7 @@
 			push= 2;
 			break;
 		case KEYEVT:
-			if (value==-1) push= 1;
+			push= 2;
 			break;
 		case TOGBUT:
 		case TOG:

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c	2009-07-26 12:49:43 UTC (rev 21924)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c	2009-07-26 12:52:39 UTC (rev 21925)
@@ -1805,7 +1805,10 @@
 {
 	if(data->state == BUTTON_STATE_HIGHLIGHT) {
 		if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val==KM_PRESS) {
-			button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT);
+			short event= (short)ui_get_but_val(but);
+			/* hardcoded prevention from editing or assigning ESC */
+			if(event!=ESCKEY)
+				button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT);
 			return WM_UI_HANDLER_BREAK;
 		}
 	}
@@ -1814,7 +1817,7 @@
 			return WM_UI_HANDLER_CONTINUE;
 
 		if(event->val==KM_PRESS) {
-			if(WM_key_event_string(event->type)[0])
+			if(event->type!=ESCKEY && WM_key_event_string(event->type)[0])
 				ui_set_but_val(but, event->type);
 			else
 				data->cancel= 1;

Modified: branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c	2009-07-26 12:49:43 UTC (rev 21924)
+++ branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c	2009-07-26 12:52:39 UTC (rev 21925)
@@ -151,6 +151,12 @@
 	/* request updates to be done... */
 	ED_area_tag_redraw(vpd->sa);
 	UI_view2d_sync(vpd->sc, vpd->sa, v2d, V2D_LOCK_COPY);
+	
+	/* exceptions */
+	if(vpd->sa->spacetype==SPACE_OUTLINER) {
+		SpaceOops *soops= vpd->sa->spacedata.first;
+		soops->storeflag |= SO_TREESTORE_REDRAW;
+	}
 }
 
 /* cleanup temp customdata  */

Modified: branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c	2009-07-26 12:49:43 UTC (rev 21924)
+++ branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c	2009-07-26 12:52:39 UTC (rev 21925)
@@ -1123,6 +1123,45 @@
 			}
 		}
 	}
+	else if(type == TSE_KEYMAP) {
+		wmKeyMap *km= (wmKeyMap *)idv;
+		wmKeymapItem *kmi;
+		char opname[OP_MAX_TYPENAME];
+		
+		te->directdata= idv;
+		te->name= km->nameid;
+		
+		if(!(tselem->flag & TSE_CLOSED)) {
+			
+			for (kmi= km->keymap.first; kmi; kmi= kmi->next) {
+				const char *key= WM_key_event_string(kmi->type);
+				
+				if(key[0]) {
+					wmOperatorType *ot= NULL;
+					
+					if(kmi->propvalue);
+					else ot= WM_operatortype_find(kmi->idname, 0);
+					
+					if(ot || kmi->propvalue) {
+						TreeElement *ten= outliner_add_element(soops, &te->subtree, kmi, te, TSE_KEYMAP_ITEM, a);
+						
+						ten->directdata= kmi;
+						
+						if(kmi->propvalue) {
+							ten->name= "Modal map, not yet";
+						}
+						else {
+							WM_operator_py_idname(opname, ot->idname);
+							ten->name= BLI_strdup(opname);
+							ten->flag |= TE_FREE_NAME;
+						}
+					}
+				}
+			}
+		}
+		else 
+			te->flag |= TE_LAZY_CLOSED;
+	}
 
 	return te;
 }
@@ -1376,6 +1415,14 @@
 			tselem->flag &= ~TSE_CLOSED;
 		}
 	}
+	else if(soops->outlinevis==SO_KEYMAP) {
+		wmWindowManager *wm= mainvar->wm.first;
+		wmKeyMap *km;
+		
+		for(km= wm->keymaps.first; km; km= km->next) {
+			ten= outliner_add_element(soops, &soops->tree, (void*)km, NULL, TSE_KEYMAP, 0);
+		}
+	}
 	else {
 		ten= outliner_add_element(soops, &soops->tree, OBACT, NULL, 0, 0);
 		if(ten) ten->directdata= BASACT;
@@ -2193,6 +2240,21 @@
 	return(0);
 }
 
+static int tree_element_active_keymap_item(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
+{
+	wmKeymapItem *kmi= te->directdata;
+	
+	if(set==0) {
+		if(kmi->inactive) return 0;
+		return 1;
+	}
+	else {
+		kmi->inactive= !kmi->inactive;
+	}
+	return 0;
+}
+
+
 /* generic call for non-id data to make/check active in UI */
 /* Context can be NULL when set==0 */
 static int tree_element_type_active(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, TreeStoreElem *tselem, int set)
@@ -2213,10 +2275,8 @@
 			break;
 		case TSE_LINKED_PSYS:
 			return tree_element_active_psys(C, scene, te, tselem, set);
-			break;
 		case TSE_POSE_BASE:
 			return tree_element_active_pose(C, scene, te, tselem, set);
-			break;
 		case TSE_POSE_CHANNEL:
 			return tree_element_active_posechannel(C, scene, te, tselem, set);
 		case TSE_CONSTRAINT:
@@ -2227,10 +2287,11 @@
 			return tree_element_active_posegroup(C, scene, te, tselem, set);
 		case TSE_SEQUENCE:
 			return tree_element_active_sequence(C, te, tselem, set);
-			break;
 		case TSE_SEQUENCE_DUP:
 			return tree_element_active_sequence_dup(C, scene, te, tselem, set);
-			break;
+		case TSE_KEYMAP_ITEM:
+			return tree_element_active_keymap_item(C, te, tselem, set);
+			
 	}
 	return 0;
 }
@@ -4953,6 +5014,241 @@
 	}
 }
 
+static void operator_call_cb(struct bContext *C, void *arg_kmi, void *arg2)
+{
+	wmOperatorType *ot= arg2;
+	wmKeymapItem *kmi= arg_kmi;
+	
+	if(ot)
+		BLI_strncpy(kmi->idname, ot->idname, OP_MAX_TYPENAME);
+}
+
+static void operator_search_cb(const struct bContext *C, void *arg_kmi, char *str, uiSearchItems *items)
+{
+	wmOperatorType *ot = WM_operatortype_first();
+	
+	for(; ot; ot= ot->next) {
+		
+		if(BLI_strcasestr(ot->idname, str)) {
+			char name[OP_MAX_TYPENAME];
+			
+			/* display name for menu */
+			WM_operator_py_idname(name, ot->idname);
+			
+			if(0==uiSearchItemAdd(items, name, ot, 0))
+				break;
+		}
+	}
+}
+
+/* operator Search browse menu, open */
+static uiBlock *operator_search_menu(bContext *C, ARegion *ar, void *arg_kmi)
+{
+	static char search[OP_MAX_TYPENAME];
+	wmEvent event;
+	wmWindow *win= CTX_wm_window(C);
+	wmKeymapItem *kmi= arg_kmi;
+	wmOperatorType *ot= WM_operatortype_find(kmi->idname, 0);
+	uiBlock *block;
+	uiBut *but;
+	
+	/* clear initial search string, then all items show */
+	search[0]= 0;
+	
+	block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS);
+	uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1);
+	
+	/* fake button, it holds space for search items */
+	uiDefBut(block, LABEL, 0, "", 10, 15, 150, uiSearchBoxhHeight(), NULL, 0, 0, 0, 0, NULL);
+	
+	but= uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, 256, 10, 0, 150, 19, "");
+	uiButSetSearchFunc(but, operator_search_cb, arg_kmi, operator_call_cb, ot);
+	
+	uiBoundsBlock(block, 6);
+	uiBlockSetDirection(block, UI_DOWN);	
+	uiEndBlock(C, block);
+	
+	event= *(win->eventstate);	/* XXX huh huh? make api call */
+	event.type= EVT_BUT_OPEN;
+	event.val= KM_PRESS;
+	event.customdata= but;
+	event.customdatafree= FALSE;
+	wm_event_add(win, &event);
+	
+	return block;
+}
+
+#define OL_KM_KEYBOARD		0
+#define OL_KM_MOUSE			1
+#define OL_KM_TWEAK			2
+#define OL_KM_SPECIALS		3
+
+static short keymap_menu_type(short type)
+{
+	if(ISKEYBOARD(type)) return OL_KM_KEYBOARD;
+	if(WM_key_event_is_tweak(type)) return OL_KM_TWEAK;
+	if(type >= LEFTMOUSE && type <= WHEELOUTMOUSE) return OL_KM_MOUSE;
+//	return OL_KM_SPECIALS;
+	return 0;
+}
+
+static char *keymap_type_menu(void)
+{
+	static char string[500];
+	static char formatstr[] = "|%s %%x%d";
+	char *str= string;
+	
+	str += sprintf(str, "Event Type %%t");
+	
+	str += sprintf(str, formatstr, "Keyboard", OL_KM_KEYBOARD);
+	str += sprintf(str, formatstr, "Mouse", OL_KM_MOUSE);
+	str += sprintf(str, formatstr, "Tweak", OL_KM_TWEAK);
+//	str += sprintf(str, formatstr, "Specials", OL_KM_SPECIALS);
+	
+	return string;
+}	
+
+static char *keymap_mouse_menu(void)
+{
+	static char string[500];
+	static char formatstr[] = "|%s %%x%d";
+	char *str= string;
+	
+	str += sprintf(str, "Mouse Event %%t");
+	
+	str += sprintf(str, formatstr, "Left Mouse", LEFTMOUSE);
+	str += sprintf(str, formatstr, "Middle Mouse", MIDDLEMOUSE);
+	str += sprintf(str, formatstr, "Right Mouse", RIGHTMOUSE);
+	str += sprintf(str, formatstr, "Action Mouse", ACTIONMOUSE);
+	str += sprintf(str, formatstr, "Select Mouse", SELECTMOUSE);
+	str += sprintf(str, formatstr, "Mouse Move", MOUSEMOVE);
+	str += sprintf(str, formatstr, "Wheel Up", WHEELUPMOUSE);
+	str += sprintf(str, formatstr, "Wheel Down", WHEELDOWNMOUSE);
+	str += sprintf(str, formatstr, "Wheel In", WHEELINMOUSE);
+	str += sprintf(str, formatstr, "Wheel Out", WHEELOUTMOUSE);
+	
+	return string;
+}
+
+static char *keymap_tweak_menu(void)
+{
+	static char string[500];
+	static char formatstr[] = "|%s %%x%d";
+	char *str= string;
+	
+	str += sprintf(str, "Tweak Event %%t");
+	
+	str += sprintf(str, formatstr, "Left Mouse", EVT_TWEAK_L);
+	str += sprintf(str, formatstr, "Middle Mouse", EVT_TWEAK_M);
+	str += sprintf(str, formatstr, "Right Mouse", EVT_TWEAK_R);
+	str += sprintf(str, formatstr, "Action Mouse", EVT_TWEAK_A);
+	str += sprintf(str, formatstr, "Select Mouse", EVT_TWEAK_S);
+	
+	return string;
+}
+
+static void keymap_type_cb(bContext *C, void *kmi_v, void *unused_v)
+{
+	wmKeymapItem *kmi= kmi_v;
+	short maptype= keymap_menu_type(kmi->type);
+	
+	if(maptype!=kmi->maptype) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list