From 23740d260135222ca3de5b5d9296f590eb95b13e Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Thu, 14 Sep 2023 23:53:11 -0500 Subject: [PATCH] Add tooltip method to settings --- scwx-qt/scwx-qt.cmake | 6 ++- .../source/scwx/qt/settings/text_settings.cpp | 41 ++++++++++++++++- .../source/scwx/qt/settings/text_settings.hpp | 1 + scwx-qt/source/scwx/qt/types/text_types.cpp | 45 +++++++++++++++++++ scwx-qt/source/scwx/qt/types/text_types.hpp | 30 +++++++++++++ scwx-qt/source/scwx/qt/ui/settings_dialog.cpp | 41 ++++++++++++++++- scwx-qt/source/scwx/qt/ui/settings_dialog.ui | 27 +++++++++-- scwx-qt/source/scwx/qt/util/tooltip.cpp | 24 +++++----- test/data | 2 +- 9 files changed, 194 insertions(+), 23 deletions(-) create mode 100644 scwx-qt/source/scwx/qt/types/text_types.cpp create mode 100644 scwx-qt/source/scwx/qt/types/text_types.hpp diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 6975be3f..b3b07707 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -160,12 +160,14 @@ set(HDR_TYPES source/scwx/qt/types/alert_types.hpp source/scwx/qt/types/map_types.hpp source/scwx/qt/types/qt_types.hpp source/scwx/qt/types/radar_product_record.hpp - source/scwx/qt/types/text_event_key.hpp) + source/scwx/qt/types/text_event_key.hpp + source/scwx/qt/types/text_types.hpp) set(SRC_TYPES source/scwx/qt/types/alert_types.cpp source/scwx/qt/types/github_types.cpp source/scwx/qt/types/map_types.cpp source/scwx/qt/types/radar_product_record.cpp - source/scwx/qt/types/text_event_key.cpp) + source/scwx/qt/types/text_event_key.cpp + source/scwx/qt/types/text_types.cpp) set(HDR_UI source/scwx/qt/ui/about_dialog.hpp source/scwx/qt/ui/alert_dialog.hpp source/scwx/qt/ui/alert_dock_widget.hpp diff --git a/scwx-qt/source/scwx/qt/settings/text_settings.cpp b/scwx-qt/source/scwx/qt/settings/text_settings.cpp index 48f612d7..b96f94f4 100644 --- a/scwx-qt/source/scwx/qt/settings/text_settings.cpp +++ b/scwx-qt/source/scwx/qt/settings/text_settings.cpp @@ -1,4 +1,7 @@ #include +#include + +#include namespace scwx { @@ -14,20 +17,48 @@ class TextSettings::Impl public: explicit Impl() { + std::string defaultTooltipMethodValue = + types::GetTooltipMethodName(types::TooltipMethod::ImGui); + + boost::to_lower(defaultTooltipMethodValue); + hoverTextWrap_.SetDefault(80); hoverTextWrap_.SetMinimum(0); hoverTextWrap_.SetMaximum(999); + tooltipMethod_.SetDefault(defaultTooltipMethodValue); + + tooltipMethod_.SetValidator( + [](const std::string& value) + { + for (types::TooltipMethod tooltipMethod : + types::TooltipMethodIterator()) + { + // If the value is equal to a lower case alert action name + std::string tooltipMethodName = + types::GetTooltipMethodName(tooltipMethod); + boost::to_lower(tooltipMethodName); + if (value == tooltipMethodName) + { + // Regard as a match, valid + return true; + } + } + + // No match found, invalid + return false; + }); } ~Impl() {} SettingsVariable hoverTextWrap_ {"hover_text_wrap"}; + SettingsVariable tooltipMethod_ {"tooltip_method"}; }; TextSettings::TextSettings() : SettingsCategory("text"), p(std::make_unique()) { - RegisterVariables({&p->hoverTextWrap_}); + RegisterVariables({&p->hoverTextWrap_, &p->tooltipMethod_}); SetDefaults(); } TextSettings::~TextSettings() = default; @@ -40,6 +71,11 @@ SettingsVariable& TextSettings::hover_text_wrap() const return p->hoverTextWrap_; } +SettingsVariable& TextSettings::tooltip_method() const +{ + return p->tooltipMethod_; +} + TextSettings& TextSettings::Instance() { static TextSettings TextSettings_; @@ -48,7 +84,8 @@ TextSettings& TextSettings::Instance() bool operator==(const TextSettings& lhs, const TextSettings& rhs) { - return (lhs.p->hoverTextWrap_ == rhs.p->hoverTextWrap_); + return (lhs.p->hoverTextWrap_ == rhs.p->hoverTextWrap_ && + lhs.p->tooltipMethod_ == rhs.p->tooltipMethod_); } } // namespace settings diff --git a/scwx-qt/source/scwx/qt/settings/text_settings.hpp b/scwx-qt/source/scwx/qt/settings/text_settings.hpp index 56c3eb8a..42399f99 100644 --- a/scwx-qt/source/scwx/qt/settings/text_settings.hpp +++ b/scwx-qt/source/scwx/qt/settings/text_settings.hpp @@ -26,6 +26,7 @@ public: TextSettings& operator=(TextSettings&&) noexcept; SettingsVariable& hover_text_wrap() 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 new file mode 100644 index 00000000..e708cf63 --- /dev/null +++ b/scwx-qt/source/scwx/qt/types/text_types.cpp @@ -0,0 +1,45 @@ +#include + +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace types +{ + +static const std::unordered_map tooltipMethodName_ { + {TooltipMethod::ImGui, "ImGui"}, + {TooltipMethod::QToolTip, "Native Tooltip"}, + {TooltipMethod::QLabel, "Floating Label"}, + {TooltipMethod::Unknown, "?"}}; + +TooltipMethod GetTooltipMethod(const std::string& name) +{ + auto result = std::find_if( + tooltipMethodName_.cbegin(), + tooltipMethodName_.cend(), + [&](const std::pair& pair) -> bool + { return boost::iequals(pair.second, name); }); + + if (result != tooltipMethodName_.cend()) + { + return result->first; + } + else + { + return TooltipMethod::Unknown; + } +} + +std::string GetTooltipMethodName(TooltipMethod tooltipMethod) +{ + return tooltipMethodName_.at(tooltipMethod); +} + +} // namespace types +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/types/text_types.hpp b/scwx-qt/source/scwx/qt/types/text_types.hpp new file mode 100644 index 00000000..98025a86 --- /dev/null +++ b/scwx-qt/source/scwx/qt/types/text_types.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace types +{ + +enum class TooltipMethod +{ + ImGui, + QToolTip, + QLabel, + Unknown +}; +typedef scwx::util:: + Iterator + TooltipMethodIterator; + +TooltipMethod GetTooltipMethod(const std::string& name); +std::string GetTooltipMethodName(TooltipMethod tooltipMethod); + +} // namespace types +} // 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 c3fcae82..9bb52e00 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -94,7 +95,8 @@ public: &defaultAlertAction_, &updateNotificationsEnabled_, &debugEnabled_, - &hoverTextWrap_}} + &hoverTextWrap_, + &tooltipMethod_}} { // Configure default alert phenomena colors auto& paletteSettings = manager::SettingsManager::palette_settings(); @@ -166,6 +168,7 @@ public: inactiveAlertColors_ {}; settings::SettingsInterface hoverTextWrap_ {}; + settings::SettingsInterface tooltipMethod_ {}; std::vector settings_; }; @@ -645,6 +648,42 @@ void SettingsDialogImpl::SetupTextTab() hoverTextWrap_.SetSettingsVariable(textSettings.hover_text_wrap()); hoverTextWrap_.SetEditWidget(self_->ui->hoverTextWrapSpinBox); hoverTextWrap_.SetResetButton(self_->ui->resetHoverTextWrapButton); + + for (const auto& tooltipMethod : types::TooltipMethodIterator()) + { + self_->ui->tooltipMethodComboBox->addItem( + QString::fromStdString(types::GetTooltipMethodName(tooltipMethod))); + } + + tooltipMethod_.SetSettingsVariable(textSettings.tooltip_method()); + tooltipMethod_.SetMapFromValueFunction( + [](const std::string& text) -> std::string + { + for (types::TooltipMethod tooltipMethod : + types::TooltipMethodIterator()) + { + const std::string tooltipMethodName = + types::GetTooltipMethodName(tooltipMethod); + + if (boost::iequals(text, tooltipMethodName)) + { + // Return tooltip method label + return tooltipMethodName; + } + } + + // Tooltip method label not found, return unknown + return "?"; + }); + tooltipMethod_.SetMapToValueFunction( + [](std::string text) -> std::string + { + // Convert label to lower case and return + boost::to_lower(text); + return text; + }); + tooltipMethod_.SetEditWidget(self_->ui->tooltipMethodComboBox); + tooltipMethod_.SetResetButton(self_->ui->resetTooltipMethodButton); } QImage SettingsDialogImpl::GenerateColorTableImage( diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui index efa5dfd1..15d5d1ec 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui @@ -459,21 +459,21 @@ 0 - + Hover text character wrap (0 to disable) - + 999 - + ... @@ -484,6 +484,27 @@ + + + + Tooltip Method + + + + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + diff --git a/scwx-qt/source/scwx/qt/util/tooltip.cpp b/scwx-qt/source/scwx/qt/util/tooltip.cpp index 6145225a..5d7b4c6c 100644 --- a/scwx-qt/source/scwx/qt/util/tooltip.cpp +++ b/scwx-qt/source/scwx/qt/util/tooltip.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -23,15 +24,6 @@ namespace tooltip static const std::string logPrefix_ = "scwx::qt::util::tooltip"; static const auto logger_ = scwx::util::Logger::Create(logPrefix_); -enum class TooltipMethod -{ - ImGui, - QToolTip, - QLabel -}; - -static TooltipMethod tooltipMethod_ = TooltipMethod::ImGui; - static std::unique_ptr tooltipLabel_ = nullptr; static std::unique_ptr tooltipParent_ = nullptr; @@ -68,8 +60,12 @@ void Show(const std::string& text, const QPointF& mouseGlobalPos) { Initialize(); - std::size_t textWidth = static_cast( - settings::TextSettings::Instance().hover_text_wrap().GetValue()); + auto& textSettings = settings::TextSettings::Instance(); + + std::size_t textWidth = + static_cast(textSettings.hover_text_wrap().GetValue()); + types::TooltipMethod tooltipMethod = + types::GetTooltipMethod(textSettings.tooltip_method().GetValue()); // Wrap text if enabled std::string wrappedText {}; @@ -82,11 +78,11 @@ void Show(const std::string& text, const QPointF& mouseGlobalPos) // when not wrapping) const std::string& displayText = (textWidth > 0) ? wrappedText : text; - if (tooltipMethod_ == TooltipMethod::ImGui) + if (tooltipMethod == types::TooltipMethod::ImGui) { util::ImGui::Instance().DrawTooltip(displayText); } - else if (tooltipMethod_ == TooltipMethod::QToolTip) + else if (tooltipMethod == types::TooltipMethod::QToolTip) { static std::size_t id = 0; QToolTip::showText( @@ -99,7 +95,7 @@ void Show(const std::string& text, const QPointF& mouseGlobalPos) {}, std::numeric_limits::max()); } - else if (tooltipMethod_ == TooltipMethod::QLabel) + else if (tooltipMethod == types::TooltipMethod::QLabel) { // Get monospace font size units::font_size::pixels fontSize {16}; diff --git a/test/data b/test/data index 6d407be1..33caca18 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit 6d407be1b6f2e72490ef0d07da1e297994df8fe4 +Subproject commit 33caca188b1007c643db75afa560fdfe348c0ee5