Any script can now register a unique key combination as part of its bpy header. For a supported space type, the user may press this shortcut to invoke the script.

Space types that are to support shortcuts like this should call BPY_menu_do_shortcut(...) from the event queue read method (See winqreadtextspace in drawtext.c for example)
This commit is contained in:
2008-07-15 07:04:31 +00:00
parent 14c1ed0810
commit dbb61988fd
8 changed files with 349 additions and 10 deletions

View File

@@ -42,6 +42,7 @@
#endif
#include "BKE_global.h"
#include "BKE_utildefines.h"
#include "BIF_keyval.h"
#include "BLI_blenlib.h"
#include "MEM_guardedalloc.h"
#include "DNA_userdef_types.h" /* for U.pythondir */
@@ -333,6 +334,23 @@ static void bpymenu_set_tooltip( BPyMenu * pymenu, char *tip )
return;
}
static void bpymenu_set_shortcut( BPyMenu * pymenu, char *combi )
{
unsigned short key, qual;
if( !pymenu )
return;
if (!decode_key_string(combi, &key, &qual)) {
return; /* TODO: Print some error */
}
pymenu->key = key;
pymenu->qual = qual;
return;
}
/* bpymenu_AddEntry:
* try to find an existing pymenu entry with the given type and name;
* if found, update it with new info, otherwise create a new one and fill it.
@@ -693,6 +711,7 @@ void BPyMenu_PrintAllEntries( void )
* # Blender: <code>short int</code> (minimal Blender version)
* # Group: 'group name' (defines menu)
* # Submenu: 'submenu name' related_1word_arg
* # Shortcut: Modifier+Key (optional shortcut combination for supported groups)
* # Tooltip: 'tooltip for the menu'
* # \"\"\"
*
@@ -801,13 +820,19 @@ static int bpymenu_ParseFile(FILE *file, char *fname, int is_userdir)
if ((matches == 3) && (strstr(head, "Submenu:") != NULL)) {
bpymenu_AddSubEntry(scriptMenu, middle, tail);
} else {
/* Tooltip: 'tooltip for the menu */
/* Shortcut: 'key+combination' */
matches = sscanf(line, "%[^']'%[^']'%c", head, middle, tail);
if ((matches == 3) && ((strstr(head, "Tooltip:") != NULL) ||
(strstr(head, "Tip:") != NULL))) {
bpymenu_set_tooltip(scriptMenu, middle);
if ((matches == 3) && (strstr(head, "Shortcut:") != NULL)) {
bpymenu_set_shortcut(scriptMenu, middle);
} else {
/* Tooltip: 'tooltip for the menu */
matches = sscanf(line, "%[^']'%[^']'%c", head, middle, tail);
if ((matches == 3) && ((strstr(head, "Tooltip:") != NULL) ||
(strstr(head, "Tip:") != NULL))) {
bpymenu_set_tooltip(scriptMenu, middle);
}
parser_state = 0;
}
parser_state = 0;
}
break;