Improve scrolling actions in the animation track editor

- Implement timeline scrobbling using Alt + Mouse wheel anywhere in the
  animation track editor.
  - Snap settings are followed, and precise snapping can be obtained by also
    holding down Shift.
  - This modifier wasn't used by anything in the animation editor.
- Allow zooming by using Ctrl + Mouse wheel on the timeline itself.
  - Previously, this was only possible on the track area, not the timeline.
This commit is contained in:
Hugo Locurcio
2021-05-10 01:15:09 +02:00
parent 26d0c90370
commit a623eb5083
2 changed files with 124 additions and 54 deletions

View File

@@ -1595,6 +1595,10 @@ void AnimationTimelineEdit::set_zoom(Range *p_zoom) {
zoom->connect("value_changed", this, "_zoom_changed");
}
void AnimationTimelineEdit::set_track_edit(AnimationTrackEdit *p_track_edit) {
track_edit = p_track_edit;
}
void AnimationTimelineEdit::set_play_position(float p_pos) {
play_position_pos = p_pos;
play_position->update();
@@ -1650,7 +1654,33 @@ void AnimationTimelineEdit::_play_position_draw() {
}
void AnimationTimelineEdit::_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
ERR_FAIL_COND(p_event.is_null());
const Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_command() && mb->get_button_index() == BUTTON_WHEEL_UP) {
get_zoom()->set_value(get_zoom()->get_value() * 1.05);
accept_event();
}
if (mb.is_valid() && mb->is_pressed() && mb->get_command() && mb->get_button_index() == BUTTON_WHEEL_DOWN) {
get_zoom()->set_value(get_zoom()->get_value() / 1.05);
accept_event();
}
if (mb.is_valid() && mb->is_pressed() && mb->get_alt() && mb->get_button_index() == BUTTON_WHEEL_UP) {
if (track_edit) {
track_edit->get_editor()->goto_prev_step(true);
}
accept_event();
}
if (mb.is_valid() && mb->is_pressed() && mb->get_alt() && mb->get_button_index() == BUTTON_WHEEL_DOWN) {
if (track_edit) {
track_edit->get_editor()->goto_next_step(true);
}
accept_event();
}
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && hsize_rect.has_point(mb->get_position())) {
dragging_hsize = true;
@@ -1753,6 +1783,7 @@ AnimationTimelineEdit::AnimationTimelineEdit() {
editing = false;
name_limit = 150 * EDSCALE;
zoom = nullptr;
track_edit = nullptr;
play_position_pos = 0;
play_position = memnew(Control);
@@ -2316,6 +2347,7 @@ void AnimationTrackEdit::set_undo_redo(UndoRedo *p_undo_redo) {
void AnimationTrackEdit::set_timeline(AnimationTimelineEdit *p_timeline) {
timeline = p_timeline;
timeline->set_track_edit(this);
timeline->connect("zoom_changed", this, "_zoom_changed");
timeline->connect("name_limit_changed", this, "_zoom_changed");
}
@@ -4960,6 +4992,16 @@ void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) {
scroll->accept_event();
}
if (mb.is_valid() && mb->is_pressed() && mb->get_alt() && mb->get_button_index() == BUTTON_WHEEL_UP) {
goto_prev_step(true);
scroll->accept_event();
}
if (mb.is_valid() && mb->is_pressed() && mb->get_alt() && mb->get_button_index() == BUTTON_WHEEL_DOWN) {
goto_next_step(true);
scroll->accept_event();
}
if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) {
if (mb->is_pressed()) {
box_selecting = true;
@@ -5139,6 +5181,56 @@ void AnimationTrackEditor::_edit_menu_about_to_show() {
edit->get_popup()->set_item_disabled(edit->get_popup()->get_item_index(EDIT_APPLY_RESET), !player->can_apply_reset());
}
void AnimationTrackEditor::goto_prev_step(bool p_from_mouse_event) {
if (animation.is_null()) {
return;
}
float step = animation->get_step();
if (step == 0) {
step = 1;
}
if (p_from_mouse_event && Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
// Use more precise snapping when holding Shift.
// This is used when scrobbling the timeline using Alt + Mouse wheel.
step *= 0.25;
}
float pos = timeline->get_play_position();
pos = Math::stepify(pos - step, step);
if (pos < 0) {
pos = 0;
}
set_anim_pos(pos);
emit_signal("timeline_changed", pos, true);
}
void AnimationTrackEditor::goto_next_step(bool p_from_mouse_event) {
if (animation.is_null()) {
return;
}
float step = animation->get_step();
if (step == 0) {
step = 1;
}
if (p_from_mouse_event && Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
// Use more precise snapping when holding Shift.
// This is used when scrobbling the timeline using Alt + Mouse wheel.
// Do not use precise snapping when using the menu action or keyboard shortcut,
// as the default keyboard shortcut requires pressing Shift.
step *= 0.25;
}
float pos = timeline->get_play_position();
pos = Math::stepify(pos + step, step);
if (pos > animation->get_length()) {
pos = animation->get_length();
}
set_anim_pos(pos);
emit_signal("timeline_changed", pos, true);
}
void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
last_menu_track_opt = p_option;
switch (p_option) {
@@ -5424,42 +5516,10 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
}
} break;
case EDIT_GOTO_NEXT_STEP: {
if (animation.is_null()) {
break;
}
float step = animation->get_step();
if (step == 0) {
step = 1;
}
float pos = timeline->get_play_position();
pos = Math::stepify(pos + step, step);
if (pos > animation->get_length()) {
pos = animation->get_length();
}
set_anim_pos(pos);
emit_signal("timeline_changed", pos, true);
goto_next_step(false);
} break;
case EDIT_GOTO_PREV_STEP: {
if (animation.is_null()) {
break;
}
float step = animation->get_step();
if (step == 0) {
step = 1;
}
float pos = timeline->get_play_position();
pos = Math::stepify(pos - step, step);
if (pos < 0) {
pos = 0;
}
set_anim_pos(pos);
emit_signal("timeline_changed", pos, true);
goto_prev_step(false);
} break;
case EDIT_APPLY_RESET: {
AnimationPlayerEditor::singleton->get_player()->apply_reset(true);