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()

Перед вызовом любого из методов 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()

Свойства

int

max_steps

0

Методы

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

end_force_keep_in_merge_ends()

String

get_action_name(id: int)

int

get_current_action()

String

get_current_action_name() const

int

get_history_count()

int

get_version() const

bool

has_redo() const

bool

has_undo() const

bool

is_committing_action() const

bool

redo()

void

start_force_keep_in_merge_ends()

bool

undo()


Сигналы

version_changed() 🔗

Вызывается при вызове undo() или redo().


Перечисления

enum MergeMode: 🔗

MergeMode MERGE_DISABLE = 0

Делает операции «do»/«отменить» отдельными действиями.

MergeMode MERGE_ENDS = 1

Объединяет это действие с предыдущим, если у них одинаковое имя. Сохраняет только операции "отменить" первого действия и операции "do" последнего действия. Полезно для последовательных изменений одного значения.

MergeMode MERGE_ALL = 2

Объединяет это действие с предыдущим, если у них одинаковое имя.


Описания свойств

int max_steps = 0 🔗

  • void set_max_steps(value: int)

  • int get_max_steps()

Максимальное количество шагов, которые можно сохранить в истории отмены/повтора. Если количество сохраненных шагов превышает этот предел, более старые шаги удаляются из истории и больше не могут быть вызваны методом 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) 🔗

Получает имя действия из его индекса.


int get_current_action() 🔗

Получает индекс текущего действия.


String get_current_action_name() const 🔗

Получает имя текущего действия, эквивалентно get_action_name(get_current_action()).


int get_history_count() 🔗

Возвращает количество элементов в истории.


int get_version() const 🔗

Получает версию. Каждый раз, когда фиксируется новое действие, номер версии UndoRedo автоматически увеличивается.

Это полезно в основном для проверки того, изменилось ли что-то по сравнению с сохраненной версией.


bool has_redo() const 🔗

Возвращает true, если доступно действие «повторить».


bool has_undo() const 🔗

Возвращает true, если доступно действие «отменить».


bool is_committing_action() const 🔗

Возвращает true, если UndoRedo в данный момент фиксирует действие, т. е. запускает свой метод «do» или изменение свойства (см. commit_action()).


bool redo() 🔗

Повторите последнее действие.


void start_force_keep_in_merge_ends() 🔗

Отмечает следующие операции "do" и "undo" для обработки, даже если действие будет объединено с другим в режиме MERGE_ENDS. Возврат к нормальной работе с помощью end_force_keep_in_merge_ends().


bool undo() 🔗

Отменить последнее действие.