blob: c98d6c29976d96c4a5139069d2fa184dad601816 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
#include "border_render_object.hpp"
#include "cru_debug.hpp"
namespace cru::ui::render {
BorderRenderObject::BorderRenderObject(Microsoft::WRL::ComPtr<ID2D1Brush> brush)
: border_brush_(std::move(brush)) {}
void BorderRenderObject::OnMeasureCore(const Size& available_size) {
const auto margin = GetMargin();
const auto padding = GetPadding();
Size margin_border_padding_size{
margin.GetHorizontalTotal() + padding.GetHorizontalTotal(),
margin.GetVerticalTotal() + padding.GetVerticalTotal()};
if (is_enabled_) {
margin_border_padding_size.width += border_width_.GetHorizontalTotal();
margin_border_padding_size.height += border_width_.GetVerticalTotal();
}
auto coerced_margin_border_padding_size = margin_border_padding_size;
if (coerced_margin_border_padding_size.width > available_size.width) {
debug::DebugMessage(
L"Measure: horizontal length of padding, border and margin is bigger "
L"than available length.");
coerced_margin_border_padding_size.width = available_size.width;
}
if (coerced_margin_border_padding_size.height > available_size.height) {
debug::DebugMessage(
L"Measure: vertical length of padding, border and margin is bigger "
L"than available length.");
coerced_margin_border_padding_size.height = available_size.height;
}
const auto coerced_content_available_size =
available_size - coerced_margin_border_padding_size;
const auto actual_content_size =
OnMeasureContent(coerced_content_available_size);
SetPreferredSize(coerced_margin_border_padding_size + actual_content_size);
}
void BorderRenderObject::OnLayoutCore(const Rect& rect) {
const auto margin = GetMargin();
const auto padding = GetPadding();
Size margin_border_padding_size{
margin.GetHorizontalTotal() + padding.GetHorizontalTotal(),
margin.GetVerticalTotal() + padding.GetVerticalTotal()};
if (is_enabled_) {
margin_border_padding_size.width += border_width_.GetHorizontalTotal();
margin_border_padding_size.height += border_width_.GetVerticalTotal();
}
const auto content_available_size =
rect.GetSize() - margin_border_padding_size;
auto coerced_content_available_size = content_available_size;
if (coerced_content_available_size.width < 0) {
debug::DebugMessage(
L"Layout: horizontal length of padding, border and margin is bigger "
L"than available length.");
coerced_content_available_size.width = 0;
}
if (coerced_content_available_size.height < 0) {
debug::DebugMessage(
L"Layout: vertical length of padding, border and margin is bigger than "
L"available length.");
coerced_content_available_size.height = 0;
}
OnLayoutContent(
Rect{margin.left + (is_enabled_ ? border_width_.left : 0) + padding.left,
margin.top + (is_enabled_ ? border_width_.top : 0) + padding.top,
coerced_content_available_size.width,
coerced_content_available_size.height});
}
Size BorderRenderObject::OnMeasureContent(const Size& available_size) {
const auto child = GetChild();
if (child) {
child->Measure(available_size);
return child->GetPreferredSize();
} else {
return Size::Zero();
}
}
void BorderRenderObject::OnLayoutContent(const Rect& content_rect) {
const auto child = GetChild();
if (child) {
child->Layout(content_rect);
}
}
} // namespace cru::ui::render
|