Показать сообщение отдельно
  #8 (permalink)  
Старый 07.01.2015, 21:13
Аспирант
Отправить личное сообщение для makar3000 Посмотреть профиль Найти все сообщения от makar3000
 
Регистрация: 04.05.2011
Сообщений: 49

Сообщение от Яростный Меч Посмотреть сообщение
Обычно логика такая (если по уму делать):

есть массив (очередь), и есть указатель на текущий пункт в нем. Всё что перед указателем - "область повторов", прочее - "область отмен" (обе области могут быть пустые).

Функция 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(); // Удаляем последний элемент
  }
}
Ответить с цитированием