Mercurial > hg > svapp
comparison framework/Document.cpp @ 588:d122d3595a32
Store aggregate models in the document and release them when they are invalidated (because their components have been released). They're no longer leaked, but we still don't save them in the session file.
author | Chris Cannam |
---|---|
date | Mon, 27 Feb 2017 16:26:37 +0000 |
parents | 36aa947ec962 |
children | cce97b00663a |
comparison
equal
deleted
inserted
replaced
587:0f82c719d885 | 588:d122d3595a32 |
---|---|
20 #include "data/model/WaveFileModel.h" | 20 #include "data/model/WaveFileModel.h" |
21 #include "data/model/WritableWaveFileModel.h" | 21 #include "data/model/WritableWaveFileModel.h" |
22 #include "data/model/DenseThreeDimensionalModel.h" | 22 #include "data/model/DenseThreeDimensionalModel.h" |
23 #include "data/model/DenseTimeValueModel.h" | 23 #include "data/model/DenseTimeValueModel.h" |
24 #include "data/model/FlexiNoteModel.h" | 24 #include "data/model/FlexiNoteModel.h" |
25 #include "data/model/AggregateWaveModel.h" | |
25 | 26 |
26 #include "layer/Layer.h" | 27 #include "layer/Layer.h" |
27 #include "widgets/CommandHistory.h" | 28 #include "widgets/CommandHistory.h" |
28 #include "base/Command.h" | 29 #include "base/Command.h" |
29 #include "view/View.h" | 30 #include "view/View.h" |
542 } | 543 } |
543 | 544 |
544 for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { | 545 for (ModelMap::iterator i = m_models.begin(); i != m_models.end(); ++i) { |
545 if (i->second.additional) { | 546 if (i->second.additional) { |
546 Model *m = i->first; | 547 Model *m = i->first; |
548 m->aboutToDelete(); | |
547 emit modelAboutToBeDeleted(m); | 549 emit modelAboutToBeDeleted(m); |
548 delete m; | 550 delete m; |
549 } | 551 } |
550 } | 552 } |
551 | 553 |
693 SVDEBUG << "Document::addAdditionalModel: auto-alignment is on, aligning model if possible" << endl; | 695 SVDEBUG << "Document::addAdditionalModel: auto-alignment is on, aligning model if possible" << endl; |
694 alignModel(model); | 696 alignModel(model); |
695 } | 697 } |
696 | 698 |
697 emit modelAdded(model); | 699 emit modelAdded(model); |
700 } | |
701 | |
702 void | |
703 Document::addAggregateModel(AggregateWaveModel *model) | |
704 { | |
705 connect(model, SIGNAL(modelInvalidated()), | |
706 this, SLOT(aggregateModelInvalidated())); | |
707 m_aggregateModels.insert(model); | |
708 } | |
709 | |
710 void | |
711 Document::aggregateModelInvalidated() | |
712 { | |
713 QObject *s = sender(); | |
714 AggregateWaveModel *aggregate = qobject_cast<AggregateWaveModel *>(s); | |
715 if (aggregate) releaseModel(aggregate); | |
698 } | 716 } |
699 | 717 |
700 Model * | 718 Model * |
701 Document::addDerivedModel(const Transform &transform, | 719 Document::addDerivedModel(const Transform &transform, |
702 const ModelTransformer::Input &input, | 720 const ModelTransformer::Input &input, |
773 } | 791 } |
774 | 792 |
775 bool toDelete = false; | 793 bool toDelete = false; |
776 | 794 |
777 if (m_models.find(model) != m_models.end()) { | 795 if (m_models.find(model) != m_models.end()) { |
778 | |
779 if (m_models[model].refcount == 0) { | 796 if (m_models[model].refcount == 0) { |
780 cerr << "WARNING: Document::releaseModel: model " << model | 797 SVCERR << "WARNING: Document::releaseModel: model " << model |
781 << " reference count is zero already!" << endl; | 798 << " reference count is zero already!" << endl; |
782 } else { | 799 } else { |
783 if (--m_models[model].refcount == 0) { | 800 if (--m_models[model].refcount == 0) { |
784 toDelete = true; | 801 toDelete = true; |
785 } | 802 } |
786 } | 803 } |
804 } else if (m_aggregateModels.find(model) != m_aggregateModels.end()) { | |
805 SVDEBUG << "Document::releaseModel: is an aggregate model" << endl; | |
806 toDelete = true; | |
787 } else { | 807 } else { |
788 cerr << "WARNING: Document::releaseModel: Unfound model " | 808 SVCERR << "WARNING: Document::releaseModel: Unfound model " |
789 << model << endl; | 809 << model << endl; |
790 toDelete = true; | 810 toDelete = true; |
791 } | 811 } |
792 | 812 |
793 if (toDelete) { | 813 if (toDelete) { |
794 | 814 |
801 } | 821 } |
802 } | 822 } |
803 | 823 |
804 if (sourceCount > 0) { | 824 if (sourceCount > 0) { |
805 SVDEBUG << "Document::releaseModel: Deleting model " | 825 SVDEBUG << "Document::releaseModel: Deleting model " |
806 << model << " even though it is source for " | 826 << model << " even though it is source for " |
807 << sourceCount << " other derived model(s) -- resetting " | 827 << sourceCount << " other derived model(s) -- resetting " |
808 << "their source fields appropriately" << endl; | 828 << "their source fields appropriately" << endl; |
809 } | 829 } |
810 | 830 |
811 model->aboutToDelete(); | 831 model->aboutToDelete(); |
812 emit modelAboutToBeDeleted(model); | 832 emit modelAboutToBeDeleted(model); |
813 m_models.erase(model); | 833 m_models.erase(model); |