CYD-UI
A C++ library for building native graphic user interfaces
Loading...
Searching...
No Matches
style_setters_detail.h
Go to the documentation of this file.
1
2#define STYLE_BASE_FIELD(NAME) \
3 refl::type_info::from<style_base_t>() \
4 .field_by_offset(offsetof(cydui::components::style_base_t, NAME)) \
5 .value()
6
7#define STYLE_SETTER(NAME, TYPE, ...) \
8 STYLE_SETTER_RETURN_TYPE NAME(const TYPE& value) { \
9 static const auto* field = STYLE_BASE_FIELD(NAME); \
10 auto val = [&] -> auto __VA_ARGS__(); \
11 this->get_style_data().set_base_field_override(field, refl::any::make(val)); \
12 STYLE_SETTER_RETURN_EXPR; \
13 } \
14 STYLE_SETTER_RETURN_TYPE NAME(TYPE&& value) { \
15 static const auto* field = STYLE_BASE_FIELD(NAME); \
16 auto val = [&] -> auto __VA_ARGS__(); \
17 this->get_style_data().set_base_field_override(field, refl::any::make(val)); \
18 STYLE_SETTER_RETURN_EXPR; \
19 }
20
21#define INNER_STYLE_SETTER(NAME, TYPE, INNER_NAME, INNER_TYPE, ...) \
22 STYLE_SETTER_RETURN_TYPE NAME##_##INNER_NAME(const INNER_TYPE& value) { \
23 static const auto* field = \
24 refl::type_info::from<style_base_t>().field_by_offset(offsetof(style_base_t, NAME)).value(); \
25 static const auto* inner_field = \
26 field->type().field_by_offset(offsetof(TYPE, INNER_NAME)).value(); \
27 auto val = [&] -> auto __VA_ARGS__(); \
28 this->get_style_data().set_base_field_override({field, inner_field}, refl::any::make(val)); \
29 STYLE_SETTER_RETURN_EXPR; \
30 } \
31 STYLE_SETTER_RETURN_TYPE NAME##_##INNER_NAME(INNER_TYPE&& value) { \
32 static const auto* field = \
33 refl::type_info::from<style_base_t>().field_by_offset(offsetof(style_base_t, NAME)).value(); \
34 static const auto* inner_field = \
35 field->type().field_by_offset(offsetof(TYPE, INNER_NAME)).value(); \
36 auto val = [&] -> auto __VA_ARGS__(); \
37 this->get_style_data().set_base_field_override({field, inner_field}, refl::any::make(val)); \
38 STYLE_SETTER_RETURN_EXPR; \
39 }
40
41#define FOUR_SIDED_SETTER(NAME, TYPE, ...) \
42 INNER_STYLE_SETTER(NAME, four_sided_property<TYPE>, top, TYPE, __VA_ARGS__) \
43 INNER_STYLE_SETTER(NAME, four_sided_property<TYPE>, right, TYPE, __VA_ARGS__) \
44 INNER_STYLE_SETTER(NAME, four_sided_property<TYPE>, bottom, TYPE, __VA_ARGS__) \
45 INNER_STYLE_SETTER(NAME, four_sided_property<TYPE>, left, TYPE, __VA_ARGS__) \
46 STYLE_SETTER_RETURN_TYPE NAME(const TYPE& value) { \
47 NAME##_top(value); \
48 NAME##_right(value); \
49 NAME##_bottom(value); \
50 NAME##_left(value); \
51 STYLE_SETTER_RETURN_EXPR; \
52 } \
53 STYLE_SETTER_RETURN_TYPE NAME(TYPE&& value) { \
54 NAME##_top(value); \
55 NAME##_right(value); \
56 NAME##_bottom(value); \
57 NAME##_left(value); \
58 STYLE_SETTER_RETURN_EXPR; \
59 }
60#define FOUR_SIDED_SETTER_POLY(NAME, TYPE, DTYPE, ...) \
61 INNER_STYLE_SETTER(NAME, four_sided_property<TYPE>, top, DTYPE, __VA_ARGS__) \
62 INNER_STYLE_SETTER(NAME, four_sided_property<TYPE>, right, DTYPE, __VA_ARGS__) \
63 INNER_STYLE_SETTER(NAME, four_sided_property<TYPE>, bottom, DTYPE, __VA_ARGS__) \
64 INNER_STYLE_SETTER(NAME, four_sided_property<TYPE>, left, DTYPE, __VA_ARGS__) \
65 STYLE_SETTER_RETURN_TYPE NAME(const DTYPE& value) { \
66 NAME##_top(value); \
67 NAME##_right(value); \
68 NAME##_bottom(value); \
69 NAME##_left(value); \
70 STYLE_SETTER_RETURN_EXPR; \
71 } \
72 STYLE_SETTER_RETURN_TYPE NAME(DTYPE&& value) { \
73 NAME##_top(value); \
74 NAME##_right(value); \
75 NAME##_bottom(value); \
76 NAME##_left(value); \
77 STYLE_SETTER_RETURN_EXPR; \
78 }
79#define FOUR_SIDED_DIMENSIONAL_OVERLOADS(NAME) \
80 DIMENSIONAL_OVERLOADS(NAME##_top) \
81 DIMENSIONAL_OVERLOADS(NAME##_right) \
82 DIMENSIONAL_OVERLOADS(NAME##_bottom) \
83 DIMENSIONAL_OVERLOADS(NAME##_left) \
84 DIMENSIONAL_OVERLOADS(NAME)
85
86#define FOUR_CORNERED_SETTER(NAME, TYPE, ...) \
87 INNER_STYLE_SETTER(NAME, four_cornered_property<TYPE>, top_left, TYPE, __VA_ARGS__) \
88 INNER_STYLE_SETTER(NAME, four_cornered_property<TYPE>, top_right, TYPE, __VA_ARGS__) \
89 INNER_STYLE_SETTER(NAME, four_cornered_property<TYPE>, bottom_right, TYPE, __VA_ARGS__) \
90 INNER_STYLE_SETTER(NAME, four_cornered_property<TYPE>, bottom_left, TYPE, __VA_ARGS__) \
91 STYLE_SETTER_RETURN_TYPE NAME(const TYPE& value) { \
92 NAME##_top_left(value); \
93 NAME##_top_right(value); \
94 NAME##_bottom_right(value); \
95 NAME##_bottom_left(value); \
96 STYLE_SETTER_RETURN_EXPR \
97 } \
98 STYLE_SETTER_RETURN_TYPE NAME(TYPE&& value) { \
99 NAME##_top_left(value); \
100 NAME##_top_right(value); \
101 NAME##_bottom_right(value); \
102 NAME##_bottom_left(value); \
103 STYLE_SETTER_RETURN_EXPR \
104 }
105
106#define DIMENSIONAL_OVERLOADS(DIMENSION_NAME) \
107 STYLE_SETTER_RETURN_TYPE DIMENSION_NAME(const dimension_parameter_t& value) { \
108 DIMENSION_NAME(dimension_t{dimensions::screen_measure{0} + value}); \
109 STYLE_SETTER_RETURN_EXPR \
110 } \
111 STYLE_SETTER_RETURN_TYPE DIMENSION_NAME(float value) { \
112 DIMENSION_NAME(dimension_t{dimensions::screen_measure{value}}); \
113 STYLE_SETTER_RETURN_EXPR \
114 } \
115 STYLE_SETTER_RETURN_TYPE DIMENSION_NAME(double value) { \
116 DIMENSION_NAME(dimension_t{dimensions::screen_measure{value}}); \
117 STYLE_SETTER_RETURN_EXPR \
118 } \
119 STYLE_SETTER_RETURN_TYPE DIMENSION_NAME(int value) { \
120 DIMENSION_NAME(dimension_t{dimensions::screen_measure{static_cast<double>(value)}}); \
121 STYLE_SETTER_RETURN_EXPR \
122 } \
123 STYLE_SETTER_RETURN_TYPE DIMENSION_NAME(dimension_t& value) { \
124 DIMENSION_NAME(dimension_t{dimensions::screen_measure{0} + value}); \
125 STYLE_SETTER_RETURN_EXPR \
126 } \
127 template <typename DimType> \
128 STYLE_SETTER_RETURN_TYPE DIMENSION_NAME(const DimType& value) { \
129 DIMENSION_NAME(dimension_t{value}); \
130 STYLE_SETTER_RETURN_EXPR \
131 } \
132 template <typename DimType> \
133 STYLE_SETTER_RETURN_TYPE DIMENSION_NAME(DimType&& value) { \
134 DIMENSION_NAME(dimension_t{std::forward<DimType>(value)}); \
135 STYLE_SETTER_RETURN_EXPR \
136 }
137
138#define FOUR_CORNERED_DIMENSIONAL_OVERLOADS(NAME) \
139 DIMENSIONAL_OVERLOADS(NAME##_top_left) \
140 DIMENSIONAL_OVERLOADS(NAME##_top_right) \
141 DIMENSIONAL_OVERLOADS(NAME##_bottom_right) \
142 DIMENSIONAL_OVERLOADS(NAME##_bottom_left) \
143 DIMENSIONAL_OVERLOADS(NAME)
144
145#define DIMENSION_STYLE_SETTER(NAME) \
146 STYLE_SETTER(NAME, dimension_t, { return value; }) \
147 DIMENSIONAL_OVERLOADS(NAME) \