diff options
author | Martin Poirier <theeth@yahoo.com> | 2007-12-16 00:40:23 +0300 |
---|---|---|
committer | Martin Poirier <theeth@yahoo.com> | 2007-12-16 00:40:23 +0300 |
commit | 2b9de725e350e0ccf85c5a5f344ee5c08c82034c (patch) | |
tree | 922bfc3fbf88fb05c5e201395df371bfa98ddcb9 /source/blender | |
parent | 460dd7a7bbd43526e684bde96fcb6098676afdc8 (diff) |
== Text Window ==
Patch [#7849] by Jetze van Beijma, strike 2.
The first patch fixed the size of the scroll bar, this one fixes drawing of selected text area (the redish area in the scrollbar).
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/src/drawtext.c | 95 |
1 files changed, 69 insertions, 26 deletions
diff --git a/source/blender/src/drawtext.c b/source/blender/src/drawtext.c index 7addda70932..0b33a4df5fc 100644 --- a/source/blender/src/drawtext.c +++ b/source/blender/src/drawtext.c @@ -725,54 +725,97 @@ static void draw_cursor(SpaceText *st) { static void calc_text_rcts(SpaceText *st) { - short barheight, barstart, blank_lines; - int lbarstart, lbarh, ltexth; - int pix_available, pix_top_margin, pix_bottom_margin; + int lhlstart, lhlend, ltexth; + short barheight, barstart, hlstart, hlend, blank_lines; + short pix_available, pix_top_margin, pix_bottom_margin, pix_bardiff; - lbarstart= st->top; - lbarh= st->viewlines; pix_top_margin = 8; pix_bottom_margin = 4; pix_available = curarea->winy - pix_top_margin - pix_bottom_margin; ltexth= txt_get_span(st->text->lines.first, st->text->lines.last); blank_lines = st->viewlines / 2; - if(ltexth + blank_lines < lbarstart + st->viewlines) - blank_lines = lbarstart + st->viewlines - ltexth; + /* when resizing a vieport with the bar at the bottom to a greater height more blank lines will be added */ + if (ltexth + blank_lines < st->top + st->viewlines) { + blank_lines = st->top + st->viewlines - ltexth; + } ltexth += blank_lines; - barstart = (lbarstart*pix_available)/ltexth; - barheight = (lbarh*pix_available)/ltexth; - if (barheight<20){ - barstart = ((pix_available + barheight - 20 )*lbarstart)/ltexth; - barheight=20; + barheight = (st->viewlines*pix_available) / ltexth; + pix_bardiff = 0; + if (barheight < 20) { + pix_bardiff = 20 - barheight; /* take into account the now non-linear sizing of the bar */ + barheight = 20; } + barstart = ((pix_available - pix_bardiff) * st->top) / ltexth; - st->txtbar.xmin= 5; - st->txtbar.xmax= 17; - st->txtbar.ymax= curarea->winy - pix_top_margin - barstart; - st->txtbar.ymin= st->txtbar.ymax - barheight; + st->txtbar.xmin = 5; + st->txtbar.xmax = 17; + st->txtbar.ymax = curarea->winy - pix_top_margin - barstart; + st->txtbar.ymin = st->txtbar.ymax - barheight; CLAMP(st->txtbar.ymin, pix_bottom_margin, curarea->winy - pix_top_margin); CLAMP(st->txtbar.ymax, pix_bottom_margin, curarea->winy - pix_top_margin); - st->pix_per_line= (float) ltexth/curarea->winy; + st->pix_per_line= (float) ltexth/pix_available; if (st->pix_per_line<.1) st->pix_per_line=.1f; - lbarstart= MIN2(txt_get_span(st->text->lines.first, st->text->curl), + lhlstart = MIN2(txt_get_span(st->text->lines.first, st->text->curl), txt_get_span(st->text->lines.first, st->text->sell)); - lbarh= abs(txt_get_span(st->text->lines.first, st->text->curl)-txt_get_span(st->text->lines.first, st->text->sell)); - - barheight= (lbarh*pix_available)/ltexth; - if (barheight<2) barheight=2; - - barstart= (lbarstart*pix_available)/ltexth; + lhlend = MAX2(txt_get_span(st->text->lines.first, st->text->curl), + txt_get_span(st->text->lines.first, st->text->sell)); + + hlstart = (lhlstart * pix_available) / ltexth; + hlend = (lhlend * pix_available) / ltexth; + + /* the scrollbar is non-linear sized */ + if (pix_bardiff > 0) { + /* the start of the highlight is in the current viewport */ + if (lhlstart >= st->top && lhlstart <= st->top + st->viewlines) { + /* speed the progresion of the start of the highlight through the scrollbar */ + hlstart = ( ( (pix_available - pix_bardiff) * lhlstart) / ltexth) + (pix_bardiff * (lhlstart - st->top) / st->viewlines); + } + else if (lhlstart > st->top + st->viewlines && hlstart < barstart + barheight && hlstart > barstart) { + /* push hl start down */ + hlstart = barstart + barheight; + } + else if (lhlend > st->top && lhlstart < st->top && hlstart > barstart) { + /*fill out start */ + hlstart = barstart; + } + + if (hlend <= hlstart) { + hlend = hlstart + 2; + } + + /* the end of the highlight is in the current viewport */ + if (lhlend >= st->top && lhlend <= st->top + st->viewlines) { + /* speed the progresion of the end of the highlight through the scrollbar */ + hlend = (((pix_available - pix_bardiff )*lhlend)/ltexth) + (pix_bardiff * (lhlend - st->top)/st->viewlines); + } + else if (lhlend < st->top && hlend >= barstart - 2 && hlend < barstart + barheight) { + /* push hl end up */ + hlend = barstart; + } + else if (lhlend > st->top + st->viewlines && lhlstart < st->top + st->viewlines && hlend < barstart + barheight) { + /* fill out end */ + hlend = barstart + barheight; + } + + if (hlend <= hlstart) { + hlstart = hlend - 2; + } + } + + if (hlend - hlstart < 2) { + hlend = hlstart + 2; + } st->txtscroll.xmin= 5; st->txtscroll.xmax= 17; - st->txtscroll.ymax= curarea->winy-barstart; - st->txtscroll.ymin= st->txtscroll.ymax - barheight; + st->txtscroll.ymax= curarea->winy - pix_top_margin - hlstart; + st->txtscroll.ymin= curarea->winy - pix_top_margin - hlend; CLAMP(st->txtscroll.ymin, pix_bottom_margin, curarea->winy - pix_top_margin); CLAMP(st->txtscroll.ymax, pix_bottom_margin, curarea->winy - pix_top_margin); |