Skip to content

Commit 39f73bb

Browse files
committed
Merge pull request #101369 from ryevdokimov/cancel-viewport-rotation-gizmo
Add ability to cancel rotation from viewport rotation gizmo
2 parents 4caae29 + a8f3c97 commit 39f73bb

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

editor/plugins/node_3d_editor_plugin.cpp

+32-5
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ void ViewportRotationControl::_process_click(int p_index, Vector2 p_position, bo
419419
orbiting_index = p_index;
420420
}
421421
} else {
422-
if (focused_axis > -1) {
422+
if (focused_axis > -1 && gizmo_activated) {
423423
viewport->_menu_option(axis_menu_options[focused_axis]);
424424
_update_focus();
425425
}
@@ -432,10 +432,11 @@ void ViewportRotationControl::_process_click(int p_index, Vector2 p_position, bo
432432
}
433433

434434
void ViewportRotationControl::_process_drag(Ref<InputEventWithModifiers> p_event, int p_index, Vector2 p_position, Vector2 p_relative_position) {
435-
if (orbiting_index == p_index) {
435+
if (orbiting_index == p_index && gizmo_activated) {
436436
if (Input::get_singleton()->get_mouse_mode() == Input::MOUSE_MODE_VISIBLE) {
437437
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED);
438438
orbiting_mouse_start = p_position;
439+
viewport->previous_cursor = viewport->cursor;
439440
}
440441
viewport->_nav_orbit(p_event, p_relative_position);
441442
focused_axis = -1;
@@ -447,10 +448,35 @@ void ViewportRotationControl::_process_drag(Ref<InputEventWithModifiers> p_event
447448
void ViewportRotationControl::gui_input(const Ref<InputEvent> &p_event) {
448449
ERR_FAIL_COND(p_event.is_null());
449450

451+
// Key events
452+
const Ref<InputEventKey> k = p_event;
453+
454+
if (k.is_valid() && k->is_action_pressed(SNAME("ui_cancel"), false, true)) {
455+
if (Input::get_singleton()->get_mouse_mode() == Input::MOUSE_MODE_CAPTURED) {
456+
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
457+
Input::get_singleton()->warp_mouse(orbiting_mouse_start);
458+
viewport->cursor = viewport->previous_cursor;
459+
gizmo_activated = false;
460+
}
461+
}
462+
450463
// Mouse events
451464
const Ref<InputEventMouseButton> mb = p_event;
452-
if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT) {
453-
_process_click(100, mb->get_position(), mb->is_pressed());
465+
if (mb.is_valid()) {
466+
if (mb->get_button_index() == MouseButton::LEFT) {
467+
_process_click(100, mb->get_position(), mb->is_pressed());
468+
if (mb->is_pressed()) {
469+
gizmo_activated = true;
470+
grab_focus();
471+
}
472+
} else if (mb->get_button_index() == MouseButton::RIGHT) {
473+
if (Input::get_singleton()->get_mouse_mode() == Input::MOUSE_MODE_CAPTURED) {
474+
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
475+
Input::get_singleton()->warp_mouse(orbiting_mouse_start);
476+
viewport->cursor = viewport->previous_cursor;
477+
gizmo_activated = false;
478+
}
479+
}
454480
}
455481

456482
const Ref<InputEventMouseMotion> mm = p_event;
@@ -3325,7 +3351,7 @@ void Node3DEditorViewport::_draw() {
33253351
force_over_plugin_list->forward_3d_force_draw_over_viewport(surface);
33263352
}
33273353

3328-
if (surface->has_focus()) {
3354+
if (surface->has_focus() || rotation_control->has_focus()) {
33293355
Size2 size = surface->get_size();
33303356
Rect2 r = Rect2(Point2(), size);
33313357
get_theme_stylebox(SNAME("FocusViewport"), EditorStringName(EditorStyles))->draw(surface->get_canvas_item(), r);
@@ -5778,6 +5804,7 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, int p
57785804
rotation_control->set_custom_minimum_size(Size2(80, 80) * EDSCALE);
57795805
rotation_control->set_h_size_flags(SIZE_SHRINK_END);
57805806
rotation_control->set_viewport(this);
5807+
rotation_control->set_focus_mode(FOCUS_CLICK);
57815808
top_right_vbox->add_child(rotation_control);
57825809

57835810
frame_time_panel = memnew(PanelContainer);

editor/plugins/node_3d_editor_plugin.h

+2
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ class ViewportRotationControl : public Control {
8585
Vector2i orbiting_mouse_start;
8686
int orbiting_index = -1;
8787
int focused_axis = -2;
88+
bool gizmo_activated = false;
8889

8990
const float AXIS_CIRCLE_RADIUS = 8.0f * EDSCALE;
9091

@@ -413,6 +414,7 @@ class Node3DEditorViewport : public Control {
413414
// so one cursor is the real cursor, while the other can be an interpolated version.
414415
Cursor cursor; // Immediate cursor
415416
Cursor camera_cursor; // That one may be interpolated (don't modify this one except for smoothing purposes)
417+
Cursor previous_cursor; // Storing previous cursor state for canceling purposes
416418

417419
void scale_fov(real_t p_fov_offset);
418420
void reset_fov();

0 commit comments

Comments
 (0)