From 8b98c612f7b17feaafabc48ad584498e1198f5ee Mon Sep 17 00:00:00 2001 From: dec05eba Date: Wed, 7 Aug 2024 07:15:05 +0200 Subject: Use stack for page navigation, dont add spacing between list elements if the widget is empty or not visible --- src/gui/List.cpp | 24 +++++++++++++++++------- src/gui/RadioButton.cpp | 5 ++++- src/main.cpp | 42 +++++++++++++++++++++++------------------- 3 files changed, 44 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/gui/List.cpp b/src/gui/List.cpp index 1e81b83..5e5a172 100644 --- a/src/gui/List.cpp +++ b/src/gui/List.cpp @@ -76,20 +76,23 @@ namespace gsr { if(!widget->visible) continue; + const auto widget_size = widget->get_size(); // TODO: Do this parent widget alignment for horizontal alignment and for other types of widget alignment // and other widgets. // Also take this widget alignment into consideration in get_size. if(widget->get_horizontal_alignment() == Widget::Alignment::CENTER && parent_size.x > 0.001f) - offset.x = floor(parent_size.x * 0.5f - widget->get_size().x * 0.5f); + offset.x = floor(parent_size.x * 0.5f - widget_size.x * 0.5f); else if(content_alignment == Alignment::CENTER) - offset.x = floor(size.x * 0.5f - widget->get_size().x * 0.5f); + offset.x = floor(size.x * 0.5f - widget_size.x * 0.5f); else offset.x = 0.0f; widget->set_position(draw_pos + offset); if(widget.get() != selected_widget) widget->draw(window, mgl::vec2f(0.0f, 0.0f)); - draw_pos.y += widget->get_size().y + spacing.y; + draw_pos.y += widget_size.y; + if(widget_size.y > 0.001f) + draw_pos.y += spacing.y; } break; } @@ -98,13 +101,16 @@ namespace gsr { if(!widget->visible) continue; + const auto widget_size = widget->get_size(); if(content_alignment == Alignment::CENTER) - offset.y = floor(size.y * 0.5f - widget->get_size().y * 0.5f); + offset.y = floor(size.y * 0.5f - widget_size.y * 0.5f); widget->set_position(draw_pos + offset); if(widget.get() != selected_widget) widget->draw(window, mgl::vec2f(0.0f, 0.0f)); - draw_pos.x += widget->get_size().x + spacing.x; + draw_pos.x += widget_size.x; + if(widget_size.x > 0.001f) + draw_pos.x += spacing.x; } break; } @@ -156,7 +162,9 @@ namespace gsr { const auto widget_size = widget->get_size(); size.x = std::max(size.x, widget_size.x); - size.y += widget_size.y + spacing.y; + size.y += widget_size.y; + if(widget_size.y > 0.001f) + size.y += spacing.y; } break; } @@ -166,7 +174,9 @@ namespace gsr { continue; const auto widget_size = widget->get_size(); - size.x += widget_size.x + spacing.x; + size.x += widget_size.x; + if(widget_size.x > 0.001f) + size.x += spacing.x; size.y = std::max(size.y, widget_size.y); } break; diff --git a/src/gui/RadioButton.cpp b/src/gui/RadioButton.cpp index e5ba02a..b3e9a4e 100644 --- a/src/gui/RadioButton.cpp +++ b/src/gui/RadioButton.cpp @@ -56,6 +56,9 @@ namespace gsr { update_if_dirty(); + if(items.empty()) + return; + const int padding_top = padding_top_scale * get_theme().window_height; const int padding_bottom = padding_bottom_scale * get_theme().window_height; const int padding_left = padding_left_scale * get_theme().window_height; @@ -106,7 +109,7 @@ namespace gsr { } mgl::vec2f RadioButton::get_size() { - if(!visible) + if(!visible || items.empty()) return {0.0f, 0.0f}; update_if_dirty(); diff --git a/src/main.cpp b/src/main.cpp index 7351e54..6a0745f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -565,7 +566,8 @@ int main(int argc, char **argv) { gsr::StaticPage stream_settings_page(window_size.to_vec2f()); stream_settings_page.add_widget(std::move(stream_settings_content)); - gsr::Page *current_page = &front_page; + std::stack page_stack; + page_stack.push(&front_page); struct MainButton { gsr::DropdownButton* button; @@ -652,7 +654,7 @@ int main(int argc, char **argv) { // Replay main_buttons[0].button->on_click = [&](const std::string &id) { if(id == "settings") { - current_page = &replay_settings_page; + page_stack.push(&replay_settings_page); return; } /* @@ -677,7 +679,7 @@ int main(int argc, char **argv) { // Record main_buttons[1].button->on_click = [&](const std::string &id) { if(id == "settings") { - current_page = &record_settings_page; + page_stack.push(&record_settings_page); return; } @@ -762,7 +764,7 @@ int main(int argc, char **argv) { // Stream main_buttons[2].button->on_click = [&](const std::string &id) { if(id == "settings") { - current_page = &stream_settings_page; + page_stack.push(&stream_settings_page); return; } }; @@ -813,7 +815,7 @@ int main(int argc, char **argv) { }; const auto settings_back_button_callback = [&] { - current_page = &front_page; + page_stack.pop(); }; for(int i = 0; i < num_settings_pages; ++i) { @@ -850,7 +852,7 @@ int main(int argc, char **argv) { event.type = mgl::Event::MouseMoved; event.mouse_move.x = window.get_mouse_position().x; event.mouse_move.y = window.get_mouse_position().y; - current_page->on_event(event, window, mgl::vec2f(0.0f, 0.0f)); + page_stack.top()->on_event(event, window, mgl::vec2f(0.0f, 0.0f)); const auto render = [&] { window.clear(bg_color); @@ -862,26 +864,25 @@ int main(int argc, char **argv) { window.draw(top_bar_text); window.draw(logo_sprite); window.draw(close_sprite); - current_page->draw(window, mgl::vec2f(0.0f, 0.0f)); + page_stack.top()->draw(window, mgl::vec2f(0.0f, 0.0f)); window.display(); }; while(window.is_open()) { - if(!running) { - window.set_visible(false); - window.close(); - break; + if(page_stack.empty() || !running) { + running = false; + goto quit; } while(window.poll_event(event)) { - current_page->on_event(event, window, mgl::vec2f(0.0f, 0.0f)); + page_stack.top()->on_event(event, window, mgl::vec2f(0.0f, 0.0f)); if(event.type == mgl::Event::KeyPressed) { - if(event.key.code == mgl::Keyboard::Escape) { - window.set_visible(false); - window.close(); - break; - } + if(event.key.code == mgl::Keyboard::Escape && !page_stack.empty()) + page_stack.pop(); } + + if(page_stack.empty()) + break; } // if(state_update_timer.get_elapsed_time_seconds() >= state_update_timeout_sec) { @@ -889,10 +890,14 @@ int main(int argc, char **argv) { // update_overlay_shape(); // } - render(); + if(!page_stack.empty()) + render(); } + quit: fprintf(stderr, "shutting down!\n"); + gsr::deinit_theme(); + window.close(); if(gpu_screen_recorder_process != -1) { kill(gpu_screen_recorder_process, SIGINT); @@ -904,6 +909,5 @@ int main(int argc, char **argv) { gpu_screen_recorder_process = -1; } - gsr::deinit_theme(); return 0; } -- cgit v1.2.3