diff options
author | Ton Roosendaal <ton@blender.org> | 2009-07-26 16:52:39 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2009-07-26 16:52:39 +0400 |
commit | 9ac754eca5466d62abed6d207d1efdbbb7d77b18 (patch) | |
tree | 3b0d63d120c6b24de6f5c161774cc9a3d874ab08 /source/blender/windowmanager | |
parent | 7084447c73bd5b2b5fb9aa12a4e3b2e983723c2f (diff) |
2.5
First step towards keymap editor!
Before getting too excited:
- doesn't save yet
- no rna properties can be defined
- no insert/remove keymap options yet
- no option yet to set 'key press/release'
But what does work;
- Keymap list is in outliner, new category
(Keymaps are listed in order as being created now)
- enable/disable a keymap entry: click on dot icon
- it displays python api names for ops
- browse new operator for keymap (menu button)
- set keymap to use other keys, mouse or tweak events
- four modifier key options
I first intent to test it all well, there are still
quite some modal map conflicts (like border select) and
there's problems assigning items to tweaks
Another issue is that a visual editor for keymaps might be
quite hard to use... the amount of data and options is just not
so fun for a buttons menu. There are ways to improve this though.
Maybe do this via a script?
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 1 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_keymap.c | 10 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 20 |
4 files changed, 27 insertions, 6 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 0a68d2c9053..ca60c6e7637 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -96,6 +96,7 @@ wmKeyMap *WM_modalkeymap_get(struct wmWindowManager *wm, const char *nameid); void WM_modalkeymap_add_item(wmKeyMap *km, short type, short val, int modifier, short keymodifier, short value); void WM_modalkeymap_assign(wmKeyMap *km, const char *opname); +int WM_key_event_is_tweak(short type); 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); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 78c7f7a7383..2a1fc009baa 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -626,6 +626,8 @@ static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *kmi) { int kmitype= wm_userdef_event_map(kmi->type); + if(kmi->inactive) return 0; + /* the matching rules */ if(kmitype==KM_TEXTINPUT) if(ISKEYBOARD(winevent->type)) return 1; diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index 764b209d755..1d959665f40 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -290,3 +290,13 @@ char *WM_key_event_operator_string(const bContext *C, const char *opname, int op return NULL; } +/* ********************* */ + +int WM_key_event_is_tweak(short type) +{ + if(type>=EVT_TWEAK_L && type<=EVT_GESTURE) + return 1; + return 0; +} + + diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 5c484dfa322..6c90926d545 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -906,7 +906,7 @@ void WM_paint_cursor_end(wmWindowManager *wm, void *handle) It stores 4 values (xmin, xmax, ymin, ymax) and event it ended with (event_type) */ -static int border_apply(bContext *C, wmOperator *op, int event_type) +static int border_apply(bContext *C, wmOperator *op, int event_type, int event_orig) { wmGesture *gesture= op->customdata; rcti *rect= gesture->customdata; @@ -924,9 +924,14 @@ static int border_apply(bContext *C, wmOperator *op, int event_type) RNA_int_set(op->ptr, "ymin", rect->ymin); RNA_int_set(op->ptr, "xmax", rect->xmax); RNA_int_set(op->ptr, "ymax", rect->ymax); - if( RNA_struct_find_property(op->ptr, "event_type") ) - RNA_int_set(op->ptr, "event_type", event_type); + /* XXX weak; border should be configured for this without reading event types */ + if( RNA_struct_find_property(op->ptr, "event_type") ) { + if(ELEM4(event_orig, EVT_TWEAK_L, EVT_TWEAK_R, EVT_TWEAK_A, EVT_TWEAK_S)) + event_type= LEFTMOUSE; + + RNA_int_set(op->ptr, "event_type", event_type); + } op->type->exec(C, op); return 1; @@ -947,7 +952,10 @@ static void wm_gesture_end(bContext *C, wmOperator *op) int WM_border_select_invoke(bContext *C, wmOperator *op, wmEvent *event) { - op->customdata= WM_gesture_new(C, event, WM_GESTURE_CROSS_RECT); + if(WM_key_event_is_tweak(event->type)) + op->customdata= WM_gesture_new(C, event, WM_GESTURE_RECT); + else + op->customdata= WM_gesture_new(C, event, WM_GESTURE_CROSS_RECT); /* add modal handler */ WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op); @@ -984,14 +992,14 @@ int WM_border_select_modal(bContext *C, wmOperator *op, wmEvent *event) case LEFTMOUSE: case MIDDLEMOUSE: case RIGHTMOUSE: - if(event->val==1) { + if(event->val==KM_PRESS) { if(gesture->type==WM_GESTURE_CROSS_RECT && gesture->mode==0) { gesture->mode= 1; wm_gesture_tag_redraw(C); } } else { - if(border_apply(C, op, event->type)) { + if(border_apply(C, op, event->type, gesture->event_type)) { wm_gesture_end(C, op); return OPERATOR_FINISHED; } |