aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2024-08-07 07:15:05 +0200
committerdec05eba <dec05eba@protonmail.com>2024-08-07 07:17:48 +0200
commit8b98c612f7b17feaafabc48ad584498e1198f5ee (patch)
treef1a25d8ddc5c10af466583a302b5a2dcbed65c2d
parent6e133a4bbad472dc03215acd6a22b0211c30a6f3 (diff)
Use stack for page navigation, dont add spacing between list elements if the widget is empty or not visible
-rw-r--r--TODO4
-rw-r--r--src/gui/List.cpp24
-rw-r--r--src/gui/RadioButton.cpp5
-rw-r--r--src/main.cpp42
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<unique_ptr<Widget>>).
@@ -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 <optional>
#include <signal.h>
#include <assert.h>
+#include <stack>
#include <X11/Xlib.h>
#include <X11/cursorfont.h>
@@ -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<gsr::Page*> 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;
}