// ************************************************************************** // // (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(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(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