aboutsummaryrefslogtreecommitdiff
path: root/src/gui/GsrPage.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2024-08-24 14:08:25 +0200
committerdec05eba <dec05eba@protonmail.com>2024-08-24 14:08:25 +0200
commitb8e6949dfb8a88c832e82f8b7e853fe0ed462da0 (patch)
tree596f3f33b44aee1feb4d28477f4270ad826434b2 /src/gui/GsrPage.cpp
parent54c60d9a18d103011a12939c5029dd35a8e9e200 (diff)
Remove scrollable page from gsr page, fix crash when navigating back
Diffstat (limited to 'src/gui/GsrPage.cpp')
-rw-r--r--src/gui/GsrPage.cpp80
1 files changed, 58 insertions, 22 deletions
diff --git a/src/gui/GsrPage.cpp b/src/gui/GsrPage.cpp
index db49ced..df997e9 100644
--- a/src/gui/GsrPage.cpp
+++ b/src/gui/GsrPage.cpp
@@ -7,9 +7,8 @@
namespace gsr {
GsrPage::GsrPage() :
- scrollable_body(mgl::vec2f(0.0f, 0.0f)),
back_button(&get_theme().title_font, "Back",
- mgl::vec2f(get_theme().window_width / 10, get_theme().window_height / 15).floor(), get_theme().scrollable_page_bg_color),
+ mgl::vec2f(get_theme().window_width / 10, get_theme().window_height / 15).floor(), get_theme().page_bg_color),
label_text("Settings", get_theme().title_font)
{
//set_position(content_page_position);
@@ -22,30 +21,40 @@ namespace gsr {
if(!visible)
return true;
- if(!scrollable_body.on_event(event, window, mgl::vec2f(0.0f, 0.0f)))
- return false;
-
if(!back_button.on_event(event, window, mgl::vec2f(0.0f, 0.0f)))
return false;
- return true;
+ const int margin_top = margin_top_scale * get_theme().window_height;
+ const int margin_left = margin_left_scale * get_theme().window_height;
+ const mgl::vec2f content_page_position = get_content_position() + mgl::vec2f(margin_left, get_border_size() + margin_top).floor();
+
+ Widget *selected_widget = selected_child_widget;
+
+ if(selected_widget) {
+ if(!selected_widget->on_event(event, window, content_page_position))
+ return false;
+ }
+
+ // Process widgets by visibility (backwards)
+ return widgets.for_each_reverse([selected_widget, &window, &event, content_page_position](std::unique_ptr<Widget> &widget) {
+ if(widget.get() != selected_widget) {
+ if(!widget->on_event(event, window, content_page_position))
+ return false;
+ }
+ return true;
+ });
}
- void GsrPage::draw(mgl::Window &window, mgl::vec2f offset) {
+ void GsrPage::draw(mgl::Window &window, mgl::vec2f) {
if(!visible)
return;
- const int margin_top = margin_top_scale * get_theme().window_height;
- const int margin_left = margin_left_scale * get_theme().window_height;
-
- const mgl::vec2f window_size = mgl::vec2f(get_theme().window_width, get_theme().window_height).floor();
const mgl::vec2f content_page_size = get_size();
- const mgl::vec2f content_page_position = mgl::vec2f(window_size * 0.5f - content_page_size * 0.5f).floor();
- offset = content_page_position + mgl::vec2f(margin_left, get_border_size() + margin_top).floor();
+ const mgl::vec2f content_page_position = get_content_position();
mgl::Rectangle background(content_page_size);
background.set_position(content_page_position);
- background.set_color(get_theme().scrollable_page_bg_color);
+ background.set_color(get_theme().page_bg_color);
window.draw(background);
mgl::Rectangle border(mgl::vec2f(content_page_size.x, get_border_size()).floor());
@@ -53,13 +62,14 @@ namespace gsr {
border.set_color(get_theme().tint_color);
window.draw(border);
- scrollable_body.set_position(offset);
- scrollable_body.draw(window, mgl::vec2f(0.0f, 0.0f));
-
draw_page_label(window, content_page_position);
back_button.set_position(content_page_position + mgl::vec2f(content_page_size.x + get_horizontal_spacing(), 0.0f).floor());
back_button.draw(window, mgl::vec2f(0.0f, 0.0f));
+
+ const int margin_top = margin_top_scale * get_theme().window_height;
+ const int margin_left = margin_left_scale * get_theme().window_height;
+ draw_children(window, content_page_position + mgl::vec2f(margin_left, get_border_size() + margin_top).floor());
}
void GsrPage::draw_page_label(mgl::Window &window, mgl::vec2f body_pos) {
@@ -80,6 +90,31 @@ namespace gsr {
window.draw(icon);
}
+ void GsrPage::draw_children(mgl::Window &window, mgl::vec2f position) {
+ Widget *selected_widget = selected_child_widget;
+
+ mgl_scissor prev_scissor;
+ mgl_window_get_scissor(window.internal_window(), &prev_scissor);
+
+ const mgl::vec2f inner_size = get_inner_size();
+ mgl_scissor new_scissor = {
+ mgl_vec2i{(int)position.x, (int)position.y},
+ mgl_vec2i{(int)inner_size.x, (int)inner_size.y}
+ };
+ mgl_window_set_scissor(window.internal_window(), &new_scissor);
+
+ for(size_t i = 0; i < widgets.size(); ++i) {
+ auto &widget = widgets[i];
+ if(widget.get() != selected_widget)
+ widget->draw(window, position);
+ }
+
+ if(selected_widget)
+ selected_widget->draw(window, position);
+
+ mgl_window_set_scissor(window.internal_window(), &prev_scissor);
+ }
+
mgl::vec2f GsrPage::get_size() {
if(!visible)
return {0.0f, 0.0f};
@@ -100,16 +135,11 @@ namespace gsr {
return get_size() - mgl::vec2f(margin_left + margin_right, margin_top + margin_bottom + get_border_size());
}
- void GsrPage::add_widget(std::unique_ptr<Widget> widget) {
- scrollable_body.add_widget(std::move(widget));
- }
-
void GsrPage::set_margins(float top, float bottom, float left, float right) {
margin_top_scale = top;
margin_bottom_scale = bottom;
margin_left_scale = left;
margin_right_scale = right;
- scrollable_body.set_size(get_inner_size());
}
void GsrPage::set_on_back_button_click(std::function<void()> on_click_handler) {
@@ -123,4 +153,10 @@ namespace gsr {
float GsrPage::get_horizontal_spacing() const {
return get_theme().window_width / 50;
}
+
+ mgl::vec2f GsrPage::get_content_position() {
+ const mgl::vec2f window_size = mgl::vec2f(get_theme().window_width, get_theme().window_height).floor();
+ const mgl::vec2f content_page_size = get_size();
+ return mgl::vec2f(window_size * 0.5f - content_page_size * 0.5f).floor();
+ }
} \ No newline at end of file