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

Ton Roosendaal ton at blender.org
Tue Jul 28 18:48:02 CEST 2009


Revision: 21974
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21974
Author:   ton
Date:     2009-07-28 18:48:02 +0200 (Tue, 28 Jul 2009)

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

Keymap feature: RightMouse in pulldown menus allows to assign 
a new hotkey. 

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
    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/space_outliner/outliner.c
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_keymap.c
    branches/blender2.5/blender/source/blender/windowmanager/wm_event_types.h

Modified: branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/UI_interface.h	2009-07-28 16:46:14 UTC (rev 21973)
+++ branches/blender2.5/blender/source/blender/editors/include/UI_interface.h	2009-07-28 16:48:02 UTC (rev 21974)
@@ -206,6 +206,8 @@
 #define HSVCIRCLE	(42<<9)
 #define LISTBOX		(43<<9)
 #define LISTROW		(44<<9)
+#define HOTKEYEVT	(45<<9)
+
 #define BUTTYPE		(63<<9)
 
 /* Drawing
@@ -426,6 +428,7 @@
 uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int icon, char *str, short x1, short y1, short x2, short y2, char *tip);
 
 void uiDefKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *spoin, char *tip);
+uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *keypoin, short *modkeypoin, char *tip);
 
 uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, short x1, short y1, short x2, short y2, char *tip);
 

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface.c	2009-07-28 16:46:14 UTC (rev 21973)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface.c	2009-07-28 16:48:02 UTC (rev 21974)
@@ -739,6 +739,7 @@
 		case BUT:
 			push= 2;
 			break;
+		case HOTKEYEVT:
 		case KEYEVT:
 			push= 2;
 			break;
@@ -1846,7 +1847,33 @@
 			strcat(but->drawstr, WM_key_event_string((short) ui_get_but_val(but)));
 		}
 		break;
-
+		
+	case HOTKEYEVT:
+		if (but->flag & UI_SELECT) {
+			short *sp= (short *)but->func_arg3;
+			
+			strcpy(but->drawstr, but->str);
+			
+			if(*sp) {
+				char *str= but->drawstr;
+				
+				if(*sp & KM_SHIFT)
+					str= strcat(str, "Shift ");
+				if(*sp & KM_CTRL)
+					str= strcat(str, "Ctrl ");
+				if(*sp & KM_ALT)
+					str= strcat(str, "Alt ");
+				if(*sp & KM_OSKEY)
+					str= strcat(str, "Cmd ");
+			}
+			else
+				strcat(but->drawstr, "Press a key  ");
+		} else {
+			/* XXX todo, button currently only used temporarily */
+			strcpy(but->drawstr, WM_key_event_string((short) ui_get_but_val(but)));
+		}
+		break;
+		
 	case BUT_TOGDUAL:
 		/* trying to get the dual-icon to left of text... not very nice */
 		if(but->str[0]) {
@@ -2941,6 +2968,17 @@
 	ui_check_but(but);
 }
 
+/* short pointers hardcoded */
+/* modkeypoin will be set to KM_SHIFT, KM_ALT, KM_CTRL, KM_OSKEY bits */
+uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *keypoin, short *modkeypoin, char *tip)
+{
+	uiBut *but= ui_def_but(block, HOTKEYEVT|SHO, retval, str, x1, y1, x2, y2, keypoin, 0.0, 0.0, 0.0, 0.0, tip);
+	but->func_arg3= modkeypoin; /* XXX hrmf, abuse! */
+	ui_check_but(but);
+	return but;
+}
+
+
 /* arg is pointer to string/name, use uiButSetSearchFunc() below to make this work */
 uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, short x1, short y1, short x2, short y2, char *tip)
 {

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-28 16:46:14 UTC (rev 21973)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c	2009-07-28 16:48:02 UTC (rev 21974)
@@ -840,6 +840,9 @@
 			ui_apply_but_CHARTAB(C, but, data);
 			break;
 #endif
+		case HOTKEYEVT:
+			ui_apply_but_BUT(C, but, data);
+			break;
 		case LINK:
 		case INLINK:
 			ui_apply_but_LINK(C, but, data);
@@ -1801,6 +1804,60 @@
 	return WM_UI_HANDLER_CONTINUE;
 }
 
+static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event)
+{
+	if(data->state == BUTTON_STATE_HIGHLIGHT) {
+		if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val==KM_PRESS) {
+			but->drawstr[0]= 0;
+			button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT);
+			return WM_UI_HANDLER_BREAK;
+		}
+	}
+	else if(data->state == BUTTON_STATE_WAIT_KEY_EVENT) {
+		short *sp= (short *)but->func_arg3;
+		
+		if(event->type == MOUSEMOVE)
+			return WM_UI_HANDLER_CONTINUE;
+		
+		if(ELEM(event->type, ESCKEY, LEFTMOUSE)) {
+			/* data->cancel doesnt work, this button opens immediate */
+			ui_set_but_val(but, 0);
+			button_activate_state(C, but, BUTTON_STATE_EXIT);
+			return WM_UI_HANDLER_BREAK;
+		}
+		
+		/* always set */
+		*sp= 0;	
+		if(event->shift)
+			*sp |= KM_SHIFT;
+		if(event->alt)
+			*sp |= KM_ALT;
+		if(event->ctrl)
+			*sp |= KM_CTRL;
+		if(event->oskey)
+			*sp |= KM_OSKEY;
+		
+		ui_check_but(but);
+		ED_region_tag_redraw(data->region);
+			
+		if(event->val==KM_PRESS) {
+			if(ISHOTKEY(event->type)) { 
+				
+				if(WM_key_event_string(event->type)[0])
+					ui_set_but_val(but, event->type);
+				else
+					data->cancel= 1;
+				
+				button_activate_state(C, but, BUTTON_STATE_EXIT);
+				return WM_UI_HANDLER_BREAK;
+			}
+		}
+	}
+	
+	return WM_UI_HANDLER_CONTINUE;
+}
+
+
 static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event)
 {
 	if(data->state == BUTTON_STATE_HIGHLIGHT) {
@@ -3103,7 +3160,68 @@
 	return WM_UI_HANDLER_CONTINUE;
 }
 
+/* callback for hotkey change button/menu */
+static void do_menu_change_hotkey(bContext *C, void *but_v, void *key_v)
+{
+	uiBut *but= but_v;
+	IDProperty *prop= (but->opptr)? but->opptr->data: NULL;
+	short *key= key_v;
+	char buf[512], *butstr, *cpoin;
+	
+	/* signal for escape */
+	if(key[0]==0) return;
+	
+	WM_key_event_operator_change(C, but->optype->idname, but->opcontext, prop, key[0], key[1]);
 
+	/* complex code to change name of button */
+	if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) {
+		
+		butstr= MEM_mallocN(strlen(but->str)+strlen(buf)+2, "menu_block_set_keymaps");
+		
+		/* XXX but->str changed... should not, remove the hotkey from it */
+		cpoin= strchr(but->str, '|');
+		if(cpoin) *cpoin= 0;		
+
+		strcpy(butstr, but->str);
+		strcat(butstr, "|");
+		strcat(butstr, buf);
+		
+		but->str= but->strdata;
+		BLI_strncpy(but->str, butstr, sizeof(but->strdata));
+		MEM_freeN(butstr);
+		
+		ui_check_but(but);
+	}
+				
+}
+
+
+static uiBlock *menu_change_hotkey(bContext *C, ARegion *ar, void *arg_but)
+{
+	uiBlock *block;
+	uiBut *but= arg_but;
+	wmOperatorType *ot= WM_operatortype_find(but->optype->idname, 1);
+	static short dummy[2];
+	char buf[OP_MAX_TYPENAME+10];
+	
+	dummy[0]= 0;
+	dummy[1]= 0;
+	
+	block= uiBeginBlock(C, ar, "_popup", UI_EMBOSSP);
+	uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_MOVEMOUSE_QUIT|UI_BLOCK_RET_1);
+	
+	BLI_strncpy(buf, ot->name, OP_MAX_TYPENAME);
+	strcat(buf, " |");
+	
+	but= uiDefHotKeyevtButS(block, 0, buf, 0, 0, 200, 20, dummy, dummy+1, "");
+	uiButSetFunc(but, do_menu_change_hotkey, arg_but, dummy);
+
+	uiPopupBoundsBlock(block, 6.0f, 50, -10);
+	uiEndBlock(C, block);
+	
+	return block;
+}
+
 static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
 {
 	uiHandleButtonData *data;
@@ -3145,9 +3263,22 @@
 		}
 		/* handle menu */
 		else if(event->type == RIGHTMOUSE && event->val == KM_PRESS) {
-			button_timers_tooltip_remove(C, but);
-			ui_but_anim_menu(C, but);
-			return WM_UI_HANDLER_BREAK;
+			/* RMB has two options now */
+			if(but->rnapoin.data && but->rnaprop) {
+				button_timers_tooltip_remove(C, but);
+				ui_but_anim_menu(C, but);
+				return WM_UI_HANDLER_BREAK;
+			}
+			else if((but->block->flag & UI_BLOCK_LOOP) && but->optype) {
+				IDProperty *prop= (but->opptr)? but->opptr->data: NULL;
+				char buf[512];
+				
+				if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) {
+					
+					uiPupBlock(C, menu_change_hotkey, but);
+
+				}
+			}
 		}
 	}
 
@@ -3176,6 +3307,9 @@
 	case KEYEVT:
 		retval= ui_do_but_KEYEVT(C, but, data, event);
 		break;
+	case HOTKEYEVT:
+		retval= ui_do_but_HOTKEYEVT(C, but, data, event);
+		break;
 	case TOGBUT: 
 	case TOG: 
 	case TOGR: 
@@ -3521,6 +3655,10 @@
 	}
 	button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT);
 	
+	/* activate right away */
+	if(but->type==HOTKEYEVT)
+		button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT);
+	
 	if(type == BUTTON_ACTIVATE_OPEN) {
 		button_activate_state(C, but, BUTTON_STATE_MENU_OPEN);
 

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-28 16:46:14 UTC (rev 21973)
+++ branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c	2009-07-28 16:48:02 UTC (rev 21974)
@@ -1132,8 +1132,9 @@
 		te->name= km->nameid;
 		
 		if(!(tselem->flag & TSE_CLOSED)) {
+			a= 0;
 			
-			for (kmi= km->keymap.first; kmi; kmi= kmi->next) {
+			for (kmi= km->keymap.first; kmi; kmi= kmi->next, a++) {
 				const char *key= WM_key_event_string(kmi->type);
 				
 				if(key[0]) {

Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2009-07-28 16:46:14 UTC (rev 21973)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2009-07-28 16:48:02 UTC (rev 21974)
@@ -100,6 +100,7 @@
 
 const char	*WM_key_event_string(short type);
 char		*WM_key_event_operator_string(const struct bContext *C, const char *opname, int opcontext, struct IDProperty *properties, char *str, int len);
+void		WM_key_event_operator_change(const bContext *C, const char *opname, int opcontext, struct IDProperty *properties, short key, short modifier);
 
 			/* handlers */
 

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_keymap.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_keymap.c	2009-07-28 16:46:14 UTC (rev 21973)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_keymap.c	2009-07-28 16:48:02 UTC (rev 21974)
@@ -65,6 +65,8 @@
 	}
 	else {
 		
+		kmi->shift= kmi->ctrl= kmi->alt= kmi->oskey= 0;
+		
 		/* defines? */
 		if(modifier & KM_SHIFT)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list