Blender V4.3
console_draw.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <cstring>
10
11#include "BLI_blenlib.h"
12#include "BLI_utildefines.h"
13
14#include "DNA_screen_types.h"
15#include "DNA_space_types.h"
16
17#include "MEM_guardedalloc.h"
18
19#include "GPU_immediate.hh"
20
21#include "UI_resources.hh"
22#include "UI_view2d.hh"
23
24#include "console_intern.hh"
25
27
29 uchar fg[4],
30 uchar /*bg*/[4],
31 int * /*icon*/,
32 uchar /*icon_fg*/[4],
33 uchar /*icon_bg*/[4])
34{
35 const ConsoleLine *cl_iter = static_cast<const ConsoleLine *>(tvc->iter);
36 int fg_id = TH_TEXT;
37
38 switch (cl_iter->type) {
40 fg_id = TH_CONSOLE_OUTPUT;
41 break;
43 fg_id = TH_CONSOLE_INPUT;
44 break;
46 fg_id = TH_CONSOLE_INFO;
47 break;
49 fg_id = TH_CONSOLE_ERROR;
50 break;
51 }
52
53 UI_GetThemeColor4ubv(fg_id, fg);
54 return TVC_LINE_FG;
55}
56
58{
59 /* fake the edit line being in the scroll buffer */
60 ConsoleLine *cl = static_cast<ConsoleLine *>(sc->history.last);
61 int prompt_len = strlen(sc->prompt);
62
63 cl_dummy->type = CONSOLE_LINE_INPUT;
64 cl_dummy->len = prompt_len + cl->len;
65 cl_dummy->len_alloc = cl_dummy->len + 1;
66 cl_dummy->line = static_cast<char *>(MEM_mallocN(cl_dummy->len_alloc, "cl_dummy"));
67 memcpy(cl_dummy->line, sc->prompt, prompt_len);
68 memcpy(cl_dummy->line + prompt_len, cl->line, cl->len + 1);
69 BLI_addtail(&sc->scrollback, cl_dummy);
70}
72{
73 MEM_freeN(cl_dummy->line);
74 BLI_remlink(&sc->scrollback, cl_dummy);
75}
76
77/* console textview callbacks */
79{
80 SpaceConsole *sc = (SpaceConsole *)tvc->arg1;
81 tvc->sel_start = sc->sel_start;
82 tvc->sel_end = sc->sel_end;
83
84 /* iterator */
85 tvc->iter = sc->scrollback.last;
86
87 return (tvc->iter != nullptr);
88}
89
91{
92 SpaceConsole *sc = (SpaceConsole *)tvc->arg1;
93 (void)sc;
94}
95
97{
98 return ((tvc->iter = (void *)((Link *)tvc->iter)->prev) != nullptr);
99}
100
101static void console_textview_line_get(TextViewContext *tvc, const char **r_line, int *r_len)
102{
103 const ConsoleLine *cl = static_cast<const ConsoleLine *>(tvc->iter);
104 *r_line = cl->line;
105 *r_len = cl->len;
106 // printf("'%s' %d\n", *line, cl->len);
107 BLI_assert(cl->line[cl->len] == '\0' && (cl->len == 0 || cl->line[cl->len - 1] != '\0'));
108}
109
111 const char *str, int width, int *row, int *column, const char *end)
112{
113 int col;
114 const int tab_width = 4;
115
116 for (; *str; str += BLI_str_utf8_size_safe(str)) {
117 col = UNLIKELY(*str == '\t') ? (tab_width - (*column % tab_width)) :
119
120 if (*column + col > width) {
121 (*row)++;
122 *column = 0;
123 }
124
125 if (end && str >= end) {
126 break;
127 }
128
129 *column += col;
130 }
131}
132
133static void console_textview_draw_cursor(TextViewContext *tvc, int cwidth, int columns)
134{
135 int pen[2];
136 {
137 const SpaceConsole *sc = (SpaceConsole *)tvc->arg1;
138 const ConsoleLine *cl = (ConsoleLine *)sc->history.last;
139 int offl = 0, offc = 0;
140
141 console_cursor_wrap_offset(sc->prompt, columns, &offl, &offc, nullptr);
142 console_cursor_wrap_offset(cl->line, columns, &offl, &offc, cl->line + cl->cursor);
143 pen[0] = cwidth * offc;
144 pen[1] = -tvc->lheight * offl;
145
146 console_cursor_wrap_offset(cl->line + cl->cursor, columns, &offl, &offc, nullptr);
147 pen[1] += tvc->lheight * offl;
148
149 pen[0] += tvc->draw_rect.xmin;
150 pen[1] += tvc->draw_rect.ymin;
151 }
152
153 /* cursor */
158
159 immRectf(pos, pen[0] - U.pixelsize, pen[1], pen[0] + U.pixelsize, pen[1] + tvc->lheight);
160
162}
163
164static void console_textview_const_colors(TextViewContext * /*tvc*/, uchar bg_sel[4])
165{
167}
168
169static void console_textview_draw_rect_calc(const ARegion *region,
170 rcti *r_draw_rect,
171 rcti *r_draw_rect_outer)
172{
173 const int margin = 4 * UI_SCALE_FAC;
174 r_draw_rect->xmin = margin;
175 r_draw_rect->xmax = region->winx - V2D_SCROLL_WIDTH;
176 r_draw_rect->ymin = margin;
177 /* No margin at the top (allow text to scroll off the window). */
178 r_draw_rect->ymax = region->winy;
179
180 r_draw_rect_outer->xmin = 0;
181 r_draw_rect_outer->xmax = region->winx;
182 r_draw_rect_outer->ymin = 0;
183 r_draw_rect_outer->ymax = region->winy;
184}
185
187 const ARegion *region,
188 const bool do_draw,
189 const int mval[2],
190 void **r_mval_pick_item,
191 int *r_mval_pick_offset)
192{
193 ConsoleLine cl_dummy = {nullptr};
194 int ret = 0;
195
196 const View2D *v2d = &region->v2d;
197
198 TextViewContext tvc = {0};
199
202
208
209 tvc.arg1 = sc;
210 tvc.arg2 = nullptr;
211
212 /* view */
213 tvc.sel_start = sc->sel_start;
214 tvc.sel_end = sc->sel_end;
215 tvc.lheight = sc->lheight * UI_SCALE_FAC;
216 tvc.scroll_ymin = v2d->cur.ymin;
217 tvc.scroll_ymax = v2d->cur.ymax;
218
220
221 /* Nudge right by half a column to break selection mid-character. */
222 int m_pos[2] = {mval[0], mval[1]};
223 /* Mouse position is initialized with max int. */
224 if (m_pos[0] != INT_MAX) {
225 m_pos[0] += tvc.lheight / 4;
226 }
227
228 console_scrollback_prompt_begin(sc, &cl_dummy);
229 ret = textview_draw(&tvc, do_draw, m_pos, r_mval_pick_item, r_mval_pick_offset);
230 console_scrollback_prompt_end(sc, &cl_dummy);
231
232 return ret;
233}
234
236{
237 const int mval[2] = {INT_MAX, INT_MAX};
238 console_textview_main__internal(sc, region, true, mval, nullptr, nullptr);
239}
240
242{
243 const int mval[2] = {INT_MAX, INT_MAX};
244 return console_textview_main__internal(sc, region, false, mval, nullptr, nullptr);
245}
246
247int console_char_pick(SpaceConsole *sc, const ARegion *region, const int mval[2])
248{
249 int r_mval_pick_offset = 0;
250 void *mval_pick_item = nullptr;
251
252 console_textview_main__internal(sc, region, false, mval, &mval_pick_item, &r_mval_pick_offset);
253 return r_mval_pick_offset;
254}
#define BLI_assert(a)
Definition BLI_assert.h:50
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:130
int BLI_str_utf8_char_width_safe(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_str_utf8_size_safe(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
unsigned char uchar
unsigned int uint
#define UNLIKELY(x)
@ CONSOLE_LINE_INFO
@ CONSOLE_LINE_ERROR
@ CONSOLE_LINE_INPUT
@ CONSOLE_LINE_OUTPUT
#define UI_SCALE_FAC
void immUnbindProgram()
void immUniformThemeColor(int color_id)
void immBindBuiltinProgram(eGPUBuiltinShader shader_id)
GPUVertFormat * immVertexFormat()
void immRectf(uint pos, float x1, float y1, float x2, float y2)
@ GPU_SHADER_3D_UNIFORM_COLOR
@ GPU_FETCH_FLOAT
uint GPU_vertformat_attr_add(GPUVertFormat *, const char *name, GPUVertCompType, uint comp_len, GPUVertFetchMode)
@ GPU_COMP_F32
Read Guarded memory(de)allocation.
@ TH_CONSOLE_SELECT
@ TH_CONSOLE_ERROR
@ TH_CONSOLE_CURSOR
@ TH_CONSOLE_INFO
@ TH_CONSOLE_OUTPUT
@ TH_CONSOLE_INPUT
@ TH_TEXT
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
void console_textview_main(SpaceConsole *sc, const ARegion *region)
void console_scrollback_prompt_end(SpaceConsole *sc, ConsoleLine *cl_dummy)
static enum eTextViewContext_LineFlag console_line_data(TextViewContext *tvc, uchar fg[4], uchar[4], int *, uchar[4], uchar[4])
int console_textview_height(SpaceConsole *sc, const ARegion *region)
void console_scrollback_prompt_begin(SpaceConsole *sc, ConsoleLine *cl_dummy)
static int console_textview_step(TextViewContext *tvc)
static void console_textview_const_colors(TextViewContext *, uchar bg_sel[4])
static int console_textview_begin(TextViewContext *tvc)
static void console_textview_line_get(TextViewContext *tvc, const char **r_line, int *r_len)
static void console_textview_draw_rect_calc(const ARegion *region, rcti *r_draw_rect, rcti *r_draw_rect_outer)
static void console_textview_end(TextViewContext *tvc)
int console_char_pick(SpaceConsole *sc, const ARegion *region, const int mval[2])
static void console_textview_draw_cursor(TextViewContext *tvc, int cwidth, int columns)
static int console_textview_main__internal(SpaceConsole *sc, const ARegion *region, const bool do_draw, const int mval[2], void **r_mval_pick_item, int *r_mval_pick_offset)
static void console_cursor_wrap_offset(const char *str, int width, int *row, int *column, const char *end)
#define str(s)
uint col
format
void *(* MEM_mallocN)(size_t len, const char *str)
Definition mallocn.cc:44
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
return ret
void * last
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
void(* draw_cursor)(TextViewContext *tvc, int cwidth, int columns)
Definition textview.hh:53
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_FG
Definition textview.hh:14