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) \
include
cyd_ui
components
style_setters_detail.h
Generated by
1.13.2