changeset 573:5c14493026da by-id

ModelById updates
author Chris Cannam
date Mon, 08 Jul 2019 19:27:49 +0100
parents 3f0b44418a19
children ca0ff30dae26
files repoint-lock.json src/Analyser.cpp src/MainWindow.cpp src/MainWindow.h
diffstat 4 files changed, 71 insertions(+), 71 deletions(-) [+]
line wrap: on
line diff
--- a/repoint-lock.json	Mon Jul 08 14:12:08 2019 +0100
+++ b/repoint-lock.json	Mon Jul 08 19:27:49 2019 +0100
@@ -46,7 +46,7 @@
       "pin": "1c8844bfa946"
     },
     "pyin": {
-      "pin": "550d5f186abb"
+      "pin": "6f17d912e1dd"
     },
     "chp": {
       "pin": "456842723db6"
--- a/src/Analyser.cpp	Mon Jul 08 14:12:08 2019 +0100
+++ b/src/Analyser.cpp	Mon Jul 08 19:27:49 2019 +0100
@@ -197,32 +197,36 @@
 void
 Analyser::layerCompletionChanged()
 {
-    if (getInitialAnalysisCompletion() == 100) {
+    if (getInitialAnalysisCompletion() < 100) {
+        return;
+    }
 
-        emit initialAnalysisCompleted();
+    emit initialAnalysisCompleted();
 
-        if (m_layers[Audio]) {
+    if (!m_layers[Audio]) {
+        return;
+    }
 
-            // Extend pitch-track and note layers so as to nominally
-            // end at the same time as the audio. This affects any
-            // time-filling done on export etc.
-            
-            sv_frame_t endFrame = m_layers[Audio]->getModel()->getEndFrame();
+    // Extend pitch-track and note layers so as to nominally end at
+    // the same time as the audio. This affects any time-filling done
+    // on export etc.
+
+    auto audioModel = ModelById::get(m_layers[Audio]->getModel());
+    sv_frame_t endFrame = audioModel->getEndFrame();
         
-            if (m_layers[PitchTrack]) {
-                SparseTimeValueModel *model = qobject_cast<SparseTimeValueModel *>
-                    (m_layers[PitchTrack]->getModel());
-                if (model) {
-                    model->extendEndFrame(endFrame);
-                }
-            }
-            if (m_layers[Notes]) {
-                NoteModel *model = qobject_cast<NoteModel *>
-                    (m_layers[Notes]->getModel());
-                if (model) {
-                    model->extendEndFrame(endFrame);
-                }
-            }
+    if (m_layers[PitchTrack]) {
+        auto model = ModelById::getAs<SparseTimeValueModel>
+            (m_layers[PitchTrack]->getModel());
+        if (model) {
+            model->extendEndFrame(endFrame);
+        }
+    }
+
+    if (m_layers[Notes]) {
+        auto model = ModelById::getAs<NoteModel>
+            (m_layers[Notes]->getModel());
+        if (model) {
+            model->extendEndFrame(endFrame);
         }
     }
 }
@@ -315,7 +319,7 @@
     waveform->setShowMeans(false); // too small & pale for this
     waveform->setBaseColour
         (ColourDatabase::getInstance()->getColourIndex(tr("Grey")));
-    PlayParameters *params = waveform->getPlayParameters();
+    auto params = waveform->getPlayParameters();
     if (params) {
         params->setPlayPan(-1);
         params->setPlayGain(1);
@@ -463,7 +467,7 @@
         qobject_cast<TimeValueLayer *>(m_layers[PitchTrack]);
     if (pitchLayer) {
         pitchLayer->setBaseColour(cdb->getColourIndex(tr("Black")));
-        PlayParameters *params = pitchLayer->getPlayParameters();
+        auto params = pitchLayer->getPlayParameters();
         if (params) {
             params->setPlayPan(1);
             params->setPlayGain(0.5);
@@ -476,7 +480,7 @@
         qobject_cast<FlexiNoteLayer *>(m_layers[Notes]);
     if (flexiNoteLayer) {
         flexiNoteLayer->setBaseColour(cdb->getColourIndex(tr("Bright Blue")));
-        PlayParameters *params = flexiNoteLayer->getPlayParameters();
+        auto params = flexiNoteLayer->getPlayParameters();
         if (params) {
             params->setPlayPan(1);
             params->setPlayGain(0.5);
@@ -613,7 +617,7 @@
     transforms.push_back(t);
     
     m_currentAsyncHandle =
-        m_document->createDerivedLayersAsync(transforms, ModelId, this);
+        m_document->createDerivedLayersAsync(transforms, m_fileModel, this);
 
     return "";
 }
@@ -681,7 +685,7 @@
         for (int i = 0; i < (int)all.size(); ++i) {
             TimeValueLayer *t = qobject_cast<TimeValueLayer *>(all[i]);
             if (t) {
-                PlayParameters *params = t->getPlayParameters();
+                auto params = t->getPlayParameters();
                 if (params) {
                     params->setPlayAudible(false);
                 }
@@ -861,16 +865,20 @@
 Analyser::takePitchTrackFrom(Layer *otherLayer)
 {
     Layer *myLayer = m_layers[PitchTrack];
-    if (!myLayer) return;
+    if (!myLayer || !otherLayer) return;
+
+    auto myModel = ModelById::get(myLayer->getModel());
+    auto otherModel = ModelById::get(otherLayer->getModel());
+    if (!myModel || !otherModel) return;
 
     Clipboard clip;
-
-    Selection sel = Selection(myLayer->getModel()->getStartFrame(),
-                              myLayer->getModel()->getEndFrame());
+    
+    Selection sel = Selection(myModel->getStartFrame(),
+                              myModel->getEndFrame());
     myLayer->deleteSelection(sel);
 
-    sel = Selection(otherLayer->getModel()->getStartFrame(),
-                    otherLayer->getModel()->getEndFrame());
+    sel = Selection(otherModel->getStartFrame(),
+                    otherModel->getEndFrame());
     otherLayer->copy(m_pane, sel, clip);
 
     // Remove all pitches <= 0Hz -- we now save absent pitches as 0Hz
@@ -986,7 +994,7 @@
 Analyser::isAudible(Component c) const
 {
     if (m_layers[c]) {
-        PlayParameters *params = m_layers[c]->getPlayParameters();
+        auto params = m_layers[c]->getPlayParameters();
         if (!params) return false;
         return params->isPlayAudible();
     } else {
@@ -998,7 +1006,7 @@
 Analyser::setAudible(Component c, bool a)
 {
     if (m_layers[c]) {
-        PlayParameters *params = m_layers[c]->getPlayParameters();
+        auto params = m_layers[c]->getPlayParameters();
         if (!params) return;
         params->setPlayAudible(a);
         saveState(c);
@@ -1009,7 +1017,7 @@
 Analyser::getGain(Component c) const
 {
     if (m_layers[c]) {
-        PlayParameters *params = m_layers[c]->getPlayParameters();
+        auto params = m_layers[c]->getPlayParameters();
         if (!params) return 1.f;
         return params->getPlayGain();
     } else {
@@ -1021,7 +1029,7 @@
 Analyser::setGain(Component c, float gain)
 {
     if (m_layers[c]) {
-        PlayParameters *params = m_layers[c]->getPlayParameters();
+        auto params = m_layers[c]->getPlayParameters();
         if (!params) return;
         params->setPlayGain(gain);
         saveState(c);
@@ -1032,7 +1040,7 @@
 Analyser::getPan(Component c) const
 {
     if (m_layers[c]) {
-        PlayParameters *params = m_layers[c]->getPlayParameters();
+        auto params = m_layers[c]->getPlayParameters();
         if (!params) return 1.f;
         return params->getPlayPan();
     } else {
@@ -1044,7 +1052,7 @@
 Analyser::setPan(Component c, float pan)
 {
     if (m_layers[c]) {
-        PlayParameters *params = m_layers[c]->getPlayParameters();
+        auto params = m_layers[c]->getPlayParameters();
         if (!params) return;
         params->setPlayPan(pan);
         saveState(c);
--- a/src/MainWindow.cpp	Mon Jul 08 14:12:08 2019 +0100
+++ b/src/MainWindow.cpp	Mon Jul 08 19:27:49 2019 +0100
@@ -1313,7 +1313,7 @@
     Layer *layer = m_analyser->getLayer(Analyser::Notes);
     if (!layer) return;
 
-    NoteModel *model = qobject_cast<NoteModel *>(layer->getModel());
+    auto model = ModelById::getAs<NoteModel>(layer->getModel());
     if (!model) return;
 
     //!!! This seems like a strange and inefficient way to do this -
@@ -2111,7 +2111,8 @@
 QString
 MainWindow::exportToSVL(QString path, Layer *layer)
 {
-    Model *model = layer->getModel();
+    auto model = ModelById::get(layer->getModel());
+    if (!model) return "Internal error: No model in layer";
 
     QFile file(path);
     if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
@@ -2202,10 +2203,13 @@
 
                 SVDEBUG << "MainWindow::importPitchLayer: Have model" << endl;
 
+                ModelId modelId = ModelById::add
+                    (std::shared_ptr<Model>(model));
+                
                 CommandHistory::getInstance()->startCompoundOperation
                     (tr("Import Pitch Track"), true);
 
-                Layer *newLayer = m_document->createImportedLayer(model);
+                Layer *newLayer = m_document->createImportedLayer(modelId);
 
                 m_analyser->takePitchTrackFrom(newLayer);
 
@@ -2213,8 +2217,6 @@
 
                 CommandHistory::getInstance()->endCompoundOperation();
 
-                //!!! swap all data in to existing layer instead of this
-
                 if (!source.isRemote()) {
                     registerLastOpenedFilePath
                         (FileFinder::LayerFile,
@@ -2239,8 +2241,7 @@
     Layer *layer = m_analyser->getLayer(Analyser::PitchTrack);
     if (!layer) return;
 
-    SparseTimeValueModel *model =
-        qobject_cast<SparseTimeValueModel *>(layer->getModel());
+    auto model = ModelById::getAs<SparseTimeValueModel>(layer->getModel());
     if (!model) return;
 
     FileFinder::FileType type = FileFinder::LayerFileNoMidiNonSV;
@@ -2263,7 +2264,7 @@
 
     } else if (suffix == "ttl" || suffix == "n3") {
 
-        RDFExporter exporter(path, model);
+        RDFExporter exporter(path, model.get());
         exporter.write();
         if (!exporter.isOK()) {
             error = exporter.getError();
@@ -2273,7 +2274,7 @@
 
         DataExportOptions options = DataExportFillGaps;
         
-        CSVFileWriter writer(path, model,
+        CSVFileWriter writer(path, model.get(),
                              ((suffix == "csv") ? "," : "\t"),
                              options);
         writer.write();
@@ -2296,7 +2297,7 @@
     Layer *layer = m_analyser->getLayer(Analyser::Notes);
     if (!layer) return;
 
-    NoteModel *model = qobject_cast<NoteModel *>(layer->getModel());
+    auto model = ModelById::getAs<NoteModel>(layer->getModel());
     if (!model) return;
 
     FileFinder::FileType type = FileFinder::LayerFileNonSV;
@@ -2317,7 +2318,7 @@
 
     } else if (suffix == "mid" || suffix == "midi") {
      
-        MIDIFileWriter writer(path, model, model->getSampleRate());
+        MIDIFileWriter writer(path, model.get(), model->getSampleRate());
         writer.write();
         if (!writer.isOK()) {
             error = writer.getError();
@@ -2325,7 +2326,7 @@
 
     } else if (suffix == "ttl" || suffix == "n3") {
 
-        RDFExporter exporter(path, model);
+        RDFExporter exporter(path, model.get());
         exporter.write();
         if (!exporter.isOK()) {
             error = exporter.getError();
@@ -2335,7 +2336,7 @@
 
         DataExportOptions options = DataExportOmitLevels;
         
-        CSVFileWriter writer(path, model,
+        CSVFileWriter writer(path, model.get(),
                              ((suffix == "csv") ? "," : "\t"),
                              options);
         writer.write();
@@ -2654,9 +2655,9 @@
 {
     Pane *pane = m_analyser->getPane();
     Layer *layer0 = m_analyser->getLayer(Analyser::Notes);
-    NoteModel *model = qobject_cast<NoteModel *>(layer0->getModel());
+    auto model = ModelById::getAs<NoteModel>(layer0->getModel());
     FlexiNoteLayer *layer = qobject_cast<FlexiNoteLayer *>(layer0);
-    if (!layer) return;
+    if (!layer || !model) return;
 
     MultiSelection::SelectionList selections = m_viewManager->getSelections();
 
@@ -2960,23 +2961,17 @@
 }
 
 void
-MainWindow::modelAdded(Model *model)
+MainWindow::modelAdded(ModelId model)
 {
     MainWindowBase::modelAdded(model);
-    DenseTimeValueModel *dtvm = qobject_cast<DenseTimeValueModel *>(model);
+    auto dtvm = ModelById::getAs<DenseTimeValueModel>(model);
     if (dtvm) {
         cerr << "A dense time-value model (such as an audio file) has been loaded" << endl;
     }
 }
 
 void
-MainWindow::modelAboutToBeDeleted(Model *model)
-{
-    MainWindowBase::modelAboutToBeDeleted(model);
-}
-
-void
-MainWindow::mainModelChanged(WaveFileModel *model)
+MainWindow::mainModelChanged(ModelId model)
 {
     m_panLayer->setModel(model);
 
@@ -3023,7 +3018,7 @@
 void
 MainWindow::analyseNewMainModel()
 {
-    WaveFileModel *model = getMainModel();
+    auto model = getMainModel();
 
     cerr << "MainWindow::analyseNewMainModel: main model is " << model << endl;
 
@@ -3073,7 +3068,7 @@
                 this, SLOT(regionOutlined(QRect)));
 
         QString error = m_analyser->newFileLoaded
-            (m_document, getMainModel(), m_paneStack, pane);
+            (m_document, getMainModelId(), m_paneStack, pane);
         if (error != "") {
             QMessageBox::warning
                 (this,
@@ -3083,13 +3078,11 @@
         }
     }
 
-    if (!m_withSpectrogram) 
-    {
+    if (!m_withSpectrogram) {
         m_analyser->setVisible(Analyser::Spectrogram, false);
     }
 
-    if (!m_withSonification) 
-    {
+    if (!m_withSonification) {
         m_analyser->setAudible(Analyser::PitchTrack, false);
         m_analyser->setAudible(Analyser::Notes, false);
     }
--- a/src/MainWindow.h	Mon Jul 08 14:12:08 2019 +0100
+++ b/src/MainWindow.h	Mon Jul 08 19:27:49 2019 +0100
@@ -137,7 +137,6 @@
     virtual void mainModelChanged(ModelId);
     virtual void mainModelGainChanged(float);
     virtual void modelAdded(ModelId);
-    virtual void modelAboutToBeDeleted(ModelId);
 
     virtual void modelGenerationFailed(QString, QString);
     virtual void modelGenerationWarning(QString, QString);