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 = _factory.CreateMenu();
_nativeMenu.Initialise(menu, ""); _nativeMenu.Initialise(this, menu, "");
} }
} }
@ -151,7 +151,7 @@ namespace Avalonia.Native
{ {
_nativeMenu = _factory.CreateMenu(); _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 public partial class IAvnAppMenu
{ {
private AvaloniaNativeMenuExporter _exporter;
private List<IAvnAppMenuItem> _menuItems = new List<IAvnAppMenuItem>(); private List<IAvnAppMenuItem> _menuItems = new List<IAvnAppMenuItem>();
private Dictionary<NativeMenuItemBase, IAvnAppMenuItem> _menuItemLookup = new Dictionary<NativeMenuItemBase, IAvnAppMenuItem>(); private Dictionary<NativeMenuItemBase, IAvnAppMenuItem> _menuItemLookup = new Dictionary<NativeMenuItemBase, IAvnAppMenuItem>();
private CompositeDisposable _propertyDisposables = new CompositeDisposable(); private CompositeDisposable _propertyDisposables = new CompositeDisposable();
@ -56,8 +57,9 @@ namespace Avalonia.Native.Interop
return nativeItem; return nativeItem;
} }
internal void Initialise(NativeMenu managedMenu, string title) internal void Initialise(AvaloniaNativeMenuExporter exporter, NativeMenu managedMenu, string title)
{ {
_exporter = exporter;
ManagedMenu = managedMenu; ManagedMenu = managedMenu;
((INotifyCollectionChanged)ManagedMenu.Items).CollectionChanged += OnMenuItemsChanged; ((INotifyCollectionChanged)ManagedMenu.Items).CollectionChanged += OnMenuItemsChanged;
@ -75,7 +77,7 @@ namespace Avalonia.Native.Interop
{ {
((INotifyCollectionChanged)ManagedMenu.Items).CollectionChanged -= OnMenuItemsChanged; ((INotifyCollectionChanged)ManagedMenu.Items).CollectionChanged -= OnMenuItemsChanged;
foreach(var item in _menuItems) foreach (var item in _menuItems)
{ {
item.Deinitialise(); item.Deinitialise();
item.Dispose(); item.Dispose();
@ -84,7 +86,7 @@ namespace Avalonia.Native.Interop
internal void Update(IAvaloniaNativeFactory factory, NativeMenu menu) 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)); 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) 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) 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(); _currentActionDisposable?.Dispose();
} }
internal void Update(IAvaloniaNativeFactory factory, NativeMenuItem item) internal void Update(AvaloniaNativeMenuExporter exporter, IAvaloniaNativeFactory factory, NativeMenuItem item)
{ {
if(item != ManagedMenuItem) if(item != ManagedMenuItem)
{ {
@ -114,7 +114,7 @@ namespace Avalonia.Native.Interop
{ {
_subMenu = factory.CreateMenu(); _subMenu = factory.CreateMenu();
_subMenu.Initialise(item.Menu, item.Header); _subMenu.Initialise(exporter, item.Menu, item.Header);
} }
SetSubMenu(_subMenu); SetSubMenu(_subMenu);

Loading…
Cancel
Save