Merge pull request #102189 from KoBeWi/frames_per_setting

Add editor setting for FPS mode and compat
This commit is contained in:
Thaddeus Crews
2025-03-11 16:54:04 -05:00
6 changed files with 33 additions and 10 deletions

View File

@ -528,6 +528,12 @@
<member name="editors/animation/default_create_reset_tracks" type="bool" setter="" getter="">
If [code]true[/code], create a [code]RESET[/code] track when creating a new animation track. This track can be used to restore the animation to a "default" state.
</member>
<member name="editors/animation/default_fps_compatibility" type="bool" setter="" getter="">
Controls whether [AnimationPlayer] will apply snapping to nearest integer FPS when snapping is in Seconds mode. The option is remembered locally for a scene and this option only determines the default value when scene doesn't have local state yet.
</member>
<member name="editors/animation/default_fps_mode" type="int" setter="" getter="">
Default step mode for [AnimationPlayer] (seconds or FPS). The option is remembered locally for a scene and this option only determines the default value when scene doesn't have local state yet.
</member>
<member name="editors/animation/onion_layers_future_color" type="Color" setter="" getter="">
The modulate color to use for "future" frames displayed in the animation editor's onion skinning feature.
</member>

View File

@ -3894,6 +3894,7 @@ bool AnimationTrackEditor::has_keying() const {
Dictionary AnimationTrackEditor::get_state() const {
Dictionary state;
state["fps_mode"] = timeline->is_using_fps();
state["fps_compat"] = fps_compat->is_pressed();
state["zoom"] = zoom->get_value();
state["offset"] = timeline->get_value();
state["v_scroll"] = scroll->get_v_scroll_bar()->get_value();
@ -3909,27 +3910,34 @@ void AnimationTrackEditor::set_state(const Dictionary &p_state) {
snap_mode->select(0);
}
_snap_mode_changed(snap_mode->get_selected());
} else {
snap_mode->select(0);
_snap_mode_changed(snap_mode->get_selected());
}
if (p_state.has("fps_compat")) {
fps_compat->set_pressed(p_state["fps_compat"]);
}
if (p_state.has("zoom")) {
zoom->set_value(p_state["zoom"]);
} else {
zoom->set_value(1.0);
}
if (p_state.has("offset")) {
timeline->set_value(p_state["offset"]);
} else {
timeline->set_value(0);
}
if (p_state.has("v_scroll")) {
scroll->get_v_scroll_bar()->set_value(p_state["v_scroll"]);
} else {
scroll->get_v_scroll_bar()->set_value(0);
}
}
void AnimationTrackEditor::clear() {
snap_mode->select(EDITOR_GET("editors/animation/default_fps_mode"));
_snap_mode_changed(snap_mode->get_selected());
fps_compat->set_pressed(EDITOR_GET("editors/animation/default_fps_compatibility"));
zoom->set_value(1.0);
timeline->set_value(0);
scroll->get_v_scroll_bar()->set_value(0);
}
void AnimationTrackEditor::cleanup() {
set_animation(Ref<Animation>(), read_only);
}
@ -7704,9 +7712,9 @@ AnimationTrackEditor::AnimationTrackEditor() {
snap_mode = memnew(OptionButton);
snap_mode->add_item(TTR("Seconds"));
snap_mode->add_item(TTR("FPS"));
snap_mode->set_disabled(true);
bottom_hf->add_child(snap_mode);
snap_mode->connect(SceneStringName(item_selected), callable_mp(this, &AnimationTrackEditor::_snap_mode_changed));
snap_mode->set_disabled(true);
bottom_hf->add_child(memnew(VSeparator));

View File

@ -915,6 +915,7 @@ public:
Dictionary get_state() const;
void set_state(const Dictionary &p_state);
void clear();
void cleanup();

View File

@ -918,6 +918,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/polygon_editor/auto_bake_delay", 1.5, "-1.0,10.0,0.01");
// Animation
EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "editors/animation/default_fps_mode", 0, "Seconds,FPS");
_initial_set("editors/animation/default_fps_compatibility", true);
_initial_set("editors/animation/autorename_animation_tracks", true);
_initial_set("editors/animation/confirm_insert_track", true, true);
_initial_set("editors/animation/default_create_bezier_tracks", false, true);

View File

@ -923,6 +923,10 @@ void AnimationPlayerEditor::set_state(const Dictionary &p_state) {
}
}
void AnimationPlayerEditor::clear() {
track_editor->clear();
}
void AnimationPlayerEditor::_animation_resource_edit() {
String current = _get_current();
if (current != String()) {

View File

@ -265,6 +265,7 @@ public:
AnimationTrackEditor *get_track_editor() { return track_editor; }
Dictionary get_state() const;
void set_state(const Dictionary &p_state);
void clear();
void ensure_visibility();
@ -297,6 +298,7 @@ protected:
public:
virtual Dictionary get_state() const override { return anim_editor->get_state(); }
virtual void set_state(const Dictionary &p_state) override { anim_editor->set_state(p_state); }
virtual void clear() override { anim_editor->clear(); }
virtual String get_plugin_name() const override { return "Anim"; }
bool has_main_screen() const override { return false; }