Kaynağa Gözat

Merge pull request #92717 from KoBeWi/twisted_frying_pan

Add warped panning to every ViewPanner instance
Thaddeus Crews 8 ay önce
ebeveyn
işleme
98c3138804

+ 3 - 3
editor/animation_bezier_editor.cpp

@@ -217,14 +217,14 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
 			if (EditorSettings::get_singleton()->check_changed_settings_in_group("editors/panning")) {
 			if (EditorSettings::get_singleton()->check_changed_settings_in_group("editors/panning")) {
 				panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
 				panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
+				panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning"));
 			}
 			}
 		} break;
 		} break;
 
 
 		case NOTIFICATION_ENTER_TREE: {
 		case NOTIFICATION_ENTER_TREE: {
 			panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
 			panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
-			panner->set_viewport(get_viewport());
-			[[fallthrough]];
-		}
+			panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning"));
+		} break;
 		case NOTIFICATION_THEME_CHANGED: {
 		case NOTIFICATION_THEME_CHANGED: {
 			bezier_icon = get_editor_theme_icon(SNAME("KeyBezierPoint"));
 			bezier_icon = get_editor_theme_icon(SNAME("KeyBezierPoint"));
 			bezier_handle_icon = get_editor_theme_icon(SNAME("KeyBezierHandle"));
 			bezier_handle_icon = get_editor_theme_icon(SNAME("KeyBezierHandle"));

+ 11 - 9
editor/animation_track_editor.cpp

@@ -1451,7 +1451,6 @@ int AnimationTimelineEdit::get_name_limit() const {
 
 
 void AnimationTimelineEdit::_notification(int p_what) {
 void AnimationTimelineEdit::_notification(int p_what) {
 	switch (p_what) {
 	switch (p_what) {
-		case NOTIFICATION_ENTER_TREE:
 		case NOTIFICATION_THEME_CHANGED: {
 		case NOTIFICATION_THEME_CHANGED: {
 			add_track->set_button_icon(get_editor_theme_icon(SNAME("Add")));
 			add_track->set_button_icon(get_editor_theme_icon(SNAME("Add")));
 			loop->set_button_icon(get_editor_theme_icon(SNAME("Loop")));
 			loop->set_button_icon(get_editor_theme_icon(SNAME("Loop")));
@@ -1470,9 +1469,14 @@ void AnimationTimelineEdit::_notification(int p_what) {
 		} break;
 		} break;
 
 
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
-			if (EditorSettings::get_singleton()->check_changed_settings_in_group("editors/panning")) {
-				panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
+			if (!EditorSettings::get_singleton()->check_changed_settings_in_group("editors/panning")) {
+				break;
 			}
 			}
+			[[fallthrough]];
+		}
+		case NOTIFICATION_ENTER_TREE: {
+			panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
+			panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning"));
 		} break;
 		} break;
 
 
 		case NOTIFICATION_RESIZED: {
 		case NOTIFICATION_RESIZED: {
@@ -1872,7 +1876,7 @@ void AnimationTimelineEdit::_play_position_draw() {
 void AnimationTimelineEdit::gui_input(const Ref<InputEvent> &p_event) {
 void AnimationTimelineEdit::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 	ERR_FAIL_COND(p_event.is_null());
 
 
-	if (panner->gui_input(p_event)) {
+	if (panner->gui_input(p_event, get_global_rect())) {
 		accept_event();
 		accept_event();
 		return;
 		return;
 	}
 	}
@@ -5138,12 +5142,10 @@ void AnimationTrackEditor::_notification(int p_what) {
 			}
 			}
 			[[fallthrough]];
 			[[fallthrough]];
 		}
 		}
-
 		case NOTIFICATION_ENTER_TREE: {
 		case NOTIFICATION_ENTER_TREE: {
 			panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
 			panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/animation_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
-			panner->set_viewport(get_viewport());
-			[[fallthrough]];
-		}
+			panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning"));
+		} break;
 		case NOTIFICATION_THEME_CHANGED: {
 		case NOTIFICATION_THEME_CHANGED: {
 			zoom_icon->set_texture(get_editor_theme_icon(SNAME("Zoom")));
 			zoom_icon->set_texture(get_editor_theme_icon(SNAME("Zoom")));
 			bezier_edit_icon->set_button_icon(get_editor_theme_icon(SNAME("EditBezier")));
 			bezier_edit_icon->set_button_icon(get_editor_theme_icon(SNAME("EditBezier")));
@@ -5939,7 +5941,7 @@ void AnimationTrackEditor::_box_selection_draw() {
 
 
 void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) {
 void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) {
 	if (!box_selecting) {
 	if (!box_selecting) {
-		if (panner->gui_input(p_event)) {
+		if (panner->gui_input(p_event, scroll->get_global_rect())) {
 			scroll->accept_event();
 			scroll->accept_event();
 			return;
 			return;
 		}
 		}

+ 1 - 2
editor/plugins/animation_blend_tree_editor_plugin.cpp

@@ -930,14 +930,13 @@ void AnimationNodeBlendTreeEditor::_inspect_filters(const String &p_which) {
 
 
 void AnimationNodeBlendTreeEditor::_update_editor_settings() {
 void AnimationNodeBlendTreeEditor::_update_editor_settings() {
 	graph->get_panner()->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
 	graph->get_panner()->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
-	graph->set_warped_panning(bool(EDITOR_GET("editors/panning/warped_mouse_panning")));
+	graph->set_warped_panning(EDITOR_GET("editors/panning/warped_mouse_panning"));
 }
 }
 
 
 void AnimationNodeBlendTreeEditor::_notification(int p_what) {
 void AnimationNodeBlendTreeEditor::_notification(int p_what) {
 	switch (p_what) {
 	switch (p_what) {
 		case NOTIFICATION_ENTER_TREE: {
 		case NOTIFICATION_ENTER_TREE: {
 			_update_editor_settings();
 			_update_editor_settings();
-			graph->get_panner()->set_viewport(get_viewport());
 		} break;
 		} break;
 
 
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {

+ 5 - 7
editor/plugins/canvas_item_editor_plugin.cpp

@@ -1300,7 +1300,7 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve
 
 
 bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bool p_already_accepted) {
 bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bool p_already_accepted) {
 	panner->set_force_drag(tool == TOOL_PAN);
 	panner->set_force_drag(tool == TOOL_PAN);
-	bool panner_active = panner->gui_input(p_event, warped_panning ? viewport->get_global_rect() : Rect2());
+	bool panner_active = panner->gui_input(p_event, viewport->get_global_rect());
 	if (panner->is_panning() != pan_pressed) {
 	if (panner->is_panning() != pan_pressed) {
 		pan_pressed = panner->is_panning();
 		pan_pressed = panner->is_panning();
 		_update_cursor();
 		_update_cursor();
@@ -4080,7 +4080,7 @@ void CanvasItemEditor::_update_editor_settings() {
 
 
 	panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/2d_editor_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
 	panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/2d_editor_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
 	panner->set_scroll_speed(EDITOR_GET("editors/panning/2d_editor_pan_speed"));
 	panner->set_scroll_speed(EDITOR_GET("editors/panning/2d_editor_pan_speed"));
-	warped_panning = bool(EDITOR_GET("editors/panning/warped_mouse_panning"));
+	panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning"));
 }
 }
 
 
 void CanvasItemEditor::_project_settings_changed() {
 void CanvasItemEditor::_project_settings_changed() {
@@ -4178,18 +4178,16 @@ void CanvasItemEditor::_notification(int p_what) {
 			AnimationPlayerEditor::get_singleton()->connect("animation_selected", callable_mp(this, &CanvasItemEditor::_keying_changed).unbind(1));
 			AnimationPlayerEditor::get_singleton()->connect("animation_selected", callable_mp(this, &CanvasItemEditor::_keying_changed).unbind(1));
 			_keying_changed();
 			_keying_changed();
 			_update_editor_settings();
 			_update_editor_settings();
-			panner->set_viewport(get_viewport());
 
 
 			connect("item_lock_status_changed", callable_mp(this, &CanvasItemEditor::_update_lock_and_group_button));
 			connect("item_lock_status_changed", callable_mp(this, &CanvasItemEditor::_update_lock_and_group_button));
 			connect("item_group_status_changed", callable_mp(this, &CanvasItemEditor::_update_lock_and_group_button));
 			connect("item_group_status_changed", callable_mp(this, &CanvasItemEditor::_update_lock_and_group_button));
 		} break;
 		} break;
 
 
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
-			if (!EditorThemeManager::is_generated_theme_outdated() &&
-					!EditorSettings::get_singleton()->check_changed_settings_in_group("editors/panning")) {
-				break;
+			if (EditorThemeManager::is_generated_theme_outdated() ||
+					EditorSettings::get_singleton()->check_changed_settings_in_group("editors/panning")) {
+				_update_editor_settings();
 			}
 			}
-			_update_editor_settings();
 		} break;
 		} break;
 
 
 		case NOTIFICATION_APPLICATION_FOCUS_OUT:
 		case NOTIFICATION_APPLICATION_FOCUS_OUT:

+ 0 - 1
editor/plugins/canvas_item_editor_plugin.h

@@ -380,7 +380,6 @@ private:
 	Ref<Shortcut> divide_grid_step_shortcut;
 	Ref<Shortcut> divide_grid_step_shortcut;
 
 
 	Ref<ViewPanner> panner;
 	Ref<ViewPanner> panner;
-	bool warped_panning = true;
 	void _pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event);
 	void _pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event);
 	void _zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event);
 	void _zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event);
 
 

+ 2 - 2
editor/plugins/polygon_2d_editor_plugin.cpp

@@ -107,7 +107,7 @@ void Polygon2DEditor::_notification(int p_what) {
 		}
 		}
 		case NOTIFICATION_ENTER_TREE: {
 		case NOTIFICATION_ENTER_TREE: {
 			uv_panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
 			uv_panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
-			uv_panner->set_viewport(get_viewport());
+			uv_panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning"));
 		} break;
 		} break;
 
 
 		case NOTIFICATION_READY: {
 		case NOTIFICATION_READY: {
@@ -507,7 +507,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
 		return;
 		return;
 	}
 	}
 
 
-	if (uv_panner->gui_input(p_input)) {
+	if (uv_panner->gui_input(p_input, uv_edit_draw->get_global_rect())) {
 		accept_event();
 		accept_event();
 		return;
 		return;
 	}
 	}

+ 8 - 4
editor/plugins/sprite_2d_editor_plugin.cpp

@@ -450,7 +450,7 @@ void Sprite2DEditor::_add_as_sibling_or_child(Node *p_own_node, Node *p_new_node
 }
 }
 
 
 void Sprite2DEditor::_debug_uv_input(const Ref<InputEvent> &p_input) {
 void Sprite2DEditor::_debug_uv_input(const Ref<InputEvent> &p_input) {
-	if (panner->gui_input(p_input)) {
+	if (panner->gui_input(p_input, debug_uv->get_global_rect())) {
 		accept_event();
 		accept_event();
 	}
 	}
 }
 }
@@ -556,10 +556,14 @@ void Sprite2DEditor::_notification(int p_what) {
 			[[fallthrough]];
 			[[fallthrough]];
 		}
 		}
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
-			panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
-		} break;
+			if (!EditorSettings::get_singleton()->check_changed_settings_in_group("editors/panning")) {
+				break;
+			}
+			[[fallthrough]];
+		}
 		case NOTIFICATION_ENTER_TREE: {
 		case NOTIFICATION_ENTER_TREE: {
-			panner->set_viewport(get_viewport());
+			panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
+			panner->setup_warped_panning(debug_uv_dialog, EDITOR_GET("editors/panning/warped_mouse_panning"));
 		} break;
 		} break;
 		case NOTIFICATION_THEME_CHANGED: {
 		case NOTIFICATION_THEME_CHANGED: {
 			options->set_button_icon(get_editor_theme_icon(SNAME("Sprite2D")));
 			options->set_button_icon(get_editor_theme_icon(SNAME("Sprite2D")));

+ 2 - 2
editor/plugins/texture_region_editor_plugin.cpp

@@ -296,7 +296,7 @@ void TextureRegionEditor::_set_grid_parameters_clamping(bool p_enabled) {
 }
 }
 
 
 void TextureRegionEditor::_texture_overlay_input(const Ref<InputEvent> &p_input) {
 void TextureRegionEditor::_texture_overlay_input(const Ref<InputEvent> &p_input) {
-	if (panner->gui_input(p_input)) {
+	if (panner->gui_input(p_input, texture_overlay->get_global_rect())) {
 		return;
 		return;
 	}
 	}
 
 
@@ -833,7 +833,7 @@ void TextureRegionEditor::_notification(int p_what) {
 			}
 			}
 
 
 			panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
 			panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
-			panner->set_viewport(get_viewport());
+			panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning"));
 		} break;
 		} break;
 
 
 		case NOTIFICATION_EXIT_TREE: {
 		case NOTIFICATION_EXIT_TREE: {

+ 2 - 2
editor/plugins/tiles/tile_atlas_view.cpp

@@ -39,7 +39,7 @@
 #include "scene/gui/view_panner.h"
 #include "scene/gui/view_panner.h"
 
 
 void TileAtlasView::gui_input(const Ref<InputEvent> &p_event) {
 void TileAtlasView::gui_input(const Ref<InputEvent> &p_event) {
-	if (panner->gui_input(p_event)) {
+	if (panner->gui_input(p_event, get_global_rect())) {
 		accept_event();
 		accept_event();
 	}
 	}
 }
 }
@@ -613,7 +613,7 @@ void TileAtlasView::_notification(int p_what) {
 		}
 		}
 		case NOTIFICATION_ENTER_TREE: {
 		case NOTIFICATION_ENTER_TREE: {
 			panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
 			panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
-			panner->set_viewport(get_viewport());
+			panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning"));
 		} break;
 		} break;
 
 
 		case NOTIFICATION_THEME_CHANGED: {
 		case NOTIFICATION_THEME_CHANGED: {

+ 2 - 3
editor/plugins/visual_shader_editor_plugin.cpp

@@ -5160,7 +5160,7 @@ void VisualShaderEditor::_notification(int p_what) {
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
 			if (EditorSettings::get_singleton()->check_changed_settings_in_group("editors/panning")) {
 			if (EditorSettings::get_singleton()->check_changed_settings_in_group("editors/panning")) {
 				graph->get_panner()->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
 				graph->get_panner()->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
-				graph->set_warped_panning(bool(EDITOR_GET("editors/panning/warped_mouse_panning")));
+				graph->set_warped_panning(EDITOR_GET("editors/panning/warped_mouse_panning"));
 			}
 			}
 			if (EditorSettings::get_singleton()->check_changed_settings_in_group("editors/visual_editors")) {
 			if (EditorSettings::get_singleton()->check_changed_settings_in_group("editors/visual_editors")) {
 				graph->set_minimap_opacity(EDITOR_GET("editors/visual_editors/minimap_opacity"));
 				graph->set_minimap_opacity(EDITOR_GET("editors/visual_editors/minimap_opacity"));
@@ -5188,8 +5188,7 @@ void VisualShaderEditor::_notification(int p_what) {
 			}
 			}
 
 
 			graph->get_panner()->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
 			graph->get_panner()->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/sub_editors_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
-			graph->get_panner()->set_viewport(get_viewport());
-			graph->set_warped_panning(bool(EDITOR_GET("editors/panning/warped_mouse_panning")));
+			graph->set_warped_panning(EDITOR_GET("editors/panning/warped_mouse_panning"));
 		} break;
 		} break;
 
 
 		case NOTIFICATION_THEME_CHANGED: {
 		case NOTIFICATION_THEME_CHANGED: {

+ 2 - 3
scene/debugger/scene_debugger.cpp

@@ -1250,9 +1250,8 @@ void RuntimeNodeSelect::_setup(const Dictionary &p_settings) {
 	int pan_speed = p_settings.get("editors/panning/2d_editor_pan_speed", 20);
 	int pan_speed = p_settings.get("editors/panning/2d_editor_pan_speed", 20);
 	Array keys = p_settings.get("canvas_item_editor/pan_view", Array()).operator Array();
 	Array keys = p_settings.get("canvas_item_editor/pan_view", Array()).operator Array();
 	panner->setup(panning_scheme, DebuggerMarshalls::deserialize_key_shortcut(keys), simple_panning);
 	panner->setup(panning_scheme, DebuggerMarshalls::deserialize_key_shortcut(keys), simple_panning);
-	panner->set_viewport(root);
+	panner->setup_warped_panning(root, p_settings.get("editors/panning/warped_mouse_panning", true));
 	panner->set_scroll_speed(pan_speed);
 	panner->set_scroll_speed(pan_speed);
-	warped_panning = p_settings.get("editors/panning/warped_mouse_panning", false);
 
 
 	/// 2D Selection Box Generation
 	/// 2D Selection Box Generation
 
 
@@ -1363,7 +1362,7 @@ void RuntimeNodeSelect::_root_window_input(const Ref<InputEvent> &p_event) {
 
 
 	if (camera_override) {
 	if (camera_override) {
 		if (node_select_type == NODE_TYPE_2D) {
 		if (node_select_type == NODE_TYPE_2D) {
-			if (panner->gui_input(p_event, warped_panning ? Rect2(Vector2(), root->get_size()) : Rect2())) {
+			if (panner->gui_input(p_event, Rect2(Vector2(), root->get_size()))) {
 				return;
 				return;
 			}
 			}
 		} else if (node_select_type == NODE_TYPE_3D) {
 		} else if (node_select_type == NODE_TYPE_3D) {

+ 7 - 2
scene/gui/graph_edit.cpp

@@ -793,7 +793,7 @@ void GraphEdit::_notification(int p_what) {
 		} break;
 		} break;
 
 
 		case NOTIFICATION_ENTER_TREE: {
 		case NOTIFICATION_ENTER_TREE: {
-			panner->set_viewport(get_viewport());
+			update_warped_panning();
 		} break;
 		} break;
 	}
 	}
 }
 }
@@ -1737,7 +1737,7 @@ void GraphEdit::gui_input(const Ref<InputEvent> &p_ev) {
 	ERR_FAIL_NULL_MSG(connections_layer, "connections_layer is missing.");
 	ERR_FAIL_NULL_MSG(connections_layer, "connections_layer is missing.");
 
 
 	ERR_FAIL_COND(p_ev.is_null());
 	ERR_FAIL_COND(p_ev.is_null());
-	if (panner->gui_input(p_ev, warped_panning ? get_global_rect() : Rect2())) {
+	if (panner->gui_input(p_ev, get_global_rect())) {
 		return;
 		return;
 	}
 	}
 
 
@@ -2669,6 +2669,11 @@ Ref<ViewPanner> GraphEdit::get_panner() {
 
 
 void GraphEdit::set_warped_panning(bool p_warped) {
 void GraphEdit::set_warped_panning(bool p_warped) {
 	warped_panning = p_warped;
 	warped_panning = p_warped;
+	update_warped_panning();
+}
+
+void GraphEdit::update_warped_panning() {
+	panner->setup_warped_panning(get_viewport(), warped_panning);
 }
 }
 
 
 void GraphEdit::arrange_nodes() {
 void GraphEdit::arrange_nodes() {

+ 1 - 0
scene/gui/graph_edit.h

@@ -508,6 +508,7 @@ public:
 	HBoxContainer *get_menu_hbox();
 	HBoxContainer *get_menu_hbox();
 	Ref<ViewPanner> get_panner();
 	Ref<ViewPanner> get_panner();
 	void set_warped_panning(bool p_warped);
 	void set_warped_panning(bool p_warped);
+	void update_warped_panning();
 
 
 	void arrange_nodes();
 	void arrange_nodes();
 
 

+ 4 - 4
scene/gui/view_panner.cpp

@@ -110,8 +110,8 @@ bool ViewPanner::gui_input(const Ref<InputEvent> &p_event, Rect2 p_canvas_rect)
 	Ref<InputEventMouseMotion> mm = p_event;
 	Ref<InputEventMouseMotion> mm = p_event;
 	if (mm.is_valid()) {
 	if (mm.is_valid()) {
 		if (is_dragging) {
 		if (is_dragging) {
-			if (viewport && p_canvas_rect != Rect2()) {
-				pan_callback.call(viewport->wrap_mouse_in_rect(mm->get_relative(), p_canvas_rect), p_event);
+			if (warped_panning_viewport && p_canvas_rect.has_area()) {
+				pan_callback.call(warped_panning_viewport->wrap_mouse_in_rect(mm->get_relative(), p_canvas_rect), p_event);
 			} else {
 			} else {
 				pan_callback.call(mm->get_relative(), p_event);
 				pan_callback.call(mm->get_relative(), p_event);
 			}
 			}
@@ -213,8 +213,8 @@ void ViewPanner::setup(ControlScheme p_scheme, Ref<Shortcut> p_shortcut, bool p_
 	set_simple_panning_enabled(p_simple_panning);
 	set_simple_panning_enabled(p_simple_panning);
 }
 }
 
 
-void ViewPanner::set_viewport(Viewport *p_viewport) {
-	viewport = p_viewport;
+void ViewPanner::setup_warped_panning(Viewport *p_viewport, bool p_allowed) {
+	warped_panning_viewport = p_allowed ? p_viewport : nullptr;
 }
 }
 
 
 bool ViewPanner::is_panning() const {
 bool ViewPanner::is_panning() const {

+ 2 - 3
scene/gui/view_panner.h

@@ -64,14 +64,13 @@ private:
 	bool enable_rmb = false;
 	bool enable_rmb = false;
 	bool simple_panning_enabled = false;
 	bool simple_panning_enabled = false;
 
 
-	Viewport *viewport = nullptr;
-
 	Ref<Shortcut> pan_view_shortcut;
 	Ref<Shortcut> pan_view_shortcut;
 
 
 	Callable pan_callback;
 	Callable pan_callback;
 	Callable zoom_callback;
 	Callable zoom_callback;
 
 
 	ControlScheme control_scheme = SCROLL_ZOOMS;
 	ControlScheme control_scheme = SCROLL_ZOOMS;
+	Viewport *warped_panning_viewport = nullptr;
 
 
 public:
 public:
 	void set_callbacks(Callable p_pan_callback, Callable p_zoom_callback);
 	void set_callbacks(Callable p_pan_callback, Callable p_zoom_callback);
@@ -84,7 +83,7 @@ public:
 	void set_pan_axis(PanAxis p_pan_axis);
 	void set_pan_axis(PanAxis p_pan_axis);
 
 
 	void setup(ControlScheme p_scheme, Ref<Shortcut> p_shortcut, bool p_simple_panning);
 	void setup(ControlScheme p_scheme, Ref<Shortcut> p_shortcut, bool p_simple_panning);
-	void set_viewport(Viewport *p_viewport);
+	void setup_warped_panning(Viewport *p_viewport, bool p_allowed);
 
 
 	bool is_panning() const;
 	bool is_panning() const;
 	void set_force_drag(bool p_force);
 	void set_force_drag(bool p_force);