65 lines
1.3 KiB
C++
65 lines
1.3 KiB
C++
#include <psemek/ui/container.hpp>
|
|
|
|
namespace psemek::ui
|
|
{
|
|
|
|
element::children_range container::children() const
|
|
{
|
|
return children_range{children_range_.data(), children_range_.data() + children_range_.size()};
|
|
}
|
|
|
|
std::size_t container::add(std::unique_ptr<element> c)
|
|
{
|
|
std::size_t index = 0;
|
|
while (index < children_.size() && children_[index]) ++index;
|
|
add(std::move(c), index);
|
|
return index;
|
|
}
|
|
|
|
void container::add(std::unique_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);
|
|
children_range_[index] = children_[index].get();
|
|
}
|
|
|
|
element * container::get(std::size_t index)
|
|
{
|
|
if (index < children_.size())
|
|
return children_[index].get();
|
|
return nullptr;
|
|
}
|
|
|
|
std::optional<std::size_t> container::find(element * c)
|
|
{
|
|
for (std::size_t i = 0; i < children_.size(); ++i)
|
|
{
|
|
if (children_[i].get() == c)
|
|
return i;
|
|
}
|
|
return std::nullopt;
|
|
}
|
|
|
|
std::unique_ptr<element> container::remove(element * c)
|
|
{
|
|
if (auto i = find(c))
|
|
return remove(*i);
|
|
return nullptr;
|
|
}
|
|
|
|
std::unique_ptr<element> container::remove(std::size_t index)
|
|
{
|
|
if (index >= children_.size())
|
|
return nullptr;
|
|
|
|
auto c = std::move(children_[index]);
|
|
children_range_[index] = nullptr;
|
|
return c;
|
|
}
|
|
|
|
}
|