From 4deaddf5d333222aecf8a3f142074667328bee0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Sun, 15 Nov 2020 00:21:09 +0100 Subject: [PATCH] Bugfix: prevent crash on empty input --- .../CustomWidgets/siunitedit.cpp | 46 +++++++++---------- .../PC_Application/CustomWidgets/siunitedit.h | 1 + .../PC_Application/Traces/tracemarker.cpp | 4 +- .../Traces/tracemarkermodel.cpp | 3 +- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Software/PC_Application/CustomWidgets/siunitedit.cpp b/Software/PC_Application/CustomWidgets/siunitedit.cpp index 739f9ce..853ba7f 100644 --- a/Software/PC_Application/CustomWidgets/siunitedit.cpp +++ b/Software/PC_Application/CustomWidgets/siunitedit.cpp @@ -81,12 +81,8 @@ bool SIUnitEdit::eventFilter(QObject *, QEvent *event) } } } else if(event->type() == QEvent::FocusOut) { - if(!text().isEmpty()) { - parseNewValue(1.0); - } else { - setValueQuiet(_value); - emit editingAborted(); - } + parseNewValue(1.0); + emit focusLost(); } return false; } @@ -101,25 +97,29 @@ void SIUnitEdit::setValueQuiet(double value) void SIUnitEdit::parseNewValue(double factor) { QString input = text(); - // remove optional unit - if(input.endsWith(unit)) { - input.chop(unit.size()); - } - auto lastChar = input.at(input.size()-1).toLatin1(); - if(prefixes.indexOf(lastChar) >= 0) { - factor = Unit::SIPrefixToFactor(lastChar); - input.chop(1); - } - // remaining input should only contain numbers - bool conversion_ok; - auto v = input.toDouble(&conversion_ok); - if(conversion_ok) { - qDebug() << v; - setValue(v * factor); + if(input.isEmpty()) { + setValueQuiet(_value); + emit editingAborted(); } else { - qWarning() << "SIUnit conversion failure:" << input; + // remove optional unit + if(input.endsWith(unit)) { + input.chop(unit.size()); + } + auto lastChar = input.at(input.size()-1).toLatin1(); + if(prefixes.indexOf(lastChar) >= 0) { + factor = Unit::SIPrefixToFactor(lastChar); + input.chop(1); + } + // remaining input should only contain numbers + bool conversion_ok; + auto v = input.toDouble(&conversion_ok); + if(conversion_ok) { + setValue(v * factor); + } else { + qWarning() << "SIUnit conversion failure:" << input; + } + clear(); } - clear(); } void SIUnitEdit::continueEditing() diff --git a/Software/PC_Application/CustomWidgets/siunitedit.h b/Software/PC_Application/CustomWidgets/siunitedit.h index e0419d7..dc6cc93 100644 --- a/Software/PC_Application/CustomWidgets/siunitedit.h +++ b/Software/PC_Application/CustomWidgets/siunitedit.h @@ -21,6 +21,7 @@ signals: void valueChanged(double newvalue); void valueUpdated(QWidget *w); void editingAborted(); + void focusLost(); protected: bool eventFilter(QObject *obj, QEvent *event) override; private: diff --git a/Software/PC_Application/Traces/tracemarker.cpp b/Software/PC_Application/Traces/tracemarker.cpp index 8417367..ff01365 100644 --- a/Software/PC_Application/Traces/tracemarker.cpp +++ b/Software/PC_Application/Traces/tracemarker.cpp @@ -499,11 +499,11 @@ SIUnitEdit *TraceMarker::getSettingsEditor() case Type::Noise: case Type::PhaseNoise: default: - return new SIUnitEdit("Hz", " kMG"); + return new SIUnitEdit("Hz", " kMG", 6); case Type::Lowpass: case Type::Highpass: case Type::PeakTable: - return new SIUnitEdit("db", " "); + return new SIUnitEdit("db", " ", 3); case Type::TOI: return nullptr; } diff --git a/Software/PC_Application/Traces/tracemarkermodel.cpp b/Software/PC_Application/Traces/tracemarkermodel.cpp index a69a169..3090200 100644 --- a/Software/PC_Application/Traces/tracemarkermodel.cpp +++ b/Software/PC_Application/Traces/tracemarkermodel.cpp @@ -316,7 +316,7 @@ QWidget *MarkerSettingsDelegate::createEditor(QWidget *parent, const QStyleOptio e->setMaximumHeight(rowHeight); e->setParent(parent); connect(e, &SIUnitEdit::valueUpdated, this, &MarkerSettingsDelegate::commitData); - connect(e, &SIUnitEdit::editingAborted, [=](){ + connect(e, &SIUnitEdit::focusLost, [=](){ marker->editingFrequeny = false; }); } @@ -327,7 +327,6 @@ void MarkerSettingsDelegate::setModelData(QWidget *editor, QAbstractItemModel *m { auto markerModel = (TraceMarkerModel*) model; auto marker = markerModel->markerFromIndex(index); - marker->editingFrequeny = false; auto si = (SIUnitEdit*) editor; markerModel->setData(index, si->value()); }