[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15757] branches/soc-2008-quorn/source/ blender/src/drawtext.c: Documentation panel improved to scroll and have better word-wrapping.
Ian Thompson
quornian at googlemail.com
Fri Jul 25 10:06:31 CEST 2008
Revision: 15757
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15757
Author: quorn
Date: 2008-07-25 10:06:30 +0200 (Fri, 25 Jul 2008)
Log Message:
-----------
Documentation panel improved to scroll and have better word-wrapping.
Modified Paths:
--------------
branches/soc-2008-quorn/source/blender/src/drawtext.c
Modified: branches/soc-2008-quorn/source/blender/src/drawtext.c
===================================================================
--- branches/soc-2008-quorn/source/blender/src/drawtext.c 2008-07-25 07:56:07 UTC (rev 15756)
+++ branches/soc-2008-quorn/source/blender/src/drawtext.c 2008-07-25 08:06:30 UTC (rev 15757)
@@ -92,6 +92,7 @@
#define SUGG_LIST_SIZE 7
#define SUGG_LIST_WIDTH 20
#define DOC_WIDTH 40
+#define DOC_HEIGHT 10
#define TOOL_SUGG_LIST 0x01
#define TOOL_DOCUMENT 0x02
@@ -119,6 +120,7 @@
static void *last_txt_find_string= NULL;
static void *last_txt_repl_string= NULL;
+static int doc_scroll= 0;
static double last_check_time= 0;
static BMF_Font *spacetext_get_font(SpaceText *st) {
@@ -1080,9 +1082,9 @@
void draw_documentation(SpaceText *st)
{
TextLine *tmp;
- char *docs, buf[DOC_WIDTH+1];
- int len, prevsp, i, a;
- int boxw=0, boxh, l, x, y;
+ char *docs, buf[DOC_WIDTH+1], *p;
+ int len, i, br, lines;
+ int boxw, boxh, l, x, y, top;
if (!st || !st->text) return;
if (!texttool_text_is_active(st->text)) return;
@@ -1096,55 +1098,70 @@
if (l<0) return;
if(st->showlinenrs) {
- x = spacetext_get_fontwidth(st)*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4;
+ x= spacetext_get_fontwidth(st)*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4;
} else {
- x = spacetext_get_fontwidth(st)*(st->text->curc-st->left) + TXT_OFFSET - 4;
+ x= spacetext_get_fontwidth(st)*(st->text->curc-st->left) + TXT_OFFSET - 4;
}
if (texttool_suggest_first()) {
x += SUGG_LIST_WIDTH*spacetext_get_fontwidth(st) + 50;
}
- y = curarea->winy - st->lheight*l - 2;
- len = strlen(docs);
+ top= y= curarea->winy - st->lheight*l - 2;
+ len= strlen(docs);
+ boxw= DOC_WIDTH*spacetext_get_fontwidth(st) + 20;
+ boxh= (DOC_HEIGHT+1)*st->lheight;
- boxw = DOC_WIDTH*spacetext_get_fontwidth(st) + 20;
- boxh = (2*len/DOC_WIDTH+1)*st->lheight + 8; /* Rough guess at box height */
-
- BIF_ThemeColor(TH_SHADE1);
- glRecti(x-1, y+1, x+boxw+1, y-boxh-1);
+ /* Draw panel */
BIF_ThemeColor(TH_BACK);
glRecti(x, y, x+boxw, y-boxh);
+ BIF_ThemeColor(TH_SHADE1);
+ glBegin(GL_LINE_LOOP);
+ glVertex2i(x, y);
+ glVertex2i(x+boxw, y);
+ glVertex2i(x+boxw, y-boxh);
+ glVertex2i(x, y-boxh);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex2i(x+boxw-10, y-7);
+ glVertex2i(x+boxw-4, y-7);
+ glVertex2i(x+boxw-7, y-2);
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex2i(x+boxw-10, y-boxh+7);
+ glVertex2i(x+boxw-4, y-boxh+7);
+ glVertex2i(x+boxw-7, y-boxh+2);
+ glEnd();
BIF_ThemeColor(TH_TEXT);
- len = strlen(docs);
- prevsp = a = 0;
-
- for (i=0; i<len; i++) {
- if (docs[i] == ' ' || docs[i] == '\t' || docs[i] == '\n') {
-
- /* If we would exceed the line length, print up to the last space */
- if (a + i-prevsp > DOC_WIDTH) {
+ i= 0; br= DOC_WIDTH; lines= -doc_scroll;
+ for (p=docs; *p; p++) {
+ if (*p == '\r' && *(++p) != '\n') *(--p)= '\n'; /* Fix line endings */
+ if (*p == ' ' || *p == '\t')
+ br= i;
+ else if (*p == '\n') {
+ buf[i]= '\0';
+ if (lines>=0) {
y -= st->lheight;
- buf[a] = '\0';
- text_draw(st, buf, 0, 0, 1, x+4, y-1, NULL);
- a = 0;
+ text_draw(st, buf, 0, 0, 1, x+4, y-3, NULL);
}
-
- /* Buffer up the next bit ready to draw */
- if (i-prevsp > DOC_WIDTH) break; /* TODO: Deal with long, unbroken strings */
- strncpy(buf+a, docs+prevsp, i-prevsp);
- a += i-prevsp;
- prevsp = i;
-
- /* Hit a new line, print what we have */
- if (docs[i] == '\n') {
+ i= 0; br= DOC_WIDTH; lines++;
+ }
+ buf[i++]= *p;
+ if (i == DOC_WIDTH) { /* Reached the width, go to last break and wrap there */
+ buf[br]= '\0';
+ if (lines>=0) {
y -= st->lheight;
- buf[a] = '\0';
- text_draw(st, buf, 0, 0, 1, x+4, y-1, NULL);
- a = 0;
+ text_draw(st, buf, 0, 0, 1, x+4, y-3, NULL);
}
+ p -= i-br-1; /* Rewind pointer to last break */
+ i= 0; br= DOC_WIDTH; lines++;
}
+ if (lines >= DOC_HEIGHT) break;
}
+ if (doc_scroll > 0 && lines < DOC_HEIGHT) {
+ doc_scroll--;
+ draw_documentation(st);
+ }
}
void draw_suggestion_list(SpaceText *st)
@@ -2018,10 +2035,11 @@
do_selection(st, G.qual&LR_SHIFTKEY);
get_selection_buffer(text);
do_draw= 1;
+ tools_cancel |= TOOL_SUGG_LIST | TOOL_DOCUMENT;
} else {
do_textscroll(st, 1);
+ tools_cancel |= TOOL_SUGG_LIST;
}
- tools_cancel |= TOOL_SUGG_LIST | TOOL_DOCUMENT;
}
}
} else if (event==RIGHTMOUSE) {
@@ -2453,7 +2471,11 @@
tools_cancel = 0;
break;
case DOWNARROWKEY:
- if (tools & TOOL_SUGG_LIST) {
+ if (tools & TOOL_DOCUMENT) {
+ doc_scroll++;
+ tools_cancel &= ~(TOOL_SUGG_LIST | TOOL_DOCUMENT);
+ break;
+ } else if (tools & TOOL_SUGG_LIST) {
SuggItem *sel = texttool_suggest_selected();
if (!sel) {
texttool_suggest_select(texttool_suggest_first());
@@ -2491,7 +2513,11 @@
pop_space_text(st);
break;
case UPARROWKEY:
- if (tools & TOOL_SUGG_LIST) {
+ if (tools & TOOL_DOCUMENT) {
+ if (doc_scroll) doc_scroll--;
+ tools_cancel &= ~(TOOL_SUGG_LIST | TOOL_DOCUMENT);
+ break;
+ } else if (tools & TOOL_SUGG_LIST) {
SuggItem *sel = texttool_suggest_selected();
if (sel && sel!=texttool_suggest_first() && sel->prev)
texttool_suggest_select(sel->prev);
@@ -2542,7 +2568,11 @@
pop_space_text(st);
break;
case WHEELUPMOUSE:
- if (tools & TOOL_SUGG_LIST) {
+ if (tools & TOOL_DOCUMENT) {
+ if (doc_scroll) doc_scroll--;
+ tools_cancel &= ~(TOOL_SUGG_LIST | TOOL_DOCUMENT);
+ break;
+ } else if (tools & TOOL_SUGG_LIST) {
SuggItem *sel = texttool_suggest_selected();
if (sel && sel!=texttool_suggest_first() && sel->prev)
texttool_suggest_select(sel->prev);
@@ -2554,7 +2584,11 @@
do_draw= 1;
break;
case WHEELDOWNMOUSE:
- if (tools & TOOL_SUGG_LIST) {
+ if (tools & TOOL_DOCUMENT) {
+ doc_scroll++;
+ tools_cancel &= ~(TOOL_SUGG_LIST | TOOL_DOCUMENT);
+ break;
+ } else if (tools & TOOL_SUGG_LIST) {
SuggItem *sel = texttool_suggest_selected();
if (!sel) {
texttool_suggest_select(texttool_suggest_first());
@@ -2644,6 +2678,7 @@
if (tools & TOOL_DOCUMENT) {
if (tools_cancel & TOOL_DOCUMENT) {
texttool_docs_clear();
+ doc_scroll= 0;
}
do_draw= 1;
}
More information about the Bf-blender-cvs
mailing list