bool LinkCelsCommand::onEnabled(Context* context) { if (context->checkFlags(ContextFlags::ActiveDocumentIsWritable)) { // TODO the range of selected frames should be in doc::Site. Timeline::Range range = App::instance()->getMainWindow()->getTimeline()->range(); return (range.enabled() && range.frames() > 1); } else return false; }
void SetLoopSectionCommand::onExecute(Context* ctx) { doc::Document* doc = ctx->activeDocument(); if (!doc) return; doc::Sprite* sprite = doc->sprite(); doc::frame_t begin = m_begin; doc::frame_t end = m_end; bool on = false; switch (m_action) { case Action::Auto: { Timeline::Range range = App::instance()->getMainWindow()->getTimeline()->range(); if (range.enabled() && (range.frames() > 1)) { begin = range.frameBegin(); end = range.frameEnd(); on = true; } else { on = false; } break; } case Action::On: on = true; break; case Action::Off: on = false; break; } doc::FrameTag* loopTag = get_loop_tag(sprite); if (on) { if (!loopTag) { loopTag = create_loop_tag(begin, end); ContextWriter writer(ctx); Transaction transaction(writer.context(), "Add Loop"); transaction.execute(new cmd::AddFrameTag(sprite, loopTag)); transaction.commit(); } else if (loopTag->fromFrame() != begin || loopTag->toFrame() != end) { ContextWriter writer(ctx); Transaction transaction(writer.context(), "Set Loop Range"); transaction.execute(new cmd::SetFrameTagRange(loopTag, begin, end)); transaction.commit(); } else { Command* cmd = CommandsModule::instance()->getCommandByName(CommandId::FrameTagProperties); ctx->executeCommand(cmd); } } else { if (loopTag) { ContextWriter writer(ctx); Transaction transaction(writer.context(), "Remove Loop"); transaction.execute(new cmd::RemoveFrameTag(sprite, loopTag)); transaction.commit(); } } App::instance()->getMainWindow()->getTimeline()->invalidate(); }