00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
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
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
00324
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