[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