diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index d8caf2b..8207f0c 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -218,8 +218,8 @@ void ReloadFont(Int font_size) { } void HandleGlobalCommands() { - Window *command_window = GetWindow(CommandWindowID); if (CtrlPress(KEY_P)) { + Window *command_window = GetWindow(CommandWindowID); if (command_window->visible) { SetActiveWindow(GetLastActiveWindow()); } else { @@ -227,6 +227,15 @@ void HandleGlobalCommands() { } } + if (CtrlPress(KEY_F)) { + Window *search_window = GetWindow(SearchWindowID); + if (search_window->visible) { + SetActiveWindow(GetLastActiveWindow()); + } else { + SetActiveWindow(search_window->id); + } + } + if (CtrlPress(KEY_MINUS)) { Int font_size = Clamp(FontSize - 1, (Int)4, (Int)100); ReloadFont(font_size); diff --git a/src/text_editor/commands_window.cpp b/src/text_editor/commands_window.cpp index 00bb514..9441e2c 100644 --- a/src/text_editor/commands_window.cpp +++ b/src/text_editor/commands_window.cpp @@ -173,7 +173,11 @@ void HandleActiveWindowBindings(Window *window) { } if (Press(KEY_ESCAPE)) { - view.carets.len = 1; + if (window->deactivate_on_escape) { + SetActiveWindow(GetLastActiveWindow()); + } else { + view.carets.len = 1; + } } if (CtrlAltPress(KEY_DOWN)) { @@ -320,23 +324,28 @@ void HandleActiveWindowBindings(Window *window) { Command_MoveCursorsToSide(window, DIR_RIGHT); } + bool search = false; if (Press(KEY_TAB)) { Command_Replace(&view, L" "); + search = true; } if (CtrlPress(KEY_BACKSPACE)) { Command_Delete(&view, DIR_LEFT, CTRL_PRESSED); + search = true; } else if (Press(KEY_BACKSPACE)) { Command_Delete(&view, DIR_LEFT); + search = true; } if (CtrlPress(KEY_DELETE)) { Command_Delete(&view, DIR_RIGHT, CTRL_PRESSED); + search = true; } else if (Press(KEY_DELETE)) { Command_Delete(&view, DIR_RIGHT); + search = true; } - bool search = false; for (int c = GetCharPressed(); c; c = GetCharPressed()) { // we interpret 2 byte sequences as 1 byte when rendering but we still // want to read them properly. @@ -347,6 +356,50 @@ void HandleActiveWindowBindings(Window *window) { search = true; } + if (Press(KEY_F3)) { + Buffer *search_buffer = GetBuffer("*search*"); + String16 search_string = GetString(*search_buffer); + + Caret caret = view.carets[0]; + Int pos = caret.range.min + 1; + + String16 medium = GetString(*buffer, {pos, INT64_MAX}); + Int index = 0; + if (Seek(medium, search_string, &index)) { + view.carets[0] = MakeCaret(pos + index + search_string.len, pos + index); + } else { + medium = GetString(*buffer); + if (Seek(medium, search_string, &index)) { + view.carets[0] = MakeCaret(index + search_string.len, index); + } + } + } + + if (Press(KEY_ENTER)) { + search = true; + } + + if (window->id.id == SearchWindowID.id && search) { + Window *seek_window = GetWindow(GetLastActiveWindow()); + View *seek_view = GetView(seek_window->active_view); + Buffer *seek_buffer = GetBuffer(seek_view->buffer_id); + Caret caret = seek_view->carets[0]; + Int pos = caret.range.min; + + // @todo: copy paste + String16 needle = GetString(*buffer); + String16 medium = GetString(*seek_buffer, {pos, INT64_MAX}); + Int index = 0; + if (Seek(medium, needle, &index)) { + seek_view->carets[0] = MakeCaret(pos + index + needle.len, pos + index); + } else { + medium = GetString(*seek_buffer); + if (Seek(medium, needle, &index)) { + seek_view->carets[0] = MakeCaret(index + needle.len, index); + } + } + } + if (window->fuzzy_search && search) { Scratch scratch; String16 first_line_string = GetLineStringWithoutNL(*buffer, 0); @@ -372,6 +425,7 @@ void HandleActiveWindowBindings(Window *window) { if (Press(KEY_ENTER)) { Command_EvalLua(&view); } + } else if (window->id.id == SearchWindowID.id) { } else { if (CtrlPress(KEY_ENTER)) { Command_MoveCursorsToSide(window, DIR_RIGHT); diff --git a/src/text_editor/text_editor.cpp b/src/text_editor/text_editor.cpp index 3bd5738..957c26c 100644 --- a/src/text_editor/text_editor.cpp +++ b/src/text_editor/text_editor.cpp @@ -31,11 +31,8 @@ #include "lua_api.cpp" /* -- update info bar until '|' if tghere is no sign delete whole - - Save file (utf16->utf8) - resize windows -- 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" @@ -80,10 +77,6 @@ int main(void) { // Create null { Buffer *buffer = CreateBuffer(sys_allocator, "*scratch*"); - // View *view = CreateView(buffer->id); - // Window *window = CreateWindow(); - // window->visible = false; - // AddView(window, view->id); } { @@ -114,6 +107,7 @@ int main(void) { w->draw_scrollbar = false; w->draw_line_numbers = false; w->dont_save_in_active_window_history = true; + w->deactivate_on_escape = true; Buffer *b = CreateBuffer(sys_allocator, "*infobar*"); b->no_history = true; View *v = CreateView(b->id); @@ -130,6 +124,7 @@ int main(void) { w->execute_line = true; w->invisible_when_inactive = true; w->dont_save_in_active_window_history = true; + w->deactivate_on_escape = true; Buffer *b = CreateBuffer(sys_allocator, "*commands*"); View *v = CreateView(b->id); AddView(w, v->id); @@ -138,6 +133,20 @@ int main(void) { Command_EvalLua(v, L"open \"./\""); } + { + Window *w = CreateWindow(); + w->draw_scrollbar = false; + w->draw_line_numbers = false; + w->visible = false; + w->dont_save_in_active_window_history = true; + w->invisible_when_inactive = true; + w->deactivate_on_escape = true; + Buffer *b = CreateBuffer(sys_allocator, "*search*"); + View *v = CreateView(b->id); + AddView(w, v->id); + SearchWindowID = w->id; + } + while (!WindowShouldClose()) { ProfileScope(game_loop); FrameID += 1; @@ -145,6 +154,14 @@ int main(void) { Rect2I screen_rect = GetScreenRect(); Rect2I infobar_rect = CutBottom(&screen_rect, (Int)FontLineSpacing); float line_numbers_size = MeasureTextEx(MainFont, "12345", (float)FontSize, (float)FontSpacing).x; + { + int i = 5; + if (Windows[i].visible) { + Rect2I rect = CutBottom(&screen_rect, FontLineSpacing); + Windows[i].total_rect = rect; + Windows[i].document_rect = Windows[i].total_rect; + } + } { int i = 0; Windows[i].total_rect = CutLeft(&screen_rect, (Int)((double)GetSize(screen_rect).x * 0.33)); @@ -166,11 +183,6 @@ int main(void) { if (Windows[i].draw_scrollbar) Windows[i].scrollbar_rect = CutRight(&Windows[i].document_rect, 10); if (Windows[i].draw_line_numbers) Windows[i].line_numbers_rect = CutLeft(&Windows[i].document_rect, (Int)line_numbers_size); } - // { - // int i = 3; - // Windows[i].total_rect = CutLeft(&infobar_rect, GetSize(infobar_rect).x / 2); - // Windows[i].document_rect = Windows[i].total_rect; - // } { int i = 3; Windows[i].total_rect = infobar_rect; diff --git a/src/text_editor/text_editor.h b/src/text_editor/text_editor.h index 2a1f102..c084dcf 100644 --- a/src/text_editor/text_editor.h +++ b/src/text_editor/text_editor.h @@ -70,6 +70,7 @@ struct Window { bool execute_line : 1; bool invisible_when_inactive : 1; bool dont_save_in_active_window_history : 1; + bool deactivate_on_escape : 1; }; }; @@ -89,6 +90,7 @@ BufferID NullBufferID = {0}; ViewID NullViewID = {0}; WindowID CommandWindowID = {0}; WindowID InfoBarWindowID = {0}; +WindowID SearchWindowID = {0}; Array Buffers = {}; Array Views = {};