Chris@136: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
Chris@136: 
Chris@136: /*
Chris@136:     Sonic Visualiser
Chris@136:     An audio file viewer and annotation editor.
Chris@136:     Centre for Digital Music, Queen Mary, University of London.
Chris@202:     This file copyright 2006 Chris Cannam and QMUL.
Chris@136:     
Chris@136:     This program is free software; you can redistribute it and/or
Chris@136:     modify it under the terms of the GNU General Public License as
Chris@136:     published by the Free Software Foundation; either version 2 of the
Chris@136:     License, or (at your option) any later version.  See the file
Chris@136:     COPYING included with this distribution for more information.
Chris@136: */
Chris@136: 
Chris@136: #include "Preferences.h"
Chris@136: 
Chris@145: #include "Exceptions.h"
Chris@145: 
Chris@145: #include "TempDirectory.h"
Chris@145: 
Chris@145: #include <QDir>
Chris@145: #include <QFileInfo>
Chris@156: #include <QMutex>
Chris@156: #include <QSettings>
Chris@145: 
Chris@136: Preferences *
Chris@156: Preferences::m_instance = 0;
Chris@156: 
Chris@156: Preferences *
Chris@156: Preferences::getInstance()
Chris@156: {
Chris@156:     if (!m_instance) m_instance = new Preferences();
Chris@156:     return m_instance;
Chris@156: }
Chris@136: 
Chris@136: Preferences::Preferences() :
Chris@553:     m_spectrogramSmoothing(SpectrogramInterpolated),
Chris@553:     m_spectrogramXSmoothing(SpectrogramXInterpolated),
Chris@140:     m_tuningFrequency(440),
Chris@140:     m_propertyBoxLayout(VerticallyStacked),
Chris@164:     m_windowType(HanningWindow),
Chris@277:     m_resampleQuality(1),
Chris@297:     m_omitRecentTemps(true),
Chris@297:     m_tempDirRoot(""),
Chris@919:     m_fixedSampleRate(0),
Chris@354:     m_resampleOnLoad(false),
Chris@921:     m_normaliseAudio(false),
Chris@354:     m_viewFontSize(10),
Chris@372:     m_backgroundMode(BackgroundFromTheme),
Chris@612:     m_timeToTextMode(TimeToTextMs),
Chris@1031:     m_showHMS(true),
Chris@892:     m_octave(4),
Chris@372:     m_showSplash(true)
Chris@136: {
Chris@156:     QSettings settings;
Chris@156:     settings.beginGroup("Preferences");
Chris@246:     m_spectrogramSmoothing = SpectrogramSmoothing
Chris@553:         (settings.value("spectrogram-y-smoothing", int(m_spectrogramSmoothing)).toInt());
Chris@553:     m_spectrogramXSmoothing = SpectrogramXSmoothing
Chris@553:         (settings.value("spectrogram-x-smoothing", int(m_spectrogramXSmoothing)).toInt());
Chris@1038:     m_tuningFrequency = settings.value("tuning-frequency", 440.).toDouble();
Chris@145:     m_propertyBoxLayout = PropertyBoxLayout
Chris@156:         (settings.value("property-box-layout", int(VerticallyStacked)).toInt());
Chris@145:     m_windowType = WindowType
Chris@156:         (settings.value("window-type", int(HanningWindow)).toInt());
Chris@164:     m_resampleQuality = settings.value("resample-quality", 1).toInt();
Chris@1047:     m_fixedSampleRate = settings.value("fixed-sample-rate", 0).toDouble();
Chris@304:     m_resampleOnLoad = settings.value("resample-on-load", false).toBool();
Chris@921:     m_normaliseAudio = settings.value("normalise-audio", false).toBool();
Chris@297:     m_backgroundMode = BackgroundMode
Chris@297:         (settings.value("background-mode", int(BackgroundFromTheme)).toInt());
Chris@612:     m_timeToTextMode = TimeToTextMode
Chris@612:         (settings.value("time-to-text-mode", int(TimeToTextMs)).toInt());
Chris@1031:     m_showHMS = (settings.value("show-hours-minutes-seconds", true)).toBool(); 
Chris@892:     m_octave = (settings.value("octave-of-middle-c", 4)).toInt();
Chris@387:     m_viewFontSize = settings.value("view-font-size", 10).toInt();
Chris@372:     m_showSplash = settings.value("show-splash", true).toBool();
Chris@297:     settings.endGroup();
Chris@297: 
Chris@297:     settings.beginGroup("TempDirectory");
Chris@297:     m_tempDirRoot = settings.value("create-in", "$HOME").toString();
Chris@156:     settings.endGroup();
Chris@145: }
Chris@145: 
Chris@145: Preferences::~Preferences()
Chris@145: {
Chris@136: }
Chris@136: 
Chris@136: Preferences::PropertyList
Chris@136: Preferences::getProperties() const
Chris@136: {
Chris@136:     PropertyList props;
Chris@553:     props.push_back("Spectrogram Y Smoothing");
Chris@553:     props.push_back("Spectrogram X Smoothing");
Chris@136:     props.push_back("Tuning Frequency");
Chris@138:     props.push_back("Property Box Layout");
Chris@140:     props.push_back("Window Type");
Chris@164:     props.push_back("Resample Quality");
Chris@277:     props.push_back("Omit Temporaries from Recent Files");
Chris@297:     props.push_back("Resample On Load");
Chris@921:     props.push_back("Normalise Audio");
Chris@919:     props.push_back("Fixed Sample Rate");
Chris@297:     props.push_back("Temporary Directory Root");
Chris@297:     props.push_back("Background Mode");
Chris@612:     props.push_back("Time To Text Mode");
Chris@1031:     props.push_back("Show Hours And Minutes");
Chris@892:     props.push_back("Octave Numbering System");
Chris@354:     props.push_back("View Font Size");
Chris@372:     props.push_back("Show Splash Screen");
Chris@136:     return props;
Chris@136: }
Chris@136: 
Chris@136: QString
Chris@136: Preferences::getPropertyLabel(const PropertyName &name) const
Chris@136: {
Chris@553:     if (name == "Spectrogram Y Smoothing") {
Chris@372:         return tr("Spectrogram y-axis interpolation:");
Chris@136:     }
Chris@553:     if (name == "Spectrogram X Smoothing") {
Chris@553:         return tr("Spectrogram x-axis interpolation:");
Chris@553:     }
Chris@136:     if (name == "Tuning Frequency") {
Chris@141:         return tr("Frequency of concert A");
Chris@136:     }
Chris@138:     if (name == "Property Box Layout") {
Chris@141:         return tr("Property box layout");
Chris@138:     }
Chris@140:     if (name == "Window Type") {
Chris@141:         return tr("Spectral analysis window shape");
Chris@140:     }
Chris@164:     if (name == "Resample Quality") {
Chris@165:         return tr("Playback resampler type");
Chris@164:     }
Chris@921:     if (name == "Normalise Audio") {
Chris@921:         return tr("Normalise audio signal when reading from audio file");
Chris@921:     }
Chris@277:     if (name == "Omit Temporaries from Recent Files") {
Chris@297:         return tr("Omit temporaries from Recent Files menu");
Chris@297:     }
Chris@297:     if (name == "Resample On Load") {
Chris@297:         return tr("Resample mismatching files on import");
Chris@297:     }
Chris@919:     if (name == "Fixed Sample Rate") {
Chris@919:         return tr("Single fixed sample rate to resample all files to");
Chris@919:     }
Chris@297:     if (name == "Temporary Directory Root") {
Chris@297:         return tr("Location for cache file directory");
Chris@297:     }
Chris@297:     if (name == "Background Mode") {
Chris@297:         return tr("Background colour preference");
Chris@277:     }
Chris@612:     if (name == "Time To Text Mode") {
Chris@1031:         return tr("Time display precision");
Chris@1031:     }
Chris@1031:     if (name == "Show Hours And Minutes") {
Chris@1031:         return tr("Use hours:minutes:seconds format");
Chris@612:     }
Chris@892:     if (name == "Octave Numbering System") {
Chris@892:         return tr("Label middle C as");
Chris@892:     }
Chris@354:     if (name == "View Font Size") {
Chris@354:         return tr("Font size for text overlays");
Chris@354:     }
Chris@372:     if (name == "Show Splash Screen") {
Chris@372:         return tr("Show splash screen on startup");
Chris@372:     }
Chris@136:     return name;
Chris@136: }
Chris@136: 
Chris@136: Preferences::PropertyType
Chris@136: Preferences::getPropertyType(const PropertyName &name) const
Chris@136: {
Chris@553:     if (name == "Spectrogram Y Smoothing") {
Chris@553:         return ValueProperty;
Chris@553:     }
Chris@553:     if (name == "Spectrogram X Smoothing") {
Chris@246:         return ValueProperty;
Chris@136:     }
Chris@136:     if (name == "Tuning Frequency") {
Chris@136:         return RangeProperty;
Chris@136:     }
Chris@138:     if (name == "Property Box Layout") {
Chris@138:         return ValueProperty;
Chris@138:     }
Chris@140:     if (name == "Window Type") {
Chris@140:         return ValueProperty;
Chris@140:     }
Chris@164:     if (name == "Resample Quality") {
Chris@164:         return ValueProperty;
Chris@164:     }
Chris@921:     if (name == "Normalise Audio") {
Chris@921:         return ToggleProperty;
Chris@921:     }
Chris@277:     if (name == "Omit Temporaries from Recent Files") {
Chris@277:         return ToggleProperty;
Chris@277:     }
Chris@297:     if (name == "Resample On Load") {
Chris@297:         return ToggleProperty;
Chris@297:     }
Chris@919:     if (name == "Fixed Sample Rate") {
Chris@919:         return ValueProperty;
Chris@919:     }
Chris@297:     if (name == "Temporary Directory Root") {
Chris@297:         // It's an arbitrary string, we don't have a set of values for this
Chris@297:         return InvalidProperty;
Chris@297:     }
Chris@297:     if (name == "Background Mode") {
Chris@297:         return ValueProperty;
Chris@297:     }
Chris@612:     if (name == "Time To Text Mode") {
Chris@612:         return ValueProperty;
Chris@612:     }
Chris@1031:     if (name == "Show Hours And Minutes") {
Chris@1031:         return ToggleProperty;
Chris@1031:     }
Chris@892:     if (name == "Octave Numbering System") {
Chris@892:         return ValueProperty;
Chris@892:     }
Chris@354:     if (name == "View Font Size") {
Chris@354:         return RangeProperty;
Chris@354:     }
Chris@372:     if (name == "Show Splash Screen") {
Chris@372:         return ToggleProperty;
Chris@372:     }
Chris@136:     return InvalidProperty;
Chris@136: }
Chris@136: 
Chris@136: int
Chris@136: Preferences::getPropertyRangeAndValue(const PropertyName &name,
Chris@245:                                       int *min, int *max, int *deflt) const
Chris@136: {
Chris@553:     if (name == "Spectrogram Y Smoothing") {
Chris@136:         if (min) *min = 0;
Chris@553:         if (max) *max = 3;
Chris@553:         if (deflt) *deflt = int(SpectrogramInterpolated);
Chris@246:         return int(m_spectrogramSmoothing);
Chris@136:     }
Chris@553:     if (name == "Spectrogram X Smoothing") {
Chris@553:         if (min) *min = 0;
Chris@553:         if (max) *max = 1;
Chris@553:         if (deflt) *deflt = int(SpectrogramXInterpolated);
Chris@553:         return int(m_spectrogramXSmoothing);
Chris@553:     }
Chris@136: 
Chris@136:     //!!! freq mapping
Chris@136: 
Chris@138:     if (name == "Property Box Layout") {
Chris@138:         if (min) *min = 0;
Chris@138:         if (max) *max = 1;
Chris@245:         if (deflt) *deflt = 0;
Chris@138:         return m_propertyBoxLayout == Layered ? 1 : 0;
Chris@138:     }        
Chris@138: 
Chris@140:     if (name == "Window Type") {
Chris@140:         if (min) *min = int(RectangularWindow);
Chris@142:         if (max) *max = int(BlackmanHarrisWindow);
Chris@245:         if (deflt) *deflt = int(HanningWindow);
Chris@140:         return int(m_windowType);
Chris@140:     }
Chris@140: 
Chris@164:     if (name == "Resample Quality") {
Chris@164:         if (min) *min = 0;
Chris@164:         if (max) *max = 2;
Chris@245:         if (deflt) *deflt = 1;
Chris@164:         return m_resampleQuality;
Chris@164:     }
Chris@164: 
Chris@277:     if (name == "Omit Temporaries from Recent Files") {
Chris@277:         if (deflt) *deflt = 1;
Chris@1031:         return m_omitRecentTemps ? 1 : 0;
Chris@277:     }
Chris@277: 
Chris@297:     if (name == "Background Mode") {
Chris@297:         if (min) *min = 0;
Chris@297:         if (max) *max = 2;
Chris@297:         if (deflt) *deflt = 0;
Chris@297:         return int(m_backgroundMode);
Chris@297:     }        
Chris@297: 
Chris@612:     if (name == "Time To Text Mode") {
Chris@612:         if (min) *min = 0;
Chris@612:         if (max) *max = 6;
Chris@612:         if (deflt) *deflt = 0;
Chris@612:         return int(m_timeToTextMode);
Chris@612:     }        
Chris@612: 
Chris@1031:     if (name == "Show Hours And Minutes") {
Chris@1031:         if (deflt) *deflt = 1;
Chris@1031:         return m_showHMS ? 1 : 0;
Chris@1031:     }
Chris@1031:     
Chris@892:     if (name == "Octave Numbering System") {
Chris@892:         // we don't support arbitrary octaves in the gui, because we
Chris@892:         // want to be able to label what the octave system comes
Chris@892:         // from. so we support 0, 3, 4 and 5.
Chris@892:         if (min) *min = 0;
Chris@892:         if (max) *max = 3;
Chris@892:         if (deflt) *deflt = 2;
Chris@892:         return int(getSystemWithMiddleCInOctave(m_octave));
Chris@892:     }
Chris@892: 
Chris@354:     if (name == "View Font Size") {
Chris@354:         if (min) *min = 3;
Chris@354:         if (max) *max = 48;
Chris@387:         if (deflt) *deflt = 10;
Chris@354:         return int(m_viewFontSize);
Chris@354:     }
Chris@354: 
Chris@372:     if (name == "Show Splash Screen") {
Chris@372:         if (deflt) *deflt = 1;
Chris@1031:         return m_showSplash ? 1 : 0;
Chris@372:     }
Chris@372: 
Chris@136:     return 0;
Chris@136: }
Chris@136: 
Chris@136: QString
Chris@136: Preferences::getPropertyValueLabel(const PropertyName &name,
Chris@136:                                    int value) const
Chris@136: {
Chris@138:     if (name == "Property Box Layout") {
Chris@141:         if (value == 0) return tr("Show boxes for all panes");
Chris@141:         else return tr("Show box for current pane only");
Chris@138:     }
Chris@140:     if (name == "Window Type") {
Chris@140:         switch (WindowType(value)) {
Chris@140:         case RectangularWindow: return tr("Rectangular");
Chris@141:         case BartlettWindow: return tr("Triangular");
Chris@140:         case HammingWindow: return tr("Hamming");
Chris@381:         case HanningWindow: return tr("Hann");
Chris@140:         case BlackmanWindow: return tr("Blackman");
Chris@140:         case GaussianWindow: return tr("Gaussian");
Chris@140:         case ParzenWindow: return tr("Parzen");
Chris@142:         case NuttallWindow: return tr("Nuttall");
Chris@142:         case BlackmanHarrisWindow: return tr("Blackman-Harris");
Chris@140:         }
Chris@140:     }
Chris@164:     if (name == "Resample Quality") {
Chris@164:         switch (value) {
Chris@164:         case 0: return tr("Fastest");
Chris@165:         case 1: return tr("Standard");
Chris@164:         case 2: return tr("Highest quality");
Chris@164:         }
Chris@164:     }
Chris@553:     if (name == "Spectrogram Y Smoothing") {
Chris@246:         switch (value) {
Chris@553:         case NoSpectrogramSmoothing: return tr("None");
Chris@553:         case SpectrogramInterpolated: return tr("Linear interpolation");
Chris@553:         case SpectrogramZeroPadded: return tr("4 x Oversampling");
Chris@553:         case SpectrogramZeroPaddedAndInterpolated: return tr("4 x Oversampling with interpolation");
Chris@553:         }
Chris@553:     }
Chris@553:     if (name == "Spectrogram X Smoothing") {
Chris@553:         switch (value) {
Chris@553:         case NoSpectrogramXSmoothing: return tr("None");
Chris@553:         case SpectrogramXInterpolated: return tr("Linear interpolation");
Chris@246:         }
Chris@246:     }
Chris@297:     if (name == "Background Mode") {
Chris@297:         switch (value) {
Chris@297:         case BackgroundFromTheme: return tr("Follow desktop theme");
Chris@297:         case DarkBackground: return tr("Dark background");
Chris@297:         case LightBackground: return tr("Light background");
Chris@297:         }
Chris@297:     }
Chris@612:     if (name == "Time To Text Mode") {
Chris@612:         switch (value) {
Chris@612:         case TimeToTextMs: return tr("Standard (to millisecond)");
Chris@612:         case TimeToTextUs: return tr("High resolution (to microsecond)");
Chris@612:         case TimeToText24Frame: return tr("24 FPS");
Chris@612:         case TimeToText25Frame: return tr("25 FPS");
Chris@612:         case TimeToText30Frame: return tr("30 FPS");
Chris@612:         case TimeToText50Frame: return tr("50 FPS");
Chris@612:         case TimeToText60Frame: return tr("60 FPS");
Chris@612:         }
Chris@612:     }
Chris@892:     if (name == "Octave Numbering System") {
Chris@892:         switch (value) {
Chris@892:         case C0_Centre: return tr("C0 - middle of octave scale");
Chris@892:         case C3_Logic: return tr("C3 - common MIDI sequencer convention");
Chris@892:         case C4_ASA: return tr("C4 - ASA American standard");
Chris@892:         case C5_Sonar: return tr("C5 - used in Cakewalk and others");
Chris@892:         }
Chris@892:     }
Chris@246:             
Chris@136:     return "";
Chris@136: }
Chris@136: 
Chris@136: QString
Chris@136: Preferences::getPropertyContainerName() const
Chris@136: {
Chris@136:     return tr("Preferences");
Chris@136: }
Chris@136: 
Chris@136: QString
Chris@136: Preferences::getPropertyContainerIconName() const
Chris@136: {
Chris@136:     return "preferences";
Chris@136: }
Chris@136: 
Chris@136: void
Chris@136: Preferences::setProperty(const PropertyName &name, int value) 
Chris@136: {
Chris@553:     if (name == "Spectrogram Y Smoothing") {
Chris@246:         setSpectrogramSmoothing(SpectrogramSmoothing(value));
Chris@553:     } else if (name == "Spectrogram X Smoothing") {
Chris@553:         setSpectrogramXSmoothing(SpectrogramXSmoothing(value));
Chris@136:     } else if (name == "Tuning Frequency") {
Chris@136:         //!!!
Chris@138:     } else if (name == "Property Box Layout") {
Chris@138:         setPropertyBoxLayout(value == 0 ? VerticallyStacked : Layered);
Chris@140:     } else if (name == "Window Type") {
Chris@140:         setWindowType(WindowType(value));
Chris@164:     } else if (name == "Resample Quality") {
Chris@164:         setResampleQuality(value);
Chris@277:     } else if (name == "Omit Temporaries from Recent Files") {
Chris@277:         setOmitTempsFromRecentFiles(value ? true : false);
Chris@297:     } else if (name == "Background Mode") {
Chris@297:         setBackgroundMode(BackgroundMode(value));
Chris@612:     } else if (name == "Time To Text Mode") {
Chris@612:         setTimeToTextMode(TimeToTextMode(value));
Chris@1031:     } else if (name == "Show Hours And Minutes") {
Chris@1031:         setShowHMS(value ? true : false);
Chris@892:     } else if (name == "Octave Numbering System") {
Chris@892:         setOctaveOfMiddleC(getOctaveOfMiddleCInSystem
Chris@892:                            (OctaveNumberingSystem(value)));
Chris@354:     } else if (name == "View Font Size") {
Chris@354:         setViewFontSize(value);
Chris@372:     } else if (name == "Show Splash Screen") {
Chris@372:         setShowSplash(value ? true : false);
Chris@136:     }
Chris@136: }
Chris@136: 
Chris@136: void
Chris@246: Preferences::setSpectrogramSmoothing(SpectrogramSmoothing smoothing)
Chris@136: {
Chris@246:     if (m_spectrogramSmoothing != smoothing) {
Chris@246: 
Chris@246:         // "smoothing" is one of those words that looks increasingly
Chris@246:         // ridiculous the more you see it.  Smoothing smoothing smoothing.
Chris@246:         m_spectrogramSmoothing = smoothing;
Chris@246: 
Chris@156:         QSettings settings;
Chris@156:         settings.beginGroup("Preferences");
Chris@553:         settings.setValue("spectrogram-y-smoothing", int(smoothing));
Chris@156:         settings.endGroup();
Chris@553:         emit propertyChanged("Spectrogram Y Smoothing");
Chris@553:     }
Chris@553: }
Chris@553: 
Chris@553: void
Chris@553: Preferences::setSpectrogramXSmoothing(SpectrogramXSmoothing smoothing)
Chris@553: {
Chris@553:     if (m_spectrogramXSmoothing != smoothing) {
Chris@553: 
Chris@553:         // "smoothing" is one of those words that looks increasingly
Chris@553:         // ridiculous the more you see it.  Smoothing smoothing smoothing.
Chris@553:         m_spectrogramXSmoothing = smoothing;
Chris@553: 
Chris@553:         QSettings settings;
Chris@553:         settings.beginGroup("Preferences");
Chris@553:         settings.setValue("spectrogram-x-smoothing", int(smoothing));
Chris@553:         settings.endGroup();
Chris@553:         emit propertyChanged("Spectrogram X Smoothing");
Chris@138:     }
Chris@136: }
Chris@136: 
Chris@136: void
Chris@1038: Preferences::setTuningFrequency(double freq)
Chris@136: {
Chris@138:     if (m_tuningFrequency != freq) {
Chris@138:         m_tuningFrequency = freq;
Chris@156:         QSettings settings;
Chris@156:         settings.beginGroup("Preferences");
Chris@156:         settings.setValue("tuning-frequency", freq);
Chris@156:         settings.endGroup();
Chris@141:         emit propertyChanged("Tuning Frequency");
Chris@138:     }
Chris@136: }
Chris@136: 
Chris@138: void
Chris@138: Preferences::setPropertyBoxLayout(PropertyBoxLayout layout)
Chris@138: {
Chris@138:     if (m_propertyBoxLayout != layout) {
Chris@138:         m_propertyBoxLayout = layout;
Chris@156:         QSettings settings;
Chris@156:         settings.beginGroup("Preferences");
Chris@156:         settings.setValue("property-box-layout", int(layout));
Chris@156:         settings.endGroup();
Chris@141:         emit propertyChanged("Property Box Layout");
Chris@138:     }
Chris@138: }
Chris@138: 
Chris@140: void
Chris@140: Preferences::setWindowType(WindowType type)
Chris@140: {
Chris@140:     if (m_windowType != type) {
Chris@140:         m_windowType = type;
Chris@156:         QSettings settings;
Chris@156:         settings.beginGroup("Preferences");
Chris@156:         settings.setValue("window-type", int(type));
Chris@156:         settings.endGroup();
Chris@141:         emit propertyChanged("Window Type");
Chris@140:     }
Chris@140: }
Chris@140: 
Chris@164: void
Chris@164: Preferences::setResampleQuality(int q)
Chris@164: {
Chris@164:     if (m_resampleQuality != q) {
Chris@164:         m_resampleQuality = q;
Chris@164:         QSettings settings;
Chris@164:         settings.beginGroup("Preferences");
Chris@164:         settings.setValue("resample-quality", q);
Chris@164:         settings.endGroup();
Chris@164:         emit propertyChanged("Resample Quality");
Chris@164:     }
Chris@164: }
Chris@277: 
Chris@277: void
Chris@277: Preferences::setOmitTempsFromRecentFiles(bool omit)
Chris@277: {
Chris@277:     if (m_omitRecentTemps != omit) {
Chris@277:         m_omitRecentTemps = omit;
Chris@277:         QSettings settings;
Chris@277:         settings.beginGroup("Preferences");
Chris@277:         settings.setValue("omit-recent-temporaries", omit);
Chris@277:         settings.endGroup();
Chris@277:         emit propertyChanged("Omit Temporaries from Recent Files");
Chris@277:     }
Chris@277: }
Chris@297: 
Chris@297: void
Chris@297: Preferences::setTemporaryDirectoryRoot(QString root)
Chris@297: {
Chris@297:     if (root == QDir::home().absolutePath()) {
Chris@297:         root = "$HOME";
Chris@297:     }
Chris@297:     if (m_tempDirRoot != root) {
Chris@297:         m_tempDirRoot = root;
Chris@297:         QSettings settings;
Chris@297:         settings.beginGroup("TempDirectory");
Chris@297:         settings.setValue("create-in", root);
Chris@297:         settings.endGroup();
Chris@297:         emit propertyChanged("Temporary Directory Root");
Chris@297:     }
Chris@297: }
Chris@297: 
Chris@297: void
Chris@297: Preferences::setResampleOnLoad(bool resample)
Chris@297: {
Chris@297:     if (m_resampleOnLoad != resample) {
Chris@297:         m_resampleOnLoad = resample;
Chris@297:         QSettings settings;
Chris@297:         settings.beginGroup("Preferences");
Chris@297:         settings.setValue("resample-on-load", resample);
Chris@297:         settings.endGroup();
Chris@297:         emit propertyChanged("Resample On Load");
Chris@297:     }
Chris@297: }
Chris@297: 
Chris@297: void
Chris@1047: Preferences::setFixedSampleRate(sv_samplerate_t rate)
Chris@919: {
Chris@919:     if (m_fixedSampleRate != rate) {
Chris@919:         m_fixedSampleRate = rate;
Chris@919:         QSettings settings;
Chris@919:         settings.beginGroup("Preferences");
Chris@919:         settings.setValue("fixed-sample-rate", rate);
Chris@919:         settings.endGroup();
Chris@919:         emit propertyChanged("Fixed Sample Rate");
Chris@919:     }
Chris@919: }
Chris@919: 
Chris@919: void
Chris@921: Preferences::setNormaliseAudio(bool norm)
Chris@921: {
Chris@921:     if (m_normaliseAudio != norm) {
Chris@921:         m_normaliseAudio = norm;
Chris@921:         QSettings settings;
Chris@921:         settings.beginGroup("Preferences");
Chris@921:         settings.setValue("normalise-audio", norm);
Chris@921:         settings.endGroup();
Chris@921:         emit propertyChanged("Normalise Audio");
Chris@921:     }
Chris@921: }
Chris@921: 
Chris@921: void
Chris@297: Preferences::setBackgroundMode(BackgroundMode mode)
Chris@297: {
Chris@297:     if (m_backgroundMode != mode) {
Chris@297: 
Chris@297:         m_backgroundMode = mode;
Chris@297: 
Chris@297:         QSettings settings;
Chris@297:         settings.beginGroup("Preferences");
Chris@297:         settings.setValue("background-mode", int(mode));
Chris@297:         settings.endGroup();
Chris@297:         emit propertyChanged("Background Mode");
Chris@297:     }
Chris@297: }
Chris@297: 
Chris@354: void
Chris@612: Preferences::setTimeToTextMode(TimeToTextMode mode)
Chris@612: {
Chris@612:     if (m_timeToTextMode != mode) {
Chris@612: 
Chris@612:         m_timeToTextMode = mode;
Chris@612: 
Chris@612:         QSettings settings;
Chris@612:         settings.beginGroup("Preferences");
Chris@612:         settings.setValue("time-to-text-mode", int(mode));
Chris@612:         settings.endGroup();
Chris@612:         emit propertyChanged("Time To Text Mode");
Chris@612:     }
Chris@612: }
Chris@612: 
Chris@612: void
Chris@1031: Preferences::setShowHMS(bool show)
Chris@1031: {
Chris@1031:     if (m_showHMS != show) {
Chris@1031: 
Chris@1031:         m_showHMS = show;
Chris@1031: 
Chris@1031:         QSettings settings;
Chris@1031:         settings.beginGroup("Preferences");
Chris@1031:         settings.setValue("show-hours-minutes-seconds", show);
Chris@1031:         settings.endGroup();
Chris@1031:         emit propertyChanged("Show Hours And Minutes");
Chris@1031:     }
Chris@1031: }
Chris@1031: 
Chris@1031: void
Chris@892: Preferences::setOctaveOfMiddleC(int oct)
Chris@892: {
Chris@892:     if (m_octave != oct) {
Chris@892: 
Chris@892:         m_octave = oct;
Chris@892: 
Chris@892:         QSettings settings;
Chris@892:         settings.beginGroup("Preferences");
Chris@892:         settings.setValue("octave-of-middle-c", int(oct));
Chris@892:         settings.endGroup();
Chris@892:         emit propertyChanged("Octave Numbering System");
Chris@892:     }
Chris@892: }
Chris@892: 
Chris@892: int
Chris@892: Preferences::getOctaveOfMiddleCInSystem(OctaveNumberingSystem s)
Chris@892: {
Chris@892:     switch (s) {
Chris@892:     case C0_Centre: return 0;
Chris@892:     case C3_Logic: return 3;
Chris@892:     case C4_ASA: return 4;
Chris@892:     case C5_Sonar: return 5;
Chris@892:     default: return 4;
Chris@892:     }
Chris@892: }
Chris@892: 
Chris@892: Preferences::OctaveNumberingSystem
Chris@892: Preferences::getSystemWithMiddleCInOctave(int o)
Chris@892: {
Chris@892:     switch (o) {
Chris@892:     case 0: return C0_Centre;
Chris@892:     case 3: return C3_Logic;
Chris@892:     case 4: return C4_ASA;
Chris@892:     case 5: return C5_Sonar;
Chris@892:     default: return C4_ASA;
Chris@892:     }
Chris@892: }
Chris@892: 
Chris@892: void
Chris@354: Preferences::setViewFontSize(int size)
Chris@354: {
Chris@354:     if (m_viewFontSize != size) {
Chris@297: 
Chris@354:         m_viewFontSize = size;
Chris@354: 
Chris@354:         QSettings settings;
Chris@354:         settings.beginGroup("Preferences");
Chris@354:         settings.setValue("view-font-size", size);
Chris@354:         settings.endGroup();
Chris@354:         emit propertyChanged("View Font Size");
Chris@354:     }
Chris@354: }
Chris@354: 
Chris@372: void
Chris@372: Preferences::setShowSplash(bool show) 
Chris@372: {
Chris@372:     if (m_showSplash != show) {
Chris@372: 
Chris@372:         m_showSplash = show;
Chris@372: 
Chris@372:         QSettings settings;
Chris@372:         settings.beginGroup("Preferences");
Chris@372:         settings.setValue("show-splash", show);
Chris@372:         settings.endGroup();
Chris@372:         emit propertyChanged("Show Splash Screen");
Chris@372:     }
Chris@372: }
Chris@372: