From a5cac5434a9cb316b24e4b0a47c4d3f2f240dec6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 29 Nov 2010 20:42:03 +0000 Subject: bugfix [#24969] Python Console bug: inserting a large text leads to strange caret behavior Caret wasn't wrapping. --- .../blender/editors/space_console/console_draw.c | 28 ++++++++++++++++++---- source/blender/editors/space_info/textview.c | 1 + source/blender/editors/space_info/textview.h | 2 ++ 3 files changed, 26 insertions(+), 5 deletions(-) (limited to 'source') diff --git a/source/blender/editors/space_console/console_draw.c b/source/blender/editors/space_console/console_draw.c index 6d7eb45f31e..8112008e9a1 100644 --- a/source/blender/editors/space_console/console_draw.c +++ b/source/blender/editors/space_console/console_draw.c @@ -150,17 +150,35 @@ static int console_textview_line_color(struct TextViewContext *tvc, unsigned cha /* annoying hack, to draw the prompt */ if(tvc->iter_index == 0) { - SpaceConsole *sc= (SpaceConsole *)tvc->arg1; - int prompt_len= strlen(sc->prompt); + const SpaceConsole *sc= (SpaceConsole *)tvc->arg1; + const ConsoleLine *cl= (ConsoleLine *)sc->history.last; + const int prompt_len= strlen(sc->prompt); + const int cursor_loc= cl->cursor + prompt_len; int xy[2] = {CONSOLE_DRAW_MARGIN, CONSOLE_DRAW_MARGIN}; - const int cursor = ((ConsoleLine *)sc->history.last)->cursor; + int pen[2]; xy[1] += tvc->lheight/6; - + + /* account for wrapping */ + if(cl->len < tvc->console_width) { + /* simple case, no wrapping */ + pen[0]= tvc->cwidth * cursor_loc; + pen[1]= -2; + } + else { + /* wrap */ + pen[0]= tvc->cwidth * (cursor_loc % tvc->console_width); + pen[1]= -2 + (((cl->len / tvc->console_width) - (cursor_loc / tvc->console_width)) * tvc->lheight); + } + /* cursor */ UI_GetThemeColor3ubv(TH_CONSOLE_CURSOR, (char *)fg); glColor3ubv(fg); - glRecti(xy[0]+(tvc->cwidth*(cursor+prompt_len)) -1, xy[1]-2, xy[0]+(tvc->cwidth*(cursor+prompt_len)) +1, xy[1]+tvc->lheight-2); + glRecti( (xy[0] + pen[0]) - 1, + (xy[1] + pen[1]), + (xy[0] + pen[0]) + 1, + (xy[1] + pen[1] + tvc->lheight) + ); } console_line_color(fg, cl->type); diff --git a/source/blender/editors/space_info/textview.c b/source/blender/editors/space_info/textview.c index 0cdace3039c..53751884bec 100644 --- a/source/blender/editors/space_info/textview.c +++ b/source/blender/editors/space_info/textview.c @@ -250,6 +250,7 @@ int textview_draw(TextViewContext *tvc, int draw, int mval[2], void **mouse_pick /* shouldnt be needed */ tvc->cwidth= cdc.cwidth; + tvc->console_width= cdc.console_width; tvc->iter_index= 0; if(tvc->sel_start != tvc->sel_end) { diff --git a/source/blender/editors/space_info/textview.h b/source/blender/editors/space_info/textview.h index 35c44d36f27..390f9f5ed7c 100644 --- a/source/blender/editors/space_info/textview.h +++ b/source/blender/editors/space_info/textview.h @@ -28,6 +28,8 @@ typedef struct TextViewContext { /* view settings */ int cwidth; /* shouldnt be needed! */ + int console_width; /* shouldnt be needed! */ + int winx; int ymin, ymax; -- cgit v1.2.3