Bugfix #21853: Border zoom in the 2D-Views zooms out
authorJoshua Leung <aligorith@gmail.com>
Fri, 2 Apr 2010 03:52:44 +0000 (03:52 +0000)
committerJoshua Leung <aligorith@gmail.com>
Fri, 2 Apr 2010 03:52:44 +0000 (03:52 +0000)
* Fixed the way the operator was checking for what the user wanted when using the operator
* Added a few specific defines to a copy of the gesture border modal keymap (added one for zooming only) labelled 'In' and 'Out' which make this more useful than being hacked to use select and deselect

source/blender/editors/animation/keyframing.c
source/blender/editors/interface/view2d_ops.c
source/blender/windowmanager/intern/wm_operators.c
source/blender/windowmanager/wm_event_types.h

index 800b0248728498e1c491c301ca3b16b019377783..02b797709412d9251ea7a7e553d6b403c261b637 100644 (file)
@@ -286,7 +286,9 @@ int insert_vert_fcurve (FCurve *fcu, float x, float y, short flag)
        BezTriple beztr;
        int a;
        
-       /* set all three points, for nicer start position */
+       /* set all three points, for nicer start position 
+        * NOTE: +/- 1 on vec.x for left and right handles is so that 'free' handles work ok...
+        */
        memset(&beztr, 0, sizeof(BezTriple));
        beztr.vec[0][0]= x-1.0f; 
        beztr.vec[0][1]= y;
index 4039e9757245ef0ce1b8772422016f56e4f30af4..8e760a7501c8a421115d0f56d54adf117a48f424 100644 (file)
@@ -1038,17 +1038,16 @@ static int view_borderzoom_exec(bContext *C, wmOperator *op)
        ARegion *ar= CTX_wm_region(C);
        View2D *v2d= &ar->v2d;
        rctf rect;
-       int event_type;
+       int gesture_mode;
        
        /* convert coordinates of rect to 'tot' rect coordinates */
        UI_view2d_region_to_view(v2d, RNA_int_get(op->ptr, "xmin"), RNA_int_get(op->ptr, "ymin"), &rect.xmin, &rect.ymin);
        UI_view2d_region_to_view(v2d, RNA_int_get(op->ptr, "xmax"), RNA_int_get(op->ptr, "ymax"), &rect.xmax, &rect.ymax);
        
        /* check if zooming in/out view */
-       // XXX hardcoded for now!
-       event_type= RNA_int_get(op->ptr, "event_type");
+       gesture_mode= RNA_int_get(op->ptr, "gesture_mode");
        
-       if (event_type == LEFTMOUSE) {
+       if (gesture_mode == GESTURE_MODAL_IN) {
                /* zoom in: 
                 *      - 'cur' rect will be defined by the coordinates of the border region 
                 *      - just set the 'cur' rect to have the same coordinates as the border region
@@ -1063,7 +1062,7 @@ static int view_borderzoom_exec(bContext *C, wmOperator *op)
                        v2d->cur.ymax= rect.ymax;
                }
        }
-       else {
+       else /* if (gesture_mode == GESTURE_MODAL_OUT) */ {
                /* zoom out:
                 *      - the current 'cur' rect coordinates are going to end upwhere the 'rect' ones are, 
                 *        but the 'cur' rect coordinates will need to be adjusted to take in more of the view
@@ -1116,7 +1115,7 @@ void VIEW2D_OT_zoom_border(wmOperatorType *ot)
        ot->poll= view_zoom_poll;
        
        /* rna */
-       RNA_def_int(ot->srna, "event_type", 0, INT_MIN, INT_MAX, "Event Type", "", INT_MIN, INT_MAX);
+       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);
index 7e5aa2ad8f4f74203288eaf676c5c70d7da8d8ac..535dd5f1a62ad93e01d2621222e286d91338d66d 100644 (file)
@@ -2070,6 +2070,8 @@ int WM_border_select_modal(bContext *C, wmOperator *op, wmEvent *event)
                        break;
                case GESTURE_MODAL_SELECT:
                case GESTURE_MODAL_DESELECT:
+               case GESTURE_MODAL_IN:
+               case GESTURE_MODAL_OUT:
                        if(border_apply(C, op, event->val)) {
                                wm_gesture_end(C, op);
                                return OPERATOR_FINISHED;
@@ -2843,7 +2845,7 @@ void wm_operatortype_init(void)
 
 }
 
-/* called in transform_ops.c, on each regeneration of keymaps  */
+/* circleselect-like modal operators */
 static void gesture_circle_modal_keymap(wmKeyConfig *keyconf)
 {
        static EnumPropertyItem modal_items[] = {
@@ -2896,7 +2898,7 @@ static void gesture_circle_modal_keymap(wmKeyConfig *keyconf)
 
 }
 
-/* called in transform_ops.c, on each regeneration of keymaps  */
+/* borderselect-like modal operators */
 static void gesture_border_modal_keymap(wmKeyConfig *keyconf)
 {
        static EnumPropertyItem modal_items[] = {
@@ -2948,6 +2950,38 @@ static void gesture_border_modal_keymap(wmKeyConfig *keyconf)
        WM_modalkeymap_assign(keymap, "VIEW3D_OT_zoom_border"); // XXX TODO: zoom border should perhaps map rightmouse to zoom out instead of in+cancel
 }
 
+/* zoom to border modal operators */
+static void gesture_zoom_border_modal_keymap(wmKeyConfig *keyconf)
+{
+       static EnumPropertyItem modal_items[] = {
+       {GESTURE_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""},
+       {GESTURE_MODAL_IN,      "IN", 0, "In", ""},
+       {GESTURE_MODAL_OUT, "OUT", 0, "Out", ""},
+       {GESTURE_MODAL_BORDER_BEGIN, "BEGIN", 0, "Begin", ""},
+       {0, NULL, 0, NULL, NULL}};
+
+       wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "Gesture Zoom Border");
+
+       /* this function is called for each spacetype, only needs to add map once */
+       if(keymap) return;
+
+       keymap= WM_modalkeymap_add(keyconf, "Gesture Zoom 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_IN); 
+
+       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_OUT);
+
+       /* assign map to operators */
+       WM_modalkeymap_assign(keymap, "VIEW2D_OT_zoom_border");
+       WM_modalkeymap_assign(keymap, "VIEW3D_OT_zoom_border");
+}
+
 /* default keymap for windows and screens, only call once per WM */
 void wm_window_keymap(wmKeyConfig *keyconf)
 {
@@ -3035,6 +3069,7 @@ void wm_window_keymap(wmKeyConfig *keyconf)
 
        gesture_circle_modal_keymap(keyconf);
        gesture_border_modal_keymap(keyconf);
+       gesture_zoom_border_modal_keymap(keyconf);
 }
 
 /* Generic itemf's for operators that take library args */
index 5f6af878976c4855362458f0504e5304a0ade480..59dddbaea5bad8006c1a942af7d1d79836f6b058 100644 (file)
 
 #define GESTURE_MODAL_BORDER_BEGIN     8 /* border select, activate, use release to detect which button */
 
+#define GESTURE_MODAL_IN                       9
+#define GESTURE_MODAL_OUT                      10
+
 
 #endif /* WM_EVENT_TYPES_H */