UndoRedo
Предоставляет высокоуровневый интерфейс для реализации операций отмены и повтора.
Предоставляет высокоуровневый интерфейс для реализации операций отмены и повтора.
Функция UndoRedo работает, регистрируя методы и изменения свойств внутри "действий". Вы можете создать действие, затем предоставить способы его выполнения и отмены с помощью вызовов функций и изменения свойств, а затем зафиксировать действие.
При фиксации действия будут выполнены все методы do_*. При использовании метода UndoRedo.Undo будут выполнены методы undo_*. Если используется метод UndoRedo.Redo, то снова будут выполнены все методы do_*.
Вот пример того, как добавить действие:
private UndoRedo _undoRedo;
public override void _Ready()
{
_undoRedo = new UndoRedo();
}
public void DoSomething()
{
// Put your code here.
}
public void UndoSomething()
{
// Put here the code that reverts what's done by "DoSomething()".
}
private void OnMyButtonPressed()
{
var node = GetEntity<Entity2D>("MyEntity2D");
_undoRedo.CreateAction("Move the node");
_undoRedo.AddDoMethod(new Callable(this, MethodName.DoSomething));
_undoRedo.AddUndoMethod(new Callable(this, MethodName.UndoSomething));
_undoRedo.AddDoProperty(node, "position", new Vector2(100, 100));
_undoRedo.AddUndoProperty(node, "position", node.Position);
_undoRedo.CommitAction();
}Перед вызовом любого из методов add_(un)do_* необходимо сначала вызвать UndoRedo.CreateAction. А после этого UndoRedo.CommitAction.
Если вам не нужно регистрировать метод, вы можете не указывать UndoRedo.AddDoMethod и UndoRedo.AddUndoMethod; то же самое относится и к свойствам. Вы также можете зарегистрировать несколько методов/свойств.
Если вы создаете EditorPlugin и хотите интегрировать его в историю отмен редактора, используйте вместо этого EditorUndoRedoManager.
Если вы регистрируете несколько свойств/методов, зависящих друг от друга, имейте в виду, что по умолчанию операции отмены вызываются в том же порядке, в котором они были добавлены. Поэтому вместо группировки операций отмены с их операциями отмены лучше сгруппировать do с одной стороны и undo с другой, как показано ниже.
_undo_redo.CreateAction("Add object");
// DO
_undo_redo.AddDoMethod(new Callable(this, MethodName.CreateObject));
_undo_redo.AddDoMethod(new Callable(this, MethodName.AddObjectToSingleton));
// UNDO
_undo_redo.AddUndoMethod(new Callable(this, MethodName.RemoveObjectFromSingleton));
_undo_redo.AddUndoMethod(new Callable(this, MethodName.DestroyThatObject));
_undo_redo.CommitAction();Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
UndoRedoКонструктор
public UndoRedo();Свойства1
MaxStepsСвойство
public int MaxSteps { get; set; }Максимальное количество шагов, которые можно сохранить в истории отмены/повтора. Если количество сохраненных шагов превышает этот предел, более старые шаги удаляются из истории и больше не могут быть вызваны методом UndoRedo.Undo. Значение 0 или ниже означает отсутствие ограничений.
Методы24
AddDoMethodvoid
public void AddDoMethod(Callable callable);Зарегистрируйте Callable, который будет вызван при совершении действия.
| Имя | Тип | По умолчанию |
|---|---|---|
callable | Callable | — |
AddDoPropertyvoid
public void AddDoProperty(ReckfellObject @object, StringName property, Variant value);Зарегистрируйте property, которое изменит свое значение на value при выполнении действия.
| Имя | Тип | По умолчанию |
|---|---|---|
object | ReckfellObject | — |
property | StringName | — |
value | Variant | — |
AddDoReferencevoid
public void AddDoReference(ReckfellObject @object);Зарегистрируйте ссылку на объект, который будет стерт, если история "do" будет удалена. Это полезно для объектов, добавленных действием "do" и удаленных действием "undo".
Когда история "do" удаляется, если объект является RefCounted, он будет без ссылок. В противном случае он будет освобожден. Не используйте для ресурсов.
| Имя | Тип | По умолчанию |
|---|---|---|
object | ReckfellObject | — |
AddUndoMethodvoid
public void AddUndoMethod(Callable callable);Зарегистрируйте Callable, который будет вызван при отмене действия.
| Имя | Тип | По умолчанию |
|---|---|---|
callable | Callable | — |
AddUndoPropertyvoid
public void AddUndoProperty(ReckfellObject @object, StringName property, Variant value);Зарегистрируйте property, которое изменит свое значение на value при отмене действия.
| Имя | Тип | По умолчанию |
|---|---|---|
object | ReckfellObject | — |
property | StringName | — |
value | Variant | — |
AddUndoReferencevoid
public void AddUndoReference(ReckfellObject @object);Зарегистрируйте ссылку на объект, который будет стерт, если история «отмены» будет удалена. Это полезно для объектов, добавленных действием «отменить» и удаленных действием «do».
При удалении истории «отмены», если объект является RefCounted, он будет без ссылок. В противном случае он будет освобожден. Не используйте для ресурсов.
| Имя | Тип | По умолчанию |
|---|---|---|
object | ReckfellObject | — |
ClearHistoryvoid
public void ClearHistory(bool increaseVersion = true);Очистите историю отмены/повтора и связанные ссылки.
Передача false в increase_version предотвратит увеличение номера версии при очистке истории.
| Имя | Тип | По умолчанию |
|---|---|---|
increaseVersion | bool | true |
CommitActionvoid
public void CommitAction(bool execute = true);Зафиксируйте действие. Если execute равен true (что является значением по умолчанию), все методы/свойства «do» вызываются/устанавливаются при вызове этой функции.
| Имя | Тип | По умолчанию |
|---|---|---|
execute | bool | true |
CreateAction2 перегрузки
public void CreateAction(string name, UndoRedo.MergeMode mergeMode);Создайте новое действие. После того, как это будет вызвано, выполните все вызовы UndoRedo.AddDoMethod, UndoRedo.AddUndoMethod, UndoRedo.AddDoProperty и UndoRedo.AddUndoProperty, затем зафиксируйте действие с помощью UndoRedo.CommitAction.
Способ объединения действий определяется merge_mode.
Способ упорядочивания операций отмены в действиях определяется backward_undo_ops. Когда backward_undo_ops равен false, параметры отмены упорядочиваются в том же порядке, в котором они были добавлены. Это означает, что первая добавленная операция будет первой отмененной.
| Имя | Тип | По умолчанию |
|---|---|---|
name | string | — |
mergeMode | UndoRedo.MergeMode | — |
public void CreateAction(string name, UndoRedo.MergeMode mergeMode = UndoRedo.MergeMode.Disable, bool backwardUndoOps = false);Создайте новое действие. После того, как это будет вызвано, выполните все вызовы UndoRedo.AddDoMethod, UndoRedo.AddUndoMethod, UndoRedo.AddDoProperty и UndoRedo.AddUndoProperty, затем зафиксируйте действие с помощью UndoRedo.CommitAction.
Способ объединения действий определяется merge_mode.
Способ упорядочивания операций отмены в действиях определяется backward_undo_ops. Когда backward_undo_ops равен false, параметры отмены упорядочиваются в том же порядке, в котором они были добавлены. Это означает, что первая добавленная операция будет первой отмененной.
| Имя | Тип | По умолчанию |
|---|---|---|
name | string | — |
mergeMode | UndoRedo.MergeMode | UndoRedo.MergeMode.Disable |
backwardUndoOps | bool | false |
EndForceKeepInMergeEndsvoid
public void EndForceKeepInMergeEnds();Прекращает отмечать операции как подлежащие обработке, даже если действие объединяется с другим в режиме UndoRedo.MergeMode.Ends. См. UndoRedo.StartForceKeepInMergeEnds.
GetActionNamestring
public string GetActionName(int id);Получает имя действия из его индекса.
| Имя | Тип | По умолчанию |
|---|---|---|
id | int | — |
stringGetCurrentActionint
public int GetCurrentAction();Получает индекс текущего действия.
intGetCurrentActionNamestring
public string GetCurrentActionName();Получает имя текущего действия, эквивалентно get_action_name(get_current_action()).
stringGetHistoryCountint
public int GetHistoryCount();Возвращает количество элементов в истории.
intGetMaxStepsint
public int GetMaxSteps();intGetVersionulong
public ulong GetVersion();Получает версию. Каждый раз, когда фиксируется новое действие, номер версии UndoRedo автоматически увеличивается.
Это полезно в основном для проверки того, изменилось ли что-то по сравнению с сохраненной версией.
ulongHasRedobool
public bool HasRedo();Возвращает true, если доступно действие «повторить».
boolHasUndobool
public bool HasUndo();Возвращает true, если доступно действие «отменить».
boolIsCommittingActionbool
public bool IsCommittingAction();Возвращает true, если UndoRedo в данный момент фиксирует действие, т. е. запускает свой метод «do» или изменение свойства (см. UndoRedo.CommitAction).
boolRedobool
public bool Redo();Повторяет последнее действие. Возвращает false, если не было действия для повтора.
boolSetMaxStepsvoid
public void SetMaxSteps(int maxSteps);| Имя | Тип | По умолчанию |
|---|---|---|
maxSteps | int | — |
StartForceKeepInMergeEndsvoid
public void StartForceKeepInMergeEnds();Отмечает следующие операции "do" и "undo" для обработки, даже если действие будет объединено с другим в режиме UndoRedo.MergeMode.Ends. Возврат к нормальной работе с помощью UndoRedo.EndForceKeepInMergeEnds.
Undobool
public bool Undo();Отменяет последнее действие. Возвращает false, если не было действия для отмены.
boolСигналы и события1
VersionChangedСобытие
public event Action VersionChanged;Вызывается при вызове UndoRedo.Undo или UndoRedo.Redo.
UndoRedo.MergeMode
| Значение | Описание |
|---|---|
All = 2 | Объединяет это действие с предыдущим, если у них одинаковое имя. |
Disable = 0 | Делает операции «do»/«отменить» отдельными действиями. |
Ends = 1 | Объединяет это действие с предыдущим, если у них одинаковое имя. Сохраняет только операции "отменить" первого действия и операции "do" последнего действия. Полезно для последовательных изменений одного значения. |