aboutsummaryrefslogtreecommitdiff
path: root/src/win/gui/UiApplication.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-03-24 19:14:19 +0800
committercrupest <crupest@outlook.com>2021-03-24 19:14:19 +0800
commit7f15a1ff9a2007e119798053083a0a87d042990a (patch)
treecb35c01a7eaee867376d959b96c9bbd15df939e5 /src/win/gui/UiApplication.cpp
parent74956951ee663012df0c3fe4ebe29799cb2f7732 (diff)
parent7703063a5816b089483e78ccd74bb9902ccfbea8 (diff)
downloadcru-7f15a1ff9a2007e119798053083a0a87d042990a.tar.gz
cru-7f15a1ff9a2007e119798053083a0a87d042990a.tar.bz2
cru-7f15a1ff9a2007e119798053083a0a87d042990a.zip
Merge branch 'master' of https://github.com/crupest/CruUI
Diffstat (limited to 'src/win/gui/UiApplication.cpp')
-rw-r--r--src/win/gui/UiApplication.cpp122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/win/gui/UiApplication.cpp b/src/win/gui/UiApplication.cpp
new file mode 100644
index 00000000..f4541dd0
--- /dev/null
+++ b/src/win/gui/UiApplication.cpp
@@ -0,0 +1,122 @@
+#include "cru/win/gui/UiApplication.hpp"
+
+#include "../DebugLogger.hpp"
+#include "../StdOutLogger.hpp"
+#include "TimerManager.hpp"
+#include "WindowManager.hpp"
+#include "cru/common/Logger.hpp"
+#include "cru/platform/Check.hpp"
+#include "cru/win/graphics/direct/Factory.hpp"
+#include "cru/win/gui/Cursor.hpp"
+#include "cru/win/gui/Exception.hpp"
+#include "cru/win/gui/GodWindow.hpp"
+#include "cru/win/gui/InputMethod.hpp"
+#include "cru/win/gui/Window.hpp"
+
+namespace cru::platform::gui {
+std::unique_ptr<IUiApplication> CreateUiApplication() {
+ return std::make_unique<win::WinUiApplication>();
+}
+} // namespace cru::platform::gui
+
+namespace cru::platform::gui::win {
+WinUiApplication* WinUiApplication::instance = nullptr;
+
+WinUiApplication::WinUiApplication() {
+ instance = this;
+
+ instance_handle_ = ::GetModuleHandleW(nullptr);
+ if (!instance_handle_)
+ throw Win32Error("Failed to get module(instance) handle.");
+
+ ::SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE);
+
+ log::Logger::GetInstance()->AddSource(
+ std::make_unique<::cru::platform::win::WinDebugLoggerSource>());
+ log::Logger::GetInstance()->AddSource(
+ std::make_unique<::cru::platform::win::WinStdOutLoggerSource>());
+
+ graph_factory_ = std::make_unique<
+ cru::platform::graphics::win::direct::DirectGraphFactory>();
+
+ god_window_ = std::make_unique<GodWindow>(this);
+ timer_manager_ = std::make_unique<TimerManager>(god_window_.get());
+ window_manager_ = std::make_unique<WindowManager>(this);
+ cursor_manager_ = std::make_unique<WinCursorManager>();
+}
+
+WinUiApplication::~WinUiApplication() { instance = nullptr; }
+
+int WinUiApplication::Run() {
+ MSG msg;
+ while (GetMessageW(&msg, nullptr, 0, 0)) {
+ TranslateMessage(&msg);
+ DispatchMessageW(&msg);
+ }
+
+ for (const auto& handler : quit_handlers_) handler();
+
+ return static_cast<int>(msg.wParam);
+}
+
+void WinUiApplication::RequestQuit(const int quit_code) {
+ ::PostQuitMessage(quit_code);
+}
+
+void WinUiApplication::AddOnQuitHandler(std::function<void()> handler) {
+ quit_handlers_.push_back(std::move(handler));
+}
+
+long long WinUiApplication::SetImmediate(std::function<void()> action) {
+ return this->timer_manager_->SetTimer(TimerType::Immediate, 0,
+ std::move(action));
+}
+
+long long WinUiApplication::SetTimeout(std::chrono::milliseconds milliseconds,
+ std::function<void()> action) {
+ return this->timer_manager_->SetTimer(TimerType::Timeout,
+ gsl::narrow<int>(milliseconds.count()),
+ std::move(action));
+}
+
+long long WinUiApplication::SetInterval(std::chrono::milliseconds milliseconds,
+ std::function<void()> action) {
+ return this->timer_manager_->SetTimer(TimerType::Interval,
+ gsl::narrow<int>(milliseconds.count()),
+ std::move(action));
+}
+
+void WinUiApplication::CancelTimer(long long id) {
+ timer_manager_->CancelTimer(id);
+}
+
+std::vector<INativeWindow*> WinUiApplication::GetAllWindow() {
+ const auto&& windows = window_manager_->GetAllWindows();
+ std::vector<INativeWindow*> result;
+ for (const auto w : windows) {
+ result.push_back(static_cast<INativeWindow*>(w));
+ }
+ return result;
+}
+
+INativeWindow* WinUiApplication::CreateWindow(INativeWindow* parent,
+ CreateWindowFlag flag) {
+ WinNativeWindow* p = nullptr;
+ if (parent != nullptr) {
+ p = CheckPlatform<WinNativeWindow>(parent, GetPlatformId());
+ }
+ return new WinNativeWindow(this, window_manager_->GetGeneralWindowClass(),
+ flag & CreateWindowFlags::NoCaptionAndBorder
+ ? WS_POPUP
+ : WS_OVERLAPPEDWINDOW,
+ p);
+}
+
+cru::platform::graphics::IGraphFactory* WinUiApplication::GetGraphFactory() {
+ return graph_factory_.get();
+}
+
+ICursorManager* WinUiApplication::GetCursorManager() {
+ return cursor_manager_.get();
+}
+} // namespace cru::platform::gui::win