/[svn]/qsampler/trunk/src/qsamplerDeviceForm.ui.h
ViewVC logotype

Contents of /qsampler/trunk/src/qsamplerDeviceForm.ui.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 462 - (show annotations) (download) (as text)
Tue Mar 15 11:39:12 2005 UTC (14 years, 11 months ago) by capela
File MIME type: text/x-c++hdr
File size: 13079 byte(s)
Device port/channel configuration preparations.

1 // qsamplerDeviceForm.ui.h
2 //
3 // ui.h extension file, included from the uic-generated form implementation.
4 /****************************************************************************
5 Copyright (C) 2005, rncbc aka Rui Nuno Capela. All rights reserved.
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
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20
21 *****************************************************************************/
22
23 #include <qmessagebox.h>
24 #include <qfiledialog.h>
25 #include <qfileinfo.h>
26 #include <qlistbox.h>
27 #include <qpopupmenu.h>
28
29 #include "qsamplerMainForm.h"
30
31 #include "config.h"
32
33
34 // Kind of constructor.
35 void qsamplerDeviceForm::init (void)
36 {
37 // Initialize locals.
38 m_pMainForm = (qsamplerMainForm *) QWidget::parentWidget();
39 m_pClient = NULL;
40 m_iDirtySetup = 0;
41 m_bNewDevice = false;
42 m_deviceType = qsamplerDevice::None;
43 m_pAudioItems = NULL;
44 m_pMidiItems = NULL;
45
46 // This an outsider (from designer), but rather important.
47 QObject::connect(DeviceParamTable, SIGNAL(valueChanged(int,int)),
48 this, SLOT(changeValue(int,int)));
49
50 // Try to restore normal window positioning.
51 adjustSize();
52 }
53
54
55 // Kind of destructor.
56 void qsamplerDeviceForm::destroy (void)
57 {
58 }
59
60
61 // Notify our parent that we're emerging.
62 void qsamplerDeviceForm::showEvent ( QShowEvent *pShowEvent )
63 {
64 if (m_pMainForm)
65 m_pMainForm->stabilizeForm();
66
67 stabilizeForm();
68
69 QWidget::showEvent(pShowEvent);
70 }
71
72
73 // Notify our parent that we're closing.
74 void qsamplerDeviceForm::hideEvent ( QHideEvent *pHideEvent )
75 {
76 QWidget::hideEvent(pHideEvent);
77
78 if (m_pMainForm)
79 m_pMainForm->stabilizeForm();
80 }
81
82
83 // Device configuration dialog setup formal initializer.
84 void qsamplerDeviceForm::setClient ( lscp_client_t *pClient )
85 {
86 // If it has not changed, do nothing.
87 if (m_pClient && m_pClient == pClient)
88 return;
89
90 // Set new reference.
91 m_pClient = pClient;
92
93 // OK. Do a whole refresh around.
94 refreshDevices();
95 }
96
97
98 // Create a new device from current table view.
99 void qsamplerDeviceForm::createDevice (void)
100 {
101 QListViewItem *pItem = DeviceListView->selectedItem();
102 if (pItem == NULL || pItem->rtti() != QSAMPLER_DEVICE_ITEM)
103 return;
104
105 const qsamplerDevice& device = ((qsamplerDeviceItem *) pItem)->device();
106
107 // Build the parameter list...
108 const qsamplerDeviceParamMap& params = device.params();
109 lscp_param_t *pParams = new lscp_param_t [params.count() + 1];
110 int iParam = 0;
111 qsamplerDeviceParamMap::ConstIterator iter;
112 for (iter = params.begin(); iter != params.end(); ++iter) {
113 pParams[iParam].key = (char *) iter.key().latin1();
114 pParams[iParam].value = (char *) iter.data().value.latin1();
115 ++iParam;
116 }
117 // Null terminated.
118 pParams[iParam].key = NULL;
119 pParams[iParam].value = NULL;
120
121 // Now it depends on the device type...
122 qsamplerDeviceItem *pRootItem = NULL;
123 int iDeviceID = -1;
124 switch (device.deviceType()) {
125 case qsamplerDevice::Audio:
126 pRootItem = m_pAudioItems;
127 if ((iDeviceID = ::lscp_create_audio_device(m_pClient,
128 device.driverName().latin1(), pParams)) < 0)
129 m_pMainForm->appendMessagesClient("lscp_create_audio_device");
130 break;
131 case qsamplerDevice::Midi:
132 pRootItem = m_pMidiItems;
133 if ((iDeviceID = ::lscp_create_midi_device(m_pClient,
134 device.driverName().latin1(), pParams)) < 0)
135 m_pMainForm->appendMessagesClient("lscp_create_midi_device");
136 break;
137 case qsamplerDevice::None:
138 break;
139 }
140
141 // Free used parameter array.
142 delete pParams;
143
144 // We're on to create the new device item.
145 if (iDeviceID >= 0) {
146 // Append the new device item.
147 qsamplerDeviceItem *pDeviceItem = new qsamplerDeviceItem(pRootItem,
148 m_pClient, device.deviceType(), iDeviceID);
149 // Just make it the new selection...
150 DeviceListView->setSelected(pDeviceItem, true);
151 // Done.
152 m_pMainForm->appendMessages(pDeviceItem->device().deviceName() + ' '
153 + tr("created."));
154 // Main session should be marked dirty.
155 m_pMainForm->sessionDirty();
156 }
157 }
158
159
160 // Delete current device in table view.
161 void qsamplerDeviceForm::deleteDevice (void)
162 {
163 QListViewItem *pItem = DeviceListView->selectedItem();
164 if (pItem == NULL || pItem->rtti() != QSAMPLER_DEVICE_ITEM)
165 return;
166
167 const qsamplerDevice& device = ((qsamplerDeviceItem *) pItem)->device();
168
169 // Prompt user if this is for real...
170 qsamplerOptions *pOptions = m_pMainForm->options();
171 if (pOptions && pOptions->bConfirmRemove) {
172 if (QMessageBox::warning(this, tr("Warning"),
173 tr("Delete %1 device:\n\n"
174 "%2\n\n"
175 "Are you sure?")
176 .arg(device.deviceTypeName())
177 .arg(device.deviceName()),
178 tr("OK"), tr("Cancel")) > 0)
179 return;
180 }
181
182 // Now it depends on the device type...
183 lscp_status_t ret = LSCP_FAILED;
184 switch (device.deviceType()) {
185 case qsamplerDevice::Audio:
186 if ((ret = ::lscp_destroy_audio_device(m_pClient,
187 device.deviceID())) != LSCP_OK)
188 m_pMainForm->appendMessagesClient("lscp_destroy_audio_device");
189 break;
190 case qsamplerDevice::Midi:
191 if ((ret = ::lscp_destroy_midi_device(m_pClient,
192 device.deviceID())) != LSCP_OK)
193 m_pMainForm->appendMessagesClient("lscp_destroy_midi_device");
194 break;
195 case qsamplerDevice::None:
196 break;
197 }
198
199 // Show result.
200 if (ret == LSCP_OK) {
201 // Show log message before loosing it.
202 m_pMainForm->appendMessages(device.deviceName() + ' '
203 + tr("deleted."));
204 // Done.
205 delete pItem;
206 // Main session should be marked dirty.
207 m_pMainForm->sessionDirty();
208 }
209 }
210
211
212 // Refresh all device list and views.
213 void qsamplerDeviceForm::refreshDevices (void)
214 {
215 // Avoid nested changes.
216 m_iDirtySetup++;
217
218 //
219 // (Re)Load complete device configuration data ...
220 //
221 m_pAudioItems = NULL;
222 m_pMidiItems = NULL;
223 DeviceListView->clear();
224 if (m_pClient) {
225 int *piDeviceIDs;
226 // Grab and pop Audio devices...
227 m_pAudioItems = new qsamplerDeviceItem(DeviceListView, m_pClient,
228 qsamplerDevice::Audio);
229 if (m_pAudioItems) {
230 m_pAudioItems->setText(0, tr("Audio"));
231 piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Audio);
232 for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) {
233 new qsamplerDeviceItem(m_pAudioItems, m_pClient,
234 qsamplerDevice::Audio, piDeviceIDs[i]);
235 }
236 m_pAudioItems->setOpen(true);
237 }
238 // Grab and pop MIDI devices...
239 m_pMidiItems = new qsamplerDeviceItem(DeviceListView, m_pClient,
240 qsamplerDevice::Midi);
241 if (m_pMidiItems) {
242 m_pMidiItems->setText(0, tr("MIDI"));
243 piDeviceIDs = qsamplerDevice::getDevices(m_pClient, qsamplerDevice::Midi);
244 for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) {
245 new qsamplerDeviceItem(m_pMidiItems, m_pClient,
246 qsamplerDevice::Midi, piDeviceIDs[i]);
247 }
248 m_pMidiItems->setOpen(true);
249 }
250 }
251
252 // Done.
253 m_iDirtySetup--;
254
255 // Show something.
256 selectDevice();
257 }
258
259
260 // Driver selection slot.
261 void qsamplerDeviceForm::selectDriver ( const QString& sDriverName )
262 {
263 if (m_iDirtySetup > 0)
264 return;
265
266 //
267 // Driver name has changed for a new device...
268 //
269
270 QListViewItem *pItem = DeviceListView->selectedItem();
271 if (pItem == NULL || pItem->rtti() != QSAMPLER_DEVICE_ITEM)
272 return;
273
274 qsamplerDevice& device = ((qsamplerDeviceItem *) pItem)->device();
275
276 // Driver change is only valid for scratch devices...
277 if (m_bNewDevice) {
278 m_iDirtySetup++;
279 device.setDriver(m_pClient, sDriverName);
280 DeviceParamTable->refresh(device.params(), m_bNewDevice);
281 m_iDirtySetup--;
282 // Done.
283 stabilizeForm();
284 }
285 }
286
287
288 // Device selection slot.
289 void qsamplerDeviceForm::selectDevice (void)
290 {
291 if (m_iDirtySetup > 0)
292 return;
293
294 //
295 // Device selection has changed...
296 //
297
298 QListViewItem *pItem = DeviceListView->selectedItem();
299 if (pItem == NULL || pItem->rtti() != QSAMPLER_DEVICE_ITEM) {
300 m_deviceType = qsamplerDevice::None;
301 DeviceNameTextLabel->setText(QString::null);
302 DeviceParamTable->setNumRows(0);
303 stabilizeForm();
304 return;
305 }
306
307 m_iDirtySetup++;
308 qsamplerDevice& device = ((qsamplerDeviceItem *) pItem)->device();
309
310 // Flag whether this is a new device.
311 m_bNewDevice = (device.deviceID() < 0);
312
313 // Fill the device/driver heading...
314 QString sPrefix;
315 if (!m_bNewDevice)
316 sPrefix += device.deviceTypeName() + ' ';
317 DeviceNameTextLabel->setText(sPrefix + device.deviceName());
318 // The driver combobox is only rebuilt if device type has changed...
319 if (device.deviceType() != m_deviceType) {
320 DriverNameComboBox->clear();
321 DriverNameComboBox->insertStringList(
322 qsamplerDevice::getDrivers(m_pClient, device.deviceType()));
323 m_deviceType = device.deviceType();
324 }
325 // Do we need a driver name?
326 if (m_bNewDevice || device.driverName().isEmpty())
327 device.setDriver(m_pClient, DriverNameComboBox->currentText());
328 const QString& sDriverName = device.driverName();
329 if (DriverNameComboBox->listBox()->findItem(sDriverName, Qt::ExactMatch) == NULL)
330 DriverNameComboBox->insertItem(sDriverName);
331 DriverNameComboBox->setCurrentText(sDriverName);
332 DriverNameTextLabel->setEnabled(m_bNewDevice);
333 DriverNameComboBox->setEnabled(m_bNewDevice);
334 // Fill the device parameter table...
335 DeviceParamTable->refresh(device.params(), m_bNewDevice);
336 // Done.
337 m_iDirtySetup--;
338 stabilizeForm();
339 }
340
341
342 // parameter value change slot.
343 void qsamplerDeviceForm::changeValue ( int iRow, int iCol )
344 {
345 if (m_iDirtySetup > 0)
346 return;
347 if (iRow < 0 || iCol < 0)
348 return;
349
350 //
351 // Device parameter change...
352 //
353
354 QListViewItem *pItem = DeviceListView->selectedItem();
355 if (pItem == NULL || pItem->rtti() != QSAMPLER_DEVICE_ITEM)
356 return;
357
358 m_iDirtySetup++;
359 qsamplerDevice& device = ((qsamplerDeviceItem *) pItem)->device();
360
361 // Table 1st column has the parameter name;
362 const qsamplerDeviceParamMap& params = device.params();
363 const QString sParam = DeviceParamTable->text(iRow, 0);
364 const QString sValue = DeviceParamTable->text(iRow, iCol);
365
366 // Set the local device parameter value.
367 device.setParam(sParam, sValue);
368
369 // Set proper device parameter, on existing device ...
370 if (device.deviceID() >= 0) {
371 // Prepare parameter struct.
372 lscp_param_t param;
373 param.key = (char *) sParam.latin1();
374 param.value = (char *) sValue.latin1();
375 // Now it depends on the device type...
376 lscp_status_t ret = LSCP_FAILED;
377 switch (device.deviceType()) {
378 case qsamplerDevice::Audio:
379 if ((ret = ::lscp_set_audio_device_param(m_pClient,
380 device.deviceID(), &param)) != LSCP_OK)
381 m_pMainForm->appendMessagesClient("lscp_set_audio_device_param");
382 break;
383 case qsamplerDevice::Midi:
384 if ((ret = ::lscp_set_midi_device_param(m_pClient,
385 device.deviceID(), &param)) != LSCP_OK)
386 m_pMainForm->appendMessagesClient("lscp_set_midi_device_param");
387 break;
388 case qsamplerDevice::None:
389 break;
390 }
391 // Show result.
392 if (ret == LSCP_OK) {
393 m_pMainForm->appendMessages(device.deviceName() + ' '
394 + QString("%1: %2.").arg(sParam).arg(sValue));
395 }
396 }
397
398 // Done.
399 m_iDirtySetup--;
400 stabilizeForm();
401 // Main session should be dirtier...
402 m_pMainForm->sessionDirty();
403 }
404
405
406 // Device list view context menu handler.
407 void qsamplerDeviceForm::contextMenu ( QListViewItem *pItem, const QPoint& pos, int )
408 {
409 int iItemID;
410
411 // Build the device context menu...
412 QPopupMenu* pContextMenu = new QPopupMenu(this);
413
414 bool bClient = (m_pClient != NULL);
415 bool bEnabled = (pItem != NULL);
416 iItemID = pContextMenu->insertItem(
417 QIconSet(QPixmap::fromMimeSource("deviceCreate.png")),
418 tr("&Create"), this, SLOT(createDevice()));
419 pContextMenu->setItemEnabled(iItemID, bEnabled || (bClient && m_bNewDevice));
420 iItemID = pContextMenu->insertItem(
421 QIconSet(QPixmap::fromMimeSource("deviceDelete.png")),
422 tr("&Delete"), this, SLOT(deleteDevice()));
423 pContextMenu->setItemEnabled(iItemID, bEnabled && !m_bNewDevice);
424 pContextMenu->insertSeparator();
425 iItemID = pContextMenu->insertItem(
426 QIconSet(QPixmap::fromMimeSource("formRefresh.png")),
427 tr("&Refresh"), this, SLOT(refreshDevices()));
428 pContextMenu->setItemEnabled(iItemID, bClient);
429
430 pContextMenu->exec(pos);
431
432 delete pContextMenu;
433 }
434
435
436 // Stabilize current form state.
437 void qsamplerDeviceForm::stabilizeForm (void)
438 {
439 QListViewItem *pItem = DeviceListView->selectedItem();
440 bool bClient = (m_pClient != NULL);
441 bool bEnabled = (pItem != NULL);
442 DeviceNameTextLabel->setEnabled(bEnabled && !m_bNewDevice);
443 DriverNameTextLabel->setEnabled(bEnabled && m_bNewDevice);
444 DriverNameComboBox->setEnabled(bEnabled && m_bNewDevice);
445 DeviceParamTable->setEnabled(bEnabled);
446 RefreshDevicesPushButton->setEnabled(bClient);
447 CreateDevicePushButton->setEnabled(bEnabled || (bClient && m_bNewDevice));
448 DeleteDevicePushButton->setEnabled(bEnabled && !m_bNewDevice);
449 }
450
451
452 // end of qsamplerDeviceForm.ui.h

  ViewVC Help
Powered by ViewVC