Fix info showing multi-line reports reversed (upside-down)

Also, only show the icon once per report.
This commit is contained in:
Campbell Barton 2020-03-13 20:12:51 +11:00
parent 54743dbf09
commit df032580c1
Notes: blender-bot 2023-02-14 19:02:12 +01:00
Referenced by issue blender/blender-addons#73578, Info Editor prints python errors upside down.
2 changed files with 22 additions and 18 deletions

View File

@ -61,7 +61,10 @@ static enum eTextViewContext_LineFlag report_line_data(TextViewContext *tvc,
int icon_fg_id;
int icon_bg_id;
if (report->type & RPT_ERROR_ALL) {
if (tvc->iter_char_begin != 0) {
*r_icon = ICON_NONE;
}
else if (report->type & RPT_ERROR_ALL) {
icon_fg_id = TH_INFO_ERROR_TEXT;
icon_bg_id = TH_INFO_ERROR;
*r_icon = ICON_CANCEL;
@ -115,14 +118,13 @@ static void report_textview_init__internal(TextViewContext *tvc)
{
const Report *report = tvc->iter;
const char *str = report->message;
const char *next_str = strchr(str + tvc->iter_char, '\n');
if (next_str) {
tvc->iter_char_next = (int)(next_str - str);
}
else {
tvc->iter_char_next = report->len;
for (int i = tvc->iter_char_end - 1; i >= 0; i -= 1) {
if (str[i] == '\n') {
tvc->iter_char_begin = i + 1;
return;
}
}
tvc->iter_char_begin = 0;
}
static int report_textview_skip__internal(TextViewContext *tvc)
@ -152,7 +154,8 @@ static int report_textview_begin(TextViewContext *tvc)
tvc->iter_tmp = 0;
if (tvc->iter && report_textview_skip__internal(tvc)) {
/* init the newline iterator */
tvc->iter_char = 0;
const Report *report = tvc->iter;
tvc->iter_char_end = report->len;
report_textview_init__internal(tvc);
return true;
@ -172,12 +175,13 @@ static int report_textview_step(TextViewContext *tvc)
/* simple case, but no newline support */
const Report *report = tvc->iter;
if (report->len <= tvc->iter_char_next) {
if (tvc->iter_char_begin <= 0) {
tvc->iter = (void *)((Link *)tvc->iter)->prev;
if (tvc->iter && report_textview_skip__internal(tvc)) {
tvc->iter_tmp++;
tvc->iter_char = 0; /* reset start */
report = tvc->iter;
tvc->iter_char_end = report->len; /* reset start */
report_textview_init__internal(tvc);
return true;
@ -188,7 +192,7 @@ static int report_textview_step(TextViewContext *tvc)
}
else {
/* step to the next newline */
tvc->iter_char = tvc->iter_char_next + 1;
tvc->iter_char_end = tvc->iter_char_begin - 1;
report_textview_init__internal(tvc);
return true;
@ -198,8 +202,8 @@ static int report_textview_step(TextViewContext *tvc)
static void report_textview_line_get(TextViewContext *tvc, const char **r_line, int *r_len)
{
const Report *report = tvc->iter;
*r_line = report->message + tvc->iter_char;
*r_len = tvc->iter_char_next - tvc->iter_char;
*r_line = report->message + tvc->iter_char_begin;
*r_len = tvc->iter_char_end - tvc->iter_char_begin;
}
static void info_textview_draw_rect_calc(const ARegion *region,

View File

@ -65,10 +65,10 @@ typedef struct TextViewContext {
void (*const_colors)(struct TextViewContext *tvc, unsigned char bg_sel[4]);
const void *iter;
int iter_index;
/** Char index, used for multi-line report display. */
int iter_char;
/** Same as 'iter_char', next new-line. */
int iter_char_next;
/** Used for internal multi-line iteration. */
int iter_char_begin;
/** The last character (not inclusive). */
int iter_char_end;
/** Internal iterator use. */
int iter_tmp;