Browse Source

bind AfterGUIInput

Silc Renew 3 years ago
parent
commit
3c7a5fd8ac

+ 24 - 15
doc/classes/EditorPlugin.xml

@@ -64,8 +64,8 @@
 				    if event is InputEventMouseMotion:
 				        # Redraw viewport when cursor is moved.
 				        update_overlays()
-				        return true
-				    return false
+				        return EditorPlugin.AFTER_GUI_INPUT_STOP
+				    return EditorPlugin.AFTER_GUI_INPUT_PASS
 				[/gdscript]
 				[csharp]
 				public override void _Forward3dDrawOverViewport(Godot.Control overlay)
@@ -74,15 +74,15 @@
 				    overlay.DrawCircle(overlay.GetLocalMousePosition(), 64, Colors.White);
 				}
 
-				public override bool _Forward3dGuiInput(Godot.Camera3D camera, InputEvent @event)
+				public override EditorPlugin.AfterGUIInput _Forward3dGuiInput(Godot.Camera3D camera, InputEvent @event)
 				{
 				    if (@event is InputEventMouseMotion)
 				    {
 				        // Redraw viewport when cursor is moved.
 				        UpdateOverlays();
-				        return true;
+				        return EditorPlugin.AFTER_GUI_INPUT_STOP;
 				    }
-				    return false;
+				    return EditorPlugin.AFTER_GUI_INPUT_PASS;
 				[/csharp]
 				[/codeblocks]
 			</description>
@@ -100,33 +100,33 @@
 			<param index="0" name="viewport_camera" type="Camera3D" />
 			<param index="1" name="event" type="InputEvent" />
 			<description>
-				Called when there is a root node in the current edited scene, [method _handles] is implemented and an [InputEvent] happens in the 3D viewport. Intercepts the [InputEvent], if [code]return true[/code] [EditorPlugin] consumes the [param event], otherwise forwards [param event] to other Editor classes. Example:
+				Called when there is a root node in the current edited scene, [method _handles] is implemented, and an [InputEvent] happens in the 3D viewport. The return value decides whether the [InputEvent] is consumed or forwarded to other [EditorPlugin]s. See [enum AfterGUIInput] for options. Example:
 				[codeblocks]
 				[gdscript]
-				# Prevents the InputEvent to reach other Editor classes.
+				# Prevents the InputEvent from reaching other Editor classes.
 				func _forward_3d_gui_input(camera, event):
 				    return EditorPlugin.AFTER_GUI_INPUT_STOP
 				[/gdscript]
 				[csharp]
-				// Prevents the InputEvent to reach other Editor classes.
-				public override bool _Forward3dGuiInput(Camera3D camera, InputEvent @event)
+				// Prevents the InputEvent from reaching other Editor classes.
+				public override EditorPlugin.AfterGUIInput _Forward3dGuiInput(Camera3D camera, InputEvent @event)
 				{
 				    return EditorPlugin.AFTER_GUI_INPUT_STOP;
 				}
 				[/csharp]
 				[/codeblocks]
-				Must [code]return false[/code] in order to forward the [InputEvent] to other Editor classes. Example:
+				Must [code]return EditorPlugin.AFTER_GUI_INPUT_PASS[/code] in order to forward the [InputEvent] to other Editor classes. Example:
 				[codeblocks]
 				[gdscript]
 				# Consumes InputEventMouseMotion and forwards other InputEvent types.
 				func _forward_3d_gui_input(camera, event):
-				    return event is InputEventMouseMotion
+				    return EditorPlugin.AFTER_GUI_INPUT_STOP if event is InputEventMouseMotion else EditorPlugin.AFTER_GUI_INPUT_PASS
 				[/gdscript]
 				[csharp]
 				// Consumes InputEventMouseMotion and forwards other InputEvent types.
-				public override bool _Forward3dGuiInput(Camera3D camera, InputEvent @event)
+				public override EditorPlugin.AfterGUIInput _Forward3dGuiInput(Camera3D camera, InputEvent @event)
 				{
-				    return @event is InputEventMouseMotion;
+				    return @event is InputEventMouseMotion ? EditorPlugin.AFTER_GUI_INPUT_STOP : EditorPlugin.AFTER_GUI_INPUT_PASS;
 				}
 				[/csharp]
 				[/codeblocks]
@@ -185,12 +185,12 @@
 				Called when there is a root node in the current edited scene, [method _handles] is implemented and an [InputEvent] happens in the 2D viewport. Intercepts the [InputEvent], if [code]return true[/code] [EditorPlugin] consumes the [param event], otherwise forwards [param event] to other Editor classes. Example:
 				[codeblocks]
 				[gdscript]
-				# Prevents the InputEvent to reach other Editor classes.
+				# Prevents the InputEvent from reaching other Editor classes.
 				func _forward_canvas_gui_input(event):
 				    return true
 				[/gdscript]
 				[csharp]
-				// Prevents the InputEvent to reach other Editor classes.
+				// Prevents the InputEvent from reaching other Editor classes.
 				public override bool ForwardCanvasGuiInput(InputEvent @event)
 				{
 				    return true;
@@ -754,5 +754,14 @@
 		<constant name="DOCK_SLOT_MAX" value="8" enum="DockSlot">
 			Represents the size of the [enum DockSlot] enum.
 		</constant>
+		<constant name="AFTER_GUI_INPUT_PASS" value="0" enum="AfterGUIInput">
+			Forwards the [InputEvent] to other EditorPlugins.
+		</constant>
+		<constant name="AFTER_GUI_INPUT_STOP" value="1" enum="AfterGUIInput">
+			Prevents the [InputEvent] from reaching other Editor classes.
+		</constant>
+		<constant name="AFTER_GUI_INPUT_CUSTOM" value="2" enum="AfterGUIInput">
+			Pass the [InputEvent] to other editor plugins except the main [Node3D] one. This can be used to prevent node selection changes and work with sub-gizmos instead.
+		</constant>
 	</constants>
 </class>

+ 2 - 2
editor/editor_node.cpp

@@ -7598,8 +7598,8 @@ EditorPlugin::AfterGUIInput EditorPluginList::forward_spatial_gui_input(Camera3D
 		if (current_after == EditorPlugin::AFTER_GUI_INPUT_STOP) {
 			after = EditorPlugin::AFTER_GUI_INPUT_STOP;
 		}
-		if (after != EditorPlugin::AFTER_GUI_INPUT_STOP && current_after == EditorPlugin::AFTER_GUI_INPUT_DESELECT) {
-			after = EditorPlugin::AFTER_GUI_INPUT_DESELECT;
+		if (after != EditorPlugin::AFTER_GUI_INPUT_STOP && current_after == EditorPlugin::AFTER_GUI_INPUT_CUSTOM) {
+			after = EditorPlugin::AFTER_GUI_INPUT_CUSTOM;
 		}
 	}
 

+ 4 - 0
editor/editor_plugin.cpp

@@ -972,6 +972,10 @@ void EditorPlugin::_bind_methods() {
 	BIND_ENUM_CONSTANT(DOCK_SLOT_RIGHT_UR);
 	BIND_ENUM_CONSTANT(DOCK_SLOT_RIGHT_BR);
 	BIND_ENUM_CONSTANT(DOCK_SLOT_MAX);
+
+	BIND_ENUM_CONSTANT(AFTER_GUI_INPUT_PASS);
+	BIND_ENUM_CONSTANT(AFTER_GUI_INPUT_STOP);
+	BIND_ENUM_CONSTANT(AFTER_GUI_INPUT_CUSTOM);
 }
 
 Ref<EditorUndoRedoManager> EditorPlugin::get_undo_redo() {

+ 2 - 1
editor/editor_plugin.h

@@ -204,7 +204,7 @@ public:
 	enum AfterGUIInput {
 		AFTER_GUI_INPUT_PASS,
 		AFTER_GUI_INPUT_STOP,
-		AFTER_GUI_INPUT_DESELECT
+		AFTER_GUI_INPUT_CUSTOM
 	};
 
 	//TODO: send a resource for editing to the editor node?
@@ -312,6 +312,7 @@ public:
 
 VARIANT_ENUM_CAST(EditorPlugin::CustomControlContainer);
 VARIANT_ENUM_CAST(EditorPlugin::DockSlot);
+VARIANT_ENUM_CAST(EditorPlugin::AfterGUIInput);
 
 typedef EditorPlugin *(*EditorPluginCreateFunc)();
 

+ 6 - 6
editor/plugins/node_3d_editor_plugin.cpp

@@ -1360,8 +1360,8 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
 			if (discard == EditorPlugin::AFTER_GUI_INPUT_STOP) {
 				return;
 			}
-			if (discard == EditorPlugin::AFTER_GUI_INPUT_DESELECT) {
-				after = EditorPlugin::AFTER_GUI_INPUT_DESELECT;
+			if (discard == EditorPlugin::AFTER_GUI_INPUT_CUSTOM) {
+				after = EditorPlugin::AFTER_GUI_INPUT_CUSTOM;
 			}
 		}
 	}
@@ -1373,8 +1373,8 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
 			if (discard == EditorPlugin::AFTER_GUI_INPUT_STOP) {
 				return;
 			}
-			if (discard == EditorPlugin::AFTER_GUI_INPUT_DESELECT) {
-				after = EditorPlugin::AFTER_GUI_INPUT_DESELECT;
+			if (discard == EditorPlugin::AFTER_GUI_INPUT_CUSTOM) {
+				after = EditorPlugin::AFTER_GUI_INPUT_CUSTOM;
 			}
 		}
 	}
@@ -1601,7 +1601,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
 						break;
 					}
 
-					if (after != EditorPlugin::AFTER_GUI_INPUT_DESELECT) {
+					if (after != EditorPlugin::AFTER_GUI_INPUT_CUSTOM) {
 						//clicking is always deferred to either move or release
 						clicked = _select_ray(b->get_position());
 						selection_in_progress = true;
@@ -1622,7 +1622,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
 						break;
 					}
 
-					if (after != EditorPlugin::AFTER_GUI_INPUT_DESELECT) {
+					if (after != EditorPlugin::AFTER_GUI_INPUT_CUSTOM) {
 						selection_in_progress = false;
 
 						if (clicked.is_valid()) {

+ 1 - 1
editor/plugins/skeleton_3d_editor_plugin.cpp

@@ -1139,7 +1139,7 @@ EditorPlugin::AfterGUIInput Skeleton3DEditorPlugin::forward_spatial_gui_input(Ca
 				se->update_bone_original();
 			}
 		}
-		return EditorPlugin::AFTER_GUI_INPUT_DESELECT;
+		return EditorPlugin::AFTER_GUI_INPUT_CUSTOM;
 	}
 	return EditorPlugin::AFTER_GUI_INPUT_PASS;
 }