--- qsampler/trunk/src/qsamplerOptionsForm.cpp 2007/11/22 11:10:44 1509 +++ qsampler/trunk/src/qsamplerOptionsForm.cpp 2019/08/13 10:19:32 3555 @@ -1,7 +1,7 @@ // qsamplerOptionsForm.cpp // /**************************************************************************** - Copyright (C) 2004-2007, rncbc aka Rui Nuno Capela. All rights reserved. + Copyright (C) 2004-2019, rncbc aka Rui Nuno Capela. All rights reserved. Copyright (C) 2007, Christian Schoenebeck This program is free software; you can redistribute it and/or @@ -27,17 +27,22 @@ #include #include +#include namespace QSampler { +//------------------------------------------------------------------------- +// QSampler::OptionsForm -- Options form implementation. +// + OptionsForm::OptionsForm ( QWidget* pParent ) : QDialog(pParent) { m_ui.setupUi(this); // No settings descriptor initially (the caller will set it). - m_pOptions = NULL; + m_pOptions = nullptr; // Initialize dirty control state. m_iDirtySetup = 0; @@ -68,6 +73,15 @@ QObject::connect(m_ui.StartDelaySpinBox, SIGNAL(valueChanged(int)), SLOT(optionsChanged())); + QObject::connect(m_ui.MessagesLogCheckBox, + SIGNAL(stateChanged(int)), + SLOT(optionsChanged())); + QObject::connect(m_ui.MessagesLogPathComboBox, + SIGNAL(editTextChanged(const QString&)), + SLOT(optionsChanged())); + QObject::connect(m_ui.MessagesLogPathToolButton, + SIGNAL(clicked()), + SLOT(browseMessagesLogPath())); QObject::connect(m_ui.DisplayFontPushButton, SIGNAL(clicked()), SLOT(chooseDisplayFont())); @@ -95,6 +109,15 @@ QObject::connect(m_ui.ConfirmRemoveCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); + QObject::connect(m_ui.ConfirmResetCheckBox, + SIGNAL(stateChanged(int)), + SLOT(optionsChanged())); + QObject::connect(m_ui.ConfirmRestartCheckBox, + SIGNAL(stateChanged(int)), + SLOT(optionsChanged())); + QObject::connect(m_ui.ConfirmErrorCheckBox, + SIGNAL(stateChanged(int)), + SLOT(optionsChanged())); QObject::connect(m_ui.KeepOnTopCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); @@ -110,11 +133,20 @@ QObject::connect(m_ui.InstrumentNamesCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); - QObject::connect(m_ui.OkPushButton, - SIGNAL(clicked()), + QObject::connect(m_ui.BaseFontSizeComboBox, + SIGNAL(editTextChanged(const QString&)), + SLOT(optionsChanged())); + QObject::connect(m_ui.MaxVoicesSpinBox, + SIGNAL(valueChanged(int)), + SLOT(maxVoicesChanged(int))); + QObject::connect(m_ui.MaxStreamsSpinBox, + SIGNAL(valueChanged(int)), + SLOT(maxStreamsChanged(int))); + QObject::connect(m_ui.DialogButtonBox, + SIGNAL(accepted()), SLOT(accept())); - QObject::connect(m_ui.CancelPushButton, - SIGNAL(clicked()), + QObject::connect(m_ui.DialogButtonBox, + SIGNAL(rejected()), SLOT(reject())); } @@ -123,7 +155,7 @@ } // Populate (setup) dialog controls from settings descriptors. -void OptionsForm::setup ( qsamplerOptions *pOptions ) +void OptionsForm::setup ( Options *pOptions ) { // Set reference descriptor. m_pOptions = pOptions; @@ -137,6 +169,7 @@ m_pOptions->loadComboBoxHistory(m_ui.ServerHostComboBox); m_pOptions->loadComboBoxHistory(m_ui.ServerPortComboBox); m_pOptions->loadComboBoxHistory(m_ui.ServerCmdLineComboBox); + m_pOptions->loadComboBoxHistory(m_ui.MessagesLogPathComboBox); // Load Server settings... m_ui.ServerHostComboBox->setEditText(m_pOptions->sServerHost); @@ -146,6 +179,10 @@ m_ui.ServerCmdLineComboBox->setEditText(m_pOptions->sServerCmdLine); m_ui.StartDelaySpinBox->setValue(m_pOptions->iStartDelay); + // Logging options... + m_ui.MessagesLogCheckBox->setChecked(m_pOptions->bMessagesLog); + m_ui.MessagesLogPathComboBox->setEditText(m_pOptions->sMessagesLogPath); + // Load Display options... QFont font; QPalette pal; @@ -170,9 +207,9 @@ // Messages font. if (m_pOptions->sMessagesFont.isEmpty() || !font.fromString(m_pOptions->sMessagesFont)) - font = QFont("Fixed", 8); + font = QFont("Monospace", 8); pal = m_ui.MessagesFontTextLabel->palette(); - pal.setColor(QPalette::Background, Qt::white); + pal.setColor(QPalette::Background, pal.base().color()); m_ui.MessagesFontTextLabel->setPalette(pal); m_ui.MessagesFontTextLabel->setFont(font); m_ui.MessagesFontTextLabel->setText(font.family() @@ -184,16 +221,66 @@ // Other options finally. m_ui.ConfirmRemoveCheckBox->setChecked(m_pOptions->bConfirmRemove); + m_ui.ConfirmRestartCheckBox->setChecked(m_pOptions->bConfirmRestart); + m_ui.ConfirmResetCheckBox->setChecked(m_pOptions->bConfirmReset); + m_ui.ConfirmErrorCheckBox->setChecked(m_pOptions->bConfirmError); m_ui.KeepOnTopCheckBox->setChecked(m_pOptions->bKeepOnTop); m_ui.StdoutCaptureCheckBox->setChecked(m_pOptions->bStdoutCapture); m_ui.CompletePathCheckBox->setChecked(m_pOptions->bCompletePath); m_ui.InstrumentNamesCheckBox->setChecked(m_pOptions->bInstrumentNames); m_ui.MaxRecentFilesSpinBox->setValue(m_pOptions->iMaxRecentFiles); + if (m_pOptions->iBaseFontSize > 0) + m_ui.BaseFontSizeComboBox->setEditText(QString::number(m_pOptions->iBaseFontSize)); + else + m_ui.BaseFontSizeComboBox->setCurrentIndex(0); #ifndef CONFIG_LIBGIG m_ui.InstrumentNamesCheckBox->setEnabled(false); #endif + bMaxVoicesModified = bMaxStreamsModified = false; +#ifdef CONFIG_MAX_VOICES + const bool bMaxVoicesSupported = + m_pOptions->getEffectiveMaxVoices() >= 0; + const bool bMaxStreamsSupported = + m_pOptions->getEffectiveMaxStreams() >= 0; + + m_ui.MaxVoicesSpinBox->setEnabled(bMaxVoicesSupported); + m_ui.MaxVoicesSpinBox->setValue(m_pOptions->getMaxVoices()); + if (!bMaxVoicesSupported) + m_ui.MaxVoicesSpinBox->setToolTip( + tr("This parameter is not supported by the current sampler " + "version in use.") + ); + else + m_ui.MaxVoicesSpinBox->setToolTip( + tr("The max. amount of voices the sampler shall process " + "simultaneously.") + ); + + m_ui.MaxStreamsSpinBox->setEnabled(bMaxStreamsSupported); + m_ui.MaxStreamsSpinBox->setValue(m_pOptions->getMaxStreams()); + if (!bMaxStreamsSupported) + m_ui.MaxStreamsSpinBox->setToolTip( + tr("This parameter is not supported by the current sampler " + "version in use.") + ); + else + m_ui.MaxStreamsSpinBox->setToolTip( + tr("The max. amount of disk streams the sampler shall process " + "simultaneously.") + ); +#else + m_ui.MaxVoicesSpinBox->setEnabled(false); + m_ui.MaxStreamsSpinBox->setEnabled(false); + m_ui.MaxVoicesSpinBox->setToolTip( + tr("QSampler was built without support for this parameter.") + ); + m_ui.MaxStreamsSpinBox->setToolTip( + tr("QSampler was built without support for this parameter.") + ); +#endif // CONFIG_MAX_VOICES + // Done. m_iDirtySetup--; stabilizeForm(); @@ -211,7 +298,10 @@ m_pOptions->iServerTimeout = m_ui.ServerTimeoutSpinBox->value(); m_pOptions->bServerStart = m_ui.ServerStartCheckBox->isChecked(); m_pOptions->sServerCmdLine = m_ui.ServerCmdLineComboBox->currentText().trimmed(); - m_pOptions->iStartDelay = m_ui.StartDelaySpinBox->value(); + m_pOptions->iStartDelay = m_ui.StartDelaySpinBox->value(); + // Logging options... + m_pOptions->bMessagesLog = m_ui.MessagesLogCheckBox->isChecked(); + m_pOptions->sMessagesLogPath = m_ui.MessagesLogPathComboBox->currentText(); // Channels options... m_pOptions->sDisplayFont = m_ui.DisplayFontTextLabel->font().toString(); m_pOptions->bDisplayEffect = m_ui.DisplayEffectCheckBox->isChecked(); @@ -224,19 +314,34 @@ m_pOptions->iMessagesLimitLines = m_ui.MessagesLimitLinesSpinBox->value(); // Other options... m_pOptions->bConfirmRemove = m_ui.ConfirmRemoveCheckBox->isChecked(); + m_pOptions->bConfirmRestart = m_ui.ConfirmRestartCheckBox->isChecked(); + m_pOptions->bConfirmReset = m_ui.ConfirmResetCheckBox->isChecked(); + m_pOptions->bConfirmError = m_ui.ConfirmErrorCheckBox->isChecked(); m_pOptions->bKeepOnTop = m_ui.KeepOnTopCheckBox->isChecked(); m_pOptions->bStdoutCapture = m_ui.StdoutCaptureCheckBox->isChecked(); m_pOptions->bCompletePath = m_ui.CompletePathCheckBox->isChecked(); m_pOptions->bInstrumentNames = m_ui.InstrumentNamesCheckBox->isChecked(); m_pOptions->iMaxRecentFiles = m_ui.MaxRecentFilesSpinBox->value(); + m_pOptions->iBaseFontSize = m_ui.BaseFontSizeComboBox->currentText().toInt(); // Reset dirty flag. m_iDirtyCount = 0; } + // if the user modified the limits, apply them to the sampler + // (and store it later in qsampler's configuration) + if (bMaxVoicesModified && m_ui.MaxVoicesSpinBox->isEnabled()) + m_pOptions->setMaxVoices(m_ui.MaxVoicesSpinBox->value()); + if (bMaxStreamsModified && m_ui.MaxStreamsSpinBox->isEnabled()) + m_pOptions->setMaxStreams(m_ui.MaxStreamsSpinBox->value()); + // Save combobox history... m_pOptions->saveComboBoxHistory(m_ui.ServerHostComboBox); m_pOptions->saveComboBoxHistory(m_ui.ServerPortComboBox); m_pOptions->saveComboBoxHistory(m_ui.ServerCmdLineComboBox); + m_pOptions->saveComboBoxHistory(m_ui.MessagesLogPathComboBox); + + // Save/commit to disk. + m_pOptions->saveOptions(); // Just go with dialog acceptance. QDialog::accept(); @@ -254,11 +359,13 @@ QSAMPLER_TITLE ": " + tr("Warning"), tr("Some settings have been changed.\n\n" "Do you want to apply the changes?"), - tr("Apply"), tr("Discard"), tr("Cancel"))) { - case 0: // Apply... + QMessageBox::Apply | + QMessageBox::Discard | + QMessageBox::Cancel)) { + case QMessageBox::Apply: accept(); return; - case 1: // Discard + case QMessageBox::Discard: break; default: // Cancel. bReject = false; @@ -284,18 +391,46 @@ // Stabilize current form state. void OptionsForm::stabilizeForm (void) { + bool bValid = (m_iDirtyCount > 0); + bool bEnabled = m_ui.ServerStartCheckBox->isChecked(); m_ui.ServerCmdLineTextLabel->setEnabled(bEnabled); m_ui.ServerCmdLineComboBox->setEnabled(bEnabled); m_ui.StartDelayTextLabel->setEnabled(bEnabled); m_ui.StartDelaySpinBox->setEnabled(bEnabled); + bEnabled = m_ui.MessagesLogCheckBox->isChecked(); + m_ui.MessagesLogPathComboBox->setEnabled(bEnabled); + m_ui.MessagesLogPathToolButton->setEnabled(bEnabled); + if (bEnabled && bValid) { + const QString& sPath = m_ui.MessagesLogPathComboBox->currentText(); + bValid = !sPath.isEmpty(); + } + m_ui.AutoRefreshTimeSpinBox->setEnabled( m_ui.AutoRefreshCheckBox->isChecked()); m_ui.MessagesLimitLinesSpinBox->setEnabled( m_ui.MessagesLimitCheckBox->isChecked()); - m_ui.OkPushButton->setEnabled(m_iDirtyCount > 0); + m_ui.DialogButtonBox->button(QDialogButtonBox::Ok)->setEnabled(bValid); +} + + +// Messages log path browse slot. +void OptionsForm::browseMessagesLogPath (void) +{ + QString sFileName = QFileDialog::getSaveFileName( + this, // Parent. + tr("Messages Log"), // Caption. + m_ui.MessagesLogPathComboBox->currentText(), // Start here. + tr("Log files") + " (*.log)" // Filter (log files) + ); + + if (!sFileName.isEmpty()) { + m_ui.MessagesLogPathComboBox->setEditText(sFileName); + m_ui.MessagesLogPathComboBox->setFocus(); + optionsChanged(); + } } @@ -335,7 +470,7 @@ QPalette pal; pal.setColor(QPalette::Foreground, Qt::green); if (bOn) { - QPixmap pm(":/icons/displaybg1.png"); + QPixmap pm(":/images/displaybg1.png"); pal.setBrush(QPalette::Background, QBrush(pm)); } else { pal.setColor(QPalette::Background, Qt::black); @@ -345,7 +480,18 @@ optionsChanged(); } -} // namespace QSampler +void OptionsForm::maxVoicesChanged(int /*iMaxVoices*/) +{ + bMaxVoicesModified = true; + optionsChanged(); +} +void OptionsForm::maxStreamsChanged(int /*iMaxStreams*/) +{ + bMaxStreamsModified = true; + optionsChanged(); +} + +} // namespace QSampler // end of qsamplerOptionsForm.cpp