Mercurial > hg > svcore
diff data/model/Model.cpp @ 319:3ff8f571da09
* Hoist alignment model set/query up to Model, so any models can be aligned
* Add Model::aboutToDelete and aboutToBeDeleted for management of models that
are contained by or referred to by other models instead of only the document
author | Chris Cannam |
---|---|
date | Wed, 24 Oct 2007 15:21:38 +0000 |
parents | 70a232b1f12a |
children | a71dec01c4d3 |
line wrap: on
line diff
--- a/data/model/Model.cpp Mon Oct 22 09:45:35 2007 +0000 +++ b/data/model/Model.cpp Wed Oct 24 15:21:38 2007 +0000 @@ -14,6 +14,7 @@ */ #include "Model.h" +#include "AlignmentModel.h" #include "base/PlayParameterRepository.h" #include <QTextStream> @@ -26,6 +27,17 @@ { // std::cerr << "Model::~Model(" << this << ")" << std::endl; + if (!m_aboutToDelete) { + std::cerr << "NOTE: Model::~Model(" << this << ", \"" + << objectName().toStdString() << "\"): Model deleted " + << "with no aboutToDelete notification" << std::endl; + } + + if (m_alignment) { + m_alignment->aboutToDelete(); + delete m_alignment; + } + // Subclasses have to handle adding themselves to the repository, // if they want to be played. We can't do it from here because // the repository would be unable to tell whether we were playable @@ -34,6 +46,86 @@ } void +Model::setSourceModel(Model *model) +{ + if (m_sourceModel) { + disconnect(m_sourceModel, SIGNAL(aboutToBeDeleted()), + this, SLOT(sourceModelAboutToBeDeleted())); + } + + m_sourceModel = model; + + if (m_sourceModel) { + connect(m_sourceModel, SIGNAL(aboutToBeDeleted()), + this, SLOT(sourceModelAboutToBeDeleted())); + } +} + +void +Model::aboutToDelete() +{ + if (m_aboutToDelete) { + std::cerr << "WARNING: Model(" << this << ", \"" + << objectName().toStdString() << "\")::aboutToDelete: " + << "aboutToDelete called more than once for the same model" + << std::endl; + } + + emit aboutToBeDeleted(); + m_aboutToDelete = true; +} + +void +Model::sourceModelAboutToBeDeleted() +{ + m_sourceModel = 0; +} + +void +Model::setAlignment(AlignmentModel *alignment) +{ + if (m_alignment) { + m_alignment->aboutToDelete(); + delete m_alignment; + } + m_alignment = alignment; + connect(m_alignment, SIGNAL(completionChanged()), + this, SIGNAL(alignmentCompletionChanged())); +} + +const Model * +Model::getAlignmentReference() const +{ + if (!m_alignment) return 0; + return m_alignment->getReferenceModel(); +} + +size_t +Model::alignToReference(size_t frame) const +{ + if (!m_alignment) return frame; + return m_alignment->toReference(frame); +} + +size_t +Model::alignFromReference(size_t refFrame) const +{ + if (!m_alignment) return refFrame; + return m_alignment->fromReference(refFrame); +} + +int +Model::getAlignmentCompletion() const +{ + std::cerr << "Model::getAlignmentCompletion" << std::endl; + if (!m_alignment) return 100; + int completion = 0; + (void)m_alignment->isReady(&completion); + std::cerr << " -> " << completion << std::endl; + return completion; +} + +void Model::toXml(QTextStream &stream, QString indent, QString extraAttributes) const {