Add ui::container interface, move old container to helper class

This commit is contained in:
Nikita Lisitsa 2021-02-26 18:00:56 +03:00
parent 7cda050345
commit a139067a3e
6 changed files with 78 additions and 39 deletions

View file

@ -57,7 +57,7 @@ struct ui_example
text->set_multiline(ui::label::multiline_mode::minimize_lines);
auto frame = element_factory.make_frame();
frame->set_child(text);
screen->add(frame, ui::screen::x_policy::center, ui::screen::y_policy::center);
screen->add_child(frame, ui::screen::x_policy::center, ui::screen::y_policy::center);
auto updater = util::recursive([this, text, i = 0](auto && self) mutable -> void {
text->set_halign(static_cast<ui::label::halignment>(i % 3));

View file

@ -2,31 +2,15 @@
#include <psemek/ui/element.hpp>
#include <vector>
namespace psemek::ui
{
struct container
: element
{
children_range children() const override;
protected:
std::size_t children_count() const { return children_.size(); }
std::size_t add(std::shared_ptr<element> c);
void add(std::shared_ptr<element> c, std::size_t index);
element * get(std::size_t index);
std::optional<std::size_t> find(element * c);
std::shared_ptr<element> remove(element * c);
std::shared_ptr<element> remove(std::size_t index);
private:
std::vector<std::shared_ptr<element>> children_;
std::vector<element *> children_range_;
virtual bool add_child(std::shared_ptr<element> c) = 0;
virtual bool has_child(element * c) const = 0;
virtual std::shared_ptr<element> remove_child(element * c) = 0;
};
}

View file

@ -0,0 +1,33 @@
#pragma once
#include <psemek/ui/element.hpp>
#include <vector>
namespace psemek::ui
{
struct container_impl
{
container_impl(element * parent)
: parent_{parent}
{}
element::children_range children() const;
std::size_t add(std::shared_ptr<element> c);
void add(std::shared_ptr<element> c, std::size_t index);
element * get(std::size_t index) const;
std::optional<std::size_t> find(element * c) const;
std::shared_ptr<element> remove(element * c);
std::shared_ptr<element> remove(std::size_t index);
protected:
element * parent_;
std::vector<std::shared_ptr<element>> children_;
std::vector<element *> children_range_;
};
}

View file

@ -1,6 +1,7 @@
#pragma once
#include <psemek/ui/container.hpp>
#include <psemek/ui/container_impl.hpp>
#include <psemek/ui/box_shape.hpp>
namespace psemek::ui
@ -27,9 +28,14 @@ namespace psemek::ui
floating,
};
void add(std::shared_ptr<element> c, x_policy x, y_policy y);
void add(std::shared_ptr<element> c);
std::shared_ptr<element> remove(element * c);
screen();
children_range children() const override;
bool add_child(std::shared_ptr<element> c, x_policy x, y_policy y);
bool add_child(std::shared_ptr<element> c) override;
bool has_child(element *c) const override;
std::shared_ptr<element> remove_child(element * c) override;
struct shape const & shape() const override { return shape_; }
void reshape(geom::box<float, 2> const & bbox) override;
@ -39,6 +45,7 @@ namespace psemek::ui
void draw(painter &) const override {}
private:
container_impl container_;
box_shape shape_;
struct policy

View file

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

View file

@ -3,22 +3,37 @@
namespace psemek::ui
{
void screen::add(std::shared_ptr<element> c, x_policy x, y_policy y)
screen::screen()
: container_(this)
{}
element::children_range screen::children() const
{
auto i = container::add(std::move(c));
return container_.children();
}
bool screen::add_child(std::shared_ptr<element> c, x_policy x, y_policy y)
{
auto i = container_.add(std::move(c));
if (i >= policies_.size())
policies_.resize(i + 1);
policies_[i] = {x, y};
return true;
}
void screen::add(std::shared_ptr<element> c)
bool screen::add_child(std::shared_ptr<element> c)
{
add(std::move(c), x_policy::floating, y_policy::floating);
return add_child(std::move(c), x_policy::floating, y_policy::floating);
}
std::shared_ptr<element> screen::remove(element * c)
bool screen::has_child(element *c) const
{
return container::remove(c);
return static_cast<bool>(container_.find(c));
}
std::shared_ptr<element> screen::remove_child(element * c)
{
return container_.remove(c);
}
void screen::reshape(geom::box<float, 2> const & bbox)