aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-11-20 23:02:54 +0800
committercrupest <crupest@outlook.com>2021-11-20 23:02:54 +0800
commit2b28ec296fdc72050569b9fedc1664ada7791497 (patch)
tree03675b5ca035256b3092657792e5004dde497111
parenta60910cb3db6f47fd8f3b7f31648a9d0514d4f2c (diff)
downloadcru-2b28ec296fdc72050569b9fedc1664ada7791497.tar.gz
cru-2b28ec296fdc72050569b9fedc1664ada7791497.tar.bz2
cru-2b28ec296fdc72050569b9fedc1664ada7791497.zip
...
-rw-r--r--include/cru/osx/gui/UiApplication.hpp3
-rw-r--r--include/cru/osx/gui/Window.hpp14
-rw-r--r--include/cru/platform/gui/UiApplication.hpp16
-rw-r--r--include/cru/platform/gui/Window.hpp23
-rw-r--r--src/osx/gui/UiApplication.mm4
-rw-r--r--src/osx/gui/Window.mm39
-rw-r--r--src/osx/gui/WindowPrivate.h4
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_;