From d97e804347b7c020097b05ae0ed831a7246b8b7d Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 10 Sep 2015 21:03:42 +0000 Subject: [PATCH] Fix some frequency display and l10n issues Frequency display in the band combo box line edit was suffering floating point precision issues. Input of frequencies was not honoring current locale rules. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@5881 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- FrequencyLineEdit.cpp | 81 ++++++++++++++++++++++--------------------- FrequencyList.cpp | 2 +- Radio.cpp | 26 +++++++++++--- Radio.hpp | 4 +-- 4 files changed, 66 insertions(+), 47 deletions(-) diff --git a/FrequencyLineEdit.cpp b/FrequencyLineEdit.cpp index e37800f8d..b51aecee9 100644 --- a/FrequencyLineEdit.cpp +++ b/FrequencyLineEdit.cpp @@ -1,40 +1,41 @@ -#include "FrequencyLineEdit.hpp" - -#include -#include -#include - -#include "moc_FrequencyLineEdit.cpp" - -FrequencyLineEdit::FrequencyLineEdit (QWidget * parent) - : QLineEdit (parent) -{ - setValidator (new QRegExpValidator {QRegExp {R"(\d{0,6}(\.\d{0,6})?)"}, this}); -} - -auto FrequencyLineEdit::frequency () const -> Frequency -{ - return Radio::frequency (text (), 6); -} - -void FrequencyLineEdit::frequency (Frequency f) -{ - setText (Radio::frequency_MHz_string (f)); -} - - -FrequencyDeltaLineEdit::FrequencyDeltaLineEdit (QWidget * parent) - : QLineEdit (parent) -{ - setValidator (new QRegExpValidator {QRegExp {R"(-?\d{0,6}(\.\d{0,6})?)"}, this}); -} - -auto FrequencyDeltaLineEdit::frequency_delta () const -> FrequencyDelta -{ - return Radio::frequency_delta (text (), 6); -} - -void FrequencyDeltaLineEdit::frequency_delta (FrequencyDelta d) -{ - setText (Radio::frequency_MHz_string (d)); -} +#include "FrequencyLineEdit.hpp" + +#include +#include +#include +#include + +#include "moc_FrequencyLineEdit.cpp" + +FrequencyLineEdit::FrequencyLineEdit (QWidget * parent) + : QLineEdit (parent) +{ + setValidator (new QRegExpValidator {QRegExp {QString {R"(\d{0,6}(\)"} + QLocale {}.decimalPoint () + R"(\d{0,6})?)"}, this}); +} + +auto FrequencyLineEdit::frequency () const -> Frequency +{ + return Radio::frequency (text (), 6); +} + +void FrequencyLineEdit::frequency (Frequency f) +{ + setText (Radio::frequency_MHz_string (f)); +} + + +FrequencyDeltaLineEdit::FrequencyDeltaLineEdit (QWidget * parent) + : QLineEdit (parent) +{ + setValidator (new QRegExpValidator {QRegExp {QString {R"(-?\d{0,6}(\)"} + QLocale {}.decimalPoint () + R"(\d{0,6})?)"}, this}); +} + +auto FrequencyDeltaLineEdit::frequency_delta () const -> FrequencyDelta +{ + return Radio::frequency_delta (text (), 6); +} + +void FrequencyDeltaLineEdit::frequency_delta (FrequencyDelta d) +{ + setText (Radio::frequency_MHz_string (d)); +} diff --git a/FrequencyList.cpp b/FrequencyList.cpp index d76264f9c..3d2ea482e 100644 --- a/FrequencyList.cpp +++ b/FrequencyList.cpp @@ -410,7 +410,7 @@ QVariant FrequencyList::impl::data (QModelIndex const& index, int role) const { case Qt::EditRole: case Qt::AccessibleTextRole: - item = frequency_item.frequency_ / 1.e6; + item = Radio::frequency_MHz_string (frequency_item.frequency_); break; case Qt::DisplayRole: diff --git a/Radio.cpp b/Radio.cpp index 496640edd..882ec48ab 100644 --- a/Radio.cpp +++ b/Radio.cpp @@ -22,14 +22,32 @@ namespace Radio } - Frequency frequency (QVariant const& v, int scale) + Frequency frequency (QVariant const& v, int scale, QLocale const& locale) { - return std::llround (v.toDouble () * std::pow (10., scale)); + double value {0}; + if (QVariant::String == v.type ()) + { + value = locale.toDouble (v.value ()); + } + else + { + value = v.toDouble (); + } + return std::llround (value * std::pow (10., scale)); } - FrequencyDelta frequency_delta (QVariant const& v, int scale) + FrequencyDelta frequency_delta (QVariant const& v, int scale, QLocale const& locale) { - return std::llround (v.toDouble () * std::pow (10., scale)); + double value {0}; + if (QVariant::String == v.type ()) + { + value = locale.toDouble (v.value ()); + } + else + { + value = v.toDouble (); + } + return std::llround (value * std::pow (10., scale)); } diff --git a/Radio.hpp b/Radio.hpp index ef3631099..85a5fcadf 100644 --- a/Radio.hpp +++ b/Radio.hpp @@ -25,8 +25,8 @@ namespace Radio // QVariant argument is convertible to double and is assumed to // be scaled by (10 ** -scale). // - Frequency frequency (QVariant const&, int scale); - FrequencyDelta frequency_delta (QVariant const&, int scale); + Frequency frequency (QVariant const&, int scale, QLocale const& = QLocale ()); + FrequencyDelta frequency_delta (QVariant const&, int scale, QLocale const& = QLocale ()); // // Frequency type formatting