From 6dd4c5dbf4210f219cf66ce58a4dff6457f17a5c Mon Sep 17 00:00:00 2001 From: Tomas Fabrizio Orsi Date: Sun, 8 Jun 2025 15:34:07 -0300 Subject: [PATCH 1/5] feat: add unit system buttons in gui settings tab Signed-off-by: Tomas Fabrizio Orsi --- ui/SettingsDialog.ui | 52 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/ui/SettingsDialog.ui b/ui/SettingsDialog.ui index aecaf307..3b2c5351 100644 --- a/ui/SettingsDialog.ui +++ b/ui/SettingsDialog.ui @@ -42,7 +42,7 @@ - 0 + 9 false @@ -3601,8 +3601,7 @@ Browse - - .. + @@ -4366,6 +4365,51 @@ + + + + + + System + + + + + + + Imperial + + + + + + + Metric + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Unit Format + + + @@ -5684,7 +5728,7 @@ updateDateFormatResult() - + From a98beeae53e596a3767cc1426a5c4d2a3a8ee17a Mon Sep 17 00:00:00 2001 From: Tomas Fabrizio Orsi Date: Sun, 8 Jun 2025 23:34:52 -0300 Subject: [PATCH 2/5] feat: implement unit setting persistency Signed-off-by: Tomas Fabrizio Orsi --- core/LogLocale.cpp | 15 +++++++++++++++ core/LogLocale.h | 7 +++++++ ui/SettingsDialog.cpp | 33 +++++++++++++++++++++++++++++++++ ui/SettingsDialog.h | 2 ++ 4 files changed, 57 insertions(+) diff --git a/core/LogLocale.cpp b/core/LogLocale.cpp index 5743c0c6..8f82841b 100644 --- a/core/LogLocale.cpp +++ b/core/LogLocale.cpp @@ -108,6 +108,21 @@ void LogLocale::setSettingUseSystemDateFormat(bool value) settings.setValue("usesystemdateformat", value); } +const UnitFormat LogLocale::getSettingUnitFormat() const +{ + QVariant value = settings.value("useunitformat", unit_format); + + int savedUnit = value.value(); + UnitFormat unit = static_cast(savedUnit); + + return unit; +} + +void LogLocale::setSettingUnitFormat(UnitFormat value) +{ + settings.setValue("useunitformat", value); +} + const QString LogLocale::getSettingDateFormat() const { return settings.value("customdateformatstring", systemDateFormat).toString(); diff --git a/core/LogLocale.h b/core/LogLocale.h index c02a1e8f..c55406a7 100644 --- a/core/LogLocale.h +++ b/core/LogLocale.h @@ -5,6 +5,8 @@ #include #include +enum UnitFormat { System, Imperial, Metric }; + class LogLocale : public QLocale { public: @@ -21,16 +23,21 @@ class LogLocale : public QLocale bool getSettingUseSystemDateFormat() const; void setSettingUseSystemDateFormat(bool value); + const UnitFormat getSettingUnitFormat() const; + void setSettingUnitFormat(UnitFormat value); + const QString getSettingDateFormat() const; void setSettingDateFormat(const QString &value); private: const QRegularExpression regexp; bool is24hUsed; + UnitFormat unit_format; QSettings settings; QString systemDateFormat; void changeTime12_24Format(QString &formatString) const; }; + #endif // QLOG_CORE_LOGLOCALE_H diff --git a/ui/SettingsDialog.cpp b/ui/SettingsDialog.cpp index 3007ecee..7ebaaf73 100644 --- a/ui/SettingsDialog.cpp +++ b/ui/SettingsDialog.cpp @@ -2366,6 +2366,24 @@ void SettingsDialog::readSettings() { ui->timeFormat24RadioButton->setChecked(timeformat24); ui->timeFormat12RadioButton->setChecked(!timeformat24); + UnitFormat unitFormat = locale.getSettingUnitFormat(); + switch (unitFormat) { + case UnitFormat::System: + ui->unitFormatSystemRadioButton->setChecked(true); + ui->unitFormatImperialRadioButton->setChecked(false); + ui->unitFormatMetricRadioButton->setChecked(false); + break; + case UnitFormat::Imperial: + ui->unitFormatSystemRadioButton->setChecked(false); + ui->unitFormatImperialRadioButton->setChecked(true); + ui->unitFormatMetricRadioButton->setChecked(false); + break; + case UnitFormat::Metric: + ui->unitFormatSystemRadioButton->setChecked(false); + ui->unitFormatImperialRadioButton->setChecked(false); + ui->unitFormatMetricRadioButton->setChecked(true); + break; + } bool dateSystemFormat = locale.getSettingUseSystemDateFormat(); ui->dateFormatSystemRadioButton->setChecked(dateSystemFormat); ui->dateFormatCustomRadioButton->setChecked(!dateSystemFormat); @@ -2486,12 +2504,27 @@ void SettingsDialog::writeSettings() { /*******/ /* GUI */ /*******/ + // Time format locale.setSettingUse24hformat(ui->timeFormat24RadioButton->isChecked()); + // Date format bool systemDateChecked = ui->dateFormatSystemRadioButton->isChecked(); locale.setSettingUseSystemDateFormat(systemDateChecked); if ( !systemDateChecked ) locale.setSettingDateFormat(ui->dateFormatStringEdit->text()); + + // Unit format + UnitFormat chosenUnit = getChosenUnitFormat(); + locale.setSettingUnitFormat(chosenUnit); +} +UnitFormat SettingsDialog::getChosenUnitFormat() { + if (ui->unitFormatMetricRadioButton->isChecked()) { + return UnitFormat::Metric; + } else if (ui->unitFormatImperialRadioButton->isChecked()) { + return UnitFormat::Imperial; + } else { + return UnitFormat::System; + } } /* this function is called when user modify rig progile diff --git a/ui/SettingsDialog.h b/ui/SettingsDialog.h index 405a3f09..78bab90f 100644 --- a/ui/SettingsDialog.h +++ b/ui/SettingsDialog.h @@ -128,6 +128,8 @@ public slots: QString getMemberListComboValue(const QComboBox *); void generateMembershipCheckboxes(); + UnitFormat getChosenUnitFormat(); + QSqlTableModel* modeTableModel; QSqlTableModel* bandTableModel; StationProfilesManager *stationProfManager; From 6c6f012c6cdfed6fe9f3084134577aa28d767d4a Mon Sep 17 00:00:00 2001 From: Tomas Fabrizio Orsi Date: Mon, 9 Jun 2025 00:49:44 -0300 Subject: [PATCH 3/5] feat: [WIP] distance2localeUnitDistance now takes into accout chosen unit setting in gui tab Signed-off-by: Tomas Fabrizio Orsi --- core/Gridsquare.cpp | 21 +++++++++++++++++---- core/Gridsquare.h | 4 +++- ui/NewContactWidget.cpp | 2 +- ui/QSODetailDialog.cpp | 2 +- ui/StatisticsWidget.cpp | 4 ++-- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/core/Gridsquare.cpp b/core/Gridsquare.cpp index ba9b3351..bdfccf3b 100644 --- a/core/Gridsquare.cpp +++ b/core/Gridsquare.cpp @@ -132,19 +132,32 @@ const QRegularExpression Gridsquare::gridExtRegEx() } double Gridsquare::distance2localeUnitDistance(double km, - QString &unit) + QString &unit, + LogLocale &locale) { FCT_IDENTIFICATION; unit = QObject::tr("km"); double ret = km; - // All imperial systems - if ( QLocale::system().measurementSystem() != QLocale::MetricSystem) - { + UnitFormat chosenUnit = locale.getSettingUnitFormat(); + switch (chosenUnit) { + case UnitFormat::System: + // All imperial systems + if ( QLocale::system().measurementSystem() != QLocale::MetricSystem) + { + unit = QObject::tr("miles"); + ret = km * localeDistanceCoef(); + } + break; + case UnitFormat::Imperial: unit = QObject::tr("miles"); ret = km * localeDistanceCoef(); + break; + case UnitFormat::Metric: + break; } + return ret; } diff --git a/core/Gridsquare.h b/core/Gridsquare.h index 7e564d6f..eae40149 100644 --- a/core/Gridsquare.h +++ b/core/Gridsquare.h @@ -5,6 +5,8 @@ #include #include +#include "core/LogLocale.h" + class Gridsquare { public: @@ -14,7 +16,7 @@ class Gridsquare static const QRegularExpression gridRegEx(); static const QRegularExpression gridVUCCRegEx(); static const QRegularExpression gridExtRegEx(); - static double distance2localeUnitDistance(double km, QString &unit); + static double distance2localeUnitDistance(double km, QString &unit, LogLocale &locale); static double localeDistanceCoef(); bool isValid() const; diff --git a/ui/NewContactWidget.cpp b/ui/NewContactWidget.cpp index f00d2409..fb4f5786 100644 --- a/ui/NewContactWidget.cpp +++ b/ui/NewContactWidget.cpp @@ -2168,7 +2168,7 @@ void NewContactWidget::updateCoordinates(double lat, double lon, CoordPrecision { dxDistance = distance; QString unit; - double showDistance = Gridsquare::distance2localeUnitDistance(dxDistance, unit); + double showDistance = Gridsquare::distance2localeUnitDistance(dxDistance, unit, locale); double LPBearing = bearing - 180; if ( LPBearing < 0 ) diff --git a/ui/QSODetailDialog.cpp b/ui/QSODetailDialog.cpp index 82ee9118..9ddc8fd3 100644 --- a/ui/QSODetailDialog.cpp +++ b/ui/QSODetailDialog.cpp @@ -1421,7 +1421,7 @@ void QSODetailDialog::drawDXOnMap(const QString &label, const Gridsquare &dxGrid double distance = 0; if (dxGrid.distanceTo(myGrid, distance)) { - distance = Gridsquare::distance2localeUnitDistance(distance, unit); + distance = Gridsquare::distance2localeUnitDistance(distance, unit, locale); popupString.append(QString("
%1 %2").arg(QString::number(distance, 'f', 0), unit)); } diff --git a/ui/StatisticsWidget.cpp b/ui/StatisticsWidget.cpp index c8668858..6b54fe80 100644 --- a/ui/StatisticsWidget.cpp +++ b/ui/StatisticsWidget.cpp @@ -340,7 +340,7 @@ void StatisticsWidget::refreshGraph() break; case 2: // ODX QString unit; - Gridsquare::distance2localeUnitDistance(0, unit); + Gridsquare::distance2localeUnitDistance(0, unit, locale); QString distCoef = QString::number(Gridsquare::localeDistanceCoef()); QString sel = QString("SELECT callsign || '
' || CAST(ROUND(distance * %1,0) AS INT) || ' %2', gridsquare, my_gridsquare, ").arg(distCoef, unit); @@ -735,7 +735,7 @@ void StatisticsWidget::setSubTypesCombo(int mainTypeIdx) case 3: { QString unit; - Gridsquare::distance2localeUnitDistance(0, unit); + Gridsquare::distance2localeUnitDistance(0, unit, locale); ui->statTypeSecCombo->addItem(tr("Distance") + QString(" [%1]").arg(unit)); } break; From 09798b39dce5088d1249e9530cd6b674022285bf Mon Sep 17 00:00:00 2001 From: Tomas Fabrizio Orsi Date: Mon, 9 Jun 2025 00:50:29 -0300 Subject: [PATCH 4/5] fix: comment out settings where locale is not available Signed-off-by: Tomas Fabrizio Orsi --- ui/StyleItemDelegate.h | 5 ++++- ui/WsjtxFilterDialog.cpp | 2 +- ui/WsjtxWidget.cpp | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ui/StyleItemDelegate.h b/ui/StyleItemDelegate.h index 002620ed..6e4b8c2d 100644 --- a/ui/StyleItemDelegate.h +++ b/ui/StyleItemDelegate.h @@ -207,6 +207,8 @@ class UnitFormatDelegate : public QStyledItemDelegate { }; class DistanceFormatDelegate : public QStyledItemDelegate { +private: + LogLocale locale; public: DistanceFormatDelegate(int precision, double step, QObject* parent = 0) : QStyledItemDelegate(parent), precision(precision), step(step) { } @@ -218,7 +220,8 @@ class DistanceFormatDelegate : public QStyledItemDelegate { QString displayText(const QVariant& value, const QLocale&) const { QString unit; - double displayValue = Gridsquare::distance2localeUnitDistance(value.toDouble(), unit); + // double displayValue = Gridsquare::distance2localeUnitDistance(value.toDouble(), unit, locale); + double displayValue = 1.0; return QString("%1 %2").arg(QString::number(displayValue, 'f', precision), unit); } diff --git a/ui/WsjtxFilterDialog.cpp b/ui/WsjtxFilterDialog.cpp index 9760638d..b208e2cd 100644 --- a/ui/WsjtxFilterDialog.cpp +++ b/ui/WsjtxFilterDialog.cpp @@ -16,7 +16,7 @@ WsjtxFilterDialog::WsjtxFilterDialog(QWidget *parent) : ui->setupUi(this); QString unit; - Gridsquare::distance2localeUnitDistance(0, unit); + // Gridsquare::distance2localeUnitDistance(0, unit); ui->distanceSpinBox->setSuffix(" " + unit); /*********************/ diff --git a/ui/WsjtxWidget.cpp b/ui/WsjtxWidget.cpp index f7073db4..74585151 100644 --- a/ui/WsjtxWidget.cpp +++ b/ui/WsjtxWidget.cpp @@ -110,7 +110,7 @@ void WsjtxWidget::decodeReceived(WsjtxDecode decode) if ( entry.dxcc.cont.contains(contregexp) && ( entry.status & dxccStatusFilter ) - && Gridsquare::distance2localeUnitDistance(entry.distance, unit) >= distanceFilter + // && Gridsquare::distance2localeUnitDistance(entry.distance, unit) >= distanceFilter && entry.decode.snr >= snrFilter && ( dxMemberFilter.size() == 0 || (dxMemberFilter.size() && entry.memberList2Set().intersects(dxMemberFilter))) From 70c0c7e4df4bbcdf11f7c0a8bcd651f1aa009f57 Mon Sep 17 00:00:00 2001 From: Tomas Fabrizio Orsi Date: Mon, 9 Jun 2025 01:08:31 -0300 Subject: [PATCH 5/5] fix: add missing locale reference in commented calls to distance2localeUnitDistance Signed-off-by: Tomas Fabrizio Orsi --- core/Gridsquare.cpp | 2 +- core/Gridsquare.h | 2 +- ui/StyleItemDelegate.h | 3 +-- ui/WsjtxFilterDialog.cpp | 2 +- ui/WsjtxFilterDialog.h | 2 ++ ui/WsjtxWidget.cpp | 2 +- ui/WsjtxWidget.h | 2 ++ 7 files changed, 9 insertions(+), 6 deletions(-) diff --git a/core/Gridsquare.cpp b/core/Gridsquare.cpp index bdfccf3b..28a14e77 100644 --- a/core/Gridsquare.cpp +++ b/core/Gridsquare.cpp @@ -133,7 +133,7 @@ const QRegularExpression Gridsquare::gridExtRegEx() double Gridsquare::distance2localeUnitDistance(double km, QString &unit, - LogLocale &locale) + const LogLocale &locale) { FCT_IDENTIFICATION; diff --git a/core/Gridsquare.h b/core/Gridsquare.h index eae40149..adb4046d 100644 --- a/core/Gridsquare.h +++ b/core/Gridsquare.h @@ -16,7 +16,7 @@ class Gridsquare static const QRegularExpression gridRegEx(); static const QRegularExpression gridVUCCRegEx(); static const QRegularExpression gridExtRegEx(); - static double distance2localeUnitDistance(double km, QString &unit, LogLocale &locale); + static double distance2localeUnitDistance(double km, QString &unit, const LogLocale &locale); static double localeDistanceCoef(); bool isValid() const; diff --git a/ui/StyleItemDelegate.h b/ui/StyleItemDelegate.h index 6e4b8c2d..c3efc6f9 100644 --- a/ui/StyleItemDelegate.h +++ b/ui/StyleItemDelegate.h @@ -220,8 +220,7 @@ class DistanceFormatDelegate : public QStyledItemDelegate { QString displayText(const QVariant& value, const QLocale&) const { QString unit; - // double displayValue = Gridsquare::distance2localeUnitDistance(value.toDouble(), unit, locale); - double displayValue = 1.0; + double displayValue = Gridsquare::distance2localeUnitDistance(value.toDouble(), unit, locale); return QString("%1 %2").arg(QString::number(displayValue, 'f', precision), unit); } diff --git a/ui/WsjtxFilterDialog.cpp b/ui/WsjtxFilterDialog.cpp index b208e2cd..5f8872f1 100644 --- a/ui/WsjtxFilterDialog.cpp +++ b/ui/WsjtxFilterDialog.cpp @@ -16,7 +16,7 @@ WsjtxFilterDialog::WsjtxFilterDialog(QWidget *parent) : ui->setupUi(this); QString unit; - // Gridsquare::distance2localeUnitDistance(0, unit); + Gridsquare::distance2localeUnitDistance(0, unit, locale); ui->distanceSpinBox->setSuffix(" " + unit); /*********************/ diff --git a/ui/WsjtxFilterDialog.h b/ui/WsjtxFilterDialog.h index c6421be9..60a86c46 100644 --- a/ui/WsjtxFilterDialog.h +++ b/ui/WsjtxFilterDialog.h @@ -4,6 +4,7 @@ #include #include #include +#include "core/LogLocale.h" namespace Ui { class WsjtxFilterDialog; @@ -22,6 +23,7 @@ class WsjtxFilterDialog : public QDialog Ui::WsjtxFilterDialog *ui; QList memberListCheckBoxes; QSet dxMemberFilter; + LogLocale locale; void generateMembershipCheckboxes(); diff --git a/ui/WsjtxWidget.cpp b/ui/WsjtxWidget.cpp index 74585151..97a0a1d0 100644 --- a/ui/WsjtxWidget.cpp +++ b/ui/WsjtxWidget.cpp @@ -110,7 +110,7 @@ void WsjtxWidget::decodeReceived(WsjtxDecode decode) if ( entry.dxcc.cont.contains(contregexp) && ( entry.status & dxccStatusFilter ) - // && Gridsquare::distance2localeUnitDistance(entry.distance, unit) >= distanceFilter + && Gridsquare::distance2localeUnitDistance(entry.distance, unit, locale) >= distanceFilter && entry.decode.snr >= snrFilter && ( dxMemberFilter.size() == 0 || (dxMemberFilter.size() && entry.memberList2Set().intersects(dxMemberFilter))) diff --git a/ui/WsjtxWidget.h b/ui/WsjtxWidget.h index d528a8e4..61e0888a 100644 --- a/ui/WsjtxWidget.h +++ b/ui/WsjtxWidget.h @@ -7,6 +7,7 @@ #include "data/WsjtxEntry.h" #include "models/WsjtxTableModel.h" #include "rig/Rig.h" +#include "core/LogLocale.h" namespace Ui { class WsjtxWidget; @@ -64,6 +65,7 @@ private slots: QSet dxMemberFilter; void saveTableHeaderState(); void restoreTableHeaderState(); + LogLocale locale; }; #endif // QLOG_UI_WSJTXWIDGET_H