diff --git a/src/VulkanRenderer b/src/VulkanRenderer index 0be80e3..cd9e3bb 160000 --- a/src/VulkanRenderer +++ b/src/VulkanRenderer @@ -1 +1 @@ -Subproject commit 0be80e3a3ec2acfc51f6591803bbe3f889389d22 +Subproject commit cd9e3bb36a68c4c3fd8248afe8abc9930e759f38 diff --git a/src/dlib b/src/dlib index 4f3082f..a97309c 160000 --- a/src/dlib +++ b/src/dlib @@ -1 +1 @@ -Subproject commit 4f3082f71d5a877dc34163dac5f1b12a02d5a02c +Subproject commit a97309cb04e0e802047586a5bacbacc9b8e9649b diff --git a/src/editor/buffer.d b/src/editor/buffer.d index b865459..8f73444 100644 --- a/src/editor/buffer.d +++ b/src/editor/buffer.d @@ -47,6 +47,8 @@ struct LineBuffers LineBuffer* first; LineBuffer* last; u64 count; + u64 start; + u64 end; } struct LineBuffer @@ -125,7 +127,7 @@ CreateFlatBuffer(u8[] data) void Change(FlatBuffer* fb, u8[] data) { - FreeArray(fb.data); + Free(fb.data); u64 cap = data.length > 0 ? RoundUp(cast(u64)(data.length) * 2, KB(4)) : KB(4); @@ -157,7 +159,7 @@ Fix(FlatBuffer* fb) with(fb) { Reset(&ls_arena); - line_starts = AllocArray!(LineStart)(&ls_arena, lf_count+1); + line_starts = Alloc!(LineStart)(&ls_arena, lf_count+1); line_starts[0].pos = 0; u16 ignore, pending_level, level; @@ -223,8 +225,8 @@ Insert(FlatBuffer* fb, u8[] insert, u64 length, u64 pos) { if(fb.length + length > fb.data.length) { - fb.tk.buffer = ReallocArray!(TokenStyle)(fb.tk.buffer, fb.data.length*2); - fb.data = ReallocArray!(u8)(fb.data, fb.data.length*2); + fb.tk.buffer = Realloc!(TokenStyle)(fb.tk.buffer, fb.data.length*2); + fb.data = Realloc!(u8)(fb.data, fb.data.length*2); } u64 prev_lf = fb.lf_count; @@ -281,7 +283,7 @@ Insert(FlatBuffer* fb, u8[] insert, u64 length, u64 pos) u64 temp_len = fb.length-pos; - u8[] temp = AllocCopySlice!(u8)(&fb.arena, fb.data, pos, temp_len); + u8[] temp = Alloc!(u8)(&fb.arena, fb.data, pos, temp_len); fb.data[pos .. pos+length] = insert[0 .. length]; pos += length; @@ -425,29 +427,29 @@ GetLines(FlatBuffer* fb, LineBuffers* linebufs, u64 start_line, u64 length) linebufs.count = 0; u64 total_lines = fb.line_starts.length; - start_line = Min(start_line, total_lines); - u64 end_line = Min(start_line + length, total_lines); + linebufs.start = Min(start_line, total_lines); + linebufs.end = Min(start_line + length, total_lines); if(fb.length == 0) { linebufs.first.text = Alloc!(u8)(&linebufs.arena, 1); linebufs.first.style = Alloc!(TS)(&linebufs.arena, 1); } - else if(start_line == end_line) with(fb) + else if(linebufs.start == linebufs.end) with(fb) { - SliceLineBuffer(fb, linebufs, linebufs.first, line_starts[start_line].pos, LineLength(fb, start_line)); + SliceLineBuffer(fb, linebufs, linebufs.first, line_starts[linebufs.start].pos, LineLength(fb, linebufs.start)); } else with(linebufs) { LineBuffer* current = first; - for(u64 i = start_line; i < end_line; i += 1) + for(u64 i = start; i < end; i += 1) { - u64 start = fb.line_starts[i].pos; + u64 start_pos = fb.line_starts[i].pos; u64 len = LineLength(fb, i); if(len > 0) { - SliceLineBuffer(fb, linebufs, current, start, len); + SliceLineBuffer(fb, linebufs, current, start_pos, len); current.next = Alloc!(LineBuffer)(&arena); current = current.next; } @@ -913,7 +915,7 @@ Delete(FlatBuffer* fb, u64 length, u64 pos) u8[] temp; if(end != fb.length) { - temp = AllocArray!(u8)(&fb.arena, fb.length-end); + temp = Alloc!(u8)(&fb.arena, fb.length-end); temp[0 .. temp.length] = fb.data[end .. fb.length]; fb.data[pos .. pos+temp.length] = temp[0 .. temp.length]; } diff --git a/src/editor/editor.d b/src/editor/editor.d index 56b02ec..f6f514a 100644 --- a/src/editor/editor.d +++ b/src/editor/editor.d @@ -209,7 +209,7 @@ InitEditorCtx(PlatformWindow* window) count += 1; } - ctx.file_names = AllocArray!(u8[])(&ctx.arena, count); + ctx.file_names = Alloc!(u8[])(&ctx.arena, count); count = 0; foreach(DirEntry e; dirEntries(".", SpanMode.breadth)) @@ -217,7 +217,7 @@ InitEditorCtx(PlatformWindow* window) if(indexOf(e.name, ".git") != -1 || e.isDir) continue; u64 start = indexOf(e.name, "./") == 0 ? 2 : 0; - ctx.file_names[count++] = AllocCopy!(u8)(&ctx.arena, CastStr!(u8)(e.name[start .. $])); + ctx.file_names[count++] = Alloc!(u8)(&ctx.arena, CastStr!(u8)(e.name[start .. $])); } } catch(Exception e) @@ -234,7 +234,7 @@ CreatePanel(EditorCtx* ctx, SizeType size_type = ST.Percentage) { UIPanel* p = Alloc!(UIPanel)(&ctx.arena); p.axis = A2D.Y; - p.id = AllocArray!(u8)(&ctx.arena, 10); + p.id = Alloc!(u8)(&ctx.arena, 10); p.pct = 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; @@ -866,7 +866,7 @@ GetCommands(CmdPalette* cmd) ]; Reset(&cmd.arena); - cmd.commands = AllocArray!(Command)(&cmd.arena, cmd_list.length); + cmd.commands = Alloc!(Command)(&cmd.arena, cmd_list.length); cmd.params = []; u8[] str = cmd.buffer[0 .. cmd.icount]; @@ -893,7 +893,7 @@ GetCommands(CmdPalette* cmd) cmd.commands = cmd.commands[0 .. count]; } - cmd.opt_strs = AllocArray!(u8[])(&cmd.arena, cmd.commands.length); + cmd.opt_strs = Alloc!(u8[])(&cmd.arena, cmd.commands.length); for(u64 i = 0; i < cmd.commands.length; i += 1) { cmd.opt_strs[i] = cmd.commands[i].name; @@ -1021,7 +1021,7 @@ Check(CmdPalette* cmd, u64 length) { if(cmd.icount+length >= cmd.buffer.length) { - cmd.buffer = ReallocArray!(u8)(cmd.buffer, cmd.buffer.length*2); + cmd.buffer = Realloc!(u8)(cmd.buffer, cmd.buffer.length*2); } } @@ -1047,8 +1047,8 @@ PopulateParams(CmdPalette* cmd, u8[][] strs) u8[] param = GetParam(cmd); if(cmd.params.length == 0 || !param.length) { - cmd.params = AllocArray!(Parameter)(&cmd.cmd_arena, strs.length); - cmd.opt_strs = AllocArray!(u8[])(&cmd.cmd_arena, strs.length); + cmd.params = Alloc!(Parameter)(&cmd.cmd_arena, strs.length); + cmd.opt_strs = Alloc!(u8[])(&cmd.cmd_arena, strs.length); for(u64 i = 0; i < cmd.params.length; i += 1) { @@ -1060,7 +1060,7 @@ PopulateParams(CmdPalette* cmd, u8[][] strs) if(param.length) { - cmd.opt_strs = AllocArray!(u8[])(&cmd.cmd_arena, strs.length); + cmd.opt_strs = Alloc!(u8[])(&cmd.cmd_arena, strs.length); u64 matches; for(u64 i = 0; i < cmd.params.length; i += 1) diff --git a/src/editor/parsing.d b/src/editor/parsing.d index 875e7a6..cecc039 100644 --- a/src/editor/parsing.d +++ b/src/editor/parsing.d @@ -436,7 +436,7 @@ void ResetTokenizer(FlatBuffer* fb) { Reset(&fb.tk.arena); - FreeArray(fb.tk.buffer); + Free(fb.tk.buffer); fb.tk.buffer = Alloc!(TS)(fb.data.length); fb.tk.pos = 0; diff --git a/src/editor/ui.d b/src/editor/ui.d index 3930a8c..cb615b8 100644 --- a/src/editor/ui.d +++ b/src/editor/ui.d @@ -1250,12 +1250,12 @@ MakeMultiline(u8[] text, f32 width, TS[] style = []) { u64 len = i-start; - u8[] str = ScratchAllocCopySlice!(u8)(text, start, len); + u8[] str = ScratchAlloc!(u8)(text, start, len); TS[] stl = []; if(style.length > 0) { - stl = ScratchAllocCopySlice!(TS)(style, start, len); + stl = ScratchAlloc!(TS)(style, start, len); } Node!(TextBuffer)* n = node; diff --git a/src/editor/widgets.d b/src/editor/widgets.d index ffbb03b..7be2221 100644 --- a/src/editor/widgets.d +++ b/src/editor/widgets.d @@ -77,7 +77,7 @@ struct UIPanel i64 start_row; i64 end_row; - Vec2 pos; + Rect rect; Vec2 size; } @@ -153,19 +153,21 @@ SetPanelSizes(UIPanel* panel) { UICtx* ctx = GetCtx(); - panel.size.x = ctx.res.x; - panel.size.y = ctx.res.y; - panel.pos = 0.0; + panel.size.x = ctx.res.x; + panel.size.y = ctx.res.y; + panel.rect.vec0 = 0.0; + panel.rect.vec1 = 0.0; static foreach(axis; A2D.min .. A2D.max) { for(UIPanel* p = panel; !Nil(p); p = Recurse(p)) { - f32 pos = p.pos.v[axis]; + f32 pos = p.rect.vec0.v[axis]; for(UIPanel* c = p.first; !Nil(c); c = c.next) { - c.pos.v[axis] = pos; - c.size.v[axis] = p.axis == axis ? c.pct * p.size.v[axis] : p.size.v[axis]; + c.size.v[axis] = p.axis == axis ? c.pct * p.size.v[axis] : p.size.v[axis]; + c.rect.vec0.v[axis] = pos; + c.rect.vec1.v[axis] = pos + c.size.v[axis]; if(axis == p.axis) { @@ -197,79 +199,64 @@ Panel2(UIPanel* panel) UIPanel* parent = panel.parent; UIPanel* prev = panel.prev; - Vec2 click_adjust = Vec2( + Axis2D pax = parent.axis; + + Vec2 adj = Vec2( parent.axis == A2D.X ? 10 : 0, parent.axis == A2D.Y ? 10 : 0 ); - if(!Nil(prev)) + Vec2 p0 = panel.rect.vec0-adj; + Vec2 p1 = panel.rect.vec1+adj; + + if(!Nil(prev)) with(panel) { - Vec2 p0 = panel.pos-click_adjust; - Vec2 p1 = panel.pos+panel.size+click_adjust; - - if(Dragged(item, p0, p1)) + if(Dragged(item, p0, p1) && item.dragged.v[pax] != 0.0) { - A2D axis = parent.axis; - f32 p_start = parent.pos.v[axis]; - f32 p_end = p_start + parent.size.v[axis]; - f32 drag = item.dragged.v[axis]; - - if(drag != 0.0) + f32 mov_pct = Remap(item.dragged.v[pax], 0.0, size.v[pax], 0.0, 1.0); + if(CheckPanelBounds(pct + mov_pct) && CheckPanelBounds(panel.prev.pct - mov_pct)) { - f32 pct = Remap(drag, 0.0, p_start-p_end, 0.0, 1.0); - if(CheckPanelBounds(panel.pct - pct) && CheckPanelBounds(panel.prev.pct + pct)) - { - panel.pct -= pct; - panel.prev.pct += pct; - } + pct += mov_pct; + panel.prev.pct -= mov_pct; } } } if(panel.ed != null) { - if(Clicked(item, panel.pos, panel.pos+panel.size-click_adjust)) + if(Clicked(item, p0, p1)) { SetFocusedPanel(panel); } - DrawBorderedRect(panel.pos, panel.size, 2.0, 2.0, 0.1, DEFAULT_COL, focused ? HL_BORDER_COL : DEFAULT_BORDER_COL); + DrawBorderedRect(panel.rect.vec0, panel.size, 2.0, 2.0, 0.1, DEFAULT_COL, focused ? HL_BORDER_COL : DEFAULT_BORDER_COL); i64 rows = cast(i64)ceil(panel.size.y/TEXT_SIZE); GetLines(&ed.buf, &ed.linebufs, rows); - i64 offset = ed.buf.offset; - i64 end = offset + ed.linebufs.count; - char[64] ch_buf = '\0'; - char[] fmt = ch_buf.sformat("%%0%ss", u64(end.toChars().length)); + char[] fmt = ch_buf.sformat("%%0%ss", u64(ed.linebufs.end.toChars().length)); - u8[] end_line_text = ScratchAlloc!(u8)(end.toChars().length); - end_line_text[] = '0'; + u8[] end_line_text = ScratchAlloc!(u8)(ed.linebufs.end.toChars().length, '0'); f32 lcw = CalcTextWidth(end_line_text); f32 padding = 4.0; - DrawRect(panel.pos, panel.pos+Vec2(lcw+padding*2, panel.size.y), 0.0, 0.0, focused ? LC_HL_COLOR : LC_COLOR); + DrawRect(panel.rect.vec0, panel.rect.vec1+Vec2(lcw+padding*2, panel.size.y), 0.0, 0.0, focused ? LC_HL_COLOR : LC_COLOR); - f32 x = panel.pos.x; - f32 y = panel.pos.y + TEXT_SIZE; + f32 x = panel.rect.x0; + f32 y = panel.rect.y0 + TEXT_SIZE; - auto atlas = &ctx.atlas_buf.atlas; + 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) { f32 x_pos = x + padding; - char[32] line_buf = '\0'; - char[] line_str = sformat(line_buf, fmt, offset+i); - foreach(j; 0 .. line_str.length) - { - DrawChar(&ctx.atlas_buf.atlas, line_str[j], &x_pos, y, Vec4(1.0)); - } + DrawLineCount(atlas, fmt, &x_pos, y, ed.linebufs.start+i); x_pos += padding; @@ -281,27 +268,13 @@ Panel2(UIPanel* panel) if(pos.y == i) { - f32 hl_x = x + lcw + padding*2.0; - Glyph* g = GetGlyph(' '); - foreach(j; 0 .. l.text.length) - { - bool hl = j == pos.x-ch_offset; - if(hl) - { - break; - } - - g = j == l.text.length-1 ? GetGlyph(' ') : GetGlyph(l.text[j]); - hl_x += GlyphWidth(g); - } - - DrawRect(hl_x, y, atlas, cast(u8)g.ch, Vec4(1.0), edit); + DrawCursor(atlas, l.text, pos.x, x+lcw+padding*2.0, y, ch_offset, edit); } foreach(j; 0 .. l.text.length) { bool hl = pos.y == i && !edit && j == pos.x-ch_offset; - DrawChar(&ctx.atlas_buf.atlas, l.text[j], &x_pos, y, hl ? Vec4(Vec3(0.0), 1.0) : SYNTAX_COLORS[l.style[j]]); + DrawChar(atlas, l.text[j], &x_pos, y, hl ? Vec4(Vec3(0.0), 1.0) : SYNTAX_COLORS[l.style[j]]); } y += TEXT_SIZE; @@ -312,6 +285,37 @@ Panel2(UIPanel* panel) } } +pragma(inline) void +DrawCursor(FontAtlas* atlas, u8[] text, u64 ch_x, f32 x, f32 y, u64 offset, bool edit) +{ + Glyph* g = GetGlyph(' '); + foreach(j; 0 .. text.length) + { + bool hl = j == ch_x-offset; + if(hl) + { + break; + } + + g = j == text.length-1 ? GetGlyph(' ') : GetGlyph(text[j]); + x += GlyphWidth(g); + } + + DrawRect(x, y, atlas, cast(u8)g.ch, Vec4(1.0), edit); +} + +pragma(inline) void +DrawLineCount(FontAtlas* atlas, char[] fmt, f32* x_pos, f32 y, u64 line) +{ + char[32] line_buf = '\0'; + char[] line_str = sformat(line_buf, fmt, line); + + foreach(j; 0 .. line_str.length) + { + DrawChar(atlas, line_str[j], x_pos, y, Vec4(1.0)); + } +} + f32 LineCounter2(UIPanel* panel, i64 start_row, i64 end_row) { @@ -338,14 +342,13 @@ LineCounter2(UIPanel* panel, i64 start_row, i64 end_row) sprintf(cast(char*)line_counts[i].ptr, fmt.ptr, start_row+i); } - max_line_text = ScratchAlloc!(u8)(width); - max_line_text[] = cast(u8)'0'; + max_line_text = ScratchAlloc!(u8)(width, '0'); } lc_width = CalcTextWidth(max_line_text) + padding*2.0; - f32 x = panel.pos.x + padding; - f32 y = panel.pos.y + TEXT_SIZE; + f32 x = panel.rect.x0 + padding; + f32 y = panel.rect.y0 + TEXT_SIZE; foreach(i; 0 .. line_counts.length) {