@launchmenu/core
Version:
An environment for visual keyboard controlled applets
76 lines • 7.93 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBDb250ZXh0TWVudUhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbWVudXMvbWVudS9pbnRlcmFjdGlvbi9rZXlIYW5kbGVyL3NldHVwQ29udGV4dE1lbnVIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLHVIQUFrSDtBQUVsSCw2RkFBd0Y7QUFDeEYseUVBQW9FO0FBRXBFLCtGQUEwRjtBQUMxRiw0RkFBdUY7QUFDdkYsMkRBQXNEO0FBQ3RELDZDQUFxQztBQUdyQzs7Ozs7R0FLRztBQUNILFNBQWdCLHVCQUF1QixDQUNuQyxJQUFXLEVBQ1gsRUFDSSxTQUFTLEVBQ1QseUJBQXlCLEdBQUcsSUFBSSxFQUNoQyxPQUFPLEdBQUcsSUFBSTtLQUNULFVBQVUsRUFBRTtLQUNaLFFBQVEsQ0FBQyxHQUFHLENBQUMsMkJBQVksQ0FBQztLQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsTUFReEMsRUFBRTtJQUVOLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQyxJQUFJLFdBQVcsR0FXWCxFQUFFLENBQUM7SUFDUCxJQUFJLG9CQUFnRCxDQUFDO0lBRXJELE9BQU87UUFDSCxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQVcsRUFBRSxFQUFFOztZQUMzQiw2REFBNkQ7WUFDN0QsTUFBTSxlQUFlLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLHlCQUF5QjtnQkFBRSxPQUFPO1lBRTNELG9EQUFvRDtZQUNwRCxJQUFJLENBQUMsb0JBQW9CO2dCQUNyQixvQkFBb0IsR0FBRyxJQUFJLHNCQUFRLENBQy9CLElBQUksQ0FBQyxFQUFFO29CQUNILCtCQUErQjtvQkFDL0IsSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJ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
;