psemek/libs/ui/source/style.cpp
2021-08-06 16:09:08 +03:00

101 lines
2.4 KiB
C++

#include <psemek/ui/style.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<geom::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));
}
}
void merge(style & dst, style const & src)
{
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.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_shadow_offset, src.text_shadow_offset);
merge(dst.font, src.font);
}
style scale(style const & s, float factor)
{
style result = s;
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.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.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;
s.outer_margin = 10;
s.text_color = {255, 255, 255, 255};
s.text_scale = 1;
s.text_shadow_offset = {1, 1};
return s;
}
}