diff --git a/sdrgui/CMakeLists.txt b/sdrgui/CMakeLists.txt index e0d590907..0d9a3ad49 100644 --- a/sdrgui/CMakeLists.txt +++ b/sdrgui/CMakeLists.txt @@ -65,6 +65,7 @@ set(sdrgui_SOURCES gui/samplingdevicedialog.cpp gui/scaleengine.cpp gui/scaledimage.cpp + gui/scidoublespinbox.cpp gui/sdrangelsplash.cpp gui/spectrumcalibrationpointsdialog.cpp gui/spectrummarkersdialog.cpp @@ -168,6 +169,7 @@ set(sdrgui_HEADERS gui/samplingdevicedialog.h gui/scaleengine.h gui/scaledimage.h + gui/scidoublespinbox.h gui/sdrangelsplash.h gui/spectrumcalibrationpointsdialog.h gui/spectrummarkersdialog.h diff --git a/sdrgui/gui/scidoublespinbox.cpp b/sdrgui/gui/scidoublespinbox.cpp new file mode 100644 index 000000000..21b904881 --- /dev/null +++ b/sdrgui/gui/scidoublespinbox.cpp @@ -0,0 +1,60 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2022 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "scidoublespinbox.h" + +SciDoubleSpinBox::SciDoubleSpinBox(QWidget *parent) : + QDoubleSpinBox(parent) +{ +} + +double SciDoubleSpinBox::valueFromText(const QString &text) const +{ + return text.toDouble(); +} + +QValidator::State SciDoubleSpinBox::validate(QString &input, int &pos) const +{ + bool ok; + input.toDouble(&ok); + if (ok) { + return QValidator::Acceptable; + } + + QString validChars = "0123456789+-.e"; // 'C' locale, so no , separator + + for (int i = 0; i < input.size(); i++) + { + if (validChars.indexOf(input[i]) == -1) { + return QValidator::Invalid; + } + } + if (input.count('e') > 1) { + return QValidator::Invalid; + } + if (input.count('.') > 1) { + return QValidator::Invalid; + } + if (input.count('+') > 2) { + return QValidator::Invalid; + } + if (input.count('-') > 2) { + return QValidator::Invalid; + } + + return QValidator::Intermediate; +} diff --git a/sdrgui/gui/scidoublespinbox.h b/sdrgui/gui/scidoublespinbox.h new file mode 100644 index 000000000..c8ac1e3bf --- /dev/null +++ b/sdrgui/gui/scidoublespinbox.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2022 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef SDRGUI_GUI_SCIDOUBLESPINBOX_H +#define SDRGUI_GUI_SCIDOUBLESPINBOX_H + +#include + +#include "export.h" + +// Scientific double spin box. +// Like a double spin box, except that we additionally scientific E notation for entry +// (E.g. 4.5e-4) +class SDRGUI_API SciDoubleSpinBox : public QDoubleSpinBox { + Q_OBJECT + +public: + + explicit SciDoubleSpinBox(QWidget *parent = nullptr); + + virtual double valueFromText(const QString &text) const; + virtual QValidator::State validate(QString &input, int &pos) const; +}; + +#endif // SDRGUI_GUI_SCIDOUBLESPINBOX_H