diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 668f08e..8777288 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,9 +1,25 @@ -## Version 0.1.5 +## Version 0.1.6 --- Release highlights: -* Added correct icon -* made runner start and stop the same button which just toggles. +* Added extra tasks +* Modified the terminal to use [Xterm.js](https://github.com/xtermjs/xterm.js) --- + +# Extra tasks - Clean + +It is now possible to run dotnet clean against each loaded application. + +# Xterm.js + +The terminal has now been replaced with Node-PTY and Xterm.JS. + +These two technologies are what powers the integrated terminal in many IDE's and editors such as VS-Code. + +This now provides a much richer log output along with performance improvements and the ability to view a terminal in full screen. + +![New terminal](data:image/png;base64,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AEyITQAAACbEJgAAABNiEwAAgAmxCQAAwITYBAAAYEJsAgAAMCE2AQAAmBCbAAAATIhNAAAAJsQmAAAAE2ITAACACbEJAADAhNgEAABgQmwCAAAwITYBAACYEJsAAABMiE0AAAAmxCYAAAATYhMAAIAJsQkAAMCE2AQAAGBCbAIAADAhNgEAAJgQmwAAAEyITQAAACbEJgAAABNiEwAAgAmxCQAAwITYBAAAYEJsAgAAMCE2AQAAmBCbAAAATIhNAAAAJsQmAAAAE2ITAACACbEJAADAhNgEAABgQmwCAAAwibHpfwMAAGASnzYBAACYEJsAAABMiE0AAAAmxCYAAAATYhMAAIAJsQkAAMCE2AQAAGBCbAIAADAhNgEAAJgQmwAAAEyITQAAACbEJgAAABNiEwAAgAmxCQAAwKQbm7705a9ceeDdP/9Lr3rxy36lt8lR6SM94xgAAID9qx2bJAlNBya9SU+SEwAA2BPuuOOO97znPc95znMe/OAHf+d3fud3f/d3P+hBD5Ld9773vXIodupox6YrD7y7ykbTm/SPIwEAANbVtddee+973/uEDjkkHWLXlnZssn/UFDbpH0cCAACspUsuuSTmo74TTzzx1a9+dRww0o5NVSqybHEkAADA+rFkpkQ6x2Ela2w6dONN4dDhr9/2pisPVEdlC0cBAADWzR//8R+feOKJkodOP/30D37wg895znPktrTc7373O+WUU37wB39Qdp/61Kf+wR/8wROe8IRwSIbEwYopNn3iUzdIoySnd/6P37njjju++rV/qjrIFgYCAACsFYku97rXvSQMiYsvvjg0Hjp06Bvf+Ea4LW66KX48dNlll4WeMuSb3/xmaExMsUly0tGjR6+97mB1W29xJAAAwDq55pprQhISL37xi2NrxwUXXBC7nnCCDIytg0Vik3T4xKdu0B1kCwMBAADWytOe9rSYg0444c///M9ja8dnPvOZ8O08IQNj68AUm8IPNqVv0sltYhMAANgTwo8uiR/6oR+KTZMe+chHhv4yMDYNTLFJtvAhU8A36QAAwF5x97vfPcSgs88+OzZNetaznhX6y8DYNLDGprRJfmr+Ml0cCQAAsE5SbDrttNNi06Szzjor9P/e7/3e2DSYLzalX6mr2mULAwEAANbK/e53vxCD7nGPe8SmvqNHj97znvcM/R/2sIfF1oEpNl173UGpEg41M5Ns4SgAAMBa+Ymf+IkQg8Tb3/722NohHWLXE054ylOeElsH7djEP64CAAD2h3e+850xB51wwrd/+7dffvnld911Vzym3H777VdcccXd7na32PWEE66++up4bNCOTfxTvgAAYH/41re+dZ/73Od7vud7rrvuukc84hGSh+5///s/+clPvvPOO0OHI0eOnH322d/xHd8R0lLwfd/3falD0o5NX/ryV+wfOElP6R9HAgAArJl3v/vdkoS+//u//5ZbbjnjjDNOPPHEc889Nx7z9N92Cpr/oG87NglJQlceePd0eJKj0ofMBAAA1pzkpF4YEhdddFFIS8Hpp58e/lBlpRubAAAA9pOLL75YItF973vfU0455a1vfWts9cKh4Oyzzz5y5Eg8UCI2AQCATfGBD3zgu77ruyQbnX/++bHJu/DCC6XxAQ94wHve855jx47F1hFiEwAA2CBf//rXr7766k984hNx37vpppt++7d/u/kbdhqxCQAAwITYBAAAYEJsAgAAMCE2AQAAmBCbAAAATIhNAAAAJsQmAAAAE2ITAACACbEJAADAhNgEAABgQmwCAAAwibGJjY2NjY2NjY1txvbqrf8DelolkqmJGy8AAAAASUVORK5CYII=) + +![new terminal full screen](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxIAAAJRCAIAAABeHRbqAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAEXgSURBVHhe7d0PkC1VfeDxHkQtMeAoIBcVfArE+9QxozzI+MRyHvh2F4nWBFayWQqdkRSwa5kZdRPjbjY8xUolm6gzuiZPSmvGULqJFmSi5Z+tJ76hQmASMY4KzihgngPKEMR3BxNcIvr2/Ovu039O31/fuTNzZ+b7qcdw+/Tpc06f7tv9u3363u5rXL8YAQAAoB0dNj34+003BQAAgDKnv2/pOPcSAAAAlQibAAAARAibAAAARAibAAAARAibAAAARKTfpLv3vn+6+ebP3X7HP6ysPKQmG43T9r7y/Esvff3ZZ73AZgAAANjGTn/fUvuw6Wc/e+JP/vRDn/7MX//8579wSbEnPem4y9/467/z3377yU8+3iUBAABsR+1/gEDFTP/lre/8P395UxIzPecFu5512rPta5WoZv3Xt75TZbMpAAAA21WbsOlP/vRDf//3d7oJ45r/+T/e8af/6+knneSmo2j+7+9U2dwEAADYqfoquUwbQlX3ta99zU14VOJaWlIVNt173z99+jN/bV8/+SlPOe25z33a00/44O+++0O/999f/6YrTnpmv52lqGwqs5tIffEa003Wq6budcnrK1PpNV90qQAAYAMcC3CzN8qdd975ylddkIuc1KRKVLPcdH1VYdPNN3/Ojs29ZM+5I28ZPetlL33JeXt+9bUXvuYNr3/yU5/66l973Zt/952nP/9MlUFlU5nNQjl7J++x3fWFl06cUxnFqHCnbmQVWiSu9AtX3/A6AicAAHacc889946/u82PnGzMpBLVLJvSgaqw6fY7/sG+GBg6/zMHb1j90SNnv/Sldx6e+8yff/TzN37ysZ/86yc/+KHz9g3bPEnmgIs/es/k3htmNzSIuXjk6uiu727MRS4AANBL/MipKzGTUhU22d8aUFqP/PjfXf4fTz7t2X/5v//shBNPPOOss378zw/3n/KsX37ZwPe/e4/Nk2QOOvuSy5O46d6pV7lhNHsF6ovX9L3uhuj2iXPstLmMNOVG29ILSulSKlNukTJfnL1h7+WXnK1fedelkteltUiqVnS2a65RadeY2QAAoOckkVNXYialzS3h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4VRq1stlnV4s3BJuL6qsxxk40J6sXP8kQukeMyw0PJnuD94tYt2KbcpU1RtS0p617W+C/jF1uo8Z04vZq5g1+ie0/wTbr5rWGLp2cGV+TGVpDI34l/jC1m8/BIBNYm8JV4e3/LFNH/EW9ZHT3PLppJlk6ZqdF0o37NHVic9WXuLidL6B3sy25fulJ6dCnT8tMTtVKtPGwmBKoT3B9ldXVVJOqOp0je03mfwm2SXarJERbE5FO0vbU97IcHoVf5nsEt4c17hAO9PeiWUylS8Vrjek2J66pfi5vfzZBvpT6ZqpFLV0ZjXK2hOQlpPbf8rbb1LtpF0yfV3eTs0W1a4lALB53P3eAvaWcO+bdOXyB8JYKB0AAGBrcDGRQP6bdAAAAKhA2AQAACDS17h+8dDIEwMDAy4BAABgZ1hdXXWv2lleXt4/ezxXmwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAEQImwAAAER02HT//ffbCQAAABTZYEmHTWeccYZJAQAAQAkbLDFIBwAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAIELYBAAAINLXuH7x0MgTAwMDLgEAAGBnWF1dVX8/+9nP2knfG97wBvfKWF5e3j97PFebAADAjpaLkJRiikXYBAAAdjo/TgrFTAphEwAAgIuWKmImhbAJAABAq46ZFMImAAAAEcImAAAAEcImAAAAEcImAAAAEcImAAAAEcImAAAAEf1wFfcSAAAAIVH0/wHJkNPwI9U/SwAAAABJRU5ErkJggg==) \ No newline at end of file diff --git a/app/Components/runner/Runner.js b/app/Components/runner/Runner.js index f20cf63..c936442 100644 --- a/app/Components/runner/Runner.js +++ b/app/Components/runner/Runner.js @@ -1,4 +1,12 @@ -const { killDotnetProcessAsync, startDotnetProcess } = require('../../tasks'); +const { killDotnetProcessAsync, startDotnetProcess, startCleanProcess } = require('../../tasks'); +const Terminal = require('xterm').Terminal; +const fit = require('xterm/lib/addons/fit/fit'); +const fullScreen = require('xterm/lib/addons/fullscreen/fullscreen'); +const debounce = require('../../utils/debounce'); + +Terminal.applyAddon(fit); +Terminal.applyAddon(fullScreen); + const WebComponentBase = require('../WebComponentBase'); module.exports = class RunnerElement extends WebComponentBase { @@ -14,6 +22,8 @@ module.exports = class RunnerElement extends WebComponentBase { this._name = ''; + this._terminalProcess; + this.setState(RunnerElement.states.stopped); } @@ -34,10 +44,48 @@ module.exports = class RunnerElement extends WebComponentBase { this.setState(this.state); const clearLog = shadow.querySelector('.clear-log'); + const clean = shadow.querySelector('.clean'); + const full = shadow.querySelector('.full'); + const terminal = shadow.querySelector('.terminals'); clearLog.addEventListener('click', () => this.clearData()); + clean.addEventListener('click', () => this.clean()); + + terminal.addEventListener('click', (e) => { + if (e.target.classList.contains('full-screen')) { + terminal.classList.remove('full-screen'); + this._terminalProcess.fit(); + } + }); + + full.addEventListener('click', () => { + terminal.classList.add('full-screen'); + + this.resize(); + }); + + this._terminalProcess = new Terminal(); + this._terminalProcess.setOption('disableStdin', true); + this._terminalProcess.setOption('fontFamily', "Consolas, 'Courier New', monospace"); + + this._terminalProcess.open(shadow.querySelector('.terminals')); shadow.querySelector('.action').addEventListener('click', this._onToggle.bind(this)); + + // Terminal wont fit itself on resize. + window.addEventListener('resize', debounce(this.resize.bind(this), { + delay: 100, + executeOnFirstRun: true + })); + + this.resize(); + } + + resize() { + this._terminalProcess.fit(); + + if (this._runningProccess) + this._runningProccess.resize(this._terminalProcess.cols, this._terminalProcess.rows); } _enableAction() { @@ -67,6 +115,20 @@ module.exports = class RunnerElement extends WebComponentBase { } } + _enableClean() { + if (!this.shadowRoot) + return; + + this.shadowRoot.querySelector('.clean').removeAttribute('disabled'); + } + + _disableClean() { + if (!this.shadowRoot) + return; + + this.shadowRoot.querySelector('.clean').setAttribute('disabled', 'disabled'); + } + onStart() { if (this.state === RunnerElement.states.running || this.state === RunnerElement.states.starting) return; @@ -75,43 +137,43 @@ module.exports = class RunnerElement extends WebComponentBase { this.setState(RunnerElement.states.starting); - this._runningProccess = startDotnetProcess(this.cwd, true, this.runCommandArguments); + this._terminalProcess.writeln("Starting..."); - this._runningProccess.on('close', () => { + this._runningProccess = startDotnetProcess(this.cwd, true, this.runCommandArguments, this._terminalProcess.cols, this._terminalProcess.rows); + + this._runningProccess.on('exit', () => { this.setState(RunnerElement.states.stopped); this._runningProccess = undefined; }); - this._runningProccess.stdout.on('data', (d) => this.onData(d.toString())); - this._runningProccess.stderr.on('data', (d) => this.onData(d.toString(), true)); - } + this._runningProccess.once('data', () => this.setState(RunnerElement.states.running)); - onData(d, errorData) { - if (this.state === RunnerElement.states.starting) - this.setState(RunnerElement.states.running); + this._runningProccess.on('data', (d) => { + this._terminalProcess.write(d); + }); + } - const el = document.createElement('span'); - const terminal = this.shadowRoot.querySelector('.terminal'); + clean() { + if (this.state === RunnerElement.states.running || this.state === RunnerElement.states.starting) + return; - el.classList.add('log-item'); + this._runningProccess = startCleanProcess(this.cwd); - if (errorData) - el.classList.add('error'); - - el.textContent = d; + this._runningProccess.on('exit', () => { + this.setState(RunnerElement.states.stopped); - terminal.appendChild(el); + this._runningProccess = undefined; + }); - terminal.scrollTop = terminal.scrollHeight; + this._runningProccess.on('data', (d) => { + this.setState(RunnerElement.states.running); + this._terminalProcess.write(d); + }); } clearData() { - const terminal = this.shadowRoot.querySelector('.terminal'); - - while(terminal.firstChild) { - terminal.removeChild(terminal.firstChild); - } + this._terminalProcess.clear(); } onTerminate() { @@ -136,6 +198,7 @@ module.exports = class RunnerElement extends WebComponentBase { setState(state) { this._disableAction(); + this._disableClean(); this.state = state; @@ -166,6 +229,7 @@ module.exports = class RunnerElement extends WebComponentBase { stateEl.textContent = 'Stopped'; stateEl.className = 'state badge badge-secondary'; this._enableAction(); + this._enableClean(); actionBtn.textContent = 'Start'; break; } diff --git a/app/Components/runner/runner.css b/app/Components/runner/runner.css index 6966643..41232d7 100644 --- a/app/Components/runner/runner.css +++ b/app/Components/runner/runner.css @@ -9,19 +9,42 @@ span.badge { padding: 5px; } -.terminal { - background-color: rgb(0, 36, 81); - color: #cccccc; - white-space: pre-line; +:host(:hover) .full-screen-toggle { + opacity: 1; +} + +.terminals { border: 1px solid rgba(128, 128, 128, 0.35); - border-radius: 4px; - padding: 5px; - word-break: break-word; - max-height: 200px; - overflow: auto; - flex: 1; } .log-item.error { color: red; -} \ No newline at end of file +} + +.terminals.full-screen { + position: absolute; + top: 0px; + bottom: 0px; + left: 0px; + right: 0px; + z-index: 200; +} + +.terminals.full-screen::before { + content: 'Close'; + display: block; + position: absolute; + top: 0px; + z-index: 5; + right: 20px; + color: white; + cursor: pointer; + border-radius: 3px; + border: 1px solid white; + padding: 5px; + margin: 3px; +} + +.terminals { + position: relative; +} diff --git a/app/Components/runner/runner.html b/app/Components/runner/runner.html index f9d42e9..0ec4f21 100644 --- a/app/Components/runner/runner.html +++ b/app/Components/runner/runner.html @@ -1,10 +1,22 @@ + + + +

+ +
@@ -12,4 +24,5 @@

-
\ No newline at end of file +
+
\ No newline at end of file diff --git a/app/DotnetRunnerApp.js b/app/DotnetRunnerApp.js index e9d6401..a4e09f3 100644 --- a/app/DotnetRunnerApp.js +++ b/app/DotnetRunnerApp.js @@ -1,4 +1,4 @@ -const { BrowserWindow, Menu } = require('electron'); +const { BrowserWindow, Menu, ipcMain } = require('electron'); const { getApplications } = require('./data/applicationStore'); const { shell } = require('electron'); const ipcMessages = require('./ipcMessages'); @@ -82,6 +82,7 @@ module.exports = class DotnetRunnerApp { { label: 'Options', submenu: [{ + id: 'config-apps', label: 'Configure Applicaions', click: this._preferencesOnCLick.bind(this) }, { @@ -89,20 +90,25 @@ module.exports = class DotnetRunnerApp { click: this._displayPreferences.bind(this) }] }, { + id: 'tasks', label: 'Tasks', submenu: [{ + id: 'start-all', label: 'Start all', accelerator: 'Ctrl+s', click: this._startAllApps.bind(this) }, { + id: 'stop-all', label: 'Stop all', accelerator: 'Ctrl+Shift+S', click: this._stopAllApps.bind(this) }, { + id: 'clear-all', label: 'Clear all', accelerator: 'Ctrl+Shift+C', click: this._clearAllApps.bind(this) }, { + id: 'purge-all', label: 'Purge', accelerator: 'Ctrl+Shift+P', click: this._purge.bind(this) @@ -142,15 +148,24 @@ module.exports = class DotnetRunnerApp { } _startAllApps() { + this._disableTasks(); + this._disableConfigAppMenu(); this._sendMessage(ipcMessages.startAllApplications); + ipcMain.once(ipcMessages.taskComplete, this._onTaskComplete.bind(this)); } _stopAllApps() { + this._disableTasks(); + this._disableConfigAppMenu(); this._sendMessage(ipcMessages.stopAllApplications); + ipcMain.once(ipcMessages.taskComplete, this._onTaskComplete.bind(this)); } _clearAllApps() { + this._disableTasks(); + this._disableConfigAppMenu(); this._sendMessage(ipcMessages.clearAllApplicationLogs); + ipcMain.once(ipcMessages.taskComplete, this._onTaskComplete.bind(this)); } _purge() { @@ -161,6 +176,43 @@ module.exports = class DotnetRunnerApp { this._mainWindow.send(message); } + _disableTasks() { + const menu = this._menu.getApplicationMenu().getMenuItemById('tasks'); + + if (!menu || !menu.submenu || !menu.submenu.items) + return; + + menu.submenu.items.forEach(x => x.enabled = false); + } + + _enableTasks() { + const menu = this._menu.getApplicationMenu().getMenuItemById('tasks'); + + if (!menu || !menu.submenu || !menu.submenu.items) + return; + + menu.submenu.items.forEach(x => x.enabled = true); + } + + _disableConfigAppMenu() { + const menu = this._menu.getApplicationMenu().getMenuItemById('config-apps') || {}; + + menu.enabled = false; + } + + _enableConfigAppMenu() { + const menu = this._menu.getApplicationMenu().getMenuItemById('config-apps') || {}; + + menu.enabled = true; + } + + _onTaskComplete(e, task) { + if (task === ipcMessages.startAllApplications || task === ipcMessages.stopAllApplications || task === ipcMessages.clearAllApplicationLogs) + this._enableConfigAppMenu(); + + this._enableTasks(); + } + /** * @returns {Menu} */ diff --git a/app/SplashScreenApp.js b/app/SplashScreenApp.js index 5fa08bf..008c907 100644 --- a/app/SplashScreenApp.js +++ b/app/SplashScreenApp.js @@ -72,7 +72,6 @@ module.exports = class SplashScreenApp { show: false }); - this._splashWindow .loadFile('app/browserWindows/splashScreen/splashScreen.html'); diff --git a/app/browserWindows/main/main.css b/app/browserWindows/main/main.css index 54261cb..b975e92 100644 --- a/app/browserWindows/main/main.css +++ b/app/browserWindows/main/main.css @@ -14,7 +14,11 @@ .footer { padding: 5px; - border-top: solid 1px rgba(128, 128, 128, 0.35);; + border-top: solid 1px rgba(128, 128, 128, 0.35); +} + +.footer-content { + min-height: 36px; } html, body { @@ -28,4 +32,15 @@ body { .runningProcessCount, #github { cursor: pointer; +} + +.batch-run-message.hide { + display: none; +} + +div.batch-run-message { + padding: 5px; + width: 500px; + text-align: center; + margin: 0px; } \ No newline at end of file diff --git a/app/browserWindows/main/main.html b/app/browserWindows/main/main.html index dd87f50..0c3589a 100644 --- a/app/browserWindows/main/main.html +++ b/app/browserWindows/main/main.html @@ -29,9 +29,13 @@