Electron - Menús

Las aplicaciones de escritorio vienen con dos tipos de menús: el application menu(en la barra superior) y un context menu(menú contextual). Aprenderemos cómo crear ambos en este capítulo.

Usaremos dos módulos: los módulos Menú y MenuItem . Tenga en cuenta que los módulos Menu y MenuItem solo están disponibles en el proceso principal. Para usar estos módulos en el proceso de renderizado, necesita el módulo remoto . Nos encontraremos con esto cuando creemos un menú contextual.

Ahora, creemos un nuevo main.js archivo para el proceso principal -

const {app, BrowserWindow, Menu, MenuItem} = require('electron')
const url = require('url')
const path = require('path')

let win

function createWindow() {
   win = new BrowserWindow({width: 800, height: 600})
   win.loadURL(url.format ({
      pathname: path.join(__dirname, 'index.html'),
      protocol: 'file:',
      slashes: true
   }))
}

const template = [
   {
      label: 'Edit',
      submenu: [
         {
            role: 'undo'
         },
         {
            role: 'redo'
         },
         {
            type: 'separator'
         },
         {
            role: 'cut'
         },
         {
            role: 'copy'
         },
         {
            role: 'paste'
         }
      ]
   },
   
   {
      label: 'View',
      submenu: [
         {
            role: 'reload'
         },
         {
            role: 'toggledevtools'
         },
         {
            type: 'separator'
         },
         {
            role: 'resetzoom'
         },
         {
            role: 'zoomin'
         },
         {
            role: 'zoomout'
         },
         {
            type: 'separator'
         },
         {
            role: 'togglefullscreen'
         }
      ]
   },
   
   {
      role: 'window',
      submenu: [
         {
            role: 'minimize'
         },
         {
            role: 'close'
         }
      ]
   },
   
   {
      role: 'help',
      submenu: [
         {
            label: 'Learn More'
         }
      ]
   }
]

const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)
app.on('ready', createWindow)

Estamos creando un menú a partir de una plantilla aquí. Esto significa que proporcionamos el menú como un JSON a la función y se encargará del resto. Ahora tenemos que configurar este menú como el menú Aplicación.

Ahora cree un archivo HTML vacío llamado index.html y ejecute esta aplicación usando -

$ electron ./main.js

En la posición normal de los menús de la aplicación, verá un menú basado en la plantilla anterior.

Creamos este menú a partir del proceso principal. Creemos ahora un menú contextual para nuestra aplicación. Haremos esto en nuestro archivo HTML -

<!DOCTYPE html>
<html>
   <head>
      <meta charset = "UTF-8">
      <title>Menus</title>
   </head>
   
   <body>
      <script type = "text/javascript">
         const {remote} = require('electron')
         const {Menu, MenuItem} = remote

         const menu = new Menu()

         // Build menu one item at a time, unlike
         menu.append(new MenuItem ({
            label: 'MenuItem1',
            click() { 
               console.log('item 1 clicked')
            }
         }))
         
         menu.append(new MenuItem({type: 'separator'}))
         menu.append(new MenuItem({label: 'MenuItem2', type: 'checkbox', checked: true}))
         menu.append(new MenuItem ({
            label: 'MenuItem3',
            click() {
               console.log('item 3 clicked')
            }
         }))

         // Prevent default action of right click in chromium. Replace with our menu.
         window.addEventListener('contextmenu', (e) => {
            e.preventDefault()
            menu.popup(remote.getCurrentWindow())
         }, false)
      </script>
   </body>
</html>

Importamos los módulos Menu y MenuItem usando el módulo remoto; luego, creamos un menú y le agregamos nuestros elementos de menú uno por uno. Además, evitamos la acción predeterminada de hacer clic derecho en cromo y la reemplazamos con nuestro menú.

La creación de menús en Electron es una tarea muy sencilla. Ahora puede adjuntar sus controladores de eventos a estos elementos y manejar los eventos de acuerdo con sus necesidades.