--- qsampler/trunk/src/qsamplerDeviceForm.ui.h 2005/03/09 16:44:04 433 +++ qsampler/trunk/src/qsamplerDeviceForm.ui.h 2005/03/10 15:48:38 442 @@ -37,12 +37,14 @@ m_pMainForm = (qsamplerMainForm *) QWidget::parentWidget(); m_pClient = NULL; m_iDirtySetup = 0; - m_iDirtyCount = 0; m_bNewDevice = false; + m_deviceType = qsamplerDevice::None; + m_pAudioItems = NULL; + m_pMidiItems = NULL; // This an outsider (from designer), but rather important. QObject::connect(DeviceParamTable, SIGNAL(valueChanged(int,int)), - this, SLOT(changeValue(int,int))); + this, SLOT(changeValue(int,int))); // Try to restore normal window positioning. adjustSize(); @@ -95,11 +97,6 @@ // Create a new device from current table view. void qsamplerDeviceForm::createDevice (void) { - // - // TODO: Create a new device from current table view... - // - m_pMainForm->appendMessages("qsamplerDeviceForm::createDevice()"); - QListViewItem *pItem = DeviceListView->selectedItem(); if (pItem == NULL || pItem->rtti() != QSAMPLER_DEVICE_ITEM) return; @@ -109,39 +106,50 @@ // Build the parameter list... qsamplerDeviceParamMap& params = device.params(); lscp_param_t *pParams = new lscp_param_t [params.count() + 1]; - int i = 0; + int iParam = 0; qsamplerDeviceParamMap::ConstIterator iter; for (iter = params.begin(); iter != params.end(); ++iter) { - pParams[i].key = (char *) iter.key().latin1(); - pParams[i].value = (char *) iter.data().value.latin1(); + pParams[iParam].key = (char *) iter.key().latin1(); + pParams[iParam].value = (char *) iter.data().value.latin1(); + ++iParam; } // Null terminated. - pParams[i].key = NULL; - pParams[i].value = NULL; + pParams[iParam].key = NULL; + pParams[iParam].value = NULL; // Now it depends on the device type... + qsamplerDeviceItem *pRootItem = NULL; int iDeviceID = -1; switch (device.deviceType()) { case qsamplerDevice::Audio: - if ((iDeviceID = ::lscp_create_audio_device(m_pClient, + pRootItem = m_pAudioItems; + if ((iDeviceID = ::lscp_create_audio_device(m_pClient, device.driverName().latin1(), pParams)) < 0) m_pMainForm->appendMessagesClient("lscp_create_audio_device"); break; case qsamplerDevice::Midi: - if ((iDeviceID = ::lscp_create_midi_device(m_pClient, + pRootItem = m_pMidiItems; + if ((iDeviceID = ::lscp_create_midi_device(m_pClient, device.driverName().latin1(), pParams)) < 0) m_pMainForm->appendMessagesClient("lscp_create_midi_device"); break; + case qsamplerDevice::None: + break; } // Free used parameter array. - delete [] pParams; + delete pParams; - // Show result. + // We're on to create the new device item. if (iDeviceID >= 0) { - m_pMainForm->appendMessages(device.deviceName() + ' ' + tr("created.")); + // Append the new device item. + qsamplerDeviceItem *pDeviceItem = new qsamplerDeviceItem(pRootItem, + m_pClient, device.deviceType(), iDeviceID); + // Just make it the new selection... + DeviceListView->setSelected(pDeviceItem, true); // Done. - refreshDevices(); + m_pMainForm->appendMessages(pDeviceItem->device().deviceName() + ' ' + + tr("created.")); // Main session should be marked dirty. m_pMainForm->sessionDirty(); } @@ -151,37 +159,49 @@ // Delete current device in table view. void qsamplerDeviceForm::deleteDevice (void) { - // - // TODO: Delete current device in table view... - // - m_pMainForm->appendMessages("qsamplerDeviceForm::deleteDevice()"); - QListViewItem *pItem = DeviceListView->selectedItem(); if (pItem == NULL || pItem->rtti() != QSAMPLER_DEVICE_ITEM) return; qsamplerDevice& device = ((qsamplerDeviceItem *) pItem)->device(); + // Prompt user if this is for real... + qsamplerOptions *pOptions = m_pMainForm->options(); + if (pOptions && pOptions->bConfirmRemove) { + if (QMessageBox::warning(this, tr("Warning"), + tr("Delete %1 device:\n\n" + "%2\n\n" + "Are you sure?") + .arg(device.deviceTypeName()) + .arg(device.deviceName()), + tr("OK"), tr("Cancel")) > 0) + return; + } + // Now it depends on the device type... lscp_status_t ret = LSCP_FAILED; switch (device.deviceType()) { case qsamplerDevice::Audio: - if ((ret = ::lscp_destroy_audio_device(m_pClient, + if ((ret = ::lscp_destroy_audio_device(m_pClient, device.deviceID())) != LSCP_OK) m_pMainForm->appendMessagesClient("lscp_destroy_audio_device"); break; case qsamplerDevice::Midi: - if ((ret = ::lscp_destroy_midi_device(m_pClient, + if ((ret = ::lscp_destroy_midi_device(m_pClient, device.deviceID())) != LSCP_OK) m_pMainForm->appendMessagesClient("lscp_destroy_midi_device"); break; + case qsamplerDevice::None: + break; } // Show result. if (ret == LSCP_OK) { - m_pMainForm->appendMessages(device.deviceName() + ' ' + tr("deleted.")); + // Show log message before loosing it. + m_pMainForm->appendMessages(device.deviceName() + ' ' + + tr("deleted.")); // Done. - refreshDevices(); + delete pItem; // Main session should be marked dirty. m_pMainForm->sessionDirty(); } @@ -195,44 +215,42 @@ m_iDirtySetup++; // - // TODO: Load device configuration data ... + // (Re)Load complete device configuration data ... // - m_pMainForm->appendMessages("qsamplerDeviceForm::refreshDevices()"); - + m_pAudioItems = NULL; + m_pMidiItems = NULL; DeviceListView->clear(); if (m_pClient) { - qsamplerDeviceItem *pItem; int *piDeviceIDs; // Grab and pop Audio devices... - pItem = new qsamplerDeviceItem(DeviceListView, m_pClient, + m_pAudioItems = new qsamplerDeviceItem(DeviceListView, m_pClient, qsamplerDevice::Audio); - if (pItem) { - pItem->setText(0, tr("Audio")); + if (m_pAudioItems) { + m_pAudioItems->setText(0, tr("Audio")); piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio); for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) { - new qsamplerDeviceItem(pItem, m_pClient, + new qsamplerDeviceItem(m_pAudioItems, m_pClient, qsamplerDevice::Audio, piDeviceIDs[i]); } - pItem->setOpen(true); + m_pAudioItems->setOpen(true); } // Grab and pop MIDI devices... - pItem = new qsamplerDeviceItem(DeviceListView, m_pClient, + m_pMidiItems = new qsamplerDeviceItem(DeviceListView, m_pClient, qsamplerDevice::Midi); - if (pItem) { - pItem->setText(0, tr("MIDI")); + if (m_pMidiItems) { + m_pMidiItems->setText(0, tr("MIDI")); piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi); for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) { - new qsamplerDeviceItem(pItem, m_pClient, + new qsamplerDeviceItem(m_pMidiItems, m_pClient, qsamplerDevice::Midi, piDeviceIDs[i]); } - pItem->setOpen(true); + m_pMidiItems->setOpen(true); } } // Done. - m_iDirtyCount = 0; m_iDirtySetup--; - + // Show something. selectDevice(); } @@ -242,25 +260,27 @@ void qsamplerDeviceForm::selectDriver ( const QString& sDriverName ) { if (m_iDirtySetup > 0) - return; + return; // - // TODO: Driver name has changed for a new device... + // Driver name has changed for a new device... // - m_pMainForm->appendMessages("qsamplerDeviceForm::selectDriver()"); QListViewItem *pItem = DeviceListView->selectedItem(); if (pItem == NULL || pItem->rtti() != QSAMPLER_DEVICE_ITEM) return; qsamplerDevice& device = ((qsamplerDeviceItem *) pItem)->device(); + + // Driver change is only valid for scratch devices... if (m_bNewDevice) { + m_iDirtySetup++; device.setDriver(m_pClient, sDriverName); - m_iDirtyCount++; + DeviceParamTable->refresh(device); + m_iDirtySetup--; + // Done. + stabilizeForm(); } - - // Done. - stabilizeForm(); } @@ -268,44 +288,49 @@ void qsamplerDeviceForm::selectDevice (void) { if (m_iDirtySetup > 0) - return; + return; // - // TODO: Device selection has changed... + // Device selection has changed... // - m_pMainForm->appendMessages("qsamplerDeviceForm::selectDevice()"); QListViewItem *pItem = DeviceListView->selectedItem(); if (pItem == NULL || pItem->rtti() != QSAMPLER_DEVICE_ITEM) { - DeviceNameTextLabel->setText(QString::null); - DeviceParamTable->setNumRows(0); + m_deviceType = qsamplerDevice::None; + DeviceNameTextLabel->setText(QString::null); + DeviceParamTable->setNumRows(0); stabilizeForm(); return; } + m_iDirtySetup++; qsamplerDevice& device = ((qsamplerDeviceItem *) pItem)->device(); + + // Flag whether this is a new device. m_bNewDevice = (device.deviceID() < 0); // Fill the device/driver heading... DeviceNameTextLabel->setText(device.deviceTypeName() + ' ' + device.deviceName()); - DriverNameComboBox->clear(); - DriverNameComboBox->insertStringList( - qsamplerDevice::getDrivers(m_pClient, device.deviceType())); - const QString& sDriverName = device.driverName(); - if (m_bNewDevice || sDriverName.isEmpty()) { - device.setDriver(m_pClient, DriverNameComboBox->currentText()); - } else { - if (DriverNameComboBox->listBox()->findItem(sDriverName, Qt::ExactMatch) == NULL) - DriverNameComboBox->insertItem(sDriverName); - DriverNameComboBox->setCurrentText(sDriverName); + // The driver combobox is only rebuilt if device type has changed... + if (device.deviceType() != m_deviceType) { + DriverNameComboBox->clear(); + DriverNameComboBox->insertStringList( + qsamplerDevice::getDrivers(m_pClient, device.deviceType())); + m_deviceType = device.deviceType(); } + // Do we need a driver name? + if (m_bNewDevice || device.driverName().isEmpty()) + device.setDriver(m_pClient, DriverNameComboBox->currentText()); + const QString& sDriverName = device.driverName(); + if (DriverNameComboBox->listBox()->findItem(sDriverName, Qt::ExactMatch) == NULL) + DriverNameComboBox->insertItem(sDriverName); + DriverNameComboBox->setCurrentText(sDriverName); DriverNameTextLabel->setEnabled(m_bNewDevice); DriverNameComboBox->setEnabled(m_bNewDevice); - // Fill the device parameter table... DeviceParamTable->refresh(device); - // Done. + m_iDirtySetup--; stabilizeForm(); } @@ -313,20 +338,25 @@ // parameter value change slot. void qsamplerDeviceForm::changeValue ( int iRow, int iCol ) { + if (m_iDirtySetup > 0) + return; + if (iRow < 0 || iCol < 0) + return; + // - // TODO: Device parameter change... + // Device parameter change... // - m_pMainForm->appendMessages("qsamplerDeviceForm::changeValue()"); - + QListViewItem *pItem = DeviceListView->selectedItem(); if (pItem == NULL || pItem->rtti() != QSAMPLER_DEVICE_ITEM) return; + m_iDirtySetup++; qsamplerDevice& device = ((qsamplerDeviceItem *) pItem)->device(); - // Table 3rd column has the parameter name; + // Table 1st column has the parameter name; qsamplerDeviceParamMap& params = device.params(); - const QString sParam = DeviceParamTable->text(iRow, 2); + const QString sParam = DeviceParamTable->text(iRow, 0); const QString sValue = DeviceParamTable->text(iRow, iCol); params[sParam].value = sValue; @@ -340,25 +370,27 @@ lscp_status_t ret = LSCP_FAILED; switch (device.deviceType()) { case qsamplerDevice::Audio: - if ((ret = ::lscp_set_audio_device_param(m_pClient, + if ((ret = ::lscp_set_audio_device_param(m_pClient, device.deviceID(), ¶m)) != LSCP_OK) m_pMainForm->appendMessagesClient("lscp_set_audio_device_param"); break; case qsamplerDevice::Midi: - if ((ret = ::lscp_set_midi_device_param(m_pClient, + if ((ret = ::lscp_set_midi_device_param(m_pClient, device.deviceID(), ¶m)) != LSCP_OK) m_pMainForm->appendMessagesClient("lscp_set_midi_device_param"); break; + case qsamplerDevice::None: + break; } // Show result. if (ret == LSCP_OK) { - m_pMainForm->appendMessages(device.deviceName() + ' ' + - QString("%1: %2.").arg(sParam).arg(sValue)); + m_pMainForm->appendMessages(device.deviceName() + ' ' + + QString("%1: %2.").arg(sParam).arg(sValue)); } } - + // Done. - m_iDirtyCount++; + m_iDirtySetup--; stabilizeForm(); // Main session should be dirtier... m_pMainForm->sessionDirty(); @@ -380,4 +412,3 @@ // end of qsamplerDeviceForm.ui.h -