[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