Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/functionsegmentviewer.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzQt includes
Toshihiro Shimizu 890ddd
#include "toonzqt/intfield.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/filefield.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/doublefield.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/expressionfield.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/dvdialog.h"
Toshihiro Shimizu 890ddd
#include "tw/stringtable.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/functionsheet.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/functionpanel.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/doubleparamcmd.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheetexpr.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheet.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzBase includes
Toshihiro Shimizu 890ddd
#include "tdoubleparam.h"
Toshihiro Shimizu 890ddd
#include "tdoublekeyframe.h"
Toshihiro Shimizu 890ddd
#include "texpression.h"
Toshihiro Shimizu 890ddd
#include "tunit.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tconvert.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qgridlayout></qgridlayout>
Toshihiro Shimizu 890ddd
#include <qlabel></qlabel>
Toshihiro Shimizu 890ddd
#include <qstackedwidget></qstackedwidget>
Toshihiro Shimizu 890ddd
#include <qgroupbox></qgroupbox>
Toshihiro Shimizu 890ddd
#include <qcombobox></qcombobox>
Toshihiro Shimizu 890ddd
#include <qpushbutton></qpushbutton>
Toshihiro Shimizu 890ddd
#include <qintvalidator></qintvalidator>
Toshihiro Shimizu 890ddd
#include <qtextedit></qtextedit>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace DVGui;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
LineEdit *createField()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	LineEdit *field = new LineEdit();
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  field->setMaximumWidth(100);
Toshihiro Shimizu 890ddd
  field->setFixedHeight(100);
Toshihiro Shimizu 890ddd
  field->setMinimumHeight(100);
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	return field;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FunctionSegmentPage::FunctionSegmentPage(FunctionSegmentViewer *parent)
Toshihiro Shimizu 890ddd
	: QWidget(parent), m_viewer(parent)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FunctionSegmentPage::~FunctionSegmentPage()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FunctionEmptySegmentPage : public FunctionSegmentPage
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	FunctionEmptySegmentPage(FunctionSegmentViewer *parent = 0)
Toshihiro Shimizu 890ddd
		: FunctionSegmentPage(parent)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void refresh() {}
Toshihiro Shimizu 890ddd
	void apply() {}
Toshihiro Shimizu 890ddd
	void init(int segmentLength) {}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
SpeedInOutSegmentPage::SpeedInOutSegmentPage(FunctionSegmentViewer *parent)
Toshihiro Shimizu 890ddd
	: FunctionSegmentPage(parent)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_speed0xFld = new LineEdit("0");
Toshihiro Shimizu 890ddd
	m_speed0yFld = new DVGui::MeasuredDoubleLineEdit();
Toshihiro Shimizu 890ddd
	m_speed1xFld = new LineEdit("0");
Toshihiro Shimizu 890ddd
	m_speed1yFld = new DVGui::MeasuredDoubleLineEdit();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_firstSpeedFld = new DVGui::MeasuredDoubleLineEdit();
Toshihiro Shimizu 890ddd
	m_lastSpeedFld = new DVGui::MeasuredDoubleLineEdit();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----layout
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QGridLayout *mainLayout = new QGridLayout();
Toshihiro Shimizu 890ddd
	mainLayout->setHorizontalSpacing(5);
Toshihiro Shimizu 890ddd
	mainLayout->setVerticalSpacing(5);
Toshihiro Shimizu 890ddd
	mainLayout->setMargin(2);
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(new QLabel(tr("First Speed:")), 0, 0, Qt::AlignRight | Qt::AlignVCenter);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_firstSpeedFld, 0, 1, 1, 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(new QLabel(tr("Handle:")), 1, 0, Qt::AlignRight | Qt::AlignVCenter);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_speed0yFld, 1, 1);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(new QLabel(tr("/")), 1, 2);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_speed0xFld, 1, 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(new QLabel(tr("Last Speed:")), 2, 0, Qt::AlignRight | Qt::AlignVCenter);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_lastSpeedFld, 2, 1, 1, 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(new QLabel(tr("Handle:")), 3, 0, Qt::AlignRight | Qt::AlignVCenter);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_speed1yFld, 3, 1);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(new QLabel(tr("/")), 3, 2);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_speed1xFld, 3, 3);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	mainLayout->setColumnStretch(0, 0);
Toshihiro Shimizu 890ddd
	mainLayout->setColumnStretch(1, 1);
Toshihiro Shimizu 890ddd
	mainLayout->setColumnStretch(2, 0);
Toshihiro Shimizu 890ddd
	mainLayout->setColumnStretch(3, 1);
Toshihiro Shimizu 890ddd
	setLayout(mainLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool ret = connect(m_speed0xFld, SIGNAL(editingFinished()), this, SLOT(onFirstHandleXChanged()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_speed0yFld, SIGNAL(editingFinished()), this, SLOT(onFirstHandleYChanged()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_firstSpeedFld, SIGNAL(editingFinished()), this, SLOT(onFirstSpeedChanged()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_speed1xFld, SIGNAL(editingFinished()), this, SLOT(onLastHandleXChanged()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_speed1yFld, SIGNAL(editingFinished()), this, SLOT(onLastHandleYChanged()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_lastSpeedFld, SIGNAL(editingFinished()), this, SLOT(onLastSpeedChanged()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(ret);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SpeedInOutSegmentPage::onFirstHandleXChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double x = m_speed0xFld->text().toDouble();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--- 前のSegmentが存在して、Linkしていて、SpeedIn/Outでない場合、
Toshihiro Shimizu 890ddd
		  Speedを保持してハンドルの長さを変える。---*/
Toshihiro Shimizu 890ddd
	int segmentIndex = getViewer()->getSegmentIndex();
Toshihiro Shimizu 890ddd
	if (segmentIndex > 0) /*--- 前のSegmentが存在している条件 ---*/
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TDoubleKeyframe kf = getCurve()->getKeyframe(segmentIndex);
Toshihiro Shimizu 890ddd
		/*--- Linkしていて、SpeedIn/Outでない場合の条件 ---*/
Toshihiro Shimizu 890ddd
		if (kf.m_linkedHandles && kf.m_prevType != TDoubleKeyframe::SpeedInOut) {
Toshihiro Shimizu 890ddd
			double speed = m_firstSpeedFld->getValue();
Toshihiro Shimizu 890ddd
			m_speed0yFld->setValue(x * speed);
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	/*--- 条件から外れる場合 ---*/
Toshihiro Shimizu 890ddd
	double y = m_speed0yFld->getValue();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (x != 0.0)
Toshihiro Shimizu 890ddd
		m_firstSpeedFld->setValue(y / x);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_firstSpeedFld->setText(tr("---"));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SpeedInOutSegmentPage::onFirstHandleYChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double y = m_speed0yFld->getValue();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--- 前のSegmentが存在して、Linkしていて、SpeedIn/Outでない場合、
Toshihiro Shimizu 890ddd
	Speedを保持してハンドルの長さを変える。---*/
Toshihiro Shimizu 890ddd
	int segmentIndex = getViewer()->getSegmentIndex();
Toshihiro Shimizu 890ddd
	if (segmentIndex > 0) /*--- 前のSegmentが存在している条件 ---*/
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TDoubleKeyframe kf = getCurve()->getKeyframe(segmentIndex);
Toshihiro Shimizu 890ddd
		/*--- Linkしていて、SpeedIn/Outでない場合の条件 ---*/
Toshihiro Shimizu 890ddd
		if (kf.m_linkedHandles && kf.m_prevType != TDoubleKeyframe::SpeedInOut) {
Toshihiro Shimizu 890ddd
			double speed = m_firstSpeedFld->getValue();
Toshihiro Shimizu 890ddd
			if (!areAlmostEqual(speed, 0.0, 0.001))
Toshihiro Shimizu 890ddd
				m_speed0xFld->setText(QString::number(y / speed, 'f', 1));
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				m_speed0xFld->setText(QString::number(0, 'f', 1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	/*--- 条件から外れる場合 ---*/
Toshihiro Shimizu 890ddd
	double x = m_speed0xFld->text().toDouble();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (x != 0.0)
Toshihiro Shimizu 890ddd
		m_firstSpeedFld->setValue(y / x);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_firstSpeedFld->setText(tr("---"));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SpeedInOutSegmentPage::onFirstSpeedChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	/*--- Speedを変えた場合は、Valueを変える。 ---*/
Toshihiro Shimizu 890ddd
	double speed = m_firstSpeedFld->getValue();
Toshihiro Shimizu 890ddd
	double x = m_speed0xFld->text().toDouble();
Toshihiro Shimizu 890ddd
	m_speed0yFld->setValue(speed * x);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SpeedInOutSegmentPage::onLastHandleXChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double x = m_speed1xFld->text().toDouble();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--- 後のSegmentが存在して、Linkしていて、SpeedIn/Outでない場合、
Toshihiro Shimizu 890ddd
		 Speedを保持してハンドルの長さを変える。 ---*/
Toshihiro Shimizu 890ddd
	int segmentIndex = getViewer()->getSegmentIndex();
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	if (curve && curve->getKeyframeCount() >= 3 && segmentIndex < curve->getKeyframeCount() - 2) /*--- 後のSegmentが存在している条件 ---*/
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TDoubleKeyframe kf = getCurve()->getKeyframe(segmentIndex + 1);
Toshihiro Shimizu 890ddd
		/*--- Linkしていて、SpeedIn/Outでない場合の条件 ---*/
Toshihiro Shimizu 890ddd
		if (kf.m_linkedHandles && kf.m_type != TDoubleKeyframe::SpeedInOut) {
Toshihiro Shimizu 890ddd
			double speed = m_lastSpeedFld->getValue();
Toshihiro Shimizu 890ddd
			m_speed1yFld->setValue(x * speed);
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	/*--- 条件から外れる場合 ---*/
Toshihiro Shimizu 890ddd
	double y = m_speed1yFld->getValue();
Toshihiro Shimizu 890ddd
	if (x != 0.0)
Toshihiro Shimizu 890ddd
		m_lastSpeedFld->setValue(y / x);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_lastSpeedFld->setText(tr("---"));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
void SpeedInOutSegmentPage::onLastHandleYChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double y = m_speed1yFld->getValue();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--- 後のSegmentが存在して、Linkしていて、SpeedIn/Outでない場合、
Toshihiro Shimizu 890ddd
	Speedを保持してハンドルの長さを変える。 ---*/
Toshihiro Shimizu 890ddd
	int segmentIndex = getViewer()->getSegmentIndex();
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	if (curve && curve->getKeyframeCount() >= 3 && segmentIndex < curve->getKeyframeCount() - 2) /*--- 後のSegmentが存在している条件 ---*/
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TDoubleKeyframe kf = getCurve()->getKeyframe(segmentIndex + 1);
Toshihiro Shimizu 890ddd
		/*--- Linkしていて、SpeedIn/Outでない場合の条件 ---*/
Toshihiro Shimizu 890ddd
		if (kf.m_linkedHandles && kf.m_type != TDoubleKeyframe::SpeedInOut) {
Toshihiro Shimizu 890ddd
			double speed = m_lastSpeedFld->getValue();
Toshihiro Shimizu 890ddd
			std::cout << "speed: " << speed << std::endl;
Toshihiro Shimizu 890ddd
			if (!areAlmostEqual(speed, 0.0, 0.001))
Toshihiro Shimizu 890ddd
				m_speed1xFld->setText(QString::number(y / speed, 'f', 1));
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				m_speed1xFld->setText(QString::number(0, 'f', 1));
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	/*--- 条件から外れる場合 ---*/
Toshihiro Shimizu 890ddd
	double x = m_speed1xFld->text().toDouble();
Toshihiro Shimizu 890ddd
	if (x != 0.0)
Toshihiro Shimizu 890ddd
		m_lastSpeedFld->setValue(y / x);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_lastSpeedFld->setText(tr("---"));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SpeedInOutSegmentPage::onLastSpeedChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	/*--- Speedを変えた場合は、Valueを変える。 ---*/
Toshihiro Shimizu 890ddd
	double speed = m_lastSpeedFld->getValue();
Toshihiro Shimizu 890ddd
	double x = m_speed1xFld->text().toDouble();
Toshihiro Shimizu 890ddd
	m_speed1yFld->setValue(speed * x);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SpeedInOutSegmentPage::refresh()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	int kIndex = getViewer()->getSegmentIndex();
Toshihiro Shimizu 890ddd
	if (!curve || kIndex < 0 || kIndex + 1 >= curve->getKeyframeCount())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	if (curve->getKeyframe(kIndex).m_type != TDoubleKeyframe::SpeedInOut)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::string measureName = curve->getMeasureName();
Toshihiro Shimizu 890ddd
	if (measureName == "zdepth")
Toshihiro Shimizu 890ddd
		measureName = "zdepth.handle";
Toshihiro Shimizu 890ddd
	else if (measureName == "zdepth.cam")
Toshihiro Shimizu 890ddd
		measureName = "zdepth.cam.handle";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD speedOut = curve->getSpeedOut(kIndex);
Toshihiro Shimizu 890ddd
	m_speed0xFld->setText(QString::number(speedOut.x, 'f', 1));
Toshihiro Shimizu 890ddd
	m_speed0yFld->setMeasure(measureName);
Toshihiro Shimizu 890ddd
	m_speed0yFld->setValue(speedOut.y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_firstSpeedFld->setMeasure(measureName);
Toshihiro Shimizu 890ddd
	if (speedOut.x != 0.0)
Toshihiro Shimizu 890ddd
		m_firstSpeedFld->setValue(speedOut.y / speedOut.x);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_firstSpeedFld->setText(tr("---"));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD speedIn = curve->getSpeedIn(kIndex + 1);
Toshihiro Shimizu 890ddd
	m_speed1xFld->setText(QString::number(speedIn.x, 'f', 1));
Toshihiro Shimizu 890ddd
	m_speed1yFld->setMeasure(measureName);
Toshihiro Shimizu 890ddd
	m_speed1yFld->setValue(speedIn.y);
Toshihiro Shimizu 890ddd
	m_lastSpeedFld->setMeasure(measureName);
Toshihiro Shimizu 890ddd
	if (speedIn.x != 0.0)
Toshihiro Shimizu 890ddd
		m_lastSpeedFld->setValue(speedIn.y / speedIn.x);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_lastSpeedFld->setText(tr("---"));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--- キーフレームがリンク、かつ隣がSpeedIn/Outでないとき、
Toshihiro Shimizu 890ddd
		Speed入力BoxをDisableする。それ以外の場合はEnableする ---*/
Toshihiro Shimizu 890ddd
	//PrevKey
Toshihiro Shimizu 890ddd
	if (kIndex > 0 && curve->getKeyframe(kIndex).m_linkedHandles && curve->getKeyframe(kIndex).m_prevType != TDoubleKeyframe::SpeedInOut)
Toshihiro Shimizu 890ddd
		m_firstSpeedFld->setEnabled(false);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_firstSpeedFld->setEnabled(true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//NextKey
Toshihiro Shimizu 890ddd
	if (curve->getKeyframeCount() >= 3 && kIndex < curve->getKeyframeCount() - 2 && curve->getKeyframe(kIndex + 1).m_linkedHandles && curve->getKeyframe(kIndex + 1).m_type != TDoubleKeyframe::SpeedInOut)
Toshihiro Shimizu 890ddd
		m_lastSpeedFld->setEnabled(false);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_lastSpeedFld->setEnabled(true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SpeedInOutSegmentPage::init(int segmentLength)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	if (!curve)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_speed0xFld->setText(QString::number((double)segmentLength / 3.0));
Toshihiro Shimizu 890ddd
	m_speed0yFld->setMeasure(curve->getMeasureName());
Toshihiro Shimizu 890ddd
	m_speed0yFld->setValue(0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_firstSpeedFld->setMeasure(curve->getMeasureName());
Toshihiro Shimizu 890ddd
	m_firstSpeedFld->setValue(0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_speed1xFld->setText(QString::number(-(double)segmentLength / 3.0));
Toshihiro Shimizu 890ddd
	m_speed1yFld->setMeasure(curve->getMeasureName());
Toshihiro Shimizu 890ddd
	m_speed1yFld->setValue(0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_lastSpeedFld->setMeasure(curve->getMeasureName());
Toshihiro Shimizu 890ddd
	m_lastSpeedFld->setValue(0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SpeedInOutSegmentPage::getGuiValues(TPointD &speedIn, TPointD &speedOut)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	speedOut.x = m_speed0xFld->text().toDouble();
Toshihiro Shimizu 890ddd
	speedOut.y = m_speed0yFld->getValue();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	speedIn.x = m_speed1xFld->text().toDouble();
Toshihiro Shimizu 890ddd
	speedIn.y = m_speed1yFld->getValue();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
EaseInOutSegmentPage::EaseInOutSegmentPage(bool isPercentage, FunctionSegmentViewer *parent)
Toshihiro Shimizu 890ddd
	: FunctionSegmentPage(parent), m_fieldScale(isPercentage ? 100.0 : 1.0), m_isPercentage(isPercentage)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	std::string measureName = isPercentage ? "percentage" : "";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_ease0Fld = new DVGui::MeasuredDoubleLineEdit();
Toshihiro Shimizu 890ddd
	m_ease0Fld->setMeasure(measureName);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_ease1Fld = new DVGui::MeasuredDoubleLineEdit();
Toshihiro Shimizu 890ddd
	m_ease1Fld->setMeasure(measureName);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_ease0Fld->setText("0");
Toshihiro Shimizu 890ddd
	m_ease1Fld->setText("0");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----layout
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QGridLayout *mainLayout = new QGridLayout();
Toshihiro Shimizu 890ddd
	mainLayout->setSpacing(5);
Toshihiro Shimizu 890ddd
	mainLayout->setMargin(2);
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(new QLabel(tr("Ease In:")), 0, 0, Qt::AlignRight | Qt::AlignVCenter);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_ease0Fld, 0, 1);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(new QLabel(tr("Ease Out:")), 1, 0, Qt::AlignRight | Qt::AlignVCenter);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_ease1Fld, 1, 1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	mainLayout->setColumnStretch(0, 0);
Toshihiro Shimizu 890ddd
	mainLayout->setColumnStretch(1, 1);
Toshihiro Shimizu 890ddd
	setLayout(mainLayout);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void EaseInOutSegmentPage::refresh()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	if (!curve)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TDoubleKeyframe kf0 = curve->getKeyframeAt(getR0());
Toshihiro Shimizu 890ddd
	TDoubleKeyframe kf1 = curve->getKeyframeAt(getR1());
Toshihiro Shimizu 890ddd
	m_ease0Fld->setValue(kf0.m_speedOut.x / m_fieldScale);
Toshihiro Shimizu 890ddd
	m_ease1Fld->setValue(-kf1.m_speedIn.x / m_fieldScale);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void EaseInOutSegmentPage::onEase0Changed()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	int kIndex = getViewer()->getSegmentIndex();
Toshihiro Shimizu 890ddd
	if (!curve || kIndex < 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	KeyframeSetter setter(curve, kIndex);
Toshihiro Shimizu 890ddd
	setter.setEaseOut(m_ease0Fld->getValue() * m_fieldScale);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void EaseInOutSegmentPage::onEase1Changed()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	int kIndex = getViewer()->getSegmentIndex();
Toshihiro Shimizu 890ddd
	if (!curve || kIndex < 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	KeyframeSetter setter(curve, kIndex + 1);
Toshihiro Shimizu 890ddd
	setter.setEaseIn(-m_ease1Fld->getValue() * m_fieldScale);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void EaseInOutSegmentPage::init(int segmentLength)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	if (!curve)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	int kIndex = getViewer()->getSegmentIndex();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*---- 既にあるSegment上でTypeを切り替えたとき ----*/
Toshihiro Shimizu 890ddd
	if (0 <= kIndex && kIndex < curve->getKeyframeCount() - 1) {
Toshihiro Shimizu 890ddd
		TDoubleKeyframe keyFrame = curve->getKeyframe(kIndex);
Toshihiro Shimizu 890ddd
		TDoubleKeyframe nextKeyFrame = curve->getKeyframe(kIndex + 1);
Toshihiro Shimizu 890ddd
		double ease0 = 0, ease1 = 0;
Toshihiro Shimizu 890ddd
		/*--- EaseInOut(Frame)からEaseIO(%)に切り替えたとき ---*/
Toshihiro Shimizu 890ddd
		if (keyFrame.m_type == TDoubleKeyframe::EaseInOut && m_isPercentage) {
Toshihiro Shimizu 890ddd
			// absolute -> percentage
Toshihiro Shimizu 890ddd
			ease0 = keyFrame.m_speedOut.x / (double)segmentLength;
Toshihiro Shimizu 890ddd
			ease1 = -nextKeyFrame.m_speedIn.x / (double)segmentLength;
Toshihiro Shimizu 890ddd
			ease0 = tcrop(ease0, 0.0, 1.0);
Toshihiro Shimizu 890ddd
			ease1 = tcrop(ease1, 0.0, 1.0 - ease0);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		//*--- EaseIO(%)からEaseInOut(Frame)に切り替えたとき ---*/
Toshihiro Shimizu 890ddd
		else if (keyFrame.m_type == TDoubleKeyframe::EaseInOutPercentage && !m_isPercentage) {
Toshihiro Shimizu 890ddd
			// percentage -> absolute
Toshihiro Shimizu 890ddd
			ease0 = keyFrame.m_speedOut.x * 0.01 * (double)segmentLength;
Toshihiro Shimizu 890ddd
			ease1 = -nextKeyFrame.m_speedIn.x * 0.01 * (double)segmentLength;
Toshihiro Shimizu 890ddd
			ease0 = tcrop(ease0, 0.0, (double)segmentLength);
Toshihiro Shimizu 890ddd
			ease1 = tcrop(ease1, 0.0, (double)segmentLength - ease0);
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			ease1 = ease0 = ((m_isPercentage) ? 1.0 : (double)segmentLength) / 3.0;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (!m_isPercentage) {
Toshihiro Shimizu 890ddd
			ease0 = floor(ease0 + 0.5);
Toshihiro Shimizu 890ddd
			ease1 = floor(ease1 + 0.5);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		m_ease0Fld->setValue(ease0);
Toshihiro Shimizu 890ddd
		m_ease1Fld->setValue(ease1);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		double value = ((m_isPercentage) ? 1.0 : (double)segmentLength) / 3.0;
Toshihiro Shimizu 890ddd
		if (!m_isPercentage)
Toshihiro Shimizu 890ddd
			value = floor(value + 0.5);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_ease0Fld->setValue(value);
Toshihiro Shimizu 890ddd
		m_ease1Fld->setValue(value);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void EaseInOutSegmentPage::getGuiValues(TPointD &easeIn, TPointD &easeOut)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	easeOut.x = m_ease0Fld->getValue() * m_fieldScale;
Toshihiro Shimizu 890ddd
	easeOut.y = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	easeIn.x = -m_ease1Fld->getValue() * m_fieldScale;
Toshihiro Shimizu 890ddd
	easeIn.y = 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FunctionExpressionSegmentPage::FunctionExpressionSegmentPage(FunctionSegmentViewer *parent)
Toshihiro Shimizu 890ddd
	: FunctionSegmentPage(parent)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_expressionFld = new DVGui::ExpressionField();
Toshihiro Shimizu 890ddd
	m_expressionFld->setFixedHeight(21);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QLabel *unitLabel = new QLabel(tr("Unit:"));
Toshihiro Shimizu 890ddd
	unitLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_unitFld = createField();
Toshihiro Shimizu 890ddd
	m_unitFld->setFixedWidth(40);
Toshihiro Shimizu 890ddd
	m_unitFld->setText("inch");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//---- layout
Toshihiro Shimizu 890ddd
	QVBoxLayout *mainLayout = new QVBoxLayout();
Toshihiro Shimizu 890ddd
	mainLayout->setSpacing(2);
Toshihiro Shimizu 890ddd
	mainLayout->setMargin(2);
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		mainLayout->addSpacing(3);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(new QLabel(tr("Expression:")));
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_expressionFld);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		mainLayout->addSpacing(3);
Toshihiro Shimizu 890ddd
		QHBoxLayout *unitLay = new QHBoxLayout();
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			unitLay->addWidget(unitLabel);
Toshihiro Shimizu 890ddd
			unitLay->addWidget(m_unitFld);
Toshihiro Shimizu 890ddd
			unitLay->addStretch();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		mainLayout->addLayout(unitLay);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setLayout(mainLayout);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FunctionExpressionSegmentPage::refresh()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	if (!curve) {
Toshihiro Shimizu 890ddd
		m_expressionFld->setGrammar(0);
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDoubleKeyframe kf0 = curve->getKeyframeAt(getR0());
Shinya Kitaoka 3bfa54
	std::string expression = kf0.m_expressionText;
Toshihiro Shimizu 890ddd
	bool oldBlockSignalsStatus = m_expressionFld->blockSignals(true);
Toshihiro Shimizu 890ddd
	m_expressionFld->setGrammar(curve->getGrammar());
Toshihiro Shimizu 890ddd
	m_expressionFld->setExpression(expression);
Toshihiro Shimizu 890ddd
	m_expressionFld->blockSignals(oldBlockSignalsStatus);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::wstring unitName = toWideString(kf0.m_unitName);
Toshihiro Shimizu 890ddd
	if (unitName == L"" && curve->getMeasure())
Toshihiro Shimizu 890ddd
		unitName = curve->getMeasure()->getCurrentUnit()->getDefaultExtension();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	oldBlockSignalsStatus = m_unitFld->blockSignals(true);
Toshihiro Shimizu 890ddd
	m_unitFld->setText(QString::fromStdWString(unitName));
Toshihiro Shimizu 890ddd
	m_unitFld->blockSignals(oldBlockSignalsStatus);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FunctionExpressionSegmentPage::init(int segmentLength)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	if (!curve) {
Toshihiro Shimizu 890ddd
		m_expressionFld->setGrammar(0);
Toshihiro Shimizu 890ddd
		m_expressionFld->setEnabled(false);
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_expressionFld->setEnabled(true);
Toshihiro Shimizu 890ddd
	m_expressionFld->setGrammar(curve->getGrammar());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int kIndex = getViewer()->getSegmentIndex();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--- すでにあるカーブをExpressionに切り替えた場合 ---*/
Toshihiro Shimizu 890ddd
	if (kIndex >= 0) {
Toshihiro Shimizu 890ddd
		TDoubleKeyframe keyFrame = curve->getKeyframe(kIndex);
Toshihiro Shimizu 890ddd
		double value = curve->getValue(keyFrame.m_frame);
Toshihiro Shimizu 890ddd
		const TUnit *unit = 0;
Toshihiro Shimizu 890ddd
		if (curve->getMeasure())
Toshihiro Shimizu 890ddd
			unit = curve->getMeasure()->getCurrentUnit();
Toshihiro Shimizu 890ddd
		if (unit)
Toshihiro Shimizu 890ddd
			value = unit->convertTo(value);
Toshihiro Shimizu 890ddd
		m_expressionFld->setExpression(QString::number(value).toStdString());
Toshihiro Shimizu 890ddd
		/*--- unitがある場合だけUnitを表示 ---*/
Toshihiro Shimizu 890ddd
		if (unit)
Toshihiro Shimizu 890ddd
			m_unitFld->setText(QString::fromStdWString(unit->getDefaultExtension()));
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			m_unitFld->setText("");
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		m_expressionFld->setExpression("0");
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
		std::wstring unitName = L"inch";
Toshihiro Shimizu 890ddd
		if (curve->getMeasure())
Toshihiro Shimizu 890ddd
			unitName = curve->getMeasure()->getCurrentUnit()->getDefaultExtension();
Toshihiro Shimizu 890ddd
		m_unitFld->setText(QString::fromStdWString(unitName));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FunctionExpressionSegmentPage::apply()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	if (!curve)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int kIndex = getViewer()->getSegmentIndex();
Toshihiro Shimizu 890ddd
	if (kIndex < 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::string expressionText = m_expressionFld->getExpression();
Toshihiro Shimizu 890ddd
	TExpression expr;
Toshihiro Shimizu 890ddd
	expr.setGrammar(curve->getGrammar());
Toshihiro Shimizu 890ddd
	expr.setText(expressionText);
Toshihiro Shimizu 890ddd
	if (dependsOn(expr, curve)) {
Shinya Kitaoka eabf18
		DVGui::warning(tr("There is a circular reference in the definition of the interpolation."));
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::string unitName = m_unitFld->text().toStdString();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	KeyframeSetter setter(curve, kIndex);
Toshihiro Shimizu 890ddd
	setter.setExpression(m_expressionFld->getExpression());
Toshihiro Shimizu 890ddd
	setter.setUnitName(unitName);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  
Toshihiro Shimizu 890ddd
  TDoubleKeyframe kf0 = curve->getKeyframeAt(getR0());
Toshihiro Shimizu 890ddd
  kf0.m_expressionText = m_expressionFld->getExpression();
Toshihiro Shimizu 890ddd
  kf0.m_unitName = m_unitFld->text().toStdString();
Toshihiro Shimizu 890ddd
  curve->setKeyframe(kf0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  wstring unitExtension = m_unitFld->text().toStdWString();
Toshihiro Shimizu 890ddd
  TMeasure *curveMeasure = curve->getMeasure();
Toshihiro Shimizu 890ddd
  if(curveMeasure)
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    TUnit *unit = curveMeasure->getUnit(unitExtension);
Toshihiro Shimizu 890ddd
    if(unit)
Toshihiro Shimizu 890ddd
      curveMeasure->setCurrentUnit(unit);
Toshihiro Shimizu 890ddd
    else
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
      unitExtension = curveMeasure->getCurrentUnit()->getDefaultExtension();
Toshihiro Shimizu 890ddd
      m_unitFld->setText(QString::fromStdWString(unitExtension));
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  else
Toshihiro Shimizu 890ddd
    m_unitFld->setText("");
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! return false if a circular reference is occured
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
bool FunctionExpressionSegmentPage::getGuiValues(std::string &expressionText,
Toshihiro Shimizu 890ddd
												 std::string &unitName)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	expressionText = m_expressionFld->getExpression();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//checking a circular reference
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	TExpression expr;
Toshihiro Shimizu 890ddd
	expr.setGrammar(curve->getGrammar());
Toshihiro Shimizu 890ddd
	expr.setText(expressionText);
Toshihiro Shimizu 890ddd
	if (dependsOn(expr, curve)) {
Shinya Kitaoka eabf18
		DVGui::warning(tr("There is a circular reference in the definition of the interpolation."));
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	unitName = m_unitFld->text().toStdString();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_expressionFld->hasFocus())
Toshihiro Shimizu 890ddd
		m_expressionFld->clearFocus();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FileSegmentPage : public FunctionSegmentPage
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	DVGui::FileField *m_fileFld;
Toshihiro Shimizu 890ddd
	LineEdit *m_fieldIndexFld;
Toshihiro Shimizu 890ddd
	LineEdit *m_measureFld;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	FileSegmentPage(FunctionSegmentViewer *parent = 0) : FunctionSegmentPage(parent)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_fileFld = new DVGui::FileField(this);
Toshihiro Shimizu 890ddd
		m_fileFld->setFileMode(QFileDialog::ExistingFile);
Toshihiro Shimizu 890ddd
		QStringList filters;
Toshihiro Shimizu 890ddd
		filters.append("dat");
Toshihiro Shimizu 890ddd
		filters.append("txt");
Toshihiro Shimizu 890ddd
		m_fileFld->setFilters(filters);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_fieldIndexFld = new LineEdit(this);
Toshihiro Shimizu 890ddd
		QIntValidator *intValidator = new QIntValidator(1, 100, this);
Toshihiro Shimizu 890ddd
		m_fieldIndexFld->setValidator(intValidator);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_measureFld = new LineEdit(this);
Toshihiro Shimizu 890ddd
		m_measureFld->setText("inch");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//----layout
Toshihiro Shimizu 890ddd
		QVBoxLayout *mainLayout = new QVBoxLayout();
Toshihiro Shimizu 890ddd
		mainLayout->setSpacing(5);
Toshihiro Shimizu 890ddd
		mainLayout->setMargin(2);
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			mainLayout->addWidget(new QLabel(tr("File Path:")), 0);
Toshihiro Shimizu 890ddd
			mainLayout->addWidget(m_fileFld);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			QGridLayout *bottomLay = new QGridLayout();
Toshihiro Shimizu 890ddd
			bottomLay->setSpacing(5);
Toshihiro Shimizu 890ddd
			bottomLay->setMargin(0);
Toshihiro Shimizu 890ddd
			{
Toshihiro Shimizu 890ddd
				bottomLay->addWidget(new QLabel(tr("Column:")), 0, 0, Qt::AlignRight | Qt::AlignVCenter);
Toshihiro Shimizu 890ddd
				bottomLay->addWidget(m_fieldIndexFld, 0, 1);
Toshihiro Shimizu 890ddd
				bottomLay->addWidget(new QLabel(tr("Unit:")), 1, 0, Qt::AlignRight | Qt::AlignVCenter);
Toshihiro Shimizu 890ddd
				bottomLay->addWidget(m_measureFld, 1, 1);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			bottomLay->setColumnStretch(0, 0);
Toshihiro Shimizu 890ddd
			bottomLay->setColumnStretch(1, 1);
Toshihiro Shimizu 890ddd
			mainLayout->addLayout(bottomLay);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		setLayout(mainLayout);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void refresh()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TDoubleKeyframe kf;
Toshihiro Shimizu 890ddd
		TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
		if (curve)
Toshihiro Shimizu 890ddd
			kf = curve->getKeyframeAt(getR0());
Toshihiro Shimizu 890ddd
		if (curve && kf.m_isKeyframe) {
Toshihiro Shimizu 890ddd
			TFilePath path;
Toshihiro Shimizu 890ddd
			int fieldIndex = 0;
Shinya Kitaoka 3bfa54
			std::string unitName = "";
Toshihiro Shimizu 890ddd
			if (kf.m_type == TDoubleKeyframe::File) {
Toshihiro Shimizu 890ddd
				path = kf.m_fileParams.m_path;
Toshihiro Shimizu 890ddd
				fieldIndex = kf.m_fileParams.m_fieldIndex;
Toshihiro Shimizu 890ddd
				if (fieldIndex < 0)
Toshihiro Shimizu 890ddd
					fieldIndex = 0;
Toshihiro Shimizu 890ddd
				unitName = kf.m_unitName;
Toshihiro Shimizu 890ddd
				if (unitName == "") {
Toshihiro Shimizu 890ddd
					TMeasure *measure = curve->getMeasure();
Toshihiro Shimizu 890ddd
					if (measure) {
Toshihiro Shimizu 890ddd
						const TUnit *unit = measure->getCurrentUnit();
Toshihiro Shimizu 890ddd
						if (unit)
Toshihiro Shimizu 890ddd
							unitName = toString(unit->getDefaultExtension());
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			m_fileFld->setPath(QString::fromStdWString(path.getWideString()));
Toshihiro Shimizu 890ddd
			m_fieldIndexFld->setText(QString::number(fieldIndex + 1));
Toshihiro Shimizu 890ddd
			m_measureFld->setText(QString::fromStdString(unitName));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void init(int segmentLength)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
		if (!curve)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TMeasure *measure = curve->getMeasure();
Shinya Kitaoka 3bfa54
		std::string unitName = "";
Toshihiro Shimizu 890ddd
		if (measure) {
Toshihiro Shimizu 890ddd
			const TUnit *unit = measure->getCurrentUnit();
Toshihiro Shimizu 890ddd
			if (unit)
Toshihiro Shimizu 890ddd
				unitName = toString(unit->getDefaultExtension());
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		m_measureFld->setText(QString::fromStdString(unitName));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_fileFld->setPath("");
Toshihiro Shimizu 890ddd
		m_fieldIndexFld->setText("");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void apply()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
		if (!curve)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		int kIndex = getViewer()->getSegmentIndex();
Toshihiro Shimizu 890ddd
		if (kIndex < 0)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QString stringPath = m_fileFld->getPath();
Toshihiro Shimizu 890ddd
		if (stringPath == "")
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		stringPath.replace("\\", "\\\\");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TDoubleKeyframe::FileParams fileParams;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		fileParams.m_path = TFilePath(stringPath.toStdWString());
Toshihiro Shimizu 890ddd
		fileParams.m_fieldIndex = qMax(0, m_fieldIndexFld->text().toInt() - 1);
Shinya Kitaoka 3bfa54
		std::string unitName = m_measureFld->text().toStdString();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		KeyframeSetter setter(curve, kIndex);
Toshihiro Shimizu 890ddd
		setter.setFile(fileParams);
Toshihiro Shimizu 890ddd
		setter.setUnitName(unitName);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void getGuiValues(TDoubleKeyframe::FileParams &fileParam, std::string &unitName)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		QString stringPath = m_fileFld->getPath();
Toshihiro Shimizu 890ddd
		stringPath.replace("\\", "\\\\");
Toshihiro Shimizu 890ddd
		fileParam.m_path = TFilePath(stringPath.toStdWString());
Toshihiro Shimizu 890ddd
		fileParam.m_fieldIndex = qMax(0, m_fieldIndexFld->text().toInt() - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		unitName = m_measureFld->text().toStdString();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
SimilarShapeSegmentPage::SimilarShapeSegmentPage(FunctionSegmentViewer *parent)
Toshihiro Shimizu 890ddd
	: FunctionSegmentPage(parent)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_expressionFld = new DVGui::ExpressionField();
Toshihiro Shimizu 890ddd
	m_offsetFld = createField();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----layout
Toshihiro Shimizu 890ddd
	QVBoxLayout *mainLayout = new QVBoxLayout();
Toshihiro Shimizu 890ddd
	mainLayout->setSpacing(2);
Toshihiro Shimizu 890ddd
	mainLayout->setMargin(2);
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		mainLayout->addSpacing(3);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(new QLabel(tr("Reference Curve:")));
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_expressionFld);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		mainLayout->addSpacing(3);
Toshihiro Shimizu 890ddd
		QHBoxLayout *offLay = new QHBoxLayout();
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			offLay->addWidget(new QLabel(tr("Frame Offset:")));
Toshihiro Shimizu 890ddd
			offLay->addWidget(m_offsetFld);
Toshihiro Shimizu 890ddd
			offLay->addStretch();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		mainLayout->addLayout(offLay);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	setLayout(mainLayout);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SimilarShapeSegmentPage::refresh()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	if (!curve) {
Toshihiro Shimizu 890ddd
		m_expressionFld->setGrammar(0);
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDoubleKeyframe kf0 = curve->getKeyframeAt(getR0());
Shinya Kitaoka 3bfa54
	std::string expression = kf0.m_expressionText;
Toshihiro Shimizu 890ddd
	bool oldBlockSignalsStatus = m_expressionFld->blockSignals(true);
Toshihiro Shimizu 890ddd
	m_expressionFld->setGrammar(curve->getGrammar());
Toshihiro Shimizu 890ddd
	m_expressionFld->setExpression(expression);
Toshihiro Shimizu 890ddd
	m_expressionFld->blockSignals(oldBlockSignalsStatus);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_offsetFld->setText(QString::number(kf0.m_similarShapeOffset, 'f', 0));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SimilarShapeSegmentPage::init(int segmentLength)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	if (!curve) {
Toshihiro Shimizu 890ddd
		m_expressionFld->setGrammar(0);
Toshihiro Shimizu 890ddd
		m_expressionFld->setEnabled(false);
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_expressionFld->setEnabled(true);
Toshihiro Shimizu 890ddd
	TDoubleKeyframe kf0 = curve->getKeyframeAt(getR0());
Shinya Kitaoka 3bfa54
	std::string expression = kf0.m_expressionText;
Toshihiro Shimizu 890ddd
	bool oldBlockSignalsStatus = m_expressionFld->blockSignals(true);
Toshihiro Shimizu 890ddd
	m_expressionFld->setGrammar(curve->getGrammar());
Toshihiro Shimizu 890ddd
	m_expressionFld->setExpression(expression);
Toshihiro Shimizu 890ddd
	m_expressionFld->blockSignals(oldBlockSignalsStatus);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_offsetFld->setText(QString::number(kf0.m_similarShapeOffset, 'f', 0));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SimilarShapeSegmentPage::apply()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDoubleParam *curve = getCurve();
Toshihiro Shimizu 890ddd
	if (!curve)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	int kIndex = getViewer()->getSegmentIndex();
Toshihiro Shimizu 890ddd
	if (kIndex < 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::string expressionText = m_expressionFld->getExpression();
Toshihiro Shimizu 890ddd
	TExpression expr;
Toshihiro Shimizu 890ddd
	expr.setGrammar(curve->getGrammar());
Toshihiro Shimizu 890ddd
	expr.setText(expressionText);
Toshihiro Shimizu 890ddd
	if (!expr.isValid()) {
Shinya Kitaoka eabf18
		DVGui::warning(tr("There is a syntax error in the definition of the interpolation."));
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (dependsOn(expr, curve)) {
Shinya Kitaoka eabf18
		DVGui::warning(tr("There is a circular reference in the definition of the interpolation."));
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	KeyframeSetter setter(curve, kIndex);
Toshihiro Shimizu 890ddd
	setter.setSimilarShape(m_expressionFld->getExpression(), m_offsetFld->text().toDouble());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void SimilarShapeSegmentPage::getGuiValues(std::string &expressionText,
Toshihiro Shimizu 890ddd
										   double &similarShapeOffset)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	expressionText = m_expressionFld->getExpression();
Toshihiro Shimizu 890ddd
	similarShapeOffset = m_offsetFld->text().toDouble();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FunctionSegmentViewer::FunctionSegmentViewer(QWidget *parent, FunctionSheet *sheet, FunctionPanel *panel)
Toshihiro Shimizu 890ddd
	: QFrame(parent), m_curve(0), m_r0(0), m_r1(0), m_sheet(sheet), m_xshHandle(0), m_panel(panel)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setObjectName("FunctionSegmentViewer");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_pages[0] = new FunctionEmptySegmentPage(this);
Toshihiro Shimizu 890ddd
	m_pages[1] = new SpeedInOutSegmentPage(this);
Toshihiro Shimizu 890ddd
	m_pages[2] = new EaseInOutSegmentPage(false, this);
Toshihiro Shimizu 890ddd
	m_pages[3] = new EaseInOutSegmentPage(true, this);
Toshihiro Shimizu 890ddd
	m_pages[4] = new FunctionEmptySegmentPage(this);
Toshihiro Shimizu 890ddd
	m_pages[5] = new FunctionExpressionSegmentPage(this);
Toshihiro Shimizu 890ddd
	m_pages[6] = new FileSegmentPage(this);
Toshihiro Shimizu 890ddd
	m_pages[7] = new FunctionEmptySegmentPage(this);
Toshihiro Shimizu 890ddd
	m_pages[8] = new SimilarShapeSegmentPage(this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_typeId[0] = TDoubleKeyframe::Linear;
Toshihiro Shimizu 890ddd
	m_typeId[1] = TDoubleKeyframe::SpeedInOut;
Toshihiro Shimizu 890ddd
	m_typeId[2] = TDoubleKeyframe::EaseInOut;
Toshihiro Shimizu 890ddd
	m_typeId[3] = TDoubleKeyframe::EaseInOutPercentage;
Toshihiro Shimizu 890ddd
	m_typeId[4] = TDoubleKeyframe::Exponential;
Toshihiro Shimizu 890ddd
	m_typeId[5] = TDoubleKeyframe::Expression;
Toshihiro Shimizu 890ddd
	m_typeId[6] = TDoubleKeyframe::File;
Toshihiro Shimizu 890ddd
	m_typeId[7] = TDoubleKeyframe::Constant;
Toshihiro Shimizu 890ddd
	m_typeId[8] = TDoubleKeyframe::SimilarShape;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_typeCombo = new QComboBox;
Toshihiro Shimizu 890ddd
	m_typeCombo->addItem(tr("Linear"));
Toshihiro Shimizu 890ddd
	m_typeCombo->addItem(tr("Speed In / Speed Out"));
Toshihiro Shimizu 890ddd
	m_typeCombo->addItem(tr("Ease In / Ease Out"));
Toshihiro Shimizu 890ddd
	m_typeCombo->addItem(tr("Ease In / Ease Out %"));
Toshihiro Shimizu 890ddd
	m_typeCombo->addItem(tr("Exponential"));
Toshihiro Shimizu 890ddd
	m_typeCombo->addItem(tr("Expression"));
Toshihiro Shimizu 890ddd
	m_typeCombo->addItem(tr("File"));
Toshihiro Shimizu 890ddd
	m_typeCombo->addItem(tr("Constant"));
Toshihiro Shimizu 890ddd
	m_typeCombo->addItem(tr("Similar Shape"));
Toshihiro Shimizu 890ddd
	m_typeCombo->setCurrentIndex(7);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//---- common interfaces
Toshihiro Shimizu 890ddd
	m_fromFld = new QLineEdit(this);
Toshihiro Shimizu 890ddd
	m_toFld = new QLineEdit(this);
Toshihiro Shimizu 890ddd
	m_paramNameLabel = new QLabel("", this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QLabel *typeLabel = new QLabel(tr("Interpolation:"));
Toshihiro Shimizu 890ddd
	typeLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
Toshihiro Shimizu 890ddd
	m_stepFld = new LineEdit();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// bottom part: stacked widget
Toshihiro Shimizu 890ddd
	m_parametersPanel = new QStackedWidget;
Toshihiro Shimizu 890ddd
	m_parametersPanel->setObjectName("FunctionParametersPanel");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < tArrayCount(m_pages); i++)
Toshihiro Shimizu 890ddd
		m_parametersPanel->addWidget(m_pages[i]);
Toshihiro Shimizu 890ddd
	m_parametersPanel->setCurrentIndex(0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//buttons
Toshihiro Shimizu 890ddd
	QPushButton *applyButton = new QPushButton(tr("Apply"), this);
Toshihiro Shimizu 890ddd
	m_prevCurveButton = new QPushButton(this);
Toshihiro Shimizu 890ddd
	m_nextCurveButton = new QPushButton(this);
Toshihiro Shimizu 890ddd
	m_prevLinkButton = new QPushButton(this);
Toshihiro Shimizu 890ddd
	m_nextLinkButton = new QPushButton(this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//-----
Toshihiro Shimizu 890ddd
	QIntValidator *intValidator = new QIntValidator(1, 100, this);
Toshihiro Shimizu 890ddd
	m_stepFld->setValidator(intValidator);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QIntValidator *validator = new QIntValidator(this);
Toshihiro Shimizu 890ddd
	validator->setBottom(1);
Toshihiro Shimizu 890ddd
	m_fromFld->setValidator(validator);
Toshihiro Shimizu 890ddd
	m_toFld->setValidator(validator);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_stepFld->setEnabled(true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	applyButton->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_stepFld->setText("1");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_prevCurveButton->setFixedSize(50, 15);
Toshihiro Shimizu 890ddd
	m_nextCurveButton->setFixedSize(50, 15);
Toshihiro Shimizu 890ddd
	m_prevCurveButton->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
	m_nextCurveButton->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
	m_prevCurveButton->setStyleSheet("padding:0px;");
Toshihiro Shimizu 890ddd
	m_nextCurveButton->setStyleSheet("padding:0px;");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_prevLinkButton->setFixedSize(15, 15);
Toshihiro Shimizu 890ddd
	m_nextLinkButton->setFixedSize(15, 15);
Toshihiro Shimizu 890ddd
	m_prevLinkButton->setCheckable(true);
Toshihiro Shimizu 890ddd
	m_nextLinkButton->setCheckable(true);
Toshihiro Shimizu 890ddd
	m_prevLinkButton->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
	m_nextLinkButton->setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
	m_prevLinkButton->setObjectName("FunctionSegmentViewerLinkButton");
Toshihiro Shimizu 890ddd
	m_nextLinkButton->setObjectName("FunctionSegmentViewerLinkButton");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//---- layout
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QVBoxLayout *mainLayout = new QVBoxLayout();
Toshihiro Shimizu 890ddd
	mainLayout->setSpacing(5);
Toshihiro Shimizu 890ddd
	mainLayout->setMargin(5);
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_topbar = new QWidget();
Toshihiro Shimizu 890ddd
		QVBoxLayout *topbarLayout = new QVBoxLayout();
Toshihiro Shimizu 890ddd
		topbarLayout->setSpacing(5);
Toshihiro Shimizu 890ddd
		topbarLayout->setMargin(0);
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			topbarLayout->addWidget(m_paramNameLabel);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			QHBoxLayout *upperLay = new QHBoxLayout();
Toshihiro Shimizu 890ddd
			upperLay->setSpacing(3);
Toshihiro Shimizu 890ddd
			upperLay->setMargin(0);
Toshihiro Shimizu 890ddd
			{
Toshihiro Shimizu 890ddd
				upperLay->addWidget(new QLabel("From", this), 0);
Toshihiro Shimizu 890ddd
				upperLay->addWidget(m_fromFld, 1);
Toshihiro Shimizu 890ddd
				upperLay->addSpacing(3);
Toshihiro Shimizu 890ddd
				upperLay->addWidget(new QLabel("To", this), 0);
Toshihiro Shimizu 890ddd
				upperLay->addWidget(m_toFld, 1);
Toshihiro Shimizu 890ddd
				upperLay->addSpacing(5);
Toshihiro Shimizu 890ddd
				upperLay->addWidget(new QLabel("Step", this), 0);
Toshihiro Shimizu 890ddd
				upperLay->addWidget(m_stepFld, 1);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			topbarLayout->addLayout(upperLay, 0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			QHBoxLayout *bottomLay = new QHBoxLayout();
Toshihiro Shimizu 890ddd
			bottomLay->setSpacing(3);
Toshihiro Shimizu 890ddd
			bottomLay->setMargin(0);
Toshihiro Shimizu 890ddd
			{
Toshihiro Shimizu 890ddd
				bottomLay->addWidget(typeLabel, 0);
Toshihiro Shimizu 890ddd
				bottomLay->addWidget(m_typeCombo, 1);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			topbarLayout->addLayout(bottomLay, 0);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		// end topbar
Toshihiro Shimizu 890ddd
		m_topbar->setLayout(topbarLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_topbar, 0);
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(m_parametersPanel, 0);
Toshihiro Shimizu 890ddd
		mainLayout->addStretch(1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		mainLayout->addWidget(applyButton);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QHBoxLayout *moveLay = new QHBoxLayout();
Toshihiro Shimizu 890ddd
		moveLay->setMargin(0);
Toshihiro Shimizu 890ddd
		moveLay->setSpacing(0);
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			moveLay->addWidget(m_prevCurveButton, 0);
Toshihiro Shimizu 890ddd
			moveLay->addWidget(m_prevLinkButton, 0);
Toshihiro Shimizu 890ddd
			moveLay->addStretch(1);
Toshihiro Shimizu 890ddd
			moveLay->addWidget(m_nextLinkButton, 0);
Toshihiro Shimizu 890ddd
			moveLay->addWidget(m_nextCurveButton, 0);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		mainLayout->addLayout(moveLay, 0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	setLayout(mainLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//---- signal-slot connections
Toshihiro Shimizu 890ddd
	bool ret = true;
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_typeCombo, SIGNAL(currentIndexChanged(int)), m_parametersPanel, SLOT(setCurrentIndex(int)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_typeCombo, SIGNAL(activated(int)), this, SLOT(onSegmentTypeChanged(int)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(applyButton, SIGNAL(clicked()), this, SLOT(onApplyButtonPressed()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_prevCurveButton, SIGNAL(clicked()), this, SLOT(onPrevCurveButtonPressed()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_nextCurveButton, SIGNAL(clicked()), this, SLOT(onNextCurveButtonPressed()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_prevLinkButton, SIGNAL(clicked()), this, SLOT(onPrevLinkButtonPressed()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_nextLinkButton, SIGNAL(clicked()), this, SLOT(onNextLinkButtonPressed()));
Toshihiro Shimizu 890ddd
	assert(ret);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_sheet = sheet;
Toshihiro Shimizu 890ddd
	refresh();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FunctionSegmentViewer::~FunctionSegmentViewer()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_curve)
Toshihiro Shimizu 890ddd
		m_curve->release();
Toshihiro Shimizu 890ddd
	m_curve = 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FunctionSegmentViewer::setSegment(TDoubleParam *curve, int segmentIndex)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (curve != m_curve) {
Toshihiro Shimizu 890ddd
		if (m_curve) {
Toshihiro Shimizu 890ddd
			m_curve->removeObserver(this);
Toshihiro Shimizu 890ddd
			m_curve->release();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		m_curve = curve;
Toshihiro Shimizu 890ddd
		if (m_curve) {
Toshihiro Shimizu 890ddd
			m_curve->addRef();
Toshihiro Shimizu 890ddd
			m_curve->addObserver(this);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	m_segmentIndex = segmentIndex;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	refresh();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FunctionSegmentViewer::setSegmentByFrame(TDoubleParam *curve, int frame)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	bool curveSwitched = false;
Toshihiro Shimizu 890ddd
	if (curve != m_curve) {
Toshihiro Shimizu 890ddd
		curveSwitched = true;
Toshihiro Shimizu 890ddd
		if (m_curve) {
Toshihiro Shimizu 890ddd
			m_curve->removeObserver(this);
Toshihiro Shimizu 890ddd
			m_curve->release();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		m_curve = curve;
Toshihiro Shimizu 890ddd
		if (m_curve) {
Toshihiro Shimizu 890ddd
			m_curve->addRef();
Toshihiro Shimizu 890ddd
			m_curve->addObserver(this);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	bool segmentSwitched = false;
Toshihiro Shimizu 890ddd
	if (m_curve && (curveSwitched || frame < m_r0 || frame > m_r1)) {
Toshihiro Shimizu 890ddd
		int segmentIndex = -1;
Toshihiro Shimizu 890ddd
		if (m_curve->isKeyframe(frame)) {
Toshihiro Shimizu 890ddd
			int k1 = m_curve->getNextKeyframe(frame);
Toshihiro Shimizu 890ddd
			if (k1 >= 1)
Toshihiro Shimizu 890ddd
				segmentIndex = k1 - 1;
Toshihiro Shimizu 890ddd
			else {
Toshihiro Shimizu 890ddd
				int k0 = m_curve->getPrevKeyframe(frame);
Toshihiro Shimizu 890ddd
				if (k0 >= 0)
Toshihiro Shimizu 890ddd
					segmentIndex = k0;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			segmentIndex = m_curve->getPrevKeyframe(frame);
Toshihiro Shimizu 890ddd
			if (m_curve->getNextKeyframe(frame) < 0)
Toshihiro Shimizu 890ddd
				segmentIndex = -1;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		if (m_segmentIndex != segmentIndex) {
Toshihiro Shimizu 890ddd
			m_segmentIndex = segmentIndex;
Toshihiro Shimizu 890ddd
			segmentSwitched = true;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (curveSwitched || segmentSwitched)
Toshihiro Shimizu 890ddd
		refresh();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FunctionSegmentViewer::refresh()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_sheet->isVisible()) {
Toshihiro Shimizu 890ddd
		m_paramNameLabel->setText(
Toshihiro Shimizu 890ddd
			m_sheet->getSelectedParamName());
Toshihiro Shimizu 890ddd
		if (m_sheet->getSelectedParamName().isEmpty()) {
Toshihiro Shimizu 890ddd
			m_curve = 0;
Toshihiro Shimizu 890ddd
			m_segmentIndex = -1;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		m_paramNameLabel->setText("");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_curve && (m_segmentIndex < 0 || m_segmentIndex + 1 >= m_curve->getKeyframeCount()))
Toshihiro Shimizu 890ddd
		m_segmentIndex = -1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_prevCurveButton->setEnabled(false);
Toshihiro Shimizu 890ddd
	m_prevLinkButton->setEnabled(false);
Toshihiro Shimizu 890ddd
	m_prevCurveButton->setText(" --- ");
Toshihiro Shimizu 890ddd
	m_prevLinkButton->setChecked(false);
Toshihiro Shimizu 890ddd
	m_nextCurveButton->setEnabled(false);
Toshihiro Shimizu 890ddd
	m_nextLinkButton->setEnabled(false);
Toshihiro Shimizu 890ddd
	m_nextCurveButton->setText(" --- ");
Toshihiro Shimizu 890ddd
	m_nextLinkButton->setChecked(false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// if some segment is selected
Toshihiro Shimizu 890ddd
	if (m_curve && m_segmentIndex >= 0) {
Toshihiro Shimizu 890ddd
		m_topbar->show();
Toshihiro Shimizu 890ddd
		// m_parametersPanel->show();
Toshihiro Shimizu 890ddd
		m_r0 = m_curve->keyframeIndexToFrame(m_segmentIndex);
Toshihiro Shimizu 890ddd
		m_r1 = m_curve->keyframeIndexToFrame(m_segmentIndex + 1);
Toshihiro Shimizu 890ddd
		m_fromFld->setText(QString::number(m_r0 + 1));
Toshihiro Shimizu 890ddd
		m_toFld->setText(QString::number(m_r1 + 1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TDoubleKeyframe kf = m_curve->getKeyframeAt(m_r0);
Toshihiro Shimizu 890ddd
		int pageIndex = typeToIndex(kf.m_type);
shun_iwasawa 9f8808
		m_typeCombo->setEnabled(true);
Toshihiro Shimizu 890ddd
		m_typeCombo->setCurrentIndex(pageIndex);
Toshihiro Shimizu 890ddd
		if (0 <= pageIndex && pageIndex < tArrayCount(m_pages)) {
Toshihiro Shimizu 890ddd
			m_parametersPanel->setCurrentIndex(pageIndex);
Toshihiro Shimizu 890ddd
			m_pages[pageIndex]->refresh();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		m_stepFld->setText(QString::number(kf.m_step));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		/*--- 前後のキーフレームの表示を更新 ---*/
Toshihiro Shimizu 890ddd
		//Prev
Toshihiro Shimizu 890ddd
		if (m_segmentIndex != 0) {
Toshihiro Shimizu 890ddd
			TDoubleKeyframe prevKf = m_curve->getKeyframe(m_segmentIndex - 1);
Toshihiro Shimizu 890ddd
			m_prevCurveButton->setEnabled(true);
Toshihiro Shimizu 890ddd
			m_prevLinkButton->setEnabled(true);
Toshihiro Shimizu 890ddd
			m_prevCurveButton->setText(tr("< ") + typeToString(prevKf.m_type));
Toshihiro Shimizu 890ddd
			m_prevLinkButton->setChecked(kf.m_linkedHandles);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		//Next
Toshihiro Shimizu 890ddd
		if (m_curve->getKeyframeCount() - 2 != m_segmentIndex) {
Toshihiro Shimizu 890ddd
			TDoubleKeyframe nextKf = m_curve->getKeyframe(m_segmentIndex + 1);
Toshihiro Shimizu 890ddd
			m_nextCurveButton->setEnabled(true);
Toshihiro Shimizu 890ddd
			m_nextLinkButton->setEnabled(true);
Toshihiro Shimizu 890ddd
			m_nextCurveButton->setText(typeToString(nextKf.m_type) + tr(" >"));
Toshihiro Shimizu 890ddd
			m_nextLinkButton->setChecked(nextKf.m_linkedHandles);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	/* ---
Toshihiro Shimizu 890ddd
  Segmentが選ばれていない場合
Toshihiro Shimizu 890ddd
  既にキーフレームが有る場合は、選択範囲上下どちらかと最近傍のキーフレームでSegmentを作る
Toshihiro Shimizu 890ddd
  キーフレームが無い場合は、選択範囲を入力
Toshihiro Shimizu 890ddd
  ただし選択範囲が1フレームのときは、そのフレームから15フレームの範囲で入力
Toshihiro Shimizu 890ddd
  ---*/
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		m_stepFld->setText("1");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_parametersPanel->setCurrentIndex(0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_typeCombo->setCurrentIndex(7);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_r0 = m_r1 = -1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QRect selectedCells = m_sheet->getSelectedCells();
Toshihiro Shimizu 890ddd
		/*--- 選択範囲が空のとき、もしくはカーブが選ばれていないとき ---*/
Toshihiro Shimizu 890ddd
		if (selectedCells.isEmpty() || !m_curve) {
shun_iwasawa 9f8808
			m_typeCombo->setEnabled(false);
Toshihiro Shimizu 890ddd
			m_fromFld->setText("");
Toshihiro Shimizu 890ddd
			m_toFld->setText("");
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		/*--- 何かカーブが選択されている ---*/
Toshihiro Shimizu 890ddd
		else {
shun_iwasawa 9f8808
			m_typeCombo->setEnabled(true);
Toshihiro Shimizu 890ddd
			int s0 = selectedCells.top();
Toshihiro Shimizu 890ddd
			int s1 = selectedCells.bottom();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			/*--- セグメントの上側が選択されているとき ---*/
Toshihiro Shimizu 890ddd
			int next = m_curve->getNextKeyframe(s0);
Toshihiro Shimizu 890ddd
			if (next >= 0) {
Toshihiro Shimizu 890ddd
				m_fromFld->setText(QString::number(s0 + 1));
Toshihiro Shimizu 890ddd
				m_toFld->setText(QString::number(m_curve->getKeyframe(next).m_frame + 1));
Toshihiro Shimizu 890ddd
				//*--- 前後のキーフレームの表示を更新 ---*/
Toshihiro Shimizu 890ddd
				if (m_curve->getKeyframeCount() >= 2) {
Toshihiro Shimizu 890ddd
					TDoubleKeyframe nextKf = m_curve->getKeyframe(next);
Toshihiro Shimizu 890ddd
					m_nextCurveButton->setEnabled(true);
Toshihiro Shimizu 890ddd
					m_nextLinkButton->setEnabled(true);
Toshihiro Shimizu 890ddd
					m_nextCurveButton->setText(typeToString(nextKf.m_type) + tr(" >"));
Toshihiro Shimizu 890ddd
					m_nextLinkButton->setChecked(nextKf.m_linkedHandles);
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			} else {
Toshihiro Shimizu 890ddd
				/*--- セグメントの下側が選択されているとき ---*/
Toshihiro Shimizu 890ddd
				int prev = m_curve->getPrevKeyframe(s0);
Toshihiro Shimizu 890ddd
				if (prev >= 0) {
Toshihiro Shimizu 890ddd
					m_fromFld->setText(QString::number(m_curve->getKeyframe(prev).m_frame + 1));
Toshihiro Shimizu 890ddd
					m_toFld->setText(QString::number(s1 + 1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					//*--- 前後のキーフレームの表示を更新 ---*/
Toshihiro Shimizu 890ddd
					if (prev > 0) {
Toshihiro Shimizu 890ddd
						TDoubleKeyframe kf = m_curve->getKeyframe(prev);
Toshihiro Shimizu 890ddd
						TDoubleKeyframe prevKf = m_curve->getKeyframe(prev - 1);
Toshihiro Shimizu 890ddd
						m_prevCurveButton->setEnabled(true);
Toshihiro Shimizu 890ddd
						m_prevLinkButton->setEnabled(true);
Toshihiro Shimizu 890ddd
						m_prevCurveButton->setText(tr("< ") + typeToString(prevKf.m_type));
Toshihiro Shimizu 890ddd
						m_prevLinkButton->setChecked(kf.m_linkedHandles);
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
				/*--- キーフレームが1個もない場合 ---*/
Toshihiro Shimizu 890ddd
				else {
Toshihiro Shimizu 890ddd
					if (s0 == s1) {
Toshihiro Shimizu 890ddd
						int endFrame;
Toshihiro Shimizu 890ddd
						if (m_xshHandle) {
Toshihiro Shimizu 890ddd
							endFrame = m_xshHandle->getXsheet()->getFrameCount();
Toshihiro Shimizu 890ddd
							/*--- xsheetに何もLevelがないとき,又は選択フレームがXsheetをはみだしているとき ---*/
Toshihiro Shimizu 890ddd
							if (endFrame == 0 || s0 + 1 >= endFrame)
Toshihiro Shimizu 890ddd
								endFrame = s0 + 16;
Toshihiro Shimizu 890ddd
						} else {
Toshihiro Shimizu 890ddd
							endFrame = s0 + 16;
Toshihiro Shimizu 890ddd
						}
Toshihiro Shimizu 890ddd
						m_fromFld->setText(QString::number(s0 + 1));
Toshihiro Shimizu 890ddd
						m_toFld->setText(QString::number(endFrame));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					} else {
Toshihiro Shimizu 890ddd
						m_fromFld->setText(QString::number(s0 + 1));
Toshihiro Shimizu 890ddd
						m_toFld->setText(QString::number(s1 + 1));
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FunctionSegmentViewer::onCurveChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int pageIndex = m_typeCombo->currentIndex();
Toshihiro Shimizu 890ddd
	if (0 <= pageIndex && pageIndex < tArrayCount(m_pages))
Toshihiro Shimizu 890ddd
		m_pages[pageIndex]->refresh();
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FunctionSegmentViewer::onStepFieldChanged(const QString &text)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!segmentIsValid())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	int step = 1;
Toshihiro Shimizu 890ddd
	if (text != "")
Toshihiro Shimizu 890ddd
		step = text.toInt();
Toshihiro Shimizu 890ddd
	if (step < 1)
Toshihiro Shimizu 890ddd
		step = 1;
Toshihiro Shimizu 890ddd
	KeyframeSetter setter(m_curve, m_segmentIndex);
Toshihiro Shimizu 890ddd
	setter.setStep(step);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int FunctionSegmentViewer::typeToIndex(int typeId) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	for (int i = 0; i < tArrayCount(m_typeId); i++)
Toshihiro Shimizu 890ddd
		if (m_typeId[i] == typeId)
Toshihiro Shimizu 890ddd
			return i;
Toshihiro Shimizu 890ddd
	return -1;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool FunctionSegmentViewer::segmentIsValid() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_curve && 0 <= m_segmentIndex && m_segmentIndex + 1 < m_curve->getKeyframeCount();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
/*---- 
Toshihiro Shimizu 890ddd
 すでにカーブがあり元のTypeの場合→本来の値に更新(refresh)
Toshihiro Shimizu 890ddd
 EaseIn/Out⇔EaseIn/Out(%)→値を変換
Toshihiro Shimizu 890ddd
 その他→各ページのイニシャライズ(ExpressionはGrammerを入れる)
Toshihiro Shimizu 890ddd
---*/
Toshihiro Shimizu 890ddd
void FunctionSegmentViewer::onSegmentTypeChanged(int typeIndex)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_curve)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--- すでにカーブがあり元のTypeの場合→カーブの情報本来の値に更新(refresh) ---*/
Toshihiro Shimizu 890ddd
	if (m_segmentIndex >= 0) {
Toshihiro Shimizu 890ddd
		TDoubleKeyframe::Type currentType = m_curve->getKeyframe(m_segmentIndex).m_type;
Toshihiro Shimizu 890ddd
		if (typeIndex == typeToIndex(currentType)) {
Toshihiro Shimizu 890ddd
			m_pages[typeIndex]->refresh();
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int segmentLength = m_toFld->text().toInt() - m_fromFld->text().toInt();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_pages[typeIndex]->init(segmentLength);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FunctionSegmentViewer::onApplyButtonPressed()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	/*--- カーブを何も掴んでいなればreturn ---*/
Toshihiro Shimizu 890ddd
	if (!m_curve)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--- パラメータの現状を取得 ---*/
Toshihiro Shimizu 890ddd
	int fromFrame = m_fromFld->text().toInt() - 1;
Toshihiro Shimizu 890ddd
	int toFrame = m_toFld->text().toInt() - 1;
Toshihiro Shimizu 890ddd
	TDoubleKeyframe::Type comboType = (TDoubleKeyframe::Type)indexToType(m_typeCombo->currentIndex());
Toshihiro Shimizu 890ddd
	int step = m_stepFld->text().toInt();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD speedIn(0, 0);
Toshihiro Shimizu 890ddd
	TPointD speedOut(0, 0);
Toshihiro Shimizu 890ddd
	std::string expressionText = "";
Toshihiro Shimizu 890ddd
	std::string unitName = "inch";
Toshihiro Shimizu 890ddd
	TDoubleKeyframe::FileParams fileParams;
Toshihiro Shimizu 890ddd
	double similarShapeOffset = 0.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--- 現在のindexに合わせて、必要なパラメータをGUIから持ってきて格納 ---*/
Toshihiro Shimizu 890ddd
	switch (comboType) {
Toshihiro Shimizu 890ddd
	case TDoubleKeyframe::Linear:
Toshihiro Shimizu 890ddd
		// no param
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case TDoubleKeyframe::SpeedInOut: {
Toshihiro Shimizu 890ddd
		SpeedInOutSegmentPage *page = qobject_cast<speedinoutsegmentpage *="">(m_parametersPanel->currentWidget());</speedinoutsegmentpage>
Toshihiro Shimizu 890ddd
		if (page)
Toshihiro Shimizu 890ddd
			page->getGuiValues(speedIn, speedOut);
Toshihiro Shimizu 890ddd
	} break;
Toshihiro Shimizu 890ddd
	case TDoubleKeyframe::EaseInOut:
Toshihiro Shimizu 890ddd
	case TDoubleKeyframe::EaseInOutPercentage: {
Toshihiro Shimizu 890ddd
		EaseInOutSegmentPage *page = qobject_cast<easeinoutsegmentpage *="">(m_parametersPanel->currentWidget());</easeinoutsegmentpage>
Toshihiro Shimizu 890ddd
		if (page)
Toshihiro Shimizu 890ddd
			page->getGuiValues(speedIn, speedOut);
Toshihiro Shimizu 890ddd
	} break;
Toshihiro Shimizu 890ddd
	case TDoubleKeyframe::Exponential:
Toshihiro Shimizu 890ddd
		// no param
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case TDoubleKeyframe::Expression: {
Toshihiro Shimizu 890ddd
		FunctionExpressionSegmentPage *page = qobject_cast<functionexpressionsegmentpage *="">(m_parametersPanel->currentWidget());</functionexpressionsegmentpage>
Toshihiro Shimizu 890ddd
		if (page) {
Toshihiro Shimizu 890ddd
			bool ok = page->getGuiValues(expressionText, unitName);
Toshihiro Shimizu 890ddd
			if (!ok)
Toshihiro Shimizu 890ddd
				return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} break;
Toshihiro Shimizu 890ddd
	case TDoubleKeyframe::File: {
Toshihiro Shimizu 890ddd
		FileSegmentPage *page = dynamic_cast<filesegmentpage *="">(m_parametersPanel->currentWidget());</filesegmentpage>
Toshihiro Shimizu 890ddd
		if (page)
Toshihiro Shimizu 890ddd
			page->getGuiValues(fileParams, unitName);
Toshihiro Shimizu 890ddd
	} break;
Toshihiro Shimizu 890ddd
	case TDoubleKeyframe::None:
Toshihiro Shimizu 890ddd
		// no param
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case TDoubleKeyframe::SimilarShape: {
Toshihiro Shimizu 890ddd
		SimilarShapeSegmentPage *page = qobject_cast<similarshapesegmentpage *="">(m_parametersPanel->currentWidget());</similarshapesegmentpage>
Toshihiro Shimizu 890ddd
		if (page)
Toshihiro Shimizu 890ddd
			page->getGuiValues(expressionText, similarShapeOffset);
Toshihiro Shimizu 890ddd
	} break;
Toshihiro Shimizu 890ddd
	default:
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--- from - toに合わせてキーフレームを作成しようと試みる。すでに有る場合はスキップ ---*/
Toshihiro Shimizu 890ddd
	if (fromFrame < 0)
Toshihiro Shimizu 890ddd
		fromFrame = 0;
Toshihiro Shimizu 890ddd
	if (toFrame < 0)
Toshihiro Shimizu 890ddd
		toFrame = 0;
Toshihiro Shimizu 890ddd
	if (fromFrame >= toFrame)
Toshihiro Shimizu 890ddd
		fromFrame = toFrame + 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!m_curve->isKeyframe(fromFrame))
Toshihiro Shimizu 890ddd
		KeyframeSetter::setValue(m_curve, fromFrame, m_curve->getValue(fromFrame));
Toshihiro Shimizu 890ddd
	if (!m_curve->isKeyframe(toFrame))
Toshihiro Shimizu 890ddd
		KeyframeSetter::setValue(m_curve, toFrame, m_curve->getValue(toFrame));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--- 現在のSegmentIndexを更新 ---*/
Toshihiro Shimizu 890ddd
	m_segmentIndex = m_curve->getClosestKeyframe(fromFrame);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--- パラメータを一括で設定 ---*/
Toshihiro Shimizu 890ddd
	KeyframeSetter setter(m_curve, m_segmentIndex);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_panel)
Toshihiro Shimizu 890ddd
		setter.setPixelRatio(m_panel->getPixelRatio(m_curve));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setter.setAllParams(step,
Toshihiro Shimizu 890ddd
						comboType,
Toshihiro Shimizu 890ddd
						speedIn,
Toshihiro Shimizu 890ddd
						speedOut,
Toshihiro Shimizu 890ddd
						expressionText,
Toshihiro Shimizu 890ddd
						unitName,
Toshihiro Shimizu 890ddd
						fileParams,
Toshihiro Shimizu 890ddd
						similarShapeOffset);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//for displaying the types of neighbor segments
Toshihiro Shimizu 890ddd
QString FunctionSegmentViewer::typeToString(int typeId) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < tArrayCount(m_typeId); i++)
Toshihiro Shimizu 890ddd
		if (m_typeId[i] == typeId)
Toshihiro Shimizu 890ddd
			break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (i) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		return tr("Linear");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		return tr("Speed");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		return tr("Ease");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		return tr("Ease%");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		return tr("Expo");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 5:
Toshihiro Shimizu 890ddd
		return tr("Expr");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 6:
Toshihiro Shimizu 890ddd
		return tr("File");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 7:
Toshihiro Shimizu 890ddd
		return tr("Const");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 8:
Toshihiro Shimizu 890ddd
		return tr("Similar");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	default:
Toshihiro Shimizu 890ddd
		return tr("????");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FunctionSegmentViewer::onPrevCurveButtonPressed()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_curve)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_segmentIndex == 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int currentKeyIndex;
Toshihiro Shimizu 890ddd
	if (m_segmentIndex > 0)
Toshihiro Shimizu 890ddd
		currentKeyIndex = m_segmentIndex;
Toshihiro Shimizu 890ddd
	/*--- Segmentが選択されていない→Segmentの下側が選ばれているはず ---*/
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		QRect selectedCells = m_sheet->getSelectedCells();
Toshihiro Shimizu 890ddd
		if (selectedCells.isEmpty())
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		currentKeyIndex = m_curve->getPrevKeyframe(selectedCells.top());
Toshihiro Shimizu 890ddd
		if (currentKeyIndex != m_curve->getKeyframeCount() - 1)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int col = m_sheet->getColumnIndexByCurve(m_curve);
Toshihiro Shimizu 890ddd
	/*--- Sheet上にCurveが表示されていない場合はcolに-1が返る ---*/
Toshihiro Shimizu 890ddd
	if (col < 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDoubleKeyframe currentKey = m_curve->getKeyframe(currentKeyIndex);
Toshihiro Shimizu 890ddd
	TDoubleKeyframe prevKey = m_curve->getKeyframe(currentKeyIndex - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int r0 = (int)prevKey.m_frame;
Toshihiro Shimizu 890ddd
	int r1 = (int)currentKey.m_frame;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_sheet->getSelection()->selectSegment(m_curve, currentKeyIndex - 1, QRect(col, r0, 1, r1 - r0 + 1));
Toshihiro Shimizu 890ddd
	m_sheet->updateAll();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FunctionSegmentViewer::onNextCurveButtonPressed()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_curve)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_segmentIndex == m_curve->getKeyframeCount() - 2)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int currentKeyIndex;
Toshihiro Shimizu 890ddd
	if (m_segmentIndex >= 0) {
Toshihiro Shimizu 890ddd
		currentKeyIndex = m_segmentIndex;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	/*--- Segmentが選択されていない→Segmentの上側が選ばれているはず ---*/
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		QRect selectedCells = m_sheet->getSelectedCells();
Toshihiro Shimizu 890ddd
		if (selectedCells.isEmpty())
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		currentKeyIndex = m_curve->getNextKeyframe(selectedCells.top());
Toshihiro Shimizu 890ddd
		if (currentKeyIndex != 0)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int col = m_sheet->getColumnIndexByCurve(m_curve);
Toshihiro Shimizu 890ddd
	/*--- Sheet上にCurveが表示されていない場合はcolに-1が返る ---*/
Toshihiro Shimizu 890ddd
	if (col < 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDoubleKeyframe nextKey = m_curve->getKeyframe(currentKeyIndex + 1);
Toshihiro Shimizu 890ddd
	TDoubleKeyframe nextNextKey = m_curve->getKeyframe(currentKeyIndex + 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int r0 = (int)nextKey.m_frame;
Toshihiro Shimizu 890ddd
	int r1 = (int)nextNextKey.m_frame;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_sheet->getSelection()->selectSegment(m_curve, currentKeyIndex + 1, QRect(col, r0, 1, r1 - r0 + 1));
Toshihiro Shimizu 890ddd
	m_sheet->updateAll();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FunctionSegmentViewer::onPrevLinkButtonPressed()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_prevLinkButton->isChecked())
Toshihiro Shimizu 890ddd
		KeyframeSetter(m_curve, m_segmentIndex).linkHandles();
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		KeyframeSetter(m_curve, m_segmentIndex).unlinkHandles();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FunctionSegmentViewer::onNextLinkButtonPressed()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_nextLinkButton->isChecked())
Toshihiro Shimizu 890ddd
		KeyframeSetter(m_curve, m_segmentIndex + 1).linkHandles();
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		KeyframeSetter(m_curve, m_segmentIndex + 1).unlinkHandles();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool FunctionSegmentViewer::anyWidgetHasFocus()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_topbar->hasFocus() ||
Toshihiro Shimizu 890ddd
		   m_fromFld->hasFocus() ||
Toshihiro Shimizu 890ddd
		   m_toFld->hasFocus() ||
Toshihiro Shimizu 890ddd
		   m_typeCombo->hasFocus() ||
Toshihiro Shimizu 890ddd
		   m_stepFld->hasFocus() ||
Toshihiro Shimizu 890ddd
		   m_prevCurveButton->hasFocus() ||
Toshihiro Shimizu 890ddd
		   m_nextCurveButton->hasFocus() ||
Toshihiro Shimizu 890ddd
		   m_prevLinkButton->hasFocus() ||
Toshihiro Shimizu 890ddd
		   m_nextLinkButton->hasFocus();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*! in order to avoid FunctionViewer to get focus while editing the expression
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
bool FunctionSegmentViewer::isExpressionPageActive()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return (m_typeCombo->currentIndex() == 5);
Toshihiro Shimizu 890ddd
}