changeset 145:82f529a08cf3

* Change preferences dialog to ok/apply/cancel model * Make preferences persist in a config file * Change instance() to getInstance() for all singleton types * Make pasting to time-value layer with no values in clipboard ask you how to generate the values * Fix bad behaviour caused by importing "data"-type (i.e. 3d dense) model from annotation file without a fixed window size available
author Chris Cannam
date Thu, 27 Jul 2006 16:06:32 +0000
parents a9c3ba1777e1
children f90fad823cea
files base/Layer.cpp base/Layer.h base/Model.cpp base/PlayParameterRepository.cpp base/PlayParameterRepository.h base/Preferences.cpp base/Preferences.h base/TempDirectory.cpp base/TempDirectory.h plugin/LADSPAPluginFactory.cpp transform/FeatureExtractionPluginTransform.cpp transform/TransformFactory.cpp transform/TransformFactory.h
diffstat 13 files changed, 97 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/base/Layer.cpp	Wed Jul 26 16:48:07 2006 +0000
+++ b/base/Layer.cpp	Thu Jul 27 16:06:32 2006 +0000
@@ -34,8 +34,8 @@
 QString
 Layer::getPropertyContainerIconName() const
 {
-    return LayerFactory::instance()->getLayerIconName
-	(LayerFactory::instance()->getLayerType(this));
+    return LayerFactory::getInstance()->getLayerIconName
+	(LayerFactory::getInstance()->getLayerType(this));
 }
 
 QString
@@ -70,8 +70,8 @@
     s += indent;
 
     s += QString("<layer id=\"%2\" type=\"%1\" name=\"%3\" model=\"%4\" %5/>\n")
-	.arg(encodeEntities(LayerFactory::instance()->getLayerTypeName
-                            (LayerFactory::instance()->getLayerType(this))))
+	.arg(encodeEntities(LayerFactory::getInstance()->getLayerTypeName
+                            (LayerFactory::getInstance()->getLayerType(this))))
 	.arg(getObjectExportId(this))
 	.arg(encodeEntities(objectName()))
 	.arg(getObjectExportId(getModel()))
@@ -86,7 +86,7 @@
 //    std::cerr << "Layer (" << this << ", " << objectName().toStdString() << ")::getPlayParameters: model is "<< getModel() << std::endl;
     const Model *model = getModel();
     if (model) {
-	return PlayParameterRepository::instance()->getPlayParameters(model);
+	return PlayParameterRepository::getInstance()->getPlayParameters(model);
     }
     return 0;
 }
--- a/base/Layer.h	Wed Jul 26 16:48:07 2006 +0000
+++ b/base/Layer.h	Thu Jul 27 16:06:32 2006 +0000
@@ -78,8 +78,10 @@
     virtual int getVerticalScaleWidth(View *, QPainter &) const { return 0; }
     virtual void paintVerticalScale(View *, QPainter &, QRect) const { }
 
-    virtual bool getCrosshairExtents(View *, QPainter &, QPoint cursorPos,
-                                     std::vector<QRect> &) const { return false; }
+    virtual bool getCrosshairExtents(View *, QPainter &, QPoint /* cursorPos */,
+                                     std::vector<QRect> &) const {
+        return false;
+    }
     virtual void paintCrosshairs(View *, QPainter &, QPoint) const { }
 
     virtual QString getFeatureDescription(View *, QPoint &) const {
@@ -112,10 +114,10 @@
      * available.  Also return the resolution of the model in this
      * layer in sample frames.
      */
-    virtual bool snapToFeatureFrame(View *v,
-				    int &frame,
+    virtual bool snapToFeatureFrame(View *   /* v */,
+				    int &    /* frame */,
 				    size_t &resolution,
-				    SnapType snap) const {
+				    SnapType /* snap */) const {
 	resolution = 1;
 	return false;
     }
@@ -135,12 +137,22 @@
 
     virtual void editOpen(View *, QMouseEvent *) { } // on double-click
 
-    virtual void moveSelection(Selection s, size_t newStartFrame) { }
-    virtual void resizeSelection(Selection s, Selection newSize) { }
-    virtual void deleteSelection(Selection s) { }
+    virtual void moveSelection(Selection, size_t /* newStartFrame */) { }
+    virtual void resizeSelection(Selection, Selection /* newSize */) { }
+    virtual void deleteSelection(Selection) { }
 
-    virtual void copy(Selection s, Clipboard &to) { }
-    virtual void paste(const Clipboard &from, int frameOffset) { }
+    virtual void copy(Selection, Clipboard & /* to */) { }
+
+    /**
+     * Paste from the given clipboard onto the layer at the given
+     * frame offset.  If interactive is true, the layer may ask the
+     * user about paste options through a dialog if desired, and may
+     * return false if the user cancelled the paste operation.  This
+     * function should return true if a paste actually occurred.
+     */
+    virtual bool paste(const Clipboard & /* from */,
+                       int /* frameOffset */,
+                       bool /* interactive */) { return false; }
 
     // Text mode:
     //
@@ -252,7 +264,8 @@
      * extent (using the normal layer extents or deferring to whatever
      * is in use for the same units elsewhere in the view).
      */
-    virtual bool getDisplayExtents(float &min, float &max) const {
+    virtual bool getDisplayExtents(float & /* min */,
+                                   float & /* max */) const {
         return false;
     }
 
@@ -263,7 +276,8 @@
      * return false for getDisplayExtents should also return false for
      * this function.
      */
-    virtual bool setDisplayExtents(float min, float max) {
+    virtual bool setDisplayExtents(float /* min */,
+                                   float /* max */) {
         return false;
     }
 
--- a/base/Model.cpp	Wed Jul 26 16:48:07 2006 +0000
+++ b/base/Model.cpp	Thu Jul 27 16:06:32 2006 +0000
@@ -28,7 +28,7 @@
     // if they want to be played.  We can't do it from here because
     // the repository would be unable to tell whether we were playable
     // or not (because dynamic_cast won't work from the base class ctor)
-    PlayParameterRepository::instance()->removeModel(this);
+    PlayParameterRepository::getInstance()->removeModel(this);
 }
 
 QString
--- a/base/PlayParameterRepository.cpp	Wed Jul 26 16:48:07 2006 +0000
+++ b/base/PlayParameterRepository.cpp	Thu Jul 27 16:06:32 2006 +0000
@@ -27,7 +27,7 @@
 PlayParameterRepository::m_instance = new PlayParameterRepository;
 
 PlayParameterRepository *
-PlayParameterRepository::instance()
+PlayParameterRepository::getInstance()
 {
     return m_instance;
 }
--- a/base/PlayParameterRepository.h	Wed Jul 26 16:48:07 2006 +0000
+++ b/base/PlayParameterRepository.h	Thu Jul 27 16:06:32 2006 +0000
@@ -28,7 +28,7 @@
     Q_OBJECT
 
 public:
-    static PlayParameterRepository *instance();
+    static PlayParameterRepository *getInstance();
 
     virtual ~PlayParameterRepository();
 
--- a/base/Preferences.cpp	Wed Jul 26 16:48:07 2006 +0000
+++ b/base/Preferences.cpp	Thu Jul 27 16:06:32 2006 +0000
@@ -15,6 +15,15 @@
 
 #include "Preferences.h"
 
+#include "Exceptions.h"
+
+#include "TempDirectory.h"
+
+#include "fileio/ConfigFile.h" //!!! reorg
+
+#include <QDir>
+#include <QFileInfo>
+
 Preferences *
 Preferences::m_instance = new Preferences();
 
@@ -22,8 +31,41 @@
     m_smoothSpectrogram(true),
     m_tuningFrequency(440),
     m_propertyBoxLayout(VerticallyStacked),
-    m_windowType(HanningWindow)
+    m_windowType(HanningWindow),
+    m_configFile(0)
 {
+    // Let TempDirectory do its thing first, so as to avoid any race
+    // condition if it happens that we both want to use the same directory
+    TempDirectory::getInstance();
+
+    QString svDirBase = ".sv1";
+    QString svDir = QDir::home().filePath(svDirBase);
+    if (!QFileInfo(svDir).exists()) {
+        if (!QDir::home().mkdir(svDirBase)) {
+            throw DirectoryCreationFailed(QString("%1 directory in $HOME")
+                                          .arg(svDirBase));
+        }
+    } else if (!QFileInfo(svDir).isDir()) {
+        throw DirectoryCreationFailed(QString("$HOME/%1 is not a directory")
+                                      .arg(svDirBase));
+    }
+
+    m_configFile = new ConfigFile(QDir(svDir).filePath("preferences.cfg"));
+
+    m_smoothSpectrogram =
+        m_configFile->getBool("preferences-smooth-spectrogram", true);
+    m_tuningFrequency =
+        m_configFile->getFloat("preferences-tuning-frequency", 440.f);
+    m_propertyBoxLayout = PropertyBoxLayout
+        (m_configFile->getInt("preferences-property-box-layout",
+                              int(VerticallyStacked)));
+    m_windowType = WindowType
+        (m_configFile->getInt("preferences-window-type", int(HanningWindow)));
+}
+
+Preferences::~Preferences()
+{
+    delete m_configFile;
 }
 
 Preferences::PropertyList
@@ -155,6 +197,7 @@
 {
     if (m_smoothSpectrogram != smooth) {
         m_smoothSpectrogram = smooth;
+        m_configFile->set("preferences-smooth-spectrogram", smooth);
         emit propertyChanged("Smooth Spectrogram");
     }
 }
@@ -164,6 +207,7 @@
 {
     if (m_tuningFrequency != freq) {
         m_tuningFrequency = freq;
+        m_configFile->set("preferences-tuning-frequency", freq);
         emit propertyChanged("Tuning Frequency");
     }
 }
@@ -173,6 +217,7 @@
 {
     if (m_propertyBoxLayout != layout) {
         m_propertyBoxLayout = layout;
+        m_configFile->set("preferences-property-box-layout", int(layout));
         emit propertyChanged("Property Box Layout");
     }
 }
@@ -182,6 +227,7 @@
 {
     if (m_windowType != type) {
         m_windowType = type;
+        m_configFile->set("preferences-window-type", int(type));
         emit propertyChanged("Window Type");
     }
 }
--- a/base/Preferences.h	Wed Jul 26 16:48:07 2006 +0000
+++ b/base/Preferences.h	Thu Jul 27 16:06:32 2006 +0000
@@ -20,6 +20,8 @@
 
 #include "Window.h"
 
+class ConfigFile;
+
 class Preferences : public PropertyContainer
 {
     Q_OBJECT
@@ -39,6 +41,8 @@
     float getTuningFrequency() const { return m_tuningFrequency; }
     WindowType getWindowType() const { return m_windowType; }
 
+    ConfigFile *getConfigFile() { return m_configFile; }
+
     //!!! harmonise with PaneStack
     enum PropertyBoxLayout {
         VerticallyStacked,
@@ -55,8 +59,8 @@
     void setWindowType(WindowType type);
 
 private:
-    Preferences(); 
-    virtual ~Preferences() { }
+    Preferences(); // may throw DirectoryCreationFailed
+    virtual ~Preferences();
 
     static Preferences *m_instance;
 
@@ -64,6 +68,7 @@
     float m_tuningFrequency;
     PropertyBoxLayout m_propertyBoxLayout;
     WindowType m_windowType;
+    ConfigFile *m_configFile;
 };
 
 #endif
--- a/base/TempDirectory.cpp	Wed Jul 26 16:48:07 2006 +0000
+++ b/base/TempDirectory.cpp	Thu Jul 27 16:06:32 2006 +0000
@@ -28,7 +28,7 @@
 TempDirectory::m_instance = new TempDirectory;
 
 TempDirectory *
-TempDirectory::instance()
+TempDirectory::getInstance()
 {
     return m_instance;
 }
--- a/base/TempDirectory.h	Wed Jul 26 16:48:07 2006 +0000
+++ b/base/TempDirectory.h	Thu Jul 27 16:06:32 2006 +0000
@@ -33,7 +33,7 @@
 class TempDirectory
 {
 public:
-    static TempDirectory *instance();
+    static TempDirectory *getInstance();
     
     virtual ~TempDirectory();
 
--- a/plugin/LADSPAPluginFactory.cpp	Wed Jul 26 16:48:07 2006 +0000
+++ b/plugin/LADSPAPluginFactory.cpp	Thu Jul 27 16:06:32 2006 +0000
@@ -31,6 +31,7 @@
 #include "PluginIdentifier.h"
 
 #include "base/System.h"
+#include "base/Preferences.h"
 
 #ifdef HAVE_LRDF
 #include "lrdf.h"
@@ -261,7 +262,8 @@
 	
     } else if (LADSPA_IS_HINT_DEFAULT_440(d)) {
 	
-	deft = 440.0;
+//	deft = 440.0;
+        deft = Preferences::getInstance()->getTuningFrequency();
 	
     } else {
 	
--- a/transform/FeatureExtractionPluginTransform.cpp	Wed Jul 26 16:48:07 2006 +0000
+++ b/transform/FeatureExtractionPluginTransform.cpp	Thu Jul 27 16:06:32 2006 +0000
@@ -288,7 +288,7 @@
                     fftAdapters[ch]->getValuesAt
                         (column, i, buffers[ch][i*2], buffers[ch][i*2+1]);
                 }
-                //!!!
+/*!!!
                 float sum = 0.0;
                 for (size_t i = 0; i < m_blockSize/2; ++i) {
                     sum += buffers[ch][i*2];
@@ -296,6 +296,7 @@
                 if (fabs(sum) < 0.0001) {
                     std::cerr << "WARNING: small sum for column " << column << " (sum is " << sum << ")" << std::endl;
                 }
+*/
             } else {
                 getFrames(ch, channelCount, 
                           blockFrame, m_blockSize, buffers[ch]);
--- a/transform/TransformFactory.cpp	Wed Jul 26 16:48:07 2006 +0000
+++ b/transform/TransformFactory.cpp	Thu Jul 27 16:06:32 2006 +0000
@@ -35,7 +35,7 @@
 TransformFactory::m_instance = new TransformFactory;
 
 TransformFactory *
-TransformFactory::instance()
+TransformFactory::getInstance()
 {
     return m_instance;
 }
--- a/transform/TransformFactory.h	Wed Jul 26 16:48:07 2006 +0000
+++ b/transform/TransformFactory.h	Thu Jul 27 16:06:32 2006 +0000
@@ -29,7 +29,7 @@
 public:
     virtual ~TransformFactory();
 
-    static TransformFactory *instance();
+    static TransformFactory *getInstance();
 
     // The name is intended to be computer-referenceable, and unique
     // within the application.  The description is intended to be