@@ -3244,50 +3244,12 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
32443244 // Can do something with menu too! show insert key.
32453245 float offset = (pos.x - timeline->get_name_limit ()) / timeline->get_zoom_scale ();
32463246 if (!read_only) {
3247- if (!menu) {
3248- menu = memnew (PopupMenu);
3249- add_child (menu);
3250- menu->connect (SceneStringName (id_pressed), callable_mp (this , &AnimationTrackEdit::_menu_selected));
3251- }
3252-
3253- bool selected = _try_select_at_ui_pos (pos, mb->is_command_or_control_pressed () || mb->is_shift_pressed (), false );
3254-
3255- menu->clear ();
3256- if (animation->track_get_type (track) == Animation::TYPE_METHOD) {
3257- if (hovering_key_idx != -1 ) {
3258- lookup_key_idx = hovering_key_idx;
3259- menu->add_icon_item (get_editor_theme_icon (SNAME (" Help" )), vformat (" %s (%s)" , TTR (" Go to Definition" ), animation->method_track_get_name (track, lookup_key_idx)), MENU_KEY_LOOKUP);
3260- menu->add_separator ();
3261- }
3262- }
3263- menu->add_icon_item (get_editor_theme_icon (SNAME (" Key" )), TTR (" Insert Key..." ), MENU_KEY_INSERT);
3264- if (selected || editor->is_selection_active ()) {
3265- menu->add_separator ();
3266- menu->add_icon_item (get_editor_theme_icon (SNAME (" Duplicate" )), TTR (" Duplicate Key(s)" ), MENU_KEY_DUPLICATE);
3267- menu->add_icon_item (get_editor_theme_icon (SNAME (" ActionCut" )), TTR (" Cut Key(s)" ), MENU_KEY_CUT);
3268- menu->add_icon_item (get_editor_theme_icon (SNAME (" ActionCopy" )), TTR (" Copy Key(s)" ), MENU_KEY_COPY);
3269- }
3270- if (editor->is_key_clipboard_active ()) {
3271- menu->add_icon_item (get_editor_theme_icon (SNAME (" ActionPaste" )), TTR (" Paste Key(s)" ), MENU_KEY_PASTE);
3272- }
3273- if (selected || editor->is_selection_active ()) {
3274- AnimationPlayerEditor *ape = AnimationPlayerEditor::get_singleton ();
3275- if (ape) {
3276- AnimationPlayer *ap = ape->get_player ();
3277- if (ap && editor->can_add_reset_key () && animation != ap->get_animation (SceneStringName (RESET))) {
3278- menu->add_separator ();
3279- menu->add_icon_item (get_editor_theme_icon (SNAME (" MoveUp" )), TTR (" Send Key(s) to RESET" ), MENU_KEY_ADD_RESET);
3280- }
3281- }
3282- menu->add_separator ();
3283- menu->add_icon_item (get_editor_theme_icon (SNAME (" Remove" )), TTR (" Delete Key(s)" ), MENU_KEY_DELETE);
3284- }
3285- menu->reset_size ();
3286-
3287- menu->set_position (get_screen_position () + get_local_mouse_position ());
3288- menu->popup ();
3247+ _try_select_at_ui_pos (pos, mb->is_command_or_control_pressed () || mb->is_shift_pressed (), false );
32893248
32903249 insert_at_pos = offset + timeline->get_value ();
3250+ Vector2 popup_pos = get_screen_position () + get_local_mouse_position ();
3251+ // Use call_deferred to wait for the selected keys being updated.
3252+ callable_mp (this , &AnimationTrackEdit::_popup_key_context_menu).call_deferred (hovering_key_idx, popup_pos);
32913253 accept_event ();
32923254 }
32933255 }
@@ -3614,6 +3576,49 @@ void AnimationTrackEdit::drop_data(const Point2 &p_point, const Variant &p_data)
36143576 }
36153577}
36163578
3579+ void AnimationTrackEdit::_popup_key_context_menu (int p_hovering_key_idx, Vector2 p_popup_pos) {
3580+ if (!menu) {
3581+ menu = memnew (PopupMenu);
3582+ add_child (menu);
3583+ menu->connect (SceneStringName (id_pressed), callable_mp (this , &AnimationTrackEdit::_menu_selected));
3584+ }
3585+
3586+ menu->clear ();
3587+ if (animation->track_get_type (track) == Animation::TYPE_METHOD) {
3588+ if (p_hovering_key_idx != -1 ) {
3589+ lookup_key_idx = p_hovering_key_idx;
3590+ menu->add_icon_item (get_editor_theme_icon (SNAME (" Help" )), vformat (" %s (%s)" , TTR (" Go to Definition" ), animation->method_track_get_name (track, lookup_key_idx)), MENU_KEY_LOOKUP);
3591+ menu->add_separator ();
3592+ }
3593+ }
3594+ menu->add_icon_item (get_editor_theme_icon (SNAME (" Key" )), TTR (" Insert Key..." ), MENU_KEY_INSERT);
3595+ if (editor->is_selection_active ()) {
3596+ menu->add_separator ();
3597+ menu->add_icon_item (get_editor_theme_icon (SNAME (" Duplicate" )), TTR (" Duplicate Key(s)" ), MENU_KEY_DUPLICATE);
3598+ menu->add_icon_item (get_editor_theme_icon (SNAME (" ActionCut" )), TTR (" Cut Key(s)" ), MENU_KEY_CUT);
3599+ menu->add_icon_item (get_editor_theme_icon (SNAME (" ActionCopy" )), TTR (" Copy Key(s)" ), MENU_KEY_COPY);
3600+ }
3601+ if (editor->is_key_clipboard_active ()) {
3602+ menu->add_icon_item (get_editor_theme_icon (SNAME (" ActionPaste" )), TTR (" Paste Key(s)" ), MENU_KEY_PASTE);
3603+ }
3604+ if (editor->is_selection_active ()) {
3605+ AnimationPlayerEditor *ape = AnimationPlayerEditor::get_singleton ();
3606+ if (ape) {
3607+ AnimationPlayer *ap = ape->get_player ();
3608+ if (ap && editor->can_add_reset_key () && animation != ap->get_animation (SceneStringName (RESET))) {
3609+ menu->add_separator ();
3610+ menu->add_icon_item (get_editor_theme_icon (SNAME (" MoveUp" )), TTR (" Send Key(s) to RESET" ), MENU_KEY_ADD_RESET);
3611+ }
3612+ }
3613+ menu->add_separator ();
3614+ menu->add_icon_item (get_editor_theme_icon (SNAME (" Remove" )), TTR (" Delete Key(s)" ), MENU_KEY_DELETE);
3615+ }
3616+ menu->reset_size ();
3617+
3618+ menu->set_position (p_popup_pos);
3619+ menu->popup ();
3620+ }
3621+
36173622void AnimationTrackEdit::_menu_selected (int p_index) {
36183623 switch (p_index) {
36193624 case MENU_CALL_MODE_CONTINUOUS:
0 commit comments