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

Diff of /qsampler/trunk/src/qsamplerChannelForm.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1461 by schoenebeck, Sun Oct 28 23:30:36 2007 UTC revision 1710 by schoenebeck, Tue Feb 26 16:00:00 2008 UTC
# Line 1  Line 1 
1    // qsamplerChannelForm.cpp
2    //
3    /****************************************************************************
4       Copyright (C) 2004-2007, rncbc aka Rui Nuno Capela. All rights reserved.
5       Copyright (C) 2007, 2008 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 "qsamplerChannelForm.h"  #include "qsamplerChannelForm.h"
24    
25  #include "qsamplerAbout.h"  #include "qsamplerAbout.h"
# Line 6  Line 28 
28  #include "qsamplerMainForm.h"  #include "qsamplerMainForm.h"
29  #include "qsamplerInstrument.h"  #include "qsamplerInstrument.h"
30    
31  #include <qvalidator.h>  #include <QValidator>
32  #include <qmessagebox.h>  #include <QMessageBox>
33  #include <qfiledialog.h>  #include <QFileDialog>
34  #include <qfileinfo.h>  #include <QFileInfo>
35    
36    #include <QHeaderView>
37    
38    
39  namespace QSampler {  namespace QSampler {
40    
41  ChannelForm::ChannelForm(QWidget* parent) : QDialog(parent) {  //-------------------------------------------------------------------------
42      ui.setupUi(this);  // QSampler::Channelform -- Channel form implementation.
43    //
44    
45    ChannelForm::ChannelForm ( QWidget* pParent )
46            : QDialog(pParent)
47    {
48            m_ui.setupUi(this);
49    
50          // Initialize locals.          // Initialize locals.
51          m_pChannel = NULL;          m_pChannel = NULL;
# Line 22  ChannelForm::ChannelForm(QWidget* parent Line 53  ChannelForm::ChannelForm(QWidget* parent
53          m_iDirtySetup = 0;          m_iDirtySetup = 0;
54          m_iDirtyCount = 0;          m_iDirtyCount = 0;
55    
56          m_midiDevices.setAutoDelete(true);  //      m_midiDevices.setAutoDelete(true);
57          m_audioDevices.setAutoDelete(true);  //      m_audioDevices.setAutoDelete(true);
58    
59          m_pDeviceForm = NULL;          m_pDeviceForm = NULL;
60    
61            int iRowHeight = m_ui.AudioRoutingTable->fontMetrics().height() + 4;
62            m_ui.AudioRoutingTable->verticalHeader()->setDefaultSectionSize(iRowHeight);
63            m_ui.AudioRoutingTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
64    
65            m_ui.AudioRoutingTable->setModel(&m_routingModel);
66            m_ui.AudioRoutingTable->setItemDelegate(&m_routingDelegate);
67            m_ui.AudioRoutingTable->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
68    //      m_ui.AudioRoutingTable->verticalHeader()->hide();
69    
70            // This goes initially hidden, and will be shown
71            // on setup() for currently existing channels...
72            m_ui.AudioRoutingTable->hide();
73    
74          // Try to restore normal window positioning.          // Try to restore normal window positioning.
75          adjustSize();          adjustSize();
76    
77            QObject::connect(m_ui.EngineNameComboBox,
78                    SIGNAL(activated(int)),
79                    SLOT(optionsChanged()));
80            QObject::connect(m_ui.InstrumentFileComboBox,
81                    SIGNAL(activated(const QString&)),
82                    SLOT(updateInstrumentName()));
83            QObject::connect(m_ui.InstrumentFileToolButton,
84                    SIGNAL(clicked()),
85                    SLOT(openInstrumentFile()));
86            QObject::connect(m_ui.InstrumentNrComboBox,
87                    SIGNAL(activated(int)),
88                    SLOT(optionsChanged()));
89            QObject::connect(m_ui.MidiDriverComboBox,
90                    SIGNAL(activated(const QString&)),
91                    SLOT(selectMidiDriver(const QString&)));
92            QObject::connect(m_ui.MidiDeviceComboBox,
93                    SIGNAL(activated(int)),
94                    SLOT(selectMidiDevice(int)));
95            QObject::connect(m_ui.MidiPortSpinBox,
96                    SIGNAL(valueChanged(int)),
97                    SLOT(optionsChanged()));
98            QObject::connect(m_ui.MidiChannelComboBox,
99                    SIGNAL(activated(int)),
100                    SLOT(optionsChanged()));
101            QObject::connect(m_ui.MidiMapComboBox,
102                    SIGNAL(activated(int)),
103                    SLOT(optionsChanged()));
104            QObject::connect(m_ui.AudioDriverComboBox,
105                    SIGNAL(activated(const QString&)),
106                    SLOT(selectAudioDriver(const QString&)));
107            QObject::connect(m_ui.AudioDeviceComboBox,
108                    SIGNAL(activated(int)),
109                    SLOT(selectAudioDevice(int)));
110            QObject::connect(m_ui.OkPushButton,
111                    SIGNAL(clicked()),
112                    SLOT(accept()));
113            QObject::connect(m_ui.CancelPushButton,
114                    SIGNAL(clicked()),
115                    SLOT(reject()));
116            QObject::connect(m_ui.MidiDeviceToolButton,
117                    SIGNAL(clicked()),
118                    SLOT(setupMidiDevice()));
119            QObject::connect(m_ui.AudioDeviceToolButton,
120                    SIGNAL(clicked()),
121                    SLOT(setupAudioDevice()));
122            QObject::connect(&m_routingModel,
123                    SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)),
124                    SLOT(optionsChanged()));
125            QObject::connect(&m_routingModel,
126                    SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)),
127                    SLOT(updateTableCellRenderers(const QModelIndex&, const QModelIndex&)));
128            QObject::connect(&m_routingModel,
129                    SIGNAL(modelReset()),
130                    SLOT(updateTableCellRenderers()));
131  }  }
132    
133  ChannelForm::~ChannelForm() {  ChannelForm::~ChannelForm()
134    {
135          if (m_pDeviceForm)          if (m_pDeviceForm)
136                  delete m_pDeviceForm;                  delete m_pDeviceForm;
137          m_pDeviceForm = NULL;          m_pDeviceForm = NULL;
138    
139            qDeleteAll(m_midiDevices);
140            m_midiDevices.clear();
141    
142            qDeleteAll(m_audioDevices);
143            m_audioDevices.clear();
144  }  }
145    
146    
147  // Channel dialog setup formal initializer.  // Channel dialog setup formal initializer.
148  void ChannelForm::setup ( qsamplerChannel *pChannel )  void ChannelForm::setup ( Channel *pChannel )
149  {  {
150          m_pChannel = pChannel;          m_pChannel = pChannel;
151    
# Line 50  void ChannelForm::setup ( qsamplerChanne Line 156  void ChannelForm::setup ( qsamplerChanne
156                  return;                  return;
157    
158          // It can be a brand new channel, remember?          // It can be a brand new channel, remember?
159          bool bNew = (m_pChannel->channelID() < 0);          const bool bNew = (m_pChannel->channelID() < 0);
160          setCaption(QSAMPLER_TITLE ": " + m_pChannel->channelName());          setWindowTitle(QSAMPLER_TITLE ": " + m_pChannel->channelName());
161    
162          // Check if we're up and connected.          // Check if we're up and connected.
163          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
# Line 60  void ChannelForm::setup ( qsamplerChanne Line 166  void ChannelForm::setup ( qsamplerChanne
166          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
167                  return;                  return;
168    
169          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
170          if (pOptions == NULL)          if (pOptions == NULL)
171                  return;                  return;
172    
# Line 68  void ChannelForm::setup ( qsamplerChanne Line 174  void ChannelForm::setup ( qsamplerChanne
174          m_iDirtySetup++;          m_iDirtySetup++;
175    
176          // Load combo box history...          // Load combo box history...
177          pOptions->loadComboBoxHistory(ui.InstrumentFileComboBox);          pOptions->loadComboBoxHistory(m_ui.InstrumentFileComboBox);
   
         // Notify.that we've just changed one audio route.  
         QObject::connect(ui.AudioRoutingTable, SIGNAL(valueChanged(int,int)),  
                 this, SLOT(changeAudioRouting(int,int)));  
178    
179          // Populate Engines list.          // Populate Engines list.
180          const char **ppszEngines = ::lscp_list_available_engines(pMainForm->client());          const char **ppszEngines = ::lscp_list_available_engines(pMainForm->client());
181          if (ppszEngines) {          if (ppszEngines) {
182                  ui.EngineNameComboBox->clear();                  m_ui.EngineNameComboBox->clear();
183                  for (int iEngine = 0; ppszEngines[iEngine]; iEngine++)                  for (int iEngine = 0; ppszEngines[iEngine]; iEngine++)
184                          ui.EngineNameComboBox->insertItem(ppszEngines[iEngine]);                          m_ui.EngineNameComboBox->addItem(QString(ppszEngines[iEngine]));
185          }          }
186          else m_pChannel->appendMessagesClient("lscp_list_available_engines");          else m_pChannel->appendMessagesClient("lscp_list_available_engines");
187    
188          // Populate Audio output type list.          // Populate Audio output type list.
189          ui.AudioDriverComboBox->clear();          m_ui.AudioDriverComboBox->clear();
190          ui.AudioDriverComboBox->insertStringList(          m_ui.AudioDriverComboBox->insertItems(0,
191                  qsamplerDevice::getDrivers(pMainForm->client(), qsamplerDevice::Audio));                  Device::getDrivers(pMainForm->client(), Device::Audio));
192    
193          // Populate MIDI input type list.          // Populate MIDI input type list.
194          ui.MidiDriverComboBox->clear();          m_ui.MidiDriverComboBox->clear();
195          ui.MidiDriverComboBox->insertStringList(          m_ui.MidiDriverComboBox->insertItems(0,
196                  qsamplerDevice::getDrivers(pMainForm->client(), qsamplerDevice::Midi));                  Device::getDrivers(pMainForm->client(), Device::Midi));
197    
198          // Populate Maps list.          // Populate Maps list.
199          ui.MidiMapComboBox->clear();          m_ui.MidiMapComboBox->clear();
200          ui.MidiMapComboBox->insertStringList(qsamplerInstrument::getMapNames());          m_ui.MidiMapComboBox->insertItems(0,
201                    Instrument::getMapNames());
202    
203          // Read proper channel information,          // Read proper channel information,
204          // and populate the channel form fields.          // and populate the channel form fields.
# Line 105  void ChannelForm::setup ( qsamplerChanne Line 208  void ChannelForm::setup ( qsamplerChanne
208          if (sEngineName.isEmpty() || bNew)          if (sEngineName.isEmpty() || bNew)
209                  sEngineName = pOptions->sEngineName;                  sEngineName = pOptions->sEngineName;
210          if (sEngineName.isEmpty())          if (sEngineName.isEmpty())
211                  sEngineName = qsamplerChannel::noEngineName();                  sEngineName = Channel::noEngineName();
212          if (ui.EngineNameComboBox->findText(sEngineName,          if (m_ui.EngineNameComboBox->findText(sEngineName,
213                          Qt::MatchExactly | Qt::MatchCaseSensitive) == 0) {                          Qt::MatchExactly | Qt::MatchCaseSensitive) < 0) {
214                  ui.EngineNameComboBox->insertItem(sEngineName);                  m_ui.EngineNameComboBox->addItem(sEngineName);
215          }          }
216          ui.EngineNameComboBox->setCurrentText(sEngineName);          m_ui.EngineNameComboBox->setCurrentIndex(
217                    m_ui.EngineNameComboBox->findText(sEngineName,
218                            Qt::MatchExactly | Qt::MatchCaseSensitive));
219    
220          // Instrument filename and index...          // Instrument filename and index...
221          QString sInstrumentFile = pChannel->instrumentFile();          QString sInstrumentFile = pChannel->instrumentFile();
222          if (sInstrumentFile.isEmpty())          if (sInstrumentFile.isEmpty())
223                  sInstrumentFile = qsamplerChannel::noInstrumentName();                  sInstrumentFile = Channel::noInstrumentName();
224          ui.InstrumentFileComboBox->setCurrentText(sInstrumentFile);          m_ui.InstrumentFileComboBox->setEditText(sInstrumentFile);
225          ui.InstrumentNrComboBox->clear();          m_ui.InstrumentNrComboBox->clear();
226          ui.InstrumentNrComboBox->insertStringList(          m_ui.InstrumentNrComboBox->insertItems(0,
227                  qsamplerChannel::getInstrumentList(sInstrumentFile,                  Channel::getInstrumentList(sInstrumentFile,
228                  pOptions->bInstrumentNames));                  pOptions->bInstrumentNames));
229          ui.InstrumentNrComboBox->setCurrentItem(pChannel->instrumentNr());          int iInstrumentNr = pChannel->instrumentNr();
230            if (iInstrumentNr < 0)
231                    iInstrumentNr = 0;
232            m_ui.InstrumentNrComboBox->setCurrentIndex(iInstrumentNr);
233    
234          // MIDI input device...          // MIDI input device...
235          qsamplerDevice midiDevice(qsamplerDevice::Midi, m_pChannel->midiDevice());          Device midiDevice(Device::Midi, m_pChannel->midiDevice());
236          // MIDI input driver...          // MIDI input driver...
237          QString sMidiDriver = midiDevice.driverName();          QString sMidiDriver = midiDevice.driverName();
238          if (sMidiDriver.isEmpty() || bNew)          if (sMidiDriver.isEmpty() || bNew)
239                  sMidiDriver = pOptions->sMidiDriver.upper();                  sMidiDriver = pOptions->sMidiDriver.toUpper();
240          if (!sMidiDriver.isEmpty()) {          if (!sMidiDriver.isEmpty()) {
241                  if (ui.MidiDriverComboBox->findText(sMidiDriver,                  if (m_ui.MidiDriverComboBox->findText(sMidiDriver,
242                                  Qt::MatchExactly | Qt::MatchCaseSensitive) == 0) {                                  Qt::MatchExactly | Qt::MatchCaseSensitive) < 0) {
243                          ui.MidiDriverComboBox->insertItem(sMidiDriver);                          m_ui.MidiDriverComboBox->insertItem(0, sMidiDriver);
244                  }                  }
245                  ui.MidiDriverComboBox->setCurrentText(sMidiDriver);                  m_ui.MidiDriverComboBox->setCurrentIndex(
246                            m_ui.MidiDriverComboBox->findText(sMidiDriver,
247                                    Qt::MatchExactly | Qt::MatchCaseSensitive)
248                    );
249          }          }
250          selectMidiDriverItem(sMidiDriver);          selectMidiDriverItem(sMidiDriver);
251          if (!bNew)          if (!bNew) {
252                  ui.MidiDeviceComboBox->setCurrentText(midiDevice.deviceName());                  m_ui.MidiDeviceComboBox->setItemText(
253          selectMidiDeviceItem(ui.MidiDeviceComboBox->currentItem());                          m_ui.MidiDeviceComboBox->currentIndex(),
254                            midiDevice.deviceName());
255            }
256            selectMidiDeviceItem(m_ui.MidiDeviceComboBox->currentIndex());
257          // MIDI input port...          // MIDI input port...
258          ui.MidiPortSpinBox->setValue(pChannel->midiPort());          m_ui.MidiPortSpinBox->setValue(pChannel->midiPort());
259          // MIDI input channel...          // MIDI input channel...
260          int iMidiChannel = pChannel->midiChannel();          int iMidiChannel = pChannel->midiChannel();
261          // When new, try to suggest a sensible MIDI channel...          // When new, try to suggest a sensible MIDI channel...
262          if (iMidiChannel < 0)          if (iMidiChannel < 0)
263                  iMidiChannel = (::lscp_get_channels(pMainForm->client()) % 16);                  iMidiChannel = (::lscp_get_channels(pMainForm->client()) % 16);
264          ui.MidiChannelComboBox->setCurrentItem(iMidiChannel);          m_ui.MidiChannelComboBox->setCurrentIndex(iMidiChannel);
265          // MIDI instrument map...          // MIDI instrument map...
266          int iMidiMap = (bNew ? pOptions->iMidiMap : pChannel->midiMap());          int iMidiMap = (bNew ? pOptions->iMidiMap : pChannel->midiMap());
267          // When new, try to suggest a sensible MIDI map...          // When new, try to suggest a sensible MIDI map...
268          if (iMidiMap < 0)          if (iMidiMap < 0)
269                  iMidiMap = 0;                  iMidiMap = 0;
270          const QString& sMapName = qsamplerInstrument::getMapName(iMidiMap);          const QString& sMapName = Instrument::getMapName(iMidiMap);
271          if (!sMapName.isEmpty())          if (!sMapName.isEmpty()) {
272                  ui.MidiMapComboBox->setCurrentText(sMapName);                  m_ui.MidiMapComboBox->setItemText(
273                            m_ui.MidiMapComboBox->currentIndex(),
274                            sMapName);
275            }
276          // It might be no maps around...          // It might be no maps around...
277          bool bMidiMapEnabled = (ui.MidiMapComboBox->count() > 0);          bool bMidiMapEnabled = (m_ui.MidiMapComboBox->count() > 0);
278          ui.MidiMapTextLabel->setEnabled(bMidiMapEnabled);          m_ui.MidiMapTextLabel->setEnabled(bMidiMapEnabled);
279          ui.MidiMapComboBox->setEnabled(bMidiMapEnabled);          m_ui.MidiMapComboBox->setEnabled(bMidiMapEnabled);
280    
281          // Audio output device...          // Audio output device...
282          qsamplerDevice audioDevice(qsamplerDevice::Audio, m_pChannel->audioDevice());          Device audioDevice(Device::Audio, m_pChannel->audioDevice());
283          // Audio output driver...          // Audio output driver...
284          QString sAudioDriver = audioDevice.driverName();          QString sAudioDriver = audioDevice.driverName();
285          if (sAudioDriver.isEmpty() || bNew)          if (sAudioDriver.isEmpty() || bNew)
286                  sAudioDriver = pOptions->sAudioDriver.upper();                  sAudioDriver = pOptions->sAudioDriver.toUpper();
287          if (!sAudioDriver.isEmpty()) {          if (!sAudioDriver.isEmpty()) {
288                  if (ui.AudioDriverComboBox->findText(sAudioDriver,                  if (m_ui.AudioDriverComboBox->findText(sAudioDriver,
289                                  Qt::MatchExactly | Qt::MatchCaseSensitive) == 0) {                                  Qt::MatchExactly | Qt::MatchCaseSensitive) < 0) {
290                          ui.AudioDriverComboBox->insertItem(sAudioDriver);                          m_ui.AudioDriverComboBox->insertItem(0, sAudioDriver);
291                  }                  }
292                  ui.AudioDriverComboBox->setCurrentText(sAudioDriver);                  m_ui.AudioDriverComboBox->setCurrentIndex(
293                            m_ui.AudioDriverComboBox->findText(sAudioDriver,
294                                    Qt::MatchExactly | Qt::MatchCaseSensitive)
295                    );
296          }          }
297          selectAudioDriverItem(sAudioDriver);          selectAudioDriverItem(sAudioDriver);
298          if (!bNew)          if (!bNew) {
299                  ui.AudioDeviceComboBox->setCurrentText(audioDevice.deviceName());                  m_ui.AudioDeviceComboBox->setItemText(
300          selectAudioDeviceItem(ui.AudioDeviceComboBox->currentItem());                          m_ui.AudioDeviceComboBox->currentIndex(),
301                            audioDevice.deviceName());
302            }
303            selectAudioDeviceItem(m_ui.AudioDeviceComboBox->currentIndex());
304    
305            // Let the audio routing table see the light,
306            // if we're editing an existing sampler channel...
307            m_ui.AudioRoutingTable->setVisible(!bNew);
308    
309            const QString sInstrumentNrToolTip =
310                    (pOptions->bInstrumentNames) ?
311                            "Select an instrument of the file" :
312                            "You might want to enable instrument name retrieval in the "
313                            "settings dialog";
314            m_ui.InstrumentNrComboBox->setToolTip(
315                    QObject::tr(sInstrumentNrToolTip.toUtf8().data())
316            );
317    
318          // As convenient, make it ready on stabilizeForm() for          // As convenient, make it ready on stabilizeForm() for
319          // prompt acceptance, if we got the minimum required...          // prompt acceptance, if we got the minimum required...
320  /*      if (sEngineName != qsamplerChannel::noEngineName() &&  /*      if (sEngineName != Channel::noEngineName() &&
321                  sInstrumentFile != qsamplerChannel::noInstrumentName())                  sInstrumentFile != Channel::noInstrumentName())
322                  m_iDirtyCount++; */                  m_iDirtyCount++; */
323          // Done.          // Done.
324          m_iDirtySetup--;          m_iDirtySetup--;
# Line 201  void ChannelForm::accept (void) Line 338  void ChannelForm::accept (void)
338          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
339                  return;                  return;
340    
341          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
342          if (pOptions == NULL)          if (pOptions == NULL)
343                  return;                  return;
344    
345          // Flush any pending editing...          // Flush any pending editing...
346          //ui.AudioRoutingTable->flush();          //m_ui.AudioRoutingTable->flush();
347    
348          // We'll go for it!          // We'll go for it!
349          if (m_iDirtyCount > 0) {          if (m_iDirtyCount > 0) {
# Line 216  void ChannelForm::accept (void) Line 353  void ChannelForm::accept (void)
353                          iErrors++;                          iErrors++;
354                  // Accept Audio driver or device selection...                  // Accept Audio driver or device selection...
355                  if (m_audioDevices.isEmpty()) {                  if (m_audioDevices.isEmpty()) {
356                          if (!m_pChannel->setAudioDriver(ui.AudioDriverComboBox->currentText()))                          if (!m_pChannel->setAudioDriver(m_ui.AudioDriverComboBox->currentText()))
357                                  iErrors++;                                  iErrors++;
358                  } else {                  } else {
359                          qsamplerDevice *pDevice = m_audioDevices.at(ui.AudioDeviceComboBox->currentItem());                          Device *pDevice = NULL;
360                            int iAudioItem = m_ui.AudioDeviceComboBox->currentIndex();
361                            if (iAudioItem >= 0 && iAudioItem < m_audioDevices.count())
362                                    pDevice = m_audioDevices.at(iAudioItem);
363                            ChannelRoutingMap routingMap = m_routingModel.routingMap();
364                          if (pDevice == NULL)                          if (pDevice == NULL)
365                                  iErrors++;                                  iErrors++;
366                          else if (!m_pChannel->setAudioDevice(pDevice->deviceID()))                          else if (!m_pChannel->setAudioDevice(pDevice->deviceID()))
367                                  iErrors++;                                  iErrors++;
368                          else if (!m_audioRouting.isEmpty()) {                          else if (!routingMap.isEmpty()) {
369                                  // Set the audio route changes...                                  // Set the audio route changes...
370                                  qsamplerChannelRoutingMap::ConstIterator iter;                                  ChannelRoutingMap::ConstIterator iter;
371                                  for (iter = m_audioRouting.begin();                                  for (iter = routingMap.begin();
372                                                  iter != m_audioRouting.end(); ++iter) {                                                  iter != routingMap.end(); ++iter) {
373                                          if (!m_pChannel->setAudioChannel(iter.key(), iter.data()))                                          if (!m_pChannel->setAudioChannel(iter.key(), iter.value()))
374                                                  iErrors++;                                                  iErrors++;
375                                  }                                  }
376                          }                          }
377                  }                  }
378                  // Accept MIDI driver or device selection...                  // Accept MIDI driver or device selection...
379                  if (m_midiDevices.isEmpty()) {                  if (m_midiDevices.isEmpty()) {
380                          if (!m_pChannel->setMidiDriver(ui.MidiDriverComboBox->currentText()))                          if (!m_pChannel->setMidiDriver(m_ui.MidiDriverComboBox->currentText()))
381                                  iErrors++;                                  iErrors++;
382                  } else {                  } else {
383                          qsamplerDevice *pDevice = m_midiDevices.at(ui.MidiDeviceComboBox->currentItem());                          Device *pDevice = NULL;
384                            int iMidiItem = m_ui.MidiDeviceComboBox->currentIndex();
385                            if (iMidiItem >= 0 && iMidiItem < m_midiDevices.count())
386                                    pDevice = m_midiDevices.at(iMidiItem);
387                          if (pDevice == NULL)                          if (pDevice == NULL)
388                                  iErrors++;                                  iErrors++;
389                          else if (!m_pChannel->setMidiDevice(pDevice->deviceID()))                          else if (!m_pChannel->setMidiDevice(pDevice->deviceID()))
390                                  iErrors++;                                  iErrors++;
391                  }                  }
392                  // MIDI input port number...                  // MIDI input port number...
393                  if (!m_pChannel->setMidiPort(ui.MidiPortSpinBox->value()))                  if (!m_pChannel->setMidiPort(m_ui.MidiPortSpinBox->value()))
394                          iErrors++;                          iErrors++;
395                  // MIDI input channel...                  // MIDI input channel...
396                  if (!m_pChannel->setMidiChannel(ui.MidiChannelComboBox->currentItem()))                  if (!m_pChannel->setMidiChannel(m_ui.MidiChannelComboBox->currentIndex()))
397                          iErrors++;                          iErrors++;
398                  // Engine name...                  // Engine name...
399                  if (!m_pChannel->loadEngine(ui.EngineNameComboBox->currentText()))                  if (!m_pChannel->loadEngine(m_ui.EngineNameComboBox->currentText()))
400                          iErrors++;                          iErrors++;
401                  // Instrument file and index...                  // Instrument file and index...
402                  const QString& sPath = ui.InstrumentFileComboBox->currentText();                  const QString& sPath = m_ui.InstrumentFileComboBox->currentText();
403                  if (!sPath.isEmpty() && QFileInfo(sPath).exists()) {                  if (!sPath.isEmpty() && QFileInfo(sPath).exists()) {
404                          if (!m_pChannel->loadInstrument(sPath, ui.InstrumentNrComboBox->currentItem()))                          if (!m_pChannel->loadInstrument(sPath, m_ui.InstrumentNrComboBox->currentIndex()))
405                                  iErrors++;                                  iErrors++;
406                  }                  }
407                  // MIDI intrument map...                  // MIDI intrument map...
408                  if (!m_pChannel->setMidiMap(ui.MidiMapComboBox->currentItem()))                  if (!m_pChannel->setMidiMap(m_ui.MidiMapComboBox->currentIndex()))
409                          iErrors++;                          iErrors++;
410                  // Show error messages?                  // Show error messages?
411                  if (iErrors > 0)                  if (iErrors > 0) {
412                          m_pChannel->appendMessagesError(tr("Some channel settings could not be set.\n\nSorry."));                          m_pChannel->appendMessagesError(
413                                    tr("Some channel settings could not be set.\n\nSorry."));
414                    }
415          }          }
416    
417          // Save default engine name, instrument directory and history...          // Save default engine name, instrument directory and history...
418          pOptions->sInstrumentDir = QFileInfo(ui.InstrumentFileComboBox->currentText()).dirPath(true);          pOptions->sInstrumentDir = QFileInfo(
419          pOptions->sEngineName  = ui.EngineNameComboBox->currentText();                  m_ui.InstrumentFileComboBox->currentText()).dir().absolutePath();
420          pOptions->sAudioDriver = ui.AudioDriverComboBox->currentText();          pOptions->sEngineName  = m_ui.EngineNameComboBox->currentText();
421          pOptions->sMidiDriver  = ui.MidiDriverComboBox->currentText();          pOptions->sAudioDriver = m_ui.AudioDriverComboBox->currentText();
422          pOptions->iMidiMap     = ui.MidiMapComboBox->currentItem();          pOptions->sMidiDriver  = m_ui.MidiDriverComboBox->currentText();
423          pOptions->saveComboBoxHistory(ui.InstrumentFileComboBox);          pOptions->iMidiMap     = m_ui.MidiMapComboBox->currentIndex();
424            pOptions->saveComboBoxHistory(m_ui.InstrumentFileComboBox);
425    
426          // Just go with dialog acceptance.          // Just go with dialog acceptance.
427          QDialog::accept();          QDialog::accept();
# Line 287  void ChannelForm::reject (void) Line 434  void ChannelForm::reject (void)
434          bool bReject = true;          bool bReject = true;
435    
436          // Check if there's any pending changes...          // Check if there's any pending changes...
437          if (m_iDirtyCount > 0 && ui.OkPushButton->isEnabled()) {          if (m_iDirtyCount > 0 && m_ui.OkPushButton->isEnabled()) {
438                  switch (QMessageBox::warning(this,                  switch (QMessageBox::warning(this,
439                          QSAMPLER_TITLE ": " + tr("Warning"),                          QSAMPLER_TITLE ": " + tr("Warning"),
440                          tr("Some channel settings have been changed.\n\n"                          tr("Some channel settings have been changed.\n\n"
# Line 318  void ChannelForm::openInstrumentFile (vo Line 465  void ChannelForm::openInstrumentFile (vo
465          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
466                  return;                  return;
467    
468          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
469          if (pOptions == NULL)          if (pOptions == NULL)
470                  return;                  return;
471    
472          // FIXME: the instrument file filters should be restricted,          // FIXME: the instrument file filters should be restricted,
473          // depending on the current engine.          // depending on the current engine.
474          QString sInstrumentFile = QFileDialog::getOpenFileName(          QString sInstrumentFile = QFileDialog::getOpenFileName(this,
475                  pOptions->sInstrumentDir,                   // Start here.                  QSAMPLER_TITLE ": " + tr("Instrument files"), // Caption.
476                  tr("Instrument files") + " (*.gig *.dls)",  // Filter (GIG and DLS files)                  pOptions->sInstrumentDir,                 // Start here.
477                  this, 0,                                    // Parent and name (none)                  tr("Instrument files") + " (*.gig *.dls)" // Filter (GIG and DLS files)
                 QSAMPLER_TITLE ": " + tr("Instrument files")    // Caption.  
478          );          );
479    
480          if (sInstrumentFile.isEmpty())          if (sInstrumentFile.isEmpty())
481                  return;                  return;
482    
483          ui.InstrumentFileComboBox->setCurrentText(sInstrumentFile);          m_ui.InstrumentFileComboBox->setEditText(sInstrumentFile);
484          updateInstrumentName();          updateInstrumentName();
485  }  }
486    
# Line 348  void ChannelForm::updateInstrumentName ( Line 494  void ChannelForm::updateInstrumentName (
494          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
495                  return;                  return;
496    
497          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
498          if (pOptions == NULL)          if (pOptions == NULL)
499                  return;                  return;
500    
501          // Finally this better idea would be to use libgig          // Finally this better idea would be to use libgig
502          // to retrieve the REAL instrument names.          // to retrieve the REAL instrument names.
503          ui.InstrumentNrComboBox->clear();          m_ui.InstrumentNrComboBox->clear();
504          ui.InstrumentNrComboBox->insertStringList(          m_ui.InstrumentNrComboBox->insertItems(0,
505                  qsamplerChannel::getInstrumentList(                  Channel::getInstrumentList(
506                          ui.InstrumentFileComboBox->currentText(),                          m_ui.InstrumentFileComboBox->currentText(),
507                          pOptions->bInstrumentNames)                          pOptions->bInstrumentNames)
508          );          );
509    
# Line 366  void ChannelForm::updateInstrumentName ( Line 512  void ChannelForm::updateInstrumentName (
512    
513    
514  // Show device options dialog.  // Show device options dialog.
515  void ChannelForm::setupDevice ( qsamplerDevice *pDevice,  void ChannelForm::setupDevice ( Device *pDevice,
516          qsamplerDevice::qsamplerDeviceType deviceTypeMode,          Device::DeviceType deviceTypeMode,
517          const QString& sDriverName )          const QString& sDriverName )
518  {  {
519          MainForm *pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
# Line 379  void ChannelForm::setupDevice ( qsampler Line 525  void ChannelForm::setupDevice ( qsampler
525          // Create the device form if not already...          // Create the device form if not already...
526          if (m_pDeviceForm == NULL) {          if (m_pDeviceForm == NULL) {
527                  m_pDeviceForm = new DeviceForm(this, Qt::Dialog);                  m_pDeviceForm = new DeviceForm(this, Qt::Dialog);
528          m_pDeviceForm->setAttribute(Qt::WA_ShowModal);                  m_pDeviceForm->setAttribute(Qt::WA_ShowModal);
529                  QObject::connect(m_pDeviceForm, SIGNAL(devicesChanged()),                  QObject::connect(m_pDeviceForm, SIGNAL(devicesChanged()),
530                          this, SLOT(updateDevices()));                          this, SLOT(updateDevices()));
531          }          }
# Line 404  void ChannelForm::selectMidiDriverItem ( Line 550  void ChannelForm::selectMidiDriverItem (
550          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
551                  return;                  return;
552    
553          const QString sDriverName = sMidiDriver.upper();          const QString sDriverName = sMidiDriver.toUpper();
554    
555          // Save current device id.          // Save current device id.
556            // Save current device id.
557          int iDeviceID = 0;          int iDeviceID = 0;
558          qsamplerDevice *pDevice = m_midiDevices.at(ui.MidiDeviceComboBox->currentItem());          Device *pDevice = NULL;
559            int iMidiItem = m_ui.MidiDeviceComboBox->currentIndex();
560            if (iMidiItem >= 0 && iMidiItem < m_midiDevices.count())
561                    pDevice = m_midiDevices.at(iMidiItem);
562          if (pDevice)          if (pDevice)
563                  iDeviceID = pDevice->deviceID();                  iDeviceID = pDevice->deviceID();
564    
565          // Clean maplist.          // Clean maplist.
566          ui.MidiDeviceComboBox->clear();          m_ui.MidiDeviceComboBox->clear();
567            qDeleteAll(m_midiDevices);
568          m_midiDevices.clear();          m_midiDevices.clear();
569    
570          // Populate with the current ones...          // Populate with the current ones...
571          const QPixmap midiPixmap(":/qsampler/pixmaps/midi2.png");          const QPixmap midiPixmap(":/icons/midi2.png");
572          int *piDeviceIDs = qsamplerDevice::getDevices(pMainForm->client(),          int *piDeviceIDs = Device::getDevices(pMainForm->client(),
573                  qsamplerDevice::Midi);                  Device::Midi);
574          for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) {          for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) {
575                  pDevice = new qsamplerDevice(qsamplerDevice::Midi, piDeviceIDs[i]);                  pDevice = new Device(Device::Midi, piDeviceIDs[i]);
576                  if (pDevice->driverName().upper() == sDriverName) {                  if (pDevice->driverName().toUpper() == sDriverName) {
577                          ui.MidiDeviceComboBox->insertItem(midiPixmap, pDevice->deviceName());                          m_ui.MidiDeviceComboBox->insertItem(0,
578                                    midiPixmap, pDevice->deviceName());
579                          m_midiDevices.append(pDevice);                          m_midiDevices.append(pDevice);
580                  } else {                  } else {
581                          delete pDevice;                          delete pDevice;
# Line 434  void ChannelForm::selectMidiDriverItem ( Line 586  void ChannelForm::selectMidiDriverItem (
586          bool bEnabled = !m_midiDevices.isEmpty();          bool bEnabled = !m_midiDevices.isEmpty();
587          if (bEnabled) {          if (bEnabled) {
588                  // Select the previous current device...                  // Select the previous current device...
589                  int iMidiItem = 0;                  iMidiItem = 0;
590                  for (pDevice = m_midiDevices.first();                  QListIterator<Device *> iter(m_midiDevices);
591                                  pDevice;                  while (iter.hasNext()) {
592                                          pDevice = m_midiDevices.next()) {                          pDevice = iter.next();
593                          if (pDevice->deviceID() == iDeviceID) {                          if (pDevice->deviceID() == iDeviceID) {
594                                  ui.MidiDeviceComboBox->setCurrentItem(iMidiItem);                                  m_ui.MidiDeviceComboBox->setCurrentIndex(iMidiItem);
595                                  selectMidiDeviceItem(iMidiItem);                                  selectMidiDeviceItem(iMidiItem);
596                                  break;                                  break;
597                          }                          }
598                          iMidiItem++;                          iMidiItem++;
599                  }                  }
600          } else {          } else {
601                  ui.MidiDeviceComboBox->insertItem(                  m_ui.MidiDeviceComboBox->insertItem(0,
602                          tr("(New MIDI %1 device)").arg(sMidiDriver));                          tr("(New MIDI %1 device)").arg(sMidiDriver));
603          }          }
604          ui.MidiDeviceTextLabel->setEnabled(bEnabled);          m_ui.MidiDeviceTextLabel->setEnabled(bEnabled);
605          ui.MidiDeviceComboBox->setEnabled(bEnabled);          m_ui.MidiDeviceComboBox->setEnabled(bEnabled);
606  }  }
607    
608    
# Line 468  void ChannelForm::selectMidiDriver ( con Line 620  void ChannelForm::selectMidiDriver ( con
620  // Select MIDI device item.  // Select MIDI device item.
621  void ChannelForm::selectMidiDeviceItem ( int iMidiItem )  void ChannelForm::selectMidiDeviceItem ( int iMidiItem )
622  {  {
623          qsamplerDevice *pDevice = m_midiDevices.at(iMidiItem);          Device *pDevice = NULL;
624            if (iMidiItem >= 0 && iMidiItem < m_midiDevices.count())
625                    pDevice = m_midiDevices.at(iMidiItem);
626          if (pDevice) {          if (pDevice) {
627                  const qsamplerDeviceParamMap& params = pDevice->params();                  const DeviceParamMap& params = pDevice->params();
628                  int iPorts = params["PORTS"].value.toInt();                  int iPorts = params["PORTS"].value.toInt();
629                  ui.MidiPortTextLabel->setEnabled(iPorts > 0);                  m_ui.MidiPortTextLabel->setEnabled(iPorts > 0);
630                  ui.MidiPortSpinBox->setEnabled(iPorts > 0);                  m_ui.MidiPortSpinBox->setEnabled(iPorts > 0);
631                  if (iPorts > 0)                  if (iPorts > 0)
632                          ui.MidiPortSpinBox->setMaxValue(iPorts - 1);                          m_ui.MidiPortSpinBox->setMaximum(iPorts - 1);
633          }          }
634  }  }
635    
# Line 494  void ChannelForm::selectMidiDevice ( int Line 648  void ChannelForm::selectMidiDevice ( int
648  // MIDI device options.  // MIDI device options.
649  void ChannelForm::setupMidiDevice (void)  void ChannelForm::setupMidiDevice (void)
650  {  {
651          setupDevice(m_midiDevices.at(ui.MidiDeviceComboBox->currentItem()),          Device *pDevice = NULL;
652                  qsamplerDevice::Midi, ui.MidiDriverComboBox->currentText());          int iMidiItem = m_ui.MidiDeviceComboBox->currentIndex();
653            if (iMidiItem >= 0 && iMidiItem < m_midiDevices.count())
654                    pDevice = m_midiDevices.at(iMidiItem);
655            setupDevice(pDevice,
656                    Device::Midi, m_ui.MidiDriverComboBox->currentText());
657  }  }
658    
659    
# Line 508  void ChannelForm::selectAudioDriverItem Line 666  void ChannelForm::selectAudioDriverItem
666          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
667                  return;                  return;
668    
669          const QString sDriverName = sAudioDriver.upper();          const QString sDriverName = sAudioDriver.toUpper();
670    
671          // Save current device id.          // Save current device id.
672          int iDeviceID = 0;          int iDeviceID = 0;
673          qsamplerDevice *pDevice = m_audioDevices.at(ui.AudioDeviceComboBox->currentItem());          Device *pDevice = NULL;
674            int iAudioItem = m_ui.AudioDeviceComboBox->currentIndex();
675            if (iAudioItem >= 0 && iAudioItem < m_audioDevices.count())
676                    pDevice = m_audioDevices.at(iAudioItem);
677          if (pDevice)          if (pDevice)
678                  iDeviceID = pDevice->deviceID();                  iDeviceID = pDevice->deviceID();
679    
680          // Clean maplist.          // Clean maplist.
681          ui.AudioDeviceComboBox->clear();          m_ui.AudioDeviceComboBox->clear();
682            qDeleteAll(m_audioDevices);
683          m_audioDevices.clear();          m_audioDevices.clear();
684    
685          // Populate with the current ones...          // Populate with the current ones...
686          const QPixmap audioPixmap(":/qsampler/pixmaps/audio2.png");          const QPixmap audioPixmap(":/icons/audio2.png");
687          int *piDeviceIDs = qsamplerDevice::getDevices(pMainForm->client(),          int *piDeviceIDs = Device::getDevices(pMainForm->client(),
688                  qsamplerDevice::Audio);                  Device::Audio);
689          for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) {          for (int i = 0; piDeviceIDs && piDeviceIDs[i] >= 0; i++) {
690                  pDevice = new qsamplerDevice(qsamplerDevice::Audio, piDeviceIDs[i]);                  pDevice = new Device(Device::Audio, piDeviceIDs[i]);
691                  if (pDevice->driverName().upper() == sDriverName) {                  if (pDevice->driverName().toUpper() == sDriverName) {
692                          ui.AudioDeviceComboBox->insertItem(audioPixmap, pDevice->deviceName());                          m_ui.AudioDeviceComboBox->insertItem(0,
693                                    audioPixmap, pDevice->deviceName());
694                          m_audioDevices.append(pDevice);                          m_audioDevices.append(pDevice);
695                  } else {                  } else {
696                          delete pDevice;                          delete pDevice;
# Line 538  void ChannelForm::selectAudioDriverItem Line 701  void ChannelForm::selectAudioDriverItem
701          bool bEnabled = !m_audioDevices.isEmpty();          bool bEnabled = !m_audioDevices.isEmpty();
702          if (bEnabled) {          if (bEnabled) {
703                  // Select the previous current device...                  // Select the previous current device...
704                  int iAudioItem = 0;                  iAudioItem = 0;
705                  for (pDevice = m_audioDevices.first();                  QListIterator<Device *> iter(m_audioDevices);
706                                  pDevice;                  while (iter.hasNext()) {
707                                          pDevice = m_audioDevices.next()) {                          pDevice = iter.next();
708                          if (pDevice->deviceID() == iDeviceID) {                          if (pDevice->deviceID() == iDeviceID) {
709                                  ui.AudioDeviceComboBox->setCurrentItem(iAudioItem);                                  m_ui.AudioDeviceComboBox->setCurrentIndex(iAudioItem);
710                                  selectAudioDeviceItem(iAudioItem);                                  selectAudioDeviceItem(iAudioItem);
711                                  break;                                  break;
712                          }                          }
713                          iAudioItem++;                          iAudioItem++;
714                  }                  }
715          } else {          } else {
716                  ui.AudioDeviceComboBox->insertItem(                  m_ui.AudioDeviceComboBox->insertItem(0,
717                          tr("(New Audio %1 device)").arg(sAudioDriver));                          tr("(New Audio %1 device)").arg(sAudioDriver));
718                  //ui.AudioRoutingTable->setNumRows(0);                  //m_ui.AudioRoutingTable->setNumRows(0);
719          }          }
720          ui.AudioDeviceTextLabel->setEnabled(bEnabled);          m_ui.AudioDeviceTextLabel->setEnabled(bEnabled);
721          ui.AudioDeviceComboBox->setEnabled(bEnabled);          m_ui.AudioDeviceComboBox->setEnabled(bEnabled);
722          ui.AudioRoutingTable->setEnabled(bEnabled);          m_ui.AudioRoutingTable->setEnabled(bEnabled);
723  }  }
724    
725    
# Line 574  void ChannelForm::selectAudioDriver ( co Line 737  void ChannelForm::selectAudioDriver ( co
737  // Select Audio device item.  // Select Audio device item.
738  void ChannelForm::selectAudioDeviceItem ( int iAudioItem )  void ChannelForm::selectAudioDeviceItem ( int iAudioItem )
739  {  {
740          qsamplerDevice *pDevice = m_audioDevices.at(iAudioItem);          Device *pDevice = NULL;
741            if (iAudioItem >= 0 && iAudioItem < m_audioDevices.count())
742                    pDevice = m_audioDevices.at(iAudioItem);
743          if (pDevice) {          if (pDevice) {
744                  // Refresh the audio routing table.                  // Refresh the audio routing table.
745                  routingModel.refresh(pDevice, m_pChannel->audioRouting());                  m_routingModel.refresh(pDevice, m_pChannel->audioRouting());
746                  // Reset routing change map.                  // Reset routing change map.
747                  m_audioRouting.clear();                  m_routingModel.clear();
748          }          }
749  }  }
750    
# Line 598  void ChannelForm::selectAudioDevice ( in Line 763  void ChannelForm::selectAudioDevice ( in
763  // Audio device options.  // Audio device options.
764  void ChannelForm::setupAudioDevice (void)  void ChannelForm::setupAudioDevice (void)
765  {  {
766          setupDevice(m_audioDevices.at(ui.AudioDeviceComboBox->currentItem()),          Device *pDevice = NULL;
767                  qsamplerDevice::Audio, ui.AudioDriverComboBox->currentText());          int iAudioItem = m_ui.AudioDeviceComboBox->currentIndex();
768  }          if (iAudioItem >= 0 && iAudioItem < m_audioDevices.count())
769                    pDevice = m_audioDevices.at(iAudioItem);
770            setupDevice(pDevice,
771  // Audio routing change slot.                  Device::Audio, m_ui.AudioDriverComboBox->currentText());
 void ChannelForm::changeAudioRouting ( int iRow, int iCol )  
 {  
 #if 0  
         if (m_iDirtySetup > 0)  
                 return;  
         if (iRow < 0 || iCol < 0)  
                 return;  
   
         // Verify that this is a QComboTableItem (magic rtti == 1)  
         QTableItem *pItem = ui.AudioRoutingTable->item(iRow, iCol);  
         if (pItem == NULL)  
                 return;  
         qsamplerChannelRoutingComboBox *pComboItem =  
                 static_cast<qsamplerChannelRoutingComboBox*> (pItem);  
         // FIXME: Its not garanteed that we must have  
         // iAudioOut == iRow on all times forth!  
         m_audioRouting[iRow] = pComboItem->currentItem();  
   
         // And let's get dirty...  
         optionsChanged();  
 #endif  
772  }  }
773    
   
774  // UPdate all device lists slot.  // UPdate all device lists slot.
775  void ChannelForm::updateDevices (void)  void ChannelForm::updateDevices (void)
776  {  {
777          if (m_iDirtySetup > 0)          if (m_iDirtySetup > 0)
778                  return;                  return;
779    
780          selectMidiDriverItem(ui.MidiDriverComboBox->currentText());          selectMidiDriverItem(m_ui.MidiDriverComboBox->currentText());
781          selectAudioDriverItem(ui.AudioDriverComboBox->currentText());          selectAudioDriverItem(m_ui.AudioDriverComboBox->currentText());
782          optionsChanged();          optionsChanged();
783  }  }
784    
# Line 654  void ChannelForm::optionsChanged (void) Line 797  void ChannelForm::optionsChanged (void)
797  // Stabilize current form state.  // Stabilize current form state.
798  void ChannelForm::stabilizeForm (void)  void ChannelForm::stabilizeForm (void)
799  {  {
800          bool bValid = true;          const bool bValid =
801                    m_ui.EngineNameComboBox->currentIndex() >= 0 &&
802                    m_ui.EngineNameComboBox->currentText()
803                            != Channel::noEngineName();
804  #if 0  #if 0
805          const QString& sPath = InstrumentFileComboBox->currentText();          const QString& sPath = InstrumentFileComboBox->currentText();
806          bValid = bValid && !sPath.isEmpty() && QFileInfo(sPath).exists();          bValid = bValid && !sPath.isEmpty() && QFileInfo(sPath).exists();
807  #endif  #endif
808          ui.OkPushButton->setEnabled(m_iDirtyCount > 0 && bValid);          m_ui.OkPushButton->setEnabled(m_iDirtyCount > 0 && bValid);
809  }  }
810    
811    
812    void ChannelForm::updateTableCellRenderers (void)
813    {
814            const int rows = m_routingModel.rowCount();
815            const int cols = m_routingModel.columnCount();
816            updateTableCellRenderers(
817                    m_routingModel.index(0, 0),
818                    m_routingModel.index(rows - 1, cols - 1));
819    }
820    
821    
822    void ChannelForm::updateTableCellRenderers (
823            const QModelIndex& topLeft, const QModelIndex& bottomRight )
824    {
825            for (int r = topLeft.row(); r <= bottomRight.row(); r++) {
826                    for (int c = topLeft.column(); c <= bottomRight.column(); c++) {
827                            const QModelIndex index = m_routingModel.index(r, c);
828                            m_ui.AudioRoutingTable->openPersistentEditor(index);
829                    }
830            }
831    }
832    
833  } // namespace QSampler  } // namespace QSampler
834    
835    
836    // end of qsamplerChannelForm.cpp

Legend:
Removed from v.1461  
changed lines
  Added in v.1710

  ViewVC Help
Powered by ViewVC