psemek/libs/ui/source/container_impl.cpp

72 lines
1.6 KiB
C++

#include <psemek/ui/container_impl.hpp>
namespace psemek::ui
{
element::children_range container_impl::children() const
{
return element::children_range{children_range_.data(), children_range_.data() + children_range_.size()};
}
std::size_t container_impl::size() const
{
return children_.size();
}
std::size_t container_impl::add(std::shared_ptr<element> c)
{
std::size_t index = 0;
while (index < children_.size() && children_[index]) ++index;
add(std::move(c), index);
return index;
}
void container_impl::add(std::shared_ptr<element> c, std::size_t index)
{
if (index >= children_.size())
{
children_.resize(index + 1);
children_range_.resize(index + 1);
}
children_[index] = std::move(c);
if (children_[index]) children_[index]->set_parent(parent_);
children_range_[index] = children_[index].get();
}
element * container_impl::get(std::size_t index) const
{
if (index < children_.size())
return children_[index].get();
return nullptr;
}
std::optional<std::size_t> container_impl::find(element * c) const
{
for (std::size_t i = 0; i < children_.size(); ++i)
{
if (children_[i].get() == c)
return i;
}
return std::nullopt;
}
std::shared_ptr<element> container_impl::remove(element * c)
{
if (auto i = find(c))
return remove(*i);
return nullptr;
}
std::shared_ptr<element> container_impl::remove(std::size_t index)
{
if (index >= children_.size())
return nullptr;
auto c = std::move(children_[index]);
children_range_[index] = nullptr;
if (c) c->set_parent(nullptr);
return c;
}
}