Browse Source

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

pull/3762/head
Dan Walmsley 7 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 CreateCursorFactory(IAvnCursorFactory** ppv) = 0;
virtual HRESULT ObtainGlDisplay(IAvnGlDisplay** ppv) = 0; virtual HRESULT ObtainGlDisplay(IAvnGlDisplay** ppv) = 0;
virtual HRESULT SetAppMenu(IAvnMenu* menu) = 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 CreateMenuItem (IAvnMenuItem** ppv) = 0;
virtual HRESULT CreateMenuItemSeperator (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 IAvnClipboard* CreateClipboard();
extern IAvnCursorFactory* CreateCursorFactory(); extern IAvnCursorFactory* CreateCursorFactory();
extern IAvnGlDisplay* GetGlDisplay(); extern IAvnGlDisplay* GetGlDisplay();
extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* events, bool isTopLevel); extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* events);
extern IAvnMenuItem* CreateAppMenuItem(); extern IAvnMenuItem* CreateAppMenuItem();
extern IAvnMenuItem* CreateAppMenuItemSeperator(); extern IAvnMenuItem* CreateAppMenuItemSeperator();
extern void SetAppMenu (NSString* appName, IAvnMenu* appMenu); extern void SetAppMenu (NSString* appName, IAvnMenu* appMenu);

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

@ -227,9 +227,9 @@ public:
return S_OK; 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; return S_OK;
} }

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

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

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

@ -5,16 +5,29 @@
@implementation AvnMenu @implementation AvnMenu
{ {
bool _isReparented;
NSObject<NSMenuDelegate>* _wtf; NSObject<NSMenuDelegate>* _wtf;
} }
- (id) initWithDelegate: (NSObject<NSMenuDelegate>*)del - (id) initWithDelegate: (NSObject<NSMenuDelegate>*)del
{ {
self = [super init]; self = [super init];
self.delegate = del; self.delegate = del;
_wtf = del; _wtf = del;
_isReparented = false;
return self; return self;
} }
- (bool)isReparented
{
return _isReparented;
}
- (void)setIsReparented:(bool)value
{
_isReparented = value;
}
@end @end
@implementation AvnMenuItem @implementation AvnMenuItem
@ -169,18 +182,11 @@ void AvnAppMenuItem::RaiseOnClicked()
} }
} }
AvnAppMenu::AvnAppMenu(IAvnMenuEvents* events, bool isTopLevel) AvnAppMenu::AvnAppMenu(IAvnMenuEvents* events)
{ {
_isTopLevel = isTopLevel;
_baseEvents = events; _baseEvents = events;
id del = [[AvnMenuDelegate alloc] initWithParent: this]; id del = [[AvnMenuDelegate alloc] initWithParent: this];
_native = [[AvnMenu alloc] initWithDelegate: del]; _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 @autoreleasepool
{ {
if(_isTopLevel) if([_native isReparented])
{ {
index++; index++;
} }
@ -284,11 +290,11 @@ HRESULT AvnAppMenu::Clear()
@end @end
extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* cb, bool isTopLevel) extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* cb)
{ {
@autoreleasepool @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; ComPtr<WindowBaseImpl> _parent;
bool _canBecomeKeyAndMain; bool _canBecomeKeyAndMain;
bool _closed; bool _closed;
NSMenu* _menu; AvnMenu* _menu;
double _lastScaling; double _lastScaling;
} }
@ -1194,6 +1194,8 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
[appMenu removeItem:appMenuItem]; [appMenu removeItem:appMenuItem];
[_menu insertItem:appMenuItem atIndex:0]; [_menu insertItem:appMenuItem atIndex:0];
[_menu setIsReparented:true];
} }
[NSApp setMenu:_menu]; [NSApp setMenu:_menu];
@ -1212,6 +1214,11 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
[[appMenuItem menu] removeItem:appMenuItem]; [[appMenuItem menu] removeItem:appMenuItem];
if(_menu != nullptr)
{
[_menu setIsReparented:false];
}
[nativeAppMenu->GetNative() addItem:appMenuItem]; [nativeAppMenu->GetNative() addItem:appMenuItem];
[NSApp setMenu:nativeAppMenu->GetNative()]; [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) if(menu == nullptr)
{ {
menu = [NSMenu new]; menu = [AvnMenu new];
} }
_menu = menu; _menu = menu;

Loading…
Cancel
Save