diff options
author | dec05eba <dec05eba@protonmail.com> | 2024-08-01 20:46:13 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2024-08-01 20:46:13 +0200 |
commit | 27255cdb64b87c048fad70ca893f684cf61819a4 (patch) | |
tree | d89ea70475d1e8e9508d652eef836c49c0d162a8 | |
parent | 6624db873c91087bc1805b9d018c92c455b85190 (diff) |
Change global widget container to page
-rw-r--r-- | include/gui/Page.hpp | 27 | ||||
-rw-r--r-- | include/gui/Widget.hpp | 1 | ||||
-rw-r--r-- | include/gui/WidgetContainer.hpp | 30 | ||||
-rw-r--r-- | src/gui/ComboBox.cpp | 1 | ||||
-rw-r--r-- | src/gui/Page.cpp | 22 | ||||
-rw-r--r-- | src/gui/Widget.cpp | 5 | ||||
-rw-r--r-- | src/gui/WidgetContainer.cpp | 57 | ||||
-rw-r--r-- | src/main.cpp | 18 |
8 files changed, 61 insertions, 100 deletions
diff --git a/include/gui/Page.hpp b/include/gui/Page.hpp new file mode 100644 index 0000000..1435e68 --- /dev/null +++ b/include/gui/Page.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include <vector> +#include <memory> + +namespace mgl { + class Event; + class Window; +} + +namespace gsr { + class Widget; + + class Page { + public: + Page() = default; + Page(const Page&) = delete; + Page& operator=(const Page&) = delete; + + void add_widget(std::unique_ptr<Widget> widget); + + void on_event(mgl::Event &event, mgl::Window &window); + void draw(mgl::Window &window); + private: + std::vector<std::unique_ptr<Widget>> widgets; + }; +}
\ No newline at end of file diff --git a/include/gui/Widget.hpp b/include/gui/Widget.hpp index 81f47b5..63cb64a 100644 --- a/include/gui/Widget.hpp +++ b/include/gui/Widget.hpp @@ -24,6 +24,5 @@ namespace gsr { virtual mgl::vec2f get_position() const; protected: mgl::vec2f position; - bool move_to_top = false; }; }
\ No newline at end of file diff --git a/include/gui/WidgetContainer.hpp b/include/gui/WidgetContainer.hpp deleted file mode 100644 index e40ffb9..0000000 --- a/include/gui/WidgetContainer.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include <vector> -#include <memory> - -namespace mgl { - class Event; - class Window; -} - -namespace gsr { - class Widget; - - class WidgetContainer { - public: - static WidgetContainer& get_instance(); - - void add_widget(Widget *widget); - void remove_widget(Widget *widget); - - void on_event(mgl::Event &event, mgl::Window &window); - void draw(mgl::Window &window); - private: - WidgetContainer() = default; - WidgetContainer& operator=(const WidgetContainer&) = delete; - WidgetContainer(const WidgetContainer&) = delete; - private: - std::vector<Widget*> widgets; - }; -}
\ No newline at end of file diff --git a/src/gui/ComboBox.cpp b/src/gui/ComboBox.cpp index dd683e1..2766797 100644 --- a/src/gui/ComboBox.cpp +++ b/src/gui/ComboBox.cpp @@ -40,7 +40,6 @@ namespace gsr { if(mgl::FloatRect(position, item_size).contains(mouse_pos)) { show_dropdown = !show_dropdown; - move_to_top = true; } else { show_dropdown = false; } diff --git a/src/gui/Page.cpp b/src/gui/Page.cpp new file mode 100644 index 0000000..817c7fd --- /dev/null +++ b/src/gui/Page.cpp @@ -0,0 +1,22 @@ +#include "../../include/gui/Page.hpp" +#include "../../include/gui/Widget.hpp" + +namespace gsr { + void Page::add_widget(std::unique_ptr<Widget> widget) { + widgets.push_back(std::move(widget)); + } + + void Page::on_event(mgl::Event &event, mgl::Window &window) { + // Process widgets by visibility (backwards) + for(auto it = widgets.rbegin(), end = widgets.rend(); it != end; ++it) { + if(!(*it)->on_event(event, window)) + return; + } + } + + void Page::draw(mgl::Window &window) { + for(auto &widget : widgets) { + widget->draw(window); + } + } +}
\ No newline at end of file diff --git a/src/gui/Widget.cpp b/src/gui/Widget.cpp index 718fd8d..1dc4d98 100644 --- a/src/gui/Widget.cpp +++ b/src/gui/Widget.cpp @@ -1,13 +1,12 @@ #include "../../include/gui/Widget.hpp" -#include "../../include/gui/WidgetContainer.hpp" namespace gsr { Widget::Widget() { - WidgetContainer::get_instance().add_widget(this); + } Widget::~Widget() { - WidgetContainer::get_instance().remove_widget(this); + } void Widget::set_position(mgl::vec2f position) { diff --git a/src/gui/WidgetContainer.cpp b/src/gui/WidgetContainer.cpp deleted file mode 100644 index 8824d1a..0000000 --- a/src/gui/WidgetContainer.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include "../../include/gui/WidgetContainer.hpp" -#include "../../include/gui/Widget.hpp" - -namespace gsr { - // static - WidgetContainer& WidgetContainer::get_instance() { - static WidgetContainer instance; - return instance; - } - - void WidgetContainer::add_widget(Widget *widget) { - // TODO: to_be_added, and remove in the draw loop - #ifdef DEBUG - for(Widget *existing_widget : widgets) { - if(existing_widget == widget) - return; - } - #endif - widgets.push_back(widget); - } - - void WidgetContainer::remove_widget(Widget *widget) { - // TODO: to_be_removed, and remove in draw loop - for(auto it = widgets.begin(), end = widgets.end(); it != end; ++it) { - if(*it == widget) { - widgets.erase(it); - return; - } - } - } - - void WidgetContainer::on_event(mgl::Event &event, mgl::Window &window) { - // Process widgets by visibility (backwards) - for(auto it = widgets.rbegin(), end = widgets.rend(); it != end; ++it) { - if(!(*it)->on_event(event, window)) - return; - } - } - - void WidgetContainer::draw(mgl::Window &window) { - for(auto it = widgets.begin(); it != widgets.end(); ++it) { - Widget *widget = *it; - if(widget->move_to_top) { - widget->move_to_top = false; - std::swap(*it, widgets.back()); - /*if(widgets.back() != widget) { - widgets.erase(it); - widgets.push_back(widget); - }*/ - } - } - - for(Widget *widget : widgets) { - widget->draw(window); - } - } -}
\ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 0ecd715..0e7721e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,5 @@ -#include "../include/gui/WidgetContainer.hpp" +#include "../include/gui/Page.hpp" #include "../include/gui/DropdownButton.hpp" #include "../include/gui/ComboBox.hpp" #include "../include/Process.hpp" @@ -235,8 +235,10 @@ int main(int argc, char **argv) { mgl::Rectangle bg_screenshot_overlay(window.get_size().to_vec2f()); bg_screenshot_overlay.set_color(bg_color); + gsr::Page front_page; + struct MainButton { - std::unique_ptr<gsr::DropdownButton> button; + gsr::DropdownButton* button; gsr::GsrMode mode; }; @@ -273,9 +275,11 @@ int main(int argc, char **argv) { auto button = std::make_unique<gsr::DropdownButton>(&title_font, &font, titles[i], descriptions_on[i], descriptions_off[i], textures[i], mgl::vec2f(button_width, button_height)); button->add_item("Start", "start"); button->add_item("Settings", "settings"); + gsr::DropdownButton *button_ptr = button.get(); + front_page.add_widget(std::move(button)); MainButton main_button = { - std::move(button), + button_ptr, gsr::GsrMode::Unknown }; @@ -482,14 +486,12 @@ int main(int argc, char **argv) { mgl::Clock state_update_timer; const double state_update_timeout_sec = 2.0; - gsr::WidgetContainer &widget_container = gsr::WidgetContainer::get_instance(); - mgl::Event event; event.type = mgl::Event::MouseMoved; event.mouse_move.x = window.get_mouse_position().x; event.mouse_move.y = window.get_mouse_position().y; - widget_container.on_event(event, window); + front_page.on_event(event, window); auto render = [&] { window.clear(bg_color); @@ -503,7 +505,7 @@ int main(int argc, char **argv) { // window.draw(audio_input_title); // window.draw(video_quality_title); // window.draw(framerate_title); - widget_container.draw(window); + front_page.draw(window); window.draw(top_bar_background); window.draw(top_bar_text); window.draw(logo_sprite); @@ -519,7 +521,7 @@ int main(int argc, char **argv) { } while(window.poll_event(event)) { - widget_container.on_event(event, window); + front_page.on_event(event, window); if(event.type == mgl::Event::KeyPressed) { if(event.key.code == mgl::Keyboard::Escape) { window.set_visible(false); |