diff options
author | crupest <crupest@outlook.com> | 2021-09-29 20:45:36 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-09-29 20:45:36 +0800 |
commit | f246877698e5b9aa98e99f3fd3d2247998008695 (patch) | |
tree | 7239563128f1d78d7537ac98c85b41ce1e2f85a7 /src/osx | |
parent | 0338eb4f547f8eebe8c838c0794ec935db3cf0d8 (diff) | |
download | cru-f246877698e5b9aa98e99f3fd3d2247998008695.tar.gz cru-f246877698e5b9aa98e99f3fd3d2247998008695.tar.bz2 cru-f246877698e5b9aa98e99f3fd3d2247998008695.zip |
...
Diffstat (limited to 'src/osx')
-rw-r--r-- | src/osx/gui/Window.mm | 105 |
1 files changed, 102 insertions, 3 deletions
diff --git a/src/osx/gui/Window.mm b/src/osx/gui/Window.mm index 1ee0299a..52cc3934 100644 --- a/src/osx/gui/Window.mm +++ b/src/osx/gui/Window.mm @@ -1,6 +1,9 @@ #include "cru/osx/gui/Window.hpp" #include "cru/osx/gui/UiApplication.hpp" +#include "cru/platform/gui/Base.hpp" + +#include <AppKit/NSWindow.h> namespace cru::platform::gui::osx { namespace details { @@ -17,11 +20,107 @@ class OsxWindowPrivate { private: OsxWindow* osx_window_; + + INativeWindow* parent_; + + bool frame_; + Rect content_rect_; + + NSWindow* window_; }; } -OsxWindow::OsxWindow(OsxUiApplication* ui_application) - : OsxGuiResource(ui_application), p_(new details::OsxWindowPrivate(this)) {} +namespace { +inline NSWindowStyleMask CalcWindowStyleMask(bool frame) { + return frame ? NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | + NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskResizable + : NSWindowStyleMaskBorderless; +} + +} + +OsxWindow::OsxWindow(OsxUiApplication* ui_application, INativeWindow* parent, bool frame) + : OsxGuiResource(ui_application), p_(new details::OsxWindowPrivate(this)) { + p_->parent_ = parent; + + p_->frame_ = frame; + p_->content_rect_ = {100, 100, 400, 200}; +} + +OsxWindow::~OsxWindow() { + if (p_->window_) { + [p_->window_ close]; + } +} + +void OsxWindow::Close() { + if (p_->window_) { + [p_->window_ close]; + } +} + +INativeWindow* OsxWindow::GetParent() { return p_->parent_; } -OsxWindow::~OsxWindow() {} +bool OsxWindow::IsVisible() { + if (!p_->window_) return false; + return [p_->window_ isVisible]; +} + +void OsxWindow::SetVisible(bool is_visible) { + if (p_->window_) { + if (is_visible) { + [p_->window_ orderFront:p_->window_]; + } else { + [p_->window_ orderOut:p_->window_]; + } + } else { + if (is_visible) { + CreateWindow(); + } + } +} + +Size OsxWindow::GetClientSize() { return p_->content_rect_.GetSize(); } + +void OsxWindow::SetClientSize(const Size& size) { + if (p_->window_) { + [p_->window_ setContentSize:NSSize{size.width, size.height}]; + } else { + p_->content_rect_.SetSize(size); + } +} + +Rect OsxWindow::GetWindowRect() { + if (p_->window_) { + auto r = [p_->window_ frame]; + return Rect(r.origin.x, r.origin.y, r.size.width, r.size.height); + } else { + NSRect rr{p_->content_rect_.left, p_->content_rect_.top, p_->content_rect_.width, + p_->content_rect_.height}; + auto r = [NSWindow frameRectForContentRect:rr styleMask:CalcWindowStyleMask(p_->frame_)]; + return Rect(r.origin.x, r.origin.y, r.size.width, r.size.height); + } +} + +void OsxWindow::SetWindowRect(const Rect& rect) { + auto rr = NSRect{rect.left, rect.top, rect.width, rect.height}; + if (p_->window_) { + [p_->window_ setFrame:rr display:false]; + } else { + auto r = [NSWindow contentRectForFrameRect:rr styleMask:CalcWindowStyleMask(p_->frame_)]; + p_->content_rect_ = Rect(r.origin.x, r.origin.y, r.size.width, r.size.height); + } +} + +void OsxWindow::CreateWindow() { + NSRect content_rect{p_->content_rect_.left, p_->content_rect_.top, p_->content_rect_.width, + p_->content_rect_.height}; + + NSWindowStyleMask style_mask = CalcWindowStyleMask(p_->frame_); + + p_->window_ = [[NSWindow alloc] initWithContentRect:content_rect + styleMask:style_mask + backing:NSBackingStoreBuffered + defer:false]; +} } |