aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render/BorderRenderObject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/render/BorderRenderObject.cpp')
-rw-r--r--src/ui/render/BorderRenderObject.cpp52
1 files changed, 28 insertions, 24 deletions
diff --git a/src/ui/render/BorderRenderObject.cpp b/src/ui/render/BorderRenderObject.cpp
index 61af27bc..5916c7aa 100644
--- a/src/ui/render/BorderRenderObject.cpp
+++ b/src/ui/render/BorderRenderObject.cpp
@@ -12,13 +12,18 @@
#include <algorithm>
namespace cru::ui::render {
-BorderRenderObject::BorderRenderObject() {
- SetChildMode(ChildMode::Single);
- RecreateGeometry();
-}
+BorderRenderObject::BorderRenderObject() { RecreateGeometry(); }
BorderRenderObject::~BorderRenderObject() {}
+void BorderRenderObject::SetChild(RenderObject* new_child) {
+ if (child_ == new_child) return;
+ if (child_ != nullptr) child_->SetParent(nullptr);
+ child_ = new_child;
+ if (child_ != nullptr) child_->SetParent(this);
+ InvalidateLayout();
+}
+
void BorderRenderObject::ApplyBorderStyle(
const style::ApplyBorderStyleInfo& style) {
if (style.border_brush) border_brush_ = *style.border_brush;
@@ -30,10 +35,8 @@ void BorderRenderObject::ApplyBorderStyle(
}
RenderObject* BorderRenderObject::HitTest(const Point& point) {
- if (const auto child = GetSingleChild()) {
- auto offset = child->GetOffset();
- Point p{point.x - offset.x, point.y - offset.y};
- const auto result = child->HitTest(p);
+ if (child_) {
+ const auto result = child_->HitTest(point - child_->GetOffset());
if (result != nullptr) {
return result;
}
@@ -45,7 +48,7 @@ RenderObject* BorderRenderObject::HitTest(const Point& point) {
return contains ? this : nullptr;
} else {
const auto margin = GetMargin();
- const auto size = GetSize();
+ const auto size = GetDesiredSize();
return Rect{margin.left, margin.top,
std::max(size.width - margin.GetHorizontalTotal(), 0.0f),
std::max(size.height - margin.GetVerticalTotal(), 0.0f)}
@@ -55,7 +58,7 @@ RenderObject* BorderRenderObject::HitTest(const Point& point) {
}
}
-void BorderRenderObject::OnDrawCore(platform::graphics::IPainter* painter) {
+void BorderRenderObject::Draw(platform::graphics::IPainter* painter) {
if constexpr (debug_flags::draw) {
log::TagDebug(
log_tag, u"BorderRenderObject draw, background: {}, foreground: {}.",
@@ -77,34 +80,35 @@ void BorderRenderObject::OnDrawCore(platform::graphics::IPainter* painter) {
}
}
- DefaultDrawContent(painter);
+ if (child_) {
+ painter->PushState();
+ painter->ConcatTransform(Matrix::Translation(child_->GetOffset()));
+ child_->Draw(painter);
+ painter->PopState();
+ }
if (foreground_brush_ != nullptr)
painter->FillGeometry(border_inner_geometry_.get(),
foreground_brush_.get());
-
- DefaultDrawChildren(painter);
}
Size BorderRenderObject::OnMeasureContent(const MeasureRequirement& requirement,
const MeasureSize& preferred_size) {
- const auto child = GetSingleChild();
- if (child) {
- child->Measure(requirement, preferred_size);
- return child->GetSize();
+ if (child_) {
+ child_->Measure(requirement, preferred_size);
+ return child_->GetDesiredSize();
} else {
return Size{};
}
}
void BorderRenderObject::OnLayoutContent(const Rect& content_rect) {
- const auto child = GetSingleChild();
- if (child) {
- child->Layout(content_rect.GetLeftTop());
+ if (child_) {
+ child_->Layout(content_rect.GetLeftTop());
}
}
-void BorderRenderObject::OnAfterLayout() { RecreateGeometry(); }
+void BorderRenderObject::OnResize(const Size& new_size) { RecreateGeometry(); }
Thickness BorderRenderObject::GetOuterSpaceThickness() const {
return is_border_enabled_
@@ -113,7 +117,7 @@ Thickness BorderRenderObject::GetOuterSpaceThickness() const {
}
Rect BorderRenderObject::GetPaddingRect() const {
- const auto size = GetSize();
+ const auto size = GetDesiredSize();
Rect rect{Point{}, size};
rect = rect.Shrink(GetMargin());
if (is_border_enabled_) rect = rect.Shrink(border_thickness_);
@@ -125,7 +129,7 @@ Rect BorderRenderObject::GetPaddingRect() const {
}
Rect BorderRenderObject::GetContentRect() const {
- const auto size = GetSize();
+ const auto size = GetDesiredSize();
Rect rect{Point{}, size};
rect = rect.Shrink(GetMargin());
if (is_border_enabled_) rect = rect.Shrink(border_thickness_);
@@ -180,7 +184,7 @@ void BorderRenderObject::RecreateGeometry() {
builder->CloseFigure(true);
};
- const auto size = GetSize();
+ const auto size = GetDesiredSize();
const auto margin = GetMargin();
const Rect outer_rect{margin.left, margin.top,
size.width - margin.GetHorizontalTotal(),