Tray items
Some checks are pending
MacOS Build / build (20) (push) Waiting to run
MacOS 12 - x64 DMG Build / build (20) (push) Waiting to run
Ubuntu 22.04 - AppImage Build / build (20) (push) Waiting to run
Ubuntu 22.04 - x64 DEB Build / build (20) (push) Waiting to run
Ubuntu 24.04 - x64 DEB Build / build (20) (push) Waiting to run
Windows Installer Build / build (20) (push) Waiting to run
Windows Portable Build / build (20) (push) Waiting to run

This commit is contained in:
everoddandeven 2024-11-01 14:39:47 +01:00
parent e32a8c76bd
commit 7b2716e670
7 changed files with 223 additions and 12 deletions

View file

@ -90,27 +90,62 @@ const args = process.argv.slice(1),
// #region Window
const onStartStopDaemon: () => void = () => {
console.log("onStartStopDaemon()");
function updateTrayMenu(): void {
tray.setContextMenu(trayMenu);
}
};
function setTrayItemEnabled(id: string, enabled: boolean): void {
const item = trayMenu.getMenuItemById(id);
if (!item) {
throw new Error(`Item not found: ${id}`);
}
item.enabled = enabled;
updateTrayMenu();
}
function createTrayMenuTemplate(): MenuItemConstructorOptions[] {
return [
{
id: "startStopDaemon",
id: "startDaemon",
label: "Start",
toolTip: "Start monero daemon",
click: onStartStopDaemon
toolTip: "Start Daemon",
click: () => {
win?.webContents.send('on-tray-start-daemon');
}
},
{
id: "stopDaemon",
label: "Stop",
toolTip: "Stop Daemon",
click: () => {
win?.webContents.send('on-tray-stop-daemon');
}
},
{
id: "startSync",
label: "Start Sync",
toolTip: "Start Daemon Sync",
click: () => {
win?.webContents.send('on-tray-start-sync');
}
},
{
id: "stopSync",
label: "Stop Sync",
toolTip: "Stop Daemon Sync",
click: () => {
win?.webContents.send('on-tray-stop-sync');
}
},
{
id: "quitDaemon",
label: "Quit",
toolTip: "Quit monero daemon",
toolTip: "Quit Daemon",
click: () => {
isQuitting = true;
app.quit();
console.log("Quit monero daemon");
win?.webContents.send('on-tray-quit-daemon');
}
}
]
@ -948,6 +983,14 @@ try {
// #endregion
ipcMain.handle('set-tray-item-enabled', (event: IpcMainInvokeEvent, id: string, enabled: boolean) => {
setTrayItemEnabled(id, enabled);
});
ipcMain.handle('set-tray-tool-tip', (event: IpcMainInvokeEvent, toolTip: string) => {
tray.setToolTip(toolTip);
});
ipcMain.handle('is-app-image', (event: IpcMainInvokeEvent) => {
const isAppImage: boolean = !!process.env.APPIMAGE;

View file

@ -2,6 +2,27 @@
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('electronAPI', {
onTrayStartDaemon: (callback) => {
ipcRenderer.on('on-tray-start-daemon', callback);
},
onTrayStopDaemon: (callback) => {
ipcRenderer.on('on-tray-stop-daemon', callback);
},
onTrayQuitDaemon: (callback) => {
ipcRenderer.on('on-tray-quit-daemon', callback);
},
onTrayStartSync: (callback) => {
ipcRenderer.on('on-tray-start-sync', callback);
},
onTrayStopSync: (callback) => {
ipcRenderer.on('on-tray-stop-sync', callback);
},
setTrayItemEnabled: (id, enabled) => {
ipcRenderer.invoke('set-tray-item-enabled', id, enabled);
},
setTrayToolTip: (toolTip) => {
ipcRenderer.invoke('set-tray-tool-tip', toolTip);
},
startMonerod: (args) => {
ipcRenderer.invoke('start-monerod', args);
},
@ -50,7 +71,6 @@ contextBridge.exposeInMainWorld('electronAPI', {
unregisterOnMoneroVersionError: () => {
ipcRenderer.removeAllListeners('unregister-on-monero-version-error');
},
downloadMonerod: (downloadUrl, destination) => {
ipcRenderer.invoke('download-monerod', downloadUrl, destination);
},

View file

@ -4,6 +4,7 @@ import { APP_CONFIG } from '../environments/environment';
import { DaemonService } from './core/services/daemon/daemon.service';
import { DaemonDataService } from './core/services/daemon/daemon-data.service';
import { LogsService } from './pages/logs/logs.service';
import { DaemonTrayService } from './core/services/daemon/daemon-tray.service';
@Component({
selector: 'app-root',
@ -22,7 +23,8 @@ export class AppComponent {
private electronService: ElectronService,
private daemonService: DaemonService,
private daemonData: DaemonDataService,
private LogService: LogsService
private LogService: LogsService,
private trayService: DaemonTrayService
) {
console.log('APP_CONFIG', APP_CONFIG);

View file

@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { DaemonTrayService } from './daemon-tray.service';
describe('DaemonTrayService', () => {
let service: DaemonTrayService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(DaemonTrayService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

View file

@ -0,0 +1,121 @@
import { Injectable } from '@angular/core';
import { DaemonService } from './daemon.service';
@Injectable({
providedIn: 'root'
})
export class DaemonTrayService {
constructor(private daemonService: DaemonService) {
this.registerIpcEvents();
this.daemonService.isRunning()
.then((running: boolean) => this.loadTrayItems(running))
.catch((error: any) => {
console.error(error);
this.loadTrayItems(false);
});
}
private registerIpcEvents(): void {
window.electronAPI.onTrayStopDaemon((event: any) => {
console.debug(event);
this.disableAllItems();
this.daemonService.isRunning().then((running: boolean) => {
if (!running) {
console.warn("Daemon already stopped");
return;
}
this.daemonService.stopDaemon().then(() => {
window.electronAPI.setTrayItemEnabled('stopDaemon', false);
window.electronAPI.setTrayItemEnabled('startDaemon', true);
window.electronAPI.setTrayItemEnabled('startSync', false);
window.electronAPI.setTrayItemEnabled('stopSync', false);
}).catch((error: any) => console.error(error));
}).catch((error: any) => console.error(error));
});
window.electronAPI.onTrayStartDaemon((event: any) => {
console.debug(event);
this.disableAllItems();
this.daemonService.isRunning().then((running: boolean) => {
if (running) {
console.warn("Daemon already started");
return;
}
this.daemonService.startDaemon().then(() => {
window.electronAPI.setTrayItemEnabled('stopDaemon', true);
window.electronAPI.setTrayItemEnabled('startDaemon', false);
window.electronAPI.setTrayItemEnabled('startSync', this.daemonService.settings.noSync);
window.electronAPI.setTrayItemEnabled('stopSync', !this.daemonService.settings.noSync);
}).catch((error: any) => console.error(error));
}).catch((error: any) => console.error(error));
});
window.electronAPI.onTrayQuitDaemon((event: any) => {
console.debug(event);
this.disableAllItems();
this.daemonService.quit().then(() => this.disableAllItems()).catch((error: any) => console.error(error));
});
window.electronAPI.onTrayStartSync((event: any) => {
console.debug(event);
if (!this.daemonService.settings.noSync) {
console.warn("Sync already enabled");
return;
}
this.disableAllItems();
this.daemonService.enableSync().then(() => {
window.electronAPI.setTrayItemEnabled('startSync', false);
window.electronAPI.setTrayItemEnabled('stopSync', true);
}).catch((error: any) => console.error(error));
});
window.electronAPI.onTrayStopSync((event: any) => {
console.debug(event);
if (this.daemonService.settings.noSync) {
console.warn("Sync already disabled");
return;
}
this.disableAllItems();
this.daemonService.disableSync().then(() => {
window.electronAPI.setTrayItemEnabled('startSync', true);
window.electronAPI.setTrayItemEnabled('stopSync', false);
}).catch((error: any) => console.error(error));
});
this.daemonService.onDaemonStatusChanged.subscribe((running: boolean) => {
this.loadTrayItems(running);
});
}
public disableAllItems(): void {
window.electronAPI.setTrayItemEnabled('stopDaemon', false);
window.electronAPI.setTrayItemEnabled('startDaemon', false);
window.electronAPI.setTrayItemEnabled('startSync', false);
window.electronAPI.setTrayItemEnabled('stopSync', false);
}
public loadTrayItems(running: boolean): void {
if (!running) {
window.electronAPI.setTrayItemEnabled('stopDaemon', false);
window.electronAPI.setTrayItemEnabled('startDaemon', true);
window.electronAPI.setTrayItemEnabled('startSync', false);
window.electronAPI.setTrayItemEnabled('stopSync', false);
}
else {
window.electronAPI.setTrayItemEnabled('stopDaemon', true);
window.electronAPI.setTrayItemEnabled('startDaemon', false);
window.electronAPI.setTrayItemEnabled('startSync', this.daemonService.settings.noSync);
window.electronAPI.setTrayItemEnabled('stopSync', !this.daemonService.settings.noSync);
}
}
}

View file

@ -143,6 +143,7 @@ export class DaemonService {
console.debug(code);
this.onClose();
});
}
public async disableSync(): Promise<void> {

View file

@ -144,6 +144,14 @@ declare global {
isAutoLaunched: () => void;
onIsAutoLaunched: (callback: (event: any, isAutoLaunched: boolean) => void) => void;
unregisterOnIsAutoLaunched: () => void;
onTrayStartDaemon: (callback: (event: any) => void) => void;
onTrayStopDaemon: (callback: (event: any) => void) => void;
onTrayStartSync: (callback: (event: any) => void) => void;
onTrayStopSync: (callback: (event: any) => void) => void;
onTrayQuitDaemon: (callback: (event: any) => void) => void;
setTrayItemEnabled: (id: string, enabled: boolean) => void;
setTrayToolTip: (toolTip: string) => void;
};
}
}