@@ -3244,51 +3244,14 @@ 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- }
32523247
3253- bool selected = _try_select_at_ui_pos (pos, mb->is_command_or_control_pressed () || mb->is_shift_pressed (), false );
3248+ _try_select_at_ui_pos (pos, mb->is_command_or_control_pressed () || mb->is_shift_pressed (), false );
32543249 moving_selection_attempt = false ;
32553250
3256- menu->clear ();
3257- if (animation->track_get_type (track) == Animation::TYPE_METHOD) {
3258- if (hovering_key_idx != -1 ) {
3259- lookup_key_idx = hovering_key_idx;
3260- 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);
3261- menu->add_separator ();
3262- }
3263- }
3264- menu->add_icon_item (get_editor_theme_icon (SNAME (" Key" )), TTR (" Insert Key..." ), MENU_KEY_INSERT);
3265- if (selected || editor->is_selection_active ()) {
3266- menu->add_separator ();
3267- menu->add_icon_item (get_editor_theme_icon (SNAME (" Duplicate" )), TTR (" Duplicate Key(s)" ), MENU_KEY_DUPLICATE);
3268- menu->add_icon_item (get_editor_theme_icon (SNAME (" ActionCut" )), TTR (" Cut Key(s)" ), MENU_KEY_CUT);
3269- menu->add_icon_item (get_editor_theme_icon (SNAME (" ActionCopy" )), TTR (" Copy Key(s)" ), MENU_KEY_COPY);
3270- }
3271- if (editor->is_key_clipboard_active ()) {
3272- menu->add_icon_item (get_editor_theme_icon (SNAME (" ActionPaste" )), TTR (" Paste Key(s)" ), MENU_KEY_PASTE);
3273- }
3274- if (selected || editor->is_selection_active ()) {
3275- AnimationPlayerEditor *ape = AnimationPlayerEditor::get_singleton ();
3276- if (ape) {
3277- AnimationPlayer *ap = ape->get_player ();
3278- if (ap && editor->can_add_reset_key () && animation != ap->get_animation (SceneStringName (RESET))) {
3279- menu->add_separator ();
3280- menu->add_icon_item (get_editor_theme_icon (SNAME (" MoveUp" )), TTR (" Send Key(s) to RESET" ), MENU_KEY_ADD_RESET);
3281- }
3282- }
3283- menu->add_separator ();
3284- menu->add_icon_item (get_editor_theme_icon (SNAME (" Remove" )), TTR (" Delete Key(s)" ), MENU_KEY_DELETE);
3285- }
3286- menu->reset_size ();
3287-
3288- menu->set_position (get_screen_position () + get_local_mouse_position ());
3289- menu->popup ();
3290-
32913251 insert_at_pos = offset + timeline->get_value ();
3252+ Vector2 popup_pos = get_screen_position () + get_local_mouse_position ();
3253+ // Use call_deferred to wait for the selected keys being updated.
3254+ callable_mp (this , &AnimationTrackEdit::_popup_key_context_menu).call_deferred (hovering_key_idx, popup_pos);
32923255 accept_event ();
32933256 }
32943257 }
@@ -3615,6 +3578,49 @@ void AnimationTrackEdit::drop_data(const Point2 &p_point, const Variant &p_data)
36153578 }
36163579}
36173580
3581+ void AnimationTrackEdit::_popup_key_context_menu (int p_hovering_key_idx, Vector2 p_popup_pos) {
3582+ if (!menu) {
3583+ menu = memnew (PopupMenu);
3584+ add_child (menu);
3585+ menu->connect (SceneStringName (id_pressed), callable_mp (this , &AnimationTrackEdit::_menu_selected));
3586+ }
3587+
3588+ menu->clear ();
3589+ if (animation->track_get_type (track) == Animation::TYPE_METHOD) {
3590+ if (p_hovering_key_idx != -1 ) {
3591+ lookup_key_idx = p_hovering_key_idx;
3592+ 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);
3593+ menu->add_separator ();
3594+ }
3595+ }
3596+ menu->add_icon_item (get_editor_theme_icon (SNAME (" Key" )), TTR (" Insert Key..." ), MENU_KEY_INSERT);
3597+ if (editor->is_selection_active ()) {
3598+ menu->add_separator ();
3599+ menu->add_icon_item (get_editor_theme_icon (SNAME (" Duplicate" )), TTR (" Duplicate Key(s)" ), MENU_KEY_DUPLICATE);
3600+ menu->add_icon_item (get_editor_theme_icon (SNAME (" ActionCut" )), TTR (" Cut Key(s)" ), MENU_KEY_CUT);
3601+ menu->add_icon_item (get_editor_theme_icon (SNAME (" ActionCopy" )), TTR (" Copy Key(s)" ), MENU_KEY_COPY);
3602+ }
3603+ if (editor->is_key_clipboard_active ()) {
3604+ menu->add_icon_item (get_editor_theme_icon (SNAME (" ActionPaste" )), TTR (" Paste Key(s)" ), MENU_KEY_PASTE);
3605+ }
3606+ if (editor->is_selection_active ()) {
3607+ AnimationPlayerEditor *ape = AnimationPlayerEditor::get_singleton ();
3608+ if (ape) {
3609+ AnimationPlayer *ap = ape->get_player ();
3610+ if (ap && editor->can_add_reset_key () && animation != ap->get_animation (SceneStringName (RESET))) {
3611+ menu->add_separator ();
3612+ menu->add_icon_item (get_editor_theme_icon (SNAME (" MoveUp" )), TTR (" Send Key(s) to RESET" ), MENU_KEY_ADD_RESET);
3613+ }
3614+ }
3615+ menu->add_separator ();
3616+ menu->add_icon_item (get_editor_theme_icon (SNAME (" Remove" )), TTR (" Delete Key(s)" ), MENU_KEY_DELETE);
3617+ }
3618+ menu->reset_size ();
3619+
3620+ menu->set_position (p_popup_pos);
3621+ menu->popup ();
3622+ }
3623+
36183624void AnimationTrackEdit::_menu_selected (int p_index) {
36193625 switch (p_index) {
36203626 case MENU_CALL_MODE_CONTINUOUS:
0 commit comments