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

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

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

revision 1499 by capela, Tue Nov 20 16:48:04 2007 UTC revision 2107 by capela, Sat Jul 10 09:47:33 2010 UTC
# Line 1  Line 1 
1  // qsamplerInstrumentForm.cpp  // qsamplerInstrumentForm.cpp
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2003-2007, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2003-2010, rncbc aka Rui Nuno Capela. All rights reserved.
5     Copyright (C) 2007, Christian Schoenebeck     Copyright (C) 2007, Christian Schoenebeck
6    
7     This program is free software; you can redistribute it and/or     This program is free software; you can redistribute it and/or
# Line 20  Line 20 
20    
21  *****************************************************************************/  *****************************************************************************/
22    
23    #include "qsamplerAbout.h"
24  #include "qsamplerInstrumentForm.h"  #include "qsamplerInstrumentForm.h"
25    
26  #include "qsamplerAbout.h"  #include "qsamplerOptions.h"
27    #include "qsamplerChannel.h"
28  #include "qsamplerMainForm.h"  #include "qsamplerMainForm.h"
29    
 #include <QFileDialog>  
30  #include <QMessageBox>  #include <QMessageBox>
31    #include <QPushButton>
32    #include <QFileDialog>
33    
34  // Needed for lroundf()  // Needed for lroundf()
35  #include <math.h>  #include <math.h>
36    
   
 namespace QSampler {  
   
37  #ifndef CONFIG_ROUND  #ifndef CONFIG_ROUND
38  static inline long lroundf ( float x )  static inline long lroundf ( float x )
39  {  {
# Line 44  static inline long lroundf ( float x ) Line 44  static inline long lroundf ( float x )
44  }  }
45  #endif  #endif
46    
47  InstrumentForm::InstrumentForm(QWidget* parent) : QDialog(parent) {  
48      ui.setupUi(this);  namespace QSampler {
49    
50    //-------------------------------------------------------------------------
51    // QSampler::InstrumentForm -- Instrument map item form implementation.
52    //
53    
54    InstrumentForm::InstrumentForm ( QWidget *pParent )
55            : QDialog(pParent)
56    {
57            m_ui.setupUi(this);
58    
59          // Initialize locals.          // Initialize locals.
60          m_pInstrument = NULL;          m_pInstrument = NULL;
# Line 58  InstrumentForm::InstrumentForm(QWidget* Line 67  InstrumentForm::InstrumentForm(QWidget*
67          adjustSize();          adjustSize();
68    
69    
70          QObject::connect(ui.MapComboBox,          QObject::connect(m_ui.MapComboBox,
71                  SIGNAL(activated(int)),                  SIGNAL(activated(int)),
72                  SLOT(changed()));                  SLOT(changed()));
73          QObject::connect(ui.BankSpinBox,          QObject::connect(m_ui.BankSpinBox,
74                  SIGNAL(valueChanged(int)),                  SIGNAL(valueChanged(int)),
75                  SLOT(changed()));                  SLOT(changed()));
76          QObject::connect(ui.ProgSpinBox,          QObject::connect(m_ui.ProgSpinBox,
77                  SIGNAL(valueChanged(int)),                  SIGNAL(valueChanged(int)),
78                  SLOT(changed()));                  SLOT(changed()));
79          QObject::connect(ui.NameLineEdit,          QObject::connect(m_ui.NameLineEdit,
80                  SIGNAL(textChanged(const QString&)),                  SIGNAL(textChanged(const QString&)),
81                  SLOT(nameChanged(const QString&)));                  SLOT(nameChanged(const QString&)));
82          QObject::connect(ui.EngineNameComboBox,          QObject::connect(m_ui.EngineNameComboBox,
83                  SIGNAL(activated(int)),                  SIGNAL(activated(int)),
84                  SLOT(changed()));                  SLOT(changed()));
85          QObject::connect(ui.InstrumentFileComboBox,          QObject::connect(m_ui.InstrumentFileComboBox,
86                  SIGNAL(activated(const QString&)),                  SIGNAL(activated(const QString&)),
87                  SLOT(updateInstrumentName()));                  SLOT(updateInstrumentName()));
88          QObject::connect(ui.InstrumentFileToolButton,          QObject::connect(m_ui.InstrumentFileToolButton,
89                  SIGNAL(clicked()),                  SIGNAL(clicked()),
90                  SLOT(openInstrumentFile()));                  SLOT(openInstrumentFile()));
91          QObject::connect(ui.InstrumentNrComboBox,          QObject::connect(m_ui.InstrumentNrComboBox,
92                  SIGNAL(activated(int)),                  SIGNAL(activated(int)),
93                  SLOT(instrumentNrChanged()));                  SLOT(instrumentNrChanged()));
94          QObject::connect(ui.VolumeSpinBox,          QObject::connect(m_ui.VolumeSpinBox,
95                  SIGNAL(valueChanged(int)),                  SIGNAL(valueChanged(int)),
96                  SLOT(changed()));                  SLOT(changed()));
97          QObject::connect(ui.LoadModeComboBox,          QObject::connect(m_ui.LoadModeComboBox,
98                  SIGNAL(activated(int)),                  SIGNAL(activated(int)),
99                  SLOT(changed()));                  SLOT(changed()));
100          QObject::connect(ui.OkPushButton,          QObject::connect(m_ui.DialogButtonBox,
101                  SIGNAL(clicked()),                  SIGNAL(accepted()),
102                  SLOT(accept()));                  SLOT(accept()));
103          QObject::connect(ui.CancelPushButton,          QObject::connect(m_ui.DialogButtonBox,
104                  SIGNAL(clicked()),                  SIGNAL(rejected()),
105                  SLOT(reject()));                  SLOT(reject()));
106  }  }
107    
108  InstrumentForm::~InstrumentForm() {  
109    InstrumentForm::~InstrumentForm (void)
110    {
111  }  }
112    
113    
114  // Channel dialog setup formal initializer.  // Channel dialog setup formal initializer.
115  void InstrumentForm::setup ( qsamplerInstrument *pInstrument )  void InstrumentForm::setup ( Instrument *pInstrument )
116  {  {
117          m_pInstrument = pInstrument;          m_pInstrument = pInstrument;
118    
# Line 118  void InstrumentForm::setup ( qsamplerIns Line 130  void InstrumentForm::setup ( qsamplerIns
130          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
131                  return;                  return;
132    
133          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
134          if (pOptions == NULL)          if (pOptions == NULL)
135                  return;                  return;
136    
# Line 133  void InstrumentForm::setup ( qsamplerIns Line 145  void InstrumentForm::setup ( qsamplerIns
145          m_iDirtySetup++;          m_iDirtySetup++;
146    
147          // Load combo box history...          // Load combo box history...
148          pOptions->loadComboBoxHistory(ui.InstrumentFileComboBox);          pOptions->loadComboBoxHistory(m_ui.InstrumentFileComboBox);
149    
150          // Populate maps list.          // Populate maps list.
151          ui.MapComboBox->clear();          m_ui.MapComboBox->clear();
152          ui.MapComboBox->insertItems(0, qsamplerInstrument::getMapNames());          m_ui.MapComboBox->insertItems(0, Instrument::getMapNames());
153    
154          // Populate Engines list.          // Populate Engines list.
155          const char **ppszEngines = ::lscp_list_available_engines(pMainForm->client());          const char **ppszEngines
156                    = ::lscp_list_available_engines(pMainForm->client());
157          if (ppszEngines) {          if (ppszEngines) {
158                  ui.EngineNameComboBox->clear();                  m_ui.EngineNameComboBox->clear();
159                  for (int iEngine = 0; ppszEngines[iEngine]; iEngine++)                  for (int iEngine = 0; ppszEngines[iEngine]; iEngine++)
160                          ui.EngineNameComboBox->addItem(ppszEngines[iEngine]);                          m_ui.EngineNameComboBox->addItem(ppszEngines[iEngine]);
161          }          }
162          else pMainForm->appendMessagesClient("lscp_list_available_engines");          else pMainForm->appendMessagesClient("lscp_list_available_engines");
163    
# Line 155  void InstrumentForm::setup ( qsamplerIns Line 168  void InstrumentForm::setup ( qsamplerIns
168          int iMap = (bNew ? pOptions->iMidiMap : m_pInstrument->map());          int iMap = (bNew ? pOptions->iMidiMap : m_pInstrument->map());
169          if (iMap < 0)          if (iMap < 0)
170                  iMap = 0;                  iMap = 0;
171          const QString& sMapName = qsamplerInstrument::getMapName(iMap);          const QString& sMapName = Instrument::getMapName(iMap);
172          if (!sMapName.isEmpty()) {          if (!sMapName.isEmpty()) {
173                  ui.MapComboBox->setItemText(                  m_ui.MapComboBox->setCurrentIndex(
174                          ui.MapComboBox->currentIndex(),                          m_ui.MapComboBox->findText(sMapName,
175                          sMapName);                                  Qt::MatchExactly | Qt::MatchCaseSensitive));
176          }          }
177    
178          // It might be no maps around...          // It might be no maps around...
179          bool bMapEnabled = (ui.MapComboBox->count() > 0);          bool bMapEnabled = (m_ui.MapComboBox->count() > 0);
180          ui.MapTextLabel->setEnabled(bMapEnabled);          m_ui.MapTextLabel->setEnabled(bMapEnabled);
181          ui.MapComboBox->setEnabled(bMapEnabled);          m_ui.MapComboBox->setEnabled(bMapEnabled);
182    
183          // Instrument bank/program...          // Instrument bank/program...
184          int iBank = (bNew ? pOptions->iMidiBank : m_pInstrument->bank());          int iBank = (bNew ? pOptions->iMidiBank : m_pInstrument->bank());
# Line 173  void InstrumentForm::setup ( qsamplerIns Line 187  void InstrumentForm::setup ( qsamplerIns
187                  iProg = 1;                  iProg = 1;
188                  iBank++;                  iBank++;
189          }          }
190          ui.BankSpinBox->setValue(iBank);          m_ui.BankSpinBox->setValue(iBank);
191          ui.ProgSpinBox->setValue(iProg);          m_ui.ProgSpinBox->setValue(iProg);
192    
193          // Instrument name...          // Instrument name...
194          ui.NameLineEdit->setText(m_pInstrument->name());          m_ui.NameLineEdit->setText(m_pInstrument->name());
195    
196          // Engine name...          // Engine name...
197          QString sEngineName = m_pInstrument->engineName();          QString sEngineName = m_pInstrument->engineName();
198          if (sEngineName.isEmpty() || bNew)          if (sEngineName.isEmpty() || bNew)
199                  sEngineName = pOptions->sEngineName;                  sEngineName = pOptions->sEngineName;
200          if (sEngineName.isEmpty())          if (sEngineName.isEmpty())
201                  sEngineName = qsamplerChannel::noEngineName();                  sEngineName = Channel::noEngineName();
202          if (ui.EngineNameComboBox->findText(sEngineName,          if (m_ui.EngineNameComboBox->findText(sEngineName,
203                          Qt::MatchExactly | Qt::MatchCaseSensitive) < 0) {                          Qt::MatchExactly | Qt::MatchCaseSensitive) < 0) {
204                  ui.EngineNameComboBox->addItem(sEngineName);                  m_ui.EngineNameComboBox->addItem(sEngineName);
205          }          }
206          ui.EngineNameComboBox->setItemText(          m_ui.EngineNameComboBox->setCurrentIndex(
207                  ui.EngineNameComboBox->currentIndex(),                  m_ui.EngineNameComboBox->findText(sEngineName,
208                  sEngineName);                          Qt::MatchExactly | Qt::MatchCaseSensitive));
209    
210          // Instrument filename and index...          // Instrument filename and index...
211          QString sInstrumentFile = m_pInstrument->instrumentFile();          QString sInstrumentFile = m_pInstrument->instrumentFile();
212          if (sInstrumentFile.isEmpty())          if (sInstrumentFile.isEmpty())
213                  sInstrumentFile = qsamplerChannel::noInstrumentName();                  sInstrumentFile = Channel::noInstrumentName();
214          ui.InstrumentFileComboBox->setItemText(          m_ui.InstrumentFileComboBox->setEditText(sInstrumentFile);
215                  ui.InstrumentFileComboBox->currentIndex(),          m_ui.InstrumentNrComboBox->clear();
216                  sInstrumentFile);          m_ui.InstrumentNrComboBox->insertItems(0,
217          ui.InstrumentNrComboBox->clear();                  Channel::getInstrumentList(sInstrumentFile,
         ui.InstrumentNrComboBox->insertItems(0,  
                 qsamplerChannel::getInstrumentList(sInstrumentFile,  
218                  pOptions->bInstrumentNames));                  pOptions->bInstrumentNames));
219          ui.InstrumentNrComboBox->setCurrentIndex(m_pInstrument->instrumentNr());          m_ui.InstrumentNrComboBox->setCurrentIndex(m_pInstrument->instrumentNr());
220    
221          // Instrument volume....          // Instrument volume....
222          int iVolume = (bNew ? pOptions->iVolume :          int iVolume = (bNew ? pOptions->iVolume :
223                  ::lroundf(100.0f * m_pInstrument->volume()));                  ::lroundf(100.0f * m_pInstrument->volume()));
224          ui.VolumeSpinBox->setValue(iVolume);          m_ui.VolumeSpinBox->setValue(iVolume);
225    
226          // Instrument load mode...          // Instrument load mode...
227          int iLoadMode = (bNew ? pOptions->iLoadMode :          int iLoadMode = (bNew ? pOptions->iLoadMode :
228                  m_pInstrument->loadMode());                  m_pInstrument->loadMode());
229          ui.LoadModeComboBox->setCurrentIndex(iLoadMode);          m_ui.LoadModeComboBox->setCurrentIndex(iLoadMode);
   
         // Done.  
         m_iDirtySetup--;  
         stabilizeForm();  
230    
231          // Done.          // Done.
232          m_iDirtySetup--;          m_iDirtySetup--;
# Line 243  void InstrumentForm::openInstrumentFile Line 252  void InstrumentForm::openInstrumentFile
252          if (pMainForm == NULL)          if (pMainForm == NULL)
253                  return;                  return;
254    
255          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
256          if (pOptions == NULL)          if (pOptions == NULL)
257                  return;                  return;
258    
# Line 258  void InstrumentForm::openInstrumentFile Line 267  void InstrumentForm::openInstrumentFile
267          if (sInstrumentFile.isEmpty())          if (sInstrumentFile.isEmpty())
268                  return;                  return;
269    
270          ui.InstrumentFileComboBox->setItemText(          m_ui.InstrumentFileComboBox->setEditText(sInstrumentFile);
                 ui.InstrumentFileComboBox->currentIndex(),  
                 sInstrumentFile);  
   
271          updateInstrumentName();          updateInstrumentName();
272  }  }
273    
# Line 273  void InstrumentForm::updateInstrumentNam Line 279  void InstrumentForm::updateInstrumentNam
279          if (pMainForm == NULL)          if (pMainForm == NULL)
280                  return;                  return;
281    
282          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
283          if (pOptions == NULL)          if (pOptions == NULL)
284                  return;                  return;
285    
286          // TODO: this better idea would be to use libgig          // TODO: this better idea would be to use libgig
287          // to retrieve the REAL instrument names.          // to retrieve the REAL instrument names.
288          ui.InstrumentNrComboBox->clear();          m_ui.InstrumentNrComboBox->clear();
289          ui.InstrumentNrComboBox->insertItems(0,          m_ui.InstrumentNrComboBox->insertItems(0,
290                  qsamplerChannel::getInstrumentList(                  Channel::getInstrumentList(
291                          ui.InstrumentFileComboBox->currentText(),                          m_ui.InstrumentFileComboBox->currentText(),
292                          pOptions->bInstrumentNames)                          pOptions->bInstrumentNames)
293          );          );
294    
# Line 296  void InstrumentForm::instrumentNrChanged Line 302  void InstrumentForm::instrumentNrChanged
302          if (m_iDirtySetup > 0)          if (m_iDirtySetup > 0)
303                  return;                  return;
304    
305          if (ui.NameLineEdit->text().isEmpty() || m_iDirtyName == 0) {          if (m_ui.NameLineEdit->text().isEmpty() || m_iDirtyName == 0) {
306                  ui.NameLineEdit->setText(ui.InstrumentNrComboBox->currentText());                  m_ui.NameLineEdit->setText(m_ui.InstrumentNrComboBox->currentText());
307                  m_iDirtyName = 0;                  m_iDirtyName = 0;
308          }          }
309    
# Line 317  void InstrumentForm::accept (void) Line 323  void InstrumentForm::accept (void)
323          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
324                  return;                  return;
325    
326          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
327          if (pOptions == NULL)          if (pOptions == NULL)
328                  return;                  return;
329    
330          if (m_iDirtyCount > 0) {          if (m_iDirtyCount > 0) {
331                  m_pInstrument->setMap(ui.MapComboBox->currentIndex());                  m_pInstrument->setMap(m_ui.MapComboBox->currentIndex());
332                  m_pInstrument->setBank(ui.BankSpinBox->value());                  m_pInstrument->setBank(m_ui.BankSpinBox->value());
333                  m_pInstrument->setProg(ui.ProgSpinBox->value() - 1);                  m_pInstrument->setProg(m_ui.ProgSpinBox->value() - 1);
334                  m_pInstrument->setName(ui.NameLineEdit->text());                  m_pInstrument->setName(m_ui.NameLineEdit->text());
335                  m_pInstrument->setEngineName(ui.EngineNameComboBox->currentText());                  m_pInstrument->setEngineName(m_ui.EngineNameComboBox->currentText());
336                  m_pInstrument->setInstrumentFile(ui.InstrumentFileComboBox->currentText());                  m_pInstrument->setInstrumentFile(m_ui.InstrumentFileComboBox->currentText());
337                  m_pInstrument->setInstrumentNr(ui.InstrumentNrComboBox->currentIndex());                  m_pInstrument->setInstrumentNr(m_ui.InstrumentNrComboBox->currentIndex());
338                  m_pInstrument->setVolume(0.01f * float(ui.VolumeSpinBox->value()));                  m_pInstrument->setVolume(0.01f * float(m_ui.VolumeSpinBox->value()));
339                  m_pInstrument->setLoadMode(ui.LoadModeComboBox->currentIndex());                  m_pInstrument->setLoadMode(m_ui.LoadModeComboBox->currentIndex());
340          }          }
341    
342          // Save default engine name, instrument directory and history...          // Save default engine name, instrument directory and history...
343          pOptions->sInstrumentDir = QFileInfo(          pOptions->sInstrumentDir = QFileInfo(
344                  ui.InstrumentFileComboBox->currentText()).dir().absolutePath();                  m_ui.InstrumentFileComboBox->currentText()).dir().absolutePath();
345          pOptions->sEngineName = ui.EngineNameComboBox->currentText();          pOptions->sEngineName = m_ui.EngineNameComboBox->currentText();
346          pOptions->iMidiMap  = ui.MapComboBox->currentIndex();          pOptions->iMidiMap  = m_ui.MapComboBox->currentIndex();
347          pOptions->iMidiBank = ui.BankSpinBox->value();          pOptions->iMidiBank = m_ui.BankSpinBox->value();
348          pOptions->iMidiProg = ui.ProgSpinBox->value();          pOptions->iMidiProg = m_ui.ProgSpinBox->value();
349          pOptions->iVolume   = ui.VolumeSpinBox->value();          pOptions->iVolume   = m_ui.VolumeSpinBox->value();
350          pOptions->iLoadMode = ui.LoadModeComboBox->currentIndex();          pOptions->iLoadMode = m_ui.LoadModeComboBox->currentIndex();
351          pOptions->saveComboBoxHistory(ui.InstrumentFileComboBox);          pOptions->saveComboBoxHistory(m_ui.InstrumentFileComboBox);
352    
353          // Just go with dialog acceptance.          // Just go with dialog acceptance.
354          QDialog::accept();          QDialog::accept();
# Line 355  void InstrumentForm::reject (void) Line 361  void InstrumentForm::reject (void)
361          bool bReject = true;          bool bReject = true;
362    
363          // Check if there's any pending changes...          // Check if there's any pending changes...
364          if (m_iDirtyCount > 0 && ui.OkPushButton->isEnabled()) {          if (m_iDirtyCount > 0) {
365                  switch (QMessageBox::warning(this,                  switch (QMessageBox::warning(this,
366                          QSAMPLER_TITLE ": " + tr("Warning"),                          QSAMPLER_TITLE ": " + tr("Warning"),
367                          tr("Some channel settings have been changed.\n\n"                          tr("Some channel settings have been changed.\n\n"
368                          "Do you want to apply the changes?"),                          "Do you want to apply the changes?"),
369                          tr("Apply"), tr("Discard"), tr("Cancel"))) {                          QMessageBox::Apply |
370                  case 0:     // Apply...                          QMessageBox::Discard |
371                            QMessageBox::Cancel)) {
372                    case QMessageBox::Apply:
373                          accept();                          accept();
374                          return;                          return;
375                  case 1:     // Discard                  case QMessageBox::Discard:
376                          break;                          break;
377                  default:    // Cancel.                  default:    // Cancel.
378                          bReject = false;                          bReject = false;
# Line 391  void InstrumentForm::changed (void) Line 399  void InstrumentForm::changed (void)
399  // Stabilize current form state.  // Stabilize current form state.
400  void InstrumentForm::stabilizeForm (void)  void InstrumentForm::stabilizeForm (void)
401  {  {
402          bool bValid = !ui.NameLineEdit->text().isEmpty();          bool bValid = !m_ui.NameLineEdit->text().isEmpty()
403                    && m_ui.EngineNameComboBox->currentIndex() >= 0
404                    && m_ui.EngineNameComboBox->currentText() != Channel::noEngineName();
405    
406          const QString& sPath = ui.InstrumentFileComboBox->currentText();          const QString& sPath = m_ui.InstrumentFileComboBox->currentText();
407          bValid = bValid && !sPath.isEmpty() && QFileInfo(sPath).exists();          bValid = bValid && !sPath.isEmpty() && QFileInfo(sPath).exists();
408    
409          ui.OkPushButton->setEnabled(m_iDirtyCount > 0 && bValid);          m_ui.DialogButtonBox->button(
410                    QDialogButtonBox::Ok)->setEnabled(m_iDirtyCount > 0 && bValid);
411  }  }
412    
413  } // namespace QSampler  } // namespace QSampler

Legend:
Removed from v.1499  
changed lines
  Added in v.2107

  ViewVC Help
Powered by ViewVC