From c2b2c2a6ae5e105c23a32ead27c304a32ce5e3cc Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Mon, 22 Jul 2024 10:31:02 +0200 Subject: [PATCH] Improve scrolling --- src/text_editor/view.h | 3 ++- src/text_editor/view_commands.cpp | 16 ++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/text_editor/view.h b/src/text_editor/view.h index db3aff2..907490a 100644 --- a/src/text_editor/view.h +++ b/src/text_editor/view.h @@ -9,9 +9,10 @@ struct View { Rect2I scrollbar_rect; Vec2I scroll; - bool mouse_selecting; bool mouse_selecting_scrollbar; + bool mouse_selecting; Range selection_anchor; + float mouse_scroller_offset; Buffer *buffer; Array carets; diff --git a/src/text_editor/view_commands.cpp b/src/text_editor/view_commands.cpp index f7e465a..30333ad 100644 --- a/src/text_editor/view_commands.cpp +++ b/src/text_editor/view_commands.cpp @@ -340,19 +340,23 @@ void HandleKeybindings(View *_view) { } else if (!(mouse_in_view || view.mouse_selecting) && mouse_in_scrollbar || view.mouse_selecting_scrollbar) { SetMouseCursor(MOUSE_CURSOR_DEFAULT); + Scroller s = ComputeScrollerRect(view); + double line_count = (double)view.buffer->line_starts.len; + double size_y = (double)GetSize(view.scrollbar_rect).y; + double p = _mouse.y - view.scrollbar_rect.min.y; if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { + view.mouse_scroller_offset = (float)((s.rect.min.y - p) / size_y); + } view.mouse_selecting_scrollbar = true; } else if (!IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { view.mouse_selecting_scrollbar = false; } if (view.mouse_selecting_scrollbar) { - double delta = GetMouseDelta().y; - Scroller s = ComputeScrollerRect(view); - double line_count = (double)view.buffer->line_starts.len; - double size_y = (double)GetSize(view.scrollbar_rect).y; - double v = delta / size_y; - view.scroll.y += (Int)(v * line_count * view.line_spacing); + double v = p / size_y; + v = v + (view.mouse_scroller_offset); + view.scroll.y = (Int)(v * line_count * view.line_spacing); } } }