diff --git a/scwx-qt/source/scwx/qt/settings/settings_interface.hpp b/scwx-qt/source/scwx/qt/settings/settings_interface.hpp index 030b8996..4ba1ea0e 100644 --- a/scwx-qt/source/scwx/qt/settings/settings_interface.hpp +++ b/scwx-qt/source/scwx/qt/settings/settings_interface.hpp @@ -103,6 +103,7 @@ private: #ifdef SETTINGS_INTERFACE_IMPLEMENTATION template class SettingsInterface; +template class SettingsInterface; template class SettingsInterface; template class SettingsInterface; diff --git a/scwx-qt/source/scwx/qt/settings/text_settings.cpp b/scwx-qt/source/scwx/qt/settings/text_settings.cpp index b96f94f4..6d4ceafa 100644 --- a/scwx-qt/source/scwx/qt/settings/text_settings.cpp +++ b/scwx-qt/source/scwx/qt/settings/text_settings.cpp @@ -12,10 +12,34 @@ namespace settings static const std::string logPrefix_ = "scwx::qt::settings::text_settings"; +static const std::string kAlteDIN1451Mittelscrhift_ { + "Alte DIN 1451 Mittelschrift"}; +static const std::string kInconsolata_ {"Inconsolata"}; + +static const std::string kRegular_ {"Regular"}; + +static const std::unordered_map + kDefaultFontFamily_ { + {types::FontCategory::Default, kAlteDIN1451Mittelscrhift_}, + {types::FontCategory::Tooltip, kInconsolata_}}; +static const std::unordered_map + kDefaultFontStyle_ {{types::FontCategory::Default, kRegular_}, + {types::FontCategory::Tooltip, kRegular_}}; +static const std::unordered_map + kDefaultFontPointSize_ {{types::FontCategory::Default, 12.0}, + {types::FontCategory::Tooltip, 10.5}}; + class TextSettings::Impl { public: - explicit Impl() + struct FontData + { + SettingsVariable fontFamily_ {"font_family"}; + SettingsVariable fontStyle_ {"font_style"}; + SettingsVariable fontPointSize_ {"font_point_size"}; + }; + + explicit Impl(TextSettings* self) : self_ {self} { std::string defaultTooltipMethodValue = types::GetTooltipMethodName(types::TooltipMethod::ImGui); @@ -47,16 +71,24 @@ public: // No match found, invalid return false; }); + + InitializeFontVariables(); } ~Impl() {} + void InitializeFontVariables(); + + TextSettings* self_; + + std::unordered_map fontData_ {}; + SettingsVariable hoverTextWrap_ {"hover_text_wrap"}; SettingsVariable tooltipMethod_ {"tooltip_method"}; }; TextSettings::TextSettings() : - SettingsCategory("text"), p(std::make_unique()) + SettingsCategory("text"), p(std::make_unique(this)) { RegisterVariables({&p->hoverTextWrap_, &p->tooltipMethod_}); SetDefaults(); @@ -66,6 +98,50 @@ TextSettings::~TextSettings() = default; TextSettings::TextSettings(TextSettings&&) noexcept = default; TextSettings& TextSettings::operator=(TextSettings&&) noexcept = default; +void TextSettings::Impl::InitializeFontVariables() +{ + for (auto fontCategory : types::FontCategoryIterator()) + { + auto result = fontData_.emplace(fontCategory, FontData {}); + auto& pair = *result.first; + auto& font = pair.second; + + font.fontFamily_.SetDefault(kDefaultFontFamily_.at(fontCategory)); + font.fontStyle_.SetDefault(kDefaultFontStyle_.at(fontCategory)); + font.fontPointSize_.SetDefault(kDefaultFontPointSize_.at(fontCategory)); + + // String values must not be empty + font.fontFamily_.SetValidator([](const std::string& value) + { return !value.empty(); }); + font.fontStyle_.SetValidator([](const std::string& value) + { return !value.empty(); }); + + // Font point size must be between 6 and 72 + font.fontPointSize_.SetMinimum(6.0); + font.fontPointSize_.SetMaximum(72.0); + + // TODO: Variable registration + } +} + +SettingsVariable& +TextSettings::font_family(types::FontCategory fontCategory) const +{ + return p->fontData_.at(fontCategory).fontFamily_; +} + +SettingsVariable& +TextSettings::font_style(types::FontCategory fontCategory) const +{ + return p->fontData_.at(fontCategory).fontStyle_; +} + +SettingsVariable& +TextSettings::font_point_size(types::FontCategory fontCategory) const +{ + return p->fontData_.at(fontCategory).fontPointSize_; +} + SettingsVariable& TextSettings::hover_text_wrap() const { return p->hoverTextWrap_; diff --git a/scwx-qt/source/scwx/qt/settings/text_settings.hpp b/scwx-qt/source/scwx/qt/settings/text_settings.hpp index 42399f99..a0347b4f 100644 --- a/scwx-qt/source/scwx/qt/settings/text_settings.hpp +++ b/scwx-qt/source/scwx/qt/settings/text_settings.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -25,8 +26,15 @@ public: TextSettings(TextSettings&&) noexcept; TextSettings& operator=(TextSettings&&) noexcept; + SettingsVariable& + font_family(types::FontCategory fontCategory) const; + SettingsVariable& + font_style(types::FontCategory fontCategory) const; + SettingsVariable& + font_point_size(types::FontCategory fontCategory) const; + SettingsVariable& hover_text_wrap() const; - SettingsVariable& tooltip_method() const; + SettingsVariable& tooltip_method() const; static TextSettings& Instance(); diff --git a/scwx-qt/source/scwx/qt/types/text_types.cpp b/scwx-qt/source/scwx/qt/types/text_types.cpp index e708cf63..f994dab9 100644 --- a/scwx-qt/source/scwx/qt/types/text_types.cpp +++ b/scwx-qt/source/scwx/qt/types/text_types.cpp @@ -11,12 +11,40 @@ namespace qt namespace types { +static const std::unordered_map fontCategoryName_ { + {FontCategory::Default, "Default"}, + {FontCategory::Tooltip, "Tooltip"}, + {FontCategory::Unknown, "?"}}; + static const std::unordered_map tooltipMethodName_ { {TooltipMethod::ImGui, "ImGui"}, {TooltipMethod::QToolTip, "Native Tooltip"}, {TooltipMethod::QLabel, "Floating Label"}, {TooltipMethod::Unknown, "?"}}; +FontCategory GetFontCategory(const std::string& name) +{ + auto result = + std::find_if(fontCategoryName_.cbegin(), + fontCategoryName_.cend(), + [&](const std::pair& pair) -> bool + { return boost::iequals(pair.second, name); }); + + if (result != fontCategoryName_.cend()) + { + return result->first; + } + else + { + return FontCategory::Unknown; + } +} + +std::string GetFontCategoryName(FontCategory fontCategory) +{ + return fontCategoryName_.at(fontCategory); +} + TooltipMethod GetTooltipMethod(const std::string& name) { auto result = std::find_if( diff --git a/scwx-qt/source/scwx/qt/types/text_types.hpp b/scwx-qt/source/scwx/qt/types/text_types.hpp index 98025a86..07c1ea00 100644 --- a/scwx-qt/source/scwx/qt/types/text_types.hpp +++ b/scwx-qt/source/scwx/qt/types/text_types.hpp @@ -11,6 +11,16 @@ namespace qt namespace types { +enum class FontCategory +{ + Default, + Tooltip, + Unknown +}; +typedef scwx::util:: + Iterator + FontCategoryIterator; + enum class TooltipMethod { ImGui, @@ -22,6 +32,8 @@ typedef scwx::util:: Iterator TooltipMethodIterator; +FontCategory GetFontCategory(const std::string& name); +std::string GetFontCategoryName(FontCategory fontCategory); TooltipMethod GetTooltipMethod(const std::string& name); std::string GetTooltipMethodName(TooltipMethod tooltipMethod); diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp index e53d033d..c2449e9f 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 namespace scwx @@ -86,6 +87,7 @@ public: self_ {self}, radarSiteDialog_ {new RadarSiteDialog(self)}, fontDialog_ {new QFontDialog(self)}, + fontCategoryModel_ {new QStandardItemModel(self)}, settings_ {std::initializer_list { &defaultRadarSite_, &fontSizes_, @@ -153,6 +155,8 @@ public: RadarSiteDialog* radarSiteDialog_; QFontDialog* fontDialog_; + QStandardItemModel* fontCategoryModel_; + settings::SettingsInterface defaultRadarSite_ {}; settings::SettingsInterface> fontSizes_ {}; settings::SettingsInterface gridWidth_ {}; @@ -173,6 +177,15 @@ public: settings::SettingsInterface> inactiveAlertColors_ {}; + std::unordered_map> + fontFamilies_ {}; + std::unordered_map> + fontStyles_ {}; + std::unordered_map> + fontPointSizes_ {}; + settings::SettingsInterface hoverTextWrap_ {}; settings::SettingsInterface tooltipMethod_ {}; @@ -663,6 +676,37 @@ void SettingsDialogImpl::SetupTextTab() { settings::TextSettings& textSettings = settings::TextSettings::Instance(); + self_->ui->fontListView->setModel(fontCategoryModel_); + for (const auto& fontCategory : types::FontCategoryIterator()) + { + // Add font category to list view + fontCategoryModel_->appendRow(new QStandardItem( + QString::fromStdString(types::GetFontCategoryName(fontCategory)))); + + // Create settings interface + auto fontFamilyResult = fontFamilies_.emplace( + fontCategory, settings::SettingsInterface {}); + auto fontStyleResult = fontStyles_.emplace( + fontCategory, settings::SettingsInterface {}); + auto fontSizeResult = fontPointSizes_.emplace( + fontCategory, settings::SettingsInterface {}); + + auto& fontFamily = (*fontFamilyResult.first).second; + auto& fontStyle = (*fontStyleResult.first).second; + auto& fontSize = (*fontSizeResult.first).second; + + // Add to settings list + settings_.push_back(&fontFamily); + settings_.push_back(&fontStyle); + settings_.push_back(&fontSize); + + // Set settings variables + fontFamily.SetSettingsVariable(textSettings.font_family(fontCategory)); + fontStyle.SetSettingsVariable(textSettings.font_style(fontCategory)); + fontSize.SetSettingsVariable(textSettings.font_point_size(fontCategory)); + } + self_->ui->fontListView->setCurrentIndex(fontCategoryModel_->index(0, 0)); + hoverTextWrap_.SetSettingsVariable(textSettings.hover_text_wrap()); hoverTextWrap_.SetEditWidget(self_->ui->hoverTextWrapSpinBox); hoverTextWrap_.SetResetButton(self_->ui->resetHoverTextWrapButton); diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui index 4e40cdb3..e921f38a 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui @@ -469,13 +469,6 @@ 0 - - - Reset All Fonts - - - - Qt::Horizontal @@ -488,10 +481,17 @@ - + + + + Reset All Fonts + + + + - + Display Item: @@ -581,17 +581,6 @@ - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - @@ -640,6 +629,17 @@ + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + +