From 3958e0076beeb3e6b8c98b54ca1881f6ff3af811 Mon Sep 17 00:00:00 2001 From: life Date: Mon, 26 Dec 2016 20:02:55 +0800 Subject: [PATCH] add tray (windows & mac) --- main.js | 75 +++++++++++++++++++++++-- public/config.js | 2 +- public/images/tray/tray.png | Bin 0 -> 16005 bytes public/images/tray/tray@2x.png | Bin 0 -> 16281 bytes public/images/tray/trayTemplate.png | Bin 0 -> 15324 bytes public/images/tray/trayTemplate@2x.png | Bin 0 -> 15670 bytes public/js/app/api.js | 1 + public/js/app/native.js | 41 ++++++++------ public/js/app/page.js | 5 ++ public/js/app/service.js | 2 + public/langs/zh-cn.js | 5 +- 11 files changed, 108 insertions(+), 23 deletions(-) create mode 100644 public/images/tray/tray.png create mode 100644 public/images/tray/tray@2x.png create mode 100644 public/images/tray/trayTemplate.png create mode 100644 public/images/tray/trayTemplate@2x.png diff --git a/main.js b/main.js index d52b28d3..99bfdb00 100644 --- a/main.js +++ b/main.js @@ -1,7 +1,11 @@ // var app = require('electron').app; // Module to control application life. const {app, BrowserWindow, crashReporter} = require('electron'); var ipc = require('electron').ipcMain; +const electron = require('electron'); +const Menu = electron.Menu +const Tray = electron.Tray var pdfMain = require('pdf_main'); +var appIcon; // Report crashes to our server. crashReporter.start({ @@ -11,6 +15,7 @@ crashReporter.start({ autoSubmit: true }); + // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the javascript object is GCed. var mainWindow = null; @@ -94,7 +99,6 @@ function openIt() { var leanoteProtocol = require('leanote_protocol'); leanoteProtocol.init(); - // Create the browser window. mainWindow = new BrowserWindow({ width: 1050, @@ -129,13 +133,27 @@ function openIt() { if(mainWindow && mainWindow.webContents) mainWindow.webContents.send('blurWindow'); }); + + function close (e, force) { + console.log('close:', force); + mainWindow.hide(); + e && e.preventDefault(); + mainWindow.webContents.send('closeWindow'); + } + // 以前的关闭是真关闭, 现是是假关闭了 // 关闭,先保存数据 mainWindow.on('close', function(e) { - console.log('close'); - mainWindow.hide(); - e.preventDefault(); - mainWindow.webContents.send('closeWindow'); + // windows支持tray, 点close就是隐藏 + if (process.platform.toLowerCase().indexOf('win') === 0) { // win32 + mainWindow.hide(); + e.preventDefault(); + return; + } + + // mac 在docker下quit; + // linux直接点x linux不支持Tray + close(e, false); }); // 前端发来可以关闭了 @@ -146,4 +164,51 @@ function openIt() { }); pdfMain.init(); + + function show () { + mainWindow.show(); + mainWindow.restore(); + mainWindow.focus(); + mainWindow.webContents.send('focusWindow'); + } + + var trayShowed = false; + ipc.on('show-tray', function(event, arg) { + if (trayShowed) { + return; + } + trayShowed = true; + + if (process.platform == 'linux') { + return; + } + + // 打开一次就自动关了 + appIcon = new Tray(__dirname + '/public/images/tray/' + ( process.platform == 'darwin' ? 'trayTemplate.png' : 'tray.png')) + var contextMenu = Menu.buildFromTemplate([ + { + label: arg.Open, click: function () { + show(); + } + }, + { + label: arg.Close, click: function () { + close(null, true); + } + }, + ]); + appIcon.setToolTip('Leanote'); + // appIcon.setTitle('Leanote'); + // appIcon.setContextMenu(contextMenu); + + appIcon.on('click', function (e) { + show(); + e.preventDefault(); + }); + appIcon.on('right-click', function () { + appIcon.popUpContextMenu(contextMenu); + }); + + }); + } diff --git a/public/config.js b/public/config.js index 56aef93e..7184a02f 100644 --- a/public/config.js +++ b/public/config.js @@ -33,7 +33,7 @@ var Config = { "name": "日本語" } ], - "lang": "en-us", + "lang": "zh-cn", "theme": "", "view": "summary" }; \ No newline at end of file diff --git a/public/images/tray/tray.png b/public/images/tray/tray.png new file mode 100644 index 0000000000000000000000000000000000000000..4a51f2c149764ca35dbedf58948ca7db76107301 GIT binary patch literal 16005 zcmeI3d2kcg9mh8?80v(EGhiHwBG(ie)_X{+V=IXP%Z?3^V{8+^G{9>2$==w~D$*Ls z22yUO4k=AAOvfa}Vd7z?2TX!#AwXQtP$)+xAp{yi4iiEdN(g}haY)}vmL;C$H~f)5 zI-S*wj^F#f-|zR{=bidve_dMg#K6o^nFK)$EG}}F!S6xZdq4*K9CQ790e<}`STrk4 z5DyO3-VYGXuZ$#!Uo^@UGu4@%CwWov=LwSH1$j|_5Y{FL$HZt*5Nm*H@PaBi;51&{ z)owJ%lG8YY^U$7PKB$(98bYAFp`=1=s1fawaiS~J5#?b3KTrij)L$D2^HHZU7MF*= zwPMO>h*eQ*oW@C7Lc>f?sUcqp0RxxEks{492CF@f;W(?6onT;T#!S%+#h6IO&YR6V zO&hviMpq{MjSC~ zB?IA{c#uRKHwcR%IjG7?z@Wtyyh@$wG#a%;-LI~G`GX!$cd9_Riyq`iMTH>6NQMqR&}LHNfBQ&k|M%1-9UH?1FQnW+DO_ic}a$`3Z%f8eWWOvSczr5 zc7Zb`5~c*}k*GKjR)v5Fy80q(eGvpR?14aXK#)kY)xwg3#V(R2y9J0oo7L|1+7qEu z+NegYWXlU)E*Jo!*yGfJ) zXEiaRKqqpg1WV>hz)1nnb21glVO0s$rwCdTwXLQcJa=ztLa3GRlVdkcxGV62sBL1d zumHzGYj#RmvdM7|Em6EenjxS~tjSE9t)$H>airPq^OANe@RGnQS~-)&ELedx5kJMf z_Z*RG5OBd=9WrJ~)>6UPc$VW?>*KTy?(KS{}lm=+_YCK?0Y*Cas|?kh@a-IO?z$orI#Ur=4L zU#J39Fi_>7l7%TXlgC`XQmceuvw#bpX6cGkytETvJEP%7AjGyj#zFNcL+j7fj-uMS zSbZx?!xzP9pIxr0GU_@D@0u#3u1U}70aq&US(yO!`V80GLP4qO(FGjR?I zEk->`6YPbC9E9+47`NId{7~+bUTH5LL&80KuC&E<7JZ)o~#} z@TQIn&j(R;TnG@nspG=)K~x%r1aIoN@O%(e$AtjFn>sE$A4Ju0Awck^jtkERQFUAh5WK15!t+5? z9Tx%wZ|b=4d=OQ~g#f{uSX`OO2W&wAK2;lmkIx!*R~~|o-WtTBG7mvC_}4sw;D1LDBb1lt9xNn?K6S{U6B1YUwU&-|BrK5 zez&;4@pAq!@8BDq@9x>qe&_B-=huuL#jLxzrl8}!gDrXPqM>__Jlp#72_20CnqGNm z&Rfr%H*Y+)uzJzO51f~_>_6Y}So7#}``&(b-+?C$NBh+@e>Q0EhQpuSY}zuVX)jZ{Ka9X&I({2!LT z%|86+sgG6CrAX`XX>4$$90)m)`2Qok2|NN89E;e`NR{4)fbGq~Vltx%bN0Ro-*Q9_c&oM0CdP3!M|! zF1(h1Wqjm|(;FU|`}>yGj;9X}{AAxZd$J$*wKQ^*=ZyPV`{+-Poa4#dcOt)9{prwU zf6Z8Aw5%^}4;Ku1BfIj>#9ME)E&9sueRp^BaPuR52e)#b<}s(%ty-Ns=G)7kb#BaG zb-=po^4F)9toh}PtAPUp#+_KQ^3JQ3%yZv0eevMKcgGOHA=jDav4wCl5=3!9iF?cB Hc}xEb?rz>& literal 0 HcmV?d00001 diff --git a/public/images/tray/tray@2x.png b/public/images/tray/tray@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..57bd6bc8e3d43d7d7a6fd1ea29bcc8f969bb35d3 GIT binary patch literal 16281 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 C8n>DN literal 0 HcmV?d00001 diff --git a/public/images/tray/trayTemplate.png b/public/images/tray/trayTemplate.png new file mode 100644 index 0000000000000000000000000000000000000000..2bed45b3ab2a60cecdf89a591769d99a1d66fe66 GIT binary patch literal 15324 zcmeI3dx#rF9LKj{Z9Ofh)waGcrl+lVn|)>TSd-{oa@RX)uGi~H@2cQUb|-gBlih80 z)8tMO-{PYc`-jxFicpJ%7O@~w5g!x_QWfz57C|i*pH&nq^+|O$&%H@9+#miqfh7Bz z-+aF_`&z$x8``+t7zO}|gq;{J_t znonCvIIR!P7T|{2;W2e~vl`X>Hzm4aWd#}Jp#yy7e9o|ya@=3>RnWCt%=vwlD$eG( zzt?ThH=Z8xCCvi#$pM*Fc~S6%qX9vd!(p+iN4b+-LQQSZ6IF`b3rBW$Sk^*L7iW8#ID94MOD6*&qYtI-CD6@vWvT9QINkLmJ z=$50KhR^i{8MElb{eHKh#;0~)c`Kc6G-cQ|dWa)e1{Nm-crKsk+9_>k6gE5AR%wsT zSdbfqwplEw5LI8<-l%^o>Rs(_=V8>p6&g-kD>P7#}JfsT3J`n(ewwo zl&Kco`x;6mibY*hZ{v(q%F2XhV1}Dg{aG}t&VKfOfVDS zLozF8gAyAAlEg+eEyIF{CPEm6QbZE#)*g9_bqW^rtxy{%nEA>|u|UCw?yQab>(jQe zv}!mj^Ip+g`y@odKm=-t<$0NBgFNa}CL=&r;GqOH8GtM=#kdxEvrnjjST(IR2dNGc zIZN5FB(os^!fY_B@@xixAS-DZ5DH5mBZh>!yGP!1ujBCCa_cM^)NRKs%y<%Rr`$bc z1KcvVw4TW6^CZ{chnBknRCjku*Z|RYyX`4!cDbr>8>&`l1ATrIp+(-gjnXtU5@@>) zv4Y5op)rw1d$l5oH}Da3QSWM{R%a92%sM4dfW1>_r6sE8!$^I*@FkO#^T4+{4OHE5 z_mJ!BzH^108&Ic#F$J{*R~Oa`a7m1F2QR139lL7j+##*ckJc&Ru5Kk+fB;R6G1JV= z?}l(uvu8~|m;w&;(ng1)994L^PP<`Jt%-T0O-;|v;2!vhxgMUHxCc7SHQ<1Gxp?b( zd^A;YbSDQf$S(QboHMu7vuw}_tmM!*#{FehgIQ3_IsQZr0>gA5tE;BLLW4AZbG>6+ zn{LEVS=KD%fs@elUX-!wK$hP3leK(h0KEo5rP0<*kP9B+&U#=_pq0QMt!y6~+ei z2niD*S(fA&hZp0D5xop^<0&1TvbMX&389(>PqY56&LMlc}ckm4fq!Lk$=280|^Tx332mg2&IkVA@#%m>R- zTo@2?NO6(*U|EU_140fdE;1i1OL1X9$RWi==7VJ^E({1cq`1g@uq?%e0U?JJ7nu*1 zrMNI4v$*8jo6#$yK6P+3%`mgqGR!^q zGt8g=qW|w1rpPnQ50mI^)13^n+}v@;(E)~8aLG`rcdY!`o{tZ4$@Q0<`^%S`pG{?Y z_x3zAyzThnBX5EogWb;q-kB7ie(!=?O1mdAFI_R-(|3IBN4xq*-hDFo{+%EGwPW}0 zzdyh8jnmKAKc|oF^N$_cHq`ycQ`@?~S^mlTb%*YK=q!Jq+P(0{bN+l_qUYpwE5Ezw z)czC7;Y|yc9yr$adPyoWj|MKiZN*Q=&Rn+az>3FbHy)W?^+i`y ze#Ls^)pyFByq5k32i+z*#{ReIkyO96@ literal 0 HcmV?d00001 diff --git a/public/images/tray/trayTemplate@2x.png b/public/images/tray/trayTemplate@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..031286435abdf8f9cdbcbe6f62b388a605085131 GIT binary patch literal 15670 zcmeI3eUKC79mf~Sn@11iML-ZPMj1I^v%A^6uDLL|WRF|-3(~Kal~3jP!3_Vjt9aht&a5Byj*h6<(|1e z{BtvtWPi`^`F(%SexBd+Jp0df)-SFpEty$DQB-MNt#29nH)!8+W6*E1t?dT-yDeVZ zl%%NfQ?&00YS-==6eUzj4UI~p{{caiqb3lP1JI;KIdpuuXg(jsf-40fl9vs&$T^Fo7}MW7F_5C(-0ouefTV{Wuv+i1>An{5qd7VXsnYhJ)Q&_!;j>0U#NB;}CO0us>E zj8>XEb3WAPwhM#Tn?4T=^ZY=RV%i>3p3@x|ICKIr3}VeN=w@<(xduGM#b}ckkp|9P zrgh+y=IUc`323WZ@FpNYrO_bEk>TAC9+V$hUJv?!0t;!Q!_n##SZj`UzeuJhrs0=^ zQm7Tzz-LU;DCmi6pu;=}6fi86!oCGMK~Yd7B?2+X8hKAd8Q5B|Y|sfTM9@4|7*#q5 zLm(AVjP3{oFVAD{61&(ZBrZx&5_R^J>X+@8c=qZ-ze~cYeg#CN#4|$QlqaRWg)6$b*K**+! zi_8b}>bNig#jU(IxaFF%&X(VfRIfc7nu*{)p21!$fk~q%m?%8xG*4OQ^!T-gL!pa z7!b0l<0A9HygDun2-(zek@;X=9Tx_KZ0fkkd@!$$3j;znbzEdVm{-Sz0U?_@E;1j? ztK-6ekWC#InGfdGabZBnrjCou2lMK=#^1}Si8(mQEhW6>gT_psQ=zV|DRD*ilwN}SEIL0pP{Jf z@{_AhR#Vi-Se?()p#J-d_x&Befm6p`y>N)1e|_#hS9a|@2zUT`*RQy4U2$Ex^!nD(x81mShwF)&?N67UdTj%LbJWudwyfNE z)bvHov)vab{BJF_OZf0%FxGu^t&Gn%L2|qW$qdY`XAn z>(rN~T{wAIm5<-OyJzytHJ`bUT{v2``=njH_i)*pugt$Ny6ejT81+c!6FVH6%MMIl za&P3|+9`V%Pint?Z*ODe*(0O2pZnL7Pi?vtrboUDCNBXK&pr6T`tgU_H}4T{*?0Zp z?4_&I+%JP!{QO)Zgy>X~&q$z2mm^&R^fN>h9y`=7kTbSX#Qupik68pa&v*p@-(?b5$Bjw(*w>lsHdynlYV;F9=S&cvH8rQbq%dfVp zFTOMBaOos)`R3lE-kRU-G4j*iUw3(waP{HY>+fHqH0``Syshh#@e5xBjL&{!{jLf3 zmt7G`ZGm}h-%iDmJ#^34KWO@6=?-=J&t7^# note.html过来就没有reopen事件了? - // note.html -> login.html -> note.html, 使得两次bind - /* - if(gui.App._events) { - gui.App._events.reopen = function() { - win.show(); - win.focus(); - } - } else { - gui.App.on('reopen', function() { - win.show(); - win.focus(); - }); - } - */ - $('.tool-min, .tool-min-blur').click(function() { gui.win.minimize(); }); @@ -56,6 +41,29 @@ $(function() { } }); + // Tray + /* + + var electron = nodeRequire('electron'); + var Menu = electron.remote.Menu; + var Tray = electron.remote.Tray; + var appIcon = new Tray(projectPath + '/public/images/logo/tray.png') + var contextMenu = Menu.buildFromTemplate([ + { + label: '打开', click: function () { + alert(3); + } + }, + { + label: '关闭', click: function () { + alert(3); + } + }, + ]); + appIcon.setToolTip('This is my application.') + appIcon.setContextMenu(contextMenu) + */ + }); // bind close event @@ -73,6 +81,7 @@ function Menu() { document.execCommand('cut'); } else { /* + // 不知道什么原因, 可能是Chrome的原因 We don't execute document.execCommand() this time, because it is called recursively. console.log('tinymce中没用'); setTimeout(function() { diff --git a/public/js/app/page.js b/public/js/app/page.js index 3f21c506..c3255fb7 100644 --- a/public/js/app/page.js +++ b/public/js/app/page.js @@ -1450,6 +1450,11 @@ function initPage(initedCallback) { }); }); + ipc.send('show-tray', { + Open: getMsg('Open'), + Close: getMsg('Close') + }); + // 注入前端变量# WebService.set(Notebook, Note, Attach, Tag); diff --git a/public/js/app/service.js b/public/js/app/service.js index bc6c9c26..7fe51a6d 100644 --- a/public/js/app/service.js +++ b/public/js/app/service.js @@ -39,3 +39,5 @@ var NodeFs = require('fs'); Service.dispatch = function() {}; var gui = require('gui'); // var remote = require('remote'); + +var projectPath = __dirname; diff --git a/public/langs/zh-cn.js b/public/langs/zh-cn.js index 2373260f..141f1adf 100644 --- a/public/langs/zh-cn.js +++ b/public/langs/zh-cn.js @@ -310,5 +310,8 @@ "localAccountTips": "你好, 您使用的是本地离线帐户, 您的数据只存在本地, 不会同步到Leanote服务器, 如果您不小心删除了数据或硬盘损坏, 您的数据将永久丢失.
所以我们推荐您使用Leanote帐户来使用该客户端, 这样您的数据将会存储到云端, 以避免失误造成的数据丢失.
Leanote桌面端不再支持创建本地帐户, 但您之前创建的本地帐户还是可以继续使用.", "Don't Show Anymore": "不再提示", - "ctrl/cmd+e Toggle Modify with Readonly": "ctrl/cmd+e 切换编辑与只读" + "ctrl/cmd+e Toggle Modify with Readonly": "ctrl/cmd+e 切换编辑与只读", + + "Open": "打开", + "Close": "关闭" } \ No newline at end of file