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; Rect2 rect;
double begin; double begin;
double end; double end;
Int line_count;
}; };
Rect2I GetVisibleCells(const View &view); Rect2I GetVisibleCells(const View &view);

View File

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

@@ -21,9 +21,9 @@ Rect2I GetVisibleCells(const View &view) {
Scroller ComputeScrollerRect(const View &view) { Scroller ComputeScrollerRect(const View &view) {
Vec2I size = GetSize(view.scrollbar_rect); Vec2I size = GetSize(view.scrollbar_rect);
Int line_count = view.buffer->line_starts.len;
Rect2I vis = GetVisibleCells(view); Rect2I vis = GetVisibleCells(view);
Int line_count = view.buffer->line_starts.len + GetSize(vis).y - 1;
double begin = (double)vis.min.y / (double)line_count; double begin = (double)vis.min.y / (double)line_count;
double end = (double)vis.max.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.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)}, {(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; return result;
} }