From 6d8b25f926ebf72456b5013195d3043e60736fca Mon Sep 17 00:00:00 2001 From: Emil Atanasov Date: Mon, 7 Sep 2020 13:05:48 +0300 Subject: [PATCH 1/2] add sub items to the menu item. Add the direct path to each item for easier navigation. --- src/preload.ts | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/preload.ts b/src/preload.ts index 4dab53e..7852dce 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -29,11 +29,30 @@ ipcMain.on('SPECTRON_MENU_ADDON/GET_MENU_ITEM', (e, labels) => { // Thus, sending back a menuItem itself is impossible. Send back a generic object. // instead. // + let subItems = [] + if(menuItem.type == 'submenu') { + menuItem.submenu.items.forEach(element => { + let menuItemData = { + path: labels.concat(element.label), + label: element.label, + checked: element.checked, + enabled: element.enabled, + visible: element.visible, + type: element.type + } + subItems.push(menuItemData) + }) + } + e.returnValue = { - label: menuItem.label, - checked: menuItem.checked, - enabled: menuItem.enabled, - visible: menuItem.visible + path: labels, + label: menuItem.label, + checked: menuItem.checked, + enabled: menuItem.enabled, + visible: menuItem.visible, + type: menuItem.type, + submenu: subItems.length, + subItems: subItems } } else { e.returnValue = ({ From b6dade0c6dbc181dea5a4aac24d94254f55171ef Mon Sep 17 00:00:00 2001 From: Emil Atanasov Date: Mon, 7 Sep 2020 16:53:31 +0300 Subject: [PATCH 2/2] add compiled versions and dist folder, to be able to use the library straight from this github repo --- dist/index.d.ts | 10 +++++++++ dist/index.js | 54 +++++++++++++++++++++++++++++++++++++++++++++++ dist/index.js.map | 1 + dist/preload.js | 51 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+) create mode 100644 dist/index.d.ts create mode 100644 dist/index.js create mode 100644 dist/index.js.map create mode 100644 dist/preload.js diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..11756fe --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,10 @@ +import { Application, AppConstructorOptions } from 'spectron'; +import { MenuItem } from 'electron'; +export declare class SpectronMenuAddon { + private app; + createApplication(options: AppConstructorOptions): Application; + clickMenu(...labels: string[]): Promise; + getMenuItem(...labels: string[]): Promise; +} +declare const spectronMenuAddon: SpectronMenuAddon; +export default spectronMenuAddon; diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..65ca5e0 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,54 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SpectronMenuAddon = void 0; +var tslib_1 = require("tslib"); +var path = require("path"); +var spectron_1 = require("spectron"); +var SpectronMenuAddon = (function () { + function SpectronMenuAddon() { + } + SpectronMenuAddon.prototype.createApplication = function (options) { + if (!options.args) { + options.args = []; + } + options.args.unshift(path.join(__dirname, 'preload.js')); + options.args.unshift('--require'); + this.app = new spectron_1.Application(options); + return this.app; + }; + SpectronMenuAddon.prototype.clickMenu = function () { + var labels = []; + for (var _i = 0; _i < arguments.length; _i++) { + labels[_i] = arguments[_i]; + } + return tslib_1.__awaiter(this, void 0, void 0, function () { + return tslib_1.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, this.app.electron.ipcRenderer.sendSync('SPECTRON_MENU_ADDON/CLICK_MENU_ITEM', labels)]; + case 1: + _a.sent(); + return [2]; + } + }); + }); + }; + SpectronMenuAddon.prototype.getMenuItem = function () { + var labels = []; + for (var _i = 0; _i < arguments.length; _i++) { + labels[_i] = arguments[_i]; + } + return tslib_1.__awaiter(this, void 0, void 0, function () { + return tslib_1.__generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, this.app.electron.ipcRenderer.sendSync('SPECTRON_MENU_ADDON/GET_MENU_ITEM', labels)]; + case 1: return [2, _a.sent()]; + } + }); + }); + }; + return SpectronMenuAddon; +}()); +exports.SpectronMenuAddon = SpectronMenuAddon; +var spectronMenuAddon = new SpectronMenuAddon(); +exports.default = spectronMenuAddon; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 0000000..9bb4e2b --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,2BAA4B;AAE5B,qCAA6D;AAM7D;IAAA;IAiCA,CAAC;IA1BC,6CAAiB,GAAjB,UAAkB,OAA8B;QAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACjB,OAAO,CAAC,IAAI,GAAG,EAAE,CAAA;SAClB;QACD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAA;QACxD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QACjC,IAAI,CAAC,GAAG,GAAG,IAAI,sBAAW,CAAC,OAAO,CAAC,CAAA;QAEnC,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IAMK,qCAAS,GAAf;QAAgB,gBAAmB;aAAnB,UAAmB,EAAnB,qBAAmB,EAAnB,IAAmB;YAAnB,2BAAmB;;;;;4BACjC,WAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,qCAAqC,EAAE,MAAM,CAAC,EAAA;;wBAA3F,SAA2F,CAAA;;;;;KAC5F;IAMK,uCAAW,GAAjB;QAAkB,gBAAmB;aAAnB,UAAmB,EAAnB,qBAAmB,EAAnB,IAAmB;YAAnB,2BAAmB;;;;;4BAC5B,WAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,mCAAmC,EAAE,MAAM,CAAC,EAAA;4BAAhG,WAAO,SAAyF,EAAA;;;;KACjG;IACH,wBAAC;AAAD,CAAC,AAjCD,IAiCC;AAjCY,8CAAiB;AAuC9B,IAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAA;AACjD,kBAAe,iBAAiB,CAAA"} \ No newline at end of file diff --git a/dist/preload.js b/dist/preload.js new file mode 100644 index 0000000..a6cddde --- /dev/null +++ b/dist/preload.js @@ -0,0 +1,51 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var electron_1 = require("electron"); +function findItem(menuItems, labels) { + var target = labels[0]; + var rest = labels.slice(1); + var foundItem = menuItems.find(function (item) { return item.label === target; }); + if (rest.length === 0) { + return foundItem; + } + return findItem(foundItem.submenu.items, rest); +} +electron_1.ipcMain.on('SPECTRON_MENU_ADDON/GET_MENU_ITEM', function (e, labels) { + var menuItem = findItem(electron_1.Menu.getApplicationMenu().items, labels); + if (menuItem) { + var subItems_1 = []; + if (menuItem.type == 'submenu') { + menuItem.submenu.items.forEach(function (element) { + var menuItemData = { + path: labels.concat(element.label), + label: element.label, + checked: element.checked, + enabled: element.enabled, + visible: element.visible, + type: element.type + }; + subItems_1.push(menuItemData); + }); + } + e.returnValue = { + path: labels, + label: menuItem.label, + checked: menuItem.checked, + enabled: menuItem.enabled, + visible: menuItem.visible, + type: menuItem.type, + submenu: subItems_1.length, + subItems: subItems_1 + }; + } + else { + e.returnValue = ({ + label: '' + }); + } +}); +electron_1.ipcMain.on('SPECTRON_MENU_ADDON/CLICK_MENU_ITEM', function (e, labels) { + var item = findItem(electron_1.Menu.getApplicationMenu().items, labels); + item.click(item, electron_1.BrowserWindow.getFocusedWindow(), {}); + e.returnValue = {}; +});