FTXUI/src/ftxui/component/component.cpp

62 lines
1.2 KiB
C++
Raw Normal View History

#include "ftxui/component/component.hpp"
2020-03-23 05:32:44 +08:00
#include <assert.h>
2020-03-23 05:32:44 +08:00
#include <algorithm>
namespace ftxui {
2020-03-23 05:32:44 +08:00
void Component::Detach() {
if (!parent_)
return;
auto it = std::find(std::begin(parent_->children_),
2019-01-13 01:24:46 +08:00
std::end(parent_->children_), this);
parent_->children_.erase(it);
}
2019-01-13 01:24:46 +08:00
void Component::Attach(Component* parent) {
Detach();
parent_ = parent;
parent_->children_.push_back(this);
}
2019-01-13 01:24:46 +08:00
void Component::Add(Component* child) {
child->Attach(this);
}
2019-01-13 01:24:46 +08:00
Component::~Component() {
Detach();
}
2019-01-13 01:24:46 +08:00
bool Component::OnEvent(Event event) {
2020-03-23 05:32:44 +08:00
for (Component* child : children_) {
2019-01-13 01:24:46 +08:00
if (child->OnEvent(event))
return true;
}
return false;
}
2019-01-13 01:24:46 +08:00
Component* Component::ActiveChild() {
return children_.empty() ? nullptr : children_.front();
}
2019-01-13 01:24:46 +08:00
Element Component::Render() {
2019-01-13 05:25:49 +08:00
if (children_.size() == 1)
return children_.front()->Render();
2019-01-13 01:24:46 +08:00
return text(L"Not implemented component");
}
2019-01-13 01:24:46 +08:00
bool Component::Focused() {
Component* current = this;
2020-03-23 05:32:44 +08:00
for (;;) {
2019-01-13 01:24:46 +08:00
Component* parent = current->parent_;
if (!parent)
return true;
if (parent->ActiveChild() != current)
return false;
current = parent;
}
}
} // namespace ftxui