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