|
@@ -1,165 +1,73 @@
|
|
|
-const { app: electronApp } = require('electron');
|
|
|
|
|
-const { autoUpdater } = require("electron-updater");
|
|
|
|
|
-const is = require('ee-core/utils/is');
|
|
|
|
|
|
|
+const { Tray, Menu } = require('electron');
|
|
|
|
|
+const path = require('path');
|
|
|
|
|
+const Ps = require('ee-core/ps');
|
|
|
const Log = require('ee-core/log');
|
|
const Log = require('ee-core/log');
|
|
|
-const Conf = require('ee-core/config');
|
|
|
|
|
|
|
+const Electron = require('ee-core/electron');
|
|
|
const CoreWindow = require('ee-core/electron/window');
|
|
const CoreWindow = require('ee-core/electron/window');
|
|
|
|
|
+const Conf = require('ee-core/config');
|
|
|
|
|
+const EE = require('ee-core/ee');
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 自动升级插件
|
|
|
|
|
|
|
+ * 托盘插件
|
|
|
* @class
|
|
* @class
|
|
|
*/
|
|
*/
|
|
|
-class AutoUpdaterAddon {
|
|
|
|
|
|
|
+class TrayAddon {
|
|
|
|
|
|
|
|
constructor() {
|
|
constructor() {
|
|
|
|
|
+ this.tray = null;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 创建
|
|
|
|
|
|
|
+ * 创建托盘
|
|
|
*/
|
|
*/
|
|
|
create () {
|
|
create () {
|
|
|
- Log.info('[addon:autoUpdater] load');
|
|
|
|
|
- const cfg = Conf.getValue('addons.autoUpdater');
|
|
|
|
|
- if ((is.windows() && cfg.windows)
|
|
|
|
|
- || (is.macOS() && cfg.macOS)
|
|
|
|
|
- || (is.linux() && cfg.linux))
|
|
|
|
|
- {
|
|
|
|
|
- // continue
|
|
|
|
|
- } else {
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 是否检查更新
|
|
|
|
|
- if (cfg.force) {
|
|
|
|
|
- this.checkUpdate();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- const status = {
|
|
|
|
|
- error: -1,
|
|
|
|
|
- available: 1,
|
|
|
|
|
- noAvailable: 2,
|
|
|
|
|
- downloading: 3,
|
|
|
|
|
- downloaded: 4,
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // 开发环境,代码热更新开启时,会导致托盘中有残影
|
|
|
|
|
+ if (Ps.isDev() && Ps.isHotReload()) return;
|
|
|
|
|
+
|
|
|
|
|
+ Log.info('[addon:tray] load');
|
|
|
|
|
+ const { CoreApp } = EE;
|
|
|
|
|
+ const cfg = Conf.getValue('addons.tray');
|
|
|
|
|
+ const mainWindow = CoreWindow.getMainWindow();
|
|
|
|
|
|
|
|
- const version = electronApp.getVersion();
|
|
|
|
|
- Log.info('[addon:autoUpdater] current version: ', version);
|
|
|
|
|
|
|
+ // 托盘图标
|
|
|
|
|
+ let iconPath = path.join(Ps.getHomeDir(), cfg.icon);
|
|
|
|
|
|
|
|
- // 设置下载服务器地址
|
|
|
|
|
- let server = cfg.options.url;
|
|
|
|
|
- let lastChar = server.substring(server.length - 1);
|
|
|
|
|
- server = lastChar === '/' ? server : server + "/";
|
|
|
|
|
- //Log.info('[addon:autoUpdater] server: ', server);
|
|
|
|
|
- cfg.options.url = server;
|
|
|
|
|
-
|
|
|
|
|
- // 是否后台自动下载
|
|
|
|
|
- autoUpdater.autoDownload = cfg.force ? true : false;
|
|
|
|
|
-
|
|
|
|
|
- try {
|
|
|
|
|
- autoUpdater.setFeedURL(cfg.options);
|
|
|
|
|
- } catch (error) {
|
|
|
|
|
- Log.error('[addon:autoUpdater] setFeedURL error : ', error);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- autoUpdater.on('checking-for-update', () => {
|
|
|
|
|
- //sendStatusToWindow('正在检查更新...');
|
|
|
|
|
- })
|
|
|
|
|
- autoUpdater.on('update-available', (info) => {
|
|
|
|
|
- info.status = status.available;
|
|
|
|
|
- info.desc = '有可用更新';
|
|
|
|
|
- this.sendStatusToWindow(info);
|
|
|
|
|
- })
|
|
|
|
|
- autoUpdater.on('update-not-available', (info) => {
|
|
|
|
|
- info.status = status.noAvailable;
|
|
|
|
|
- info.desc = '没有可用更新';
|
|
|
|
|
- this.sendStatusToWindow(info);
|
|
|
|
|
- })
|
|
|
|
|
- autoUpdater.on('error', (err) => {
|
|
|
|
|
- let info = {
|
|
|
|
|
- status: status.error,
|
|
|
|
|
- desc: err
|
|
|
|
|
|
|
+ // 托盘菜单功能列表
|
|
|
|
|
+ let trayMenuTemplate = [
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '显示',
|
|
|
|
|
+ click: function () {
|
|
|
|
|
+ mainWindow.show();
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ label: '退出',
|
|
|
|
|
+ click: function () {
|
|
|
|
|
+ CoreApp.appQuit();
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- this.sendStatusToWindow(info);
|
|
|
|
|
- })
|
|
|
|
|
- autoUpdater.on('download-progress', (progressObj) => {
|
|
|
|
|
- let percentNumber = parseInt(progressObj.percent);
|
|
|
|
|
- let totalSize = this.bytesChange(progressObj.total);
|
|
|
|
|
- let transferredSize = this.bytesChange(progressObj.transferred);
|
|
|
|
|
- let text = '已下载 ' + percentNumber + '%';
|
|
|
|
|
- text = text + ' (' + transferredSize + "/" + totalSize + ')';
|
|
|
|
|
|
|
+ ]
|
|
|
|
|
|
|
|
- let info = {
|
|
|
|
|
- status: status.downloading,
|
|
|
|
|
- desc: text,
|
|
|
|
|
- percentNumber: percentNumber,
|
|
|
|
|
- totalSize: totalSize,
|
|
|
|
|
- transferredSize: transferredSize
|
|
|
|
|
|
|
+ // 点击关闭,最小化到托盘
|
|
|
|
|
+ mainWindow.on('close', (event) => {
|
|
|
|
|
+ if (Electron.extra.closeWindow == true) {
|
|
|
|
|
+ return;
|
|
|
}
|
|
}
|
|
|
- Log.info('[addon:autoUpdater] progress: ', text);
|
|
|
|
|
- this.sendStatusToWindow(info);
|
|
|
|
|
- })
|
|
|
|
|
- autoUpdater.on('update-downloaded', (info) => {
|
|
|
|
|
- info.status = status.downloaded;
|
|
|
|
|
- info.desc = '下载完成';
|
|
|
|
|
- this.sendStatusToWindow(info);
|
|
|
|
|
- autoUpdater.quitAndInstall();
|
|
|
|
|
- // const mainWindow = CoreWindow.getMainWindow();
|
|
|
|
|
- // if (mainWindow) {
|
|
|
|
|
- // mainWindow.destroy()
|
|
|
|
|
- // }
|
|
|
|
|
- // electronApp.appQuit()
|
|
|
|
|
|
|
+ mainWindow.hide();
|
|
|
|
|
+ event.preventDefault();
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+ // 实例化托盘
|
|
|
|
|
+ this.tray = new Tray(iconPath);
|
|
|
|
|
+ this.tray.setToolTip(cfg.title);
|
|
|
|
|
+ const contextMenu = Menu.buildFromTemplate(trayMenuTemplate);
|
|
|
|
|
+ this.tray.setContextMenu(contextMenu);
|
|
|
|
|
+ // 左键单击的时候能够显示主窗口
|
|
|
|
|
+ this.tray.on('click', () => {
|
|
|
|
|
+ mainWindow.show()
|
|
|
|
|
+ })
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 检查更新
|
|
|
|
|
- */
|
|
|
|
|
- checkUpdate () {
|
|
|
|
|
- autoUpdater.checkForUpdates();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 下载更新
|
|
|
|
|
- */
|
|
|
|
|
- download () {
|
|
|
|
|
- autoUpdater.downloadUpdate();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 向前端发消息
|
|
|
|
|
- */
|
|
|
|
|
- sendStatusToWindow(content = {}) {
|
|
|
|
|
- const textJson = JSON.stringify(content);
|
|
|
|
|
- const channel = 'app.updater';
|
|
|
|
|
- const win = CoreWindow.getMainWindow();
|
|
|
|
|
- win.webContents.send(channel, textJson);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 单位转换
|
|
|
|
|
- */
|
|
|
|
|
- bytesChange (limit) {
|
|
|
|
|
- let size = "";
|
|
|
|
|
- if(limit < 0.1 * 1024){
|
|
|
|
|
- size = limit.toFixed(2) + "B";
|
|
|
|
|
- }else if(limit < 0.1 * 1024 * 1024){
|
|
|
|
|
- size = (limit/1024).toFixed(2) + "KB";
|
|
|
|
|
- }else if(limit < 0.1 * 1024 * 1024 * 1024){
|
|
|
|
|
- size = (limit/(1024 * 1024)).toFixed(2) + "MB";
|
|
|
|
|
- }else{
|
|
|
|
|
- size = (limit/(1024 * 1024 * 1024)).toFixed(2) + "GB";
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- let sizeStr = size + "";
|
|
|
|
|
- let index = sizeStr.indexOf(".");
|
|
|
|
|
- let dou = sizeStr.substring(index + 1 , index + 3);
|
|
|
|
|
- if(dou == "00"){
|
|
|
|
|
- return sizeStr.substring(0, index) + sizeStr.substring(index + 3, index + 5);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return size;
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-AutoUpdaterAddon.toString = () => '[class AutoUpdaterAddon]';
|
|
|
|
|
-module.exports = AutoUpdaterAddon;
|
|
|
|
|
|
|
+TrayAddon.toString = () => '[class TrayAddon]';
|
|
|
|
|
+module.exports = TrayAddon;
|