136 lines
3.5 KiB
C++
136 lines
3.5 KiB
C++
// **************************************************************************
|
|
//
|
|
// (C) Copyright 2009 Swiss SIMTEC AG
|
|
//
|
|
// **************************************************************************
|
|
//
|
|
// $HeadURL$
|
|
// $LastChangedBy$
|
|
// $LastChangedDate$
|
|
// $LastChangedRevision$
|
|
//
|
|
// **************************************************************************
|
|
|
|
#include "LogViewValueEdit.hpp"
|
|
#include "LogViewField.hpp"
|
|
#include "LogViewTelegram.hpp"
|
|
|
|
namespace N_LogView
|
|
{
|
|
|
|
// ---------------------------------------------------------------
|
|
LogViewValueEdit::LogViewValueEdit(LogViewField* a_field, QWidget* a_parent, const bool a_readonly)
|
|
: QLineEdit(a_parent)
|
|
, LogViewWidget(a_field, this, a_parent, a_readonly)
|
|
, m_IsFloat(false)
|
|
{
|
|
const LogViewXdrStandardType *stdType = static_cast<const LogViewXdrStandardType*>(m_Field->xdrElement());
|
|
m_IsFloat = (LogViewXdrStandardType::e_Float == stdType->getValueKind());
|
|
|
|
const QString valueText = a_field->value(0);
|
|
|
|
setText(valueText);
|
|
|
|
// checkAndOvertakeContent();
|
|
updateToolTip(valueText);
|
|
|
|
// make proper width of widget
|
|
QFontMetrics fm(font());
|
|
#if QT_VERSION < QT_VERSION_CHECK(5, 11, 0)
|
|
setMinimumWidth(fm.width(QLatin1Char(' ') + valueText + QLatin1Char(' ')));
|
|
#else
|
|
setMinimumWidth(fm.horizontalAdvance(QLatin1Char(' ') + valueText + QLatin1Char(' ')));
|
|
#endif
|
|
|
|
if (a_readonly)
|
|
{
|
|
setReadOnly(true);
|
|
setAlignment(a_field->isRightAligned() ? Qt::AlignRight : Qt::AlignLeft);
|
|
}
|
|
else
|
|
{
|
|
connect(this, &LogViewValueEdit::editingFinished,
|
|
this, &LogViewValueEdit::checkAndOvertakeContent);
|
|
}
|
|
}
|
|
|
|
|
|
// ---------------------------------------------------------------
|
|
void LogViewValueEdit::checkAndOvertakeContent()
|
|
{
|
|
bool ok;
|
|
int64_t intValue = 0;
|
|
double floatValue = 0.0;
|
|
|
|
// get the calculated and checked value
|
|
if (m_IsFloat)
|
|
floatValue = getFloat(text(), (uint64_t&)intValue, ok);
|
|
else
|
|
intValue = getInteger(text(), ok);
|
|
|
|
// handle errors
|
|
if (!ok)
|
|
{
|
|
setFocus();
|
|
selectAll();
|
|
return; // abort
|
|
}
|
|
|
|
// update
|
|
if (m_IsFloat)
|
|
setText(QString::number(floatValue));
|
|
else
|
|
setText(QString::number(intValue));
|
|
|
|
updateToolTip(text());
|
|
}
|
|
|
|
|
|
// ---------------------------------------------------------------
|
|
// Writes the content into telegram.
|
|
// Returns true if successful.
|
|
// ---------------------------------------------------------------
|
|
bool LogViewValueEdit::saveContent(LogViewTelegram* a_telegram)
|
|
{
|
|
if (m_Valid)
|
|
{
|
|
bool ok;
|
|
if (m_IsFloat)
|
|
{
|
|
// save the float or double-value
|
|
uint64_t valueAsUint64;
|
|
const double value = getFloat(text(), valueAsUint64, ok);
|
|
if (ok)
|
|
{
|
|
if (a_telegram->isJsonTelegram())
|
|
{
|
|
a_telegram->setJsonValue(m_Field->jsonPath(), value);
|
|
}
|
|
else
|
|
{
|
|
const LogViewXdrStandardType *stdType = static_cast<const LogViewXdrStandardType*>(m_Field->xdrElement());
|
|
LogViewXdrStandardType::E_ByteOrder byteOrder = stdType->getByteOrder();
|
|
a_telegram->setUIntX(getSize(), valueAsUint64, byteOrder);
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// save the integer-value
|
|
qint64 intValue = getInteger(text(), ok);
|
|
if (ok)
|
|
{
|
|
if (a_telegram->isJsonTelegram())
|
|
a_telegram->setJsonValue(m_Field->jsonPath(), intValue);
|
|
else
|
|
a_telegram->setUIntX(getSize(), intValue);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
} // namespace N_LogView
|