Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <math.h></math.h>
Toshihiro Shimizu 890ddd
#include "toonzqt/doublefield.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/dvdialog.h"
Toshihiro Shimizu 890ddd
#include "tunit.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qdoublevalidator></qdoublevalidator>
Toshihiro Shimizu 890ddd
#include <qhboxlayout></qhboxlayout>
Toshihiro Shimizu 890ddd
#include <qfocusevent></qfocusevent>
Toshihiro Shimizu 890ddd
#include <qslider></qslider>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace DVGui;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// DoubleValueLineEdit
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleValueLineEdit::focusOutEvent(QFocusEvent *e)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double value = getValue();
Toshihiro Shimizu 890ddd
	double minValue, maxValue;
Toshihiro Shimizu 890ddd
	getRange(minValue, maxValue);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isOutOfRange;
Toshihiro Shimizu 890ddd
	/*---誤差を吸収する---*/
Toshihiro Shimizu 890ddd
	MeasuredDoubleLineEdit *lineEdit = qobject_cast<measureddoublelineedit *="">(this);</measureddoublelineedit>
Toshihiro Shimizu 890ddd
	if (lineEdit) {
Toshihiro Shimizu 890ddd
		int decimal = lineEdit->getDecimals();
Toshihiro Shimizu 890ddd
		isOutOfRange = (value < minValue - pow(0.1, decimal + 1) ||
Toshihiro Shimizu 890ddd
						value > maxValue + pow(0.1, decimal + 1));
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		isOutOfRange = (value < minValue || value > maxValue);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (isOutOfRange) {
Toshihiro Shimizu 890ddd
		setValue(tcrop(value, minValue, maxValue));
Toshihiro Shimizu 890ddd
		emit editingFinished();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	QLineEdit::focusOutEvent(e);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// DoubleValueField
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DoubleValueField::DoubleValueField(QWidget *parent, DoubleValueLineEdit *lineEdit)
Toshihiro Shimizu 890ddd
	: QWidget(parent), m_lineEdit(lineEdit), m_slider(0), m_roller(0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_lineEdit);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QWidget *field = new QWidget(this);
Toshihiro Shimizu 890ddd
	m_roller = new RollerField(field);
Toshihiro Shimizu 890ddd
	m_slider = new QSlider(Qt::Horizontal, this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	field->setMaximumWidth(100);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//---layout
Toshihiro Shimizu 890ddd
	QHBoxLayout *layout = new QHBoxLayout(this);
Toshihiro Shimizu 890ddd
	layout->setMargin(0);
Toshihiro Shimizu 890ddd
	layout->setSpacing(5);
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		QVBoxLayout *vLayout = new QVBoxLayout(field);
Toshihiro Shimizu 890ddd
		vLayout->setMargin(0);
Toshihiro Shimizu 890ddd
		vLayout->setSpacing(0);
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			vLayout->addWidget(m_lineEdit);
Toshihiro Shimizu 890ddd
			vLayout->addWidget(m_roller);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		layout->addWidget(field);
Toshihiro Shimizu 890ddd
		layout->addWidget(m_slider);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	setLayout(layout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----signal/slot connections
Toshihiro Shimizu 890ddd
	bool ret = true;
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_lineEdit, SIGNAL(valueChanged()), SLOT(onLineEditValueChanged()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_roller, SIGNAL(valueChanged(bool)), SLOT(onRollerValueChanged(bool)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_slider, SIGNAL(valueChanged(int)), SLOT(onSliderChanged(int)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_slider, SIGNAL(sliderReleased()), SLOT(onSliderReleased()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_lineEdit, SIGNAL(editingFinished()), this, SIGNAL(valueEditedByHand()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_slider, SIGNAL(sliderReleased()), this, SIGNAL(valueEditedByHand()));
Toshihiro Shimizu 890ddd
	assert(ret);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_spaceWidget = new QWidget();
Toshihiro Shimizu 890ddd
	m_spaceWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
Toshihiro Shimizu 890ddd
	layout->addWidget(m_spaceWidget, 1, Qt::AlignLeft);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setRange(-100.0, 100.0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleValueField::getRange(double &minValue, double &maxValue)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_lineEdit->getRange(minValue, maxValue);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleValueField::setRange(double minValue, double maxValue)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_lineEdit->setRange(minValue, maxValue);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_roller->setRange(minValue, maxValue);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int dicimal = m_lineEdit->getDecimals();
Toshihiro Shimizu 890ddd
	int sliderMax = maxValue * pow(10., dicimal);
Toshihiro Shimizu 890ddd
	int sliderMin = minValue * pow(10., dicimal);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_slider->setRange(sliderMin, sliderMax);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	enableSlider(maxValue - minValue < 10000);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleValueField::setValue(double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_lineEdit->getValue() == value)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	m_lineEdit->setValue(value);
Toshihiro Shimizu 890ddd
	m_roller->setValue(value);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int dicimal = m_lineEdit->getDecimals();
Toshihiro Shimizu 890ddd
	int sliderValue = value * pow(10., dicimal);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_slider->setValue(sliderValue);
Toshihiro Shimizu 890ddd
	//forzo il repaint... non sempre si aggiorna e l'update non sembra risolvere il ptroblema!!!
Toshihiro Shimizu 890ddd
	m_slider->repaint();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double DoubleValueField::getValue()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return (m_lineEdit->getValue());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleValueField::setValues(double value, double minValue, double maxValue)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setRange(minValue, maxValue);
Toshihiro Shimizu 890ddd
	setValue(value);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleValueField::enableSlider(bool enable)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_slider->setEnabled(enable);
Toshihiro Shimizu 890ddd
	m_spaceWidget->setEnabled(!enable);
Toshihiro Shimizu 890ddd
	if (enable) {
Toshihiro Shimizu 890ddd
		m_slider->show();
Toshihiro Shimizu 890ddd
		m_spaceWidget->hide();
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		m_slider->hide();
Toshihiro Shimizu 890ddd
		m_spaceWidget->show();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool DoubleValueField::isSliderEnabled()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_slider->isEnabled();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleValueField::enableRoller(bool enable)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_roller->setEnabled(enable);
Toshihiro Shimizu 890ddd
	if (enable)
Toshihiro Shimizu 890ddd
		m_roller->show();
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_roller->hide();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool DoubleValueField::isRollerEnabled()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_roller->isEnabled();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleValueField::onSliderChanged(int value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int dicimal = m_lineEdit->getDecimals();
Toshihiro Shimizu 890ddd
	double val = double(value) * pow(0.1, dicimal);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Controllo necessario per evitare che il segnale di cambiamento venga emesso piu' volte.
Toshihiro Shimizu 890ddd
	if (m_lineEdit->getValue() == val ||
Toshihiro Shimizu 890ddd
		(m_roller->getValue() == val && m_roller->isVisible()))
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	m_lineEdit->setValue(val);
Toshihiro Shimizu 890ddd
	m_roller->setValue(val);
Toshihiro Shimizu 890ddd
	//Faccio in modo che il cursore sia sulla prima cifra, cosi' se la stringa
Toshihiro Shimizu 890ddd
	//da visualizzare e' piu' lunga del campo le cifre che vengono troncate sono
Toshihiro Shimizu 890ddd
	//le ultime e non le prime (dovrebbero essere quelle dopo la virgola).
Toshihiro Shimizu 890ddd
	m_lineEdit->setCursorPosition(0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	emit valueChanged(true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleValueField::onLineEditValueChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double value = m_lineEdit->getValue();
Toshihiro Shimizu 890ddd
	int dicimal = m_lineEdit->getDecimals();
Toshihiro Shimizu 890ddd
	double sliderValue = value * pow(10., dicimal);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Controllo necessario per evitare che il segnale di cambiamento venga emesso piu' volte.
Toshihiro Shimizu 890ddd
	if ((m_slider->value() == sliderValue && m_slider->isVisible()) ||
Toshihiro Shimizu 890ddd
		(m_roller->getValue() == value && m_roller->isVisible()))
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	m_slider->setValue(sliderValue);
Toshihiro Shimizu 890ddd
	m_roller->setValue(value);
Toshihiro Shimizu 890ddd
	emit valueChanged(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleValueField::onRollerValueChanged(bool isDragging)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double value = m_roller->getValue();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int dicimal = m_lineEdit->getDecimals();
Toshihiro Shimizu 890ddd
	double sliderValue = value * pow(10., dicimal);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (sliderValue == m_lineEdit->getValue()) {
Toshihiro Shimizu 890ddd
		assert(m_slider->value() == value || !m_slider->isVisible());
Toshihiro Shimizu 890ddd
		// Se isDragging e' falso e' giusto che venga emessa la notifica di cambiamento.
Toshihiro Shimizu 890ddd
		if (!isDragging)
Toshihiro Shimizu 890ddd
			emit valueChanged(isDragging);
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	m_slider->setValue(sliderValue);
Toshihiro Shimizu 890ddd
	m_lineEdit->setValue(value);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Faccio in modo che il cursore sia sulla prima cifra, cosi' se la stringa
Toshihiro Shimizu 890ddd
	//da visualizzare e' piu' lunga del campo le cifre che vengono troncate sono
Toshihiro Shimizu 890ddd
	//le ultime e non le prime (dovrebbero essere quelle dopo la virgola).
Toshihiro Shimizu 890ddd
	m_lineEdit->setCursorPosition(0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	emit valueChanged(isDragging);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// DoubleLineEdit
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DoubleLineEdit::DoubleLineEdit(QWidget *parent, double value)
Toshihiro Shimizu 890ddd
	: DoubleValueLineEdit(parent)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_validator = new QDoubleValidator(-(std::numeric_limits<double>::max)(), (std::numeric_limits<double>::max)(), 8, this);</double></double>
Toshihiro Shimizu 890ddd
	setValidator(m_validator);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setValue(value);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool ret = connect(this, SIGNAL(editingFinished()), SIGNAL(valueChanged()));
Toshihiro Shimizu 890ddd
	assert(ret);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleLineEdit::setValue(double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double minValue, maxValue;
Toshihiro Shimizu 890ddd
	getRange(minValue, maxValue);
Toshihiro Shimizu 890ddd
	if (value < minValue)
Toshihiro Shimizu 890ddd
		value = minValue;
Toshihiro Shimizu 890ddd
	if (value > maxValue)
Toshihiro Shimizu 890ddd
		value = maxValue;
Toshihiro Shimizu 890ddd
	QString str;
Toshihiro Shimizu 890ddd
	str.setNum(value);
Toshihiro Shimizu 890ddd
	setText(str);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Faccio in modo che il cursore sia sulla prima cifra, cosi' se la stringa
Toshihiro Shimizu 890ddd
	//da visualizzare e' piu' lunga del campo le cifre che vengono troncate sono
Toshihiro Shimizu 890ddd
	//le ultime e non le prime (dovrebbero essere quelle dopo la virgola).
Toshihiro Shimizu 890ddd
	setCursorPosition(0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double DoubleLineEdit::getValue()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return text().toDouble();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleLineEdit::setRange(double minValue, double maxValue)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_validator->setRange(minValue, maxValue, m_validator->decimals());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleLineEdit::getRange(double &minValue, double &maxValue)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	minValue = m_validator->bottom();
Toshihiro Shimizu 890ddd
	maxValue = m_validator->top();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DoubleLineEdit::setDecimals(int decimals)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_validator->setDecimals(decimals);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int DoubleLineEdit::getDecimals()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_validator->decimals();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// DoubleField
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DoubleField::DoubleField(QWidget *parent, bool isRollerHide, int decimals)
Toshihiro Shimizu 890ddd
	: DoubleValueField(parent, new DoubleLineEdit(0))
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (isRollerHide)
Toshihiro Shimizu 890ddd
		enableRoller(false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	DoubleLineEdit *lineEdit = dynamic_cast<doublelineedit *="">(m_lineEdit);</doublelineedit>
Toshihiro Shimizu 890ddd
	lineEdit->setDecimals(decimals);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--rollerにもStepを設定--*/
Toshihiro Shimizu 890ddd
	if (!isRollerHide)
Toshihiro Shimizu 890ddd
		m_roller->setStep(pow(0.1, decimals));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// MeasuredDoubleLineEdit
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
MeasuredDoubleLineEdit::MeasuredDoubleLineEdit(QWidget *parent)
Toshihiro Shimizu 890ddd
	: DoubleValueLineEdit(parent), m_minValue(-(std::numeric_limits<double>::max)()), m_maxValue((std::numeric_limits<double>::max)()), m_modified(false), m_errorHighlighting(0), m_errorHighlightingTimerId(0), m_decimals(7)</double></double>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setObjectName("ValueLineEdit");
Toshihiro Shimizu 890ddd
	m_value = new TMeasuredValue("length");
Toshihiro Shimizu 890ddd
	valueToText();
Toshihiro Shimizu 890ddd
	bool ret = connect(this, SIGNAL(editingFinished()), this, SLOT(onEditingFinished()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(this, SIGNAL(textChanged(const QString &)), this, SLOT(onTextChanged(const QString &)));
Toshihiro Shimizu 890ddd
	assert(ret);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
MeasuredDoubleLineEdit::~MeasuredDoubleLineEdit()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	delete m_value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MeasuredDoubleLineEdit::valueToText()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	bool oldModified = m_modified;
Toshihiro Shimizu 890ddd
	setText(QString::fromStdWString(m_value->toWideString(m_decimals)));
Toshihiro Shimizu 890ddd
	setCursorPosition(0);
Toshihiro Shimizu 890ddd
	m_modified = oldModified;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MeasuredDoubleLineEdit::setValue(double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_value->setValue(TMeasuredValue::MainUnit, value);
Toshihiro Shimizu 890ddd
	valueToText();
Toshihiro Shimizu 890ddd
	m_modified = false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double MeasuredDoubleLineEdit::getValue()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_value->getValue(TMeasuredValue::MainUnit);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MeasuredDoubleLineEdit::setRange(double minValue, double maxValue)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_minValue = minValue;
Toshihiro Shimizu 890ddd
	m_maxValue = maxValue;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MeasuredDoubleLineEdit::getRange(double &minValue, double &maxValue)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	minValue = m_minValue;
Toshihiro Shimizu 890ddd
	maxValue = m_maxValue;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MeasuredDoubleLineEdit::setMeasure(string name)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	delete m_value;
Toshihiro Shimizu 890ddd
	m_value = new TMeasuredValue(name != "" ? name : "dummy");
Toshihiro Shimizu 890ddd
	valueToText();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MeasuredDoubleLineEdit::setDecimals(int decimals)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_decimals = decimals;
Toshihiro Shimizu 890ddd
	valueToText();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int MeasuredDoubleLineEdit::getDecimals()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_decimals;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MeasuredDoubleLineEdit::onTextChanged(const QString &)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_modified = true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MeasuredDoubleLineEdit::onEditingFinished()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_modified)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	m_modified = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double oldValue = getValue();
Toshihiro Shimizu 890ddd
	QString oldStyleSheet = styleSheet();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int err = -10;
Toshihiro Shimizu 890ddd
	m_value->setValue(text().toStdWString(), &err);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool outOfRange = false;
Toshihiro Shimizu 890ddd
	if (!err) {
Toshihiro Shimizu 890ddd
		double v = getValue();
Toshihiro Shimizu 890ddd
		outOfRange = m_minValue > v || m_maxValue < v;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (err) {
Toshihiro Shimizu 890ddd
		m_errorHighlighting = 1;
Toshihiro Shimizu 890ddd
		if (m_errorHighlightingTimerId == 0)
Toshihiro Shimizu 890ddd
			m_errorHighlightingTimerId = startTimer(40);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		if (m_errorHighlightingTimerId != 0)
Toshihiro Shimizu 890ddd
			killTimer(m_errorHighlightingTimerId);
Toshihiro Shimizu 890ddd
		m_errorHighlightingTimerId = 0;
Toshihiro Shimizu 890ddd
		m_errorHighlighting = 0;
Toshihiro Shimizu 890ddd
		setStyleSheet("");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double newValue = getValue();
Toshihiro Shimizu 890ddd
	if (m_minValue > newValue || m_maxValue < newValue) {
Toshihiro Shimizu 890ddd
		m_value->setValue(TMeasuredValue::MainUnit, oldValue);
Toshihiro Shimizu 890ddd
		valueToText();
Toshihiro Shimizu 890ddd
		emit valueChanged();
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	valueToText();
Toshihiro Shimizu 890ddd
	emit valueChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MeasuredDoubleLineEdit::timerEvent(QTimerEvent *)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_errorHighlighting < 0.01) {
Toshihiro Shimizu 890ddd
		if (m_errorHighlightingTimerId != 0)
Toshihiro Shimizu 890ddd
			killTimer(m_errorHighlightingTimerId);
Toshihiro Shimizu 890ddd
		m_errorHighlightingTimerId = 0;
Toshihiro Shimizu 890ddd
		m_errorHighlighting = 0;
Toshihiro Shimizu 890ddd
		setStyleSheet("");
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		int v = 255 - (int)(m_errorHighlighting * 255);
Toshihiro Shimizu 890ddd
		m_errorHighlighting = m_errorHighlighting * 0.8;
Toshihiro Shimizu 890ddd
		int c = 255 << 16 | v << 8 | v;
Toshihiro Shimizu 890ddd
		setStyleSheet(QString("#ValueLineEdit {background-color:#%1}").arg(c, 6, 16, QLatin1Char('0')));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// MeasuredDoubleField
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
MeasuredDoubleField::MeasuredDoubleField(QWidget *parent, bool isRollerHide)
Toshihiro Shimizu 890ddd
	: DoubleValueField(parent, new MeasuredDoubleLineEdit(0))
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_lineEdit->setMaximumWidth(100);
Toshihiro Shimizu 890ddd
	if (isRollerHide)
Toshihiro Shimizu 890ddd
		enableRoller(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
///----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MeasuredDoubleField::setMeasure(string measureName)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	MeasuredDoubleLineEdit *lineEdit = dynamic_cast<measureddoublelineedit *="">(m_lineEdit);</measureddoublelineedit>
Toshihiro Shimizu 890ddd
	assert(lineEdit);
Toshihiro Shimizu 890ddd
	lineEdit->setMeasure(measureName);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MeasuredDoubleField::setDecimals(int decimals)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	MeasuredDoubleLineEdit *lineEdit = qobject_cast<measureddoublelineedit *="">(m_lineEdit);</measureddoublelineedit>
Toshihiro Shimizu 890ddd
	if (lineEdit)
Toshihiro Shimizu 890ddd
		lineEdit->setDecimals(decimals);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*--- rollerにもStepを設定 ---*/
Toshihiro Shimizu 890ddd
	if (isRollerEnabled())
Toshihiro Shimizu 890ddd
		m_roller->setStep(pow(0.1, tmax(decimals - 1, 1)));
Toshihiro Shimizu 890ddd
}