Skip to content

Commit 1962e7d

Browse files
committed
Merge pull request #112249 from YeldhamDev/drag_stuck_fix
Fix canvas editor getting stuck on drag operations
2 parents 9785a66 + 7a42a4e commit 1962e7d

File tree

1 file changed

+140
-142
lines changed

1 file changed

+140
-142
lines changed

editor/scene/canvas_item_editor_plugin.cpp

Lines changed: 140 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -2736,175 +2736,173 @@ void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) {
27362736
}
27372737

27382738
void CanvasItemEditor::_commit_drag() {
2739-
if (drag_selection.is_empty()) {
2740-
return;
2741-
}
2742-
2743-
switch (drag_type) {
2744-
// Confirm the pivot move.
2745-
case DRAG_PIVOT: {
2746-
_commit_canvas_item_state(
2747-
drag_selection,
2748-
vformat(
2749-
TTR("Set CanvasItem \"%s\" Pivot Offset to (%d, %d)"),
2750-
drag_selection.front()->get()->get_name(),
2751-
drag_selection.front()->get()->_edit_get_pivot().x,
2752-
drag_selection.front()->get()->_edit_get_pivot().y));
2753-
} break;
2754-
2755-
// Confirm the node rotation.
2756-
case DRAG_ROTATE: {
2757-
if (drag_selection.size() != 1) {
2758-
_commit_canvas_item_state(
2759-
drag_selection,
2760-
vformat(TTR("Rotate %d CanvasItems"), drag_selection.size()),
2761-
true);
2762-
} else {
2739+
if (!drag_selection.is_empty()) {
2740+
switch (drag_type) {
2741+
// Confirm the pivot move.
2742+
case DRAG_PIVOT: {
27632743
_commit_canvas_item_state(
27642744
drag_selection,
2765-
vformat(TTR("Rotate CanvasItem \"%s\" to %d degrees"),
2745+
vformat(
2746+
TTR("Set CanvasItem \"%s\" Pivot Offset to (%d, %d)"),
27662747
drag_selection.front()->get()->get_name(),
2767-
Math::rad_to_deg(drag_selection.front()->get()->_edit_get_rotation())),
2768-
true);
2769-
}
2748+
drag_selection.front()->get()->_edit_get_pivot().x,
2749+
drag_selection.front()->get()->_edit_get_pivot().y));
2750+
} break;
27702751

2771-
if (key_auto_insert_button->is_pressed()) {
2772-
_insert_animation_keys(false, true, false, true);
2773-
}
2774-
} break;
2752+
// Confirm the node rotation.
2753+
case DRAG_ROTATE: {
2754+
if (drag_selection.size() != 1) {
2755+
_commit_canvas_item_state(
2756+
drag_selection,
2757+
vformat(TTR("Rotate %d CanvasItems"), drag_selection.size()),
2758+
true);
2759+
} else {
2760+
_commit_canvas_item_state(
2761+
drag_selection,
2762+
vformat(TTR("Rotate CanvasItem \"%s\" to %d degrees"),
2763+
drag_selection.front()->get()->get_name(),
2764+
Math::rad_to_deg(drag_selection.front()->get()->_edit_get_rotation())),
2765+
true);
2766+
}
27752767

2776-
// Confirm new anchor position.
2777-
case DRAG_ANCHOR_TOP_LEFT:
2778-
case DRAG_ANCHOR_TOP_RIGHT:
2779-
case DRAG_ANCHOR_BOTTOM_RIGHT:
2780-
case DRAG_ANCHOR_BOTTOM_LEFT:
2781-
case DRAG_ANCHOR_ALL: {
2782-
_commit_canvas_item_state(
2783-
drag_selection,
2784-
vformat(TTR("Move CanvasItem \"%s\" Anchor"), drag_selection.front()->get()->get_name()));
2785-
snap_target[0] = SNAP_TARGET_NONE;
2786-
snap_target[1] = SNAP_TARGET_NONE;
2787-
} break;
2768+
if (key_auto_insert_button->is_pressed()) {
2769+
_insert_animation_keys(false, true, false, true);
2770+
}
2771+
} break;
27882772

2789-
// Confirm resize.
2790-
case DRAG_LEFT:
2791-
case DRAG_RIGHT:
2792-
case DRAG_TOP:
2793-
case DRAG_BOTTOM:
2794-
case DRAG_TOP_LEFT:
2795-
case DRAG_TOP_RIGHT:
2796-
case DRAG_BOTTOM_LEFT:
2797-
case DRAG_BOTTOM_RIGHT: {
2798-
const Node2D *node2d = Object::cast_to<Node2D>(drag_selection.front()->get());
2799-
if (node2d) {
2800-
// Extends from Node2D.
2801-
// Node2D doesn't have an actual stored rect size, unlike Controls.
2802-
_commit_canvas_item_state(
2803-
drag_selection,
2804-
vformat(
2805-
TTR("Scale Node2D \"%s\" to (%s, %s)"),
2806-
drag_selection.front()->get()->get_name(),
2807-
Math::snapped(drag_selection.front()->get()->_edit_get_scale().x, 0.01),
2808-
Math::snapped(drag_selection.front()->get()->_edit_get_scale().y, 0.01)),
2809-
true);
2810-
} else {
2811-
// Extends from Control.
2773+
// Confirm new anchor position.
2774+
case DRAG_ANCHOR_TOP_LEFT:
2775+
case DRAG_ANCHOR_TOP_RIGHT:
2776+
case DRAG_ANCHOR_BOTTOM_RIGHT:
2777+
case DRAG_ANCHOR_BOTTOM_LEFT:
2778+
case DRAG_ANCHOR_ALL: {
28122779
_commit_canvas_item_state(
28132780
drag_selection,
2814-
vformat(
2815-
TTR("Resize Control \"%s\" to (%d, %d)"),
2816-
drag_selection.front()->get()->get_name(),
2817-
drag_selection.front()->get()->_edit_get_rect().size.x,
2818-
drag_selection.front()->get()->_edit_get_rect().size.y),
2819-
true);
2820-
}
2781+
vformat(TTR("Move CanvasItem \"%s\" Anchor"), drag_selection.front()->get()->get_name()));
2782+
snap_target[0] = SNAP_TARGET_NONE;
2783+
snap_target[1] = SNAP_TARGET_NONE;
2784+
} break;
28212785

2822-
if (key_auto_insert_button->is_pressed()) {
2823-
_insert_animation_keys(false, false, true, true);
2824-
}
2786+
// Confirm resize.
2787+
case DRAG_LEFT:
2788+
case DRAG_RIGHT:
2789+
case DRAG_TOP:
2790+
case DRAG_BOTTOM:
2791+
case DRAG_TOP_LEFT:
2792+
case DRAG_TOP_RIGHT:
2793+
case DRAG_BOTTOM_LEFT:
2794+
case DRAG_BOTTOM_RIGHT: {
2795+
const Node2D *node2d = Object::cast_to<Node2D>(drag_selection.front()->get());
2796+
if (node2d) {
2797+
// Extends from Node2D.
2798+
// Node2D doesn't have an actual stored rect size, unlike Controls.
2799+
_commit_canvas_item_state(
2800+
drag_selection,
2801+
vformat(
2802+
TTR("Scale Node2D \"%s\" to (%s, %s)"),
2803+
drag_selection.front()->get()->get_name(),
2804+
Math::snapped(drag_selection.front()->get()->_edit_get_scale().x, 0.01),
2805+
Math::snapped(drag_selection.front()->get()->_edit_get_scale().y, 0.01)),
2806+
true);
2807+
} else {
2808+
// Extends from Control.
2809+
_commit_canvas_item_state(
2810+
drag_selection,
2811+
vformat(
2812+
TTR("Resize Control \"%s\" to (%d, %d)"),
2813+
drag_selection.front()->get()->get_name(),
2814+
drag_selection.front()->get()->_edit_get_rect().size.x,
2815+
drag_selection.front()->get()->_edit_get_rect().size.y),
2816+
true);
2817+
}
28252818

2826-
snap_target[0] = SNAP_TARGET_NONE;
2827-
snap_target[1] = SNAP_TARGET_NONE;
2828-
} break;
2819+
if (key_auto_insert_button->is_pressed()) {
2820+
_insert_animation_keys(false, false, true, true);
2821+
}
28292822

2830-
// Confirm resize.
2831-
case DRAG_SCALE_BOTH:
2832-
case DRAG_SCALE_X:
2833-
case DRAG_SCALE_Y: {
2834-
if (drag_selection.size() != 1) {
2835-
_commit_canvas_item_state(
2836-
drag_selection,
2837-
vformat(TTR("Scale %d CanvasItems"), drag_selection.size()),
2838-
true);
2839-
} else {
2840-
_commit_canvas_item_state(
2841-
drag_selection,
2842-
vformat(TTR("Scale CanvasItem \"%s\" to (%s, %s)"),
2843-
drag_selection.front()->get()->get_name(),
2844-
Math::snapped(drag_selection.front()->get()->_edit_get_scale().x, 0.01),
2845-
Math::snapped(drag_selection.front()->get()->_edit_get_scale().y, 0.01)),
2846-
true);
2847-
}
2848-
if (key_auto_insert_button->is_pressed()) {
2849-
_insert_animation_keys(false, false, true, true);
2850-
}
2851-
} break;
2823+
snap_target[0] = SNAP_TARGET_NONE;
2824+
snap_target[1] = SNAP_TARGET_NONE;
2825+
} break;
28522826

2853-
// Confirm the canvas items move.
2854-
case DRAG_MOVE:
2855-
case DRAG_MOVE_X:
2856-
case DRAG_MOVE_Y: {
2857-
if (transform.affine_inverse().xform(get_viewport()->get_mouse_position()) != drag_from) {
2827+
// Confirm resize.
2828+
case DRAG_SCALE_BOTH:
2829+
case DRAG_SCALE_X:
2830+
case DRAG_SCALE_Y: {
28582831
if (drag_selection.size() != 1) {
28592832
_commit_canvas_item_state(
28602833
drag_selection,
2861-
vformat(TTR("Move %d CanvasItems"), drag_selection.size()),
2834+
vformat(TTR("Scale %d CanvasItems"), drag_selection.size()),
28622835
true);
28632836
} else {
28642837
_commit_canvas_item_state(
28652838
drag_selection,
2866-
vformat(
2867-
TTR("Move CanvasItem \"%s\" to (%d, %d)"),
2839+
vformat(TTR("Scale CanvasItem \"%s\" to (%s, %s)"),
28682840
drag_selection.front()->get()->get_name(),
2869-
drag_selection.front()->get()->_edit_get_position().x,
2870-
drag_selection.front()->get()->_edit_get_position().y),
2841+
Math::snapped(drag_selection.front()->get()->_edit_get_scale().x, 0.01),
2842+
Math::snapped(drag_selection.front()->get()->_edit_get_scale().y, 0.01)),
28712843
true);
28722844
}
2873-
}
2845+
if (key_auto_insert_button->is_pressed()) {
2846+
_insert_animation_keys(false, false, true, true);
2847+
}
2848+
} break;
28742849

2875-
if (key_auto_insert_button->is_pressed()) {
2876-
_insert_animation_keys(true, false, false, true);
2877-
}
2850+
// Confirm the canvas items move.
2851+
case DRAG_MOVE:
2852+
case DRAG_MOVE_X:
2853+
case DRAG_MOVE_Y: {
2854+
if (transform.affine_inverse().xform(get_viewport()->get_mouse_position()) != drag_from) {
2855+
if (drag_selection.size() != 1) {
2856+
_commit_canvas_item_state(
2857+
drag_selection,
2858+
vformat(TTR("Move %d CanvasItems"), drag_selection.size()),
2859+
true);
2860+
} else {
2861+
_commit_canvas_item_state(
2862+
drag_selection,
2863+
vformat(
2864+
TTR("Move CanvasItem \"%s\" to (%d, %d)"),
2865+
drag_selection.front()->get()->get_name(),
2866+
drag_selection.front()->get()->_edit_get_position().x,
2867+
drag_selection.front()->get()->_edit_get_position().y),
2868+
true);
2869+
}
2870+
}
28782871

2879-
// Make sure smart snapping lines disappear.
2880-
snap_target[0] = SNAP_TARGET_NONE;
2881-
snap_target[1] = SNAP_TARGET_NONE;
2882-
} break;
2872+
if (key_auto_insert_button->is_pressed()) {
2873+
_insert_animation_keys(true, false, false, true);
2874+
}
28832875

2884-
// Confirm the canvas items move by arrow keys.
2885-
case DRAG_KEY_MOVE: {
2886-
if (tool != TOOL_SELECT && tool != TOOL_MOVE) {
2887-
return;
2888-
}
2876+
// Make sure smart snapping lines disappear.
2877+
snap_target[0] = SNAP_TARGET_NONE;
2878+
snap_target[1] = SNAP_TARGET_NONE;
2879+
} break;
28892880

2890-
if (drag_selection.size() > 1) {
2891-
_commit_canvas_item_state(
2892-
drag_selection,
2893-
vformat(TTR("Move %d CanvasItems"), drag_selection.size()),
2894-
true);
2895-
} else if (drag_selection.size() == 1) {
2896-
_commit_canvas_item_state(
2897-
drag_selection,
2898-
vformat(TTR("Move CanvasItem \"%s\" to (%d, %d)"),
2899-
drag_selection.front()->get()->get_name(),
2900-
drag_selection.front()->get()->_edit_get_position().x,
2901-
drag_selection.front()->get()->_edit_get_position().y),
2902-
true);
2903-
}
2904-
} break;
2881+
// Confirm the canvas items move by arrow keys.
2882+
case DRAG_KEY_MOVE: {
2883+
if (tool != TOOL_SELECT && tool != TOOL_MOVE) {
2884+
return;
2885+
}
29052886

2906-
default:
2907-
break;
2887+
if (drag_selection.size() > 1) {
2888+
_commit_canvas_item_state(
2889+
drag_selection,
2890+
vformat(TTR("Move %d CanvasItems"), drag_selection.size()),
2891+
true);
2892+
} else if (drag_selection.size() == 1) {
2893+
_commit_canvas_item_state(
2894+
drag_selection,
2895+
vformat(TTR("Move CanvasItem \"%s\" to (%d, %d)"),
2896+
drag_selection.front()->get()->get_name(),
2897+
drag_selection.front()->get()->_edit_get_position().x,
2898+
drag_selection.front()->get()->_edit_get_position().y),
2899+
true);
2900+
}
2901+
} break;
2902+
2903+
default:
2904+
break;
2905+
}
29082906
}
29092907

29102908
_reset_drag();

0 commit comments

Comments
 (0)