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 @@ - + +