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);
|
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));
|
||||||
|
|
|
||||||
|
|
@ -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_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
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
|
#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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue