Improve scrollbar
This commit is contained in:
@@ -22,6 +22,7 @@ struct Scroller {
|
||||
Rect2 rect;
|
||||
double begin;
|
||||
double end;
|
||||
Int line_count;
|
||||
};
|
||||
|
||||
Rect2I GetVisibleCells(const View &view);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user