UndoRedo
Наследует: Object
Предоставляет высокоуровневый интерфейс для реализации операций отмены и повтора.
Описание
Функция UndoRedo работает, регистрируя методы и изменения свойств внутри "действий". Вы можете создать действие, затем предоставить способы его выполнения и отмены с помощью вызовов функций и изменения свойств, а затем зафиксировать действие.
При фиксации действия будут выполнены все методы do_*. При использовании метода undo() будут выполнены методы undo_*. Если используется метод redo(), то снова будут выполнены все методы do_*.
Вот пример того, как добавить действие:
var undo_redo = UndoRedo.new()
func do_something():
pass # Введите здесь свой код.
func undo_something():
pass # Вставьте сюда код, который отменяет то, что сдел "do_something()".
func _on_my_button_pressed():
var node = get_node("MyNode2D")
undo_redo.create_action("Move the node")
undo_redo.add_do_method(do_something)
undo_redo.add_undo_method(undo_something)
undo_redo.add_do_property(node, "position", Vector2(100, 100))
undo_redo.add_undo_property(node, "position", node.position)
undo_redo.commit_action()
private UndoRedo _undoRedo;
public override void _Ready()
{
_undoRedo = new UndoRedo();
}
public void DoSomething()
{
// Введите здесь свой код.
}
public void UndoSomething()
{
// Вставьте сюда код, который отменяет то, что сдел "DoSomething()".
}
private void OnMyButtonPressed()
{
var node = GetNode<Node2D>("MyNode2D");
_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_* необходимо сначала вызвать create_action(). А после этого commit_action().
Если вам не нужно регистрировать метод, вы можете не указывать add_do_method() и add_undo_method(); то же самое относится и к свойствам. Вы также можете зарегистрировать несколько методов/свойств.
Если вы создаете EditorPlugin и хотите интегрировать его в историю отмен редактора, используйте вместо этого EditorUndoRedoManager.
Если вы регистрируете несколько свойств/методов, зависящих друг от друга, имейте в виду, что по умолчанию операции отмены вызываются в том же порядке, в котором они были добавлены. Поэтому вместо группировки операций отмены с их операциями отмены лучше сгруппировать do с одной стороны и undo с другой, как показано ниже.
undo_redo.create_action("Add object")
# DO
undo_redo.add_do_method(_create_object)
undo_redo.add_do_method(_add_object_to_singleton)
# UNDO
undo_redo.add_undo_method(_remove_object_from_singleton)
undo_redo.add_undo_method(_destroy_that_object)
undo_redo.commit_action()
_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();
Свойства
|
Методы
void |
add_do_method(callable: Callable) |
void |
add_do_property(object: Object, property: StringName, value: Variant) |
void |
add_do_reference(object: Object) |
void |
add_undo_method(callable: Callable) |
void |
add_undo_property(object: Object, property: StringName, value: Variant) |
void |
add_undo_reference(object: Object) |
void |
clear_history(increase_version: bool = true) |
void |
commit_action(execute: bool = true) |
void |
create_action(name: String, merge_mode: MergeMode = 0, backward_undo_ops: bool = false) |
void |
|
get_action_name(id: int) |
|
get_current_action_name() const |
|
get_version() const |
|
has_redo() const |
|
has_undo() const |
|
is_committing_action() const |
|
redo() |
|
void |
|
undo() |
Сигналы
version_changed() 🔗
Перечисления
enum MergeMode: 🔗
MergeMode MERGE_DISABLE = 0
Делает операции «do»/«отменить» отдельными действиями.
MergeMode MERGE_ENDS = 1
Объединяет это действие с предыдущим, если у них одинаковое имя. Сохраняет только операции "отменить" первого действия и операции "do" последнего действия. Полезно для последовательных изменений одного значения.
MergeMode MERGE_ALL = 2
Объединяет это действие с предыдущим, если у них одинаковое имя.
Описания свойств
Максимальное количество шагов, которые можно сохранить в истории отмены/повтора. Если количество сохраненных шагов превышает этот предел, более старые шаги удаляются из истории и больше не могут быть вызваны методом undo(). Значение 0 или ниже означает отсутствие ограничений.
Описания метода
void add_do_method(callable: Callable) 🔗
Зарегистрируйте Callable, который будет вызван при совершении действия.
void add_do_property(object: Object, property: StringName, value: Variant) 🔗
Зарегистрируйте property, которое изменит свое значение на value при выполнении действия.
void add_do_reference(object: Object) 🔗
Зарегистрируйте ссылку на объект, который будет стерт, если история "do" будет удалена. Это полезно для объектов, добавленных действием "do" и удаленных действием "undo".
Когда история "do" удаляется, если объект является RefCounted, он будет без ссылок. В противном случае он будет освобожден. Не используйте для ресурсов.
var node = Node2D.new()
undo_redo.create_action("Add node")
undo_redo.add_do_method(add_child.bind(node))
undo_redo.add_do_reference(node)
undo_redo.add_undo_method(remove_child.bind(node))
undo_redo.commit_action()
void add_undo_method(callable: Callable) 🔗
Зарегистрируйте Callable, который будет вызван при отмене действия.
void add_undo_property(object: Object, property: StringName, value: Variant) 🔗
Зарегистрируйте property, которое изменит свое значение на value при отмене действия.
void add_undo_reference(object: Object) 🔗
Зарегистрируйте ссылку на объект, который будет стерт, если история «отмены» будет удалена. Это полезно для объектов, добавленных действием «отменить» и удаленных действием «do».
При удалении истории «отмены», если объект является RefCounted, он будет без ссылок. В противном случае он будет освобожден. Не используйте для ресурсов.
var node = $Node2D
undo_redo.create_action("Remove node")
undo_redo.add_do_method(remove_child.bind(node))
undo_redo.add_undo_method(add_child.bind(node))
undo_redo.add_undo_reference(node)
undo_redo.commit_action()
void clear_history(increase_version: bool = true) 🔗
Очистите историю отмены/повтора и связанные ссылки.
Передача false в increase_version предотвратит увеличение номера версии при очистке истории.
void commit_action(execute: bool = true) 🔗
Зафиксируйте действие. Если execute равен true (что является значением по умолчанию), все методы/свойства «do» вызываются/устанавливаются при вызове этой функции.
void create_action(name: String, merge_mode: MergeMode = 0, backward_undo_ops: bool = false) 🔗
Создайте новое действие. После того, как это будет вызвано, выполните все вызовы add_do_method(), add_undo_method(), add_do_property() и add_undo_property(), затем зафиксируйте действие с помощью commit_action().
Способ объединения действий определяется merge_mode.
Способ упорядочивания операций отмены в действиях определяется backward_undo_ops. Когда backward_undo_ops равен false, параметры отмены упорядочиваются в том же порядке, в котором они были добавлены. Это означает, что первая добавленная операция будет первой отмененной.
void end_force_keep_in_merge_ends() 🔗
Прекращает отмечать операции как подлежащие обработке, даже если действие объединяется с другим в режиме MERGE_ENDS. См. start_force_keep_in_merge_ends().
String get_action_name(id: int) 🔗
Получает имя действия из его индекса.
Получает индекс текущего действия.
String get_current_action_name() const 🔗
Получает имя текущего действия, эквивалентно get_action_name(get_current_action()).
Возвращает количество элементов в истории.
Получает версию. Каждый раз, когда фиксируется новое действие, номер версии UndoRedo автоматически увеличивается.
Это полезно в основном для проверки того, изменилось ли что-то по сравнению с сохраненной версией.
Возвращает true, если доступно действие «повторить».
Возвращает true, если доступно действие «отменить».
bool is_committing_action() const 🔗
Возвращает true, если UndoRedo в данный момент фиксирует действие, т. е. запускает свой метод «do» или изменение свойства (см. commit_action()).
Повторите последнее действие.
void start_force_keep_in_merge_ends() 🔗
Отмечает следующие операции "do" и "undo" для обработки, даже если действие будет объединено с другим в режиме MERGE_ENDS. Возврат к нормальной работе с помощью end_force_keep_in_merge_ends().
Отменить последнее действие.