From b8e6949dfb8a88c832e82f8b7e853fe0ed462da0 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 24 Aug 2024 14:08:25 +0200 Subject: Remove scrollable page from gsr page, fix crash when navigating back --- src/gui/GsrPage.cpp | 80 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 22 deletions(-) (limited to 'src/gui/GsrPage.cpp') 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) { + 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) { - 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 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 -- cgit v1.2.3