aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render/RenderObject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/render/RenderObject.cpp')
-rw-r--r--src/ui/render/RenderObject.cpp40
1 files changed, 29 insertions, 11 deletions
diff --git a/src/ui/render/RenderObject.cpp b/src/ui/render/RenderObject.cpp
index f553ea6d..a84bd8c1 100644
--- a/src/ui/render/RenderObject.cpp
+++ b/src/ui/render/RenderObject.cpp
@@ -6,7 +6,17 @@
#include "cru/ui/controls/ControlHost.h"
namespace cru::ui::render {
-const BoxConstraint BoxConstraint::kNotLimit{Size::kMax, Size::kZero};
+void RenderObjectDrawContext::DrawChild(RenderObject* render_object) {
+ auto offset = render_object->GetOffset();
+ paint_invalid_area.left -= offset.x;
+ paint_invalid_area.top -= offset.y;
+ painter->PushState();
+ painter->ConcatTransform(Matrix::Translation(offset));
+ render_object->Draw(*this);
+ painter->PopState();
+ paint_invalid_area.left += offset.x;
+ paint_invalid_area.top += offset.y;
+}
RenderObject::RenderObject(std::string name)
: name_(std::move(name)),
@@ -139,28 +149,35 @@ void RenderObject::OnLayoutCore(const Rect& rect) {
}
Rect RenderObject::GetPaddingRect() {
- const auto size = GetMeasureResultSize();
- Rect rect{Point{}, size};
+ Rect rect{Point{}, size_};
rect = rect.Shrink(GetMargin());
- rect.left = std::min(rect.left, size.width);
- rect.top = std::min(rect.top, size.height);
+ rect.left = std::min(rect.left, size_.width);
+ rect.top = std::min(rect.top, size_.height);
rect.width = std::max(rect.width, 0.0f);
rect.height = std::max(rect.height, 0.0f);
return rect;
}
Rect RenderObject::GetContentRect() {
- const auto size = GetMeasureResultSize();
- Rect rect{Point{}, size};
+ Rect rect{Point{}, size_};
rect = rect.Shrink(GetMargin());
rect = rect.Shrink(GetPadding());
- rect.left = std::min(rect.left, size.width);
- rect.top = std::min(rect.top, size.height);
+ rect.left = std::min(rect.left, size_.width);
+ rect.top = std::min(rect.top, size_.height);
rect.width = std::max(rect.width, 0.0f);
rect.height = std::max(rect.height, 0.0f);
return rect;
}
+Rect RenderObject::GetRenderRect() { return GetContentRect(); }
+
+void RenderObject::Draw(RenderObjectDrawContext& context) {
+ if (!context.paint_invalid_area.IsIntersect(GetRenderRect())) {
+ return;
+ }
+ OnDraw(context);
+}
+
controls::ControlHost* RenderObject::GetControlHost() {
if (control_) {
return control_->GetControlHost();
@@ -176,8 +193,9 @@ void RenderObject::InvalidateLayout() {
}
void RenderObject::InvalidatePaint() {
- if (auto window = GetControlHost()) {
- window->ScheduleRepaint();
+ if (auto host = GetControlHost()) {
+ host->AddPaintInvalidArea(GetRenderRect().WithOffset(GetTotalOffset()));
+ host->ScheduleRepaint();
}
}