mainMenu.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. /**
  2. * @author oldj
  3. * @blog http://oldj.net
  4. */
  5. 'use strict';
  6. const path = require('path');
  7. const paths = require('../libs/paths');
  8. const {Menu, shell, ipcMain, dialog} = require('electron');
  9. const m_lang = require('../lang');
  10. const pref = require('./../libs/pref');
  11. const version = require('../../version').version;
  12. exports.init = function (app, sys_lang = 'en') {
  13. let lang = m_lang.getLang(pref.get('user_language', sys_lang));
  14. let last_path = null;
  15. const template = [
  16. {
  17. label: lang.file,
  18. submenu: [
  19. {
  20. label: lang.new,
  21. accelerator: 'CommandOrControl+N',
  22. click: () => {
  23. ipcMain.emit('to_add_host');
  24. }
  25. }, {
  26. type: 'separator'
  27. }, {
  28. label: lang.import,
  29. accelerator: 'Alt+CommandOrControl+I',
  30. click: () => {
  31. dialog.showOpenDialog({
  32. title: lang.import,
  33. defaultPath: path.join(last_path || paths.home_path, 'sh.json'),
  34. filters: [
  35. {name: 'JSON', extensions: ['json']},
  36. {name: 'All Files', extensions: ['*']}
  37. ]
  38. }, (fns) => {
  39. if (fns && fns.length > 0) {
  40. ipcMain.emit('to_import', fns[0]);
  41. last_path = path.dirname(fns[0]);
  42. }
  43. });
  44. }
  45. }, {
  46. label: lang.export,
  47. accelerator: 'Alt+CommandOrControl+E',
  48. click: () => {
  49. dialog.showSaveDialog({
  50. title: lang.export,
  51. defaultPath: path.join(last_path || paths.home_path, 'sh.json'),
  52. filters: [
  53. {name: 'JSON', extensions: ['json']},
  54. {name: 'All Files', extensions: ['*']}
  55. ]
  56. }, (fn) => {
  57. if (fn) {
  58. ipcMain.emit('to_export', fn);
  59. last_path = path.dirname(fn);
  60. }
  61. });
  62. }
  63. }, {
  64. type: 'separator'
  65. }, {
  66. label: lang.preferences,
  67. accelerator: 'CommandOrControl+,',
  68. click: () => {
  69. app.mainWindow.webContents.send('show_preferences');
  70. }
  71. }
  72. ]
  73. },
  74. {
  75. label: lang.edit,
  76. submenu: [{
  77. role: 'undo'
  78. }, {
  79. role: 'redo'
  80. }, {
  81. type: 'separator'
  82. }, {
  83. role: 'cut'
  84. }, {
  85. role: 'copy'
  86. }, {
  87. role: 'paste'
  88. }, {
  89. role: 'pasteandmatchstyle'
  90. }, {
  91. role: 'delete'
  92. }, {
  93. role: 'selectall'
  94. }, {
  95. type: 'separator'
  96. }, {
  97. label: lang.search,
  98. accelerator: 'CommandOrControl+F',
  99. click () {
  100. // ipcMain.emit('to_search');
  101. app.mainWindow.webContents.send('to_search');
  102. }
  103. }, {
  104. label: lang.comment,
  105. accelerator: 'CommandOrControl+/',
  106. click () {
  107. // ipcMain.emit('to_search');
  108. app.mainWindow.webContents.send('to_comment');
  109. }
  110. }]
  111. }, {
  112. label: lang.view,
  113. submenu: [
  114. // {
  115. // label: 'Reload',
  116. // accelerator: 'CmdOrCtrl+R',
  117. // click (item, focusedWindow) {
  118. // if (focusedWindow) focusedWindow.reload()
  119. // }
  120. // },
  121. // {
  122. // label: 'Toggle Developer Tools',
  123. // accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I',
  124. // click (item, focusedWindow) {
  125. // if (focusedWindow) focusedWindow.webContents.toggleDevTools()
  126. // }
  127. // },
  128. // {
  129. // type: 'separator'
  130. // },
  131. {
  132. role: 'resetzoom'
  133. }, {
  134. role: 'zoomin'
  135. }, {
  136. role: 'zoomout'
  137. }, {
  138. type: 'separator'
  139. }, {
  140. role: 'togglefullscreen'
  141. }
  142. ]
  143. }, {
  144. label: lang.window,
  145. role: 'window',
  146. submenu: [{
  147. role: 'minimize'
  148. }, {
  149. role: 'close'
  150. }]
  151. }, {
  152. label: lang.help,
  153. role: 'help',
  154. submenu: [{
  155. label: lang.check_update,
  156. click () {
  157. require('../../bg/check_for_update').check();
  158. }
  159. }, {
  160. type: 'separator'
  161. }, {
  162. label: lang.feedback,
  163. click () {
  164. shell.openExternal('https://github.com/oldj/SwitchHosts/issues');
  165. }
  166. }, {
  167. label: lang.homepage,
  168. click () {
  169. shell.openExternal('http://oldj.github.io/SwitchHosts/');
  170. }
  171. }]
  172. }
  173. ];
  174. const name = require('electron').app.getName();
  175. const os = process.platform;
  176. if (os === 'darwin') {
  177. template.unshift({
  178. label: name,
  179. submenu: [{
  180. role: 'about'
  181. }, {
  182. type: 'separator'
  183. },
  184. // {
  185. // role: 'services',
  186. // submenu: []
  187. // },
  188. // {
  189. // type: 'separator'
  190. // },
  191. {
  192. role: 'hide'
  193. }, {
  194. role: 'hideothers'
  195. }, {
  196. role: 'unhide'
  197. }, {
  198. type: 'separator'
  199. }, {
  200. role: 'quit'
  201. }]
  202. });
  203. // Edit menu.
  204. /*template[2].submenu.push(
  205. {
  206. type: 'separator'
  207. },
  208. {
  209. label: 'Speech',
  210. submenu: [
  211. {
  212. role: 'startspeaking'
  213. },
  214. {
  215. role: 'stopspeaking'
  216. }
  217. ]
  218. }
  219. );*/
  220. // Window menu.
  221. template[4].submenu = [
  222. {
  223. label: 'Close',
  224. accelerator: 'CmdOrCtrl+W',
  225. role: 'close'
  226. },
  227. {
  228. label: 'Minimize',
  229. accelerator: 'CmdOrCtrl+M',
  230. role: 'minimize'
  231. },
  232. {
  233. label: 'Zoom',
  234. role: 'zoom'
  235. },
  236. {
  237. type: 'separator'
  238. },
  239. {
  240. label: 'Bring All to Front',
  241. role: 'front'
  242. }
  243. ]
  244. } else if (os == 'win32') {
  245. template[0].submenu.unshift({
  246. type: 'separator'
  247. });
  248. template[0].submenu.unshift({
  249. role: 'about',
  250. click: () => {
  251. dialog.showMessageBox({
  252. type: 'info',
  253. buttons: [],
  254. title: 'About',
  255. message: `${name} v${version.slice(0, 3).join('.')} (${version[3]})`
  256. });
  257. }
  258. });
  259. template[0].submenu.push({
  260. type: 'separator'
  261. });
  262. template[0].submenu.push({
  263. label: 'Quit',
  264. role: 'quit',
  265. accelerator: 'CmdOrCtrl+Q',
  266. });
  267. // VIEW
  268. template[2].submenu.splice(0, 4);
  269. }
  270. if (process.env.ENV == 'dev') {
  271. // VIEW
  272. template[3].submenu = [
  273. {
  274. label: 'Reload',
  275. accelerator: 'CmdOrCtrl+R',
  276. click (item, focusedWindow) {
  277. if (focusedWindow) focusedWindow.reload()
  278. }
  279. },
  280. {
  281. label: 'Toggle Developer Tools',
  282. accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I',
  283. click (item, focusedWindow) {
  284. if (focusedWindow) focusedWindow.webContents.toggleDevTools()
  285. }
  286. },
  287. {
  288. type: 'separator'
  289. }
  290. ].concat(template[3].submenu);
  291. }
  292. const menu = Menu.buildFromTemplate(template);
  293. Menu.setApplicationMenu(menu);
  294. }
  295. ;