- [Animation] Improve stability when reordering nodes.

This commit is contained in:
MakhamDev 2023-10-11 12:51:49 +07:00
parent 7f3de8ee17
commit 90b9441468
2 changed files with 35 additions and 37 deletions

View file

@ -1,25 +1,26 @@
function rearrange_priority(node, newpri) {
if(node.anim_priority == newpri) return;
var prev = node.anim_priority;
var down = prev > newpri;
if(node.anim_priority == floor(newpri)) return;
node.anim_priority = newpri;
var amo = ds_map_size(PROJECT.nodeMap);
var k = ds_map_find_first(PROJECT.nodeMap);
var pr = ds_priority_create();
repeat(amo) {
var _node = PROJECT.nodeMap[? k];
k = ds_map_find_next(PROJECT.nodeMap, k);
if(!_node.active) continue;
if(_node == node) continue;
if(down && _node.anim_priority >= newpri && _node.anim_priority <= prev)
_node.anim_priority++;
if(!down && _node.anim_priority <= newpri && _node.anim_priority >= prev)
_node.anim_priority--;
ds_priority_add(pr, _node, _node.anim_priority);
}
var _prRun = 0;
while(!ds_priority_empty(pr)) {
var _node = ds_priority_delete_min(pr);
_node.anim_priority = _prRun++;
}
ds_priority_destroy(pr);
PANEL_ANIMATION.updatePropertyList();
}

View file

@ -846,7 +846,7 @@ function Panel_Animation() : PanelContent() constructor {
if(pHOVER && point_in_circle(msx, msy, _tx, prop_dope_y, ui(6))) {
key_hover = key;
draw_sprite_ui_uniform(THEME.timeline_keyframe, key.ease_y_lock? 2 : 5, _tx, prop_dope_y, 1, COLORS.panel_animation_keyframe_selected);
if(mouse_press(mb_left, pFOCUS)) {
if(mouse_press(mb_left, pFOCUS) && !key_mod_press(SHIFT)) {
keyframe_dragging = animator.values[| k];
keyframe_drag_type = KEYFRAME_DRAG_TYPE.ease_in;
}
@ -862,7 +862,7 @@ function Panel_Animation() : PanelContent() constructor {
if(pHOVER && point_in_circle(msx, msy, _tx, prop_dope_y, ui(6))) {
key_hover = key;
draw_sprite_ui_uniform(THEME.timeline_keyframe, key.ease_y_lock? 3 : 5, _tx, prop_dope_y, 1, COLORS.panel_animation_keyframe_selected);
if(mouse_press(mb_left, pFOCUS)) {
if(mouse_press(mb_left, pFOCUS) && !key_mod_press(SHIFT)) {
keyframe_dragging = animator.values[| k];
keyframe_drag_type = KEYFRAME_DRAG_TYPE.ease_out;
}
@ -900,7 +900,7 @@ function Panel_Animation() : PanelContent() constructor {
cc = COLORS.panel_animation_keyframe_selected;
key_hover = keyframe;
if(pFOCUS) {
if(pFOCUS && !key_mod_press(SHIFT)) {
if(DOUBLE_CLICK) {
keyframe_dragging = keyframe;
keyframe_drag_type = KEYFRAME_DRAG_TYPE.ease_both;
@ -1057,7 +1057,7 @@ function Panel_Animation() : PanelContent() constructor {
var _node_y = 0;
draw_set_text(f_p2, fa_left, fa_center);
var hovering = noone;
var hovering_priority = -999999;
var hoverIndex = 0;
value_hovering = noone;
@ -1099,7 +1099,7 @@ function Panel_Animation() : PanelContent() constructor {
draw_sprite_ui_uniform(THEME.arrow, _node.anim_show? 3 : 0, ui(10), _node_y, 1, COLORS._main_icon, 0.75);
draw_set_font(f_p3);
var nodeName = $"[{_node.name}] ";
var nodeName = $"[{_node.anim_priority}] [{_node.name}] ";
var tw = string_width(nodeName);
draw_set_color(node_ordering == _node? COLORS._main_text_accent : COLORS._main_text);
@ -1120,8 +1120,8 @@ function Panel_Animation() : PanelContent() constructor {
draw_set_alpha(1);
if(!_node.anim_show) {
if(pHOVER && point_in_rectangle(msx, msy, 0, _node_y_start, lable_w, _node_y + ui(22)))
hovering = _node;
if(pHOVER && msy > _node_y_start)
hovering_priority = _node.anim_priority + 0.5;
continue;
}
@ -1142,17 +1142,13 @@ function Panel_Animation() : PanelContent() constructor {
}
} //end prop loop
if(pHOVER && point_in_rectangle(msx, msy, 0, _node_y_start, lable_w, ty))
hovering = _node;
if(pHOVER && msy > _node_y_start)
hovering_priority = _node.anim_priority + 0.5;
} //end node loop
if(hovering == noone && _node != noone)
hovering = _node;
if(hovering != noone && node_ordering != noone) {
hoverIndex = hovering.anim_priority;
rearrange_priority(node_ordering, hoverIndex);
if(node_ordering != noone) {
rearrange_priority(node_ordering, hovering_priority);
if(mouse_release(mb_left))
node_ordering = noone;
@ -1573,11 +1569,13 @@ function Panel_Animation() : PanelContent() constructor {
#endregion
if(pHOVER && point_in_rectangle(msx, msy, 0, ui(18), dope_sheet_w, dope_sheet_h)) {
if(mouse_press(mb_left, pFOCUS) || mouse_press(mb_right, pFOCUS)) {
if(mouse_press(mb_right, pFOCUS) && key_hover == noone)
keyframe_selecting = [];
if(mouse_press(mb_left, pFOCUS)) {
if(key_hover == noone) {
keyframe_selecting = [];
} else {
if(key_mod_press(SHIFT)) {
} else if(key_mod_press(SHIFT)) {
if(array_exists(keyframe_selecting, key_hover))
array_remove(keyframe_selecting, key_hover);
else
@ -1587,7 +1585,6 @@ function Panel_Animation() : PanelContent() constructor {
keyframe_selecting = [ key_hover ];
}
}
}
if(mouse_press(mb_left, pFOCUS)) {
if(stagger_mode == 1) {