aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render/border_render_object.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2019-03-23 00:15:18 +0800
committercrupest <crupest@outlook.com>2019-03-23 00:15:18 +0800
commit39d2c8b3d957e75c3a2a1c738c1628e3eb5c0173 (patch)
tree72fff34573ffc7e788051bd7911032283340588d /src/ui/render/border_render_object.cpp
parent63a5d619ac81ba3f48e95c890d96fa7d9047bb26 (diff)
downloadcru-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.cpp96
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