From 38c1a768fcc269820c7f7123105104733b4c96a4 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Fri, 1 Apr 2022 09:18:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=A2=E6=88=B7=E7=AB=AF=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=B3=BB=E7=BB=9F=E6=89=98=E7=9B=98=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/electron.js | 48 +++++++++++++----- electron/package.json | 1 + electron/utils.js | 16 +++++- public/images/tray/logo-tray.png | Bin 0 -> 813 bytes public/images/tray/logo-tray@2x.png | Bin 0 -> 1953 bytes public/images/tray/logo-tray@3x.png | Bin 0 -> 3103 bytes public/images/tray/logo-trayTemplate.png | Bin 0 -> 373 bytes public/images/tray/logo-trayTemplate@2x.png | Bin 0 -> 767 bytes public/images/tray/logo-trayTemplate@3x.png | Bin 0 -> 1086 bytes .../statics/public/images/tray/logo-tray.png | Bin 0 -> 813 bytes .../public/images/tray/logo-tray@2x.png | Bin 0 -> 1953 bytes .../public/images/tray/logo-tray@3x.png | Bin 0 -> 3103 bytes .../public/images/tray/logo-trayTemplate.png | Bin 0 -> 373 bytes .../images/tray/logo-trayTemplate@2x.png | Bin 0 -> 767 bytes .../images/tray/logo-trayTemplate@3x.png | Bin 0 -> 1086 bytes 15 files changed, 50 insertions(+), 15 deletions(-) create mode 100644 public/images/tray/logo-tray.png create mode 100644 public/images/tray/logo-tray@2x.png create mode 100644 public/images/tray/logo-tray@3x.png create mode 100644 public/images/tray/logo-trayTemplate.png create mode 100644 public/images/tray/logo-trayTemplate@2x.png create mode 100644 public/images/tray/logo-trayTemplate@3x.png create mode 100644 resources/assets/statics/public/images/tray/logo-tray.png create mode 100644 resources/assets/statics/public/images/tray/logo-tray@2x.png create mode 100644 resources/assets/statics/public/images/tray/logo-tray@3x.png create mode 100644 resources/assets/statics/public/images/tray/logo-trayTemplate.png create mode 100644 resources/assets/statics/public/images/tray/logo-trayTemplate@2x.png create mode 100644 resources/assets/statics/public/images/tray/logo-trayTemplate@3x.png diff --git a/electron/electron.js b/electron/electron.js index b847017f3..a3c9c1985 100644 --- a/electron/electron.js +++ b/electron/electron.js @@ -1,7 +1,7 @@ const fs = require('fs') const os = require("os"); const path = require('path') -const {app, BrowserWindow, ipcMain, dialog, clipboard, nativeImage, shell} = require('electron') +const {app, BrowserWindow, ipcMain, dialog, clipboard, nativeImage, shell, Tray, Menu} = require('electron') const {autoUpdater} = require("electron-updater") const log = require("electron-log"); const fsProm = require('fs/promises'); @@ -12,6 +12,7 @@ const utils = require('./utils'); const config = require('./package.json'); let mainWindow = null, + mainTray = null, subWindow = [], willQuitApp = false, devloadUrl = "", @@ -136,21 +137,34 @@ function createSubWindow(args) { } } - const getTheLock = app.requestSingleInstanceLock() if (!getTheLock) { app.quit() } else { app.on('second-instance', () => { - if (mainWindow) { - if (mainWindow.isMinimized()) { - mainWindow.restore() + utils.setShowWindow(mainWindow) + }) + app.on('ready', () => { + // 创建主窗口 + createMainWindow() + // 创建托盘 + if (['darwin', 'win32'].includes(process.platform)) { + mainTray = new Tray(process.platform === 'darwin' ? config.build.mac.trayIcon : config.build.win.icon); + mainTray.on('click', () => { + utils.setShowWindow(mainWindow) + }) + mainTray.setToolTip(config.name) + if (process.platform === 'win32') { + const trayMenu = Menu.buildFromTemplate([{ + label: '退出', + click: () => { + app.quit() + } + }]) + mainTray.setContextMenu(trayMenu) } - mainWindow.focus() - mainWindow.show() } }) - app.on('ready', createMainWindow) } app.on('activate', () => { @@ -194,10 +208,10 @@ ipcMain.on('windowRouter', (event, args) => { }) /** - * 隐藏窗口(mac隐藏,其他关闭) + * 隐藏窗口(mac|win隐藏,其他关闭) */ ipcMain.on('windowHidden', (event) => { - if (process.platform === 'darwin') { + if (['darwin', 'win32'].includes(process.platform)) { app.hide(); } else { app.quit(); @@ -330,10 +344,16 @@ ipcMain.on('setDockBadge', (event, args) => { // Mac only return; } - if (utils.runNum(args) > 0) { - app.dock.setBadge(String(args)) - } else { - app.dock.setBadge("") + let num = args; + let tray = true; + if (utils.isJson(args)) { + num = args.num + tray = !!args.tray + } + let text = utils.runNum(num) > 0 ? String(num) : "" + app.dock.setBadge(text) + if (tray && mainTray) { + mainTray.setTitle(text) } event.returnValue = "ok" }) diff --git a/electron/package.json b/electron/package.json index 4be00bf2f..903af8b01 100644 --- a/electron/package.json +++ b/electron/package.json @@ -65,6 +65,7 @@ "afterSign": "./notarize.js", "mac": { "icon": "../resources/assets/statics/public/images/logo-app.png", + "trayIcon": "../resources/assets/statics/public/images/tray/logo-trayTemplate.png", "entitlements": "entitlements.plist", "entitlementsInherit": "entitlements.plist", "category": "public.app-category.productivity", diff --git a/electron/utils.js b/electron/utils.js index 0112a4bdc..8b5654f81 100644 --- a/electron/utils.js +++ b/electron/utils.js @@ -270,6 +270,20 @@ module.exports = { return Math.round(time / 1000) }, + /** + * 显示窗口 + * @param win + */ + setShowWindow(win) { + if (win) { + if (win.isMinimized()) { + win.restore() + } + win.focus() + win.show() + } + }, + /** * 窗口关闭事件 * @param event @@ -283,7 +297,7 @@ module.exports = { if (typeof app === "undefined") { sender.destroy() } else { - if (process.platform === 'darwin') { + if (['darwin', 'win32'].includes(process.platform)) { app.hide() } else { app.quit() diff --git a/public/images/tray/logo-tray.png b/public/images/tray/logo-tray.png new file mode 100644 index 0000000000000000000000000000000000000000..519d0ee1cf8159e89817a86adad5d79d48f5b22b GIT binary patch literal 813 zcmV+|1JeA7P)O)0 zpr&P^Xc*r4FVu0K0n-f=vx0&93+K;mCxqkx6nHM8D7x8f)=g(~wI$O!kj&&-MMfbC z0-Ol|;~A7(cu`)hZEo%hhr@Bhv{I5JB^YDhRYgfw&zb#X{o1A-)icVsrnGTbj`K5< z5}UvX$QO$Bs^5=+fj3tl^}pI(6%2S5mhHfD>@T7yMx)U~-S_Tx?|InQf2GW?dhaw8 z3LRyFplW)lZggaLxKJpTCsJdp6-n}H*DdRXZki`PeI2<|Q#s>NeI#=CeLTKP)Ab6G z(xL|-fGRPDp=4@vPSZkViX!u7rnK>R^Rgw&S1t*^fA{h8srcaF^nfhgbZmR+a4NmR zC$b{%0SwzlKvgf#2?lPPmK`)K3*T~Dd`*35`MHh@kY%|mZy50Vd?{5`|Cojcux$sj zPa0S-w`v=sbSP8M(~+9$)d!=8jad81?%4HPZB=E{v2**j^WjJYiR9=yDhN{mMg?T@ z`8LzC`8ewv7uPnlx1ZK-TW_u9UWKNH*ePLqDEO-f4IQrcyuEZQh-v^9(l5TmrCT{?9u(&!|_9|S)T zLZAwMY%rp2B0@-mX<};!8=$tR9dscnqN7bh+oWlnq;cYp*zxuKHaa(U7sp=HY1$s? z$iC;^^S;k{-uJxc9Maj@iAC58;41*O11JMv0?6W{fdHTY(g6Mm;P(Jt&s*ddnSKty z(U0hCIWz(II)LW^JjK4HxdFfa1e`Ah^VO3lup7V=MW1~9ILv&r5OgnfmCY`Moe;tv z?#LvY|1Jme;gaSEBd~RG4; zS!&?>urUJK`vgo7LfOn;BqV#W-0!#K)pQ-Cgc3OdNG6jYX^MuLD)54^J~A_VczkB| zJBDdmYTSW@K?@!Ufj}t?!w7^YZ()5)Gq$(4L(?>HOlF=hXdFi^$-Q0=)~{X(j^|;s z34;xFHOHG*Hg@QSIiAeOR(L)DS$=81i7Zr2$Lf_$xTkpo!ecjTBq_5QAS$ILR3L<^ zs%ALsWRwzIb-P@!*=$f%?TkarkkHaeef3AoFk8D`P=LIT;WCAE~1W95DyYU}Fp z&Y9C+IDhHN%f2!vcuGnp7E4?vx63JBSPODw%jV6O0>L0OU7M|~ss8Glr_T)}q>SBV zw-=2s(1u!4WufWDH~R+ujcdb$s0aor%L6uh>vvIO&n(e2!(jh)LpP@0?i;u`I5>Eu z?K4}k|KLIF+54r-_ibwZK`NsZ5icSDYf14)O46~B$>|gS8ytks=bK^5TaI%{mv45S zXJoB+^`XF{s;+;}DG1zOFZBJY?;q#eZ;p=QKLh<}-mu{pb>+V4w4!2Z6uGr)*B%Gp z&UcWUGg;HNPfbjYq?2>uSUmB#36Oj;F&SC1Dw+yO)3BHvUOCS!?RL67UpbD0co zO-wcgeBR&0<8fwBpHHP$glD2#%N(}FOM1R239~sCZqb41xw&3xaJbJd2)d%{w){9@ zfglvkKyA6dJC;oKPQ()Mhz^|@XR*#G+O}&WBaH&j-*7rbcs=fZfoCf$TTt7ILO=k6 zC6sO$mLW+|x9X;8W3y)jI7%UFy46Bn&w+Va?%8$!PMrAR_wlJUt5UJF1fFs*vZi=_ ze4-&fH)koz5i-uk8ri~?P(Z*mO;$9Nkl*_wp5w-3RYRHGep?ydl3hba*HGp2bY~Q$ zch}Ax=>GOIxcBoNLTWyJOx1OOENI1ZoK7hZju${Uu5>jmoIYVQcZzoVORMW^cYr`k zD~dG(=3G`)NUDY!zwbas)p|M~xF1hH`&}erG4bFx9(${A_}cDjpT`P~K)Gn^`g?|| zDudQ)Az9QjWho(dAdv5*WR)m7##dBTK0-hg77jLZ7We9MUw1}Pdt2A7!DEM>U{zB% z_SDhW&kbGcSW&T1x)V|cHKB@=ZEc%k4Gr~HIAe)Kn{JpzRk0)ij#AYy4A=zzR8vjW z7uhbCk`**oh7RbO-m|T(6%TcFAvzNgpFH&VTmKpvdvIf2l@+GQ+&pUh-qF?#EzfGI z05Kx^G+0p@{#w^V`}TA_61{Q#npKuhz46Dx;b@|^((A_3 zVq8Fg#mA%+kyzrn$_jrMrQC2`RVA)mANeIq&^-@y;NH*e#9Tb?JazKaiScNB(`Os& zuBw`DQkyWgI#6+HCK`XyG)?LJnZIFZa0vDF_4R*$ci^X@O(=O-DIk!~bXn8aP0q&N z2zWg^w%^wtsR&fy&u7nB+pfpsh0E{Bozf7^BD!@UJoN|ot(;?&f4k7?Eb5x zH;>D@9`KhrtpiDk60neWot>Q#0KuX+xwGCxJb}hw#Z8+a{5+aW$pWPuTNRdkJjaTc z8T5Innau`t!`LV*YI{PGf^6(Ery+)!f+N{du=QKx_u*Dzu0a%p6ZV`z<~R>lUZ>*; ztI9E%S)E}eoF&{c&KWdT2l|V;^P$L*@QNY?o-b)IyHIi=@SK%9)`>WGr@IUE)7-7- zjwp8f!T69D$rl)bHvzm<^y=fs%K-kAFU5x#n@`X=Q~g`)&*EkHB!IuV~6}t8vZb+_45&YPPq#KTm>LQGHQkhy6Zd^ekhjaWL1$T@F;*q!^zfomuWO&)f5NYW3)5)fq>8qK+tfovuV ztyTjguT#Hk8IAf~tI-Twdk$zI0>Vhw$x4QVj$L)>+}8|xAsdZG80H)v%Cc-WnMg8& zUY}l8Z8dN^c)Kv%c>RY9AP8^@<`Vz*$j};xT~wGm)&;fGGt^0!C(Na zRtt?rJ8XR+SZp>NKXw@ZeET0@wJc;sK{AnO_W1lay1f27gYiU#p5vh7SY)$jO(nw) zJCp;%FwpZlZqL5`@CW?3>6Y7&MHaqrn6yd@a@D>#67d-PUN2H95jrlTUh61v9IPlW zKUfnCtaZBFtGb-7$0CWO)@;xhz1IlHQW^~bu%3A?ttjNTy$yA><0H{%wz{eUH{5uW zO6x7at*>_Hg{fo)zV9A z%Sv7w3`bSr$C@$KOd8(Ohb29Cx7hdvFk-q)Uq5mZ0(sKZ7P`zVzGFF z!xR)<+mO9{DxY)O?BD-lK`V+k z;78qr20XNS&5!z9TaR|RJX0!c7Gy>V?4mA|$z*twAi!ia=D(9^6@k~KjXbaB_OX75 zEctynnX2jRcl~C^Cml!n`<<5=O(tBncnPM?n2C?Jy^nY-hF|{t_G?Uf9!W_WCexS+ zuo?~GqFCi}d!DPWtA!*c5sQRX-zTr2Bt!u{mJhiR`E(?iLT#C2bN#r|`#q89l=t@> z_|Iqi_uaxU8W@cx==BEd-mwj4i?w@R)0B<0ezaI9NPr&7X|*`g+uwTV@X_Zy9xvR3 z0}xCm?I>0q5w1`K7f+kqK6m!4)&YO8$0itH)a&rat#7=#{on6SVp$G4o(GW`92mfy zIn9rhnoWwB9OP6MC^eCSY=VGOU~6UAZo9TS0X zkkIq!^9Gi`{m#3qUCw^lY!rN>Ss`zF5`J=ZMf>X2Yg)cI_$l@t`3eq`AkpQNoysgG zbh|tY_V3+uQ8JlC(CoSNBaiWytZ}gR#{eJotE&g4?a}yrD4AIY>G8eR?ye)yqRi)meoQOMR+}K2!e3HtmoC_ zQ3yrT=xOG;K%^?!H86OyfqEBKJ7Sg|s`;rkl^t!%?`j!WUV&F%eh~*x_M_A&KvEQi zXIV8x(mi-q3x6;;$1~_sg-^ueP{LuP(^9{VV=~K|B=(^hAcjP+1=&k71EH8Xs@Oob~Kux-nK z)k1;jayn66SBHwqDpb_eqUXeM$BKLJ+kevQA75YUP%}{edL@%ZWkvaRyMvA^AWIko z0q()U>Qp*yVT!1&Ftt-HubdK7jK}N4ytx;xoK{!8F`5$9hciQj?+b*~RN2#Jt7{?f2ies)g43JRWFS7K);%!n>UPj+Luck?<3S z3ZI8B7RUUVO%FHCnjJNn&Fa8I?RF-sz&SAZ1F{aooTCLO6f_KzCAEY?A+@;7n=^aG zwECKjF;PO7*N=IVCbVzZ_)H70<3VYV+=qlG-*@))I##S$d7#@H7=NblB$6{2#)2sg z`>faM$y3!vEEw-A?yJ)EK`Fu1F zfMZ$AojK#iYkzn>>?Nh>@9Bmt%j(Ezvpdk$`PD_w{q>do&Tv#)WicU?NJ6L8Le3~^ zcH=o#oISDb_sz3sJw#n7wGe)v2gzgt(`L>>z~?b`e0FF}ek-OJiV)CH+BBSWd3M%j zGD}QGVVB1rL}NpPO2QWiz-%@{OeNJGp4aQucuA)v`}Q3>e<$d;*yU3j+$1rjNim&H z7<9T5CZn*s#9@EEslP5m_px}N6kx;T(L}H0Mz+l%!Gp6@k+_DJel@<8&=1q9(;|}!s1Mr;a zMDyIan9$fLmsM0IO=b%$Hap0_Q^^Dlt2-GPH4&T|ax|*nN23vSE+%WfvSrI}-|yJ_ zn8RpP+l(=c9b!QX47CLLFS$XF$G^+(^Dd$Nd5gt{qunPV=s1*`P1ybUm*{!m0bF_c zWw6?8s&J|TR5yvMsg<%J&+F7oC5dVE-W3&~Lw zmbMc)9R!1bR4RoNCr;e-W#@_YfmpnOT6T)Pu?jzC0(lZdz#Wd_k#$e+SR>0zOYPR3 zolci}j#_WpS)<`cZNqcLN6%?tH3|?6dPrK0>PEp(u+irWT;p_mf98uu=jL1W>?mFC z2w-SuE(*Xj{M^W(nDEEqF!4Ir%%&GYvAA4prbqK$>M~n}iBYF_TlkQgI`J$tbkFPQ#F<2J$?#m_-p_G002ovPDHLkV1m$XKP)15QM+PfC?#Wv=UUXN@ZyyC|E0YX+_i9yq}Ay^0&k|zEHL3;(U(Nbd~ zC|Vd9S=qq)d`1WkEVsAE?al1o<|F|mKm`~BI`l>XxCi!t8j=$AkHi?XfsvkX{*I@- zQ!+GwS)c?=0#m+D0Q106Mw)_2Xu5zctA|@r(vYNKw{CnnCAOIl*-E}10MEc1@alF8 zECF?3^&5x4z)+F2lX~S`(u(_Y&g7=cAf3R_4*q4JZ#Z^;H%r1ka1uIl1g<7j#LSfhgA`B~wC|nfo3ZiJyE^XCg;UXev8AQvXjgd+%TozOk1TCUk z86gEh*aLc4YLv8*NJag}(YZ3-x$}LWMxQ?zxHIR>oHJ+6%$+HbgvVjv7_b*u3QPjC z6y`w*PzwA8x`Eq3*UT{HfGe#k9<7Pp#CUrVjVE-NZCio^z{7tG^L#mIYjbjej2ovc z0{y_6KvW$1%YY>rrmh38f$~5SVmoCKPzBThjRp2&%C@9|AU&jdZ+FbKY>{*&7%`i{ z(!i%_Rt7DF(+iw)k@%XYm&$^s5X+C9z*r!e#wIZVd;&gr?N5Mu;3-fW^qO%YdkJ=V zVLuT_<8(`^OD$Qgq>)IEf!Go>rDj+N*B(zchU{|2}i?H`GNan;S>P$0?Xh@{P) zq``|qg{1Epy`m8?&H~4QA-C0X(G1*oxsq_n`~Cym$?Bgk2|IxoF1%Ui1@0v6bl>A% z`yQYM`0VOELC?tgPNeF)a~QXocX;(-@4Et6=hZW}WR?S?z-8b|AeoInb7L{klF}Iu zdZmdZ;RZ?7lEwnbG)<|kW=Zxqr86XHxu??{jFKY>H@c7=brJE&nt7Ky`FtJ#zr6a6 zz={!xz&_9O{d1hT@lnzWPp?eUw?Io8h&j-hGIU1L`Bd9_ck-oqD`{&=_jI6@$AMmV zsKow+m6GmB8kO|k8GR(F#mRhK%cbGKLLLWP)7#=Hx1yRC7hzmAGqYzD$1ulfJfCUK)2qg#vcHp9r5LR>n zG3vGnDQHMRjfSNdpcNkr3YexMC={+a{m;$px~%3WB?GYH81N*x47{fA zTU9g`P;M;nHt>|G$>t95tGbUj1qMFQ@!v5uX~;{Qk#}}`vel`kRdxL4oIBv08_dHz z<4d`ebHu)o3yn3B$_sbjNb~aoupRgbcs-?8?%*0SU^>udq{Vj);V7_84@zCY`=$l- z0Edm#N5F+5+7d2w*R;q-myYpXqV*h)8$IKk8wiXVbfJh%z!Cj@t6+RM4=mN+3leqh zrZxNpd}X8ws@X<2Y7RaC+%&b>#FZEBC0Z{57J5eb!boZ`K-dkO(j2L%@@cH|$bU4F z1V!S2??Gu?NKxLm2`n-a_+4)%CYl;$BqQJoK|AS{2Lihe82kx6O5wLqIp#s4>fQl`>joBUv(gh*qZWAWchqF z^Dmj2A$DruO7fPGBnhm*FP>RRu0+<%H#_Hg%&5cp-qTOY=o~3aUnmav_G@${UIgZ4 z%zR70=LI>1y?384#2)E0Az24iP*Lr2;su<8wVgowFg~WY& zO;tIV+Mr)3KP{p15;J<^AG*6TPE+;9g-F+UAX}kd>+79!@sILx0|qor*jL5g{v?sJ z$$nM-k$!3aZX;h2KhkI`QS<-&cbhAE;6DLe8`c8&4@MFkYVc=7^8f$<07*qoM6N<$ Ef=NI5yZ`_I literal 0 HcmV?d00001 diff --git a/resources/assets/statics/public/images/tray/logo-tray.png b/resources/assets/statics/public/images/tray/logo-tray.png new file mode 100644 index 0000000000000000000000000000000000000000..519d0ee1cf8159e89817a86adad5d79d48f5b22b GIT binary patch literal 813 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 Ef=NI5yZ`_I literal 0 HcmV?d00001