class_undoredo.rst 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. :github_url: hide
  2. .. DO NOT EDIT THIS FILE!!!
  3. .. Generated automatically from Godot engine sources.
  4. .. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py.
  5. .. XML source: https://github.com/godotengine/godot/tree/master/doc/classes/UndoRedo.xml.
  6. .. _class_UndoRedo:
  7. UndoRedo
  8. ========
  9. **Inherits:** :ref:`Object<class_Object>`
  10. Helper to manage undo/redo operations in the editor or custom tools.
  11. .. rst-class:: classref-introduction-group
  12. Description
  13. -----------
  14. Helper to manage undo/redo operations in the editor or custom tools. It works by registering methods and property changes inside "actions".
  15. Common behavior is to create an action, then add do/undo calls to functions or property changes, then committing the action.
  16. Here's an example on how to add an action to the Godot editor's own **UndoRedo**, from a plugin:
  17. .. tabs::
  18. .. code-tab:: gdscript
  19. var undo_redo = get_undo_redo() # Method of EditorPlugin.
  20. func do_something():
  21. pass # Put your code here.
  22. func undo_something():
  23. pass # Put here the code that reverts what's done by "do_something()".
  24. func _on_my_button_pressed():
  25. var node = get_node("MyNode2D")
  26. undo_redo.create_action("Move the node")
  27. undo_redo.add_do_method(self, "do_something")
  28. undo_redo.add_undo_method(self, "undo_something")
  29. undo_redo.add_do_property(node, "position", Vector2(100,100))
  30. undo_redo.add_undo_property(node, "position", node.position)
  31. undo_redo.commit_action()
  32. .. code-tab:: csharp
  33. private UndoRedo _undoRedo;
  34. public override void _Ready()
  35. {
  36. _undoRedo = GetUndoRedo(); // Method of EditorPlugin.
  37. }
  38. public void DoSomething()
  39. {
  40. // Put your code here.
  41. }
  42. public void UndoSomething()
  43. {
  44. // Put here the code that reverts what's done by "DoSomething()".
  45. }
  46. private void OnMyButtonPressed()
  47. {
  48. var node = GetNode<Node2D>("MyNode2D");
  49. _undoRedo.CreateAction("Move the node");
  50. _undoRedo.AddDoMethod(new Callable(this, MethodName.DoSomething));
  51. _undoRedo.AddUndoMethod(new Callable(this, MethodName.UndoSomething));
  52. _undoRedo.AddDoProperty(node, "position", new Vector2(100, 100));
  53. _undoRedo.AddUndoProperty(node, "position", node.Position);
  54. _undoRedo.CommitAction();
  55. }
  56. \ :ref:`create_action<class_UndoRedo_method_create_action>`, :ref:`add_do_method<class_UndoRedo_method_add_do_method>`, :ref:`add_undo_method<class_UndoRedo_method_add_undo_method>`, :ref:`add_do_property<class_UndoRedo_method_add_do_property>`, :ref:`add_undo_property<class_UndoRedo_method_add_undo_property>`, and :ref:`commit_action<class_UndoRedo_method_commit_action>` should be called one after the other, like in the example. Not doing so could lead to crashes.
  57. If you don't need to register a method, you can leave :ref:`add_do_method<class_UndoRedo_method_add_do_method>` and :ref:`add_undo_method<class_UndoRedo_method_add_undo_method>` out; the same goes for properties. You can also register more than one method/property.
  58. .. rst-class:: classref-reftable-group
  59. Methods
  60. -------
  61. .. table::
  62. :widths: auto
  63. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  64. | void | :ref:`add_do_method<class_UndoRedo_method_add_do_method>` **(** :ref:`Callable<class_Callable>` callable **)** |
  65. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  66. | void | :ref:`add_do_property<class_UndoRedo_method_add_do_property>` **(** :ref:`Object<class_Object>` object, :ref:`StringName<class_StringName>` property, :ref:`Variant<class_Variant>` value **)** |
  67. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  68. | void | :ref:`add_do_reference<class_UndoRedo_method_add_do_reference>` **(** :ref:`Object<class_Object>` object **)** |
  69. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  70. | void | :ref:`add_undo_method<class_UndoRedo_method_add_undo_method>` **(** :ref:`Callable<class_Callable>` callable **)** |
  71. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  72. | void | :ref:`add_undo_property<class_UndoRedo_method_add_undo_property>` **(** :ref:`Object<class_Object>` object, :ref:`StringName<class_StringName>` property, :ref:`Variant<class_Variant>` value **)** |
  73. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  74. | void | :ref:`add_undo_reference<class_UndoRedo_method_add_undo_reference>` **(** :ref:`Object<class_Object>` object **)** |
  75. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  76. | void | :ref:`clear_history<class_UndoRedo_method_clear_history>` **(** :ref:`bool<class_bool>` increase_version=true **)** |
  77. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  78. | void | :ref:`commit_action<class_UndoRedo_method_commit_action>` **(** :ref:`bool<class_bool>` execute=true **)** |
  79. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  80. | void | :ref:`create_action<class_UndoRedo_method_create_action>` **(** :ref:`String<class_String>` name, :ref:`MergeMode<enum_UndoRedo_MergeMode>` merge_mode=0 **)** |
  81. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  82. | void | :ref:`end_force_keep_in_merge_ends<class_UndoRedo_method_end_force_keep_in_merge_ends>` **(** **)** |
  83. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  84. | :ref:`String<class_String>` | :ref:`get_action_name<class_UndoRedo_method_get_action_name>` **(** :ref:`int<class_int>` id **)** |
  85. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  86. | :ref:`int<class_int>` | :ref:`get_current_action<class_UndoRedo_method_get_current_action>` **(** **)** |
  87. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  88. | :ref:`String<class_String>` | :ref:`get_current_action_name<class_UndoRedo_method_get_current_action_name>` **(** **)** |const| |
  89. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  90. | :ref:`int<class_int>` | :ref:`get_history_count<class_UndoRedo_method_get_history_count>` **(** **)** |
  91. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  92. | :ref:`int<class_int>` | :ref:`get_version<class_UndoRedo_method_get_version>` **(** **)** |const| |
  93. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  94. | :ref:`bool<class_bool>` | :ref:`has_redo<class_UndoRedo_method_has_redo>` **(** **)** |const| |
  95. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  96. | :ref:`bool<class_bool>` | :ref:`has_undo<class_UndoRedo_method_has_undo>` **(** **)** |const| |
  97. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  98. | :ref:`bool<class_bool>` | :ref:`is_committing_action<class_UndoRedo_method_is_committing_action>` **(** **)** |const| |
  99. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  100. | :ref:`bool<class_bool>` | :ref:`redo<class_UndoRedo_method_redo>` **(** **)** |
  101. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  102. | void | :ref:`start_force_keep_in_merge_ends<class_UndoRedo_method_start_force_keep_in_merge_ends>` **(** **)** |
  103. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  104. | :ref:`bool<class_bool>` | :ref:`undo<class_UndoRedo_method_undo>` **(** **)** |
  105. +-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  106. .. rst-class:: classref-section-separator
  107. ----
  108. .. rst-class:: classref-descriptions-group
  109. Signals
  110. -------
  111. .. _class_UndoRedo_signal_version_changed:
  112. .. rst-class:: classref-signal
  113. **version_changed** **(** **)**
  114. Called when :ref:`undo<class_UndoRedo_method_undo>` or :ref:`redo<class_UndoRedo_method_redo>` was called.
  115. .. rst-class:: classref-section-separator
  116. ----
  117. .. rst-class:: classref-descriptions-group
  118. Enumerations
  119. ------------
  120. .. _enum_UndoRedo_MergeMode:
  121. .. rst-class:: classref-enumeration
  122. enum **MergeMode**:
  123. .. _class_UndoRedo_constant_MERGE_DISABLE:
  124. .. rst-class:: classref-enumeration-constant
  125. :ref:`MergeMode<enum_UndoRedo_MergeMode>` **MERGE_DISABLE** = ``0``
  126. Makes "do"/"undo" operations stay in separate actions.
  127. .. _class_UndoRedo_constant_MERGE_ENDS:
  128. .. rst-class:: classref-enumeration-constant
  129. :ref:`MergeMode<enum_UndoRedo_MergeMode>` **MERGE_ENDS** = ``1``
  130. Makes so that the action's "undo" operations are from the first action created and the "do" operations are from the last subsequent action with the same name.
  131. .. _class_UndoRedo_constant_MERGE_ALL:
  132. .. rst-class:: classref-enumeration-constant
  133. :ref:`MergeMode<enum_UndoRedo_MergeMode>` **MERGE_ALL** = ``2``
  134. Makes subsequent actions with the same name be merged into one.
  135. .. rst-class:: classref-section-separator
  136. ----
  137. .. rst-class:: classref-descriptions-group
  138. Method Descriptions
  139. -------------------
  140. .. _class_UndoRedo_method_add_do_method:
  141. .. rst-class:: classref-method
  142. void **add_do_method** **(** :ref:`Callable<class_Callable>` callable **)**
  143. Register a :ref:`Callable<class_Callable>` that will be called when the action is committed.
  144. .. rst-class:: classref-item-separator
  145. ----
  146. .. _class_UndoRedo_method_add_do_property:
  147. .. rst-class:: classref-method
  148. void **add_do_property** **(** :ref:`Object<class_Object>` object, :ref:`StringName<class_StringName>` property, :ref:`Variant<class_Variant>` value **)**
  149. Register a ``property`` that would change its value to ``value`` when the action is committed.
  150. .. rst-class:: classref-item-separator
  151. ----
  152. .. _class_UndoRedo_method_add_do_reference:
  153. .. rst-class:: classref-method
  154. void **add_do_reference** **(** :ref:`Object<class_Object>` object **)**
  155. Register a reference for "do" that will be erased if the "do" history is lost. This is useful mostly for new nodes created for the "do" call. Do not use for resources.
  156. .. rst-class:: classref-item-separator
  157. ----
  158. .. _class_UndoRedo_method_add_undo_method:
  159. .. rst-class:: classref-method
  160. void **add_undo_method** **(** :ref:`Callable<class_Callable>` callable **)**
  161. Register a :ref:`Callable<class_Callable>` that will be called when the action is undone.
  162. .. rst-class:: classref-item-separator
  163. ----
  164. .. _class_UndoRedo_method_add_undo_property:
  165. .. rst-class:: classref-method
  166. void **add_undo_property** **(** :ref:`Object<class_Object>` object, :ref:`StringName<class_StringName>` property, :ref:`Variant<class_Variant>` value **)**
  167. Register a ``property`` that would change its value to ``value`` when the action is undone.
  168. .. rst-class:: classref-item-separator
  169. ----
  170. .. _class_UndoRedo_method_add_undo_reference:
  171. .. rst-class:: classref-method
  172. void **add_undo_reference** **(** :ref:`Object<class_Object>` object **)**
  173. Register a reference for "undo" that will be erased if the "undo" history is lost. This is useful mostly for nodes removed with the "do" call (not the "undo" call!).
  174. .. rst-class:: classref-item-separator
  175. ----
  176. .. _class_UndoRedo_method_clear_history:
  177. .. rst-class:: classref-method
  178. void **clear_history** **(** :ref:`bool<class_bool>` increase_version=true **)**
  179. Clear the undo/redo history and associated references.
  180. Passing ``false`` to ``increase_version`` will prevent the version number from increasing when the history is cleared.
  181. .. rst-class:: classref-item-separator
  182. ----
  183. .. _class_UndoRedo_method_commit_action:
  184. .. rst-class:: classref-method
  185. void **commit_action** **(** :ref:`bool<class_bool>` execute=true **)**
  186. Commit the action. If ``execute`` is ``true`` (which it is by default), all "do" methods/properties are called/set when this function is called.
  187. .. rst-class:: classref-item-separator
  188. ----
  189. .. _class_UndoRedo_method_create_action:
  190. .. rst-class:: classref-method
  191. void **create_action** **(** :ref:`String<class_String>` name, :ref:`MergeMode<enum_UndoRedo_MergeMode>` merge_mode=0 **)**
  192. Create a new action. After this is called, do all your calls to :ref:`add_do_method<class_UndoRedo_method_add_do_method>`, :ref:`add_undo_method<class_UndoRedo_method_add_undo_method>`, :ref:`add_do_property<class_UndoRedo_method_add_do_property>`, and :ref:`add_undo_property<class_UndoRedo_method_add_undo_property>`, then commit the action with :ref:`commit_action<class_UndoRedo_method_commit_action>`.
  193. The way actions are merged is dictated by ``merge_mode``. See :ref:`MergeMode<enum_UndoRedo_MergeMode>` for details.
  194. .. rst-class:: classref-item-separator
  195. ----
  196. .. _class_UndoRedo_method_end_force_keep_in_merge_ends:
  197. .. rst-class:: classref-method
  198. void **end_force_keep_in_merge_ends** **(** **)**
  199. Stops marking operations as to be processed even if the action gets merged with another in the :ref:`MERGE_ENDS<class_UndoRedo_constant_MERGE_ENDS>` mode. See :ref:`start_force_keep_in_merge_ends<class_UndoRedo_method_start_force_keep_in_merge_ends>`.
  200. .. rst-class:: classref-item-separator
  201. ----
  202. .. _class_UndoRedo_method_get_action_name:
  203. .. rst-class:: classref-method
  204. :ref:`String<class_String>` **get_action_name** **(** :ref:`int<class_int>` id **)**
  205. Gets the action name from its index.
  206. .. rst-class:: classref-item-separator
  207. ----
  208. .. _class_UndoRedo_method_get_current_action:
  209. .. rst-class:: classref-method
  210. :ref:`int<class_int>` **get_current_action** **(** **)**
  211. Gets the index of the current action.
  212. .. rst-class:: classref-item-separator
  213. ----
  214. .. _class_UndoRedo_method_get_current_action_name:
  215. .. rst-class:: classref-method
  216. :ref:`String<class_String>` **get_current_action_name** **(** **)** |const|
  217. Gets the name of the current action, equivalent to ``get_action_name(get_current_action())``.
  218. .. rst-class:: classref-item-separator
  219. ----
  220. .. _class_UndoRedo_method_get_history_count:
  221. .. rst-class:: classref-method
  222. :ref:`int<class_int>` **get_history_count** **(** **)**
  223. Returns how many elements are in the history.
  224. .. rst-class:: classref-item-separator
  225. ----
  226. .. _class_UndoRedo_method_get_version:
  227. .. rst-class:: classref-method
  228. :ref:`int<class_int>` **get_version** **(** **)** |const|
  229. Gets the version. Every time a new action is committed, the **UndoRedo**'s version number is increased automatically.
  230. This is useful mostly to check if something changed from a saved version.
  231. .. rst-class:: classref-item-separator
  232. ----
  233. .. _class_UndoRedo_method_has_redo:
  234. .. rst-class:: classref-method
  235. :ref:`bool<class_bool>` **has_redo** **(** **)** |const|
  236. Returns ``true`` if a "redo" action is available.
  237. .. rst-class:: classref-item-separator
  238. ----
  239. .. _class_UndoRedo_method_has_undo:
  240. .. rst-class:: classref-method
  241. :ref:`bool<class_bool>` **has_undo** **(** **)** |const|
  242. Returns ``true`` if an "undo" action is available.
  243. .. rst-class:: classref-item-separator
  244. ----
  245. .. _class_UndoRedo_method_is_committing_action:
  246. .. rst-class:: classref-method
  247. :ref:`bool<class_bool>` **is_committing_action** **(** **)** |const|
  248. Returns ``true`` if the **UndoRedo** is currently committing the action, i.e. running its "do" method or property change (see :ref:`commit_action<class_UndoRedo_method_commit_action>`).
  249. .. rst-class:: classref-item-separator
  250. ----
  251. .. _class_UndoRedo_method_redo:
  252. .. rst-class:: classref-method
  253. :ref:`bool<class_bool>` **redo** **(** **)**
  254. Redo the last action.
  255. .. rst-class:: classref-item-separator
  256. ----
  257. .. _class_UndoRedo_method_start_force_keep_in_merge_ends:
  258. .. rst-class:: classref-method
  259. void **start_force_keep_in_merge_ends** **(** **)**
  260. Marks the next "do" and "undo" operations to be processed even if the action gets merged with another in the :ref:`MERGE_ENDS<class_UndoRedo_constant_MERGE_ENDS>` mode. Return to normal operation using :ref:`end_force_keep_in_merge_ends<class_UndoRedo_method_end_force_keep_in_merge_ends>`.
  261. .. rst-class:: classref-item-separator
  262. ----
  263. .. _class_UndoRedo_method_undo:
  264. .. rst-class:: classref-method
  265. :ref:`bool<class_bool>` **undo** **(** **)**
  266. Undo the last action.
  267. .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)`
  268. .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)`
  269. .. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)`
  270. .. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)`
  271. .. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)`
  272. .. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)`