Fix #110833: Trackpad: Text Editor scrolling improvement #110927

Open
YimingWu wants to merge 1 commits from ChengduLittleA/blender:fix-110833 into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
1 changed files with 35 additions and 17 deletions

View File

@ -2658,9 +2658,7 @@ static void text_scroll_apply(bContext *C, wmOperator *op, const wmEvent *event)
tsc->is_first = false;
}
if (event->type != MOUSEPAN) {
sub_v2_v2v2_int(tsc->mval_delta, mval, tsc->mval_prev);
}
sub_v2_v2v2_int(tsc->mval_delta, mval, tsc->mval_prev);
/* accumulate scroll, in float values for events that give less than one
* line offset but taken together should still scroll */
@ -2799,6 +2797,40 @@ static int text_scroll_invoke(bContext *C, wmOperator *op, const wmEvent *event)
return text_scroll_exec(C, op);
}
if (event->type == MOUSEPAN) {
int mval_delta[2];
sub_v2_v2v2_int(mval_delta, event->xy, event->prev_xy);
const int i = abs(mval_delta[0]) > abs(mval_delta[1]) ? 0 : 1;
const int size_px[2] = {st->runtime.cwidth_px, TXT_LINE_HEIGHT(st)};
static int ofs_delta_px[2] = {0, 0};
int ofs_delta[2] = {0, 0};
ofs_delta_px[i] += mval_delta[i];
ofs_delta[i] = ofs_delta_px[i] / size_px[i];
ofs_delta_px[i] -= ofs_delta[i] * size_px[i];
if (ofs_delta[i] == 0) {
return OPERATOR_CANCELLED;
}
if (i) {
st->top += ofs_delta[1];
txt_screen_clamp(st, region);
}
else {
st->left -= ofs_delta[0];
if (st->left < 0) {
st->left = 0;
}
}
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
}
tsc = static_cast<TextScroll *>(MEM_callocN(sizeof(TextScroll), "TextScroll"));
tsc->is_first = true;
tsc->zone = SCROLLHANDLE_BAR;
@ -2809,20 +2841,6 @@ static int text_scroll_invoke(bContext *C, wmOperator *op, const wmEvent *event)
st->flags |= ST_SCROLL_SELECT;
if (event->type == MOUSEPAN) {
text_update_character_width(st);
copy_v2_v2_int(tsc->mval_prev, event->xy);
/* Sensitivity of scroll set to 4pix per line/char */
tsc->mval_delta[0] = (event->xy[0] - event->prev_xy[0]) * st->runtime.cwidth_px / 4;
tsc->mval_delta[1] = (event->xy[1] - event->prev_xy[1]) * st->runtime.lheight_px / 4;
tsc->is_first = false;
tsc->is_scrollbar = false;
text_scroll_apply(C, op, event);
scroll_exit(C, op);
return OPERATOR_FINISHED;
}
WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;