changeset 6:02aaea1ffaf7

* Beginnings of session save code * Add spline curve mode to time value layer
author Chris Cannam
date Thu, 12 Jan 2006 17:19:08 +0000
parents 37b110168acf
children 634324c6296e
files layer/LayerFactory.cpp layer/LayerFactory.h layer/SpectrogramLayer.cpp layer/SpectrogramLayer.h layer/TimeInstantLayer.cpp layer/TimeInstantLayer.h layer/TimeRulerLayer.cpp layer/TimeRulerLayer.h layer/TimeValueLayer.cpp layer/TimeValueLayer.h layer/WaveformLayer.cpp layer/WaveformLayer.h
diffstat 12 files changed, 209 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/layer/LayerFactory.cpp	Thu Jan 12 13:45:27 2006 +0000
+++ b/layer/LayerFactory.cpp	Thu Jan 12 17:19:08 2006 +0000
@@ -89,14 +89,40 @@
 }
 
 LayerFactory::LayerType
-LayerFactory::getLayerType(Layer *layer)
+LayerFactory::getLayerType(const Layer *layer)
 {
-    if (dynamic_cast<WaveformLayer *>(layer)) return Waveform;
-    if (dynamic_cast<SpectrogramLayer *>(layer)) return Spectrogram;
-    if (dynamic_cast<TimeRulerLayer *>(layer)) return TimeRuler;
-    if (dynamic_cast<TimeInstantLayer *>(layer)) return TimeInstants;
-    if (dynamic_cast<TimeValueLayer *>(layer)) return TimeValues;
-    if (dynamic_cast<Colour3DPlotLayer *>(layer)) return Colour3DPlot;
+    if (dynamic_cast<const WaveformLayer *>(layer)) return Waveform;
+    if (dynamic_cast<const SpectrogramLayer *>(layer)) return Spectrogram;
+    if (dynamic_cast<const TimeRulerLayer *>(layer)) return TimeRuler;
+    if (dynamic_cast<const TimeInstantLayer *>(layer)) return TimeInstants;
+    if (dynamic_cast<const TimeValueLayer *>(layer)) return TimeValues;
+    if (dynamic_cast<const Colour3DPlotLayer *>(layer)) return Colour3DPlot;
+    return UnknownLayer;
+}
+
+QString
+LayerFactory::getLayerTypeName(LayerType type)
+{
+    switch (type) {
+    case Waveform: return "waveform";
+    case Spectrogram: return "spectrogram";
+    case TimeRuler: return "timeruler";
+    case TimeInstants: return "timeinstants";
+    case TimeValues: return "timevalues";
+    case Colour3DPlot: return "colour3dplot";
+    default: return "unknown";
+    }
+}
+
+LayerFactory::LayerType
+LayerFactory::getLayerTypeForName(QString name)
+{
+    if (name == "waveform") return Waveform;
+    if (name == "spectrogram") return Spectrogram;
+    if (name == "timeruler") return TimeRuler;
+    if (name == "timeinstants") return TimeInstants;
+    if (name == "timevalues") return TimeValues;
+    if (name == "colour3dplot") return Colour3DPlot;
     return UnknownLayer;
 }
 
--- a/layer/LayerFactory.h	Thu Jan 12 13:45:27 2006 +0000
+++ b/layer/LayerFactory.h	Thu Jan 12 17:19:08 2006 +0000
@@ -44,7 +44,7 @@
     typedef std::set<LayerType> LayerTypeSet;
     LayerTypeSet getValidLayerTypes(Model *model);
 
-    LayerType getLayerType(Layer *);
+    LayerType getLayerType(const Layer *);
 
     Layer *createLayer(LayerType type, View *view,
 		       Model *model = 0, int channel = -1);
@@ -53,6 +53,9 @@
 
     void setModel(Layer *layer, Model *model);
 
+    QString getLayerTypeName(LayerType);
+    LayerType getLayerTypeForName(QString);
+
 protected:
     template <typename LayerClass, typename ModelClass>
     bool trySetModel(Layer *layerBase, Model *modelBase) {
--- a/layer/SpectrogramLayer.cpp	Thu Jan 12 13:45:27 2006 +0000
+++ b/layer/SpectrogramLayer.cpp	Thu Jan 12 17:19:08 2006 +0000
@@ -1643,6 +1643,33 @@
     }
 }
 
+QString
+SpectrogramLayer::toXmlString(QString indent, QString extraAttributes) const
+{
+    QString s;
+    
+    s += QString("channel=\"%1\" "
+		 "windowSize=\"%2\" "
+		 "windowType=\"%3\" "
+		 "windowOverlap=\"%4\" "
+		 "gain=\"%5\" "
+		 "maxFrequency=\"%6\" "
+		 "colourScale=\"%7\" "
+		 "colourScheme=\"%8\" "
+		 "frequencyScale=\"%9\"")
+	.arg(m_channel)
+	.arg(m_windowSize)
+	.arg(m_windowType)
+	.arg(m_windowOverlap)
+	.arg(m_gain)
+	.arg(m_maxFrequency)
+	.arg(m_colourScale)
+	.arg(m_colourScheme)
+	.arg(m_frequencyScale);
+
+    return Layer::toXmlString(indent, extraAttributes + " " + s);
+}
+
 #ifdef INCLUDE_MOCFILES
 #include "SpectrogramLayer.moc.cpp"
 #endif
--- a/layer/SpectrogramLayer.h	Thu Jan 12 13:45:27 2006 +0000
+++ b/layer/SpectrogramLayer.h	Thu Jan 12 17:19:08 2006 +0000
@@ -126,6 +126,9 @@
 
     virtual QString getPropertyContainerIconName() const { return "spectrogram"; }
 
+    virtual QString toXmlString(QString indent = "",
+				QString extraAttributes = "") const;
+
 protected slots:
     void cacheInvalid();
     void cacheInvalid(size_t startFrame, size_t endFrame);
@@ -135,14 +138,14 @@
 protected:
     const DenseTimeValueModel *m_model; // I do not own this
     
-    int m_channel;
-    size_t m_windowSize;
-    WindowType m_windowType;
-    size_t m_windowOverlap;
-    float m_gain;
-    size_t m_maxFrequency;
-    ColourScale m_colourScale;
-    ColourScheme m_colourScheme;
+    int            m_channel;
+    size_t         m_windowSize;
+    WindowType     m_windowType;
+    size_t         m_windowOverlap;
+    float          m_gain;
+    size_t         m_maxFrequency;
+    ColourScale    m_colourScale;
+    ColourScheme   m_colourScheme;
     FrequencyScale m_frequencyScale;
 
     class CacheFillThread : public QThread
--- a/layer/TimeInstantLayer.cpp	Thu Jan 12 13:45:27 2006 +0000
+++ b/layer/TimeInstantLayer.cpp	Thu Jan 12 17:19:08 2006 +0000
@@ -298,6 +298,12 @@
     }
 }
 
+QString
+TimeInstantLayer::toXmlString(QString indent, QString extraAttributes) const
+{
+    return Layer::toXmlString(indent, extraAttributes +
+			      QString(" colour=\"%1\"").arg(encodeColour(m_colour)));
+}
 
 #ifdef INCLUDE_MOCFILES
 #include "TimeInstantLayer.moc.cpp"
--- a/layer/TimeInstantLayer.h	Thu Jan 12 13:45:27 2006 +0000
+++ b/layer/TimeInstantLayer.h	Thu Jan 12 17:19:08 2006 +0000
@@ -51,6 +51,9 @@
 
     virtual int getCompletion() const { return m_model->getCompletion(); }
 
+    virtual QString toXmlString(QString indent = "",
+				QString extraAttributes = "") const;
+
 protected:
     SparseOneDimensionalModel::PointList getLocalPoints(int) const;
 
--- a/layer/TimeRulerLayer.cpp	Thu Jan 12 13:45:27 2006 +0000
+++ b/layer/TimeRulerLayer.cpp	Thu Jan 12 17:19:08 2006 +0000
@@ -281,6 +281,13 @@
     paint.restore();
 }
     
+QString
+TimeRulerLayer::toXmlString(QString indent, QString extraAttributes) const
+{
+    return Layer::toXmlString(indent, extraAttributes +
+			      QString(" colour=\"%1\"").arg(encodeColour(m_colour)));
+}
+
 
 #ifdef INCLUDE_MOCFILES
 #include "TimeRulerLayer.moc.cpp"
--- a/layer/TimeRulerLayer.h	Thu Jan 12 13:45:27 2006 +0000
+++ b/layer/TimeRulerLayer.h	Thu Jan 12 17:19:08 2006 +0000
@@ -48,6 +48,9 @@
 
     virtual QString getPropertyContainerIconName() const { return "timeruler"; }
 
+    virtual QString toXmlString(QString indent = "",
+				QString extraAttributes = "") const;
+
 protected:
     Model *m_model;
     QColor m_colour;
--- a/layer/TimeValueLayer.cpp	Thu Jan 12 13:45:27 2006 +0000
+++ b/layer/TimeValueLayer.cpp	Thu Jan 12 17:19:08 2006 +0000
@@ -17,6 +17,7 @@
 #include "model/SparseTimeValueModel.h"
 
 #include <QPainter>
+#include <QPainterPath>
 
 #include <iostream>
 #include <cmath>
@@ -25,7 +26,7 @@
     Layer(w),
     m_model(0),
     m_colour(Qt::black),
-    m_plotStyle(PlotLines)
+    m_plotStyle(PlotConnectedPoints)
 {
     m_view->addLayer(this);
 }
@@ -86,7 +87,7 @@
     } else if (name == tr("Plot Type")) {
 	
 	*min = 0;
-	*max = 3;
+	*max = 4;
 	
 	deft = int(m_plotStyle);
 
@@ -117,8 +118,9 @@
 	default:
 	case 0: return tr("Points");
 	case 1: return tr("Stems");
-	case 2: return tr("Lines");
-	case 3: return tr("Curve");
+	case 2: return tr("Connected Points");
+	case 3: return tr("Lines");
+	case 4: return tr("Curve");
 	}
     }
     return tr("<unknown>");
@@ -161,6 +163,12 @@
 bool
 TimeValueLayer::isLayerScrollable() const
 {
+    // We don't illuminate sections in the line or curve modes, so
+    // they're always scrollable
+
+    if (m_plotStyle == PlotLines ||
+	m_plotStyle == PlotCurve) return true;
+
     QPoint discard;
     return !m_view->shouldIlluminateLocalFeatures(this, discard);
 }
@@ -304,7 +312,15 @@
 	    getLocalPoints(localPos.x());
 	if (!localPoints.empty()) illuminateFrame = localPoints.begin()->frame;
     }
-	
+
+    paint.save();
+
+    if (m_plotStyle == PlotLines ||
+	m_plotStyle == PlotCurve) {
+	paint.setRenderHint(QPainter::Antialiasing, true);
+    }
+    QPainterPath path;
+    
     for (SparseTimeValueModel::PointList::const_iterator i = points.begin();
 	 i != points.end(); ++i) {
 
@@ -318,12 +334,14 @@
 
 	if (w < 1) w = 1;
 
-	if (m_plotStyle == PlotCurve) {
-	    paint.setPen(QPen(QBrush(m_colour), 2));
+	if (m_plotStyle == PlotLines ||
+	    m_plotStyle == PlotCurve) {
+	    paint.setPen(m_colour);
+	    paint.setBrush(Qt::NoBrush);
 	} else {
 	    paint.setPen(m_colour);
+	    paint.setBrush(brushColour);
 	}	    
-	paint.setBrush(brushColour);
 
 	if (m_plotStyle == PlotStems) {
 	    paint.setPen(brushColour);
@@ -336,18 +354,29 @@
 	}
 
 	if (illuminateFrame == p.frame) {
+
 	    //!!! aside from the problem of choosing a colour, it'd be
 	    //better to save the highlighted rects and draw them at
 	    //the end perhaps
-	    paint.setPen(Qt::black);//!!!
-	    paint.setBrush(Qt::black);//!!!
+
+	    //!!! not equipped to illuminate the right section in line
+	    //or curve mode
+
+	    if (m_plotStyle != PlotCurve &&
+		m_plotStyle != PlotLines) {
+		paint.setPen(Qt::black);//!!!
+		paint.setBrush(Qt::black);//!!!
+	    }	    
 	}
 
-	if (m_plotStyle != PlotCurve) {
+	if (m_plotStyle != PlotLines &&
+	    m_plotStyle != PlotCurve) {
 	    paint.drawRect(x, y - 1, w, 2);
 	}
 
-	if (m_plotStyle == PlotLines || m_plotStyle == PlotCurve) {
+	if (m_plotStyle == PlotConnectedPoints ||
+	    m_plotStyle == PlotLines ||
+	    m_plotStyle == PlotCurve) {
 
 	    SparseTimeValueModel::PointList::const_iterator j = i;
 	    ++j;
@@ -360,22 +389,51 @@
 				       ((q.value - min) * m_view->height()) /
 				       (max - min)));
 
-		if (m_plotStyle == PlotLines) {
+		if (m_plotStyle == PlotConnectedPoints) {
+
 		    paint.setPen(brushColour);
 		    paint.drawLine(x + w, y, nx, ny);
+
+		} else if (m_plotStyle == PlotLines) {
+
+		    paint.drawLine(x + w/2, y, nx + w/2, ny);
+
 		} else {
-		    paint.drawLine(x, y, nx, ny);
+
+		    if (path.isEmpty()) {
+			path.moveTo(x + w/2, y);
+		    }
+
+		    if (nx - x > 5) {
+			path.cubicTo(x + w, y, nx, ny, nx + w/2, ny);
+		    } else {
+			path.lineTo(nx + w/2, ny);
+		    }
 		}
 	    }
 	}
 
-	
 ///	if (p.label != "") {
 ///	    paint.drawText(x + 5, y - paint.fontMetrics().height() + paint.fontMetrics().ascent(), p.label);
 ///	}
     }
-	
-	
+
+    if (m_plotStyle == PlotCurve && !path.isEmpty()) {
+	paint.drawPath(path);
+    }
+
+    paint.restore();
+
+    // looks like save/restore doesn't deal with this:
+    paint.setRenderHint(QPainter::Antialiasing, false);
+}
+
+QString
+TimeValueLayer::toXmlString(QString indent, QString extraAttributes) const
+{
+    return Layer::toXmlString(indent, extraAttributes +
+			      QString(" colour=\"%1\" plotStyle=\"%2\"")
+			      .arg(encodeColour(m_colour)).arg(m_plotStyle));
 }
 
 
--- a/layer/TimeValueLayer.h	Thu Jan 12 13:45:27 2006 +0000
+++ b/layer/TimeValueLayer.h	Thu Jan 12 17:19:08 2006 +0000
@@ -45,7 +45,7 @@
     void setBaseColour(QColor);
     QColor getBaseColour() const { return m_colour; }
 
-    enum PlotStyle { PlotPoints, PlotStems, PlotLines, PlotCurve };
+    enum PlotStyle { PlotPoints, PlotStems, PlotConnectedPoints, PlotLines, PlotCurve };
 
     void setPlotStyle(PlotStyle style);
     PlotStyle getPlotStyle() const { return m_plotStyle; }
@@ -56,6 +56,9 @@
 
     virtual int getCompletion() const { return m_model->getCompletion(); }
 
+    virtual QString toXmlString(QString indent = "",
+				QString extraAttributes = "") const;
+
 protected:
     SparseTimeValueModel::PointList getLocalPoints(int) const;
 
--- a/layer/WaveformLayer.cpp	Thu Jan 12 13:45:27 2006 +0000
+++ b/layer/WaveformLayer.cpp	Thu Jan 12 17:19:08 2006 +0000
@@ -739,6 +739,31 @@
     }
 }
 
+QString
+WaveformLayer::toXmlString(QString indent, QString extraAttributes) const
+{
+    QString s;
+    
+    s += QString("gain=\"%1\" "
+		 "colour=\"%2\" "
+		 "showMeans=\"%3\" "
+		 "greyscale=\"%4\" "
+		 "channelMode=\"%5\" "
+		 "channel=\"%6\" "
+		 "scale=\"%7\" "
+		 "aggressive=\"%8\"")
+	.arg(m_gain)
+	.arg(encodeColour(m_colour))
+	.arg(m_showMeans)
+	.arg(m_greyscale)
+	.arg(m_channelMode)
+	.arg(m_channel)
+	.arg(m_scale)
+	.arg(m_aggressive);
+
+    return Layer::toXmlString(indent, extraAttributes + " " + s);
+}
+
 #ifdef INCLUDE_MOCFILES
 #include "WaveformLayer.moc.cpp"
 #endif
--- a/layer/WaveformLayer.h	Thu Jan 12 13:45:27 2006 +0000
+++ b/layer/WaveformLayer.h	Thu Jan 12 17:19:08 2006 +0000
@@ -157,6 +157,9 @@
 
     virtual QString getPropertyContainerIconName() const { return "waveform"; }
 
+    virtual QString toXmlString(QString indent = "",
+				QString extraAttributes = "") const;
+
 protected:
     int dBscale(float sample, int m) const;
 
@@ -165,14 +168,14 @@
     /// Return value is number of channels displayed
     size_t getChannelArrangement(size_t &min, size_t &max, bool &merging) const;
 
-    float m_gain;
-    QColor m_colour;
-    bool m_showMeans;
-    bool m_greyscale;
-    ChannelMode m_channelMode;
-    int m_channel;
-    Scale m_scale;
-    bool m_aggressive;
+    float        m_gain;
+    QColor       m_colour;
+    bool         m_showMeans;
+    bool         m_greyscale;
+    ChannelMode  m_channelMode;
+    int          m_channel;
+    Scale        m_scale;
+    bool         m_aggressive;
 
     mutable QPixmap *m_cache;
     mutable bool m_cacheValid;