Use stack for page navigation, dont add spacing between list elements if the widget is empty or not visible

This commit is contained in:
dec05eba
2024-08-07 07:15:05 +02:00
parent 6e133a4bba
commit 8b98c612f7
4 changed files with 46 additions and 29 deletions

4
TODO
View File

@@ -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.
Handle events in draw function because the render position of elements is available there so why duplicate it in event handler.

View File

@@ -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;

View File

@@ -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();

View File

@@ -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;
}