Цитата:
|
То есть мне полюбому в каждой функции которая будет производить какие-то перемены, нужно будет создавать новую команду и добавлять её в стак ?
|
Угу, ничего страшного в этом нет - передаем комманде контекст (со всем необходимым) при создании, чтобы она там ковырялась - чтобы не передавать параметры каждый раз - и всё не так сложно становится
Цитата:
|
А если я эту функцию буду вызывать из 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));