[Bf-blender-cvs] [1ee93b1c78b] soc-2020-info-editor: WIP: fix syntax highlighting in console
Mateusz GrzeliÅski
noreply at git.blender.org
Fri Jul 24 11:48:57 CEST 2020
Commit: 1ee93b1c78bc46a908271ebbcdde1e628c0121dd
Author: Mateusz Grzeliński
Date: Fri Jul 24 11:39:47 2020 +0200
Branches: soc-2020-info-editor
https://developer.blender.org/rB1ee93b1c78bc46a908271ebbcdde1e628c0121dd
WIP: fix syntax highlighting in console
===================================================================
M source/blender/editors/space_console/console_draw.c
M source/blender/editors/space_info/info_draw.c
M source/blender/editors/space_info/textview.c
M source/blender/editors/space_info/textview.h
===================================================================
diff --git a/source/blender/editors/space_console/console_draw.c b/source/blender/editors/space_console/console_draw.c
index 87ea04cf55e..6631a5d6a8c 100644
--- a/source/blender/editors/space_console/console_draw.c
+++ b/source/blender/editors/space_console/console_draw.c
@@ -41,7 +41,6 @@
#include "../space_text/text_format.h"
#define TABNUMBER 4
-#define PROPMPT_LEN 4
static enum eTextViewContext_LineFlag console_line_draw_data(TextViewContext *tvc,
TextLine *text_line,
@@ -51,24 +50,24 @@ static enum eTextViewContext_LineFlag console_line_draw_data(TextViewContext *tv
uchar UNUSED(icon_fg[4]),
uchar UNUSED(icon_bg[4]))
{
- const ConsoleLine *cl_iter = tvc->iter;
- SpaceConsole *sc = (SpaceConsole *)tvc->arg1;
+ const ConsoleLine *cl = tvc->iter;
int fg_id = TH_TEXT;
- switch (cl_iter->type) {
- case CONSOLE_LINE_OUTPUT: {
- TextFormatType *py_formatter = ED_text_format_get_by_extension("py");
- py_formatter->format_line(text_line, TABNUMBER, false);
- return TVC_LINE_FG_COMPLEX;
- }
+ switch (cl->type) {
+ case CONSOLE_LINE_OUTPUT:
case CONSOLE_LINE_INPUT: {
TextFormatType *py_formatter = ED_text_format_get_by_extension("py");
- py_formatter->format_line(text_line, TABNUMBER, false);
- /* workaround: formatter formats also prompt >>>, what is not desirable but current
- * implementation is basic enough so it does not really care */
- for (int i = 0; i < text_line->len && i < strlen(sc->prompt); ++i) {
- text_line->format[i] = FMT_TYPE_DEFAULT;
+ TextLine *text_line_iter = text_line;
+ while (text_line_iter) {
+ py_formatter->format_line(text_line_iter, TABNUMBER, false);
+ text_line_iter = text_line_iter->next;
}
+ /* workaround: formatter formats also prompt >>> ... what is not desirable but current
+ * implementation treats it as keyword, so no big deal */
+ // SpaceConsole *sc = (SpaceConsole *)tvc->arg1;
+ // for (int i = 0; i < text_line->len && i < strlen(sc->prompt); ++i) {
+ // text_line->format[i] = FMT_TYPE_DEFAULT;
+ // }
return TVC_LINE_FG_COMPLEX;
}
case CONSOLE_LINE_INFO:
@@ -122,21 +121,33 @@ static void console_textview_end(TextViewContext *tvc)
(void)sc;
}
+/** one step for console is printing one "chunk" at a time. Chunk is line with the same type */
static int console_textview_step(TextViewContext *tvc, ListBase *text_lines)
{
- const ConsoleLine *cl = tvc->iter;
- if (cl->prev && cl->prev->type != cl->type) {
- textview_clear_text_lines(text_lines);
- }
- return ((tvc->iter = (void *)((Link *)tvc->iter)->prev) != NULL);
+ const ConsoleLine *cl_current = tvc->iter;
+ const ConsoleLine *cl_iter = tvc->iter;
+ do {
+ cl_iter = cl_iter->prev;
+ } while (cl_iter && cl_iter->type == cl_current->type);
+ tvc->iter = cl_iter;
+
+ return (tvc->iter != NULL);
}
-static void console_textview_line_get(TextViewContext *tvc, const char **r_line, int *r_len)
+static void console_textview_line_get(TextViewContext *tvc, ListBase *text_lines)
{
- const ConsoleLine *cl = tvc->iter;
- *r_line = cl->line;
- *r_len = cl->len;
- BLI_assert(cl->line[cl->len] == '\0' && (cl->len == 0 || cl->line[cl->len - 1] != '\0'));
+ const ConsoleLine *cl_current = tvc->iter;
+ const ConsoleLine *cl_iter = tvc->iter;
+ do {
+ TextLine *text_line = MEM_callocN(sizeof(*text_line), __func__);
+ text_line->line = cl_iter->line;
+ text_line->len = cl_iter->len;
+ BLI_addhead(text_lines, text_line);
+ cl_iter = cl_iter->prev;
+ } while (cl_iter && cl_iter->type == cl_current->type);
+
+ // BLI_assert(cl_iter->line[cl_iter->len] == '\0' &&
+ // (cl_iter->len == 0 || cl_iter->line[cl_iter->len - 1] != '\0'));
}
static void console_cursor_wrap_offset(
@@ -231,7 +242,7 @@ static int console_textview_main__internal(SpaceConsole *sc,
tvc.end = console_textview_end;
tvc.step = console_textview_step;
- tvc.line_get = console_textview_line_get;
+ tvc.lines_get = console_textview_line_get;
tvc.line_draw_data = console_line_draw_data;
tvc.draw_cursor = console_textview_draw_cursor;
tvc.const_colors = console_textview_const_colors;
diff --git a/source/blender/editors/space_info/info_draw.c b/source/blender/editors/space_info/info_draw.c
index 63fbcbcca57..23621020408 100644
--- a/source/blender/editors/space_info/info_draw.c
+++ b/source/blender/editors/space_info/info_draw.c
@@ -43,7 +43,7 @@
#include "info_intern.h"
#include "textview.h"
-#define TABNUMBER 2
+#define TABNUMBER 4
static enum eTextViewContext_LineFlag report_line_draw_data(TextViewContext *tvc,
TextLine *text_line,
@@ -219,11 +219,13 @@ static int report_textview_step(TextViewContext *tvc, ListBase *UNUSED(text_line
return true;
}
-static void report_textview_line_get(TextViewContext *tvc, const char **r_line, int *r_len)
+static void report_textview_line_get(TextViewContext *tvc, ListBase *text_lines)
{
const Report *report = tvc->iter;
- *r_line = report->message + tvc->iter_char_begin;
- *r_len = tvc->iter_char_end - tvc->iter_char_begin;
+ TextLine *text_line = MEM_callocN(sizeof(*text_line), __func__);
+ text_line->line = report->message + tvc->iter_char_begin;
+ text_line->len = tvc->iter_char_end - tvc->iter_char_begin;
+ BLI_addhead(text_lines, text_line);
}
static void info_textview_draw_rect_calc(const ARegion *region,
@@ -260,7 +262,7 @@ static int info_textview_main__internal(const SpaceInfo *sinfo,
tvc.end = report_textview_end;
tvc.step = report_textview_step;
- tvc.line_get = report_textview_line_get;
+ tvc.lines_get = report_textview_line_get;
tvc.line_draw_data = report_line_draw_data;
tvc.const_colors = NULL;
diff --git a/source/blender/editors/space_info/textview.c b/source/blender/editors/space_info/textview.c
index 79d45e2d7e8..8e3ae34b593 100644
--- a/source/blender/editors/space_info/textview.c
+++ b/source/blender/editors/space_info/textview.c
@@ -141,12 +141,10 @@ static int textview_wrap_offsets(
* return false if the last line is off the screen
* should be able to use this for any string type.
*
- * for single color string use fg, for full control use str_format (FMT_TYPE_*)
+ * if fg == NULL, then text_line->format will be used
*/
static bool textview_draw_string(TextViewDrawState *tds,
- const char *str,
- int str_len,
- const char *str_format,
+ TextLine *text_line,
const uchar fg[4],
const uchar bg[4],
int icon,
@@ -156,6 +154,9 @@ static bool textview_draw_string(TextViewDrawState *tds,
{
int tot_lines; /* Total number of lines for wrapping. */
int *offsets; /* Offsets of line beginnings for wrapping. */
+ const char *str = text_line->line;
+ const char *str_format = text_line->format;
+ int str_len = text_line->len;
str_len = textview_wrap_offsets(str, str_len, tds->columns, &tot_lines, &offsets);
@@ -265,7 +266,7 @@ static bool textview_draw_string(TextViewDrawState *tds,
const int final_offset = offsets[tot_lines - 1];
len = str_len - final_offset;
s = str + final_offset;
- if (fg || str_format == NULL) {
+ if (fg) {
BLF_position(tds->font_id, tds->xy[0], tds->lofs + line_bottom + tds->row_vpadding, 0);
BLF_color4ubv(tds->font_id, fg);
BLF_draw_mono(tds->font_id, s, len, tds->cwidth);
@@ -293,7 +294,7 @@ static bool textview_draw_string(TextViewDrawState *tds,
tds->xy[1] += tds->lheight;
- if (fg || str_format == NULL) {
+ if (fg) {
BLF_color4ubv(tds->font_id, fg);
}
@@ -301,7 +302,7 @@ static bool textview_draw_string(TextViewDrawState *tds,
len = offsets[i] - offsets[i - 1];
s = str + offsets[i - 1];
- if (fg || str_format == NULL) {
+ if (fg) {
BLF_position(tds->font_id, tds->xy[0], tds->lofs + tds->xy[1], 0);
BLF_draw_mono(tds->font_id, s, len, tds->cwidth);
}
@@ -427,27 +428,42 @@ int textview_draw(TextViewContext *tvc,
do {
int data_flag = 0;
const int y_prev = xy[1];
- TextLine *text_line = MEM_callocN(sizeof(*text_line), __func__);
- BLI_addtail(&text_lines, text_line);
- tvc->line_get(tvc, (const char **)&text_line->line, &text_line->len);
+ tvc->lines_get(tvc, &text_lines);
+ BLI_assert(!BLI_listbase_is_empty(&text_lines));
if (do_draw) {
- text_line->format = MEM_callocN(text_line->len + 2, __func__);
- data_flag = tvc->line_draw_data(tvc, text_line, fg, bg, &icon, icon_fg, icon_bg);
+ TextLine *text_line_iter = text_lines.first;
+ while (text_line_iter) {
+ text_line_iter->format = MEM_callocN(text_line_iter->len + 2, __func__);
+ text_line_iter = text_line_iter->next;
+ }
+ data_flag = tvc->line_draw_data(tvc, text_lines.first, fg, bg, &icon, icon_fg, icon_bg);
+ assert(data_flag & TVC_LINE_FG_SIMPLE || data_flag & TVC_LINE_FG_COMPLEX);
}
- const bool is_out_of_view_y = !textview_draw_string(
+ TextLine *text_line_iter = text_lines.last;
+ bool is_out_of_view_y = !textview_draw_string(
&tds,
- text_line->line,
- text_line->len,
- (data_flag & TVC_LINE_FG_COMPLEX) ? text_line->format : NULL,
+ text_line_iter,
(data_flag & TVC_LINE_FG_SIMPLE) ? fg : NULL,
(data_flag & TVC_LINE_BG) ? bg : NULL,
(data_flag & TVC_LINE_ICON) ? icon : 0,
(data_flag & TVC_LINE_ICON_FG) ? icon_fg : NULL,
(data_flag & TVC_LINE_ICON_BG) ? icon_bg : NULL,
bg_sel);
+ while (text_line_iter->prev) {
+ text_line_iter = text_line_iter->prev;
+ is_out_of_view_y |= !textview_draw_string(
+ &tds,
+ text_line_iter,
+ (data_flag &
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list