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:
-rw-r--r--source/blender/blenloader/intern/readfile.c4
-rw-r--r--source/blender/editors/space_text/text_draw.c3
-rw-r--r--source/blender/editors/space_text/text_ops.c48
-rw-r--r--source/blender/makesdna/DNA_space_types.h2
4 files changed, 39 insertions, 18 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index e51b3a6f27e..37d2ec787ed 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6414,7 +6414,9 @@ static bool direct_link_screen(FileData *fd, bScreen *sc)
else if (sl->spacetype == SPACE_TEXT) {
SpaceText *st= (SpaceText *)sl;
- st->drawcache= NULL;
+ st->drawcache = NULL;
+ st->scroll_accum[0] = 0.0f;
+ st->scroll_accum[1] = 0.0f;
}
else if (sl->spacetype == SPACE_TIME) {
SpaceTime *stime = (SpaceTime *)sl;
diff --git a/source/blender/editors/space_text/text_draw.c b/source/blender/editors/space_text/text_draw.c
index e92cab72042..4504963a572 100644
--- a/source/blender/editors/space_text/text_draw.c
+++ b/source/blender/editors/space_text/text_draw.c
@@ -1495,6 +1495,9 @@ void text_scroll_to_cursor(SpaceText *st, ScrArea *sa)
if (st->top < 0) st->top = 0;
if (st->left < 0) st->left = 0;
+
+ st->scroll_accum[0] = 0.0f;
+ st->scroll_accum[1] = 0.0f;
}
void text_update_cursor_moved(bContext *C)
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index dd5e282587d..2849db7330a 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -38,6 +38,7 @@
#include "DNA_text_types.h"
#include "BLI_blenlib.h"
+#include "BLI_math.h"
#include "BLF_translation.h"
@@ -180,7 +181,10 @@ static int text_new_exec(bContext *C, wmOperator *UNUSED(op))
}
else if (st) {
st->text = text;
+ st->left = 0;
st->top = 0;
+ st->scroll_accum[0] = 0.0f;
+ st->scroll_accum[1] = 0.0f;
text_drawcache_tag_update(st, 1);
}
@@ -251,7 +255,10 @@ static int text_open_exec(bContext *C, wmOperator *op)
}
else if (st) {
st->text = text;
+ st->left = 0;
st->top = 0;
+ st->scroll_accum[0] = 0.0f;
+ st->scroll_accum[1] = 0.0f;
}
text_drawcache_tag_update(st, 1);
@@ -2115,8 +2122,8 @@ enum {
};
typedef struct TextScroll {
- short old[2];
- short delta[2];
+ int old[2];
+ int delta[2];
int first;
int scrollbar;
@@ -2153,39 +2160,48 @@ static void text_scroll_apply(bContext *C, wmOperator *op, const wmEvent *event)
ARegion *ar = CTX_wm_region(C);
TextScroll *tsc = op->customdata;
int mval[2] = {event->x, event->y};
- short txtdelta[2] = {0, 0};
+ int scroll_steps[2] = {0, 0};
text_update_character_width(st);
+ /* compute mouse move distance */
if (tsc->first) {
tsc->old[0] = mval[0];
tsc->old[1] = mval[1];
tsc->first = 0;
}
- tsc->delta[0] += mval[0] - tsc->old[0];
- tsc->delta[1] += mval[1] - tsc->old[1];
+ if (event->type != MOUSEPAN) {
+ tsc->delta[0] = mval[0] - tsc->old[0];
+ tsc->delta[1] = mval[1] - tsc->old[1];
+ }
+ /* accumulate scroll, in float values for events that give less than one
+ * line offset but taken together should still scroll */
if (!tsc->scrollbar) {
- txtdelta[0] = -tsc->delta[0] / st->cwidth;
- txtdelta[1] = tsc->delta[1] / (st->lheight_dpi + TXT_LINE_SPACING);
-
- tsc->delta[0] %= st->cwidth;
- tsc->delta[1] %= (st->lheight_dpi + TXT_LINE_SPACING);
+ st->scroll_accum[0] += -tsc->delta[0] / (float)st->cwidth;
+ st->scroll_accum[1] += tsc->delta[1] / (float)(st->lheight_dpi + TXT_LINE_SPACING);
}
else {
- txtdelta[1] = -tsc->delta[1] * st->pix_per_line;
- tsc->delta[1] += txtdelta[1] / st->pix_per_line;
+ st->scroll_accum[1] += -tsc->delta[1] * st->pix_per_line;
}
- if (txtdelta[0] || txtdelta[1]) {
- txt_screen_skip(st, ar, txtdelta[1]);
+ /* round to number of lines to scroll */
+ scroll_steps[0] = (int)st->scroll_accum[0];
+ scroll_steps[1] = (int)st->scroll_accum[1];
+
+ st->scroll_accum[0] -= scroll_steps[0];
+ st->scroll_accum[1] -= scroll_steps[1];
+
+ /* perform vertical and/or horizontal scroll */
+ if (scroll_steps[0] || scroll_steps[1]) {
+ txt_screen_skip(st, ar, scroll_steps[1]);
if (st->wordwrap) {
st->left = 0;
}
else {
- st->left += txtdelta[0];
+ st->left += scroll_steps[0];
if (st->left < 0) st->left = 0;
}
@@ -2352,8 +2368,6 @@ static int text_scroll_bar_invoke(bContext *C, wmOperator *op, const wmEvent *ev
tsc->old[0] = ar->winrct.xmin + BLI_rcti_cent_x(&st->txtbar);
tsc->old[1] = ar->winrct.ymin + BLI_rcti_cent_y(&st->txtbar);
- tsc->delta[0] = 0;
- tsc->delta[1] = 0;
tsc->first = 0;
tsc->zone = SCROLLHANDLE_BAR;
text_scroll_apply(C, op, event);
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 4fe0920b7c6..9038885f6af 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -849,6 +849,8 @@ typedef struct SpaceText {
char pad[4];
void *drawcache; /* cache for faster drawing */
+
+ float scroll_accum[2]; /* runtime, for scroll increments smaller than a line */
} SpaceText;