1
0
Fork 0

Add warped panning to every ViewPanner instance

This commit is contained in:
kobewi 2024-06-03 10:39:22 +02:00
parent 89001f91d2
commit 9a96393f46
15 changed files with 52 additions and 47 deletions

View File

@ -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"));

View File

@ -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<InputEvent> &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<InputEvent> &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;
}

View File

@ -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: {

View File

@ -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) {
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:

View File

@ -380,7 +380,6 @@ private:
Ref<Shortcut> divide_grid_step_shortcut;
Ref<ViewPanner> panner;
bool warped_panning = true;
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);

View File

@ -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<InputEvent> &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;
}

View File

@ -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) {
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")));

View File

@ -296,7 +296,7 @@ void TextureRegionEditor::_set_grid_parameters_clamping(bool p_enabled) {
}
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;
}
@ -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: {

View File

@ -41,7 +41,7 @@
#include "scene/gui/view_panner.h"
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();
}
}
@ -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: {

View File

@ -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: {

View File

@ -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<InputEvent> &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) {

View File

@ -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<InputEvent> &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<ViewPanner> 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() {

View File

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

View File

@ -110,8 +110,8 @@ bool ViewPanner::gui_input(const Ref<InputEvent> &p_event, Rect2 p_canvas_rect)
Ref<InputEventMouseMotion> 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<Shortcut> 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 {

View File

@ -64,14 +64,13 @@ private:
bool enable_rmb = false;
bool simple_panning_enabled = false;
Viewport *viewport = nullptr;
Ref<Shortcut> 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<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;
void set_force_drag(bool p_force);