Improve scrollbar

This commit is contained in:
Krzosa Karol
2024-07-22 14:49:09 +02:00
parent 9f2aafb95e
commit 9229135588
3 changed files with 11 additions and 12 deletions

View File

@@ -22,6 +22,7 @@ struct Scroller {
Rect2 rect;
double begin;
double end;
Int line_count;
};
Rect2I GetVisibleCells(const View &view);

View File

@@ -346,11 +346,9 @@ 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;
Scroller s = ComputeScrollerRect(view);
double size_y = (double)GetSize(view.scrollbar_rect).y;
double p = _mouse.y - view.scrollbar_rect.min.y;
if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) {
view.mouse_selecting_scrollbar = true;
@@ -360,8 +358,8 @@ void HandleKeybindings(View *_view) {
if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) {
if (_mouse.y < s.rect.min.y || _mouse.y > s.rect.max.y) {
view.scroll.y = (Int)(p / size_y * line_count * view.line_spacing);
view.mouse_scroller_offset = -GetSize(s.rect).y / 2.0 / size_y;
view.scroll.y = (Int)(p / size_y * (double)s.line_count * (double)view.line_spacing);
view.mouse_scroller_offset = -(double)GetSize(s.rect).y / 2.0 / size_y;
} else {
view.mouse_scroller_offset = (s.rect.min.y - p) / size_y;
}
@@ -370,7 +368,7 @@ void HandleKeybindings(View *_view) {
if (view.mouse_selecting_scrollbar) {
double v = p / size_y;
v = v + (view.mouse_scroller_offset);
view.scroll.y = (Int)(v * line_count * view.line_spacing);
view.scroll.y = (Int)(v * (double)s.line_count * (double)view.line_spacing);
}
}
}

View File

@@ -20,10 +20,10 @@ Rect2I GetVisibleCells(const View &view) {
}
Scroller ComputeScrollerRect(const View &view) {
Vec2I size = GetSize(view.scrollbar_rect);
Int line_count = view.buffer->line_starts.len;
Vec2I size = GetSize(view.scrollbar_rect);
Rect2I vis = GetVisibleCells(view);
Int line_count = view.buffer->line_starts.len + GetSize(vis).y - 1;
Rect2I vis = GetVisibleCells(view);
double begin = (double)vis.min.y / (double)line_count;
double end = (double)vis.max.y / (double)line_count;
@@ -31,7 +31,7 @@ Scroller ComputeScrollerRect(const View &view) {
{(float)view.scrollbar_rect.min.x, (float)view.scrollbar_rect.min.y + (float)((double)size.y * begin)},
{(float)view.scrollbar_rect.max.x, (float)view.scrollbar_rect.min.y + (float)((double)size.y * end)},
};
Scroller result = {rect, begin, end};
Scroller result = {rect, begin, end, line_count};
return result;
}