Blender V4.3
info_draw.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2010 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <climits>
10#include <cstring>
11
12#include "BLI_utildefines.h"
13
14#include "DNA_screen_types.h"
15
16#include "BKE_report.hh"
17
18#include "UI_interface.hh"
19#include "UI_resources.hh"
20#include "UI_view2d.hh"
21
22#include "info_intern.hh"
23#include "textview.hh"
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 = static_cast<const 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 = static_cast<const 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 = static_cast<const SpaceInfo *>(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 != nullptr);
86}
87
89{
90 const ReportList *reports = static_cast<const ReportList *>(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 = static_cast<const 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 = static_cast<const 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
142static void report_textview_line_get(TextViewContext *tvc, const char **r_line, int *r_len)
143{
144 const Report *report = static_cast<const 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
149static 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
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};
181
185 tvc.const_colors = nullptr;
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_SCALE_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
205void *info_text_pick(const SpaceInfo *sinfo,
206 const ARegion *region,
207 const ReportList *reports,
208 int mouse_y)
209{
210 void *mval_pick_item = nullptr;
211 const int mval[2] = {0, mouse_y};
212
213 info_textview_main__internal(sinfo, region, reports, false, mval, &mval_pick_item, nullptr);
214 return (void *)mval_pick_item;
215}
216
217int 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, nullptr, nullptr);
221}
222
223void 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, nullptr, nullptr);
227}
unsigned char uchar
#define UI_SCALE_FAC
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_UNIT_X
@ TH_BACK
@ TH_INFO_SELECTED_TEXT
@ TH_INFO_SELECTED
@ TH_TEXT
void UI_ThemeClearColor(int colorid)
void UI_GetThemeColorShade4ubv(int colorid, int offset, unsigned char col[4])
void UI_GetThemeColor4ubv(int colorid, unsigned char col[4])
#define V2D_SCROLL_WIDTH
Definition UI_view2d.hh:54
unsigned int U
Definition btGjkEpa3.h:78
#define SELECT
#define str(s)
void * info_text_pick(const SpaceInfo *sinfo, const ARegion *region, const ReportList *reports, int mouse_y)
Definition info_draw.cc:205
void info_textview_main(const SpaceInfo *sinfo, const ARegion *region, const ReportList *reports)
Definition info_draw.cc:223
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.cc:166
int info_textview_height(const SpaceInfo *sinfo, const ARegion *region, const ReportList *reports)
Definition info_draw.cc: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.cc:25
static int report_textview_begin(TextViewContext *tvc)
Definition info_draw.cc:88
static void info_textview_draw_rect_calc(const ARegion *region, rcti *r_draw_rect, rcti *r_draw_rect_outer)
Definition info_draw.cc:149
static void report_textview_line_get(TextViewContext *tvc, const char **r_line, int *r_len)
Definition info_draw.cc:142
static int report_textview_step(TextViewContext *tvc)
Definition info_draw.cc:118
static void report_textview_init__internal(TextViewContext *tvc)
Definition info_draw.cc:65
static void report_textview_end(TextViewContext *)
Definition info_draw.cc:113
static int report_textview_skip__internal(TextViewContext *tvc)
Definition info_draw.cc:78
int info_report_mask(const SpaceInfo *sinfo)
return ret
void * last
const char * message
enum eTextViewContext_LineFlag(* line_data)(TextViewContext *tvc, uchar fg[4], uchar bg[4], int *r_icon, uchar r_icon_fg[4], uchar r_icon_bg[4])
Definition textview.hh:47
const void * arg2
Definition textview.hh:42
const void * arg1
Definition textview.hh:41
const void * iter
Definition textview.hh:56
void(* end)(TextViewContext *tvc)
Definition textview.hh:40
void(* const_colors)(TextViewContext *tvc, unsigned char bg_sel[4])
Definition textview.hh:55
int(* begin)(TextViewContext *tvc)
Definition textview.hh:39
void(* line_get)(TextViewContext *tvc, const char **r_line, int *r_len)
Definition textview.hh:46
int(* step)(TextViewContext *tvc)
Definition textview.hh:45
rcti draw_rect_outer
Definition textview.hh:33
float ymax
float ymin
int ymin
int ymax
int xmin
int xmax
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.cc:304
eTextViewContext_LineFlag
Definition textview.hh:13
@ TVC_LINE_ICON
Definition textview.hh:16
@ TVC_LINE_ICON_FG
Definition textview.hh:17
@ TVC_LINE_ICON_BG
Definition textview.hh:18
@ TVC_LINE_BG
Definition textview.hh:15
@ TVC_LINE_FG
Definition textview.hh:14