diff --git a/scwx-qt/source/scwx/qt/model/layer_model.cpp b/scwx-qt/source/scwx/qt/model/layer_model.cpp index c6ce636f..da57d462 100644 --- a/scwx-qt/source/scwx/qt/model/layer_model.cpp +++ b/scwx-qt/source/scwx/qt/model/layer_model.cpp @@ -52,7 +52,7 @@ struct LayerInfo { types::LayerType type_; LayerDescription description_; - bool movable_; + bool movable_ {true}; std::array displayed_ {true, true, true, true}; }; @@ -78,6 +78,13 @@ static const std::vector kImmovableLayers_ { {types::LayerType::Map, types::Layer::MapUnderlay, false}, }; +static const std::array kAlertPhenomena_ { + awips::Phenomenon::Tornado, + awips::Phenomenon::SnowSquall, + awips::Phenomenon::SevereThunderstorm, + awips::Phenomenon::FlashFlood, + awips::Phenomenon::Marine}; + class LayerModel::Impl { public: @@ -201,6 +208,8 @@ void LayerModel::Impl::ValidateLayerSettings(LayerVector& layers) { // Validate immovable layers std::vector immovableIterators {}; + LayerVector::iterator mapSymbologyIterator {}; + LayerVector::iterator mapUnderlayIterator {}; for (auto& immovableLayer : kImmovableLayers_) { // Set the default displayed state for a layer that is not found @@ -243,11 +252,53 @@ void LayerModel::Impl::ValidateLayerSettings(LayerVector& layers) it->displayed_ = displayed; } + // Store positional iterators + if (it->type_ == types::LayerType::Map) + { + switch (std::get(it->description_)) + { + case types::Layer::MapSymbology: + mapSymbologyIterator = it; + break; + + case types::Layer::MapUnderlay: + mapUnderlayIterator = it; + break; + + default: + break; + } + } + // Add the immovable iterator to the list immovableIterators.push_back(it); + } - // Ensure the layer is marked immovable - it->movable_ = false; + // Validate alert layers + for (auto& phenomenon : kAlertPhenomena_) + { + // Find the alert layer + auto it = std::find_if(layers.begin(), + layers.end(), + [&phenomenon](const LayerInfo& layer) + { + return layer.type_ == types::LayerType::Alert && + std::get( + layer.description_) == phenomenon; + }); + + if (it == layers.end()) + { + layers.insert(mapSymbologyIterator, + {types::LayerType::Alert, phenomenon}); + } + } + + // Ensure layers are appropriately marked movable + for (auto& layer : layers) + { + layer.movable_ = (layer.type_ != types::LayerType::Information && + layer.type_ != types::LayerType::Map); } }