diff --git a/scwx-qt/source/scwx/qt/map/map_context.cpp b/scwx-qt/source/scwx/qt/map/map_context.cpp index 4dc87bb1..14a9c559 100644 --- a/scwx-qt/source/scwx/qt/map/map_context.cpp +++ b/scwx-qt/source/scwx/qt/map/map_context.cpp @@ -29,6 +29,9 @@ public: int16_t radarProductCode_ {0}; QMapLibre::CustomLayerRenderParameters renderParameters_ {}; + MapProvider mapProvider_ {MapProvider::Unknown}; + std::string mapCopyrights_ {}; + std::shared_ptr overlayProductView_ {nullptr}; std::shared_ptr radarProductView_; }; @@ -48,6 +51,16 @@ std::weak_ptr MapContext::map() const return p->map_; } +std::string MapContext::map_copyrights() const +{ + return p->mapCopyrights_; +} + +MapProvider MapContext::map_provider() const +{ + return p->mapProvider_; +} + MapSettings& MapContext::settings() { return p->settings_; @@ -94,6 +107,16 @@ void MapContext::set_map(const std::shared_ptr& map) p->map_ = map; } +void MapContext::set_map_copyrights(const std::string& copyrights) +{ + p->mapCopyrights_ = copyrights; +} + +void MapContext::set_map_provider(MapProvider provider) +{ + p->mapProvider_ = provider; +} + void MapContext::set_overlay_product_view( const std::shared_ptr& overlayProductView) { diff --git a/scwx-qt/source/scwx/qt/map/map_context.hpp b/scwx-qt/source/scwx/qt/map/map_context.hpp index d6613ae0..367c1006 100644 --- a/scwx-qt/source/scwx/qt/map/map_context.hpp +++ b/scwx-qt/source/scwx/qt/map/map_context.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -36,6 +37,8 @@ public: MapContext& operator=(MapContext&&) noexcept; std::weak_ptr map() const; + std::string map_copyrights() const; + MapProvider map_provider() const; MapSettings& settings(); float pixel_ratio() const; std::shared_ptr overlay_product_view() const; @@ -46,6 +49,8 @@ public: QMapLibre::CustomLayerRenderParameters render_parameters() const; void set_map(const std::shared_ptr& map); + void set_map_copyrights(const std::string& copyrights); + void set_map_provider(MapProvider provider); void set_overlay_product_view( const std::shared_ptr& overlayProductView); void set_pixel_ratio(float pixelRatio); diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 3412e7c0..90139d19 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -44,6 +44,7 @@ #include #include #include +#include namespace scwx { @@ -94,11 +95,13 @@ public: overlayProductView->SetAutoRefresh(autoRefreshEnabled_); overlayProductView->SetAutoUpdate(autoUpdateEnabled_); - // Initialize context - context_->set_overlay_product_view(overlayProductView); - auto& generalSettings = settings::GeneralSettings::Instance(); + // Initialize context + context_->set_map_provider( + GetMapProvider(generalSettings.map_provider().GetValue())); + context_->set_overlay_product_view(overlayProductView); + SetRadarSite(generalSettings.default_radar_site().GetValue()); // Create ImGui Context @@ -110,9 +113,6 @@ public: // Initialize ImGui Qt backend ImGui_ImplQt_Init(); - // Set Map Provider Details - mapProvider_ = GetMapProvider(generalSettings.map_provider().GetValue()); - ConnectSignals(); } @@ -143,6 +143,7 @@ public: void AddLayers(); void AddPlacefileLayer(const std::string& placefileName, const std::string& before); + void ConnectMapSignals(); void ConnectSignals(); void ImGuiCheckFonts(); void InitializeNewRadarProductView(const std::string& colorPalette); @@ -170,7 +171,6 @@ public: std::shared_ptr context_; MapWidget* widget_; - MapProvider mapProvider_; QMapLibre::Settings settings_; std::shared_ptr map_; std::list layerList_; @@ -250,6 +250,24 @@ MapWidget::~MapWidget() makeCurrent(); } +void MapWidgetImpl::ConnectMapSignals() +{ + connect(map_.get(), + &QMapLibre::Map::needsRendering, + this, + &MapWidgetImpl::Update); + connect(map_.get(), + &QMapLibre::Map::copyrightsChanged, + this, + [this](const QString& copyrightsHtml) + { + QTextDocument document {}; + document.setHtml(copyrightsHtml); + context_->set_map_copyrights( + document.toPlainText().toStdString()); + }); +} + void MapWidgetImpl::ConnectSignals() { connect(placefileManager_.get(), @@ -725,7 +743,8 @@ void MapWidget::SetInitialMapStyle(const std::string& styleName) void MapWidget::SetMapStyle(const std::string& styleName) { - const auto& mapProviderInfo = GetMapProviderInfo(p->mapProvider_); + const auto mapProvider = p->context_->map_provider(); + const auto& mapProviderInfo = GetMapProviderInfo(mapProvider); auto& styles = mapProviderInfo.mapStyles_; for (size_t i = 0u; i < styles.size(); ++i) @@ -737,8 +756,7 @@ void MapWidget::SetMapStyle(const std::string& styleName) logger_->debug("Updating style: {}", styles[i].name_); - util::maplibre::SetMapStyleUrl( - p->map_, p->mapProvider_, styles[i].url_); + util::maplibre::SetMapStyleUrl(p->context_, styles[i].url_); if (++p->currentStyleIndex_ == styles.size()) { @@ -757,15 +775,16 @@ qreal MapWidget::pixelRatio() void MapWidget::changeStyle() { - const auto& mapProviderInfo = GetMapProviderInfo(p->mapProvider_); + const auto mapProvider = p->context_->map_provider(); + const auto& mapProviderInfo = GetMapProviderInfo(mapProvider); auto& styles = mapProviderInfo.mapStyles_; p->currentStyle_ = &styles[p->currentStyleIndex_]; logger_->debug("Updating style: {}", styles[p->currentStyleIndex_].name_); - util::maplibre::SetMapStyleUrl( - p->map_, p->mapProvider_, styles[p->currentStyleIndex_].url_); + util::maplibre::SetMapStyleUrl(p->context_, + styles[p->currentStyleIndex_].url_); if (++p->currentStyleIndex_ == styles.size()) { @@ -1135,10 +1154,7 @@ void MapWidget::initializeGL() p->map_.reset( new QMapLibre::Map(nullptr, p->settings_, size(), pixelRatio())); p->context_->set_map(p->map_); - connect(p->map_.get(), - &QMapLibre::Map::needsRendering, - p.get(), - &MapWidgetImpl::Update); + p->ConnectMapSignals(); // Set default location to radar site std::shared_ptr radarSite = diff --git a/scwx-qt/source/scwx/qt/util/maplibre.cpp b/scwx-qt/source/scwx/qt/util/maplibre.cpp index 0adff1ed..3414af41 100644 --- a/scwx-qt/source/scwx/qt/util/maplibre.cpp +++ b/scwx-qt/source/scwx/qt/util/maplibre.cpp @@ -88,10 +88,11 @@ glm::vec2 LatLongToScreenCoordinate(const QMapLibre::Coordinate& coordinate) return screen; } -void SetMapStyleUrl(const std::shared_ptr& map, - map::MapProvider mapProvider, - const std::string& url) +void SetMapStyleUrl(const std::shared_ptr& mapContext, + const std::string& url) { + const auto mapProvider = mapContext->map_provider(); + QString qUrl = QString::fromStdString(url); if (mapProvider == map::MapProvider::MapTiler) @@ -100,7 +101,11 @@ void SetMapStyleUrl(const std::shared_ptr& map, qUrl.append(map::GetMapProviderApiKey(mapProvider)); } - map->setStyleUrl(qUrl); + auto map = mapContext->map().lock(); + if (map != nullptr) + { + map->setStyleUrl(qUrl); + } } } // namespace maplibre diff --git a/scwx-qt/source/scwx/qt/util/maplibre.hpp b/scwx-qt/source/scwx/qt/util/maplibre.hpp index 619ba2ca..7c2eb58b 100644 --- a/scwx-qt/source/scwx/qt/util/maplibre.hpp +++ b/scwx-qt/source/scwx/qt/util/maplibre.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include @@ -34,9 +34,8 @@ bool IsPointInPolygon(const std::vector& vertices, glm::vec2 LatLongToScreenCoordinate(const QMapLibre::Coordinate& coordinate); -void SetMapStyleUrl(const std::shared_ptr& map, - map::MapProvider mapProvider, - const std::string& url); +void SetMapStyleUrl(const std::shared_ptr& mapContext, + const std::string& url); } // namespace maplibre } // namespace util