diff --git a/scwx-qt/res/textures/images/dot.svg b/scwx-qt/res/textures/images/dot.svg new file mode 100644 index 00000000..8f765035 --- /dev/null +++ b/scwx-qt/res/textures/images/dot.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/scwx-qt/scwx-qt.qrc b/scwx-qt/scwx-qt.qrc index e7d8315a..ccb2e42a 100644 --- a/scwx-qt/scwx-qt.qrc +++ b/scwx-qt/scwx-qt.qrc @@ -91,6 +91,7 @@ res/textures/images/cursor-17.png res/textures/images/crosshairs-24.png res/textures/images/dot-3.png + res/textures/images/dot.svg res/textures/images/location-marker.svg res/textures/images/mapbox-logo.svg res/textures/images/maptiler-logo.svg diff --git a/scwx-qt/source/scwx/qt/manager/resource_manager.cpp b/scwx-qt/source/scwx/qt/manager/resource_manager.cpp index c6c40a26..41558378 100644 --- a/scwx-qt/source/scwx/qt/manager/resource_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/resource_manager.cpp @@ -43,10 +43,17 @@ void Initialize() void Shutdown() {} std::shared_ptr -LoadImageResource(const std::string& urlString) +LoadImageResource(const std::string& urlString, double scale) { util::TextureAtlas& textureAtlas = util::TextureAtlas::Instance(); - return textureAtlas.CacheTexture(urlString, urlString); + return textureAtlas.CacheTexture(urlString, urlString, scale); +} + +std::shared_ptr LoadImageResource( + const std::string& urlString, const std::string& textureName, double scale) +{ + util::TextureAtlas& textureAtlas = util::TextureAtlas::Instance(); + return textureAtlas.CacheTexture(textureName, urlString, scale); } std::vector> diff --git a/scwx-qt/source/scwx/qt/manager/resource_manager.hpp b/scwx-qt/source/scwx/qt/manager/resource_manager.hpp index ec7cf65e..cf0aad03 100644 --- a/scwx-qt/source/scwx/qt/manager/resource_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/resource_manager.hpp @@ -19,9 +19,13 @@ void Initialize(); void Shutdown(); std::shared_ptr -LoadImageResource(const std::string& urlString); +LoadImageResource(const std::string& urlString, double scale = 1); +std::shared_ptr +LoadImageResource(const std::string& urlString, + const std::string& textureName, + double scale = 1); std::vector> -LoadImageResources(const std::vector& urlStrings); + LoadImageResources(const std::vector& urlStrings); void BuildAtlas(); } // namespace ResourceManager diff --git a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp index 3522ba40..c4f93ef3 100644 --- a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp @@ -1,10 +1,11 @@ -#include #include #include #include #include #include +#include #include +#include #include #include #include @@ -88,6 +89,9 @@ public: showMapLogoCallbackUuid_); } + void SetupGeoIcons(); + void SetCusorLocation(common::Coordinate coordinate); + OverlayLayer* self_; boost::uuids::uuid clockFormatCallbackUuid_; @@ -115,11 +119,13 @@ public: types::GetTextureName(types::ImageTexture::CardinalPoint24)}; const std::string& compassIconName_ { types::GetTextureName(types::ImageTexture::Compass24)}; - const std::string& cursorIconName_ { + std::string cursorIconName_ { types::GetTextureName(types::ImageTexture::Dot3)}; const std::string& mapCenterIconName_ { types::GetTextureName(types::ImageTexture::Cursor17)}; + std::shared_ptr cursorIconImage_ {nullptr}; + const std::string& mapboxLogoImageName_ { types::GetTextureName(types::ImageTexture::MapboxLogo)}; const std::string& mapTilerLogoImageName_ { @@ -137,6 +143,8 @@ public: float lastFontSize_ {0.0f}; QMargins lastColorTableMargins_ {}; + double cursorScale_ {1}; + std::string sweepTimeString_ {}; bool sweepTimeNeedsUpdate_ {true}; bool sweepTimePicked_ {false}; @@ -156,6 +164,45 @@ OverlayLayer::OverlayLayer(std::shared_ptr context) : OverlayLayer::~OverlayLayer() = default; +void OverlayLayerImpl::SetCusorLocation(common::Coordinate coordinate) +{ + const double offset = 3 * cursorScale_ / 2; + geoIcons_->SetIconLocation(cursorIcon_, + coordinate.latitude_, + coordinate.longitude_, + -offset, + offset); +} + +void OverlayLayerImpl::SetupGeoIcons() +{ + const std::string& texturePath = + types::GetTexturePath(types::ImageTexture::Dot3); + cursorIconName_ = fmt::format( + "{}x{}", types::GetTextureName(types::ImageTexture::Dot3), cursorScale_); + cursorIconImage_ = manager::ResourceManager::LoadImageResource( + texturePath, cursorIconName_, cursorScale_); + + auto coordinate = currentPosition_.coordinate(); + geoIcons_->StartIconSheets(); + geoIcons_->AddIconSheet(cursorIconName_); + geoIcons_->AddIconSheet(locationIconName_); + geoIcons_->FinishIconSheets(); + + geoIcons_->StartIcons(); + + cursorIcon_ = geoIcons_->AddIcon(); + geoIcons_->SetIconTexture(cursorIcon_, cursorIconName_, 0); + + locationIcon_ = geoIcons_->AddIcon(); + geoIcons_->SetIconTexture(locationIcon_, locationIconName_, 0); + geoIcons_->SetIconAngle(locationIcon_, units::angle::degrees {45.0}); + geoIcons_->SetIconLocation( + locationIcon_, coordinate.latitude(), coordinate.longitude()); + + geoIcons_->FinishIcons(); +} + void OverlayLayer::Initialize() { logger_->debug("Initialize()"); @@ -173,27 +220,18 @@ void OverlayLayer::Initialize() } p->currentPosition_ = p->positionManager_->position(); - auto coordinate = p->currentPosition_.coordinate(); // Geo Icons - p->geoIcons_->StartIconSheets(); - p->geoIcons_->AddIconSheet(p->cursorIconName_); - p->geoIcons_->AddIconSheet(p->locationIconName_); - p->geoIcons_->FinishIconSheets(); - - p->geoIcons_->StartIcons(); - - p->cursorIcon_ = p->geoIcons_->AddIcon(); - p->geoIcons_->SetIconTexture(p->cursorIcon_, p->cursorIconName_, 0); - - p->locationIcon_ = p->geoIcons_->AddIcon(); - p->geoIcons_->SetIconTexture(p->locationIcon_, p->locationIconName_, 0); - p->geoIcons_->SetIconAngle(p->locationIcon_, - units::angle::degrees {45.0}); - p->geoIcons_->SetIconLocation( - p->locationIcon_, coordinate.latitude(), coordinate.longitude()); - - p->geoIcons_->FinishIcons(); + auto& generalSettings = settings::GeneralSettings::Instance(); + p->cursorScale_ = generalSettings.cursor_icon_scale().GetValue(); + p->SetupGeoIcons(); + generalSettings.cursor_icon_scale().RegisterValueChangedCallback( + [this](double value) + { + p->cursorScale_ = value; + p->SetupGeoIcons(); + Q_EMIT NeedsRendering(); + }); // Icons p->icons_->StartIconSheets(); @@ -339,9 +377,7 @@ void OverlayLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) p->geoIcons_->SetIconVisible(p->cursorIcon_, cursorIconVisible); if (cursorIconVisible) { - common::Coordinate mouseCoordinate = context()->mouse_coordinate(); - p->geoIcons_->SetIconLocation( - p->cursorIcon_, mouseCoordinate.latitude_, mouseCoordinate.longitude_); + p->SetCusorLocation(context()->mouse_coordinate()); } // Location Icon diff --git a/scwx-qt/source/scwx/qt/settings/general_settings.cpp b/scwx-qt/source/scwx/qt/settings/general_settings.cpp index 4f19dfcc..86ac3d6d 100644 --- a/scwx-qt/source/scwx/qt/settings/general_settings.cpp +++ b/scwx-qt/source/scwx/qt/settings/general_settings.cpp @@ -78,7 +78,10 @@ public: cursorIconAlwaysOn_.SetDefault(false); radarSiteThreshold_.SetDefault(0.0); highPrivilegeWarningEnabled_.SetDefault(true); + cursorIconScale_.SetDefault(1.0); + cursorIconScale_.SetMinimum(1.0); + cursorIconScale_.SetMaximum(5.0); fontSizes_.SetElementMinimum(1); fontSizes_.SetElementMaximum(72); fontSizes_.SetValidator([](const std::vector& value) @@ -185,6 +188,7 @@ public: SettingsVariable radarSiteThreshold_ {"radar_site_threshold"}; SettingsVariable highPrivilegeWarningEnabled_ { "high_privilege_warning_enabled"}; + SettingsVariable cursorIconScale_ {"cursor_icon_scale"}; }; GeneralSettings::GeneralSettings() : @@ -222,7 +226,8 @@ GeneralSettings::GeneralSettings() : &p->warningsProvider_, &p->cursorIconAlwaysOn_, &p->radarSiteThreshold_, - &p->highPrivilegeWarningEnabled_}); + &p->highPrivilegeWarningEnabled_, + &p->cursorIconScale_}); SetDefaults(); } GeneralSettings::~GeneralSettings() = default; @@ -397,6 +402,11 @@ SettingsVariable& GeneralSettings::high_privilege_warning_enabled() const return p->highPrivilegeWarningEnabled_; } +SettingsVariable& GeneralSettings::cursor_icon_scale() const +{ + return p->cursorIconScale_; +} + bool GeneralSettings::Shutdown() { bool dataChanged = false; @@ -455,7 +465,8 @@ bool operator==(const GeneralSettings& lhs, const GeneralSettings& rhs) lhs.p->cursorIconAlwaysOn_ == rhs.p->cursorIconAlwaysOn_ && lhs.p->radarSiteThreshold_ == rhs.p->radarSiteThreshold_ && lhs.p->highPrivilegeWarningEnabled_ == - rhs.p->highPrivilegeWarningEnabled_); + rhs.p->highPrivilegeWarningEnabled_ && + lhs.p->cursorIconScale_ == rhs.p->cursorIconScale_); } } // namespace scwx::qt::settings diff --git a/scwx-qt/source/scwx/qt/settings/general_settings.hpp b/scwx-qt/source/scwx/qt/settings/general_settings.hpp index 3484461b..59f29275 100644 --- a/scwx-qt/source/scwx/qt/settings/general_settings.hpp +++ b/scwx-qt/source/scwx/qt/settings/general_settings.hpp @@ -56,6 +56,7 @@ public: [[nodiscard]] SettingsVariable& cursor_icon_always_on() const; [[nodiscard]] SettingsVariable& radar_site_threshold() const; [[nodiscard]] SettingsVariable& high_privilege_warning_enabled() const; + [[nodiscard]] SettingsVariable& cursor_icon_scale() const; static GeneralSettings& Instance(); diff --git a/scwx-qt/source/scwx/qt/types/texture_types.cpp b/scwx-qt/source/scwx/qt/types/texture_types.cpp index 18efd9b9..2369dc34 100644 --- a/scwx-qt/source/scwx/qt/types/texture_types.cpp +++ b/scwx-qt/source/scwx/qt/types/texture_types.cpp @@ -24,7 +24,7 @@ static const std::unordered_map imageTextureInfo_ { {"images/crosshairs-24", ":/res/textures/images/crosshairs-24.png"}}, {ImageTexture::Cursor17, {"images/cursor-17", ":/res/textures/images/cursor-17.png"}}, - {ImageTexture::Dot3, {"images/dot-3", ":/res/textures/images/dot-3.png"}}, + {ImageTexture::Dot3, {"images/dot-3", ":/res/textures/images/dot.svg"}}, {ImageTexture::LocationBriefcase, {"images/location-briefcase", ":/res/icons/font-awesome-6/briefcase-solid.svg"}}, diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp index b3a9a381..fa891795 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp @@ -146,6 +146,7 @@ public: &showSmoothedRangeFolding_, &updateNotificationsEnabled_, &cursorIconAlwaysOn_, + &cursorIconScale_, &debugEnabled_, &alertAudioSoundFile_, &alertAudioLocationMethod_, @@ -266,6 +267,7 @@ public: settings::SettingsInterface showSmoothedRangeFolding_ {}; settings::SettingsInterface updateNotificationsEnabled_ {}; settings::SettingsInterface cursorIconAlwaysOn_ {}; + settings::SettingsInterface cursorIconScale_ {}; settings::SettingsInterface debugEnabled_ {}; std::unordered_map> @@ -811,6 +813,10 @@ void SettingsDialogImpl::SetupGeneralTab() radarSiteThresholdUpdateUnits( settings::UnitSettings::Instance().distance_units().GetValue()); + cursorIconScale_.SetSettingsVariable(generalSettings.cursor_icon_scale()); + cursorIconScale_.SetEditWidget(self_->ui->cursorIconScaleSpinBox); + cursorIconScale_.SetResetButton(self_->ui->resetCursorIconScaleButton); + antiAliasingEnabled_.SetSettingsVariable( generalSettings.anti_aliasing_enabled()); antiAliasingEnabled_.SetEditWidget(self_->ui->antiAliasingEnabledCheckBox); diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui index 3205e553..5b9b37fd 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.ui +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.ui @@ -137,7 +137,7 @@ 0 -412 511 - 841 + 873 @@ -159,31 +159,33 @@ 0 - - + + + + + + + + + + + - Grid Width + Radar Site Threshold - - - - - + + - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + Custom Map URL - - + + - ... + Warnings Provider @@ -198,18 +200,25 @@ - - - - - + + - Mapbox API Key + GPS Source - - + + + + + + + MapTiler API Key + + + + + ... @@ -219,8 +228,54 @@ - - + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + Default Radar Site + + + + + + + Custom Map Layer + + + + + + + + + + Mapbox API Key + + + + + ... @@ -237,166 +292,12 @@ - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - - - Default Time Zone - - - - - - - QLineEdit::EchoMode::Password - - - - - - - QLineEdit::EchoMode::Password - - - - - - - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - - - Theme File - - - - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - - - - - - Default Alert Action - - - - - - - MapTiler API Key - - - - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - - - ... - - - - - - - GPS Source - - - - - - - - - - Custom Map URL - - - - - - - 1 - - - 999999999 - - - - - - - - - @@ -419,20 +320,38 @@ - - - - - - - Map Provider + + + + 1 + + + 999999999 - - + + - Theme + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + Theme File + + + + + + + Grid Width @@ -447,22 +366,8 @@ - - - - Warnings Provider - - - - - - - Default Radar Site - - - - - + + ... @@ -472,58 +377,6 @@ - - - - GPS Baud Rate - - - - - - - Custom Map Layer - - - - - - - - - - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - - - - - - ... - - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - - - - - - ... - - - @@ -531,8 +384,11 @@ - - + + + + + ... @@ -542,31 +398,70 @@ - - + + - GPS Plugin + ... + + + + Default Time Zone + + + + + + + + + - - - - Radar Site Threshold - - - - - + + ... - - - :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + Map Provider + + + + + + + QLineEdit::EchoMode::Password + + + + + + + + + + Theme + + + + + + + + + + + + + @@ -598,21 +493,163 @@ - - - - - + + - + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg - - + + ... + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + QLineEdit::EchoMode::Password + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + GPS Baud Rate + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + Default Alert Action + + + + + + + + + + ... + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + GPS Plugin + + + + + + + ... + + + + + + + ... + + + + :/res/icons/font-awesome-6/rotate-left-solid.svg:/res/icons/font-awesome-6/rotate-left-solid.svg + + + + + + + Multi-Pane Cursor Size + + + + + + + 1 + + + 1.000000000000000 + + + 5.000000000000000 + + + 0.100000000000000 + + + QAbstractSpinBox::StepType::DefaultStepType + + + + + + + ... + + + + :/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/texture_atlas.cpp b/scwx-qt/source/scwx/qt/util/texture_atlas.cpp index fe2b2a9a..c069bfb3 100644 --- a/scwx-qt/source/scwx/qt/util/texture_atlas.cpp +++ b/scwx-qt/source/scwx/qt/util/texture_atlas.cpp @@ -50,12 +50,12 @@ public: ~Impl() {} static std::shared_ptr - LoadImage(const std::string& imagePath); + LoadImage(const std::string& imagePath, double scale = 1); static std::shared_ptr ReadPngFile(const QString& imagePath); static std::shared_ptr - ReadSvgFile(const QString& imagePath); + ReadSvgFile(const QString& imagePath, double scale = 1); std::vector> registeredTextures_ {}; @@ -92,12 +92,12 @@ void TextureAtlas::RegisterTexture(const std::string& name, p->registeredTextures_.emplace_back(std::move(image)); } -std::shared_ptr -TextureAtlas::CacheTexture(const std::string& name, const std::string& path) +std::shared_ptr TextureAtlas::CacheTexture( + const std::string& name, const std::string& path, double scale) { // Attempt to load the image std::shared_ptr image = - TextureAtlas::Impl::LoadImage(path); + TextureAtlas::Impl::LoadImage(path, scale); // If the image is valid if (image != nullptr && image->width() > 0 && image->height() > 0) @@ -380,7 +380,7 @@ TextureAttributes TextureAtlas::GetTextureAttributes(const std::string& name) } std::shared_ptr -TextureAtlas::Impl::LoadImage(const std::string& imagePath) +TextureAtlas::Impl::LoadImage(const std::string& imagePath, double scale) { logger_->debug("Loading image: {}", imagePath); @@ -398,7 +398,7 @@ TextureAtlas::Impl::LoadImage(const std::string& imagePath) if (suffix == "svg") { - image = ReadSvgFile(qLocalImagePath); + image = ReadSvgFile(qLocalImagePath, scale); } else { @@ -509,10 +509,10 @@ TextureAtlas::Impl::ReadPngFile(const QString& imagePath) } std::shared_ptr -TextureAtlas::Impl::ReadSvgFile(const QString& imagePath) +TextureAtlas::Impl::ReadSvgFile(const QString& imagePath, double scale) { QSvgRenderer renderer {imagePath}; - QPixmap pixmap {renderer.defaultSize()}; + QPixmap pixmap {renderer.defaultSize() * scale}; pixmap.fill(Qt::GlobalColor::transparent); QPainter painter {&pixmap}; diff --git a/scwx-qt/source/scwx/qt/util/texture_atlas.hpp b/scwx-qt/source/scwx/qt/util/texture_atlas.hpp index 64c5a2d7..64e23b43 100644 --- a/scwx-qt/source/scwx/qt/util/texture_atlas.hpp +++ b/scwx-qt/source/scwx/qt/util/texture_atlas.hpp @@ -74,8 +74,8 @@ public: std::uint64_t BuildCount() const; void RegisterTexture(const std::string& name, const std::string& path); - std::shared_ptr - CacheTexture(const std::string& name, const std::string& path); + std::shared_ptr CacheTexture( + const std::string& name, const std::string& path, double scale = 1); void BuildAtlas(std::size_t width, std::size_t height); void BufferAtlas(gl::OpenGLFunctions& gl, GLuint texture); diff --git a/test/data b/test/data index f03a46f3..6115c159 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit f03a46f31b0378ca4077372c106d6967bb7ad66f +Subproject commit 6115c15987fd75dd019db995e6bdc07a05b83dcc