2019-03-22 01:18:13 +00:00
|
|
|
'use strict';
|
|
|
|
|
2019-06-14 15:29:52 +00:00
|
|
|
/**
|
|
|
|
* @module display
|
|
|
|
* Provides features for displaying a full screen display of images for the digital module.
|
|
|
|
**/
|
|
|
|
|
2019-03-22 01:18:13 +00:00
|
|
|
import spawn = require('spawn');
|
2019-06-15 15:06:57 +00:00
|
|
|
import { join as pathJoin } from 'path';
|
2019-06-09 01:43:14 +00:00
|
|
|
import { delay } from 'delay';
|
|
|
|
import { exec } from 'exec';
|
2019-03-22 01:18:13 +00:00
|
|
|
|
|
|
|
const { BrowserWindow } = require('electron');
|
|
|
|
|
2019-06-15 15:06:57 +00:00
|
|
|
function padded_frame (i : number) {
|
|
|
|
let len = (i + '').length;
|
|
|
|
let str = i + '';
|
|
|
|
for (let x = 0; x < 5 - len; x++) {
|
|
|
|
str = '0' + str;
|
|
|
|
}
|
|
|
|
return str;
|
|
|
|
}
|
2019-03-22 01:18:13 +00:00
|
|
|
|
|
|
|
class WebView {
|
2019-03-22 02:33:30 +00:00
|
|
|
private digitalWindow : any;
|
2019-03-22 02:55:12 +00:00
|
|
|
public opened : boolean = false;
|
2019-03-22 02:33:30 +00:00
|
|
|
public showing : boolean = false;
|
2019-03-22 01:18:13 +00:00
|
|
|
constructor() {
|
2019-03-22 02:33:30 +00:00
|
|
|
this.digitalWindow = new BrowserWindow({
|
2019-03-22 01:18:13 +00:00
|
|
|
webPreferences: {
|
|
|
|
nodeIntegration: true,
|
|
|
|
allowRunningInsecureContent: false,
|
|
|
|
'unsafe-eval' : false
|
|
|
|
},
|
|
|
|
width: 800,
|
|
|
|
height: 600,
|
|
|
|
minWidth : 800,
|
|
|
|
minHeight : 600//,
|
|
|
|
//icon: path.join(__dirname, '../../assets/icons/icon.png')
|
|
|
|
});
|
2019-03-22 02:33:30 +00:00
|
|
|
this.digitalWindow.loadURL('file://' + __dirname + '../../../display.html');
|
2019-03-22 01:18:13 +00:00
|
|
|
if (process.argv.indexOf('-d') !== -1 || process.argv.indexOf('--dev') !== -1) {
|
2019-03-22 02:33:30 +00:00
|
|
|
this.digitalWindow.webContents.openDevTools();
|
2019-03-22 01:18:13 +00:00
|
|
|
}
|
2019-03-22 02:33:30 +00:00
|
|
|
this.digitalWindow.on('closed', () => {
|
|
|
|
this.digitalWindow = null
|
2019-03-22 01:18:13 +00:00
|
|
|
});
|
2019-03-22 02:33:30 +00:00
|
|
|
this.digitalWindow.hide();
|
|
|
|
}
|
|
|
|
async open () {
|
|
|
|
this.digitalWindow.show();
|
|
|
|
this.showing = true;
|
|
|
|
this.opened = true;
|
|
|
|
await this.digitalWindow.maximize();
|
2019-06-15 15:06:57 +00:00
|
|
|
await delay(300);
|
2019-03-22 01:18:13 +00:00
|
|
|
}
|
2019-06-15 15:06:57 +00:00
|
|
|
async show (src : string) {
|
2019-03-22 02:33:30 +00:00
|
|
|
try {
|
|
|
|
this.digitalWindow.webContents.send('display', { src });
|
|
|
|
} catch (err) {
|
|
|
|
console.error(err)
|
|
|
|
}
|
2019-06-15 15:06:57 +00:00
|
|
|
this.showing = true;
|
|
|
|
await delay(100)
|
|
|
|
return true
|
2019-03-22 01:18:13 +00:00
|
|
|
}
|
2019-03-22 02:33:30 +00:00
|
|
|
hide () {
|
|
|
|
if (this.digitalWindow) {
|
|
|
|
this.digitalWindow.hide();
|
|
|
|
}
|
|
|
|
this.showing = false;
|
2019-06-15 15:06:57 +00:00
|
|
|
return true
|
2019-03-22 01:18:13 +00:00
|
|
|
}
|
2019-03-22 02:33:30 +00:00
|
|
|
close () {
|
2019-06-15 15:06:57 +00:00
|
|
|
this.hide();
|
2019-03-22 02:33:30 +00:00
|
|
|
if (this.digitalWindow) {
|
|
|
|
this.digitalWindow.close();
|
|
|
|
this.digitalWindow = null;
|
2019-03-22 01:18:13 +00:00
|
|
|
}
|
2019-03-22 02:33:30 +00:00
|
|
|
this.opened = false;
|
2019-03-22 01:18:13 +00:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-15 15:06:57 +00:00
|
|
|
class EOG {
|
|
|
|
private cp : any;
|
|
|
|
constructor () {
|
2019-03-22 01:18:13 +00:00
|
|
|
|
2019-06-15 15:06:57 +00:00
|
|
|
}
|
2019-03-22 01:18:13 +00:00
|
|
|
|
2019-06-15 15:06:57 +00:00
|
|
|
public open () {
|
|
|
|
this.hide();
|
2019-03-22 01:18:13 +00:00
|
|
|
}
|
|
|
|
|
2019-06-15 15:06:57 +00:00
|
|
|
public async show (src : string) {
|
|
|
|
//timeout 3 eog --fullscreen ${src}
|
|
|
|
this.cp = spawn('eog', ['--fullscreen', src]);
|
|
|
|
await delay(200)
|
|
|
|
return true
|
|
|
|
}
|
2019-03-22 01:18:13 +00:00
|
|
|
|
2019-06-15 15:06:57 +00:00
|
|
|
public hide () {
|
|
|
|
if (this.cp) {
|
|
|
|
this.cp.kill();
|
|
|
|
this.cp = null;
|
|
|
|
}
|
2019-03-22 01:18:13 +00:00
|
|
|
}
|
2019-06-15 15:06:57 +00:00
|
|
|
public close () {
|
|
|
|
this.hide();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class Display {
|
|
|
|
private platform : string;
|
|
|
|
private tmpdir : string;
|
|
|
|
private wv : WebView;
|
|
|
|
private eog : EOG;
|
|
|
|
|
|
|
|
constructor (sys : any) {
|
|
|
|
this.platform = sys.platform;
|
|
|
|
this.tmpdir = pathJoin(sys.tmp, 'mcopy_digital');
|
|
|
|
}
|
|
|
|
public async open () {
|
|
|
|
if (this.platform !== 'nix') {
|
|
|
|
if (!this.wv || !this.wv.opened) {
|
|
|
|
this.wv = new WebView();
|
|
|
|
await this.wv.open()
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (!this.eog) {
|
|
|
|
this.eog = new EOG()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public async show (frame : number) {
|
|
|
|
let padded : string = padded_frame(frame);
|
|
|
|
let ext : string = 'tif';
|
|
|
|
let tmppath : string;
|
2019-03-22 01:18:13 +00:00
|
|
|
|
2019-06-15 15:06:57 +00:00
|
|
|
if (this.platform !== 'nix') {
|
|
|
|
ext = 'png';
|
|
|
|
}
|
2019-03-22 01:18:13 +00:00
|
|
|
|
2019-06-15 15:06:57 +00:00
|
|
|
tmppath = pathJoin(this.tmpdir, `export-${padded}.${ext}`);
|
2019-03-22 01:18:13 +00:00
|
|
|
|
2019-06-15 15:06:57 +00:00
|
|
|
if (this.platform !== 'nix') {
|
|
|
|
await this.wv.show(tmppath);
|
|
|
|
} else {
|
|
|
|
await this.eog.show(tmppath);
|
|
|
|
}
|
2019-03-22 02:33:30 +00:00
|
|
|
}
|
2019-06-15 15:06:57 +00:00
|
|
|
public hide () {
|
|
|
|
if (this.platform !== 'nix') {
|
|
|
|
//don't hide between frames
|
|
|
|
//this.wv.hide();
|
|
|
|
} else {
|
|
|
|
this.eog.hide();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public close () {
|
|
|
|
if (this.platform !== 'nix') {
|
|
|
|
this.wv.close()
|
|
|
|
} else {
|
|
|
|
this.eog.close()
|
|
|
|
}
|
2019-03-22 01:18:13 +00:00
|
|
|
}
|
2019-03-22 02:33:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = function (sys : any) {
|
2019-06-15 15:06:57 +00:00
|
|
|
return new Display(sys)
|
2019-03-22 01:18:13 +00:00
|
|
|
}
|