From 8a35e60e482a60d704805d6d886416c607229ac3 Mon Sep 17 00:00:00 2001 From: muwoo <2424880409@qq.com> Date: Wed, 8 Dec 2021 15:51:54 +0800 Subject: [PATCH] =?UTF-8?q?:recycle:=20search=20=E6=A1=86=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E4=BA=A4=E4=BA=92=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 +- public/icon.ico | Bin 0 -> 4286 bytes public/icon@2x.png | Bin 0 -> 3939 bytes public/icon@3x.png | Bin 0 -> 3268 bytes public/preload.js | 6 +- src/common/utils/localConfig.ts | 60 +++++++++++++++++++ src/common/utils/localPlugin.ts | 8 ++- src/main/browsers/runner.ts | 1 + src/main/common/registerHotKey.ts | 45 ++++++++++++++ src/main/common/tray.ts | 75 ++++++++++++++++++++++++ src/main/index.ts | 8 ++- src/renderer/App.vue | 8 +++ src/renderer/components/search.vue | 39 ++++++++++-- src/renderer/plugins-manager/index.ts | 15 +++-- src/renderer/plugins-manager/options.ts | 3 +- src/renderer/plugins-manager/search.ts | 4 -- src/renderer/shims-vue.d.ts | 1 + 17 files changed, 253 insertions(+), 24 deletions(-) create mode 100644 public/icon.ico create mode 100644 public/icon@2x.png create mode 100644 public/icon@3x.png create mode 100644 src/common/utils/localConfig.ts create mode 100644 src/main/common/registerHotKey.ts create mode 100644 src/main/common/tray.ts diff --git a/package.json b/package.json index 3150822..7fbdd75 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "rubick2", - "version": "0.1.0", + "name": "rubick", + "version": "2.0.0", "private": true, "scripts": { "serve": "vue-cli-service serve", diff --git a/public/icon.ico b/public/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..75e9e611898963d696c00b3a27695b422bf14a64 GIT binary patch literal 4286 zcmb7IX;4+?89tqKrk&=8nNG)`LD6%!-UbEaUiV!a*D- zE)jnxZW0%WBgA&%4dP`&U#E^Q%3H9?wqPCQ{EWyUMu{(orv#pZZ#e&e7$VjaKOsW$ zc2f3ISHY_Aw_Nu_B8_;Dcpl$U^YdIMK1v|IPpEnb$N#$=3%OtA_btQ>u@uLPyn93$ z)x?hp%@>PwSj7Dces`8oWfw$PA&_ThL<(Gy>r^-+k{7*~Z*1zEzE+;Kwd#Bq=YL9Q zIz%Rg+z^_Ju)oIp5h5rn2_;dvsEs{<1M$Q7W8xTE6W_z(#OpYea2fmKPpj|BOkQ|Q zxo}3N8FaA06PbYulMn95_4<4_WrzGA3K+P5#QRpATh{I|ccR1kFZ9}m&0=EgzyVO0%^zDj#j>KD4giVdU2Dr7n!M>Etuxl*ZgjMZNim%CnH; z33}|4qSVp>mnjRb%#fG>d;!L>5`~ztc`oDzk`~6YK~b^6z4_F z#*eW(YaX>5=TQCT4E*nW41fPL%DX;;C$ortQ1=swft(lT9jlY!PTmfuB^&i`x1!%S zhk=y;;C=4}Ox1Q`y0#l<-rhxDhW8|&$)VPlJ5u7S`PdV)mAoHe&s+0o*fN9Nn`Tf| zIfuYmATUCV0=}jza73l(wzQFdoPc8`Yc@I^$E!cUVB=Foc>T_;mU;Z5S zZkt7edltJ+kymUNevTDGkKxJis`ips&hJT;f29RgnE{+RGJ_BHUcpq5TYNA@`%i2x zHt<`~U_Ocy_Wz>M%>3e+ATrc_FD3_dS=X>XZw?J*^!=Hj?{)s+8F)67==`_1ZbIj; z%&fr0!=K}RU4O{;I)Bfmq7c8tyD5HvH8MvXzCvAWOV9_@fqpDB=Q0OAMMLd3n(eCn znjRIWzJfc|q37Uba!c=``rnt7k86AWO53%#>+u)+dp3vpCI9Qqt>m9YzkQy0crh3U zEk8wvU8%>g`(QBky8oF6{;qp)C2rQ^FMU*_@C!VqR9r1Sq~^QMEu-Y$$t~gdi~WVG zv(TI{iZ;t_?(u=J{i-b%l-PZ!?wHYXPv<`mlr~&|BT{lk?W3fZvk{Ml-y4;T>)s|c z-i!H14fQYIiVm*GwZXGBXtz4gd*)J6hM&1NyU_n)aHX?$v8B z=4vE=&%*fA2cHCvqIq2&>rLvCzYUj)n$c5q2u)R|5NIDq#h>R9V4jJ;%c)0kc^_PsEF-t{v}wYX5QqD?-wy$G!^9v^ z-9Cxxz%ZI}Dp;3EdabE)DZ7P`-d?qRkq*D){8d8#R@FoH-Gay@6kE2UHoG1zg{RP7 zc>`U$Cy0NdqvkGJ1OLE2?m=$c@742F)m>l9afFcGUgKH(8-VkM z-(HfB5{spNYmrZCPe<5iT&L}l=N zS4(fNa*K^iU50*K*HwH`M#vuZHSuly(qE4e($lUWbUBL1e$i{eI&F`Vys;8;UdWjx zevz|VaECZY)DW@6aw24}+&}Na=u3d2U|vyv^F&d8{-vTUyQ?Ta7*&*)1jYRC1A+1# VFMZu;P|jV-6xqTdT*4{b{{yk(bJYL< literal 0 HcmV?d00001 diff --git a/public/icon@2x.png b/public/icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c792ff8d87d5ccee7add60f8f34e0a1944c88050 GIT binary patch literal 3939 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 literal 0 HcmV?d00001 diff --git a/public/icon@3x.png b/public/icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..acdbc8ccb0253b90c3ea356b43abd7241754b832 GIT binary patch literal 3268 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 { + const currentPlugins = global.LOCAL_PLUGINS.getLocalPlugins(); + currentPlugins.some((p) => { has = p.name === plugin.name; return has; }); if (!has) { - global.LOCAL_PLUGINS.PLUGINS.unshift(plugin); + currentPlugins.unshift(plugin); + global.LOCAL_PLUGINS.PLUGINS = currentPlugins; fs.writeFileSync( configPath, - JSON.stringify(global.LOCAL_PLUGINS.PLUGINS) + JSON.stringify(currentPlugins) ); } }, diff --git a/src/main/browsers/runner.ts b/src/main/browsers/runner.ts index 573ead6..7763b13 100644 --- a/src/main/browsers/runner.ts +++ b/src/main/browsers/runner.ts @@ -49,6 +49,7 @@ export default () => { window.removeBrowserView(view); window.setSize(800, 60); executeHooks("PluginOut", null); + window.webContents.executeJavaScript(`window.initRubick()`); view = undefined; }; diff --git a/src/main/common/registerHotKey.ts b/src/main/common/registerHotKey.ts new file mode 100644 index 0000000..2f0d3ba --- /dev/null +++ b/src/main/common/registerHotKey.ts @@ -0,0 +1,45 @@ +import { globalShortcut, BrowserWindow, screen } from "electron"; + +export default (mainWindow: BrowserWindow): void => { + const config = global.OP_CONFIG.get(); + globalShortcut.unregisterAll(); + // 注册偏好快捷键 + globalShortcut.register(config.perf.shortCut.showAndHidden, () => { + const { x, y } = screen.getCursorScreenPoint(); + const currentDisplay = screen.getDisplayNearestPoint({ x, y }); + const wx = parseInt( + String( + currentDisplay.workArea.x + currentDisplay.workArea.width / 2 - 400 + ) + ); + const wy = parseInt( + String( + currentDisplay.workArea.y + currentDisplay.workArea.height / 2 - 200 + ) + ); + + mainWindow.setAlwaysOnTop(true); + mainWindow.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true }); + mainWindow.focus(); + mainWindow.setVisibleOnAllWorkspaces(false, { visibleOnFullScreen: true }); + mainWindow.setPosition(wx, wy); + mainWindow.show(); + }); + + globalShortcut.register(config.perf.shortCut.separate, () => { + // todo + }); + + globalShortcut.register(config.perf.shortCut.quit, () => { + // mainWindow.webContents.send('init-rubick'); + // mainWindow.show(); + }); + + // 注册自定义全局快捷键 + config.global.forEach((sc) => { + if (!sc.key || !sc.value) return; + globalShortcut.register(sc.key, () => { + mainWindow.webContents.send("global-short-key", sc.value); + }); + }); +}; diff --git a/src/main/common/tray.ts b/src/main/common/tray.ts new file mode 100644 index 0000000..5b27c04 --- /dev/null +++ b/src/main/common/tray.ts @@ -0,0 +1,75 @@ +import { dialog, Menu, Tray, app, shell, BrowserWindow } from "electron"; +import path from "path"; +import pkg from "../../../package.json"; +import os from "os"; +import commonConst from "@/common/utils/commonConst"; + +function createTray(window: BrowserWindow): Promise { + return new Promise((resolve) => { + let icon; + if (commonConst.macOS()) { + icon = "./icon@3x.png"; + } else if (commonConst.windows()) { + icon = parseInt(os.release()) < 10 ? "./icon@2x.png" : "./icon.ico"; + } else { + icon = "icon@2x.png"; + } + const appIcon = new Tray(path.join(__static, icon)); + const contextMenu = Menu.buildFromTemplate([ + { + label: "帮助文档", + click: () => { + process.nextTick(() => { + shell.openExternal("https://github.com/clouDr-f2e/rubick"); + }); + }, + }, + { + label: "意见反馈", + click: () => { + process.nextTick(() => { + shell.openExternal("https://github.com/clouDr-f2e/rubick/issues"); + }); + }, + }, + { type: "separator" }, + { + label: "显示窗口", + accelerator: "Alt+R", + click() { + window.show(); + }, + }, + { + role: "quit", + label: "退出", + }, + { + label: "重启", + click() { + app.relaunch(); + app.quit(); + }, + }, + { type: "separator" }, + { + label: "关于", + click() { + dialog.showMessageBox({ + title: "拉比克", + message: "极简、插件化的现代桌面软件", + detail: `Version: ${pkg.version}\nAuthor: muwoo`, + }); + }, + }, + ]); + appIcon.on("click", () => { + appIcon.popUpContextMenu(contextMenu); + }); + appIcon.setContextMenu(contextMenu); + + resolve(appIcon); + }); +} + +export default createTray; diff --git a/src/main/index.ts b/src/main/index.ts index e37aceb..4d4fa7c 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -5,7 +5,11 @@ import commonConst from "../common/utils/commonConst"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import API from "./common/api"; +import createTray from "./common/tray"; +import registerHotKey from "./common/registerHotKey"; + import "../common/utils/localPlugin"; +import "../common/utils/localConfig"; class App { private windowCreator: { init: () => void; getWindow: () => BrowserWindow }; @@ -48,8 +52,8 @@ class App { this.createWindow(); API(this.windowCreator.getWindow()); // this.init() - // createTray(this.windowCreator.getWindow()) - // autoUpdate() + createTray(this.windowCreator.getWindow()); + registerHotKey(this.windowCreator.getWindow()); }; if (!app.isReady()) { app.on("ready", readyFunction); diff --git a/src/renderer/App.vue b/src/renderer/App.vue index 9c50fe5..d361057 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -9,6 +9,7 @@ @changeSelect="changeSelect" :searchValue="searchValue" :placeholder="placeholder" + @choosePlugin="choosePlugin" /> { currentSelect.value = 0; + if (currentPlugin.value.name) return; nextTick(() => { ipcRenderer.sendSync("msg-trigger", { type: "setExpendHeight", @@ -81,6 +83,12 @@ const openMenu = () => { cmd: "插件市场", }); }; + +const choosePlugin = () => { + const currentChoose = options.value[currentSelect.value]; + console.log(currentChoose); + currentChoose.click(); +};