aboutsummaryrefslogtreecommitdiff
path: root/src/application.hpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2018-11-07 21:40:04 +0800
committercrupest <crupest@outlook.com>2018-11-07 21:40:04 +0800
commitefdce672123284847bd7fb6f12ac1ec96f28f3ef (patch)
tree298e6313e9a48c5867b2355242b78d3cd23fdc61 /src/application.hpp
parent634dab6ad2c9e4675beacfb77ac02b2d43cab132 (diff)
downloadcru-efdce672123284847bd7fb6f12ac1ec96f28f3ef.tar.gz
cru-efdce672123284847bd7fb6f12ac1ec96f28f3ef.tar.bz2
cru-efdce672123284847bd7fb6f12ac1ec96f28f3ef.zip
Make all header *.hpp .
Diffstat (limited to 'src/application.hpp')
-rw-r--r--src/application.hpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/application.hpp b/src/application.hpp
new file mode 100644
index 00000000..fe38ba0f
--- /dev/null
+++ b/src/application.hpp
@@ -0,0 +1,150 @@
+#pragma once
+
+#include "system_headers.hpp"
+#include <memory>
+#include <optional>
+#include <functional>
+
+#include "base.hpp"
+
+namespace cru
+{
+ class Application;
+
+ namespace ui
+ {
+ class WindowClass;
+ class WindowManager;
+
+ namespace animations::details
+ {
+ class AnimationManager;
+ }
+ }
+
+ namespace graph
+ {
+ class GraphManager;
+ }
+
+ class TimerManager;
+
+ struct CaretInfo
+ {
+ std::chrono::milliseconds caret_blink_duration;
+ float half_caret_width;
+ };
+
+#ifdef CRU_DEBUG_LAYOUT
+ struct DebugLayoutResource
+ {
+ Microsoft::WRL::ComPtr<ID2D1Brush> out_border_brush;
+ Microsoft::WRL::ComPtr<ID2D1Brush> margin_brush;
+ Microsoft::WRL::ComPtr<ID2D1Brush> padding_brush;
+ };
+#endif
+
+ class GodWindow : public Object
+ {
+ public:
+ explicit GodWindow(Application* application);
+ GodWindow(const GodWindow& other) = delete;
+ GodWindow(GodWindow&& other) = delete;
+ GodWindow& operator=(const GodWindow& other) = delete;
+ GodWindow& operator=(GodWindow&& other) = delete;
+ ~GodWindow() override;
+
+ HWND GetHandle() const
+ {
+ return hwnd_;
+ }
+
+ std::optional<LRESULT> HandleGodWindowMessage(HWND hwnd, int msg, WPARAM w_param, LPARAM l_param);
+
+ private:
+ Application* application_;
+ std::unique_ptr<ui::WindowClass> god_window_class_;
+ HWND hwnd_;
+ };
+
+ class Application : public Object
+ {
+ public:
+ static Application* GetInstance();
+ private:
+ static Application* instance_;
+
+ public:
+ explicit Application(HINSTANCE h_instance);
+ Application(const Application&) = delete;
+ Application(Application&&) = delete;
+ Application& operator = (const Application&) = delete;
+ Application& operator = (Application&&) = delete;
+ ~Application() override;
+
+ public:
+ int Run();
+ void Quit(int quit_code);
+
+ ui::WindowManager* GetWindowManager() const
+ {
+ return window_manager_.get();
+ }
+
+ graph::GraphManager* GetGraphManager() const
+ {
+ return graph_manager_.get();
+ }
+
+ TimerManager* GetTimerManager() const
+ {
+ return timer_manager_.get();
+ }
+
+ ui::animations::details::AnimationManager* GetAnimationManager() const
+ {
+ return animation_manager_.get();
+ }
+
+ HINSTANCE GetInstanceHandle() const
+ {
+ return h_instance_;
+ }
+
+ GodWindow* GetGodWindow() const
+ {
+ return god_window_.get();
+ }
+
+ CaretInfo GetCaretInfo() const
+ {
+ return caret_info_;
+ }
+
+#ifdef CRU_DEBUG_LAYOUT
+ const DebugLayoutResource* GetDebugLayoutResource() const
+ {
+ return &debug_layout_resource_;
+ }
+#endif
+
+ private:
+ HINSTANCE h_instance_;
+
+ std::unique_ptr<ui::WindowManager> window_manager_;
+ std::unique_ptr<graph::GraphManager> graph_manager_;
+ std::unique_ptr<TimerManager> timer_manager_;
+ std::unique_ptr<ui::animations::details::AnimationManager> animation_manager_;
+
+ std::unique_ptr<GodWindow> god_window_;
+
+#ifdef CRU_DEBUG_LAYOUT
+ DebugLayoutResource debug_layout_resource_;
+#endif
+
+ CaretInfo caret_info_;
+ };
+
+
+ void InvokeLater(const std::function<void()>& action);
+}