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

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

@ -59,11 +59,12 @@ class AvnAppMenu : public ComSingleObject<IAvnMenu, &IID_IAvnMenu>
private:
AvnMenu* _native;
ComPtr<IAvnMenuEvents> _baseEvents;
bool _isTopLevel;
public:
FORWARD_IUNKNOWN()
AvnAppMenu(IAvnMenuEvents* events);
AvnAppMenu(IAvnMenuEvents* events, bool isTopLevel);
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;
id del = [[AvnMenuDelegate alloc] initWithParent: this];
_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
{
if(_isTopLevel)
{
index++;
}
auto avnMenuItem = dynamic_cast<AvnAppMenuItem*>(item);
if(avnMenuItem != nullptr)
@ -272,11 +284,11 @@ HRESULT AvnAppMenu::Clear()
@end
extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* cb)
extern IAvnMenu* CreateAppMenu(IAvnMenuEvents* cb, bool isTopLevel)
{
@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)
{
appMenu = CreateDefaultAppMenu();
SetMenu(appMenu);
appMenu = CreateDefaultAppMenu();
NativeMenu.SetMenu(Application.Current, appMenu);
}
SetMenu(appMenu);
}
else
{
@ -131,7 +133,7 @@ namespace Avalonia.Native
if (_nativeMenu is null)
{
_nativeMenu = IAvnMenu.Create(_factory);
_nativeMenu = IAvnMenu.Create(_factory, false);
_nativeMenu.Initialise(this, appMenuHolder, "");
@ -150,7 +152,7 @@ namespace Avalonia.Native
{
if (_nativeMenu is null)
{
_nativeMenu = IAvnMenu.Create(_factory);
_nativeMenu = IAvnMenu.Create(_factory, true);
_nativeMenu.Initialise(this, menu, "");
}

4
src/Avalonia.Native/IAvnMenu.cs

@ -39,11 +39,11 @@ namespace Avalonia.Native.Interop
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 menu = factory.CreateMenu(events);
var menu = factory.CreateMenu(events, isTopLevel);
events.Initialise(menu);

2
src/Avalonia.Native/IAvnMenuItem.cs

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

Loading…
Cancel
Save