Chris@0
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@0
|
2
|
Chris@0
|
3 /*
|
Chris@0
|
4 Sonic Visualiser
|
Chris@0
|
5 An audio file viewer and annotation editor.
|
Chris@0
|
6 Centre for Digital Music, Queen Mary, University of London.
|
Chris@0
|
7 This file copyright 2006 Chris Cannam.
|
Chris@0
|
8
|
Chris@0
|
9 This program is free software; you can redistribute it and/or
|
Chris@0
|
10 modify it under the terms of the GNU General Public License as
|
Chris@0
|
11 published by the Free Software Foundation; either version 2 of the
|
Chris@0
|
12 License, or (at your option) any later version. See the file
|
Chris@0
|
13 COPYING included with this distribution for more information.
|
Chris@0
|
14 */
|
Chris@0
|
15
|
Chris@0
|
16 #include "PreferencesDialog.h"
|
Chris@0
|
17
|
Chris@0
|
18 #include <QGridLayout>
|
Chris@0
|
19 #include <QComboBox>
|
Chris@0
|
20 #include <QCheckBox>
|
Chris@0
|
21 #include <QGroupBox>
|
Chris@0
|
22 #include <QDoubleSpinBox>
|
Chris@0
|
23 #include <QLabel>
|
Chris@0
|
24 #include <QPushButton>
|
Chris@0
|
25 #include <QHBoxLayout>
|
Chris@0
|
26 #include <QString>
|
Chris@163
|
27 #include <QDialogButtonBox>
|
Chris@163
|
28 #include <QMessageBox>
|
Chris@180
|
29 #include <QTabWidget>
|
Chris@180
|
30 #include <QLineEdit>
|
Chris@180
|
31 #include <QFileDialog>
|
Chris@180
|
32 #include <QMessageBox>
|
Chris@225
|
33 #include <QSpinBox>
|
Chris@0
|
34
|
Chris@9
|
35 #include "widgets/WindowTypeSelector.h"
|
Chris@180
|
36 #include "widgets/IconLoader.h"
|
Chris@0
|
37 #include "base/Preferences.h"
|
Chris@0
|
38
|
Chris@0
|
39 PreferencesDialog::PreferencesDialog(QWidget *parent, Qt::WFlags flags) :
|
Chris@180
|
40 QDialog(parent, flags),
|
Chris@180
|
41 m_changesOnRestart(false)
|
Chris@0
|
42 {
|
Chris@163
|
43 setWindowTitle(tr("Sonic Visualiser: Application Preferences"));
|
Chris@0
|
44
|
Chris@0
|
45 Preferences *prefs = Preferences::getInstance();
|
Chris@0
|
46
|
Chris@0
|
47 QGridLayout *grid = new QGridLayout;
|
Chris@0
|
48 setLayout(grid);
|
Chris@180
|
49
|
Chris@180
|
50 QTabWidget *tab = new QTabWidget;
|
Chris@180
|
51 grid->addWidget(tab, 0, 0);
|
Chris@0
|
52
|
Chris@180
|
53 tab->setTabPosition(QTabWidget::North);
|
Chris@0
|
54
|
Chris@0
|
55 // Create this first, as slots that get called from the ctor will
|
Chris@0
|
56 // refer to it
|
Chris@0
|
57 m_applyButton = new QPushButton(tr("Apply"));
|
Chris@0
|
58
|
Chris@180
|
59 // Create all the preference widgets first, then create the
|
Chris@180
|
60 // individual tab widgets and place the preferences in their
|
Chris@180
|
61 // appropriate places in one go afterwards
|
Chris@180
|
62
|
Chris@114
|
63 int min, max, deflt, i;
|
Chris@0
|
64
|
Chris@9
|
65 m_windowType = WindowType(prefs->getPropertyRangeAndValue
|
Chris@114
|
66 ("Window Type", &min, &max, &deflt));
|
Chris@9
|
67 m_windowTypeSelector = new WindowTypeSelector(m_windowType);
|
Chris@0
|
68
|
Chris@9
|
69 connect(m_windowTypeSelector, SIGNAL(windowTypeChanged(WindowType)),
|
Chris@9
|
70 this, SLOT(windowTypeChanged(WindowType)));
|
Chris@0
|
71
|
Chris@115
|
72 QComboBox *smoothing = new QComboBox;
|
Chris@115
|
73
|
Chris@115
|
74 int sm = prefs->getPropertyRangeAndValue("Spectrogram Smoothing", &min, &max,
|
Chris@115
|
75 &deflt);
|
Chris@115
|
76 m_spectrogramSmoothing = sm;
|
Chris@0
|
77
|
Chris@115
|
78 for (i = min; i <= max; ++i) {
|
Chris@115
|
79 smoothing->addItem(prefs->getPropertyValueLabel("Spectrogram Smoothing", i));
|
Chris@115
|
80 }
|
Chris@115
|
81
|
Chris@115
|
82 smoothing->setCurrentIndex(sm);
|
Chris@115
|
83
|
Chris@115
|
84 connect(smoothing, SIGNAL(currentIndexChanged(int)),
|
Chris@115
|
85 this, SLOT(spectrogramSmoothingChanged(int)));
|
Chris@0
|
86
|
Chris@0
|
87 QComboBox *propertyLayout = new QComboBox;
|
Chris@114
|
88 int pl = prefs->getPropertyRangeAndValue("Property Box Layout", &min, &max,
|
Chris@115
|
89 &deflt);
|
Chris@0
|
90 m_propertyLayout = pl;
|
Chris@0
|
91
|
Chris@0
|
92 for (i = min; i <= max; ++i) {
|
Chris@0
|
93 propertyLayout->addItem(prefs->getPropertyValueLabel("Property Box Layout", i));
|
Chris@0
|
94 }
|
Chris@0
|
95
|
Chris@0
|
96 propertyLayout->setCurrentIndex(pl);
|
Chris@0
|
97
|
Chris@0
|
98 connect(propertyLayout, SIGNAL(currentIndexChanged(int)),
|
Chris@0
|
99 this, SLOT(propertyLayoutChanged(int)));
|
Chris@0
|
100
|
Chris@0
|
101 m_tuningFrequency = prefs->getTuningFrequency();
|
Chris@0
|
102
|
Chris@0
|
103 QDoubleSpinBox *frequency = new QDoubleSpinBox;
|
Chris@0
|
104 frequency->setMinimum(100.0);
|
Chris@0
|
105 frequency->setMaximum(5000.0);
|
Chris@0
|
106 frequency->setSuffix(" Hz");
|
Chris@0
|
107 frequency->setSingleStep(1);
|
Chris@0
|
108 frequency->setValue(m_tuningFrequency);
|
Chris@0
|
109 frequency->setDecimals(2);
|
Chris@0
|
110
|
Chris@0
|
111 connect(frequency, SIGNAL(valueChanged(double)),
|
Chris@0
|
112 this, SLOT(tuningFrequencyChanged(double)));
|
Chris@0
|
113
|
Chris@32
|
114 QComboBox *resampleQuality = new QComboBox;
|
Chris@32
|
115
|
Chris@114
|
116 int rsq = prefs->getPropertyRangeAndValue("Resample Quality", &min, &max,
|
Chris@114
|
117 &deflt);
|
Chris@32
|
118 m_resampleQuality = rsq;
|
Chris@32
|
119
|
Chris@32
|
120 for (i = min; i <= max; ++i) {
|
Chris@32
|
121 resampleQuality->addItem(prefs->getPropertyValueLabel("Resample Quality", i));
|
Chris@32
|
122 }
|
Chris@32
|
123
|
Chris@32
|
124 resampleQuality->setCurrentIndex(rsq);
|
Chris@32
|
125
|
Chris@32
|
126 connect(resampleQuality, SIGNAL(currentIndexChanged(int)),
|
Chris@32
|
127 this, SLOT(resampleQualityChanged(int)));
|
Chris@32
|
128
|
Chris@180
|
129 QCheckBox *resampleOnLoad = new QCheckBox;
|
Chris@180
|
130 m_resampleOnLoad = prefs->getResampleOnLoad();
|
Chris@180
|
131 resampleOnLoad->setCheckState(m_resampleOnLoad ? Qt::Checked :
|
Chris@180
|
132 Qt::Unchecked);
|
Chris@180
|
133 connect(resampleOnLoad, SIGNAL(stateChanged(int)),
|
Chris@180
|
134 this, SLOT(resampleOnLoadChanged(int)));
|
Chris@180
|
135
|
Chris@180
|
136 m_tempDirRootEdit = new QLineEdit;
|
Chris@180
|
137 QString dir = prefs->getTemporaryDirectoryRoot();
|
Chris@180
|
138 m_tempDirRoot = dir;
|
Chris@180
|
139 dir.replace("$HOME", tr("<home directory>"));
|
Chris@180
|
140 m_tempDirRootEdit->setText(dir);
|
Chris@180
|
141 m_tempDirRootEdit->setReadOnly(true);
|
Chris@180
|
142 QPushButton *tempDirButton = new QPushButton;
|
Chris@180
|
143 tempDirButton->setIcon(IconLoader().load("fileopen"));
|
Chris@180
|
144 connect(tempDirButton, SIGNAL(clicked()),
|
Chris@180
|
145 this, SLOT(tempDirButtonClicked()));
|
Chris@180
|
146 tempDirButton->setFixedSize(QSize(24, 24));
|
Chris@180
|
147
|
Chris@180
|
148 QComboBox *bgMode = new QComboBox;
|
Chris@180
|
149 int bg = prefs->getPropertyRangeAndValue("Background Mode", &min, &max,
|
Chris@180
|
150 &deflt);
|
Chris@180
|
151 m_backgroundMode = bg;
|
Chris@180
|
152 for (i = min; i <= max; ++i) {
|
Chris@180
|
153 bgMode->addItem(prefs->getPropertyValueLabel("Background Mode", i));
|
Chris@180
|
154 }
|
Chris@180
|
155 bgMode->setCurrentIndex(bg);
|
Chris@180
|
156
|
Chris@180
|
157 connect(bgMode, SIGNAL(currentIndexChanged(int)),
|
Chris@180
|
158 this, SLOT(backgroundModeChanged(int)));
|
Chris@180
|
159
|
Chris@225
|
160 QSpinBox *fontSize = new QSpinBox;
|
Chris@225
|
161 int fs = prefs->getPropertyRangeAndValue("View Font Size", &min, &max,
|
Chris@225
|
162 &deflt);
|
Chris@225
|
163 fontSize->setMinimum(min);
|
Chris@225
|
164 fontSize->setMaximum(max);
|
Chris@225
|
165 fontSize->setSuffix(" pt");
|
Chris@225
|
166 fontSize->setSingleStep(1);
|
Chris@225
|
167 fontSize->setValue(fs);
|
Chris@225
|
168
|
Chris@225
|
169 connect(fontSize, SIGNAL(valueChanged(int)),
|
Chris@225
|
170 this, SLOT(viewFontSizeChanged(int)));
|
Chris@225
|
171
|
Chris@180
|
172 // General tab
|
Chris@180
|
173
|
Chris@180
|
174 QFrame *frame = new QFrame;
|
Chris@180
|
175
|
Chris@180
|
176 QGridLayout *subgrid = new QGridLayout;
|
Chris@180
|
177 frame->setLayout(subgrid);
|
Chris@180
|
178
|
Chris@0
|
179 int row = 0;
|
Chris@0
|
180
|
Chris@0
|
181 subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
|
Chris@0
|
182 ("Property Box Layout"))),
|
Chris@0
|
183 row, 0);
|
Chris@0
|
184 subgrid->addWidget(propertyLayout, row++, 1, 1, 2);
|
Chris@0
|
185
|
Chris@0
|
186 subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
|
Chris@180
|
187 ("Background Mode"))),
|
Chris@0
|
188 row, 0);
|
Chris@180
|
189 subgrid->addWidget(bgMode, row++, 1, 1, 2);
|
Chris@180
|
190
|
Chris@180
|
191 subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
|
Chris@225
|
192 ("View Font Size"))),
|
Chris@225
|
193 row, 0);
|
Chris@225
|
194 subgrid->addWidget(fontSize, row++, 1, 1, 2);
|
Chris@225
|
195
|
Chris@225
|
196 subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
|
Chris@180
|
197 ("Resample On Load"))),
|
Chris@180
|
198 row, 0);
|
Chris@180
|
199 subgrid->addWidget(resampleOnLoad, row++, 1, 1, 1);
|
Chris@0
|
200
|
Chris@32
|
201 subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
|
Chris@32
|
202 ("Resample Quality"))),
|
Chris@32
|
203 row, 0);
|
Chris@32
|
204 subgrid->addWidget(resampleQuality, row++, 1, 1, 2);
|
Chris@32
|
205
|
Chris@180
|
206 subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
|
Chris@180
|
207 ("Temporary Directory Root"))),
|
Chris@180
|
208 row, 0);
|
Chris@180
|
209 subgrid->addWidget(m_tempDirRootEdit, row, 1, 1, 1);
|
Chris@180
|
210 subgrid->addWidget(tempDirButton, row, 2, 1, 1);
|
Chris@180
|
211 row++;
|
Chris@180
|
212
|
Chris@180
|
213 subgrid->setRowStretch(row, 10);
|
Chris@180
|
214
|
Chris@180
|
215 tab->addTab(frame, tr("&General"));
|
Chris@180
|
216
|
Chris@180
|
217 // Analysis tab
|
Chris@180
|
218
|
Chris@180
|
219 frame = new QFrame;
|
Chris@180
|
220 subgrid = new QGridLayout;
|
Chris@180
|
221 frame->setLayout(subgrid);
|
Chris@180
|
222 row = 0;
|
Chris@180
|
223
|
Chris@180
|
224 subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
|
Chris@180
|
225 ("Tuning Frequency"))),
|
Chris@180
|
226 row, 0);
|
Chris@180
|
227 subgrid->addWidget(frequency, row++, 1, 1, 2);
|
Chris@180
|
228
|
Chris@0
|
229 subgrid->addWidget(new QLabel(prefs->getPropertyLabel
|
Chris@115
|
230 ("Spectrogram Smoothing")),
|
Chris@115
|
231 row, 0);
|
Chris@115
|
232 subgrid->addWidget(smoothing, row++, 1, 1, 2);
|
Chris@0
|
233
|
Chris@0
|
234 subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
|
Chris@0
|
235 ("Window Type"))),
|
Chris@0
|
236 row, 0);
|
Chris@9
|
237 subgrid->addWidget(m_windowTypeSelector, row++, 1, 2, 2);
|
Chris@9
|
238 subgrid->setRowStretch(row, 10);
|
Chris@9
|
239 row++;
|
Chris@0
|
240
|
Chris@180
|
241 subgrid->setRowStretch(row, 10);
|
Chris@180
|
242
|
Chris@180
|
243 tab->addTab(frame, tr("&Analysis"));
|
Chris@180
|
244
|
Chris@163
|
245 QDialogButtonBox *bb = new QDialogButtonBox(Qt::Horizontal);
|
Chris@163
|
246 grid->addWidget(bb, 1, 0);
|
Chris@0
|
247
|
Chris@0
|
248 QPushButton *ok = new QPushButton(tr("OK"));
|
Chris@0
|
249 QPushButton *cancel = new QPushButton(tr("Cancel"));
|
Chris@163
|
250 bb->addButton(ok, QDialogButtonBox::AcceptRole);
|
Chris@163
|
251 bb->addButton(m_applyButton, QDialogButtonBox::ApplyRole);
|
Chris@163
|
252 bb->addButton(cancel, QDialogButtonBox::RejectRole);
|
Chris@0
|
253 connect(ok, SIGNAL(clicked()), this, SLOT(okClicked()));
|
Chris@0
|
254 connect(m_applyButton, SIGNAL(clicked()), this, SLOT(applyClicked()));
|
Chris@0
|
255 connect(cancel, SIGNAL(clicked()), this, SLOT(cancelClicked()));
|
Chris@0
|
256
|
Chris@0
|
257 m_applyButton->setEnabled(false);
|
Chris@0
|
258 }
|
Chris@0
|
259
|
Chris@0
|
260 PreferencesDialog::~PreferencesDialog()
|
Chris@0
|
261 {
|
Chris@0
|
262 std::cerr << "PreferencesDialog::~PreferencesDialog()" << std::endl;
|
Chris@0
|
263 }
|
Chris@0
|
264
|
Chris@0
|
265 void
|
Chris@9
|
266 PreferencesDialog::windowTypeChanged(WindowType type)
|
Chris@0
|
267 {
|
Chris@0
|
268 m_windowType = type;
|
Chris@0
|
269 m_applyButton->setEnabled(true);
|
Chris@0
|
270 }
|
Chris@0
|
271
|
Chris@0
|
272 void
|
Chris@115
|
273 PreferencesDialog::spectrogramSmoothingChanged(int smoothing)
|
Chris@0
|
274 {
|
Chris@115
|
275 m_spectrogramSmoothing = smoothing;
|
Chris@0
|
276 m_applyButton->setEnabled(true);
|
Chris@0
|
277 }
|
Chris@0
|
278
|
Chris@0
|
279 void
|
Chris@0
|
280 PreferencesDialog::propertyLayoutChanged(int layout)
|
Chris@0
|
281 {
|
Chris@0
|
282 m_propertyLayout = layout;
|
Chris@0
|
283 m_applyButton->setEnabled(true);
|
Chris@0
|
284 }
|
Chris@0
|
285
|
Chris@0
|
286 void
|
Chris@0
|
287 PreferencesDialog::tuningFrequencyChanged(double freq)
|
Chris@0
|
288 {
|
Chris@0
|
289 m_tuningFrequency = freq;
|
Chris@0
|
290 m_applyButton->setEnabled(true);
|
Chris@0
|
291 }
|
Chris@0
|
292
|
Chris@0
|
293 void
|
Chris@32
|
294 PreferencesDialog::resampleQualityChanged(int q)
|
Chris@32
|
295 {
|
Chris@32
|
296 m_resampleQuality = q;
|
Chris@32
|
297 m_applyButton->setEnabled(true);
|
Chris@32
|
298 }
|
Chris@32
|
299
|
Chris@32
|
300 void
|
Chris@180
|
301 PreferencesDialog::resampleOnLoadChanged(int state)
|
Chris@180
|
302 {
|
Chris@180
|
303 m_resampleOnLoad = (state == Qt::Checked);
|
Chris@180
|
304 m_applyButton->setEnabled(true);
|
Chris@180
|
305 m_changesOnRestart = true;
|
Chris@180
|
306 }
|
Chris@180
|
307
|
Chris@180
|
308 void
|
Chris@180
|
309 PreferencesDialog::tempDirRootChanged(QString r)
|
Chris@180
|
310 {
|
Chris@180
|
311 m_tempDirRoot = r;
|
Chris@180
|
312 m_applyButton->setEnabled(true);
|
Chris@180
|
313 }
|
Chris@180
|
314
|
Chris@180
|
315 void
|
Chris@180
|
316 PreferencesDialog::tempDirButtonClicked()
|
Chris@180
|
317 {
|
Chris@180
|
318 QString dir = QFileDialog::getExistingDirectory
|
Chris@180
|
319 (this, tr("Select a directory to create cache subdirectory in"),
|
Chris@180
|
320 m_tempDirRoot);
|
Chris@180
|
321 if (dir == "") return;
|
Chris@180
|
322 m_tempDirRootEdit->setText(dir);
|
Chris@180
|
323 tempDirRootChanged(dir);
|
Chris@180
|
324 m_changesOnRestart = true;
|
Chris@180
|
325 }
|
Chris@180
|
326
|
Chris@180
|
327 void
|
Chris@180
|
328 PreferencesDialog::backgroundModeChanged(int mode)
|
Chris@180
|
329 {
|
Chris@180
|
330 m_backgroundMode = mode;
|
Chris@180
|
331 m_applyButton->setEnabled(true);
|
Chris@180
|
332 m_changesOnRestart = true;
|
Chris@180
|
333 }
|
Chris@180
|
334
|
Chris@180
|
335 void
|
Chris@225
|
336 PreferencesDialog::viewFontSizeChanged(int sz)
|
Chris@225
|
337 {
|
Chris@225
|
338 m_viewFontSize = sz;
|
Chris@225
|
339 m_applyButton->setEnabled(true);
|
Chris@225
|
340 }
|
Chris@225
|
341
|
Chris@225
|
342 void
|
Chris@0
|
343 PreferencesDialog::okClicked()
|
Chris@0
|
344 {
|
Chris@0
|
345 applyClicked();
|
Chris@0
|
346 accept();
|
Chris@0
|
347 }
|
Chris@0
|
348
|
Chris@0
|
349 void
|
Chris@0
|
350 PreferencesDialog::applyClicked()
|
Chris@0
|
351 {
|
Chris@0
|
352 Preferences *prefs = Preferences::getInstance();
|
Chris@0
|
353 prefs->setWindowType(WindowType(m_windowType));
|
Chris@115
|
354 prefs->setSpectrogramSmoothing(Preferences::SpectrogramSmoothing
|
Chris@115
|
355 (m_spectrogramSmoothing));
|
Chris@0
|
356 prefs->setPropertyBoxLayout(Preferences::PropertyBoxLayout
|
Chris@0
|
357 (m_propertyLayout));
|
Chris@0
|
358 prefs->setTuningFrequency(m_tuningFrequency);
|
Chris@32
|
359 prefs->setResampleQuality(m_resampleQuality);
|
Chris@180
|
360 prefs->setResampleOnLoad(m_resampleOnLoad);
|
Chris@180
|
361 prefs->setTemporaryDirectoryRoot(m_tempDirRoot);
|
Chris@180
|
362 prefs->setBackgroundMode(Preferences::BackgroundMode(m_backgroundMode));
|
Chris@225
|
363 prefs->setViewFontSize(m_viewFontSize);
|
Chris@180
|
364
|
Chris@0
|
365 m_applyButton->setEnabled(false);
|
Chris@180
|
366
|
Chris@180
|
367 if (m_changesOnRestart) {
|
Chris@180
|
368 QMessageBox::information(this, tr("Preferences"),
|
Chris@180
|
369 tr("One or more of the application preferences you have changed may not take full effect until Sonic Visualiser is restarted.\nPlease exit and restart the application now if you want these changes to take effect immediately."));
|
Chris@180
|
370 m_changesOnRestart = false;
|
Chris@180
|
371 }
|
Chris@0
|
372 }
|
Chris@0
|
373
|
Chris@0
|
374 void
|
Chris@0
|
375 PreferencesDialog::cancelClicked()
|
Chris@0
|
376 {
|
Chris@0
|
377 reject();
|
Chris@0
|
378 }
|
Chris@0
|
379
|
Chris@163
|
380 void
|
Chris@163
|
381 PreferencesDialog::applicationClosing(bool quickly)
|
Chris@163
|
382 {
|
Chris@163
|
383 if (quickly) {
|
Chris@163
|
384 reject();
|
Chris@163
|
385 return;
|
Chris@163
|
386 }
|
Chris@163
|
387
|
Chris@163
|
388 if (m_applyButton->isEnabled()) {
|
Chris@163
|
389 int rv = QMessageBox::warning
|
Chris@163
|
390 (this, tr("Preferences Changed"),
|
Chris@163
|
391 tr("Some preferences have been changed but not applied.\n"
|
Chris@163
|
392 "Apply them before closing?"),
|
Chris@163
|
393 QMessageBox::Apply | QMessageBox::Discard,
|
Chris@163
|
394 QMessageBox::Discard);
|
Chris@163
|
395 if (rv == QMessageBox::Apply) {
|
Chris@163
|
396 applyClicked();
|
Chris@163
|
397 accept();
|
Chris@163
|
398 } else {
|
Chris@163
|
399 reject();
|
Chris@163
|
400 }
|
Chris@163
|
401 } else {
|
Chris@163
|
402 accept();
|
Chris@163
|
403 }
|
Chris@163
|
404 }
|
Chris@163
|
405
|