Astackmiento de menús contextuales en electron

Estoy creando una aplicación basada en Electrón que contiene una cuadrícula que contiene filas únicas. Me gustaría un menú contextual que sea específico para cada fila. Aquí hay un ejemplo:

Imagen de GUI con menú contextual

Aunque esta captura de pantalla está recortada, puede ver que hay varias filas y cada fila contiene datos separados. Como me gustaría hacer clic con el botón derecho en una fila y obtener un menú de contexto único, he implementado el menú de contexto electrónico , que funciona con el primer clic con el botón derecho, pero luego los siguientes clics con el botón derecho provocan un efecto de astackmiento de los menús contextuales .

Específicamente, esto es lo que sucede:

  1. Hago clic derecho en la fila 1 y aparece el menú de contexto adecuado.
  2. Hago clic derecho en la Fila-2 y aparece una repetición del menú contextual para la Fila-1 y luego el menú contextual de la Fila-2. (Observe en la captura de pantalla que el menú contextual que muestra no corresponde a la fila en la que mi mouse ha terminado)
  3. Esto se repite.

En React.JS, aquí está mi oyente, que recostack el objeto electron-context-menu según lo requiera el módulo de electron-context-menu :

  handleContextMenu() { this.props.contextMenu({ window: electron.remote.BrowserWindow.getFocusedWindow(), prepend: (params, browserWindow) => [{ label: `Library Compare ${this.state.msn}`, click: () => this.runLibCompare() }], append: (params, browserWindow) => [{ label: '---', }] }) }; 

Donde this.props.contextMenu(...) calcula los componentes de React.JS para alimentar:

 const contextMenu = eRequire('electron-context-menu'); 

He hecho una depuración masiva y no creo que el problema sea el módulo. El módulo que estoy usando esencialmente organiza la información sobre el menú contextual y luego utiliza funciones de electron.remote y una función menu.popup que proviene de los componentes internos de electron. Aquí hay un enlace a la línea específica en github .

 const menu = (electron.Menu || electron.remote.Menu).buildFromTemplate(menuTpl); menu.popup(electron.remote ? electron.remote.getCurrentWindow() : win); 

Esta llamada a menu.popup conduce a esta línea en electrón .

  const remoteMemberFunction = function (...args) { if (this && this.constructor === remoteMemberFunction) { // Constructor call. let ret = ipcRenderer.sendSync('ELECTRON_BROWSER_MEMBER_CONSTRUCTOR', metaId, member.name, wrapArgs(args)) return metaToValue(ret) } else { // Call member function. let ret = ipcRenderer.sendSync('ELECTRON_BROWSER_MEMBER_CALL', metaId, member.name, wrapArgs(args)) return metaToValue(ret) } 

}

Entonces veo una llamada a ipcRender.sendSync ; sin embargo, cuando agrego sentencias de depuración en el receptor de esas llamadas de ipcMain , ¡no veo ninguna salida!

 ipcMain.on('ELECTRON_BROWSER_MEMBER_CALL', function (event, id, method, args) { try { args = unwrapArgs(event.sender, args) let obj = objectsRegistry.get(id) if (obj == null) { throwRPCError(`Cannot call function '${method}' on missing remote object ${id}`) } callFunction(event, obj[method], obj, args) } catch (error) { event.returnValue = exceptionToMeta(error) } }) 

Cuando agregué sentencias de depuración a la función anterior, no vi ningún resultado. Y ahí es donde mi búsqueda es su muro.

Estoy usando electron 1.4.15. Sé que este problema debería resolverse, ya que, después de todo, el IDE de Atom (que está basado en electrón) no tiene este problema a pesar de que tiene varios menús contextuales.

Creo que hay algo de memoria que necesito limpiar en algún lugar, ¡simplemente no puedo encontrar la manera de borrar la stack de los menús contextuales anteriores!

Resuelvo esto obteniendo primero el objective del clic con e.target. Luego, dependiendo de eso, llamo al correspondiente menú de contexto. Si el objective no está en la lista de objectives de mi aplicación, uso un menú contextual predeterminado.

 window.addEventListener( "contextmenu", e => { e.preventDefault(); if (e.target.id === 'fullscr'){ console.log(e && e.target); // e.preventDefault(); mymenu.popup(remote.getCurrentWindow()); }else{ editmenu.popup(remote.getCurrentWindow()); } console.log(e.which); }, false ); 
    Intereting Posts