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
 {