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)
This commit is contained in:
parent
3ce4a88a25
commit
3d97e4ca20
@ -4,6 +4,7 @@
|
|||||||
#include <unit.h>
|
#include <unit.h>
|
||||||
#include <QEvent>
|
#include <QEvent>
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
SIUnitEdit::SIUnitEdit(QString unit, QString prefixes, int precision, QWidget *parent)
|
SIUnitEdit::SIUnitEdit(QString unit, QString prefixes, int precision, QWidget *parent)
|
||||||
: QLineEdit(parent)
|
: QLineEdit(parent)
|
||||||
@ -28,9 +29,21 @@ SIUnitEdit::SIUnitEdit(QWidget *parent)
|
|||||||
|
|
||||||
void SIUnitEdit::setValue(double value)
|
void SIUnitEdit::setValue(double value)
|
||||||
{
|
{
|
||||||
|
if(value != _value) {
|
||||||
setValueQuiet(value);
|
setValueQuiet(value);
|
||||||
emit valueChanged(value);
|
emit valueChanged(value);
|
||||||
emit valueUpdated(this);
|
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)
|
bool SIUnitEdit::eventFilter(QObject *, QEvent *event)
|
||||||
@ -47,16 +60,25 @@ bool SIUnitEdit::eventFilter(QObject *, QEvent *event)
|
|||||||
if(key == Qt::Key_Return) {
|
if(key == Qt::Key_Return) {
|
||||||
// use new value without prefix
|
// use new value without prefix
|
||||||
parseNewValue(1.0);
|
parseNewValue(1.0);
|
||||||
|
continueEditing();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
auto mod = static_cast<QKeyEvent *>(event)->modifiers();
|
auto mod = static_cast<QKeyEvent *>(event)->modifiers();
|
||||||
if (!(mod & Qt::ShiftModifier)) {
|
if (!(mod & Qt::ShiftModifier)) {
|
||||||
key = tolower(key);
|
key = tolower(key);
|
||||||
}
|
}
|
||||||
if(key <= 255 && prefixes.indexOf(key) >= 0) {
|
if(key <= 255) {
|
||||||
|
if (prefixes.indexOf(key) >= 0) {
|
||||||
// a valid prefix key was pressed
|
// a valid prefix key was pressed
|
||||||
parseNewValue(Unit::SIPrefixToFactor(key));
|
parseNewValue(Unit::SIPrefixToFactor(key));
|
||||||
|
continueEditing();
|
||||||
return true;
|
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) {
|
} else if(event->type() == QEvent::FocusOut) {
|
||||||
if(!text().isEmpty()) {
|
if(!text().isEmpty()) {
|
||||||
@ -78,7 +100,30 @@ void SIUnitEdit::setValueQuiet(double value)
|
|||||||
|
|
||||||
void SIUnitEdit::parseNewValue(double factor)
|
void SIUnitEdit::parseNewValue(double factor)
|
||||||
{
|
{
|
||||||
double v = text().toDouble() * factor;
|
QString input = text();
|
||||||
setValue(v);
|
// remove optional unit
|
||||||
clearFocus();
|
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();
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ protected:
|
|||||||
bool eventFilter(QObject *obj, QEvent *event) override;
|
bool eventFilter(QObject *obj, QEvent *event) override;
|
||||||
private:
|
private:
|
||||||
void parseNewValue(double factor);
|
void parseNewValue(double factor);
|
||||||
|
void continueEditing();
|
||||||
QString unit, prefixes;
|
QString unit, prefixes;
|
||||||
int precision;
|
int precision;
|
||||||
double _value;
|
double _value;
|
||||||
|
@ -294,12 +294,17 @@ void SpectrumAnalyzer::SetStopFreq(double freq)
|
|||||||
void SpectrumAnalyzer::SetCenterFreq(double freq)
|
void SpectrumAnalyzer::SetCenterFreq(double freq)
|
||||||
{
|
{
|
||||||
auto old_span = settings.f_stop - settings.f_start;
|
auto old_span = settings.f_stop - settings.f_start;
|
||||||
if (freq > old_span / 2) {
|
if (freq - old_span / 2 <= Device::Info().limits_minFreq) {
|
||||||
settings.f_start = freq - old_span / 2;
|
// would shift start frequency below minimum
|
||||||
settings.f_stop = freq + old_span / 2;
|
|
||||||
} else {
|
|
||||||
settings.f_start = 0;
|
settings.f_start = 0;
|
||||||
settings.f_stop = 2 * freq;
|
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();
|
ConstrainAndUpdateFrequencies();
|
||||||
}
|
}
|
||||||
@ -307,12 +312,18 @@ void SpectrumAnalyzer::SetCenterFreq(double freq)
|
|||||||
void SpectrumAnalyzer::SetSpan(double span)
|
void SpectrumAnalyzer::SetSpan(double span)
|
||||||
{
|
{
|
||||||
auto old_center = (settings.f_start + settings.f_stop) / 2;
|
auto old_center = (settings.f_start + settings.f_stop) / 2;
|
||||||
if(old_center > span / 2) {
|
if(old_center < Device::Info().limits_minFreq + span / 2) {
|
||||||
settings.f_start = old_center - 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 {
|
} 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();
|
ConstrainAndUpdateFrequencies();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,6 +226,7 @@ VNA::VNA(AppWindow *window)
|
|||||||
dbm->setSingleStep(0.25);
|
dbm->setSingleStep(0.25);
|
||||||
dbm->setSuffix("dbm");
|
dbm->setSuffix("dbm");
|
||||||
dbm->setToolTip("Stimulus level");
|
dbm->setToolTip("Stimulus level");
|
||||||
|
dbm->setKeyboardTracking(false);
|
||||||
connect(dbm, qOverload<double>(&QDoubleSpinBox::valueChanged), this, &VNA::SetSourceLevel);
|
connect(dbm, qOverload<double>(&QDoubleSpinBox::valueChanged), this, &VNA::SetSourceLevel);
|
||||||
connect(this, &VNA::sourceLevelChanged, dbm, &QDoubleSpinBox::setValue);
|
connect(this, &VNA::sourceLevelChanged, dbm, &QDoubleSpinBox::setValue);
|
||||||
tb_acq->addWidget(new QLabel("Level:"));
|
tb_acq->addWidget(new QLabel("Level:"));
|
||||||
@ -233,9 +234,10 @@ VNA::VNA(AppWindow *window)
|
|||||||
|
|
||||||
auto points = new QSpinBox();
|
auto points = new QSpinBox();
|
||||||
points->setFixedWidth(55);
|
points->setFixedWidth(55);
|
||||||
points->setRange(1, 4501);
|
points->setRange(1, 9999);
|
||||||
points->setSingleStep(100);
|
points->setSingleStep(100);
|
||||||
points->setToolTip("Points/sweep");
|
points->setToolTip("Points/sweep");
|
||||||
|
points->setKeyboardTracking(false);
|
||||||
connect(points, qOverload<int>(&QSpinBox::valueChanged), this, &VNA::SetPoints);
|
connect(points, qOverload<int>(&QSpinBox::valueChanged), this, &VNA::SetPoints);
|
||||||
connect(this, &VNA::pointsChanged, [=](int p) {
|
connect(this, &VNA::pointsChanged, [=](int p) {
|
||||||
points->blockSignals(true);
|
points->blockSignals(true);
|
||||||
@ -502,12 +504,17 @@ void VNA::SetStopFreq(double freq)
|
|||||||
void VNA::SetCenterFreq(double freq)
|
void VNA::SetCenterFreq(double freq)
|
||||||
{
|
{
|
||||||
auto old_span = settings.f_stop - settings.f_start;
|
auto old_span = settings.f_stop - settings.f_start;
|
||||||
if (freq > old_span / 2) {
|
if (freq - old_span / 2 <= Device::Info().limits_minFreq) {
|
||||||
settings.f_start = freq - old_span / 2;
|
// would shift start frequency below minimum
|
||||||
settings.f_stop = freq + old_span / 2;
|
|
||||||
} else {
|
|
||||||
settings.f_start = 0;
|
settings.f_start = 0;
|
||||||
settings.f_stop = 2 * freq;
|
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();
|
ConstrainAndUpdateFrequencies();
|
||||||
}
|
}
|
||||||
@ -515,12 +522,18 @@ void VNA::SetCenterFreq(double freq)
|
|||||||
void VNA::SetSpan(double span)
|
void VNA::SetSpan(double span)
|
||||||
{
|
{
|
||||||
auto old_center = (settings.f_start + settings.f_stop) / 2;
|
auto old_center = (settings.f_start + settings.f_stop) / 2;
|
||||||
if(old_center > span / 2) {
|
if(old_center < Device::Info().limits_minFreq + span / 2) {
|
||||||
settings.f_start = old_center - 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 {
|
} 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();
|
ConstrainAndUpdateFrequencies();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user