mirror of
https://github.com/ElectronNET/Electron.NET.git
synced 2026-02-03 21:25:13 +00:00
Merge pull request #973 from davidroth/set-menu-items
Add dynamic tray menu update functionality
This commit is contained in:
@@ -220,11 +220,33 @@ namespace ElectronNET.API
|
||||
_items.Clear();
|
||||
_items.AddRange(menuItems);
|
||||
|
||||
RegisterMenuItemClickedHandler();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the tray menu items.
|
||||
/// </summary>
|
||||
/// <remarks>Calling this method updates the context menu with the specified items. Any previously
|
||||
/// set menu items will be replaced.</remarks>
|
||||
/// <param name="menuItems">An array of <see cref="MenuItem"/> objects representing the menu items to display in the tray menu.
|
||||
/// Cannot be null.</param>
|
||||
public async Task SetMenuItems(MenuItem[] menuItems)
|
||||
{
|
||||
menuItems.AddMenuItemsId();
|
||||
await BridgeConnector.Socket.Emit("set-contextMenu", [menuItems]).ConfigureAwait(false);
|
||||
_items.Clear();
|
||||
_items.AddRange(menuItems);
|
||||
|
||||
RegisterMenuItemClickedHandler();
|
||||
}
|
||||
|
||||
private void RegisterMenuItemClickedHandler()
|
||||
{
|
||||
BridgeConnector.Socket.Off("trayMenuItemClicked");
|
||||
BridgeConnector.Socket.On<string>("trayMenuItemClicked", (id) =>
|
||||
{
|
||||
MenuItem menuItem = _items.GetMenuItem(id);
|
||||
menuItem?.Click();
|
||||
menuItem?.Click?.Invoke();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -50,11 +50,7 @@ module.exports = (socket) => {
|
||||
const trayIcon = electron_1.nativeImage.createFromPath(image);
|
||||
tray.value = new electron_1.Tray(trayIcon);
|
||||
if (menuItems) {
|
||||
const menu = electron_1.Menu.buildFromTemplate(menuItems);
|
||||
addMenuItemClickConnector(menu.items, (id) => {
|
||||
electronSocket.emit('trayMenuItemClicked', id);
|
||||
});
|
||||
tray.value.setContextMenu(menu);
|
||||
applyContextMenu(menuItems);
|
||||
}
|
||||
});
|
||||
socket.on('tray-destroy', () => {
|
||||
@@ -62,6 +58,11 @@ module.exports = (socket) => {
|
||||
tray.value.destroy();
|
||||
}
|
||||
});
|
||||
socket.on('set-contextMenu', (menuItems) => {
|
||||
if (menuItems && tray.value) {
|
||||
applyContextMenu(menuItems);
|
||||
}
|
||||
});
|
||||
socket.on('tray-setImage', (image) => {
|
||||
if (tray.value) {
|
||||
tray.value.setImage(image);
|
||||
@@ -118,6 +119,13 @@ module.exports = (socket) => {
|
||||
});
|
||||
}
|
||||
});
|
||||
function applyContextMenu(menuItems) {
|
||||
const menu = electron_1.Menu.buildFromTemplate(menuItems);
|
||||
addMenuItemClickConnector(menu.items, (id) => {
|
||||
electronSocket.emit('trayMenuItemClicked', id);
|
||||
});
|
||||
tray.value.setContextMenu(menu);
|
||||
}
|
||||
function addMenuItemClickConnector(menuItems, callback) {
|
||||
menuItems.forEach((item) => {
|
||||
if (item.submenu && item.submenu.items.length > 0) {
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -59,12 +59,7 @@ export = (socket: Socket) => {
|
||||
tray.value = new Tray(trayIcon);
|
||||
|
||||
if (menuItems) {
|
||||
const menu = Menu.buildFromTemplate(menuItems);
|
||||
|
||||
addMenuItemClickConnector(menu.items, (id) => {
|
||||
electronSocket.emit('trayMenuItemClicked', id);
|
||||
});
|
||||
tray.value.setContextMenu(menu);
|
||||
applyContextMenu(menuItems);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -74,6 +69,12 @@ export = (socket: Socket) => {
|
||||
}
|
||||
});
|
||||
|
||||
socket.on('set-contextMenu', (menuItems) => {
|
||||
if (menuItems && tray.value) {
|
||||
applyContextMenu(menuItems);
|
||||
}
|
||||
});
|
||||
|
||||
socket.on('tray-setImage', (image) => {
|
||||
if (tray.value) {
|
||||
tray.value.setImage(image);
|
||||
@@ -136,6 +137,14 @@ export = (socket: Socket) => {
|
||||
}
|
||||
});
|
||||
|
||||
function applyContextMenu(menuItems) {
|
||||
const menu = Menu.buildFromTemplate(menuItems);
|
||||
addMenuItemClickConnector(menu.items, (id) => {
|
||||
electronSocket.emit('trayMenuItemClicked', id);
|
||||
});
|
||||
tray.value.setContextMenu(menu);
|
||||
}
|
||||
|
||||
function addMenuItemClickConnector(menuItems, callback) {
|
||||
menuItems.forEach((item) => {
|
||||
if (item.submenu && item.submenu.items.length > 0) {
|
||||
|
||||
Reference in New Issue
Block a user