From ba75326c0cbe431a673b9914678bcef7b20deb9e Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sat, 28 Oct 2023 06:21:01 -0500 Subject: [PATCH] Synchronize placefile layers with placefile manager after initialization --- .../scwx/qt/manager/placefile_manager.cpp | 1 + .../scwx/qt/manager/placefile_manager.hpp | 1 + scwx-qt/source/scwx/qt/model/layer_model.cpp | 42 +++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/scwx-qt/source/scwx/qt/manager/placefile_manager.cpp b/scwx-qt/source/scwx/qt/manager/placefile_manager.cpp index 452bba25..c069d16c 100644 --- a/scwx-qt/source/scwx/qt/manager/placefile_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/placefile_manager.cpp @@ -162,6 +162,7 @@ PlacefileManager::PlacefileManager() : p(std::make_unique(this)) // Read placefile settings on startup main::Application::WaitForInitialization(); p->ReadPlacefileSettings(); + Q_EMIT PlacefilesInitialized(); }); } diff --git a/scwx-qt/source/scwx/qt/manager/placefile_manager.hpp b/scwx-qt/source/scwx/qt/manager/placefile_manager.hpp index ee9bf3a4..7010ca94 100644 --- a/scwx-qt/source/scwx/qt/manager/placefile_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/placefile_manager.hpp @@ -51,6 +51,7 @@ public: static std::shared_ptr Instance(); signals: + void PlacefilesInitialized(); void PlacefileEnabled(const std::string& name, bool enabled); void PlacefileRemoved(const std::string& name); void PlacefileRenamed(const std::string& oldName, diff --git a/scwx-qt/source/scwx/qt/model/layer_model.cpp b/scwx-qt/source/scwx/qt/model/layer_model.cpp index 32234753..7bf835e0 100644 --- a/scwx-qt/source/scwx/qt/model/layer_model.cpp +++ b/scwx-qt/source/scwx/qt/model/layer_model.cpp @@ -99,6 +99,7 @@ public: void AddPlacefile(const std::string& name); void InitializeLayerSettings(); void ReadLayerSettings(); + void SynchronizePlacefileLayers(); void WriteLayerSettings(); static void ValidateLayerSettings(LayerVector& layers); @@ -107,6 +108,9 @@ public: std::string layerSettingsPath_ {}; + bool placefilesInitialized_ {false}; + std::vector initialPlacefiles_ {}; + std::shared_ptr placefileManager_ { manager::PlacefileManager::Instance()}; @@ -116,6 +120,11 @@ public: LayerModel::LayerModel(QObject* parent) : QAbstractTableModel(parent), p(std::make_unique(this)) { + connect(p->placefileManager_.get(), + &manager::PlacefileManager::PlacefilesInitialized, + this, + [this]() { p->SynchronizePlacefileLayers(); }); + connect(p->placefileManager_.get(), &manager::PlacefileManager::PlacefileEnabled, this, @@ -430,6 +439,34 @@ void LayerModel::ResetLayers() endResetModel(); } +void LayerModel::Impl::SynchronizePlacefileLayers() +{ + placefilesInitialized_ = true; + + int row = 0; + for (auto it = layers_.begin(); it != layers_.end();) + { + if (it->type_ == types::LayerType::Placefile && + std::find(initialPlacefiles_.begin(), + initialPlacefiles_.end(), + std::get(it->description_)) == + initialPlacefiles_.end()) + { + // If the placefile layer was not loaded by the placefile manager, + // erase it + self_->beginRemoveRows(QModelIndex(), row, row); + it = layers_.erase(it); + self_->endRemoveRows(); + continue; + } + + ++it; + ++row; + } + + initialPlacefiles_.clear(); +} + int LayerModel::rowCount(const QModelIndex& parent) const { return parent.isValid() ? 0 : static_cast(p->layers_.size()); @@ -973,6 +1010,11 @@ void LayerModel::HandlePlacefileRenamed(const std::string& oldName, void LayerModel::HandlePlacefileUpdate(const std::string& name) { + if (!p->placefilesInitialized_) + { + p->initialPlacefiles_.push_back(name); + } + auto it = std::find_if(p->layers_.begin(), p->layers_.end(),