aboutsummaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/controls/button.cpp13
-rw-r--r--src/ui/controls/button.hpp31
-rw-r--r--src/ui/controls/text_block.cpp2
-rw-r--r--src/ui/render/border_render_object.cpp52
-rw-r--r--src/ui/render/border_render_object.hpp22
-rw-r--r--src/ui/render/flex_layout_render_object.cpp2
-rw-r--r--src/ui/render/render_object.cpp3
-rw-r--r--src/ui/render/render_object.hpp2
-rw-r--r--src/ui/render/text_render_object.cpp67
-rw-r--r--src/ui/render/text_render_object.hpp39
-rw-r--r--src/ui/render/window_render_object.cpp2
-rw-r--r--src/ui/ui_manager.cpp57
-rw-r--r--src/ui/ui_manager.hpp15
-rw-r--r--src/ui/window.cpp22
-rw-r--r--src/ui/window.hpp3
15 files changed, 206 insertions, 126 deletions
diff --git a/src/ui/controls/button.cpp b/src/ui/controls/button.cpp
index e69de29b..5d4e15cc 100644
--- a/src/ui/controls/button.cpp
+++ b/src/ui/controls/button.cpp
@@ -0,0 +1,13 @@
+#include "button.hpp"
+
+#include "ui/ui_manager.hpp"
+#include "ui/render/border_render_object.hpp"
+
+namespace cru::ui::controls {
+Button::Button() {
+ const auto predefined_resource =
+ UiManager::GetInstance()->GetPredefineResources();
+ render_object_ = new render::BorderRenderObject(); }
+
+void Button::OnChildChanged(Control* old_child, Control* new_child) {}
+} // namespace cru::ui::controls
diff --git a/src/ui/controls/button.hpp b/src/ui/controls/button.hpp
index 010c3f5b..27e7fc7b 100644
--- a/src/ui/controls/button.hpp
+++ b/src/ui/controls/button.hpp
@@ -1,8 +1,35 @@
#pragma once
#include "pre.hpp"
-#include "ui/control.hpp"
+#include "ui/content_control.hpp"
+
+namespace cru::ui::render {
+class BorderRenderObject;
+}
namespace cru::ui::controls {
+class Button : public ContentControl {
+ public:
+ static constexpr auto control_type = L"Button";
-}
+ static Button* Create();
+
+ protected:
+ Button();
+
+ public:
+ Button(const Button& other) = delete;
+ Button(Button&& other) = delete;
+ Button& operator=(const Button& other) = delete;
+ Button& operator=(Button&& other) = delete;
+ ~Button();
+
+ render::RenderObject* GetRenderObject() const override;
+
+ protected:
+ void OnChildChanged(Control* old_child, Control* new_child) override;
+
+ private:
+ render::BorderRenderObject* render_object_;
+};
+} // namespace cru::ui::controls
diff --git a/src/ui/controls/text_block.cpp b/src/ui/controls/text_block.cpp
index 85116910..c891b832 100644
--- a/src/ui/controls/text_block.cpp
+++ b/src/ui/controls/text_block.cpp
@@ -1,7 +1,5 @@
#include "text_block.hpp"
-#include <dwrite.h>
-
#include "ui/render/text_render_object.hpp"
#include "ui/ui_manager.hpp"
diff --git a/src/ui/render/border_render_object.cpp b/src/ui/render/border_render_object.cpp
index 033f59d8..e1550665 100644
--- a/src/ui/render/border_render_object.cpp
+++ b/src/ui/render/border_render_object.cpp
@@ -1,16 +1,45 @@
#include "border_render_object.hpp"
+#include <d2d1_1.h>
+#include <wrl/client.h>
#include <algorithm>
#include "cru_debug.hpp"
#include "exception.hpp"
-#include "graph/graph.hpp"
+#include "graph/graph_manager.hpp"
+#include "graph/graph_util.hpp"
+#include "util/com_util.hpp"
namespace cru::ui::render {
-BorderRenderObject::BorderRenderObject(Microsoft::WRL::ComPtr<ID2D1Brush> brush)
- : border_brush_(std::move(brush)) {}
+BorderRenderObject::BorderRenderObject(ID2D1Brush* brush) {
+ assert(brush);
+ brush->AddRef();
+ this->border_brush_ = brush;
+ try {
+ RecreateGeometry();
+ } catch (...) {
+ brush->Release();
+ throw;
+ }
+}
+
+BorderRenderObject::~BorderRenderObject() {
+ util::SafeRelease(border_brush_);
+ util::SafeRelease(geometry_);
+ util::SafeRelease(border_outer_geometry_);
+}
+
+void BorderRenderObject::SetBrush(ID2D1Brush* new_brush) {
+ assert(new_brush);
+ util::SafeRelease(border_brush_);
+ new_brush->AddRef();
+ border_brush_ = new_brush;
+}
void BorderRenderObject::RecreateGeometry() {
+ util::SafeRelease(geometry_);
+ util::SafeRelease(border_outer_geometry_);
+
const auto d2d_factory = graph::GraphManager::GetInstance()->GetD2D1Factory();
Microsoft::WRL::ComPtr<ID2D1PathGeometry> geometry;
@@ -19,8 +48,8 @@ void BorderRenderObject::RecreateGeometry() {
Microsoft::WRL::ComPtr<ID2D1PathGeometry> border_outer_geometry;
ThrowIfFailed(d2d_factory->CreatePathGeometry(&border_outer_geometry));
- ID2D1GeometrySink* sink;
- auto f = [sink](const Rect& rect, const CornerRadius& corner) {
+ Microsoft::WRL::ComPtr<ID2D1GeometrySink> sink;
+ auto f = [&sink](const Rect& rect, const CornerRadius& corner) {
sink->BeginFigure(D2D1::Point2F(rect.left + corner.left_top.x, rect.top),
D2D1_FIGURE_BEGIN_FILLED);
sink->AddLine(
@@ -53,21 +82,21 @@ void BorderRenderObject::RecreateGeometry() {
ThrowIfFailed(border_outer_geometry->Open(&sink));
f(outer_rect, corner_radius_);
ThrowIfFailed(sink->Close());
- sink->Release();
+ sink = nullptr;
const Rect inner_rect = outer_rect.Shrink(border_thickness_);
ThrowIfFailed(geometry->Open(&sink));
f(outer_rect, corner_radius_);
f(inner_rect, corner_radius_);
ThrowIfFailed(sink->Close());
- sink->Release();
+ sink = nullptr;
- geometry_ = std::move(geometry);
- border_outer_geometry_ = std::move(border_outer_geometry);
+ geometry_ = geometry.Detach();
+ border_outer_geometry_ = border_outer_geometry.Detach();
}
void BorderRenderObject::Draw(ID2D1RenderTarget* render_target) {
- render_target->FillGeometry(geometry_.Get(), border_brush_.Get());
+ render_target->FillGeometry(geometry_, border_brush_);
if (const auto child = GetChild()) {
auto offset = child->GetOffset();
graph::WithTransform(render_target,
@@ -167,7 +196,8 @@ void BorderRenderObject::OnLayoutCore(const Rect& rect) {
}
if (coerced_content_available_size.height < 0) {
debug::DebugMessage(
- L"Layout: vertical length of padding, border and margin is bigger than "
+ L"Layout: vertical length of padding, border and margin is bigger "
+ L"than "
L"available length.");
coerced_content_available_size.height = 0;
}
diff --git a/src/ui/render/border_render_object.hpp b/src/ui/render/border_render_object.hpp
index d6effc21..eccb1219 100644
--- a/src/ui/render/border_render_object.hpp
+++ b/src/ui/render/border_render_object.hpp
@@ -28,20 +28,18 @@ struct CornerRadius {
class BorderRenderObject : public RenderObject {
public:
- explicit BorderRenderObject(Microsoft::WRL::ComPtr<ID2D1Brush> brush);
+ 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 = default;
+ ~BorderRenderObject() override;
bool IsEnabled() const { return is_enabled_; }
void SetEnabled(bool enabled) { is_enabled_ = enabled; }
- Microsoft::WRL::ComPtr<ID2D1Brush> GetBrush() const { return border_brush_; }
- void SetBrush(const Microsoft::WRL::ComPtr<ID2D1Brush> new_brush) {
- border_brush_ = std::move(new_brush);
- }
+ 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; }
@@ -51,11 +49,11 @@ class BorderRenderObject : public RenderObject {
corner_radius_ = new_corner_radius;
}
- void RecreateGeometry(); // TODO
+ void RecreateGeometry();
- void Draw(ID2D1RenderTarget* render_target) override; // TODO
+ void Draw(ID2D1RenderTarget* render_target) override;
- RenderObject* HitTest(const Point& point) override; // TODO
+ RenderObject* HitTest(const Point& point) override;
protected:
void OnAddChild(RenderObject* new_child, int position) override;
@@ -73,11 +71,11 @@ class BorderRenderObject : public RenderObject {
private:
bool is_enabled_ = false;
- Microsoft::WRL::ComPtr<ID2D1Brush> border_brush_;
+ ID2D1Brush* border_brush_ = nullptr;
Thickness border_thickness_ = Thickness::Zero();
CornerRadius corner_radius_{};
- Microsoft::WRL::ComPtr<ID2D1Geometry> geometry_{nullptr};
- Microsoft::WRL::ComPtr<ID2D1Geometry> border_outer_geometry_{nullptr};
+ 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 4708d187..e4d327f1 100644
--- a/src/ui/render/flex_layout_render_object.cpp
+++ b/src/ui/render/flex_layout_render_object.cpp
@@ -4,7 +4,7 @@
#include <functional>
#include "cru_debug.hpp"
-#include "graph/graph.hpp"
+#include "graph/graph_util.hpp"
namespace cru::ui::render {
FlexChildLayoutData* FlexLayoutRenderObject::GetChildLayoutData(int position) {
diff --git a/src/ui/render/render_object.cpp b/src/ui/render/render_object.cpp
index f56baa8f..232eda41 100644
--- a/src/ui/render/render_object.cpp
+++ b/src/ui/render/render_object.cpp
@@ -1,8 +1,5 @@
#include "render_object.hpp"
-#include <d2d1.h>
-#include <dwrite.h>
-
#include "cru_debug.hpp"
namespace cru::ui::render {
diff --git a/src/ui/render/render_object.hpp b/src/ui/render/render_object.hpp
index 51b0c3ae..abdda605 100644
--- a/src/ui/render/render_object.hpp
+++ b/src/ui/render/render_object.hpp
@@ -1,7 +1,6 @@
#pragma once
#include "pre.hpp"
-#include <optional>
#include <vector>
#include "base.hpp"
@@ -9,7 +8,6 @@
// forward declarations
struct ID2D1RenderTarget;
-
namespace cru::ui {
class Control;
}
diff --git a/src/ui/render/text_render_object.cpp b/src/ui/render/text_render_object.cpp
index e8967d48..b66fffa3 100644
--- a/src/ui/render/text_render_object.cpp
+++ b/src/ui/render/text_render_object.cpp
@@ -5,19 +5,61 @@
#include <algorithm>
#include "exception.hpp"
-#include "graph/graph.hpp"
+#include "graph/graph_manager.hpp"
+#include "graph/graph_util.hpp"
+#include "util/com_util.hpp"
namespace cru::ui::render {
-TextRenderObject::TextRenderObject(
- Microsoft::WRL::ComPtr<ID2D1Brush> brush,
- Microsoft::WRL::ComPtr<IDWriteTextFormat> format,
- Microsoft::WRL::ComPtr<ID2D1Brush> selection_brush)
- : brush_(std::move(brush)),
- text_format_(std::move(format)),
- selection_brush_(std::move(selection_brush)) {
+TextRenderObject::TextRenderObject(ID2D1Brush* brush, IDWriteTextFormat* format,
+ ID2D1Brush* selection_brush) {
+ assert(brush);
+ assert(format);
+ assert(selection_brush);
+ brush->AddRef();
+ format->AddRef();
+ selection_brush->AddRef();
+ this->brush_ = brush;
+ this->text_format_ = format;
+ this->selection_brush_ = selection_brush;
+ try {
+ RecreateTextLayout();
+ } catch (...) {
+ brush->Release();
+ format->Release();
+ selection_brush->Release();
+ throw;
+ }
+}
+
+TextRenderObject::~TextRenderObject() {
+ util::SafeRelease(brush_);
+ util::SafeRelease(text_format_);
+ util::SafeRelease(text_layout_);
+ util::SafeRelease(selection_brush_);
+}
+
+void TextRenderObject::SetBrush(ID2D1Brush* new_brush) {
+ assert(new_brush);
+ util::SafeRelease(brush_);
+ new_brush->AddRef();
+ brush_ = new_brush;
+}
+
+void TextRenderObject::SetTextFormat(IDWriteTextFormat* new_text_format) {
+ assert(new_text_format);
+ util::SafeRelease(text_format_);
+ new_text_format->AddRef();
+ text_format_ = new_text_format;
RecreateTextLayout();
}
+void TextRenderObject::SetSelectionBrush(ID2D1Brush* new_brush) {
+ assert(new_brush);
+ util::SafeRelease(selection_brush_);
+ new_brush->AddRef();
+ selection_brush_ = new_brush;
+}
+
namespace {
void DrawSelectionRect(ID2D1RenderTarget* render_target,
IDWriteTextLayout* layout, ID2D1Brush* brush,
@@ -54,9 +96,8 @@ void TextRenderObject::Draw(ID2D1RenderTarget* render_target) {
D2D1::Matrix3x2F::Translation(GetMargin().left + GetPadding().left,
GetMargin().top + GetPadding().top),
[this](auto rt) {
- DrawSelectionRect(rt, text_layout_.Get(), selection_brush_.Get(),
- selection_range_);
- rt->DrawTextLayout(D2D1::Point2F(), text_layout_.Get(), brush_.Get());
+ DrawSelectionRect(rt, text_layout_, selection_brush_, selection_range_);
+ rt->DrawTextLayout(D2D1::Point2F(), text_layout_, brush_);
});
}
@@ -99,7 +140,7 @@ void TextRenderObject::OnLayoutContent(const Rect& content_rect) {}
void TextRenderObject::RecreateTextLayout() {
assert(text_format_ != nullptr);
- text_layout_ = nullptr; // release last one
+ util::SafeRelease(text_layout_);
const auto dwrite_factory =
graph::GraphManager::GetInstance()->GetDWriteFactory();
@@ -107,7 +148,7 @@ void TextRenderObject::RecreateTextLayout() {
const auto&& size = GetSize();
ThrowIfFailed(dwrite_factory->CreateTextLayout(
- text_.c_str(), static_cast<UINT32>(text_.size()), text_format_.Get(),
+ text_.c_str(), static_cast<UINT32>(text_.size()), text_format_,
size.width, size.height, &text_layout_));
}
} // namespace cru::ui::render
diff --git a/src/ui/render/text_render_object.hpp b/src/ui/render/text_render_object.hpp
index ac874b75..30d78736 100644
--- a/src/ui/render/text_render_object.hpp
+++ b/src/ui/render/text_render_object.hpp
@@ -1,8 +1,6 @@
#pragma once
#include "pre.hpp"
-#include <wrl/client.h> // for ComPtr
-
#include "render_object.hpp"
// forward declarations
@@ -13,14 +11,13 @@ struct IDWriteTextLayout;
namespace cru::ui::render {
class TextRenderObject : public RenderObject {
public:
- TextRenderObject(Microsoft::WRL::ComPtr<ID2D1Brush> brush,
- Microsoft::WRL::ComPtr<IDWriteTextFormat> format,
- Microsoft::WRL::ComPtr<ID2D1Brush> selection_brush);
+ 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 = default;
+ ~TextRenderObject() override;
String GetText() const { return text_; }
void SetText(String new_text) {
@@ -28,19 +25,11 @@ class TextRenderObject : public RenderObject {
RecreateTextLayout();
}
- Microsoft::WRL::ComPtr<ID2D1Brush> GetBrush() const { return brush_; }
- void SetBrush(Microsoft::WRL::ComPtr<ID2D1Brush> new_brush) {
- brush_ = std::move(new_brush);
- }
+ ID2D1Brush* GetBrush() const { return brush_; }
+ void SetBrush(ID2D1Brush* new_brush);
- Microsoft::WRL::ComPtr<IDWriteTextFormat> GetTextFormat() const {
- return text_format_;
- }
- void SetTextFormat(
- Microsoft::WRL::ComPtr<IDWriteTextFormat> new_text_format) {
- text_format_ = std::move(new_text_format);
- RecreateTextLayout();
- }
+ IDWriteTextFormat* GetTextFormat() const { return text_format_; }
+ void SetTextFormat(IDWriteTextFormat* new_text_format);
std::optional<TextRange> GetSelectionRange() const {
return selection_range_;
@@ -49,12 +38,10 @@ class TextRenderObject : public RenderObject {
selection_range_ = std::move(new_range);
}
- Microsoft::WRL::ComPtr<ID2D1Brush> GetSelectionBrush() const {
+ ID2D1Brush* GetSelectionBrush() const {
return selection_brush_;
}
- void SetSelectionBrush(Microsoft::WRL::ComPtr<ID2D1Brush> new_brush) {
- selection_brush_ = std::move(new_brush);
- }
+ void SetSelectionBrush(ID2D1Brush* new_brush);
void Draw(ID2D1RenderTarget* render_target) override;
@@ -72,11 +59,11 @@ class TextRenderObject : public RenderObject {
private:
String text_;
- Microsoft::WRL::ComPtr<ID2D1Brush> brush_;
- Microsoft::WRL::ComPtr<IDWriteTextFormat> text_format_;
- Microsoft::WRL::ComPtr<IDWriteTextLayout> text_layout_;
+ ID2D1Brush* brush_;
+ IDWriteTextFormat* text_format_;
+ IDWriteTextLayout* text_layout_;
std::optional<TextRange> selection_range_ = std::nullopt;
- Microsoft::WRL::ComPtr<ID2D1Brush> selection_brush_;
+ ID2D1Brush* selection_brush_;
};
} // namespace cru::ui::render
diff --git a/src/ui/render/window_render_object.cpp b/src/ui/render/window_render_object.cpp
index f198c2fa..44c3c426 100644
--- a/src/ui/render/window_render_object.cpp
+++ b/src/ui/render/window_render_object.cpp
@@ -1,6 +1,6 @@
#include "window_render_object.hpp"
-#include "graph/graph.hpp"
+#include "graph/graph_util.hpp"
#include "ui/window.hpp"
namespace cru::ui::render {
diff --git a/src/ui/ui_manager.cpp b/src/ui/ui_manager.cpp
index 26b1fe62..add77516 100644
--- a/src/ui/ui_manager.cpp
+++ b/src/ui/ui_manager.cpp
@@ -1,10 +1,14 @@
#include "ui_manager.hpp"
#include <Windows.h>
+#include <d2d1.h>
+#include <dwrite.h>
#include "application.hpp"
#include "exception.hpp"
-#include "graph/graph.hpp"
+#include "graph/graph_manager.hpp"
+#include "graph/graph_util.hpp"
+#include "util/com_util.hpp"
namespace cru::ui {
namespace {
@@ -17,19 +21,10 @@ void GetSystemCaretInfo(CaretInfo* caret_info) {
caret_info->half_caret_width = caret_width / 2.0f;
}
-Microsoft::WRL::ComPtr<ID2D1Brush> CreateSolidBrush(
- graph::GraphManager* graph_manager, const D2D1_COLOR_F& color) {
- const auto device_context = graph_manager->GetD2D1DeviceContext();
- Microsoft::WRL::ComPtr<ID2D1SolidColorBrush> solid_color_brush;
- device_context->CreateSolidColorBrush(color, &solid_color_brush);
- return solid_color_brush;
-}
-
-Microsoft::WRL::ComPtr<IDWriteTextFormat> CreateDefaultTextFormat(
- graph::GraphManager* graph_manager) {
- const auto dwrite_factory = graph_manager->GetDWriteFactory();
-
- Microsoft::WRL::ComPtr<IDWriteTextFormat> text_format;
+IDWriteTextFormat* CreateDefaultTextFormat() {
+ const auto dwrite_factory =
+ graph::GraphManager::GetInstance()->GetDWriteFactory();
+ IDWriteTextFormat* text_format;
ThrowIfFailed(dwrite_factory->CreateTextFormat(
L"等线", nullptr, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
@@ -43,26 +38,32 @@ Microsoft::WRL::ComPtr<IDWriteTextFormat> CreateDefaultTextFormat(
}
} // namespace
-PredefineResources::PredefineResources(graph::GraphManager* graph_manager)
- : text_block_selection_brush{CreateSolidBrush(
- graph_manager, D2D1::ColorF(D2D1::ColorF::LightSkyBlue))},
- text_block_text_brush{
- CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::Black))},
- text_block_text_format{CreateDefaultTextFormat(graph_manager)},
- debug_layout_out_border_brush{
- CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::Crimson))},
- debug_layout_margin_brush{CreateSolidBrush(
- graph_manager, D2D1::ColorF(D2D1::ColorF::LightCoral, 0.25f))},
- debug_layout_padding_brush{CreateSolidBrush(
- graph_manager, D2D1::ColorF(D2D1::ColorF::SkyBlue, 0.25f))} {}
+PredefineResources::PredefineResources() {
+ try {
+ text_block_selection_brush =
+ graph::CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::LightSkyBlue));
+ text_block_text_brush =
+ graph::CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Black));
+ text_block_text_format = CreateDefaultTextFormat();
+ } catch (...) {
+ util::SafeRelease(text_block_selection_brush);
+ util::SafeRelease(text_block_text_brush);
+ util::SafeRelease(text_block_text_format);
+ }
+}
+
+PredefineResources::~PredefineResources() {
+ util::SafeRelease(text_block_selection_brush);
+ util::SafeRelease(text_block_text_brush);
+ util::SafeRelease(text_block_text_format);
+}
UiManager* UiManager::GetInstance() {
return Application::GetInstance()->ResolveSingleton<UiManager>(
[](auto) { return new UiManager{}; });
}
-UiManager::UiManager()
- : predefine_resources_(graph::GraphManager::GetInstance()) {
+UiManager::UiManager() : predefine_resources_() {
GetSystemCaretInfo(&caret_info_);
}
} // namespace cru::ui
diff --git a/src/ui/ui_manager.hpp b/src/ui/ui_manager.hpp
index c2331dd4..b736381d 100644
--- a/src/ui/ui_manager.hpp
+++ b/src/ui/ui_manager.hpp
@@ -18,22 +18,17 @@ struct CaretInfo {
class PredefineResources : public Object {
public:
- explicit PredefineResources(graph::GraphManager* graph_manager);
+ PredefineResources();
PredefineResources(const PredefineResources& other) = delete;
PredefineResources(PredefineResources&& other) = delete;
PredefineResources& operator=(const PredefineResources& other) = delete;
PredefineResources& operator=(PredefineResources&& other) = delete;
- ~PredefineResources() override = default;
+ ~PredefineResources() override;
// region TextBlock
- Microsoft::WRL::ComPtr<ID2D1Brush> text_block_selection_brush;
- Microsoft::WRL::ComPtr<ID2D1Brush> text_block_text_brush;
- Microsoft::WRL::ComPtr<IDWriteTextFormat> text_block_text_format;
-
- // region debug
- Microsoft::WRL::ComPtr<ID2D1Brush> debug_layout_out_border_brush;
- Microsoft::WRL::ComPtr<ID2D1Brush> debug_layout_margin_brush;
- Microsoft::WRL::ComPtr<ID2D1Brush> debug_layout_padding_brush;
+ ID2D1Brush* text_block_selection_brush = nullptr;
+ ID2D1Brush* text_block_text_brush = nullptr;
+ IDWriteTextFormat* text_block_text_format = nullptr;
};
class UiManager : public Object {
diff --git a/src/ui/window.cpp b/src/ui/window.cpp
index 7b00ca05..90add552 100644
--- a/src/ui/window.cpp
+++ b/src/ui/window.cpp
@@ -1,10 +1,13 @@
#include "window.hpp"
#include <windowsx.h>
+#include <d2d1_1.h>
#include "application.hpp"
#include "exception.hpp"
-#include "graph/graph.hpp"
+#include "graph/graph_manager.hpp"
+#include "graph/graph_util.hpp"
+#include "graph/window_render_target.hpp"
#include "render/window_render_object.hpp"
namespace cru::ui {
@@ -207,10 +210,9 @@ void Window::BeforeCreateHwnd() { window_ = this; }
void Window::AfterCreateHwnd(WindowManager* window_manager) {
window_manager->RegisterWindow(hwnd_, this);
- render_target_ =
- graph::GraphManager::GetInstance()->CreateWindowRenderTarget(hwnd_);
+ render_target_.reset(new graph::WindowRenderTarget(graph::GraphManager::GetInstance(), hwnd_));
- render_object_ = new render::WindowRenderObject(this);
+ render_object_.reset(new render::WindowRenderObject(this));
}
Window::~Window() {
@@ -220,12 +222,11 @@ Window::~Window() {
}
TraverseDescendants(
[this](Control* control) { control->OnDetachToWindow(this); });
- delete render_object_;
}
StringView Window::GetControlType() const { return control_type; }
-render::RenderObject* Window::GetRenderObject() const { return render_object_; }
+render::RenderObject* Window::GetRenderObject() const { return render_object_.get(); }
void Window::SetDeleteThisOnDestroy(bool value) {
delete_this_on_destroy_ = value;
@@ -556,17 +557,12 @@ void Window::OnDestroyInternal() {
void Window::OnPaintInternal() {
render_target_->SetAsTarget();
- auto device_context = render_target_->GetD2DDeviceContext();
-
+ auto device_context = render_target_->GetGraphManager()->GetD2D1DeviceContext();
device_context->BeginDraw();
-
// Clear the background.
device_context->Clear(D2D1::ColorF(D2D1::ColorF::White));
-
- render_object_->Draw(device_context.Get());
-
+ render_object_->Draw(device_context);
ThrowIfFailed(device_context->EndDraw(), "Failed to draw window.");
-
render_target_->Present();
ValidateRect(hwnd_, nullptr);
diff --git a/src/ui/window.hpp b/src/ui/window.hpp
index 1c48bf43..dd7631d0 100644
--- a/src/ui/window.hpp
+++ b/src/ui/window.hpp
@@ -221,8 +221,7 @@ class Window final : public ContentControl {
HWND hwnd_ = nullptr;
Window* parent_window_ = nullptr;
std::shared_ptr<graph::WindowRenderTarget> render_target_{};
-
- render::WindowRenderObject* render_object_;
+ std::shared_ptr<render::WindowRenderObject> render_object_{};
Control* mouse_hover_control_ = nullptr;