|
|
|
@ -33,6 +33,7 @@ namespace Avalonia.FreeDesktop |
|
|
|
private NativeMenu _menu; |
|
|
|
private Dictionary<int, NativeMenuItemBase> _idsToItems = new Dictionary<int, NativeMenuItemBase>(); |
|
|
|
private Dictionary<NativeMenuItemBase, int> _itemsToIds = new Dictionary<NativeMenuItemBase, int>(); |
|
|
|
private readonly HashSet<NativeMenu> _menus = new HashSet<NativeMenu>(); |
|
|
|
private bool _resetQueued; |
|
|
|
private int _nextId = 1; |
|
|
|
public DBusMenuExporterImpl(Connection dbus, IntPtr xid) |
|
|
|
@ -104,12 +105,11 @@ namespace Avalonia.FreeDesktop |
|
|
|
void DoLayoutReset() |
|
|
|
{ |
|
|
|
_resetQueued = false; |
|
|
|
foreach (var i in _idsToItems.Values) |
|
|
|
{ |
|
|
|
foreach (var i in _idsToItems.Values) |
|
|
|
i.PropertyChanged -= OnItemPropertyChanged; |
|
|
|
if (i is NativeMenuItem nmi) |
|
|
|
((INotifyCollectionChanged)nmi.Menu.Items).CollectionChanged -= OnMenuItemsChanged; |
|
|
|
} |
|
|
|
foreach(var menu in _menus) |
|
|
|
((INotifyCollectionChanged)menu.Items).CollectionChanged -= OnMenuItemsChanged; |
|
|
|
_menus.Clear(); |
|
|
|
_idsToItems.Clear(); |
|
|
|
_itemsToIds.Clear(); |
|
|
|
_revision++; |
|
|
|
@ -132,6 +132,12 @@ namespace Avalonia.FreeDesktop |
|
|
|
return (item, (item as NativeMenuItem)?.Menu); |
|
|
|
} |
|
|
|
|
|
|
|
private void EnsureSubscribed(NativeMenu menu) |
|
|
|
{ |
|
|
|
if(menu!=null && _menus.Add(menu)) |
|
|
|
((INotifyCollectionChanged)menu.Items).CollectionChanged += OnMenuItemsChanged; |
|
|
|
} |
|
|
|
|
|
|
|
private int GetId(NativeMenuItemBase item) |
|
|
|
{ |
|
|
|
if (_itemsToIds.TryGetValue(item, out var id)) |
|
|
|
@ -141,7 +147,7 @@ namespace Avalonia.FreeDesktop |
|
|
|
_itemsToIds[item] = id; |
|
|
|
item.PropertyChanged += OnItemPropertyChanged; |
|
|
|
if (item is NativeMenuItem nmi) |
|
|
|
((INotifyCollectionChanged)nmi.Menu.Items).CollectionChanged += OnMenuItemsChanged; |
|
|
|
EnsureSubscribed(nmi.Menu); |
|
|
|
return id; |
|
|
|
} |
|
|
|
|
|
|
|
@ -190,12 +196,15 @@ namespace Avalonia.FreeDesktop |
|
|
|
{ |
|
|
|
var (it, menu) = i; |
|
|
|
|
|
|
|
if (it is NativeMenuItem item) |
|
|
|
if (it is NativeMenuItemSeperator) |
|
|
|
{ |
|
|
|
if (name == "type") |
|
|
|
return "separator"; |
|
|
|
} |
|
|
|
else if (it is NativeMenuItem item) |
|
|
|
{ |
|
|
|
if (name == "type") |
|
|
|
{ |
|
|
|
if (item != null && item.Header == null) |
|
|
|
return "separator"; |
|
|
|
return null; |
|
|
|
} |
|
|
|
if (name == "label") |
|
|
|
|