Browse Source

use a flag to tell if a menu has been reparented.

pull/3762/head
Dan Walmsley 6 years ago
parent
commit
af510bf705
  1. 2
      native/Avalonia.Native/inc/avalonia-native.h
  2. 2
      native/Avalonia.Native/src/OSX/common.h
  3. 4
      native/Avalonia.Native/src/OSX/main.mm
  4. 5
      native/Avalonia.Native/src/OSX/menu.h
  5. 28
      native/Avalonia.Native/src/OSX/menu.mm
  6. 13
      native/Avalonia.Native/src/OSX/window.mm

2
native/Avalonia.Native/inc/avalonia-native.h

@ -190,7 +190,7 @@ public:
virtual HRESULT CreateCursorFactory(IAvnCursorFactory** ppv) = 0;
virtual HRESULT ObtainGlDisplay(IAvnGlDisplay** ppv) = 0;
virtual HRESULT SetAppMenu(IAvnMenu* menu) = 0;
virtual HRESULT CreateMenu (IAvnMenuEvents* cb, IAvnMenu** ppv, bool isTopLevel) = 0;
virtual HRESULT CreateMenu (IAvnMenuEvents* cb, IAvnMenu** ppv) = 0;
virtual HRESULT CreateMenuItem (IAvnMenuItem** ppv) = 0;
virtual HRESULT CreateMenuItemSeperator (IAvnMenuItem** ppv) = 0;
};

2
native/Avalonia.Native/src/OSX/common.h

@ -15,7 +15,7 @@ extern IAvnScreens* CreateScreens();
extern IAvnClipboard* CreateClipboard();
extern IAvnCursorFactory* CreateCursorFactory();
extern IAvnGlDisplay* GetGlDisplay();
extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* events, bool isTopLevel);
extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* events);
extern IAvnMenuItem* CreateAppMenuItem();
extern IAvnMenuItem* CreateAppMenuItemSeperator();
extern void SetAppMenu (NSString* appName, IAvnMenu* appMenu);

4
native/Avalonia.Native/src/OSX/main.mm

@ -227,9 +227,9 @@ public:
return S_OK;
}
virtual HRESULT CreateMenu (IAvnMenuEvents* cb, IAvnMenu** ppv, bool isTopLevel) override
virtual HRESULT CreateMenu (IAvnMenuEvents* cb, IAvnMenu** ppv) override
{
*ppv = ::CreateAppMenu(cb, isTopLevel);
*ppv = ::CreateAppMenu(cb);
return S_OK;
}

5
native/Avalonia.Native/src/OSX/menu.h

@ -16,6 +16,8 @@ class AvnAppMenu;
@interface AvnMenu : NSMenu
- (id) initWithDelegate: (NSObject<NSMenuDelegate>*) del;
- (void) setIsReparented: (bool) value;
- (bool) isReparented;
@end
@interface AvnMenuItem : NSMenuItem
@ -59,12 +61,11 @@ class AvnAppMenu : public ComSingleObject<IAvnMenu, &IID_IAvnMenu>
private:
AvnMenu* _native;
ComPtr<IAvnMenuEvents> _baseEvents;
bool _isTopLevel;
public:
FORWARD_IUNKNOWN()
AvnAppMenu(IAvnMenuEvents* events, bool isTopLevel);
AvnAppMenu(IAvnMenuEvents* events);
AvnMenu* GetNative();

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

@ -5,16 +5,29 @@
@implementation AvnMenu
{
bool _isReparented;
NSObject<NSMenuDelegate>* _wtf;
}
- (id) initWithDelegate: (NSObject<NSMenuDelegate>*)del
{
self = [super init];
self.delegate = del;
_wtf = del;
_isReparented = false;
return self;
}
- (bool)isReparented
{
return _isReparented;
}
- (void)setIsReparented:(bool)value
{
_isReparented = value;
}
@end
@implementation AvnMenuItem
@ -169,18 +182,11 @@ void AvnAppMenuItem::RaiseOnClicked()
}
}
AvnAppMenu::AvnAppMenu(IAvnMenuEvents* events, bool isTopLevel)
AvnAppMenu::AvnAppMenu(IAvnMenuEvents* events)
{
_isTopLevel = isTopLevel;
_baseEvents = events;
id del = [[AvnMenuDelegate alloc] initWithParent: this];
_native = [[AvnMenu alloc] initWithDelegate: del];
if(_isTopLevel)
{
[_native insertItem: [NSMenuItem new] atIndex:0];
}
}
@ -201,7 +207,7 @@ HRESULT AvnAppMenu::InsertItem(int index, IAvnMenuItem *item)
{
@autoreleasepool
{
if(_isTopLevel)
if([_native isReparented])
{
index++;
}
@ -284,11 +290,11 @@ HRESULT AvnAppMenu::Clear()
@end
extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* cb, bool isTopLevel)
extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* cb)
{
@autoreleasepool
{
return new AvnAppMenu(cb, isTopLevel);
return new AvnAppMenu(cb);
}
}

13
native/Avalonia.Native/src/OSX/window.mm

@ -1144,7 +1144,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
ComPtr<WindowBaseImpl> _parent;
bool _canBecomeKeyAndMain;
bool _closed;
NSMenu* _menu;
AvnMenu* _menu;
double _lastScaling;
}
@ -1194,6 +1194,8 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
[appMenu removeItem:appMenuItem];
[_menu insertItem:appMenuItem atIndex:0];
[_menu setIsReparented:true];
}
[NSApp setMenu:_menu];
@ -1212,6 +1214,11 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
[[appMenuItem menu] removeItem:appMenuItem];
if(_menu != nullptr)
{
[_menu setIsReparented:false];
}
[nativeAppMenu->GetNative() addItem:appMenuItem];
[NSApp setMenu:nativeAppMenu->GetNative()];
@ -1222,11 +1229,11 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
}
}
-(void) applyMenu:(NSMenu *)menu
-(void) applyMenu:(AvnMenu *)menu
{
if(menu == nullptr)
{
menu = [NSMenu new];
menu = [AvnMenu new];
}
_menu = menu;

Loading…
Cancel
Save