UNPKG

gars_v2

Version:

Geo Assistant Research System

101 lines (84 loc) 3.12 kB
// This helper remembers the size and position of your windows (and restores // them in that place after app relaunch). // Can be used for more than one window, just construct many // instances of it and give each different name. import { app, BrowserWindow, screen } from 'electron'; import jetpack from 'fs-jetpack'; import path from 'path'; import url from 'url'; import env from '../env'; export default function(name, options) { var userDataDir = jetpack.cwd(app.getPath('userData')); var stateStoreFile = 'window-state-' + name + '.json'; var defaultSize = { width: options.width, height: options.height }; var state = {}; var win; var restore = function() { var restoredState = {}; try { restoredState = userDataDir.read(stateStoreFile, 'json'); } catch (err) { // For some reason json can't be read (might be corrupted). // No worries, we have defaults. } return Object.assign({}, defaultSize, restoredState); }; var getCurrentPosition = function() { var position = win.getPosition(); var size = win.getSize(); return { x: position[0], y: position[1], width: size[0], height: size[1] }; }; var windowWithinBounds = function(windowState, bounds) { return windowState.x >= bounds.x && windowState.y >= bounds.y && windowState.x + windowState.width <= bounds.x + bounds.width && windowState.y + windowState.height <= bounds.y + bounds.height; }; var resetToDefaults = function(windowState) { var bounds = screen.getPrimaryDisplay().bounds; return Object.assign({}, defaultSize, { x: (bounds.width - defaultSize.width) / 2, y: (bounds.height - defaultSize.height) / 2 }); }; var ensureVisibleOnSomeDisplay = function(windowState) { var visible = screen.getAllDisplays().some(function(display) { return windowWithinBounds(windowState, display.bounds); }); if (!visible) { // Window is partially or fully not visible now. // Reset it to safe defaults. return resetToDefaults(windowState); } return windowState; }; var saveState = function() { if (!win.isMinimized() && !win.isMaximized()) { Object.assign(state, getCurrentPosition()); } userDataDir.write(stateStoreFile, state, { atomic: true }); }; state = ensureVisibleOnSomeDisplay(restore()); win = new BrowserWindow(Object.assign({ show: false }, options, state)); win.loadURL(url.format({ pathname: options.pathname, protocol: 'file:', slashes: true })); if (env.name === 'development') { win.openDevTools(); } win.once('ready-to-show', () => { win.show() }); win.on('close', saveState); return win; }