You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.6 KiB
JavaScript
73 lines
1.6 KiB
JavaScript
/*
|
|
* Copyright (C) 2019-2020 Intel Corporation
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
const MAX_HISTORY_LENGTH = 128;
|
|
|
|
class AnnotationHistory {
|
|
constructor() {
|
|
this.clear();
|
|
}
|
|
|
|
get() {
|
|
return {
|
|
undo: this._undo.map((undo) => [undo.action, undo.frame]),
|
|
redo: this._redo.map((redo) => [redo.action, redo.frame]),
|
|
};
|
|
}
|
|
|
|
do(action, undo, redo, clientIDs, frame) {
|
|
const actionItem = {
|
|
clientIDs,
|
|
action,
|
|
undo,
|
|
redo,
|
|
frame,
|
|
};
|
|
|
|
this._undo = this._undo.slice(-MAX_HISTORY_LENGTH + 1);
|
|
this._undo.push(actionItem);
|
|
this._redo = [];
|
|
}
|
|
|
|
undo(count) {
|
|
const affectedObjects = [];
|
|
for (let i = 0; i < count; i++) {
|
|
const action = this._undo.pop();
|
|
if (action) {
|
|
action.undo();
|
|
this._redo.push(action);
|
|
affectedObjects.push(...action.clientIDs);
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return affectedObjects;
|
|
}
|
|
|
|
redo(count) {
|
|
const affectedObjects = [];
|
|
for (let i = 0; i < count; i++) {
|
|
const action = this._redo.pop();
|
|
if (action) {
|
|
action.redo();
|
|
this._undo.push(action);
|
|
affectedObjects.push(...action.clientIDs);
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return affectedObjects;
|
|
}
|
|
|
|
clear() {
|
|
this._undo = [];
|
|
this._redo = [];
|
|
}
|
|
}
|
|
|
|
module.exports = AnnotationHistory;
|