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.

Якщо ви реєструєте кілька властивостей/методів, які залежать один від одного, пам’ятайте, що за замовчуванням операції скасування викликаються в тому ж порядку, в якому вони були додані. Тому замість групування операції «виконати» з їхніми операціями скасування краще групувати «виконати» з одного боку, а «скасувати» з іншого, як показано нижче.

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

Здійснює операції "до"/"undo" в окремих діях.

MergeMode MERGE_ENDS = 1

Займіть цю дію з попереднім, якщо вони мають однакову назву. Зберігає лише перші операції акції «ундо» та останні операції акції «до». Корисно для послідовних змін до одного значення.

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» буде видалено, якщо об’єкт є 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) 🔗

Зареєструйте посилання на об’єкт, який буде стерто, якщо видалити історію «скасування». Це корисно для об’єктів, доданих за допомогою дії «скасувати» та видалених за допомогою дії «до».

Коли журнал "скасування" видаляється, якщо об’єкт є RefCounted, на нього не буде посилатися. В іншому випадку воно буде звільнено. Не використовуйте для ресурсів.

змінний вузол = $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 (що це за замовчуванням), всі "до" методи / об'єкти називаються / зміщуються, коли ця функція називається.


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, якщо доступна акція "redo".


bool has_undo() const 🔗

Повертаємо true, якщо доступна акція "undo".


bool is_committing_action() const 🔗

Повертає true, якщо UndoRedo в даний час бере участь в акції, тобто працює метод "до" або зміни майна (див. commit_action()).


bool redo() 🔗

Червоно останні дії.


void start_force_keep_in_merge_ends() 🔗

Відзначає наступні операції "до" і "undo" для обробки, навіть якщо дія зливається з іншим в режимі MERGE_ENDS. Повернення до нормальної роботи за допомогою end_force_keep_in_merge_ends().


bool undo() 🔗

Недо останнього дії.