diff options
author | crupest <crupest@outlook.com> | 2019-03-23 00:15:18 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2019-03-23 00:15:18 +0800 |
commit | 39d2c8b3d957e75c3a2a1c738c1628e3eb5c0173 (patch) | |
tree | 72fff34573ffc7e788051bd7911032283340588d /src/ui/render/border_render_object.cpp | |
parent | 63a5d619ac81ba3f48e95c890d96fa7d9047bb26 (diff) | |
download | cru-39d2c8b3d957e75c3a2a1c738c1628e3eb5c0173.tar.gz cru-39d2c8b3d957e75c3a2a1c738c1628e3eb5c0173.tar.bz2 cru-39d2c8b3d957e75c3a2a1c738c1628e3eb5c0173.zip |
...
Diffstat (limited to 'src/ui/render/border_render_object.cpp')
-rw-r--r-- | src/ui/render/border_render_object.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/ui/render/border_render_object.cpp b/src/ui/render/border_render_object.cpp new file mode 100644 index 00000000..c98d6c29 --- /dev/null +++ b/src/ui/render/border_render_object.cpp @@ -0,0 +1,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 |