Synchronize placefile layers with placefile manager after initialization

This commit is contained in:
Dan Paulat 2023-10-28 06:21:01 -05:00
parent b6aef07af4
commit ba75326c0c
3 changed files with 44 additions and 0 deletions

View file

@ -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<std::string> initialPlacefiles_ {};
std::shared_ptr<manager::PlacefileManager> placefileManager_ {
manager::PlacefileManager::Instance()};
@ -116,6 +120,11 @@ public:
LayerModel::LayerModel(QObject* parent) :
QAbstractTableModel(parent), p(std::make_unique<Impl>(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<std::string>(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<int>(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(),