diff options
author | Yevgeny Makarov <jenkm> | 2021-01-20 14:11:56 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2021-01-20 14:56:35 +0300 |
commit | a73dfac5195681ad1deec55c317484ad077dafc4 (patch) | |
tree | 6f4f3519c6e67a20541ca12bcab054a27fa0d10c | |
parent | 9425628c84d091591229d54fbb2bc3b36350d94e (diff) |
Fix T73575: Zooming out a lot faster than zooming in
- Zooming out a lot faster than zooming in,
it had the wrong aspect ratio, make all the preparations
with the factors instead of deltas.
- Improved following the `zoom_invert`
(should not apply to `MOUSEZOOM`) and "trackpad natural scroll"
preferences.
- `zoomfac` adjustment, same as in `view_zoomdrag_modal`.
Ref D8686
-rw-r--r-- | source/blender/editors/interface/view2d_ops.c | 104 |
1 files changed, 56 insertions, 48 deletions
diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c index 8ce22387eb2..4e642137d2a 100644 --- a/source/blender/editors/interface/view2d_ops.c +++ b/source/blender/editors/interface/view2d_ops.c @@ -1106,11 +1106,6 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op) float dx = RNA_float_get(op->ptr, "deltax") / U.dpi_fac; float dy = RNA_float_get(op->ptr, "deltay") / U.dpi_fac; - if (U.uiflag & USER_ZOOM_INVERT) { - dx *= -1; - dy *= -1; - } - /* Check if the 'timer' is initialized, as zooming with the trackpad * never uses the "Continuous" zoom method, and the 'timer' is not initialized. */ if ((U.viewzoom == USER_ZOOM_CONT) && vzd->timer) { /* XXX store this setting as RNA prop? */ @@ -1232,38 +1227,53 @@ static int view_zoomdrag_invoke(bContext *C, wmOperator *op, const wmEvent *even vzd->lastx = event->prevx; vzd->lasty = event->prevy; - /* As we have only 1D information (magnify value), feed both axes - * with magnify information that is stored in x axis - */ - float fac = 0.01f * (event->prevx - event->x); - float dx = fac * BLI_rctf_size_x(&v2d->cur) / 10.0f; + float facx, facy; + float zoomfac = 0.01f; + + /* Some view2d's (graph) don't have min/max zoom, or extreme ones. */ + if (v2d->maxzoom > 0.0f) { + zoomfac = clamp_f(0.001f * v2d->maxzoom, 0.001f, 0.01f); + } + if (event->type == MOUSEPAN) { - fac = 0.01f * (event->prevy - event->y); + facx = zoomfac * WM_event_absolute_delta_x(event); + facy = zoomfac * WM_event_absolute_delta_y(event); + + if (U.uiflag & USER_ZOOM_INVERT) { + facx *= -1.0f; + facy *= -1.0f; + } + } + else { /* MOUSEZOOM */ + facx = facy = zoomfac * WM_event_absolute_delta_x(event); } - float dy = fac * BLI_rctf_size_y(&v2d->cur) / 10.0f; /* Only respect user setting zoom axis if the view does not have any zoom restrictions * any will be scaled uniformly. */ if (((v2d->keepzoom & (V2D_LOCKZOOM_X | V2D_LOCKZOOM_Y)) == 0) && (v2d->keepzoom & V2D_KEEPASPECT)) { if (U.uiflag & USER_ZOOM_HORIZ) { - dy = 0; + facy = 0.0f; } else { - dx = 0; + facx = 0.0f; } } /* support trackpad zoom to always zoom entirely - the v2d code uses portrait or * landscape exceptions */ if (v2d->keepzoom & V2D_KEEPASPECT) { - if (fabsf(dx) > fabsf(dy)) { - dy = dx; + if (fabsf(facx) > fabsf(facy)) { + facy = facx; } else { - dx = dy; + facx = facy; } } + + const float dx = facx * BLI_rctf_size_x(&v2d->cur); + const float dy = facy * BLI_rctf_size_y(&v2d->cur); + RNA_float_set(op->ptr, "deltax", dx); RNA_float_set(op->ptr, "deltay", dy); @@ -1332,19 +1342,13 @@ static int view_zoomdrag_modal(bContext *C, wmOperator *op, const wmEvent *event /* x-axis transform */ dist = BLI_rcti_size_x(&v2d->mask) / 2.0f; - len_old[0] = fabsf(vzd->lastx - vzd->region->winrct.xmin - dist); - len_new[0] = fabsf(event->x - vzd->region->winrct.xmin - dist); - - len_old[0] *= zoomfac * BLI_rctf_size_x(&v2d->cur); - len_new[0] *= zoomfac * BLI_rctf_size_x(&v2d->cur); + len_old[0] = zoomfac * fabsf(vzd->lastx - vzd->region->winrct.xmin - dist); + len_new[0] = zoomfac * fabsf(event->x - vzd->region->winrct.xmin - dist); /* y-axis transform */ dist = BLI_rcti_size_y(&v2d->mask) / 2.0f; - len_old[1] = fabsf(vzd->lasty - vzd->region->winrct.ymin - dist); - len_new[1] = fabsf(event->y - vzd->region->winrct.ymin - dist); - - len_old[1] *= zoomfac * BLI_rctf_size_y(&v2d->cur); - len_new[1] *= zoomfac * BLI_rctf_size_y(&v2d->cur); + len_old[1] = zoomfac * fabsf(vzd->lasty - vzd->region->winrct.ymin - dist); + len_new[1] = zoomfac * fabsf(event->y - vzd->region->winrct.ymin - dist); /* Calculate distance */ if (v2d->keepzoom & V2D_KEEPASPECT) { @@ -1355,40 +1359,44 @@ static int view_zoomdrag_modal(bContext *C, wmOperator *op, const wmEvent *event dx = len_new[0] - len_old[0]; dy = len_new[1] - len_old[1]; } - } - else { - /* 'continuous' or 'dolly' */ - float fac; - /* x-axis transform */ - fac = zoomfac * (event->x - vzd->lastx); - dx = fac * BLI_rctf_size_x(&v2d->cur); - /* y-axis transform */ - fac = zoomfac * (event->y - vzd->lasty); - dy = fac * BLI_rctf_size_y(&v2d->cur); + dx *= BLI_rctf_size_x(&v2d->cur); + dy *= BLI_rctf_size_y(&v2d->cur); + } + else { /* USER_ZOOM_CONT or USER_ZOOM_DOLLY */ + float facx = zoomfac * (event->x - vzd->lastx); + float facy = zoomfac * (event->y - vzd->lasty); /* Only respect user setting zoom axis if the view does not have any zoom restrictions * any will be scaled uniformly */ if ((v2d->keepzoom & V2D_LOCKZOOM_X) == 0 && (v2d->keepzoom & V2D_LOCKZOOM_Y) == 0 && (v2d->keepzoom & V2D_KEEPASPECT)) { if (U.uiflag & USER_ZOOM_HORIZ) { - dy = 0; + facy = 0.0f; } else { - dx = 0; + facx = 0.0f; } } - } - /* support zoom to always zoom entirely - the v2d code uses portrait or - * landscape exceptions */ - if (v2d->keepzoom & V2D_KEEPASPECT) { - if (fabsf(dx) > fabsf(dy)) { - dy = dx; - } - else { - dx = dy; + /* support zoom to always zoom entirely - the v2d code uses portrait or + * landscape exceptions */ + if (v2d->keepzoom & V2D_KEEPASPECT) { + if (fabsf(facx) > fabsf(facy)) { + facy = facx; + } + else { + facx = facy; + } } + + dx = facx * BLI_rctf_size_x(&v2d->cur); + dy = facy * BLI_rctf_size_y(&v2d->cur); + } + + if (U.uiflag & USER_ZOOM_INVERT) { + dx *= -1.0f; + dy *= -1.0f; } /* set transform amount, and add current deltas to stored total delta (for redo) */ |