-
-
Notifications
You must be signed in to change notification settings - Fork 21.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
SpriteFrames Editor: Fix Frame Duration applied to wrong frame when switching frame #79872
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1134,18 +1134,16 @@ void SpriteFramesEditor::_frame_duration_changed(double p_value) { | |
return; | ||
} | ||
|
||
int index = frame_list->get_current(); | ||
int index = sel; | ||
if (index < 0) { | ||
return; | ||
} | ||
|
||
sel = index; | ||
|
||
Ref<Texture2D> texture = frames->get_frame_texture(edited_anim, index); | ||
float old_duration = frames->get_frame_duration(edited_anim, index); | ||
|
||
EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); | ||
undo_redo->create_action(TTR("Set Frame Duration"), UndoRedo::MERGE_DISABLE, EditorNode::get_singleton()->get_edited_scene()); | ||
undo_redo->create_action(TTR("Set Frame Duration"), UndoRedo::MERGE_ENDS, EditorNode::get_singleton()->get_edited_scene()); | ||
undo_redo->add_do_method(frames.ptr(), "set_frame", edited_anim, index, texture, p_value); | ||
undo_redo->add_undo_method(frames.ptr(), "set_frame", edited_anim, index, texture, old_duration); | ||
undo_redo->add_do_method(this, "_update_library"); | ||
|
@@ -1192,7 +1190,7 @@ void SpriteFramesEditor::_update_library(bool p_skip_selector) { | |
|
||
updating = true; | ||
|
||
frame_duration->set_value(1.0); // Default. | ||
frame_duration->set_value_no_signal(1.0); // Default. | ||
|
||
if (!p_skip_selector) { | ||
animations->clear(); | ||
|
@@ -1294,7 +1292,7 @@ void SpriteFramesEditor::_update_library(bool p_skip_selector) { | |
} | ||
if (sel == i) { | ||
frame_list->select(frame_list->get_item_count() - 1); | ||
frame_duration->set_value(frames->get_frame_duration(edited_anim, i)); | ||
frame_duration->set_value_no_signal(frames->get_frame_duration(edited_anim, i)); | ||
} | ||
} | ||
|
||
|
@@ -1876,8 +1874,8 @@ SpriteFramesEditor::SpriteFramesEditor() { | |
frame_list->set_max_text_lines(2); | ||
SET_DRAG_FORWARDING_GCD(frame_list, SpriteFramesEditor); | ||
frame_list->connect("gui_input", callable_mp(this, &SpriteFramesEditor::_frame_list_gui_input)); | ||
frame_list->connect("item_selected", callable_mp(this, &SpriteFramesEditor::_frame_list_item_selected)); | ||
|
||
// HACK: The item_selected signal is emitted before the Frame Duration spinbox loses focus and applies the change. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh no a hack. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. To me, the deferred connection looks like a hack that could cause other issues. See #79695. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we can avoid this if we track which frame was selected when focus was gain and update that frame on focus loss, not the one currently selected. See #79692 (comment). |
||
frame_list->connect("item_selected", callable_mp(this, &SpriteFramesEditor::_frame_list_item_selected), CONNECT_DEFERRED); | ||
sub_vb->add_child(frame_list); | ||
|
||
dialog = memnew(AcceptDialog); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should the same be done to
SpriteFramesEditor::_frame_list_item_selected
? Then you can probably remove the updating guards in it.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Probably yes, but I wouldn't want to add any regressions. We'll probably refactor this plugin at some point and remove the obscurity in the code execution order.