diff options
Diffstat (limited to 'src/ui/render')
-rw-r--r-- | src/ui/render/BorderRenderObject.cpp | 12 | ||||
-rw-r--r-- | src/ui/render/GeometryRenderObject.cpp | 110 | ||||
-rw-r--r-- | src/ui/render/RenderObject.cpp | 13 |
3 files changed, 128 insertions, 7 deletions
diff --git a/src/ui/render/BorderRenderObject.cpp b/src/ui/render/BorderRenderObject.cpp index 40ab506a..8e93e205 100644 --- a/src/ui/render/BorderRenderObject.cpp +++ b/src/ui/render/BorderRenderObject.cpp @@ -130,10 +130,16 @@ void BorderRenderObject::OnLayoutContent(const Rect& content_rect) { void BorderRenderObject::OnResize(const Size& new_size) { RecreateGeometry(); } -Thickness BorderRenderObject::GetOuterSpaceThickness() const { +Thickness BorderRenderObject::GetTotalSpaceThickness() const { return is_border_enabled_ - ? RenderObject::GetOuterSpaceThickness() + GetBorderThickness() - : RenderObject::GetOuterSpaceThickness(); + ? RenderObject::GetTotalSpaceThickness() + GetBorderThickness() + : RenderObject::GetTotalSpaceThickness(); +} + +Thickness BorderRenderObject::GetInnerSpaceThickness() const { + return is_border_enabled_ + ? RenderObject::GetInnerSpaceThickness() + GetBorderThickness() + : RenderObject::GetInnerSpaceThickness(); } Rect BorderRenderObject::GetPaddingRect() const { diff --git a/src/ui/render/GeometryRenderObject.cpp b/src/ui/render/GeometryRenderObject.cpp new file mode 100644 index 00000000..ea9b6e11 --- /dev/null +++ b/src/ui/render/GeometryRenderObject.cpp @@ -0,0 +1,110 @@ +#include "cru/ui/render/GeometryRenderObject.h" +#include "cru/platform/graphics/Brush.h" +#include "cru/platform/graphics/Geometry.h" +#include "cru/platform/graphics/Painter.h" +#include "cru/ui/render/RenderObject.h" + +namespace cru::ui::render { +GeometryRenderObject::GeometryRenderObject() {} + +GeometryRenderObject::~GeometryRenderObject() {} + +std::shared_ptr<platform::graphics::IGeometry> +GeometryRenderObject::GetGeometry() const { + return geometry_; +} + +void GeometryRenderObject::SetGeometry( + std::shared_ptr<platform::graphics::IGeometry> geometry, + std::optional<Rect> view_port) { + geometry_ = std::move(geometry); + if (view_port) { + view_port_ = *view_port; + } else { + view_port_ = geometry_ ? geometry_->GetBounds() : Rect{}; + } +} + +Rect GeometryRenderObject::GetViewPort() const { return view_port_; } + +void GeometryRenderObject::SetViewPort(const Rect& view_port) { + view_port_ = view_port; + InvalidatePaint(); +} + +std::shared_ptr<platform::graphics::IBrush> GeometryRenderObject::GetFillBrush() + const { + return fill_brush_; +} + +void GeometryRenderObject::SetFillBrush( + std::shared_ptr<platform::graphics::IBrush> brush) { + fill_brush_ = std::move(brush); + InvalidatePaint(); +} + +std::shared_ptr<platform::graphics::IBrush> +GeometryRenderObject::GetStrokeBrush() const { + return stroke_brush_; +} + +void GeometryRenderObject::SetStrokeBrush( + std::shared_ptr<platform::graphics::IBrush> brush) { + stroke_brush_ = std::move(brush); + InvalidatePaint(); +} + +float GeometryRenderObject::GetStrokeWidth() const { return stroke_width_; } + +void GeometryRenderObject::SetStrokeWidth(float width) { + stroke_width_ = width; + InvalidatePaint(); +} + +void GeometryRenderObject::Draw(platform::graphics::IPainter* painter) { + if (!geometry_) return; + + painter->PushState(); + + auto content_rect = GetContentRect(); + + painter->ConcatTransform(Matrix::Translation(content_rect.GetLeftTop())); + + painter->ConcatTransform( + Matrix::Translation(view_port_.GetLeftTop().Negate()) * + Matrix::Scale(content_rect.width / view_port_.width, + content_rect.height / view_port_.height)); + + if (fill_brush_) { + painter->FillGeometry(geometry_.get(), fill_brush_.get()); + } + + if (stroke_brush_ && stroke_width_) { + painter->StrokeGeometry(geometry_.get(), stroke_brush_.get(), + stroke_width_); + } + + painter->PopState(); +} + +RenderObject* GeometryRenderObject::HitTest(const Point& point) { + return GetPaddingRect().IsPointInside(point) ? this : nullptr; +} + +Size GeometryRenderObject::OnMeasureContent( + const MeasureRequirement& requirement, const MeasureSize& preferred_size) { + Size result = GetViewPort().GetSize(); + + if (preferred_size.width.IsSpecified()) { + result.width = preferred_size.width.GetLengthOrUndefined(); + } + + if (preferred_size.height.IsSpecified()) { + result.height = preferred_size.height.GetLengthOrUndefined(); + } + + return requirement.Coerce(result); +} + +void GeometryRenderObject::OnLayoutContent(const Rect& content_rect) {} +} // namespace cru::ui::render diff --git a/src/ui/render/RenderObject.cpp b/src/ui/render/RenderObject.cpp index b6de5782..a2ecab8b 100644 --- a/src/ui/render/RenderObject.cpp +++ b/src/ui/render/RenderObject.cpp @@ -1,6 +1,7 @@ #include "cru/ui/render/RenderObject.h" #include "cru/common/log/Logger.h" +#include "cru/platform/GraphicsBase.h" #include "cru/ui/DebugFlags.h" #include "cru/ui/controls/Control.h" #include "cru/ui/host/WindowHost.h" @@ -109,13 +110,15 @@ void RenderObject::Layout(const Point& offset) { OnLayoutCore(); } -Thickness RenderObject::GetOuterSpaceThickness() const { +Thickness RenderObject::GetTotalSpaceThickness() const { return margin_ + padding_; } +Thickness RenderObject::GetInnerSpaceThickness() const { return padding_; } + Size RenderObject::OnMeasureCore(const MeasureRequirement& requirement, const MeasureSize& preferred_size) { - const Thickness outer_space = GetOuterSpaceThickness(); + const Thickness outer_space = GetTotalSpaceThickness(); const Size space_size{outer_space.GetHorizontalTotal(), outer_space.GetVerticalTotal()}; @@ -124,8 +127,10 @@ Size RenderObject::OnMeasureCore(const MeasureRequirement& requirement, content_requirement.max = content_requirement.max.Minus(space_size); content_requirement.min = content_requirement.min.Minus(space_size); + auto inner_space = GetInnerSpaceThickness(); MeasureSize content_preferred_size = - content_requirement.Coerce(preferred_size.Minus(space_size)); + content_requirement.Coerce(preferred_size.Minus( + {inner_space.GetHorizontalTotal(), inner_space.GetVerticalTotal()})); const auto content_size = OnMeasureContent(content_requirement, content_preferred_size); @@ -135,7 +140,7 @@ Size RenderObject::OnMeasureCore(const MeasureRequirement& requirement, void RenderObject::OnLayoutCore() { Size total_size = GetDesiredSize(); - const Thickness outer_space = GetOuterSpaceThickness(); + const Thickness outer_space = GetTotalSpaceThickness(); const Size space_size{outer_space.GetHorizontalTotal(), outer_space.GetVerticalTotal()}; |