Показать сообщение отдельно
Старый 18.02.2013, 21:25
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 10  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
То есть мне полюбому в каждой функции которая будет производить какие-то перемены, нужно будет создавать новую команду и добавлять её в стак ?
Угу, ничего страшного в этом нет - передаем комманде контекст (со всем необходимым) при создании, чтобы она там ковырялась - чтобы не передавать параметры каждый раз - и всё не так сложно становится

Цитата:
А если я эту функцию буду вызывать из Undo/Redo, у меня создастся автоматом другая redo/undo комманда, да и как отличить когда вызывается комманда из undo или из redo? Добавить дополнительные параметры в функцию ?
- Не надо делать вызовы других комманд внутри комманд. И сами функции Undo и Redo коммандами делать смысла тоже нет.
(На самом деле можно создавать комманду и вызывать execute внути другой комманды, но _не_ добавлять при этом её в список отмены - самому вызывать undo этих вложенных комманд внутри своего undo. Т.е. вложенные комманды не палятся в общем списке)
- Не надо внутри Command::execute добавлять себя в список отмены - лучше сделать другую функцию в контроллере или UndoManager'е:
Код AS3:
public function executeCommand(command:Command):void
{
    // Если надо поддерживать redo - то сюда ещё добавляется код по отбрасыванию отменённого
    // (Раз мы сделали действие - всё что отменили стирается и повторить обратно его должно быть нельзя,
    // этож не система контроля версий - чтобы ветки городить)
    // Но здесь без redo
    _undoList.push(command);
    command.init(_context);
    command.execute();
}
 
public function undo():void
{
   var command:Command = _undoList.pop();
   if (command != null)
   {
       command.undo();
   }
}
И всё станет просто и понятно.
А специфичные параметры комманды передаём в конструктор:
Код AS3:
_undoManager.execute(new RotateCommand(object, rotateAngle));


Последний раз редактировалось expl; 18.02.2013 в 21:45.