BuGUI
BUtton Grid User Interface
Loading...
Searching...
No Matches
base_container_widget.hpp
1#pragma once
2#include "base_widget.hpp"
3
4#include <memory>
5#include <vector>
6#include <concepts>
7#include <algorithm>
8
9namespace bugui
10{
13struct base_container_widget : base_widget
14{
15 explicit base_container_widget(base_container_widget* parent);
16
17 virtual void add_held(base_widget* widget) = 0;
18 virtual void remove_held(base_widget* widget) = 0;
19 virtual bool handle_child_Delete() = 0;
20
23 const std::vector<base_widget*>& get_held() const { return held; }
24
28 std::vector<base_widget*> get_unique_held() const;
29
33 std::vector<base_widget*> get_deepest_held();
34
37 void remove_widget(base_widget* widget);
38
39protected:
45 template <typename T, typename ...Args>
46 requires std::derived_from<T, base_widget>
47 base_widget* add_widget(Args& ...args);
48
54 template <typename T, typename ...Args>
55 requires std::derived_from<T, base_widget>
56 base_widget* add_widget(Args&& ...args);
57
63 template <class Pred>
64 requires (!std::derived_from<std::remove_pointer_t<Pred>
65 , base_widget>)
66 base_widget* remove_widget(Pred pred);
67
68 std::vector<base_widget*> held;
69 std::vector<std::unique_ptr<base_widget>> children;
70
71private:
72 void get_deeper_held(std::vector<base_widget*>& deepest
73 , base_container_widget* current_widget) const;
74};
75
76template<class Pred>
77 requires (!std::derived_from<std::remove_pointer_t<Pred>
78 , base_widget>)
79inline base_widget*
81{
82 const auto it{std::find_if(children.begin()
83 , children.end()
84 , pred)};
85
86 if (it == children.end()) return nullptr;
87 std::erase(held, it->get());
88 std::erase(children, *it);
89 return it->get();
90}
91
92template<typename T, typename ...Args>
93 requires std::derived_from<T, base_widget>
94inline base_widget*
96{
97 children.emplace_back(
98 std::make_unique<T>(std::forward<Args>(args)..., this));
99 return children.back().get();
100}
101
102template<typename T, typename ...Args>
103 requires std::derived_from<T, base_widget>
104inline base_widget*
106{
107 children.emplace_back(std::make_unique<T>(args..., this));
108 return children.back().get();
109}
110
111} // namespace bugui
const std::vector< base_widget * > & get_held() const
Retrieves all held widgets, including duplicates.
Definition base_container_widget.hpp:23
void remove_widget(base_widget *widget)
Removes a child widget.
std::vector< base_widget * > get_unique_held() const
Retrieves held widgets, filtering out duplicates.
base_widget * add_widget(Args &...args)
Create and add a child widget.
Definition base_container_widget.hpp:105
std::vector< base_widget * > get_deepest_held()
Retrieves all held items that do not have child held widgets i.e. the deepest held widget in the hier...
Provides the minimum required 2D widget functionalities.
Definition base_widget.hpp:12
To be inherited to create custom wigets. Derived classes must be passeed as the template type.
Definition widget.hpp:12