OSSIAConstraintElement::OSSIAConstraintElement(
        std::shared_ptr<OSSIA::TimeConstraint> ossia_cst,
        ConstraintModel& iscore_cst,
        QObject* parent):
    QObject{parent},
    m_iscore_constraint{iscore_cst},
    m_ossia_constraint{ossia_cst}
{
    con(iscore_cst.processes, &NotifyingMap<Process>::added,
            this, &OSSIAConstraintElement::on_processAdded);
    con(iscore_cst.processes, &NotifyingMap<Process>::removed,
            this, &OSSIAConstraintElement::on_processRemoved);

    con(iscore_cst, &ConstraintModel::loopingChanged,
        this, &OSSIAConstraintElement::on_loopingChanged);

    // Setup updates
    con(iscore_cst.duration, &ConstraintDurations::defaultDurationChanged, this,
            [=] (const TimeValue& t) {
        ossia_cst->setDurationNominal(iscore::convert::time(t));
    });
    con(iscore_cst.duration, &ConstraintDurations::minDurationChanged, this,
            [=] (const TimeValue& t) {
        try {
            ossia_cst->setDurationMin(iscore::convert::time(t));
        }
        catch(std::runtime_error& e)
        {
            qWarning() << e.what();
        }
    });
    con(iscore_cst.duration, &ConstraintDurations::maxDurationChanged, this,
            [=] (const TimeValue& t) {
        try {
            ossia_cst->setDurationMax(iscore::convert::time(t));
        }
        catch(std::runtime_error& e)
        {
            qWarning() << e.what();
        }
    });

    if(iscore_cst.objectName() != QString("BaseConstraintModel"))
    {
        ossia_cst->setCallback([&] (
                               const OSSIA::TimeValue& position,
                               const OSSIA::TimeValue& date,
                               const std::shared_ptr<OSSIA::StateElement>& state)
        {
            constraintCallback(position, date, state);
        });
    }

    for(const auto& process : iscore_cst.processes)
    {
        on_processAdded(process);
    }
}
Beispiel #2
0
ConstraintElement::ConstraintElement(
        std::shared_ptr<OSSIA::TimeConstraint> ossia_cst,
        Scenario::ConstraintModel& iscore_cst,
        const Context&ctx,
        QObject* parent):
    QObject{parent},
    m_iscore_constraint{iscore_cst},
    m_ossia_constraint{ossia_cst},
    m_ctx{ctx}
{
    OSSIA::TimeValue min_duration(iscore::convert::time(m_iscore_constraint.duration.minDuration()));
    OSSIA::TimeValue max_duration(iscore::convert::time(m_iscore_constraint.duration.maxDuration()));

    m_ossia_constraint->setDurationMin(min_duration);
    m_ossia_constraint->setDurationMax(max_duration);
    m_ossia_constraint->setSpeed(iscore_cst.duration.executionSpeed());

    con(iscore_cst.duration, &Scenario::ConstraintDurations::executionSpeedChanged,
            this, [&] (double sp) {
        m_ossia_constraint->setSpeed(sp);
    });

    // BaseScenario needs a special callback.
    if(dynamic_cast<Scenario::ScenarioModel*>(iscore_cst.parent())
    || dynamic_cast<Loop::ProcessModel*>(iscore_cst.parent()))
    {
        ossia_cst->setCallback([&] (
                               const OSSIA::TimeValue& position,
                               const OSSIA::TimeValue& date,
                               const std::shared_ptr<OSSIA::StateElement>& state)
        {
            constraintCallback(position, date, state);
        });
    }

    for(const auto& process : iscore_cst.processes)
    {
        on_processAdded(process);
    }
    
    m_state_on_play = OSSIA::State::create();
}