diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp index 816c817601e..43c6285d282 100644 --- a/editor/animation_bezier_editor.cpp +++ b/editor/animation_bezier_editor.cpp @@ -217,14 +217,14 @@ void AnimationBezierTrackEdit::_notification(int p_what) { 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"))); + panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning")); } } break; 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->set_viewport(get_viewport()); - [[fallthrough]]; - } + panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning")); + } break; case NOTIFICATION_THEME_CHANGED: { bezier_icon = get_editor_theme_icon(SNAME("KeyBezierPoint")); bezier_handle_icon = get_editor_theme_icon(SNAME("KeyBezierHandle")); diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index ca76d1dd9c7..6ae74aef428 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -1451,7 +1451,6 @@ int AnimationTimelineEdit::get_name_limit() const { void AnimationTimelineEdit::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { add_track->set_button_icon(get_editor_theme_icon(SNAME("Add"))); loop->set_button_icon(get_editor_theme_icon(SNAME("Loop"))); @@ -1470,9 +1469,14 @@ void AnimationTimelineEdit::_notification(int p_what) { } break; 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; case NOTIFICATION_RESIZED: { @@ -1872,7 +1876,7 @@ void AnimationTimelineEdit::_play_position_draw() { void AnimationTimelineEdit::gui_input(const Ref &p_event) { ERR_FAIL_COND(p_event.is_null()); - if (panner->gui_input(p_event)) { + if (panner->gui_input(p_event, get_global_rect())) { accept_event(); return; } @@ -5138,12 +5142,10 @@ void AnimationTrackEditor::_notification(int p_what) { } [[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->set_viewport(get_viewport()); - [[fallthrough]]; - } + panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning")); + } break; case NOTIFICATION_THEME_CHANGED: { zoom_icon->set_texture(get_editor_theme_icon(SNAME("Zoom"))); 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 &p_event) { if (!box_selecting) { - if (panner->gui_input(p_event)) { + if (panner->gui_input(p_event, scroll->get_global_rect())) { scroll->accept_event(); return; } diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp index b4581afdc46..83e41ee9a96 100644 --- a/editor/plugins/animation_blend_tree_editor_plugin.cpp +++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp @@ -935,14 +935,13 @@ void AnimationNodeBlendTreeEditor::_inspect_filters(const String &p_which) { 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->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) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { _update_editor_settings(); - graph->get_panner()->set_viewport(get_viewport()); } break; case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index d6068d176d4..4199a53de65 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -1300,7 +1300,7 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref &p_eve bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref &p_event, bool p_already_accepted) { 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) { pan_pressed = panner->is_panning(); _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->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() { @@ -4178,18 +4178,16 @@ void CanvasItemEditor::_notification(int p_what) { AnimationPlayerEditor::get_singleton()->connect("animation_selected", callable_mp(this, &CanvasItemEditor::_keying_changed).unbind(1)); _keying_changed(); _update_editor_settings(); - panner->set_viewport(get_viewport()); 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)); } break; 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; case NOTIFICATION_APPLICATION_FOCUS_OUT: diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 14a1ac13fc5..1581db93f8c 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -380,7 +380,6 @@ private: Ref divide_grid_step_shortcut; Ref panner; - bool warped_panning = true; void _pan_callback(Vector2 p_scroll_vec, Ref p_event); void _zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref p_event); diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index 60cbfd59952..14adde2c535 100644 --- a/editor/plugins/polygon_2d_editor_plugin.cpp +++ b/editor/plugins/polygon_2d_editor_plugin.cpp @@ -108,7 +108,7 @@ void Polygon2DEditor::_notification(int p_what) { } 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->set_viewport(get_viewport()); + uv_panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning")); } break; case NOTIFICATION_READY: { @@ -508,7 +508,7 @@ void Polygon2DEditor::_uv_input(const Ref &p_input) { return; } - if (uv_panner->gui_input(p_input)) { + if (uv_panner->gui_input(p_input, uv_edit_draw->get_global_rect())) { accept_event(); return; } diff --git a/editor/plugins/sprite_2d_editor_plugin.cpp b/editor/plugins/sprite_2d_editor_plugin.cpp index f518eb6ecfa..4a2eee13474 100644 --- a/editor/plugins/sprite_2d_editor_plugin.cpp +++ b/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 &p_input) { - if (panner->gui_input(p_input)) { + if (panner->gui_input(p_input, debug_uv->get_global_rect())) { accept_event(); } } @@ -556,10 +556,14 @@ void Sprite2DEditor::_notification(int p_what) { [[fallthrough]]; } 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: { - 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; case NOTIFICATION_THEME_CHANGED: { options->set_button_icon(get_editor_theme_icon(SNAME("Sprite2D"))); diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index 15bee01c15c..30c3fd7923a 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/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 &p_input) { - if (panner->gui_input(p_input)) { + if (panner->gui_input(p_input, texture_overlay->get_global_rect())) { 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->set_viewport(get_viewport()); + panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning")); } break; case NOTIFICATION_EXIT_TREE: { diff --git a/editor/plugins/tiles/tile_atlas_view.cpp b/editor/plugins/tiles/tile_atlas_view.cpp index 144493ab40b..d430e45dea2 100644 --- a/editor/plugins/tiles/tile_atlas_view.cpp +++ b/editor/plugins/tiles/tile_atlas_view.cpp @@ -41,7 +41,7 @@ #include "scene/gui/view_panner.h" void TileAtlasView::gui_input(const Ref &p_event) { - if (panner->gui_input(p_event)) { + if (panner->gui_input(p_event, get_global_rect())) { accept_event(); } } @@ -615,7 +615,7 @@ void TileAtlasView::_notification(int p_what) { } 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->set_viewport(get_viewport()); + panner->setup_warped_panning(get_viewport(), EDITOR_GET("editors/panning/warped_mouse_panning")); } break; case NOTIFICATION_THEME_CHANGED: { diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index bf1d441c6f9..4289ca69ba0 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -5160,7 +5160,7 @@ void VisualShaderEditor::_notification(int p_what) { case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { 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->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")) { 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()->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; case NOTIFICATION_THEME_CHANGED: { diff --git a/scene/debugger/scene_debugger.cpp b/scene/debugger/scene_debugger.cpp index 1e9e961cf61..81e559a5ad2 100644 --- a/scene/debugger/scene_debugger.cpp +++ b/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); 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->set_viewport(root); + panner->setup_warped_panning(root, p_settings.get("editors/panning/warped_mouse_panning", true)); panner->set_scroll_speed(pan_speed); - warped_panning = p_settings.get("editors/panning/warped_mouse_panning", false); /// 2D Selection Box Generation @@ -1363,7 +1362,7 @@ void RuntimeNodeSelect::_root_window_input(const Ref &p_event) { if (camera_override) { 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; } } else if (node_select_type == NODE_TYPE_3D) { diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index 2b393dacafb..caa05909cc9 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -793,7 +793,7 @@ void GraphEdit::_notification(int p_what) { } break; case NOTIFICATION_ENTER_TREE: { - panner->set_viewport(get_viewport()); + update_warped_panning(); } break; } } @@ -1737,7 +1737,7 @@ void GraphEdit::gui_input(const Ref &p_ev) { ERR_FAIL_NULL_MSG(connections_layer, "connections_layer is missing."); 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; } @@ -2669,6 +2669,11 @@ Ref GraphEdit::get_panner() { void GraphEdit::set_warped_panning(bool 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() { diff --git a/scene/gui/graph_edit.h b/scene/gui/graph_edit.h index b0fdd88f43e..abc015cc87a 100644 --- a/scene/gui/graph_edit.h +++ b/scene/gui/graph_edit.h @@ -508,6 +508,7 @@ public: HBoxContainer *get_menu_hbox(); Ref get_panner(); void set_warped_panning(bool p_warped); + void update_warped_panning(); void arrange_nodes(); diff --git a/scene/gui/view_panner.cpp b/scene/gui/view_panner.cpp index a436e662fd0..ac6aa2f26ba 100644 --- a/scene/gui/view_panner.cpp +++ b/scene/gui/view_panner.cpp @@ -110,8 +110,8 @@ bool ViewPanner::gui_input(const Ref &p_event, Rect2 p_canvas_rect) Ref mm = p_event; if (mm.is_valid()) { 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 { pan_callback.call(mm->get_relative(), p_event); } @@ -213,8 +213,8 @@ void ViewPanner::setup(ControlScheme p_scheme, Ref p_shortcut, bool p_ 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 { diff --git a/scene/gui/view_panner.h b/scene/gui/view_panner.h index 7cdd43e1240..7b1ac27a0f4 100644 --- a/scene/gui/view_panner.h +++ b/scene/gui/view_panner.h @@ -64,14 +64,13 @@ private: bool enable_rmb = false; bool simple_panning_enabled = false; - Viewport *viewport = nullptr; - Ref pan_view_shortcut; Callable pan_callback; Callable zoom_callback; ControlScheme control_scheme = SCROLL_ZOOMS; + Viewport *warped_panning_viewport = nullptr; public: 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 setup(ControlScheme p_scheme, Ref 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; void set_force_drag(bool p_force);