Blender  V3.3
info_draw.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2010 Blender Foundation. All rights reserved. */
3 
8 #include <limits.h>
9 #include <string.h>
10 
11 #include "BLI_utildefines.h"
12 
13 #include "DNA_screen_types.h"
14 #include "DNA_space_types.h"
15 
16 #include "BKE_report.h"
17 
18 #include "UI_interface.h"
19 #include "UI_resources.h"
20 #include "UI_view2d.h"
21 
22 #include "info_intern.h"
23 #include "textview.h"
24 
26  uchar fg[4],
27  uchar bg[4],
28  int *r_icon,
29  uchar r_icon_fg[4],
30  uchar r_icon_bg[4])
31 {
32  const Report *report = tvc->iter;
33 
34  /* Same text color no matter what type of report. */
36 
37  /* Zebra striping for background. */
38  int bg_id = (report->flag & SELECT) ? TH_INFO_SELECTED : TH_BACK;
39  int shade = (tvc->iter_tmp % 2) ? 4 : -4;
40  UI_GetThemeColorShade4ubv(bg_id, shade, bg);
41 
42  /* Don't show icon on subsequent rows of multi-row report. */
43  *r_icon = (tvc->iter_char_begin != 0) ? ICON_NONE : UI_icon_from_report_type(report->type);
44 
45  int icon_fg_id = UI_text_colorid_from_report_type(report->type);
46  int icon_bg_id = UI_icon_colorid_from_report_type(report->type);
47 
48  if (report->flag & SELECT) {
49  icon_fg_id = TH_INFO_SELECTED;
50  icon_bg_id = TH_INFO_SELECTED_TEXT;
51  }
52 
53  if (*r_icon != ICON_NONE) {
54  UI_GetThemeColor4ubv(icon_fg_id, r_icon_fg);
55  /* This theme color is RGB only, so set alpha. */
56  r_icon_fg[3] = 255;
57  UI_GetThemeColor4ubv(icon_bg_id, r_icon_bg);
59  }
60 
61  return TVC_LINE_FG | TVC_LINE_BG;
62 }
63 
64 /* reports! */
66 {
67  const Report *report = tvc->iter;
68  const char *str = report->message;
69  for (int i = tvc->iter_char_end - 1; i >= 0; i -= 1) {
70  if (str[i] == '\n') {
71  tvc->iter_char_begin = i + 1;
72  return;
73  }
74  }
75  tvc->iter_char_begin = 0;
76 }
77 
79 {
80  const SpaceInfo *sinfo = tvc->arg1;
81  const int report_mask = info_report_mask(sinfo);
82  while (tvc->iter && (((const Report *)tvc->iter)->type & report_mask) == 0) {
83  tvc->iter = (void *)((Link *)tvc->iter)->prev;
84  }
85  return (tvc->iter != NULL);
86 }
87 
89 {
90  const ReportList *reports = tvc->arg2;
91 
92  tvc->sel_start = 0;
93  tvc->sel_end = 0;
94 
95  /* iterator */
96  tvc->iter = reports->list.last;
97 
99 
100  tvc->iter_tmp = 0;
101  if (tvc->iter && report_textview_skip__internal(tvc)) {
102  /* init the newline iterator */
103  const Report *report = tvc->iter;
104  tvc->iter_char_end = report->len;
106 
107  return true;
108  }
109 
110  return false;
111 }
112 
114 {
115  /* pass */
116 }
117 
119 {
120  /* simple case, but no newline support */
121  if (tvc->iter_char_begin <= 0) {
122  tvc->iter = (void *)((Link *)tvc->iter)->prev;
123  if (tvc->iter && report_textview_skip__internal(tvc)) {
124  tvc->iter_tmp++;
125 
126  const Report *report = tvc->iter;
127  tvc->iter_char_end = report->len; /* reset start */
129 
130  return true;
131  }
132  return false;
133  }
134 
135  /* step to the next newline */
136  tvc->iter_char_end = tvc->iter_char_begin - 1;
138 
139  return true;
140 }
141 
142 static void report_textview_line_get(TextViewContext *tvc, const char **r_line, int *r_len)
143 {
144  const Report *report = tvc->iter;
145  *r_line = report->message + tvc->iter_char_begin;
146  *r_len = tvc->iter_char_end - tvc->iter_char_begin;
147 }
148 
149 static void info_textview_draw_rect_calc(const ARegion *region,
150  rcti *r_draw_rect,
151  rcti *r_draw_rect_outer)
152 {
153  const int margin = 0.45f * U.widget_unit;
154  r_draw_rect->xmin = margin + UI_UNIT_X;
155  r_draw_rect->xmax = region->winx - V2D_SCROLL_WIDTH;
156  r_draw_rect->ymin = margin;
157  r_draw_rect->ymax = region->winy;
158  /* No margin at the top (allow text to scroll off the window). */
159 
160  r_draw_rect_outer->xmin = 0;
161  r_draw_rect_outer->xmax = region->winx;
162  r_draw_rect_outer->ymin = 0;
163  r_draw_rect_outer->ymax = region->winy;
164 }
165 
166 static int info_textview_main__internal(const SpaceInfo *sinfo,
167  const ARegion *region,
168  const ReportList *reports,
169  const bool do_draw,
170  const int mval[2],
171  void **r_mval_pick_item,
172  int *r_mval_pick_offset)
173 {
174  int ret = 0;
175 
176  const View2D *v2d = &region->v2d;
177 
178  TextViewContext tvc = {0};
180  tvc.end = report_textview_end;
181 
185  tvc.const_colors = NULL;
186 
187  tvc.arg1 = sinfo;
188  tvc.arg2 = reports;
189 
190  /* view */
191  tvc.sel_start = 0;
192  tvc.sel_end = 0;
193  tvc.lheight = 17 * UI_DPI_FAC;
194  tvc.row_vpadding = 0.4 * tvc.lheight;
195  tvc.scroll_ymin = v2d->cur.ymin;
196  tvc.scroll_ymax = v2d->cur.ymax;
197 
199 
200  ret = textview_draw(&tvc, do_draw, mval, r_mval_pick_item, r_mval_pick_offset);
201 
202  return ret;
203 }
204 
205 void *info_text_pick(const SpaceInfo *sinfo,
206  const ARegion *region,
207  const ReportList *reports,
208  int mouse_y)
209 {
210  void *mval_pick_item = NULL;
211  const int mval[2] = {0, mouse_y};
212 
213  info_textview_main__internal(sinfo, region, reports, false, mval, &mval_pick_item, NULL);
214  return (void *)mval_pick_item;
215 }
216 
217 int info_textview_height(const SpaceInfo *sinfo, const ARegion *region, const ReportList *reports)
218 {
219  const int mval[2] = {INT_MAX, INT_MAX};
220  return info_textview_main__internal(sinfo, region, reports, false, mval, NULL, NULL);
221 }
222 
223 void info_textview_main(const SpaceInfo *sinfo, const ARegion *region, const ReportList *reports)
224 {
225  const int mval[2] = {INT_MAX, INT_MAX};
226  info_textview_main__internal(sinfo, region, reports, true, mval, NULL, NULL);
227 }
unsigned char uchar
Definition: BLI_sys_types.h:70
#define UNUSED(x)
int UI_text_colorid_from_report_type(int type)
int UI_icon_from_report_type(int type)
int UI_icon_colorid_from_report_type(int type)
#define UI_DPI_FAC
Definition: UI_interface.h:305
#define UI_UNIT_X
@ TH_BACK
Definition: UI_resources.h:39
@ TH_INFO_SELECTED_TEXT
Definition: UI_resources.h:314
@ TH_INFO_SELECTED
Definition: UI_resources.h:313
@ TH_TEXT
Definition: UI_resources.h:42
void UI_ThemeClearColor(int colorid)
Definition: resources.c:1448
void UI_GetThemeColorShade4ubv(int colorid, int offset, unsigned char col[4])
Definition: resources.c:1241
void UI_GetThemeColor4ubv(int colorid, unsigned char col[4])
Definition: resources.c:1352
#define V2D_SCROLL_WIDTH
Definition: UI_view2d.h:55
unsigned int U
Definition: btGjkEpa3.h:78
#define SELECT
#define str(s)
static void report_textview_end(TextViewContext *UNUSED(tvc))
Definition: info_draw.c:113
void info_textview_main(const SpaceInfo *sinfo, const ARegion *region, const ReportList *reports)
Definition: info_draw.c:223
void * info_text_pick(const SpaceInfo *sinfo, const ARegion *region, const ReportList *reports, int mouse_y)
Definition: info_draw.c:205
static int info_textview_main__internal(const SpaceInfo *sinfo, const ARegion *region, const ReportList *reports, const bool do_draw, const int mval[2], void **r_mval_pick_item, int *r_mval_pick_offset)
Definition: info_draw.c:166
int info_textview_height(const SpaceInfo *sinfo, const ARegion *region, const ReportList *reports)
Definition: info_draw.c:217
static enum eTextViewContext_LineFlag report_line_data(TextViewContext *tvc, uchar fg[4], uchar bg[4], int *r_icon, uchar r_icon_fg[4], uchar r_icon_bg[4])
Definition: info_draw.c:25
static int report_textview_begin(TextViewContext *tvc)
Definition: info_draw.c:88
static void info_textview_draw_rect_calc(const ARegion *region, rcti *r_draw_rect, rcti *r_draw_rect_outer)
Definition: info_draw.c:149
static void report_textview_line_get(TextViewContext *tvc, const char **r_line, int *r_len)
Definition: info_draw.c:142
static int report_textview_step(TextViewContext *tvc)
Definition: info_draw.c:118
static void report_textview_init__internal(TextViewContext *tvc)
Definition: info_draw.c:65
static int report_textview_skip__internal(TextViewContext *tvc)
Definition: info_draw.c:78
int info_report_mask(const struct SpaceInfo *sinfo)
SymEdge< T > * prev(const SymEdge< T > *se)
Definition: delaunay_2d.cc:105
return ret
void * last
Definition: DNA_listBase.h:31
const char * message
const void * arg2
Definition: textview.h:37
rcti draw_rect
Definition: textview.h:26
const void * arg1
Definition: textview.h:36
void(* line_get)(struct TextViewContext *tvc, const char **r_line, int *r_len)
Definition: textview.h:41
const void * iter
Definition: textview.h:51
int iter_char_end
Definition: textview.h:56
int row_vpadding
Definition: textview.h:23
int iter_char_begin
Definition: textview.h:54
int(* begin)(struct TextViewContext *tvc)
Definition: textview.h:34
void(* const_colors)(struct TextViewContext *tvc, unsigned char bg_sel[4])
Definition: textview.h:50
enum eTextViewContext_LineFlag(* line_data)(struct TextViewContext *tvc, uchar fg[4], uchar bg[4], int *r_icon, uchar r_icon_fg[4], uchar r_icon_bg[4])
Definition: textview.h:42
void(* end)(struct TextViewContext *tvc)
Definition: textview.h:35
int(* step)(struct TextViewContext *tvc)
Definition: textview.h:40
rcti draw_rect_outer
Definition: textview.h:28
float ymax
Definition: DNA_vec_types.h:70
float ymin
Definition: DNA_vec_types.h:70
int ymin
Definition: DNA_vec_types.h:64
int ymax
Definition: DNA_vec_types.h:64
int xmin
Definition: DNA_vec_types.h:63
int xmax
Definition: DNA_vec_types.h:63
int textview_draw(TextViewContext *tvc, const bool do_draw, const int mval_init[2], void **r_mval_pick_item, int *r_mval_pick_offset)
Definition: textview.c:293
eTextViewContext_LineFlag
Definition: textview.h:9
@ TVC_LINE_ICON
Definition: textview.h:12
@ TVC_LINE_ICON_FG
Definition: textview.h:13
@ TVC_LINE_ICON_BG
Definition: textview.h:14
@ TVC_LINE_BG
Definition: textview.h:11
@ TVC_LINE_FG
Definition: textview.h:10