diff --git a/ElectronNET.API/Entities/DisplayBalloonOptions.cs b/ElectronNET.API/Entities/DisplayBalloonOptions.cs new file mode 100644 index 0000000..da59480 --- /dev/null +++ b/ElectronNET.API/Entities/DisplayBalloonOptions.cs @@ -0,0 +1,9 @@ +namespace ElectronNET.API +{ + public class DisplayBalloonOptions + { + public string Icon { get; set; } + public string Title { get; set; } + public string Content { get; set; } + } +} \ No newline at end of file diff --git a/ElectronNET.API/Entities/HighlightMode.cs b/ElectronNET.API/Entities/HighlightMode.cs new file mode 100644 index 0000000..19dc276 --- /dev/null +++ b/ElectronNET.API/Entities/HighlightMode.cs @@ -0,0 +1,20 @@ +namespace ElectronNET.API.Entities +{ + public enum HighlightMode + { + /// + /// Highlight the tray icon when it is clicked and also when its context menu is open. This is the default. + /// + selection, + + /// + /// Always highlight the tray icon. + /// + always, + + /// + /// Never highlight the tray icon. + /// + never + } +} \ No newline at end of file diff --git a/ElectronNET.API/Entities/TrayClickEventArgs.cs b/ElectronNET.API/Entities/TrayClickEventArgs.cs new file mode 100644 index 0000000..5e7b09b --- /dev/null +++ b/ElectronNET.API/Entities/TrayClickEventArgs.cs @@ -0,0 +1,10 @@ +namespace ElectronNET.API +{ + public class TrayClickEventArgs + { + public bool AltKey { get; set; } + public bool ShiftKey { get; set; } + public bool CtrlKey { get; set; } + public bool MetaKey { get; set; } + } +} \ No newline at end of file diff --git a/ElectronNET.API/Tray.cs b/ElectronNET.API/Tray.cs index bbb23dc..aa42268 100644 --- a/ElectronNET.API/Tray.cs +++ b/ElectronNET.API/Tray.cs @@ -3,12 +3,182 @@ using ElectronNET.API.Extensions; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; +using System; using System.Collections.Generic; +using System.Threading.Tasks; namespace ElectronNET.API { public sealed class Tray { + /// + /// Emitted when the tray icon is clicked. + /// + public event Action OnClick + { + add + { + if (_click == null) + { + BridgeConnector.Socket.On("tray-click-event", (result) => + { + var args = ((JArray)result).ToObject(); + var trayClickEventArgs = ((JObject)args[0]).ToObject(); + var bounds = ((JObject)args[1]).ToObject(); + _click(trayClickEventArgs, bounds); + }); + + BridgeConnector.Socket.Emit("register-tray-click"); + } + _click += value; + } + remove + { + _click -= value; + } + } + + private event Action _click; + + /// + /// macOS, Windows: Emitted when the tray icon is right clicked. + /// + public event Action OnRightClick + { + add + { + if (_rightClick == null) + { + BridgeConnector.Socket.On("tray-right-click-event", (result) => + { + var args = ((JArray)result).ToObject(); + var trayClickEventArgs = ((JObject)args[0]).ToObject(); + var bounds = ((JObject)args[1]).ToObject(); + _rightClick(trayClickEventArgs, bounds); + }); + + BridgeConnector.Socket.Emit("register-tray-right-click"); + } + _rightClick += value; + } + remove + { + _rightClick -= value; + } + } + + private event Action _rightClick; + + /// + /// macOS, Windows: Emitted when the tray icon is double clicked. + /// + public event Action OnDoubleClick + { + add + { + if (_doubleClick == null) + { + BridgeConnector.Socket.On("tray-double-click-event", (result) => + { + var args = ((JArray)result).ToObject(); + var trayClickEventArgs = ((JObject)args[0]).ToObject(); + var bounds = ((JObject)args[1]).ToObject(); + _doubleClick(trayClickEventArgs, bounds); + }); + + BridgeConnector.Socket.Emit("register-tray-double-click"); + } + _doubleClick += value; + } + remove + { + _doubleClick -= value; + } + } + + private event Action _doubleClick; + + /// + /// Windows: Emitted when the tray balloon shows. + /// + public event Action OnBalloonShow + { + add + { + if (_balloonShow == null) + { + BridgeConnector.Socket.On("tray-balloon-show-event", () => + { + _balloonShow(); + }); + + BridgeConnector.Socket.Emit("register-tray-balloon-show"); + } + _balloonShow += value; + } + remove + { + _balloonShow -= value; + } + } + + private event Action _balloonShow; + + /// + /// Windows: Emitted when the tray balloon is clicked. + /// + public event Action OnBalloonClick + { + add + { + if (_balloonClick == null) + { + BridgeConnector.Socket.On("tray-balloon-click-event", () => + { + _balloonClick(); + }); + + BridgeConnector.Socket.Emit("register-tray-balloon-click"); + } + _balloonClick += value; + } + remove + { + _balloonClick -= value; + } + } + + private event Action _balloonClick; + + /// + /// Windows: Emitted when the tray balloon is closed + /// because of timeout or user manually closes it. + /// + public event Action OnBalloonClosed + { + add + { + if (_balloonClosed == null) + { + BridgeConnector.Socket.On("tray-balloon-closed-event", () => + { + _balloonClosed(); + }); + + BridgeConnector.Socket.Emit("register-tray-balloon-closed"); + } + _balloonClosed += value; + } + remove + { + _balloonClosed -= value; + } + } + + private event Action _balloonClosed; + + // TODO: Implement macOS Events + private static Tray _tray; internal Tray() { } @@ -42,6 +212,91 @@ namespace ElectronNET.API }); } + /// + /// Destroys the tray icon immediately. + /// + public void Destroy() + { + BridgeConnector.Socket.Emit("tray-destroy"); + } + + /// + /// Sets the image associated with this tray icon. + /// + /// + public void SetImage(string image) + { + BridgeConnector.Socket.Emit("tray-setImage", image); + } + + /// + /// Sets the image associated with this tray icon when pressed on macOS. + /// + /// + public void SetPressedImage(string image) + { + BridgeConnector.Socket.Emit("tray-setPressedImage", image); + } + + /// + /// Sets the hover text for this tray icon. + /// + /// + public void SetToolTip(string toolTip) + { + BridgeConnector.Socket.Emit("tray-setToolTip", toolTip); + } + + /// + /// macOS: Sets the title displayed aside of the tray icon in the status bar. + /// + /// + public void SetTitle(string title) + { + BridgeConnector.Socket.Emit("tray-setTitle", title); + } + + /// + /// macOS: Sets when the tray’s icon background becomes highlighted (in blue). + /// + /// Note: You can use highlightMode with a BrowserWindow by toggling between + /// 'never' and 'always' modes when the window visibility changes. + /// + /// + public void SetHighlightMode(HighlightMode highlightMode) + { + BridgeConnector.Socket.Emit("tray-setHighlightMode", highlightMode.ToString()); + } + + /// + /// Windows: Displays a tray balloon. + /// + /// + public void DisplayBalloon(DisplayBalloonOptions options) + { + BridgeConnector.Socket.Emit("tray-displayBalloon", JObject.FromObject(options, _jsonSerializer)); + } + + /// + /// Whether the tray icon is destroyed. + /// + /// + public Task IsDestroyedAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("tray-isDestroyedCompleted", (isDestroyed) => + { + BridgeConnector.Socket.Off("tray-isDestroyedCompleted"); + + taskCompletionSource.SetResult((bool)isDestroyed); + }); + + BridgeConnector.Socket.Emit("tray-isDestroyed"); + + return taskCompletionSource.Task; + } + private JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), diff --git a/ElectronNET.Host/api/tray.js b/ElectronNET.Host/api/tray.js index 1a9a53f..c7ffe28 100644 --- a/ElectronNET.Host/api/tray.js +++ b/ElectronNET.Host/api/tray.js @@ -4,6 +4,48 @@ var electron_1 = require("electron"); var path = require('path'); var tray; module.exports = function (socket) { + socket.on('register-tray-click', function () { + if (tray) { + tray.on('click', function (event, bounds) { + socket.emit('tray-click-event', [event.__proto__, bounds]); + }); + } + }); + socket.on('register-tray-right-click', function () { + if (tray) { + tray.on('right-click', function (event, bounds) { + socket.emit('tray-right-click-event', [event.__proto__, bounds]); + }); + } + }); + socket.on('register-tray-double-click', function () { + if (tray) { + tray.on('double-click', function (event, bounds) { + socket.emit('tray-double-click-event', [event.__proto__, bounds]); + }); + } + }); + socket.on('register-tray-balloon-show', function () { + if (tray) { + tray.on('balloon-show', function () { + socket.emit('tray-balloon-show-event'); + }); + } + }); + socket.on('register-tray-balloon-click', function () { + if (tray) { + tray.on('balloon-click', function () { + socket.emit('tray-balloon-click-event'); + }); + } + }); + socket.on('register-tray-balloon-closed', function () { + if (tray) { + tray.on('balloon-closed', function () { + socket.emit('tray-balloon-closed-event'); + }); + } + }); socket.on('create-tray', function (image, menuItems) { var menu = electron_1.Menu.buildFromTemplate(menuItems); addMenuItemClickConnector(menu.items, function (id) { @@ -13,6 +55,48 @@ module.exports = function (socket) { tray = new electron_1.Tray(imagePath); tray.setContextMenu(menu); }); + socket.on('tray-destroy', function () { + if (tray) { + tray.destroy(); + } + }); + socket.on('tray-setImage', function (image) { + if (tray) { + tray.setImage(image); + } + }); + socket.on('tray-setPressedImage', function (image) { + if (tray) { + var img = electron_1.nativeImage.createFromPath(image); + tray.setPressedImage(img); + } + }); + socket.on('tray-setToolTip', function (toolTip) { + if (tray) { + tray.setToolTip(toolTip); + } + }); + socket.on('tray-setTitle', function (title) { + if (tray) { + tray.setTitle(title); + } + }); + socket.on('tray-setHighlightMode', function (mode) { + if (tray) { + tray.setHighlightMode(mode); + } + }); + socket.on('tray-displayBalloon', function (options) { + if (tray) { + tray.displayBalloon(options); + } + }); + socket.on('tray-isDestroyed', function () { + if (tray) { + var isDestroyed = tray.isDestroyed(); + socket.emit('tray-isDestroyedCompleted', isDestroyed); + } + }); function addMenuItemClickConnector(menuItems, callback) { menuItems.forEach(function (item) { if (item.submenu && item.submenu.items.length > 0) { diff --git a/ElectronNET.Host/api/tray.js.map b/ElectronNET.Host/api/tray.js.map index e28487a..571c594 100644 --- a/ElectronNET.Host/api/tray.js.map +++ b/ElectronNET.Host/api/tray.js.map @@ -1 +1 @@ -{"version":3,"file":"tray.js","sourceRoot":"","sources":["tray.ts"],"names":[],"mappings":";;AAAA,qCAAsC;AACtC,IAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7B,IAAI,IAAI,CAAC;AAET,MAAM,CAAC,OAAO,GAAG,UAAC,MAAuB;IACrC,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,UAAC,KAAK,EAAE,SAAS;QACtC,IAAM,IAAI,GAAG,eAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAE/C,yBAAyB,CAAC,IAAI,CAAC,KAAK,EAAE,UAAC,EAAE;YACrC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,IAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAExE,IAAI,GAAG,IAAI,eAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,mCAAmC,SAAS,EAAE,QAAQ;QAClD,SAAS,CAAC,OAAO,CAAC,UAAC,IAAI;YACnB,EAAE,CAAA,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC/C,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5D,CAAC;YAED,EAAE,CAAA,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,cAAQ,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAA"} \ No newline at end of file +{"version":3,"file":"tray.js","sourceRoot":"","sources":["tray.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/ElectronNET.Host/api/tray.ts b/ElectronNET.Host/api/tray.ts index 01b8150..a6511ab 100644 --- a/ElectronNET.Host/api/tray.ts +++ b/ElectronNET.Host/api/tray.ts @@ -1,8 +1,56 @@ -import { Menu, Tray } from "electron"; +import { Menu, Tray, nativeImage } from "electron"; const path = require('path'); -let tray; +let tray: Electron.Tray; module.exports = (socket: SocketIO.Server) => { + socket.on('register-tray-click', () => { + if (tray) { + tray.on('click', (event, bounds) => { + socket.emit('tray-click-event', [(event).__proto__, bounds]); + }); + } + }); + + socket.on('register-tray-right-click', () => { + if (tray) { + tray.on('right-click', (event, bounds) => { + socket.emit('tray-right-click-event', [(event).__proto__, bounds]); + }); + } + }); + + socket.on('register-tray-double-click', () => { + if (tray) { + tray.on('double-click', (event, bounds) => { + socket.emit('tray-double-click-event', [(event).__proto__, bounds]); + }); + } + }); + + socket.on('register-tray-balloon-show', () => { + if (tray) { + tray.on('balloon-show', () => { + socket.emit('tray-balloon-show-event'); + }); + } + }); + + socket.on('register-tray-balloon-click', () => { + if (tray) { + tray.on('balloon-click', () => { + socket.emit('tray-balloon-click-event'); + }); + } + }); + + socket.on('register-tray-balloon-closed', () => { + if (tray) { + tray.on('balloon-closed', () => { + socket.emit('tray-balloon-closed-event'); + }); + } + }); + socket.on('create-tray', (image, menuItems) => { const menu = Menu.buildFromTemplate(menuItems); @@ -16,13 +64,63 @@ module.exports = (socket: SocketIO.Server) => { tray.setContextMenu(menu); }); + socket.on('tray-destroy', () => { + if (tray) { + tray.destroy(); + } + }); + + socket.on('tray-setImage', (image) => { + if (tray) { + tray.setImage(image); + } + }); + + socket.on('tray-setPressedImage', (image) => { + if (tray) { + let img = nativeImage.createFromPath(image); + tray.setPressedImage(img); + } + }); + + socket.on('tray-setToolTip', (toolTip) => { + if (tray) { + tray.setToolTip(toolTip); + } + }); + + socket.on('tray-setTitle', (title) => { + if (tray) { + tray.setTitle(title); + } + }); + + socket.on('tray-setHighlightMode', (mode) => { + if (tray) { + tray.setHighlightMode(mode); + } + }); + + socket.on('tray-displayBalloon', (options) => { + if (tray) { + tray.displayBalloon(options); + } + }); + + socket.on('tray-isDestroyed', () => { + if (tray) { + let isDestroyed = tray.isDestroyed(); + socket.emit('tray-isDestroyedCompleted', isDestroyed); + } + }); + function addMenuItemClickConnector(menuItems, callback) { menuItems.forEach((item) => { - if(item.submenu && item.submenu.items.length > 0) { + if (item.submenu && item.submenu.items.length > 0) { addMenuItemClickConnector(item.submenu.items, callback); } - - if("id" in item && item.id) { + + if ("id" in item && item.id) { item.click = () => { callback(item.id); }; } }); diff --git a/ElectronNET.WebApp/Startup.cs b/ElectronNET.WebApp/Startup.cs index 2df074f..d87adc2 100644 --- a/ElectronNET.WebApp/Startup.cs +++ b/ElectronNET.WebApp/Startup.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using System; using System.Linq; using System.Threading;