mirror of
https://github.com/bitwarden/browser.git
synced 2024-11-27 12:36:14 +01:00
move tray to jslib
This commit is contained in:
parent
e7779759f2
commit
9de9c1655c
129
src/electron/tray.main.ts
Normal file
129
src/electron/tray.main.ts
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
import {
|
||||||
|
Menu,
|
||||||
|
MenuItem,
|
||||||
|
MenuItemConstructorOptions,
|
||||||
|
nativeImage,
|
||||||
|
Tray,
|
||||||
|
} from 'electron';
|
||||||
|
import * as path from 'path';
|
||||||
|
|
||||||
|
import { I18nService } from '../abstractions/i18n.service';
|
||||||
|
import { StorageService } from '../abstractions/storage.service';
|
||||||
|
|
||||||
|
import { ElectronConstants } from './electronConstants';
|
||||||
|
import { WindowMain } from './window.main';
|
||||||
|
|
||||||
|
export class TrayMain {
|
||||||
|
contextMenu: Menu;
|
||||||
|
|
||||||
|
private appName: string;
|
||||||
|
private tray: Tray;
|
||||||
|
private icon: string | Electron.NativeImage;
|
||||||
|
private pressedIcon: Electron.NativeImage;
|
||||||
|
|
||||||
|
constructor(private windowMain: WindowMain, private i18nService: I18nService,
|
||||||
|
private storageService: StorageService) {
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
this.icon = path.join(__dirname, '/images/icon.ico');
|
||||||
|
} else if (process.platform === 'darwin') {
|
||||||
|
const nImage = nativeImage.createFromPath(path.join(__dirname, '/images/icon-template.png'));
|
||||||
|
nImage.setTemplateImage(true);
|
||||||
|
this.icon = nImage;
|
||||||
|
this.pressedIcon = nativeImage.createFromPath(path.join(__dirname, '/images/icon-highlight.png'));
|
||||||
|
} else {
|
||||||
|
this.icon = path.join(__dirname, '/images/icon.png');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(appName: string, additionalMenuItems: MenuItemConstructorOptions[] = null) {
|
||||||
|
this.appName = appName;
|
||||||
|
|
||||||
|
const menuItemOptions: MenuItemConstructorOptions[] = [{
|
||||||
|
label: this.i18nService.t('showHide'),
|
||||||
|
click: () => this.toggleWindow(),
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
label: process.platform === 'darwin' ? this.i18nService.t('close') : this.i18nService.t('exit'),
|
||||||
|
click: () => this.closeWindow(),
|
||||||
|
}];
|
||||||
|
|
||||||
|
if (additionalMenuItems != null) {
|
||||||
|
menuItemOptions.splice(1, 0, ...additionalMenuItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.contextMenu = Menu.buildFromTemplate(menuItemOptions);
|
||||||
|
if (await this.storageService.get<boolean>(ElectronConstants.enableTrayKey)) {
|
||||||
|
this.showTray();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
this.windowMain.win.on('minimize', async (e: Event) => {
|
||||||
|
if (await this.storageService.get<boolean>(ElectronConstants.enableMinimizeToTrayKey)) {
|
||||||
|
e.preventDefault();
|
||||||
|
this.hideToTray();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
this.windowMain.win.on('show', async (e: Event) => {
|
||||||
|
const enableTray = await this.storageService.get<boolean>(ElectronConstants.enableTrayKey);
|
||||||
|
if (!enableTray) {
|
||||||
|
this.removeTray(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
removeTray(showWindow = true) {
|
||||||
|
if (this.tray != null) {
|
||||||
|
this.tray.destroy();
|
||||||
|
this.tray = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showWindow && this.windowMain.win != null && !this.windowMain.win.isVisible()) {
|
||||||
|
this.windowMain.win.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hideToTray() {
|
||||||
|
this.showTray();
|
||||||
|
if (this.windowMain.win != null) {
|
||||||
|
this.windowMain.win.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
showTray() {
|
||||||
|
if (this.tray != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.tray = new Tray(this.icon);
|
||||||
|
this.tray.setToolTip(this.appName);
|
||||||
|
this.tray.on('click', () => this.toggleWindow());
|
||||||
|
|
||||||
|
if (this.pressedIcon != null) {
|
||||||
|
this.tray.setPressedImage(this.pressedIcon);
|
||||||
|
}
|
||||||
|
if (this.contextMenu != null) {
|
||||||
|
this.tray.setContextMenu(this.contextMenu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private toggleWindow() {
|
||||||
|
if (this.windowMain.win == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.windowMain.win.isVisible()) {
|
||||||
|
this.windowMain.win.hide();
|
||||||
|
} else {
|
||||||
|
this.windowMain.win.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private closeWindow() {
|
||||||
|
if (this.windowMain.win != null) {
|
||||||
|
this.windowMain.win.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user