forked from bartvdbraak/blender
Todo item: text editor does not honour continuous grab(see
Added OPTYPE_GRAB_POINTER flag to scrolling operator, changed a bit logic of delta calculation and removed unused members from TextScroll structure. Got issue with very-fast mouse moving (when mouse pointer could go out of window, but it's general issue for all grab operator). Was unable to check MOUSEPAN event (two-finger scroll). Please poke me if there are any issues with this event.
This commit is contained in:
parent
076171c5fa
commit
8e83dd0933
@ -2011,12 +2011,9 @@ enum {
|
|||||||
|
|
||||||
typedef struct TextScroll {
|
typedef struct TextScroll {
|
||||||
short old[2];
|
short old[2];
|
||||||
short hold[2];
|
|
||||||
short delta[2];
|
short delta[2];
|
||||||
|
|
||||||
int first;
|
int first;
|
||||||
int characters;
|
|
||||||
int lines;
|
|
||||||
int scrollbar;
|
int scrollbar;
|
||||||
|
|
||||||
int zone;
|
int zone;
|
||||||
@ -2044,40 +2041,42 @@ static void scroll_apply(bContext *C, wmOperator *op, wmEvent *event)
|
|||||||
SpaceText *st= CTX_wm_space_text(C);
|
SpaceText *st= CTX_wm_space_text(C);
|
||||||
ARegion *ar= CTX_wm_region(C);
|
ARegion *ar= CTX_wm_region(C);
|
||||||
TextScroll *tsc= op->customdata;
|
TextScroll *tsc= op->customdata;
|
||||||
short *mval= event->mval;
|
short mval[2]= {event->x, event->y};
|
||||||
|
short txtdelta[2] = {0, 0};
|
||||||
|
|
||||||
text_update_character_width(st);
|
text_update_character_width(st);
|
||||||
|
|
||||||
if(tsc->first) {
|
if(tsc->first) {
|
||||||
tsc->old[0]= mval[0];
|
tsc->old[0]= mval[0];
|
||||||
tsc->old[1]= mval[1];
|
tsc->old[1]= mval[1];
|
||||||
tsc->hold[0]= mval[0];
|
|
||||||
tsc->hold[1]= mval[1];
|
|
||||||
tsc->first= 0;
|
tsc->first= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!tsc->scrollbar) {
|
tsc->delta[0]+= mval[0] - tsc->old[0];
|
||||||
tsc->delta[0]= (tsc->hold[0]-mval[0])/st->cwidth;
|
tsc->delta[1]+= mval[1] - tsc->old[1];
|
||||||
tsc->delta[1]= (mval[1]-tsc->hold[1])/st->lheight;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
tsc->delta[1]= (tsc->hold[1]-mval[1])*st->pix_per_line;
|
|
||||||
|
|
||||||
if(tsc->delta[0] || tsc->delta[1]) {
|
|
||||||
screen_skip(st, ar, tsc->delta[1]);
|
|
||||||
|
|
||||||
tsc->lines += tsc->delta[1];
|
if(!tsc->scrollbar) {
|
||||||
|
txtdelta[0]= tsc->delta[0]/st->cwidth;
|
||||||
|
txtdelta[1]= tsc->delta[1]/st->lheight;
|
||||||
|
|
||||||
|
tsc->delta[0]%= st->cwidth;
|
||||||
|
tsc->delta[1]%= st->lheight;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
txtdelta[1]= -tsc->delta[1]*st->pix_per_line;
|
||||||
|
tsc->delta[1]+= txtdelta[1]/st->pix_per_line;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(txtdelta[0] || txtdelta[1]) {
|
||||||
|
screen_skip(st, ar, txtdelta[1]);
|
||||||
|
|
||||||
if(st->wordwrap) {
|
if(st->wordwrap) {
|
||||||
st->left= 0;
|
st->left= 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
st->left+= tsc->delta[0];
|
st->left+= txtdelta[0];
|
||||||
if(st->left<0) st->left= 0;
|
if(st->left<0) st->left= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
tsc->hold[0]= mval[0];
|
|
||||||
tsc->hold[1]= mval[1];
|
|
||||||
|
|
||||||
ED_area_tag_redraw(CTX_wm_area(C));
|
ED_area_tag_redraw(CTX_wm_area(C));
|
||||||
}
|
}
|
||||||
@ -2152,11 +2151,11 @@ static int scroll_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|||||||
if (event->type == MOUSEPAN) {
|
if (event->type == MOUSEPAN) {
|
||||||
text_update_character_width(st);
|
text_update_character_width(st);
|
||||||
|
|
||||||
tsc->hold[0] = event->prevx;
|
tsc->old[0] = event->x;
|
||||||
tsc->hold[1] = event->prevy;
|
tsc->old[1] = event->x;
|
||||||
/* Sensitivity of scroll set to 4pix per line/char */
|
/* Sensitivity of scroll set to 4pix per line/char */
|
||||||
event->mval[0] = event->prevx + (event->x - event->prevx)*st->cwidth/4;
|
tsc->delta[0] = (event->x - event->prevx)*st->cwidth/4;
|
||||||
event->mval[1] = event->prevy + (event->y - event->prevy)*st->lheight/4;
|
tsc->delta[1] = (event->y - event->prevy)*st->lheight/4;
|
||||||
tsc->first = 0;
|
tsc->first = 0;
|
||||||
tsc->scrollbar = 0;
|
tsc->scrollbar = 0;
|
||||||
scroll_apply(C, op, event);
|
scroll_apply(C, op, event);
|
||||||
@ -2187,7 +2186,7 @@ void TEXT_OT_scroll(wmOperatorType *ot)
|
|||||||
ot->poll= text_space_edit_poll;
|
ot->poll= text_space_edit_poll;
|
||||||
|
|
||||||
/* flags */
|
/* flags */
|
||||||
ot->flag= OPTYPE_BLOCKING;
|
ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER;
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
RNA_def_int(ot->srna, "lines", 1, INT_MIN, INT_MAX, "Lines", "Number of lines to scroll.", -100, 100);
|
RNA_def_int(ot->srna, "lines", 1, INT_MIN, INT_MAX, "Lines", "Number of lines to scroll.", -100, 100);
|
||||||
|
Loading…
Reference in New Issue
Block a user