TArray<FString> UCurveBase::CreateCurveFromCSVString(const FString& InString) { // Array used to store problems about curve import TArray<FString> OutProblems; TArray<FRichCurveEditInfo> Curves = GetCurves(); const int32 NumCurves = Curves.Num(); const FCsvParser Parser(InString); const FCsvParser::FRows& Rows = Parser.GetRows(); if(Rows.Num() == 0) { OutProblems.Add(FString(TEXT("No data."))); return OutProblems; } // First clear out old data. ResetCurve(); // Each row represents a point for(int32 RowIdx=0; RowIdx<Rows.Num(); RowIdx++) { const TArray<const TCHAR*>& Cells = Rows[RowIdx]; const int32 NumCells = Cells.Num(); // Need at least two cell, Time and one Value if(NumCells < 2) { OutProblems.Add(FString::Printf(TEXT("Row '%d' has less than 2 cells."), RowIdx)); continue; } float Time = FCString::Atof(Cells[0]); for(int32 CellIdx=1; CellIdx<NumCells && CellIdx<(NumCurves+1); CellIdx++) { FRichCurve* Curve = Curves[CellIdx-1].CurveToEdit; if(Curve != NULL) { FKeyHandle KeyHandle = Curve->AddKey(Time, FCString::Atof(Cells[CellIdx])); Curve->SetKeyInterpMode(KeyHandle, RCIM_Linear); } } // If we get more cells than curves (+1 for time cell) if(NumCells > (NumCurves + 1)) { OutProblems.Add(FString::Printf(TEXT("Row '%d' has too many cells for the curve(s)."), RowIdx)); } // If we got too few cells else if(NumCells < (NumCurves + 1)) { OutProblems.Add(FString::Printf(TEXT("Row '%d' has too few cells for the curve(s)."), RowIdx)); } } Modify(true); return OutProblems; }
void MixerCurve::setMixerType(MixerCurveType curveType) { m_curveType = curveType; m_mixerUI->CurveMin->setMaximum(1.0); m_mixerUI->CurveMax->setMaximum(1.0); switch (m_curveType) { case MixerCurve::MIXERCURVE_THROTTLE: { m_mixerUI->SettingsGroup->setTitle("Throttle Curve"); m_curve->setRange(0.0, 1.0); m_mixerUI->CurveMin->setMinimum(0.0); m_mixerUI->CurveMax->setMinimum(0.0); break; } case MixerCurve::MIXERCURVE_PITCH: { m_mixerUI->SettingsGroup->setTitle("Pitch Curve"); m_curve->setRange(-1.0, 1.0); m_mixerUI->CurveMin->setMinimum(-1.0); m_mixerUI->CurveMax->setMinimum(-1.0); break; } } m_spinDelegate->setRange(m_mixerUI->CurveMin->minimum(), m_mixerUI->CurveMax->maximum()); for (int i = 0; i < MixerCurveWidget::NODE_NUMELEM; i++) { m_settings->setItemDelegateForRow(i, m_spinDelegate); } ResetCurve(); }
MixerCurve::MixerCurve(QWidget *parent) : QFrame(parent), m_mixerUI(new Ui::MixerCurve) { m_mixerUI->setupUi(this); // setup some convienence pointers m_curve = m_mixerUI->CurveWidget; m_settings = m_mixerUI->CurveSettings; m_mixerUI->SettingsGroup->hide(); // create our spin delegate m_spinDelegate = new DoubleSpinDelegate(); // set the default mixer type setMixerType(MixerCurve::MIXERCURVE_THROTTLE); // paint the ui UpdateCurveUI(); // wire up our signals connect(m_mixerUI->CurveType, SIGNAL(currentIndexChanged(int)), this, SLOT(CurveTypeChanged())); connect(m_mixerUI->ResetCurve, SIGNAL(clicked()), this, SLOT(ResetCurve())); connect(m_mixerUI->PopupCurve, SIGNAL(clicked()), this, SLOT(PopupCurve())); connect(m_mixerUI->GenerateCurve, SIGNAL(clicked()), this, SLOT(GenerateCurve())); connect(m_curve, SIGNAL(curveUpdated()), this, SLOT(UpdateSettingsTable())); connect(m_settings, SIGNAL(cellChanged(int, int)), this, SLOT(SettingsTableChanged())); connect(m_mixerUI->CurveMin, SIGNAL(valueChanged(double)), this, SLOT(CurveMinChanged(double))); connect(m_mixerUI->CurveMax, SIGNAL(valueChanged(double)), this, SLOT(CurveMaxChanged(double))); connect(m_mixerUI->CurveStep, SIGNAL(valueChanged(double)), this, SLOT(GenerateCurve())); }
void MixerCurve::CommandActivated(MixerNode* node) { QString name = (node) ? node->getName() : "Reset"; if (name == "Reset") { ResetCurve(); m_curve->showCommands(false); } else if (name == "Commands") { } else if (name == "Popup" ) { PopupCurve(); } else if (name == "Linear") { m_mixerUI->CurveType->setCurrentIndex(m_mixerUI->CurveType->findText("Linear")); } else if (name == "Log") { m_mixerUI->CurveType->setCurrentIndex(m_mixerUI->CurveType->findText("Log")); } else if (name == "Exp") { m_mixerUI->CurveType->setCurrentIndex(m_mixerUI->CurveType->findText("Exp")); } else if (name == "Flat") { m_mixerUI->CurveType->setCurrentIndex(m_mixerUI->CurveType->findText("Flat")); } else if (name == "Step") { m_mixerUI->CurveType->setCurrentIndex(m_mixerUI->CurveType->findText("Step")); } else if (name == "MinPlus") { m_mixerUI->CurveMin->stepUp(); } else if (name == "MinMinus") { m_mixerUI->CurveMin->stepDown(); } else if (name == "MaxPlus") { m_mixerUI->CurveMax->stepUp(); } else if (name == "MaxMinus"){ m_mixerUI->CurveMax->stepDown(); } else if (name == "StepPlus") { m_mixerUI->CurveStep->stepUp(); m_curve->setCommandText("StepValue", QString("%0").arg(getCurveStep())); } else if (name == "StepMinus") { m_mixerUI->CurveStep->stepDown(); m_curve->setCommandText("StepValue", QString("%0").arg(getCurveStep())); } GenerateCurve(); }
MixerCurve::MixerCurve(QWidget *parent) : QFrame(parent), m_mixerUI(new Ui::MixerCurvePlot) { m_mixerUI->setupUi(this); // setup some convienence pointers m_curve = m_mixerUI->CurveWidget; m_settings = m_mixerUI->CurveSettings; // by default mixcurve isn't used for curve2source m_mixerUI->CBCurve2Source->hide(); m_mixerUI->SettingsGroup->hide(); m_curve->showCommands(false); m_curve->showCommand("Reset", false); m_curve->showCommand("Popup", false); m_curve->showCommand("Commands", false); // create our spin delegate m_spinDelegate = new DoubleSpinDelegate(); // set the default mixer type setMixerType(MixerCurve::MIXERCURVE_THROTTLE); // setup and turn off advanced mode CommandActivated(); // paint the ui UpdateCurveUI(); // wire up our signals connect(m_mixerUI->CurveType, SIGNAL(currentIndexChanged(int)), this, SLOT(CurveTypeChanged())); connect(m_mixerUI->ResetCurve, SIGNAL(clicked()), this, SLOT(ResetCurve())); connect(m_mixerUI->PopupCurve, SIGNAL(clicked()),this,SLOT(PopupCurve())); connect(m_mixerUI->GenerateCurve, SIGNAL(clicked()), this, SLOT(GenerateCurve())); connect(m_curve, SIGNAL(curveUpdated()), this, SLOT(UpdateSettingsTable())); connect(m_curve, SIGNAL(commandActivated(MixerNode*)),this, SLOT(CommandActivated(MixerNode*))); connect(m_settings, SIGNAL(cellChanged(int,int)), this, SLOT(SettingsTableChanged())); connect(m_mixerUI->CurveMin, SIGNAL(valueChanged(double)), this, SLOT(CurveMinChanged(double))); connect(m_mixerUI->CurveMax, SIGNAL(valueChanged(double)), this, SLOT(CurveMaxChanged(double))); connect(m_mixerUI->CurveStep, SIGNAL(valueChanged(double)), this, SLOT(GenerateCurve())); }
void MixerCurve::setMixerType(MixerCurveType curveType, bool isCurve1) { m_curveType = curveType; m_mixerUI->CurveMin->setMaximum(1.0); m_mixerUI->CurveMax->setMaximum(1.0); switch (m_curveType) { case MixerCurve::MIXERCURVE_THROTTLE: { m_mixerUI->SettingsGroup->setTitle("Throttle Curve"); m_curve->setRange(0.0, 1.0); m_mixerUI->CurveMin->setMinimum(0.0); m_mixerUI->CurveMax->setMinimum(0.0); break; } case MixerCurve::MIXERCURVE_OTHER: { m_mixerUI->SettingsGroup->setTitle("Pitch Curve"); m_curve->setRange(-1.0, 1.0); m_curve->setPositiveColor("#0000aa", "#0000aa"); m_mixerUI->CurveMin->setMinimum(-1.0); m_mixerUI->CurveMax->setMinimum(-1.0); break; } } if(!isCurve1){ m_mixerUI->CBCurve2Source->show(); m_mixerUI->inputLabelCurve2Source->setText("Input:"); }else{ m_mixerUI->inputLabelCurve2Source->setText("Input: Throttle"); } m_spinDelegate->setRange(m_mixerUI->CurveMin->minimum(), m_mixerUI->CurveMax->maximum()); for (int i=0; i<MixerCurveWidget::NODE_NUMELEM; i++) { m_settings->setItemDelegateForRow(i, m_spinDelegate); } ResetCurve(); }