Add ui::container interface, move old container to helper class
This commit is contained in:
parent
7cda050345
commit
a139067a3e
6 changed files with 78 additions and 39 deletions
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
33
libs/ui/include/psemek/ui/container_impl.hpp
Normal file
33
libs/ui/include/psemek/ui/container_impl.hpp
Normal 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_;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue