From c955a2621bb10055c5025b96bfb91f73d642f3f5 Mon Sep 17 00:00:00 2001 From: Patrick Cleavelin Date: Sat, 10 Feb 2024 17:12:44 -0600 Subject: [PATCH] add fancy animation to sidebar --- Makefile | 2 ++ plugins/lua/view.lua | 39 ++++++++++++++++++++++++++++++++------- src/core/file_buffer.odin | 11 ++++++++++- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index e8079ff..a88b2d8 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,8 @@ all: editor editor: src/*.odin grep odin_highlighter + odin build src/ -out:bin/editor.o -build-mode:obj -debug + dsymutil bin/editor.o -o bin/editor.dw odin build src/ -out:bin/editor -lld odin_highlighter: diff --git a/plugins/lua/view.lua b/plugins/lua/view.lua index 5b50fc3..439e54b 100644 --- a/plugins/lua/view.lua +++ b/plugins/lua/view.lua @@ -4,7 +4,9 @@ local BufferSearchOpenElapsed = 0 local CurrentPreviewBufferIndex = Editor.get_current_buffer_index() local BufferSearchIndex = 0 +local SideBarSmoothedWidth = 128 local SideBarWidth = 128 +local SideBarClosed = false function buffer_list_iter() local idx = 0 @@ -30,13 +32,14 @@ function centered(ctx, label, axis, width, height, body) UI.pop_parent(ctx) end -function render_ui_window(ctx) - current_buffer_index = Editor.get_current_buffer_index() +function lerp(from, to, rate) + return (1 - rate) * from + rate*to +end - numFrames = 7 - CurrentPreviewBufferIndex = current_buffer_index +function ui_sidebar(ctx) + SideBarSmoothedWidth = slerp(SideBarSmoothedWidth, SideBarWidth, 0.3) - tabs = UI.push_rect(ctx, "tabs", false, false, UI.Vertical, UI.Exact(SideBarWidth), UI.Fill) + tabs = UI.push_rect(ctx, "sidebar", false, false, UI.Vertical, UI.Exact(SideBarSmoothedWidth), UI.Fill) UI.push_parent(ctx, tabs) UI.push_rect(ctx, "padded top open files", false, false, UI.Horizontal, UI.Fill, UI.Exact(8)) UI.push_parent(ctx, UI.push_rect(ctx, "padded open files", false, false, UI.Horizontal, UI.Fill, UI.ChildrenSum)) @@ -69,17 +72,39 @@ function render_ui_window(ctx) UI.spacer(ctx, "below tabs spacer") UI.pop_parent(ctx) +end + +function ui_tabs(ctx) + UI.buffer(ctx, CurrentPreviewBufferIndex) +end + +function render_ui_window(ctx) + current_buffer_index = Editor.get_current_buffer_index() + + numFrames = 7 + CurrentPreviewBufferIndex = current_buffer_index + + if not SidebarClosed or SideBarSmoothedWidth > 2 then + ui_sidebar(ctx) + end if UI.advanced_button(ctx, "side bar grab handle", {"DrawBorder", "Hoverable"}, UI.Exact(16), UI.Fill).dragging then x,y = UI.get_mouse_pos(ctx) SideBarWidth = x-8 + if SideBarWidth < 32 then + SidebarClosed = true + SideBarWidth = 0 + elseif SideBarWidth > 128 then + SidebarClosed = false + end + -- TODO: use some math.max function - if SideBarWidth < 128 then + if not SidebarClosed and SideBarWidth < 128 then SideBarWidth = 128 end end - UI.buffer(ctx, CurrentPreviewBufferIndex) + ui_tabs(ctx) render_buffer_search(ctx) end diff --git a/src/core/file_buffer.odin b/src/core/file_buffer.odin index 1d3b6d5..8013193 100644 --- a/src/core/file_buffer.odin +++ b/src/core/file_buffer.odin @@ -107,6 +107,10 @@ iterate_file_buffer :: proc(it: ^FileBufferIter) -> (character: u8, idx: FileBuf return character, it.cursor.index, true; } iterate_file_buffer_reverse_mangle_cursor :: proc(it: ^FileBufferIter) -> (character: u8, idx: FileBufferIndex, cond: bool) { + if len(it.buffer.content_slices[it.cursor.index.slice_index]) < 0 { + return character, idx, false; + } + character = it.buffer.content_slices[it.cursor.index.slice_index][it.cursor.index.content_index]; if it.cursor.index.content_index == 0 { if it.cursor.index.slice_index > 0 { @@ -889,6 +893,10 @@ delete_content :: proc(buffer: ^FileBuffer, amount: int) { amount := amount - len(buffer.input_buffer); runtime.clear(&buffer.input_buffer); + if len(buffer.content_slices) < 1 { + return; + } + split_content_slice(buffer); it := new_file_buffer_iter_with_cursor(buffer, buffer.cursor); @@ -898,8 +906,9 @@ delete_content :: proc(buffer: ^FileBuffer, amount: int) { for i in 0..