diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 280b1d95..282a1ffc 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -284,6 +284,10 @@ set(UI_UI source/scwx/qt/ui/about_dialog.ui source/scwx/qt/ui/radar_site_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) +set(SRC_UI_SETTINGS source/scwx/qt/ui/settings/hotkey_settings_widget.cpp + source/scwx/qt/ui/settings/settings_page_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 @@ -395,6 +399,8 @@ set(PROJECT_SOURCES ${HDR_MAIN} ${HDR_UI} ${SRC_UI} ${UI_UI} + ${HDR_UI_SETTINGS} + ${SRC_UI_SETTINGS} ${HDR_UI_SETUP} ${SRC_UI_SETUP} ${HDR_UTIL} @@ -408,41 +414,43 @@ set(PROJECT_SOURCES ${HDR_MAIN} ${CMAKE_FILES}) set(EXECUTABLE_SOURCES ${SRC_EXE_MAIN}) -source_group("Header Files\\main" FILES ${HDR_MAIN}) -source_group("Source Files\\main" FILES ${SRC_MAIN}) -source_group("Header Files\\config" FILES ${HDR_CONFIG}) -source_group("Source Files\\config" FILES ${SRC_CONFIG}) -source_group("Source Files\\external" FILES ${SRC_EXTERNAL}) -source_group("Header Files\\gl" FILES ${HDR_GL}) -source_group("Source Files\\gl" FILES ${SRC_GL}) -source_group("Header Files\\gl\\draw" FILES ${HDR_GL_DRAW}) -source_group("Source Files\\gl\\draw" FILES ${SRC_GL_DRAW}) -source_group("Header Files\\manager" FILES ${HDR_MANAGER}) -source_group("Source Files\\manager" FILES ${SRC_MANAGER}) -source_group("UI Files\\main" FILES ${UI_MAIN}) -source_group("Header Files\\map" FILES ${HDR_MAP}) -source_group("Source Files\\map" FILES ${SRC_MAP}) -source_group("Header Files\\model" FILES ${HDR_MODEL}) -source_group("Source Files\\model" FILES ${SRC_MODEL}) -source_group("Header Files\\request" FILES ${HDR_REQUEST}) -source_group("Source Files\\request" FILES ${SRC_REQUEST}) -source_group("Header Files\\settings" FILES ${HDR_SETTINGS}) -source_group("Source Files\\settings" FILES ${SRC_SETTINGS}) -source_group("Header Files\\types" FILES ${HDR_TYPES}) -source_group("Source Files\\types" FILES ${SRC_TYPES}) -source_group("Header Files\\ui" FILES ${HDR_UI}) -source_group("Source Files\\ui" FILES ${SRC_UI}) -source_group("Header Files\\ui\\setup" FILES ${HDR_UI_SETUP}) -source_group("Source Files\\ui\\setup" FILES ${SRC_UI_SETUP}) -source_group("UI Files\\ui" FILES ${UI_UI}) -source_group("Header Files\\util" FILES ${HDR_UTIL}) -source_group("Source Files\\util" FILES ${SRC_UTIL}) -source_group("Header Files\\view" FILES ${HDR_VIEW}) -source_group("Source Files\\view" FILES ${SRC_VIEW}) -source_group("OpenGL Shaders" FILES ${SHADER_FILES}) -source_group("Resources" FILES ${RESOURCE_FILES}) -source_group("Resources\\json" FILES ${JSON_FILES}) -source_group("I18N Files" FILES ${TS_FILES}) +source_group("Header Files\\main" FILES ${HDR_MAIN}) +source_group("Source Files\\main" FILES ${SRC_MAIN}) +source_group("Header Files\\config" FILES ${HDR_CONFIG}) +source_group("Source Files\\config" FILES ${SRC_CONFIG}) +source_group("Source Files\\external" FILES ${SRC_EXTERNAL}) +source_group("Header Files\\gl" FILES ${HDR_GL}) +source_group("Source Files\\gl" FILES ${SRC_GL}) +source_group("Header Files\\gl\\draw" FILES ${HDR_GL_DRAW}) +source_group("Source Files\\gl\\draw" FILES ${SRC_GL_DRAW}) +source_group("Header Files\\manager" FILES ${HDR_MANAGER}) +source_group("Source Files\\manager" FILES ${SRC_MANAGER}) +source_group("UI Files\\main" FILES ${UI_MAIN}) +source_group("Header Files\\map" FILES ${HDR_MAP}) +source_group("Source Files\\map" FILES ${SRC_MAP}) +source_group("Header Files\\model" FILES ${HDR_MODEL}) +source_group("Source Files\\model" FILES ${SRC_MODEL}) +source_group("Header Files\\request" FILES ${HDR_REQUEST}) +source_group("Source Files\\request" FILES ${SRC_REQUEST}) +source_group("Header Files\\settings" FILES ${HDR_SETTINGS}) +source_group("Source Files\\settings" FILES ${SRC_SETTINGS}) +source_group("Header Files\\types" FILES ${HDR_TYPES}) +source_group("Source Files\\types" FILES ${SRC_TYPES}) +source_group("Header Files\\ui" FILES ${HDR_UI}) +source_group("Source Files\\ui" FILES ${SRC_UI}) +source_group("Header Files\\ui\\settings" FILES ${HDR_UI_SETTINGS}) +source_group("Source Files\\ui\\settings" FILES ${SRC_UI_SETTINGS}) +source_group("Header Files\\ui\\setup" FILES ${HDR_UI_SETUP}) +source_group("Source Files\\ui\\setup" FILES ${SRC_UI_SETUP}) +source_group("UI Files\\ui" FILES ${UI_UI}) +source_group("Header Files\\util" FILES ${HDR_UTIL}) +source_group("Source Files\\util" FILES ${SRC_UTIL}) +source_group("Header Files\\view" FILES ${HDR_VIEW}) +source_group("Source Files\\view" FILES ${SRC_VIEW}) +source_group("OpenGL Shaders" FILES ${SHADER_FILES}) +source_group("Resources" FILES ${RESOURCE_FILES}) +source_group("Resources\\json" FILES ${JSON_FILES}) +source_group("I18N Files" FILES ${TS_FILES}) add_library(scwx-qt OBJECT ${PROJECT_SOURCES}) set_property(TARGET scwx-qt PROPERTY AUTOMOC ON) diff --git a/scwx-qt/source/scwx/qt/ui/settings/hotkey_settings_widget.cpp b/scwx-qt/source/scwx/qt/ui/settings/hotkey_settings_widget.cpp new file mode 100644 index 00000000..6a5aa3e7 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/settings/hotkey_settings_widget.cpp @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace ui +{ + +static const std::string logPrefix_ = + "scwx::qt::ui::settings::hotkey_settings_widget"; + +class HotkeySettingsWidget::Impl +{ +public: + explicit Impl(HotkeySettingsWidget* self) : + self_ {self}, layout_ {new QGridLayout(self)} + { + auto& hotkeySettings = settings::HotkeySettings::Instance(); + + layout_->setContentsMargins(0, 0, 0, 0); + + int row = 0; + + for (types::Hotkey hotkey : types::HotkeyIterator()) + { + const std::string& labelText = types::GetHotkeyLongName(hotkey); + + QLabel* label = new QLabel(QObject::tr(labelText.c_str()), self); + HotkeyEdit* hotkeyEdit = new HotkeyEdit(self); + QToolButton* resetButton = new QToolButton(self_); + + resetButton->setIcon( + QIcon {":/res/icons/font-awesome-6/rotate-left-solid.svg"}); + resetButton->setVisible(false); + + layout_->addWidget(label, row, 0); + layout_->addWidget(hotkeyEdit, row, 1); + layout_->addWidget(resetButton, row, 2); + + // Create settings interface + auto result = hotkeys_.emplace( + hotkey, settings::SettingsInterface {}); + auto& pair = *result.first; + auto& interface = pair.second; + + // Add to settings list + self_->AddSettingsInterface(&interface); + + auto& hotkeyVariable = hotkeySettings.hotkey(hotkey); + interface.SetSettingsVariable(hotkeyVariable); + interface.SetEditWidget(hotkeyEdit); + interface.SetResetButton(resetButton); + + ++row; + } + + QSpacerItem* spacer = + new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding); + layout_->addItem(spacer, row, 0); + } + ~Impl() = default; + + HotkeySettingsWidget* self_; + QGridLayout* layout_; + + boost::unordered_flat_map> + hotkeys_ {}; +}; + +HotkeySettingsWidget::HotkeySettingsWidget(QWidget* parent) : + SettingsPageWidget(parent), p {std::make_shared(this)} +{ +} + +HotkeySettingsWidget::~HotkeySettingsWidget() = default; + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/settings/hotkey_settings_widget.hpp b/scwx-qt/source/scwx/qt/ui/settings/hotkey_settings_widget.hpp new file mode 100644 index 00000000..9e8dd802 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/settings/hotkey_settings_widget.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace ui +{ + +class HotkeySettingsWidget : public SettingsPageWidget +{ + Q_OBJECT + +public: + explicit HotkeySettingsWidget(QWidget* parent = nullptr); + ~HotkeySettingsWidget(); + +private: + class Impl; + std::shared_ptr p; +}; + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/settings/settings_page_widget.cpp b/scwx-qt/source/scwx/qt/ui/settings/settings_page_widget.cpp new file mode 100644 index 00000000..d174fbbd --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/settings/settings_page_widget.cpp @@ -0,0 +1,68 @@ +#include +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace ui +{ + +static const std::string logPrefix_ = + "scwx::qt::ui::settings::settings_page_widget"; + +class SettingsPageWidget::Impl +{ +public: + explicit Impl() {} + ~Impl() = default; + + std::vector settings_; +}; + +SettingsPageWidget::SettingsPageWidget(QWidget* parent) : + QWidget(parent), p {std::make_shared()} +{ +} + +SettingsPageWidget::~SettingsPageWidget() = default; + +void SettingsPageWidget::AddSettingsInterface( + settings::SettingsInterfaceBase* setting) +{ + p->settings_.push_back(setting); +} + +bool SettingsPageWidget::CommitChanges() +{ + bool committed = false; + + for (auto& setting : p->settings_) + { + committed |= setting->Commit(); + } + + return committed; +} + +void SettingsPageWidget::DiscardChanges() +{ + for (auto& setting : p->settings_) + { + setting->Reset(); + } +} + +void SettingsPageWidget::ResetToDefault() +{ + for (auto& setting : p->settings_) + { + setting->StageDefault(); + } +} + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/settings/settings_page_widget.hpp b/scwx-qt/source/scwx/qt/ui/settings/settings_page_widget.hpp new file mode 100644 index 00000000..e2c2ea59 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/settings/settings_page_widget.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace ui +{ + +class SettingsPageWidget : public QWidget +{ + Q_OBJECT + +public: + explicit SettingsPageWidget(QWidget* parent = nullptr); + ~SettingsPageWidget(); + + bool CommitChanges(); + void DiscardChanges(); + void ResetToDefault(); + +protected: + void AddSettingsInterface(settings::SettingsInterfaceBase* setting); + +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 635324cc..04d9331a 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -177,6 +178,7 @@ public: void SetupPalettesAlertsTab(); void SetupAudioTab(); void SetupTextTab(); + void SetupHotkeysTab(); void ShowColorDialog(QLineEdit* lineEdit, QFrame* frame = nullptr); void UpdateRadarDialogLocation(const std::string& id); @@ -216,6 +218,9 @@ public: std::shared_ptr positionManager_ { manager::PositionManager::Instance()}; + std::vector settingsPages_ {}; + HotkeySettingsWidget* hotkeySettingsWidget_ {}; + settings::SettingsInterface defaultRadarSite_ {}; settings::SettingsInterface gridWidth_ {}; settings::SettingsInterface gridHeight_ {}; @@ -289,6 +294,9 @@ SettingsDialog::SettingsDialog(QWidget* parent) : // Text p->SetupTextTab(); + // Hotkeys + p->SetupHotkeysTab(); + p->ConnectSignals(); } @@ -1171,6 +1179,16 @@ void SettingsDialogImpl::SetupTextTab() self_->ui->radarSiteHoverTextCheckBox); } +void SettingsDialogImpl::SetupHotkeysTab() +{ + QVBoxLayout* layout = new QVBoxLayout(self_->ui->hotkeys); + + hotkeySettingsWidget_ = new HotkeySettingsWidget(self_->ui->hotkeys); + layout->addWidget(hotkeySettingsWidget_); + + settingsPages_.push_back(hotkeySettingsWidget_); +} + QImage SettingsDialogImpl::GenerateColorTableImage( std::shared_ptr colorTable, std::uint16_t min, @@ -1343,6 +1361,11 @@ void SettingsDialogImpl::ApplyChanges() committed |= setting->Commit(); } + for (auto& page : settingsPages_) + { + committed |= page->CommitChanges(); + } + if (committed) { manager::SettingsManager::Instance().SaveSettings(); @@ -1357,6 +1380,11 @@ void SettingsDialogImpl::DiscardChanges() { setting->Reset(); } + + for (auto& page : settingsPages_) + { + page->DiscardChanges(); + } } void SettingsDialogImpl::ResetToDefault() @@ -1367,6 +1395,11 @@ void SettingsDialogImpl::ResetToDefault() { setting->StageDefault(); } + + for (auto& page : settingsPages_) + { + page->ResetToDefault(); + } } std::string SettingsDialogImpl::RadarSiteLabel(