# HG changeset patch # User Chris Cannam # Date 1160046059 0 # Node ID 6b6bca31ad53dce1af07c4baf69c5a59273c24a7 # Parent 5a72bf7490aecac542af384515e52314f5e8b2d5 * 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) diff -r 5a72bf7490ae -r 6b6bca31ad53 document/Document.cpp --- 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(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