void DSRightTrimReaderCommand::trimRight(double lastFrame) { DSNodePtr nodeContext = _readerContext.lock(); if (!nodeContext) { return; } NodePtr node = nodeContext->getInternalNode(); KnobIntBase *lastFrameKnob = dynamic_cast<KnobIntBase *>( node->getKnobByName(kReaderParamNameLastFrame).get() ); assert(lastFrameKnob); if (!lastFrameKnob) { return; } KnobHolderPtr holder = lastFrameKnob->getHolder(); EffectInstancePtr effectInstance = toEffectInstance(holder); assert(effectInstance); if (!effectInstance) { return; } effectInstance->beginChanges(); KnobHelper::ValueChangedReturnCodeEnum r = lastFrameKnob->setValue(lastFrame, ViewSpec::all(), 0, eValueChangedReasonNatronGuiEdited, 0); effectInstance->endChanges(); Q_UNUSED(r); }
void TrackMarker::resetTrack() { Point curCenter; KnobDoublePtr knob = getCenterKnob(); curCenter.x = knob->getValue(0); curCenter.y = knob->getValue(1); EffectInstancePtr effect = getContext()->getNode()->getEffectInstance(); effect->beginChanges(); const KnobsVec& knobs = getKnobs(); for (KnobsVec::const_iterator it = knobs.begin(); it != knobs.end(); ++it) { if (*it != knob) { for (int i = 0; i < (*it)->getDimension(); ++i) { (*it)->resetToDefaultValue(i); } } else { for (int i = 0; i < (*it)->getDimension(); ++i) { (*it)->removeAnimation(ViewSpec::current(), i); } knob->setValue(curCenter.x, ViewSpec::current(), 0); knob->setValue(curCenter.y, ViewSpec::current(), 1); } } effect->endChanges(); removeAllUserKeyframes(); }
void DSSlipReaderCommand::slipReader(double dt) { DSNodePtr nodeContext = _readerContext.lock(); if (!nodeContext) { return; } NodePtr node = nodeContext->getInternalNode(); KnobIntBase *firstFrameKnob = dynamic_cast<KnobIntBase *>( node->getKnobByName(kReaderParamNameFirstFrame).get() ); assert(firstFrameKnob); KnobIntBase *lastFrameKnob = dynamic_cast<KnobIntBase *>( node->getKnobByName(kReaderParamNameLastFrame).get() ); assert(lastFrameKnob); KnobIntBase *timeOffsetKnob = dynamic_cast<KnobIntBase *>( node->getKnobByName(kReaderParamNameTimeOffset).get() ); assert(timeOffsetKnob); KnobIntBase *startingTimeKnob = dynamic_cast<KnobIntBase *>( node->getKnobByName(kReaderParamNameStartingTime).get() ); assert(startingTimeKnob); if (!firstFrameKnob || !lastFrameKnob || !timeOffsetKnob || !startingTimeKnob) { return; } /* Since the lastFrameKnob and startingTimeKnob have their signal connected to the computeNodeRange function in DopeSheetview We disconnect them beforehand and reconnect them afterwards, otherwise the dopesheet view is going to get many redraw() calls for nothing. */ DopeSheetView* view = _model->getDopesheetView(); QObject::disconnect( lastFrameKnob->getSignalSlotHandler().get(), SIGNAL(valueChanged(ViewSpec,int,int)), view, SLOT(onRangeNodeChanged(ViewSpec,int,int)) ); QObject::disconnect( startingTimeKnob->getSignalSlotHandler().get(), SIGNAL(valueChanged(ViewSpec,int,int)), view, SLOT(onRangeNodeChanged(ViewSpec,int,int)) ); KnobHolderPtr holder = lastFrameKnob->getHolder(); EffectInstancePtr effectInstance = toEffectInstance(holder); assert(effectInstance); if (!effectInstance) { return; } effectInstance->beginChanges(); { KnobHelper::ValueChangedReturnCodeEnum r; r = firstFrameKnob->setValue(firstFrameKnob->getValue() - dt, ViewSpec::all(), 0, eValueChangedReasonNatronGuiEdited, 0); Q_UNUSED(r); r = lastFrameKnob->setValue(lastFrameKnob->getValue() - dt, ViewSpec::all(), 0, eValueChangedReasonNatronGuiEdited, 0); Q_UNUSED(r); r = timeOffsetKnob->setValue(timeOffsetKnob->getValue() + dt, ViewSpec::all(), 0, eValueChangedReasonNatronGuiEdited, 0); Q_UNUSED(r); } effectInstance->endChanges(); QObject::connect( lastFrameKnob->getSignalSlotHandler().get(), SIGNAL(valueChanged(ViewSpec,int,int)), view, SLOT(onRangeNodeChanged(ViewSpec,int,int)) ); QObject::connect( startingTimeKnob->getSignalSlotHandler().get(), SIGNAL(valueChanged(ViewSpec,int,int)), view, SLOT(onRangeNodeChanged(ViewSpec,int,int)) ); view->update(); } // DSSlipReaderCommand::slipReader