Use shared_ptr instead of unique_ptr for ui elements
This commit is contained in:
parent
f8567851bd
commit
d42e1b1bcb
11 changed files with 32 additions and 29 deletions
|
|
@ -38,14 +38,14 @@ namespace psemek::ui
|
|||
|
||||
virtual void on_state_changed() {}
|
||||
|
||||
void set_label(std::unique_ptr<struct label> label);
|
||||
void set_label(std::shared_ptr<struct label> label);
|
||||
|
||||
private:
|
||||
state_t state_ = state_t::normal;
|
||||
|
||||
on_click_callback callback_;
|
||||
|
||||
std::unique_ptr<struct label> label_;
|
||||
std::shared_ptr<struct label> label_;
|
||||
element * children_[1]{nullptr};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -15,17 +15,17 @@ namespace psemek::ui
|
|||
protected:
|
||||
std::size_t children_count() const { return children_.size(); }
|
||||
|
||||
std::size_t add(std::unique_ptr<element> c);
|
||||
void add(std::unique_ptr<element> c, std::size_t index);
|
||||
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::unique_ptr<element> remove(element * c);
|
||||
std::unique_ptr<element> remove(std::size_t index);
|
||||
std::shared_ptr<element> remove(element * c);
|
||||
std::shared_ptr<element> remove(std::size_t index);
|
||||
|
||||
private:
|
||||
std::vector<std::unique_ptr<element>> children_;
|
||||
std::vector<std::shared_ptr<element>> children_;
|
||||
std::vector<element *> children_range_;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ namespace psemek::ui
|
|||
controller();
|
||||
~controller();
|
||||
|
||||
std::unique_ptr<element> set_root(std::unique_ptr<element> r);
|
||||
std::shared_ptr<element> set_root(std::shared_ptr<element> r);
|
||||
element * root();
|
||||
|
||||
void reshape(geom::box<float, 2> const & shape);
|
||||
|
|
|
|||
|
|
@ -17,8 +17,8 @@ namespace psemek::ui
|
|||
void set_style(std::shared_ptr<struct style> st);
|
||||
std::shared_ptr<struct style> style() const;
|
||||
|
||||
std::unique_ptr<button> make_button(std::string text);
|
||||
std::unique_ptr<screen> make_screen();
|
||||
std::shared_ptr<button> make_button(std::string text);
|
||||
std::shared_ptr<screen> make_screen();
|
||||
|
||||
private:
|
||||
psemek_declare_pimpl
|
||||
|
|
|
|||
|
|
@ -9,10 +9,13 @@
|
|||
|
||||
#include <psemek/util/span.hpp>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace psemek::ui
|
||||
{
|
||||
|
||||
struct element
|
||||
: std::enable_shared_from_this<element>
|
||||
{
|
||||
virtual element * parent() const { return parent_; }
|
||||
virtual void set_parent(element * parent) { parent_ = parent; }
|
||||
|
|
|
|||
|
|
@ -25,9 +25,9 @@ namespace psemek::ui
|
|||
floating,
|
||||
};
|
||||
|
||||
void add(std::unique_ptr<element> c, x_policy x, y_policy y);
|
||||
void add(std::unique_ptr<element> c);
|
||||
std::unique_ptr<element> remove(element * c);
|
||||
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);
|
||||
|
||||
struct shape const & shape() const override { return shape_; }
|
||||
void reshape(geom::box<float, 2> const & bbox) override;
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ namespace psemek::ui
|
|||
return false;
|
||||
}
|
||||
|
||||
void button::set_label(std::unique_ptr<struct label> label)
|
||||
void button::set_label(std::shared_ptr<struct label> label)
|
||||
{
|
||||
label_ = std::move(label);
|
||||
children_[0] = label_.get();
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ namespace psemek::ui
|
|||
return children_range{children_range_.data(), children_range_.data() + children_range_.size()};
|
||||
}
|
||||
|
||||
std::size_t container::add(std::unique_ptr<element> c)
|
||||
std::size_t container::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::unique_ptr<element> c, std::size_t index)
|
||||
void container::add(std::shared_ptr<element> c, std::size_t index)
|
||||
{
|
||||
if (index >= children_.size())
|
||||
{
|
||||
|
|
@ -45,14 +45,14 @@ namespace psemek::ui
|
|||
return std::nullopt;
|
||||
}
|
||||
|
||||
std::unique_ptr<element> container::remove(element * c)
|
||||
std::shared_ptr<element> container::remove(element * c)
|
||||
{
|
||||
if (auto i = find(c))
|
||||
return remove(*i);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::unique_ptr<element> container::remove(std::size_t index)
|
||||
std::shared_ptr<element> container::remove(std::size_t index)
|
||||
{
|
||||
if (index >= children_.size())
|
||||
return nullptr;
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ namespace psemek::ui
|
|||
struct controller::impl
|
||||
{
|
||||
painter_impl painter;
|
||||
std::unique_ptr<element> root;
|
||||
std::shared_ptr<element> root;
|
||||
async::event_loop loop;
|
||||
geom::box<float, 2> shape{{{0.f, 0.f}, {0.f, 0.f}}};
|
||||
|
||||
|
|
@ -42,7 +42,7 @@ namespace psemek::ui
|
|||
|
||||
controller::~controller() = default;
|
||||
|
||||
std::unique_ptr<element> controller::set_root(std::unique_ptr<element> r)
|
||||
std::shared_ptr<element> controller::set_root(std::shared_ptr<element> r)
|
||||
{
|
||||
auto old = std::move(impl().root);
|
||||
impl().root = std::move(r);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ namespace psemek::ui
|
|||
{
|
||||
button_impl()
|
||||
{
|
||||
set_label(std::make_unique<struct label>());
|
||||
set_label(std::make_shared<struct label>());
|
||||
label()->set_valign(label::valignment::center);
|
||||
label()->set_halign(label::halignment::center);
|
||||
label()->set_overflow(label::overflow_mode::drop);
|
||||
|
|
@ -69,9 +69,9 @@ namespace psemek::ui
|
|||
impl();
|
||||
|
||||
template <typename T>
|
||||
std::unique_ptr<T> create()
|
||||
std::shared_ptr<T> create()
|
||||
{
|
||||
auto r = std::make_unique<T>();
|
||||
auto r = std::make_shared<T>();
|
||||
r->set_style(style);
|
||||
return r;
|
||||
}
|
||||
|
|
@ -97,7 +97,7 @@ namespace psemek::ui
|
|||
return impl().style;
|
||||
}
|
||||
|
||||
std::unique_ptr<button> default_element_factory::make_button(std::string text)
|
||||
std::shared_ptr<button> default_element_factory::make_button(std::string text)
|
||||
{
|
||||
auto r = impl().create<button_impl>();
|
||||
r->label()->set_text(std::move(text));
|
||||
|
|
@ -105,9 +105,9 @@ namespace psemek::ui
|
|||
return r;
|
||||
}
|
||||
|
||||
std::unique_ptr<screen> default_element_factory::make_screen()
|
||||
std::shared_ptr<screen> default_element_factory::make_screen()
|
||||
{
|
||||
return std::make_unique<screen>();
|
||||
return std::make_shared<screen>();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
namespace psemek::ui
|
||||
{
|
||||
|
||||
void screen::add(std::unique_ptr<element> c, x_policy x, y_policy y)
|
||||
void screen::add(std::shared_ptr<element> c, x_policy x, y_policy y)
|
||||
{
|
||||
auto i = container::add(std::move(c));
|
||||
if (i >= policies_.size())
|
||||
|
|
@ -11,12 +11,12 @@ namespace psemek::ui
|
|||
policies_[i] = {x, y};
|
||||
}
|
||||
|
||||
void screen::add(std::unique_ptr<element> c)
|
||||
void screen::add(std::shared_ptr<element> c)
|
||||
{
|
||||
add(std::move(c), x_policy::floating, y_policy::floating);
|
||||
}
|
||||
|
||||
std::unique_ptr<element> screen::remove(element * c)
|
||||
std::shared_ptr<element> screen::remove(element * c)
|
||||
{
|
||||
return container::remove(c);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue