Skip to content

Commit

Permalink
Add type filters to AnimationPlayer's "Add Track"
Browse files Browse the repository at this point in the history
Co-Authored-By: A Thousand Ships <[email protected]>
Co-Authored-By: Tomek <[email protected]>
  • Loading branch information
3 people committed Nov 9, 2024
1 parent e65a237 commit d517675
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 12 deletions.
22 changes: 22 additions & 0 deletions editor/animation_track_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5297,6 +5297,28 @@ void AnimationTrackEditor::_add_track(int p_type) {
return;
}
adding_track_type = p_type;
Vector<StringName> valid_types;
switch (adding_track_type) {
case Animation::TYPE_BLEND_SHAPE: {
// Blend Shape is a property of MeshInstance3D.
valid_types.push_back(SNAME("MeshInstance3D"));
} break;
case Animation::TYPE_POSITION_3D:
case Animation::TYPE_ROTATION_3D:
case Animation::TYPE_SCALE_3D: {
// 3D Properties come from nodes inheriting Node3D.
valid_types.push_back(SNAME("Node3D"));
} break;
case Animation::TYPE_AUDIO: {
valid_types.push_back(SNAME("AudioStreamPlayer"));
valid_types.push_back(SNAME("AudioStreamPlayer2D"));
valid_types.push_back(SNAME("AudioStreamPlayer3D"));
} break;
case Animation::TYPE_ANIMATION: {
valid_types.push_back(SNAME("AnimationPlayer"));
} break;
}
pick_track->set_valid_types(valid_types);
pick_track->popup_scenetree_dialog(nullptr, root_node);
pick_track->get_filter_line_edit()->clear();
pick_track->get_filter_line_edit()->grab_focus();
Expand Down
37 changes: 25 additions & 12 deletions editor/gui/scene_tree_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1684,24 +1684,30 @@ void SceneTreeDialog::_show_all_nodes_changed(bool p_button_pressed) {
}

void SceneTreeDialog::set_valid_types(const Vector<StringName> &p_valid) {
if (p_valid.is_empty()) {
return;
if (allowed_types_hbox) {
allowed_types_hbox->queue_free();
allowed_types_hbox = nullptr;
valid_type_icons.clear();
}

tree->set_valid_types(p_valid);

HBoxContainer *hbox = memnew(HBoxContainer);
content->add_child(hbox);
content->move_child(hbox, 0);
if (p_valid.is_empty()) {
return;
}

allowed_types_hbox = memnew(HBoxContainer);
content->add_child(allowed_types_hbox);
content->move_child(allowed_types_hbox, 0);

{
Label *label = memnew(Label);
hbox->add_child(label);
allowed_types_hbox->add_child(label);
label->set_text(TTR("Allowed:"));
}

HFlowContainer *hflow = memnew(HFlowContainer);
hbox->add_child(hflow);
allowed_types_hbox->add_child(hflow);
hflow->set_h_size_flags(Control::SIZE_EXPAND_FILL);

for (const StringName &type : p_valid) {
Expand Down Expand Up @@ -1735,6 +1741,9 @@ void SceneTreeDialog::set_valid_types(const Vector<StringName> &p_valid) {
}

show_all_nodes->show();
if (is_inside_tree()) {
_update_valid_type_icons();
}
}

void SceneTreeDialog::_notification(int p_what) {
Expand All @@ -1753,11 +1762,7 @@ void SceneTreeDialog::_notification(int p_what) {
} break;

case NOTIFICATION_THEME_CHANGED: {
filter->set_right_icon(get_editor_theme_icon(SNAME("Search")));
for (TextureRect *trect : valid_type_icons) {
trect->set_custom_minimum_size(Vector2(get_theme_constant(SNAME("class_icon_size"), EditorStringName(Editor)), 0));
trect->set_texture(trect->get_meta("icon"));
}
_update_valid_type_icons();
} break;

case NOTIFICATION_EXIT_TREE: {
Expand All @@ -1766,6 +1771,14 @@ void SceneTreeDialog::_notification(int p_what) {
}
}

void SceneTreeDialog::_update_valid_type_icons() {
filter->set_right_icon(get_editor_theme_icon(SNAME("Search")));
for (TextureRect *trect : valid_type_icons) {
trect->set_custom_minimum_size(Vector2(get_theme_constant(SNAME("class_icon_size"), EditorStringName(Editor)), 0));
trect->set_texture(trect->get_meta("icon"));
}
}

void SceneTreeDialog::_cancel() {
hide();
}
Expand Down
2 changes: 2 additions & 0 deletions editor/gui/scene_tree_editor.h
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ class SceneTreeDialog : public ConfirmationDialog {
LineEdit *filter = nullptr;
CheckButton *show_all_nodes = nullptr;
LocalVector<TextureRect *> valid_type_icons;
HBoxContainer *allowed_types_hbox = nullptr;

void _select();
void _cancel();
Expand All @@ -208,6 +209,7 @@ class SceneTreeDialog : public ConfirmationDialog {
void _show_all_nodes_changed(bool p_button_pressed);

protected:
void _update_valid_type_icons();
void _notification(int p_what);
static void _bind_methods();

Expand Down

0 comments on commit d517675

Please sign in to comment.