Browse Source

Add backend framework for radio buttons in nativemenus.

pull/3838/head
Dan Walmsley 6 years ago
parent
commit
fbb1ce340b
  1. 8
      native/Avalonia.Native/inc/avalonia-native.h
  2. 3
      native/Avalonia.Native/src/OSX/menu.h
  3. 28
      native/Avalonia.Native/src/OSX/menu.mm
  4. 5
      src/Avalonia.Native/IAvnMenuItem.cs

8
native/Avalonia.Native/inc/avalonia-native.h

@ -176,6 +176,13 @@ enum AvnWindowEdge
WindowEdgeSouthEast
};
enum AvnMenuItemToggleType
{
None,
CheckMark,
Radio
};
AVNCOM(IAvaloniaNativeFactory, 01) : IUnknown
{
public:
@ -407,6 +414,7 @@ AVNCOM(IAvnMenuItem, 19) : IUnknown
virtual HRESULT SetGesture (void* utf8String, AvnInputModifiers modifiers) = 0;
virtual HRESULT SetAction (IAvnPredicateCallback* predicate, IAvnActionCallback* callback) = 0;
virtual HRESULT SetIsChecked (bool isChecked) = 0;
virtual HRESULT SetToggleType (AvnMenuItemToggleType toggleType) = 0;
};
AVNCOM(IAvnMenuEvents, 1A) : IUnknown

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

@ -32,6 +32,7 @@ private:
IAvnActionCallback* _callback;
IAvnPredicateCallback* _predicate;
bool _isSeperator;
bool _isCheckable;
public:
FORWARD_IUNKNOWN()
@ -50,6 +51,8 @@ public:
virtual HRESULT SetIsChecked (bool isChecked) override;
virtual HRESULT SetToggleType (AvnMenuItemToggleType toggleType) override;
bool EvaluateItemEnabled();
void RaiseOnClicked();

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

@ -70,6 +70,7 @@
AvnAppMenuItem::AvnAppMenuItem(bool isSeperator)
{
_isCheckable = false;
_isSeperator = isSeperator;
if(isSeperator)
@ -157,7 +158,32 @@ HRESULT AvnAppMenuItem::SetIsChecked (bool isChecked)
{
@autoreleasepool
{
[_native setState:(isChecked ? NSOnState : NSOffState)];
[_native setState:(isChecked && _isCheckable ? NSOnState : NSOffState)];
return S_OK;
}
}
HRESULT AvnAppMenuItem::SetToggleType(AvnMenuItemToggleType toggleType)
{
@autoreleasepool
{
switch(toggleType)
{
case AvnMenuItemToggleType::None:
[_native setOnStateImage:nullptr];
_isCheckable = false;
break;
case AvnMenuItemToggleType::CheckMark:
[_native setOnStateImage:nullptr];
_isCheckable = true;
break;
case AvnMenuItemToggleType::Radio:
[_native setOnStateImage: [NSImage imageNamed:@"NSMenuRadio"]];
break;
}
return S_OK;
}
}

5
src/Avalonia.Native/IAvnMenuItem.cs

@ -26,6 +26,11 @@ namespace Avalonia.Native.Interop
IsChecked = isChecked;
}
private void UpdateToggleType(NativeMenuItemToggleType toggleType)
{
}
private void UpdateGesture(Input.KeyGesture gesture)
{
// todo ensure backend can cope with setting null gesture.

Loading…
Cancel
Save