diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index 67e8069..9fc984a 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -81,28 +81,21 @@ void ToggleFullscreen() { IsInFullscreen = !IsInFullscreen; } -void CheckpointBeforeGoto(WindowID window_id, ViewID view_id) { - Window *window = GetWindow(window_id); - View *view = GetView(view_id); +void CheckpointBeforeGoto(Window *window, View *view) { Buffer *buffer = GetBuffer(view->active_buffer); Add(&window->goto_history, {buffer->id, view->carets[0]}); window->goto_redo.len = 0; } -void CheckpointBeforeGoto(WindowID window_id) { - Window *window = GetWindow(window_id); - CheckpointBeforeGoto(window_id, window->active_view); +void CheckpointBeforeGoto(Window *window) { + CheckpointBeforeGoto(window, GetView(window->active_view)); } -void GotoBackward(WindowID window_id) { - Window *window = GetWindow(window_id); +void GotoBackward(Window *window) { + BSet set = GetBSet(window); if (window->goto_history.len <= 0) return; - { - Window *window = GetWindow(window_id); - View *view = GetView(window->active_view); - Buffer *buffer = GetBuffer(view->active_buffer); - Add(&window->goto_redo, {buffer->id, view->carets[0]}); - } + Add(&window->goto_redo, {set.buffer->id, set.view->carets[0]}); + GotoCrumb c = Pop(&window->goto_history); Buffer *buffer = GetBuffer(c.buffer_id); View *view = WindowOpenBufferView(window, buffer->name); @@ -110,15 +103,11 @@ void GotoBackward(WindowID window_id) { UpdateScroll(window, true); } -void GotoForward(WindowID window_id) { - Window *window = GetWindow(window_id); +void GotoForward(Window *window) { + BSet set = GetBSet(window); if (window->goto_redo.len <= 0) return; - { - Window *window = GetWindow(window_id); - View *view = GetView(window->active_view); - Buffer *buffer = GetBuffer(view->active_buffer); - Add(&window->goto_history, {buffer->id, view->carets[0]}); - } + Add(&window->goto_history, {set.buffer->id, set.view->carets[0]}); + GotoCrumb c = Pop(&window->goto_redo); Buffer *buffer = GetBuffer(c.buffer_id); View *view = WindowOpenBufferView(window, buffer->name); @@ -163,10 +152,8 @@ void MouseExecWord(Event event) { } void Command_ListBuffers() { - Window *window = GetActiveMainWindow(); - View *view = GetView(window->active_view); - Buffer *buffer = GetBuffer(view->active_buffer); - CheckpointBeforeGoto(window->id); + BSet main = GetActiveMainSet(); + CheckpointBeforeGoto(main.window); Scratch scratch; Array strings = {scratch}; @@ -177,8 +164,8 @@ void Command_ListBuffers() { String result = Merge(scratch, strings, "\n"); String16 string16 = ToString16(scratch, result); - String buffer_name = GetUniqueBufferName(scratch, GetDir(buffer), "+list_buffers-"); - View *new_view = WindowOpenBufferView(window, buffer_name); + String buffer_name = GetUniqueBufferName(scratch, GetDir(main.buffer), "+list_buffers-"); + View *new_view = WindowOpenBufferView(main.window, buffer_name); Command_SelectEntireBuffer(new_view); Command_Replace(new_view, string16); @@ -335,10 +322,10 @@ bool GlobalCommand(Event event) { } if (event.ctrl && event.shift && Mouse(RIGHT)) { - GotoForward(GetActiveMainWindowID()); + GotoForward(GetActiveMainSet().window); } else if (event.alt && event.ctrl && Mouse(RIGHT)) { } else if (event.ctrl && Mouse(RIGHT)) { - GotoBackward(GetActiveMainWindowID()); + GotoBackward(GetActiveMainSet().window); } else if (event.alt && Mouse(RIGHT)) { } else if (Mouse(RIGHT)) { Vec2I mouse = MouseVec2I(); @@ -555,11 +542,8 @@ void ReportWarningf(const char *fmt, ...) { STRING_FORMAT(scratch, fmt, string); Command_Append(NullViewID, string, true); Window *window = GetWindowWithView(NullViewID); - if (!window) { - WindowID last_active_window_id = GetActiveMainWindowID(); - window = GetWindow(last_active_window_id); - } - CheckpointBeforeGoto(window->id); + if (!window) window = GetActiveMainSet().window; + CheckpointBeforeGoto(window); window->active_view = NullViewID; ActiveWindow = window->id; } \ No newline at end of file diff --git a/src/text_editor/commands_window.cpp b/src/text_editor/commands_window.cpp index 1735f5f..5b1ab0c 100644 --- a/src/text_editor/commands_window.cpp +++ b/src/text_editor/commands_window.cpp @@ -619,7 +619,7 @@ void Command_Find(View *seek_view, String16 needle, bool forward = true) { void Command_GotoNextInList(Window *window, Int line_offset = 1) { Assert(line_offset == 1 || line_offset == -1); - ViewID active_view = window->active_view; + View *active_view = GetView(window->active_view); View *view_goto = GetView(window->active_goto_list); window->active_view = view_goto->id; @@ -639,13 +639,13 @@ void Command_GotoNextInList(Window *window, Int line_offset = 1) { IF_DEBUG(AssertRanges(view_goto->carets)); if (line.len == 0) continue; - CheckpointBeforeGoto(window->id, active_view); + CheckpointBeforeGoto(window, active_view); Open(line); opened = true; break; } - if (!opened) window->active_view = active_view; + if (!opened) window->active_view = active_view->id; } void Command_FuzzySort(View *view, String16 needle) { @@ -682,7 +682,7 @@ void WindowCommand(Event event, Window *window, View *view) { if (Press(SDLK_ESCAPE)) { if (window->deactivate_on_escape) { - ActiveWindow = GetActiveMainWindowID(); + ActiveWindow = GetActiveMainSet().window->id; } else { view->carets.len = 1; } @@ -838,22 +838,18 @@ void WindowCommand(Event event, Window *window, View *view) { if (Shift(SDLK_F3)) { Scratch scratch; - Window *window = GetActiveMainWindow(); - View *view = GetView(window->active_view); - Buffer *buffer = GetBuffer(view->active_buffer); - String16 search_string = ToString16(scratch, window->search_string); - Caret caret = FindPrev(buffer, search_string, view->carets[0]); - view->carets.len = 1; - view->carets[0] = caret; + BSet main = GetActiveMainSet(); + String16 search_string = ToString16(scratch, main.window->search_string); + Caret caret = FindPrev(main.buffer, search_string, main.view->carets[0]); + main.view->carets.len = 1; + main.view->carets[0] = caret; } else if (Press(SDLK_F3)) { Scratch scratch; - Window *window = GetActiveMainWindow(); - View *view = GetView(window->active_view); - Buffer *buffer = GetBuffer(view->active_buffer); - String16 search_string = ToString16(scratch, window->search_string); - Caret caret = FindNext(buffer, search_string, view->carets[0]); - view->carets.len = 1; - view->carets[0] = caret; + BSet main = GetActiveMainSet(); + String16 search_string = ToString16(scratch, main.window->search_string); + Caret caret = FindNext(main.buffer, search_string, main.view->carets[0]); + main.view->carets.len = 1; + main.view->carets[0] = caret; } if (Shift(SDLK_F4)) { @@ -878,11 +874,8 @@ void WindowCommand(Event event, Window *window, View *view) { } if (Ctrl(SDLK_PERIOD)) { - Window *window = GetActiveMainWindow(); - View *view = GetView(window->active_view); - Buffer *buffer = GetBuffer(view->active_buffer); - - String name = ChopLastSlash(buffer->name); + BSet main = GetActiveMainSet(); + String name = ChopLastSlash(main.buffer->name); Open(name); } @@ -912,9 +905,9 @@ void WindowCommand(Event event, Window *window, View *view) { } if (CtrlShift(SDLK_W)) { - GotoForward(GetActiveMainWindowID()); + GotoForward(GetActiveMainSet().window); } else if (Ctrl(SDLK_W)) { - GotoBackward(GetActiveMainWindowID()); + GotoBackward(GetActiveMainSet().window); } if (CtrlShift(SDLK_Q)) { diff --git a/src/text_editor/lua_api.cpp b/src/text_editor/lua_api.cpp index f77b799..cb815fd 100644 --- a/src/text_editor/lua_api.cpp +++ b/src/text_editor/lua_api.cpp @@ -29,15 +29,18 @@ String FieldString(lua_State *L, String name) { } void ExecInNewBuffer(String cmd, String working_dir) { + BSet main = GetActiveMainSet(); + CheckpointBeforeGoto(main.window); + Scratch scratch; - CheckpointBeforeGoto(GetActiveMainWindowID()); String buffer_name = GetUniqueBufferName(scratch, working_dir, "+cmd-"); - Window *window = GetActiveMainWindow(); - View *view = WindowOpenBufferView(window, buffer_name); - Buffer *buffer = GetBuffer(view->active_buffer); - view->carets[0] = MakeCaret({}); + + View *view = WindowOpenBufferView(main.window, buffer_name); + Buffer *buffer = GetBuffer(view->active_buffer); + + view->carets[0] = MakeCaret({}); Exec(view->id, false, cmd, working_dir); - ActiveWindow = window->id; + ActiveWindow = main.window->id; } void Open(String path) { @@ -59,17 +62,16 @@ void Open(String path) { String col_string = FieldString(LuaState, "col"); Int col = strtoll(col_string.data, NULL, 10); - WindowID window_id = GetActiveMainWindowID(); - CheckpointBeforeGoto(window_id); - Window *window = GetWindow(window_id); - View *view = WindowOpenBufferView(window, file_path); + BSet main = GetActiveMainSet(); + CheckpointBeforeGoto(main.window); + View *view = WindowOpenBufferView(main.window, file_path); Buffer *buffer = GetBuffer(view->active_buffer); if (line != -1 && col != -1) { Int pos = XYToPos(*buffer, {col - 1, line - 1}); view->carets[0] = MakeCaret(pos); } - UpdateScroll(window, true); - ActiveWindow = window->id; + UpdateScroll(main.window, true); + ActiveWindow = main.window->id; } else if (FieldString(LuaState, "kind") == "exec") { String cmd = FieldString(LuaState, "cmd"); String working_dir = FieldString(LuaState, "working_dir"); @@ -91,9 +93,8 @@ int Lua_FuzzySort(lua_State *L) { Scratch scratch; String16 string16 = ToString16(scratch, string); - Window *window = GetActiveMainWindow(); - View *view = GetView(window->active_view); - Command_FuzzySort(view, string16); + BSet main = GetActiveMainSet(); + Command_FuzzySort(main.view, string16); return 0; } @@ -115,8 +116,8 @@ int Lua_NewCmd(lua_State *L) { } int Lua_Kill(lua_State *L) { - Window *window = GetActiveMainWindow(); - KillProcess(window->active_view); + BSet main = GetActiveMainSet(); + KillProcess(main.window->active_view); return 0; } @@ -181,32 +182,37 @@ int Lua_GetActiveMainWindowBufferDir(lua_State *L) { } int Lua_OpenFilesHere(lua_State *L) { - Window *window = GetActiveMainWindow(); + BSet main = GetActiveMainSet(); Scratch scratch; for (FileIter it = IterateFiles(scratch, GetActiveMainWindowBufferDir()); IsValid(it); Advance(&it)) { - WindowOpenBufferView(window, it.absolute_path); + WindowOpenBufferView(main.window, it.absolute_path); } return 0; } int Lua_Search(lua_State *L) { - Window *seek_window = GetActiveMainWindow(); - seek_window->search_string = lua_tostring(L, 1); + BSet main = GetActiveMainSet(); + main.window->search_string = lua_tostring(L, 1); lua_pop(L, 1); - View *seek_view = GetView(seek_window->active_view); + Scratch scratch; - Command_Find(seek_view, ToString16(scratch, seek_window->search_string), true); + Command_Find(main.view, ToString16(scratch, main.window->search_string), true); return 0; } int Lua_SearchB(lua_State *L) { - Window *seek_window = GetActiveMainWindow(); - seek_window->search_string = lua_tostring(L, 1); + BSet main = GetActiveMainSet(); + main.window->search_string = lua_tostring(L, 1); lua_pop(L, 1); - View *seek_view = GetView(seek_window->active_view); Scratch scratch; - Command_Find(seek_view, ToString16(scratch, seek_window->search_string), false); + Command_Find(main.view, ToString16(scratch, main.window->search_string), false); + return 0; +} + +int Lua_Rename(lua_State *L) { + String string = lua_tostring(L, 1); + lua_pop(L, 1); return 0; } diff --git a/src/text_editor/lua_api_generated.cpp b/src/text_editor/lua_api_generated.cpp index b16c61e..98c28af 100644 --- a/src/text_editor/lua_api_generated.cpp +++ b/src/text_editor/lua_api_generated.cpp @@ -14,5 +14,6 @@ luaL_Reg LuaFunctions[] = { {"OpenFilesHere", Lua_OpenFilesHere}, {"Search", Lua_Search}, {"SearchB", Lua_SearchB}, + {"Rename", Lua_Rename}, {NULL, NULL}, }; diff --git a/src/text_editor/management.cpp b/src/text_editor/management.cpp index 380a4e3..064cdb6 100644 --- a/src/text_editor/management.cpp +++ b/src/text_editor/management.cpp @@ -77,8 +77,6 @@ inline View *GetView(ViewID id) { } inline bool IsNull(Buffer *buffer) { return buffer->id.id == NullBufferID.id; } -inline bool IsActive(Window *window) { return window->id.id == ActiveWindow.id; } -inline bool IsActive(Window *window, View *view) { return window->active_view.id == view->id.id; } inline Window *GetActiveWindow() { return GetWindow(ActiveWindow); } inline View *GetActiveView(Window *window) { return GetView(window->active_view); } @@ -174,16 +172,35 @@ Window *GetTitlebarWindow(WindowID id) { return window; } -Window *GetActiveMainWindow() { - Window *window = GetWindow(ActiveWindow); - if (window->is_title_bar) { - window = GetWindow(window->title_bar_window); - } - return window; +BSet GetBSet(Window *window) { + BSet set = {window}; + set.view = GetView(set.window->active_view); + set.buffer = GetBuffer(set.view->active_buffer); + return set; } -WindowID GetActiveMainWindowID() { - return GetActiveMainWindow()->id; +BSet GetTitleSet(Window *window) { + if (!window->is_title_bar) window = GetWindow(window->title_bar_window); + BSet result = GetBSet(window); + return result; +} + +BSet GetMainSet(Window *window) { + if (window->is_title_bar) window = GetWindow(window->title_bar_window); + BSet result = GetBSet(window); + return result; +} + +BSet GetActiveMainSet() { + Window *window = GetWindow(ActiveWindow); + if (window->is_title_bar) window = GetWindow(window->title_bar_window); + return GetBSet(window); +} + +BSet GetActiveTitleSet() { + Window *window = GetWindow(ActiveWindow); + if (window->is_title_bar) window = GetWindow(window->title_bar_window); + return GetBSet(window); } RandomSeed UniqueBufferNameSeed = {13}; @@ -194,10 +211,8 @@ String GetUniqueBufferName(Allocator allocator, String working_dir, String p } String GetActiveMainWindowBufferName() { - Window *window = GetActiveMainWindow(); - View *view = GetView(window->active_view); - Buffer *buffer = GetBuffer(view->active_buffer); - return buffer->name; + BSet set = GetActiveMainSet(); + return set.buffer->name; } String GetDir(Buffer *buffer) { @@ -206,10 +221,8 @@ String GetDir(Buffer *buffer) { } String GetActiveMainWindowBufferDir() { - Window *window = GetActiveMainWindow(); - View *view = GetView(window->active_view); - Buffer *buffer = GetBuffer(view->active_buffer); - String name = buffer->is_directory ? buffer->name : ChopLastSlash(buffer->name); + BSet set = GetActiveMainSet(); + String name = set.buffer->is_directory ? set.buffer->name : ChopLastSlash(set.buffer->name); return name; } diff --git a/src/text_editor/text_editor.h b/src/text_editor/text_editor.h index 0c1fb0b..65bdc0f 100644 --- a/src/text_editor/text_editor.h +++ b/src/text_editor/text_editor.h @@ -100,7 +100,7 @@ struct Scroller { Int line_count; }; -struct ActiveSet { +struct BSet { Window *window; View *view; Buffer *buffer; diff --git a/src/text_editor/title_bar.cpp b/src/text_editor/title_bar.cpp index 12990a6..7185648 100644 --- a/src/text_editor/title_bar.cpp +++ b/src/text_editor/title_bar.cpp @@ -1,29 +1,3 @@ -String DebugViewList(Allocator allocator) { - Scratch scratch((Arena *)allocator.object); - Array strings = {scratch}; - For(Views) { - View *view = it.o; - Buffer *buffer = GetBuffer(view->active_buffer); - String string = Format(scratch, "view = %lld buffer = %lld name = %.*s", (long long)view->id.id, (long long)buffer->id.id, FmtString(buffer->name)); - Add(&strings, string); - } - String result = Merge(allocator, strings, "\n"); - return result; -} - -String DebugWindowList(Allocator allocator) { - Scratch scratch((Arena *)allocator.object); - Array strings = {scratch}; - For(Windows) { - View *view = GetActiveView(it.o); - Buffer *buffer = GetBuffer(view->active_buffer); - String string = Format(scratch, "window = %lld active_view = %lld buffer_name = %.*s", (long long)it.id, (long long)view->id.id, FmtString(buffer->name)); - Add(&strings, string); - } - String result = Merge(allocator, strings, "\n"); - return result; -} - void UpdateDebugBuffer() { Buffer *buffer = GetBuffer(DebugBufferID); @@ -31,12 +5,10 @@ void UpdateDebugBuffer() { View *view = GetActiveView(window); if (view->active_buffer.id == buffer->id.id) return; - Window *last_window = GetActiveMainWindow(); - View *last_view = GetActiveView(last_window); - Buffer *last_buffer = GetBuffer(last_view->active_buffer); + BSet main = GetActiveMainSet(); Scratch scratch; - String s = Format(scratch, "wid: %d\nvid: %d\nbid: %d\nframe: %lld\n", (int)last_window->id.id, (int)last_view->id.id, (int)last_buffer->id.id, (long long)FrameID); + String s = Format(scratch, "wid: %d\nvid: %d\nbid: %d\nframe: %lld\n", (int)main.window->id.id, (int)main.view->id.id, (int)main.buffer->id.id, (long long)FrameID); String16 string = ToString16(scratch, s); IKnowWhatImDoing_ReplaceText(buffer, GetRange(*buffer), string); @@ -48,13 +20,6 @@ void UpdateDebugBuffer() { IKnowWhatImDoing_Appendf(buffer, "working dir: %.*s\n", FmtString(WorkingDir)); IKnowWhatImDoing_Appendf(buffer, "exe dir: %.*s\n", FmtString(ExeDir)); IKnowWhatImDoing_Appendf(buffer, "config dir: %.*s\n", FmtString(ConfigDir)); - - // String view_list = DebugViewList(scratch); - // Append(buffer, ToString16(scratch, view_list)); - // Append(buffer, L"\n"); - - // String window_list = DebugWindowList(scratch); - // Append(buffer, ToString16(scratch, window_list)); } void ReplaceTitleBarData(Window *window) { diff --git a/src/text_editor/window_draw.cpp b/src/text_editor/window_draw.cpp index 35d3c55..1200378 100644 --- a/src/text_editor/window_draw.cpp +++ b/src/text_editor/window_draw.cpp @@ -109,7 +109,8 @@ void DrawWindow(Window *window, Event &event) { View *view = GetActiveView(window); Buffer *buffer = GetBuffer(view->active_buffer); SetScissor(GetScreenRectF()); - bool is_active = IsActive(window) || window->id.id == GetActiveMainWindowID().id; + + bool is_active = window->id == ActiveWindow || window->title_bar_window == ActiveWindow; Color color_whitespace_during_selection = ColorWhitespaceDuringSelection; Color color_background = ColorBackground;