diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index 7d9b89852e..f1c7664c3e 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -179,6 +179,7 @@ public: virtual HRESULT SetAppMenu(IAvnAppMenu* menu) = 0; virtual HRESULT CreateMenu (IAvnAppMenu** ppv) = 0; virtual HRESULT CreateMenuItem (IAvnAppMenuItem** ppv) = 0; + virtual HRESULT CreateMenuItemSeperator (IAvnAppMenuItem** ppv) = 0; }; AVNCOM(IAvnString, 17) : IUnknown diff --git a/native/Avalonia.Native/src/OSX/common.h b/native/Avalonia.Native/src/OSX/common.h index 91a1ba51c3..c91f562989 100644 --- a/native/Avalonia.Native/src/OSX/common.h +++ b/native/Avalonia.Native/src/OSX/common.h @@ -21,6 +21,7 @@ extern IAvnGlFeature* GetGlFeature(); extern IAvnGlSurfaceRenderTarget* CreateGlRenderTarget(NSWindow* window, NSView* view); extern IAvnAppMenu* CreateAppMenu(); extern IAvnAppMenuItem* CreateAppMenuItem(); +extern IAvnAppMenuItem* CreateAppMenuItemSeperator(); extern void SetAppMenu (IAvnAppMenu* appMenu); extern IAvnAppMenu* GetAppMenu (); extern NSMenuItem* GetAppMenuItem (); diff --git a/native/Avalonia.Native/src/OSX/main.mm b/native/Avalonia.Native/src/OSX/main.mm index ade077f00b..1a46e495ba 100644 --- a/native/Avalonia.Native/src/OSX/main.mm +++ b/native/Avalonia.Native/src/OSX/main.mm @@ -237,6 +237,12 @@ public: return S_OK; } + virtual HRESULT CreateMenuItemSeperator (IAvnAppMenuItem** ppv) override + { + *ppv = ::CreateAppMenuItemSeperator(); + return S_OK; + } + virtual HRESULT SetAppMenu (IAvnAppMenu* appMenu) override { ::SetAppMenu(appMenu); diff --git a/native/Avalonia.Native/src/OSX/menu.h b/native/Avalonia.Native/src/OSX/menu.h index 56cf0f6fe7..befbe6a7e0 100644 --- a/native/Avalonia.Native/src/OSX/menu.h +++ b/native/Avalonia.Native/src/OSX/menu.h @@ -26,16 +26,17 @@ class AvnAppMenu; class AvnAppMenuItem : public ComSingleObject { private: - AvnMenuItem* _native; // here we hold a pointer to an AvnMenuItem + NSMenuItem* _native; // here we hold a pointer to an AvnMenuItem IAvnActionCallback* _callback; IAvnPredicateCallback* _predicate; + bool _isSeperator; public: FORWARD_IUNKNOWN() - AvnAppMenuItem(); + AvnAppMenuItem(bool isSeperator); - AvnMenuItem* GetNative(); + NSMenuItem* GetNative(); virtual HRESULT SetSubMenu (IAvnAppMenu* menu) override; diff --git a/native/Avalonia.Native/src/OSX/menu.mm b/native/Avalonia.Native/src/OSX/menu.mm index cbcef277cc..397d587ec3 100644 --- a/native/Avalonia.Native/src/OSX/menu.mm +++ b/native/Avalonia.Native/src/OSX/menu.mm @@ -43,13 +43,23 @@ } @end -AvnAppMenuItem::AvnAppMenuItem() +AvnAppMenuItem::AvnAppMenuItem(bool isSeperator) { - _native = [[AvnMenuItem alloc] initWithAvnAppMenuItem: this]; + _isSeperator = isSeperator; + + if(isSeperator) + { + _native = [NSMenuItem separatorItem]; + } + else + { + _native = [[AvnMenuItem alloc] initWithAvnAppMenuItem: this]; + } + _callback = nullptr; } -AvnMenuItem* AvnAppMenuItem::GetNative() +NSMenuItem* AvnAppMenuItem::GetNative() { return _native; } @@ -137,7 +147,6 @@ HRESULT AvnAppMenu::AddItem (IAvnAppMenuItem* item) if(avnMenuItem != nullptr) { - [_native addItem: avnMenuItem->GetNative()]; } @@ -185,7 +194,15 @@ extern IAvnAppMenuItem* CreateAppMenuItem() { @autoreleasepool { - return new AvnAppMenuItem(); + return new AvnAppMenuItem(false); + } +} + +extern IAvnAppMenuItem* CreateAppMenuItemSeperator() +{ + @autoreleasepool + { + return new AvnAppMenuItem(true); } }