From ea87825d58ab5b58dd360c3f080518c07a865db0 Mon Sep 17 00:00:00 2001 From: crupest Date: Fri, 19 Apr 2019 23:20:09 +0800 Subject: ... --- include/cru/common/event.hpp | 5 +-- include/cru/platform/native/ui_applicaition.hpp | 2 ++ include/cru/win/graph/d2d_painter.hpp | 48 +++++++++++++++++++++++++ include/cru/win/graph/win_painter.hpp | 48 ------------------------- include/cru/win/native/win_application.hpp | 6 +++- 5 files changed, 58 insertions(+), 51 deletions(-) create mode 100644 include/cru/win/graph/d2d_painter.hpp delete mode 100644 include/cru/win/graph/win_painter.hpp (limited to 'include') diff --git a/include/cru/common/event.hpp b/include/cru/common/event.hpp index 987bcdd6..741dcd99 100644 --- a/include/cru/common/event.hpp +++ b/include/cru/common/event.hpp @@ -102,8 +102,9 @@ class Event : public details::EventBase { template void Raise(Args&&... args) { - for (const auto& handler : handlers_) - (handler.second)(std::forward(args)...); + std::list handlers; + for (const auto& [key, handler] : handlers_) handlers.push_back(handler); + for (const auto& handler : handlers) handler(std::forward(args)...); } protected: diff --git a/include/cru/platform/native/ui_applicaition.hpp b/include/cru/platform/native/ui_applicaition.hpp index 8d42d813..17ff703d 100644 --- a/include/cru/platform/native/ui_applicaition.hpp +++ b/include/cru/platform/native/ui_applicaition.hpp @@ -18,6 +18,8 @@ struct UiApplication : public virtual Interface { virtual int Run() = 0; virtual void Quit(int quite_code) = 0; + virtual void AddOnQuitHandler(const std::function& handler) = 0; + virtual void InvokeLater(const std::function& action) = 0; virtual unsigned long SetTimeout(std::chrono::milliseconds milliseconds, const std::function& action) = 0; diff --git a/include/cru/win/graph/d2d_painter.hpp b/include/cru/win/graph/d2d_painter.hpp new file mode 100644 index 00000000..d33dced4 --- /dev/null +++ b/include/cru/win/graph/d2d_painter.hpp @@ -0,0 +1,48 @@ +#pragma once +#include "../win_pre_config.hpp" + +#include "cru/platform/graph/painter.hpp" + +namespace cru::win::graph { +class GraphManager; + +class D2DPainter : public Object, public virtual platform::graph::Painter { + public: + explicit D2DPainter(ID2D1RenderTarget* render_target); + D2DPainter(const D2DPainter& other) = delete; + D2DPainter(D2DPainter&& other) = delete; + D2DPainter& operator=(const D2DPainter& other) = delete; + D2DPainter& operator=(D2DPainter&& other) = delete; + ~D2DPainter() override = default; + + platform::Matrix GetTransform() override; + void SetTransform(const platform::Matrix& matrix) override; + void Clear(const ui::Color& color) override; + void StrokeRectangle(const ui::Rect& rectangle, platform::graph::Brush* brush, + float width) override; + void FillRectangle(const ui::Rect& rectangle, + platform::graph::Brush* brush) override; + void StrokeGeometry(platform::graph::Geometry* geometry, + platform::graph::Brush* brush, float width) override; + void FillGeometry(platform::graph::Geometry* geometry, + platform::graph::Brush* brush) override; + void DrawText(const ui::Point& offset, + platform::graph::TextLayout* text_layout, + platform::graph::Brush* brush) override; + void EndDraw() override final; + bool IsDisposed() override final { return is_disposed_; } + + void EndDrawAndDeleteThis() { + EndDraw(); + delete this; + } + + protected: + virtual void DoEndDraw() = 0; + + private: + ID2D1RenderTarget* render_target_; + + bool is_disposed_ = false; +}; +} // namespace cru::win::graph diff --git a/include/cru/win/graph/win_painter.hpp b/include/cru/win/graph/win_painter.hpp deleted file mode 100644 index 8351cb7b..00000000 --- a/include/cru/win/graph/win_painter.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once -#include "../win_pre_config.hpp" - -#include "cru/platform/graph/painter.hpp" - -namespace cru::win::graph { -class GraphManager; - -class WinPainter : public Object, public virtual platform::graph::Painter { - public: - explicit WinPainter(ID2D1RenderTarget* render_target); - WinPainter(const WinPainter& other) = delete; - WinPainter(WinPainter&& other) = delete; - WinPainter& operator=(const WinPainter& other) = delete; - WinPainter& operator=(WinPainter&& other) = delete; - ~WinPainter() override; - - platform::Matrix GetTransform() override; - void SetTransform(const platform::Matrix& matrix) override; - void Clear(const ui::Color& color) override; - void StrokeRectangle(const ui::Rect& rectangle, platform::graph::Brush* brush, - float width) override; - void FillRectangle(const ui::Rect& rectangle, - platform::graph::Brush* brush) override; - void StrokeGeometry(platform::graph::Geometry* geometry, - platform::graph::Brush* brush, float width) override; - void FillGeometry(platform::graph::Geometry* geometry, - platform::graph::Brush* brush) override; - void DrawText(const ui::Point& offset, - platform::graph::TextLayout* text_layout, - platform::graph::Brush* brush) override; - void EndDraw() override; - bool IsDisposed() override { return is_disposed_; } - - void EndDrawAndDeleteThis() { - EndDraw(); - delete this; - } - - protected: - virtual void DoEndDraw(); - - private: - ID2D1RenderTarget* render_target_; - - bool is_disposed_ = false; -}; -} // namespace cru::win::graph diff --git a/include/cru/win/native/win_application.hpp b/include/cru/win/native/win_application.hpp index 458b10ae..5bdb753e 100644 --- a/include/cru/win/native/win_application.hpp +++ b/include/cru/win/native/win_application.hpp @@ -16,7 +16,7 @@ class WinApplication : public Object, static WinApplication* GetInstance(); private: - static WinApplication* instance_; + static WinApplication* instance; private: explicit WinApplication(HINSTANCE h_instance); @@ -32,6 +32,8 @@ class WinApplication : public Object, int Run() override; void Quit(int quit_code) override; + void AddOnQuitHandler(const std::function& handler) override; + void InvokeLater(const std::function& action) override; unsigned long SetTimeout(std::chrono::milliseconds milliseconds, const std::function& action) override; @@ -55,5 +57,7 @@ class WinApplication : public Object, std::shared_ptr god_window_; std::shared_ptr timer_manager_; std::shared_ptr window_manager_; + + std::vector> quit_handlers_; }; } // namespace cru::win::native -- cgit v1.2.3