Skip to content

Commit b639c0c

Browse files
committed
Merge pull request #103130 from Arnklit/filter-animations
Add animation filtering to animation editor
2 parents c3247d8 + 6bb7536 commit b639c0c

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

editor/animation_track_editor.cpp

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

17311736
Size2 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+
48704893
void 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);

editor/animation_track_editor.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,14 @@ class AnimationTimelineEdit : public Range {
200200
Range *h_scroll = nullptr;
201201
float play_position_pos = 0.0f;
202202

203+
HBoxContainer *add_track_hb = nullptr;
203204
HBoxContainer *len_hb = nullptr;
204205
EditorSpinSlider *length = nullptr;
205206
Button *loop = nullptr;
206207
TextureRect *time_icon = nullptr;
207208

208209
MenuButton *add_track = nullptr;
210+
LineEdit *filter_track = nullptr;
209211
Control *play_position = nullptr; //separate control used to draw so updates for only position changed are much faster
210212
HScrollBar *hscroll = nullptr;
211213

@@ -944,6 +946,7 @@ class AnimationTrackEditor : public VBoxContainer {
944946
bool is_snap_keys_enabled() const;
945947
bool is_bezier_editor_active() const;
946948
bool can_add_reset_key() const;
949+
void _on_filter_updated(const String &p_filter);
947950
float get_moving_selection_offset() const;
948951
float snap_time(float p_value, bool p_relative = false);
949952
float get_snap_unit();

0 commit comments

Comments
 (0)