aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/render')
-rw-r--r--src/ui/render/border_render_object.cpp4
-rw-r--r--src/ui/render/border_render_object.hpp92
-rw-r--r--src/ui/render/flex_layout_render_object.cpp20
-rw-r--r--src/ui/render/flex_layout_render_object.hpp59
-rw-r--r--src/ui/render/render_object.cpp19
-rw-r--r--src/ui/render/render_object.hpp97
-rw-r--r--src/ui/render/text_render_object.hpp69
-rw-r--r--src/ui/render/window_render_object.hpp40
8 files changed, 22 insertions, 378 deletions
diff --git a/src/ui/render/border_render_object.cpp b/src/ui/render/border_render_object.cpp
index 72cea756..8b6b8d25 100644
--- a/src/ui/render/border_render_object.cpp
+++ b/src/ui/render/border_render_object.cpp
@@ -1,7 +1,5 @@
-#include "border_render_object.hpp"
+#include "cru/ui/render/border_render_object.hpp"
-#include <d2d1_1.h>
-#include <wrl/client.h>
#include <algorithm>
#include "cru_debug.hpp"
diff --git a/src/ui/render/border_render_object.hpp b/src/ui/render/border_render_object.hpp
deleted file mode 100644
index 80db648a..00000000
--- a/src/ui/render/border_render_object.hpp
+++ /dev/null
@@ -1,92 +0,0 @@
-#pragma once
-#include "pre.hpp"
-
-#include <wrl/client.h> // for ComPtr
-
-#include "render_object.hpp"
-
-// forward declarations
-struct ID2D1Brush;
-struct ID2D1Geometry;
-
-namespace cru::ui::render {
-struct CornerRadius {
- constexpr CornerRadius()
- : left_top(), right_top(), left_bottom(), right_bottom() {}
- constexpr CornerRadius(const Point& value)
- : left_top(value),
- right_top(value),
- left_bottom(value),
- right_bottom(value) {}
- constexpr CornerRadius(Point left_top, Point right_top, Point left_bottom,
- Point right_bottom)
- : left_top(left_top),
- right_top(right_top),
- left_bottom(left_bottom),
- right_bottom(right_bottom) {}
-
- Point left_top;
- Point right_top;
- Point left_bottom;
- Point right_bottom;
-};
-
-class BorderRenderObject : public RenderObject {
- public:
- explicit BorderRenderObject(ID2D1Brush* brush);
- BorderRenderObject(const BorderRenderObject& other) = delete;
- BorderRenderObject(BorderRenderObject&& other) = delete;
- BorderRenderObject& operator=(const BorderRenderObject& other) = delete;
- BorderRenderObject& operator=(BorderRenderObject&& other) = delete;
- ~BorderRenderObject() override;
-
- bool IsEnabled() const { return is_enabled_; }
- void SetEnabled(bool enabled) { is_enabled_ = enabled; }
-
- ID2D1Brush* GetBrush() const { return border_brush_; }
- void SetBrush(ID2D1Brush* new_brush);
-
- Thickness GetBorderWidth() const { return border_thickness_; }
- void SetBorderWidth(const Thickness& thickness) {
- border_thickness_ = thickness;
- }
-
- CornerRadius GetCornerRadius() const { return corner_radius_; }
- void SetCornerRadius(const CornerRadius& new_corner_radius) {
- corner_radius_ = new_corner_radius;
- }
-
- void Refresh() { RecreateGeometry(); }
-
- void Draw(ID2D1RenderTarget* render_target) override;
-
- RenderObject* HitTest(const Point& point) override;
-
- protected:
- void OnAddChild(RenderObject* new_child, int position) override;
-
- void OnSizeChanged(const Size& old_size, const Size& new_size) override;
-
- void OnMeasureCore(const Size& available_size) override;
- void OnLayoutCore(const Rect& rect) override;
- Size OnMeasureContent(const Size& available_size) override;
- void OnLayoutContent(const Rect& content_rect) override;
-
- private:
- RenderObject* GetChild() const {
- return GetChildren().empty() ? nullptr : GetChildren()[0];
- }
-
- void RecreateGeometry();
-
- private:
- bool is_enabled_ = false;
-
- ID2D1Brush* border_brush_ = nullptr;
- Thickness border_thickness_ = Thickness::Zero();
- CornerRadius corner_radius_{};
-
- ID2D1Geometry* geometry_ = nullptr;
- ID2D1Geometry* border_outer_geometry_ = nullptr;
-};
-} // namespace cru::ui::render
diff --git a/src/ui/render/flex_layout_render_object.cpp b/src/ui/render/flex_layout_render_object.cpp
index e4d327f1..0e2e8ff7 100644
--- a/src/ui/render/flex_layout_render_object.cpp
+++ b/src/ui/render/flex_layout_render_object.cpp
@@ -1,12 +1,15 @@
-#include "flex_layout_render_object.hpp"
+#include "cru/ui/render/flex_layout_render_object.hpp"
+
+#include "cru/platform/debug.hpp"
+#include "cru/platform/painter_util.hpp"
#include <algorithm>
+#include <cassert>
#include <functional>
-#include "cru_debug.hpp"
-#include "graph/graph_util.hpp"
-
namespace cru::ui::render {
+using namespace platform;
+
FlexChildLayoutData* FlexLayoutRenderObject::GetChildLayoutData(int position) {
assert(position >= 0 &&
position < child_layout_data_.size()); // Position out of bound.
@@ -14,12 +17,11 @@ FlexChildLayoutData* FlexLayoutRenderObject::GetChildLayoutData(int position) {
return &child_layout_data_[position];
}
-void FlexLayoutRenderObject::Draw(ID2D1RenderTarget* render_target) {
+void FlexLayoutRenderObject::Draw(platform::Painter* painter) {
for (const auto child : GetChildren()) {
auto offset = child->GetOffset();
- graph::WithTransform(render_target,
- D2D1::Matrix3x2F::Translation(offset.x, offset.y),
- [child](auto rt) { child->Draw(rt); });
+ util::WithTransform(painter, Matrix::Translation(offset.x, offset.y),
+ [child](auto rt) { child->Draw(rt); });
}
}
@@ -171,7 +173,7 @@ void FlexLayoutRenderObject::OnLayoutContent(const Rect& content_rect) {
case Alignment::End:
return start_point + total_length - content_length;
default:
- UnreachableCode();
+ return 0;
}
};
diff --git a/src/ui/render/flex_layout_render_object.hpp b/src/ui/render/flex_layout_render_object.hpp
deleted file mode 100644
index ac4c2c0f..00000000
--- a/src/ui/render/flex_layout_render_object.hpp
+++ /dev/null
@@ -1,59 +0,0 @@
-#pragma once
-#include "pre.hpp"
-
-#include <optional>
-
-#include "render_object.hpp"
-
-namespace cru::ui::render {
-enum class FlexDirection {
- Horizontal,
- HorizontalReverse,
- Vertical,
- VertivalReverse
-};
-
-enum class Alignment { Start, End, Center };
-
-struct FlexChildLayoutData {
- std::optional<float> flex_basis; // nullopt stands for content
- float flex_grow = 0;
- float flex_shrink = 0;
- Alignment alignment = Alignment::Center;
-};
-
-class FlexLayoutRenderObject : public RenderObject {
- public:
- FlexLayoutRenderObject() = default;
- FlexLayoutRenderObject(const FlexLayoutRenderObject& other) = delete;
- FlexLayoutRenderObject& operator=(const FlexLayoutRenderObject& other) =
- delete;
- FlexLayoutRenderObject(FlexLayoutRenderObject&& other) = delete;
- FlexLayoutRenderObject& operator=(FlexLayoutRenderObject&& other) = delete;
- ~FlexLayoutRenderObject() override = default;
-
- FlexDirection GetFlexDirection() const { return direction_; }
- void SetFlexDirection(FlexDirection direction) { direction_ = direction; }
-
- Alignment GetContentMainAlign() const { return content_main_align_; }
- void SetContentMainAlign(Alignment align) { content_main_align_ = align; }
-
- FlexChildLayoutData* GetChildLayoutData(int position);
-
- void Draw(ID2D1RenderTarget* render_target) override;
-
- RenderObject* HitTest(const Point& point) override;
-
- protected:
- void OnAddChild(RenderObject* new_child, int position) override;
- void OnRemoveChild(RenderObject* removed_child, int position) override;
-
- Size OnMeasureContent(const Size& available_size) override;
- void OnLayoutContent(const Rect& content_rect) override;
-
- private:
- FlexDirection direction_ = FlexDirection::Horizontal;
- Alignment content_main_align_ = Alignment::Start;
- std::vector<FlexChildLayoutData> child_layout_data_{};
-};
-} // namespace cru::ui::render
diff --git a/src/ui/render/render_object.cpp b/src/ui/render/render_object.cpp
index 5c6af580..111128b2 100644
--- a/src/ui/render/render_object.cpp
+++ b/src/ui/render/render_object.cpp
@@ -1,8 +1,9 @@
-#include "render_object.hpp"
+#include "cru/ui/render/render_object.hpp"
-#include <algorithm>
+#include "cru/platform/debug.hpp"
-#include "cru_debug.hpp"
+#include <algorithm>
+#include <cassert>
namespace cru::ui::render {
void RenderObject::AddChild(RenderObject* render_object, const int position) {
@@ -34,7 +35,7 @@ void RenderObject::Measure(const Size& available_size) {
void RenderObject::Layout(const Rect& rect) {
SetOffset(rect.GetLeftTop());
SetSize(rect.GetSize());
- OnLayoutCore(Rect{Point::Zero(), rect.GetSize()});
+ OnLayoutCore(Rect{Point{}, rect.GetSize()});
}
void RenderObject::OnParentChanged(RenderObject* old_parent,
@@ -53,13 +54,13 @@ void RenderObject::OnMeasureCore(const Size& available_size) {
auto coerced_margin_padding_size = margin_padding_size;
if (coerced_margin_padding_size.width > available_size.width) {
- debug::DebugMessage(
+ platform::debug::DebugMessage(
L"Measure: horizontal length of padding and margin is bigger than "
L"available length.");
coerced_margin_padding_size.width = available_size.width;
}
if (coerced_margin_padding_size.height > available_size.height) {
- debug::DebugMessage(
+ platform::debug::DebugMessage(
L"Measure: vertical length of padding and margin is bigger than "
L"available length.");
coerced_margin_padding_size.height = available_size.height;
@@ -81,13 +82,13 @@ void RenderObject::OnLayoutCore(const Rect& rect) {
auto coerced_content_available_size = content_available_size;
if (coerced_content_available_size.width < 0) {
- debug::DebugMessage(
+ platform::debug::DebugMessage(
L"Layout: horizontal length of padding and margin is bigger than "
L"available length.");
coerced_content_available_size.width = 0;
}
if (coerced_content_available_size.height < 0) {
- debug::DebugMessage(
+ platform::debug::DebugMessage(
L"Layout: vertical length of padding and margin is bigger than "
L"available length.");
coerced_content_available_size.height = 0;
@@ -99,7 +100,7 @@ void RenderObject::OnLayoutCore(const Rect& rect) {
}
Rect RenderObject::GetContentRect() const {
- Rect rect{Point::Zero(), GetSize()};
+ Rect rect{Point{}, GetSize()};
rect = rect.Shrink(GetMargin());
rect = rect.Shrink(GetPadding());
rect.width = std::max(rect.width, 0.0f);
diff --git a/src/ui/render/render_object.hpp b/src/ui/render/render_object.hpp
deleted file mode 100644
index 824b88e6..00000000
--- a/src/ui/render/render_object.hpp
+++ /dev/null
@@ -1,97 +0,0 @@
-#pragma once
-#include "pre.hpp"
-
-#include <vector>
-
-#include "base.hpp"
-#include "ui/ui_base.hpp"
-
-// forward declarations
-struct ID2D1RenderTarget;
-namespace cru::ui {
-class Control;
-}
-
-namespace cru::ui::render {
-
-class RenderObject : public Object {
- protected:
- RenderObject() = default;
-
- public:
- RenderObject(const RenderObject& other) = delete;
- RenderObject(RenderObject&& other) = delete;
- RenderObject& operator=(const RenderObject& other) = delete;
- RenderObject& operator=(RenderObject&& other) = delete;
- ~RenderObject() override = default;
-
- Control* GetAttachedControl() const { return control_; }
- void SetAttachedControl(Control* new_control) { control_ = new_control; }
-
- RenderObject* GetParent() const { return parent_; }
-
- const std::vector<RenderObject*>& GetChildren() const { return children_; }
- void AddChild(RenderObject* render_object, int position);
- void RemoveChild(int position);
-
- Point GetOffset() const { return offset_; }
- void SetOffset(const Point& offset) { offset_ = offset; }
- Size GetSize() const { return size_; }
- void SetSize(const Size& size) {
- const auto old_size = size_;
- size_ = size;
- OnSizeChanged(old_size, size);
- }
-
- Thickness GetMargin() const { return margin_; }
- void SetMargin(const Thickness& margin) { margin_ = margin; }
-
- Thickness GetPadding() const { return padding_; }
- void SetPadding(const Thickness& padding) { padding_ = padding; }
-
- Size GetPreferredSize() const { return preferred_size_; }
- void SetPreferredSize(const Size& preferred_size) {
- preferred_size_ = preferred_size;
- }
-
- void Measure(const Size& available_size);
- void Layout(const Rect& rect);
-
- virtual void Draw(ID2D1RenderTarget* render_target) = 0;
-
- virtual RenderObject* HitTest(const Point& point) = 0;
-
- protected:
- virtual void OnParentChanged(RenderObject* old_parent,
- RenderObject* new_parent);
-
- virtual void OnAddChild(RenderObject* new_child, int position);
- virtual void OnRemoveChild(RenderObject* removed_child, int position);
-
- virtual void OnSizeChanged(const Size& old_size, const Size& new_size);
-
- virtual void OnMeasureCore(const Size& available_size);
- virtual void OnLayoutCore(const Rect& rect);
- virtual Size OnMeasureContent(const Size& available_size) = 0;
- virtual void OnLayoutContent(const Rect& content_rect) = 0;
-
- Rect GetContentRect() const;
-
- private:
- void SetParent(RenderObject* new_parent);
-
- private:
- Control* control_ = nullptr;
-
- RenderObject* parent_ = nullptr;
- std::vector<RenderObject*> children_{};
-
- Point offset_ = Point::Zero();
- Size size_ = Size::Zero();
-
- Thickness margin_ = Thickness::Zero();
- Thickness padding_ = Thickness::Zero();
-
- Size preferred_size_ = Size::Zero();
-};
-} // namespace cru::ui::render
diff --git a/src/ui/render/text_render_object.hpp b/src/ui/render/text_render_object.hpp
deleted file mode 100644
index 7827f994..00000000
--- a/src/ui/render/text_render_object.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-#pragma once
-#include "pre.hpp"
-
-#include "render_object.hpp"
-
-// forward declarations
-struct ID2D1Brush;
-struct IDWriteTextFormat;
-struct IDWriteTextLayout;
-
-namespace cru::ui::render {
-class TextRenderObject : public RenderObject {
- public:
- TextRenderObject(ID2D1Brush* brush, IDWriteTextFormat* format,
- ID2D1Brush* selection_brush);
- TextRenderObject(const TextRenderObject& other) = delete;
- TextRenderObject(TextRenderObject&& other) = delete;
- TextRenderObject& operator=(const TextRenderObject& other) = delete;
- TextRenderObject& operator=(TextRenderObject&& other) = delete;
- ~TextRenderObject() override;
-
- String GetText() const { return text_; }
- void SetText(String new_text) {
- text_ = std::move(new_text);
- RecreateTextLayout();
- }
-
- ID2D1Brush* GetBrush() const { return brush_; }
- void SetBrush(ID2D1Brush* new_brush);
-
- IDWriteTextFormat* GetTextFormat() const { return text_format_; }
- void SetTextFormat(IDWriteTextFormat* new_text_format);
-
- std::optional<TextRange> GetSelectionRange() const {
- return selection_range_;
- }
- void SetSelectionRange(std::optional<TextRange> new_range) {
- selection_range_ = std::move(new_range);
- }
-
- ID2D1Brush* GetSelectionBrush() const { return selection_brush_; }
- void SetSelectionBrush(ID2D1Brush* new_brush);
-
- void Refresh() { RecreateTextLayout(); }
-
- void Draw(ID2D1RenderTarget* render_target) override;
-
- RenderObject* HitTest(const Point& point) override;
-
- protected:
- void OnSizeChanged(const Size& old_size, const Size& new_size) override;
-
- Size OnMeasureContent(const Size& available_size) override;
- void OnLayoutContent(const Rect& content_rect) override;
-
- private:
- void RecreateTextLayout();
-
- private:
- String text_;
-
- ID2D1Brush* brush_ = nullptr;
- IDWriteTextFormat* text_format_ = nullptr;
- IDWriteTextLayout* text_layout_ = nullptr;
-
- std::optional<TextRange> selection_range_ = std::nullopt;
- ID2D1Brush* selection_brush_ = nullptr;
-};
-} // namespace cru::ui::render
diff --git a/src/ui/render/window_render_object.hpp b/src/ui/render/window_render_object.hpp
deleted file mode 100644
index 63eb8588..00000000
--- a/src/ui/render/window_render_object.hpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#pragma once
-#include "pre.hpp"
-
-#include "render_object.hpp"
-
-namespace cru::ui {
-class Window;
-}
-
-namespace cru::ui::render {
-class WindowRenderObject : public RenderObject {
- public:
- WindowRenderObject(Window* window) : window_(window) {}
- WindowRenderObject(const WindowRenderObject& other) = delete;
- WindowRenderObject(WindowRenderObject&& other) = delete;
- WindowRenderObject& operator=(const WindowRenderObject& other) = delete;
- WindowRenderObject& operator=(WindowRenderObject&& other) = delete;
- ~WindowRenderObject() override = default;
-
- void MeasureAndLayout();
-
- void Draw(ID2D1RenderTarget* render_target) override;
-
- RenderObject* HitTest(const Point& point) override;
-
- protected:
- void OnAddChild(RenderObject* new_child, int position) override;
-
- Size OnMeasureContent(const Size& available_size) override;
- void OnLayoutContent(const Rect& content_rect) override;
-
- private:
- RenderObject* GetChild() const {
- return GetChildren().empty() ? nullptr : GetChildren()[0];
- }
-
- private:
- Window* window_;
-};
-} // namespace cru::ui::render