diff --git a/libs/ui/include/psemek/ui/container_impl.hpp b/libs/ui/include/psemek/ui/container_impl.hpp index 1f0c827c..293b15a1 100644 --- a/libs/ui/include/psemek/ui/container_impl.hpp +++ b/libs/ui/include/psemek/ui/container_impl.hpp @@ -15,12 +15,14 @@ namespace psemek::ui element::children_range children() const; + bool empty() const; std::size_t size() const; + void resize(std::size_t new_size); std::size_t add(std::shared_ptr c); void add(std::shared_ptr c, std::size_t index); - element * get(std::size_t index) const; + std::shared_ptr get(std::size_t index) const; std::optional find(element * c) const; std::shared_ptr remove(element * c); diff --git a/libs/ui/source/container_impl.cpp b/libs/ui/source/container_impl.cpp index d13b9899..80fcef05 100644 --- a/libs/ui/source/container_impl.cpp +++ b/libs/ui/source/container_impl.cpp @@ -8,11 +8,27 @@ namespace psemek::ui return element::children_range{children_range_.data(), children_range_.data() + children_range_.size()}; } + bool container_impl::empty() const + { + return children_.empty(); + } + std::size_t container_impl::size() const { return children_.size(); } + void container_impl::resize(std::size_t new_size) + { + auto old_size = children_.size(); + for (std::size_t i = new_size; i < old_size; ++i) + remove(i); + children_.resize(new_size); + children_range_.resize(new_size); + for (std::size_t i = old_size; i < new_size; ++i) + children_range_[i] = nullptr; + } + std::size_t container_impl::add(std::shared_ptr c) { std::size_t index = 0; @@ -24,20 +40,17 @@ namespace psemek::ui void container_impl::add(std::shared_ptr c, std::size_t index) { if (index >= children_.size()) - { - children_.resize(index + 1); - children_range_.resize(index + 1); - } + 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 + std::shared_ptr container_impl::get(std::size_t index) const { if (index < children_.size()) - return children_[index].get(); + return children_[index]; return nullptr; }