14 class ContainerBase :
public ComponentBase {
16 ContainerBase(
Components children,
int* selector)
17 : selector_(selector ? selector : &selected_) {
19 Add(std::move(child));
23 bool OnEvent(Event event)
override {
25 return OnMouseEvent(event);
30 if (ActiveChild() && ActiveChild()->OnEvent(event))
33 return EventHandler(event);
44 for (
size_t i = 0; i <
children_.size(); ++i) {
45 if (children_[i].get() == child) {
54 virtual bool EventHandler(Event) {
return false; }
56 virtual bool OnMouseEvent(Event event) {
61 int* selector_ =
nullptr;
63 void MoveSelector(
int dir) {
64 for (
int i = *selector_ + dir; i >= 0 && i < (int)
children_.size();
72 void MoveSelectorWrap(
int dir) {
73 for (
size_t offset = 1; offset <
children_.size(); ++offset) {
83 class VerticalContainer :
public ContainerBase {
85 using ContainerBase::ContainerBase;
89 for (
auto& it : children_)
90 elements.push_back(it->Render());
91 if (elements.size() == 0)
92 return text(
"Empty container");
93 return vbox(std::move(elements));
96 bool EventHandler(Event event)
override {
97 int old_selected = *selector_;
103 MoveSelectorWrap(+1);
105 MoveSelectorWrap(-1);
107 *selector_ = std::max(0, std::min(
int(children_.size()) - 1, *selector_));
108 return old_selected != *selector_;
111 bool OnMouseEvent(Event event)
override {
112 if (ContainerBase::OnMouseEvent(event))
127 *selector_ = std::max(0, std::min(
int(children_.size()) - 1, *selector_));
133 class HorizontalContainer :
public ContainerBase {
135 using ContainerBase::ContainerBase;
139 for (
auto& it : children_)
140 elements.push_back(it->Render());
141 if (elements.size() == 0)
142 return text(
"Empty container");
143 return hbox(std::move(elements));
146 bool EventHandler(Event event)
override {
147 int old_selected = *selector_;
153 MoveSelectorWrap(+1);
155 MoveSelectorWrap(-1);
157 *selector_ = std::max(0, std::min(
int(children_.size()) - 1, *selector_));
158 return old_selected != *selector_;
162 class TabContainer :
public ContainerBase {
164 using ContainerBase::ContainerBase;
169 return active_child->Render();
170 return text(
"Empty container");
173 bool OnMouseEvent(Event event)
override {
174 return ActiveChild()->OnEvent(event);
178 namespace Container {
197 return Vertical(std::move(children),
nullptr);
219 return std::make_shared<VerticalContainer>(std::move(children), selector);
240 return Horizontal(std::move(children),
nullptr);
262 return std::make_shared<HorizontalContainer>(std::move(children), selector);
285 return std::make_shared<TabContainer>(std::move(children), selector);