using ElectronNET.API.Entities; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System.Collections.Generic; using ElectronNET.API.Extensions; using System.Linq; using System.Collections.ObjectModel; namespace ElectronNET.API { /// /// Create native application menus and context menus. /// public sealed class Menu { private static Menu _menu; private static object _syncRoot = new object(); internal Menu() { } internal static Menu Instance { get { if (_menu == null) { lock (_syncRoot) { if(_menu == null) { _menu = new Menu(); } } } return _menu; } } /// /// Gets the menu items. /// /// /// The menu items. /// public IReadOnlyCollection MenuItems { get { return _menuItems.AsReadOnly(); } } private List _menuItems = new List(); /// /// Sets the application menu. /// /// The menu items. public void SetApplicationMenu(MenuItem[] menuItems) { _menuItems.Clear(); menuItems.AddMenuItemsId(); menuItems.AddSubmenuTypes(); BridgeConnector.Socket.Emit("menu-setApplicationMenu", JArray.FromObject(menuItems, _jsonSerializer)); _menuItems.AddRange(menuItems); BridgeConnector.Socket.Off("menuItemClicked"); BridgeConnector.Socket.On("menuItemClicked", (id) => { MenuItem menuItem = _menuItems.GetMenuItem(id.ToString()); menuItem.Click?.Invoke(); }); } /// /// Gets the context menu items. /// /// /// The context menu items. /// public IReadOnlyDictionary> ContextMenuItems { get; internal set; } private Dictionary> _contextMenuItems = new Dictionary>(); /// /// Sets the context menu. /// /// The browser window. /// The menu items. public void SetContextMenu(BrowserWindow browserWindow, MenuItem[] menuItems) { menuItems.AddMenuItemsId(); menuItems.AddSubmenuTypes(); BridgeConnector.Socket.Emit("menu-setContextMenu", browserWindow.Id, JArray.FromObject(menuItems, _jsonSerializer)); if (!_contextMenuItems.ContainsKey(browserWindow.Id)) { _contextMenuItems.Add(browserWindow.Id, menuItems.ToList()); var x = _contextMenuItems.ToDictionary(kv => kv.Key, kv => kv.Value.AsReadOnly()); ContextMenuItems = new ReadOnlyDictionary>(x); } BridgeConnector.Socket.Off("contextMenuItemClicked"); BridgeConnector.Socket.On("contextMenuItemClicked", (results) => { var id = ((JArray)results).First.ToString(); var browserWindowId = (int)((JArray)results).Last; MenuItem menuItem = _contextMenuItems[browserWindowId].GetMenuItem(id); menuItem.Click?.Invoke(); }); } /// /// Contexts the menu popup. /// /// The browser window. public void ContextMenuPopup(BrowserWindow browserWindow) { BridgeConnector.Socket.Emit("menu-contextMenuPopup", browserWindow.Id); } private JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore }; } }