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