diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index d45f1d7a780..7b4c85e0f58 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -4425,7 +4425,7 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD } } - float time = timeline->get_play_position(); + float time = p_id.time == FLT_MAX ? timeline->get_play_position() : p_id.time; Variant value; switch (p_id.type) { @@ -4433,7 +4433,9 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD case Animation::TYPE_ROTATION_3D: case Animation::TYPE_SCALE_3D: case Animation::TYPE_BLEND_SHAPE: - case Animation::TYPE_VALUE: { + case Animation::TYPE_VALUE: + case Animation::TYPE_AUDIO: + case Animation::TYPE_ANIMATION: { value = p_id.value; } break; @@ -4449,10 +4451,9 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD bezier_edit_icon->set_disabled(false); } break; - case Animation::TYPE_ANIMATION: { - value = p_id.value; - } break; default: { + // Other track types shouldn't use this code path. + DEV_ASSERT(false); } } @@ -5185,87 +5186,68 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) { p_ofs += SECOND_DECIMAL; } - EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + Node *node = root->get_node_or_null(animation->track_get_path(p_track)); + if (!node) { + EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a key.")); + return; + } + + // Special handling for this one. + if (animation->track_get_type(p_track) == Animation::TYPE_METHOD) { + method_selector->select_method_from_instance(node); + + insert_key_from_track_call_ofs = p_ofs; + insert_key_from_track_call_track = p_track; + return; + } + + InsertData id; + id.path = animation->track_get_path(p_track); + id.advance = false; + id.track_idx = p_track; + id.type = animation->track_get_type(p_track); + // TRANSLATORS: This describes the target of new animation track, will be inserted into another string. + id.query = vformat(TTR("node '%s'"), node->get_name()); + id.time = p_ofs; + // id.value is filled in each case handled below. + switch (animation->track_get_type(p_track)) { case Animation::TYPE_POSITION_3D: { - if (!root->has_node(animation->track_get_path(p_track))) { - EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a key.")); - return; - } - Node3D *base = Object::cast_to(root->get_node(animation->track_get_path(p_track))); + Node3D *base = Object::cast_to(node); if (!base) { EditorNode::get_singleton()->show_warning(TTR("Track is not of type Node3D, can't insert key")); return; } - Vector3 pos = base->get_position(); - - undo_redo->create_action(TTR("Add Position Key")); - undo_redo->add_do_method(animation.ptr(), "position_track_insert_key", p_track, p_ofs, pos); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); - + id.value = base->get_position(); } break; case Animation::TYPE_ROTATION_3D: { - if (!root->has_node(animation->track_get_path(p_track))) { - EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a key.")); - return; - } - Node3D *base = Object::cast_to(root->get_node(animation->track_get_path(p_track))); + Node3D *base = Object::cast_to(node); if (!base) { EditorNode::get_singleton()->show_warning(TTR("Track is not of type Node3D, can't insert key")); return; } - Quaternion rot = base->get_transform().basis.operator Quaternion(); - - undo_redo->create_action(TTR("Add Rotation Key")); - undo_redo->add_do_method(animation.ptr(), "rotation_track_insert_key", p_track, p_ofs, rot); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); - + id.value = base->get_transform().basis.operator Quaternion(); } break; case Animation::TYPE_SCALE_3D: { - if (!root->has_node(animation->track_get_path(p_track))) { - EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a key.")); - return; - } - Node3D *base = Object::cast_to(root->get_node(animation->track_get_path(p_track))); + Node3D *base = Object::cast_to(node); if (!base) { EditorNode::get_singleton()->show_warning(TTR("Track is not of type Node3D, can't insert key")); return; } - undo_redo->create_action(TTR("Add Scale Key")); - undo_redo->add_do_method(animation.ptr(), "scale_track_insert_key", p_track, p_ofs, base->get_scale()); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); - + id.value = base->get_scale(); } break; case Animation::TYPE_BLEND_SHAPE: case Animation::TYPE_VALUE: { NodePath bp; - Variant value; - _find_hint_for_track(p_track, bp, &value); - - undo_redo->create_action(TTR("Add Track Key")); - undo_redo->add_do_method(animation.ptr(), "track_insert_key", p_track, p_ofs, value); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); - + _find_hint_for_track(p_track, bp, &id.value); } break; case Animation::TYPE_METHOD: { - if (!root->has_node(animation->track_get_path(p_track))) { - EditorNode::get_singleton()->show_warning(TTR("Track path is invalid, so can't add a method key.")); - return; - } Node *base = root->get_node_or_null(animation->track_get_path(p_track)); ERR_FAIL_NULL(base); @@ -5287,12 +5269,7 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) { arr[3] = 0.25; arr[4] = 0; - undo_redo->create_action(TTR("Add Track Key")); - undo_redo->add_do_method(animation.ptr(), "track_insert_key", p_track, p_ofs, arr); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); - + id.value = arr; } break; case Animation::TYPE_AUDIO: { Dictionary ak; @@ -5300,22 +5277,18 @@ void AnimationTrackEditor::_insert_key_from_track(float p_ofs, int p_track) { ak["start_offset"] = 0; ak["end_offset"] = 0; - undo_redo->create_action(TTR("Add Track Key")); - undo_redo->add_do_method(animation.ptr(), "track_insert_key", p_track, p_ofs, ak); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); + id.value = ak; } break; case Animation::TYPE_ANIMATION: { - StringName anim = "[stop]"; - - undo_redo->create_action(TTR("Add Track Key")); - undo_redo->add_do_method(animation.ptr(), "track_insert_key", p_track, p_ofs, anim); - undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation); - undo_redo->add_undo_method(animation.ptr(), "track_remove_key_at_time", p_track, p_ofs); - undo_redo->commit_action(); + id.value = StringName("[stop]"); } break; + default: { + // All track types should be handled by now. + DEV_ASSERT(false); + } } + + _query_insert(id); } void AnimationTrackEditor::_add_method_key(const String &p_method) { diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index 1498a948f52..4c7c1a58f83 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -464,6 +464,7 @@ class AnimationTrackEditor : public VBoxContainer { Animation::TrackType type; NodePath path; int track_idx = 0; + float time = FLT_MAX; // Defaults to current timeline position. Variant value; String query; bool advance = false;