Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2009-11-07 01:51:08 +0300
committerCampbell Barton <ideasman42@gmail.com>2009-11-07 01:51:08 +0300
commit6e47d9bb9c3f7e12ee3bdcf171d9adf1b3d62091 (patch)
tree4f7869a35a84136d64fd8435424d45f3cbfbdf21 /source/blender/windowmanager
parente2f01e4c7cad9dc506d6a7309701b34c44815292 (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.h1
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c171
-rw-r--r--source/blender/windowmanager/wm_event_types.h15
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 */