[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15904] branches/soc-2008-quorn/source/ blender/src/drawtext.c: Mouse cursor positioning and selections now work with word-wrapped text.
Ian Thompson
quornian at googlemail.com
Fri Aug 1 15:00:55 CEST 2008
Revision: 15904
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15904
Author: quorn
Date: 2008-08-01 15:00:53 +0200 (Fri, 01 Aug 2008)
Log Message:
-----------
Mouse cursor positioning and selections now work with word-wrapped text. It's not the best solution but it does the job for now. I wanted to get a working version committed before I improve/break it.
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-08-01 12:56:29 UTC (rev 15903)
+++ branches/soc-2008-quorn/source/blender/src/drawtext.c 2008-08-01 13:00:53 UTC (rev 15904)
@@ -139,6 +139,9 @@
static int check_identifier(char ch);
static int check_whitespace(char ch);
+static int get_wrap_width(SpaceText *st);
+static int get_wrap_points(SpaceText *st, char *line);
+
static void get_suggest_prefix(Text *text);
static void confirm_suggestion(Text *text, int skipleft);
@@ -558,14 +561,6 @@
else { linep= &text->curl; charp= &text->curc; }
y= (curarea->winy - y)/st->lheight;
-
- y-= txt_get_span(text->lines.first, *linep) - st->top;
-
- if (y>0) {
- while (y-- != 0) if((*linep)->next) *linep= (*linep)->next;
- } else if (y<0) {
- while (y++ != 0) if((*linep)->prev) *linep= (*linep)->prev;
- }
if(st->showlinenrs)
x-= TXT_OFFSET+TEXTXLOC;
@@ -575,10 +570,103 @@
if (x<0) x= 0;
x = (x/spacetext_get_fontwidth(st)) + st->left;
- w= render_string(st, (*linep)->line);
- if(x<w) *charp= temp_char_accum[x];
- else *charp= (*linep)->len;
-
+ if (st->wordwrap) {
+ int i, j, endj, curs, max, chop, start, end, chars, loop;
+ char ch;
+
+ /* Point to first visible line */
+ *linep= text->lines.first;
+ for (i=0; i<st->top && (*linep)->next; i++) *linep= (*linep)->next;
+
+ max= get_wrap_width(st);
+
+ loop= 1;
+ while (loop && *linep) {
+ start= 0;
+ end= max;
+ chop= 1;
+ chars= 0;
+ curs= 0;
+ for (i=0, j=0; loop; j++) {
+
+ /* Mimic replacement of tabs */
+ ch= (*linep)->line[j];
+ if (ch=='\t') {
+ chars= st->tabnumber-i%st->tabnumber;
+ ch= ' ';
+ } else
+ chars= 1;
+
+ while (chars--) {
+ /* Gone too far, go back to last wrap point */
+ if (y<0) {
+ *charp= endj;
+ loop= 0;
+ break;
+ /* Exactly at the cursor, done */
+ } else if (y==0 && i-start==x) {
+ *charp= curs= j;
+ loop= 0;
+ break;
+ /* Prepare curs for next wrap */
+ } else if (i-end==x) {
+ curs= j;
+ }
+ if (i-start>=max) {
+ if (chop) endj= j;
+ y--;
+ start= end;
+ end += max;
+ chop= 1;
+ if (y==0 && i-start>=x) {
+ *charp= curs;
+ loop= 0;
+ break;
+ }
+ } else if (ch==' ' || ch=='-' || ch=='\0') {
+ if (y==0 && i-start>=x) {
+ *charp= curs;
+ loop= 0;
+ break;
+ }
+ end = i+1;
+ endj = j;
+ chop= 0;
+ }
+ i++;
+ }
+ if (ch=='\0') break;
+ }
+ if (!loop || y<0) break;
+
+ if (!(*linep)->next) {
+ *charp= (*linep)->len;
+ break;
+ }
+
+ /* On correct line but didn't meet cursor, must be at end */
+ if (y==0) {
+ *charp= (*linep)->len;
+ break;
+ }
+ *linep= (*linep)->next;
+ y--;
+ }
+
+ } else {
+ y-= txt_get_span(text->lines.first, *linep) - st->top;
+
+ if (y>0) {
+ while (y-- != 0) if((*linep)->next) *linep= (*linep)->next;
+ } else if (y<0) {
+ while (y++ != 0) if((*linep)->prev) *linep= (*linep)->prev;
+ }
+
+
+ w= render_string(st, (*linep)->line);
+ if(x<w) *charp= temp_char_accum[x];
+ else *charp= (*linep)->len;
+ }
if(!sel) txt_pop_sel(text);
}
@@ -1000,7 +1088,7 @@
scrarea_do_windraw(curarea);
screen_swapbuffers();
- } else if (mval[0]<0 || mval[0]>curarea->winx) {
+ } else if (!st->wordwrap && (mval[0]<0 || mval[0]>curarea->winx)) {
if (mval[0]>curarea->winx) st->left++;
else if (mval[0]<0 && st->left>0) st->left--;
More information about the Bf-blender-cvs
mailing list