|
5 | 5 | * src/vs/platform/actions/common/actions.ts
|
6 | 6 | * vscode 对 menu 的实现都归于 action,非常复杂
|
7 | 7 | */
|
| 8 | +// TODO: |
| 9 | +// 1. 复用 |
| 10 | +// 2. 设置 settings 方案 |
8 | 11 | import {Menu, MenuItem} from 'electron';
|
9 | 12 | import {camelToWords} from '../../lib/utils';
|
10 | 13 | import {ICommandService} from 'services/command';
|
@@ -269,3 +272,116 @@ export class Menubar {
|
269 | 272 | this.appendRoleMenu(windowMenu, roles);
|
270 | 273 | }
|
271 | 274 | }
|
| 275 | + |
| 276 | +export class HomeMenubar { |
| 277 | + constructor( |
| 278 | + // @ICommandService private readonly commandService: ICommandService |
| 279 | + ) { |
| 280 | + this.install(); |
| 281 | + } |
| 282 | + |
| 283 | + // private addFallbackHandlers(): void {} |
| 284 | + |
| 285 | + private install(): void { |
| 286 | + // Menus |
| 287 | + const menubar = new Menu(); |
| 288 | + |
| 289 | + // app |
| 290 | + const applicationMenu = new Menu(); |
| 291 | + this.setMacApplicationMenu(applicationMenu); |
| 292 | + const macApplicationMenuItem = new MenuItem({label: 'Pandora', submenu: applicationMenu}); |
| 293 | + menubar.append(macApplicationMenuItem); |
| 294 | + |
| 295 | + // Window |
| 296 | + const windowMenu = new Menu(); |
| 297 | + this.setWindowMenu(windowMenu); |
| 298 | + const windowItem = new MenuItem({label: 'Window', submenu: windowMenu}); |
| 299 | + menubar.append(windowItem); |
| 300 | + |
| 301 | + // Help |
| 302 | + const helpMenu = new Menu(); |
| 303 | + this.setHelpMenu(helpMenu); |
| 304 | + const helpMenuItem = new MenuItem({label: 'Help', submenu: helpMenu, role: 'help'}); |
| 305 | + menubar.append(helpMenuItem); |
| 306 | + |
| 307 | + // 设置成窗口顶部菜单 |
| 308 | + if (menubar.items && menubar.items.length > 0) { |
| 309 | + Menu.setApplicationMenu(menubar); |
| 310 | + } else { |
| 311 | + Menu.setApplicationMenu(null); |
| 312 | + } |
| 313 | + } |
| 314 | + |
| 315 | + private setMacApplicationMenu(macApplicationMenu: Menu): void { |
| 316 | + // const preferences = new MenuItem({ |
| 317 | + // label: 'preferences', |
| 318 | + // click() {} |
| 319 | + // }); |
| 320 | + |
| 321 | + const services = new MenuItem({ |
| 322 | + label: 'services', |
| 323 | + role: 'services' |
| 324 | + }); |
| 325 | + |
| 326 | + const quit = new MenuItem({ |
| 327 | + label: 'quit', |
| 328 | + role: 'quit' |
| 329 | + }); |
| 330 | + |
| 331 | + const actions = [ |
| 332 | + // about, |
| 333 | + // __separator__(), |
| 334 | + // preferences, |
| 335 | + // update, |
| 336 | + __separator__(), |
| 337 | + services, |
| 338 | + __separator__(), |
| 339 | + quit |
| 340 | + ]; |
| 341 | + actions.forEach(i => macApplicationMenu.append(i)); |
| 342 | + } |
| 343 | + |
| 344 | + private setHelpMenu(helpMenu: Menu): void { |
| 345 | + // Toggle Developer Tools |
| 346 | + const toggleDevtools = new MenuItem({ |
| 347 | + label: 'Toggle Developer Tools', |
| 348 | + role: 'toggleDevTools' |
| 349 | + }); |
| 350 | + const actions = [__separator__(), toggleDevtools]; |
| 351 | + actions.forEach(i => helpMenu.append(i)); |
| 352 | + } |
| 353 | + |
| 354 | + private appendRoleMenu(menu: Menu, roles: Role[]) { |
| 355 | + roles.forEach(role => { |
| 356 | + if (role === '|') { |
| 357 | + menu.append(__separator__()); |
| 358 | + } else { |
| 359 | + menu.append( |
| 360 | + new MenuItem({ |
| 361 | + label: camelToWords(role), |
| 362 | + role |
| 363 | + }) |
| 364 | + ); |
| 365 | + } |
| 366 | + }); |
| 367 | + } |
| 368 | + |
| 369 | + private setWindowMenu(windowMenu: Menu): void { |
| 370 | + const roles: Role[] = [ |
| 371 | + 'reload', |
| 372 | + 'forceReload', |
| 373 | + '|', |
| 374 | + 'resetZoom', |
| 375 | + 'zoomIn', |
| 376 | + 'zoomOut', |
| 377 | + 'togglefullscreen', |
| 378 | + 'minimize', |
| 379 | + '|', |
| 380 | + 'close', |
| 381 | + 'hide', |
| 382 | + 'hideOthers', |
| 383 | + 'unhide' |
| 384 | + ]; |
| 385 | + this.appendRoleMenu(windowMenu, roles); |
| 386 | + } |
| 387 | +} |
0 commit comments