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 --- TODO | 4 ++-- src/gui/List.cpp | 24 +++++++++++++++++------- src/gui/RadioButton.cpp | 5 ++++- src/main.cpp | 42 +++++++++++++++++++++++------------------- 4 files changed, 46 insertions(+), 29 deletions(-) diff --git a/TODO b/TODO index 873bd99..196ee6f 100644 --- a/TODO +++ b/TODO @@ -8,7 +8,7 @@ Maybe change design to have black triangles appear and get larger until they fil Have buttons appear slanted in 3D. All of these things should be done with vertex buffer, for real 3D. -DISPLAY gamescope-0 +WAYLAND_DISPLAY gamescope-0, DISPLAY=:1 (gamescope xwayland) Optimize list/page when having a few items in it (dont use vector>). @@ -16,4 +16,4 @@ Only redraw ui if changed (dirty state, propagate upward. Set dirty when adding Use _NET_WM_ALLOWED_ACTIONS. Same for notifications. -Handle events in draw function because the render position of elements is available there so why duplicate it in event handler. \ No newline at end of file +Handle events in draw function because the render position of elements is available there so why duplicate it in event handler. 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