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