diff options
| -rw-r--r-- | editor/animation_bezier_editor.cpp | 25 | ||||
| -rw-r--r-- | editor/animation_bezier_editor.h | 5 | ||||
| -rw-r--r-- | editor/animation_track_editor.cpp | 46 | ||||
| -rw-r--r-- | editor/animation_track_editor.h | 10 | ||||
| -rw-r--r-- | editor/plugins/canvas_item_editor_plugin.cpp | 56 | ||||
| -rw-r--r-- | editor/plugins/canvas_item_editor_plugin.h | 6 | ||||
| -rw-r--r-- | editor/plugins/polygon_2d_editor_plugin.cpp | 16 | ||||
| -rw-r--r-- | editor/plugins/polygon_2d_editor_plugin.h | 5 | ||||
| -rw-r--r-- | editor/plugins/texture_region_editor_plugin.cpp | 16 | ||||
| -rw-r--r-- | editor/plugins/texture_region_editor_plugin.h | 5 | ||||
| -rw-r--r-- | editor/plugins/tiles/tile_atlas_view.cpp | 12 | ||||
| -rw-r--r-- | editor/plugins/tiles/tile_atlas_view.h | 5 | ||||
| -rw-r--r-- | scene/gui/graph_edit.cpp | 28 | ||||
| -rw-r--r-- | scene/gui/graph_edit.h | 5 | ||||
| -rw-r--r-- | scene/gui/view_panner.cpp | 84 | ||||
| -rw-r--r-- | scene/gui/view_panner.h | 16 | 
16 files changed, 139 insertions, 201 deletions
| diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp index 639f5e6de5..8defa04ada 100644 --- a/editor/animation_bezier_editor.cpp +++ b/editor/animation_bezier_editor.cpp @@ -1489,32 +1489,21 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) {  	}  } -void AnimationBezierTrackEdit::_scroll_callback(Vector2 p_scroll_vec, bool p_alt) { -	_pan_callback(-p_scroll_vec * 32); -} - -void AnimationBezierTrackEdit::_pan_callback(Vector2 p_scroll_vec) { +void AnimationBezierTrackEdit::_pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event) {  	v_scroll += p_scroll_vec.y * v_zoom;  	v_scroll = CLAMP(v_scroll, -100000, 100000);  	timeline->set_value(timeline->get_value() - p_scroll_vec.x / timeline->get_zoom_scale());  	queue_redraw();  } -void AnimationBezierTrackEdit::_zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt) { +void AnimationBezierTrackEdit::_zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event) {  	const float v_zoom_orig = v_zoom; -	if (p_alt) { +	Ref<InputEventWithModifiers> iewm = p_event; +	if (iewm.is_valid() && iewm->is_alt_pressed()) {  		// Alternate zoom (doesn't affect timeline). -		if (p_scroll_vec.y > 0) { -			v_zoom = MIN(v_zoom * 1.2, 100000); -		} else { -			v_zoom = MAX(v_zoom / 1.2, 0.000001); -		} +		v_zoom = CLAMP(v_zoom * p_zoom_factor, 0.000001, 100000);  	} else { -		if (p_scroll_vec.y > 0) { -			timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() / 1.05); -		} else { -			timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() * 1.05); -		} +		timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() / p_zoom_factor);  	}  	v_scroll = v_scroll + (p_origin.y - get_size().y / 2.0) * (v_zoom - v_zoom_orig);  	queue_redraw(); @@ -1681,7 +1670,7 @@ void AnimationBezierTrackEdit::_bind_methods() {  AnimationBezierTrackEdit::AnimationBezierTrackEdit() {  	panner.instantiate(); -	panner->set_callbacks(callable_mp(this, &AnimationBezierTrackEdit::_scroll_callback), callable_mp(this, &AnimationBezierTrackEdit::_pan_callback), callable_mp(this, &AnimationBezierTrackEdit::_zoom_callback)); +	panner->set_callbacks(callable_mp(this, &AnimationBezierTrackEdit::_pan_callback), callable_mp(this, &AnimationBezierTrackEdit::_zoom_callback));  	play_position = memnew(Control);  	play_position->set_mouse_filter(MOUSE_FILTER_PASS); diff --git a/editor/animation_bezier_editor.h b/editor/animation_bezier_editor.h index e6d6424ef2..dbc231ccac 100644 --- a/editor/animation_bezier_editor.h +++ b/editor/animation_bezier_editor.h @@ -174,9 +174,8 @@ class AnimationBezierTrackEdit : public Control {  	SelectionSet selection;  	Ref<ViewPanner> panner; -	void _scroll_callback(Vector2 p_scroll_vec, bool p_alt); -	void _pan_callback(Vector2 p_scroll_vec); -	void _zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt); +	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 _draw_line_clipped(const Vector2 &p_from, const Vector2 &p_to, const Color &p_color, int p_clip_left, int p_clip_right);  	void _draw_track(int p_track, const Color &p_color); diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index 857a9a664a..338a22c070 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -1704,25 +1704,13 @@ Control::CursorShape AnimationTimelineEdit::get_cursor_shape(const Point2 &p_pos  	}  } -void AnimationTimelineEdit::_scroll_callback(Vector2 p_scroll_vec, bool p_alt) { -	// Timeline has no vertical scroll, so we change it to horizontal. -	p_scroll_vec.x += p_scroll_vec.y; -	_pan_callback(-p_scroll_vec * 32); -} - -void AnimationTimelineEdit::_pan_callback(Vector2 p_scroll_vec) { +void AnimationTimelineEdit::_pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event) {  	set_value(get_value() - p_scroll_vec.x / get_zoom_scale());  } -void AnimationTimelineEdit::_zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt) { -	double new_zoom_value; +void AnimationTimelineEdit::_zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event) {  	double current_zoom_value = get_zoom()->get_value(); -	if (current_zoom_value <= 0.1) { -		new_zoom_value = MAX(0.01, current_zoom_value - 0.01 * SIGN(p_scroll_vec.y)); -	} else { -		new_zoom_value = p_scroll_vec.y > 0 ? MAX(0.01, current_zoom_value / 1.05) : current_zoom_value * 1.05; -	} -	get_zoom()->set_value(new_zoom_value); +	get_zoom()->set_value(MAX(0.01, current_zoom_value * p_zoom_factor));  }  void AnimationTimelineEdit::set_use_fps(bool p_use_fps) { @@ -1798,7 +1786,8 @@ AnimationTimelineEdit::AnimationTimelineEdit() {  	len_hb->hide();  	panner.instantiate(); -	panner->set_callbacks(callable_mp(this, &AnimationTimelineEdit::_scroll_callback), callable_mp(this, &AnimationTimelineEdit::_pan_callback), callable_mp(this, &AnimationTimelineEdit::_zoom_callback)); +	panner->set_callbacks(callable_mp(this, &AnimationTimelineEdit::_pan_callback), callable_mp(this, &AnimationTimelineEdit::_zoom_callback)); +	panner->set_pan_axis(ViewPanner::PAN_AXIS_HORIZONTAL);  	set_layout_direction(Control::LAYOUT_DIRECTION_LTR);  } @@ -5358,32 +5347,23 @@ void AnimationTrackEditor::_toggle_bezier_edit() {  	}  } -void AnimationTrackEditor::_scroll_callback(Vector2 p_scroll_vec, bool p_alt) { -	if (p_alt) { +void AnimationTrackEditor::_pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event) { +	Ref<InputEventWithModifiers> iewm = p_event; +	if (iewm.is_valid() && iewm->is_alt_pressed()) {  		if (p_scroll_vec.x < 0 || p_scroll_vec.y < 0) {  			goto_prev_step(true);  		} else {  			goto_next_step(true);  		}  	} else { -		_pan_callback(-p_scroll_vec * 32); +		timeline->set_value(timeline->get_value() - p_scroll_vec.x / timeline->get_zoom_scale()); +		scroll->set_v_scroll(scroll->get_v_scroll() - p_scroll_vec.y);  	}  } -void AnimationTrackEditor::_pan_callback(Vector2 p_scroll_vec) { -	timeline->set_value(timeline->get_value() - p_scroll_vec.x / timeline->get_zoom_scale()); -	scroll->set_v_scroll(scroll->get_v_scroll() - p_scroll_vec.y); -} - -void AnimationTrackEditor::_zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt) { -	double new_zoom_value; +void AnimationTrackEditor::_zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event) {  	double current_zoom_value = timeline->get_zoom()->get_value(); -	if (current_zoom_value <= 0.1) { -		new_zoom_value = MAX(0.01, current_zoom_value - 0.01 * SIGN(p_scroll_vec.y)); -	} else { -		new_zoom_value = p_scroll_vec.y > 0 ? MAX(0.01, current_zoom_value / 1.05) : current_zoom_value * 1.05; -	} -	timeline->get_zoom()->set_value(new_zoom_value); +	timeline->get_zoom()->set_value(MAX(0.01, current_zoom_value * p_zoom_factor));  }  void AnimationTrackEditor::_cancel_bezier_edit() { @@ -6398,7 +6378,7 @@ AnimationTrackEditor::AnimationTrackEditor() {  	timeline->connect("length_changed", callable_mp(this, &AnimationTrackEditor::_update_length));  	panner.instantiate(); -	panner->set_callbacks(callable_mp(this, &AnimationTrackEditor::_scroll_callback), callable_mp(this, &AnimationTrackEditor::_pan_callback), callable_mp(this, &AnimationTrackEditor::_zoom_callback)); +	panner->set_callbacks(callable_mp(this, &AnimationTrackEditor::_pan_callback), callable_mp(this, &AnimationTrackEditor::_zoom_callback));  	scroll = memnew(ScrollContainer);  	timeline_vbox->add_child(scroll); diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index ef06445011..8506d9b80d 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -159,9 +159,8 @@ class AnimationTimelineEdit : public Range {  	bool use_fps = false;  	Ref<ViewPanner> panner; -	void _scroll_callback(Vector2 p_scroll_vec, bool p_alt); -	void _pan_callback(Vector2 p_scroll_vec); -	void _zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt); +	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);  	bool dragging_timeline = false;  	bool dragging_hsize = false; @@ -460,9 +459,8 @@ class AnimationTrackEditor : public VBoxContainer {  	PropertyInfo _find_hint_for_track(int p_idx, NodePath &r_base_path, Variant *r_current_val = nullptr);  	Ref<ViewPanner> panner; -	void _scroll_callback(Vector2 p_scroll_vec, bool p_alt); -	void _pan_callback(Vector2 p_scroll_vec); -	void _zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt); +	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 _timeline_value_changed(double); diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 5d0555a10e..e09636d297 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -1259,57 +1259,25 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo  		}  	} -	Ref<InputEventMagnifyGesture> magnify_gesture = p_event; -	if (magnify_gesture.is_valid() && !p_already_accepted) { -		// Zoom gesture -		_zoom_on_position(zoom * magnify_gesture->get_factor(), magnify_gesture->get_position()); -		return true; -	} - -	Ref<InputEventPanGesture> pan_gesture = p_event; -	if (pan_gesture.is_valid() && !p_already_accepted) { -		// If ctrl key pressed, then zoom instead of pan. -		if (pan_gesture->is_ctrl_pressed()) { -			const real_t factor = pan_gesture->get_delta().y; - -			zoom_widget->set_zoom_by_increments(1); -			if (factor != 1.f) { -				zoom_widget->set_zoom(zoom * ((zoom_widget->get_zoom() / zoom - 1.f) * factor + 1.f)); -			} -			_zoom_on_position(zoom_widget->get_zoom(), pan_gesture->get_position()); - -			return true; -		} - -		// Pan gesture -		const Vector2 delta = (pan_speed / zoom) * pan_gesture->get_delta(); -		view_offset.x += delta.x; -		view_offset.y += delta.y; -		update_viewport(); -		return true; -	} -  	return false;  } -void CanvasItemEditor::_scroll_callback(Vector2 p_scroll_vec, bool p_alt) { -	_pan_callback(-p_scroll_vec * pan_speed); -} - -void CanvasItemEditor::_pan_callback(Vector2 p_scroll_vec) { +void CanvasItemEditor::_pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event) {  	view_offset.x -= p_scroll_vec.x / zoom;  	view_offset.y -= p_scroll_vec.y / zoom;  	update_viewport();  } -void CanvasItemEditor::_zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt) { -	int scroll_sign = (int)SIGN(p_scroll_vec.y); -	// Inverted so that scrolling up (-1) zooms in, scrolling down (+1) zooms out. -	zoom_widget->set_zoom_by_increments(-scroll_sign, p_alt); -	if (!Math::is_equal_approx(ABS(p_scroll_vec.y), (real_t)1.0)) { -		// Handle high-precision (analog) scrolling. -		zoom_widget->set_zoom(zoom * ((zoom_widget->get_zoom() / zoom - 1.f) * ABS(p_scroll_vec.y) + 1.f)); +void CanvasItemEditor::_zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event) { +	Ref<InputEventMouseButton> mb = p_event; +	if (mb.is_valid()) { +		// Special behvior for scroll events, as the zoom_by_increment method can smartly end up on powers of two. +		int increment = p_zoom_factor > 1.0 ? 1 : -1; +		zoom_widget->set_zoom_by_increments(increment, mb->is_alt_pressed()); +	} else { +		zoom_widget->set_zoom(zoom_widget->get_zoom() * p_zoom_factor);  	} +  	_zoom_on_position(zoom_widget->get_zoom(), p_origin);  } @@ -3868,7 +3836,7 @@ void CanvasItemEditor::_update_editor_settings() {  	context_menu_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("ContextualToolbar"), SNAME("EditorStyles")));  	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"))); -	pan_speed = int(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"));  } @@ -5059,7 +5027,7 @@ CanvasItemEditor::CanvasItemEditor() {  	zoom_widget->connect("zoom_changed", callable_mp(this, &CanvasItemEditor::_update_zoom));  	panner.instantiate(); -	panner->set_callbacks(callable_mp(this, &CanvasItemEditor::_scroll_callback), callable_mp(this, &CanvasItemEditor::_pan_callback), callable_mp(this, &CanvasItemEditor::_zoom_callback)); +	panner->set_callbacks(callable_mp(this, &CanvasItemEditor::_pan_callback), callable_mp(this, &CanvasItemEditor::_zoom_callback));  	viewport = memnew(CanvasItemEditorViewport(this));  	viewport_scrollable->add_child(viewport); diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 1e01eac82d..ebe87a56f7 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -363,10 +363,8 @@ private:  	Ref<ViewPanner> panner;  	bool warped_panning = true; -	int pan_speed = 20; -	void _scroll_callback(Vector2 p_scroll_vec, bool p_alt); -	void _pan_callback(Vector2 p_scroll_vec); -	void _zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt); +	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);  	bool _is_node_locked(const Node *p_node) const;  	bool _is_node_movable(const Node *p_node, bool p_popup_warning = false); diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index c30f0ec62d..fb35668310 100644 --- a/editor/plugins/polygon_2d_editor_plugin.cpp +++ b/editor/plugins/polygon_2d_editor_plugin.cpp @@ -939,21 +939,13 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {  	}  } -void Polygon2DEditor::_uv_scroll_callback(Vector2 p_scroll_vec, bool p_alt) { -	_uv_pan_callback(-p_scroll_vec * 32); -} - -void Polygon2DEditor::_uv_pan_callback(Vector2 p_scroll_vec) { +void Polygon2DEditor::_uv_pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event) {  	uv_hscroll->set_value(uv_hscroll->get_value() - p_scroll_vec.x);  	uv_vscroll->set_value(uv_vscroll->get_value() - p_scroll_vec.y);  } -void Polygon2DEditor::_uv_zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt) { -	if (p_scroll_vec.y < 0) { -		uv_zoom->set_value(uv_zoom->get_value() / (1 - (0.1 * Math::abs(p_scroll_vec.y)))); -	} else { -		uv_zoom->set_value(uv_zoom->get_value() * (1 - (0.1 * Math::abs(p_scroll_vec.y)))); -	} +void Polygon2DEditor::_uv_zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event) { +	uv_zoom->set_value(uv_zoom->get_value() * p_zoom_factor);  }  void Polygon2DEditor::_uv_scroll_changed(real_t) { @@ -1478,7 +1470,7 @@ Polygon2DEditor::Polygon2DEditor() {  	bone_scroll->add_child(bone_scroll_vb);  	uv_panner.instantiate(); -	uv_panner->set_callbacks(callable_mp(this, &Polygon2DEditor::_uv_scroll_callback), callable_mp(this, &Polygon2DEditor::_uv_pan_callback), callable_mp(this, &Polygon2DEditor::_uv_zoom_callback)); +	uv_panner->set_callbacks(callable_mp(this, &Polygon2DEditor::_uv_pan_callback), callable_mp(this, &Polygon2DEditor::_uv_zoom_callback));  	uv_edit_draw->connect("draw", callable_mp(this, &Polygon2DEditor::_uv_draw));  	uv_edit_draw->connect("gui_input", callable_mp(this, &Polygon2DEditor::_uv_input)); diff --git a/editor/plugins/polygon_2d_editor_plugin.h b/editor/plugins/polygon_2d_editor_plugin.h index 7246c08bea..2c55a5f631 100644 --- a/editor/plugins/polygon_2d_editor_plugin.h +++ b/editor/plugins/polygon_2d_editor_plugin.h @@ -90,9 +90,8 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {  	TextureRect *uv_icon_zoom = nullptr;  	Ref<ViewPanner> uv_panner; -	void _uv_scroll_callback(Vector2 p_scroll_vec, bool p_alt); -	void _uv_pan_callback(Vector2 p_scroll_vec); -	void _uv_zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt); +	void _uv_pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event); +	void _uv_zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event);  	VBoxContainer *bone_scroll_main_vb = nullptr;  	ScrollContainer *bone_scroll = nullptr; diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index d7559bc18e..76f2bb7bb5 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -620,22 +620,14 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {  	}  } -void TextureRegionEditor::_scroll_callback(Vector2 p_scroll_vec, bool p_alt) { -	_pan_callback(-p_scroll_vec * 32); -} - -void TextureRegionEditor::_pan_callback(Vector2 p_scroll_vec) { +void TextureRegionEditor::_pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event) {  	p_scroll_vec /= draw_zoom;  	hscroll->set_value(hscroll->get_value() - p_scroll_vec.x);  	vscroll->set_value(vscroll->get_value() - p_scroll_vec.y);  } -void TextureRegionEditor::_zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt) { -	if (p_scroll_vec.y < 0) { -		_zoom_on_position(draw_zoom * ((0.95 + (0.05 * Math::abs(p_scroll_vec.y))) / 0.95), p_origin); -	} else { -		_zoom_on_position(draw_zoom * (1 - (0.05 * Math::abs(p_scroll_vec.y))), p_origin); -	} +void TextureRegionEditor::_zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event) { +	_zoom_on_position(draw_zoom * p_zoom_factor, p_origin);  }  void TextureRegionEditor::_scroll_changed(float) { @@ -1169,7 +1161,7 @@ TextureRegionEditor::TextureRegionEditor() {  	hb_grid->hide();  	panner.instantiate(); -	panner->set_callbacks(callable_mp(this, &TextureRegionEditor::_scroll_callback), callable_mp(this, &TextureRegionEditor::_pan_callback), callable_mp(this, &TextureRegionEditor::_zoom_callback)); +	panner->set_callbacks(callable_mp(this, &TextureRegionEditor::_pan_callback), callable_mp(this, &TextureRegionEditor::_zoom_callback));  	edit_draw = memnew(Panel);  	vb->add_child(edit_draw); diff --git a/editor/plugins/texture_region_editor_plugin.h b/editor/plugins/texture_region_editor_plugin.h index 0325700d25..ba64a04084 100644 --- a/editor/plugins/texture_region_editor_plugin.h +++ b/editor/plugins/texture_region_editor_plugin.h @@ -103,9 +103,8 @@ class TextureRegionEditor : public AcceptDialog {  	bool request_center = false;  	Ref<ViewPanner> panner; -	void _scroll_callback(Vector2 p_scroll_vec, bool p_alt); -	void _pan_callback(Vector2 p_scroll_vec); -	void _zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt); +	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 _set_snap_mode(int p_mode);  	void _set_snap_off_x(float p_val); diff --git a/editor/plugins/tiles/tile_atlas_view.cpp b/editor/plugins/tiles/tile_atlas_view.cpp index 0ac375407c..e430848875 100644 --- a/editor/plugins/tiles/tile_atlas_view.cpp +++ b/editor/plugins/tiles/tile_atlas_view.cpp @@ -47,18 +47,14 @@ void TileAtlasView::gui_input(const Ref<InputEvent> &p_event) {  	}  } -void TileAtlasView::_scroll_callback(Vector2 p_scroll_vec, bool p_alt) { -	_pan_callback(-p_scroll_vec * 32); -} - -void TileAtlasView::_pan_callback(Vector2 p_scroll_vec) { +void TileAtlasView::_pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event) {  	panning += p_scroll_vec;  	_update_zoom_and_panning(true);  	emit_signal(SNAME("transform_changed"), zoom_widget->get_zoom(), panning);  } -void TileAtlasView::_zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt) { -	zoom_widget->set_zoom_by_increments(-p_scroll_vec.y * 2); +void TileAtlasView::_zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event) { +	zoom_widget->set_zoom(zoom_widget->get_zoom() * p_zoom_factor);  	_update_zoom_and_panning(true);  	emit_signal(SNAME("transform_changed"), zoom_widget->get_zoom(), panning);  } @@ -583,7 +579,7 @@ TileAtlasView::TileAtlasView() {  	add_child(button_center_view);  	panner.instantiate(); -	panner->set_callbacks(callable_mp(this, &TileAtlasView::_scroll_callback), callable_mp(this, &TileAtlasView::_pan_callback), callable_mp(this, &TileAtlasView::_zoom_callback)); +	panner->set_callbacks(callable_mp(this, &TileAtlasView::_pan_callback), callable_mp(this, &TileAtlasView::_zoom_callback));  	panner->set_enable_rmb(true);  	center_container = memnew(CenterContainer); diff --git a/editor/plugins/tiles/tile_atlas_view.h b/editor/plugins/tiles/tile_atlas_view.h index f719bee704..4a7547f34b 100644 --- a/editor/plugins/tiles/tile_atlas_view.h +++ b/editor/plugins/tiles/tile_atlas_view.h @@ -65,9 +65,8 @@ private:  	virtual void gui_input(const Ref<InputEvent> &p_event) override;  	Ref<ViewPanner> panner; -	void _scroll_callback(Vector2 p_scroll_vec, bool p_alt); -	void _pan_callback(Vector2 p_scroll_vec); -	void _zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt); +	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);  	HashMap<Vector2, HashMap<int, Rect2i>> alternative_tiles_rect_cache;  	void _update_alternative_tiles_rect_cache(); diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index 6c495ab2c9..af52f6664a 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -1380,34 +1380,15 @@ void GraphEdit::gui_input(const Ref<InputEvent> &p_ev) {  			accept_event();  		}  	} - -	Ref<InputEventMagnifyGesture> magnify_gesture = p_ev; -	if (magnify_gesture.is_valid()) { -		set_zoom_custom(zoom * magnify_gesture->get_factor(), magnify_gesture->get_position()); -	} - -	Ref<InputEventPanGesture> pan_gesture = p_ev; -	if (pan_gesture.is_valid()) { -		h_scroll->set_value(h_scroll->get_value() + h_scroll->get_page() * pan_gesture->get_delta().x / 8); -		v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() * pan_gesture->get_delta().y / 8); -	} -} - -void GraphEdit::_scroll_callback(Vector2 p_scroll_vec, bool p_alt) { -	if (p_scroll_vec.x != 0) { -		h_scroll->set_value(h_scroll->get_value() + (h_scroll->get_page() * Math::abs(p_scroll_vec.x) / 8) * SIGN(p_scroll_vec.x)); -	} else { -		v_scroll->set_value(v_scroll->get_value() + (v_scroll->get_page() * Math::abs(p_scroll_vec.y) / 8) * SIGN(p_scroll_vec.y)); -	}  } -void GraphEdit::_pan_callback(Vector2 p_scroll_vec) { +void GraphEdit::_pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event) {  	h_scroll->set_value(h_scroll->get_value() - p_scroll_vec.x);  	v_scroll->set_value(v_scroll->get_value() - p_scroll_vec.y);  } -void GraphEdit::_zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt) { -	set_zoom_custom(p_scroll_vec.y < 0 ? zoom * zoom_step : zoom / zoom_step, p_origin); +void GraphEdit::_zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event) { +	set_zoom_custom(zoom * p_zoom_factor, p_origin);  }  void GraphEdit::set_connection_activity(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port, float p_activity) { @@ -1502,6 +1483,7 @@ void GraphEdit::set_zoom_step(float p_zoom_step) {  	}  	zoom_step = p_zoom_step; +	panner->set_scroll_zoom_factor(zoom_step);  }  float GraphEdit::get_zoom_step() const { @@ -2421,7 +2403,7 @@ GraphEdit::GraphEdit() {  	zoom_max = (1 * Math::pow(zoom_step, 4));  	panner.instantiate(); -	panner->set_callbacks(callable_mp(this, &GraphEdit::_scroll_callback), callable_mp(this, &GraphEdit::_pan_callback), callable_mp(this, &GraphEdit::_zoom_callback)); +	panner->set_callbacks(callable_mp(this, &GraphEdit::_pan_callback), callable_mp(this, &GraphEdit::_zoom_callback));  	top_layer = memnew(GraphEditFilter(this));  	add_child(top_layer, false, INTERNAL_MODE_BACK); diff --git a/scene/gui/graph_edit.h b/scene/gui/graph_edit.h index 030f40e370..dfe6b94906 100644 --- a/scene/gui/graph_edit.h +++ b/scene/gui/graph_edit.h @@ -129,9 +129,8 @@ private:  	Ref<ViewPanner> panner;  	bool warped_panning = true; -	void _scroll_callback(Vector2 p_scroll_vec, bool p_alt); -	void _pan_callback(Vector2 p_scroll_vec); -	void _zoom_callback(Vector2 p_scroll_vec, Vector2 p_origin, bool p_alt); +	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);  	bool arrange_nodes_button_hidden = false; diff --git a/scene/gui/view_panner.cpp b/scene/gui/view_panner.cpp index e8d54e6937..145497fa61 100644 --- a/scene/gui/view_panner.cpp +++ b/scene/gui/view_panner.cpp @@ -43,36 +43,42 @@ bool ViewPanner::gui_input(const Ref<InputEvent> &p_event, Rect2 p_canvas_rect)  		if (scroll_vec != Vector2() && mb->is_pressed()) {  			if (control_scheme == SCROLL_PANS) {  				if (mb->is_ctrl_pressed()) { -					scroll_vec.y *= mb->get_factor(); -					callback_helper(zoom_callback, varray(scroll_vec, mb->get_position(), mb->is_alt_pressed())); +					// Compute the zoom factor. +					float zoom_factor = mb->get_factor() <= 0 ? 1.0 : mb->get_factor(); +					zoom_factor = ((scroll_zoom_factor - 1.0) * zoom_factor) + 1.0; +					float zoom = (scroll_vec.x + scroll_vec.y) > 0 ? 1.0 / scroll_zoom_factor : scroll_zoom_factor; +					callback_helper(zoom_callback, varray(zoom, mb->get_position(), p_event));  					return true;  				} else { -					Vector2 panning; -					if (mb->is_shift_pressed()) { -						panning.x += mb->get_factor() * scroll_vec.y; -						panning.y += mb->get_factor() * scroll_vec.x; -					} else { -						panning.y += mb->get_factor() * scroll_vec.y; -						panning.x += mb->get_factor() * scroll_vec.x; +					Vector2 panning = scroll_vec * mb->get_factor(); +					if (pan_axis == PAN_AXIS_HORIZONTAL) { +						panning = Vector2(panning.x + panning.y, 0); +					} else if (pan_axis == PAN_AXIS_VERTICAL) { +						panning = Vector2(0, panning.x + panning.y); +					} else if (mb->is_shift_pressed()) { +						panning = Vector2(panning.y, panning.x);  					} -					callback_helper(scroll_callback, varray(panning, mb->is_alt_pressed())); +					callback_helper(pan_callback, varray(-panning * scroll_speed, p_event));  					return true;  				}  			} else {  				if (mb->is_ctrl_pressed()) { -					Vector2 panning; -					if (mb->is_shift_pressed()) { -						panning.x += mb->get_factor() * scroll_vec.y; -						panning.y += mb->get_factor() * scroll_vec.x; -					} else { -						panning.y += mb->get_factor() * scroll_vec.y; -						panning.x += mb->get_factor() * scroll_vec.x; +					Vector2 panning = scroll_vec * mb->get_factor(); +					if (pan_axis == PAN_AXIS_HORIZONTAL) { +						panning = Vector2(panning.x + panning.y, 0); +					} else if (pan_axis == PAN_AXIS_VERTICAL) { +						panning = Vector2(0, panning.x + panning.y); +					} else if (mb->is_shift_pressed()) { +						panning = Vector2(panning.y, panning.x);  					} -					callback_helper(scroll_callback, varray(panning, mb->is_alt_pressed())); +					callback_helper(pan_callback, varray(-panning * scroll_speed, p_event));  					return true;  				} else if (!mb->is_shift_pressed()) { -					scroll_vec.y *= mb->get_factor(); -					callback_helper(zoom_callback, varray(scroll_vec, mb->get_position(), mb->is_alt_pressed())); +					// Compute the zoom factor. +					float zoom_factor = mb->get_factor() <= 0 ? 1.0 : mb->get_factor(); +					zoom_factor = ((scroll_zoom_factor - 1.0) * zoom_factor) + 1.0; +					float zoom = (scroll_vec.x + scroll_vec.y) > 0 ? 1.0 / scroll_zoom_factor : scroll_zoom_factor; +					callback_helper(zoom_callback, varray(zoom, mb->get_position(), p_event));  					return true;  				}  			} @@ -102,14 +108,31 @@ bool ViewPanner::gui_input(const Ref<InputEvent> &p_event, Rect2 p_canvas_rect)  	if (mm.is_valid()) {  		if (is_dragging) {  			if (p_canvas_rect != Rect2()) { -				callback_helper(pan_callback, varray(Input::get_singleton()->warp_mouse_motion(mm, p_canvas_rect))); +				callback_helper(pan_callback, varray(Input::get_singleton()->warp_mouse_motion(mm, p_canvas_rect), p_event));  			} else { -				callback_helper(pan_callback, varray(mm->get_relative())); +				callback_helper(pan_callback, varray(mm->get_relative(), p_event));  			}  			return true;  		}  	} +	Ref<InputEventMagnifyGesture> magnify_gesture = p_event; +	if (magnify_gesture.is_valid()) { +		// Zoom gesture +		callback_helper(zoom_callback, varray(magnify_gesture->get_factor(), magnify_gesture->get_position(), p_event)); +		return true; +	} + +	Ref<InputEventPanGesture> pan_gesture = p_event; +	if (pan_gesture.is_valid()) { +		callback_helper(pan_callback, varray(-pan_gesture->get_delta(), p_event)); +	} + +	Ref<InputEventScreenDrag> screen_drag = p_event; +	if (screen_drag.is_valid()) { +		callback_helper(pan_callback, varray(screen_drag->get_relative(), p_event)); +	} +  	Ref<InputEventKey> k = p_event;  	if (k.is_valid()) {  		if (pan_view_shortcut.is_valid() && pan_view_shortcut->matches_event(k)) { @@ -140,8 +163,7 @@ void ViewPanner::callback_helper(Callable p_callback, Vector<Variant> p_args) {  	p_callback.callp(argptr, p_args.size(), result, ce);  } -void ViewPanner::set_callbacks(Callable p_scroll_callback, Callable p_pan_callback, Callable p_zoom_callback) { -	scroll_callback = p_scroll_callback; +void ViewPanner::set_callbacks(Callable p_pan_callback, Callable p_zoom_callback) {  	pan_callback = p_pan_callback;  	zoom_callback = p_zoom_callback;  } @@ -163,6 +185,20 @@ void ViewPanner::set_simple_panning_enabled(bool p_enabled) {  	simple_panning_enabled = p_enabled;  } +void ViewPanner::set_scroll_speed(int p_scroll_speed) { +	ERR_FAIL_COND(p_scroll_speed <= 0); +	scroll_speed = p_scroll_speed; +} + +void ViewPanner::set_scroll_zoom_factor(float p_scroll_zoom_factor) { +	ERR_FAIL_COND(p_scroll_zoom_factor <= 1.0); +	scroll_zoom_factor = p_scroll_zoom_factor; +} + +void ViewPanner::set_pan_axis(PanAxis p_pan_axis) { +	pan_axis = p_pan_axis; +} +  void ViewPanner::setup(ControlScheme p_scheme, Ref<Shortcut> p_shortcut, bool p_simple_panning) {  	set_control_scheme(p_scheme);  	set_pan_shortcut(p_shortcut); diff --git a/scene/gui/view_panner.h b/scene/gui/view_panner.h index 861574a80c..60d36ca04c 100644 --- a/scene/gui/view_panner.h +++ b/scene/gui/view_panner.h @@ -45,7 +45,17 @@ public:  		SCROLL_PANS,  	}; +	enum PanAxis { +		PAN_AXIS_BOTH, +		PAN_AXIS_HORIZONTAL, +		PAN_AXIS_VERTICAL, +	}; +  private: +	int scroll_speed = 32; +	float scroll_zoom_factor = 1.1; +	PanAxis pan_axis = PAN_AXIS_BOTH; +  	bool is_dragging = false;  	bool pan_key_pressed = false;  	bool force_drag = false; @@ -55,7 +65,6 @@ private:  	Ref<Shortcut> pan_view_shortcut; -	Callable scroll_callback;  	Callable pan_callback;  	Callable zoom_callback; @@ -63,11 +72,14 @@ private:  	ControlScheme control_scheme = SCROLL_ZOOMS;  public: -	void set_callbacks(Callable p_scroll_callback, Callable p_pan_callback, Callable p_zoom_callback); +	void set_callbacks(Callable p_pan_callback, Callable p_zoom_callback);  	void set_control_scheme(ControlScheme p_scheme);  	void set_enable_rmb(bool p_enable);  	void set_pan_shortcut(Ref<Shortcut> p_shortcut);  	void set_simple_panning_enabled(bool p_enabled); +	void set_scroll_speed(int p_scroll_speed); +	void set_scroll_zoom_factor(float p_scroll_zoom_factor); +	void set_pan_axis(PanAxis p_pan_axis);  	void setup(ControlScheme p_scheme, Ref<Shortcut> p_shortcut, bool p_simple_panning); |