UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

76 lines 7.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.setupContextMenuHandler = void 0; const createContextCategoriesSorter_1 = require("../../../../actions/contextMenuAction/createContextCategoriesSorter"); const baseSettings_1 = require("../../../../application/settings/baseSettings/baseSettings"); const getHooked_1 = require("../../../../utils/subscribables/getHooked"); const contextMenuAction_1 = require("../../../../actions/contextMenuAction/contextMenuAction"); const keyHandlerAction_1 = require("../../../../actions/types/keyHandler/keyHandlerAction"); const PrioritizedMenu_1 = require("../../PrioritizedMenu"); const model_react_1 = require("model-react"); /** * Sets up a key listener to open the context menu, and forward key events to context menu items * @param menu The menu to create the context menu handler for * @param config The configuration to customize the handler * @returns An object with an event emit function and destroy function */ function setupContextMenuHandler(menu, { onExecute, useContextItemKeyHandlers = true, pattern = menu .getContext() .settings.get(baseSettings_1.baseSettings) .controls.menu.openContextMenu.get(), } = {}) { const ioContext = menu.getContext(); let contextData = {}; let contextItemsObserver; return { handler: async (e) => { var _a; // Bail out if there is no reason to compute the context data const isMenuOpenEvent = getHooked_1.getHooked(pattern).matches(e); if (!isMenuOpenEvent && !useContextItemKeyHandlers) return; // Cache the context data for subsequent key presses if (!contextItemsObserver) contextItemsObserver = new model_react_1.Observer(hook => { // Remove old items if relevant if (contextData.menu && contextData.items) contextData.menu.removeItems(contextData.items); // Retrieve the new context items, and subscribe to item changes contextData.items = contextMenuAction_1.contextMenuAction.getItems(menu.getAllSelected(hook), getHooked_1.getHooked(ioContext.contextMenuBindings, hook), hook); // Add the new items to the context menu if relevant if (contextData.menu) contextData.menu.addItems(contextData.items); // Obtain a new emitter and subscribe to possible changes contextData.emitter = keyHandlerAction_1.keyHandlerAction.get(contextData.items.map(({ item }) => item), hook); }, { init: true }); // Forward events to context items if (useContextItemKeyHandlers && (await ((_a = contextData.emitter) === null || _a === void 0 ? void 0 : _a.emit(e, menu, onExecute)))) return true; // Open the menu if requested if (isMenuOpenEvent) { const items = contextData.items; if (items && items.length > 0 && !contextData.menu) { const menu = (contextData.menu = new PrioritizedMenu_1.PrioritizedMenu(ioContext, { sortCategories: createContextCategoriesSorter_1.createContextCategoriesSorter(ioContext), })); menu.addItems(items); // Dynamically load the contextMenuLayer to deal with a dependency cycle (contextMenuLayer -> UILayer -> createMenuKeyHandler -> setupContextMenuHandler) const ContextMenuLayer = require("../../../../uiLayers/types/context/ContextMenuLayer") .ContextMenuLayer; contextData.close = await ioContext.open(new ContextMenuLayer({ menu, onExecute: () => { var _a; return (_a = contextData === null || contextData === void 0 ? void 0 : contextData.close) === null || _a === void 0 ? void 0 : _a.call(contextData); }, onClose: () => { contextData.close = undefined; contextData.menu = undefined; }, })); } return true; } }, destroy: () => contextItemsObserver === null || contextItemsObserver === void 0 ? void 0 : contextItemsObserver.destroy(), }; } exports.setupContextMenuHandler = setupContextMenuHandler; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBDb250ZXh0TWVudUhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbWVudXMvbWVudS9pbnRlcmFjdGlvbi9rZXlIYW5kbGVyL3NldHVwQ29udGV4dE1lbnVIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLHVIQUFrSDtBQUVsSCw2RkFBd0Y7QUFDeEYseUVBQW9FO0FBRXBFLCtGQUEwRjtBQUMxRiw0RkFBdUY7QUFDdkYsMkRBQXNEO0FBQ3RELDZDQUFxQztBQUdyQzs7Ozs7R0FLRztBQUNILFNBQWdCLHVCQUF1QixDQUNuQyxJQUFXLEVBQ1gsRUFDSSxTQUFTLEVBQ1QseUJBQXlCLEdBQUcsSUFBSSxFQUNoQyxPQUFPLEdBQUcsSUFBSTtLQUNULFVBQVUsRUFBRTtLQUNaLFFBQVEsQ0FBQyxHQUFHLENBQUMsMkJBQVksQ0FBQztLQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsTUFReEMsRUFBRTtJQUVOLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQyxJQUFJLFdBQVcsR0FXWCxFQUFFLENBQUM7SUFDUCxJQUFJLG9CQUFnRCxDQUFDO0lBRXJELE9BQU87UUFDSCxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQVcsRUFBRSxFQUFFOztZQUMzQiw2REFBNkQ7WUFDN0QsTUFBTSxlQUFlLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLHlCQUF5QjtnQkFBRSxPQUFPO1lBRTNELG9EQUFvRDtZQUNwRCxJQUFJLENBQUMsb0JBQW9CO2dCQUNyQixvQkFBb0IsR0FBRyxJQUFJLHNCQUFRLENBQy9CLElBQUksQ0FBQyxFQUFFO29CQUNILCtCQUErQjtvQkFDL0IsSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQyxLQUFLO3dCQUNyQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBRXBELGdFQUFnRTtvQkFDaEUsV0FBVyxDQUFDLEtBQUssR0FBRyxxQ0FBaUIsQ0FBQyxRQUFRLENBQzFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQ3pCLHFCQUFTLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxFQUM5QyxJQUFJLENBQ1AsQ0FBQztvQkFFRixvREFBb0Q7b0JBQ3BELElBQUksV0FBVyxDQUFDLElBQUk7d0JBQ2hCLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFFakQseURBQXlEO29CQUN6RCxXQUFXLENBQUMsT0FBTyxHQUFHLG1DQUFnQixDQUFDLEdBQUcsQ0FDdEMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFDdkMsSUFBSSxDQUNQLENBQUM7Z0JBQ04sQ0FBQyxFQUNELEVBQUMsSUFBSSxFQUFFLElBQUksRUFBQyxDQUNmLENBQUM7WUFFTixrQ0FBa0M7WUFDbEMsSUFDSSx5QkFBeUI7Z0JBQ3pCLENBQUMsYUFBTSxXQUFXLENBQUMsT0FBTywwQ0FBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUMsQ0FBQztnQkFFckQsT0FBTyxJQUFJLENBQUM7WUFFaEIsNkJBQTZCO1lBQzdCLElBQUksZUFBZSxFQUFFO2dCQUNqQixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO2dCQUVoQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUU7b0JBQ2hELE1BQU0sSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLGlDQUFlLENBQUMsU0FBUyxFQUFFO3dCQUM1RCxjQUFjLEVBQUUsNkRBQTZCLENBQUMsU0FBUyxDQUFDO3FCQUMzRCxDQUFDLENBQUMsQ0FBQztvQkFDSixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUVyQix5SkFBeUo7b0JBQ3pKLE1BQU0sZ0JBQWdCLEdBQTBGLE9BQU8sQ0FBQyxxREFBcUQsQ0FBQzt5QkFDekssZ0JBQWdCLENBQUM7b0JBQ3RCLFdBQVcsQ0FBQyxLQUFLLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUNwQyxJQUFJLGdCQUFnQixDQUFDO3dCQUNqQixJQUFJO3dCQUNKLFNBQVMsRUFBRSxHQUFHLEVBQUUsd0JBQUMsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLEtBQUssK0NBQWxCLFdBQVcsSUFBVzt3QkFDdkMsT0FBTyxFQUFFLEdBQUcsRUFBRTs0QkFDVixXQUFXLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQzs0QkFDOUIsV0FBVyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7d0JBQ2pDLENBQUM7cUJBQ0osQ0FBQyxDQUNMLENBQUM7aUJBQ0w7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7YUFDZjtRQUNMLENBQUM7UUFDRCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsb0JBQW9CLGFBQXBCLG9CQUFvQix1QkFBcEIsb0JBQW9CLENBQUUsT0FBTyxFQUFFO0tBQ2pELENBQUM7QUFDTixDQUFDO0FBdkdELDBEQXVHQyJ9