Add ui::element::style_updated & own_style_updated replacing set_style(style())
This commit is contained in:
parent
4922877431
commit
e237959894
5 changed files with 38 additions and 38 deletions
|
|
@ -56,6 +56,9 @@ namespace psemek::ui
|
||||||
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 std::shared_ptr<struct style const> set_own_style(std::shared_ptr<struct style const> st);
|
virtual std::shared_ptr<struct style const> set_own_style(std::shared_ptr<struct style const> st);
|
||||||
|
|
||||||
|
virtual void style_updated();
|
||||||
|
virtual void own_style_updated();
|
||||||
|
|
||||||
virtual void update(float /* dt */) {}
|
virtual void update(float /* dt */) {}
|
||||||
|
|
||||||
virtual void draw(painter & p) const = 0;
|
virtual void draw(painter & p) const = 0;
|
||||||
|
|
|
||||||
|
|
@ -60,8 +60,8 @@ namespace psemek::ui
|
||||||
|
|
||||||
geom::box<float, 2> size_constraints() const override;
|
geom::box<float, 2> size_constraints() const override;
|
||||||
|
|
||||||
std::shared_ptr<struct style const> set_style(std::shared_ptr<struct style const> st) override;
|
void style_updated() override;
|
||||||
std::shared_ptr<struct style const> set_own_style(std::shared_ptr<struct style const> st) override;
|
void own_style_updated() override;
|
||||||
|
|
||||||
void draw(painter & p) const override;
|
void draw(painter & p) const override;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -57,52 +57,47 @@ namespace psemek::ui
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
if (style_ != st)
|
if (style_)
|
||||||
{
|
style_->use_as_style.erase(this);
|
||||||
if (style_)
|
|
||||||
style_->use_as_style.erase(this);
|
|
||||||
|
|
||||||
std::swap(st, style_);
|
std::swap(st, style_);
|
||||||
|
|
||||||
if (style_)
|
if (style_)
|
||||||
style_->use_as_style.insert(this);
|
style_->use_as_style.insert(this);
|
||||||
}
|
|
||||||
|
|
||||||
auto visitor = util::recursive([](auto && self, element * e) -> void {
|
style_updated();
|
||||||
e->merged_style_ = nullptr;
|
|
||||||
e->merged_own_style_ = nullptr;
|
|
||||||
for (auto c : e->children())
|
|
||||||
if (c) self(c);
|
|
||||||
});
|
|
||||||
visitor(this);
|
|
||||||
|
|
||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<struct style const> element::set_own_style(std::shared_ptr<struct style const> st)
|
std::shared_ptr<struct style const> element::set_own_style(std::shared_ptr<struct style const> st)
|
||||||
{
|
{
|
||||||
if (style_ != st)
|
if (style_)
|
||||||
{
|
style_->use_as_own_style.erase(this);
|
||||||
if (style_)
|
|
||||||
style_->use_as_own_style.erase(this);
|
|
||||||
|
|
||||||
std::swap(st, own_style_);
|
std::swap(st, own_style_);
|
||||||
|
|
||||||
if (style_)
|
if (style_)
|
||||||
style_->use_as_own_style.insert(this);
|
style_->use_as_own_style.insert(this);
|
||||||
}
|
|
||||||
|
|
||||||
auto visitor = util::recursive([](auto && self, element * e) -> void {
|
own_style_updated();
|
||||||
e->merged_style_ = nullptr;
|
|
||||||
e->merged_own_style_ = nullptr;
|
|
||||||
for (auto c : e->children())
|
|
||||||
if (c) self(c);
|
|
||||||
});
|
|
||||||
visitor(this);
|
|
||||||
|
|
||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void element::style_updated()
|
||||||
|
{
|
||||||
|
merged_style_ = nullptr;
|
||||||
|
own_style_updated();
|
||||||
|
for (auto c : children())
|
||||||
|
if (c) c->style_updated();
|
||||||
|
}
|
||||||
|
|
||||||
|
void element::own_style_updated()
|
||||||
|
{
|
||||||
|
merged_own_style_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<struct style const> element::merged_style() const
|
std::shared_ptr<struct style const> element::merged_style() const
|
||||||
{
|
{
|
||||||
if (!merged_style_)
|
if (!merged_style_)
|
||||||
|
|
|
||||||
|
|
@ -62,16 +62,18 @@ namespace psemek::ui
|
||||||
return {{{cached_state_inf_->size[0], inf}, {cached_state_inf_->size[1], inf}}};
|
return {{{cached_state_inf_->size[0], inf}, {cached_state_inf_->size[1], inf}}};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<style const> label::set_style(std::shared_ptr<struct style const> st)
|
void label::style_updated()
|
||||||
{
|
{
|
||||||
|
element::style_updated();
|
||||||
cached_state_.reset();
|
cached_state_.reset();
|
||||||
return element::set_style(st);
|
cached_state_inf_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<style const> label::set_own_style(std::shared_ptr<struct style const> st)
|
void label::own_style_updated()
|
||||||
{
|
{
|
||||||
|
element::own_style_updated();
|
||||||
cached_state_.reset();
|
cached_state_.reset();
|
||||||
return element::set_own_style(st);
|
cached_state_inf_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void label::draw(painter & p) const
|
void label::draw(painter & p) const
|
||||||
|
|
|
||||||
|
|
@ -43,10 +43,10 @@ namespace psemek::ui
|
||||||
void style::on_changed()
|
void style::on_changed()
|
||||||
{
|
{
|
||||||
for (auto e : use_as_style)
|
for (auto e : use_as_style)
|
||||||
e->set_style(e->style());
|
e->style_updated();
|
||||||
|
|
||||||
for (auto e : use_as_own_style)
|
for (auto e : use_as_own_style)
|
||||||
e->set_own_style(e->own_style());
|
e->own_style_updated();
|
||||||
}
|
}
|
||||||
|
|
||||||
void merge(style & dst, style const & src)
|
void merge(style & dst, style const & src)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue