diff options
Diffstat (limited to 'src/mgui/scrollview.c')
-rw-r--r-- | src/mgui/scrollview.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/src/mgui/scrollview.c b/src/mgui/scrollview.c index c7a4075..a11862f 100644 --- a/src/mgui/scrollview.c +++ b/src/mgui/scrollview.c @@ -4,6 +4,7 @@ #include <mgl/mgl.h> #include <mgl/window/window.h> #include <mgl/window/event.h> +#include <mgl/graphics/rectangle.h> #include <limits.h> #include <assert.h> @@ -68,14 +69,15 @@ void mgui_scrollview_set_position(mgui_scrollview *self, mgl_vec2i position) { void mgui_scrollview_calculate_size(mgui_scrollview *self, mgl_vec2i max_size) { self->widget.size = max_size; - if(self->widget.size.x == WIDGET_NATURAL_SIZE) - self->widget.size.x = 500; - if(self->widget.size.y == WIDGET_NATURAL_SIZE) + if(self->widget.size.x >= WIDGET_NATURAL_SIZE/2 || self->widget.size.y >= WIDGET_NATURAL_SIZE/2) { + self->widget.size.x = 500; self->widget.size.y = 600; + } + /* TODO: this assumes child list uses vertical scroll. Make this work for horizontal scroll as well */ if(self->child) - mgui_widget_calculate_size(self->child, (mgl_vec2i){ WIDGET_NATURAL_SIZE, WIDGET_NATURAL_SIZE }); + mgui_widget_calculate_size(self->child, (mgl_vec2i){ max_size.x, WIDGET_NATURAL_SIZE }); } void mgui_scrollview_on_event(mgui_scrollview *self, mgl_window *window, mgl_event *event) { @@ -90,7 +92,7 @@ void mgui_scrollview_on_event(mgui_scrollview *self, mgl_window *window, mgl_eve /* TODO: Check if visible in scissor */ void mgui_scrollview_draw(mgui_scrollview *self, mgl_window *window) { - const double frame_time = mgui_get_seconds_since_last_update(); + const double frame_time = mgui_get_frame_time_seconds(); self->mouse_scroll.x *= max_float(0.0f, (1.0f - frame_time * SCROLL_DEACCEL)); self->mouse_scroll.y *= max_float(0.0f, (1.0f - frame_time * SCROLL_DEACCEL)); @@ -127,15 +129,41 @@ void mgui_scrollview_draw(mgui_scrollview *self, mgl_window *window) { mgl_scissor prev_scissor; mgl_window_get_scissor(window, &prev_scissor); + /* TODO: Fix all this margin crap, it should be invisible */ + const int margin_width = self->widget.margin.top + self->widget.margin.bottom; + const int margin_height = self->widget.margin.top + self->widget.margin.bottom; + mgl_scissor new_scissor = { .position = self->position, - .size = self->widget.size + .size = (mgl_vec2i){ self->widget.size.x - margin_width, self->widget.size.y - margin_height } }; mgl_window_set_scissor(window, &new_scissor); - mgui_widget_set_position(self->child, (mgl_vec2i){ self->position.x + self->scroll.x, self->position.y + self->scroll.y }); + mgui_widget_set_position(self->child, + (mgl_vec2i){ self->position.x + self->scroll.x + self->child->margin.left, self->position.y + self->scroll.y + self->child->margin.top }); mgui_widget_draw(self->child, window); mgl_window_set_scissor(window, &prev_scissor); + + { + /* TODO: Fix all this margin crap, it should be invisible */ + const int margin_height = self->widget.margin.top + self->widget.margin.bottom; + const int height = self->widget.size.y - margin_height; + const double scrollbar_height_ratio = child_size.y == 0 ? 0.0 : (double)height / (double)child_size.y; + const int scrollbar_height = scrollbar_height_ratio * height; + + const double scroll_ratio = child_size.y == 0 ? 0.0 : (double)-self->scroll.y / (double)child_size.y; + const int scrollbar_offset_y = height * scroll_ratio; + + const int scrollbar_width = 5; + const int right = self->widget.size.x - self->widget.margin.left - self->widget.margin.right; + mgl_rectangle rect = { + .position = { self->position.x + right - scrollbar_width, self->position.y + scrollbar_offset_y }, + .size = { scrollbar_width, scrollbar_height }, + .color = { 55, 60, 68, 255 } + }; + + mgl_rectangle_draw(mgl_get_context(), &rect); + } } } |