mainMenu.js 8.7 KB

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