void SimilarShapeSegmentPage::apply() {
  TDoubleParam *curve = getCurve();
  if (!curve) return;
  int kIndex = getViewer()->getSegmentIndex();
  if (kIndex < 0) return;

  std::string expressionText = m_expressionFld->getExpression();
  TExpression expr;
  expr.setGrammar(curve->getGrammar());
  expr.setText(expressionText);
  if (!expr.isValid()) {
    DVGui::warning(
        tr("There is a syntax error in the definition of the interpolation."));
    return;
  }
  if (dependsOn(expr, curve)) {
    DVGui::warning(
        tr("There is a circular reference in the definition of the "
           "interpolation."));
    return;
  }
  KeyframeSetter setter(curve, kIndex);
  setter.setSimilarShape(m_expressionFld->getExpression(),
                         m_offsetFld->text().toDouble());
}
void FunctionExpressionSegmentPage::apply() {
  TDoubleParam *curve = getCurve();
  if (!curve) return;

  int kIndex = getViewer()->getSegmentIndex();
  if (kIndex < 0) return;

  std::string expressionText = m_expressionFld->getExpression();
  TExpression expr;
  expr.setGrammar(curve->getGrammar());
  expr.setText(expressionText);
  if (dependsOn(expr, curve)) {
    DVGui::warning(
        tr("There is a circular reference in the definition of the "
           "interpolation."));
    return;
  }

  std::string unitName = m_unitFld->text().toStdString();

  KeyframeSetter setter(curve, kIndex);
  setter.setExpression(m_expressionFld->getExpression());
  setter.setUnitName(unitName);

  /*

TDoubleKeyframe kf0 = curve->getKeyframeAt(getR0());
kf0.m_expressionText = m_expressionFld->getExpression();
kf0.m_unitName = m_unitFld->text().toStdString();
curve->setKeyframe(kf0);

wstring unitExtension = m_unitFld->text().toStdWString();
TMeasure *curveMeasure = curve->getMeasure();
if(curveMeasure)
{
TUnit *unit = curveMeasure->getUnit(unitExtension);
if(unit)
curveMeasure->setCurrentUnit(unit);
else
{
unitExtension = curveMeasure->getCurrentUnit()->getDefaultExtension();
m_unitFld->setText(QString::fromStdWString(unitExtension));
}
}
else
m_unitFld->setText("");
*/
}
/*! return false if a circular reference is occured
*/
bool FunctionExpressionSegmentPage::getGuiValues(std::string &expressionText,
                                                 std::string &unitName) {
  expressionText = m_expressionFld->getExpression();

  // checking a circular reference
  TDoubleParam *curve = getCurve();
  TExpression expr;
  expr.setGrammar(curve->getGrammar());
  expr.setText(expressionText);
  if (dependsOn(expr, curve)) {
    DVGui::warning(
        tr("There is a circular reference in the definition of the "
           "interpolation."));
    return false;
  }

  unitName = m_unitFld->text().toStdString();

  if (m_expressionFld->hasFocus()) m_expressionFld->clearFocus();

  return true;
}