Просмотр исходного кода

Add osx backend menu item icon implementation.

Dan Walmsley 5 лет назад
Родитель
Сommit
332005b0f6

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

@@ -1,5 +1,6 @@
 #include "com.h"
 #include "key.h"
+#include "stddef.h"
 
 #define AVNCOM(name, id) COMINTERFACE(name, 2e2cda0a, 9ae5, 4f1b, 8e, 20, 08, 1a, 04, 27, 9f, id)
 
@@ -415,6 +416,7 @@ AVNCOM(IAvnMenuItem, 19) : IUnknown
     virtual HRESULT SetAction (IAvnPredicateCallback* predicate, IAvnActionCallback* callback) = 0;
     virtual HRESULT SetIsChecked (bool isChecked) = 0;
     virtual HRESULT SetToggleType (AvnMenuItemToggleType toggleType) = 0;
+    virtual HRESULT SetIcon (void* data, size_t length) = 0;
 };
 
 AVNCOM(IAvnMenuEvents, 1A) : IUnknown

+ 2 - 0
native/Avalonia.Native/src/OSX/menu.h

@@ -53,6 +53,8 @@ public:
     
     virtual HRESULT SetToggleType (AvnMenuItemToggleType toggleType) override;
     
+    virtual HRESULT SetIcon (void* data, size_t length) override;
+    
     bool EvaluateItemEnabled();
     
     void RaiseOnClicked();

+ 28 - 0
native/Avalonia.Native/src/OSX/menu.mm

@@ -192,6 +192,34 @@ HRESULT AvnAppMenuItem::SetToggleType(AvnMenuItemToggleType toggleType)
     }
 }
 
+HRESULT AvnAppMenuItem::SetIcon(void *data, size_t length)
+{
+    @autoreleasepool
+    {
+        if(data != nullptr)
+        {
+            NSData *imageData = [NSData dataWithBytes:data length:length];
+            NSImage *image = [[NSImage alloc] initWithData:imageData];
+            
+            NSSize originalSize = [image size];
+             
+            NSSize size;
+            size.height = [[NSFont menuFontOfSize:0] pointSize] * 1.333333;
+            
+            auto scaleFactor = size.height / originalSize.height;
+            size.width = originalSize.width * scaleFactor;
+            
+            [image setSize: size];
+            [_native setImage:image];
+        }
+        else
+        {
+            [_native setImage:nullptr];
+        }
+        return S_OK;
+    }
+}
+
 bool AvnAppMenuItem::EvaluateItemEnabled()
 {
     if(_predicate != nullptr)