diff data/model/SparseTimeValueModel.h @ 420:50a956688baa

* reorganise tabular data editor model support
author Chris Cannam
date Wed, 11 Jun 2008 16:13:25 +0000
parents 5858cc462d0a
children 397fe91dc8e0
line wrap: on
line diff
--- a/data/model/SparseTimeValueModel.h	Wed Jun 11 12:54:18 2008 +0000
+++ b/data/model/SparseTimeValueModel.h	Wed Jun 11 16:13:25 2008 +0000
@@ -97,6 +97,74 @@
     }
 
     QString getTypeName() const { return tr("Sparse Time-Value"); }
+
+    /**
+     * TabularModel methods.  
+     */
+    
+    virtual int getColumnCount() const
+    {
+        return 4;
+    }
+
+    virtual QString getHeading(int column) const
+    {
+        switch (column) {
+        case 0: return tr("Time");
+        case 1: return tr("Frame");
+        case 2: return tr("Value");
+        case 3: return tr("Label");
+        default: return tr("Unknown");
+        }
+    }
+
+    virtual QVariant getData(int row, int column, int role) const
+    {
+        if (role != Qt::EditRole && role != Qt::DisplayRole) return QVariant();
+        PointListIterator i = getPointListIteratorForRow(row);
+        if (i == m_points.end()) return QVariant();
+
+        switch (column) {
+        case 0: {
+            RealTime rt = RealTime::frame2RealTime(i->frame, getSampleRate());
+            return rt.toText().c_str();
+        }
+        case 1: return int(i->frame);
+        case 2:
+            if (role == Qt::EditRole) return i->value;
+            else return QString("%1 %2").arg(i->value).arg(getScaleUnits());
+        case 3: return i->label;
+        default: return QVariant();
+        }
+    }
+
+    virtual Command *setData(int row, int column, QVariant value, int role) 
+    {
+        if (role != Qt::EditRole) return false;
+        PointListIterator i = getPointListIteratorForRow(row);
+        if (i == m_points.end()) return false;
+        EditCommand *command = new EditCommand(this, tr("Edit Data"));
+
+        Point point(*i);
+        command->deletePoint(point);
+
+        switch (column) {
+        case 0: break; 
+        case 1: break;
+        case 2: point.value = value.toDouble();
+            std::cerr << "setting value of point at " << point.frame << " to " << point.value << std::endl;
+            break;
+        case 3: point.label = value.toString(); break;
+        }
+
+        command->addPoint(point);
+        return command->finish();
+    }
+
+    virtual bool isColumnTimeValue(int column) const
+    {
+        return (column < 2); 
+    }
 };