Сообщение от Яростный Меч
|
Обычно логика такая (если по уму делать):
есть массив (очередь), и есть указатель на текущий пункт в нем. Всё что перед указателем - "область повторов", прочее - "область отмен" (обе области могут быть пустые).
Функция undo - если есть команды в "области отмен", отменяем команду, на которой стоит указатель, перемещаем оный на шаг назад.
Функция redo - если есть команды в "области повторов", перемещаем указатель на шаг вперед и выполняем команду под ним.
Функция action (юзер хочет что-то сделать) - удаляем всё из "области повторов", формируем команду, ставим перед указателем, делаем redo. Если в очереди стало больше 10 элементов, удаляем самый старый.
Каждый элемент в очереди - команда, которую можно выполнить или отменить.
|
Что-то я не понял, так что-ли?:
action и redo у меня не зависимы, action происходит в редакторе, а redo конкретно по кнопке исполняется
var history = [];
var ukazatel;
function redo() {
if( ! history[ ukazatel + 1 ] ) {
return false; //Нет в области повторов
}
ukazatel++;
command = history[ ukazatel ];
//Выполняем
}
function undo() {
if( ! history[ ukazatel - 1 ] ) {
return false; //Нет в области отмен
}
command = history[ ukazatel ];
//Отмена
ukazatel--;
}
function action() {
if( ukazatel == undefined )
ukazatel = 1;
else
ukazatel++;
history[ ukazatel-1 ] = COMMAND; // Добавляем команду
if( history.length > 10 ) {
history.pop(); // Удаляем последний элемент
}
}