diff options
Diffstat (limited to 'source/blender/editors/interface/view2d_ops.c')
-rw-r--r-- | source/blender/editors/interface/view2d_ops.c | 266 |
1 files changed, 153 insertions, 113 deletions
diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c index de1b26e987b..fcc72cba321 100644 --- a/source/blender/editors/interface/view2d_ops.c +++ b/source/blender/editors/interface/view2d_ops.c @@ -32,6 +32,7 @@ #include "DNA_userdef_types.h" #include "BLI_blenlib.h" +#include "BLI_utildefines.h" #include "BKE_context.h" @@ -46,6 +47,8 @@ #include "UI_view2d.h" +#include "PIL_time.h" /* USER_ZOOM_CONT */ + static int view2d_poll(bContext *C) { ARegion *ar= CTX_wm_region(C); @@ -119,7 +122,7 @@ static int view_pan_init(bContext *C, wmOperator *op) } /* apply transform to view (i.e. adjust 'cur' rect) */ -static void view_pan_apply(bContext *C, wmOperator *op) +static void view_pan_apply(wmOperator *op) { v2dViewPanData *vpd= op->customdata; View2D *v2d= vpd->v2d; @@ -146,7 +149,6 @@ static void view_pan_apply(bContext *C, wmOperator *op) ED_region_tag_redraw(vpd->ar); UI_view2d_sync(vpd->sc, vpd->sa, v2d, V2D_LOCK_COPY); - WM_event_add_mousemove(C); /* exceptions */ if (vpd->sa->spacetype==SPACE_OUTLINER) { @@ -157,7 +159,7 @@ static void view_pan_apply(bContext *C, wmOperator *op) } /* cleanup temp customdata */ -static void view_pan_exit(bContext *C, wmOperator *op) +static void view_pan_exit(wmOperator *op) { if (op->customdata) { MEM_freeN(op->customdata); @@ -173,8 +175,8 @@ static int view_pan_exec(bContext *C, wmOperator *op) if (!view_pan_init(C, op)) return OPERATOR_CANCELLED; - view_pan_apply(C, op); - view_pan_exit(C, op); + view_pan_apply(op); + view_pan_exit(op); return OPERATOR_FINISHED; } @@ -200,8 +202,8 @@ static int view_pan_invoke(bContext *C, wmOperator *op, wmEvent *event) RNA_int_set(op->ptr, "deltax", event->prevx - event->x); RNA_int_set(op->ptr, "deltay", event->prevy - event->y); - view_pan_apply(C, op); - view_pan_exit(C, op); + view_pan_apply(op); + view_pan_exit(op); return OPERATOR_FINISHED; } @@ -237,7 +239,7 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event) vpd->lastx= event->x; vpd->lasty= event->y; - view_pan_apply(C, op); + view_pan_apply(op); } break; @@ -248,7 +250,7 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event) RNA_int_set(op->ptr, "deltax", (vpd->startx - vpd->lastx)); RNA_int_set(op->ptr, "deltay", (vpd->starty - vpd->lasty)); - view_pan_exit(C, op); + view_pan_exit(op); WM_cursor_restore(CTX_wm_window(C)); WM_operator_name_call(C, "VIEW2D_OT_zoom", WM_OP_INVOKE_DEFAULT, NULL); @@ -261,7 +263,7 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event) RNA_int_set(op->ptr, "deltax", (vpd->startx - vpd->lastx)); RNA_int_set(op->ptr, "deltay", (vpd->starty - vpd->lasty)); - view_pan_exit(C, op); + view_pan_exit(op); WM_cursor_restore(CTX_wm_window(C)); return OPERATOR_FINISHED; @@ -272,9 +274,9 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_RUNNING_MODAL; } -static int view_pan_cancel(bContext *C, wmOperator *op) +static int view_pan_cancel(bContext *UNUSED(C), wmOperator *op) { - view_pan_exit(C, op); + view_pan_exit(op); return OPERATOR_CANCELLED; } @@ -313,7 +315,7 @@ static int view_scrollright_exec(bContext *C, wmOperator *op) /* also, check if can pan in horizontal axis */ vpd= op->customdata; if (vpd->v2d->keepofs & V2D_LOCKOFS_X) { - view_pan_exit(C, op); + view_pan_exit(op); return OPERATOR_PASS_THROUGH; } @@ -322,8 +324,8 @@ static int view_scrollright_exec(bContext *C, wmOperator *op) RNA_int_set(op->ptr, "deltay", 0); /* apply movement, then we're done */ - view_pan_apply(C, op); - view_pan_exit(C, op); + view_pan_apply(op); + view_pan_exit(op); return OPERATOR_FINISHED; } @@ -357,7 +359,7 @@ static int view_scrollleft_exec(bContext *C, wmOperator *op) /* also, check if can pan in horizontal axis */ vpd= op->customdata; if (vpd->v2d->keepofs & V2D_LOCKOFS_X) { - view_pan_exit(C, op); + view_pan_exit(op); return OPERATOR_PASS_THROUGH; } @@ -366,8 +368,8 @@ static int view_scrollleft_exec(bContext *C, wmOperator *op) RNA_int_set(op->ptr, "deltay", 0); /* apply movement, then we're done */ - view_pan_apply(C, op); - view_pan_exit(C, op); + view_pan_apply(op); + view_pan_exit(op); return OPERATOR_FINISHED; } @@ -400,7 +402,7 @@ static int view_scrolldown_exec(bContext *C, wmOperator *op) /* also, check if can pan in vertical axis */ vpd= op->customdata; if (vpd->v2d->keepofs & V2D_LOCKOFS_Y) { - view_pan_exit(C, op); + view_pan_exit(op); return OPERATOR_PASS_THROUGH; } @@ -408,9 +410,14 @@ static int view_scrolldown_exec(bContext *C, wmOperator *op) RNA_int_set(op->ptr, "deltax", 0); RNA_int_set(op->ptr, "deltay", -40); + if(RNA_boolean_get(op->ptr, "page")) { + ARegion *ar= CTX_wm_region(C); + RNA_int_set(op->ptr, "deltay", ar->v2d.mask.ymin - ar->v2d.mask.ymax); + } + /* apply movement, then we're done */ - view_pan_apply(C, op); - view_pan_exit(C, op); + view_pan_apply(op); + view_pan_exit(op); return OPERATOR_FINISHED; } @@ -428,6 +435,7 @@ void VIEW2D_OT_scroll_down(wmOperatorType *ot) /* rna - must keep these in sync with the other operators */ RNA_def_int(ot->srna, "deltax", 0, INT_MIN, INT_MAX, "Delta X", "", INT_MIN, INT_MAX); RNA_def_int(ot->srna, "deltay", 0, INT_MIN, INT_MAX, "Delta Y", "", INT_MIN, INT_MAX); + RNA_def_boolean(ot->srna, "page", 0, "Page", "Scroll down one page."); } @@ -444,7 +452,7 @@ static int view_scrollup_exec(bContext *C, wmOperator *op) /* also, check if can pan in vertical axis */ vpd= op->customdata; if (vpd->v2d->keepofs & V2D_LOCKOFS_Y) { - view_pan_exit(C, op); + view_pan_exit(op); return OPERATOR_PASS_THROUGH; } @@ -452,9 +460,14 @@ static int view_scrollup_exec(bContext *C, wmOperator *op) RNA_int_set(op->ptr, "deltax", 0); RNA_int_set(op->ptr, "deltay", 40); + if(RNA_boolean_get(op->ptr, "page")) { + ARegion *ar= CTX_wm_region(C); + RNA_int_set(op->ptr, "deltay", ar->v2d.mask.ymax - ar->v2d.mask.ymin); + } + /* apply movement, then we're done */ - view_pan_apply(C, op); - view_pan_exit(C, op); + view_pan_apply(op); + view_pan_exit(op); return OPERATOR_FINISHED; } @@ -472,6 +485,7 @@ void VIEW2D_OT_scroll_up(wmOperatorType *ot) /* rna - must keep these in sync with the other operators */ RNA_def_int(ot->srna, "deltax", 0, INT_MIN, INT_MAX, "Delta X", "", INT_MIN, INT_MAX); RNA_def_int(ot->srna, "deltay", 0, INT_MIN, INT_MAX, "Delta Y", "", INT_MIN, INT_MAX); + RNA_def_boolean(ot->srna, "page", 0, "Page", "Scroll up one page."); } /* ********************************************************* */ @@ -494,7 +508,11 @@ void VIEW2D_OT_scroll_up(wmOperatorType *ot) typedef struct v2dViewZoomData { View2D *v2d; /* view2d we're operating in */ ARegion *ar; - + + /* needed for continuous zoom */ + wmTimer *timer; + double timer_lastdraw; + int lastx, lasty; /* previous x/y values of mouse in window */ float dx, dy; /* running tally of previous delta values (for obtaining final zoom) */ float mx_2d, my_2d; /* initial mouse location in v2d coords */ @@ -628,13 +646,12 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op) /* request updates to be done... */ ED_region_tag_redraw(vzd->ar); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); - WM_event_add_mousemove(C); } /* --------------- Individual Operators ------------------- */ /* cleanup temp customdata */ -static void view_zoomstep_exit(bContext *C, wmOperator *op) +static void view_zoomstep_exit(wmOperator *op) { if (op->customdata) { MEM_freeN(op->customdata); @@ -656,7 +673,7 @@ static int view_zoomin_exec(bContext *C, wmOperator *op) /* apply movement, then we're done */ view_zoomstep_apply(C, op); - view_zoomstep_exit(C, op); + view_zoomstep_exit(op); return OPERATOR_FINISHED; } @@ -691,7 +708,7 @@ void VIEW2D_OT_zoom_in(wmOperatorType *ot) /* api callbacks */ ot->invoke= view_zoomin_invoke; - ot->exec= view_zoomin_exec; +// ot->exec= view_zoomin_exec; // XXX, needs view_zoomdrag_init called first. ot->poll= view_zoom_poll; /* rna - must keep these in sync with the other operators */ @@ -713,7 +730,7 @@ static int view_zoomout_exec(bContext *C, wmOperator *op) /* apply movement, then we're done */ view_zoomstep_apply(C, op); - view_zoomstep_exit(C, op); + view_zoomstep_exit(op); return OPERATOR_FINISHED; } @@ -748,7 +765,7 @@ void VIEW2D_OT_zoom_out(wmOperatorType *ot) /* api callbacks */ ot->invoke= view_zoomout_invoke; - ot->exec= view_zoomout_exec; +// ot->exec= view_zoomout_exec; // XXX, needs view_zoomdrag_init called first. ot->poll= view_zoom_poll; /* rna - must keep these in sync with the other operators */ @@ -775,7 +792,18 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op) /* get amount to move view by */ dx= RNA_float_get(op->ptr, "deltax"); dy= RNA_float_get(op->ptr, "deltay"); - + + /* continous zoom shouldn't move that fast... */ + if (U.viewzoom == USER_ZOOM_CONT) { // XXX store this setting as RNA prop? + double time= PIL_check_seconds_timer(); + float time_step= (float)(time - vzd->timer_lastdraw); + + dx *= time_step * 0.5f; + dy *= time_step * 0.5f; + + vzd->timer_lastdraw= time; + } + /* only move view on an axis if change is allowed */ if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0) { if (v2d->keepofs & V2D_LOCKOFS_X) { @@ -822,13 +850,17 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op) /* request updates to be done... */ ED_region_tag_redraw(vzd->ar); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); - WM_event_add_mousemove(C); } /* cleanup temp customdata */ static void view_zoomdrag_exit(bContext *C, wmOperator *op) { if (op->customdata) { + v2dViewZoomData *vzd= op->customdata; + + if(vzd->timer) + WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), vzd->timer); + MEM_freeN(op->customdata); op->customdata= NULL; } @@ -905,6 +937,12 @@ static int view_zoomdrag_invoke(bContext *C, wmOperator *op, wmEvent *event) /* add temp handler */ WM_event_add_modal_handler(C, op); + if (U.viewzoom == USER_ZOOM_CONT) { + /* needs a timer to continue redrawing */ + vzd->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f); + vzd->timer_lastdraw= PIL_check_seconds_timer(); + } + return OPERATOR_RUNNING_MODAL; } @@ -915,85 +953,88 @@ static int view_zoomdrag_modal(bContext *C, wmOperator *op, wmEvent *event) View2D *v2d= vzd->v2d; /* execute the events */ - switch (event->type) { - case MOUSEMOVE: - { - float dx, dy; + if (event->type == TIMER && event->customdata == vzd->timer) { + view_zoomdrag_apply(C, op); + } + else if(event->type == MOUSEMOVE) { + float dx, dy; + + /* calculate new delta transform, based on zooming mode */ + if (U.viewzoom == USER_ZOOM_SCALE) { + /* 'scale' zooming */ + float dist; - /* calculate new delta transform, based on zooming mode */ - if (U.viewzoom == USER_ZOOM_SCALE) { - /* 'scale' zooming */ - float dist; - - /* x-axis transform */ - dist = (v2d->mask.xmax - v2d->mask.xmin) / 2.0f; - dx= 1.0f - ((float)fabs(vzd->lastx - dist) + 2.0f) / ((float)fabs(event->x - dist) + 2.0f); - dx*= 0.5f * (v2d->cur.xmax - v2d->cur.xmin); + /* x-axis transform */ + dist = (v2d->mask.xmax - v2d->mask.xmin) / 2.0f; + dx= 1.0f - ((float)fabs(vzd->lastx - dist) + 2.0f) / ((float)fabs(event->x - dist) + 2.0f); + dx*= 0.5f * (v2d->cur.xmax - v2d->cur.xmin); + + /* y-axis transform */ + dist = (v2d->mask.ymax - v2d->mask.ymin) / 2.0f; + dy= 1.0f - ((float)fabs(vzd->lasty - dist) + 2.0f) / ((float)fabs(event->y - dist) + 2.0f); + dy*= 0.5f * (v2d->cur.ymax - v2d->cur.ymin); + } + else { + /* 'continuous' or 'dolly' */ + float fac; + + /* x-axis transform */ + fac= 0.01f * (event->x - vzd->lastx); + dx= fac * (v2d->cur.xmax - v2d->cur.xmin); + + /* y-axis transform */ + fac= 0.01f * (event->y - vzd->lasty); + dy= fac * (v2d->cur.ymax - v2d->cur.ymin); +#if 0 + /* continous zoom shouldn't move that fast... */ + if (U.viewzoom == USER_ZOOM_CONT) { // XXX store this setting as RNA prop? + double time= PIL_check_seconds_timer(); + float time_step= (float)(time - vzd->timer_lastdraw); + + dx /= (0.1f / time_step); + dy /= (0.1f / time_step); - /* y-axis transform */ - dist = (v2d->mask.ymax - v2d->mask.ymin) / 2.0f; - dy= 1.0f - ((float)fabs(vzd->lasty - dist) + 2.0f) / ((float)fabs(event->y - dist) + 2.0f); - dy*= 0.5f * (v2d->cur.ymax - v2d->cur.ymin); + vzd->timer_lastdraw= time; } - else { - /* 'continuous' or 'dolly' */ - float fac; - - /* x-axis transform */ - fac= 0.01f * (event->x - vzd->lastx); - dx= fac * (v2d->cur.xmax - v2d->cur.xmin); - - /* y-axis transform */ - fac= 0.01f * (event->y - vzd->lasty); - dy= fac * (v2d->cur.ymax - v2d->cur.ymin); +#endif + } + + /* set transform amount, and add current deltas to stored total delta (for redo) */ + RNA_float_set(op->ptr, "deltax", dx); + RNA_float_set(op->ptr, "deltay", dy); + vzd->dx += dx; + vzd->dy += dy; + + /* store mouse coordinates for next time, if not doing continuous zoom + * - continuous zoom only depends on distance of mouse to starting point to determine rate of change + */ + if (U.viewzoom != USER_ZOOM_CONT) { // XXX store this setting as RNA prop? + vzd->lastx= event->x; + vzd->lasty= event->y; + } + + /* apply zooming */ + view_zoomdrag_apply(C, op); + } + else if (ELEM3(event->type, LEFTMOUSE, MIDDLEMOUSE, RIGHTMOUSE)) { /* XXX needs modal keymap */ + if (event->val==KM_RELEASE) { + /* for redo, store the overall deltas - need to respect zoom-locks here... */ + if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0) + RNA_float_set(op->ptr, "deltax", vzd->dx); + else + RNA_float_set(op->ptr, "deltax", 0); - /* continous zoom shouldn't move that fast... */ - if (U.viewzoom == USER_ZOOM_CONT) { // XXX store this setting as RNA prop? - dx /= 20.0f; - dy /= 20.0f; - } - } - - /* set transform amount, and add current deltas to stored total delta (for redo) */ - RNA_float_set(op->ptr, "deltax", dx); - RNA_float_set(op->ptr, "deltay", dy); - vzd->dx += dx; - vzd->dy += dy; + if ((v2d->keepzoom & V2D_LOCKZOOM_Y)==0) + RNA_float_set(op->ptr, "deltay", vzd->dy); + else + RNA_float_set(op->ptr, "deltay", 0); - /* store mouse coordinates for next time, if not doing continuous zoom - * - continuous zoom only depends on distance of mouse to starting point to determine rate of change - */ - if (U.viewzoom != USER_ZOOM_CONT) { // XXX store this setting as RNA prop? - vzd->lastx= event->x; - vzd->lasty= event->y; - } + /* free customdata */ + view_zoomdrag_exit(C, op); + WM_cursor_restore(CTX_wm_window(C)); - /* apply zooming */ - view_zoomdrag_apply(C, op); + return OPERATOR_FINISHED; } - break; - - case LEFTMOUSE: - case MIDDLEMOUSE: - if (event->val==KM_RELEASE) { - /* for redo, store the overall deltas - need to respect zoom-locks here... */ - if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0) - RNA_float_set(op->ptr, "deltax", vzd->dx); - else - RNA_float_set(op->ptr, "deltax", 0); - - if ((v2d->keepzoom & V2D_LOCKZOOM_Y)==0) - RNA_float_set(op->ptr, "deltay", vzd->dy); - else - RNA_float_set(op->ptr, "deltay", 0); - - /* free customdata */ - view_zoomdrag_exit(C, op); - WM_cursor_restore(CTX_wm_window(C)); - - return OPERATOR_FINISHED; - } - break; } return OPERATOR_RUNNING_MODAL; @@ -1095,7 +1136,6 @@ static int view_borderzoom_exec(bContext *C, wmOperator *op) /* request updates to be done... */ ED_region_tag_redraw(ar); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); - WM_event_add_mousemove(C); return OPERATOR_FINISHED; } @@ -1140,7 +1180,7 @@ typedef struct v2dScrollerMove { ARegion *ar; /* region that the scroller is in */ short scroller; /* scroller that mouse is in ('h' or 'v') */ - short zone; /* -1 is min zoomer, 0 is bar, 1 is max zoomer */ // XXX find some way to provide visual feedback of this (active colour?) + short zone; /* -1 is min zoomer, 0 is bar, 1 is max zoomer */ // XXX find some way to provide visual feedback of this (active color?) float fac; /* view adjustment factor, based on size of region */ float delta; /* amount moved by mouse on axis of interest */ @@ -1355,7 +1395,6 @@ static void scroller_activate_apply(bContext *C, wmOperator *op) /* request updates to be done... */ ED_region_tag_redraw(vsm->ar); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); - WM_event_add_mousemove(C); } /* handle user input for scrollers - calculations of mouse-movement need to be done here, not in the apply callback! */ @@ -1477,7 +1516,7 @@ static int scroller_activate_invoke(bContext *C, wmOperator *op, wmEvent *event) scroller_activate_exit(C, op); /* can't catch this event for ourselves, so let it go to someone else? */ - // FIXME: still this doesn't fall through to the item_activate callback for the outliner... + /* XXX note: if handlers use mask rect to clip input, input will fail for this case */ return OPERATOR_PASS_THROUGH; } @@ -1517,7 +1556,7 @@ void VIEW2D_OT_scroller_activate(wmOperatorType *ot) /* ********************************************************* */ /* RESET */ -static int reset_exec(bContext *C, wmOperator *op) +static int reset_exec(bContext *C, wmOperator *UNUSED(op)) { uiStyle *style= U.uistyles.first; ARegion *ar= CTX_wm_region(C); @@ -1560,7 +1599,6 @@ static int reset_exec(bContext *C, wmOperator *op) /* request updates to be done... */ ED_region_tag_redraw(ar); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); - WM_event_add_mousemove(C); return OPERATOR_FINISHED; } @@ -1658,8 +1696,10 @@ void UI_view2d_keymap(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MOUSEPAN, 0, 0, 0); WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", WHEELDOWNMOUSE, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", WHEELUPMOUSE, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", PAGEDOWNKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", PAGEUPKEY, KM_PRESS, 0, 0); + + RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", PAGEDOWNKEY, KM_PRESS, 0, 0)->ptr, "page", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "page", 1); + WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MOUSEZOOM, 0, 0, 0); WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_out", PADMINUS, KM_PRESS, 0, 0); |