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:
authorSebastian Parborg <darkdefende@gmail.com>2019-07-31 19:16:37 +0300
committerSebastian Parborg <darkdefende@gmail.com>2019-07-31 19:16:37 +0300
commitbcda8cc89b88c999ff64edcc19973d6289bcbf2a (patch)
treed8dc110ba901bdbed8289f09682c32ce85e6888a /source/blender/editors/interface/view2d_ops.c
parent0516d49d0ca59044c36986c360eaa485020da044 (diff)
Fix T65837: "Zoom Axis" is not working on the node editor
We would not take into account the user "Zoom Axis" setting in certain 2D space viewports. In addition to this, the "Scale Zoom" didn't work consistently in these spaces either. Reviewed By: Brecht Differential Revision: http://developer.blender.org/D5132
Diffstat (limited to 'source/blender/editors/interface/view2d_ops.c')
-rw-r--r--source/blender/editors/interface/view2d_ops.c55
1 files changed, 42 insertions, 13 deletions
diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c
index 7d9b722fcc0..b57d100127e 100644
--- a/source/blender/editors/interface/view2d_ops.c
+++ b/source/blender/editors/interface/view2d_ops.c
@@ -31,6 +31,7 @@
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
#include "BLI_math_base.h"
+#include "BLI_math_vector.h"
#include "BKE_context.h"
@@ -1146,33 +1147,49 @@ static int view_zoomdrag_modal(bContext *C, wmOperator *op, const wmEvent *event
}
else if (event->type == MOUSEMOVE) {
float dx, dy;
+ 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);
+ }
/* calculate new delta transform, based on zooming mode */
if (U.viewzoom == USER_ZOOM_SCALE) {
/* 'scale' zooming */
float dist;
+ float len_old[2];
+ float len_new[2];
/* x-axis transform */
dist = BLI_rcti_size_x(&v2d->mask) / 2.0f;
- dx = 1.0f - (fabsf(vzd->lastx - vzd->ar->winrct.xmin - dist) + 2.0f) /
- (fabsf(event->mval[0] - dist) + 2.0f);
- dx *= 0.5f * BLI_rctf_size_x(&v2d->cur);
+ len_old[0] = fabsf(vzd->lastx - vzd->ar->winrct.xmin - dist);
+ len_new[0] = fabsf(event->x - vzd->ar->winrct.xmin - dist);
+
+ len_old[0] *= zoomfac * BLI_rctf_size_x(&v2d->cur);
+ len_new[0] *= zoomfac * BLI_rctf_size_x(&v2d->cur);
/* y-axis transform */
dist = BLI_rcti_size_y(&v2d->mask) / 2.0f;
- dy = 1.0f - (fabsf(vzd->lasty - vzd->ar->winrct.ymin - dist) + 2.0f) /
- (fabsf(event->mval[1] - dist) + 2.0f);
- dy *= 0.5f * BLI_rctf_size_y(&v2d->cur);
+ len_old[1] = fabsf(vzd->lasty - vzd->ar->winrct.ymin - dist);
+ len_new[1] = fabsf(event->y - vzd->ar->winrct.ymin - dist);
+
+ len_old[1] *= zoomfac * BLI_rctf_size_y(&v2d->cur);
+ len_new[1] *= zoomfac * BLI_rctf_size_y(&v2d->cur);
+
+ /* Calculate distance */
+ if (v2d->keepzoom & V2D_KEEPASPECT) {
+ dist = len_v2(len_new) - len_v2(len_old);
+ dx = dy = dist;
+ }
+ else {
+ dx = len_new[0] - len_old[0];
+ dy = len_new[1] - len_old[1];
+ }
}
else {
/* 'continuous' or 'dolly' */
- float fac, 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);
- }
-
+ float fac;
/* x-axis transform */
fac = zoomfac * (event->x - vzd->lastx);
dx = fac * BLI_rctf_size_x(&v2d->cur);
@@ -1180,6 +1197,18 @@ static int view_zoomdrag_modal(bContext *C, wmOperator *op, const wmEvent *event
/* y-axis transform */
fac = zoomfac * (event->y - vzd->lasty);
dy = fac * BLI_rctf_size_y(&v2d->cur);
+
+ /* 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;
+ }
+ else {
+ dx = 0;
+ }
+ }
}
/* support zoom to always zoom entirely - the v2d code uses portrait or