ucap-lg-desktop/src/app/windows/app.window.ts
Park Byung Eun 5ccfc1260b sync
2020-08-10 14:05:14 +09:00

170 lines
4.7 KiB
TypeScript

import * as Electron from 'electron';
import log from 'electron-log';
import * as windowStateKeeper from 'electron-window-state';
import { BrowserWindowChannel, AppChannel } from '@ucap/electron-core';
import { AppApi, BrowserWindowApi, IpcMainApi } from '@ucap/electron-common';
import { WindowState } from '@ucap/native';
import { WindowChannel } from '@ucap/electron-native';
import { AppLoggerService } from '../services/app-logger.service';
const MIN_WIDTH = 420;
const MIN_HEIGHT = 640;
const DEFAULT_WIDTH = 820;
const DEFAULT_HEIGHT = 650;
let savedWindowState: windowStateKeeper.State;
@BrowserWindowApi.BrowserWindowSettings({
constructorOptions: (appConfiguration: AppApi.AppConfiguration) => {
savedWindowState = windowStateKeeper({
defaultWidth: DEFAULT_WIDTH,
defaultHeight: DEFAULT_HEIGHT
});
return {
x: savedWindowState.x,
y: savedWindowState.y,
width: savedWindowState.width,
height: savedWindowState.height,
minWidth: MIN_WIDTH,
minHeight: MIN_HEIGHT,
center: true,
backgroundColor: '#fff',
webPreferences: {
// Disable auxclick event
// See https://developers.google.com/web/updates/2016/10/auxclick
disableBlinkFeatures: 'Auxclick',
// Enable, among other things, the ResizeObserver
experimentalFeatures: true,
nodeIntegration: true
},
acceptFirstMouse: true,
icon: appConfiguration.assets.appIcon,
titleBarStyle: __DARWIN__ ? 'hidden' : 'default',
frame: __WIN32__ || __LINUX__ ? false : true
};
}
})
export class AppWindow implements BrowserWindowApi.ElectronBrowserWindow {
static readonly ucapClassName: string = 'appWindow';
appLoggerService: AppLoggerService;
constructor(
private configuration: BrowserWindowApi.BrowserWindowConfiguration,
public native: Electron.BrowserWindow
) {
savedWindowState.manage(native);
}
@BrowserWindowApi.On(BrowserWindowChannel.readyToShow)
onReadyToShow() {
log.info('BrowserWindowChannel.ReadyToShow');
}
@BrowserWindowApi.On(BrowserWindowChannel.close)
onClose() {
log.info('BrowserWindowChannel.Close');
}
@BrowserWindowApi.On(BrowserWindowChannel.closed)
onClosed() {
log.info('BrowserWindowChannel.Closed');
}
@BrowserWindowApi.On(BrowserWindowChannel.focus)
onFocus() {
this.sendWindowFocus(true);
}
@BrowserWindowApi.On(BrowserWindowChannel.blur)
onBlur() {
this.sendWindowFocus(false);
}
@BrowserWindowApi.On(BrowserWindowChannel.enterFullScreen)
onEnterFullScreen() {
this.sendWindowState(WindowState.FullScreen);
}
@BrowserWindowApi.On(BrowserWindowChannel.leaveFullScreen)
onLeaveFullScreen() {
this.sendWindowState(this.windowState());
}
@BrowserWindowApi.On(BrowserWindowChannel.minimize)
onMinimize() {
this.sendWindowState(WindowState.Minimized);
}
@BrowserWindowApi.On(BrowserWindowChannel.maximize)
onMaximize() {
this.sendWindowState(WindowState.Maximized);
}
@BrowserWindowApi.On(BrowserWindowChannel.unmaximize)
onUnmaximize() {
this.sendWindowState(WindowState.Normal);
}
@BrowserWindowApi.On(BrowserWindowChannel.restore)
onRestore() {
this.sendWindowState(WindowState.Normal);
}
@BrowserWindowApi.On(BrowserWindowChannel.hide)
onHide() {
this.sendWindowState(WindowState.Hidden);
}
@BrowserWindowApi.On(BrowserWindowChannel.show)
onShow() {
this.sendWindowState(this.windowState());
}
@IpcMainApi.Handle(WindowChannel.state)
async handleState(event: Electron.IpcMainEvent): Promise<WindowState> {
this.appLoggerService.debug('handleState');
return this.windowState();
}
@IpcMainApi.Handle(WindowChannel.focused)
async handleFocused(event: Electron.IpcMainEvent): Promise<boolean> {
this.appLoggerService.debug('handleFocused');
return this.native.isFocused();
}
private attachHandlers() {
this.attachAppHandlers();
}
private attachAppHandlers() {
Electron.app.on(AppChannel.beforeQuit, (event: Electron.Event) => {
log.info('AppChannel.BeforeQuit');
});
}
private sendWindowFocus(focus: boolean) {
this.native.webContents.send(WindowChannel.onFocus$, focus);
}
private sendWindowState(windowState: WindowState) {
this.native.webContents.send(WindowChannel.onState$, windowState);
}
private windowState(): WindowState {
if (this.native.isFullScreen()) {
return WindowState.FullScreen;
} else if (this.native.isMaximized()) {
return WindowState.Maximized;
} else if (this.native.isMinimized()) {
return WindowState.Minimized;
} else if (!this.native.isVisible()) {
return WindowState.Hidden;
} else {
return WindowState.Normal;
}
}
}