aboutsummaryrefslogtreecommitdiff
path: root/src
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 /src
parenta60910cb3db6f47fd8f3b7f31648a9d0514d4f2c (diff)
downloadcru-2b28ec296fdc72050569b9fedc1664ada7791497.tar.gz
cru-2b28ec296fdc72050569b9fedc1664ada7791497.tar.bz2
cru-2b28ec296fdc72050569b9fedc1664ada7791497.zip
...
Diffstat (limited to 'src')
-rw-r--r--src/osx/gui/UiApplication.mm4
-rw-r--r--src/osx/gui/Window.mm39
-rw-r--r--src/osx/gui/WindowPrivate.h4
3 files changed, 25 insertions, 22 deletions
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_;