diff layer/Layer.cpp @ 268:70537b0434c4

* Use a command for adding layer measurements
author Chris Cannam
date Tue, 26 Jun 2007 11:08:21 +0000
parents 4ed1446ad604
children 7b58c5e91f20
line wrap: on
line diff
--- a/layer/Layer.cpp	Thu Jun 21 16:12:00 2007 +0000
+++ b/layer/Layer.cpp	Tue Jun 26 11:08:21 2007 +0000
@@ -16,6 +16,7 @@
 #include "Layer.h"
 #include "view/View.h"
 #include "data/model/Model.h"
+#include "base/CommandHistory.h"
 
 #include <iostream>
 
@@ -71,24 +72,6 @@
     emit layerNameChanged();
 }
 
-QString
-Layer::toXmlString(QString indent, QString extraAttributes) const
-{
-    QString s;
-    
-    s += indent;
-
-    s += QString("<layer id=\"%2\" type=\"%1\" name=\"%3\" model=\"%4\" %5/>\n")
-	.arg(encodeEntities(LayerFactory::getInstance()->getLayerTypeName
-                            (LayerFactory::getInstance()->getLayerType(this))))
-	.arg(getObjectExportId(this))
-	.arg(encodeEntities(objectName()))
-	.arg(getObjectExportId(getModel()))
-	.arg(extraAttributes);
-
-    return s;
-}
-
 PlayParameters *
 Layer::getPlayParameters() 
 {
@@ -137,13 +120,64 @@
     return true;
 }
 
+bool
+Layer::MeasureRect::operator<(const MeasureRect &mr) const
+{
+    if (haveFrames) {
+        if (startFrame == mr.startFrame) {
+            if (endFrame != mr.endFrame) {
+                return endFrame < mr.endFrame;
+            }
+        } else {
+            return startFrame < mr.startFrame;
+        }
+    } else {
+        if (pixrect.x() == mr.pixrect.x()) {
+            if (pixrect.width() != mr.pixrect.width()) {
+                return pixrect.width() < mr.pixrect.width();
+            }
+        } else {
+            return pixrect.x() < mr.pixrect.x();
+        }
+    }
+
+    // the two rects are equal in x and width
+
+    if (pixrect.y() == mr.pixrect.y()) {
+        return pixrect.height() < mr.pixrect.height();
+    } else {
+        return pixrect.y() < mr.pixrect.y();
+    }
+}
+
+QString
+Layer::AddMeasurementRectCommand::getName() const
+{
+    return tr("Make Measurement");
+}
+
+void
+Layer::AddMeasurementRectCommand::execute()
+{
+    m_layer->addMeasureRect(m_rect);
+}
+
+void
+Layer::AddMeasurementRectCommand::unexecute()
+{
+    m_layer->deleteMeasureRect(m_rect);
+}
+
 void
 Layer::measureStart(View *v, QMouseEvent *e)
 {
     m_draggingRect.pixrect = QRect(e->x(), e->y(), 0, 0);
     if (hasTimeXAxis()) {
+        m_draggingRect.haveFrames = true;
         m_draggingRect.startFrame = v->getFrameForX(e->x());
         m_draggingRect.endFrame = m_draggingRect.startFrame;
+    } else {
+        m_draggingRect.haveFrames = false;
     }
     m_haveDraggingRect = true;
 }
@@ -152,10 +186,13 @@
 Layer::measureDrag(View *v, QMouseEvent *e)
 {
     if (!m_haveDraggingRect) return;
+
     m_draggingRect.pixrect = QRect(m_draggingRect.pixrect.x(),
                                    m_draggingRect.pixrect.y(),
                                    e->x() - m_draggingRect.pixrect.x(),
-                                   e->y() - m_draggingRect.pixrect.y());
+                                   e->y() - m_draggingRect.pixrect.y())
+        .normalized();
+
     if (hasTimeXAxis()) {
         m_draggingRect.endFrame = v->getFrameForX(e->x());
     }
@@ -164,10 +201,12 @@
 void
 Layer::measureEnd(View *v, QMouseEvent *e)
 {
-    //!!! command
     if (!m_haveDraggingRect) return;
     measureDrag(v, e);
-    m_measureRectList.push_back(m_draggingRect);
+    
+    CommandHistory::getInstance()->addCommand
+        (new AddMeasurementRectCommand(this, m_draggingRect));
+
     m_haveDraggingRect = false;
 }
 
@@ -175,22 +214,53 @@
 Layer::paintMeasurementRects(View *v, QPainter &paint) const
 {
     if (m_haveDraggingRect) {
-        v->drawMeasurementRect(paint, this, m_draggingRect.pixrect);
+        paintMeasurementRect(v, paint, m_draggingRect);
     }
 
-    bool timex = hasTimeXAxis();
-
-    for (MeasureRectList::const_iterator i = m_measureRectList.begin(); 
-         i != m_measureRectList.end(); ++i) {
-    
-        if (timex) {
-            int x0 = v->getXForFrame(i->startFrame);
-            int x1 = v->getXForFrame(i->endFrame);
-            QRect pr = QRect(x0, i->pixrect.y(), x1 - x0, i->pixrect.height());
-            i->pixrect = pr;
-        }
-
-        v->drawMeasurementRect(paint, this, i->pixrect);
+    for (MeasureRectSet::const_iterator i = m_measureRects.begin(); 
+         i != m_measureRects.end(); ++i) {
+        paintMeasurementRect(v, paint, *i);
     }
 }
 
+void
+Layer::paintMeasurementRect(View *v, QPainter &paint, MeasureRect &r)
+{
+    if (r.haveFrames) {
+        
+        int x0 = -1;
+        int x1 = v->width() + 1;
+        
+        if (r.startFrame >= v->getStartFrame()) {
+            x0 = v->getXForFrame(r.startFrame);
+        }
+        if (r.endFrame <= v->getEndFrame()) {
+            x1 = v->getXForFrame(r.endFrame);
+        }
+        
+        QRect pr = QRect(x0, r.pixrect.y(),
+                         x1 - x0, r.pixrect.height());
+        
+        r.pixrect = pr;
+    }
+    
+    v->drawMeasurementRect(paint, this, r.pixrect);
+}
+
+QString
+Layer::toXmlString(QString indent, QString extraAttributes) const
+{
+    QString s;
+    
+    s += indent;
+
+    s += QString("<layer id=\"%2\" type=\"%1\" name=\"%3\" model=\"%4\" %5/>\n")
+	.arg(encodeEntities(LayerFactory::getInstance()->getLayerTypeName
+                            (LayerFactory::getInstance()->getLayerType(this))))
+	.arg(getObjectExportId(this))
+	.arg(encodeEntities(objectName()))
+	.arg(getObjectExportId(getModel()))
+	.arg(extraAttributes);
+
+    return s;
+}