using ElectronNET.API.Entities; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace ElectronNET.API { /// /// /// public sealed class WindowManager { private static WindowManager _windowManager; private static object _syncRoot = new Object(); internal WindowManager() { } internal static WindowManager Instance { get { if (_windowManager == null) { lock (_syncRoot) { if (_windowManager == null) { _windowManager = new WindowManager(); } } } return _windowManager; } } /// /// Quit when all windows are closed. (Default is true) /// /// /// true if [quit window all closed]; otherwise, false. /// public bool IsQuitOnWindowAllClosed { get { return _isQuitOnWindowAllClosed; } set { BridgeConnector.Socket.Emit("quit-app-window-all-closed-event", value); _isQuitOnWindowAllClosed = value; } } private bool _isQuitOnWindowAllClosed = true; /// /// Gets the browser windows. /// /// /// The browser windows. /// public IReadOnlyCollection BrowserWindows { get { return _browserWindows.AsReadOnly(); } } private List _browserWindows = new List(); /// /// Creates the window asynchronous. /// /// The load URL. /// public async Task CreateWindowAsync(string loadUrl = "http://localhost") { return await CreateWindowAsync(new BrowserWindowOptions(), loadUrl); } /// /// Creates the window asynchronous. /// /// The options. /// The load URL. /// public Task CreateWindowAsync(BrowserWindowOptions options, string loadUrl = "http://localhost") { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("BrowserWindowCreated", (id) => { BridgeConnector.Socket.Off("BrowserWindowCreated"); string windowId = id.ToString(); BrowserWindow browserWindow = new BrowserWindow(int.Parse(windowId)); _browserWindows.Add(browserWindow); taskCompletionSource.SetResult(browserWindow); }); BridgeConnector.Socket.Off("BrowserWindowClosed"); BridgeConnector.Socket.On("BrowserWindowClosed", (ids) => { var browserWindowIds = ((JArray)ids).ToObject(); for (int index = 0; index < _browserWindows.Count; index++) { if (!browserWindowIds.Contains(_browserWindows[index].Id)) { _browserWindows.RemoveAt(index); } } }); if (loadUrl.ToUpper() == "HTTP://LOCALHOST") { loadUrl = $"{loadUrl}:{BridgeSettings.WebPort}"; } BridgeConnector.Socket.Emit("createBrowserWindow", JObject.FromObject(options, _jsonSerializer), loadUrl); return taskCompletionSource.Task; } private JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore }; } }