MultipleKnobEditsUndoCommand::MultipleKnobEditsUndoCommand(const KnobIPtr& knob, const QString& commandName, ValueChangedReasonEnum reason, ValueChangedReturnCodeEnum setValueRetCode, bool createNew, bool setKeyFrame, const PerDimViewVariantMap& oldValue, const Variant & newValue, DimSpec dimension, double time, ViewSetSpec view) : QUndoCommand() , knobs() , createNew(createNew) , firstRedoCalled(false) { assert(knob); std::list<ValueToSet>& vlist = knobs[knob]; vlist.push_back(ValueToSet()); // Add the new value to set to the list (which may be not empty) ValueToSet &v = vlist.back(); v.newValue = newValue; v.dimension = dimension; assert(dimension != -1); if (!setKeyFrame) { // Ensure the time is correct in case auto-keying is on and we add a keyframe v.time = knob->getCurrentTime(); } else { v.time = time; } v.setKeyFrame = setKeyFrame; v.view = view; v.setValueRetCode = setValueRetCode; v.reason = reason; v.oldValues = oldValue; KnobHolderPtr holder = knob->getHolder(); EffectInstancePtr effect = toEffectInstance(holder); QString holderName; if (effect) { holderName = QString::fromUtf8( effect->getNode()->getLabel().c_str() ); } // Set the command name in the Edit menu if (!commandName.isEmpty()) { setText(QString::fromUtf8("%1: ").arg(holderName) + commandName); } else { // If no command name passed, make up a generic command name setText( tr("%1: Multiple Parameters Edits").arg(holderName) ); } }