From d739893046ed58367a47561397c98414560f6cb7 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 18 Oct 2025 20:02:54 +1100 Subject: [PATCH] code cleanup, fixes and start work on reimplementing scroll animation --- src/editor/buffer.d | 114 ++++++++------------ src/editor/editor.d | 33 ++---- src/editor/ui.d | 254 ++++++++++++++++++++++++++++++-------------- 3 files changed, 226 insertions(+), 175 deletions(-) diff --git a/src/editor/buffer.d b/src/editor/buffer.d index 10e3a83..cc346de 100644 --- a/src/editor/buffer.d +++ b/src/editor/buffer.d @@ -11,6 +11,7 @@ struct FlatBuffer Tokenizer tk; Arena arena; Arena ls_arena; + LineBuffers linebufs; u8[] file_name; @@ -18,16 +19,17 @@ struct FlatBuffer u8* pbuf; u64 length; - LineStart[] lines; + Line[] lines; u64 line_count; i64 pos; - i64 line_offset; - i64 rows; + i64 col_pos; I64Vec2 sel; SelectMode sel_mode; + f32 view_width; + bool dirty; } @@ -40,7 +42,7 @@ enum SelectMode alias SM = SelectMode; -struct LineStart +struct Line { u64 pos; u64 length; @@ -107,6 +109,9 @@ const bool[128] SYM_TOKENS = [ ';': true, ]; +const LineBuffer g_nil_line_buf; +LineBuffer* g_NIL_LINE_BUF; + const u64 SPACING = 2; const u64 BUF_START = 1; @@ -118,6 +123,8 @@ CreateFlatBuffer(u8[] data, u8[] file_name) ls_arena: CreateArena(KB(512)), }; + g_NIL_LINE_BUF = cast(LineBuffer*)&g_nil_line_buf; + Init(&fb, data, file_name); fb.tk = CreateTokenizer(&fb); Fix(&fb); @@ -137,6 +144,7 @@ Init(FlatBuffer* fb, u8[] data, u8[] file_name) fb.length = data.length; fb.sel = -1; fb.sel_mode = SM.None; + fb.linebufs = CreateLineBuffers(MB(1)); SetBuffers(fb, buf); @@ -154,6 +162,7 @@ void Change(FlatBuffer* fb, u8[] data, u8[] file_name) { Free(fb._buf); + Reset(&fb.linebufs.arena); Init(fb, data, file_name); ResetTokenizer(&fb.tk, fb._buf.length); @@ -199,10 +208,10 @@ Fix(FlatBuffer* fb) { Reset(&ls_arena); - lines = Alloc!(LineStart)(&ls_arena, line_count); + lines = Alloc!(Line)(&ls_arena, line_count); lines[0].pos = 0; - LineStart* prev = null; + Line* prev = null; u16 ignore, pending_level, level; u64 ls_idx = 1; for(u64 i = 0; i < length; i += 1) @@ -347,8 +356,6 @@ Insert(FlatBuffer* fb, u8[] insert, u64 length, u64 pos) Fix(fb); Reset(&fb.arena); - - UpdateOffset(fb); } void @@ -448,52 +455,35 @@ LineLength(FlatBuffer* fb, u64 line) } void -GetLines(FlatBuffer* fb, LineBuffers* linebufs, u64 length) +StartLineBuffer(FlatBuffer* fb, f32 view_width) { - fb.rows = length; - GetLines(fb, linebufs, fb.line_offset, length); + Reset(&fb.linebufs.arena); + fb.view_width = view_width; } -pragma(inline) void -SliceLineBuffer(FlatBuffer* fb, LineBuffers* lbufs, LineStart* ls) +LineBuffer* +GetLine(FlatBuffer* fb, u64 line) { - LineBuffer* lbuf = Alloc!(LineBuffer)(&lbufs.arena); + LineBuffer* lbuf = g_NIL_LINE_BUF; + + if(line < fb.lines.length) + { + lbuf = SliceLineBuffer(fb, &fb.lines[line]); + } + + return lbuf; +} + +pragma(inline) LineBuffer* +SliceLineBuffer(FlatBuffer* fb, Line* ls) +{ + LineBuffer* lbuf = Alloc!(LineBuffer)(&fb.linebufs.arena); lbuf.text = fb.pbuf[ls.pos .. ls.pos+ls.length]; lbuf.style = fb.tk.ptokens[ls.pos .. ls.pos+ls.length]; - lbufs.count += 1; + fb.linebufs.count += 1; - SLLPush(lbufs, lbuf, null); -} - -void -GetLines(FlatBuffer* fb, LineBuffers* linebufs, u64 start_line, u64 length) -{ - assert(linebufs != null, "GetLines failure: linebufs is null"); - - Reset(&linebufs.arena); - linebufs.first = linebufs.last = null; - linebufs.count = 0; - - u64 total_lines = fb.lines.length; - linebufs.start = Min(start_line, total_lines); - linebufs.end = Min(start_line + length, total_lines); - - if(fb.length == 0) - { - SliceLineBuffer(fb, linebufs, &fb.lines[0]); - } - else if(linebufs.start == linebufs.end) with(fb) - { - SliceLineBuffer(fb, linebufs, &lines[linebufs.start]); - } - else with(linebufs) - { - for(u64 i = start; i < end; i += 1) - { - SliceLineBuffer(fb, linebufs, &fb.lines[i]); - } - } + return lbuf; } void @@ -542,6 +532,7 @@ MoveUp(FlatBuffer* fb, u64 col) { u64 end = fb.lines[line].pos-1; line -= 1; + col = Max(col, fb.col_pos); fb.pos = Min(fb.lines[line].pos+col, end); } } @@ -561,6 +552,7 @@ MoveDown(FlatBuffer* fb, u64 col) line += 1; fb.pos = fb.lines[line].pos; u64 end = fb.lines.length > line+1 ? fb.lines[line+1].pos-1 : fb.length; + col = Max(col, fb.col_pos); fb.pos = Min(fb.pos+col, end); } } @@ -875,7 +867,11 @@ Move(FlatBuffer* fb, Input key, Modifier md) } } - UpdateOffset(fb); + if(key == Input.Left || key == Input.Right) + { + fb.col_pos = LinePos(fb, fb.pos); + } + UpdateSelection(fb); Logf("selection %s", fb.sel.v); @@ -897,30 +893,6 @@ UpdateSelection(FlatBuffer* fb) } } -void -UpdateOffset(FlatBuffer* fb) -{ - if(fb.rows > 0) with(fb) - { - i64 screen_pos = CurrentLine(fb) - line_offset; - i64 start = 0; - i64 end = rows-2; - Logf("p %s start %s end %s", screen_pos, start, end); - if(line_offset > 0 && screen_pos < start) - { - line_offset += screen_pos; - Logf("scroll up %s", line_offset); - } - else if(screen_pos > end) - { - line_offset += screen_pos - end; - Logf("scroll down %s", line_offset); - } - } - - assert(fb.line_offset <= fb.line_count); -} - void Backspace(FlatBuffer* fb) { diff --git a/src/editor/editor.d b/src/editor/editor.d index a6608b5..e5f8789 100644 --- a/src/editor/editor.d +++ b/src/editor/editor.d @@ -51,14 +51,12 @@ struct Editor FlatBuffer buf; Tokenizer tk; - LineBuffers linebufs; Vec2 cursor_pos; Vec2 select_start; Vec2 select_end; f32 text_size; - u64 line_offset; } struct ChangeStacks @@ -161,24 +159,6 @@ Cycle(EditorCtx* ctx, Inputs* inputs) } EndUI(); - - /* - if(ctx.state == ES.CmdOpen) - { - if(ctx.cmd.commands.length == 0 && ctx.cmd.icount == 0) - { - GetCommands(&ctx.cmd); - } - - CommandPalette(&ctx.cmd); - } - - DrawPanels(ctx.base_panel); - */ - - //EndBuild(); - - // UI Functions Before This Point } @@ -241,10 +221,14 @@ InitEditorCtx(PlatformWindow* window) UIPanel* CreatePanel(EditorCtx* ctx, SizeType size_type = ST.Percentage) { - UIPanel* p = Alloc!(UIPanel)(&ctx.arena); - p.axis = A2D.Y; - p.id = Alloc!(u8)(&ctx.arena, 10); - p.pct = 1.0; + UIPanel* p = Alloc!(UIPanel)(&ctx.arena); + p.axis = A2D.Y; + p.id = Alloc!(u8)(&ctx.arena, 10); + p.pct = 1.0; + p.scroll_offset = 0.0; + p.scroll_target = 0.0; + p.scroll_begin = -1.0; + (cast(char[])p.id).sformat("##%08s", ctx.panel_id); p.parent = p.first = p.last = p.next = p.prev = g_UI_NIL_PANEL; @@ -395,7 +379,6 @@ CreateEditor(EditorCtx* ctx) ed.arena = CreateArena(MB(4)); ed.buf = CreateFlatBuffer([], []); - ed.linebufs = CreateLineBuffers(MB(1)); return ed; } diff --git a/src/editor/ui.d b/src/editor/ui.d index d5332ce..d19f5e6 100644 --- a/src/editor/ui.d +++ b/src/editor/ui.d @@ -9,31 +9,32 @@ import editor; import std.stdio; import std.math.traits : isNaN; import std.math.rounding : ceil; +import std.math.exponential : pow; import std.format : sformat; import core.stdc.string : memset; import core.stdc.math : fabsf; import std.conv; import core.stdc.stdio : sprintf; -const Vec4[4] DEFAULT_COL = Vec4(0.13, 0.13, 0.13, 1.0); +const Vec4[4] BG_COL = Vec4(0.13, 0.13, 0.13, 1.0); const Vec4[4] CMD_PALETTE_COL = Vec4(0.21, 0.21, 0.21, 1.0); -const Vec4[4] DEFAULT_BORDER_COL = Vec4(0.254, 0.254, 0.266, 1.0); +const Vec4[4] BORDER_COL = Vec4(0.254, 0.254, 0.266, 1.0); -const Vec4[4] HL_BORDER_COL = Vec4(0.035, 0.549, 0.824, 1.0); +const Vec4[4] BORDER_COL_HL = Vec4(0.035, 0.549, 0.824, 1.0); -const Vec4[4] LC_COLOR = Vec4(0.12, 0.12, 0.12, 1.0); +const Vec4[4] LINECOUNT_COL = Vec4(0.12, 0.12, 0.12, 1.0); -const Vec4[4] LC_HL_COLOR = Vec4(0.012, 0.176, 0.29, 1.0); +const Vec4[4] LINECOUNT_COL_HL = Vec4(0.012, 0.176, 0.29, 1.0); -const Vec4[4] CMD_PALETTE_INPUT_HL = Vec4(0.24, 0.45, 0.81, 1.0); +const Vec4[4] CMD_BORDER_COL = Vec4(0.003, 0.48, 0.68, 1.0); -const Vec4[4] CMD_INPUT_BORDER_COL = Vec4(0.003, 0.48, 0.68, 1.0); +const Vec4[4] CMD_BORDER_COL_HL = Vec4(0.05, 0.56, 0.76, 1.0); -const Vec4[4] CMD_INPUT_BORDER_HL = Vec4(0.05, 0.56, 0.76, 1.0); +const Vec4[4] CMD_COL_HL = Vec4(0.24, 0.45, 0.81, 1.0); -const Vec4[4] CMD_PALETTE_INPUT_COL = [ +const Vec4[4] CMD_COL = [ Vec4(0.14, 0.14, 0.14, 1.0), Vec4(0.14, 0.14, 0.14, 1.0), Vec4(0.17, 0.17, 0.17, 1.0), @@ -43,7 +44,9 @@ const Vec4[4] CMD_PALETTE_INPUT_COL = [ const u64 VERTEX_MAX_COUNT = 10000; // TODO: add setting -const f32 TEXT_SIZE = 16.0; +const f32 TEXT_SIZE = 16.0; +const f32 SCROLL_SPEED = 48.0; +const f32 LINE_COUNT_PADDING = 4.0; const UIPanel g_ui_nil_panel; @@ -143,6 +146,7 @@ struct UICtx u8[] font_data; FontFace font; FontAtlasBuf atlas_buf; + f32 char_width; UIBuffer[FRAME_OVERLAP] buffers; @@ -153,6 +157,19 @@ struct UICtx UIPanel* parent; UIPanel* focused_panel; + f32 corner_radius; + f32 border_thickness; + f32 edge_softness; + Vec4[4] bg_col; + Vec4[4] border_col; + Vec4[4] border_col_hl; + Vec4[4] line_count_col; + Vec4[4] line_count_col_hl; + Vec4[4] cmd_col; + Vec4[4] cmd_col_hl; + Vec4[4] cmd_border_col; + Vec4[4] cmd_border_col_hl; + debug bool dbg; } @@ -260,7 +277,6 @@ struct UIKey struct UIPanel { - AnimState anim; u8[] id; Editor* ed; @@ -278,14 +294,14 @@ struct UIPanel Rect rect; Vec2 size; -} -struct AnimState -{ - f32 start_value; - f32 end_value; - f32 start_time; - f32 remaining_time; + i64 start_ln; + i64 end_ln; + i64 vis_lines; + i64 prev_start_ln; + f32 scroll_offset; + f32 scroll_begin; + f32 scroll_target; } struct TextPart @@ -302,8 +318,21 @@ BeginUI(EditorCtx* edctx, Inputs* inputs) Reset(&ctx.temp_arena); - ctx.f_idx = ctx.frame%FRAME_OVERLAP; - ctx.inputs = inputs; + ctx.f_idx = ctx.frame%FRAME_OVERLAP; + ctx.inputs = inputs; + ctx.char_width = GlyphWidth(&ctx.atlas_buf.atlas.glyphs['0']); + ctx.corner_radius = 2.0; + ctx.edge_softness = 0.1; + ctx.border_thickness = 2.0; + ctx.bg_col = BG_COL; + ctx.border_col = BORDER_COL; + ctx.border_col_hl = BORDER_COL_HL; + ctx.line_count_col = LINECOUNT_COL; + ctx.line_count_col_hl = LINECOUNT_COL_HL; + ctx.cmd_col = CMD_COL; + ctx.cmd_col_hl = CMD_COL_HL; + ctx.cmd_border_col = CMD_BORDER_COL; + ctx.cmd_border_col_hl = CMD_BORDER_COL_HL; PrepRendering(ctx); @@ -326,6 +355,18 @@ EndUI() ctx.frame += 1; } +f32 +LineCounterWidth(u32 char_width) +{ + return f32(char_width)*GetCtx().char_width + LINE_COUNT_PADDING*2.0; +} + +Vec2 +InnerSize(UIPanel* panel) +{ + return panel.size - Vec2(g_ui_ctx.border_thickness*2.0); +} + void SetPanelSizes(UIPanel* panel) { @@ -357,13 +398,10 @@ SetPanelSizes(UIPanel* panel) } pragma(inline) void -DrawChar(FontAtlas* atlas, u8 ch, f32* x_pos, f32 y, Vec4 col = Vec4(1.0)) +DrawChar(u8 ch, f32* x_pos, f32 y, Vec4 col = Vec4(1.0)) { - if(ch < atlas.glyphs.length) - { - Glyph* g = atlas.glyphs.ptr + ch; - DrawGlyph(g, 1.0, x_pos, y, col); - } + Glyph* g = GetGlyph(ch); + DrawGlyph(g, 1.0, x_pos, y, col); } bool @@ -381,6 +419,58 @@ PrintInputs() return result; } +f32 +EaseOutQuint(f32 x) +{ + return 1.0 - pow(1.0 - x, 5); +} + +void +SetScrollOffset(UIPanel* panel) +{ + U64Vec2 pos = VecPos(&panel.ed.buf); + + if(pos.y > 0) + { + Logf("y %s start %s end %s prev %s", pos.y, panel.start_ln, panel.end_ln, panel.prev_start_ln); + } + + if((pos.y < panel.start_ln || pos.y > panel.end_ln)) + { + f32 off = f32(panel.start_ln - panel.prev_start_ln)*TEXT_SIZE; + panel.scroll_target += off; + panel.prev_start_ln = panel.start_ln; + + if(panel.scroll_begin == -1.0) + { + panel.scroll_begin = panel.scroll_offset; + } + } + + if(panel.scroll_begin != -1.0) + { + f32 min, max; + if(panel.scroll_offset > panel.scroll_target) + { + min = panel.scroll_target; + max = panel.scroll_offset; + } + else + { + min = panel.scroll_offset; + max = panel.scroll_target; + } + + panel.scroll_offset = EaseOutQuint(Remap(panel.scroll_offset, min, max, 0.0, 1.0)) * g_delta; + + if(panel.scroll_offset - panel.scroll_target < 0.0009) + { + panel.scroll_offset = panel.scroll_target; + panel.scroll_begin = -1.0; + } + } +} + void Panel(UIPanel* panel) { @@ -428,67 +518,62 @@ Panel(UIPanel* panel) SetFocusedPanel(panel); } - i64 rows = cast(i64)ceil(panel.size.y/TEXT_SIZE); + Vec2 inner = InnerSize(panel); - GetLines(&ed.buf, &ed.linebufs, rows); + panel.start_ln = cast(u64)(floor(panel.scroll_offset/TEXT_SIZE)); + panel.end_ln = panel.start_ln + cast(u64)(ceil(inner.y/TEXT_SIZE)); + panel.vis_lines = panel.end_ln - panel.start_ln; char[64] ch_buf = '\0'; - char[] fmt = ch_buf.sformat("%%0%ss", u64(ed.linebufs.end.toChars().length)); + char[] fmt = ch_buf.sformat("%%0%ss", u64(panel.end_ln.toChars().length)); - u8[] end_line_text = ScratchAlloc!(u8)(ed.linebufs.end.toChars().length, '0'); + f32 lc_w = panel.end_ln.toChars().length*ctx.char_width + LINE_COUNT_PADDING*2.0; + f32 code_view_width = inner.x-lc_w; - f32 lcw = CalcTextWidth(end_line_text); - f32 padding = 4.0; + StartLineBuffer(&panel.ed.buf, code_view_width); + + //SetScrollOffset(panel); - f32 border = 2.0, radius = 2.0, softness = 0.1; + U64Vec2 pos = VecPos(&ed.buf); - DrawRect(panel.rect.vec0, panel.size, radius, border, DEFAULT_COL); - DrawRect(panel.rect.vec0, Vec2(lcw+padding*2, panel.size.y), 0.0, 0.0, focused ? LC_HL_COLOR : LC_COLOR); - DrawBorder(panel.rect.vec0, panel.size, border, radius, softness, focused ? HL_BORDER_COL : DEFAULT_BORDER_COL); + DrawPanel(panel, lc_w, focused); f32 x = panel.rect.x0; - f32 y = panel.rect.y0 + TEXT_SIZE; + f32 y = panel.rect.y0 + TEXT_SIZE - (panel.scroll_offset % TEXT_SIZE); - f32 code_view_width = panel.size.x-lcw-border*2.0-padding*2.0; - FontAtlas* atlas = &ctx.atlas_buf.atlas; - bool edit = EditModeActive(); - U64Vec2 pos = VecPos(&ed.buf); - u64 i; - for(auto buf = ed.linebufs.first; buf != null; buf = buf.next, i += 1) + u64 i = panel.start_ln; + for(auto buf = GetLine(&ed.buf, i); !CheckNil(g_NIL_LINE_BUF, buf) && i < panel.end_ln; i += 1, buf = GetLine(&ed.buf, i)) { - f32 x_pos = x + padding; - - DrawLineCount(atlas, fmt, &x_pos, y, ed.linebufs.start+i); - - x_pos += padding; + f32 x_pos = x + LINE_COUNT_PADDING; + DrawLineCount(fmt, &x_pos, y, i); u64 ch_offset; auto parts = MakeMultiline(buf.text, code_view_width, buf.style); if(parts == null) { - if(pos.y == ed.buf.line_offset+i) + if(pos.y == i) { - DrawCursor(atlas, [], 0, x+lcw+padding*2.0, y, ch_offset, edit); + DrawCursor([], 0, x+lc_w, y, ch_offset); } } else for(auto n = parts; n != null; n = n.next) { auto l = &n.value; - if(pos.y == ed.buf.line_offset+i) + if(pos.y == i) { - DrawCursor(atlas, l.text, pos.x, x+lcw+padding*2.0, y, ch_offset, edit); + DrawCursor(l.text, pos.x, x+lc_w, y, ch_offset); } foreach(j; 0 .. l.text.length) { - bool hl = pos.y == i && !edit && j == pos.x-ch_offset; - DrawChar(atlas, l.text[j], &x_pos, y, hl ? Vec4(Vec3(0.0), 1.0) : SYNTAX_COLORS[l.style[j]]); + bool hl = pos.y == i && !EditModeActive() && j == pos.x-ch_offset; + DrawChar(l.text[j], &x_pos, y, hl ? Vec4(Vec3(0.0), 1.0) : SYNTAX_COLORS[l.style[j]]); } y += TEXT_SIZE; - x_pos = x + lcw + padding*2.0; + x_pos = x + lc_w + LINE_COUNT_PADDING*2.0; ch_offset += l.text.length; } } @@ -496,7 +581,7 @@ Panel(UIPanel* panel) } pragma(inline) void -DrawCursor(FontAtlas* atlas, u8[] text, u64 ch_x, f32 x, f32 y, u64 offset, bool edit) +DrawCursor(u8[] text, u64 ch_x, f32 x, f32 y, u64 offset) { Glyph* g = GetGlyph(' '); foreach(j; 0 .. text.length) @@ -511,19 +596,21 @@ DrawCursor(FontAtlas* atlas, u8[] text, u64 ch_x, f32 x, f32 y, u64 offset, bool x += GlyphWidth(g); } - DrawRect(x, y, atlas, cast(u8)g.ch, Vec4(1.0), edit); + DrawRect(x, y, cast(u8)g.ch, Vec4(1.0), EditModeActive()); } pragma(inline) void -DrawLineCount(FontAtlas* atlas, char[] fmt, f32* x_pos, f32 y, u64 line) +DrawLineCount(char[] fmt, f32* x_pos, f32 y, u64 line) { char[32] line_buf = '\0'; char[] line_str = sformat(line_buf, fmt, line+1); foreach(j; 0 .. line_str.length) { - DrawChar(atlas, line_str[j], x_pos, y, Vec4(1.0)); + DrawChar(line_str[j], x_pos, y, Vec4(1.0)); } + + *x_pos += LINE_COUNT_PADDING; } void @@ -541,9 +628,7 @@ CommandPalette(CmdPalette* cmd) f32 w = size.x*0.7; f32 h = 40.0; - f32 corner_r = 2.0, edge_softness = 0.1, border_thickness = 2.0; - - DrawBorderedRect(Vec2(x, y), Vec2(w, h), border_thickness, corner_r, edge_softness, CMD_PALETTE_INPUT_COL, CMD_INPUT_BORDER_COL); + DrawCmdRect(Vec2(x, y), Vec2(w, h), false); f32 y_off = h*0.5 + 6; f32 ch_x = x + 6.0; @@ -551,7 +636,7 @@ CommandPalette(CmdPalette* cmd) foreach(i; 0 .. text.length) { - DrawChar(&ctx.atlas_buf.atlas, text[i], &ch_x, ch_y, Vec4(1.0)); + DrawChar(text[i], &ch_x, ch_y, Vec4(1.0)); } for(u64 i = 0; i < options.length; i += 1) @@ -560,19 +645,11 @@ CommandPalette(CmdPalette* cmd) ch_x = x + 6.0; ch_y = y + y_off; - DrawBorderedRect( - Vec2(x, y), - Vec2(w, h), - border_thickness, - corner_r, - edge_softness, - cmd.selected == i ? CMD_PALETTE_INPUT_HL : CMD_PALETTE_INPUT_COL, - cmd.selected == i ? CMD_INPUT_BORDER_HL : CMD_INPUT_BORDER_COL - ); + DrawCmdRect(Vec2(x, y), Vec2(w, h), cmd.selected == i); foreach(j; 0 .. options[i].length) { - DrawChar(&ctx.atlas_buf.atlas, options[i][j], &ch_x, ch_y, Vec4(1.0)); + DrawChar(options[i][j], &ch_x, ch_y, Vec4(1.0)); } if(y+h > size.y+h) break; @@ -1136,10 +1213,28 @@ GetVertex(UICtx* ctx) } pragma(inline) void -DrawBorderedRect(Vec2 pos, Vec2 size, f32 border, f32 radius, f32 softness, Vec4[4] cols, Vec4[4] border_col) +DrawCmdRect(Vec2 pos, Vec2 size, bool edit) { - DrawRect(pos, size, radius, border, cols); - DrawBorder(pos, size, border, radius, softness, border_col); + UICtx* ctx = GetCtx(); + + Vec4[4] bg_col = edit ? ctx.cmd_col_hl : ctx.cmd_col; + Vec4[4] border_col = edit ? ctx.cmd_border_col_hl : ctx.cmd_border_col; + + DrawRect(pos, size, ctx.corner_radius, ctx.border_thickness, bg_col); + DrawBorder(pos, size, ctx.border_thickness, ctx.corner_radius, ctx.edge_softness, border_col); +} + +pragma(inline) void +DrawPanel(UIPanel* panel, f32 lc_w, bool focus) +{ + UICtx* ctx = GetCtx(); + + Vec2 pos = panel.rect.vec0; + Vec2 size = panel.size; + + DrawRect(pos, size, ctx.corner_radius, ctx.border_thickness, ctx.bg_col); + DrawRect(pos, Vec2(lc_w, size.y), 0.0, 0.0, focus ? ctx.line_count_col_hl : ctx.line_count_col); + DrawBorder(pos, size, ctx.border_thickness, ctx.corner_radius, ctx.edge_softness, focus ? ctx.border_col_hl : ctx.border_col); } pragma(inline) Glyph* @@ -1150,7 +1245,7 @@ GetGlyph(u8 ch) } pragma(inline) void -DrawRect(f32 x, f32 y, FontAtlas* atlas, u8 ch, Vec4 col, bool edit_mode) +DrawRect(f32 x, f32 y, u8 ch, Vec4 col, bool edit_mode) { Glyph* g = GetGlyph(ch); Vec4[4] cols = col; @@ -1158,9 +1253,10 @@ DrawRect(f32 x, f32 y, FontAtlas* atlas, u8 ch, Vec4 col, bool edit_mode) } pragma(inline) void -DrawRect(Vec2 pos, Vec2 size, f32 corner_radius, f32 border, Vec4[4] cols) +DrawRect(Vec2 pos, Vec2 size, f32 corner_radius, f32 border_thickness, Vec4[4] cols) { - DrawRect(pos.x, pos.y, size.x, size.y, corner_radius, border, cols); + UICtx* ctx = GetCtx(); + DrawRect(pos.x, pos.y, size.x, size.y, corner_radius, border_thickness, cols); } void