This commit is contained in:
crusader 2018-08-17 09:10:51 +09:00
parent 2ff4e28720
commit 94f6acabc7
8 changed files with 121 additions and 14 deletions

53
@overflow/core/emitter.ts Normal file
View File

@ -0,0 +1,53 @@
import { Subject, PartialObserver } from 'rxjs';
export class Emitter {
private subjects: Map<string, Subject<any>>;
public constructor() {
this.subjects = new Map();
}
private static createName(name: string): string {
return '$' + name;
}
/**
* emit
*/
public emit(name: string, data?: any) {
const fnName = Emitter.createName(name);
if (!this.subjects.has(fnName)) {
this.subjects.set(fnName, new Subject());
}
this.subjects.get(fnName).next(data);
}
/**
* listen
*/
public listen(name: string, handler: (data?: any) => void) {
const fnName = Emitter.createName(name);
if (!this.subjects.has(fnName)) {
this.subjects.set(fnName, new Subject());
}
return this.subjects.get(fnName).subscribe(handler);
}
/**
* dispose
*/
public dispose() {
const _subjects = this.subjects;
_subjects.forEach((value: Subject<any>, key: string) => {
if (_subjects.has(key)) {
_subjects.get(key).unsubscribe();
}
});
this.subjects = new Map();
}
}

View File

@ -1,10 +1,21 @@
import { Component } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { ElectronProxyService } from '../commons/service/electron-proxy.service';
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
templateUrl: './app.component.html', templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'] styleUrls: ['./app.component.scss']
}) })
export class AppComponent { export class AppComponent implements OnInit {
title = 'scanner-app'; title = 'scanner-app';
public constructor(
private electronProxyService: ElectronProxyService,
) {
}
ngOnInit(): void {
this.electronProxyService.sendReady(performance.now());
}
} }

View File

@ -7,6 +7,8 @@ import { CommonsUIModule } from '@overflow/commons/ui/commons-ui.module';
import { AppRoutingModule } from './app-routing.module'; import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
import { CommonsModule } from '../commons/commons.module';
@NgModule({ @NgModule({
declarations: [ declarations: [
AppComponent AppComponent
@ -17,6 +19,7 @@ import { AppComponent } from './app.component';
BrowserAnimationsModule, BrowserAnimationsModule,
CommonsUIModule, CommonsUIModule,
CommonsModule,
], ],
providers: [], providers: [],
bootstrap: [AppComponent] bootstrap: [AppComponent]

View File

@ -0,0 +1,17 @@
import { NgModule, APP_INITIALIZER } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SERVICES } from './service';
@NgModule({
imports: [
CommonModule,
],
declarations: [
],
providers: [
...SERVICES,
]
})
export class CommonsModule { }

View File

@ -0,0 +1,17 @@
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { ipcRenderer } from 'electron';
@Injectable()
export class ElectronProxyService {
public constructor(
) {
}
public sendReady(time: number): void {
ipcRenderer.send('renderer-ready', time);
}
}

View File

@ -0,0 +1,5 @@
import { ElectronProxyService } from './electron-proxy.service';
export const SERVICES = [
ElectronProxyService,
];

View File

@ -1,7 +1,10 @@
import { BrowserWindow, ipcMain, Menu, app, dialog } from 'electron'; import { BrowserWindow, ipcMain, Menu, app, dialog } from 'electron';
import * as path from 'path'; import * as path from 'path';
import * as URL from 'url'; import * as URL from 'url';
import { EventEmitter } from 'events';
import { Subscription, PartialObserver } from 'rxjs';
import { Emitter } from '@overflow/core/emitter';
import { encodePathAsUrl } from '@overflow/core/path'; import { encodePathAsUrl } from '@overflow/core/path';
import { registerWindowStateChangedEvents } from '@overflow/core/window-state'; import { registerWindowStateChangedEvents } from '@overflow/core/window-state';
@ -14,7 +17,7 @@ let windowStateKeeper: any | null = null;
export class AppWindow { export class AppWindow {
private window: Electron.BrowserWindow; private window: Electron.BrowserWindow;
private emitter = new EventEmitter(); private emitter = new Emitter();
private _loadTime: number | null = null; private _loadTime: number | null = null;
private _rendererReadyTime: number | null = null; private _rendererReadyTime: number | null = null;
@ -42,7 +45,7 @@ export class AppWindow {
height: savedWindowState.height, height: savedWindowState.height,
minWidth: this.minWidth, minWidth: this.minWidth,
minHeight: this.minHeight, minHeight: this.minHeight,
show: true, show: false,
// This fixes subpixel aliasing on Windows // This fixes subpixel aliasing on Windows
// See https://github.com/atom/atom/commit/683bef5b9d133cb194b476938c77cc07fd05b972 // See https://github.com/atom/atom/commit/683bef5b9d133cb194b476938c77cc07fd05b972
backgroundColor: '#fff', backgroundColor: '#fff',
@ -61,11 +64,9 @@ export class AppWindow {
} else if (__WIN32__) { } else if (__WIN32__) {
windowOptions.frame = false; windowOptions.frame = false;
} else if (__LINUX__) { } else if (__LINUX__) {
// windowOptions.icon = path.join(__dirname, 'static', 'icon-logo.png'); windowOptions.icon = path.join(__dirname, 'static', 'icon-logo.png');
} }
console.log(windowOptions);
this.window = new BrowserWindow(windowOptions); this.window = new BrowserWindow(windowOptions);
savedWindowState.manage(this.window); savedWindowState.manage(this.window);
@ -159,7 +160,7 @@ export class AppWindow {
return; return;
} }
this.emitter.emit('did-load', null); this.emitter.emit('did-load');
} }
/** Is the page loaded and has the renderer signalled it's ready? */ /** Is the page loaded and has the renderer signalled it's ready? */
@ -175,8 +176,8 @@ export class AppWindow {
* Register a function to call when the window is done loading. At that point * Register a function to call when the window is done loading. At that point
* the page has loaded and the renderer has signalled that it is ready. * the page has loaded and the renderer has signalled that it is ready.
*/ */
public onDidLoad(fn: () => void): EventEmitter { public onDidLoad(fn: (data?: any) => void): Subscription {
return this.emitter.on('did-load', fn); return this.emitter.listen('did-load', fn);
} }
public isMinimized() { public isMinimized() {

View File

@ -48,7 +48,7 @@ process.on('uncaughtException', (error: Error) => {
handleUncaughtException(error); handleUncaughtException(error);
}); });
let handlingSquirrelEvent = false; const handlingSquirrelEvent = false;
// if (__WIN32__ && process.argv.length > 1) { // if (__WIN32__ && process.argv.length > 1) {
// const arg = process.argv[1]; // const arg = process.argv[1];
@ -78,7 +78,7 @@ let handlingSquirrelEvent = false;
// }); // });
// } // }
let isDuplicateInstance = false; const isDuplicateInstance = false;
// If we're handling a Squirrel event we don't want to enforce single instance. // If we're handling a Squirrel event we don't want to enforce single instance.
// We want to let the updated instance launch and do its work. It will then quit // We want to let the updated instance launch and do its work. It will then quit
// once it's done. // once it's done.
@ -426,7 +426,7 @@ function createWindow() {
} }
}); });
window.onDidLoad(() => { window.onDidLoad((data: any) => {
window.show(); window.show();
// window.sendLaunchTimingStats({ // window.sendLaunchTimingStats({
// mainReadyTime: readyTime!, // mainReadyTime: readyTime!,