aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gui/List.cpp24
-rw-r--r--src/gui/RadioButton.cpp5
-rw-r--r--src/main.cpp42
3 files changed, 44 insertions, 27 deletions
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;
}