From e7b652c62737fe809e92ef71220305aab7e1ba6c Mon Sep 17 00:00:00 2001 From: Iku-turso Date: Mon, 24 Oct 2022 14:59:37 +0300 Subject: [PATCH] Consolidate logic for application menu for Windows to be based on composite Co-authored-by: Janne Savolainen Signed-off-by: Iku-turso --- .../populate-application-menu.injectable.ts | 22 ++++++++++++------- .../setup-ipc-main-handlers.injectable.ts | 6 ++--- .../setup-ipc-main-handlers.ts | 14 +++++++----- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/features/application-menu/main/populate-application-menu.injectable.ts b/src/features/application-menu/main/populate-application-menu.injectable.ts index ef7732c3cd..8d744b4ded 100644 --- a/src/features/application-menu/main/populate-application-menu.injectable.ts +++ b/src/features/application-menu/main/populate-application-menu.injectable.ts @@ -15,21 +15,27 @@ import { checkThatAllDiscriminablesAreExhausted } from "../../../common/utils/co const populateApplicationMenuInjectable = getInjectable({ id: "populate-application-menu", - instantiate: () => (composite: Composite) => { - const topLevelMenus = composite.children.filter( - (x): x is Composite => x.value.kind !== "root", - ); + instantiate: + () => (composite: Composite) => { + const electronTemplate = getApplicationMenuTemplate(composite); + const menu = Menu.buildFromTemplate(electronTemplate); - const electronTemplate = topLevelMenus.map(toHierarchicalElectronMenuItem); - - Menu.setApplicationMenu(Menu.buildFromTemplate(electronTemplate)); - }, + Menu.setApplicationMenu(menu); + }, causesSideEffects: true, }); export default populateApplicationMenuInjectable; +export const getApplicationMenuTemplate = (composite: Composite) => { + const topLevelMenus = composite.children.filter( + (x): x is Composite => x.value.kind !== "root", + ); + + return topLevelMenus.map(toHierarchicalElectronMenuItem); +}; + const toHierarchicalElectronMenuItem = ( composite: Composite, ): MenuItemOpts => { diff --git a/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.injectable.ts b/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.injectable.ts index 6630dd9067..3dbbbc1ebb 100644 --- a/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.injectable.ts +++ b/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.injectable.ts @@ -6,12 +6,12 @@ import { getInjectable } from "@ogre-tools/injectable"; import { setupIpcMainHandlers } from "./setup-ipc-main-handlers"; import loggerInjectable from "../../../../common/logger.injectable"; import clusterManagerInjectable from "../../../cluster/manager.injectable"; -import applicationMenuItemsInjectable from "../../../../features/application-menu/main/application-menu-items.injectable"; import clusterStoreInjectable from "../../../../common/cluster-store/cluster-store.injectable"; import { onLoadOfApplicationInjectionToken } from "../../../start-main-application/runnable-tokens/on-load-of-application-injection-token"; import operatingSystemThemeInjectable from "../../../theme/operating-system-theme.injectable"; import catalogEntityRegistryInjectable from "../../../catalog/entity-registry.injectable"; import askUserForFilePathsInjectable from "../../../ipc/ask-user-for-file-paths.injectable"; +import applicationMenuItemCompositeInjectable from "../../../../features/application-menu/main/application-menu-item-composite.injectable"; const setupIpcMainHandlersInjectable = getInjectable({ id: "setup-ipc-main-handlers", @@ -19,7 +19,7 @@ const setupIpcMainHandlersInjectable = getInjectable({ instantiate: (di) => { const logger = di.inject(loggerInjectable); const clusterManager = di.inject(clusterManagerInjectable); - const applicationMenuItems = di.inject(applicationMenuItemsInjectable); + const applicationMenuItemComposite = di.inject(applicationMenuItemCompositeInjectable); const catalogEntityRegistry = di.inject(catalogEntityRegistryInjectable); const clusterStore = di.inject(clusterStoreInjectable); const operatingSystemTheme = di.inject(operatingSystemThemeInjectable); @@ -31,7 +31,7 @@ const setupIpcMainHandlersInjectable = getInjectable({ logger.debug("[APP-MAIN] initializing ipc main handlers"); setupIpcMainHandlers({ - applicationMenuItems, + applicationMenuItemComposite, clusterManager, catalogEntityRegistry, clusterStore, diff --git a/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.ts b/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.ts index 630313d154..6a7a17475b 100644 --- a/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.ts +++ b/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.ts @@ -15,16 +15,19 @@ import { pushCatalogToRenderer } from "../../../catalog-pusher"; import type { ClusterManager } from "../../../cluster/manager"; import { ResourceApplier } from "../../../resource-applier"; import type { IComputedValue } from "mobx"; -import type { MenuItemOpts } from "../../../../features/application-menu/main/application-menu-items.injectable"; import { windowActionHandleChannel, windowLocationChangedChannel, windowOpenAppMenuAsContextMenuChannel } from "../../../../common/ipc/window"; import { handleWindowAction, onLocationChange } from "../../../ipc/window"; import { openFilePickingDialogChannel } from "../../../../common/ipc/dialog"; import { getNativeThemeChannel } from "../../../../common/ipc/native-theme"; import type { Theme } from "../../../theme/operating-system-theme-state.injectable"; import type { AskUserForFilePaths } from "../../../ipc/ask-user-for-file-paths.injectable"; +import type { ApplicationMenuItemTypes } from "../../../../features/application-menu/main/menu-items/application-menu-item-injection-token"; +import type { Composite } from "../../../../common/utils/composite/get-composite/get-composite"; +import { getApplicationMenuTemplate } from "../../../../features/application-menu/main/populate-application-menu.injectable"; +import type { MenuItemRoot } from "../../../../features/application-menu/main/application-menu-item-composite.injectable"; interface Dependencies { - applicationMenuItems: IComputedValue; + applicationMenuItemComposite: IComputedValue>; clusterManager: ClusterManager; catalogEntityRegistry: CatalogEntityRegistry; clusterStore: ClusterStore; @@ -33,7 +36,7 @@ interface Dependencies { } export const setupIpcMainHandlers = ({ - applicationMenuItems, + applicationMenuItemComposite, clusterManager, catalogEntityRegistry, clusterStore, @@ -124,9 +127,8 @@ export const setupIpcMainHandlers = ({ ipcMainHandle(broadcastMainChannel, (event, channel, ...args) => broadcastMessage(channel, ...args)); ipcMainOn(windowOpenAppMenuAsContextMenuChannel, async (event) => { - const appMenu = applicationMenuItems.get(); - - const menu = Menu.buildFromTemplate(appMenu); + const electronTemplate = getApplicationMenuTemplate(applicationMenuItemComposite.get()); + const menu = Menu.buildFromTemplate(electronTemplate); menu.popup({ ...BrowserWindow.fromWebContents(event.sender),