diff --git a/scwx-qt/res/icons/font-awesome-6/font-solid.svg b/scwx-qt/res/icons/font-awesome-6/font-solid.svg new file mode 100644 index 00000000..2fa4599c --- /dev/null +++ b/scwx-qt/res/icons/font-awesome-6/font-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 4b7e1d80..8c3282f8 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -137,6 +137,7 @@ set(HDR_SETTINGS source/scwx/qt/settings/general_settings.hpp source/scwx/qt/settings/settings_interface_base.hpp source/scwx/qt/settings/settings_variable.hpp source/scwx/qt/settings/settings_variable_base.hpp + source/scwx/qt/settings/text_settings.hpp source/scwx/qt/settings/ui_settings.hpp) set(SRC_SETTINGS source/scwx/qt/settings/general_settings.cpp source/scwx/qt/settings/map_settings.cpp @@ -147,6 +148,7 @@ set(SRC_SETTINGS source/scwx/qt/settings/general_settings.cpp source/scwx/qt/settings/settings_interface_base.cpp source/scwx/qt/settings/settings_variable.cpp source/scwx/qt/settings/settings_variable_base.cpp + source/scwx/qt/settings/text_settings.cpp source/scwx/qt/settings/ui_settings.cpp) set(HDR_TYPES source/scwx/qt/types/alert_types.hpp source/scwx/qt/types/font_types.hpp diff --git a/scwx-qt/scwx-qt.qrc b/scwx-qt/scwx-qt.qrc index 05a94725..5453b19d 100644 --- a/scwx-qt/scwx-qt.qrc +++ b/scwx-qt/scwx-qt.qrc @@ -25,6 +25,7 @@ res/icons/font-awesome-6/book-solid.svg res/icons/font-awesome-6/discord.svg res/icons/font-awesome-6/earth-americas-solid.svg + res/icons/font-awesome-6/font-solid.svg res/icons/font-awesome-6/forward-step-solid.svg res/icons/font-awesome-6/gears-solid.svg res/icons/font-awesome-6/github.svg diff --git a/scwx-qt/source/scwx/qt/manager/settings_manager.cpp b/scwx-qt/source/scwx/qt/manager/settings_manager.cpp index c504e15e..7c973ca4 100644 --- a/scwx-qt/source/scwx/qt/manager/settings_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/settings_manager.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -130,6 +131,7 @@ static boost::json::value ConvertSettingsToJson() general_settings().WriteJson(settingsJson); map_settings().WriteJson(settingsJson); palette_settings().WriteJson(settingsJson); + settings::TextSettings::Instance().WriteJson(settingsJson); settings::UiSettings::Instance().WriteJson(settingsJson); return settingsJson; @@ -142,6 +144,7 @@ static void GenerateDefaultSettings() general_settings().SetDefaults(); map_settings().SetDefaults(); palette_settings().SetDefaults(); + settings::TextSettings::Instance().SetDefaults(); settings::UiSettings::Instance().SetDefaults(); } @@ -154,6 +157,7 @@ static bool LoadSettings(const boost::json::object& settingsJson) jsonDirty |= !general_settings().ReadJson(settingsJson); jsonDirty |= !map_settings().ReadJson(settingsJson); jsonDirty |= !palette_settings().ReadJson(settingsJson); + jsonDirty |= !settings::TextSettings::Instance().ReadJson(settingsJson); jsonDirty |= !settings::UiSettings::Instance().ReadJson(settingsJson); return jsonDirty; diff --git a/scwx-qt/source/scwx/qt/settings/text_settings.cpp b/scwx-qt/source/scwx/qt/settings/text_settings.cpp new file mode 100644 index 00000000..48f612d7 --- /dev/null +++ b/scwx-qt/source/scwx/qt/settings/text_settings.cpp @@ -0,0 +1,56 @@ +#include + +namespace scwx +{ +namespace qt +{ +namespace settings +{ + +static const std::string logPrefix_ = "scwx::qt::settings::text_settings"; + +class TextSettings::Impl +{ +public: + explicit Impl() + { + hoverTextWrap_.SetDefault(80); + hoverTextWrap_.SetMinimum(0); + hoverTextWrap_.SetMaximum(999); + } + + ~Impl() {} + + SettingsVariable hoverTextWrap_ {"hover_text_wrap"}; +}; + +TextSettings::TextSettings() : + SettingsCategory("text"), p(std::make_unique()) +{ + RegisterVariables({&p->hoverTextWrap_}); + SetDefaults(); +} +TextSettings::~TextSettings() = default; + +TextSettings::TextSettings(TextSettings&&) noexcept = default; +TextSettings& TextSettings::operator=(TextSettings&&) noexcept = default; + +SettingsVariable& TextSettings::hover_text_wrap() const +{ + return p->hoverTextWrap_; +} + +TextSettings& TextSettings::Instance() +{ + static TextSettings TextSettings_; + return TextSettings_; +} + +bool operator==(const TextSettings& lhs, const TextSettings& rhs) +{ + return (lhs.p->hoverTextWrap_ == rhs.p->hoverTextWrap_); +} + +} // namespace settings +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/settings/text_settings.hpp b/scwx-qt/source/scwx/qt/settings/text_settings.hpp new file mode 100644 index 00000000..56c3eb8a --- /dev/null +++ b/scwx-qt/source/scwx/qt/settings/text_settings.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include +#include + +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace settings +{ + +class TextSettings : public SettingsCategory +{ +public: + explicit TextSettings(); + ~TextSettings(); + + TextSettings(const TextSettings&) = delete; + TextSettings& operator=(const TextSettings&) = delete; + + TextSettings(TextSettings&&) noexcept; + TextSettings& operator=(TextSettings&&) noexcept; + + SettingsVariable& hover_text_wrap() const; + + static TextSettings& Instance(); + + friend bool operator==(const TextSettings& lhs, const TextSettings& rhs); + +private: + class Impl; + + std::unique_ptr p; +}; + +} // namespace settings +} // 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 e3672c5f..c3fcae82 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -92,7 +93,8 @@ public: &mapTilerApiKey_, &defaultAlertAction_, &updateNotificationsEnabled_, - &debugEnabled_}} + &debugEnabled_, + &hoverTextWrap_}} { // Configure default alert phenomena colors auto& paletteSettings = manager::SettingsManager::palette_settings(); @@ -117,6 +119,7 @@ public: void SetupPalettesColorTablesTab(); void SetupPalettesAlertsTab(); void SetupPlacefilesTab(); + void SetupTextTab(); void ShowColorDialog(QLineEdit* lineEdit, QFrame* frame = nullptr); void UpdateRadarDialogLocation(const std::string& id); @@ -139,7 +142,7 @@ public: static void SetBackgroundColor(const std::string& value, QFrame* frame); SettingsDialog* self_; - PlacefileSettingsWidget* placefileSettingsWidget_; + PlacefileSettingsWidget* placefileSettingsWidget_ {nullptr}; RadarSiteDialog* radarSiteDialog_; settings::SettingsInterface defaultRadarSite_ {}; @@ -162,6 +165,8 @@ public: settings::SettingsInterface> inactiveAlertColors_ {}; + settings::SettingsInterface hoverTextWrap_ {}; + std::vector settings_; }; @@ -181,6 +186,9 @@ SettingsDialog::SettingsDialog(QWidget* parent) : // Palettes > Alerts p->SetupPalettesAlertsTab(); + // Text + p->SetupTextTab(); + // Placefiles p->SetupPlacefilesTab(); @@ -630,6 +638,15 @@ void SettingsDialogImpl::SetupPlacefilesTab() self_->ui->placefiles->layout()->addWidget(placefileSettingsWidget_); } +void SettingsDialogImpl::SetupTextTab() +{ + settings::TextSettings& textSettings = settings::TextSettings::Instance(); + + hoverTextWrap_.SetSettingsVariable(textSettings.hover_text_wrap()); + hoverTextWrap_.SetEditWidget(self_->ui->hoverTextWrapSpinBox); + hoverTextWrap_.SetResetButton(self_->ui->resetHoverTextWrapButton); +} + QImage SettingsDialogImpl::GenerateColorTableImage( std::shared_ptr colorTable, std::uint16_t min, diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui index 79a68f55..efa5dfd1 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui @@ -73,6 +73,15 @@ :/res/icons/font-awesome-6/palette-solid.svg:/res/icons/font-awesome-6/palette-solid.svg + + + Text + + + + :/res/icons/font-awesome-6/font-solid.svg:/res/icons/font-awesome-6/font-solid.svg + + Placefiles @@ -355,8 +364,8 @@ 0 0 - 66 - 18 + 481 + 382 @@ -427,6 +436,72 @@ + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Hover text character wrap (0 to disable) + + + + + + + 999 + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + diff --git a/scwx-qt/source/scwx/qt/util/imgui.cpp b/scwx-qt/source/scwx/qt/util/imgui.cpp index 018e5000..c31f22b0 100644 --- a/scwx-qt/source/scwx/qt/util/imgui.cpp +++ b/scwx-qt/source/scwx/qt/util/imgui.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -86,16 +87,25 @@ void ImGui::Impl::UpdateMonospaceFont() void ImGui::DrawTooltip(const std::string& hoverText) { - static constexpr std::size_t kDefaultWidth = 80u; - p->Initialize(); - auto wrappedText = - TextFlow::Column(hoverText).width(kDefaultWidth).toString(); + std::size_t textWidth = static_cast( + settings::TextSettings::Instance().hover_text_wrap().GetValue()); + + // Wrap text if enabled + std::string wrappedText {}; + if (textWidth > 0) + { + wrappedText = TextFlow::Column(hoverText).width(textWidth).toString(); + } + + // Display text is either wrapped or unwrapped text (do this to avoid copy + // when not wrapping) + const std::string& displayText = (textWidth > 0) ? wrappedText : hoverText; ::ImGui::BeginTooltip(); ::ImGui::PushFont(p->monospaceFont_); - ::ImGui::TextUnformatted(wrappedText.c_str()); + ::ImGui::TextUnformatted(displayText.c_str()); ::ImGui::PopFont(); ::ImGui::EndTooltip(); } diff --git a/test/data b/test/data index a87219c0..6d407be1 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit a87219c010a26905fd893e68e17077144394b316 +Subproject commit 6d407be1b6f2e72490ef0d07da1e297994df8fe4