Browse Source

queue full tree updates when menu items change.

pull/3762/head
Dan Walmsley 6 years ago
parent
commit
fa2b813054
  1. 4
      src/Avalonia.Native/AvaloniaNativeMenuExporter.cs
  2. 12
      src/Avalonia.Native/IAvnAppMenu.cs
  3. 4
      src/Avalonia.Native/IAvnAppMenuItem.cs

4
src/Avalonia.Native/AvaloniaNativeMenuExporter.cs

@ -109,7 +109,7 @@ namespace Avalonia.Native
{
_nativeMenu = _factory.CreateMenu();
_nativeMenu.Initialise(menu, "");
_nativeMenu.Initialise(this, menu, "");
}
}
@ -151,7 +151,7 @@ namespace Avalonia.Native
{
_nativeMenu = _factory.CreateMenu();
_nativeMenu.Initialise(menu, "");
_nativeMenu.Initialise(this, menu, "");
}
}

12
src/Avalonia.Native/IAvnAppMenu.cs

@ -9,6 +9,7 @@ namespace Avalonia.Native.Interop
{
public partial class IAvnAppMenu
{
private AvaloniaNativeMenuExporter _exporter;
private List<IAvnAppMenuItem> _menuItems = new List<IAvnAppMenuItem>();
private Dictionary<NativeMenuItemBase, IAvnAppMenuItem> _menuItemLookup = new Dictionary<NativeMenuItemBase, IAvnAppMenuItem>();
private CompositeDisposable _propertyDisposables = new CompositeDisposable();
@ -56,8 +57,9 @@ namespace Avalonia.Native.Interop
return nativeItem;
}
internal void Initialise(NativeMenu managedMenu, string title)
internal void Initialise(AvaloniaNativeMenuExporter exporter, NativeMenu managedMenu, string title)
{
_exporter = exporter;
ManagedMenu = managedMenu;
((INotifyCollectionChanged)ManagedMenu.Items).CollectionChanged += OnMenuItemsChanged;
@ -75,7 +77,7 @@ namespace Avalonia.Native.Interop
{
((INotifyCollectionChanged)ManagedMenu.Items).CollectionChanged -= OnMenuItemsChanged;
foreach(var item in _menuItems)
foreach (var item in _menuItems)
{
item.Deinitialise();
item.Dispose();
@ -84,7 +86,7 @@ namespace Avalonia.Native.Interop
internal void Update(IAvaloniaNativeFactory factory, NativeMenu menu)
{
if(menu != ManagedMenu)
if (menu != ManagedMenu)
{
throw new ArgumentException("The menu being updated does not match.", nameof(menu));
}
@ -112,7 +114,7 @@ namespace Avalonia.Native.Interop
if (menu.Items[i] is NativeMenuItem nmi)
{
nativeItem.Update(factory, nmi);
nativeItem.Update(_exporter, factory, nmi);
}
}
@ -124,7 +126,7 @@ namespace Avalonia.Native.Interop
private void OnMenuItemsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// update menu items.
_exporter.QueueReset();
}
}
}

4
src/Avalonia.Native/IAvnAppMenuItem.cs

@ -101,7 +101,7 @@ namespace Avalonia.Native.Interop
_currentActionDisposable?.Dispose();
}
internal void Update(IAvaloniaNativeFactory factory, NativeMenuItem item)
internal void Update(AvaloniaNativeMenuExporter exporter, IAvaloniaNativeFactory factory, NativeMenuItem item)
{
if(item != ManagedMenuItem)
{
@ -114,7 +114,7 @@ namespace Avalonia.Native.Interop
{
_subMenu = factory.CreateMenu();
_subMenu.Initialise(item.Menu, item.Header);
_subMenu.Initialise(exporter, item.Menu, item.Header);
}
SetSubMenu(_subMenu);

Loading…
Cancel
Save