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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to