aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-09-29 20:45:36 +0800
committercrupest <crupest@outlook.com>2021-09-29 20:45:36 +0800
commitf246877698e5b9aa98e99f3fd3d2247998008695 (patch)
tree7239563128f1d78d7537ac98c85b41ce1e2f85a7 /src
parent0338eb4f547f8eebe8c838c0794ec935db3cf0d8 (diff)
downloadcru-f246877698e5b9aa98e99f3fd3d2247998008695.tar.gz
cru-f246877698e5b9aa98e99f3fd3d2247998008695.tar.bz2
cru-f246877698e5b9aa98e99f3fd3d2247998008695.zip
...
Diffstat (limited to 'src')
-rw-r--r--src/osx/gui/Window.mm105
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];
+}
}