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:
authorMartin Poirier <theeth@yahoo.com>2007-12-16 00:40:23 +0300
committerMartin Poirier <theeth@yahoo.com>2007-12-16 00:40:23 +0300
commit2b9de725e350e0ccf85c5a5f344ee5c08c82034c (patch)
tree922bfc3fbf88fb05c5e201395df371bfa98ddcb9 /source/blender/src
parent460dd7a7bbd43526e684bde96fcb6098676afdc8 (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/src')
-rw-r--r--source/blender/src/drawtext.c95
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);