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 for (
int i = 0; i < box_.
y_max - box_.
y_min; ++i)
109 for (
int i = 0; i < box_.
y_max - box_.
y_min; ++i)
113 for (
size_t i = 0; i <
children_.size(); ++i)
117 for (
size_t i = 0; i <
children_.size(); ++i)
121 MoveSelectorWrap(+1);
123 MoveSelectorWrap(-1);
125 *selector_ = std::max(0, std::min(
int(
children_.size()) - 1, *selector_));
126 return old_selected != *selector_;
129 bool OnMouseEvent(Event event)
override {
130 if (ContainerBase::OnMouseEvent(event))
138 if (!box_.
Contain(event.mouse().x, event.mouse().y))
145 *selector_ = std::max(0, std::min(
int(
children_.size()) - 1, *selector_));
153class HorizontalContainer :
public ContainerBase {
155 using ContainerBase::ContainerBase;
160 elements.push_back(it->Render());
161 if (elements.size() == 0)
162 return text(
"Empty container");
163 return hbox(std::move(elements));
166 bool EventHandler(Event event)
override {
167 int old_selected = *selector_;
173 MoveSelectorWrap(+1);
175 MoveSelectorWrap(-1);
177 *selector_ = std::max(0, std::min(
int(
children_.size()) - 1, *selector_));
178 return old_selected != *selector_;
182class TabContainer :
public ContainerBase {
184 using ContainerBase::ContainerBase;
189 return active_child->Render();
190 return text(
"Empty container");
193 bool OnMouseEvent(Event event)
override {
194 return ActiveChild()->OnEvent(event);
217 return Vertical(std::move(children),
nullptr);
239 return std::make_shared<VerticalContainer>(std::move(children), selector);
260 return Horizontal(std::move(children),
nullptr);
282 return std::make_shared<HorizontalContainer>(std::move(children), selector);
305 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 PageUp
static const Event ArrowUp
static const Event ArrowDown
static const Event PageDown
static const Event ArrowLeft
static const Event ArrowRight