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); text->set_multiline(ui::label::multiline_mode::minimize_lines);
auto frame = element_factory.make_frame(); auto frame = element_factory.make_frame();
frame->set_child(text); 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 { auto updater = util::recursive([this, text, i = 0](auto && self) mutable -> void {
text->set_halign(static_cast<ui::label::halignment>(i % 3)); text->set_halign(static_cast<ui::label::halignment>(i % 3));

View file

@ -2,31 +2,15 @@
#include <psemek/ui/element.hpp> #include <psemek/ui/element.hpp>
#include <vector>
namespace psemek::ui namespace psemek::ui
{ {
struct container struct container
: element : element
{ {
children_range children() const override; virtual bool add_child(std::shared_ptr<element> c) = 0;
virtual bool has_child(element * c) const = 0;
protected: virtual std::shared_ptr<element> remove_child(element * c) = 0;
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_;
}; };
} }

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

View file

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

View file

@ -3,22 +3,37 @@
namespace psemek::ui 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()) if (i >= policies_.size())
policies_.resize(i + 1); policies_.resize(i + 1);
policies_[i] = {x, y}; 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) void screen::reshape(geom::box<float, 2> const & bbox)