diff options
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/controls/button.cpp | 13 | ||||
-rw-r--r-- | src/ui/controls/button.hpp | 31 | ||||
-rw-r--r-- | src/ui/controls/text_block.cpp | 2 | ||||
-rw-r--r-- | src/ui/render/border_render_object.cpp | 52 | ||||
-rw-r--r-- | src/ui/render/border_render_object.hpp | 22 | ||||
-rw-r--r-- | src/ui/render/flex_layout_render_object.cpp | 2 | ||||
-rw-r--r-- | src/ui/render/render_object.cpp | 3 | ||||
-rw-r--r-- | src/ui/render/render_object.hpp | 2 | ||||
-rw-r--r-- | src/ui/render/text_render_object.cpp | 67 | ||||
-rw-r--r-- | src/ui/render/text_render_object.hpp | 39 | ||||
-rw-r--r-- | src/ui/render/window_render_object.cpp | 2 | ||||
-rw-r--r-- | src/ui/ui_manager.cpp | 57 | ||||
-rw-r--r-- | src/ui/ui_manager.hpp | 15 | ||||
-rw-r--r-- | src/ui/window.cpp | 22 | ||||
-rw-r--r-- | src/ui/window.hpp | 3 |
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; |