aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/render')
-rw-r--r--src/ui/render/BorderRenderObject.cpp12
-rw-r--r--src/ui/render/GeometryRenderObject.cpp110
-rw-r--r--src/ui/render/RenderObject.cpp13
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()};