Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
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()).
Redo the last action. Returns false if there was no action to redo.
void start_force_keep_in_merge_ends() 🔗
Отмечает следующие операции "do" и "undo" для обработки, даже если действие будет объединено с другим в режиме MERGE_ENDS. Возврат к нормальной работе с помощью end_force_keep_in_merge_ends().
Undo the last action. Returns false if there was no action to undo.