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);