@@ -1456,6 +1456,7 @@ void AnimationTimelineEdit::_notification(int p_what) {
14561456 add_track->set_button_icon (get_editor_theme_icon (SNAME (" Add" )));
14571457 loop->set_button_icon (get_editor_theme_icon (SNAME (" Loop" )));
14581458 time_icon->set_texture (get_editor_theme_icon (SNAME (" Time" )));
1459+ filter_track->set_right_icon (get_editor_theme_icon (SNAME (" Search" )));
14591460
14601461 add_track->get_popup ()->clear ();
14611462 add_track->get_popup ()->add_icon_item (get_editor_theme_icon (SNAME (" KeyValue" )), TTR (" Property Track..." ));
@@ -1483,6 +1484,8 @@ void AnimationTimelineEdit::_notification(int p_what) {
14831484 case NOTIFICATION_RESIZED: {
14841485 len_hb->set_position (Vector2 (get_size ().width - get_buttons_width (), 0 ));
14851486 len_hb->set_size (Size2 (get_buttons_width (), get_size ().height ));
1487+ int hsize_icon_width = get_editor_theme_icon (SNAME (" Hsize" ))->get_width ();
1488+ add_track_hb->set_size (Size2 (name_limit - ((hsize_icon_width + 16 ) * EDSCALE), 0 ));
14861489 } break ;
14871490
14881491 case NOTIFICATION_ACCESSIBILITY_UPDATE: {
@@ -1714,6 +1717,7 @@ void AnimationTimelineEdit::set_animation(const Ref<Animation> &p_animation, boo
17141717
17151718 if (animation.is_valid ()) {
17161719 len_hb->show ();
1720+ filter_track->show ();
17171721 if (read_only) {
17181722 add_track->hide ();
17191723 } else {
@@ -1722,14 +1726,15 @@ void AnimationTimelineEdit::set_animation(const Ref<Animation> &p_animation, boo
17221726 play_position->show ();
17231727 } else {
17241728 len_hb->hide ();
1729+ filter_track->hide ();
17251730 add_track->hide ();
17261731 play_position->hide ();
17271732 }
17281733 queue_redraw ();
17291734}
17301735
17311736Size2 AnimationTimelineEdit::get_minimum_size () const {
1732- Size2 ms = add_track ->get_minimum_size ();
1737+ Size2 ms = filter_track ->get_minimum_size ();
17331738 const Ref<Font> font = get_theme_font (SceneStringName (font), SNAME (" Label" ));
17341739 const int font_size = get_theme_font_size (SceneStringName (font_size), SNAME (" Label" ));
17351740 ms.height = MAX (ms.height , font->get_height (font_size));
@@ -1936,6 +1941,8 @@ void AnimationTimelineEdit::gui_input(const Ref<InputEvent> &p_event) {
19361941 if (dragging_hsize) {
19371942 int ofs = mm->get_position ().x - dragging_hsize_from;
19381943 name_limit = dragging_hsize_at + ofs;
1944+ int hsize_icon_width = get_editor_theme_icon (SNAME (" Hsize" ))->get_width ();
1945+ add_track_hb->set_size (Size2 (name_limit - ((hsize_icon_width + 16 ) * EDSCALE), 0 ));
19391946 // Make sure name_limit is clamped to the range that UI allows.
19401947 name_limit = get_name_limit ();
19411948 queue_redraw ();
@@ -1993,6 +2000,7 @@ void AnimationTimelineEdit::_bind_methods() {
19932000 ADD_SIGNAL (MethodInfo (" timeline_changed" , PropertyInfo (Variant::FLOAT, " position" ), PropertyInfo (Variant::BOOL, " timeline_only" )));
19942001 ADD_SIGNAL (MethodInfo (" track_added" , PropertyInfo (Variant::INT, " track" )));
19952002 ADD_SIGNAL (MethodInfo (" length_changed" , PropertyInfo (Variant::FLOAT, " size" )));
2003+ ADD_SIGNAL (MethodInfo (" filter_changed" ));
19962004
19972005 ClassDB::bind_method (D_METHOD (" update_values" ), &AnimationTimelineEdit::update_values);
19982006}
@@ -2006,10 +2014,21 @@ AnimationTimelineEdit::AnimationTimelineEdit() {
20062014 play_position->set_anchors_and_offsets_preset (PRESET_FULL_RECT);
20072015 play_position->connect (SceneStringName (draw), callable_mp (this , &AnimationTimelineEdit::_play_position_draw));
20082016
2017+ add_track_hb = memnew (HBoxContainer);
2018+ add_child (add_track_hb);
2019+
20092020 add_track = memnew (MenuButton);
2021+ add_track->set_tooltip_text (TTR (" Select a new track by type to add to this animation." ));
20102022 add_track->set_position (Vector2 (0 , 0 ));
2011- add_child (add_track);
2012- add_track->set_text (TTR (" Add Track" ));
2023+ add_track_hb->add_child (add_track);
2024+ filter_track = memnew (LineEdit);
2025+ filter_track->set_h_size_flags (SIZE_EXPAND_FILL);
2026+ filter_track->set_placeholder (TTR (" Filter Tracks" ));
2027+ filter_track->set_tooltip_text (TTR (" Filter tracks by entering part of their node name or property." ));
2028+ filter_track->connect (SceneStringName (text_changed), callable_mp ((AnimationTrackEditor *)this , &AnimationTrackEditor::_on_filter_updated));
2029+ filter_track->set_clear_button_enabled (true );
2030+ filter_track->hide ();
2031+ add_track_hb->add_child (filter_track);
20132032
20142033 len_hb = memnew (HBoxContainer);
20152034
@@ -4867,6 +4886,10 @@ bool AnimationTrackEditor::can_add_reset_key() const {
48674886 return false ;
48684887}
48694888
4889+ void AnimationTrackEditor::_on_filter_updated (const String &p_filter) {
4890+ emit_signal (SNAME (" filter_changed" ));
4891+ }
4892+
48704893void AnimationTrackEditor::_update_tracks () {
48714894 int selected = _get_track_selected ();
48724895
@@ -4932,6 +4955,15 @@ void AnimationTrackEditor::_update_tracks() {
49324955 }
49334956 }
49344957
4958+ String filter_text = timeline->filter_track ->get_text ();
4959+
4960+ if (!filter_text.is_empty ()) {
4961+ String target = animation->track_get_path (i);
4962+ if (!target.containsn (filter_text)) {
4963+ continue ;
4964+ }
4965+ }
4966+
49354967 if (animation->track_get_type (i) == Animation::TYPE_VALUE) {
49364968 NodePath path = animation->track_get_path (i);
49374969
@@ -7669,6 +7701,7 @@ AnimationTrackEditor::AnimationTrackEditor() {
76697701 timeline->connect (" track_added" , callable_mp (this , &AnimationTrackEditor::_add_track));
76707702 timeline->connect (SceneStringName (value_changed), callable_mp (this , &AnimationTrackEditor::_timeline_value_changed));
76717703 timeline->connect (" length_changed" , callable_mp (this , &AnimationTrackEditor::_update_length));
7704+ timeline->connect (" filter_changed" , callable_mp (this , &AnimationTrackEditor::_update_tracks));
76727705
76737706 panner.instantiate ();
76747707 panner->set_scroll_zoom_factor (AnimationTimelineEdit::SCROLL_ZOOM_FACTOR_IN);
0 commit comments