aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/gui/Page.hpp27
-rw-r--r--include/gui/Widget.hpp1
-rw-r--r--include/gui/WidgetContainer.hpp30
-rw-r--r--src/gui/ComboBox.cpp1
-rw-r--r--src/gui/Page.cpp22
-rw-r--r--src/gui/Widget.cpp5
-rw-r--r--src/gui/WidgetContainer.cpp57
-rw-r--r--src/main.cpp18
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);