From 3d97e4ca20d4cb795543a92eba31bd6c7fe2a3d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Thu, 12 Nov 2020 18:56:39 +0100 Subject: [PATCH] Minor GUI improvements - allow 'wrong' input for unit edits where only one case makes sense (e.g. 10mHz for 10MHz) - fix behavior when changing center of span would exceed the allowed range - only change value for level or points when editing is finished (not on every keyboard input) --- .../CustomWidgets/siunitedit.cpp | 65 ++++++++++++++++--- .../PC_Application/CustomWidgets/siunitedit.h | 1 + .../SpectrumAnalyzer/spectrumanalyzer.cpp | 27 +++++--- Software/PC_Application/VNA/vna.cpp | 31 ++++++--- 4 files changed, 97 insertions(+), 27 deletions(-) diff --git a/Software/PC_Application/CustomWidgets/siunitedit.cpp b/Software/PC_Application/CustomWidgets/siunitedit.cpp index 544c0c4..739f9ce 100644 --- a/Software/PC_Application/CustomWidgets/siunitedit.cpp +++ b/Software/PC_Application/CustomWidgets/siunitedit.cpp @@ -4,6 +4,7 @@ #include #include #include +#include SIUnitEdit::SIUnitEdit(QString unit, QString prefixes, int precision, QWidget *parent) : QLineEdit(parent) @@ -28,9 +29,21 @@ SIUnitEdit::SIUnitEdit(QWidget *parent) void SIUnitEdit::setValue(double value) { - setValueQuiet(value); - emit valueChanged(value); - emit valueUpdated(this); + if(value != _value) { + setValueQuiet(value); + emit valueChanged(value); + emit valueUpdated(this); + } +} + +static char swapUpperLower(char c) { + if(isupper(c)) { + return tolower(c); + } else if(islower(c)) { + return toupper(c); + } else { + return c; + } } bool SIUnitEdit::eventFilter(QObject *, QEvent *event) @@ -47,16 +60,25 @@ bool SIUnitEdit::eventFilter(QObject *, QEvent *event) if(key == Qt::Key_Return) { // use new value without prefix parseNewValue(1.0); + continueEditing(); return true; } auto mod = static_cast(event)->modifiers(); if (!(mod & Qt::ShiftModifier)) { key = tolower(key); } - if(key <= 255 && prefixes.indexOf(key) >= 0) { - // a valid prefix key was pressed - parseNewValue(Unit::SIPrefixToFactor(key)); - return true; + if(key <= 255) { + if (prefixes.indexOf(key) >= 0) { + // a valid prefix key was pressed + parseNewValue(Unit::SIPrefixToFactor(key)); + continueEditing(); + return true; + } else if (prefixes.indexOf(swapUpperLower(key)) >= 0) { + // no match on the pressed case but on the upper/lower case instead -> also accept this + parseNewValue(Unit::SIPrefixToFactor(swapUpperLower(key))); + continueEditing(); + return true; + } } } else if(event->type() == QEvent::FocusOut) { if(!text().isEmpty()) { @@ -78,7 +100,30 @@ void SIUnitEdit::setValueQuiet(double value) void SIUnitEdit::parseNewValue(double factor) { - double v = text().toDouble() * factor; - setValue(v); - clearFocus(); + 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); + } else { + qWarning() << "SIUnit conversion failure:" << input; + } + clear(); +} + +void SIUnitEdit::continueEditing() +{ + setText(placeholderText()); + selectAll(); } diff --git a/Software/PC_Application/CustomWidgets/siunitedit.h b/Software/PC_Application/CustomWidgets/siunitedit.h index 5e868a9..e0419d7 100644 --- a/Software/PC_Application/CustomWidgets/siunitedit.h +++ b/Software/PC_Application/CustomWidgets/siunitedit.h @@ -25,6 +25,7 @@ protected: bool eventFilter(QObject *obj, QEvent *event) override; private: void parseNewValue(double factor); + void continueEditing(); QString unit, prefixes; int precision; double _value; diff --git a/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp b/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp index d658a88..94c80d5 100644 --- a/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp +++ b/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp @@ -294,12 +294,17 @@ void SpectrumAnalyzer::SetStopFreq(double freq) void SpectrumAnalyzer::SetCenterFreq(double freq) { auto old_span = settings.f_stop - settings.f_start; - if (freq > old_span / 2) { - settings.f_start = freq - old_span / 2; - settings.f_stop = freq + old_span / 2; - } else { + if (freq - old_span / 2 <= Device::Info().limits_minFreq) { + // would shift start frequency below minimum settings.f_start = 0; settings.f_stop = 2 * freq; + } else if(freq + old_span / 2 >= Device::Info().limits_maxFreq) { + // would shift stop frequency above maximum + settings.f_start = 2 * freq - Device::Info().limits_maxFreq; + settings.f_stop = Device::Info().limits_maxFreq; + } else { + settings.f_start = freq - old_span / 2; + settings.f_stop = freq + old_span / 2; } ConstrainAndUpdateFrequencies(); } @@ -307,12 +312,18 @@ void SpectrumAnalyzer::SetCenterFreq(double freq) void SpectrumAnalyzer::SetSpan(double span) { auto old_center = (settings.f_start + settings.f_stop) / 2; - if(old_center > span / 2) { - settings.f_start = old_center - span / 2; + if(old_center < Device::Info().limits_minFreq + span / 2) { + // would shift start frequency below minimum + settings.f_start = Device::Info().limits_minFreq; + settings.f_stop = Device::Info().limits_minFreq + span; + } else if(old_center > Device::Info().limits_maxFreq - span / 2) { + // would shift stop frequency above maximum + settings.f_start = Device::Info().limits_maxFreq - span; + settings.f_stop = Device::Info().limits_maxFreq; } else { - settings.f_start = 0; + settings.f_start = old_center - span / 2; + settings.f_stop = settings.f_start + span; } - settings.f_stop = old_center + span / 2; ConstrainAndUpdateFrequencies(); } diff --git a/Software/PC_Application/VNA/vna.cpp b/Software/PC_Application/VNA/vna.cpp index 924287a..c70a236 100644 --- a/Software/PC_Application/VNA/vna.cpp +++ b/Software/PC_Application/VNA/vna.cpp @@ -226,6 +226,7 @@ VNA::VNA(AppWindow *window) dbm->setSingleStep(0.25); dbm->setSuffix("dbm"); dbm->setToolTip("Stimulus level"); + dbm->setKeyboardTracking(false); connect(dbm, qOverload(&QDoubleSpinBox::valueChanged), this, &VNA::SetSourceLevel); connect(this, &VNA::sourceLevelChanged, dbm, &QDoubleSpinBox::setValue); tb_acq->addWidget(new QLabel("Level:")); @@ -233,9 +234,10 @@ VNA::VNA(AppWindow *window) auto points = new QSpinBox(); points->setFixedWidth(55); - points->setRange(1, 4501); + points->setRange(1, 9999); points->setSingleStep(100); points->setToolTip("Points/sweep"); + points->setKeyboardTracking(false); connect(points, qOverload(&QSpinBox::valueChanged), this, &VNA::SetPoints); connect(this, &VNA::pointsChanged, [=](int p) { points->blockSignals(true); @@ -502,12 +504,17 @@ void VNA::SetStopFreq(double freq) void VNA::SetCenterFreq(double freq) { auto old_span = settings.f_stop - settings.f_start; - if (freq > old_span / 2) { - settings.f_start = freq - old_span / 2; - settings.f_stop = freq + old_span / 2; - } else { + if (freq - old_span / 2 <= Device::Info().limits_minFreq) { + // would shift start frequency below minimum settings.f_start = 0; settings.f_stop = 2 * freq; + } else if(freq + old_span / 2 >= Device::Info().limits_maxFreq) { + // would shift stop frequency above maximum + settings.f_start = 2 * freq - Device::Info().limits_maxFreq; + settings.f_stop = Device::Info().limits_maxFreq; + } else { + settings.f_start = freq - old_span / 2; + settings.f_stop = freq + old_span / 2; } ConstrainAndUpdateFrequencies(); } @@ -515,12 +522,18 @@ void VNA::SetCenterFreq(double freq) void VNA::SetSpan(double span) { auto old_center = (settings.f_start + settings.f_stop) / 2; - if(old_center > span / 2) { - settings.f_start = old_center - span / 2; + if(old_center < Device::Info().limits_minFreq + span / 2) { + // would shift start frequency below minimum + settings.f_start = Device::Info().limits_minFreq; + settings.f_stop = Device::Info().limits_minFreq + span; + } else if(old_center > Device::Info().limits_maxFreq - span / 2) { + // would shift stop frequency above maximum + settings.f_start = Device::Info().limits_maxFreq - span; + settings.f_stop = Device::Info().limits_maxFreq; } else { - settings.f_start = 0; + settings.f_start = old_center - span / 2; + settings.f_stop = settings.f_start + span; } - settings.f_stop = old_center + span / 2; ConstrainAndUpdateFrequencies(); }