OSDN Git Service

update bytom desktop version.
[bytom/bytom-electron.git] / modules / menus / application-menu.js
1 const { Menu, app, shell, ipcMain, dialog , nativeImage} = require('electron')
2 const settings = require('electron-settings')
3 global.language = settings.get('browserSetting.core.lang') || app.getLocale()
4 const i18n = require('../i18n.js')
5 global.i18n = i18n
6 const path = require('path')
7 const logger = require('../logger')
8 const log = logger.create('menu')
9
10 let advNav = settings.get('browserSetting.app.navAdvancedState') || 'normal'
11 let btmAmountUnit = settings.get('browserSetting.core.btmAmountUnit') || 'BTM'
12 let menu = null
13
14 const logFolder = {logFolder: path.join(app.getPath('userData'), 'logs')}
15 const loggerOptions = Object.assign(logFolder)
16 logger.setup(loggerOptions)
17
18 let menuTempl = function () {
19   const menu = []
20   // APP
21   const fileMenu = []
22   const name = app.getName()
23
24   if (process.platform === 'darwin') {
25     fileMenu.push(
26       {
27         label: i18n.t('desktop.applicationMenu.app.about', { name }),
28         role: 'about'
29       },
30       {
31         type: 'separator',
32       },
33       {
34         label: i18n.t('desktop.applicationMenu.app.services', { name }),
35         role: 'services',
36         submenu: [],
37       },
38       {
39         type: 'separator',
40       },
41       {
42         label: i18n.t('desktop.applicationMenu.app.hide', { name }),
43         accelerator: 'Command+H',
44         role: 'hide',
45       },
46       {
47         label: i18n.t('desktop.applicationMenu.app.hideOthers', { name }),
48         accelerator: 'Command+Alt+H',
49         role: 'hideothers',
50       },
51       {
52         label: i18n.t('desktop.applicationMenu.app.showAll', { name }),
53         role: 'unhide',
54       },
55       {
56         type: 'separator',
57       }
58     )
59   }
60
61   fileMenu.push({
62     label: i18n.t('desktop.applicationMenu.app.quit', { name }),
63     accelerator: 'CommandOrControl+Q',
64     click() {
65       app.quit()
66     },
67   })
68
69   menu.push({
70     label: i18n.t('desktop.applicationMenu.app.label', { name }),
71     submenu: fileMenu,
72   })
73
74
75   // View Account
76   menu.push({
77     label: i18n.t('desktop.applicationMenu.account.label'),
78     submenu: [{
79       label:  i18n.t('desktop.applicationMenu.account.new'),
80       accelerator: 'CommandOrControl+N',
81       click: (item, focusedWindow) => {
82         if (focusedWindow) {
83           focusedWindow.webContents.send('redirect', '/accounts/create')
84         }
85       }
86     }]
87   })
88
89
90   //EDIT
91   menu.push({
92     label: i18n.t('desktop.applicationMenu.edit.label'),
93     submenu: [
94       {
95         label: i18n.t('desktop.applicationMenu.edit.undo'),
96         accelerator: 'CommandOrControl+Z',
97         role: 'undo',
98       },
99       {
100         label: i18n.t('desktop.applicationMenu.edit.redo'),
101         accelerator: 'Shift+CommandOrControl+Z',
102         role: 'redo',
103       },
104       {
105         type: 'separator',
106       },
107       {
108         label: i18n.t('desktop.applicationMenu.edit.cut'),
109         accelerator: 'CommandOrControl+X',
110         role: 'cut',
111       },
112       {
113         label: i18n.t('desktop.applicationMenu.edit.copy'),
114         accelerator: 'CommandOrControl+C',
115         role: 'copy',
116       },
117       {
118         label: i18n.t('desktop.applicationMenu.edit.paste'),
119         accelerator: 'CommandOrControl+V',
120         role: 'paste',
121       },
122       {
123         label: i18n.t('desktop.applicationMenu.edit.selectAll'),
124         accelerator: 'CommandOrControl+A',
125         role: 'selectall',
126       },
127     ],
128   })
129
130
131   // LANGUAGE (VIEW)
132   const defaultLanguage = i18n.getBestMatchedLangCode(app.getLocale())
133   let currentLanguage = settings.get('browserSetting.core.lang') || defaultLanguage
134   const LanguageMenu = [{
135     label: i18n.t('desktop.applicationMenu.view.default'),
136     type: 'checkbox',
137     click: (item, focusedWindow) => {
138       if (focusedWindow) {
139         i18n.changeLanguage(defaultLanguage, (err, t) => {
140           if (err) return log.error('something went wrong loading', err)
141           focusedWindow.webContents.send('lang', defaultLanguage)
142           createMenu()
143         })
144       }
145     }
146   },{
147     type: 'separator'
148   },{
149     label: i18n.t('desktop.applicationMenu.view.langCodes.zh'),
150     type: 'checkbox',
151     checked: currentLanguage === 'zh',
152     click: (item, focusedWindow) => {
153       if (focusedWindow) {
154         i18n.changeLanguage('zh', (err, t) => {
155           if (err) return log.error('something went wrong loading', err)
156           focusedWindow.webContents.send('lang', 'zh')
157           createMenu()
158         })
159
160       }
161     }
162   },{
163     label: i18n.t('desktop.applicationMenu.view.langCodes.en'),
164     type: 'checkbox',
165     checked: currentLanguage === 'en',
166     click: (item, focusedWindow) => {
167       if (focusedWindow) {
168         i18n.changeLanguage('en', (err, t) => {
169           if (err) return log.error('something went wrong loading', err)
170           focusedWindow.webContents.send('lang', 'en')
171           createMenu()
172         })
173       }
174     }
175   }]
176
177
178
179   menu.push({
180     label: i18n.t('desktop.applicationMenu.view.label'),
181     submenu: [{
182       label: i18n.t('desktop.applicationMenu.view.btmAmountUnit'),
183       submenu:[{
184         label: 'BTM',
185         type: 'checkbox',
186         checked: btmAmountUnit === 'BTM',
187         click: (item, focusedWindow) => {
188           if (focusedWindow) {
189             focusedWindow.webContents.send('btmAmountUnitState', 'BTM')
190           }
191         }
192       },{
193         label: 'mBTM',
194         type: 'checkbox',
195         checked: btmAmountUnit === 'mBTM',
196         click: (item, focusedWindow) => {
197           if (focusedWindow) {
198             focusedWindow.webContents.send('btmAmountUnitState', 'mBTM')
199           }
200         }
201       },{
202         label: 'NEU',
203         type: 'checkbox',
204         checked: btmAmountUnit === 'NEU',
205         click: (item, focusedWindow) => {
206           if (focusedWindow) {
207             focusedWindow.webContents.send('btmAmountUnitState', 'NEU')
208           }
209         }
210       }]
211     }, {
212       label: i18n.t('desktop.applicationMenu.view.advNav'),
213       type: 'checkbox',
214       checked: advNav === 'advance',
215       click: (item, focusedWindow) => {
216         if (focusedWindow) {
217           if(advNav === 'advance'){
218             focusedWindow.webContents.send('toggleNavState', 'normal')
219           }else{
220             focusedWindow.webContents.send('toggleNavState', 'advance')
221           }
222         }
223       }
224     },{
225       type: 'separator'
226     },{
227       label: i18n.t('desktop.applicationMenu.view.languages'),
228       submenu: LanguageMenu
229     }]
230   })
231
232   const devToolsMenu =[]
233   devToolsMenu.push({
234     label: i18n.t('desktop.applicationMenu.develop.devTools'),
235     accelerator: (() => {
236       if (process.platform === 'darwin') {
237         return 'Alt+Command+I'
238       } else {
239         return 'Ctrl+Shift+I'
240       }
241     })(),
242     click: (item, focusedWindow) => {
243       if (focusedWindow) {
244         focusedWindow.toggleDevTools()
245       }
246     }
247   },{
248     label: i18n.t('desktop.applicationMenu.develop.fullScreen'),
249     accelerator: (() => {
250       if (process.platform === 'darwin') {
251         return 'Ctrl+Command+F'
252       } else {
253         return 'F11'
254       }
255     })(),
256     click: (item, focusedWindow) => {
257       if (focusedWindow) {
258         focusedWindow.setFullScreen(!focusedWindow.isFullScreen())
259       }
260     }
261   },{
262     label: i18n.t('desktop.applicationMenu.develop.logFiles'),
263     click() {
264       try {
265         shell.showItemInFolder(path.join(app.getPath('userData'), 'logs', 'bytomd', 'bytomd.log'))
266       } catch (error) {
267         log.error(error)
268       }
269     },
270   },{
271     type: 'separator'
272   },{
273     label: (global.mining.isMining) ? i18n.t('desktop.applicationMenu.develop.stopMining') : i18n.t('desktop.applicationMenu.develop.startMining'),
274     accelerator: 'CommandOrControl+Shift+M',
275     enabled: true,
276     click: (item, focusedWindow) => {
277       if (focusedWindow) {
278         if (global.mining.isMining) {
279           stopMining(focusedWindow)
280         } else {
281           startMining(focusedWindow)
282         }
283       }
284     }
285   })
286
287   menu.push({
288     label: i18n.t('desktop.applicationMenu.develop.label'),
289     submenu: devToolsMenu,
290   })
291
292   // HELP
293   const helpMenu = []
294   const logo = nativeImage.createFromPath( path.join(__dirname, '../../static/images/app-icon/png/app-logo.png'))
295
296   if (process.platform === 'freebsd' || process.platform === 'linux' ||
297     process.platform === 'sunos' || process.platform === 'win32') {
298     helpMenu.push(
299       {
300         label: i18n.t('desktop.applicationMenu.app.about', { app: name }),
301         click() {
302           const options = {
303             title: `${i18n.t('desktop.applicationMenu.app.about')} ${name}`,
304             message: `${name} \n\n${i18n.t('desktop.applicationMenu.help.version')}: ${app.getVersion()}\nLicense: AGPL-3.0-only`,
305             buttons: [i18n.t('desktop.global.ok')],
306             icon: logo
307           }
308           dialog.showMessageBox( options )
309         }
310       }
311     )
312   }
313
314   helpMenu.push({
315     label: i18n.t('desktop.applicationMenu.help.bytomWiki'),
316     click() {
317       shell.openExternal('https://github.com/bytom/bytom/wiki')
318     },
319   }, {
320     label: i18n.t('desktop.applicationMenu.help.reportBug'),
321     click() {
322       shell.openExternal('https://github.com/bytom/bytom/issues')
323     },
324   })
325
326   menu.push({
327     label: i18n.t('desktop.applicationMenu.help.label'),
328     role: 'help',
329     submenu: helpMenu,
330   })
331
332   return menu
333 }
334
335 const startMining = (focusedWindow) => {
336   focusedWindow.webContents.send('mining', 'true')
337   global.mining.isMining = true
338   createMenu()
339 }
340
341 const stopMining = (focusedWindow) => {
342   focusedWindow.webContents.send('mining', 'false')
343   global.mining.isMining = false
344   createMenu()
345 }
346
347 const createMenu = function () {
348   menu = Menu.buildFromTemplate(menuTempl())
349   Menu.setApplicationMenu(menu)
350 }
351
352 settings.watch('browserSetting.app.navAdvancedState', newValue => {
353   advNav = newValue
354   menu.items[3].submenu.items[1].checked = ( advNav === 'advance' )
355 })
356
357 settings.watch('browserSetting.core.btmAmountUnit', newValue => {
358   btmAmountUnit = newValue
359   menu.items[3].submenu.items[0].submenu.items[0].checked = ( btmAmountUnit === 'BTM' )
360   menu.items[3].submenu.items[0].submenu.items[1].checked = ( btmAmountUnit === 'mBTM' )
361   menu.items[3].submenu.items[0].submenu.items[2].checked = ( btmAmountUnit === 'NEU' )
362 })
363
364 settings.watch('browserSetting.core.lang', newValue => {
365   i18n.changeLanguage(newValue, (err, t) => {
366     if (err) return log.error('i18n: something went wrong loading', err)
367     createMenu()
368   })
369 })
370
371 ipcMain.on('refresh-menu', function() {
372   createMenu()
373 })
374
375 module.exports = createMenu()