diff --git a/scwx-qt/res/icons/font-awesome-6/ruler-combined-solid.svg b/scwx-qt/res/icons/font-awesome-6/ruler-combined-solid.svg
new file mode 100644
index 00000000..e4947b53
--- /dev/null
+++ b/scwx-qt/res/icons/font-awesome-6/ruler-combined-solid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake
index 63063559..1c5458e3 100644
--- a/scwx-qt/scwx-qt.cmake
+++ b/scwx-qt/scwx-qt.cmake
@@ -289,9 +289,11 @@ set(UI_UI source/scwx/qt/ui/about_dialog.ui
source/scwx/qt/ui/settings_dialog.ui
source/scwx/qt/ui/update_dialog.ui)
set(HDR_UI_SETTINGS source/scwx/qt/ui/settings/hotkey_settings_widget.hpp
- source/scwx/qt/ui/settings/settings_page_widget.hpp)
+ source/scwx/qt/ui/settings/settings_page_widget.hpp
+ source/scwx/qt/ui/settings/unit_settings_widget.hpp)
set(SRC_UI_SETTINGS source/scwx/qt/ui/settings/hotkey_settings_widget.cpp
- source/scwx/qt/ui/settings/settings_page_widget.cpp)
+ source/scwx/qt/ui/settings/settings_page_widget.cpp
+ source/scwx/qt/ui/settings/unit_settings_widget.cpp)
set(HDR_UI_SETUP source/scwx/qt/ui/setup/audio_codec_page.hpp
source/scwx/qt/ui/setup/finish_page.hpp
source/scwx/qt/ui/setup/map_layout_page.hpp
diff --git a/scwx-qt/scwx-qt.qrc b/scwx-qt/scwx-qt.qrc
index 285594a1..6817307a 100644
--- a/scwx-qt/scwx-qt.qrc
+++ b/scwx-qt/scwx-qt.qrc
@@ -45,6 +45,7 @@
res/icons/font-awesome-6/pause-solid.svg
res/icons/font-awesome-6/play-solid.svg
res/icons/font-awesome-6/rotate-left-solid.svg
+ res/icons/font-awesome-6/ruler-combined-solid.svg
res/icons/font-awesome-6/sliders-solid.svg
res/icons/font-awesome-6/square-caret-down-regular.svg
res/icons/font-awesome-6/square-caret-right-regular.svg
diff --git a/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.cpp b/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.cpp
new file mode 100644
index 00000000..f38ae8a1
--- /dev/null
+++ b/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.cpp
@@ -0,0 +1,160 @@
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define SCWX_SETTINGS_COMBO_BOX(settingsInterface, comboBox, Iterator, ToName) \
+ for (const auto& enumValue : Iterator) \
+ { \
+ comboBox->addItem(QString::fromStdString(ToName(enumValue))); \
+ } \
+ \
+ settingsInterface.SetMapFromValueFunction( \
+ [](const std::string& text) -> std::string \
+ { \
+ for (const auto& enumValue : Iterator) \
+ { \
+ const std::string valueName = ToName(enumValue); \
+ \
+ if (boost::iequals(text, valueName)) \
+ { \
+ return valueName; \
+ } \
+ } \
+ \
+ return "?"; \
+ }); \
+ settingsInterface.SetMapToValueFunction( \
+ [](std::string text) -> std::string \
+ { \
+ boost::to_lower(text); \
+ return text; \
+ }); \
+ \
+ settingsInterface.SetEditWidget(comboBox);
+
+namespace scwx
+{
+namespace qt
+{
+namespace ui
+{
+
+static const std::string logPrefix_ =
+ "scwx::qt::ui::settings::unit_settings_widget";
+
+class UnitSettingsWidget::Impl
+{
+public:
+ explicit Impl(UnitSettingsWidget* self)
+ {
+ auto& unitSettings = settings::UnitSettings::Instance();
+
+ gridLayout_ = new QGridLayout(self);
+ contents_ = new QWidget(self);
+ contents_->setLayout(gridLayout_);
+
+ scrollArea_ = new QScrollArea(self);
+ scrollArea_->setHorizontalScrollBarPolicy(
+ Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
+ scrollArea_->setWidgetResizable(true);
+ scrollArea_->setWidget(contents_);
+
+ layout_ = new QVBoxLayout(self);
+ layout_->setContentsMargins(0, 0, 0, 0);
+ layout_->addWidget(scrollArea_);
+
+ self->setLayout(layout_);
+
+ int row = 0;
+
+ auto AddRow =
+ [&row, &self, this](
+ settings::SettingsInterface& settingsInterface,
+ const std::string& labelName,
+ QComboBox* comboBox)
+ {
+ QLabel* label = new QLabel(QObject::tr(labelName.c_str()), self);
+ QToolButton* resetButton = new QToolButton(self);
+
+ resetButton->setIcon(
+ QIcon {":/res/icons/font-awesome-6/rotate-left-solid.svg"});
+ resetButton->setVisible(false);
+
+ settingsInterface.SetResetButton(resetButton);
+
+ gridLayout_->addWidget(label, row, 0);
+ gridLayout_->addWidget(comboBox, row, 1);
+ gridLayout_->addWidget(resetButton, row, 2);
+
+ // Add to settings list
+ self->AddSettingsInterface(&settingsInterface);
+
+ ++row;
+ };
+
+ QComboBox* accumulationComboBox = new QComboBox(self);
+ accumulationComboBox->setSizePolicy(QSizePolicy::Expanding,
+ QSizePolicy::Preferred);
+ accumulationUnits_.SetSettingsVariable(unitSettings.accumulation_units());
+ SCWX_SETTINGS_COMBO_BOX(accumulationUnits_,
+ accumulationComboBox,
+ types::AccumulationUnitsIterator(),
+ types::GetAccumulationUnitsName);
+ AddRow(accumulationUnits_, "Accumulation", accumulationComboBox);
+
+ QComboBox* echoTopsComboBox = new QComboBox(self);
+ echoTopsComboBox->setSizePolicy(QSizePolicy::Expanding,
+ QSizePolicy::Preferred);
+ echoTopsUnits_.SetSettingsVariable(unitSettings.echo_tops_units());
+ SCWX_SETTINGS_COMBO_BOX(echoTopsUnits_,
+ echoTopsComboBox,
+ types::EchoTopsUnitsIterator(),
+ types::GetEchoTopsUnitsName);
+ AddRow(echoTopsUnits_, "Echo Tops", echoTopsComboBox);
+
+ QComboBox* speedComboBox = new QComboBox(self);
+ speedComboBox->setSizePolicy(QSizePolicy::Expanding,
+ QSizePolicy::Preferred);
+ speedUnits_.SetSettingsVariable(unitSettings.speed_units());
+ SCWX_SETTINGS_COMBO_BOX(speedUnits_,
+ speedComboBox,
+ types::SpeedUnitsIterator(),
+ types::GetSpeedUnitsName);
+ AddRow(speedUnits_, "Speed", speedComboBox);
+
+ QSpacerItem* spacer =
+ new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
+ gridLayout_->addItem(spacer, row, 0);
+ }
+ ~Impl() = default;
+
+ QWidget* contents_;
+ QLayout* layout_;
+ QScrollArea* scrollArea_ {};
+ QGridLayout* gridLayout_ {};
+
+ settings::SettingsInterface accumulationUnits_ {};
+ settings::SettingsInterface echoTopsUnits_ {};
+ settings::SettingsInterface speedUnits_ {};
+};
+
+UnitSettingsWidget::UnitSettingsWidget(QWidget* parent) :
+ SettingsPageWidget(parent), p {std::make_shared(this)}
+{
+}
+
+UnitSettingsWidget::~UnitSettingsWidget() = default;
+
+} // namespace ui
+} // namespace qt
+} // namespace scwx
diff --git a/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.hpp b/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.hpp
new file mode 100644
index 00000000..6416ef56
--- /dev/null
+++ b/scwx-qt/source/scwx/qt/ui/settings/unit_settings_widget.hpp
@@ -0,0 +1,29 @@
+#pragma once
+
+#include
+
+#include
+
+namespace scwx
+{
+namespace qt
+{
+namespace ui
+{
+
+class UnitSettingsWidget : public SettingsPageWidget
+{
+ Q_OBJECT
+
+public:
+ explicit UnitSettingsWidget(QWidget* parent = nullptr);
+ ~UnitSettingsWidget();
+
+private:
+ class Impl;
+ std::shared_ptr p;
+};
+
+} // namespace ui
+} // namespace qt
+} // namespace scwx
diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp
index bdf39f34..6830c4e6 100644
--- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp
+++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp
@@ -23,6 +23,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -178,6 +179,7 @@ public:
void SetupGeneralTab();
void SetupPalettesColorTablesTab();
void SetupPalettesAlertsTab();
+ void SetupUnitsTab();
void SetupAudioTab();
void SetupTextTab();
void SetupHotkeysTab();
@@ -222,6 +224,7 @@ public:
std::vector settingsPages_ {};
HotkeySettingsWidget* hotkeySettingsWidget_ {};
+ UnitSettingsWidget* unitSettingsWidget_ {};
settings::SettingsInterface defaultRadarSite_ {};
settings::SettingsInterface gridWidth_ {};
@@ -292,6 +295,9 @@ SettingsDialog::SettingsDialog(QWidget* parent) :
// Palettes > Alerts
p->SetupPalettesAlertsTab();
+ // Units
+ p->SetupUnitsTab();
+
// Audio
p->SetupAudioTab();
@@ -897,6 +903,16 @@ void SettingsDialogImpl::SetupPalettesAlertsTab()
}
}
+void SettingsDialogImpl::SetupUnitsTab()
+{
+ QVBoxLayout* layout = new QVBoxLayout(self_->ui->units);
+
+ unitSettingsWidget_ = new UnitSettingsWidget(self_->ui->units);
+ layout->addWidget(unitSettingsWidget_);
+
+ settingsPages_.push_back(unitSettingsWidget_);
+}
+
void SettingsDialogImpl::SetupAudioTab()
{
QObject::connect(
diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui
index 0b60427e..bb3761f7 100644
--- a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui
+++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui
@@ -77,6 +77,15 @@
:/res/icons/font-awesome-6/palette-solid.svg:/res/icons/font-awesome-6/palette-solid.svg
+ -
+
+ Units
+
+
+
+ :/res/icons/font-awesome-6/ruler-combined-solid.svg:/res/icons/font-awesome-6/ruler-combined-solid.svg
+
+
-
Audio
@@ -482,8 +491,8 @@
0
0
- 63
- 18
+ 506
+ 383
@@ -554,7 +563,8 @@
-
+
+
-