#include #include #include #include #include #include #include #include #include #include #include #include namespace scwx::qt::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, QFocusedComboBox* 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; }; // Qt manages the memory for these widgets // NOLINTBEGIN(cppcoreguidelines-owning-memory) auto* accumulationComboBox = new QFocusedComboBox(self); accumulationComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); accumulationComboBox->setFocusPolicy(Qt::StrongFocus); accumulationUnits_.SetSettingsVariable(unitSettings.accumulation_units()); SCWX_SETTINGS_COMBO_BOX(accumulationUnits_, accumulationComboBox, types::AccumulationUnitsIterator(), types::GetAccumulationUnitsName); AddRow(accumulationUnits_, "Accumulation", accumulationComboBox); auto* echoTopsComboBox = new QFocusedComboBox(self); echoTopsComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); echoTopsComboBox->setFocusPolicy(Qt::StrongFocus); echoTopsUnits_.SetSettingsVariable(unitSettings.echo_tops_units()); SCWX_SETTINGS_COMBO_BOX(echoTopsUnits_, echoTopsComboBox, types::EchoTopsUnitsIterator(), types::GetEchoTopsUnitsName); AddRow(echoTopsUnits_, "Echo Tops", echoTopsComboBox); auto* speedComboBox = new QFocusedComboBox(self); speedComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); speedComboBox->setFocusPolicy(Qt::StrongFocus); speedUnits_.SetSettingsVariable(unitSettings.speed_units()); SCWX_SETTINGS_COMBO_BOX(speedUnits_, speedComboBox, types::SpeedUnitsIterator(), types::GetSpeedUnitsName); AddRow(speedUnits_, "Speed", speedComboBox); auto* distanceComboBox = new QFocusedComboBox(self); distanceComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); distanceComboBox->setFocusPolicy(Qt::StrongFocus); distanceUnits_.SetSettingsVariable(unitSettings.distance_units()); SCWX_SETTINGS_COMBO_BOX(distanceUnits_, distanceComboBox, types::DistanceUnitsIterator(), types::GetDistanceUnitsName); AddRow(distanceUnits_, "Distance", distanceComboBox); auto* otherComboBox = new QFocusedComboBox(self); otherComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); otherComboBox->setFocusPolicy(Qt::StrongFocus); otherUnits_.SetSettingsVariable(unitSettings.other_units()); SCWX_SETTINGS_COMBO_BOX(otherUnits_, otherComboBox, types::OtherUnitsIterator(), types::GetOtherUnitsName); AddRow(otherUnits_, "Other", otherComboBox); auto* spacer = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding); gridLayout_->addItem(spacer, row, 0); // NOLINTEND(cppcoreguidelines-owning-memory) } ~Impl() = default; Impl(const Impl&) = delete; Impl(Impl&&) = delete; Impl& operator=(const Impl&) = delete; Impl& operator=(Impl&&) = delete; QWidget* contents_; QLayout* layout_; QScrollArea* scrollArea_ {}; QGridLayout* gridLayout_ {}; settings::SettingsInterface accumulationUnits_ {}; settings::SettingsInterface echoTopsUnits_ {}; settings::SettingsInterface otherUnits_ {}; settings::SettingsInterface speedUnits_ {}; settings::SettingsInterface distanceUnits_ {}; }; UnitSettingsWidget::UnitSettingsWidget(QWidget* parent) : SettingsPageWidget(parent), p {std::make_shared(this)} { } UnitSettingsWidget::~UnitSettingsWidget() = default; } // namespace scwx::qt::ui