/[svn]/qsampler/trunk/src/qsamplerOptionsForm.cpp
ViewVC logotype

Contents of /qsampler/trunk/src/qsamplerOptionsForm.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3555 - (show annotations) (download)
Tue Aug 13 10:19:32 2019 UTC (8 days, 12 hours ago) by capela
File size: 16279 byte(s)
- In late compliance to C++11, all NULL constants replaced for nullptr.
1 // qsamplerOptionsForm.cpp
2 //
3 /****************************************************************************
4 Copyright (C) 2004-2019, rncbc aka Rui Nuno Capela. All rights reserved.
5 Copyright (C) 2007, Christian Schoenebeck
6
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License along
18 with this program; if not, write to the Free Software Foundation, Inc.,
19 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
21 *****************************************************************************/
22
23 #include "qsamplerOptionsForm.h"
24
25 #include "qsamplerAbout.h"
26 #include "qsamplerOptions.h"
27
28 #include <QMessageBox>
29 #include <QFontDialog>
30 #include <QFileDialog>
31
32
33 namespace QSampler {
34
35 //-------------------------------------------------------------------------
36 // QSampler::OptionsForm -- Options form implementation.
37 //
38
39 OptionsForm::OptionsForm ( QWidget* pParent )
40 : QDialog(pParent)
41 {
42 m_ui.setupUi(this);
43
44 // No settings descriptor initially (the caller will set it).
45 m_pOptions = nullptr;
46
47 // Initialize dirty control state.
48 m_iDirtySetup = 0;
49 m_iDirtyCount = 0;
50
51 // Set dialog validators...
52 m_ui.ServerPortComboBox->setValidator(
53 new QIntValidator(m_ui.ServerPortComboBox));
54
55 // Try to restore old window positioning.
56 adjustSize();
57
58 QObject::connect(m_ui.ServerHostComboBox,
59 SIGNAL(editTextChanged(const QString&)),
60 SLOT(optionsChanged()));
61 QObject::connect(m_ui.ServerPortComboBox,
62 SIGNAL(editTextChanged(const QString&)),
63 SLOT(optionsChanged()));
64 QObject::connect(m_ui.ServerTimeoutSpinBox,
65 SIGNAL(valueChanged(int)),
66 SLOT(optionsChanged()));
67 QObject::connect(m_ui.ServerStartCheckBox,
68 SIGNAL(stateChanged(int)),
69 SLOT(optionsChanged()));
70 QObject::connect(m_ui.ServerCmdLineComboBox,
71 SIGNAL(editTextChanged(const QString&)),
72 SLOT(optionsChanged()));
73 QObject::connect(m_ui.StartDelaySpinBox,
74 SIGNAL(valueChanged(int)),
75 SLOT(optionsChanged()));
76 QObject::connect(m_ui.MessagesLogCheckBox,
77 SIGNAL(stateChanged(int)),
78 SLOT(optionsChanged()));
79 QObject::connect(m_ui.MessagesLogPathComboBox,
80 SIGNAL(editTextChanged(const QString&)),
81 SLOT(optionsChanged()));
82 QObject::connect(m_ui.MessagesLogPathToolButton,
83 SIGNAL(clicked()),
84 SLOT(browseMessagesLogPath()));
85 QObject::connect(m_ui.DisplayFontPushButton,
86 SIGNAL(clicked()),
87 SLOT(chooseDisplayFont()));
88 QObject::connect(m_ui.DisplayEffectCheckBox,
89 SIGNAL(toggled(bool)),
90 SLOT(toggleDisplayEffect(bool)));
91 QObject::connect(m_ui.AutoRefreshCheckBox,
92 SIGNAL(stateChanged(int)),
93 SLOT(optionsChanged()));
94 QObject::connect(m_ui.AutoRefreshTimeSpinBox,
95 SIGNAL(valueChanged(int)),
96 SLOT(optionsChanged()));
97 QObject::connect(m_ui.MaxVolumeSpinBox,
98 SIGNAL(valueChanged(int)),
99 SLOT(optionsChanged()));
100 QObject::connect(m_ui.MessagesFontPushButton,
101 SIGNAL(clicked()),
102 SLOT(chooseMessagesFont()));
103 QObject::connect(m_ui.MessagesLimitCheckBox,
104 SIGNAL(stateChanged(int)),
105 SLOT(optionsChanged()));
106 QObject::connect(m_ui.MessagesLimitLinesSpinBox,
107 SIGNAL(valueChanged(int)),
108 SLOT(optionsChanged()));
109 QObject::connect(m_ui.ConfirmRemoveCheckBox,
110 SIGNAL(stateChanged(int)),
111 SLOT(optionsChanged()));
112 QObject::connect(m_ui.ConfirmResetCheckBox,
113 SIGNAL(stateChanged(int)),
114 SLOT(optionsChanged()));
115 QObject::connect(m_ui.ConfirmRestartCheckBox,
116 SIGNAL(stateChanged(int)),
117 SLOT(optionsChanged()));
118 QObject::connect(m_ui.ConfirmErrorCheckBox,
119 SIGNAL(stateChanged(int)),
120 SLOT(optionsChanged()));
121 QObject::connect(m_ui.KeepOnTopCheckBox,
122 SIGNAL(stateChanged(int)),
123 SLOT(optionsChanged()));
124 QObject::connect(m_ui.StdoutCaptureCheckBox,
125 SIGNAL(stateChanged(int)),
126 SLOT(optionsChanged()));
127 QObject::connect(m_ui.MaxRecentFilesSpinBox,
128 SIGNAL(valueChanged(int)),
129 SLOT(optionsChanged()));
130 QObject::connect(m_ui.CompletePathCheckBox,
131 SIGNAL(stateChanged(int)),
132 SLOT(optionsChanged()));
133 QObject::connect(m_ui.InstrumentNamesCheckBox,
134 SIGNAL(stateChanged(int)),
135 SLOT(optionsChanged()));
136 QObject::connect(m_ui.BaseFontSizeComboBox,
137 SIGNAL(editTextChanged(const QString&)),
138 SLOT(optionsChanged()));
139 QObject::connect(m_ui.MaxVoicesSpinBox,
140 SIGNAL(valueChanged(int)),
141 SLOT(maxVoicesChanged(int)));
142 QObject::connect(m_ui.MaxStreamsSpinBox,
143 SIGNAL(valueChanged(int)),
144 SLOT(maxStreamsChanged(int)));
145 QObject::connect(m_ui.DialogButtonBox,
146 SIGNAL(accepted()),
147 SLOT(accept()));
148 QObject::connect(m_ui.DialogButtonBox,
149 SIGNAL(rejected()),
150 SLOT(reject()));
151 }
152
153 OptionsForm::~OptionsForm()
154 {
155 }
156
157 // Populate (setup) dialog controls from settings descriptors.
158 void OptionsForm::setup ( Options *pOptions )
159 {
160 // Set reference descriptor.
161 m_pOptions = pOptions;
162
163 // Start clean.
164 m_iDirtyCount = 0;
165 // Avoid nested changes.
166 m_iDirtySetup++;
167
168 // Load combo box history...
169 m_pOptions->loadComboBoxHistory(m_ui.ServerHostComboBox);
170 m_pOptions->loadComboBoxHistory(m_ui.ServerPortComboBox);
171 m_pOptions->loadComboBoxHistory(m_ui.ServerCmdLineComboBox);
172 m_pOptions->loadComboBoxHistory(m_ui.MessagesLogPathComboBox);
173
174 // Load Server settings...
175 m_ui.ServerHostComboBox->setEditText(m_pOptions->sServerHost);
176 m_ui.ServerPortComboBox->setEditText(QString::number(m_pOptions->iServerPort));
177 m_ui.ServerTimeoutSpinBox->setValue(m_pOptions->iServerTimeout);
178 m_ui.ServerStartCheckBox->setChecked(m_pOptions->bServerStart);
179 m_ui.ServerCmdLineComboBox->setEditText(m_pOptions->sServerCmdLine);
180 m_ui.StartDelaySpinBox->setValue(m_pOptions->iStartDelay);
181
182 // Logging options...
183 m_ui.MessagesLogCheckBox->setChecked(m_pOptions->bMessagesLog);
184 m_ui.MessagesLogPathComboBox->setEditText(m_pOptions->sMessagesLogPath);
185
186 // Load Display options...
187 QFont font;
188 QPalette pal;
189
190 // Display font.
191 if (m_pOptions->sDisplayFont.isEmpty()
192 || !font.fromString(m_pOptions->sDisplayFont))
193 font = QFont("Sans Serif", 8);
194 m_ui.DisplayFontTextLabel->setFont(font);
195 m_ui.DisplayFontTextLabel->setText(font.family()
196 + ' ' + QString::number(font.pointSize()));
197
198 // Display effect.
199 m_ui.DisplayEffectCheckBox->setChecked(m_pOptions->bDisplayEffect);
200 toggleDisplayEffect(m_pOptions->bDisplayEffect);
201
202 // Auto-refresh and maximum volume options.
203 m_ui.AutoRefreshCheckBox->setChecked(m_pOptions->bAutoRefresh);
204 m_ui.AutoRefreshTimeSpinBox->setValue(m_pOptions->iAutoRefreshTime);
205 m_ui.MaxVolumeSpinBox->setValue(m_pOptions->iMaxVolume);
206
207 // Messages font.
208 if (m_pOptions->sMessagesFont.isEmpty()
209 || !font.fromString(m_pOptions->sMessagesFont))
210 font = QFont("Monospace", 8);
211 pal = m_ui.MessagesFontTextLabel->palette();
212 pal.setColor(QPalette::Background, pal.base().color());
213 m_ui.MessagesFontTextLabel->setPalette(pal);
214 m_ui.MessagesFontTextLabel->setFont(font);
215 m_ui.MessagesFontTextLabel->setText(font.family()
216 + ' ' + QString::number(font.pointSize()));
217
218 // Messages limit option.
219 m_ui.MessagesLimitCheckBox->setChecked(m_pOptions->bMessagesLimit);
220 m_ui.MessagesLimitLinesSpinBox->setValue(m_pOptions->iMessagesLimitLines);
221
222 // Other options finally.
223 m_ui.ConfirmRemoveCheckBox->setChecked(m_pOptions->bConfirmRemove);
224 m_ui.ConfirmRestartCheckBox->setChecked(m_pOptions->bConfirmRestart);
225 m_ui.ConfirmResetCheckBox->setChecked(m_pOptions->bConfirmReset);
226 m_ui.ConfirmErrorCheckBox->setChecked(m_pOptions->bConfirmError);
227 m_ui.KeepOnTopCheckBox->setChecked(m_pOptions->bKeepOnTop);
228 m_ui.StdoutCaptureCheckBox->setChecked(m_pOptions->bStdoutCapture);
229 m_ui.CompletePathCheckBox->setChecked(m_pOptions->bCompletePath);
230 m_ui.InstrumentNamesCheckBox->setChecked(m_pOptions->bInstrumentNames);
231 m_ui.MaxRecentFilesSpinBox->setValue(m_pOptions->iMaxRecentFiles);
232 if (m_pOptions->iBaseFontSize > 0)
233 m_ui.BaseFontSizeComboBox->setEditText(QString::number(m_pOptions->iBaseFontSize));
234 else
235 m_ui.BaseFontSizeComboBox->setCurrentIndex(0);
236
237 #ifndef CONFIG_LIBGIG
238 m_ui.InstrumentNamesCheckBox->setEnabled(false);
239 #endif
240
241 bMaxVoicesModified = bMaxStreamsModified = false;
242 #ifdef CONFIG_MAX_VOICES
243 const bool bMaxVoicesSupported =
244 m_pOptions->getEffectiveMaxVoices() >= 0;
245 const bool bMaxStreamsSupported =
246 m_pOptions->getEffectiveMaxStreams() >= 0;
247
248 m_ui.MaxVoicesSpinBox->setEnabled(bMaxVoicesSupported);
249 m_ui.MaxVoicesSpinBox->setValue(m_pOptions->getMaxVoices());
250 if (!bMaxVoicesSupported)
251 m_ui.MaxVoicesSpinBox->setToolTip(
252 tr("This parameter is not supported by the current sampler "
253 "version in use.")
254 );
255 else
256 m_ui.MaxVoicesSpinBox->setToolTip(
257 tr("The max. amount of voices the sampler shall process "
258 "simultaneously.")
259 );
260
261 m_ui.MaxStreamsSpinBox->setEnabled(bMaxStreamsSupported);
262 m_ui.MaxStreamsSpinBox->setValue(m_pOptions->getMaxStreams());
263 if (!bMaxStreamsSupported)
264 m_ui.MaxStreamsSpinBox->setToolTip(
265 tr("This parameter is not supported by the current sampler "
266 "version in use.")
267 );
268 else
269 m_ui.MaxStreamsSpinBox->setToolTip(
270 tr("The max. amount of disk streams the sampler shall process "
271 "simultaneously.")
272 );
273 #else
274 m_ui.MaxVoicesSpinBox->setEnabled(false);
275 m_ui.MaxStreamsSpinBox->setEnabled(false);
276 m_ui.MaxVoicesSpinBox->setToolTip(
277 tr("QSampler was built without support for this parameter.")
278 );
279 m_ui.MaxStreamsSpinBox->setToolTip(
280 tr("QSampler was built without support for this parameter.")
281 );
282 #endif // CONFIG_MAX_VOICES
283
284 // Done.
285 m_iDirtySetup--;
286 stabilizeForm();
287 }
288
289
290 // Accept settings (OK button slot).
291 void OptionsForm::accept (void)
292 {
293 // Save options...
294 if (m_iDirtyCount > 0) {
295 // Server settings....
296 m_pOptions->sServerHost = m_ui.ServerHostComboBox->currentText().trimmed();
297 m_pOptions->iServerPort = m_ui.ServerPortComboBox->currentText().toInt();
298 m_pOptions->iServerTimeout = m_ui.ServerTimeoutSpinBox->value();
299 m_pOptions->bServerStart = m_ui.ServerStartCheckBox->isChecked();
300 m_pOptions->sServerCmdLine = m_ui.ServerCmdLineComboBox->currentText().trimmed();
301 m_pOptions->iStartDelay = m_ui.StartDelaySpinBox->value();
302 // Logging options...
303 m_pOptions->bMessagesLog = m_ui.MessagesLogCheckBox->isChecked();
304 m_pOptions->sMessagesLogPath = m_ui.MessagesLogPathComboBox->currentText();
305 // Channels options...
306 m_pOptions->sDisplayFont = m_ui.DisplayFontTextLabel->font().toString();
307 m_pOptions->bDisplayEffect = m_ui.DisplayEffectCheckBox->isChecked();
308 m_pOptions->bAutoRefresh = m_ui.AutoRefreshCheckBox->isChecked();
309 m_pOptions->iAutoRefreshTime = m_ui.AutoRefreshTimeSpinBox->value();
310 m_pOptions->iMaxVolume = m_ui.MaxVolumeSpinBox->value();
311 // Messages options...
312 m_pOptions->sMessagesFont = m_ui.MessagesFontTextLabel->font().toString();
313 m_pOptions->bMessagesLimit = m_ui.MessagesLimitCheckBox->isChecked();
314 m_pOptions->iMessagesLimitLines = m_ui.MessagesLimitLinesSpinBox->value();
315 // Other options...
316 m_pOptions->bConfirmRemove = m_ui.ConfirmRemoveCheckBox->isChecked();
317 m_pOptions->bConfirmRestart = m_ui.ConfirmRestartCheckBox->isChecked();
318 m_pOptions->bConfirmReset = m_ui.ConfirmResetCheckBox->isChecked();
319 m_pOptions->bConfirmError = m_ui.ConfirmErrorCheckBox->isChecked();
320 m_pOptions->bKeepOnTop = m_ui.KeepOnTopCheckBox->isChecked();
321 m_pOptions->bStdoutCapture = m_ui.StdoutCaptureCheckBox->isChecked();
322 m_pOptions->bCompletePath = m_ui.CompletePathCheckBox->isChecked();
323 m_pOptions->bInstrumentNames = m_ui.InstrumentNamesCheckBox->isChecked();
324 m_pOptions->iMaxRecentFiles = m_ui.MaxRecentFilesSpinBox->value();
325 m_pOptions->iBaseFontSize = m_ui.BaseFontSizeComboBox->currentText().toInt();
326 // Reset dirty flag.
327 m_iDirtyCount = 0;
328 }
329
330 // if the user modified the limits, apply them to the sampler
331 // (and store it later in qsampler's configuration)
332 if (bMaxVoicesModified && m_ui.MaxVoicesSpinBox->isEnabled())
333 m_pOptions->setMaxVoices(m_ui.MaxVoicesSpinBox->value());
334 if (bMaxStreamsModified && m_ui.MaxStreamsSpinBox->isEnabled())
335 m_pOptions->setMaxStreams(m_ui.MaxStreamsSpinBox->value());
336
337 // Save combobox history...
338 m_pOptions->saveComboBoxHistory(m_ui.ServerHostComboBox);
339 m_pOptions->saveComboBoxHistory(m_ui.ServerPortComboBox);
340 m_pOptions->saveComboBoxHistory(m_ui.ServerCmdLineComboBox);
341 m_pOptions->saveComboBoxHistory(m_ui.MessagesLogPathComboBox);
342
343 // Save/commit to disk.
344 m_pOptions->saveOptions();
345
346 // Just go with dialog acceptance.
347 QDialog::accept();
348 }
349
350
351 // Reject settings (Cancel button slot).
352 void OptionsForm::reject (void)
353 {
354 bool bReject = true;
355
356 // Check if there's any pending changes...
357 if (m_iDirtyCount > 0) {
358 switch (QMessageBox::warning(this,
359 QSAMPLER_TITLE ": " + tr("Warning"),
360 tr("Some settings have been changed.\n\n"
361 "Do you want to apply the changes?"),
362 QMessageBox::Apply |
363 QMessageBox::Discard |
364 QMessageBox::Cancel)) {
365 case QMessageBox::Apply:
366 accept();
367 return;
368 case QMessageBox::Discard:
369 break;
370 default: // Cancel.
371 bReject = false;
372 }
373 }
374
375 if (bReject)
376 QDialog::reject();
377 }
378
379
380 // Dirty up settings.
381 void OptionsForm::optionsChanged (void)
382 {
383 if (m_iDirtySetup > 0)
384 return;
385
386 m_iDirtyCount++;
387 stabilizeForm();
388 }
389
390
391 // Stabilize current form state.
392 void OptionsForm::stabilizeForm (void)
393 {
394 bool bValid = (m_iDirtyCount > 0);
395
396 bool bEnabled = m_ui.ServerStartCheckBox->isChecked();
397 m_ui.ServerCmdLineTextLabel->setEnabled(bEnabled);
398 m_ui.ServerCmdLineComboBox->setEnabled(bEnabled);
399 m_ui.StartDelayTextLabel->setEnabled(bEnabled);
400 m_ui.StartDelaySpinBox->setEnabled(bEnabled);
401
402 bEnabled = m_ui.MessagesLogCheckBox->isChecked();
403 m_ui.MessagesLogPathComboBox->setEnabled(bEnabled);
404 m_ui.MessagesLogPathToolButton->setEnabled(bEnabled);
405 if (bEnabled && bValid) {
406 const QString& sPath = m_ui.MessagesLogPathComboBox->currentText();
407 bValid = !sPath.isEmpty();
408 }
409
410 m_ui.AutoRefreshTimeSpinBox->setEnabled(
411 m_ui.AutoRefreshCheckBox->isChecked());
412 m_ui.MessagesLimitLinesSpinBox->setEnabled(
413 m_ui.MessagesLimitCheckBox->isChecked());
414
415 m_ui.DialogButtonBox->button(QDialogButtonBox::Ok)->setEnabled(bValid);
416 }
417
418
419 // Messages log path browse slot.
420 void OptionsForm::browseMessagesLogPath (void)
421 {
422 QString sFileName = QFileDialog::getSaveFileName(
423 this, // Parent.
424 tr("Messages Log"), // Caption.
425 m_ui.MessagesLogPathComboBox->currentText(), // Start here.
426 tr("Log files") + " (*.log)" // Filter (log files)
427 );
428
429 if (!sFileName.isEmpty()) {
430 m_ui.MessagesLogPathComboBox->setEditText(sFileName);
431 m_ui.MessagesLogPathComboBox->setFocus();
432 optionsChanged();
433 }
434 }
435
436
437 // The channel display font selection dialog.
438 void OptionsForm::chooseDisplayFont (void)
439 {
440 bool bOk = false;
441 QFont font = QFontDialog::getFont(&bOk,
442 m_ui.DisplayFontTextLabel->font(), this);
443 if (bOk) {
444 m_ui.DisplayFontTextLabel->setFont(font);
445 m_ui.DisplayFontTextLabel->setText(font.family()
446 + ' ' + QString::number(font.pointSize()));
447 optionsChanged();
448 }
449 }
450
451
452 // The messages font selection dialog.
453 void OptionsForm::chooseMessagesFont (void)
454 {
455 bool bOk = false;
456 QFont font = QFontDialog::getFont(&bOk,
457 m_ui.MessagesFontTextLabel->font(), this);
458 if (bOk) {
459 m_ui.MessagesFontTextLabel->setFont(font);
460 m_ui.MessagesFontTextLabel->setText(font.family()
461 + ' ' + QString::number(font.pointSize()));
462 optionsChanged();
463 }
464 }
465
466
467 // The channel display effect demo changer.
468 void OptionsForm::toggleDisplayEffect ( bool bOn )
469 {
470 QPalette pal;
471 pal.setColor(QPalette::Foreground, Qt::green);
472 if (bOn) {
473 QPixmap pm(":/images/displaybg1.png");
474 pal.setBrush(QPalette::Background, QBrush(pm));
475 } else {
476 pal.setColor(QPalette::Background, Qt::black);
477 }
478 m_ui.DisplayFontTextLabel->setPalette(pal);
479
480 optionsChanged();
481 }
482
483 void OptionsForm::maxVoicesChanged(int /*iMaxVoices*/)
484 {
485 bMaxVoicesModified = true;
486 optionsChanged();
487 }
488
489 void OptionsForm::maxStreamsChanged(int /*iMaxStreams*/)
490 {
491 bMaxStreamsModified = true;
492 optionsChanged();
493 }
494
495 } // namespace QSampler
496
497 // end of qsamplerOptionsForm.cpp

  ViewVC Help
Powered by ViewVC