Save state window buffers?

This commit is contained in:
Krzosa Karol
2025-05-05 15:51:21 +02:00
parent 8fc1081cef
commit 2c29df0171
7 changed files with 46 additions and 46 deletions

View File

@@ -76,29 +76,6 @@ Int ScreenSpaceToBufferPosErrorOutOfBounds(Window *window, View *view, Buffer *b
return result; return result;
} }
void Command_ListBuffers() {
BSet main = GetActiveMainSet();
CheckpointBeforeGoto(main.window);
Scratch scratch;
Array<String> strings = {scratch};
for (Buffer *it = FirstBuffer; it; it = it->next) {
String string = Format(scratch, "%.*s", FmtString(it->name));
Add(&strings, string);
}
String result = Merge(scratch, strings, "\n");
String16 string16 = ToString16(scratch, result);
String buffer_name = GetUniqueBufferName(GetDir(main.buffer), "buffer_list");
View *new_view = WindowOpenBufferView(main.window, buffer_name);
Buffer *new_buffer = GetBuffer(new_view->active_buffer);
new_buffer->gc = true;
Command_SelectEntireBuffer(new_view);
Command_Replace(new_view, string16);
Command_SelectRangeOneCursor(new_view, {});
}
void MouseLoadWord(Event event, void (*cmd_function)(String16 string)) { void MouseLoadWord(Event event, void (*cmd_function)(String16 string)) {
Vec2I mouse = MouseVec2I(); Vec2I mouse = MouseVec2I();
BSet active = GetActiveSet(); BSet active = GetActiveSet();

View File

@@ -412,6 +412,7 @@ void OnCommand(Event event) {
if (CtrlPress(SDLK_P)) { if (CtrlPress(SDLK_P)) {
void Command_ListBuffers();
Command_ListBuffers(); Command_ListBuffers();
} }

View File

@@ -40,23 +40,41 @@ View *Command_ExecHidden(String buffer_name, String cmd, String working_dir) {
return view; return view;
} }
void Command_BeginConsoleJump(BSet *set) { void Command_BeginJump(BSet *set, BufferID buffer_id = NullBufferID) {
CheckpointBeforeGoto(set->window); CheckpointBeforeGoto(set->window);
set->buffer = GetBuffer(NullBufferID); set->buffer = GetBuffer(buffer_id);
set->view = WindowOpenBufferView(set->window, set->buffer->name); set->view = WindowOpenBufferView(set->window, set->buffer->name);
} }
void Command_EndConsoleJump(BSet set) { void Command_BeginJumpCommandBuffer(BSet *set) {
String current_dir = Command_GetDir();
Command_BeginJump(set, set->window->command_buffer);
set->buffer->name = GetUniqueBufferName(current_dir, WindowBufferName);
Command_SelectEntireBuffer(set->view);
Command_Replace(set->view, u"");
}
void Command_EndJump(BSet set) {
Int pos = XYToPos(set.buffer, {0, set.buffer->line_starts.len - 1}); Int pos = XYToPos(set.buffer, {0, set.buffer->line_starts.len - 1});
set.view->carets[0] = MakeCaret(pos); set.view->carets[0] = MakeCaret(pos);
UpdateScroll(set.window, true); UpdateScroll(set.window, true);
} }
void Command_ListBuffers() {
BSet main = GetActiveMainSet();
Command_BeginJumpCommandBuffer(&main);
for (Buffer *it = FirstBuffer; it; it = it->next) {
Command_Appendf(main.view, "%.*s\n", FmtString(it->name));
}
Command_EndJump(main);
ActiveWindow = main.window->id;
}
BSet Command_Exec(String cmd, String working_dir) { BSet Command_Exec(String cmd, String working_dir) {
BSet set = GetActiveMainSet(); BSet set = GetActiveMainSet();
Command_BeginConsoleJump(&set); Command_BeginJumpCommandBuffer(&set);
Exec(set.view->id, true, cmd, working_dir); Exec(set.view->id, true, cmd, working_dir);
Command_EndConsoleJump(set); Command_EndJump(set);
ActiveWindow = set.window->id; ActiveWindow = set.window->id;
return set; return set;
} }
@@ -83,12 +101,12 @@ BSet Command_Open(String path) {
Int col = strtoll(col_string.data, NULL, 10); Int col = strtoll(col_string.data, NULL, 10);
if (IsDir(file_path)) { if (IsDir(file_path)) {
Command_BeginConsoleJump(&main); Command_BeginJumpCommandBuffer(&main);
Command_Appendf(main.view, "%.*s/..\n", FmtString(file_path)); Command_Appendf(main.view, "%.*s/..\n", FmtString(file_path));
for (FileIter it = IterateFiles(scratch, file_path); IsValid(it); Advance(&it)) { for (FileIter it = IterateFiles(scratch, file_path); IsValid(it); Advance(&it)) {
Command_Appendf(main.view, "%.*s\n", FmtString(it.absolute_path)); Command_Appendf(main.view, "%.*s\n", FmtString(it.absolute_path));
} }
Command_EndConsoleJump(main); Command_EndJump(main);
ActiveWindow = main.window->id; ActiveWindow = main.window->id;
} else { } else {
CheckpointBeforeGoto(main.window); CheckpointBeforeGoto(main.window);
@@ -179,17 +197,16 @@ int Lua_Cmd(lua_State *L) {
String destination = lua_tostring(L, -1); String destination = lua_tostring(L, -1);
lua_pop(L, 1); lua_pop(L, 1);
BSet set = {};
if (destination == "console") { if (destination == "console") {
set = GetConsoleSet(); BSet set = GetConsoleSet();
Command_BeginJump(&set);
Exec(set.view->id, true, cmd, working_dir);
Command_EndJump(set);
} else { } else {
set = GetActiveMainSet(); BSet set = GetActiveMainSet();
} Command_BeginJumpCommandBuffer(&set);
Exec(set.view->id, true, cmd, working_dir);
Command_BeginConsoleJump(&set); Command_EndJump(set);
Exec(set.view->id, true, cmd, working_dir);
Command_EndConsoleJump(set);
if (destination != "console") {
ActiveWindow = set.window->id; ActiveWindow = set.window->id;
} }
@@ -260,14 +277,14 @@ int Lua_SetProjectFile(lua_State *L) {
int Lua_ListCommands(lua_State *L) { int Lua_ListCommands(lua_State *L) {
BSet main = GetActiveMainSet(); BSet main = GetActiveMainSet();
Command_BeginConsoleJump(&main); Command_BeginJump(&main);
for (int i = 0; LuaFunctions[i].name != NULL; i += 1) { for (int i = 0; LuaFunctions[i].name != NULL; i += 1) {
Command_Appendf(main.view, "%20s() ", LuaFunctions[i].name); Command_Appendf(main.view, "%20s() ", LuaFunctions[i].name);
if (((i + 1) % 6) == 0) { if (((i + 1) % 6) == 0) {
Command_Appendf(main.view, "\n"); Command_Appendf(main.view, "\n");
} }
} }
Command_EndConsoleJump(main); Command_EndJump(main);
ActiveWindow = main.window->id; ActiveWindow = main.window->id;
return 0; return 0;
} }

View File

@@ -146,12 +146,16 @@ Buffer *CreateTempBuffer(Allocator allocator, Int size = 4096) {
return result; return result;
} }
Window *CreateWindow() { String WindowBufferName = "window_buffer";
Window *CreateWindow(bool create_command_buffer = true) {
Window *w = AllocType(Perm, Window); Window *w = AllocType(Perm, Window);
w->visible = true; w->visible = true;
w->draw_scrollbar = StyleDrawScrollbar; w->draw_scrollbar = StyleDrawScrollbar;
w->draw_line_numbers = StyleDrawLineNumbers; w->draw_line_numbers = StyleDrawLineNumbers;
w->id = AllocWindowID(w); w->id = AllocWindowID(w);
if (create_command_buffer) {
w->command_buffer = CreateBuffer(GetSystemAllocator(), GetUniqueBufferName(WorkingDir, WindowBufferName), 4096*2)->id;
}
DLL_QUEUE_ADD(FirstWindow, LastWindow, w); DLL_QUEUE_ADD(FirstWindow, LastWindow, w);
WindowCount += 1; WindowCount += 1;
return w; return w;

View File

@@ -42,6 +42,7 @@ struct Window {
Array<GotoCrumb> goto_redo; Array<GotoCrumb> goto_redo;
ViewID active_goto_list; ViewID active_goto_list;
BufferID command_buffer;
double mouse_scroller_offset; double mouse_scroller_offset;
int z; int z;

View File

@@ -1,9 +1,9 @@
!!As little lua code as possible, but lua code should be powerful just in case of quick edits !!As little lua code as possible, but lua code should be powerful just in case of quick edits
- maybe we could allow user to change window titles which would make them special in some way. A:/text_editor/+test_buffer:1:1:ADE | - maybe we could allow user to change window titles which would make them special in some way. A:/text_editor/+test_buffer:1:1:ADE |
- Fix B: not opening - need a buffer for every window that will be cleared on command and replaced with new content
- buffer_list shouldn't be a thing
- Scroll the console properly - Scroll the console properly
- commands for scrolling: center, cursor_at_bottom_of_screen, cursor_at_top - commands for scrolling: center, cursor_at_bottom_of_screen, cursor_at_top
- need a buffer for every window that will be cleared on command and replaced with new content
-------------- --------------
buffer = make_buffer() buffer = make_buffer()

View File

@@ -7,7 +7,7 @@ Array<Window *> GetWindowZOrder(Allocator allocator) {
} }
Window *CreateSearchBar(WindowID parent_window_id) { Window *CreateSearchBar(WindowID parent_window_id) {
Window *window = CreateWindow(); Window *window = CreateWindow(false);
window->draw_scrollbar = false; window->draw_scrollbar = false;
window->deactivate_on_escape = true; window->deactivate_on_escape = true;
window->is_search_bar = true; window->is_search_bar = true;
@@ -30,7 +30,7 @@ Window *CreateSearchBar(WindowID parent_window_id) {
} }
Window *CreateTitlebar(WindowID parent_window_id) { Window *CreateTitlebar(WindowID parent_window_id) {
Window *window = CreateWindow(); Window *window = CreateWindow(false);
window->draw_scrollbar = false; window->draw_scrollbar = false;
window->deactivate_on_escape = true; window->deactivate_on_escape = true;
window->is_title_bar = true; window->is_title_bar = true;