Mercurial > hg > sonic-visualiser
diff document/Document.cpp @ 45:6b6bca31ad53
* When setting a new model on a layer, don't delete the old one until after
the new one has been set (a layer's setModel may want to compare against the
old one, as WaveformLayer does)
author | Chris Cannam |
---|---|
date | Thu, 05 Oct 2006 11:00:59 +0000 |
parents | 56e1d4242bb4 |
children | ec77936c268e |
line wrap: on
line diff
--- a/document/Document.cpp Wed Oct 04 14:01:28 2006 +0000 +++ b/document/Document.cpp Thu Oct 05 11:00:59 2006 +0000 @@ -233,7 +233,12 @@ Layer *layer = *i; Model *model = layer->getModel(); + std::cerr << "Document::setMainModel: inspecting model " + << (model ? model->objectName().toStdString() : "(null)") << " in layer " + << layer->objectName().toStdString() << std::endl; + if (model == oldMainModel) { + std::cerr << "... it uses the old main model, replacing" << std::endl; LayerFactory::getInstance()->setModel(layer, m_mainModel); continue; } @@ -248,6 +253,8 @@ if (m_models[model].source == oldMainModel) { + std::cerr << "... it uses a model derived from the old main model, regenerating" << std::endl; + // This model was derived from the previous main // model: regenerate it. @@ -270,6 +277,19 @@ } obsoleteLayers.push_back(layer); } else { + std::cerr << "Replacing model " << model << " (type " + << typeid(*model).name() << ") with model " + << replacementModel << " (type " + << typeid(*replacementModel).name() << ") in layer " + << layer << " (name " << layer->objectName().toStdString() << ")" + << std::endl; + RangeSummarisableTimeValueModel *rm = + dynamic_cast<RangeSummarisableTimeValueModel *>(replacementModel); + if (rm) { + std::cerr << "new model has " << rm->getChannelCount() << " channels " << std::endl; + } else { + std::cerr << "new model is not a RangeSummarisableTimeValueModel!" << std::endl; + } setModel(layer, replacementModel); } } @@ -469,12 +489,11 @@ return; } - if (layer->getModel()) { - if (layer->getModel() == model) { - std::cerr << "WARNING: Document::setModel: Layer is already set to this model" << std::endl; - return; - } - releaseModel(layer->getModel()); + Model *previousModel = layer->getModel(); + + if (previousModel == model) { + std::cerr << "WARNING: Document::setModel: Layer is already set to this model" << std::endl; + return; } if (model && model != m_mainModel) { @@ -482,6 +501,10 @@ } LayerFactory::getInstance()->setModel(layer, model); + + if (previousModel) { + releaseModel(previousModel); + } } void