~ubuntu-branches/ubuntu/karmic/qsampler/karmic

« back to all changes in this revision

Viewing changes to src/qsamplerInstrumentForm.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Free Ekanayaka
  • Date: 2008-08-28 08:43:21 UTC
  • mfrom: (1.1.1 upstream) (2.1.2 hardy)
  • Revision ID: james.westby@ubuntu.com-20080828084321-guq8v04yg31co9gm
Tags: 0.2.1-1
* New upstream release
* Uploaded to Debian (Closes: #280576)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// qsamplerInstrumentForm.cpp
 
2
//
 
3
/****************************************************************************
 
4
   Copyright (C) 2003-2007, 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
                        tr("Apply"), tr("Discard"), tr("Cancel"))) {
 
373
                case 0:     // Apply...
 
374
                        accept();
 
375
                        return;
 
376
                case 1:     // Discard
 
377
                        break;
 
378
                default:    // Cancel.
 
379
                        bReject = false;
 
380
                        break;
 
381
                }
 
382
        }
 
383
 
 
384
        if (bReject)
 
385
                QDialog::reject();
 
386
}
 
387
 
 
388
 
 
389
// Dirty up settings.
 
390
void InstrumentForm::changed (void)
 
391
{
 
392
        if (m_iDirtySetup > 0)
 
393
                return;
 
394
 
 
395
        m_iDirtyCount++;
 
396
        stabilizeForm();
 
397
}
 
398
 
 
399
 
 
400
// Stabilize current form state.
 
401
void InstrumentForm::stabilizeForm (void)
 
402
{
 
403
        bool bValid =
 
404
                !m_ui.NameLineEdit->text().isEmpty() &&
 
405
                m_ui.EngineNameComboBox->currentIndex() >= 0 &&
 
406
                m_ui.EngineNameComboBox->currentText() !=
 
407
                Channel::noEngineName();
 
408
 
 
409
        const QString& sPath = m_ui.InstrumentFileComboBox->currentText();
 
410
        bValid = bValid && !sPath.isEmpty() && QFileInfo(sPath).exists();
 
411
 
 
412
        m_ui.OkPushButton->setEnabled(m_iDirtyCount > 0 && bValid);
 
413
}
 
414
 
 
415
} // namespace QSampler
 
416
 
 
417
 
 
418
// end of qsamplerInstrumentForm.cpp