UI element::loop & style return first non-null result when going up element tree

This commit is contained in:
Nikita Lisitsa 2021-02-27 10:54:34 +03:00
parent 87d5edc386
commit 539799814e
2 changed files with 16 additions and 2 deletions

View file

@ -26,7 +26,7 @@ namespace psemek::ui
virtual element * root(); virtual element * root();
virtual element const * root() const; virtual element const * root() const;
virtual async::executor * loop() const { return loop_; } virtual async::executor * loop() const;
virtual void set_loop(async::executor * loop) { loop_ = loop; } virtual void set_loop(async::executor * loop) { loop_ = loop; }
virtual bool on_event(mouse_move const &) { return false; } virtual bool on_event(mouse_move const &) { return false; }
@ -44,7 +44,7 @@ namespace psemek::ui
virtual void enable() { set_enabled(true); } virtual void enable() { set_enabled(true); }
virtual void disable() { set_enabled(false); } virtual void disable() { set_enabled(false); }
virtual std::shared_ptr<struct style const> style() const { return style_; } virtual std::shared_ptr<struct style const> style() const;
virtual std::shared_ptr<struct style const> set_style(std::shared_ptr<struct style const> st); virtual std::shared_ptr<struct style const> set_style(std::shared_ptr<struct style const> st);
virtual void draw(painter & p) const = 0; virtual void draw(painter & p) const = 0;

View file

@ -19,6 +19,13 @@ namespace psemek::ui
return r; return r;
} }
async::executor * element::loop() const
{
element const * e = this;
while (!e->loop_ && e->parent()) e = e->parent();
return e->loop_;
}
void element::reshape() void element::reshape()
{ {
reshape(shape().bbox()); reshape(shape().bbox());
@ -30,6 +37,13 @@ namespace psemek::ui
return {{{0.f, inf}, {0.f, inf}}}; return {{{0.f, inf}, {0.f, inf}}};
} }
std::shared_ptr<struct style const> element::style() const
{
element const * e = this;
while (!e->style_ && e->parent()) e = e->parent();
return e->style_;
}
std::shared_ptr<style const> element::set_style(std::shared_ptr<struct style const> st) std::shared_ptr<style const> element::set_style(std::shared_ptr<struct style const> st)
{ {
std::swap(st, style_); std::swap(st, style_);