Browse Source

special treatment for toplevel items in nativemenus.

pull/3762/head
Dan Walmsley 6 years ago
parent
commit
caaa193902
  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. 3
      native/Avalonia.Native/src/OSX/menu.h
  5. 18
      native/Avalonia.Native/src/OSX/menu.mm
  6. 10
      src/Avalonia.Native/AvaloniaNativeMenuExporter.cs
  7. 4
      src/Avalonia.Native/IAvnMenu.cs
  8. 2
      src/Avalonia.Native/IAvnMenuItem.cs

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) = 0; virtual HRESULT CreateMenu (IAvnMenuEvents* cb, IAvnMenu** ppv, bool isTopLevel) = 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); extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* events, bool isTopLevel);
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) override virtual HRESULT CreateMenu (IAvnMenuEvents* cb, IAvnMenu** ppv, bool isTopLevel) override
{ {
*ppv = ::CreateAppMenu(cb); *ppv = ::CreateAppMenu(cb, isTopLevel);
return S_OK; return S_OK;
} }

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

@ -59,11 +59,12 @@ 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); AvnAppMenu(IAvnMenuEvents* events, bool isTopLevel);
AvnMenu* GetNative(); AvnMenu* GetNative();

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

@ -169,11 +169,18 @@ void AvnAppMenuItem::RaiseOnClicked()
} }
} }
AvnAppMenu::AvnAppMenu(IAvnMenuEvents* events) AvnAppMenu::AvnAppMenu(IAvnMenuEvents* events, bool isTopLevel)
{ {
_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];
}
} }
@ -194,6 +201,11 @@ HRESULT AvnAppMenu::InsertItem(int index, IAvnMenuItem *item)
{ {
@autoreleasepool @autoreleasepool
{ {
if(_isTopLevel)
{
index++;
}
auto avnMenuItem = dynamic_cast<AvnAppMenuItem*>(item); auto avnMenuItem = dynamic_cast<AvnAppMenuItem*>(item);
if(avnMenuItem != nullptr) if(avnMenuItem != nullptr)
@ -272,11 +284,11 @@ HRESULT AvnAppMenu::Clear()
@end @end
extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* cb) extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* cb, bool isTopLevel)
{ {
@autoreleasepool @autoreleasepool
{ {
return new AvnAppMenu(cb); return new AvnAppMenu(cb, isTopLevel);
} }
} }

10
src/Avalonia.Native/AvaloniaNativeMenuExporter.cs

@ -84,9 +84,11 @@ namespace Avalonia.Native
if (appMenu == null) if (appMenu == null)
{ {
appMenu = CreateDefaultAppMenu(); appMenu = CreateDefaultAppMenu();
SetMenu(appMenu); NativeMenu.SetMenu(Application.Current, appMenu);
} }
SetMenu(appMenu);
} }
else else
{ {
@ -131,7 +133,7 @@ namespace Avalonia.Native
if (_nativeMenu is null) if (_nativeMenu is null)
{ {
_nativeMenu = IAvnMenu.Create(_factory); _nativeMenu = IAvnMenu.Create(_factory, false);
_nativeMenu.Initialise(this, appMenuHolder, ""); _nativeMenu.Initialise(this, appMenuHolder, "");
@ -150,7 +152,7 @@ namespace Avalonia.Native
{ {
if (_nativeMenu is null) if (_nativeMenu is null)
{ {
_nativeMenu = IAvnMenu.Create(_factory); _nativeMenu = IAvnMenu.Create(_factory, true);
_nativeMenu.Initialise(this, menu, ""); _nativeMenu.Initialise(this, menu, "");
} }

4
src/Avalonia.Native/IAvnMenu.cs

@ -39,11 +39,11 @@ namespace Avalonia.Native.Interop
internal NativeMenu ManagedMenu { get; private set; } internal NativeMenu ManagedMenu { get; private set; }
public static IAvnMenu Create(IAvaloniaNativeFactory factory) public static IAvnMenu Create(IAvaloniaNativeFactory factory, bool isTopLevel)
{ {
var events = new MenuEvents(); var events = new MenuEvents();
var menu = factory.CreateMenu(events); var menu = factory.CreateMenu(events, isTopLevel);
events.Initialise(menu); events.Initialise(menu);

2
src/Avalonia.Native/IAvnMenuItem.cs

@ -114,7 +114,7 @@ namespace Avalonia.Native.Interop
{ {
if (_subMenu == null) if (_subMenu == null)
{ {
_subMenu = IAvnMenu.Create(factory); _subMenu = IAvnMenu.Create(factory, false);
_subMenu.Initialise(exporter, item.Menu, item.Header); _subMenu.Initialise(exporter, item.Menu, item.Header);

Loading…
Cancel
Save