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