psemek/libs/ui_legacy/source/style.cpp

149 lines
3.7 KiB
C++

#include <psemek/ui/style.hpp>
#include <psemek/ui/element.hpp>
namespace psemek::ui
{
namespace
{
template <typename T>
void merge(std::optional<T> & dst, std::optional<T> const & src)
{
if (!dst) dst = src;
}
template <typename T>
void merge(std::shared_ptr<T> & dst, std::shared_ptr<T> const & src)
{
if (!dst) dst = src;
}
template <typename T>
void scale(T & dst, float factor)
{
if (dst) dst = static_cast<T>(std::ceil((*dst) * factor));
}
template <typename T, std::size_t N>
void scale(std::optional<math::vector<T, N>> & dst, float factor)
{
if (dst)
for (std::size_t i = 0; i < N; ++i)
(*dst)[i] = static_cast<T>(std::ceil((*dst)[i] * factor));
}
}
style::style(style const & other)
{
merge(*this, other);
}
void style::on_changed()
{
for (auto e : use_as_style)
e->style_updated();
for (auto e : use_as_own_style)
e->own_style_updated();
}
void merge(style & dst, style const & src)
{
merge(dst.scale, src.scale);
merge(dst.bg_color, src.bg_color);
merge(dst.fg_color, src.fg_color);
merge(dst.highlight_color, src.highlight_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_width, src.border_width);
merge(dst.bevel_light_color, src.bevel_light_color);
merge(dst.bevel_dark_color, src.bevel_dark_color);
merge(dst.bevel_type, src.bevel_type);
merge(dst.bevel_width, src.bevel_width);
merge(dst.axis_color, src.axis_color);
merge(dst.ref_height, src.ref_height);
merge(dst.shadow_offset, src.shadow_offset);
merge(dst.shadow_color, src.shadow_color);
merge(dst.inner_margin, src.inner_margin);
merge(dst.outer_margin, src.outer_margin);
merge(dst.text_color, src.text_color);
merge(dst.text_scale, src.text_scale);
merge(dst.text_style, src.text_style);
merge(dst.text_shadow_offset, src.text_shadow_offset);
merge(dst.link_color, src.link_color);
merge(dst.link_style, src.link_style);
merge(dst.link_hover_color, src.link_hover_color);
merge(dst.link_hover_style, src.link_hover_style);
merge(dst.link_click_color, src.link_click_color);
merge(dst.link_click_style, src.link_click_style);
merge(dst.font, src.font);
merge(dst.bold_font, src.bold_font);
}
style scale(style const & s, float factor)
{
style result = s;
scale(result.scale, factor);
scale(result.action_offset, factor);
scale(result.border_width, factor);
scale(result.ref_height, factor);
scale(result.shadow_offset, factor);
scale(result.inner_margin, factor);
scale(result.outer_margin, factor);
scale(result.text_scale, factor);
scale(result.text_shadow_offset, factor);
return result;
}
style default_style()
{
style s;
s.scale = 1;
s.bg_color = {95, 95, 95, 255};
s.fg_color = {127, 127, 127, 255};
s.highlight_color = {159, 159, 159, 255};
s.action_color = {63, 63, 63, 255};
s.action_offset = {1, 1};
s.border_color = {255, 255, 255, 255};
s.border_width = 3;
s.bevel_light_color = {159, 159, 159, 255};
s.bevel_dark_color = {63, 63, 63, 63};
s.bevel_type = bevel_type::up;
s.bevel_width = 1;
s.axis_color = {255, 255, 255, 255};
s.ref_height = 22;
s.shadow_offset = {1, 1};
s.shadow_color = {0, 0, 0, 255};
s.inner_margin = {5, 5};
s.outer_margin = 10;
s.text_color = {255, 255, 255, 255};
s.text_scale = 1;
s.text_style = text_style{};
s.text_shadow_offset = {1, 1};
s.link_color = {0, 0, 255, 255};
s.link_style = text_style{};
s.link_hover_color = {127, 127, 255, 255};
s.link_hover_style = text_style{};
s.link_click_color = {0, 0, 127, 255};
s.link_click_style = text_style{};
return s;
}
}