Add animation panel action planner

This commit is contained in:
2026-06-03 16:57:56 +02:00
parent 603bb0c4e7
commit cee5f141a3
8 changed files with 335 additions and 10 deletions

View File

@@ -163,6 +163,15 @@ void NodePanelAnimation::execute_animation_plan(const pp::app::DocumentAnimation
LOG("Animation panel action failed: %s", status.message);
}
pp::app::DocumentAnimationPanelState NodePanelAnimation::animation_panel_state() const
{
return pp::app::DocumentAnimationPanelState {
.total_duration = Canvas::I->anim_duration(),
.current_frame = Canvas::I->m_anim_frame,
.playback_active = btn_play->is_active(),
};
}
void NodePanelAnimation::init_controls()
{
m_layers_container = find<NodeScroll>("layers");
@@ -275,7 +284,10 @@ void NodePanelAnimation::init_controls()
};
m_timeline->on_frame_changed = [this] (NodeAnimationTimeline* target, int frame) {
const auto plan = pp::app::plan_animation_goto_frame(Canvas::I->anim_duration(), frame);
const auto plan = pp::app::plan_animation_panel_action(
pp::app::DocumentAnimationPanelAction::goto_frame,
animation_panel_state(),
frame);
if (!plan)
return;
LOG("goto frame %d", plan.value().target_frame);
@@ -283,19 +295,25 @@ void NodePanelAnimation::init_controls()
};
btn_next->on_click = [this] (Node* target) {
const auto plan = pp::app::plan_animation_step_frame(Canvas::I->anim_duration(), Canvas::I->m_anim_frame, 1);
const auto plan = pp::app::plan_animation_panel_action(
pp::app::DocumentAnimationPanelAction::next_frame,
animation_panel_state());
if (!plan)
return;
execute_animation_plan(plan.value());
};
btn_prev->on_click = [this](Node* target) {
const auto plan = pp::app::plan_animation_step_frame(Canvas::I->anim_duration(), Canvas::I->m_anim_frame, -1);
const auto plan = pp::app::plan_animation_panel_action(
pp::app::DocumentAnimationPanelAction::previous_frame,
animation_panel_state());
if (!plan)
return;
execute_animation_plan(plan.value());
};
btn_play->on_click = [this] (Node*) {
const auto plan = pp::app::plan_animation_playback_toggle(btn_play->is_active());
const auto plan = pp::app::plan_animation_panel_action(
pp::app::DocumentAnimationPanelAction::toggle_playback,
animation_panel_state());
if (plan)
execute_animation_plan(plan.value());
};
@@ -364,10 +382,9 @@ void NodePanelAnimation::on_tick(float dt)
if (m_playback_timer > (1.f / m_fps->get_float()))
{
m_playback_timer = 0;
const auto plan = pp::app::plan_animation_playback_step(
Canvas::I->anim_duration(),
Canvas::I->m_anim_frame,
1);
const auto plan = pp::app::plan_animation_panel_action(
pp::app::DocumentAnimationPanelAction::playback_step,
animation_panel_state());
if (plan)
execute_animation_plan(plan.value());
}