UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

133 lines 9.19 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UndoRedoFacility = void 0; const model_react_1 = require("model-react"); const CompoundCommand_1 = require("./commands/CompoundCommand"); const ICompoundCommand_1 = require("./_types/ICompoundCommand"); /** * A command dispatcher and undo redo manager */ class UndoRedoFacility { constructor() { this.commands = new model_react_1.Field({ past: [], future: [] }); this.shouldSplitBatch = false; } /** * Executes a given command * @param command The command to be executed * @param batchCommands Whether to batch this command with the previous command(s) if they also indicated to batch * @returns A promise that resolves when the command finishes executing or is canceled. true is returned if canceled */ async execute(command, batchCommands) { var _a; const { past, future } = this.getCommands(); const prevCommand = past[past.length - 1]; // Execute the command const finished = command.execute(); // Add to the batch if requested let batch = (_a = (batchCommands instanceof Function ? batchCommands(prevCommand) : batchCommands)) !== null && _a !== void 0 ? _a : false; if (batch) { if (prevCommand && ICompoundCommand_1.isCompoundCommand(prevCommand) && !this.shouldSplitBatch) { command = prevCommand.augment(command); this.commands.set({ past: [...past.slice(0, past.length - 1), command], future: [], }); } else { command = new (batch instanceof Function ? batch : CompoundCommand_1.CompoundCommand)([ command, ]); this.commands.set({ past: [...past, command], future: [] }); } } // Otherwise just add it to the commands directly else { this.commands.set({ past: [...past, command], future: [] }); } // Reset split batch this.shouldSplitBatch = false; return finished; } /** * Makes sure the next executed command is not batched with the previous command, * even if the command specifies to be batched. */ splitBatch() { this.shouldSplitBatch = true; } /** * Steps 1 command back into the history * @returns A promise that resolves once the command is undone */ async undo() { const { past: [...past], future, } = this.getCommands(); const current = past.pop(); if (current) { const promise = current.revert(); this.commands.set({ past, future: [current, ...future], }); return promise; } } /** * Steps 1 command forward into the history * @returns A promise that resolves once the command is redone */ async redo() { const { past, future: [current, ...future], } = this.getCommands(); if (current) { const promise = current.execute(); this.commands.set({ past: [...past, current], future, }); return promise; } } /** * Retrieves the state of the undo redo facility * @param hook The hook to subscribe to changes * @returns The current command facility state */ getState(hook) { const counts = { ready: 0, executing: 0, reverting: 0, }; const checkCmd = (cmd) => { const cmdState = cmd.getState(hook); if (["preparingForExecution", "executing"].includes(cmdState)) counts.executing++; else if (["preparingForRevert", "reverting"].includes(cmdState)) counts.reverting++; else counts.ready++; }; const { past, future } = this.getCommands(hook); past.forEach(checkCmd); future.forEach(checkCmd); if (counts.executing > 0 || counts.reverting > 0) { if (counts.executing > counts.reverting) return "executing"; else return "reverting"; } return "ready"; } /** * Retrieves all commands currently stored in the facility * @param hook The hook to subscribe to changes * @returns The currently stored commands */ getCommands(hook) { return this.commands.get(hook); } } exports.UndoRedoFacility = UndoRedoFacility; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5kb1JlZG9GYWNpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91bmRvUmVkby9VbmRvUmVkb0ZhY2lsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLDZDQUE2QztBQUU3QyxnRUFBMkQ7QUFFM0QsZ0VBQTREO0FBRTVEOztHQUVHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFBN0I7UUFDYyxhQUFRLEdBQUcsSUFBSSxtQkFBSyxDQUFDLEVBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUduRCxDQUFDLENBQUM7UUFDTyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUF1SXZDLENBQUM7SUFySUc7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUNoQixPQUFpQixFQUNqQixhQUErQzs7UUFFL0MsTUFBTSxFQUFDLElBQUksRUFBRSxNQUFNLEVBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUF5QixDQUFDO1FBRWxFLHNCQUFzQjtRQUN0QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFbkMsZ0NBQWdDO1FBQ2hDLElBQUksS0FBSyxTQUNMLENBQUMsYUFBYSxZQUFZLFFBQVE7WUFDOUIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7WUFDNUIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxtQ0FBSSxLQUFLLENBQUM7UUFDbEMsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLFdBQVcsSUFBSSxvQ0FBaUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDekUsT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxD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