Browse Source

UndoRedo add version changed signal

added some functions to manage undo buttons
Alexander Holland 6 years ago
parent
commit
8f23f4b44e
3 changed files with 45 additions and 2 deletions
  1. 21 2
      core/undo_redo.cpp
  2. 3 0
      core/undo_redo.h
  3. 21 0
      doc/classes/UndoRedo.xml

+ 21 - 2
core/undo_redo.cpp

@@ -336,6 +336,7 @@ bool UndoRedo::redo() {
 
 	_process_operation_list(actions.write[current_action].do_ops.front());
 	version++;
+	emit_signal("version_changed");
 
 	return true;
 }
@@ -348,6 +349,8 @@ bool UndoRedo::undo() {
 	_process_operation_list(actions.write[current_action].undo_ops.front());
 	current_action--;
 	version--;
+	emit_signal("version_changed");
+
 	return true;
 }
 
@@ -359,18 +362,30 @@ void UndoRedo::clear_history(bool p_increase_version) {
 	while (actions.size())
 		_pop_history_tail();
 
-	if (p_increase_version)
+	if (p_increase_version) {
 		version++;
+		emit_signal("version_changed");
+	}
 }
 
 String UndoRedo::get_current_action_name() const {
 
 	ERR_FAIL_COND_V(action_level > 0, "");
 	if (current_action < 0)
-		return ""; //nothing to redo
+		return "";
 	return actions[current_action].name;
 }
 
+bool UndoRedo::has_undo() {
+
+	return current_action >= 0;
+}
+
+bool UndoRedo::has_redo() {
+
+	return (current_action + 1) < actions.size();
+}
+
 uint64_t UndoRedo::get_version() const {
 
 	return version;
@@ -523,10 +538,14 @@ void UndoRedo::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("add_undo_reference", "object"), &UndoRedo::add_undo_reference);
 	ClassDB::bind_method(D_METHOD("clear_history", "increase_version"), &UndoRedo::clear_history, DEFVAL(true));
 	ClassDB::bind_method(D_METHOD("get_current_action_name"), &UndoRedo::get_current_action_name);
+	ClassDB::bind_method(D_METHOD("has_undo"), &UndoRedo::has_undo);
+	ClassDB::bind_method(D_METHOD("has_redo"), &UndoRedo::has_redo);
 	ClassDB::bind_method(D_METHOD("get_version"), &UndoRedo::get_version);
 	ClassDB::bind_method(D_METHOD("redo"), &UndoRedo::redo);
 	ClassDB::bind_method(D_METHOD("undo"), &UndoRedo::undo);
 
+	ADD_SIGNAL(MethodInfo("version_changed"));
+
 	BIND_ENUM_CONSTANT(MERGE_DISABLE);
 	BIND_ENUM_CONSTANT(MERGE_ENDS);
 	BIND_ENUM_CONSTANT(MERGE_ALL);

+ 3 - 0
core/undo_redo.h

@@ -118,6 +118,9 @@ public:
 	String get_current_action_name() const;
 	void clear_history(bool p_increase_version = true);
 
+	bool has_undo();
+	bool has_redo();
+
 	uint64_t get_version() const;
 
 	void set_commit_notify_callback(CommitNotifyCallback p_callback, void *p_ud);

+ 21 - 0
doc/classes/UndoRedo.xml

@@ -141,6 +141,20 @@
 				This is useful mostly to check if something changed from a saved version.
 			</description>
 		</method>
+		<method name="has_redo">
+			<return type="bool">
+			</return>
+			<description>
+				Returns [code]true[/code] if an 'redo' action is available.
+			</description>
+		</method>
+		<method name="has_undo">
+			<return type="bool">
+			</return>
+			<description>
+				Returns [code]true[/code] if an 'undo' action is available.
+			</description>
+		</method>
 		<method name="is_commiting_action" qualifiers="const">
 			<return type="bool">
 			</return>
@@ -162,6 +176,13 @@
 			</description>
 		</method>
 	</methods>
+	<signals>
+		<signal name="version_changed">
+			<description>
+				Called when [method undo] or [method redo] was called.
+			</description>
+		</signal>
+	</signals>
 	<constants>
 		<constant name="MERGE_DISABLE" value="0" enum="MergeMode">
 			Makes [code]do[/code]/[code]undo[/code] operations stay in separate actions.