index.js 9.04 KiB
Newer Older
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
// This file is part of Parity.
//
// SPDX-License-Identifier: BSD-3-Clause

import electron from 'electron';
import settings from 'electron-settings';

import { IS_PROD } from '../../constants';
import i18n from '../i18n';
// Preferences menu
const getPreferences = fetherApp => {
  return {
    label: i18n.t('menu.file.preferences.languages.submenu_name'),
    submenu: [
      {
        label: i18n.t('menu.file.preferences.languages.english'),
        type: 'radio',
        checked: settings.get('fether-language') === 'en',
        click () {
          // Backend menu change language
          i18n.changeLanguage('en');
          settings.set('fether-language', 'en');
          fetherApp.setupMenu(fetherApp);
          // Frontend change language
          fetherApp.win.webContents.send('send-to-renderer', {
            action: 'SET_LANGUAGE_RESPONSE',
            from: 'fether:electron',
            payload: 'en'
          });
      },
      {
        label: i18n.t('menu.file.preferences.languages.german'),
        type: 'radio',
        checked: settings.get('fether-language') === 'de',
        click () {
          // Backend menu change language
          i18n.changeLanguage('de');
          settings.set('fether-language', 'de');
          fetherApp.setupMenu(fetherApp);
          // Frontend change language
          fetherApp.win.webContents.send('send-to-renderer', {
            action: 'SET_LANGUAGE_RESPONSE',
            from: 'fether:electron',
            payload: 'de'
          });
// Create the Application's main menu
// https://github.com/electron/electron/blob/master/docs/api/menu.md#examples
const getMenubarMenuTemplate = fetherApp => {
  // File menu
  const fileTab =
    process.platform === 'darwin'
      ? {
        label: i18n.t('menu.file.submenu_name'),
          { role: 'about', label: i18n.t('menu.file.about') },
          {
            label: i18n.t('menu.file.preferences.submenu_name'),
            submenu: [getPreferences(fetherApp)]
          },
          {
            role: 'services',
            label: i18n.t('menu.file.services'),
            submenu: []
          },
          { role: 'hide', label: i18n.t('menu.file.hide') },
          { role: 'hideothers', label: i18n.t('menu.file.hide_others') },
          { role: 'unhide', label: i18n.t('menu.file.unhide') },
          { type: 'separator' },
          { role: 'quit', label: i18n.t('menu.file.quit') }
        label: i18n.t('menu.file.submenu_name'),
        submenu: [{ role: 'quit', label: i18n.t('menu.file.quit') }]
  /* eslint-disable no-sparse-arrays */
  const editTabMacOS = {
    label: i18n.t('menu.edit.submenu_name'),
      { role: 'undo', label: i18n.t('menu.edit.undo') },
      { role: 'redo', label: i18n.t('menu.edit.redo') },
      { role: 'cut', label: i18n.t('menu.edit.cut') },
      { role: 'copy', label: i18n.t('menu.edit.copy') },
      { role: 'paste', label: i18n.t('menu.edit.paste') },
      { role: 'delete', label: i18n.t('menu.edit.delete') },
      { role: 'selectall', label: i18n.t('menu.edit.select_all') }
    ]
  };
  /* eslint-enable no-sparse-arrays */

  /**
   * On win32 we need to use `webContents` to make some of the menu items
   * functional (whereas it is not required on Linux and macOS).
   * i.e on macOS/Linux `{ role: 'undo' }` suffices to add the Undo menu item,
   * whereas on win32 we must use `webContents` as follows:
   * `{ label: 'Undo', click: () => fetherApp.win.webContents.undo() }`.
   * Since all items in the 'Edit' menu work with `webContents` we will use
   * it to prevent code duplication
   */
    label: i18n.t('menu.edit.submenu_name'),
      {
        label: i18n.t('menu.edit.undo'),
        click: () => fetherApp.win.webContents.undo()
      },
      {
        label: i18n.t('menu.edit.redo'),
        click: () => fetherApp.win.webContents.redo()
      },
      {
        label: i18n.t('menu.edit.cut'),
        click: () => fetherApp.win.webContents.cut()
      },
      {
        label: i18n.t('menu.edit.copy'),
        click: () => fetherApp.win.webContents.copy()
      },
      {
        label: i18n.t('menu.edit.paste'),
        click: () => fetherApp.win.webContents.paste()
      },
        label: i18n.t('menu.edit.delete'),
        click: () => fetherApp.win.webContents.delete()
      },
      {
        label: i18n.t('menu.edit.select_all'),
    label: i18n.t('menu.view.submenu_name'),
    submenu: [{ role: 'reload', label: i18n.t('menu.view.reload') }]
  if (!IS_PROD) {
    viewTab.submenu.push({
      role: 'toggledevtools',
      label: i18n.t('menu.view.toggle_developer_tools')
    });
  }

  /**
   * On win32 we need to use `webContents` to make some of the menu items
   * functional (whereas it is not required on Linux and macOS).
   * Note that some menu items are not available in `webContents`
   * (i.e. resetzoom, zoomin, zoomout, togglefullscreen), however they
   * add no benefit to users anyway
   */
    label: i18n.t('menu.view.submenu_name'),
        label: i18n.t('menu.view.reload'),
        click: () => fetherApp.win.webContents.reload()
      },
      {
        label: i18n.t('menu.view.toggle_developer_tools'),
    label: i18n.t('menu.window.submenu_name'),
    submenu: [
      { role: 'minimize', label: i18n.t('menu.window.minimize') },
      { role: 'close', label: i18n.t('menu.window.close') }
    ]
    label: i18n.t('menu.help.submenu_name'),
        label: i18n.t('menu.help.learn_more'),
    process.platform === 'darwin' ? editTabMacOS : editTab,
    process.platform === 'win32' ? viewTabWindowsOS : viewTab,
    windowTab,
    helpTab
  ];

  if (process.platform === 'darwin') {
    // Edit menu
    template[1].submenu.push(
        label: i18n.t('menu.edit.speech.submenu_name'),
        submenu: [
          {
            role: 'startspeaking',
            label: i18n.t('menu.edit.speech.start_speaking')
          },
          {
            role: 'stopspeaking',
            label: i18n.t('menu.edit.speech.stop_speaking')
          }
        ]
  if (process.platform === 'darwin') {
    // Window menu
    template[3].submenu = [
      { role: 'close', label: i18n.t('menu.window.close') },
      { role: 'minimize', label: i18n.t('menu.window.minimize') },
      { role: 'zoom', label: i18n.t('menu.window.zoom') },
      { role: 'front', label: i18n.t('menu.window.bring_all_to_front') }
    // Remove Window menu tab when running as taskbar app
    template.splice(3, 1);
const getContextTrayMenuTemplate = fetherApp => {
  if (fetherApp.options.withTaskbar) {
    const template = [
      {
        label: i18n.t('menu.show_hide_fether'),
          if (fetherApp.win.isVisible() && fetherApp.win.isFocused()) {
            fetherApp.win.hide();
          } else {
            fetherApp.win.show();
            fetherApp.win.focus();
          }
    if (!IS_PROD) {
        label: i18n.t('menu.view.reload'),
        click: () => fetherApp.win.webContents.reload()
      });
    }

    template.push({ role: 'quit', label: i18n.t('menu.file.quit') });
    return template;
  }
};

const getContextWindowMenuTemplate = fetherApp => {
  const template = getMenubarMenuTemplate(fetherApp);

  if (fetherApp.options.withTaskbar) {
    // Remove File and Help menus in taskbar mode for window context menu
    template.shift();
    template.pop();
    template.push({
      label: i18n.t('menu.file.preferences.submenu_name'),
      submenu: [getPreferences(fetherApp)]
    });
      label: i18n.t('menu.help.submenu_name'),
          label: i18n.t('menu.help.learn_more'),
          click () {
            shell.openExternal('https://parity.io');
          }

    if (process.platform === 'darwin') {
      template[3].submenu.push({
        role: 'about',
        label: i18n.t('menu.file.about')
      });
    template.push({ role: 'quit', label: i18n.t('menu.file.quit') });
export {
  getContextTrayMenuTemplate,
  getContextWindowMenuTemplate,
  getMenubarMenuTemplate
};