diff options
author | crupest <crupest@outlook.com> | 2022-05-15 14:08:06 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-05-15 14:08:06 +0800 |
commit | 8ad2966933957ac5d6ff8dcd5e732736fd5e4dc6 (patch) | |
tree | 77e41cc14264060517c0f7ed95837012afb8342e /include/cru/platform/gui | |
parent | 9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752 (diff) | |
download | cru-8ad2966933957ac5d6ff8dcd5e732736fd5e4dc6.tar.gz cru-8ad2966933957ac5d6ff8dcd5e732736fd5e4dc6.tar.bz2 cru-8ad2966933957ac5d6ff8dcd5e732736fd5e4dc6.zip |
...
Diffstat (limited to 'include/cru/platform/gui')
-rw-r--r-- | include/cru/platform/gui/osx/Clipboard.h | 31 | ||||
-rw-r--r-- | include/cru/platform/gui/osx/Cursor.h | 43 | ||||
-rw-r--r-- | include/cru/platform/gui/osx/InputMethod.h | 56 | ||||
-rw-r--r-- | include/cru/platform/gui/osx/Keyboard.h | 7 | ||||
-rw-r--r-- | include/cru/platform/gui/osx/Menu.h | 67 | ||||
-rw-r--r-- | include/cru/platform/gui/osx/Resource.h | 24 | ||||
-rw-r--r-- | include/cru/platform/gui/osx/UiApplication.h | 64 | ||||
-rw-r--r-- | include/cru/platform/gui/osx/Window.h | 90 |
8 files changed, 382 insertions, 0 deletions
diff --git a/include/cru/platform/gui/osx/Clipboard.h b/include/cru/platform/gui/osx/Clipboard.h new file mode 100644 index 00000000..b4dcce4c --- /dev/null +++ b/include/cru/platform/gui/osx/Clipboard.h @@ -0,0 +1,31 @@ +#pragma once +#include "Resource.h" + +#include "cru/platform/gui/Base.h" +#include "cru/platform/gui/Clipboard.h" + +#include <memory> + +namespace cru::platform::gui::osx { +namespace details { +class OsxClipboardPrivate; +} + +class OsxClipboard : public OsxGuiResource, public virtual IClipboard { + public: + OsxClipboard(cru::platform::gui::IUiApplication* ui_application, + std::unique_ptr<details::OsxClipboardPrivate> p); + + CRU_DELETE_COPY(OsxClipboard) + CRU_DELETE_MOVE(OsxClipboard) + + ~OsxClipboard() override; + + public: + String GetText() override; + void SetText(String text) override; + + private: + std::unique_ptr<details::OsxClipboardPrivate> p_; +}; +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/Cursor.h b/include/cru/platform/gui/osx/Cursor.h new file mode 100644 index 00000000..6cfd400a --- /dev/null +++ b/include/cru/platform/gui/osx/Cursor.h @@ -0,0 +1,43 @@ +#pragma once +#include "Resource.h" +#include "cru/platform/gui/Cursor.h" + +#include <memory> + +namespace cru::platform::gui::osx { +namespace details { +class OsxWindowPrivate; +class OsxCursorPrivate; +class OsxCursorManagerPrivate; +} // namespace details + +class OsxCursor : public OsxGuiResource, public virtual ICursor { + friend class OsxWindow; + friend class details::OsxWindowPrivate; + + public: + OsxCursor(IUiApplication* ui_application, SystemCursorType cursor_type); + CRU_DELETE_COPY(OsxCursor) + CRU_DELETE_MOVE(OsxCursor) + + ~OsxCursor() override; + + private: + std::unique_ptr<details::OsxCursorPrivate> p_; +}; + +class OsxCursorManager : public OsxGuiResource, public virtual ICursorManager { + public: + explicit OsxCursorManager(IUiApplication* ui_application); + + CRU_DELETE_COPY(OsxCursorManager) + CRU_DELETE_MOVE(OsxCursorManager) + + ~OsxCursorManager() override; + + std::shared_ptr<ICursor> GetSystemCursor(SystemCursorType type) override; + + private: + std::unique_ptr<details::OsxCursorManagerPrivate> p_; +}; +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/InputMethod.h b/include/cru/platform/gui/osx/InputMethod.h new file mode 100644 index 00000000..cbfdae6c --- /dev/null +++ b/include/cru/platform/gui/osx/InputMethod.h @@ -0,0 +1,56 @@ +#pragma once +#include "Resource.h" + +#include "cru/platform/gui/InputMethod.h" + +namespace cru::platform::gui::osx { +class OsxWindow; + +namespace details { +class OsxWindowPrivate; +class OsxInputMethodContextPrivate; +} // namespace details + +class OsxInputMethodContext : public OsxGuiResource, + public virtual IInputMethodContext { + friend OsxWindow; + friend details::OsxWindowPrivate; + friend details::OsxInputMethodContextPrivate; + + public: + explicit OsxInputMethodContext(OsxWindow* window); + + CRU_DELETE_COPY(OsxInputMethodContext) + CRU_DELETE_MOVE(OsxInputMethodContext) + + ~OsxInputMethodContext() override; + + public: + bool ShouldManuallyDrawCompositionText() override; + + void EnableIME() override; + + void DisableIME() override; + + void CompleteComposition() override; + + void CancelComposition() override; + + CompositionText GetCompositionText() override; + + void SetCandidateWindowPosition(const Point& point) override; + + IEvent<std::nullptr_t>* CompositionStartEvent() override; + + IEvent<std::nullptr_t>* CompositionEndEvent() override; + + IEvent<std::nullptr_t>* CompositionEvent() override; + + IEvent<StringView>* TextEvent() override; + + bool IsEnabled(); + + private: + std::unique_ptr<details::OsxInputMethodContextPrivate> p_; +}; +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/Keyboard.h b/include/cru/platform/gui/osx/Keyboard.h new file mode 100644 index 00000000..89e0fa05 --- /dev/null +++ b/include/cru/platform/gui/osx/Keyboard.h @@ -0,0 +1,7 @@ +#pragma once +#include "cru/platform/gui/Keyboard.h" + +namespace cru::platform::gui::osx { +KeyCode KeyCodeFromOsxToCru(unsigned short n); +unsigned short KeyCodeFromCruToOsx(KeyCode k); +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/Menu.h b/include/cru/platform/gui/osx/Menu.h new file mode 100644 index 00000000..c5cc756a --- /dev/null +++ b/include/cru/platform/gui/osx/Menu.h @@ -0,0 +1,67 @@ +#pragma once +#include "Resource.h" + +#include "cru/platform/gui/Menu.h" + +namespace cru::platform::gui::osx { +namespace details { +struct OsxMenuItemPrivate; +struct OsxMenuPrivate; +} // namespace details + +class OsxMenu; + +class OsxMenuItem : public OsxGuiResource, public virtual IMenuItem { + friend OsxMenu; + friend details::OsxMenuPrivate; + + private: + explicit OsxMenuItem(IUiApplication* ui_application); + + public: + CRU_DELETE_COPY(OsxMenuItem) + CRU_DELETE_MOVE(OsxMenuItem) + + ~OsxMenuItem() override; + + public: + String GetTitle() override; + void SetTitle(String title) override; + bool IsEnabled() override; + void SetEnabled(bool enabled) override; + IMenu* GetParentMenu() override; + IMenu* GetSubmenu() override; + void SetKeyboardShortcut(KeyCode key, KeyModifier modifiers) override; + void DeleteKeyboardShortcut() override; + void SetOnClickHandler(std::function<void()> handler) override; + + private: + details::OsxMenuItemPrivate* p_; +}; + +class OsxMenu : public OsxGuiResource, public virtual IMenu { + friend OsxMenuItem; + friend details::OsxMenuPrivate; + friend details::OsxMenuItemPrivate; + + private: + explicit OsxMenu(IUiApplication* ui_application); + + public: + static OsxMenu* CreateOrGetApplicationMenu(IUiApplication* ui_application); + + CRU_DELETE_COPY(OsxMenu) + CRU_DELETE_MOVE(OsxMenu) + + ~OsxMenu() override; + + public: + IMenuItem* GetItemAt(int index) override; + int GetItemCount() override; + IMenuItem* CreateItemAt(int index) override; + void RemoveItemAt(int index) override; + + private: + details::OsxMenuPrivate* p_; +}; +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/Resource.h b/include/cru/platform/gui/osx/Resource.h new file mode 100644 index 00000000..1eec7d09 --- /dev/null +++ b/include/cru/platform/gui/osx/Resource.h @@ -0,0 +1,24 @@ +#pragma once +#include "cru/platform/osx/Resource.h" + +#include "cru/platform/gui/Base.h" + +namespace cru::platform::gui::osx { +class OsxGuiResource : public platform::osx::OsxResource { + public: + explicit OsxGuiResource(IUiApplication* ui_application); + + CRU_DELETE_COPY(OsxGuiResource) + CRU_DELETE_MOVE(OsxGuiResource) + + ~OsxGuiResource() override = default; + + public: + String GetPlatformId() const override { return u"OSX GUI"; } + + IUiApplication* GetUiApplication() const { return ui_application_; } + + private: + IUiApplication* ui_application_; +}; +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/UiApplication.h b/include/cru/platform/gui/osx/UiApplication.h new file mode 100644 index 00000000..2d2c119c --- /dev/null +++ b/include/cru/platform/gui/osx/UiApplication.h @@ -0,0 +1,64 @@ +#pragma once +#include "Resource.h" +#include "cru/platform/gui/UiApplication.h" + +#include <functional> +#include <memory> + +namespace cru::platform::gui::osx { +class OsxWindow; + +namespace details { +class OsxUiApplicationPrivate; +} + +class OsxUiApplication : public OsxGuiResource, public virtual IUiApplication { + friend details::OsxUiApplicationPrivate; + friend OsxWindow; + + public: + OsxUiApplication(); + + CRU_DELETE_COPY(OsxUiApplication) + CRU_DELETE_MOVE(OsxUiApplication) + + ~OsxUiApplication() override; + + public: + int Run() override; + + void RequestQuit(int quit_code) override; + void AddOnQuitHandler(std::function<void()> handler) override; + bool IsQuitOnAllWindowClosed() override; + void SetQuitOnAllWindowClosed(bool quit_on_all_window_closed) override; + + long long SetImmediate(std::function<void()> action) override; + long long SetTimeout(std::chrono::milliseconds milliseconds, + std::function<void()> action) override; + long long SetInterval(std::chrono::milliseconds milliseconds, + std::function<void()> action) override; + void CancelTimer(long long id) override; + + std::vector<INativeWindow*> GetAllWindow() override; + + INativeWindow* CreateWindow() override; + + cru::platform::graphics::IGraphicsFactory* GetGraphicsFactory() override; + + ICursorManager* GetCursorManager() override; + + IClipboard* GetClipboard() override; + + IMenu* GetApplicationMenu() override; + + std::optional<String> ShowSaveDialog(SaveDialogOptions options) override; + + std::optional<std::vector<String>> ShowOpenDialog( + OpenDialogOptions options) override; + + private: + void UnregisterWindow(OsxWindow* window); + + std::unique_ptr<details::OsxUiApplicationPrivate> p_; +}; +} // namespace cru::platform::gui::osx diff --git a/include/cru/platform/gui/osx/Window.h b/include/cru/platform/gui/osx/Window.h new file mode 100644 index 00000000..6cefbe8e --- /dev/null +++ b/include/cru/platform/gui/osx/Window.h @@ -0,0 +1,90 @@ +#pragma once +#include "Resource.h" +#include "cru/platform/gui/Base.h" +#include "cru/platform/gui/InputMethod.h" +#include "cru/platform/gui/Window.h" + +#include <memory> + +namespace cru::platform::gui::osx { +namespace details { +class OsxWindowPrivate; +class OsxInputMethodContextPrivate; +} // namespace details + +class OsxUiApplication; +class OsxInputMethodContext; + +class OsxWindow : public OsxGuiResource, public INativeWindow { + friend details::OsxWindowPrivate; + friend details::OsxInputMethodContextPrivate; + + public: + OsxWindow(OsxUiApplication* ui_application); + + CRU_DELETE_COPY(OsxWindow) + CRU_DELETE_MOVE(OsxWindow) + + ~OsxWindow() override; + + public: + void Close() override; + + INativeWindow* GetParent() override; + void SetParent(INativeWindow* parent) override; + + WindowStyleFlag GetStyleFlag() override; + void SetStyleFlag(WindowStyleFlag flag) override; + + String GetTitle() override; + void SetTitle(String title) override; + + WindowVisibilityType GetVisibility() override; + void SetVisibility(WindowVisibilityType visibility) override; + + Size GetClientSize() override; + void SetClientSize(const Size& size) override; + + Rect GetClientRect() override; + void SetClientRect(const Rect& rect) override; + + Rect GetWindowRect() override; + void SetWindowRect(const Rect& rect) override; + + bool RequestFocus() override; + + Point GetMousePosition() override; + + bool CaptureMouse() override; + bool ReleaseMouse() override; + + void SetCursor(std::shared_ptr<ICursor> cursor) override; + + void SetToForeground() override; + + void RequestRepaint() override; + + std::unique_ptr<graphics::IPainter> BeginPaint() override; + + IEvent<std::nullptr_t>* CreateEvent() override; + IEvent<std::nullptr_t>* DestroyEvent() override; + IEvent<std::nullptr_t>* PaintEvent() override; + + IEvent<WindowVisibilityType>* VisibilityChangeEvent() override; + IEvent<Size>* ResizeEvent() override; + IEvent<FocusChangeType>* FocusEvent() override; + + IEvent<MouseEnterLeaveType>* MouseEnterLeaveEvent() override; + IEvent<Point>* MouseMoveEvent() override; + IEvent<NativeMouseButtonEventArgs>* MouseDownEvent() override; + IEvent<NativeMouseButtonEventArgs>* MouseUpEvent() override; + IEvent<NativeMouseWheelEventArgs>* MouseWheelEvent() override; + IEvent<NativeKeyEventArgs>* KeyDownEvent() override; + IEvent<NativeKeyEventArgs>* KeyUpEvent() override; + + IInputMethodContext* GetInputMethodContext() override; + + private: + std::unique_ptr<details::OsxWindowPrivate> p_; +}; +} // namespace cru::platform::gui::osx |