서론
Electron 프로젝트를 처음 만들면, 상단에 다음과 같이 메뉴가 구성되어 있습니다.
이번에는 main.js에서 메뉴 구성을 입맛대로 해보고, 개발 시 사용할 메뉴와 실제 프로그램 배포 시 사용할 메뉴를 구분해서 추가하는 방법도 알아보겠습니다.
1. "Menu" import
2. MenuTemplate 작성
메뉴템플릿은 Object의 Array로 구성됩니다. 형식은 아래와 같이 직관적으로 이해할 수 있습니다.
- label : 대메뉴 명칭
- submenu : 대메뉴의 submenu, Object Array형식
- accelerator : 단축키, macOS에서 사용할 때는 키가 다르기 때문에, 삼항 연산자를 사용하여 단축키를 등록합니다.
- click() : 해당 submenu를 클릭했을 때, 동작하는 function
//Create menu template
const mainMenuTemplate = [
{
label: "File",
submenu: [
{
label: "Add Item",
click() {
createAddWindow();
},
},
{ label: "Clear Items" },
{
label: "Quit",
accelerator: process.platform == "darwin" ? "Command+Q" : "Ctrl+Q", //shortcut
click() {
app.quit();
},
},
],
},
];
3. macOS 예외처리
직접 테스트해보진 않았지만, macOS에서는 기본적으로 상단 메뉴 맨 앞에 의도하지 않은 메뉴가 생긴다고 합니다.
이를 방지하는 방법은 macOS일때만, mainMenuTemplate Array의 맨 앞에 빈 Object를 삽입하는 것입니다.
코드는 아래와 같습니다. mainMenuTemplate 선언부 아래에 작성하시면 됩니다.
//If mac, add empty object to menu
if (process.platform == "darwin") {
mainMenuTemplate.unshift({}); //push an empty object front
}
4. 개발 시에만 사용할 메뉴 추가
Electron에서는 소스 수정 후 Reload기능, Chromium DevTools를 기본적으로 사용할 수 있습니다.
하지만, 이 기능들은 프로그램이 배포되어 실제로 사용될 때는 필요 없으므로, 개발 버전일때만 해당 메뉴를 추가하는 코드를 추가합니다.
참고로, Reload 기능은 { role: "reload" } 만 추가하는 것으로 추가됩니다.
//Add developer tools item if not in production
if (process.env.NODE_ENV !== "production") {
mainMenuTemplate.push({
label: "Developer Tools",
submenu: [
{
label: "Toggle DevTools",
accelerator: process.platform == "darwin" ? "Command+I" : "Ctrl+I", //shortcut
click(item, focusedWindow) {
focusedWindow.toggleDevTools();
},
},
{ role: "reload" },
],
});
}
5. app ready event 수정
이제, 메뉴 템플릿은 모두 준비되었으니, 프로그램에 적용하는 것만 남았습니다.
MenuTemplate로 Menu를 만들어, 적용합니다.
아래 코드 두 줄을 app.whenReady() 또는 app.("ready")의 callback function 내부에 작성합니다.
//build Menu from template
const mainMenu = Menu.buildFromTemplate(mainMenuTemplate);
//Insert Menu
Menu.setApplicationMenu(mainMenu);
실행하면 아래와 같이 mainMenuTemplate에 작성한 메뉴들을 확인하실 수 있습니다.
다음 포스트에서는 child window를 생성하고, ipcMain, ipcRender를 활용하여 부모 창과 값을 주고받는 방법을 알아보겠습니다.
'Javascript > Electron.js' 카테고리의 다른 글
Electron.js 개발 시작하기 (0) | 2021.04.11 |
---|