Browse Source

actually create nspanels for dialogs.

pull/8091/head
Dan Walmsley 4 years ago
parent
commit
1cca34f56e
  1. 35
      native/Avalonia.Native/src/OSX/AvnWindow.mm
  2. 1
      native/Avalonia.Native/src/OSX/WindowBaseImpl.h
  3. 28
      native/Avalonia.Native/src/OSX/WindowBaseImpl.mm
  4. 2
      native/Avalonia.Native/src/OSX/WindowImpl.mm
  5. 1
      native/Avalonia.Native/src/OSX/WindowProtocol.h

35
native/Avalonia.Native/src/OSX/AvnWindow.mm

@ -29,7 +29,6 @@
@implementation CLASS_NAME
{
ComPtr<WindowBaseImpl> _parent;
bool _canBecomeKeyAndMain;
bool _closed;
bool _isEnabled;
bool _isExtended;
@ -157,11 +156,6 @@
_menu = menu;
}
-(void) setCanBecomeKeyAndMain
{
_canBecomeKeyAndMain = true;
}
-(CLASS_NAME*) initWithParent: (WindowBaseImpl*) parent contentRect: (NSRect)contentRect styleMask: (NSWindowStyleMask)styleMask;
{
// https://jameshfisher.com/2020/07/10/why-is-the-contentrect-of-my-nswindow-ignored/
@ -215,28 +209,27 @@
-(BOOL)canBecomeKeyWindow
{
if (_canBecomeKeyAndMain)
// If the window has a child window being shown as a dialog then don't allow it to become the key window.
for(NSWindow* uch in [self childWindows])
{
// If the window has a child window being shown as a dialog then don't allow it to become the key window.
for(NSWindow* uch in [self childWindows])
{
// TODO protocol
auto ch = objc_cast<CLASS_NAME>(uch);
if(ch == nil)
continue;
if (ch.isDialog)
return false;
}
return true;
// TODO protocol
auto ch = objc_cast<CLASS_NAME>(uch);
if(ch == nil)
continue;
if (ch.isDialog)
return false;
}
return false;
return true;
}
-(BOOL)canBecomeMainWindow
{
return _canBecomeKeyAndMain;
#ifdef IS_NSPANEL
return false;
#else
return true;
#endif
}
-(bool)shouldTryToHandleEvents

1
native/Avalonia.Native/src/OSX/WindowBaseImpl.h

@ -122,6 +122,7 @@ protected:
id<AvnWindowProtocol> GetWindowProtocol ();
private:
void CreateNSWindow (bool isDialog);
void InitialiseNSWindow ();
};

28
native/Avalonia.Native/src/OSX/WindowBaseImpl.mm

@ -13,6 +13,7 @@
#include "AutoFitContentView.h"
#import "WindowProtocol.h"
#import "WindowInterfaces.h"
#include "WindowBaseImpl.h"
WindowBaseImpl::~WindowBaseImpl() {
@ -31,6 +32,9 @@ WindowBaseImpl::WindowBaseImpl(IAvnWindowBaseEvents *events, IAvnGlContext *gl)
lastPositionSet.X = 100;
lastPositionSet.Y = 100;
lastSize = NSSize { 100, 100 };
lastMaxSize = NSSize { CGFLOAT_MAX, CGFLOAT_MAX};
lastMinSize = NSSize { 0, 0 };
_lastTitle = @"";
Window = nullptr;
@ -85,6 +89,7 @@ HRESULT WindowBaseImpl::Show(bool activate, bool isDialog) {
START_COM_CALL;
@autoreleasepool {
CreateNSWindow(isDialog);
InitialiseNSWindow();
SetPosition(lastPositionSet);
@ -92,10 +97,6 @@ HRESULT WindowBaseImpl::Show(bool activate, bool isDialog) {
[Window setTitle:_lastTitle];
if(!isDialog) {
[GetWindowProtocol() setCanBecomeKeyAndMain];
}
if (ShouldTakeFocusOnShow() && activate) {
[Window orderFront:Window];
[Window makeKeyAndOrderFront:Window];
@ -524,9 +525,21 @@ void WindowBaseImpl::UpdateStyle() {
[Window setStyleMask:GetStyle()];
}
void WindowBaseImpl::InitialiseNSWindow() {
void WindowBaseImpl::CreateNSWindow(bool isDialog) {
if(Window == nullptr) {
Window = [[AvnWindow alloc] initWithParent:this contentRect:NSRect{0, 0, lastSize} styleMask:GetStyle()];
if(isDialog)
{
Window = [[AvnPanel alloc] initWithParent:this contentRect:NSRect{0, 0, lastSize} styleMask:GetStyle()];
}
else
{
Window = [[AvnWindow alloc] initWithParent:this contentRect:NSRect{0, 0, lastSize} styleMask:GetStyle()];
}
}
}
void WindowBaseImpl::InitialiseNSWindow() {
if(Window != nullptr) {
[Window setContentView:StandardContainer];
[Window setStyleMask:NSWindowStyleMaskBorderless];
[Window setBackingType:NSBackingStoreBuffered];
@ -537,9 +550,6 @@ void WindowBaseImpl::InitialiseNSWindow() {
[Window setOpaque:false];
[Window setContentMinSize:lastMinSize];
[Window setContentMaxSize:lastMaxSize];
if (lastMenu != nullptr) {
[GetWindowProtocol() applyMenu:lastMenu];

2
native/Avalonia.Native/src/OSX/WindowImpl.mm

@ -507,7 +507,7 @@ bool WindowImpl::IsDialog() {
}
NSWindowStyleMask WindowImpl::GetStyle() {
unsigned long s = NSWindowStyleMaskBorderless;
unsigned long s = this->_isDialog ? NSWindowStyleMaskUtilityWindow : NSWindowStyleMaskBorderless;
switch (_decorations) {
case SystemDecorationsNone:

1
native/Avalonia.Native/src/OSX/WindowProtocol.h

@ -10,7 +10,6 @@
@class AvnMenu;
@protocol AvnWindowProtocol
-(void) setCanBecomeKeyAndMain;
-(void) pollModalSession: (NSModalSession _Nonnull) session;
-(void) restoreParentWindow;
-(bool) shouldTryToHandleEvents;

Loading…
Cancel
Save