Improve scrolling

This commit is contained in:
Krzosa Karol
2024-07-22 10:31:02 +02:00
parent b2d9688fbe
commit c2b2c2a6ae
2 changed files with 12 additions and 7 deletions

View File

@@ -9,9 +9,10 @@ struct View {
Rect2I scrollbar_rect; Rect2I scrollbar_rect;
Vec2I scroll; Vec2I scroll;
bool mouse_selecting;
bool mouse_selecting_scrollbar; bool mouse_selecting_scrollbar;
bool mouse_selecting;
Range selection_anchor; Range selection_anchor;
float mouse_scroller_offset;
Buffer *buffer; Buffer *buffer;
Array<Caret> carets; Array<Caret> carets;

View File

@@ -340,19 +340,23 @@ void HandleKeybindings(View *_view) {
} else if (!(mouse_in_view || view.mouse_selecting) && mouse_in_scrollbar || view.mouse_selecting_scrollbar) { } else if (!(mouse_in_view || view.mouse_selecting) && mouse_in_scrollbar || view.mouse_selecting_scrollbar) {
SetMouseCursor(MOUSE_CURSOR_DEFAULT); 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 (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; view.mouse_selecting_scrollbar = true;
} else if (!IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { } else if (!IsMouseButtonDown(MOUSE_BUTTON_LEFT)) {
view.mouse_selecting_scrollbar = false; view.mouse_selecting_scrollbar = false;
} }
if (view.mouse_selecting_scrollbar) { if (view.mouse_selecting_scrollbar) {
double delta = GetMouseDelta().y; double v = p / size_y;
Scroller s = ComputeScrollerRect(view); v = v + (view.mouse_scroller_offset);
double line_count = (double)view.buffer->line_starts.len; view.scroll.y = (Int)(v * line_count * view.line_spacing);
double size_y = (double)GetSize(view.scrollbar_rect).y;
double v = delta / size_y;
view.scroll.y += (Int)(v * line_count * view.line_spacing);
} }
} }
} }