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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1840 - (show annotations) (download)
Thu Feb 19 11:44:57 2009 UTC (11 years, 1 month ago) by capela
File size: 11289 byte(s)
* Converted obsolete QMessageBox forms to standard buttons.

1 // qsamplerInstrumentForm.cpp
2 //
3 /****************************************************************************
4 Copyright (C) 2003-2009, rncbc aka Rui Nuno Capela. All rights reserved.
5 Copyright (C) 2007, 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
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 "qsamplerAbout.h"
24 #include "qsamplerInstrumentForm.h"
25
26 #include "qsamplerOptions.h"
27 #include "qsamplerChannel.h"
28 #include "qsamplerMainForm.h"
29
30 #include <QFileDialog>
31 #include <QMessageBox>
32
33 // Needed for lroundf()
34 #include <math.h>
35
36 #ifndef CONFIG_ROUND
37 static inline long lroundf ( float x )
38 {
39 if (x >= 0.0f)
40 return long(x + 0.5f);
41 else
42 return long(x - 0.5f);
43 }
44 #endif
45
46
47 namespace QSampler {
48
49 //-------------------------------------------------------------------------
50 // QSampler::InstrumentForm -- Instrument map item form implementation.
51 //
52
53 InstrumentForm::InstrumentForm ( QWidget* pParent )
54 : QDialog(pParent)
55 {
56 m_ui.setupUi(this);
57
58 // Initialize locals.
59 m_pInstrument = NULL;
60
61 m_iDirtySetup = 0;
62 m_iDirtyCount = 0;
63 m_iDirtyName = 0;
64
65 // Try to restore normal window positioning.
66 adjustSize();
67
68
69 QObject::connect(m_ui.MapComboBox,
70 SIGNAL(activated(int)),
71 SLOT(changed()));
72 QObject::connect(m_ui.BankSpinBox,
73 SIGNAL(valueChanged(int)),
74 SLOT(changed()));
75 QObject::connect(m_ui.ProgSpinBox,
76 SIGNAL(valueChanged(int)),
77 SLOT(changed()));
78 QObject::connect(m_ui.NameLineEdit,
79 SIGNAL(textChanged(const QString&)),
80 SLOT(nameChanged(const QString&)));
81 QObject::connect(m_ui.EngineNameComboBox,
82 SIGNAL(activated(int)),
83 SLOT(changed()));
84 QObject::connect(m_ui.InstrumentFileComboBox,
85 SIGNAL(activated(const QString&)),
86 SLOT(updateInstrumentName()));
87 QObject::connect(m_ui.InstrumentFileToolButton,
88 SIGNAL(clicked()),
89 SLOT(openInstrumentFile()));
90 QObject::connect(m_ui.InstrumentNrComboBox,
91 SIGNAL(activated(int)),
92 SLOT(instrumentNrChanged()));
93 QObject::connect(m_ui.VolumeSpinBox,
94 SIGNAL(valueChanged(int)),
95 SLOT(changed()));
96 QObject::connect(m_ui.LoadModeComboBox,
97 SIGNAL(activated(int)),
98 SLOT(changed()));
99 QObject::connect(m_ui.OkPushButton,
100 SIGNAL(clicked()),
101 SLOT(accept()));
102 QObject::connect(m_ui.CancelPushButton,
103 SIGNAL(clicked()),
104 SLOT(reject()));
105 }
106
107
108 InstrumentForm::~InstrumentForm (void)
109 {
110 }
111
112
113 // Channel dialog setup formal initializer.
114 void InstrumentForm::setup ( Instrument *pInstrument )
115 {
116 m_pInstrument = pInstrument;
117
118 m_iDirtySetup = 0;
119 m_iDirtyCount = 0;
120 m_iDirtyName = 0;
121
122 if (m_pInstrument == NULL)
123 return;
124
125 // Check if we're up and connected.
126 MainForm* pMainForm = MainForm::getInstance();
127 if (pMainForm == NULL)
128 return;
129 if (pMainForm->client() == NULL)
130 return;
131
132 Options *pOptions = pMainForm->options();
133 if (pOptions == NULL)
134 return;
135
136 // It can be a brand new channel, remember?
137 bool bNew = (m_pInstrument->bank() < 0 || m_pInstrument->prog() < 0);
138 if (!bNew) {
139 m_pInstrument->getInstrument();
140 m_iDirtyName++;
141 }
142
143 // Avoid nested changes.
144 m_iDirtySetup++;
145
146 // Load combo box history...
147 pOptions->loadComboBoxHistory(m_ui.InstrumentFileComboBox);
148
149 // Populate maps list.
150 m_ui.MapComboBox->clear();
151 m_ui.MapComboBox->insertItems(0, Instrument::getMapNames());
152
153 // Populate Engines list.
154 const char **ppszEngines
155 = ::lscp_list_available_engines(pMainForm->client());
156 if (ppszEngines) {
157 m_ui.EngineNameComboBox->clear();
158 for (int iEngine = 0; ppszEngines[iEngine]; iEngine++)
159 m_ui.EngineNameComboBox->addItem(ppszEngines[iEngine]);
160 }
161 else pMainForm->appendMessagesClient("lscp_list_available_engines");
162
163 // Read proper instrument information,
164 // and populate the instrument form fields.
165
166 // Instrument map name...
167 int iMap = (bNew ? pOptions->iMidiMap : m_pInstrument->map());
168 if (iMap < 0)
169 iMap = 0;
170 const QString& sMapName = Instrument::getMapName(iMap);
171 if (!sMapName.isEmpty()) {
172 m_ui.MapComboBox->setCurrentIndex(
173 m_ui.MapComboBox->findText(sMapName,
174 Qt::MatchExactly | Qt::MatchCaseSensitive));
175 }
176
177 // It might be no maps around...
178 bool bMapEnabled = (m_ui.MapComboBox->count() > 0);
179 m_ui.MapTextLabel->setEnabled(bMapEnabled);
180 m_ui.MapComboBox->setEnabled(bMapEnabled);
181
182 // Instrument bank/program...
183 int iBank = (bNew ? pOptions->iMidiBank : m_pInstrument->bank());
184 int iProg = (bNew ? pOptions->iMidiProg : m_pInstrument->prog()) + 1;
185 if (bNew && iProg > 128) {
186 iProg = 1;
187 iBank++;
188 }
189 m_ui.BankSpinBox->setValue(iBank);
190 m_ui.ProgSpinBox->setValue(iProg);
191
192 // Instrument name...
193 m_ui.NameLineEdit->setText(m_pInstrument->name());
194
195 // Engine name...
196 QString sEngineName = m_pInstrument->engineName();
197 if (sEngineName.isEmpty() || bNew)
198 sEngineName = pOptions->sEngineName;
199 if (sEngineName.isEmpty())
200 sEngineName = Channel::noEngineName();
201 if (m_ui.EngineNameComboBox->findText(sEngineName,
202 Qt::MatchExactly | Qt::MatchCaseSensitive) < 0) {
203 m_ui.EngineNameComboBox->addItem(sEngineName);
204 }
205 m_ui.EngineNameComboBox->setCurrentIndex(
206 m_ui.EngineNameComboBox->findText(sEngineName,
207 Qt::MatchExactly | Qt::MatchCaseSensitive));
208
209 // Instrument filename and index...
210 QString sInstrumentFile = m_pInstrument->instrumentFile();
211 if (sInstrumentFile.isEmpty())
212 sInstrumentFile = Channel::noInstrumentName();
213 m_ui.InstrumentFileComboBox->setEditText(sInstrumentFile);
214 m_ui.InstrumentNrComboBox->clear();
215 m_ui.InstrumentNrComboBox->insertItems(0,
216 Channel::getInstrumentList(sInstrumentFile,
217 pOptions->bInstrumentNames));
218 m_ui.InstrumentNrComboBox->setCurrentIndex(m_pInstrument->instrumentNr());
219
220 // Instrument volume....
221 int iVolume = (bNew ? pOptions->iVolume :
222 ::lroundf(100.0f * m_pInstrument->volume()));
223 m_ui.VolumeSpinBox->setValue(iVolume);
224
225 // Instrument load mode...
226 int iLoadMode = (bNew ? pOptions->iLoadMode :
227 m_pInstrument->loadMode());
228 m_ui.LoadModeComboBox->setCurrentIndex(iLoadMode);
229
230 // Done.
231 m_iDirtySetup--;
232 stabilizeForm();
233
234 // Done.
235 m_iDirtySetup--;
236 stabilizeForm();
237 }
238
239
240 // Special case for name change,
241 void InstrumentForm::nameChanged ( const QString& /* sName */ )
242 {
243 if (m_iDirtySetup > 0)
244 return;
245
246 m_iDirtyName++;
247 changed();
248 }
249
250
251 // Browse and open an instrument file.
252 void InstrumentForm::openInstrumentFile (void)
253 {
254 MainForm* pMainForm = MainForm::getInstance();
255 if (pMainForm == NULL)
256 return;
257
258 Options *pOptions = pMainForm->options();
259 if (pOptions == NULL)
260 return;
261
262 // FIXME: the instrument file filters should be restricted,
263 // depending on the current engine.
264 QString sInstrumentFile = QFileDialog::getOpenFileName(this,
265 QSAMPLER_TITLE ": " + tr("Instrument files"), // Caption.
266 pOptions->sInstrumentDir, // Start here.
267 tr("Instrument files") + " (*.gig *.dls)" // Filter (GIG and DLS files)
268 );
269
270 if (sInstrumentFile.isEmpty())
271 return;
272
273 m_ui.InstrumentFileComboBox->setEditText(sInstrumentFile);
274 updateInstrumentName();
275 }
276
277
278 // Refresh the actual instrument name.
279 void InstrumentForm::updateInstrumentName (void)
280 {
281 MainForm* pMainForm = MainForm::getInstance();
282 if (pMainForm == NULL)
283 return;
284
285 Options *pOptions = pMainForm->options();
286 if (pOptions == NULL)
287 return;
288
289 // TODO: this better idea would be to use libgig
290 // to retrieve the REAL instrument names.
291 m_ui.InstrumentNrComboBox->clear();
292 m_ui.InstrumentNrComboBox->insertItems(0,
293 Channel::getInstrumentList(
294 m_ui.InstrumentFileComboBox->currentText(),
295 pOptions->bInstrumentNames)
296 );
297
298 instrumentNrChanged();
299 }
300
301
302 // Special case for instrumnet index change,
303 void InstrumentForm::instrumentNrChanged (void)
304 {
305 if (m_iDirtySetup > 0)
306 return;
307
308 if (m_ui.NameLineEdit->text().isEmpty() || m_iDirtyName == 0) {
309 m_ui.NameLineEdit->setText(m_ui.InstrumentNrComboBox->currentText());
310 m_iDirtyName = 0;
311 }
312
313 changed();
314 }
315
316
317 // Accept settings (OK button slot).
318 void InstrumentForm::accept (void)
319 {
320 if (m_pInstrument == NULL)
321 return;
322
323 MainForm* pMainForm = MainForm::getInstance();
324 if (pMainForm == NULL)
325 return;
326 if (pMainForm->client() == NULL)
327 return;
328
329 Options *pOptions = pMainForm->options();
330 if (pOptions == NULL)
331 return;
332
333 if (m_iDirtyCount > 0) {
334 m_pInstrument->setMap(m_ui.MapComboBox->currentIndex());
335 m_pInstrument->setBank(m_ui.BankSpinBox->value());
336 m_pInstrument->setProg(m_ui.ProgSpinBox->value() - 1);
337 m_pInstrument->setName(m_ui.NameLineEdit->text());
338 m_pInstrument->setEngineName(m_ui.EngineNameComboBox->currentText());
339 m_pInstrument->setInstrumentFile(m_ui.InstrumentFileComboBox->currentText());
340 m_pInstrument->setInstrumentNr(m_ui.InstrumentNrComboBox->currentIndex());
341 m_pInstrument->setVolume(0.01f * float(m_ui.VolumeSpinBox->value()));
342 m_pInstrument->setLoadMode(m_ui.LoadModeComboBox->currentIndex());
343 }
344
345 // Save default engine name, instrument directory and history...
346 pOptions->sInstrumentDir = QFileInfo(
347 m_ui.InstrumentFileComboBox->currentText()).dir().absolutePath();
348 pOptions->sEngineName = m_ui.EngineNameComboBox->currentText();
349 pOptions->iMidiMap = m_ui.MapComboBox->currentIndex();
350 pOptions->iMidiBank = m_ui.BankSpinBox->value();
351 pOptions->iMidiProg = m_ui.ProgSpinBox->value();
352 pOptions->iVolume = m_ui.VolumeSpinBox->value();
353 pOptions->iLoadMode = m_ui.LoadModeComboBox->currentIndex();
354 pOptions->saveComboBoxHistory(m_ui.InstrumentFileComboBox);
355
356 // Just go with dialog acceptance.
357 QDialog::accept();
358 }
359
360
361 // Reject settings (Cancel button slot).
362 void InstrumentForm::reject (void)
363 {
364 bool bReject = true;
365
366 // Check if there's any pending changes...
367 if (m_iDirtyCount > 0 && m_ui.OkPushButton->isEnabled()) {
368 switch (QMessageBox::warning(this,
369 QSAMPLER_TITLE ": " + tr("Warning"),
370 tr("Some channel settings have been changed.\n\n"
371 "Do you want to apply the changes?"),
372 QMessageBox::Apply |
373 QMessageBox::Discard |
374 QMessageBox::Cancel)) {
375 case QMessageBox::Apply:
376 accept();
377 return;
378 case QMessageBox::Discard:
379 break;
380 default: // Cancel.
381 bReject = false;
382 break;
383 }
384 }
385
386 if (bReject)
387 QDialog::reject();
388 }
389
390
391 // Dirty up settings.
392 void InstrumentForm::changed (void)
393 {
394 if (m_iDirtySetup > 0)
395 return;
396
397 m_iDirtyCount++;
398 stabilizeForm();
399 }
400
401
402 // Stabilize current form state.
403 void InstrumentForm::stabilizeForm (void)
404 {
405 bool bValid =
406 !m_ui.NameLineEdit->text().isEmpty() &&
407 m_ui.EngineNameComboBox->currentIndex() >= 0 &&
408 m_ui.EngineNameComboBox->currentText() !=
409 Channel::noEngineName();
410
411 const QString& sPath = m_ui.InstrumentFileComboBox->currentText();
412 bValid = bValid && !sPath.isEmpty() && QFileInfo(sPath).exists();
413
414 m_ui.OkPushButton->setEnabled(m_iDirtyCount > 0 && bValid);
415 }
416
417 } // namespace QSampler
418
419
420 // end of qsamplerInstrumentForm.cpp

  ViewVC Help
Powered by ViewVC