00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "Model.h"
00017 #include "AlignmentModel.h"
00018 #include "base/PlayParameterRepository.h"
00019
00020 #include <QTextStream>
00021
00022 #include <iostream>
00023
00024 const int Model::COMPLETION_UNKNOWN = -1;
00025
00026 Model::~Model()
00027 {
00028 std::cerr << "Model::~Model(" << this << ")" << std::endl;
00029
00030 if (!m_aboutToDelete) {
00031 std::cerr << "NOTE: Model::~Model(" << this << ", \""
00032 << objectName().toStdString() << "\"): Model deleted "
00033 << "with no aboutToDelete notification" << std::endl;
00034 }
00035
00036 if (m_alignment) {
00037 m_alignment->aboutToDelete();
00038 delete m_alignment;
00039 }
00040
00041
00042
00043
00044
00045 PlayParameterRepository::getInstance()->removeModel(this);
00046 }
00047
00048 void
00049 Model::setSourceModel(Model *model)
00050 {
00051 if (m_sourceModel) {
00052 disconnect(m_sourceModel, SIGNAL(aboutToBeDeleted()),
00053 this, SLOT(sourceModelAboutToBeDeleted()));
00054 }
00055
00056 m_sourceModel = model;
00057
00058 if (m_sourceModel) {
00059 connect(m_sourceModel, SIGNAL(alignmentCompletionChanged()),
00060 this, SIGNAL(alignmentCompletionChanged()));
00061 connect(m_sourceModel, SIGNAL(aboutToBeDeleted()),
00062 this, SLOT(sourceModelAboutToBeDeleted()));
00063 }
00064 }
00065
00066 void
00067 Model::aboutToDelete()
00068 {
00069 std::cerr << "Model(" << this << ")::aboutToDelete()" << std::endl;
00070
00071 if (m_aboutToDelete) {
00072 std::cerr << "WARNING: Model(" << this << ", \""
00073 << objectName().toStdString() << "\")::aboutToDelete: "
00074 << "aboutToDelete called more than once for the same model"
00075 << std::endl;
00076 }
00077
00078 emit aboutToBeDeleted();
00079 m_aboutToDelete = true;
00080 }
00081
00082 void
00083 Model::sourceModelAboutToBeDeleted()
00084 {
00085 m_sourceModel = 0;
00086 }
00087
00088 void
00089 Model::setAlignment(AlignmentModel *alignment)
00090 {
00091 if (m_alignment) {
00092 m_alignment->aboutToDelete();
00093 delete m_alignment;
00094 }
00095 m_alignment = alignment;
00096 connect(m_alignment, SIGNAL(completionChanged()),
00097 this, SIGNAL(alignmentCompletionChanged()));
00098 }
00099
00100 const Model *
00101 Model::getAlignmentReference() const
00102 {
00103 if (!m_alignment) {
00104 if (m_sourceModel) return m_sourceModel->getAlignmentReference();
00105 return 0;
00106 }
00107 return m_alignment->getReferenceModel();
00108 }
00109
00110 size_t
00111 Model::alignToReference(size_t frame) const
00112 {
00113 if (!m_alignment) {
00114 if (m_sourceModel) return m_sourceModel->alignToReference(frame);
00115 else return frame;
00116 }
00117 size_t refFrame = m_alignment->toReference(frame);
00118 const Model *m = m_alignment->getReferenceModel();
00119 if (m && refFrame > m->getEndFrame()) refFrame = m->getEndFrame();
00120 return refFrame;
00121 }
00122
00123 size_t
00124 Model::alignFromReference(size_t refFrame) const
00125 {
00126 if (!m_alignment) {
00127 if (m_sourceModel) return m_sourceModel->alignFromReference(refFrame);
00128 else return refFrame;
00129 }
00130 size_t frame = m_alignment->fromReference(refFrame);
00131 if (frame > getEndFrame()) frame = getEndFrame();
00132 return frame;
00133 }
00134
00135 int
00136 Model::getAlignmentCompletion() const
00137 {
00138
00139 if (!m_alignment) {
00140 if (m_sourceModel) return m_sourceModel->getAlignmentCompletion();
00141 else return 100;
00142 }
00143 int completion = 0;
00144 (void)m_alignment->isReady(&completion);
00145
00146 return completion;
00147 }
00148
00149 QString
00150 Model::getTitle() const
00151 {
00152 if (m_sourceModel) return m_sourceModel->getTitle();
00153 else return "";
00154 }
00155
00156 QString
00157 Model::getMaker() const
00158 {
00159 if (m_sourceModel) return m_sourceModel->getMaker();
00160 else return "";
00161 }
00162
00163 QString
00164 Model::getLocation() const
00165 {
00166 if (m_sourceModel) return m_sourceModel->getLocation();
00167 else return "";
00168 }
00169
00170 void
00171 Model::toXml(QTextStream &stream, QString indent,
00172 QString extraAttributes) const
00173 {
00174 stream << indent;
00175 stream << QString("<model id=\"%1\" name=\"%2\" sampleRate=\"%3\" start=\"%4\" end=\"%5\" %6/>\n")
00176 .arg(getObjectExportId(this))
00177 .arg(encodeEntities(objectName()))
00178 .arg(getSampleRate())
00179 .arg(getStartFrame())
00180 .arg(getEndFrame())
00181 .arg(extraAttributes);
00182 }
00183
00184