16class ContainerBase :
public ComponentBase {
18 ContainerBase(
Components children,
int* selector)
19 : selector_(selector ? selector : &selected_) {
21 Add(std::move(child));
25 bool OnEvent(Event event)
override {
27 return OnMouseEvent(event);
32 if (ActiveChild() && ActiveChild()->OnEvent(event))
35 return EventHandler(event);
45 void SetActiveChild(ComponentBase* child)
override {
46 for (
size_t i = 0; i <
children_.size(); ++i) {
56 virtual bool EventHandler(Event) {
return false; }
58 virtual bool OnMouseEvent(Event event) {
63 int* selector_ =
nullptr;
65 void MoveSelector(
int dir) {
66 for (
int i = *selector_ + dir; i >= 0 && i < (int)
children_.size();
74 void MoveSelectorWrap(
int dir) {
75 for (
size_t offset = 1; offset <
children_.size(); ++offset) {
85class VerticalContainer :
public ContainerBase {
87 using ContainerBase::ContainerBase;
92 elements.push_back(it->Render());
93 if (elements.size() == 0)
98 bool EventHandler(Event event)
override {
99 int old_selected = *selector_;
105 MoveSelectorWrap(+1);
107 MoveSelectorWrap(-1);
109 *selector_ = std::max(0, std::min(
int(
children_.size()) - 1, *selector_));
110 return old_selected != *selector_;
113 bool OnMouseEvent(Event event)
override {
114 if (ContainerBase::OnMouseEvent(event))
122 if (!box_.
Contain(event.mouse().x, event.mouse().y))
129 *selector_ = std::max(0, std::min(
int(
children_.size()) - 1, *selector_));
137class HorizontalContainer :
public ContainerBase {
139 using ContainerBase::ContainerBase;
144 elements.push_back(it->Render());
145 if (elements.size() == 0)
146 return text(
"Empty container");
147 return hbox(std::move(elements));
150 bool EventHandler(Event event)
override {
151 int old_selected = *selector_;
157 MoveSelectorWrap(+1);
159 MoveSelectorWrap(-1);
161 *selector_ = std::max(0, std::min(
int(
children_.size()) - 1, *selector_));
162 return old_selected != *selector_;
166class TabContainer :
public ContainerBase {
168 using ContainerBase::ContainerBase;
173 return active_child->Render();
174 return text(
"Empty container");
177 bool OnMouseEvent(Event event)
override {
178 return ActiveChild()->OnEvent(event);
201 return Vertical(std::move(children),
nullptr);
223 return std::make_shared<VerticalContainer>(std::move(children), selector);
244 return Horizontal(std::move(children),
nullptr);
266 return std::make_shared<HorizontalContainer>(std::move(children), selector);
289 return std::make_shared<TabContainer>(std::move(children), selector);
virtual bool Focusable() const
Return true when the component contains focusable elements. The non focusable Components will be skip...
bool Focused() const
Returns if the elements if focused by the user. True when the ComponentBase is focused by the user....
void Add(Component children)
Add a child. @param child The child to be attached.
virtual bool OnEvent(Event)
Called in response to an event.
Component Horizontal(Components children)
A list of components, drawn one by one horizontally and navigated horizontally using left/right arrow...
Component Vertical(Components children)
A list of components, drawn one by one vertically and navigated vertically using up/down arrow key or...
Component Tab(Components children, int *selector)
A list of components, where only one is drawn and interacted with at a time. The |selector| gives the...
std::shared_ptr< Node > Element
std::vector< Component > Components
Element hbox(Elements)
A container displaying elements horizontally one by one.
std::vector< Element > Elements
Element text(std::wstring text)
Display a piece of unicode text.
Decorator reflect(Box &box)
std::shared_ptr< ComponentBase > Component
Element vbox(Elements)
A container displaying elements vertically one by one.
bool Contain(int x, int y)
static const Event TabReverse
static const Event ArrowUp
static const Event ArrowDown
static const Event ArrowLeft
static const Event ArrowRight