Filter for relative HRTF data paths and add Add/Remove label texts
[openal-soft.git] / utils / alsoft-config / mainwindow.cpp
blobc58000d90b36487e2cd30181d0cb23bb7e4dab3b
1 #include <QFileDialog>
2 #include <QMessageBox>
3 #include <QSettings>
4 #include <QtGlobal>
5 #include "mainwindow.h"
6 #include "ui_mainwindow.h"
8 namespace {
9 static const struct {
10 char backend_name[16];
11 char menu_string[32];
12 } backendMenuList[] = {
13 #ifdef Q_OS_WIN32
14 { "mmdevapi", "Add MMDevAPI" },
15 { "dsound", "Add DirectSound" },
16 { "winmm", "Add Windows Multimedia" },
17 #endif
18 #ifdef Q_OS_MAC
19 { "core", "Add CoreAudio" },
20 #endif
21 { "pulse", "Add PulseAudio" },
22 #ifdef Q_OS_UNIX
23 { "alsa", "Add ALSA" },
24 { "oss", "Add OSS" },
25 { "solaris", "Add Solaris" },
26 { "sndio", "Add SndIO" },
27 { "qsa", "Add QSA" },
28 #endif
29 { "port", "Add PortAudio" },
30 { "opensl", "Add OpenSL" },
31 { "null", "Add Null Output" },
32 { "wave", "Add Wave Writer" },
33 { "", "" }
36 static QString getDefaultConfigName()
38 #ifdef Q_OS_WIN32
39 static const char fname[] = "alsoft.ini";
40 QByteArray base = qgetenv("AppData");
41 #else
42 static const char fname[] = "alsoft.conf";
43 QByteArray base = qgetenv("XDG_CONFIG_HOME");
44 if(base.isEmpty())
46 base = qgetenv("HOME");
47 if(base.isEmpty() == false)
48 base += "/.config";
50 #endif
51 if(base.isEmpty() == false)
52 return base +'/'+ fname;
53 return fname;
56 static QString getBaseDataPath()
58 #ifdef Q_OS_WIN32
59 QByteArray base = qgetenv("AppData");
60 #else
61 QByteArray base = qgetenv("XDG_DATA_HOME");
62 if(base.isEmpty())
64 base = qgetenv("HOME");
65 if(!base.isEmpty())
66 base += "/.local/share";
68 #endif
69 return base;
72 static QStringList getAllDataPaths(QString append=QString())
74 QStringList list;
75 list.append(getBaseDataPath());
76 #ifdef Q_OS_WIN32
77 // TODO: Common AppData path
78 #else
79 QString paths = qgetenv("XDG_DATA_DIRS");
80 if(paths.isEmpty())
81 paths = "/usr/local/share/:/usr/share/";
82 list += paths.split(QChar(':'), QString::SkipEmptyParts);
83 #endif
84 QStringList::iterator iter = list.begin();
85 while(iter != list.end())
87 if(iter->isEmpty())
88 iter = list.erase(iter);
89 else
91 iter->append(append);
92 iter++;
95 return list;
99 MainWindow::MainWindow(QWidget *parent) :
100 QMainWindow(parent),
101 ui(new Ui::MainWindow),
102 mPeriodSizeValidator(NULL),
103 mPeriodCountValidator(NULL),
104 mSourceCountValidator(NULL),
105 mEffectSlotValidator(NULL),
106 mSourceSendValidator(NULL),
107 mSampleRateValidator(NULL),
108 mReverbBoostValidator(NULL)
110 ui->setupUi(this);
112 mPeriodSizeValidator = new QIntValidator(64, 8192, this);
113 ui->periodSizeEdit->setValidator(mPeriodSizeValidator);
114 mPeriodCountValidator = new QIntValidator(2, 16, this);
115 ui->periodCountEdit->setValidator(mPeriodCountValidator);
117 mSourceCountValidator = new QIntValidator(0, 256, this);
118 ui->srcCountLineEdit->setValidator(mSourceCountValidator);
119 mEffectSlotValidator = new QIntValidator(0, 16, this);
120 ui->effectSlotLineEdit->setValidator(mEffectSlotValidator);
121 mSourceSendValidator = new QIntValidator(0, 4, this);
122 ui->srcSendLineEdit->setValidator(mSourceSendValidator);
123 mSampleRateValidator = new QIntValidator(8000, 192000, this);
124 ui->sampleRateCombo->lineEdit()->setValidator(mSampleRateValidator);
126 mReverbBoostValidator = new QDoubleValidator(-12.0, +12.0, 1, this);
127 ui->reverbBoostEdit->setValidator(mReverbBoostValidator);
129 connect(ui->actionLoad, SIGNAL(triggered()), this, SLOT(loadConfigFromFile()));
130 connect(ui->actionSave_As, SIGNAL(triggered()), this, SLOT(saveConfigAsFile()));
132 connect(ui->applyButton, SIGNAL(clicked()), this, SLOT(saveCurrentConfig()));
134 connect(ui->periodSizeSlider, SIGNAL(valueChanged(int)), this, SLOT(updatePeriodSizeEdit(int)));
135 connect(ui->periodSizeEdit, SIGNAL(editingFinished()), this, SLOT(updatePeriodSizeSlider()));
136 connect(ui->periodCountSlider, SIGNAL(valueChanged(int)), this, SLOT(updatePeriodCountEdit(int)));
137 connect(ui->periodCountEdit, SIGNAL(editingFinished()), this, SLOT(updatePeriodCountSlider()));
139 connect(ui->hrtfAddButton, SIGNAL(clicked()), this, SLOT(addHrtfFile()));
140 connect(ui->hrtfRemoveButton, SIGNAL(clicked()), this, SLOT(removeHrtfFile()));
141 connect(ui->hrtfFileList, SIGNAL(itemSelectionChanged()), this, SLOT(updateHrtfRemoveButton()));
143 ui->enabledBackendList->setContextMenuPolicy(Qt::CustomContextMenu);
144 connect(ui->enabledBackendList, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showEnabledBackendMenu(QPoint)));
146 ui->disabledBackendList->setContextMenuPolicy(Qt::CustomContextMenu);
147 connect(ui->disabledBackendList, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showDisabledBackendMenu(QPoint)));
149 connect(ui->reverbBoostSlider, SIGNAL(valueChanged(int)), this, SLOT(updateReverbBoostEdit(int)));
150 connect(ui->reverbBoostEdit, SIGNAL(textEdited(QString)), this, SLOT(updateReverbBoostSlider(QString)));
152 loadConfig(getDefaultConfigName());
155 MainWindow::~MainWindow()
157 delete ui;
158 delete mPeriodSizeValidator;
159 delete mPeriodCountValidator;
160 delete mSourceCountValidator;
161 delete mEffectSlotValidator;
162 delete mSourceSendValidator;
163 delete mSampleRateValidator;
164 delete mReverbBoostValidator;
167 void MainWindow::loadConfigFromFile()
169 QString fname = QFileDialog::getOpenFileName(this, tr("Select Files"));
170 if(fname.isEmpty() == false)
171 loadConfig(fname);
174 void MainWindow::loadConfig(const QString &fname)
176 QSettings settings(fname, QSettings::IniFormat);
178 QString sampletype = settings.value("sample-type").toString();
179 ui->sampleFormatCombo->setCurrentIndex(0);
180 if(sampletype.isEmpty() == false)
182 for(int i = 1;i < ui->sampleFormatCombo->count();i++)
184 QString item = ui->sampleFormatCombo->itemText(i);
185 if(item.startsWith(sampletype))
187 ui->sampleFormatCombo->setCurrentIndex(i);
188 break;
193 QString channelconfig = settings.value("channels").toString();
194 ui->channelConfigCombo->setCurrentIndex(0);
195 if(channelconfig.isEmpty() == false)
197 for(int i = 1;i < ui->channelConfigCombo->count();i++)
199 QString item = ui->channelConfigCombo->itemText(i);
200 if(item.startsWith(channelconfig))
202 ui->channelConfigCombo->setCurrentIndex(i);
203 break;
208 QString srate = settings.value("frequency").toString();
209 if(srate.isEmpty())
210 ui->sampleRateCombo->setCurrentIndex(0);
211 else
213 ui->sampleRateCombo->lineEdit()->clear();
214 ui->sampleRateCombo->lineEdit()->insert(srate);
217 ui->srcCountLineEdit->clear();
218 ui->srcCountLineEdit->insert(settings.value("sources").toString());
219 ui->effectSlotLineEdit->clear();
220 ui->effectSlotLineEdit->insert(settings.value("slots").toString());
221 ui->srcSendLineEdit->clear();
222 ui->srcSendLineEdit->insert(settings.value("sends").toString());
224 QString resampler = settings.value("resampler").toString().trimmed();
225 if(resampler.isEmpty())
226 ui->resamplerComboBox->setCurrentIndex(0);
227 else
229 for(int i = 1;i < ui->resamplerComboBox->count();i++)
231 QString item = ui->resamplerComboBox->itemText(i);
232 int end = item.indexOf(' ');
233 if(end < 0) end = item.size();
234 if(resampler.size() == end && resampler.compare(item.leftRef(end), Qt::CaseInsensitive) == 0)
236 ui->resamplerComboBox->setCurrentIndex(i);
237 break;
242 int periodsize = settings.value("period_size").toInt();
243 ui->periodSizeEdit->clear();
244 if(periodsize >= 64)
246 ui->periodSizeEdit->insert(QString::number(periodsize));
247 updatePeriodSizeSlider();
250 int periodcount = settings.value("periods").toInt();
251 ui->periodCountEdit->clear();
252 if(periodcount >= 2)
254 ui->periodCountEdit->insert(QString::number(periodcount));
255 updatePeriodCountSlider();
258 QStringList disabledCpuExts = settings.value("disable-cpu-exts").toStringList();
259 if(disabledCpuExts.size() == 1)
260 disabledCpuExts = disabledCpuExts[0].split(QChar(','));
261 std::transform(disabledCpuExts.begin(), disabledCpuExts.end(),
262 disabledCpuExts.begin(), std::mem_fun_ref(&QString::trimmed));
263 ui->disableSSECheckBox->setChecked(disabledCpuExts.contains("sse", Qt::CaseInsensitive));
264 ui->disableSSE2CheckBox->setChecked(disabledCpuExts.contains("sse2", Qt::CaseInsensitive));
265 ui->disableSSE41CheckBox->setChecked(disabledCpuExts.contains("sse4.1", Qt::CaseInsensitive));
266 ui->disableNeonCheckBox->setChecked(disabledCpuExts.contains("neon", Qt::CaseInsensitive));
268 if(settings.value("hrtf").toString() == QString())
269 ui->hrtfEnableButton->setChecked(true);
270 else
272 if(settings.value("hrtf", true).toBool())
273 ui->hrtfForceButton->setChecked(true);
274 else
275 ui->hrtfDisableButton->setChecked(true);
278 QStringList hrtf_tables = settings.value("hrtf_tables").toStringList();
279 if(hrtf_tables.size() == 1)
280 hrtf_tables = hrtf_tables[0].split(QChar(','));
281 std::transform(hrtf_tables.begin(), hrtf_tables.end(),
282 hrtf_tables.begin(), std::mem_fun_ref(&QString::trimmed));
283 ui->hrtfFileList->clear();
284 ui->hrtfFileList->addItems(hrtf_tables);
285 updateHrtfRemoveButton();
287 ui->enabledBackendList->clear();
288 ui->disabledBackendList->clear();
289 QStringList drivers = settings.value("drivers").toStringList();
290 if(drivers.size() == 0)
291 ui->backendCheckBox->setChecked(true);
292 else
294 if(drivers.size() == 1)
295 drivers = drivers[0].split(QChar(','));
296 std::transform(drivers.begin(), drivers.end(),
297 drivers.begin(), std::mem_fun_ref(&QString::trimmed));
299 bool lastWasEmpty = false;
300 foreach(const QString &backend, drivers)
302 lastWasEmpty = backend.isEmpty();
303 if(!backend.startsWith(QChar('-')) && !lastWasEmpty)
304 ui->enabledBackendList->addItem(backend);
305 else if(backend.size() > 1)
306 ui->disabledBackendList->addItem(backend.right(backend.size()-1));
308 ui->backendCheckBox->setChecked(lastWasEmpty);
311 QString defaultreverb = settings.value("default-reverb").toString().toLower();
312 ui->defaultReverbComboBox->setCurrentIndex(0);
313 if(defaultreverb.isEmpty() == false)
315 for(int i = 0;i < ui->defaultReverbComboBox->count();i++)
317 if(defaultreverb.compare(ui->defaultReverbComboBox->itemText(i).toLower()) == 0)
319 ui->defaultReverbComboBox->setCurrentIndex(i);
320 break;
325 ui->emulateEaxCheckBox->setChecked(settings.value("reverb/emulate-eax", false).toBool());
326 ui->reverbBoostEdit->clear();
327 ui->reverbBoostEdit->insert(settings.value("reverb/boost").toString());
329 QStringList excludefx = settings.value("excludefx").toStringList();
330 if(excludefx.size() == 1)
331 excludefx = excludefx[0].split(QChar(','));
332 std::transform(excludefx.begin(), excludefx.end(),
333 excludefx.begin(), std::mem_fun_ref(&QString::trimmed));
334 ui->disableEaxReverbCheck->setChecked(excludefx.contains("eaxreverb", Qt::CaseInsensitive));
335 ui->disableStdReverbCheck->setChecked(excludefx.contains("reverb", Qt::CaseInsensitive));
336 ui->disableChorusCheck->setChecked(excludefx.contains("chorus", Qt::CaseInsensitive));
337 ui->disableCompressorCheck->setChecked(excludefx.contains("compressor", Qt::CaseInsensitive));
338 ui->disableDistortionCheck->setChecked(excludefx.contains("distortion", Qt::CaseInsensitive));
339 ui->disableEchoCheck->setChecked(excludefx.contains("echo", Qt::CaseInsensitive));
340 ui->disableEqualizerCheck->setChecked(excludefx.contains("equalizer", Qt::CaseInsensitive));
341 ui->disableFlangerCheck->setChecked(excludefx.contains("flanger", Qt::CaseInsensitive));
342 ui->disableModulatorCheck->setChecked(excludefx.contains("modulator", Qt::CaseInsensitive));
343 ui->disableDedicatedCheck->setChecked(excludefx.contains("dedicated", Qt::CaseInsensitive));
346 void MainWindow::saveCurrentConfig()
348 saveConfig(getDefaultConfigName());
349 QMessageBox::information(this, tr("Information"),
350 tr("Applications using OpenAL need to be restarted for changes to take effect."));
353 void MainWindow::saveConfigAsFile()
355 QString fname = QFileDialog::getOpenFileName(this, tr("Select Files"));
356 if(fname.isEmpty() == false)
357 saveConfig(fname);
360 void MainWindow::saveConfig(const QString &fname) const
362 QSettings settings(fname, QSettings::IniFormat);
364 /* HACK: Compound any stringlist values into a comma-separated string. */
365 QStringList allkeys = settings.allKeys();
366 foreach(const QString &key, allkeys)
368 QStringList vals = settings.value(key).toStringList();
369 if(vals.size() > 1)
370 settings.setValue(key, vals.join(QChar(',')));
373 QString str = ui->sampleFormatCombo->currentText();
374 str.truncate(str.indexOf('-'));
375 settings.setValue("sample-type", str.trimmed());
377 str = ui->channelConfigCombo->currentText();
378 str.truncate(str.indexOf('-'));
379 settings.setValue("channels", str.trimmed());
381 uint rate = ui->sampleRateCombo->currentText().toUInt();
382 if(rate == 0)
383 settings.setValue("frequency", QString());
384 else
385 settings.setValue("frequency", rate);
387 settings.setValue("period_size", ui->periodSizeEdit->text());
388 settings.setValue("periods", ui->periodCountEdit->text());
390 settings.setValue("sources", ui->srcCountLineEdit->text());
391 settings.setValue("slots", ui->effectSlotLineEdit->text());
393 if(ui->resamplerComboBox->currentIndex() == 0)
394 settings.setValue("resampler", QString());
395 else
397 str = ui->resamplerComboBox->currentText();
398 settings.setValue("resampler", str.split(' ').first().toLower());
401 QStringList strlist;
402 if(ui->disableSSECheckBox->isChecked())
403 strlist.append("sse");
404 if(ui->disableSSE2CheckBox->isChecked())
405 strlist.append("sse2");
406 if(ui->disableSSE41CheckBox->isChecked())
407 strlist.append("sse4.1");
408 if(ui->disableNeonCheckBox->isChecked())
409 strlist.append("neon");
410 settings.setValue("disable-cpu-exts", strlist.join(QChar(',')));
412 if(ui->hrtfForceButton->isChecked())
413 settings.setValue("hrtf", "true");
414 else if(ui->hrtfDisableButton->isChecked())
415 settings.setValue("hrtf", "false");
416 else
417 settings.setValue("hrtf", QString());
419 strlist.clear();
420 QList<QListWidgetItem*> items = ui->hrtfFileList->findItems("*", Qt::MatchWildcard);
421 foreach(const QListWidgetItem *item, items)
422 strlist.append(item->text());
423 settings.setValue("hrtf_tables", strlist.join(QChar(',')));
425 strlist.clear();
426 items = ui->enabledBackendList->findItems("*", Qt::MatchWildcard);
427 foreach(const QListWidgetItem *item, items)
428 strlist.append(item->text());
429 items = ui->disabledBackendList->findItems("*", Qt::MatchWildcard);
430 foreach(const QListWidgetItem *item, items)
431 strlist.append(QChar('-')+item->text());
432 if(strlist.size() == 0 && !ui->backendCheckBox->isChecked())
433 strlist.append("-all");
434 else if(ui->backendCheckBox->isChecked())
435 strlist.append(QString());
436 settings.setValue("drivers", strlist.join(QChar(',')));
438 // TODO: Remove check when we can properly match global values.
439 if(ui->defaultReverbComboBox->currentIndex() == 0)
440 settings.setValue("default-reverb", QString());
441 else
443 str = ui->defaultReverbComboBox->currentText().toLower();
444 settings.setValue("default-reverb", str);
447 if(ui->emulateEaxCheckBox->isChecked())
448 settings.setValue("reverb/emulate-eax", "true");
449 else
450 settings.setValue("reverb/emulate-eax", QString()/*"false"*/);
452 // TODO: Remove check when we can properly match global values.
453 if(ui->reverbBoostSlider->sliderPosition() == 0)
454 settings.setValue("reverb/boost", QString());
455 else
456 settings.setValue("reverb/boost", ui->reverbBoostEdit->text());
458 strlist.clear();
459 if(ui->disableEaxReverbCheck->isChecked())
460 strlist.append("eaxreverb");
461 if(ui->disableStdReverbCheck->isChecked())
462 strlist.append("reverb");
463 if(ui->disableChorusCheck->isChecked())
464 strlist.append("chorus");
465 if(ui->disableDistortionCheck->isChecked())
466 strlist.append("distortion");
467 if(ui->disableCompressorCheck->isChecked())
468 strlist.append("compressor");
469 if(ui->disableEchoCheck->isChecked())
470 strlist.append("echo");
471 if(ui->disableEqualizerCheck->isChecked())
472 strlist.append("equalizer");
473 if(ui->disableFlangerCheck->isChecked())
474 strlist.append("flanger");
475 if(ui->disableModulatorCheck->isChecked())
476 strlist.append("modulator");
477 if(ui->disableDedicatedCheck->isChecked())
478 strlist.append("dedicated");
479 settings.setValue("excludefx", strlist.join(QChar(',')));
481 /* Remove empty keys
482 * FIXME: Should only remove keys whose value matches the globally-specified value.
484 allkeys = settings.allKeys();
485 foreach(const QString &key, allkeys)
487 str = settings.value(key).toString();
488 if(str == QString())
489 settings.remove(key);
494 void MainWindow::updatePeriodSizeEdit(int size)
496 ui->periodSizeEdit->clear();
497 if(size >= 64)
499 size = (size+32)&~0x3f;
500 ui->periodSizeEdit->insert(QString::number(size));
504 void MainWindow::updatePeriodSizeSlider()
506 int pos = ui->periodSizeEdit->text().toInt();
507 if(pos >= 64)
509 if(pos > 8192)
510 pos = 8192;
511 ui->periodSizeSlider->setSliderPosition(pos);
515 void MainWindow::updatePeriodCountEdit(int count)
517 ui->periodCountEdit->clear();
518 if(count >= 2)
519 ui->periodCountEdit->insert(QString::number(count));
522 void MainWindow::updatePeriodCountSlider()
524 int pos = ui->periodCountEdit->text().toInt();
525 if(pos < 2)
526 pos = 0;
527 else if(pos > 16)
528 pos = 16;
529 ui->periodCountSlider->setSliderPosition(pos);
533 void MainWindow::addHrtfFile()
535 const QStringList datapaths = getAllDataPaths("/openal/hrtf");
536 QStringList fnames = QFileDialog::getOpenFileNames(this, tr("Select Files"),
537 datapaths.empty() ? QString() : datapaths[0],
538 "HRTF Datasets(*.mhr);;All Files(*.*)");
539 if(fnames.isEmpty() == false)
541 for(QStringList::iterator iter = fnames.begin();iter != fnames.end();iter++)
543 QStringList::const_iterator path = datapaths.constBegin();
544 for(;path != datapaths.constEnd();path++)
546 QDir hrtfdir(*path);
547 if(!hrtfdir.isAbsolute())
548 continue;
550 const QString relname = hrtfdir.relativeFilePath(*iter);
551 if(!relname.startsWith(".."))
553 // If filename is within this path, use the relative pathname
554 ui->hrtfFileList->addItem(relname);
555 break;
558 if(path == datapaths.constEnd())
560 // Filename is not within any data path, use the absolute pathname
561 ui->hrtfFileList->addItem(*iter);
567 void MainWindow::removeHrtfFile()
569 QList<QListWidgetItem*> selected = ui->hrtfFileList->selectedItems();
570 foreach(QListWidgetItem *item, selected)
571 delete item;
574 void MainWindow::updateHrtfRemoveButton()
576 ui->hrtfRemoveButton->setEnabled(ui->hrtfFileList->selectedItems().size() != 0);
579 void MainWindow::showEnabledBackendMenu(QPoint pt)
581 QMap<QAction*,QString> actionMap;
583 pt = ui->enabledBackendList->mapToGlobal(pt);
585 QMenu ctxmenu;
586 QAction *removeAction = ctxmenu.addAction(QIcon::fromTheme("list-remove"), "Remove");
587 if(ui->enabledBackendList->selectedItems().size() == 0)
588 removeAction->setEnabled(false);
589 ctxmenu.addSeparator();
590 for(size_t i = 0;backendMenuList[i].backend_name[0];i++)
592 QAction *action = ctxmenu.addAction(backendMenuList[i].menu_string);
593 actionMap[action] = backendMenuList[i].backend_name;
594 if(ui->enabledBackendList->findItems(backendMenuList[i].backend_name, Qt::MatchFixedString).size() != 0 ||
595 ui->disabledBackendList->findItems(backendMenuList[i].backend_name, Qt::MatchFixedString).size() != 0)
596 action->setEnabled(false);
599 QAction *gotAction = ctxmenu.exec(pt);
600 if(gotAction == removeAction)
602 QList<QListWidgetItem*> selected = ui->enabledBackendList->selectedItems();
603 foreach(QListWidgetItem *item, selected)
604 delete item;
606 else if(gotAction != NULL)
608 QMap<QAction*,QString>::const_iterator iter = actionMap.find(gotAction);
609 if(iter != actionMap.end())
610 ui->enabledBackendList->addItem(iter.value());
614 void MainWindow::showDisabledBackendMenu(QPoint pt)
616 QMap<QAction*,QString> actionMap;
618 pt = ui->disabledBackendList->mapToGlobal(pt);
620 QMenu ctxmenu;
621 QAction *removeAction = ctxmenu.addAction(QIcon::fromTheme("list-remove"), "Remove");
622 if(ui->disabledBackendList->selectedItems().size() == 0)
623 removeAction->setEnabled(false);
624 ctxmenu.addSeparator();
625 for(size_t i = 0;backendMenuList[i].backend_name[0];i++)
627 QAction *action = ctxmenu.addAction(backendMenuList[i].menu_string);
628 actionMap[action] = backendMenuList[i].backend_name;
629 if(ui->disabledBackendList->findItems(backendMenuList[i].backend_name, Qt::MatchFixedString).size() != 0 ||
630 ui->enabledBackendList->findItems(backendMenuList[i].backend_name, Qt::MatchFixedString).size() != 0)
631 action->setEnabled(false);
634 QAction *gotAction = ctxmenu.exec(pt);
635 if(gotAction == removeAction)
637 QList<QListWidgetItem*> selected = ui->disabledBackendList->selectedItems();
638 foreach(QListWidgetItem *item, selected)
639 delete item;
641 else if(gotAction != NULL)
643 QMap<QAction*,QString>::const_iterator iter = actionMap.find(gotAction);
644 if(iter != actionMap.end())
645 ui->disabledBackendList->addItem(iter.value());
649 void MainWindow::updateReverbBoostEdit(int value)
651 ui->reverbBoostEdit->clear();
652 if(value != 0)
653 ui->reverbBoostEdit->insert(QString::number(value/10.0, 'f', 1));
656 void MainWindow::updateReverbBoostSlider(QString value)
658 int pos = int(value.toFloat()*10.0f);
659 ui->reverbBoostSlider->setSliderPosition(pos);