From eba75af764f683c73e0450dc62b573275b847b98 Mon Sep 17 00:00:00 2001 From: Iku-turso Date: Tue, 4 Oct 2022 16:24:45 +0300 Subject: [PATCH] Implement hierarchy of application menu items using "many-root" composite Co-authored-by: Janne Savolainen Signed-off-by: Iku-turso --- .../main/application-menu-items.injectable.ts | 69 +++++++++++++++---- .../application-menu-item-injection-token.ts | 6 +- 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/src/features/application-menu/main/application-menu-items.injectable.ts b/src/features/application-menu/main/application-menu-items.injectable.ts index a0d9f8c4d0..8a7d80550c 100644 --- a/src/features/application-menu/main/application-menu-items.injectable.ts +++ b/src/features/application-menu/main/application-menu-items.injectable.ts @@ -23,9 +23,13 @@ import reloadCurrentApplicationWindowInjectable from "../../../main/start-main-a import showApplicationWindowInjectable from "../../../main/start-main-application/lens-window/show-application-window.injectable"; import processCheckingForUpdatesInjectable from "../../application-update/main/process-checking-for-updates.injectable"; import openLinkInBrowserInjectable from "../../../common/utils/open-link-in-browser.injectable"; -import appNameInjectable from "../../../common/vars/app-name.injectable"; import productNameInjectable from "../../../common/vars/product-name.injectable"; +import type { ApplicationMenuItemTypes } from "./menu-items/application-menu-item-injection-token"; import applicationMenuItemInjectionToken from "./menu-items/application-menu-item-injection-token"; +import { filter, map, sortBy } from "lodash/fp"; +import { pipeline } from "@ogre-tools/fp"; +import type { Composite } from "./menu-items/get-composite/get-composite"; +import getComposite from "./menu-items/get-composite/get-composite"; function ignoreIf(check: boolean, menuItems: MenuItemOpts[]) { return check ? [] : menuItems; @@ -40,7 +44,7 @@ const applicationMenuItemsInjectable = getInjectable({ instantiate: (di) => { const logger = di.inject(loggerInjectable); - const appName = di.inject(appNameInjectable); + const productName = di.inject(productNameInjectable); const isMac = di.inject(isMacInjectable); const updatingIsEnabled = di.inject(updatingIsEnabledInjectable); @@ -65,19 +69,58 @@ const applicationMenuItemsInjectable = getInjectable({ const openLinkInBrowser = di.inject(openLinkInBrowserInjectable); - logger.info(`[MENU]: autoUpdateEnabled=${updatingIsEnabled}`); + // Todo: find out what to do with this. + // logger.info(`[MENU]: autoUpdateEnabled=${updatingIsEnabled}`); - const menuItems = di - .injectMany(applicationMenuItemInjectionToken) - .filter(x => x.isShown !== false); + const allShown = pipeline( + di.injectMany(applicationMenuItemInjectionToken), + filter((x) => x.isShown !== false), + ); + + const roots = allShown.filter((x) => x.parentId === null); + + const toMenuItemOpt = ( + x: Composite, + ): MenuItemOpts => ({ + // @ts-ignore + label: x.value.label, + id: x.id, + + submenu: pipeline( + x.children, + sortBy(x => x.value.orderNumber), + map(toMenuItemOpt), + ), + + // @ts-ignore + type: x.value.type, + // @ts-ignore + role: x.value.role, + // @ts-ignore + click: x.value.click, + // @ts-ignore + accelerator: x.value.accelerator, + }); + + const menuItems = pipeline( + roots, + + map((root) => + getComposite({ + source: allShown, + // @ts-ignore + rootId: root.id, + // @ts-ignore + getId: (x) => x.id, + // @ts-ignore + getParentId: (x) => x.parentId, + }), + ), + + map(toMenuItemOpt), + ); return computed((): MenuItemOpts[] => { - const macAppMenu: MenuItemOpts = { - label: appName, - id: "root", - submenu: [], - }; - const fileMenu: MenuItemOpts = { label: "File", id: "file", @@ -263,7 +306,6 @@ const applicationMenuItemsInjectable = getInjectable({ }; // Prepare menu items order const appMenu = new Map([ - ["mac", macAppMenu], ["file", fileMenu], ["edit", editMenu], ["view", viewMenu], @@ -296,4 +338,3 @@ const applicationMenuItemsInjectable = getInjectable({ }); export default applicationMenuItemsInjectable; - diff --git a/src/features/application-menu/main/menu-items/application-menu-item-injection-token.ts b/src/features/application-menu/main/menu-items/application-menu-item-injection-token.ts index 811c252239..11096731c2 100644 --- a/src/features/application-menu/main/menu-items/application-menu-item-injection-token.ts +++ b/src/features/application-menu/main/menu-items/application-menu-item-injection-token.ts @@ -25,9 +25,9 @@ export interface OperationSystemAction extends Shared { role: "services" | "hide" | "hideOthers" | "unhide"; } -const applicationMenuItemInjectionToken = getInjectionToken< - ApplicationMenuItem | Separator | OperationSystemAction ->({ +export type ApplicationMenuItemTypes = ApplicationMenuItem | Separator | OperationSystemAction; + +const applicationMenuItemInjectionToken = getInjectionToken({ id: "application-menu-item-injection-token", });