Skip to content

Commit d6f5e7d

Browse files
Rosenttijp2masamaxkatz6
authored
IsVisible for NativeMenuItem(s) (#14567)
* IsVisible for nativemenuitems * implementation for windows * Update native/Avalonia.Native/src/OSX/menu.mm Co-authored-by: jp2masa <[email protected]> * Update menu.h * address review changes * add hidden option to ControlCatalog --------- Co-authored-by: jp2masa <[email protected]> Co-authored-by: Max Katz <[email protected]>
1 parent 7fb2663 commit d6f5e7d

File tree

8 files changed

+45
-1
lines changed

8 files changed

+45
-1
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ class AvnAppMenuItem : public ComSingleObject<IAvnMenuItem, &IID_IAvnMenuItem>
5151
virtual HRESULT SetAction (IAvnPredicateCallback* predicate, IAvnActionCallback* callback) override;
5252

5353
virtual HRESULT SetIsChecked (bool isChecked) override;
54-
54+
55+
virtual HRESULT SetIsVisible (bool isVisible) override;
56+
5557
virtual HRESULT SetToggleType (AvnMenuItemToggleType toggleType) override;
5658

5759
virtual HRESULT SetIcon (void* data, size_t length) override;

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,17 @@ - (void)didSelectItem:(nullable id)sender
205205
}
206206
}
207207

208+
HRESULT AvnAppMenuItem::SetIsVisible (bool isVisible)
209+
{
210+
START_COM_CALL;
211+
212+
@autoreleasepool
213+
{
214+
[_native setHidden:!isVisible];
215+
return S_OK;
216+
}
217+
}
218+
208219
HRESULT AvnAppMenuItem::SetToggleType(AvnMenuItemToggleType toggleType)
209220
{
210221
START_COM_CALL;

samples/ControlCatalog/App.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
<NativeMenuItem Header="Option 3" ToggleType="CheckBox" IsChecked="True" />
7676
<NativeMenuItem Icon="/Assets/test_icon.ico" Header="Restore Defaults" Command="{Binding RestoreDefault}" />
7777
<NativeMenuItem Header="Disabled option" IsEnabled="False" />
78+
<NativeMenuItem Header="Hidden option" IsVisible="False" />
7879
</NativeMenu>
7980
</NativeMenuItem>
8081
<NativeMenuItem Header="Exit" Command="{Binding ExitCommand}" />

src/Avalonia.Controls/NativeMenuBarPresenter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ internal class NativeMenuBarPresenter : Menu
2626
[!MenuItem.IconProperty] = nativeItem.GetObservable(NativeMenuItem.IconProperty)
2727
.Select(i => i is { } bitmap ? new Image { Source = bitmap } : null).ToBinding(),
2828
[!MenuItem.IsEnabledProperty] = nativeItem.GetObservable(NativeMenuItem.IsEnabledProperty).ToBinding(),
29+
[!MenuItem.IsVisibleProperty] = nativeItem.GetObservable(NativeMenuItem.IsVisibleProperty).ToBinding(),
2930
[!MenuItem.CommandProperty] = nativeItem.GetObservable(NativeMenuItem.CommandProperty).ToBinding(),
3031
[!MenuItem.CommandParameterProperty] =
3132
nativeItem.GetObservable(NativeMenuItem.CommandParameterProperty).ToBinding(),

src/Avalonia.Controls/NativeMenuItem.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,21 @@ public bool IsEnabled
144144
set => SetValue(IsEnabledProperty, value);
145145
}
146146

147+
/// <summary>
148+
/// Defines the <see cref="IsVisible"/> property.
149+
/// </summary>
150+
public static readonly StyledProperty<bool> IsVisibleProperty =
151+
Visual.IsVisibleProperty.AddOwner<NativeMenuItem>();
152+
153+
/// <summary>
154+
/// Gets or sets a value indicating whether this menu item is visible.
155+
/// </summary>
156+
public bool IsVisible
157+
{
158+
get => GetValue(IsVisibleProperty);
159+
set => SetValue(IsVisibleProperty, value);
160+
}
161+
147162
void CanExecuteChanged()
148163
{
149164
SetCurrentValue(IsEnabledProperty, Command?.CanExecute(CommandParameter) ?? true);

src/Avalonia.FreeDesktop/DBusMenuExporter.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,13 @@ private int GetId(NativeMenuItemBase item)
243243
return new DBusVariantItem("b", new DBusBoolItem(false));
244244
return null;
245245
}
246+
247+
if (name == "visible") {
248+
if (!item.IsVisible)
249+
return new DBusVariantItem("b", new DBusBoolItem(false));
250+
return new DBusVariantItem("b", new DBusBoolItem(true));
251+
}
252+
246253
if (name == "shortcut")
247254
{
248255
if (item.Gesture is null)

src/Avalonia.Native/IAvnMenuItem.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ private void UpdateTitle(string title)
4040

4141
private void UpdateToolTip(string toolTip) => SetToolTip(toolTip ?? "");
4242

43+
private void UpdateIsVisible(bool isVisible) => SetIsVisible(isVisible.AsComBool());
4344
private void UpdateIsChecked(bool isChecked) => SetIsChecked(isChecked.AsComBool());
4445

4546
private void UpdateToggleType(NativeMenuItemToggleType toggleType)
@@ -121,6 +122,8 @@ internal void Initialize(NativeMenuItemBase nativeMenuItem)
121122

122123
UpdateIsChecked(item.IsChecked);
123124

125+
UpdateIsVisible(item.IsVisible);
126+
124127
_propertyDisposables.Add(ManagedMenuItem.GetObservable(NativeMenuItem.HeaderProperty)
125128
.Subscribe(x => UpdateTitle(x)));
126129

@@ -139,6 +142,9 @@ internal void Initialize(NativeMenuItemBase nativeMenuItem)
139142
_propertyDisposables.Add(ManagedMenuItem.GetObservable(NativeMenuItem.IsCheckedProperty)
140143
.Subscribe(x => UpdateIsChecked(x)));
141144

145+
_propertyDisposables.Add(ManagedMenuItem.GetObservable(NativeMenuItem.IsVisibleProperty)
146+
.Subscribe(x => UpdateIsVisible(x)));
147+
142148
_propertyDisposables.Add(ManagedMenuItem.GetObservable(NativeMenuItem.IconProperty)
143149
.Subscribe(x => UpdateIcon(x)));
144150
}

src/Avalonia.Native/avn.idl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,6 +1026,7 @@ interface IAvnMenuItem : IUnknown
10261026
HRESULT SetGesture(AvnKey key, AvnInputModifiers modifiers);
10271027
HRESULT SetAction(IAvnPredicateCallback* predicate, IAvnActionCallback* callback);
10281028
HRESULT SetIsChecked(bool isChecked);
1029+
HRESULT SetIsVisible(bool isVisible);
10291030
HRESULT SetToggleType(AvnMenuItemToggleType toggleType);
10301031
HRESULT SetIcon(void* data, size_t length);
10311032
}

0 commit comments

Comments
 (0)