HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
style_attributes.hpp
1// Copyright Take Vos 2024.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "style_modify_mask.hpp"
8#include "../units/units.hpp"
9#include "../color/color.hpp"
10#include "../geometry/geometry.hpp"
11#include "../macros.hpp"
12#include <cstdint>
13
14hi_export_module(hikogui.theme : style_attributes);
15
16hi_export namespace hi {
17inline namespace v1 {
18
20public:
21 constexpr style_attributes() noexcept = default;
22 constexpr style_attributes(style_attributes const&) noexcept = default;
23 constexpr style_attributes(style_attributes&&) noexcept = default;
24 constexpr style_attributes& operator=(style_attributes const&) noexcept = default;
25 constexpr style_attributes& operator=(style_attributes&&) noexcept = default;
26
27#define HIX_GETSET(TYPE, NAME, MODIFY_MASK) \
28 [[nodiscard]] TYPE NAME() const noexcept \
29 { \
30 return _##NAME; \
31 } \
32 style_modify_mask set_##NAME(TYPE NAME, bool important = false) noexcept \
33 { \
34 auto r = style_modify_mask{}; \
35 if (important or not _##NAME##_important) { \
36 _##NAME##_important |= static_cast<uint64_t>(important); \
37 _##NAME##_valid = 1; \
38 r |= _##NAME == NAME ? style_modify_mask::none : MODIFY_MASK; \
39 _##NAME = NAME; \
40 } \
41 return r; \
42 }
43
44 HIX_GETSET(hi::unit::length_f, width, style_modify_mask::layout)
45 HIX_GETSET(hi::unit::length_f, height, style_modify_mask::layout)
46 HIX_GETSET(hi::unit::length_f, margin_left, style_modify_mask::layout)
47 HIX_GETSET(hi::unit::length_f, margin_bottom, style_modify_mask::layout)
48 HIX_GETSET(hi::unit::length_f, margin_right, style_modify_mask::layout)
49 HIX_GETSET(hi::unit::length_f, margin_top, style_modify_mask::layout)
50 HIX_GETSET(hi::unit::length_f, padding_left, style_modify_mask::layout)
51 HIX_GETSET(hi::unit::length_f, padding_bottom, style_modify_mask::layout)
52 HIX_GETSET(hi::unit::length_f, padding_right, style_modify_mask::layout)
53 HIX_GETSET(hi::unit::length_f, padding_top, style_modify_mask::layout)
54 HIX_GETSET(hi::unit::length_f, border_width, style_modify_mask::layout)
55 HIX_GETSET(hi::unit::length_f, border_bottom_left_radius, style_modify_mask::layout)
56 HIX_GETSET(hi::unit::length_f, border_bottom_right_radius, style_modify_mask::layout)
57 HIX_GETSET(hi::unit::length_f, border_top_left_radius, style_modify_mask::layout)
58 HIX_GETSET(hi::unit::length_f, border_top_right_radius, style_modify_mask::layout)
59 HIX_GETSET(hi::color, foreground_color, style_modify_mask::color)
60 HIX_GETSET(hi::color, background_color, style_modify_mask::color)
61 HIX_GETSET(hi::color, border_color, style_modify_mask::color)
64#undef HIX_GETSET
65
66 style_modify_mask set_margin(unit::length_f margin, bool important = false) noexcept
67 {
68 auto r = style_modify_mask{};
69 r |= set_margin_left(margin, important);
70 r |= set_margin_bottom(margin, important);
71 r |= set_margin_right(margin, important);
72 r |= set_margin_top(margin, important);
73 return r;
74 }
75
76 style_modify_mask set_padding(unit::length_f padding, bool important = false) noexcept
77 {
78 auto r = style_modify_mask{};
79 r |= set_padding_left(padding, important);
80 r |= set_padding_bottom(padding, important);
81 r |= set_padding_right(padding, important);
82 r |= set_padding_top(padding, important);
83 return r;
84 }
85
86 style_modify_mask set_border_radius(unit::length_f border_radius, bool important = false) noexcept
87 {
88 auto r = style_modify_mask{};
89 r |= set_border_bottom_left_radius(border_radius, important);
90 r |= set_border_bottom_right_radius(border_radius, important);
91 r |= set_border_top_left_radius(border_radius, important);
92 r |= set_border_top_right_radius(border_radius, important);
93 return r;
94 }
95
96 void clear() noexcept
97 {
98 *this = style_attributes{};
99 }
100
106 [[nodiscard]] friend style_modify_mask compare(style_attributes const& lhs, style_attributes const& rhs) noexcept
107 {
108#define HIX_COMPARE(NAME, MODIFY_MASK) \
109 r |= lhs._##NAME != rhs._##NAME ? MODIFY_MASK : style_modify_mask{};
110
111 auto r = style_modify_mask{};
112 HIX_COMPARE(width, style_modify_mask::size)
113 HIX_COMPARE(height, style_modify_mask::size)
114 HIX_COMPARE(margin_left, style_modify_mask::margin)
115 HIX_COMPARE(margin_bottom, style_modify_mask::margin)
116 HIX_COMPARE(margin_right, style_modify_mask::margin)
117 HIX_COMPARE(margin_top, style_modify_mask::margin)
118 HIX_COMPARE(padding_left, style_modify_mask::margin)
119 HIX_COMPARE(padding_bottom, style_modify_mask::margin)
120 HIX_COMPARE(padding_right, style_modify_mask::margin)
121 HIX_COMPARE(padding_top, style_modify_mask::margin)
122 HIX_COMPARE(border_width, style_modify_mask::weight)
123 HIX_COMPARE(border_bottom_left_radius, style_modify_mask::weight)
124 HIX_COMPARE(border_bottom_right_radius, style_modify_mask::weight)
125 HIX_COMPARE(border_top_left_radius, style_modify_mask::weight)
126 HIX_COMPARE(border_top_right_radius, style_modify_mask::weight)
127 HIX_COMPARE(foreground_color, style_modify_mask::color)
128 HIX_COMPARE(background_color, style_modify_mask::color)
129 HIX_COMPARE(border_color, style_modify_mask::color)
132#undef HIX_COMPARE
133 return r;
134 }
135
141 style_modify_mask apply(style_attributes const& other) noexcept
142 {
143#define HIX_APPLY(NAME) \
144 if (other._##NAME##_valid) { \
145 r |= set_##NAME(other._##NAME, static_cast<bool>(other._##NAME##_important)); \
146 }
147
148 auto r = style_modify_mask{};
149 HIX_APPLY(width)
150 HIX_APPLY(height)
151 HIX_APPLY(margin_left)
152 HIX_APPLY(margin_bottom)
153 HIX_APPLY(margin_right)
154 HIX_APPLY(margin_top)
155 HIX_APPLY(padding_left)
156 HIX_APPLY(padding_bottom)
157 HIX_APPLY(padding_right)
158 HIX_APPLY(padding_top)
159 HIX_APPLY(border_width)
160 HIX_APPLY(border_bottom_left_radius)
161 HIX_APPLY(border_bottom_right_radius)
162 HIX_APPLY(border_top_left_radius)
163 HIX_APPLY(border_top_right_radius)
164 HIX_APPLY(foreground_color)
165 HIX_APPLY(background_color)
166 HIX_APPLY(border_color)
167 HIX_APPLY(horizontal_alignment)
168 HIX_APPLY(vertical_alignment)
169#undef HIX_APPLY
170 return r;
171 }
172
173private:
174 hi::unit::length_f _width = unit::points(0.0f);
175 hi::unit::length_f _height = unit::points(0.0f);
176 hi::unit::length_f _margin_left = unit::points(0.0f);
177 hi::unit::length_f _margin_bottom = unit::points(0.0f);
178 hi::unit::length_f _margin_right = unit::points(0.0f);
179 hi::unit::length_f _margin_top = unit::points(0.0f);
180 hi::unit::length_f _padding_left = unit::points(0.0f);
181 hi::unit::length_f _padding_bottom = unit::points(0.0f);
182 hi::unit::length_f _padding_right = unit::points(0.0f);
183 hi::unit::length_f _padding_top = unit::points(0.0f);
184 hi::unit::length_f _border_width = unit::points(0.0f);
185 hi::unit::length_f _border_bottom_left_radius = unit::points(0.0f);
186 hi::unit::length_f _border_bottom_right_radius = unit::points(0.0f);
187 hi::unit::length_f _border_top_left_radius = unit::points(0.0f);
188 hi::unit::length_f _border_top_right_radius = unit::points(0.0f);
189 hi::color _foreground_color = {};
190 hi::color _background_color = {};
191 hi::color _border_color = {};
192 hi::horizontal_alignment _horizontal_alignment = hi::horizontal_alignment::left;
193 hi::vertical_alignment _vertical_alignment = hi::vertical_alignment::top;
194
195 uint64_t _width_valid : 1 = 0;
196 uint64_t _height_valid : 1 = 0;
197 uint64_t _margin_left_valid : 1 = 0;
198 uint64_t _margin_bottom_valid : 1 = 0;
199 uint64_t _margin_right_valid : 1 = 0;
200 uint64_t _margin_top_valid : 1 = 0;
201 uint64_t _padding_left_valid : 1 = 0;
202 uint64_t _padding_bottom_valid : 1 = 0;
203 uint64_t _padding_right_valid : 1 = 0;
204 uint64_t _padding_top_valid : 1 = 0;
205 uint64_t _border_width_valid : 1 = 0;
206 uint64_t _border_bottom_left_radius_valid : 1 = 0;
207 uint64_t _border_bottom_right_radius_valid : 1 = 0;
208 uint64_t _border_top_left_radius_valid : 1 = 0;
209 uint64_t _border_top_right_radius_valid : 1 = 0;
210 uint64_t _foreground_color_valid : 1 = 0;
211 uint64_t _background_color_valid : 1 = 0;
212 uint64_t _border_color_valid : 1 = 0;
213 uint64_t _horizontal_alignment_valid : 1 = 0;
214 uint64_t _vertical_alignment_valid : 1 = 0;
215
216 uint64_t _width_important : 1 = 0;
217 uint64_t _height_important : 1 = 0;
218 uint64_t _margin_left_important : 1 = 0;
219 uint64_t _margin_bottom_important : 1 = 0;
220 uint64_t _margin_right_important : 1 = 0;
221 uint64_t _margin_top_important : 1 = 0;
222 uint64_t _padding_left_important : 1 = 0;
223 uint64_t _padding_bottom_important : 1 = 0;
224 uint64_t _padding_right_important : 1 = 0;
225 uint64_t _padding_top_important : 1 = 0;
226 uint64_t _border_width_important : 1 = 0;
227 uint64_t _border_bottom_left_radius_important : 1 = 0;
228 uint64_t _border_bottom_right_radius_important : 1 = 0;
229 uint64_t _border_top_left_radius_important : 1 = 0;
230 uint64_t _border_top_right_radius_important : 1 = 0;
231 uint64_t _foreground_color_important : 1 = 0;
232 uint64_t _background_color_important : 1 = 0;
233 uint64_t _border_color_important : 1 = 0;
234 uint64_t _horizontal_alignment_important : 1 = 0;
235 uint64_t _vertical_alignment_important : 1 = 0;
236};
237
238} // namespace v1
239}
Defined the color type.
vertical_alignment
Vertical alignment.
Definition alignment.hpp:25
horizontal_alignment
Horizontal alignment.
Definition alignment.hpp:102
@ other
The gui_event does not have associated data.
Definition gui_event_variant.hpp:24
The HikoGUI namespace.
Definition array_generic.hpp:21
The HikoGUI API version 1.
Definition array_generic.hpp:22
style_modify_mask
Definition style_modify_mask.hpp:16
@ alignment
A alignment was changed.
Definition style_modify_mask.hpp:43
@ color
A color value was modified.
Definition style_modify_mask.hpp:27
@ weight
A border-width or border-radius was modified.
Definition style_modify_mask.hpp:31
@ layout
A layout (size, alignment) value was modified.
Definition style_modify_mask.hpp:55
@ margin
A margin or padding value was modified.
Definition style_modify_mask.hpp:39
@ size
A size value was modified.
Definition style_modify_mask.hpp:35
This is a RGBA floating point color.
Definition color_intf.hpp:49
Definition style_attributes.hpp:19
friend style_modify_mask compare(style_attributes const &lhs, style_attributes const &rhs) noexcept
Set all attributes in other as-if they are important.
Definition style_attributes.hpp:106
style_modify_mask apply(style_attributes const &other) noexcept
Apply attributes of other ontop of the current.
Definition style_attributes.hpp:141