diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index c1fcca6a..490a0826 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -530,7 +530,12 @@ void MainWindowImpl::ConnectOtherSignals() &ui::AlertDockWidget::MoveMap, this, [=](double latitude, double longitude) - { activeMap_->SetMapLocation(latitude, longitude); }, + { + for (map::MapWidget* map : maps_) + { + map->SetMapLocation(latitude, longitude, true); + } + }, Qt::QueuedConnection); connect(mainWindow_, &MainWindow::ActiveMapMoved, diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index b770ab66..40d45910 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -424,21 +424,31 @@ void MapWidget::SelectRadarProduct( SelectRadarProduct(group, product, productCode); } -void MapWidget::SelectRadarSite(const std::string& id) +void MapWidget::SelectRadarSite(const std::string& id, bool updateCoordinates) { logger_->debug("Selecting radar site: {}", id); std::shared_ptr radarSite = config::RadarSite::Get(id); + SelectRadarSite(radarSite, updateCoordinates); +} + +void MapWidget::SelectRadarSite(std::shared_ptr radarSite, + bool updateCoordinates) +{ // Verify radar site is valid and has changed if (radarSite != nullptr && (p->radarProductManager_ == nullptr || - id != p->radarProductManager_->radar_site()->id())) + radarSite->id() != p->radarProductManager_->radar_site()->id())) { auto radarProductView = p->context_->radar_product_view(); - p->map_->setCoordinate({radarSite->latitude(), radarSite->longitude()}); - p->SetRadarSite(id); + if (updateCoordinates) + { + p->map_->setCoordinate( + {radarSite->latitude(), radarSite->longitude()}); + } + p->SetRadarSite(radarSite->id()); p->Update(); // Select products from new site @@ -480,12 +490,29 @@ void MapWidget::SetAutoRefresh(bool enabled) } } -void MapWidget::SetMapLocation(double latitude, double longitude) +void MapWidget::SetMapLocation(double latitude, + double longitude, + bool updateRadarSite) { if (p->map_ != nullptr && p->prevLatitude_ != latitude || p->prevLongitude_ != longitude) { + // Update the map location p->map_->setCoordinate({latitude, longitude}); + + // If the radar site should be updated based on the new location + if (updateRadarSite) + { + // Find the nearest WSR-88D radar + std::shared_ptr nearestRadarSite = + config::RadarSite::FindNearest(latitude, longitude, "wsr88d"); + + // If found, select it + if (nearestRadarSite != nullptr) + { + SelectRadarSite(nearestRadarSite->id(), false); + } + } } } diff --git a/scwx-qt/source/scwx/qt/map/map_widget.hpp b/scwx-qt/source/scwx/qt/map/map_widget.hpp index 73e4aae2..63f51160 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.hpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.hpp @@ -48,10 +48,40 @@ public: const std::string& product, int16_t productCode); void SelectRadarProduct(std::shared_ptr record); - void SelectRadarSite(const std::string& radarSite); + + /** + * @brief Selects a radar site. + * + * @param [in] radarSite ID of the requested radar site + * @param [in] updateCoordinates Whether to update the map coordinates to the + * requested radar site location. Default is true. + */ + void SelectRadarSite(const std::string& id, bool updateCoordinates = true); + + /** + * @brief Selects a radar site. + * + * @param [in] radarSite Shared pointer to the requested radar site + * @param [in] updateCoordinates Whether to update the map coordinates to the + * requested radar site location. Default is true. + */ + void SelectRadarSite(std::shared_ptr radarSite, + bool updateCoordinates = true); + void SetActive(bool isActive); void SetAutoRefresh(bool enabled); - void SetMapLocation(double latitude, double longitude); + + /** + * @brief Sets the current map location. + * + * @param [in] latitude Latitude in degrees + * @param [in] longitude Longitude in degrees + * @param [in] updateRadarSite Whether to update the selected radar site to + * the closest WSR-88D site. Default is false. + */ + void SetMapLocation(double latitude, + double longitude, + bool updateRadarSite = false); void SetMapParameters(double latitude, double longitude, double zoom,