From ae1a6c201bf0f439f0ee57875c865bb15830baa1 Mon Sep 17 00:00:00 2001 From: npmrun <62639956+npmrun@users.noreply.github.com> Date: Mon, 2 Aug 2021 00:29:56 +0800 Subject: [PATCH] add --- .gitignore | 1 + a.md | 6 +- resource/electron/static/font/Mouse.otf | Bin 0 -> 10760 bytes resource/electron/static/font/bb3273.ttf | Bin 0 -> 16600 bytes resource/electron/static/icon.png | Bin 18332 -> 13816 bytes src/main/disk.ts | 63 --------- src/main/facilities/float/index.ts | 120 +++++++++++++++++ src/main/facilities/index.ts | 100 ++++++++++++-- src/main/facilities/main/index.ts | 31 +++++ src/main/facilities/tray/index.ts | 64 +++++++++ src/main/float.ts | 119 ----------------- src/main/index.dev.ts | 4 +- src/main/index.ts | 169 ++++++++++++------------ src/main/menu copy.ts | 66 ---------- src/main/menu.ts | 189 --------------------------- src/main/share/index.ts | 17 ++- src/render/assets/style/_font.scss | 7 + src/render/views/Home/index.module.scss | 14 ++ src/render/views/Home/index.tsx | 37 ++---- src/render/views/Home/usePositionElectron.ts | 32 +++++ src/render/views/Home/useTime.ts | 55 ++++++++ 21 files changed, 528 insertions(+), 566 deletions(-) create mode 100644 resource/electron/static/font/Mouse.otf create mode 100644 resource/electron/static/font/bb3273.ttf delete mode 100644 src/main/disk.ts create mode 100644 src/main/facilities/float/index.ts create mode 100644 src/main/facilities/main/index.ts create mode 100644 src/main/facilities/tray/index.ts delete mode 100644 src/main/float.ts delete mode 100644 src/main/menu copy.ts delete mode 100644 src/main/menu.ts create mode 100644 src/render/views/Home/index.module.scss create mode 100644 src/render/views/Home/usePositionElectron.ts create mode 100644 src/render/views/Home/useTime.ts diff --git a/.gitignore b/.gitignore index 4444cf2..7aa3eac 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ out .idea .vscode dist/electron +计划.md diff --git a/a.md b/a.md index a78bee5..cd154ec 100644 --- a/a.md +++ b/a.md @@ -12,4 +12,8 @@ https://www.jianshu.com/p/4699b825d285 <!-- 切换 --> https://github.com/webpack/webpack/issues/11767 - https://vite-rollup-plugins.patak.dev/ \ No newline at end of file + https://vite-rollup-plugins.patak.dev/ + + + https://www.npmjs.com/package/node-schedule + https://www.electronjs.org/community \ No newline at end of file diff --git a/resource/electron/static/font/Mouse.otf b/resource/electron/static/font/Mouse.otf new file mode 100644 index 0000000000000000000000000000000000000000..d4ebdac1083258d27979aab1a76f326b581c4872 GIT binary patch literal 10760 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 AYXATM literal 0 HcmV?d00001 diff --git a/resource/electron/static/font/bb3273.ttf b/resource/electron/static/font/bb3273.ttf new file mode 100644 index 0000000000000000000000000000000000000000..563bee52291a869ecd21d21fadc8737923ce891c GIT binary patch literal 16600 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 literal 0 HcmV?d00001 diff --git a/resource/electron/static/icon.png b/resource/electron/static/icon.png index b3ab3b8fecc7be9493f89bea4e44cb47eb9aa5e8..7c43276a1e6c4fb719f06cd480958abcdc431b38 100644 GIT binary patch literal 13816 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 Szo%mX0J4&b64hcxf&T+CwjIa- literal 18332 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 Qr|vL#y85}Sb4q9e0A~G3KL7v# diff --git a/src/main/disk.ts b/src/main/disk.ts deleted file mode 100644 index a6e82e8..0000000 --- a/src/main/disk.ts +++ /dev/null @@ -1,63 +0,0 @@ -import Shared from "./share" -import { Menu, Tray, ipcMain, BrowserWindow, App } from "electron" -const path = require("path") - -// 隐藏主窗口,并创建托盘,绑定关闭事件 -export default function setTray(app: App, mainWindow: BrowserWindow) { - if (Shared.data.miniWindow) { - mainWindow.hide() - return - } - // 用一个 Tray 来表示一个图标,这个图标处于正在运行的系统的通知区 - // 通常被添加到一个 context menu 上. - // 系统托盘右键菜单 - const trayMenuTemplate = [ - { - // 系统托盘图标目录 - label: "打开主窗口", - click: () => { - mainWindow.show() - }, - }, - { - // 系统托盘图标目录 - label: "打开悬浮窗", - click: () => { - ipcMain.emit("showSuspensionWindow") - }, - }, - { - // 系统托盘图标目录 - label: "退出", - click: () => { - Shared.data.forceClose = true - app.quit() - }, - }, - ] - // 设置系统托盘图标 - const iconPath = path.join(__static, "/icon.png") - - Shared.data.miniWindow = new Tray(iconPath) - - // 图标的上下文菜单 - const contextMenu = Menu.buildFromTemplate(trayMenuTemplate) - - // 展示主窗口,隐藏主窗口 mainWindow.hide() - mainWindow.hide() - - // 设置托盘悬浮提示 - Shared.data.miniWindow.setToolTip("never forget") - - // 设置托盘菜单 - Shared.data.miniWindow.setContextMenu(contextMenu) - - // 单击托盘小图标显示应用 - Shared.data.miniWindow.on("double-click", () => { - // 显示主程序 - mainWindow.show() - // 关闭托盘显示 - // Shared.data.miniWindow.destroy(); - }) - return Shared.data.miniWindow -} diff --git a/src/main/facilities/float/index.ts b/src/main/facilities/float/index.ts new file mode 100644 index 0000000..335d989 --- /dev/null +++ b/src/main/facilities/float/index.ts @@ -0,0 +1,120 @@ +import { app, BrowserWindow, ipcMain, Menu, screen, shell } from "electron" +import Shared from "@main/share" +import { getFileUrl } from "@main/util" +// webContents +// console.log(webContents.getAllWebContents()) + +const window: any = null //BrowserWindow.fromWebContents(webContents.getFocusedWebContents()) + +ipcMain.on("@float:setPosition", (event, x, y) => { + Shared.data.floatWindow?.setPosition(x, y) +}) + +ipcMain.on("showSuspensionWindow", () => { + if (Shared.data.floatWindow) { + if (Shared.data.floatWindow.isVisible()) { + // createSuspensionWindow() + } else { + Shared.data.floatWindow.showInactive() + } + } else { + createSuspensionWindow() + } +}) + +ipcMain.on("createSuspensionMenu", e => { + const rightM = Menu.buildFromTemplate([ + { label: "添加闹钟", enabled: false }, + { label: "暂停全部任务", enabled: false }, + { + label: "本次传输完自动关机", + click: () => { + ipcMain.emit("@func:buildin:saveData", 32232) + } + }, + { type: "separator" }, + { + label: "隐藏悬浮窗", + click: () => { + if (window) { + window.webContents.send("hideSuspension", false) + } + Shared.data.floatWindow?.hide() + } + }, + { + label: "打开主窗口", + click: () => { + // && !Shared.data.mainWindow.isVisible() + if (Shared.data.mainWindow) { + Shared.data.mainWindow.show() + } + // window.webContents.send('hideSuspension', false) + } + }, + { type: "separator" }, + { + label: "加入qq群", + click: () => { + shell.openExternal( + "tencent://groupwpa/?subcmd=all¶m=7B2267726F757055696E223A3831343237303636392C2274696D655374616D70223A313533393531303138387D0A" + ) + } + }, + { + label: "GitHub地址", + click: () => { + shell.openExternal("https://github.com/lihaotian0607/auth") + } + }, + { + label: "退出软件", + click: () => { + Shared.data.forceClose = true + app.quit() + } + } + ]) + rightM.popup({}) +}) + +function createSuspensionWindow() { + Shared.data.floatWindow = new BrowserWindow({ + width: 260, // 悬浮窗口的宽度 比实际DIV的宽度要多2px 因为有1px的边框 + height: 95, // 悬浮窗口的高度 比实际DIV的高度要多2px 因为有1px的边框 + type: "toolbar", // 创建的窗口类型为工具栏窗口 + frame: false, // 要创建无边框窗口 + resizable: false, // 禁止窗口大小缩放 + show: false, // 先不让窗口显示 + webPreferences: { + devTools: false, // 关闭调试工具 + nodeIntegration: true, + contextIsolation: false + }, + transparent: true, // 设置透明 + alwaysOnTop: true // 窗口是否总是显示在其他窗口之前 + }) + const size = screen.getPrimaryDisplay().workAreaSize // 获取显示器的宽高 + const winSize = Shared.data.floatWindow.getSize() // 获取窗口宽高 + // 设置窗口的位置 注意x轴要桌面的宽度 - 窗口的宽度 + Shared.data.floatWindow.setPosition(size.width - winSize[0], size.height - winSize[1] - 40) + // Shared.data.floatWindow.setPosition(size.width / 2, size.height / 2) + + Shared.data.floatWindow.loadURL(getFileUrl("")) + + Shared.data.floatWindow.once("ready-to-show", () => { + Shared.data.floatWindow?.show() + }) + // Shared.data.floatWindow.on("double-click", () => { + // alert(123) + // }) + Shared.data.floatWindow.on("close", () => { + Shared.data.floatWindow = null + }) +} + +ipcMain.on("hideSuspensionWindow", () => { + if (Shared.data.floatWindow) { + Shared.data.floatWindow.hide() + } +}) diff --git a/src/main/facilities/index.ts b/src/main/facilities/index.ts index b624373..ce4889a 100644 --- a/src/main/facilities/index.ts +++ b/src/main/facilities/index.ts @@ -1,20 +1,92 @@ -import { ipcMain, dialog } from "electron" +import Shared from "@main/share" +import setTray from "@main/facilities/tray" +import { app, dialog, ipcMain } from "electron" +import Share from "../share" /** * 格式:@类型:扩展:函数 */ -// 保存数据 -ipcMain.on("@func:buildin:close", data => { - // dialog.showMessageBox( - // { - // type: "info", - // title: "Information", - // defaultId: 0, - // cancelId: 0, - // message: "确定要关闭吗?" + data, - // buttons: ["没事", "最小化到托盘", "直接退出"], - // }, - // index => {} - // ) +/** + * @方法:内置:设置窗口位置 + */ +ipcMain.on("@func:buildin:setPosition", (event, x, y) => { + Share.data.floatWindow?.setPosition(x, y) +}) +/** + * @方法:内置:磁盘化 + */ +ipcMain.on("@func:buildin:setTray", (event, x, y) => { + if (Shared.data.trayWindow) { + Shared.data.mainWindow?.hide() // 调用 最小化实例方法 + } else { + setTray(Shared.data.mainWindow) + } +}) + +/** + * @方法:内置:退出或者磁盘化 + */ +ipcMain.on("@func:buildin:quitOrTray", (event) => { + if (Shared.data.forceClose) { + Shared.data.mainWindow?.destroy() + Shared.data.mainWindow = null + app.quit() + } else if (Shared.data.mainWindow) { + if (Shared.data.lastChoice === 1) { + ipcMain.emit("@func:buildin:setTray") + event.preventDefault() + } else { + const choice = dialog.showMessageBoxSync(Shared.data.mainWindow, { + type: "info", + title: "Information", + defaultId: 0, + cancelId: 0, + message: "确定要关闭吗?", + buttons: ["没事", "最小化到托盘", "直接退出"] + }) + if (choice === 1) { + Shared.data.lastChoice = 1 + ipcMain.emit("@func:buildin:setTray") + event.preventDefault() + } else if (choice === 2) { + Shared.data.mainWindow = null + // app.quit() + // 不要用quit();试了会弹两次 + Shared.data.forceClose = true + app.quit() // exit()直接关闭客户端,不会执行quit(); + } else { + event.preventDefault() + } + } + } +}) + + +/** + * @方法:内置:退出 + */ +ipcMain.on("@func:buildin:quit", (event) => { + if (Shared.data.forceClose) { + Shared.data.mainWindow = null + app.quit() + } else if (Shared.data.mainWindow) { + const choice = dialog.showMessageBoxSync({ + type: "info", + title: "Information", + defaultId: 0, + cancelId: 0, + message: "确定要关闭吗?", + buttons: ["没事", "直接退出"] + }) + if (choice === 1) { + Shared.data.mainWindow = null + // app.quit() + // 不要用quit();试了会弹两次 + Shared.data.forceClose = true + app.quit() // exit()直接关闭客户端,不会执行quit(); + } else { + + } + } }) diff --git a/src/main/facilities/main/index.ts b/src/main/facilities/main/index.ts new file mode 100644 index 0000000..176f1ba --- /dev/null +++ b/src/main/facilities/main/index.ts @@ -0,0 +1,31 @@ +import { app, BrowserWindow, dialog, ipcMain } from "electron" +import Shared from "@main/share" +import { getFileUrl } from "@main/util" + +function createWindow() { + /** + * Initial window options + */ + Shared.data.mainWindow = new BrowserWindow({ + height: 95, + useContentSize: true, + width: 260, + resizable: false, + minWidth: 260, + minHeight: 95, + icon: __static + "/icon.png", + show: false, + frame: false, // 去除原生的菜单 + transparent: true, // 背景透明 + alwaysOnTop: true, + webPreferences: { + nodeIntegration: true, + contextIsolation: false + } + }) + + Shared.data.mainWindow.loadURL(getFileUrl("")) + Shared.data.mainWindow.on("close", (event: any) => { + ipcMain.emit("@func:buildin:quitOrTray") + }) +} diff --git a/src/main/facilities/tray/index.ts b/src/main/facilities/tray/index.ts new file mode 100644 index 0000000..f3e0583 --- /dev/null +++ b/src/main/facilities/tray/index.ts @@ -0,0 +1,64 @@ +import Shared from "@main/share" +import { app, BrowserWindow, ipcMain, Menu, Tray } from "electron" + +const path = require("path") + +// 隐藏主窗口,并创建托盘,绑定关闭事件 +export default function setTray(mainWindow?: BrowserWindow | null) { + if (Shared.data.trayWindow) { + mainWindow?.hide() + return + } + // 用一个 Tray 来表示一个图标,这个图标处于正在运行的系统的通知区 + // 通常被添加到一个 context menu 上. + // 系统托盘右键菜单 + const trayMenuTemplate = [ + { + // 系统托盘图标目录 + label: "打开主窗口", + click: () => { + mainWindow?.show() + } + }, + { + // 系统托盘图标目录 + label: "打开悬浮窗", + click: () => { + ipcMain.emit("showSuspensionWindow") + } + }, + { + // 系统托盘图标目录 + label: "退出", + click: () => { + Shared.data.forceClose = true + app.quit() + } + } + ] + // 设置系统托盘图标 + const iconPath = path.join(__static, "/icon.png") + + Shared.data.trayWindow = new Tray(iconPath) + + // 图标的上下文菜单 + const contextMenu = Menu.buildFromTemplate(trayMenuTemplate) + + // 展示主窗口,隐藏主窗口 mainWindow.hide() + mainWindow?.hide() + + // 设置托盘悬浮提示 + Shared.data.trayWindow.setToolTip("never forget") + + // 设置托盘菜单 + Shared.data.trayWindow.setContextMenu(contextMenu) + + // 单击托盘小图标显示应用 + Shared.data.trayWindow.on("double-click", () => { + // 显示主程序 + mainWindow?.show() + // 关闭托盘显示 + // Shared.data.trayWindow.destroy(); + }) + return Shared.data.trayWindow +} diff --git a/src/main/float.ts b/src/main/float.ts deleted file mode 100644 index baa4ffe..0000000 --- a/src/main/float.ts +++ /dev/null @@ -1,119 +0,0 @@ -import Shared from "./share" -import { getFileUrl } from './util' -import { BrowserWindow, ipcMain, screen, Menu, shell, webContents, app } from "electron" -// webContents -console.log(webContents.getAllWebContents()) - -const window: any = null //BrowserWindow.fromWebContents(webContents.getFocusedWebContents()) - -ipcMain.on("@float:setPosition", (event, x, y) => { - Shared.data.floatWindow?.setPosition(x, y) -}) - -ipcMain.on("showSuspensionWindow", () => { - if (Shared.data.floatWindow) { - if (Shared.data.floatWindow.isVisible()) { - // createSuspensionWindow() - } else { - Shared.data.floatWindow.showInactive() - } - } else { - createSuspensionWindow() - } -}) - -ipcMain.on("createSuspensionMenu", e => { - const rightM = Menu.buildFromTemplate([ - { label: "开始全部任务", enabled: false }, - { label: "暂停全部任务", enabled: false }, - { - label: "本次传输完自动关机", - click: () => { - ipcMain.emit("@func:buildin:saveData", 32232) - }, - }, - { type: "separator" }, - { - label: "隐藏悬浮窗", - click: () => { - if (window) { - window.webContents.send("hideSuspension", false) - } - Shared.data.floatWindow.hide() - }, - }, - { - label: "打开主窗口", - click: () => { - // && !Shared.data.mainWindow.isVisible() - if (Shared.data.mainWindow) { - Shared.data.mainWindow.show() - } - // window.webContents.send('hideSuspension', false) - }, - }, - { type: "separator" }, - { - label: "加入qq群", - click: () => { - shell.openExternal( - "tencent://groupwpa/?subcmd=all¶m=7B2267726F757055696E223A3831343237303636392C2274696D655374616D70223A313533393531303138387D0A" - ) - }, - }, - { - label: "GitHub地址", - click: () => { - shell.openExternal("https://github.com/lihaotian0607/auth") - }, - }, - { - label: "退出软件", - click: () => { - Shared.data.forceClose = true - app.quit() - }, - }, - ]) - rightM.popup({}) -}) - -function createSuspensionWindow() { - Shared.data.floatWindow = new BrowserWindow({ - width: 102, // 悬浮窗口的宽度 比实际DIV的宽度要多2px 因为有1px的边框 - height: 27, // 悬浮窗口的高度 比实际DIV的高度要多2px 因为有1px的边框 - type: "toolbar", // 创建的窗口类型为工具栏窗口 - frame: false, // 要创建无边框窗口 - resizable: false, // 禁止窗口大小缩放 - show: false, // 先不让窗口显示 - webPreferences: { - devTools: false, // 关闭调试工具 - nodeIntegration: true, - contextIsolation: false, - }, - transparent: true, // 设置透明 - alwaysOnTop: true, // 窗口是否总是显示在其他窗口之前 - }) - const size = screen.getPrimaryDisplay().workAreaSize // 获取显示器的宽高 - const winSize = Shared.data.floatWindow.getSize() // 获取窗口宽高 - // 设置窗口的位置 注意x轴要桌面的宽度 - 窗口的宽度 - Shared.data.floatWindow.setPosition(size.width - winSize[0], 100) - Shared.data.floatWindow.setPosition(size.width / 2, size.height / 2) - Shared.data.floatWindow.loadURL(getFileUrl("float")) - - Shared.data.floatWindow.once("ready-to-show", () => { - Shared.data.floatWindow.show() - }) - Shared.data.floatWindow.on("double-click", () => { - alert(123) - }) - Shared.data.floatWindow.on("close", () => { - Shared.data.floatWindow = null - }) -} - -ipcMain.on("hideSuspensionWindow", () => { - if (Shared.data.floatWindow) { - Shared.data.floatWindow.hide() - } -}) diff --git a/src/main/index.dev.ts b/src/main/index.dev.ts index 3240246..9dc7172 100644 --- a/src/main/index.dev.ts +++ b/src/main/index.dev.ts @@ -2,7 +2,7 @@ // Install `electron-debug` with `devtron` import electronDebug from "electron-debug" -electronDebug({ showDevTools: true }) +electronDebug({ showDevTools: false }) // Install `vue-devtools` require('electron').app.on('ready', () => { @@ -15,4 +15,4 @@ require('electron').app.on('ready', () => { }) // Require `main` process to boot app -import './index' \ No newline at end of file +import './index' diff --git a/src/main/index.ts b/src/main/index.ts index d429f1e..68a6f6a 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -2,21 +2,12 @@ * electron 主文件 */ "use strict" -import Shared from "./share" -import setTray from "./disk" -import { getFileUrl } from "./util" -// import '../renderer/store' -import "./facilities" -import { app, BrowserWindow, dialog } from "electron" +import "@main/facilities/float/float" +import setTray from "@main/facilities/tray" +import { app, ipcMain } from "electron" +import "@main/facilities" +import Shared from "@main/share" -Shared.data = { - mainWindow: null, // 主窗口 - floatWindow: null, // 浮动窗口 - miniWindow: null, - forceClose: false, - lastChoice: -1, // 做过的选择 -} -console.log("asdasadsads") /** * Set `__static` path to static files in production * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-static-assets.html @@ -28,88 +19,93 @@ if (!isDev) { global.__static = require("path").join(__dirname, "/static").replace(/\\/g, "\\\\") } -function createWindow() { - /** - * Initial window options - */ - Shared.data.mainWindow = new BrowserWindow({ - height: 400, - useContentSize: true, - width: 600, - resizable: true, - minWidth: 450, - minHeight: 400, - icon: __static + "/icon.png", - // frame: false, - // transparent: true, - alwaysOnTop: false, - webPreferences: { - nodeIntegration: true, - contextIsolation: false, - }, - }) - Shared.data.mainWindow.loadURL(getFileUrl("")) - Shared.data.mainWindow.on("close", (event: any) => { - if (Shared.data.forceClose) { - Shared.data.mainWindow = null - app.quit() - } else if (Shared.data.mainWindow) { - if (Shared.data.lastChoice === 1) { - if (Shared.data.miniWindow) { - Shared.data.mainWindow.hide() // 调用 最小化实例方法 - } else { - setTray(app, Shared.data.mainWindow) - } - event.preventDefault() - } else { - const choice = dialog.showMessageBoxSync(Shared.data.mainWindow, { - type: "info", - title: "Information", - defaultId: 0, - cancelId: 0, - message: "确定要关闭吗?", - buttons: ["没事", "最小化到托盘", "直接退出"], - }) - if (choice === 1) { - Shared.data.lastChoice = 1 - if (Shared.data.miniWindow) { - Shared.data.mainWindow.hide() // 调用 最小化实例方法 - } else { - setTray(app, Shared.data.mainWindow) - } - event.preventDefault() - } else if (choice === 2) { - Shared.data.mainWindow = null - // app.quit() - // 不要用quit();试了会弹两次 - Shared.data.forceClose = true - app.quit() // exit()直接关闭客户端,不会执行quit(); - } else { - event.preventDefault() - } - } - } - }) -} +// function createWindow() { +// /** +// * Initial window options +// */ +// Shared.data.mainWindow = new BrowserWindow({ +// height: 95, +// useContentSize: true, +// width: 260, +// resizable: false, +// minWidth: 260, +// minHeight: 95, +// icon: __static + "/icon.png", +// show: false, +// frame: false, // 去除原生的菜单 +// transparent: true, // 背景透明 +// alwaysOnTop: true, +// webPreferences: { +// nodeIntegration: true, +// contextIsolation: false, +// }, +// }) +// +// Shared.data.mainWindow.loadURL(getFileUrl("")) +// Shared.data.mainWindow.on("close", (event: any) => { +// if (Shared.data.forceClose) { +// Shared.data.mainWindow = null +// app.quit() +// } else if (Shared.data.mainWindow) { +// if (Shared.data.lastChoice === 1) { +// if (Shared.data.miniWindow) { +// Shared.data.mainWindow.hide() // 调用 最小化实例方法 +// } else { +// setTray(app, Shared.data.mainWindow) +// } +// event.preventDefault() +// } else { +// const choice = dialog.showMessageBoxSync(Shared.data.mainWindow, { +// type: "info", +// title: "Information", +// defaultId: 0, +// cancelId: 0, +// message: "确定要关闭吗?", +// buttons: ["没事", "最小化到托盘", "直接退出"], +// }) +// if (choice === 1) { +// Shared.data.lastChoice = 1 +// if (Shared.data.miniWindow) { +// Shared.data.mainWindow.hide() // 调用 最小化实例方法 +// } else { +// setTray(app, Shared.data.mainWindow) +// } +// event.preventDefault() +// } else if (choice === 2) { +// Shared.data.mainWindow = null +// // app.quit() +// // 不要用quit();试了会弹两次 +// Shared.data.forceClose = true +// app.quit() // exit()直接关闭客户端,不会执行quit(); +// } else { +// event.preventDefault() +// } +// } +// } +// }) +// } const gotTheLock = app.requestSingleInstanceLock() if (!gotTheLock) { app.exit() } else { - require("./menu") - require("./float") - + function createWindow() { + setTray() // 初始化磁盘 + ipcMain.emit("showSuspensionWindow") //展示悬浮窗 + } app.on("second-instance", (event, commandLine, workingDirectory) => { // 当运行第二个实例时,将会聚焦到mainWindow这个窗口 - if (Shared.data.mainWindow) { - if (Shared.data.mainWindow.isMinimized()) Shared.data.mainWindow.restore() - Shared.data.mainWindow.focus() - Shared.data.mainWindow.show() - } + // if (Shared.data.mainWindow) { + // if (Shared.data.mainWindow.isMinimized()) Shared.data.mainWindow.restore() + // Shared.data.mainWindow.focus() + // Shared.data.mainWindow.show() + // } }) - app.on("ready", createWindow) + app.on("ready", () => { + + }) app.on("before-quit", event => { if (Shared.data.forceClose) { @@ -126,6 +122,7 @@ if (!gotTheLock) { }) app.on("activate", () => { + if (Shared.data.mainWindow === null) { createWindow() } diff --git a/src/main/menu copy.ts b/src/main/menu copy.ts deleted file mode 100644 index 3f003e6..0000000 --- a/src/main/menu copy.ts +++ /dev/null @@ -1,66 +0,0 @@ -import electron from "electron" - -const BrowserWindow = electron.BrowserWindow -const Menu = electron.Menu -const app = electron.app -const dialog = electron.dialog -const ipcMain = electron.ipcMain - -let newwin:electron.BrowserWindow|null = null - -let template = [ - { - label: "关于", - click: function (item:any, focusedWindow:any) { - // https://www.electronjs.org/docs/api/browser-window#winsetmenubarvisibilityvisible-windows-linux - if (focusedWindow && !newwin) { - newwin = new BrowserWindow({ - width: 600, - height: 200, - // modal: true, - show: false, - resizable: true, - parent: focusedWindow, // win是主窗口 - // - webPreferences: { - // 下面两个必须这么用,看a.md的文档 - nodeIntegration: true, - contextIsolation: false, - // 预加载动画 - // preload: join(__dirname, "../../src/preload/index.js"), - }, - }) - // 隐藏菜单 - newwin.setMenuBarVisibility(false) - newwin.loadURL(process.env.NODE_ENV === "development" ? `http://localhost:${process.env.PORT}/#/about` : `file://${__dirname}/index.html#/about`); - newwin.on("ready-to-show", () => { - newwin?.show() - }) - newwin.on("closed", () => { - newwin = null - }) - } - }, - }, -] - -// if (process.platform === 'darwin') { -// -// } -// -// if (process.platform === 'win32') { -// -// } -app.on("ready", function () { - const menu = Menu.buildFromTemplate(template) - Menu.setApplicationMenu(menu) -}) -app.on("browser-window-created", function () { - // let reopenMenuItem = findReopenMenuItem() - // if (reopenMenuItem) reopenMenuItem.enabled = false -}) -app.on("window-all-closed", function () { - app.exit() - // let reopenMenuItem = findReopenMenuItem() - // if (reopenMenuItem) reopenMenuItem.enabled = true -}) diff --git a/src/main/menu.ts b/src/main/menu.ts deleted file mode 100644 index fe14adb..0000000 --- a/src/main/menu.ts +++ /dev/null @@ -1,189 +0,0 @@ -// const path = require('path') -import { BrowserWindow } from "electron" -import Shared from "./share" -import { getFileUrl } from "./util" -const electron = require("electron") -const setTray = require("./disk").default -// const BrowserWindow = electron.BrowserWindow -const Menu = electron.Menu -const app = electron.app -const dialog = electron.dialog -const ipcMain = electron.ipcMain - -let newwin: BrowserWindow | null - -let template = [ - { - label: "选择保存目录", - click: function (item: any, focusedWindow: BrowserWindow) { - dialog - .showOpenDialog(focusedWindow, { - properties: ["openDirectory"], - }) - .then(result => { - ipcMain.emit("@menu:selectDir", result) - }) - .catch(err => { - throw err - }) - }, - }, - { - label: "置顶", - key: "alwaysTop", - click: function (item: any, focusedWindow: BrowserWindow) { - if (Shared.data.mainWindow.isAlwaysOnTop()) { - Shared.data.mainWindow.setAlwaysOnTop(false) - } else { - Shared.data.mainWindow.setAlwaysOnTop(true) - } - }, - }, - { - label: "重载", - accelerator: "CmdOrCtrl+R", - click: function (item: any, focusedWindow: BrowserWindow) { - if (focusedWindow) { - // 重载之后, 刷新并关闭所有的次要窗体 - if (focusedWindow.id === 1) { - BrowserWindow.getAllWindows().forEach(function (win) { - if (win.id > 1) { - win.close() - } - }) - } - focusedWindow.reload() - } - }, - }, - { - label: "功能", - submenu: [ - { - label: "悬浮窗", - click: function (item: any, focusedWindow: BrowserWindow) { - ipcMain.emit("showSuspensionWindow") - }, - }, - { - label: "最小化到托盘", - click: function (item: any, focusedWindow: BrowserWindow) { - Shared.data.lastChoice = 1 - if (Shared.data.miniWindow) { - Shared.data.mainWindow.hide() // 调用 最小化实例方法 - } else { - setTray(app, Shared.data.mainWindow) - } - }, - }, - { - label: "切换全屏", - accelerator: (function () { - if (process.platform === "darwin") { - return "Ctrl+Command+F" - } else { - return "F11" - } - })(), - click: function (item: any, focusedWindow: BrowserWindow) { - if (focusedWindow) { - focusedWindow.setFullScreen(!focusedWindow.isFullScreen()) - } - }, - }, - ], - }, - { - label: "开发者", - submenu: [ - { - label: "切换开发者工具", - accelerator: (function () { - if (process.platform === "darwin") { - return "Alt+Command+I" - } else { - return "Ctrl+Shift+I" - } - })(), - click: function (item: any, focusedWindow: BrowserWindow) { - if (focusedWindow) { - // @ts-ignore - focusedWindow.toggleDevTools() - } - }, - }, - ], - }, - // { - // label: '重新启动', - // click: function(item, focusedWindow) { - // app.exit() - // app.relaunch() - // // app.relaunch({ args: process.argv.slice(1).concat(['--relaunch']) }) - // // app.quit() - // } - // }, - { - label: "关于", - click: function (item: any, focusedWindow: BrowserWindow) { - // https://www.electronjs.org/docs/api/browser-window#winsetmenubarvisibilityvisible-windows-linux - if (focusedWindow && !newwin) { - newwin = new BrowserWindow({ - width: 600, - height: 200, - minimizable: false, - darkTheme: true, - modal: true, - show: false, - resizable: false, - webPreferences: { - nodeIntegration: true, - contextIsolation: false, - }, - // parent: focusedWindow // win是主窗口 - }) - // 隐藏菜单 - newwin.setMenuBarVisibility(false) - // vue是单页面,需要改成多页面才行 - newwin.loadURL(getFileUrl("about")) - newwin.on("ready-to-show", () => { - newwin?.show() - }) - newwin.on("close", () => { - newwin = null - }) - } - }, - }, -] -// function findTopItem() { -// const menu = Menu.getApplicationMenu() -// if (!menu) return -// let reopenMenuItem -// menu.items.forEach(function(item) { -// if (item.key === 'alwaysTop') { -// reopenMenuItem = item -// } -// // if (item.submenu) { -// // item.submenu.items.forEach(function(item) { -// // if (item.key === 'alwaysTop') { -// // reopenMenuItem = item -// // } -// // }) -// // } -// }) -// console.log(reopenMenuItem) -// return reopenMenuItem -// } -app.on("ready", function () { - const menu = Menu.buildFromTemplate(<any>template) - Menu.setApplicationMenu(menu) -}) -app.on("browser-window-created", function () { - // let reopenMenuItem = findReopenMenuItem() - // if (reopenMenuItem) reopenMenuItem.enabled = false -}) -app.on("window-all-closed", function () { - // let reopenMenuItem = findReopenMenuItem() - // if (reopenMenuItem) reopenMenuItem.enabled = true -}) diff --git a/src/main/share/index.ts b/src/main/share/index.ts index 118d9bd..708b231 100644 --- a/src/main/share/index.ts +++ b/src/main/share/index.ts @@ -1,12 +1,25 @@ +import { BrowserWindow, Tray } from "electron" + interface IPayload{ data: { + mainWindow: BrowserWindow|null; + floatWindow: BrowserWindow|null; + trayWindow: Tray|null; + forceClose: boolean; + lastChoice: number; [propName:string]: any; }; [propName:string]: any; } const payload:IPayload = { - data: {} + data: { + mainWindow: null, // 主窗口 + floatWindow: null, // 浮动窗口 + trayWindow: null, + forceClose: false, + lastChoice: -1 // 做过的选择 + } } -export default payload \ No newline at end of file +export default payload diff --git a/src/render/assets/style/_font.scss b/src/render/assets/style/_font.scss index ea6d3d7..e251421 100644 --- a/src/render/assets/style/_font.scss +++ b/src/render/assets/style/_font.scss @@ -110,3 +110,10 @@ src: url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } + +@font-face { + font-family: 'pixi'; + src:url('__static/font/bb3273.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} diff --git a/src/render/views/Home/index.module.scss b/src/render/views/Home/index.module.scss new file mode 100644 index 0000000..d616625 --- /dev/null +++ b/src/render/views/Home/index.module.scss @@ -0,0 +1,14 @@ +.clock { + position: fixed; + left: 0; + top: 0; + transform: translate(-50% -50%); + font-size: 40px; + font-weight: bolder; + text-align: center; + line-height: 1.3; + color: #CD1110; + font-family: "pixi"; + user-select: none; + pointer-events: none; +} diff --git a/src/render/views/Home/index.tsx b/src/render/views/Home/index.tsx index 08eb200..0ac89fc 100644 --- a/src/render/views/Home/index.tsx +++ b/src/render/views/Home/index.tsx @@ -1,49 +1,38 @@ import { addTodo, removeTodo } from "@/store/action/todo" -import React, { FormEvent, useRef, useContext } from "react" +import React from "react" import { connect } from "react-redux" -import { NavLink } from "react-router-dom" +import style from "./index.module.scss" +import useTime from "./useTime" +import usePositionElectron from "./usePositionElectron" export interface HomeProps { add(text: string): void + todo: ITodo[] + remove(id: number): void } function Home(props: HomeProps) { - const { todo, add, remove } = props - const inputRef = useRef<HTMLInputElement>(null) - - function addOne(e: FormEvent) { - e.preventDefault() - let text = inputRef.current!.value - if (text) { - inputRef.current!.value = "" - add(text) - } - } - + let [nowDate] = useTime() + usePositionElectron() return ( - <div> - <NavLink to="/home">首页</NavLink> <br /> - <NavLink to="/about">关于</NavLink><br /> - <NavLink to="/login">登录</NavLink><br /> - <NavLink to="/float">Float</NavLink><br /> - <div> - <img src='__static/icon.png' style={{width:"50px",height: "50px"}} alt=""/> - </div> + <div className={style.clock}> + <div>{nowDate.year}-{nowDate.month}-{nowDate.day}</div> + <div>{nowDate.hour}:{nowDate.minute}:{nowDate.second}</div> </div> ) } const mapStateToProps = (state: any) => { return { - todo: state.todo, + todo: state.todo } } const mapDispatchToProps = (dispatch: any) => ({ add: (text: string) => dispatch(addTodo(text)), - remove: (id: string | number) => dispatch(removeTodo(id)), + remove: (id: string | number) => dispatch(removeTodo(id)) }) export default connect(mapStateToProps, mapDispatchToProps)(Home) diff --git a/src/render/views/Home/usePositionElectron.ts b/src/render/views/Home/usePositionElectron.ts new file mode 100644 index 0000000..0cb63fe --- /dev/null +++ b/src/render/views/Home/usePositionElectron.ts @@ -0,0 +1,32 @@ +import electron from "@/plugins/electron" +import { useEffect } from "react" + + +export default function() { + useEffect(() => { + let biasX = 0 + let biasY = 0 + document.addEventListener("mousedown", function(e) { + switch (e.button) { + case 0: + biasX = e.x + biasY = e.y + document.addEventListener("mousemove", moveEvent) + break + case 2: + electron.ipcRenderer.send("createSuspensionMenu") + break + } + }) + + document.addEventListener("mouseup", function() { + biasX = 0 + biasY = 0 + document.removeEventListener("mousemove", moveEvent) + }) + + function moveEvent(e: any) { + electron.ipcRenderer.send("@func:buildin:setPosition", e.screenX - biasX, e.screenY - biasY) + } + }, []) +} diff --git a/src/render/views/Home/useTime.ts b/src/render/views/Home/useTime.ts new file mode 100644 index 0000000..a05340c --- /dev/null +++ b/src/render/views/Home/useTime.ts @@ -0,0 +1,55 @@ +import { Dispatch, SetStateAction, useEffect, useState } from "react" + +type ITime<T = string | number> = { + year?: T; + month?: T; + day?: T; + hour?: T; + minute?: T; + second?: T; +} + +function isLow10(value:string | number) { + if (+value< 10){ + return "0"+value + } + return value +} + + +export default function(isUpdate = true): [ITime, Dispatch<SetStateAction<ITime>>] { + let [nowDate, setNowDate] = useState<ITime>({}) + + function updateTime() { + let date: ITime = {} + let newDate = new Date() + date.year = isLow10(newDate.getFullYear()) + date.month = isLow10(newDate.getMonth() + 1) + date.day = isLow10(newDate.getDate()) + date.hour = isLow10(newDate.getHours()) + date.minute = isLow10(newDate.getMinutes()) + date.second = isLow10(newDate.getSeconds()) + setNowDate(date) + return newDate.getMilliseconds() + } + + if (isUpdate) { + useEffect(() => { + + function cicleCall(millis: number): NodeJS.Timeout { + let timeID = setTimeout(() => { + let millis = 1000 - updateTime() + cicleCall(millis) + }, millis) + return timeID + } + + let millis = 1000 - updateTime() + let timeID = cicleCall(millis) + return () => { + clearTimeout(timeID) + } + }, []) + } + return [nowDate, setNowDate] +}