Preferences.cpp

Go to the documentation of this file.
00001 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
00002 
00003 /*
00004     Sonic Visualiser
00005     An audio file viewer and annotation editor.
00006     Centre for Digital Music, Queen Mary, University of London.
00007     This file copyright 2006 Chris Cannam and QMUL.
00008     
00009     This program is free software; you can redistribute it and/or
00010     modify it under the terms of the GNU General Public License as
00011     published by the Free Software Foundation; either version 2 of the
00012     License, or (at your option) any later version.  See the file
00013     COPYING included with this distribution for more information.
00014 */
00015 
00016 #include "Preferences.h"
00017 
00018 #include "Exceptions.h"
00019 
00020 #include "TempDirectory.h"
00021 
00022 #include <QDir>
00023 #include <QFileInfo>
00024 #include <QMutex>
00025 #include <QSettings>
00026 #include <QApplication>
00027 #include <QFont>
00028 
00029 Preferences *
00030 Preferences::m_instance = 0;
00031 
00032 Preferences *
00033 Preferences::getInstance()
00034 {
00035     if (!m_instance) m_instance = new Preferences();
00036     return m_instance;
00037 }
00038 
00039 Preferences::Preferences() :
00040     m_spectrogramSmoothing(SpectrogramZeroPadded),
00041     m_tuningFrequency(440),
00042     m_propertyBoxLayout(VerticallyStacked),
00043     m_windowType(HanningWindow),
00044     m_resampleQuality(1),
00045     m_omitRecentTemps(true),
00046     m_tempDirRoot(""),
00047     m_resampleOnLoad(false),
00048     m_viewFontSize(10),
00049     m_backgroundMode(BackgroundFromTheme),
00050     m_showSplash(true)
00051 {
00052     QSettings settings;
00053     settings.beginGroup("Preferences");
00054     m_spectrogramSmoothing = SpectrogramSmoothing
00055         (settings.value("spectrogram-smoothing", int(m_spectrogramSmoothing)).toInt());
00056     m_tuningFrequency = settings.value("tuning-frequency", 440.f).toDouble();
00057     m_propertyBoxLayout = PropertyBoxLayout
00058         (settings.value("property-box-layout", int(VerticallyStacked)).toInt());
00059     m_windowType = WindowType
00060         (settings.value("window-type", int(HanningWindow)).toInt());
00061     m_resampleQuality = settings.value("resample-quality", 1).toInt();
00062     m_resampleOnLoad = settings.value("resample-on-load", false).toBool();
00063     m_backgroundMode = BackgroundMode
00064         (settings.value("background-mode", int(BackgroundFromTheme)).toInt());
00065     m_viewFontSize = settings.value
00066         ("view-font-size", int(QApplication::font().pointSize() * 0.9))
00067         .toInt();
00068     m_showSplash = settings.value("show-splash", true).toBool();
00069     settings.endGroup();
00070 
00071     settings.beginGroup("TempDirectory");
00072     m_tempDirRoot = settings.value("create-in", "$HOME").toString();
00073     settings.endGroup();
00074 }
00075 
00076 Preferences::~Preferences()
00077 {
00078 }
00079 
00080 Preferences::PropertyList
00081 Preferences::getProperties() const
00082 {
00083     PropertyList props;
00084     props.push_back("Spectrogram Smoothing");
00085     props.push_back("Tuning Frequency");
00086     props.push_back("Property Box Layout");
00087     props.push_back("Window Type");
00088     props.push_back("Resample Quality");
00089     props.push_back("Omit Temporaries from Recent Files");
00090     props.push_back("Resample On Load");
00091     props.push_back("Temporary Directory Root");
00092     props.push_back("Background Mode");
00093     props.push_back("View Font Size");
00094     props.push_back("Show Splash Screen");
00095     return props;
00096 }
00097 
00098 QString
00099 Preferences::getPropertyLabel(const PropertyName &name) const
00100 {
00101     if (name == "Spectrogram Smoothing") {
00102         return tr("Spectrogram y-axis interpolation:");
00103     }
00104     if (name == "Tuning Frequency") {
00105         return tr("Frequency of concert A");
00106     }
00107     if (name == "Property Box Layout") {
00108         return tr("Property box layout");
00109     }
00110     if (name == "Window Type") {
00111         return tr("Spectral analysis window shape");
00112     }
00113     if (name == "Resample Quality") {
00114         return tr("Playback resampler type");
00115     }
00116     if (name == "Omit Temporaries from Recent Files") {
00117         return tr("Omit temporaries from Recent Files menu");
00118     }
00119     if (name == "Resample On Load") {
00120         return tr("Resample mismatching files on import");
00121     }
00122     if (name == "Temporary Directory Root") {
00123         return tr("Location for cache file directory");
00124     }
00125     if (name == "Background Mode") {
00126         return tr("Background colour preference");
00127     }
00128     if (name == "View Font Size") {
00129         return tr("Font size for text overlays");
00130     }
00131     if (name == "Show Splash Screen") {
00132         return tr("Show splash screen on startup");
00133     }
00134     return name;
00135 }
00136 
00137 Preferences::PropertyType
00138 Preferences::getPropertyType(const PropertyName &name) const
00139 {
00140     if (name == "Spectrogram Smoothing") {
00141         return ValueProperty;
00142     }
00143     if (name == "Tuning Frequency") {
00144         return RangeProperty;
00145     }
00146     if (name == "Property Box Layout") {
00147         return ValueProperty;
00148     }
00149     if (name == "Window Type") {
00150         return ValueProperty;
00151     }
00152     if (name == "Resample Quality") {
00153         return ValueProperty;
00154     }
00155     if (name == "Omit Temporaries from Recent Files") {
00156         return ToggleProperty;
00157     }
00158     if (name == "Resample On Load") {
00159         return ToggleProperty;
00160     }
00161     if (name == "Temporary Directory Root") {
00162         // It's an arbitrary string, we don't have a set of values for this
00163         return InvalidProperty;
00164     }
00165     if (name == "Background Mode") {
00166         return ValueProperty;
00167     }
00168     if (name == "View Font Size") {
00169         return RangeProperty;
00170     }
00171     if (name == "Show Splash Screen") {
00172         return ToggleProperty;
00173     }
00174     return InvalidProperty;
00175 }
00176 
00177 int
00178 Preferences::getPropertyRangeAndValue(const PropertyName &name,
00179                                       int *min, int *max, int *deflt) const
00180 {
00181     if (name == "Spectrogram Smoothing") {
00182         if (min) *min = 0;
00183         if (max) *max = 2;
00184         if (deflt) *deflt = int(SpectrogramZeroPadded);
00185         return int(m_spectrogramSmoothing);
00186     }
00187 
00189 
00190     if (name == "Property Box Layout") {
00191         if (min) *min = 0;
00192         if (max) *max = 1;
00193         if (deflt) *deflt = 0;
00194         return m_propertyBoxLayout == Layered ? 1 : 0;
00195     }        
00196 
00197     if (name == "Window Type") {
00198         if (min) *min = int(RectangularWindow);
00199         if (max) *max = int(BlackmanHarrisWindow);
00200         if (deflt) *deflt = int(HanningWindow);
00201         return int(m_windowType);
00202     }
00203 
00204     if (name == "Resample Quality") {
00205         if (min) *min = 0;
00206         if (max) *max = 2;
00207         if (deflt) *deflt = 1;
00208         return m_resampleQuality;
00209     }
00210 
00211     if (name == "Omit Temporaries from Recent Files") {
00212         if (deflt) *deflt = 1;
00213     }
00214 
00215     if (name == "Background Mode") {
00216         if (min) *min = 0;
00217         if (max) *max = 2;
00218         if (deflt) *deflt = 0;
00219         return int(m_backgroundMode);
00220     }        
00221 
00222     if (name == "View Font Size") {
00223         if (min) *min = 3;
00224         if (max) *max = 48;
00225         if (deflt) *deflt = int(QApplication::font().pointSize() * 0.9);
00226         return int(m_viewFontSize);
00227     }
00228 
00229     if (name == "Show Splash Screen") {
00230         if (deflt) *deflt = 1;
00231     }
00232 
00233     return 0;
00234 }
00235 
00236 QString
00237 Preferences::getPropertyValueLabel(const PropertyName &name,
00238                                    int value) const
00239 {
00240     if (name == "Property Box Layout") {
00241         if (value == 0) return tr("Show boxes for all panes");
00242         else return tr("Show box for current pane only");
00243     }
00244     if (name == "Window Type") {
00245         switch (WindowType(value)) {
00246         case RectangularWindow: return tr("Rectangular");
00247         case BartlettWindow: return tr("Triangular");
00248         case HammingWindow: return tr("Hamming");
00249         case HanningWindow: return tr("Hann");
00250         case BlackmanWindow: return tr("Blackman");
00251         case GaussianWindow: return tr("Gaussian");
00252         case ParzenWindow: return tr("Parzen");
00253         case NuttallWindow: return tr("Nuttall");
00254         case BlackmanHarrisWindow: return tr("Blackman-Harris");
00255         }
00256     }
00257     if (name == "Resample Quality") {
00258         switch (value) {
00259         case 0: return tr("Fastest");
00260         case 1: return tr("Standard");
00261         case 2: return tr("Highest quality");
00262         }
00263     }
00264     if (name == "Spectrogram Smoothing") {
00265         switch (value) {
00266         case NoSpectrogramSmoothing: return tr("None - blocky but accurate");
00267         case SpectrogramInterpolated: return tr("Linear - fast but fuzzy");
00268         case SpectrogramZeroPadded: return tr("4 x Oversampled - slow but clear");
00269         }
00270     }
00271     if (name == "Background Mode") {
00272         switch (value) {
00273         case BackgroundFromTheme: return tr("Follow desktop theme");
00274         case DarkBackground: return tr("Dark background");
00275         case LightBackground: return tr("Light background");
00276         }
00277     }
00278             
00279     return "";
00280 }
00281 
00282 QString
00283 Preferences::getPropertyContainerName() const
00284 {
00285     return tr("Preferences");
00286 }
00287 
00288 QString
00289 Preferences::getPropertyContainerIconName() const
00290 {
00291     return "preferences";
00292 }
00293 
00294 void
00295 Preferences::setProperty(const PropertyName &name, int value) 
00296 {
00297     if (name == "Spectrogram Smoothing") {
00298         setSpectrogramSmoothing(SpectrogramSmoothing(value));
00299     } else if (name == "Tuning Frequency") {
00301     } else if (name == "Property Box Layout") {
00302         setPropertyBoxLayout(value == 0 ? VerticallyStacked : Layered);
00303     } else if (name == "Window Type") {
00304         setWindowType(WindowType(value));
00305     } else if (name == "Resample Quality") {
00306         setResampleQuality(value);
00307     } else if (name == "Omit Temporaries from Recent Files") {
00308         setOmitTempsFromRecentFiles(value ? true : false);
00309     } else if (name == "Background Mode") {
00310         setBackgroundMode(BackgroundMode(value));
00311     } else if (name == "View Font Size") {
00312         setViewFontSize(value);
00313     } else if (name == "Show Splash Screen") {
00314         setShowSplash(value ? true : false);
00315     }
00316 }
00317 
00318 void
00319 Preferences::setSpectrogramSmoothing(SpectrogramSmoothing smoothing)
00320 {
00321     if (m_spectrogramSmoothing != smoothing) {
00322 
00323         // "smoothing" is one of those words that looks increasingly
00324         // ridiculous the more you see it.  Smoothing smoothing smoothing.
00325         m_spectrogramSmoothing = smoothing;
00326 
00327         QSettings settings;
00328         settings.beginGroup("Preferences");
00329         settings.setValue("spectrogram-smoothing", int(smoothing));
00330         settings.endGroup();
00331         emit propertyChanged("Spectrogram Smoothing");
00332     }
00333 }
00334 
00335 void
00336 Preferences::setTuningFrequency(float freq)
00337 {
00338     if (m_tuningFrequency != freq) {
00339         m_tuningFrequency = freq;
00340         QSettings settings;
00341         settings.beginGroup("Preferences");
00342         settings.setValue("tuning-frequency", freq);
00343         settings.endGroup();
00344         emit propertyChanged("Tuning Frequency");
00345     }
00346 }
00347 
00348 void
00349 Preferences::setPropertyBoxLayout(PropertyBoxLayout layout)
00350 {
00351     if (m_propertyBoxLayout != layout) {
00352         m_propertyBoxLayout = layout;
00353         QSettings settings;
00354         settings.beginGroup("Preferences");
00355         settings.setValue("property-box-layout", int(layout));
00356         settings.endGroup();
00357         emit propertyChanged("Property Box Layout");
00358     }
00359 }
00360 
00361 void
00362 Preferences::setWindowType(WindowType type)
00363 {
00364     if (m_windowType != type) {
00365         m_windowType = type;
00366         QSettings settings;
00367         settings.beginGroup("Preferences");
00368         settings.setValue("window-type", int(type));
00369         settings.endGroup();
00370         emit propertyChanged("Window Type");
00371     }
00372 }
00373 
00374 void
00375 Preferences::setResampleQuality(int q)
00376 {
00377     if (m_resampleQuality != q) {
00378         m_resampleQuality = q;
00379         QSettings settings;
00380         settings.beginGroup("Preferences");
00381         settings.setValue("resample-quality", q);
00382         settings.endGroup();
00383         emit propertyChanged("Resample Quality");
00384     }
00385 }
00386 
00387 void
00388 Preferences::setOmitTempsFromRecentFiles(bool omit)
00389 {
00390     if (m_omitRecentTemps != omit) {
00391         m_omitRecentTemps = omit;
00392         QSettings settings;
00393         settings.beginGroup("Preferences");
00394         settings.setValue("omit-recent-temporaries", omit);
00395         settings.endGroup();
00396         emit propertyChanged("Omit Temporaries from Recent Files");
00397     }
00398 }
00399 
00400 void
00401 Preferences::setTemporaryDirectoryRoot(QString root)
00402 {
00403     if (root == QDir::home().absolutePath()) {
00404         root = "$HOME";
00405     }
00406     if (m_tempDirRoot != root) {
00407         m_tempDirRoot = root;
00408         QSettings settings;
00409         settings.beginGroup("TempDirectory");
00410         settings.setValue("create-in", root);
00411         settings.endGroup();
00412         emit propertyChanged("Temporary Directory Root");
00413     }
00414 }
00415 
00416 void
00417 Preferences::setResampleOnLoad(bool resample)
00418 {
00419     if (m_resampleOnLoad != resample) {
00420         m_resampleOnLoad = resample;
00421         QSettings settings;
00422         settings.beginGroup("Preferences");
00423         settings.setValue("resample-on-load", resample);
00424         settings.endGroup();
00425         emit propertyChanged("Resample On Load");
00426     }
00427 }
00428 
00429 void
00430 Preferences::setBackgroundMode(BackgroundMode mode)
00431 {
00432     if (m_backgroundMode != mode) {
00433 
00434         m_backgroundMode = mode;
00435 
00436         QSettings settings;
00437         settings.beginGroup("Preferences");
00438         settings.setValue("background-mode", int(mode));
00439         settings.endGroup();
00440         emit propertyChanged("Background Mode");
00441     }
00442 }
00443 
00444 void
00445 Preferences::setViewFontSize(int size)
00446 {
00447     if (m_viewFontSize != size) {
00448 
00449         m_viewFontSize = size;
00450 
00451         QSettings settings;
00452         settings.beginGroup("Preferences");
00453         settings.setValue("view-font-size", size);
00454         settings.endGroup();
00455         emit propertyChanged("View Font Size");
00456     }
00457 }
00458 
00459 void
00460 Preferences::setShowSplash(bool show) 
00461 {
00462     if (m_showSplash != show) {
00463 
00464         m_showSplash = show;
00465 
00466         QSettings settings;
00467         settings.beginGroup("Preferences");
00468         settings.setValue("show-splash", show);
00469         settings.endGroup();
00470         emit propertyChanged("Show Splash Screen");
00471     }
00472 }
00473         

Generated on Wed Feb 20 15:45:27 2008 for SonicVisualiser by  doxygen 1.5.1