diff --git a/scwx-qt/source/scwx/qt/model/layer_model.cpp b/scwx-qt/source/scwx/qt/model/layer_model.cpp index c2d1fcce..32234753 100644 --- a/scwx-qt/source/scwx/qt/model/layer_model.cpp +++ b/scwx-qt/source/scwx/qt/model/layer_model.cpp @@ -1117,6 +1117,24 @@ LayerInfo tag_invoke(boost::json::value_to_tag, boost::json::value_to>(jv.at(kDisplayedName_))}; } +std::shared_ptr LayerModel::Instance() +{ + static std::weak_ptr layerModelReference_ {}; + static std::mutex instanceMutex_ {}; + + std::unique_lock lock(instanceMutex_); + + std::shared_ptr layerModel = layerModelReference_.lock(); + + if (layerModel == nullptr) + { + layerModel = std::make_shared(); + layerModelReference_ = layerModel; + } + + return layerModel; +} + } // namespace model } // namespace qt } // namespace scwx diff --git a/scwx-qt/source/scwx/qt/model/layer_model.hpp b/scwx-qt/source/scwx/qt/model/layer_model.hpp index 0058aa43..6b1fe43d 100644 --- a/scwx-qt/source/scwx/qt/model/layer_model.hpp +++ b/scwx-qt/source/scwx/qt/model/layer_model.hpp @@ -74,6 +74,8 @@ public: const QModelIndex& destinationParent, int destinationChild) override; + static std::shared_ptr Instance(); + public slots: void HandlePlacefileRemoved(const std::string& name); void HandlePlacefileRenamed(const std::string& oldName, diff --git a/scwx-qt/source/scwx/qt/ui/layer_dialog.cpp b/scwx-qt/source/scwx/qt/ui/layer_dialog.cpp index 1f754ae9..828a6b48 100644 --- a/scwx-qt/source/scwx/qt/ui/layer_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/layer_dialog.cpp @@ -22,10 +22,10 @@ class LayerDialogImpl public: explicit LayerDialogImpl(LayerDialog* self) : self_ {self}, - layerModel_ {new model::LayerModel(self)}, + layerModel_ {model::LayerModel::Instance()}, layerProxyModel_ {new QSortFilterProxyModel(self_)} { - layerProxyModel_->setSourceModel(layerModel_); + layerProxyModel_->setSourceModel(layerModel_.get()); layerProxyModel_->setFilterCaseSensitivity( Qt::CaseSensitivity::CaseInsensitive); layerProxyModel_->setFilterKeyColumn(-1); @@ -38,9 +38,9 @@ public: std::vector GetSelectedRows(); std::vector> GetContiguousRows(); - LayerDialog* self_; - model::LayerModel* layerModel_; - QSortFilterProxyModel* layerProxyModel_; + LayerDialog* self_; + std::shared_ptr layerModel_; + QSortFilterProxyModel* layerProxyModel_; }; LayerDialog::LayerDialog(QWidget* parent) : @@ -101,7 +101,7 @@ void LayerDialogImpl::ConnectSignals() const QItemSelection& /* deselected */) { UpdateMoveButtonsEnabled(); }); - QObject::connect(layerModel_, + QObject::connect(layerModel_.get(), &QAbstractItemModel::rowsMoved, self_, [this]()