diff layer/TimeInstantLayer.cpp @ 358:8b69f36c74be

* some work on realignment when pasting (problems remain)
author Chris Cannam
date Mon, 04 Feb 2008 17:45:16 +0000
parents bff85425228c
children 020c485aa7e0
line wrap: on
line diff
--- a/layer/TimeInstantLayer.cpp	Mon Feb 04 13:35:43 2008 +0000
+++ b/layer/TimeInstantLayer.cpp	Mon Feb 04 17:45:16 2008 +0000
@@ -25,6 +25,7 @@
 #include "data/model/SparseOneDimensionalModel.h"
 
 #include "widgets/ItemEditDialog.h"
+#include "widgets/ListInputDialog.h"
 
 #include <QPainter>
 #include <QMouseEvent>
@@ -722,6 +723,12 @@
 	 i != points.end(); ++i) {
 	if (s.contains(i->frame)) {
             Clipboard::Point point(i->frame, i->label);
+
+    //!!! This fails, because simply being "on the same pane as" a
+    // particular model is not enough to give this layer the same
+    // alignment as it.  If it was generated by deriving from another
+    // layer's model, that would be... but it wasn't necessarily
+
             point.setReferenceFrame(m_model->alignToReference(i->frame));
             to.addPoint(point);
         }
@@ -729,15 +736,59 @@
 }
 
 bool
+TimeInstantLayer::clipboardAlignmentDiffers(const Clipboard &clip) const
+{
+    //!!! hoist -- all pastable layers will need this
+
+    //!!! This fails, because simply being "on the same pane as" a
+    // particular model is not enough to give this layer the same
+    // alignment as it.  If it was generated by deriving from another
+    // layer's model, that would be... but it wasn't necessarily
+
+    if (!m_model) return false;
+
+    std::cerr << "TimeInstantLayer::clipboardAlignmentDiffers" << std::endl;
+
+    for (Clipboard::PointList::const_iterator i = clip.getPoints().begin();
+         i != clip.getPoints().end(); ++i) {
+
+        // In principle, we want to know whether the aligned version
+        // of the reference frame in our model is the same as the
+        // source frame contained in the clipboard point.  However,
+        // because of rounding during alignment, that won't
+        // necessarily be the case even if the clipboard point came
+        // from our model!  What we need to check is whether, if we
+        // aligned the clipboard point's frame back to the reference
+        // using this model's alignment, we would obtain the same
+        // reference frame as that for the clipboard point.
+
+        // What if the clipboard point has no reference frame?  Then
+        // we have to treat it as having its own frame as the
+        // reference (i.e. having been copied from the reference
+        // model).
+        
+        long sourceFrame = i->getFrame();
+        long referenceFrame = sourceFrame;
+        if (i->haveReferenceFrame()) {
+            referenceFrame = i->getReferenceFrame();
+        }
+        long myMappedFrame = m_model->alignToReference(sourceFrame);
+
+        std::cerr << "sourceFrame = " << sourceFrame << ", referenceFrame = " << referenceFrame << " (have = " << i->haveReferenceFrame() << "), myMappedFrame = " << myMappedFrame << std::endl;
+
+        if (myMappedFrame != referenceFrame) return true;
+    }
+
+    return false;
+}
+
+bool
 TimeInstantLayer::paste(const Clipboard &from, int frameOffset, bool)
 {
     if (!m_model) return false;
 
     const Clipboard::PointList &points = from.getPoints();
 
-    SparseOneDimensionalModel::EditCommand *command =
-	new SparseOneDimensionalModel::EditCommand(m_model, tr("Paste"));
-
     //!!!
     
     // Clipboard::haveReferenceFrames() will return true if any of the
@@ -792,6 +843,31 @@
     // We either want to be literal all the way through, or aligned
     // all the way through.
 
+    bool realign = false;
+
+    if (clipboardAlignmentDiffers(from)) {
+
+        std::cerr << "Offer alignment option..." << std::endl;
+
+        QStringList options;
+        options << "Use times unchanged from the original layer";
+        options << "Re-align times to match the same points in the reference layer";
+
+        bool ok = false;
+
+        QString selected = ListInputDialog::getItem
+            (0, tr("Choose alignment"),
+             tr("The points you are pasting originated in a layer with different alignment from the current layer.  Would you like to re-align them when pasting?"),
+             options, 0, &ok);
+        if (!ok) return false;
+
+        if (selected == options[1]) realign = true;
+    }
+
+
+    SparseOneDimensionalModel::EditCommand *command =
+	new SparseOneDimensionalModel::EditCommand(m_model, tr("Paste"));
+
     for (Clipboard::PointList::const_iterator i = points.begin();
          i != points.end(); ++i) {