Add setting for cursor icon scale

This commit is contained in:
AdenKoperczak 2025-04-06 17:36:23 -04:00
parent 0086dc3e0f
commit 1ff686629b
No known key found for this signature in database
GPG key ID: 9843017036F62EE7
13 changed files with 439 additions and 327 deletions

View file

@ -0,0 +1,9 @@
<svg version="1.1"
viewBox="0 0 100 100"
width="3" height="3"
xmlns="http://www.w3.org/2000/svg">
<circle r="50" cx="50" cy="50" fill="black"></circle>
<circle r="25" cx="50" cy="50" fill="white"></circle>
</svg>

After

Width:  |  Height:  |  Size: 241 B

View file

@ -91,6 +91,7 @@
<file>res/textures/images/cursor-17.png</file> <file>res/textures/images/cursor-17.png</file>
<file>res/textures/images/crosshairs-24.png</file> <file>res/textures/images/crosshairs-24.png</file>
<file>res/textures/images/dot-3.png</file> <file>res/textures/images/dot-3.png</file>
<file>res/textures/images/dot.svg</file>
<file>res/textures/images/location-marker.svg</file> <file>res/textures/images/location-marker.svg</file>
<file>res/textures/images/mapbox-logo.svg</file> <file>res/textures/images/mapbox-logo.svg</file>
<file>res/textures/images/maptiler-logo.svg</file> <file>res/textures/images/maptiler-logo.svg</file>

View file

@ -43,10 +43,17 @@ void Initialize()
void Shutdown() {} void Shutdown() {}
std::shared_ptr<boost::gil::rgba8_image_t> std::shared_ptr<boost::gil::rgba8_image_t>
LoadImageResource(const std::string& urlString) LoadImageResource(const std::string& urlString, double scale)
{ {
util::TextureAtlas& textureAtlas = util::TextureAtlas::Instance(); util::TextureAtlas& textureAtlas = util::TextureAtlas::Instance();
return textureAtlas.CacheTexture(urlString, urlString); return textureAtlas.CacheTexture(urlString, urlString, scale);
}
std::shared_ptr<boost::gil::rgba8_image_t> 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<std::shared_ptr<boost::gil::rgba8_image_t>> std::vector<std::shared_ptr<boost::gil::rgba8_image_t>>

View file

@ -19,9 +19,13 @@ void Initialize();
void Shutdown(); void Shutdown();
std::shared_ptr<boost::gil::rgba8_image_t> std::shared_ptr<boost::gil::rgba8_image_t>
LoadImageResource(const std::string& urlString); LoadImageResource(const std::string& urlString, double scale = 1);
std::shared_ptr<boost::gil::rgba8_image_t>
LoadImageResource(const std::string& urlString,
const std::string& textureName,
double scale = 1);
std::vector<std::shared_ptr<boost::gil::rgba8_image_t>> std::vector<std::shared_ptr<boost::gil::rgba8_image_t>>
LoadImageResources(const std::vector<std::string>& urlStrings); LoadImageResources(const std::vector<std::string>& urlStrings);
void BuildAtlas(); void BuildAtlas();
} // namespace ResourceManager } // namespace ResourceManager

View file

@ -1,10 +1,11 @@
#include <scwx/qt/map/overlay_layer.hpp>
#include <scwx/qt/gl/draw/geo_icons.hpp> #include <scwx/qt/gl/draw/geo_icons.hpp>
#include <scwx/qt/gl/draw/icons.hpp> #include <scwx/qt/gl/draw/icons.hpp>
#include <scwx/qt/gl/draw/rectangle.hpp> #include <scwx/qt/gl/draw/rectangle.hpp>
#include <scwx/qt/manager/font_manager.hpp> #include <scwx/qt/manager/font_manager.hpp>
#include <scwx/qt/manager/position_manager.hpp> #include <scwx/qt/manager/position_manager.hpp>
#include <scwx/qt/manager/resource_manager.hpp>
#include <scwx/qt/map/map_settings.hpp> #include <scwx/qt/map/map_settings.hpp>
#include <scwx/qt/map/overlay_layer.hpp>
#include <scwx/qt/settings/general_settings.hpp> #include <scwx/qt/settings/general_settings.hpp>
#include <scwx/qt/types/texture_types.hpp> #include <scwx/qt/types/texture_types.hpp>
#include <scwx/qt/view/radar_product_view.hpp> #include <scwx/qt/view/radar_product_view.hpp>
@ -88,6 +89,9 @@ public:
showMapLogoCallbackUuid_); showMapLogoCallbackUuid_);
} }
void SetupGeoIcons();
void SetCusorLocation(common::Coordinate coordinate);
OverlayLayer* self_; OverlayLayer* self_;
boost::uuids::uuid clockFormatCallbackUuid_; boost::uuids::uuid clockFormatCallbackUuid_;
@ -115,11 +119,13 @@ public:
types::GetTextureName(types::ImageTexture::CardinalPoint24)}; types::GetTextureName(types::ImageTexture::CardinalPoint24)};
const std::string& compassIconName_ { const std::string& compassIconName_ {
types::GetTextureName(types::ImageTexture::Compass24)}; types::GetTextureName(types::ImageTexture::Compass24)};
const std::string& cursorIconName_ { std::string cursorIconName_ {
types::GetTextureName(types::ImageTexture::Dot3)}; types::GetTextureName(types::ImageTexture::Dot3)};
const std::string& mapCenterIconName_ { const std::string& mapCenterIconName_ {
types::GetTextureName(types::ImageTexture::Cursor17)}; types::GetTextureName(types::ImageTexture::Cursor17)};
std::shared_ptr<boost::gil::rgba8_image_t> cursorIconImage_ {nullptr};
const std::string& mapboxLogoImageName_ { const std::string& mapboxLogoImageName_ {
types::GetTextureName(types::ImageTexture::MapboxLogo)}; types::GetTextureName(types::ImageTexture::MapboxLogo)};
const std::string& mapTilerLogoImageName_ { const std::string& mapTilerLogoImageName_ {
@ -137,6 +143,8 @@ public:
float lastFontSize_ {0.0f}; float lastFontSize_ {0.0f};
QMargins lastColorTableMargins_ {}; QMargins lastColorTableMargins_ {};
double cursorScale_ {1};
std::string sweepTimeString_ {}; std::string sweepTimeString_ {};
bool sweepTimeNeedsUpdate_ {true}; bool sweepTimeNeedsUpdate_ {true};
bool sweepTimePicked_ {false}; bool sweepTimePicked_ {false};
@ -156,6 +164,45 @@ OverlayLayer::OverlayLayer(std::shared_ptr<MapContext> context) :
OverlayLayer::~OverlayLayer() = default; 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<double> {45.0});
geoIcons_->SetIconLocation(
locationIcon_, coordinate.latitude(), coordinate.longitude());
geoIcons_->FinishIcons();
}
void OverlayLayer::Initialize() void OverlayLayer::Initialize()
{ {
logger_->debug("Initialize()"); logger_->debug("Initialize()");
@ -173,27 +220,18 @@ void OverlayLayer::Initialize()
} }
p->currentPosition_ = p->positionManager_->position(); p->currentPosition_ = p->positionManager_->position();
auto coordinate = p->currentPosition_.coordinate();
// Geo Icons // Geo Icons
p->geoIcons_->StartIconSheets(); auto& generalSettings = settings::GeneralSettings::Instance();
p->geoIcons_->AddIconSheet(p->cursorIconName_); p->cursorScale_ = generalSettings.cursor_icon_scale().GetValue();
p->geoIcons_->AddIconSheet(p->locationIconName_); p->SetupGeoIcons();
p->geoIcons_->FinishIconSheets(); generalSettings.cursor_icon_scale().RegisterValueChangedCallback(
[this](double value)
p->geoIcons_->StartIcons(); {
p->cursorScale_ = value;
p->cursorIcon_ = p->geoIcons_->AddIcon(); p->SetupGeoIcons();
p->geoIcons_->SetIconTexture(p->cursorIcon_, p->cursorIconName_, 0); Q_EMIT NeedsRendering();
});
p->locationIcon_ = p->geoIcons_->AddIcon();
p->geoIcons_->SetIconTexture(p->locationIcon_, p->locationIconName_, 0);
p->geoIcons_->SetIconAngle(p->locationIcon_,
units::angle::degrees<double> {45.0});
p->geoIcons_->SetIconLocation(
p->locationIcon_, coordinate.latitude(), coordinate.longitude());
p->geoIcons_->FinishIcons();
// Icons // Icons
p->icons_->StartIconSheets(); p->icons_->StartIconSheets();
@ -339,9 +377,7 @@ void OverlayLayer::Render(const QMapLibre::CustomLayerRenderParameters& params)
p->geoIcons_->SetIconVisible(p->cursorIcon_, cursorIconVisible); p->geoIcons_->SetIconVisible(p->cursorIcon_, cursorIconVisible);
if (cursorIconVisible) if (cursorIconVisible)
{ {
common::Coordinate mouseCoordinate = context()->mouse_coordinate(); p->SetCusorLocation(context()->mouse_coordinate());
p->geoIcons_->SetIconLocation(
p->cursorIcon_, mouseCoordinate.latitude_, mouseCoordinate.longitude_);
} }
// Location Icon // Location Icon

View file

@ -78,7 +78,10 @@ public:
cursorIconAlwaysOn_.SetDefault(false); cursorIconAlwaysOn_.SetDefault(false);
radarSiteThreshold_.SetDefault(0.0); radarSiteThreshold_.SetDefault(0.0);
highPrivilegeWarningEnabled_.SetDefault(true); highPrivilegeWarningEnabled_.SetDefault(true);
cursorIconScale_.SetDefault(1.0);
cursorIconScale_.SetMinimum(1.0);
cursorIconScale_.SetMaximum(5.0);
fontSizes_.SetElementMinimum(1); fontSizes_.SetElementMinimum(1);
fontSizes_.SetElementMaximum(72); fontSizes_.SetElementMaximum(72);
fontSizes_.SetValidator([](const std::vector<std::int64_t>& value) fontSizes_.SetValidator([](const std::vector<std::int64_t>& value)
@ -185,6 +188,7 @@ public:
SettingsVariable<double> radarSiteThreshold_ {"radar_site_threshold"}; SettingsVariable<double> radarSiteThreshold_ {"radar_site_threshold"};
SettingsVariable<bool> highPrivilegeWarningEnabled_ { SettingsVariable<bool> highPrivilegeWarningEnabled_ {
"high_privilege_warning_enabled"}; "high_privilege_warning_enabled"};
SettingsVariable<double> cursorIconScale_ {"cursor_icon_scale"};
}; };
GeneralSettings::GeneralSettings() : GeneralSettings::GeneralSettings() :
@ -222,7 +226,8 @@ GeneralSettings::GeneralSettings() :
&p->warningsProvider_, &p->warningsProvider_,
&p->cursorIconAlwaysOn_, &p->cursorIconAlwaysOn_,
&p->radarSiteThreshold_, &p->radarSiteThreshold_,
&p->highPrivilegeWarningEnabled_}); &p->highPrivilegeWarningEnabled_,
&p->cursorIconScale_});
SetDefaults(); SetDefaults();
} }
GeneralSettings::~GeneralSettings() = default; GeneralSettings::~GeneralSettings() = default;
@ -397,6 +402,11 @@ SettingsVariable<bool>& GeneralSettings::high_privilege_warning_enabled() const
return p->highPrivilegeWarningEnabled_; return p->highPrivilegeWarningEnabled_;
} }
SettingsVariable<double>& GeneralSettings::cursor_icon_scale() const
{
return p->cursorIconScale_;
}
bool GeneralSettings::Shutdown() bool GeneralSettings::Shutdown()
{ {
bool dataChanged = false; bool dataChanged = false;
@ -455,7 +465,8 @@ bool operator==(const GeneralSettings& lhs, const GeneralSettings& rhs)
lhs.p->cursorIconAlwaysOn_ == rhs.p->cursorIconAlwaysOn_ && lhs.p->cursorIconAlwaysOn_ == rhs.p->cursorIconAlwaysOn_ &&
lhs.p->radarSiteThreshold_ == rhs.p->radarSiteThreshold_ && lhs.p->radarSiteThreshold_ == rhs.p->radarSiteThreshold_ &&
lhs.p->highPrivilegeWarningEnabled_ == lhs.p->highPrivilegeWarningEnabled_ ==
rhs.p->highPrivilegeWarningEnabled_); rhs.p->highPrivilegeWarningEnabled_ &&
lhs.p->cursorIconScale_ == rhs.p->cursorIconScale_);
} }
} // namespace scwx::qt::settings } // namespace scwx::qt::settings

View file

@ -56,6 +56,7 @@ public:
[[nodiscard]] SettingsVariable<bool>& cursor_icon_always_on() const; [[nodiscard]] SettingsVariable<bool>& cursor_icon_always_on() const;
[[nodiscard]] SettingsVariable<double>& radar_site_threshold() const; [[nodiscard]] SettingsVariable<double>& radar_site_threshold() const;
[[nodiscard]] SettingsVariable<bool>& high_privilege_warning_enabled() const; [[nodiscard]] SettingsVariable<bool>& high_privilege_warning_enabled() const;
[[nodiscard]] SettingsVariable<double>& cursor_icon_scale() const;
static GeneralSettings& Instance(); static GeneralSettings& Instance();

View file

@ -24,7 +24,7 @@ static const std::unordered_map<ImageTexture, TextureInfo> imageTextureInfo_ {
{"images/crosshairs-24", ":/res/textures/images/crosshairs-24.png"}}, {"images/crosshairs-24", ":/res/textures/images/crosshairs-24.png"}},
{ImageTexture::Cursor17, {ImageTexture::Cursor17,
{"images/cursor-17", ":/res/textures/images/cursor-17.png"}}, {"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, {ImageTexture::LocationBriefcase,
{"images/location-briefcase", {"images/location-briefcase",
":/res/icons/font-awesome-6/briefcase-solid.svg"}}, ":/res/icons/font-awesome-6/briefcase-solid.svg"}},

View file

@ -146,6 +146,7 @@ public:
&showSmoothedRangeFolding_, &showSmoothedRangeFolding_,
&updateNotificationsEnabled_, &updateNotificationsEnabled_,
&cursorIconAlwaysOn_, &cursorIconAlwaysOn_,
&cursorIconScale_,
&debugEnabled_, &debugEnabled_,
&alertAudioSoundFile_, &alertAudioSoundFile_,
&alertAudioLocationMethod_, &alertAudioLocationMethod_,
@ -266,6 +267,7 @@ public:
settings::SettingsInterface<bool> showSmoothedRangeFolding_ {}; settings::SettingsInterface<bool> showSmoothedRangeFolding_ {};
settings::SettingsInterface<bool> updateNotificationsEnabled_ {}; settings::SettingsInterface<bool> updateNotificationsEnabled_ {};
settings::SettingsInterface<bool> cursorIconAlwaysOn_ {}; settings::SettingsInterface<bool> cursorIconAlwaysOn_ {};
settings::SettingsInterface<double> cursorIconScale_ {};
settings::SettingsInterface<bool> debugEnabled_ {}; settings::SettingsInterface<bool> debugEnabled_ {};
std::unordered_map<std::string, settings::SettingsInterface<std::string>> std::unordered_map<std::string, settings::SettingsInterface<std::string>>
@ -811,6 +813,10 @@ void SettingsDialogImpl::SetupGeneralTab()
radarSiteThresholdUpdateUnits( radarSiteThresholdUpdateUnits(
settings::UnitSettings::Instance().distance_units().GetValue()); settings::UnitSettings::Instance().distance_units().GetValue());
cursorIconScale_.SetSettingsVariable(generalSettings.cursor_icon_scale());
cursorIconScale_.SetEditWidget(self_->ui->cursorIconScaleSpinBox);
cursorIconScale_.SetResetButton(self_->ui->resetCursorIconScaleButton);
antiAliasingEnabled_.SetSettingsVariable( antiAliasingEnabled_.SetSettingsVariable(
generalSettings.anti_aliasing_enabled()); generalSettings.anti_aliasing_enabled());
antiAliasingEnabled_.SetEditWidget(self_->ui->antiAliasingEnabledCheckBox); antiAliasingEnabled_.SetEditWidget(self_->ui->antiAliasingEnabledCheckBox);

View file

@ -137,7 +137,7 @@
<x>0</x> <x>0</x>
<y>-412</y> <y>-412</y>
<width>511</width> <width>511</width>
<height>841</height> <height>873</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
@ -159,31 +159,33 @@
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>0</number>
</property> </property>
<item row="5" column="0"> <item row="1" column="2">
<widget class="QLabel" name="label_2"> <widget class="QComboBox" name="clockFormatComboBox"/>
</item>
<item row="8" column="2">
<widget class="QComboBox" name="positioningPluginComboBox"/>
</item>
<item row="6" column="2">
<widget class="QSpinBox" name="gridHeightSpinBox"/>
</item>
<item row="23" column="0">
<widget class="QLabel" name="label_31">
<property name="text"> <property name="text">
<string>Grid Width</string> <string>Radar Site Threshold</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="18" column="2"> <item row="14" column="0">
<widget class="QComboBox" name="themeComboBox"/> <widget class="QLabel" name="label_26">
</item>
<item row="13" column="4">
<widget class="QToolButton" name="resetMapTilerApiKeyButton">
<property name="text"> <property name="text">
<string>...</string> <string>Custom Map URL</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property> </property>
</widget> </widget>
</item> </item>
<item row="9" column="3"> <item row="22" column="0">
<widget class="QToolButton" name="gpsSourceSelectButton"> <widget class="QLabel" name="label_22">
<property name="text"> <property name="text">
<string>...</string> <string>Warnings Provider</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -198,18 +200,25 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="2"> <item row="9" column="0">
<widget class="QComboBox" name="clockFormatComboBox"/> <widget class="QLabel" name="label_25">
</item>
<item row="12" column="0">
<widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>Mapbox API Key</string> <string>GPS Source</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="22" column="4"> <item row="14" column="2">
<widget class="QToolButton" name="resetWarningsProviderButton"> <widget class="QLineEdit" name="customMapUrlLineEdit"/>
</item>
<item row="13" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>MapTiler API Key</string>
</property>
</widget>
</item>
<item row="3" column="4">
<widget class="QToolButton" name="resetRadarSiteButton">
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>
@ -219,8 +228,54 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="19" column="4"> <item row="5" column="4">
<widget class="QToolButton" name="resetThemeFileButton"> <widget class="QToolButton" name="resetGridWidthButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="18" column="4">
<widget class="QToolButton" name="resetThemeButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Default Radar Site</string>
</property>
</widget>
</item>
<item row="15" column="0">
<widget class="QLabel" name="label_27">
<property name="text">
<string>Custom Map Layer</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QComboBox" name="defaultAlertActionComboBox"/>
</item>
<item row="12" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Mapbox API Key</string>
</property>
</widget>
</item>
<item row="14" column="4">
<widget class="QToolButton" name="resetCustomMapUrlButton">
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>
@ -237,166 +292,12 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="9" column="4">
<widget class="QToolButton" name="resetNmeaSourceButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_21">
<property name="text">
<string>Default Time Zone</string>
</property>
</widget>
</item>
<item row="13" column="2">
<widget class="scwx::qt::ui::QApiKeyEdit" name="mapTilerApiKeyLineEdit">
<property name="echoMode">
<enum>QLineEdit::EchoMode::Password</enum>
</property>
</widget>
</item>
<item row="12" column="2">
<widget class="scwx::qt::ui::QApiKeyEdit" name="mapboxApiKeyLineEdit">
<property name="echoMode">
<enum>QLineEdit::EchoMode::Password</enum>
</property>
</widget>
</item>
<item row="8" column="2">
<widget class="QComboBox" name="positioningPluginComboBox"/>
</item>
<item row="18" column="4">
<widget class="QToolButton" name="resetThemeButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="19" column="0">
<widget class="QLabel" name="label_30">
<property name="text">
<string>Theme File</string>
</property>
</widget>
</item>
<item row="5" column="2"> <item row="5" column="2">
<widget class="QSpinBox" name="gridWidthSpinBox"/> <widget class="QSpinBox" name="gridWidthSpinBox"/>
</item> </item>
<item row="6" column="4">
<widget class="QToolButton" name="resetGridHeightButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="3" column="4">
<widget class="QToolButton" name="resetRadarSiteButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="4" column="2"> <item row="4" column="2">
<widget class="QComboBox" name="defaultTimeZoneComboBox"/> <widget class="QComboBox" name="defaultTimeZoneComboBox"/>
</item> </item>
<item row="5" column="4">
<widget class="QToolButton" name="resetGridWidthButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="14" column="2">
<widget class="QLineEdit" name="customMapUrlLineEdit"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="defaultAlertActionLabel">
<property name="text">
<string>Default Alert Action</string>
</property>
</widget>
</item>
<item row="13" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>MapTiler API Key</string>
</property>
</widget>
</item>
<item row="11" column="4">
<widget class="QToolButton" name="resetMapProviderButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="19" column="3">
<widget class="QToolButton" name="themeFileSelectButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="label_25">
<property name="text">
<string>GPS Source</string>
</property>
</widget>
</item>
<item row="15" column="2">
<widget class="QLineEdit" name="customMapLayerLineEdit"/>
</item>
<item row="14" column="0">
<widget class="QLabel" name="label_26">
<property name="text">
<string>Custom Map URL</string>
</property>
</widget>
</item>
<item row="10" column="2">
<widget class="QSpinBox" name="nmeaBaudRateSpinBox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>999999999</number>
</property>
</widget>
</item>
<item row="11" column="2">
<widget class="QComboBox" name="mapProviderComboBox"/>
</item>
<item row="19" column="2">
<widget class="QLineEdit" name="themeFileLineEdit"/>
</item>
<item row="2" column="4"> <item row="2" column="4">
<widget class="QToolButton" name="resetDefaultAlertActionButton"> <widget class="QToolButton" name="resetDefaultAlertActionButton">
<property name="text"> <property name="text">
@ -419,20 +320,38 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="9" column="2"> <item row="10" column="2">
<widget class="QLineEdit" name="nmeaSourceLineEdit"/> <widget class="QSpinBox" name="nmeaBaudRateSpinBox">
</item> <property name="minimum">
<item row="11" column="0"> <number>1</number>
<widget class="QLabel" name="label_7"> </property>
<property name="text"> <property name="maximum">
<string>Map Provider</string> <number>999999999</number>
</property> </property>
</widget> </widget>
</item> </item>
<item row="18" column="0"> <item row="12" column="4">
<widget class="QLabel" name="label_5"> <widget class="QToolButton" name="resetMapboxApiKeyButton">
<property name="text"> <property name="text">
<string>Theme</string> <string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="19" column="0">
<widget class="QLabel" name="label_30">
<property name="text">
<string>Theme File</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Grid Width</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -447,22 +366,8 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="22" column="0"> <item row="9" column="4">
<widget class="QLabel" name="label_22"> <widget class="QToolButton" name="resetNmeaSourceButton">
<property name="text">
<string>Warnings Provider</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Default Radar Site</string>
</property>
</widget>
</item>
<item row="14" column="4">
<widget class="QToolButton" name="resetCustomMapUrlButton">
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>
@ -472,58 +377,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="0">
<widget class="QLabel" name="label_24">
<property name="text">
<string>GPS Baud Rate</string>
</property>
</widget>
</item>
<item row="15" column="0">
<widget class="QLabel" name="label_27">
<property name="text">
<string>Custom Map Layer</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QSpinBox" name="gridHeightSpinBox"/>
</item>
<item row="2" column="2">
<widget class="QComboBox" name="defaultAlertActionComboBox"/>
</item>
<item row="12" column="4">
<widget class="QToolButton" name="resetMapboxApiKeyButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="22" column="2">
<widget class="QLineEdit" name="warningsProviderLineEdit"/>
</item>
<item row="8" column="4">
<widget class="QToolButton" name="resetPositioningPluginButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QToolButton" name="radarSiteSelectButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="6" column="0"> <item row="6" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
@ -531,8 +384,11 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="4"> <item row="15" column="2">
<widget class="QToolButton" name="resetClockFormatButton"> <widget class="QLineEdit" name="customMapLayerLineEdit"/>
</item>
<item row="22" column="4">
<widget class="QToolButton" name="resetWarningsProviderButton">
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>
@ -542,31 +398,70 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="8" column="0"> <item row="15" column="3">
<widget class="QLabel" name="label_23"> <widget class="QToolButton" name="customMapLayerToolButton">
<property name="text"> <property name="text">
<string>GPS Plugin</string> <string>...</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0">
<widget class="QLabel" name="label_21">
<property name="text">
<string>Default Time Zone</string>
</property>
</widget>
</item>
<item row="11" column="2">
<widget class="QComboBox" name="mapProviderComboBox"/>
</item>
<item row="9" column="2">
<widget class="QLineEdit" name="nmeaSourceLineEdit"/>
</item>
<item row="3" column="2"> <item row="3" column="2">
<widget class="QComboBox" name="radarSiteComboBox"/> <widget class="QComboBox" name="radarSiteComboBox"/>
</item> </item>
<item row="23" column="0"> <item row="19" column="3">
<widget class="QLabel" name="label_31"> <widget class="QToolButton" name="themeFileSelectButton">
<property name="text">
<string>Radar Site Threshold</string>
</property>
</widget>
</item>
<item row="23" column="4">
<widget class="QToolButton" name="resetRadarSiteThresholdButton">
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>
<property name="icon"> </widget>
<iconset resource="../../../../scwx-qt.qrc"> </item>
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset> <item row="11" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Map Provider</string>
</property>
</widget>
</item>
<item row="12" column="2">
<widget class="scwx::qt::ui::QApiKeyEdit" name="mapboxApiKeyLineEdit">
<property name="echoMode">
<enum>QLineEdit::EchoMode::Password</enum>
</property>
</widget>
</item>
<item row="18" column="2">
<widget class="QComboBox" name="themeComboBox"/>
</item>
<item row="18" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Theme</string>
</property>
</widget>
</item>
<item row="22" column="2">
<widget class="QLineEdit" name="warningsProviderLineEdit"/>
</item>
<item row="23" column="3">
<widget class="QLabel" name="radarSiteThresholdUnitLabel">
<property name="toolTip">
<string/>
</property>
<property name="text">
<string/>
</property> </property>
</widget> </widget>
</item> </item>
@ -598,21 +493,163 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="23" column="3"> <item row="23" column="4">
<widget class="QLabel" name="radarSiteThresholdUnitLabel"> <widget class="QToolButton" name="resetRadarSiteThresholdButton">
<property name="toolTip">
<string/>
</property>
<property name="text"> <property name="text">
<string/> <string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property> </property>
</widget> </widget>
</item> </item>
<item row="15" column="3"> <item row="13" column="4">
<widget class="QToolButton" name="customMapLayerToolButton"> <widget class="QToolButton" name="resetMapTilerApiKeyButton">
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="13" column="2">
<widget class="scwx::qt::ui::QApiKeyEdit" name="mapTilerApiKeyLineEdit">
<property name="echoMode">
<enum>QLineEdit::EchoMode::Password</enum>
</property>
</widget>
</item>
<item row="8" column="4">
<widget class="QToolButton" name="resetPositioningPluginButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="label_24">
<property name="text">
<string>GPS Baud Rate</string>
</property>
</widget>
</item>
<item row="19" column="4">
<widget class="QToolButton" name="resetThemeFileButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="defaultAlertActionLabel">
<property name="text">
<string>Default Alert Action</string>
</property>
</widget>
</item>
<item row="19" column="2">
<widget class="QLineEdit" name="themeFileLineEdit"/>
</item>
<item row="3" column="3">
<widget class="QToolButton" name="radarSiteSelectButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="6" column="4">
<widget class="QToolButton" name="resetGridHeightButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QToolButton" name="resetClockFormatButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="label_23">
<property name="text">
<string>GPS Plugin</string>
</property>
</widget>
</item>
<item row="9" column="3">
<widget class="QToolButton" name="gpsSourceSelectButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="11" column="4">
<widget class="QToolButton" name="resetMapProviderButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="24" column="0">
<widget class="QLabel" name="label_32">
<property name="text">
<string>Multi-Pane Cursor Size</string>
</property>
</widget>
</item>
<item row="24" column="2">
<widget class="QDoubleSpinBox" name="cursorIconScaleSpinBox">
<property name="decimals">
<number>1</number>
</property>
<property name="minimum">
<double>1.000000000000000</double>
</property>
<property name="maximum">
<double>5.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="stepType">
<enum>QAbstractSpinBox::StepType::DefaultStepType</enum>
</property>
</widget>
</item>
<item row="24" column="4">
<widget class="QToolButton" name="resetCursorIconScaleButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget> </widget>
</item> </item>
</layout> </layout>

View file

@ -50,12 +50,12 @@ public:
~Impl() {} ~Impl() {}
static std::shared_ptr<boost::gil::rgba8_image_t> static std::shared_ptr<boost::gil::rgba8_image_t>
LoadImage(const std::string& imagePath); LoadImage(const std::string& imagePath, double scale = 1);
static std::shared_ptr<boost::gil::rgba8_image_t> static std::shared_ptr<boost::gil::rgba8_image_t>
ReadPngFile(const QString& imagePath); ReadPngFile(const QString& imagePath);
static std::shared_ptr<boost::gil::rgba8_image_t> static std::shared_ptr<boost::gil::rgba8_image_t>
ReadSvgFile(const QString& imagePath); ReadSvgFile(const QString& imagePath, double scale = 1);
std::vector<std::shared_ptr<boost::gil::rgba8_image_t>> std::vector<std::shared_ptr<boost::gil::rgba8_image_t>>
registeredTextures_ {}; registeredTextures_ {};
@ -92,12 +92,12 @@ void TextureAtlas::RegisterTexture(const std::string& name,
p->registeredTextures_.emplace_back(std::move(image)); p->registeredTextures_.emplace_back(std::move(image));
} }
std::shared_ptr<boost::gil::rgba8_image_t> std::shared_ptr<boost::gil::rgba8_image_t> TextureAtlas::CacheTexture(
TextureAtlas::CacheTexture(const std::string& name, const std::string& path) const std::string& name, const std::string& path, double scale)
{ {
// Attempt to load the image // Attempt to load the image
std::shared_ptr<boost::gil::rgba8_image_t> image = std::shared_ptr<boost::gil::rgba8_image_t> image =
TextureAtlas::Impl::LoadImage(path); TextureAtlas::Impl::LoadImage(path, scale);
// If the image is valid // If the image is valid
if (image != nullptr && image->width() > 0 && image->height() > 0) if (image != nullptr && image->width() > 0 && image->height() > 0)
@ -380,7 +380,7 @@ TextureAttributes TextureAtlas::GetTextureAttributes(const std::string& name)
} }
std::shared_ptr<boost::gil::rgba8_image_t> std::shared_ptr<boost::gil::rgba8_image_t>
TextureAtlas::Impl::LoadImage(const std::string& imagePath) TextureAtlas::Impl::LoadImage(const std::string& imagePath, double scale)
{ {
logger_->debug("Loading image: {}", imagePath); logger_->debug("Loading image: {}", imagePath);
@ -398,7 +398,7 @@ TextureAtlas::Impl::LoadImage(const std::string& imagePath)
if (suffix == "svg") if (suffix == "svg")
{ {
image = ReadSvgFile(qLocalImagePath); image = ReadSvgFile(qLocalImagePath, scale);
} }
else else
{ {
@ -509,10 +509,10 @@ TextureAtlas::Impl::ReadPngFile(const QString& imagePath)
} }
std::shared_ptr<boost::gil::rgba8_image_t> std::shared_ptr<boost::gil::rgba8_image_t>
TextureAtlas::Impl::ReadSvgFile(const QString& imagePath) TextureAtlas::Impl::ReadSvgFile(const QString& imagePath, double scale)
{ {
QSvgRenderer renderer {imagePath}; QSvgRenderer renderer {imagePath};
QPixmap pixmap {renderer.defaultSize()}; QPixmap pixmap {renderer.defaultSize() * scale};
pixmap.fill(Qt::GlobalColor::transparent); pixmap.fill(Qt::GlobalColor::transparent);
QPainter painter {&pixmap}; QPainter painter {&pixmap};

View file

@ -74,8 +74,8 @@ public:
std::uint64_t BuildCount() const; std::uint64_t BuildCount() const;
void RegisterTexture(const std::string& name, const std::string& path); void RegisterTexture(const std::string& name, const std::string& path);
std::shared_ptr<boost::gil::rgba8_image_t> std::shared_ptr<boost::gil::rgba8_image_t> CacheTexture(
CacheTexture(const std::string& name, const std::string& path); const std::string& name, const std::string& path, double scale = 1);
void BuildAtlas(std::size_t width, std::size_t height); void BuildAtlas(std::size_t width, std::size_t height);
void BufferAtlas(gl::OpenGLFunctions& gl, GLuint texture); void BufferAtlas(gl::OpenGLFunctions& gl, GLuint texture);

@ -1 +1 @@
Subproject commit f03a46f31b0378ca4077372c106d6967bb7ad66f Subproject commit 6115c15987fd75dd019db995e6bdc07a05b83dcc