Fix #89906: Consistent track pad zoom directions #111141

Open
YimingWu wants to merge 3 commits from ChengduLittleA/blender:fix-89906 into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
10 changed files with 52 additions and 34 deletions

View File

@ -6286,7 +6286,7 @@ static int ui_do_but_COLOR(bContext *C, uiBut *but, uiHandleButtonData *data, co
hsv[2] = clamp_f(hsv[2] + 0.05f, 0.0f, 1.0f);
}
else {
const float fac = 0.005 * (event->xy[1] - event->prev_xy[1]);
const float fac = 0.005 * WM_event_absolute_delta_y(event) / UI_SCALE_FAC;
hsv[2] = clamp_f(hsv[2] + fac, 0.0f, 1.0f);
}

View File

@ -696,7 +696,7 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, const wmEvent *event)
}
}
else if (etype == MOUSEPAN) {
float delta = 0.02f * (event->xy[1] - event->prev_xy[1]);
float delta = 0.02f * WM_event_absolute_delta_y(event) / UI_SCALE_FAC;
if (opdata->segments >= 1 && opdata->segments + delta < 1) {
opdata->segments = 1;
}

View File

@ -595,13 +595,13 @@ static int loopcut_modal(bContext *C, wmOperator *op, const wmEvent *event)
break;
case MOUSEPAN:
if ((event->modifier & KM_ALT) == 0) {
cuts += 0.02f * (event->xy[1] - event->prev_xy[1]);
cuts += 0.02f * WM_event_absolute_delta_y(event) / UI_SCALE_FAC;
if (cuts < 1 && lcd->cuts >= 1) {
cuts = 1;
}
}
else {
smoothness += 0.002f * (event->xy[1] - event->prev_xy[1]);
smoothness += 0.002f * WM_event_absolute_delta_y(event) / UI_SCALE_FAC;
}
handled = true;
break;

View File

@ -605,10 +605,20 @@ static int view_zoom_invoke(bContext *C, wmOperator *op, const wmEvent *event)
if (ELEM(event->type, MOUSEZOOM, MOUSEPAN)) {
float delta, factor;
delta = event->prev_xy[0] - event->xy[0] + event->prev_xy[1] - event->xy[1];
if (event->type == MOUSEPAN) {
if (U.uiflag & USER_ZOOM_HORIZ) {
delta = WM_event_absolute_delta_x(event);
}
else {
delta = WM_event_absolute_delta_y(event);
}
if (U.uiflag & USER_ZOOM_INVERT) {
delta *= -1;
if (U.uiflag & USER_ZOOM_INVERT) {
delta *= -1.0f;
}
}
else { /* MOUSEZOOM */
delta = event->prev_xy[0] - event->xy[0];
}
factor = 1.0f + delta / 300.0f;

View File

@ -597,10 +597,20 @@ static int image_view_zoom_invoke(bContext *C, wmOperator *op, const wmEvent *ev
UI_view2d_region_to_view(
&region->v2d, event->mval[0], event->mval[1], &location[0], &location[1]);
delta = event->prev_xy[0] - event->xy[0] + event->prev_xy[1] - event->xy[1];
if (event->type == MOUSEPAN) {
if (U.uiflag & USER_ZOOM_HORIZ) {
delta = WM_event_absolute_delta_x(event);
}
else {
delta = WM_event_absolute_delta_y(event);
}
if (U.uiflag & USER_ZOOM_INVERT) {
delta *= -1;
if (U.uiflag & USER_ZOOM_INVERT) {
delta *= -1.0f;
}
}
else { /* MOUSEZOOM */
delta = event->prev_xy[0] - event->xy[0];
}
factor = 1.0f + delta / 300.0f;

View File

@ -533,7 +533,7 @@ static void flyEvent(FlyInfo *fly, const wmEvent *event)
/* Speed adjusting with mouse-pan (track-pad). */
case FLY_MODAL_SPEED: {
float fac = 0.02f * (event->prev_xy[1] - event->xy[1]);
float fac = 0.02f * WM_event_absolute_delta_y(event) / UI_SCALE_FAC;
/* allowing to brake immediate */
if (fac > 0.0f && fly->speed < 0.0f) {

View File

@ -281,18 +281,17 @@ static int viewdolly_invoke(bContext *C, wmOperator *op, const wmEvent *event)
normalize_v3(vod->init.mousevec);
}
if (event->type == MOUSEZOOM) {
/* Bypass Zoom invert flag for track pads (pass false always) */
if (U.uiflag & USER_ZOOM_HORIZ) {
vod->init.event_xy[0] = vod->prev.event_xy[0] = event->xy[0];
if (ELEM(event->type, MOUSEZOOM, MOUSEPAN)) {
int m_xy[2];
if (event->type == MOUSEPAN) {
m_xy[0] = event->xy[0] + WM_event_absolute_delta_x(event);
m_xy[1] = event->xy[1] + WM_event_absolute_delta_y(event);
}
else {
/* Set y move = x move as MOUSEZOOM uses only x axis to pass magnification value */
vod->init.event_xy[1] = vod->prev.event_xy[1] = vod->init.event_xy[1] + event->xy[0] -
event->prev_xy[0];
else { /* MOUSEZOOM */
m_xy[0] = event->prev_xy[0];
m_xy[1] = event->xy[1] - (event->xy[0] - event->prev_xy[0]);
}
viewdolly_apply(vod, event->prev_xy, (U.uiflag & USER_ZOOM_INVERT) == 0);
viewdolly_apply(vod, m_xy, (U.uiflag & USER_ZOOM_INVERT) == 0);
viewops_data_free(C, static_cast<ViewOpsData *>(op->customdata));
op->customdata = nullptr;

View File

@ -347,13 +347,11 @@ static int viewrotate_invoke_impl(bContext * /*C*/,
if (event_code == VIEW_CONFIRM) {
/* MOUSEROTATE performs orbital rotation, so y axis delta is set to 0 */
const bool is_inverted = (event->flag & WM_EVENT_SCROLL_INVERT) &&
(event->type != MOUSEROTATE);
int m_xy[2];
if (is_inverted) {
m_xy[0] = 2 * event->xy[0] - event->prev_xy[0];
m_xy[1] = 2 * event->xy[1] - event->prev_xy[1];
if (event->type == MOUSEPAN) {
m_xy[0] = event->xy[0] + WM_event_absolute_delta_x(event);
m_xy[1] = event->xy[1] + WM_event_absolute_delta_y(event);
}
else {
copy_v2_v2_int(m_xy, event->prev_xy);

View File

@ -498,15 +498,16 @@ static int viewzoom_invoke_impl(bContext *C,
else {
eV3D_OpEvent event_code = ELEM(event->type, MOUSEZOOM, MOUSEPAN) ? VIEW_CONFIRM : VIEW_PASS;
if (event_code == VIEW_CONFIRM) {
if (U.uiflag & USER_ZOOM_HORIZ) {
vod->init.event_xy[0] = vod->prev.event_xy[0] = xy[0];
int m_xy[2];
if (event->type == MOUSEPAN) {
m_xy[0] = event->xy[0] + WM_event_absolute_delta_x(event);
m_xy[1] = event->xy[1] + WM_event_absolute_delta_y(event);
}
else {
/* Set y move = x move as MOUSEZOOM uses only x axis to pass magnification value */
vod->init.event_xy[1] = vod->prev.event_xy[1] = vod->init.event_xy[1] + xy[0] -
event->prev_xy[0];
else { /* MOUSEZOOM */
m_xy[0] = event->prev_xy[0];
m_xy[1] = event->xy[1] - (event->xy[0] - event->prev_xy[0]);
}
viewzoom_apply(vod, event->prev_xy, USER_ZOOM_DOLLY, (U.uiflag & USER_ZOOM_INVERT) != 0);
viewzoom_apply(vod, m_xy, USER_ZOOM_DOLLY, (U.uiflag & USER_ZOOM_INVERT) != 0);
ED_view3d_camera_lock_autokey(vod->v3d, vod->rv3d, C, false, true);
return OPERATOR_FINISHED;

View File

@ -1139,7 +1139,7 @@ int transformEvent(TransInfo *t, const wmEvent *event)
case TFM_MODAL_PROPSIZE:
/* MOUSEPAN usage... */
if (t->flag & T_PROP_EDIT) {
float fac = 1.0f + 0.005f * (event->xy[1] - event->prev_xy[1]);
float fac = 1.0f + 0.005f * WM_event_absolute_delta_y(event) / UI_SCALE_FAC;
t->prop_size *= fac;
if (t->spacetype == SPACE_VIEW3D && t->persp != RV3D_ORTHO) {
t->prop_size = max_ff(min_ff(t->prop_size, ((View3D *)t->view)->clip_end),