Support button onclick offset in ui styles
This commit is contained in:
parent
8aa6c8a3bb
commit
fe60386ad7
5 changed files with 36 additions and 8 deletions
|
|
@ -40,7 +40,7 @@ namespace psemek::ui
|
||||||
|
|
||||||
virtual state_t state() const { return state_; }
|
virtual state_t state() const { return state_; }
|
||||||
|
|
||||||
virtual void on_state_changed() {}
|
virtual void on_state_changed(state_t old);
|
||||||
|
|
||||||
void set_label(std::shared_ptr<struct label> label);
|
void set_label(std::shared_ptr<struct label> label);
|
||||||
void set_icon(std::shared_ptr<image_view> icon);
|
void set_icon(std::shared_ptr<image_view> icon);
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@ namespace psemek::ui
|
||||||
std::optional<gfx::color_rgba> highlight_color;
|
std::optional<gfx::color_rgba> highlight_color;
|
||||||
std::optional<gfx::color_rgba> action_color;
|
std::optional<gfx::color_rgba> action_color;
|
||||||
|
|
||||||
|
std::optional<geom::vector<int, 2>> action_offset;
|
||||||
|
|
||||||
std::optional<gfx::color_rgba> border_color;
|
std::optional<gfx::color_rgba> border_color;
|
||||||
std::optional<int> border_width;
|
std::optional<int> border_width;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,15 +17,16 @@ namespace psemek::ui
|
||||||
if (over)
|
if (over)
|
||||||
{
|
{
|
||||||
state_ = state_t::mouseover;
|
state_ = state_t::mouseover;
|
||||||
on_state_changed();
|
on_state_changed(state_t::normal);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case state_t::mouseover:
|
case state_t::mouseover:
|
||||||
case state_t::mousedown:
|
case state_t::mousedown:
|
||||||
if (!over)
|
if (!over)
|
||||||
{
|
{
|
||||||
|
auto old = state_;
|
||||||
state_ = state_t::normal;
|
state_ = state_t::normal;
|
||||||
on_state_changed();
|
on_state_changed(old);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -46,7 +47,7 @@ namespace psemek::ui
|
||||||
state_ = state_t::mousedown;
|
state_ = state_t::mousedown;
|
||||||
if (callback_)
|
if (callback_)
|
||||||
post(callback_);
|
post(callback_);
|
||||||
on_state_changed();
|
on_state_changed(state_t::mouseover);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -54,7 +55,7 @@ namespace psemek::ui
|
||||||
if (!e.down)
|
if (!e.down)
|
||||||
{
|
{
|
||||||
state_ = state_t::mouseover;
|
state_ = state_t::mouseover;
|
||||||
on_state_changed();
|
on_state_changed(state_t::mousedown);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -63,6 +64,22 @@ namespace psemek::ui
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void button::on_state_changed(state_t old)
|
||||||
|
{
|
||||||
|
auto s = merged_style();
|
||||||
|
|
||||||
|
if (state() == state_t::mousedown)
|
||||||
|
{
|
||||||
|
for (auto c : children())
|
||||||
|
if (c) c->reshape(c->shape().bbox() + geom::cast<float>(*s->action_offset));
|
||||||
|
}
|
||||||
|
else if (old == state_t::mousedown)
|
||||||
|
{
|
||||||
|
for (auto c : children())
|
||||||
|
if (c) c->reshape(c->shape().bbox() - geom::cast<float>(*s->action_offset));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void button::set_label(std::shared_ptr<struct label> label)
|
void button::set_label(std::shared_ptr<struct label> label)
|
||||||
{
|
{
|
||||||
if (icon())
|
if (icon())
|
||||||
|
|
|
||||||
|
|
@ -46,8 +46,10 @@ namespace psemek::ui
|
||||||
if (st && c) c->reshape(geom::shrink(bbox, 1.f * (*st->border_width + *st->inner_margin)));
|
if (st && c) c->reshape(geom::shrink(bbox, 1.f * (*st->border_width + *st->inner_margin)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_state_changed() override
|
void on_state_changed(state_t old) override
|
||||||
{
|
{
|
||||||
|
button::on_state_changed(old);
|
||||||
|
|
||||||
gfx::color_rgba color{0, 0, 0, 0};
|
gfx::color_rgba color{0, 0, 0, 0};
|
||||||
|
|
||||||
switch (state()) {
|
switch (state()) {
|
||||||
|
|
@ -73,15 +75,19 @@ namespace psemek::ui
|
||||||
if (st->shadow_offset != geom::vector{0, 0})
|
if (st->shadow_offset != geom::vector{0, 0})
|
||||||
p.draw_rect(shape_.box + geom::cast<float>(*st->shadow_offset), *st->shadow_color);
|
p.draw_rect(shape_.box + geom::cast<float>(*st->shadow_offset), *st->shadow_color);
|
||||||
|
|
||||||
|
auto offset = geom::vector{0.f, 0.f};
|
||||||
|
if (state() == state_t::mousedown)
|
||||||
|
offset = geom::cast<float>(*st->action_offset);
|
||||||
|
|
||||||
if (st->border_width > 0)
|
if (st->border_width > 0)
|
||||||
p.draw_rect(shape_.box, *st->border_color);
|
p.draw_rect(shape_.box + offset, *st->border_color);
|
||||||
|
|
||||||
gfx::color_rgba color = *st->fg_color;
|
gfx::color_rgba color = *st->fg_color;
|
||||||
if (state() == state_t::mouseover)
|
if (state() == state_t::mouseover)
|
||||||
color = *st->highlight_color;
|
color = *st->highlight_color;
|
||||||
else if (state() == state_t::mousedown)
|
else if (state() == state_t::mousedown)
|
||||||
color = *st->action_color;
|
color = *st->action_color;
|
||||||
p.draw_rect(geom::shrink(shape_.box, 1.f * (*st->border_width)), color);
|
p.draw_rect(geom::shrink(shape_.box, 1.f * (*st->border_width)) + offset, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
geom::box<float, 2> size_constraints() const override
|
geom::box<float, 2> size_constraints() const override
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ namespace psemek::ui
|
||||||
merge(dst.fg_color, src.fg_color);
|
merge(dst.fg_color, src.fg_color);
|
||||||
merge(dst.highlight_color, src.highlight_color);
|
merge(dst.highlight_color, src.highlight_color);
|
||||||
merge(dst.action_color, src.action_color);
|
merge(dst.action_color, src.action_color);
|
||||||
|
merge(dst.action_offset, src.action_offset);
|
||||||
merge(dst.border_color, src.border_color);
|
merge(dst.border_color, src.border_color);
|
||||||
merge(dst.border_width, src.border_width);
|
merge(dst.border_width, src.border_width);
|
||||||
merge(dst.shadow_offset, src.shadow_offset);
|
merge(dst.shadow_offset, src.shadow_offset);
|
||||||
|
|
@ -41,6 +42,8 @@ namespace psemek::ui
|
||||||
s.highlight_color = {159, 159, 159, 255};
|
s.highlight_color = {159, 159, 159, 255};
|
||||||
s.action_color = {63, 63, 63, 255};
|
s.action_color = {63, 63, 63, 255};
|
||||||
|
|
||||||
|
s.action_offset = {1, 1};
|
||||||
|
|
||||||
s.border_color = {255, 255, 255, 255};
|
s.border_color = {255, 255, 255, 255};
|
||||||
s.border_width = 3;
|
s.border_width = 3;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue