void KnobGui::setAllKeyframeMarkersOnTimeline(int dimension) { KnobPtr knob = getKnob(); AppInstPtr app = knob->getHolder()->getApp(); assert(app); std::list<SequenceTime> times; if (dimension == -1) { int dim = knob->getDimension(); for (int i = 0; i < dim; ++i) { KeyFrameSet kfs = knob->getCurve(ViewIdx(0), i)->getKeyFrames_mt_safe(); for (KeyFrameSet::iterator it = kfs.begin(); it != kfs.end(); ++it) { times.push_back( it->getTime() ); } } } else { KeyFrameSet kfs = knob->getCurve(ViewIdx(0), dimension)->getKeyFrames_mt_safe(); for (KeyFrameSet::iterator it = kfs.begin(); it != kfs.end(); ++it) { times.push_back( it->getTime() ); } } app->addMultipleKeyframeIndicatorsAdded(times, true); }
void KnobGui::onRemoveKeyActionTriggered() { QAction* action = qobject_cast<QAction*>( sender() ); assert(action); int dim = action->data().toInt(); KnobPtr knob = getKnob(); assert( knob->getHolder()->getApp() ); //get the current time on the global timeline SequenceTime time = knob->getHolder()->getApp()->getTimeLine()->currentFrame(); std::map<boost::shared_ptr<CurveGui>, std::vector<KeyFrame > > toRemove; KnobGuiPtr thisShared = shared_from_this(); for (int i = 0; i < knob->getDimension(); ++i) { if ( (dim == -1) || (i == dim) ) { std::list<boost::shared_ptr<CurveGui> > curves = getGui()->getCurveEditor()->findCurve(thisShared, i); for (std::list<boost::shared_ptr<CurveGui> >::iterator it = curves.begin(); it != curves.end(); ++it) { KeyFrame kf; bool foundKey = knob->getCurve(ViewIdx(0), i)->getKeyFrameWithTime(time, &kf); if (foundKey) { std::vector<KeyFrame > vect; vect.push_back(kf); toRemove.insert( std::make_pair(*it, vect) ); } } } } pushUndoCommand( new RemoveKeysCommand(getGui()->getCurveEditor()->getCurveWidget(), toRemove) ); }
void KnobGui::setInterpolationForDimensions(QAction* action, KeyframeTypeEnum interp) { if (!action) { return; } int dimension = action->data().toInt(); KnobPtr knob = getKnob(); for (int i = 0; i < knob->getDimension(); ++i) { if ( (dimension == -1) || (dimension == i) ) { boost::shared_ptr<Curve> c = knob->getCurve(ViewIdx(0), i); if (c) { int kfCount = c->getKeyFramesCount(); for (int j = 0; j < kfCount; ++j) { c->setKeyFrameInterpolation(interp, j); } boost::shared_ptr<Curve> guiCurve = getCurve(ViewIdx(0), i); if (guiCurve) { guiCurve->clone(*c); } } } } if ( knob->getHolder() ) { knob->getHolder()->incrHashAndEvaluate(knob->getEvaluateOnChange(), false); } Q_EMIT keyInterpolationChanged(); }
void KnobGui::removeAllKeyframeMarkersOnTimeline(int dimension) { KnobPtr knob = getKnob(); if ( knob->getHolder() && knob->getHolder()->getApp() && !knob->getIsSecret() && ( knob->isDeclaredByPlugin() || knob->isUserKnob() ) ) { AppInstPtr app = knob->getHolder()->getApp(); assert(app); std::list<SequenceTime> times; std::set<SequenceTime> tmpTimes; if (dimension == -1) { int dim = knob->getDimension(); for (int i = 0; i < dim; ++i) { boost::shared_ptr<Curve> curve = knob->getCurve(ViewIdx(0), i); if (curve) { KeyFrameSet kfs = curve->getKeyFrames_mt_safe(); for (KeyFrameSet::iterator it = kfs.begin(); it != kfs.end(); ++it) { tmpTimes.insert( it->getTime() ); } } } for (std::set<SequenceTime>::iterator it = tmpTimes.begin(); it != tmpTimes.end(); ++it) { times.push_back(*it); } } else { boost::shared_ptr<Curve> curve = knob->getCurve(ViewIdx(0), dimension); if (curve) { KeyFrameSet kfs = curve->getKeyFrames_mt_safe(); for (KeyFrameSet::iterator it = kfs.begin(); it != kfs.end(); ++it) { times.push_back( it->getTime() ); } } } if ( !times.empty() ) { app->removeMultipleKeyframeIndicator(times, true); } } }
void RestoreDefaultsCommand::undo() { assert( _clones.size() == _knobs.size() ); std::list<SequenceTime> times; KnobPtr first = _knobs.front().lock(); AppInstance* app = first->getHolder()->getApp(); assert(app); std::list<KnobWPtr >::const_iterator itClone = _clones.begin(); for (std::list<KnobWPtr >::const_iterator it = _knobs.begin(); it != _knobs.end(); ++it, ++itClone) { KnobPtr itKnob = it->lock(); if (!itKnob) { continue; } KnobPtr itCloneKnob = itClone->lock(); if (!itCloneKnob) { continue; } itKnob->cloneAndUpdateGui( itCloneKnob.get() ); if ( itKnob->getHolder()->getApp() ) { int dim = itKnob->getDimension(); for (int i = 0; i < dim; ++i) { if ( (i == _targetDim) || (_targetDim == -1) ) { boost::shared_ptr<Curve> c = itKnob->getCurve(ViewIdx(0), i); if (c) { KeyFrameSet kfs = c->getKeyFrames_mt_safe(); for (KeyFrameSet::iterator it = kfs.begin(); it != kfs.end(); ++it) { times.push_back( std::floor(it->getTime() + 0.5) ); } } } } } } app->addMultipleKeyframeIndicatorsAdded(times, true); first->getHolder()->incrHashAndEvaluate(true, true); if ( first->getHolder()->getApp() ) { first->getHolder()->getApp()->redrawAllViewers(); } setText( tr("Restore default value(s)") ); }
void KnobGui::removeKeyFrame(double time, int dimension, ViewSpec view) { KnobPtr knob = getKnob(); boost::shared_ptr<Curve> curve = knob->getCurve(view, dimension); bool copyCurveValueAtTimeToInternalValue = false; if (curve) { copyCurveValueAtTimeToInternalValue = curve->getKeyFramesCount() == 1; } knob->onKeyFrameRemoved(time, view, dimension, copyCurveValueAtTimeToInternalValue); Q_EMIT keyFrameRemoved(); assert( knob->getHolder()->getApp() ); if ( !knob->getIsSecret() ) { knob->getHolder()->getApp()->removeKeyFrameIndicator(time); } updateGUI(dimension); }
void RestoreDefaultsCommand::redo() { std::list<SequenceTime> times; KnobPtr first = _knobs.front().lock(); AppInstance* app = 0; KnobHolder* holder = first->getHolder(); EffectInstance* isEffect = dynamic_cast<EffectInstance*>(holder); if (holder) { app = holder->getApp(); holder->beginChanges(); } /* First reset all knobs values, this will not call instanceChanged action */ for (std::list<KnobWPtr >::iterator it = _knobs.begin(); it != _knobs.end(); ++it) { KnobPtr itKnob = it->lock(); if (!itKnob) { continue; } if ( itKnob->getHolder() && itKnob->getHolder()->getApp() ) { int dim = itKnob->getDimension(); for (int i = 0; i < dim; ++i) { if ( (i == _targetDim) || (_targetDim == -1) ) { boost::shared_ptr<Curve> c = itKnob->getCurve(ViewIdx(0), i); if (c) { KeyFrameSet kfs = c->getKeyFrames_mt_safe(); for (KeyFrameSet::iterator it = kfs.begin(); it != kfs.end(); ++it) { times.push_back( std::floor(it->getTime() + 0.5) ); } } } } } if ( itKnob->getHolder() ) { itKnob->getHolder()->beginChanges(); } itKnob->blockValueChanges(); for (int d = 0; d < itKnob->getDimension(); ++d) { itKnob->resetToDefaultValue(d); } itKnob->unblockValueChanges(); if ( itKnob->getHolder() ) { itKnob->getHolder()->endChanges(true); } } /* Block value changes and call instanceChange on all knobs afterwards to put back the plug-in in a correct state */ double time = 0; if (app) { time = app->getTimeLine()->currentFrame(); } for (std::list<KnobWPtr >::iterator it = _knobs.begin(); it != _knobs.end(); ++it) { KnobPtr itKnob = it->lock(); if (!itKnob) { continue; } if ( itKnob->getHolder() ) { itKnob->getHolder()->onKnobValueChanged_public(itKnob.get(), eValueChangedReasonRestoreDefault, time, ViewIdx(0), true); } } if (app) { app->removeMultipleKeyframeIndicator(times, true); } if ( holder && holder->getApp() ) { holder->endChanges(); } if (_isNodeReset && isEffect) { isEffect->purgeCaches(); } if ( first->getHolder() ) { first->getHolder()->incrHashAndEvaluate(true, true); if ( first->getHolder()->getApp() ) { first->getHolder()->getApp()->redrawAllViewers(); } } setText( tr("Restore default value(s)") ); } // RestoreDefaultsCommand::redo
void PasteUndoCommand::copyFrom(const KnobPtr& serializedKnob, bool isRedo) { KnobPtr internalKnob = _imp->knob.lock()->getKnob(); switch (_imp->type) { case eKnobClipBoardTypeCopyAnim: { internalKnob->beginChanges(); for (int i = 0; i < internalKnob->getDimension(); ++i) { if ( ( _imp->targetDimension == -1) || ( i == _imp->targetDimension) ) { boost::shared_ptr<Curve> fromCurve; if ( ( i == _imp->targetDimension) && ( _imp->fromDimension != -1) ) { fromCurve = serializedKnob->getCurve(ViewIdx(0), _imp->fromDimension); } else { fromCurve = serializedKnob->getCurve(ViewIdx(0), i); } if (!fromCurve) { continue; } internalKnob->cloneCurve(ViewIdx(0), i, *fromCurve); } } internalKnob->endChanges(); break; } case eKnobClipBoardTypeCopyValue: { Knob<int>* isInt = dynamic_cast<Knob<int>*>( internalKnob.get() ); Knob<bool>* isBool = dynamic_cast<Knob<bool>*>( internalKnob.get() ); Knob<double>* isDouble = dynamic_cast<Knob<double>*>( internalKnob.get() ); Knob<std::string>* isString = dynamic_cast<Knob<std::string>*>( internalKnob.get() ); Knob<int>* isFromInt = dynamic_cast<Knob<int>*>( serializedKnob.get() ); Knob<bool>* isFromBool = dynamic_cast<Knob<bool>*>( serializedKnob.get() ); Knob<double>* isFromDouble = dynamic_cast<Knob<double>*>( serializedKnob.get() ); Knob<std::string>* isFromString = dynamic_cast<Knob<std::string>*>( serializedKnob.get() ); internalKnob->beginChanges(); for (int i = 0; i < internalKnob->getDimension(); ++i) { if ( ( _imp->targetDimension == -1) || ( i == _imp->targetDimension) ) { if (isInt && isFromInt) { int f = (i == _imp->targetDimension && _imp->fromDimension != -1) ? isFromInt->getValue(_imp->fromDimension) : isFromInt->getValue(i); isInt->setValue(f, ViewIdx(0), i, eValueChangedReasonNatronInternalEdited, 0); } else if (isBool && isFromBool) { bool f = (i == _imp->targetDimension && _imp->fromDimension != -1) ? isFromBool->getValue(_imp->fromDimension) : isFromBool->getValue(i); isBool->setValue(f, ViewIdx(0), i, eValueChangedReasonNatronInternalEdited, 0); } else if (isDouble && isFromDouble) { double f = (i == _imp->targetDimension && _imp->fromDimension != -1) ? isFromDouble->getValue(_imp->fromDimension) : isFromDouble->getValue(i); isDouble->setValue(f, ViewIdx(0), i, eValueChangedReasonNatronInternalEdited, 0); } else if (isString && isFromString) { std::string f = (i == _imp->targetDimension && _imp->fromDimension != -1) ? isFromString->getValue(_imp->fromDimension) : isFromString->getValue(i); isString->setValue(f, ViewIdx(0), i, eValueChangedReasonNatronInternalEdited, 0); } } } internalKnob->endChanges(); break; } case eKnobClipBoardTypeCopyLink: { //bool useExpression = !KnobI::areTypesCompatibleForSlave(internalKnob.get(), serializedKnob.get()); internalKnob->beginChanges(); for (int i = 0; i < internalKnob->getDimension(); ++i) { if ( ( _imp->targetDimension == -1) || ( i == _imp->targetDimension) ) { if (isRedo) { if (_imp->fromDimension != -1) { internalKnob->slaveTo(i, serializedKnob, _imp->fromDimension); } else { internalKnob->slaveTo(i, serializedKnob, i); } } else { internalKnob->unSlave(i, false); } } } internalKnob->endChanges(); break; } } // switch } // redo