diff --git a/src/text_editor/layout.cpp b/src/text_editor/layout.cpp index 5c2ffb7..68eb493 100644 --- a/src/text_editor/layout.cpp +++ b/src/text_editor/layout.cpp @@ -34,6 +34,8 @@ struct Window { Range selection_anchor_point; bool mouse_selecting; + bool mouse_selecting_hori_bar; + bool mouse_selecting_vert_bar; Vec2 scroll; // window_world_to_window_units Cursor main_cursor_begin_frame; Array cursors; diff --git a/src/text_editor/main.cpp b/src/text_editor/main.cpp index e72cbd1..34d0f2f 100644 --- a/src/text_editor/main.cpp +++ b/src/text_editor/main.cpp @@ -94,7 +94,7 @@ int main() { for (int i = 0; i < 50; i += 1) { BeforeEdit(&window); Array edits = {FrameArena}; - AddEdit(&edits, GetEnd(window.buffer), Format(FrameArena, "line number: %d\n", i)); + AddEdit(&edits, GetEnd(window.buffer), Format(FrameArena, "line number line number line number line number line number line number: %d\n", i)); ApplyEdits(&window, edits); AfterEdit(&window, edits); } @@ -124,6 +124,7 @@ int main() { float mouse_wheel = GetMouseWheelMove() * 48; focused_window->scroll.y -= mouse_wheel; focused_window->scroll.y = ClampBottom(focused_window->scroll.y, 0.f); + focused_window->scroll.x = ClampBottom(focused_window->scroll.x, 0.f); MergeCursors(focused_window); if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_A)) { @@ -418,19 +419,76 @@ int main() { ForItem(window, windows) { // Draw and layout window overlay + Vec2 mouse = GetMousePosition(); { window.rect = window.start_rect; Rect2 horizontal_bar_rect = CutBottom(&window.rect, 10); Rect2 vertical_bar_rect = CutRight(&window.rect, 10); Rect2 line_numbers = CutLeft(&window.rect, 50); - Rectangle rectangle_in_render_units = ToRectangle(window.rect); - DrawRectangleRec(rectangle_in_render_units, WHITE); + DrawRectangleRec(ToRectangle(window.rect), WHITE); + + Vec2 size = GetSize(window.rect); + Vec2 min = window.scroll / window.layout.buffer_world_pixel_size; + Vec2 max = (window.scroll + size) / window.layout.buffer_world_pixel_size; + + DrawRectangleRec(ToRectangle(vertical_bar_rect), GRAY); + { + float vert_size = GetSize(vertical_bar_rect).y; + float vert_begin = min.y * vert_size; + float vert_end = max.y * vert_size; + Rect2 rect = vertical_bar_rect; + rect.min.y = vert_begin; + rect.max.y = vert_end; + rect = Shrink(rect, 2); + DrawRectangleRec(ToRectangle(rect), LIGHTGRAY); + + if (CheckCollisionPointRec(mouse, ToRectangle(vertical_bar_rect))) { + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { + window.mouse_selecting_vert_bar = true; + } + } + + if (window.mouse_selecting_vert_bar) { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) == false) { + window.mouse_selecting_vert_bar = false; + } + float value = GetMouseDelta().y / vert_size; + window.scroll.y += value * window.layout.buffer_world_pixel_size.y; + window.scroll.y = ClampBottom(window.scroll.y, 0.f); + } + } + + DrawRectangleRec(ToRectangle(horizontal_bar_rect), GRAY); + { + float hori_size = GetSize(horizontal_bar_rect).x; + float hori_begin = min.x * hori_size; + float hori_end = max.x * hori_size; + Rect2 rect = horizontal_bar_rect; + rect.min.x = hori_begin; + rect.max.x = hori_end; + rect = Shrink(rect, 2); + DrawRectangleRec(ToRectangle(rect), LIGHTGRAY); + + if (CheckCollisionPointRec(mouse, ToRectangle(horizontal_bar_rect))) { + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { + window.mouse_selecting_hori_bar = true; + } + } + + if (window.mouse_selecting_hori_bar) { + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) == false) { + window.mouse_selecting_hori_bar = false; + } + float value = GetMouseDelta().x / hori_size; + window.scroll.x += value * window.layout.buffer_world_pixel_size.x; + window.scroll.x = ClampBottom(window.scroll.x, 0.f); + } + } } // Mouse selection - { - Vec2 mouse = GetMousePosition(); + if (!window.mouse_selecting_hori_bar && !window.mouse_selecting_vert_bar) { bool mouse_in_window = CheckCollisionPointRec(mouse, ToRectangle(window.rect)); if (!window.mouse_selecting && mouse_in_window) { SetMouseCursor(MOUSE_CURSOR_IBEAM);