diff options
author | crupest <crupest@outlook.com> | 2021-11-20 23:02:54 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-11-20 23:02:54 +0800 |
commit | 2b28ec296fdc72050569b9fedc1664ada7791497 (patch) | |
tree | 03675b5ca035256b3092657792e5004dde497111 | |
parent | a60910cb3db6f47fd8f3b7f31648a9d0514d4f2c (diff) | |
download | cru-2b28ec296fdc72050569b9fedc1664ada7791497.tar.gz cru-2b28ec296fdc72050569b9fedc1664ada7791497.tar.bz2 cru-2b28ec296fdc72050569b9fedc1664ada7791497.zip |
...
-rw-r--r-- | include/cru/osx/gui/UiApplication.hpp | 3 | ||||
-rw-r--r-- | include/cru/osx/gui/Window.hpp | 14 | ||||
-rw-r--r-- | include/cru/platform/gui/UiApplication.hpp | 16 | ||||
-rw-r--r-- | include/cru/platform/gui/Window.hpp | 23 | ||||
-rw-r--r-- | src/osx/gui/UiApplication.mm | 4 | ||||
-rw-r--r-- | src/osx/gui/Window.mm | 39 | ||||
-rw-r--r-- | src/osx/gui/WindowPrivate.h | 4 |
7 files changed, 58 insertions, 45 deletions
diff --git a/include/cru/osx/gui/UiApplication.hpp b/include/cru/osx/gui/UiApplication.hpp index e3cb269a..e4036854 100644 --- a/include/cru/osx/gui/UiApplication.hpp +++ b/include/cru/osx/gui/UiApplication.hpp @@ -39,8 +39,7 @@ class OsxUiApplication : public OsxGuiResource, public virtual IUiApplication { std::vector<INativeWindow*> GetAllWindow() override; - INativeWindow* CreateWindow(INativeWindow* parent, - CreateWindowFlag flags) override; + INativeWindow* CreateWindow() override; cru::platform::graphics::IGraphicsFactory* GetGraphicsFactory() override; diff --git a/include/cru/osx/gui/Window.hpp b/include/cru/osx/gui/Window.hpp index 7ea21926..5383ca1b 100644 --- a/include/cru/osx/gui/Window.hpp +++ b/include/cru/osx/gui/Window.hpp @@ -20,8 +20,7 @@ class OsxWindow : public OsxGuiResource, public INativeWindow { friend details::OsxInputMethodContextPrivate; public: - OsxWindow(OsxUiApplication* ui_application, INativeWindow* parent, - bool frame); + OsxWindow(OsxUiApplication* ui_application); CRU_DELETE_COPY(OsxWindow) CRU_DELETE_MOVE(OsxWindow) @@ -32,9 +31,13 @@ class OsxWindow : public OsxGuiResource, public INativeWindow { void Close() override; INativeWindow* GetParent() override; + void SetParent(INativeWindow* parent) override; - bool IsVisible() override; - void SetVisible(bool is_visible) override; + WindowStyleFlag GetShowFlag() override; + void SetShowFlag(WindowStyleFlag flag) override; + + WindowVisibilityType GetVisibility() override; + void SetVisibility(WindowVisibilityType visibility) override; Size GetClientSize() override; void SetClientSize(const Size& size) override; @@ -61,8 +64,11 @@ class OsxWindow : public OsxGuiResource, public INativeWindow { 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; diff --git a/include/cru/platform/gui/UiApplication.hpp b/include/cru/platform/gui/UiApplication.hpp index be95e71c..8bad9668 100644 --- a/include/cru/platform/gui/UiApplication.hpp +++ b/include/cru/platform/gui/UiApplication.hpp @@ -9,16 +9,6 @@ #include <vector> namespace cru::platform::gui { -namespace details { -struct CreateWindowFlagTag; -} - -using CreateWindowFlag = Bitmask<details::CreateWindowFlagTag>; - -struct CreateWindowFlags { - static constexpr CreateWindowFlag NoCaptionAndBorder{0b1}; -}; - // The entry point of a ui application. struct CRU_PLATFORM_GUI_API IUiApplication : public virtual IPlatformResource { public: @@ -56,11 +46,7 @@ struct CRU_PLATFORM_GUI_API IUiApplication : public virtual IPlatformResource { virtual std::vector<INativeWindow*> GetAllWindow() = 0; - INativeWindow* CreateWindow(INativeWindow* parent) { - return this->CreateWindow(parent, CreateWindowFlag(0)); - }; - virtual INativeWindow* CreateWindow(INativeWindow* parent, - CreateWindowFlag flags) = 0; + virtual INativeWindow* CreateWindow() = 0; virtual cru::platform::graphics::IGraphicsFactory* GetGraphicsFactory() = 0; diff --git a/include/cru/platform/gui/Window.hpp b/include/cru/platform/gui/Window.hpp index a1816e4a..ab96045e 100644 --- a/include/cru/platform/gui/Window.hpp +++ b/include/cru/platform/gui/Window.hpp @@ -8,6 +8,18 @@ #include <string_view> namespace cru::platform::gui { +namespace details { +struct WindowStyleFlagTag; +} + +using WindowStyleFlag = Bitmask<details::WindowStyleFlagTag>; + +struct WindowStyleFlags { + static constexpr WindowStyleFlag NoCaptionAndBorder{0b1}; +}; + +enum class WindowVisibilityType { Show, Hide }; + enum class FocusChangeType { Gain, Lost }; enum class MouseEnterLeaveType { Enter, Leave }; @@ -36,9 +48,13 @@ struct INativeWindow : virtual IPlatformResource { virtual void Close() = 0; virtual INativeWindow* GetParent() = 0; + virtual void SetParent(INativeWindow* parent) = 0; + + virtual WindowStyleFlag GetShowFlag() = 0; + virtual void SetShowFlag(WindowStyleFlag flag) = 0; - virtual bool IsVisible() = 0; - virtual void SetVisible(bool is_visible) = 0; + virtual WindowVisibilityType GetVisibility() = 0; + virtual void SetVisibility(WindowVisibilityType visibility) = 0; virtual Size GetClientSize() = 0; virtual void SetClientSize(const Size& size) = 0; @@ -73,8 +89,11 @@ struct INativeWindow : virtual IPlatformResource { virtual IEvent<std::nullptr_t>* CreateEvent() = 0; virtual IEvent<std::nullptr_t>* DestroyEvent() = 0; virtual IEvent<std::nullptr_t>* PaintEvent() = 0; + + virtual IEvent<WindowVisibilityType>* VisibilityChangeEvent(); virtual IEvent<Size>* ResizeEvent() = 0; virtual IEvent<FocusChangeType>* FocusEvent() = 0; + virtual IEvent<MouseEnterLeaveType>* MouseEnterLeaveEvent() = 0; virtual IEvent<Point>* MouseMoveEvent() = 0; virtual IEvent<NativeMouseButtonEventArgs>* MouseDownEvent() = 0; diff --git a/src/osx/gui/UiApplication.mm b/src/osx/gui/UiApplication.mm index 865111ba..a3c9acd5 100644 --- a/src/osx/gui/UiApplication.mm +++ b/src/osx/gui/UiApplication.mm @@ -155,8 +155,8 @@ std::vector<INativeWindow*> OsxUiApplication::GetAllWindow() { return result; } -INativeWindow* OsxUiApplication::CreateWindow(INativeWindow* parent, CreateWindowFlag flags) { - auto window = new OsxWindow(this, parent, !(flags & CreateWindowFlags::NoCaptionAndBorder)); +INativeWindow* OsxUiApplication::CreateWindow() { + auto window = new OsxWindow(this); p_->windows_.push_back(window); return window; } diff --git a/src/osx/gui/Window.mm b/src/osx/gui/Window.mm index b838165f..87660ac6 100644 --- a/src/osx/gui/Window.mm +++ b/src/osx/gui/Window.mm @@ -40,10 +40,11 @@ using cru::platform::graphics::osx::quartz::Convert; namespace cru::platform::gui::osx { namespace { -inline NSWindowStyleMask CalcWindowStyleMask(bool frame) { - return frame ? NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | - NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskResizable - : NSWindowStyleMaskBorderless; +inline NSWindowStyleMask CalcWindowStyleMask(WindowStyleFlag flag) { + return flag & WindowStyleFlags::NoCaptionAndBorder + ? NSWindowStyleMaskBorderless + : NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | + NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskResizable; } } @@ -144,7 +145,7 @@ Point OsxWindowPrivate::TransformMousePoint(const Point& point) { void OsxWindowPrivate::CreateWindow() { NSRect content_rect = Convert(content_rect_); - NSWindowStyleMask style_mask = CalcWindowStyleMask(frame_); + NSWindowStyleMask style_mask = CalcWindowStyleMask(style_flag_); auto cr = content_rect; cr.origin.y = GetScreenSize().height - content_rect.origin.y - content_rect.size.height; @@ -179,20 +180,17 @@ Size OsxWindowPrivate::GetScreenSize() { Rect OsxWindowPrivate::RetrieveContentRect() { NSRect rect = [NSWindow contentRectForFrameRect:[window_ frame] - styleMask:CalcWindowStyleMask(frame_)]; + styleMask:CalcWindowStyleMask(style_flag_)]; rect.origin.y = GetScreenSize().height - rect.origin.y - rect.size.height; return cru::platform::graphics::osx::quartz::Convert(rect); } } -OsxWindow::OsxWindow(OsxUiApplication* ui_application, INativeWindow* parent, bool frame) +OsxWindow::OsxWindow(OsxUiApplication* ui_application) : OsxGuiResource(ui_application), p_(new details::OsxWindowPrivate(this)) { p_->window_delegate_ = [[CruWindowDelegate alloc] init:p_.get()]; - p_->parent_ = parent; - - p_->frame_ = frame; p_->content_rect_ = {100, 100, 400, 200}; p_->input_method_context_ = std::make_unique<OsxInputMethodContext>(this); @@ -211,20 +209,20 @@ void OsxWindow::Close() { INativeWindow* OsxWindow::GetParent() { return p_->parent_; } -bool OsxWindow::IsVisible() { - if (!p_->window_) return false; - return [p_->window_ isVisible]; +WindowVisibilityType OsxWindow::GetVisibility() { + if (!p_->window_) return WindowVisibilityType::Hide; + return [p_->window_ isVisible] ? WindowVisibilityType::Show : WindowVisibilityType::Hide; } -void OsxWindow::SetVisible(bool is_visible) { +void OsxWindow::SetVisibility(WindowVisibilityType visibility) { if (p_->window_) { - if (is_visible) { + if (visibility == WindowVisibilityType::Show) { [p_->window_ orderFront:nil]; } else { [p_->window_ orderOut:nil]; } } else { - if (is_visible) { + if (visibility == WindowVisibilityType::Show) { p_->CreateWindow(); [p_->window_ orderFront:nil]; } @@ -247,7 +245,7 @@ void OsxWindow::SetClientRect(const Rect& rect) { if (p_->window_) { auto r = Convert(rect); r.origin.y = p_->GetScreenSize().height - r.origin.y - r.size.height; - r = [NSWindow frameRectForContentRect:r styleMask:CalcWindowStyleMask(p_->frame_)]; + r = [NSWindow frameRectForContentRect:r styleMask:CalcWindowStyleMask(p_->style_flag_)]; [p_->window_ setFrame:r display:false]; } else { p_->content_rect_ = rect; @@ -257,7 +255,7 @@ void OsxWindow::SetClientRect(const Rect& rect) { Rect OsxWindow::GetWindowRect() { auto r = Convert(p_->content_rect_); r.origin.y = p_->GetScreenSize().height - r.origin.y - r.size.height; - r = [NSWindow frameRectForContentRect:r styleMask:CalcWindowStyleMask(p_->frame_)]; + r = [NSWindow frameRectForContentRect:r styleMask:CalcWindowStyleMask(p_->style_flag_)]; r.origin.y = p_->GetScreenSize().height - r.origin.y - r.size.height; return Convert(r); } @@ -265,7 +263,7 @@ Rect OsxWindow::GetWindowRect() { void OsxWindow::SetWindowRect(const Rect& rect) { auto r = Convert(rect); r.origin.y = p_->GetScreenSize().height - r.origin.y - r.size.height; - r = [NSWindow frameRectForContentRect:r styleMask:CalcWindowStyleMask(p_->frame_)]; + r = [NSWindow frameRectForContentRect:r styleMask:CalcWindowStyleMask(p_->style_flag_)]; r.origin.y = p_->GetScreenSize().height - r.origin.y - r.size.height; SetClientRect(Convert(r)); } @@ -315,6 +313,9 @@ void OsxWindow::SetCursor(std::shared_ptr<ICursor> cursor) { IEvent<std::nullptr_t>* OsxWindow::CreateEvent() { return &p_->create_event_; } IEvent<std::nullptr_t>* OsxWindow::DestroyEvent() { return &p_->destroy_event_; } IEvent<std::nullptr_t>* OsxWindow::PaintEvent() { return &p_->paint_event_; } +IEvent<WindowVisibilityType>* OsxWindow::VisibilityChangeEvent() { + return &p_->visibility_change_event_; +} IEvent<Size>* OsxWindow::ResizeEvent() { return &p_->resize_event_; } IEvent<FocusChangeType>* OsxWindow::FocusEvent() { return &p_->focus_event_; } IEvent<MouseEnterLeaveType>* OsxWindow::MouseEnterLeaveEvent() { diff --git a/src/osx/gui/WindowPrivate.h b/src/osx/gui/WindowPrivate.h index 88760673..d8deaa0c 100644 --- a/src/osx/gui/WindowPrivate.h +++ b/src/osx/gui/WindowPrivate.h @@ -4,6 +4,7 @@ #include "cru/common/Event.hpp" #include "cru/osx/gui/Cursor.hpp" #include "cru/platform/gui/TimerHelper.hpp" +#include "cru/platform/gui/Window.hpp" #import <AppKit/AppKit.h> @@ -80,8 +81,8 @@ class OsxWindowPrivate { OsxWindow* osx_window_; INativeWindow* parent_; + WindowStyleFlag style_flag_; - bool frame_; Rect content_rect_; NSWindow* window_ = nil; @@ -100,6 +101,7 @@ class OsxWindowPrivate { Event<std::nullptr_t> create_event_; Event<std::nullptr_t> destroy_event_; Event<std::nullptr_t> paint_event_; + Event<WindowVisibilityType> visibility_change_event_; Event<Size> resize_event_; Event<FocusChangeType> focus_event_; Event<MouseEnterLeaveType> mouse_enter_leave_event_; |