From 2e379441f69c4fd3049d186f76b25457e6250282 Mon Sep 17 00:00:00 2001 From: crupest Date: Thu, 12 Aug 2021 21:44:32 +0800 Subject: ... --- include/cru/platform/gui/Base.hpp | 33 +++++--------- include/cru/platform/gui/Cursor.hpp | 4 +- include/cru/platform/gui/InputMethod.hpp | 2 +- include/cru/platform/gui/Keyboard.hpp | 7 +-- include/cru/platform/gui/TimerHelper.hpp | 69 ++++++++++++++++++++++++++++++ include/cru/platform/gui/UiApplication.hpp | 68 +---------------------------- include/cru/platform/gui/Window.hpp | 26 ++++++++++- 7 files changed, 112 insertions(+), 97 deletions(-) create mode 100644 include/cru/platform/gui/TimerHelper.hpp (limited to 'include/cru/platform/gui') diff --git a/include/cru/platform/gui/Base.hpp b/include/cru/platform/gui/Base.hpp index fd9d265c..4c2a8034 100644 --- a/include/cru/platform/gui/Base.hpp +++ b/include/cru/platform/gui/Base.hpp @@ -1,11 +1,20 @@ #pragma once -#include "Keyboard.hpp" #include "cru/common/Base.hpp" #include "cru/common/Bitmask.hpp" #include "cru/platform/graphics/Base.hpp" #include "../Resource.hpp" +#ifdef CRU_PLATFORM_WINDOWS +#ifdef CRU_PLATFORM_GUI_EXPORT_API +#define CRU_PLATFORM_GUI_API __declspec(dllexport) +#else +#define CRU_PLATFORM_GUI_API __declspec(dllimport) +#endif +#else +#define CRU_PLATFORM_GUI_API +#endif + namespace cru::platform::gui { struct ICursor; struct ICursorManager; @@ -24,26 +33,4 @@ constexpr MouseButton left{0b1}; constexpr MouseButton middle{0b10}; constexpr MouseButton right{0b100}; } // namespace mouse_buttons - -struct NativeMouseButtonEventArgs { - MouseButton button; - Point point; - KeyModifier modifier; -}; - -struct NativeMouseWheelEventArgs { - // Positive means down. Negative means up. - float delta; - Point point; - KeyModifier modifier; -}; - -struct NativeKeyEventArgs { - KeyCode key; - KeyModifier modifier; -}; - -enum class FocusChangeType { Gain, Lost }; - -enum class MouseEnterLeaveType { Enter, Leave }; } // namespace cru::platform::gui diff --git a/include/cru/platform/gui/Cursor.hpp b/include/cru/platform/gui/Cursor.hpp index 316496a0..abc8b064 100644 --- a/include/cru/platform/gui/Cursor.hpp +++ b/include/cru/platform/gui/Cursor.hpp @@ -6,9 +6,9 @@ namespace cru::platform::gui { enum class SystemCursorType { Arrow, Hand, IBeam }; -struct ICursor : virtual INativeResource {}; +struct ICursor : virtual IPlatformResource {}; -struct ICursorManager : virtual INativeResource { +struct ICursorManager : virtual IPlatformResource { virtual std::shared_ptr GetSystemCursor(SystemCursorType type) = 0; // TODO: Add method to create cursor. diff --git a/include/cru/platform/gui/InputMethod.hpp b/include/cru/platform/gui/InputMethod.hpp index 9d090eab..9b07959c 100644 --- a/include/cru/platform/gui/InputMethod.hpp +++ b/include/cru/platform/gui/InputMethod.hpp @@ -22,7 +22,7 @@ struct CompositionText { TextRange selection; }; -struct IInputMethodContext : virtual INativeResource { +struct IInputMethodContext : virtual IPlatformResource { // Return true if you should draw composition text manually. Return false if // system will take care of that for you. virtual bool ShouldManuallyDrawCompositionText() = 0; diff --git a/include/cru/platform/gui/Keyboard.hpp b/include/cru/platform/gui/Keyboard.hpp index 6c29239b..b93b44fa 100644 --- a/include/cru/platform/gui/Keyboard.hpp +++ b/include/cru/platform/gui/Keyboard.hpp @@ -1,5 +1,6 @@ #pragma once #include "cru/common/Bitmask.hpp" +#include "cru/platform/gui/Base.hpp" #include #include @@ -122,7 +123,7 @@ struct KeyModifiers { static constexpr KeyModifier alt{0b100}; }; -std::u16string_view ToString(KeyCode key_code); -std::u16string ToString(KeyModifier key_modifier, - std::u16string_view separator = u"+"); +CRU_PLATFORM_GUI_API std::u16string_view ToString(KeyCode key_code); +CRU_PLATFORM_GUI_API std::u16string ToString( + KeyModifier key_modifier, std::u16string_view separator = u"+"); } // namespace cru::platform::gui diff --git a/include/cru/platform/gui/TimerHelper.hpp b/include/cru/platform/gui/TimerHelper.hpp new file mode 100644 index 00000000..a61d2f04 --- /dev/null +++ b/include/cru/platform/gui/TimerHelper.hpp @@ -0,0 +1,69 @@ +#pragma once +#include "UiApplication.hpp" + +namespace cru::platform::gui { + +class TimerAutoCanceler { + public: + TimerAutoCanceler() : id_(0) {} + explicit TimerAutoCanceler(long long id) : id_(id) {} + + CRU_DELETE_COPY(TimerAutoCanceler) + + TimerAutoCanceler(TimerAutoCanceler&& other) : id_(other.id_) { + other.id_ = 0; + } + + TimerAutoCanceler& operator=(TimerAutoCanceler&& other) { + if (&other == this) { + return *this; + } + Reset(other.id_); + other.id_ = 0; + return *this; + } + + TimerAutoCanceler& operator=(long long other) { + return this->operator=(TimerAutoCanceler(other)); + } + + ~TimerAutoCanceler() { Reset(); } + + long long Release() { + auto temp = id_; + id_ = 0; + return temp; + } + + void Reset(long long id = 0) { + if (id_ > 0) IUiApplication::GetInstance()->CancelTimer(id_); + id_ = id; + } + + explicit operator bool() const { return id_; } + + private: + long long id_; +}; + +class TimerListAutoCanceler { + public: + TimerListAutoCanceler() = default; + CRU_DELETE_COPY(TimerListAutoCanceler) + CRU_DEFAULT_MOVE(TimerListAutoCanceler) + ~TimerListAutoCanceler() = default; + + TimerListAutoCanceler& operator+=(long long id) { + list_.push_back(TimerAutoCanceler(id)); + return *this; + } + + void Clear() { list_.clear(); } + + bool IsEmpty() const { return list_.empty(); } + + private: + std::vector list_; +}; + +} // namespace cru::platform::gui diff --git a/include/cru/platform/gui/UiApplication.hpp b/include/cru/platform/gui/UiApplication.hpp index 5a5b0b13..407e4fa1 100644 --- a/include/cru/platform/gui/UiApplication.hpp +++ b/include/cru/platform/gui/UiApplication.hpp @@ -20,7 +20,7 @@ struct CreateWindowFlags { }; // The entry point of a ui application. -struct IUiApplication : public virtual INativeResource { +struct CRU_PLATFORM_GUI_API IUiApplication : public virtual IPlatformResource { public: static IUiApplication* GetInstance() { return instance; } @@ -66,70 +66,4 @@ struct IUiApplication : public virtual INativeResource { virtual ICursorManager* GetCursorManager() = 0; }; - -class TimerAutoCanceler { - public: - TimerAutoCanceler() : id_(0) {} - explicit TimerAutoCanceler(long long id) : id_(id) {} - - CRU_DELETE_COPY(TimerAutoCanceler) - - TimerAutoCanceler(TimerAutoCanceler&& other) : id_(other.id_) { - other.id_ = 0; - } - - TimerAutoCanceler& operator=(TimerAutoCanceler&& other) { - if (&other == this) { - return *this; - } - Reset(other.id_); - other.id_ = 0; - return *this; - } - - TimerAutoCanceler& operator=(long long other) { - return this->operator=(TimerAutoCanceler(other)); - } - - ~TimerAutoCanceler() { Reset(); } - - long long Release() { - auto temp = id_; - id_ = 0; - return temp; - } - - void Reset(long long id = 0) { - if (id_ > 0) IUiApplication::GetInstance()->CancelTimer(id_); - id_ = id; - } - - explicit operator bool() const { return id_; } - - private: - long long id_; -}; - -class TimerListAutoCanceler { - public: - TimerListAutoCanceler() = default; - CRU_DELETE_COPY(TimerListAutoCanceler) - CRU_DEFAULT_MOVE(TimerListAutoCanceler) - ~TimerListAutoCanceler() = default; - - TimerListAutoCanceler& operator+=(long long id) { - list_.push_back(TimerAutoCanceler(id)); - return *this; - } - - void Clear() { list_.clear(); } - - bool IsEmpty() const { return list_.empty(); } - - private: - std::vector list_; -}; - -// Bootstrap from this. -std::unique_ptr CreateUiApplication(); } // namespace cru::platform::gui diff --git a/include/cru/platform/gui/Window.hpp b/include/cru/platform/gui/Window.hpp index b2129322..3502868a 100644 --- a/include/cru/platform/gui/Window.hpp +++ b/include/cru/platform/gui/Window.hpp @@ -1,14 +1,38 @@ #pragma once #include "Base.hpp" +#include "Keyboard.hpp" + #include "cru/common/Event.hpp" #include namespace cru::platform::gui { +enum class FocusChangeType { Gain, Lost }; + +enum class MouseEnterLeaveType { Enter, Leave }; + +struct NativeMouseButtonEventArgs { + MouseButton button; + Point point; + KeyModifier modifier; +}; + +struct NativeMouseWheelEventArgs { + // Positive means down. Negative means up. + float delta; + Point point; + KeyModifier modifier; +}; + +struct NativeKeyEventArgs { + KeyCode key; + KeyModifier modifier; +}; + // Represents a native window, which exposes some low-level events and // operations. -struct INativeWindow : virtual INativeResource { +struct INativeWindow : virtual IPlatformResource { virtual void Close() = 0; virtual INativeWindow* GetParent() = 0; -- cgit v1.2.3