From c9aed019d53db3de9fb446a1e9df2b7675f3645d Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Wed, 24 Jul 2024 13:48:56 +0200 Subject: [PATCH] Refactor active windows --- src/text_editor/commands.cpp | 4 --- src/text_editor/commands_window.cpp | 34 ++++++++++----------- src/text_editor/management.cpp | 11 +++---- src/text_editor/text_editor.cpp | 46 ++++++++++++++--------------- src/text_editor/text_editor.h | 4 ++- src/text_editor/window.cpp | 6 ++-- 6 files changed, 49 insertions(+), 56 deletions(-) diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index 5a67831..d8caf2b 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -219,16 +219,12 @@ void ReloadFont(Int font_size) { void HandleGlobalCommands() { Window *command_window = GetWindow(CommandWindowID); - if (!IsActive(command_window)) { - command_window->visible = false; - } if (CtrlPress(KEY_P)) { if (command_window->visible) { SetActiveWindow(GetLastActiveWindow()); } else { SetActiveWindow(command_window->id); } - command_window->visible = !command_window->visible; } if (CtrlPress(KEY_MINUS)) { diff --git a/src/text_editor/commands_window.cpp b/src/text_editor/commands_window.cpp index b42fde2..e44b3c8 100644 --- a/src/text_editor/commands_window.cpp +++ b/src/text_editor/commands_window.cpp @@ -310,7 +310,7 @@ void HandleActiveWindowBindings(Window *window) { if (window->fuzzy_search && search) { Scratch scratch; - String16 first_line_string = GetLineStringWithoutNL(*buffer, 0); + String16 first_line_string = GetLineString(*buffer, 0); Array ratings = FuzzySearchLines(scratch, buffer, 1, buffer->line_starts.len, first_line_string); Buffer *temp_buffer = CreateTempBuffer(scratch, buffer->cap); @@ -340,13 +340,6 @@ void HandleActiveWindowBindings(Window *window) { Command_Replace(&view, L"\n"); Command_SelectRange(&view, {}); } else { - - if (window->id.id == CommandWindowID.id) { - Window *command_window = GetWindow(CommandWindowID); - command_window->visible = !command_window->visible; - ActiveWindow = GetLastActiveWindow(); - } - { Window *window = GetWindow(GetLastActiveWindow()); View *view = GetView(window->active_view); @@ -475,12 +468,11 @@ void HandleActiveWindowBindings(Window *window) { void HandleWindowBindings(Window *window) { ProfileFunction(); - View &view = *GetActiveView(window); - Buffer *buffer = GetBuffer(view.buffer_id); + View &view = *GetActiveView(window); + Buffer *buffer = GetBuffer(view.buffer_id); + bool is_active = IsActive(window); - if (IsActive(window)) { - HandleActiveWindowBindings(window); - } + if (is_active) HandleActiveWindowBindings(window); // Clip scroll { @@ -498,21 +490,27 @@ void HandleWindowBindings(Window *window) { void ChangeActiveWindowAndScroll(Array &order) { For(order) { Window *window = &Windows[it]; - View *view = GetActiveView(window); - Vec2 mouse = GetMousePosition(); - bool mouse_in_window = CheckCollisionPointRec(mouse, ToRectangle(window->total_rect)); + if (window->invisible_when_inactive) { + if (IsActive(window)) window->visible = true; + else window->visible = false; + } + if (!window->visible) continue; + + View *view = GetActiveView(window); + Vec2 mouse = GetMousePosition(); + bool mouse_in_window = CheckCollisionPointRec(mouse, ToRectangle(window->total_rect)); if (mouse_in_window) { if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { SetActiveWindow(window->id); } - if (LastFrameIDWhenSwitchedActiveWindow != FrameID) { + if (LastFrameIDWhenScrolled != FrameID) { if (IsKeyDown(KEY_F1)) { view->scroll.x -= (Int)(GetMouseWheelMove() * 48); } else { view->scroll.y -= (Int)(GetMouseWheelMove() * 48); } - LastFrameIDWhenSwitchedActiveWindow = FrameID; + LastFrameIDWhenScrolled = FrameID; } } } diff --git a/src/text_editor/management.cpp b/src/text_editor/management.cpp index 261bad6..f3708ea 100644 --- a/src/text_editor/management.cpp +++ b/src/text_editor/management.cpp @@ -50,23 +50,20 @@ View *CreateView(BufferID buffer_id) { return w; } -inline bool IsSpecial(WindowID window) { - bool result = window.id == CommandWindowID.id || window.id == InfoBarWindowID.id; - return result; -} - WindowID GetLastActiveWindow() { For(IterateInReverse(&WindowSwitchHistory)) { - if (!IsSpecial(it)) return it; + return it; } return NullWindowID; } void SetActiveWindow(WindowID window) { if (window.id != ActiveWindow.id && LastFrameIDWhenSwitchedActiveWindow != FrameID) { - Add(&WindowSwitchHistory, window); ActiveWindow = window; LastFrameIDWhenSwitchedActiveWindow = FrameID; + + Window *w = GetWindow(window); + if (!w->dont_save_in_active_window_history) Add(&WindowSwitchHistory, window); } } diff --git a/src/text_editor/text_editor.cpp b/src/text_editor/text_editor.cpp index 91b329d..21c2250 100644 --- a/src/text_editor/text_editor.cpp +++ b/src/text_editor/text_editor.cpp @@ -32,13 +32,8 @@ /* - Save file (utf16->utf8) - - reuse buffers!! - resize windows -- Change font size -- command window - - maybe use lua and have there be lua commands that you choose with cursor - - open "asd/asd/asd/asd" - - list "directory" and since it returns strings we can fill up the command buffer with files to open +- list files and open - file dock on left side - We can actually combine this with command window and lua, it's just going to be a buffer of - open "asd/asd/asd/asd" @@ -96,7 +91,7 @@ int main(void) { LoadTextA(b); AddView(w, v->id); } - ActiveWindow.id = 1; + SetActiveWindow({1}); { Window *w = CreateWindow(); @@ -113,25 +108,28 @@ int main(void) { AddView(w, v->id); } { - Window *w = CreateWindow(); - w->draw_scrollbar = false; - w->draw_line_numbers = false; - Buffer *b = CreateBuffer(sys_allocator, "*infobar*"); - b->no_history = true; - View *v = CreateView(b->id); + Window *w = CreateWindow(); + w->draw_scrollbar = false; + w->draw_line_numbers = false; + w->dont_save_in_active_window_history = true; + Buffer *b = CreateBuffer(sys_allocator, "*infobar*"); + b->no_history = true; + View *v = CreateView(b->id); AddView(w, v->id); InfoBarWindowID = w->id; } { - Window *w = CreateWindow(); - w->draw_scrollbar = false; - w->draw_line_numbers = false; - w->visible = false; - w->fuzzy_search = true; - w->execute_line = true; - Buffer *b = CreateBuffer(sys_allocator, "*commands*"); - View *v = CreateView(b->id); + Window *w = CreateWindow(); + w->draw_scrollbar = false; + w->draw_line_numbers = false; + w->visible = false; + w->fuzzy_search = true; + w->execute_line = true; + w->invisible_when_inactive = true; + w->dont_save_in_active_window_history = true; + Buffer *b = CreateBuffer(sys_allocator, "*commands*"); + View *v = CreateView(b->id); ReplaceText(b, GetEndAsRange(*b), L"\n"); ReplaceText(b, GetEndAsRange(*b), L"open \"C:/Work/text_editor/src/text_editor/text_editor.cpp\"\n"); ReplaceText(b, GetEndAsRange(*b), L"open \"C:/Work/text_editor/src/text_editor/text_editor.h\"\n"); @@ -203,8 +201,10 @@ int main(void) { ReplaceInfobarData(); For(IterateInReverse(&order)) { Window &window = Windows[it]; - HandleWindowBindings(&window); - DrawWindow(window); + if (window.visible) { + HandleWindowBindings(&window); + DrawWindow(window); + } } SetMouseCursor(); EndDrawing(); diff --git a/src/text_editor/text_editor.h b/src/text_editor/text_editor.h index c20a53b..f4f1985 100644 --- a/src/text_editor/text_editor.h +++ b/src/text_editor/text_editor.h @@ -68,6 +68,8 @@ struct Window { bool fuzzy_search : 1; bool execute_line : 1; + bool invisible_when_inactive : 1; + bool dont_save_in_active_window_history : 1; }; }; @@ -103,7 +105,7 @@ Int FontLineSpacing; Int FontCharSpacing; Int FrameID; -Int LastFrameIDWhenScrolled; +Int LastFrameIDWhenScrolled = -1; Int LastFrameIDWhenSwitchedActiveWindow; Array WindowSwitchHistory; // @todo: probably better as a circular buffer diff --git a/src/text_editor/window.cpp b/src/text_editor/window.cpp index bc4ca69..dfc95b7 100644 --- a/src/text_editor/window.cpp +++ b/src/text_editor/window.cpp @@ -17,8 +17,8 @@ void SetMouseCursor() { Array GetWindowZOrder(Allocator allocator) { Array order = {allocator}; - For(Windows) if (it.z == 2 && it.visible) Add(&order, GetIndex(Windows, it)); - For(Windows) if (it.z == 1 && it.visible) Add(&order, GetIndex(Windows, it)); - For(Windows) if (it.z == 0 && it.visible) Add(&order, GetIndex(Windows, it)); + For(Windows) if (it.z == 2) Add(&order, GetIndex(Windows, it)); + For(Windows) if (it.z == 1) Add(&order, GetIndex(Windows, it)); + For(Windows) if (it.z == 0) Add(&order, GetIndex(Windows, it)); return order; }