UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

92 lines 7.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createActionHandlerTree = exports.createActionGraph = void 0; const getHooked_1 = require("../../utils/subscribables/getHooked"); /** * Creates a new action graph * @param targets The targets to retrieve all bindings and actions from * @param hook The data hook to subscribe to changes * @param collectTargets Whether to also collect the target per node * @returns The action graph */ function createActionGraph(targets, hook, collectTargets) { // Retrieve all actions and their bindings const actionBindings = []; let index = 0; targets.forEach(target => { const bindings = getHooked_1.getHooked(target.actionBindings, hook); bindings.forEach(binding => { const action = actionBindings.find(({ action }) => action == binding.action); // Do some extra work when the target data is also requested if (collectTargets) { if (action) { action.bindings.push({ ...binding, index }); if (!action.targets.includes(target)) action.targets.push(target); } else actionBindings.push({ action: binding.action, bindings: [{ ...binding, index }], targets: [target], }); } else { // Ignore the targets if not requested for slightly better performance if (action) action.bindings.push({ ...binding, index }); else actionBindings.push({ action: binding.action, bindings: [{ ...binding, index }], targets: [], }); } index++; }); }); // Create nodes for the actions const nodes = actionBindings.map(actionBindings => ({ ...actionBindings, children: [], })); // Add all children to the nodes for (let i = 0; i < nodes.length; i++) { const actionNode = nodes[i]; actionNode.action.parents.forEach(p => { const parentNode = nodes.find(({ action }) => action == p); if (parentNode) parentNode.children.push(actionNode); else nodes.push({ action: p, bindings: [], targets: [], children: [actionNode], }); }); } return nodes; } exports.createActionGraph = createActionGraph; /** * Creates a new action handler tree for the given action. Note, it's not actually a fully proper tree, the same node may appear in the tree multiple times, so it's more like a DAG with a single source. * @param rootAction The action to create the handler graph for * @param targets The targets to retrieve all bindings and handlers from * @param hook The data hook to subscribe to changes * @param collectTargets Whether to also collect the target per node * @returns The action handler tree */ function createActionHandlerTree(rootAction, targets, hook, collectTargets) { const nodes = createActionGraph(targets, hook, collectTargets); // Return the root node, with a fallback in case no targets have a binding for this action const fallback = { action: rootAction, children: [], bindings: [], targets: [], }; return nodes.find(({ action }) => action == rootAction) || fallback; } exports.createActionHandlerTree = createActionHandlerTree; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQWN0aW9uSGFuZGxlclRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWN0aW9ucy9hY3Rpb25HcmFwaC9jcmVhdGVBY3Rpb25IYW5kbGVyVHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxtRUFBOEQ7QUFNOUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQzdCLE9BQXdCLEVBQ3hCLElBQWdCLEVBQ2hCLGNBQWtCO0lBRWxCLDBDQUEwQztJQUMxQyxNQUFNLGNBQWMsR0FJZCxFQUFFLENBQUM7SUFDVCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLHFCQUFTLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RCxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZCLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLE1BQU0sRUFBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTNFLDREQUE0RDtZQUM1RCxJQUFJLGNBQWMsRUFBRTtnQkFDaEIsSUFBSSxNQUFNLEVBQUU7b0JBQ1IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO29CQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO3dCQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNyRTs7b0JBQ0csY0FBYyxDQUFDLElBQUksQ0FBQzt3QkFDaEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO3dCQUN0QixRQUFRLEVB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