ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Menu 작성하기
    Javascript/electron 2017. 9. 8. 00:28
    반응형

    electron에서 매뉴얼을 따라서 Menu 기능을 구현하려고 하였다.

    근데 안되는 것이다...

    오타가 있나 해서 예제의 소스코드를 그대로 복사해서 갖다 붙혀도

    Menu가 전혀 생성되지 않았다.

    예제 소스코드는 다음과 같다.
      const {app, Menu} = require('electron')
    
      const template = [
        {
          label: 'Edit',
          submenu: [
            {role: 'undo'},
            {role: 'redo'},
            {type: 'separator'},
            {role: 'cut'},
            {role: 'copy'},
            {role: 'paste'},
            {role: 'pasteandmatchstyle'},
            {role: 'delete'},
            {role: 'selectall'}
          ]
        },
        {
          label: 'View',
          submenu: [
            {role: 'reload'},
            {role: 'forcereload'},
            {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',
              click () { require('electron').shell.openExternal('https://electron.atom.io') }
            }
          ]
        }
      ]
    
      if (process.platform === 'darwin') {
        template.unshift({
          label: app.getName(),
          submenu: [
            {role: 'about'},
            {type: 'separator'},
            {role: 'services', submenu: []},
            {type: 'separator'},
            {role: 'hide'},
            {role: 'hideothers'},
            {role: 'unhide'},
            {type: 'separator'},
            {role: 'quit'}
          ]
        })
    
        // Edit menu
        template[1].submenu.push(
          {type: 'separator'},
          {
            label: 'Speech',
            submenu: [
              {role: 'startspeaking'},
              {role: 'stopspeaking'}
            ]
          }
        )
    
        // Window menu
        template[3].submenu = [
          {role: 'close'},
          {role: 'minimize'},
          {role: 'zoom'},
          {type: 'separator'},
          {role: 'front'}
        ]
      }
    
      const menu = Menu.buildFromTemplate(template)
      Menu.setApplicationMenu(menu)
    


    아무리 실행을 해봐도 아래 이미지처럼 하나의 메뉴뿐이 안나오는 것이다...
    (매뉴얼인데 왜... 으 스트레스...)



    하지만. 원인을 알아냈다.

    Main 프로세스의 app 오브젝트에서 ready 이벤트 리스너가 동작한 다음에 메뉴 설정을 해야 하는 것이었다...

    소스코드를 아래와 같이 바꾼 뒤 수행해보자.
    const {app, Menu} = require('electron');
    
    app.on('ready', () => {
      const template = [
        {
          label: 'Edit',
          submenu: [
            {role: 'undo'},
            {role: 'redo'},
            {type: 'separator'},
            {role: 'cut'},
            {role: 'copy'},
            {role: 'paste'},
            {role: 'pasteandmatchstyle'},
            {role: 'delete'},
            {role: 'selectall'}
          ]
        },
        {
          label: 'View',
          submenu: [
            {role: 'reload'},
            {role: 'forcereload'},
            {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',
              click () { require('electron').shell.openExternal('https://electron.atom.io') }
            }
          ]
        }
      ];
    
      if (process.platform === 'darwin') {
        template.unshift({
          label: app.getName(),
          submenu: [
            {role: 'about'},
            {type: 'separator'},
            {role: 'services', submenu: []},
            {type: 'separator'},
            {role: 'hide'},
            {role: 'hideothers'},
            {role: 'unhide'},
            {type: 'separator'},
            {role: 'quit'}
          ]
        });
    
        // Edit menu
        template[1].submenu.push(
          {type: 'separator'},
          {
            label: 'Speech',
            submenu: [
              {role: 'startspeaking'},
              {role: 'stopspeaking'}
            ]
          }
        );
    
        // Window menu
        template[3].submenu = [
          {role: 'close'},
          {role: 'minimize'},
          {role: 'zoom'},
          {type: 'separator'},
          {role: 'front'}
        ]
      }
    
      const menu = Menu.buildFromTemplate(template);
      Menu.setApplicationMenu(menu);
    });
    
    


    app 이벤트의 ready 리스너의 콜백에서 template 선언 및 Menu 설정들이 이루어진다는 것이 포인트!다.

    자, 그럼 실행을 해보면 아래 이미지처럼 Menu들이 이쁘게 생성됨을 확인할 수 있다.







    오늘의 교훈

    매뉴얼이라고 모두 믿지 말자


    반응형

    댓글

Designed by Tistory.