diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-11-07 01:51:08 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-11-07 01:51:08 +0300 |
commit | 6e47d9bb9c3f7e12ee3bdcf171d9adf1b3d62091 (patch) | |
tree | 4f7869a35a84136d64fd8435424d45f3cbfbdf21 /source/blender/windowmanager | |
parent | e2f01e4c7cad9dc506d6a7309701b34c44815292 (diff) |
- modal keymap for border select
- revert circle select keys adjustments & view navigation while selecting (durian guys liked but allowed activating multiple circle select's at once)
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 1 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 171 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_event_types.h | 15 |
3 files changed, 128 insertions, 59 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 224338e557a..f9732b9c929 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -185,6 +185,7 @@ void WM_operator_properties_alloc(struct PointerRNA **ptr, struct IDProperty ** void WM_operator_properties_create(struct PointerRNA *ptr, const char *opstring); void WM_operator_properties_free(struct PointerRNA *ptr); void WM_operator_properties_filesel(struct wmOperatorType *ot, int filter, short type); +void WM_operator_properties_gesture_border(wmOperatorType *ot, int extend); /* operator as a python command (resultuing string must be free'd) */ char *WM_operator_pystring(struct bContext *C, struct wmOperatorType *ot, struct PointerRNA *opptr, int all_args); diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index d1af9446654..22c5f1c15ae 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -571,6 +571,19 @@ void WM_operator_properties_filesel(wmOperatorType *ot, int filter, short type) RNA_def_property_flag(prop, PROP_HIDDEN); } +void WM_operator_properties_gesture_border(wmOperatorType *ot, int extend) +{ + RNA_def_int(ot->srna, "gesture_mode", 0, INT_MIN, INT_MAX, "Gesture Mode", "", INT_MIN, INT_MAX); + RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX); + RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX); + RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX); + RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX); + + if(extend) + RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first."); +} + + /* op->poll */ int WM_operator_winactive(bContext *C) { @@ -1525,7 +1538,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, int event_orig) +static int border_apply(bContext *C, wmOperator *op, int gesture_mode) { wmGesture *gesture= op->customdata; rcti *rect= gesture->customdata; @@ -1545,12 +1558,9 @@ static int border_apply(bContext *C, wmOperator *op, int event_type, int event_o RNA_int_set(op->ptr, "ymax", rect->ymax); /* 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); - } + if( RNA_struct_find_property(op->ptr, "gesture_mode") ) + RNA_int_set(op->ptr, "gesture_mode", gesture_mode); + op->type->exec(C, op); return 1; @@ -1590,46 +1600,49 @@ int WM_border_select_modal(bContext *C, wmOperator *op, wmEvent *event) rcti *rect= gesture->customdata; int sx, sy; - switch(event->type) { - case MOUSEMOVE: - - wm_subwindow_getorigin(CTX_wm_window(C), gesture->swinid, &sx, &sy); - + if(event->type== MOUSEMOVE) { + wm_subwindow_getorigin(CTX_wm_window(C), gesture->swinid, &sx, &sy); + + if(gesture->type==WM_GESTURE_CROSS_RECT && gesture->mode==0) { + rect->xmin= rect->xmax= event->x - sx; + rect->ymin= rect->ymax= event->y - sy; + } + else { + rect->xmax= event->x - sx; + rect->ymax= event->y - sy; + } + + wm_gesture_tag_redraw(C); + } + else if (event->type==EVT_MODAL_MAP) { + switch (event->val) { + case GESTURE_MODAL_BORDER_BEGIN: if(gesture->type==WM_GESTURE_CROSS_RECT && gesture->mode==0) { - rect->xmin= rect->xmax= event->x - sx; - rect->ymin= rect->ymax= event->y - sy; - } - else { - rect->xmax= event->x - sx; - rect->ymax= event->y - sy; + gesture->mode= 1; + wm_gesture_tag_redraw(C); } - - wm_gesture_tag_redraw(C); - break; - - case LEFTMOUSE: - case MIDDLEMOUSE: - case RIGHTMOUSE: - 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, gesture->event_type)) { - wm_gesture_end(C, op); - return OPERATOR_FINISHED; - } + case GESTURE_MODAL_SELECT: + case GESTURE_MODAL_DESELECT: + if(border_apply(C, op, event->val)) { wm_gesture_end(C, op); - return OPERATOR_CANCELLED; + return OPERATOR_FINISHED; } + wm_gesture_end(C, op); + return OPERATOR_CANCELLED; break; - case ESCKEY: + + case GESTURE_MODAL_CANCEL: wm_gesture_end(C, op); return OPERATOR_CANCELLED; + } + } +// // Allow view navigation??? +// else { +// return OPERATOR_PASS_THROUGH; +// } + return OPERATOR_RUNNING_MODAL; } @@ -1692,11 +1705,11 @@ int WM_gesture_circle_modal(bContext *C, wmOperator *op, wmEvent *event) } else if (event->type==EVT_MODAL_MAP) { switch (event->val) { - case GESTURE_MODAL_ADD: + case GESTURE_MODAL_CIRCLE_ADD: rect->xmax += 2 + rect->xmax/10; wm_gesture_tag_redraw(C); break; - case GESTURE_MODAL_SUB: + case GESTURE_MODAL_CIRCLE_SUB: rect->xmax -= 2 + rect->xmax/10; if(rect->xmax < 1) rect->xmax= 1; wm_gesture_tag_redraw(C); @@ -1720,9 +1733,10 @@ int WM_gesture_circle_modal(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_CANCELLED; } } - else { - return OPERATOR_PASS_THROUGH; - } +// // Allow view navigation??? +// else { +// return OPERATOR_PASS_THROUGH; +// } return OPERATOR_RUNNING_MODAL; } @@ -2376,8 +2390,8 @@ static void gesture_circle_modal_keymap(wmKeyConfig *keyconf) static EnumPropertyItem modal_items[] = { {GESTURE_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""}, {GESTURE_MODAL_CONFIRM, "CONFIRM", 0, "Confirm", ""}, - {GESTURE_MODAL_ADD, "ADD", 0, "Add", ""}, - {GESTURE_MODAL_SUB, "SUBTRACT", 0, "Subtract", ""}, + {GESTURE_MODAL_CIRCLE_ADD, "ADD", 0, "Add", ""}, + {GESTURE_MODAL_CIRCLE_SUB, "SUBTRACT", 0, "Subtract", ""}, {GESTURE_MODAL_SELECT, "SELECT", 0, "Select", ""}, {GESTURE_MODAL_DESELECT,"DESELECT", 0, "DeSelect", ""}, @@ -2402,19 +2416,20 @@ static void gesture_circle_modal_keymap(wmKeyConfig *keyconf) WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_SELECT); -// WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_DESELECT); // defailt 2.4x +#if 0 // Durien guys like this :S WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_SHIFT, 0, GESTURE_MODAL_DESELECT); - - WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_NOP); - -// WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_NOP); // defailt 2.4x WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_SHIFT, 0, GESTURE_MODAL_NOP); +#else + WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_DESELECT); // defailt 2.4x + WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_NOP); // defailt 2.4x +#endif + WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_NOP); - WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_SUB); - WM_modalkeymap_add_item(keymap, PADMINUS, KM_PRESS, 0, 0, GESTURE_MODAL_SUB); - WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_ADD); - WM_modalkeymap_add_item(keymap, PADPLUSKEY, KM_PRESS, 0, 0, GESTURE_MODAL_ADD); + WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_CIRCLE_SUB); + WM_modalkeymap_add_item(keymap, PADMINUS, KM_PRESS, 0, 0, GESTURE_MODAL_CIRCLE_SUB); + WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_CIRCLE_ADD); + WM_modalkeymap_add_item(keymap, PADPLUSKEY, KM_PRESS, 0, 0, GESTURE_MODAL_CIRCLE_ADD); /* assign map to operators */ WM_modalkeymap_assign(keymap, "VIEW3D_OT_select_circle"); @@ -2422,6 +2437,53 @@ static void gesture_circle_modal_keymap(wmKeyConfig *keyconf) } +/* called in transform_ops.c, on each regeneration of keymaps */ +static void gesture_border_modal_keymap(wmKeyConfig *keyconf) +{ + static EnumPropertyItem modal_items[] = { + {GESTURE_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""}, + {GESTURE_MODAL_SELECT, "SELECT", 0, "Select", ""}, + {GESTURE_MODAL_DESELECT,"DESELECT", 0, "DeSelect", ""}, + {GESTURE_MODAL_BORDER_BEGIN, "BEGIN", 0, "Begin", ""}, + {0, NULL, 0, NULL, NULL}}; + + wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "View3D Gesture Border"); + + /* this function is called for each spacetype, only needs to add map once */ + if(keymap) return; + + keymap= WM_modalkeymap_add(keyconf, "View3D Gesture Border", modal_items); + + /* items for modal map */ + WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, GESTURE_MODAL_CANCEL); + WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, GESTURE_MODAL_CANCEL); + + WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BORDER_BEGIN); + WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_SELECT); + +#if 0 // Durian guys like this + WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_SHIFT, 0, GESTURE_MODAL_BORDER_BEGIN); + WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_RELEASE, KM_SHIFT, 0, GESTURE_MODAL_DESELECT); +#else + WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, 0, 0, GESTURE_MODAL_BORDER_BEGIN); + WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, 0, 0, GESTURE_MODAL_DESELECT); +#endif + + /* assign map to operators */ + WM_modalkeymap_assign(keymap, "ANIM_OT_channels_select_border"); + WM_modalkeymap_assign(keymap, "MARKER_OT_select_border"); +// WM_modalkeymap_assign(keymap, "SCREEN_OT_border_select"); // template + WM_modalkeymap_assign(keymap, "ACT_OT_select_border"); + WM_modalkeymap_assign(keymap, "CONSOLE_OT_select_border"); + WM_modalkeymap_assign(keymap, "FILE_OT_select_border"); + WM_modalkeymap_assign(keymap, "GRAPH_OT_select_border"); + WM_modalkeymap_assign(keymap, "NLA_OT_select_border"); + WM_modalkeymap_assign(keymap, "NODE_OT_select_border"); + WM_modalkeymap_assign(keymap, "SEQUENCER_OT_select_border"); + WM_modalkeymap_assign(keymap, "VIEW3D_OT_select_border"); + WM_modalkeymap_assign(keymap, "UV_OT_select_border"); +} + /* default keymap for windows and screens, only call once per WM */ void wm_window_keymap(wmKeyConfig *keyconf) { @@ -2512,6 +2574,7 @@ void wm_window_keymap(wmKeyConfig *keyconf) RNA_string_set(km->ptr, "value", "DOPESHEET_EDITOR"); gesture_circle_modal_keymap(keyconf); + gesture_border_modal_keymap(keyconf); } /* Generic itemf's for operators that take library args */ diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h index a07f9f26725..8412e7f0b16 100644 --- a/source/blender/windowmanager/wm_event_types.h +++ b/source/blender/windowmanager/wm_event_types.h @@ -264,12 +264,17 @@ /* NOTE: these defines are saved in keymap files, do not change values but just add new ones */ #define GESTURE_MODAL_CANCEL 1 #define GESTURE_MODAL_CONFIRM 2 -#define GESTURE_MODAL_ADD 3 -#define GESTURE_MODAL_SUB 4 -#define GESTURE_MODAL_SELECT 5 -#define GESTURE_MODAL_DESELECT 6 -#define GESTURE_MODAL_NOP 7 +#define GESTURE_MODAL_SELECT 3 +#define GESTURE_MODAL_DESELECT 4 + +#define GESTURE_MODAL_NOP 5 /* circle select when no mouse button is pressed */ + +#define GESTURE_MODAL_CIRCLE_ADD 6 /* circle sel: larger brush */ +#define GESTURE_MODAL_CIRCLE_SUB 7 /* circle sel: smaller brush */ + +#define GESTURE_MODAL_BORDER_BEGIN 8 /* border select, activate, use release to detect which button */ + #endif /* WM_EVENT_TYPES_H */ |