diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index 93ba605..91d827a 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -18,6 +18,11 @@ inline bool Alt() { return result; } +inline bool AltPress(int key) { + bool result = Press(key) && Alt(); + return result; +} + inline bool CtrlPress(int key) { bool result = Press(key) && Ctrl(); return result; @@ -241,6 +246,21 @@ Caret FindInBuffer(Buffer *buffer, String16 needle, Caret caret, bool find_next return result; } +Array FindAllInBuffer(Allocator allocator, Buffer *buffer, String16 needle) { + Array result = {allocator}; + String16 string_buffer = GetString(*buffer); + for (Int pos = 0;;) { + Int index = 0; + String16 medium = Skip(string_buffer, pos); + if (!Seek(medium, needle, &index)) { + break; + } + Add(&result, Rng(pos + index, pos + index + needle.len)); + pos += needle.len; + } + return result; +} + void HandleGlobalCommands() { if (CtrlPress(KEY_P)) { Window *command_window = GetWindow(CommandWindowID); diff --git a/src/text_editor/commands_window.cpp b/src/text_editor/commands_window.cpp index 4bd1826..4a2b54e 100644 --- a/src/text_editor/commands_window.cpp +++ b/src/text_editor/commands_window.cpp @@ -263,13 +263,6 @@ void HandleActiveWindowBindings(Window *window, bool *update_scroll) { } } - if (CtrlPress(KEY_D)) { - String16 string = GetString(*buffer, view.carets[0].range); - Caret caret = FindInBuffer(buffer, string, view.carets[0], true); - Insert(&view.carets, caret, 0); - MergeCarets(*buffer, &view.carets); - } - if (CtrlShiftPress(KEY_Z)) { RedoEdit(buffer, &view.carets); } else if (CtrlPress(KEY_Z)) { @@ -346,11 +339,24 @@ void HandleActiveWindowBindings(Window *window, bool *update_scroll) { search = true; } + if (CtrlPress(KEY_D)) { + String16 string = GetString(*buffer, view.carets[0].range); + Caret caret = FindInBuffer(buffer, string, view.carets[0], true); + Insert(&view.carets, caret, 0); + MergeCarets(*buffer, &view.carets); + } + if (Press(KEY_F3)) { Buffer *search_buffer = GetBuffer("*search*"); String16 search_string = GetString(*search_buffer); - view.carets[0] = FindInBuffer(buffer, search_string, view.carets[0], true); - view.carets.len = 1; + Caret caret = FindInBuffer(buffer, search_string, view.carets[0], true); + if (Ctrl()) { + Insert(&view.carets, caret, 0); + MergeCarets(*buffer, &view.carets); + } else { + view.carets.len = 1; + view.carets[0] = caret; + } } if (window->id.id == SearchWindowID.id) { @@ -362,9 +368,20 @@ void HandleActiveWindowBindings(Window *window, bool *update_scroll) { seek_view->carets[0] = FindInBuffer(seek_buffer, needle, seek_view->carets[0]); seek_view->carets.len = 1; } - if (Press(KEY_ENTER)) { - seek_view->carets[0] = FindInBuffer(seek_buffer, needle, seek_view->carets[0], true); - seek_view->carets.len = 1; + if (AltPress(KEY_ENTER)) { + Scratch scratch; + Array finds = FindAllInBuffer(scratch, seek_buffer, needle); + For(finds) Add(&seek_view->carets, MakeCaret(it.max, it.min)); + MergeCarets(*buffer, &view.carets); + } else if (Press(KEY_ENTER)) { + Caret caret = FindInBuffer(seek_buffer, needle, seek_view->carets[0], true); + if (Ctrl()) { + Insert(&seek_view->carets, caret, 0); + MergeCarets(*buffer, &view.carets); + } else { + seek_view->carets.len = 1; + seek_view->carets[0] = caret; + } } } diff --git a/src/text_editor/window_draw.cpp b/src/text_editor/window_draw.cpp index 030a7bc..802ca8f 100644 --- a/src/text_editor/window_draw.cpp +++ b/src/text_editor/window_draw.cpp @@ -92,6 +92,7 @@ void DrawCaret(Window &window, XY xy, float size, Color color) { } void DrawLineHighlight(Window &window, XY fxy, Color color) { + ProfileFunction(); View &view = *GetActiveView(&window); Vec2I w = XYToWorldPos(view, XYLine(fxy.line)); w -= view.scroll; @@ -110,16 +111,18 @@ void DrawSelection(Window &window, Caret &it) { Int front = GetFront(it); Int back = GetBack(it); if (front != back) { - XY bxy = PosToXY(*buffer, back); - XY min = PosToXY(*buffer, it.range.min); - XY max = PosToXY(*buffer, it.range.max); + Rect2I visible = GetVisibleCells(window); + XY min = PosToXY(*buffer, it.range.min); + XY max = PosToXY(*buffer, it.range.max); + if (visible.min.y > max.line) return; + if (visible.max.y < min.line) return; - Color color = ColorSelection; - Rect2I vlines = GetVisibleCells(window); - for (Int line = vlines.min.y; line <= vlines.max.y && line >= 0 && line < buffer->line_starts.len; line += 1) { + XY bxy = PosToXY(*buffer, back); + Color color = ColorSelection; + for (Int line = visible.min.y; line <= visible.max.y && line >= 0 && line < buffer->line_starts.len; line += 1) { String16 line_string = GetLineString(*buffer, line); - for (Int col = vlines.min.x; col < vlines.max.x && col >= 0 && col < line_string.len; col += 1) { + for (Int col = visible.min.x; col < visible.max.x && col >= 0 && col < line_string.len; col += 1) { bool a = line > min.line && line < max.line; bool b = min.line != max.line && (line == min.line && col >= min.col); bool c = min.line != max.line && (line == max.line && col < max.col); @@ -150,8 +153,10 @@ void DrawWindow(Window &window) { View &view = *GetActiveView(&window); Buffer *buffer = GetBuffer(view.buffer_id); DrawRectangleRec(ToRectangle(window.total_rect), ColorBackground); + bool is_active = IsActive(&window) || window.id.id == GetLastActiveWindow().id; BeginScissorMode((int)window.document_rect.min.x, (int)window.document_rect.min.y, (int)window.document_rect.max.x - (int)window.document_rect.min.x, (int)window.document_rect.max.y - (int)window.document_rect.min.y); + BeginProfileScope("draw_caret_selection"); For(view.carets) { Int front = GetFront(it); XY fxy = PosToXY(*buffer, front); @@ -161,15 +166,21 @@ void DrawWindow(Window &window) { DrawLineHighlight(window, fxy, ColorLineHighlight); } } + EndProfileScope(); DrawVisibleText(window); + BeginProfileScope("draw_carets"); + Rect2I visible = GetVisibleCells(window); For(view.carets) { - Int front = GetFront(it); - XY fxy = PosToXY(*buffer, front); - bool main_caret = &it == &view.carets.data[0]; - DrawCaret(window, fxy, 0.3f, main_caret ? ColorMainCaret : ColorSubCaret); + Int front = GetFront(it); + XY fxy = PosToXY(*buffer, front); + if (fxy.col >= visible.min.x && fxy.col < visible.min.x && fxy.line >= visible.min.y && fxy.line <= visible.max.y) { + bool main_caret = &it == &view.carets.data[0]; + DrawCaret(window, fxy, 0.3f, main_caret ? ColorMainCaret : ColorSubCaret); + } } + EndProfileScope(); EndScissorMode(); // Draw scrollbar @@ -182,7 +193,7 @@ void DrawWindow(Window &window) { Rect2 rect = Shrink(scroller.rect, 2); Color color = ColorScrollbarScroller; if (!window.mouse_selecting && (window.mouse_selecting_scrollbar || mouse_in_scrollbar)) { - if (IsActive(&window)) color = ColorScrollbarScrollerSelected; + if (is_active) color = ColorScrollbarScrollerSelected; } DrawRectangleRec(ToRectangle(rect), color); } @@ -212,7 +223,7 @@ void DrawWindow(Window &window) { EndScissorMode(); } - if (!IsActive(&window)) { + if (!is_active) { DrawRectangleRec(ToRectangle(window.total_rect), {0, 0, 0, 30}); } }