feat: save window state when closing agent (#902)

This commit is contained in:
Róbert Kiss
2019-01-30 02:47:23 +01:00
committed by László Monda
parent 2c041b64ff
commit 12d361eb2e
3 changed files with 94 additions and 3 deletions

View File

@@ -18,6 +18,7 @@ import { AppService } from './services/app.service';
import { SudoService } from './services/sudo.service'; import { SudoService } from './services/sudo.service';
import * as isDev from 'electron-is-dev'; import * as isDev from 'electron-is-dev';
import { setMenu } from './electron-menu'; import { setMenu } from './electron-menu';
import { loadWindowState, saveWindowState } from './util/window';
const optionDefinitions = [ const optionDefinitions = [
{name: 'addons', type: Boolean}, {name: 'addons', type: Boolean},
@@ -88,18 +89,28 @@ function createWindow() {
logger.info(`[Electron Main] packagesDir: ${packagesDir}`); logger.info(`[Electron Main] packagesDir: ${packagesDir}`);
const loadedWindowState = loadWindowState();
// Create the browser window. // Create the browser window.
win = new BrowserWindow({ win = new BrowserWindow({
title: 'UHK Agent', title: 'UHK Agent',
width: 1024, x: loadedWindowState.x,
height: 768, y: loadedWindowState.y,
width: loadedWindowState.width,
height: loadedWindowState.height,
webPreferences: { webPreferences: {
nodeIntegration: true nodeIntegration: true
}, },
icon: path.join(__dirname, 'renderer/assets/images/agent-app-icon.png') icon: path.join(__dirname, 'renderer/assets/images/agent-app-icon.png')
}); });
if (loadedWindowState.isFullScreen) {
win.setFullScreen(true);
} else if (loadedWindowState.isMaximized) {
win.maximize();
}
setMenu(win); setMenu(win);
win.maximize();
uhkHidDeviceService = new UhkHidDevice(logger, options, packagesDir); uhkHidDeviceService = new UhkHidDevice(logger, options, packagesDir);
uhkOperations = new UhkOperations(logger, uhkHidDeviceService, packagesDir); uhkOperations = new UhkOperations(logger, uhkHidDeviceService, packagesDir);
deviceService = new DeviceService(logger, win, uhkHidDeviceService, uhkOperations, packagesDir); deviceService = new DeviceService(logger, win, uhkHidDeviceService, uhkOperations, packagesDir);
@@ -140,6 +151,10 @@ function createWindow() {
win.webContents.on('crashed', (event: any) => { win.webContents.on('crashed', (event: any) => {
logger.error(event); logger.error(event);
}); });
win.on('close', () => saveWindowState(win));
win.on('resize', () => saveWindowState(win));
win.on('move', () => saveWindowState(win));
} }
// This method will be called when Electron has finished // This method will be called when Electron has finished

View File

@@ -0,0 +1,6 @@
import { Rectangle } from 'electron';
export interface WindowState extends Rectangle {
isMaximized: boolean;
isFullScreen: boolean;
}

View File

@@ -0,0 +1,70 @@
import * as electron from 'electron';
import * as settings from 'electron-settings';
import { logger } from '../services/logger.service';
import { WindowState } from '../models/window-state';
const WINDOWS_SETTINGS_KEY = 'windowSettings';
export const windowVisibleFilter = (state: WindowState) => {
return (display: electron.Display): boolean => (
state.x >= display.bounds.x &&
state.y >= display.bounds.y &&
state.x <= display.bounds.width &&
state.y <= display.bounds.height
);
};
export const windowVisibleOnScreen = (state: WindowState): boolean => {
return electron.screen.getAllDisplays().some(windowVisibleFilter(state));
};
export const getDefaultWindowState = () => ({
width: 1024,
height: 768,
isMaximized: true
});
export const loadWindowState = (): Partial<WindowState> => {
logger.log('[WindowState] load settings');
try {
const loadedState = settings.get(WINDOWS_SETTINGS_KEY) as any;
logger.log('[WindowState] loaded settings', loadedState);
if (!loadedState) {
logger.log('[WindowState]save state not exists, use default');
return getDefaultWindowState();
}
const visible = windowVisibleOnScreen(loadedState);
logger.log('[WindowState] loaded settings is visible', visible);
if (visible) {
logger.log('[WindowState] return with loaded settings');
return loadedState;
}
} catch (err) {
logger.error('[WindowState] error when parsing loaded settings', err);
}
logger.log('[WindowState] return with default settings');
return getDefaultWindowState();
};
export const saveWindowState = (win: electron.BrowserWindow) => {
const winBounds = win.isMaximized() || win.isFullScreen()
? loadWindowState() as any
: win.getBounds();
const state: WindowState = {
...winBounds,
isMaximized: win.isMaximized(),
isFullScreen: win.isFullScreen()
};
logger.log('[WindowState] save settings:', state);
settings.set(WINDOWS_SETTINGS_KEY, state as any);
logger.log('[WindowState] save settings success');
};