From b709805cfac4d1fe1bfe28e497a3e48e224372a8 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Wed, 7 Aug 2024 20:32:59 +0200 Subject: Move settings ui to SettingsPage class, show different widgets for different settings page, show different widgets depending on combobox selections --- src/gui/ComboBox.cpp | 15 +++++++++++++-- src/gui/List.cpp | 6 +++--- src/gui/RadioButton.cpp | 10 ++++++++-- src/gui/ScrollablePage.cpp | 9 ++++++++- 4 files changed, 32 insertions(+), 8 deletions(-) (limited to 'src/gui') diff --git a/src/gui/ComboBox.cpp b/src/gui/ComboBox.cpp index 0b232f2..6aff979 100644 --- a/src/gui/ComboBox.cpp +++ b/src/gui/ComboBox.cpp @@ -39,9 +39,14 @@ namespace gsr { Item &item = items[i]; const mgl::FloatRect text_bounds = item.text.get_bounds(); if(mgl::FloatRect(pos - mgl::vec2f(padding_left, padding_top), item_size).contains(mouse_pos)) { + const size_t prev_selected_item = selected_item; selected_item = i; show_dropdown = false; remove_widget_as_selected_in_parent(); + + if(selected_item != prev_selected_item && on_selection_changed) + on_selection_changed(item.text.get_string(), item.id); + return false; } pos.y += text_bounds.size.y + padding_top + padding_bottom; @@ -141,10 +146,16 @@ namespace gsr { dirty = true; } - void ComboBox::set_selected_item(const std::string &id) { + void ComboBox::set_selected_item(const std::string &id, bool trigger_event) { for(size_t i = 0; i < items.size(); ++i) { - if(items[i].id == id) { + auto &item = items[i]; + if(item.id == id) { + const size_t prev_selected_item = selected_item; selected_item = i; + + if(trigger_event && selected_item != prev_selected_item && on_selection_changed) + on_selection_changed(item.text.get_string(), item.id); + break; } } diff --git a/src/gui/List.cpp b/src/gui/List.cpp index 5e5a172..039842d 100644 --- a/src/gui/List.cpp +++ b/src/gui/List.cpp @@ -67,7 +67,7 @@ namespace gsr { // TODO: Handle start/end alignment const mgl::vec2f size = get_size(); - const mgl::vec2f parent_size = parent_widget ? parent_widget->get_size() : mgl::vec2f(0.0f, 0.0f); + const mgl::vec2f parent_inner_size = parent_widget ? parent_widget->get_inner_size() : mgl::vec2f(0.0f, 0.0f); const mgl::vec2f spacing = (spacing_scale * get_theme().window_height).floor(); switch(orientation) { @@ -80,8 +80,8 @@ namespace gsr { // 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_size.x * 0.5f); + if(widget->get_horizontal_alignment() == Widget::Alignment::CENTER && parent_inner_size.x > 0.001f) + offset.x = floor(parent_inner_size.x * 0.5f - widget_size.x * 0.5f); else if(content_alignment == Alignment::CENTER) offset.x = floor(size.x * 0.5f - widget_size.x * 0.5f); else diff --git a/src/gui/RadioButton.cpp b/src/gui/RadioButton.cpp index b3e9a4e..15b0989 100644 --- a/src/gui/RadioButton.cpp +++ b/src/gui/RadioButton.cpp @@ -121,10 +121,16 @@ namespace gsr { dirty = true; } - void RadioButton::set_selected_item(const std::string &id) { + void RadioButton::set_selected_item(const std::string &id, bool trigger_event) { for(size_t i = 0; i < items.size(); ++i) { - if(items[i].id == id) { + auto &item = items[i]; + if(item.id == id) { + const size_t prev_selected_item = selected_item; selected_item = i; + + if(trigger_event && selected_item != prev_selected_item && on_selection_changed) + on_selection_changed(item.text.get_string(), item.id); + break; } } diff --git a/src/gui/ScrollablePage.cpp b/src/gui/ScrollablePage.cpp index 2c1143a..a0977ce 100644 --- a/src/gui/ScrollablePage.cpp +++ b/src/gui/ScrollablePage.cpp @@ -57,7 +57,7 @@ namespace gsr { mgl_scissor prev_scissor; mgl_window_get_scissor(window.internal_window(), &prev_scissor); - const mgl::vec2f content_size = get_size(); + const mgl::vec2f content_size = get_inner_size(); mgl_scissor new_scissor = { mgl_vec2i{(int)offset.x, (int)offset.y}, mgl_vec2i{(int)content_size.x, (int)content_size.y} @@ -81,6 +81,13 @@ namespace gsr { if(!visible) return {0.0f, 0.0f}; + return size; + } + + mgl::vec2f ScrollablePage::get_inner_size() { + if(!visible) + return {0.0f, 0.0f}; + const int margin_top = margin_top_scale * get_theme().window_height; const int margin_bottom = margin_bottom_scale * get_theme().window_height; const int margin_left = margin_left_scale * get_theme().window_height; -- cgit v1.2.3