[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41832] trunk/blender: fix [#29242] menus have no keyboard shortcuts

Campbell Barton ideasman42 at gmail.com
Mon Nov 14 15:42:48 CET 2011


Revision: 41832
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41832
Author:   campbellbarton
Date:     2011-11-14 14:42:47 +0000 (Mon, 14 Nov 2011)
Log Message:
-----------
fix [#29242] menus have no keyboard shortcuts

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_object_constraint.py
    trunk/blender/source/blender/blenkernel/intern/tracking.c
    trunk/blender/source/blender/editors/include/UI_interface.h
    trunk/blender/source/blender/editors/interface/interface.c
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/editors/interface/interface_layout.c
    trunk/blender/source/blender/editors/interface/interface_regions.c
    trunk/blender/source/blender/editors/interface/interface_templates.c
    trunk/blender/source/blender/editors/interface/interface_widgets.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/WM_keymap.h
    trunk/blender/source/blender/windowmanager/intern/wm.c
    trunk/blender/source/blender/windowmanager/intern/wm_keymap.c
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_object_constraint.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_object_constraint.py	2011-11-14 14:02:19 UTC (rev 41831)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_object_constraint.py	2011-11-14 14:42:47 UTC (rev 41832)
@@ -763,7 +763,6 @@
 
         layout.prop(con, "track")
 
-
         layout.operator("clip.constraint_to_fcurve")
 
     def CAMERA_SOLVER(self, context, layout, con):

Modified: trunk/blender/source/blender/blenkernel/intern/tracking.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/tracking.c	2011-11-14 14:02:19 UTC (rev 41831)
+++ trunk/blender/source/blender/blenkernel/intern/tracking.c	2011-11-14 14:42:47 UTC (rev 41832)
@@ -1449,6 +1449,7 @@
 	return 1;
 #else
 	BLI_strncpy(error_msg, "Blender is compiled without motion tracking library", error_size);
+	(void)tracking;
 
 	return 0;
 #endif

Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h	2011-11-14 14:02:19 UTC (rev 41831)
+++ trunk/blender/source/blender/editors/include/UI_interface.h	2011-11-14 14:42:47 UTC (rev 41832)
@@ -688,6 +688,7 @@
 void uiLayoutSetContextPointer(uiLayout *layout, const char *name, struct PointerRNA *ptr);
 const char *uiLayoutIntrospect(uiLayout *layout); // XXX - testing
 void uiLayoutOperatorButs(const struct bContext *C, struct uiLayout *layout, struct wmOperator *op, int (*check_prop)(struct PropertyRNA *), const char label_align, const short flag);
+struct MenuType *uiButGetMenuType(uiBut *but);
 
 void uiLayoutSetOperatorContext(uiLayout *layout, int opcontext);
 void uiLayoutSetActive(uiLayout *layout, int active);

Modified: trunk/blender/source/blender/editors/interface/interface.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface.c	2011-11-14 14:02:19 UTC (rev 41831)
+++ trunk/blender/source/blender/editors/interface/interface.c	2011-11-14 14:42:47 UTC (rev 41832)
@@ -48,6 +48,8 @@
 #include "BKE_context.h"
 #include "BKE_library.h"
 #include "BKE_unit.h"
+#include "BKE_screen.h"
+#include "BKE_idprop.h"
 #include "BKE_utildefines.h" /* FILE_MAX */
 
 #include "BIF_gl.h"
@@ -793,26 +795,61 @@
 static void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block)
 {
 	uiBut *but;
-	IDProperty *prop;
 	char buf[512];
 
+	/* for menu's */
+	MenuType *mt;
+	IDProperty *prop_menu= NULL;
+	IDProperty *prop_menu_name= NULL;
+
 	/* only do it before bounding */
 	if(block->minx != block->maxx)
 		return;
 
+
+#define UI_MENU_KEY_STR_CAT                                                   \
+	char *butstr_orig= BLI_strdup(but->str);                                  \
+	BLI_snprintf(but->strdata,                                                \
+				 sizeof(but->strdata),                                        \
+				 "%s|%s",                                                     \
+				 butstr_orig, buf);                                           \
+	MEM_freeN(butstr_orig);                                                   \
+	but->str= but->strdata;                                                   \
+	ui_check_but(but);                                                        \
+
+
 	for(but=block->buttons.first; but; but=but->next) {
 		if(but->optype) {
-			prop= (but->opptr)? but->opptr->data: NULL;
+			IDProperty *prop= (but->opptr)? but->opptr->data: NULL;
 
-			if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) {
-				char *butstr_orig= BLI_strdup(but->str);
-				BLI_snprintf(but->strdata, sizeof(but->strdata), "%s|%s", butstr_orig, buf);
-				MEM_freeN(butstr_orig);
-				but->str= but->strdata;
-				ui_check_but(but);
+			if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, TRUE, buf, sizeof(buf))) {
+				UI_MENU_KEY_STR_CAT
 			}
 		}
+		else if ((mt= uiButGetMenuType(but))) {
+			/* only allocate menu property once */
+			if (prop_menu == NULL) {
+				/* annoying, create a property */
+				IDPropertyTemplate val = {0};
+				prop_menu= IDP_New(IDP_GROUP, val, __func__); /* dummy, name is unimportant  */
+				IDP_AddToGroup(prop_menu, (prop_menu_name= IDP_NewString("", "name", sizeof(mt->idname))));
+			}
+
+			IDP_AssignString(prop_menu_name, mt->idname, sizeof(mt->idname));
+
+			if(WM_key_event_operator_string(C, "WM_OT_call_menu", WM_OP_INVOKE_REGION_WIN, prop_menu, FALSE, buf, sizeof(buf))) {
+				UI_MENU_KEY_STR_CAT
+			}
+		}
 	}
+
+	if (prop_menu) {
+		IDP_FreeProperty(prop_menu);
+		MEM_freeN(prop_menu);
+	}
+
+#undef UI_MENU_KEY_STR_CAT
+
 }
 
 void uiEndBlock(const bContext *C, uiBlock *block)

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2011-11-14 14:02:19 UTC (rev 41831)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2011-11-14 14:42:47 UTC (rev 41832)
@@ -4357,7 +4357,7 @@
 		IDProperty *prop= (but->opptr)? but->opptr->data: NULL;
 		
 		/* complex code to change name of button */
-		if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) {
+		if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, TRUE, buf, sizeof(buf))) {
 			char *butstr_orig;
 
 			// XXX but->str changed... should not, remove the hotkey from it

Modified: trunk/blender/source/blender/editors/interface/interface_layout.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_layout.c	2011-11-14 14:02:19 UTC (rev 41831)
+++ trunk/blender/source/blender/editors/interface/interface_layout.c	2011-11-14 14:42:47 UTC (rev 41832)
@@ -2821,3 +2821,14 @@
 		}
 	}
 }
+
+/* this is a bit of a hack but best keep it in one place at least */
+MenuType *uiButGetMenuType(uiBut *but)
+{
+	if(but->menu_create_func == ui_item_menutype_func) {
+		return (MenuType *)but->poin;
+	}
+	else {
+		return NULL;
+	}
+}

Modified: trunk/blender/source/blender/editors/interface/interface_regions.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_regions.c	2011-11-14 14:02:19 UTC (rev 41831)
+++ trunk/blender/source/blender/editors/interface/interface_regions.c	2011-11-14 14:42:47 UTC (rev 41832)
@@ -408,7 +408,7 @@
 		/* operator keymap (not menus, they already have it) */
 		prop= (but->opptr)? but->opptr->data: NULL;
 
-		if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) {
+		if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, TRUE, buf, sizeof(buf))) {
 			BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), TIP_("Shortcut: %s"), buf);
 			data->color[data->totline]= 0x888888;
 			data->totline++;
@@ -493,8 +493,8 @@
 	}
 	else if (ELEM(but->type, MENU, PULLDOWN)) {
 		if ((U.flag & USER_TOOLTIPS_PYTHON) == 0) {
-			if(but->menu_create_func && WM_menutype_contains((MenuType *)but->poin)) {
-				MenuType *mt= (MenuType *)but->poin;
+			MenuType *mt= uiButGetMenuType(but);
+			if (mt) {
 				BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), TIP_("Python: %s"), mt->idname);
 				data->color[data->totline]= 0x888888;
 				data->totline++;

Modified: trunk/blender/source/blender/editors/interface/interface_templates.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_templates.c	2011-11-14 14:02:19 UTC (rev 41831)
+++ trunk/blender/source/blender/editors/interface/interface_templates.c	2011-11-14 14:42:47 UTC (rev 41832)
@@ -2458,7 +2458,7 @@
 				
 				/* check for hotkey */
 				if(len < 256-6) {
-					if(WM_key_event_operator_string(C, ot->idname, WM_OP_EXEC_DEFAULT, NULL, &name[len+1], 256-len-1))
+					if(WM_key_event_operator_string(C, ot->idname, WM_OP_EXEC_DEFAULT, NULL, TRUE, &name[len+1], 256-len-1))
 						name[len]= '|';
 				}
 				

Modified: trunk/blender/source/blender/editors/interface/interface_widgets.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_widgets.c	2011-11-14 14:02:19 UTC (rev 41831)
+++ trunk/blender/source/blender/editors/interface/interface_widgets.c	2011-11-14 14:42:47 UTC (rev 41832)
@@ -810,6 +810,11 @@
 }
 
 
+static int ui_but_draw_menu_icon(uiBut *but)
+{
+	return (but->flag & UI_ICON_SUBMENU) && (but->dt == UI_EMBOSSP);
+}
+
 /* icons have been standardized... and this call draws in untransformed coordinates */
 
 static void widget_draw_icon(uiBut *but, BIFIconID icon, float alpha, rcti *rect)
@@ -888,8 +893,8 @@
 		else
 			UI_icon_draw_aspect(xs, ys, icon, aspect, alpha);
 	}
-	
-	if((but->flag & UI_ICON_SUBMENU) && (but->dt == UI_EMBOSSP)) {
+
+	if (ui_but_draw_menu_icon(but)) {
 		xs= rect->xmax-17;
 		ys= (rect->ymin+rect->ymax- height)/2;
 		
@@ -1139,7 +1144,7 @@
 	/* part text right aligned */
 	if(cpoin) {
 		fstyle->align= UI_STYLE_TEXT_RIGHT;
-		rect->xmax-=5;
+		rect->xmax -= ui_but_draw_menu_icon(but) ? UI_DPI_ICON_SIZE : 5;
 		uiStyleFontDraw(fstyle, rect, cpoin+1);
 		*cpoin= '|';
 	}

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2011-11-14 14:02:19 UTC (rev 41831)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2011-11-14 14:42:47 UTC (rev 41832)
@@ -233,7 +233,6 @@
 void				WM_menutype_init(void);
 struct MenuType		*WM_menutype_find(const char *idname, int quiet);
 int					WM_menutype_add(struct MenuType* mt);
-int					WM_menutype_contains(struct MenuType* mt);
 void				WM_menutype_freelink(struct MenuType* mt);
 void				WM_menutype_free(void);
 

Modified: trunk/blender/source/blender/windowmanager/WM_keymap.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_keymap.h	2011-11-14 14:02:19 UTC (rev 41831)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list