From 319788b5ba2957d5533d75dee2e81cebdfe3ee96 Mon Sep 17 00:00:00 2001 From: Dario Date: Sun, 12 Jan 2025 22:48:32 -0300 Subject: [PATCH] Take ownership of created pointers on Element class. --- src/ui/elements/ui_button.h | 1 - src/ui/elements/ui_element.cpp | 12 +++++++++ src/ui/elements/ui_element.h | 3 +++ src/ui/elements/ui_toggle.cpp | 2 +- src/ui/elements/ui_toggle.h | 2 +- src/ui/ui_mod_details_panel.cpp | 26 +++++++++---------- src/ui/ui_mod_details_panel.h | 32 ++++++++++++------------ src/ui/ui_mod_menu.cpp | 26 ++++++++++--------- src/ui/ui_mod_menu.h | 44 ++++++++++++++++----------------- 9 files changed, 83 insertions(+), 65 deletions(-) diff --git a/src/ui/elements/ui_button.h b/src/ui/elements/ui_button.h index b44ad4e..7ba2d21 100644 --- a/src/ui/elements/ui_button.h +++ b/src/ui/elements/ui_button.h @@ -12,7 +12,6 @@ namespace recompui { class Button : public Element { protected: ButtonStyle style = ButtonStyle::Primary; - std::unique_ptr floater; std::list> pressed_callbacks; bool hovered = false; diff --git a/src/ui/elements/ui_element.cpp b/src/ui/elements/ui_element.cpp index d20e755..ebf4cc3 100644 --- a/src/ui/elements/ui_element.cpp +++ b/src/ui/elements/ui_element.cpp @@ -81,15 +81,27 @@ Element::Element(Element *parent, uint32_t events_enabled, Rml::String base_clas base = parent->base->AppendChild(parent->base->GetOwnerDocument()->CreateElement(base_class)); + if (parent->owner) { + parent->add_child(this); + } + register_event_listeners(events_enabled); } Element::~Element() { + children.clear(); + if (owner) { base->GetParentNode()->RemoveChild(base); } } +void Element::add_child(Element *child) { + assert(child != nullptr); + + children.emplace_back(child); +} + void Element::set_property(Rml::PropertyId property_id, const Rml::Property &property, Animation animation) { assert(base != nullptr); diff --git a/src/ui/elements/ui_element.h b/src/ui/elements/ui_element.h index e477ad1..68ef1ae 100644 --- a/src/ui/elements/ui_element.h +++ b/src/ui/elements/ui_element.h @@ -154,7 +154,9 @@ struct Animation { }; class Element : public Rml::EventListener { + friend class Element; private: + void add_child(Element *child); void set_property(Rml::PropertyId property_id, const Rml::Property &property, Animation animation = Animation()); void register_event_listeners(uint32_t events_enabled); @@ -162,6 +164,7 @@ private: virtual void ProcessEvent(Rml::Event &event) override; protected: Rml::Element *base; + std::vector> children; bool owner; virtual void process_event(const Event &e); diff --git a/src/ui/elements/ui_toggle.cpp b/src/ui/elements/ui_toggle.cpp index a7e4a71..38bc441 100644 --- a/src/ui/elements/ui_toggle.cpp +++ b/src/ui/elements/ui_toggle.cpp @@ -12,7 +12,7 @@ namespace recompui { set_cursor(Cursor::Pointer); set_border_width(2.0f); - floater = std::make_unique(this); + floater = new Element(this); floater->set_position(Position::Relative); floater->set_top(2.0f); floater->set_width(80.0f); diff --git a/src/ui/elements/ui_toggle.h b/src/ui/elements/ui_toggle.h index 242af2c..3e6e388 100644 --- a/src/ui/elements/ui_toggle.h +++ b/src/ui/elements/ui_toggle.h @@ -6,7 +6,7 @@ namespace recompui { class Toggle : public Element { protected: - std::unique_ptr floater; + Element *floater; std::list> checked_callbacks; bool checked = false; bool hovered = false; diff --git a/src/ui/ui_mod_details_panel.cpp b/src/ui/ui_mod_details_panel.cpp index be7537a..c0de193 100644 --- a/src/ui/ui_mod_details_panel.cpp +++ b/src/ui/ui_mod_details_panel.cpp @@ -11,40 +11,40 @@ ModDetailsPanel::ModDetailsPanel(Element *parent) : Element(parent) { set_border_bottom_right_radius(16.0f); set_background_color(Color{ 190, 184, 219, 25 }); - header_container = std::make_unique(FlexDirection::Row, JustifyContent::FlexStart, this); + header_container = new Container(FlexDirection::Row, JustifyContent::FlexStart, this); header_container->set_padding(16.0f); header_container->set_background_color(Color{ 0, 0, 0, 89 }); { - thumbnail_container = std::make_unique(FlexDirection::Column, JustifyContent::SpaceEvenly, header_container.get()); + thumbnail_container = new Container(FlexDirection::Column, JustifyContent::SpaceEvenly, header_container); { - thumbnail_image = std::make_unique(thumbnail_container.get()); + thumbnail_image = new Image(thumbnail_container); thumbnail_image->set_width(100.0f); thumbnail_image->set_height(100.0f); thumbnail_image->set_background_color(Color{ 190, 184, 219, 25 }); } - header_details_container = std::make_unique(FlexDirection::Column, JustifyContent::SpaceEvenly, header_container.get()); + header_details_container = new Container(FlexDirection::Column, JustifyContent::SpaceEvenly, header_container); header_details_container->set_width(100.0f, Unit::Percent); header_details_container->set_margin_left(32.0f); header_details_container->set_overflow(Overflow::Hidden); { - title_label = std::make_unique(LabelStyle::Large, header_details_container.get()); - version_label = std::make_unique(LabelStyle::Normal, header_details_container.get()); + title_label = new Label(LabelStyle::Large, header_details_container); + version_label = new Label(LabelStyle::Normal, header_details_container); } } - body_container = std::make_unique(FlexDirection::Column, JustifyContent::FlexStart, this); + body_container = new recompui::Container(FlexDirection::Column, JustifyContent::FlexStart, this); body_container->set_padding_left(16.0f); { - description_label = std::make_unique(LabelStyle::Normal, body_container.get()); - authors_label = std::make_unique(LabelStyle::Normal, body_container.get()); - buttons_container = std::make_unique(FlexDirection::Row, JustifyContent::SpaceAround, body_container.get()); + description_label = new Label(LabelStyle::Normal, body_container); + authors_label = new Label(LabelStyle::Normal, body_container); + buttons_container = new Container(FlexDirection::Row, JustifyContent::SpaceAround, body_container); buttons_container->set_padding_left(16.0f); { - enable_toggle = std::make_unique(buttons_container.get()); - configure_button = std::make_unique("Configure", recompui::ButtonStyle::Secondary, buttons_container.get()); - erase_button = std::make_unique("Erase", recompui::ButtonStyle::Secondary, buttons_container.get()); + enable_toggle = new Toggle(buttons_container); + configure_button = new Button("Configure", recompui::ButtonStyle::Secondary, buttons_container); + erase_button = new Button("Erase", recompui::ButtonStyle::Secondary, buttons_container); } } } diff --git a/src/ui/ui_mod_details_panel.h b/src/ui/ui_mod_details_panel.h index 446fdd4..e225de8 100644 --- a/src/ui/ui_mod_details_panel.h +++ b/src/ui/ui_mod_details_panel.h @@ -12,24 +12,24 @@ namespace recompui { class ModDetailsPanel : public Element { public: - ModDetailsPanel(Element *parent); + ModDetailsPanel(Element *parent); virtual ~ModDetailsPanel(); - void set_mod_details(const recomp::mods::ModDetails& details); + void set_mod_details(const recomp::mods::ModDetails& details); private: - recomp::mods::ModDetails cur_details; - std::unique_ptr thumbnail_container; - std::unique_ptr thumbnail_image; - std::unique_ptr header_container; - std::unique_ptr header_details_container; - std::unique_ptr title_label; - std::unique_ptr version_label; - std::unique_ptr body_container; - std::unique_ptr description_label; - std::unique_ptr authors_label; - std::unique_ptr buttons_container; - std::unique_ptr enable_toggle; - std::unique_ptr configure_button; - std::unique_ptr erase_button; + recomp::mods::ModDetails cur_details; + Container *thumbnail_container = nullptr; + Image *thumbnail_image = nullptr; + Container *header_container = nullptr; + Container *header_details_container = nullptr; + Label *title_label = nullptr; + Label *version_label = nullptr; + Container *body_container = nullptr; + Label *description_label = nullptr; + Label *authors_label = nullptr; + Container *buttons_container = nullptr; + Toggle *enable_toggle = nullptr; + Button *configure_button = nullptr; + Button *erase_button = nullptr; }; } // namespace recompui diff --git a/src/ui/ui_mod_menu.cpp b/src/ui/ui_mod_menu.cpp index 7b78b09..60d7ab6 100644 --- a/src/ui/ui_mod_menu.cpp +++ b/src/ui/ui_mod_menu.cpp @@ -31,22 +31,22 @@ ModEntry::ModEntry(Element *parent, const recomp::mods::ModDetails &details, uin set_cursor(Cursor::Pointer); { - thumbnail_image = std::make_unique(this); + thumbnail_image = new Image(this); thumbnail_image->set_width(100.0f); thumbnail_image->set_height(100.0f); thumbnail_image->set_min_width(100.0f); thumbnail_image->set_min_height(100.0f); thumbnail_image->set_background_color(Color{ 190, 184, 219, 25 }); - body_container = std::make_unique(FlexDirection::Column, JustifyContent::FlexStart, this); + body_container = new Container(FlexDirection::Column, JustifyContent::FlexStart, this); body_container->set_width_auto(); body_container->set_height(100.0f); body_container->set_margin_left(16.0f); body_container->set_overflow(Overflow::Hidden); { - name_label = std::make_unique