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

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

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

revision 1464 by capela, Thu Nov 1 17:14:21 2007 UTC revision 1840 by capela, Thu Feb 19 11:44:57 2009 UTC
# Line 1  Line 1 
1  // qsamplerInstrumentListForm.cpp  // qsamplerInstrumentListForm.cpp
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2003-2007, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2003-2009, 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 "qsamplerInstrumentListForm.h"  #include "qsamplerInstrumentListForm.h"
25    
26  #include "qsamplerMainForm.h"  #include "qsamplerInstrumentForm.h"
27    
28  #include "qsamplerOptions.h"  #include "qsamplerOptions.h"
29  #include "qsamplerInstrument.h"  #include "qsamplerInstrument.h"
30    #include "qsamplerMainForm.h"
31    
32    #include <QHeaderView>
33    #include <QMessageBox>
34    
 #include <QToolTip>  
35    
36  namespace QSampler {  namespace QSampler {
37    
38  InstrumentListForm::InstrumentListForm(QWidget* parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) {  //-------------------------------------------------------------------------
39      ui.setupUi(this);  // QSampler::InstrumentListForm -- Instrument map list form implementation.
40    //
41    
42    InstrumentListForm::InstrumentListForm (
43            QWidget* pParent, Qt::WindowFlags wflags )
44            : QMainWindow(pParent, wflags)
45    {
46            m_ui.setupUi(this);
47    
48      ui.newInstrumentAction->setText(tr("New &Instrument..."));          // Setup toolbar widgets.
49      ui.newInstrumentAction->setShortcut(Qt::Key_Insert);          m_pMapComboBox = new QComboBox(m_ui.InstrumentToolbar);
50      ui.editInstrumentAction->setText(tr("&Edit..."));          m_pMapComboBox->setMinimumWidth(120);
51      ui.editInstrumentAction->setShortcut(Qt::Key_Enter);          m_pMapComboBox->setEnabled(false);
52      ui.deleteInstrumentAction->setText(tr("&Delete"));          m_pMapComboBox->setToolTip(tr("Instrument Map"));
53      ui.deleteInstrumentAction->setShortcut(Qt::Key_Delete);          m_ui.InstrumentToolbar->addWidget(m_pMapComboBox);
54      ui.refreshInstrumentsAction->setText(tr("&Refresh"));  
55      ui.refreshInstrumentsAction->setShortcut(Qt::Key_F5);          m_ui.InstrumentToolbar->addSeparator();
56            m_ui.InstrumentToolbar->addAction(m_ui.newInstrumentAction);
57      // Setup toolbar widgets.          m_ui.InstrumentToolbar->addAction(m_ui.editInstrumentAction);
58      InstrumentToolbar = addToolBar(tr("MIDI Instruments"));          m_ui.InstrumentToolbar->addAction(m_ui.deleteInstrumentAction);
59      m_pMapComboBox = new QComboBox(InstrumentToolbar);          m_ui.InstrumentToolbar->addSeparator();
60      m_pMapComboBox->setMinimumWidth(120);          m_ui.InstrumentToolbar->addAction(m_ui.refreshInstrumentsAction);
61      m_pMapComboBox->setEnabled(false);  
62      QToolTip::add(m_pMapComboBox, tr("Instrument Map"));          int iRowHeight = m_ui.InstrumentTable->fontMetrics().height() + 4;
63            m_ui.InstrumentTable->verticalHeader()->setDefaultSectionSize(iRowHeight);
64      InstrumentToolbar->addSeparator();  
65      ui.newInstrumentAction->addTo(InstrumentToolbar);          m_ui.InstrumentTable->setModel(&m_model);
66      ui.editInstrumentAction->addTo(InstrumentToolbar);          m_ui.InstrumentTable->setItemDelegate(&m_delegate);
67      ui.deleteInstrumentAction->addTo(InstrumentToolbar);          m_ui.InstrumentTable->verticalHeader()->hide();
68      InstrumentToolbar->addSeparator();  
69      ui.refreshInstrumentsAction->addTo(InstrumentToolbar);          QHeaderView *pHeader = m_ui.InstrumentTable->horizontalHeader();
70            pHeader->setDefaultAlignment(Qt::AlignLeft);
71            pHeader->setMovable(false);
72            pHeader->setStretchLastSection(true);
73            pHeader->resizeSection(0, 120);                                         // Name
74            m_ui.InstrumentTable->resizeColumnToContents(1);        // Map
75            m_ui.InstrumentTable->resizeColumnToContents(2);        // Bank
76            m_ui.InstrumentTable->resizeColumnToContents(3);        // Prog
77            m_ui.InstrumentTable->resizeColumnToContents(4);        // Engine
78            pHeader->resizeSection(5, 240);                                         // File
79            m_ui.InstrumentTable->resizeColumnToContents(6);        // Nr
80            pHeader->resizeSection(7, 60);                                          // Vol
81    
82      ui.InstrumentTable->setModel(&model);          // Enable custom context menu...
83      //ui.InstrumentTable->setDelegate(delegate);          m_ui.InstrumentTable->setContextMenuPolicy(Qt::CustomContextMenu);
84    
85          QObject::connect(m_pMapComboBox,          QObject::connect(m_pMapComboBox,
86                  SIGNAL(activated(int)),                  SIGNAL(activated(int)),
87                  SLOT(activateMap(int)));                  SLOT(activateMap(int)));
88            QObject::connect(
89                    m_ui.InstrumentTable,
90                    SIGNAL(customContextMenuRequested(const QPoint&)),
91                    SLOT(contextMenu(const QPoint&)));
92            QObject::connect(
93                    m_ui.InstrumentTable,
94                    SIGNAL(pressed(const QModelIndex&)),
95                    SLOT(stabilizeForm()));
96            QObject::connect(
97                    m_ui.InstrumentTable,
98                    SIGNAL(activated(const QModelIndex&)),
99                    SLOT(editInstrument(const QModelIndex&)));
100            QObject::connect(
101                    m_ui.newInstrumentAction,
102                    SIGNAL(triggered()),
103                    SLOT(newInstrument()));
104            QObject::connect(
105                    m_ui.deleteInstrumentAction,
106                    SIGNAL(triggered()),
107                    SLOT(deleteInstrument()));
108            QObject::connect(
109                    m_ui.editInstrumentAction,
110                    SIGNAL(triggered()),
111                    SLOT(editInstrument()));
112            QObject::connect(
113                    m_ui.refreshInstrumentsAction,
114                    SIGNAL(triggered()),
115                    SLOT(refreshInstruments()));
116    
117            MainForm *pMainForm = MainForm::getInstance();
118            if (pMainForm) {
119                    QObject::connect(&m_model,
120                            SIGNAL(instrumentsChanged()),
121                            pMainForm, SLOT(sessionDirty()));
122            }
123    
124      connect(          // Things must be stable from the start.
125          ui.refreshInstrumentsAction,          stabilizeForm();
         SIGNAL(triggered()), SLOT(refreshInstruments(void))  
     );  
126  }  }
127    
128  InstrumentListForm::~InstrumentListForm() {  
129    InstrumentListForm::~InstrumentListForm (void)
130    {
131          delete m_pMapComboBox;          delete m_pMapComboBox;
132  }  }
133    
# Line 77  InstrumentListForm::~InstrumentListForm( Line 135  InstrumentListForm::~InstrumentListForm(
135  // Notify our parent that we're emerging.  // Notify our parent that we're emerging.
136  void InstrumentListForm::showEvent ( QShowEvent *pShowEvent )  void InstrumentListForm::showEvent ( QShowEvent *pShowEvent )
137  {  {
138          //MainForm* pMainForm = MainForm::getInstance();          MainForm* pMainForm = MainForm::getInstance();
139          //if (pMainForm)          if (pMainForm)
140          //      pMainForm->stabilizeForm();                  pMainForm->stabilizeForm();
141    
142          QWidget::showEvent(pShowEvent);          QWidget::showEvent(pShowEvent);
143  }  }
# Line 90  void InstrumentListForm::hideEvent ( QHi Line 148  void InstrumentListForm::hideEvent ( QHi
148  {  {
149          QWidget::hideEvent(pHideEvent);          QWidget::hideEvent(pHideEvent);
150    
151          //MainForm* pMainForm = MainForm::getInstance();          MainForm* pMainForm = MainForm::getInstance();
152          //if (pMainForm)          if (pMainForm)
153          //      pMainForm->stabilizeForm();                  pMainForm->stabilizeForm();
154    }
155    
156    
157    // Just about to notify main-window that we're closing.
158    void InstrumentListForm::closeEvent ( QCloseEvent * /*pCloseEvent*/ )
159    {
160            QWidget::hide();
161    
162            MainForm *pMainForm = MainForm::getInstance();
163            if (pMainForm)
164                    pMainForm->stabilizeForm();
165  }  }
166    
167    
# Line 103  void InstrumentListForm::refreshInstrume Line 172  void InstrumentListForm::refreshInstrume
172          if (pMainForm == NULL)          if (pMainForm == NULL)
173                  return;                  return;
174    
175          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
176          if (pOptions == NULL)          if (pOptions == NULL)
177                  return;                  return;
178    
179          // Get/save current map selection...          // Get/save current map selection...
180          int iMap = m_pMapComboBox->currentItem();          int iMap = m_pMapComboBox->currentIndex();
181          if (iMap < 0 || m_pMapComboBox->count() < 2)          if (iMap < 0 || m_pMapComboBox->count() < 2)
182                  iMap = pOptions->iMidiMap + 1;                  iMap = pOptions->iMidiMap + 1;
183    
184          // Populate maps list.          // Populate maps list.
185          m_pMapComboBox->clear();          m_pMapComboBox->clear();
186          m_pMapComboBox->insertItem(tr("(All)"));          m_pMapComboBox->addItem(tr("(All)"));
187          m_pMapComboBox->insertStringList(qsamplerInstrument::getMapNames());          m_pMapComboBox->insertItems(1, Instrument::getMapNames());
188    
189          // Adjust to saved selection...          // Adjust to saved selection...
190          if (iMap < 0 || iMap >= m_pMapComboBox->count())          if (iMap < 0 || iMap >= m_pMapComboBox->count())
191                  iMap = 0;                  iMap = 0;
192          m_pMapComboBox->setCurrentItem(iMap);          m_pMapComboBox->setCurrentIndex(iMap);
193          m_pMapComboBox->setEnabled(m_pMapComboBox->count() > 1);          m_pMapComboBox->setEnabled(m_pMapComboBox->count() > 1);
194    
195          activateMap(iMap);          activateMap(iMap);
# Line 134  void InstrumentListForm::activateMap ( i Line 203  void InstrumentListForm::activateMap ( i
203          if (pMainForm == NULL)          if (pMainForm == NULL)
204                  return;                  return;
205    
206          qsamplerOptions *pOptions = pMainForm->options();          Options *pOptions = pMainForm->options();
207          if (pOptions == NULL)          if (pOptions == NULL)
208                  return;                  return;
209    
# Line 142  void InstrumentListForm::activateMap ( i Line 211  void InstrumentListForm::activateMap ( i
211          if (iMidiMap >= 0)          if (iMidiMap >= 0)
212                  pOptions->iMidiMap = iMidiMap;                  pOptions->iMidiMap = iMidiMap;
213    
214          model.setMidiMap(iMidiMap);          m_model.setMidiMap(iMidiMap);
215          model.refresh();          m_model.refresh();
216    
217            stabilizeForm();
218    }
219    
220    
221    void InstrumentListForm::editInstrument (void)
222    {
223            editInstrument(m_ui.InstrumentTable->currentIndex());
224  }  }
225    
226    
227    void InstrumentListForm::editInstrument ( const QModelIndex& index )
228    {
229            if (!index.isValid() || !index.data(Qt::UserRole).isValid())
230                    return;
231    
232            Instrument* pInstrument
233                    = static_cast<Instrument *> (
234                            index.data(Qt::UserRole).value<void *> ());
235    
236            if (pInstrument == NULL)
237                    return;
238    
239            // Save current key values...
240            Instrument oldInstrument(*pInstrument);
241            // Do the edit dance...
242            InstrumentForm form(this);
243            form.setup(pInstrument);
244            if (form.exec()) {
245                    // Commit...
246                    pInstrument->mapInstrument();
247                    // Check whether we changed instrument key...
248                    if (oldInstrument.map()  == pInstrument->map()  &&
249                            oldInstrument.bank() == pInstrument->bank() &&
250                            oldInstrument.prog() == pInstrument->prog()) {
251                            // Just update tree item...
252                            //pItem->update();
253                    } else {
254                            // Unmap old instance...
255                            oldInstrument.unmapInstrument();
256                            // correct the position of the instrument in the model
257                            m_model.resort(*pInstrument);
258                    }
259                    // Notify we've changes...
260                    emit m_model.reset();
261            }
262    }
263    
264    
265    void InstrumentListForm::newInstrument (void)
266    {
267            Instrument instrument;
268    
269            InstrumentForm form(this);
270            form.setup(&instrument);
271            if (!form.exec())
272                    return;
273    
274            // Commit...
275            instrument.mapInstrument();
276            // add new item to the table model
277            m_model.resort(instrument);
278            // Notify we've changes...
279            //emit model.reset();
280            //FIXME: call above didnt really refresh, so we use this for now ...
281            refreshInstruments();
282    }
283    
284    
285    void InstrumentListForm::deleteInstrument (void)
286    {
287            const QModelIndex& index = m_ui.InstrumentTable->currentIndex();
288            if (!index.isValid() || !index.data(Qt::UserRole).isValid())
289                    return;
290    
291            Instrument *pInstrument =
292                    static_cast<Instrument*> (
293                            index.data(Qt::UserRole).value<void *> ());
294    
295            if (pInstrument == NULL)
296                    return;
297    
298            MainForm *pMainForm = MainForm::getInstance();
299            if (pMainForm == NULL)
300                    return;
301    
302            // Prompt user if this is for real...
303            Options *pOptions = pMainForm->options();
304            if (pOptions && pOptions->bConfirmRemove) {
305                    if (QMessageBox::warning(this,
306                            QSAMPLER_TITLE ": " + tr("Warning"),
307                            tr("About to delete instrument map entry:\n\n"
308                            "%1\n\n"
309                            "Are you sure?")
310                            .arg(pInstrument->name()),
311                            QMessageBox::Ok | QMessageBox::Cancel)
312                            == QMessageBox::Cancel)
313                            return;
314            }
315    
316            pInstrument->unmapInstrument();
317            // let the instrument vanish from the table model
318            m_model.removeInstrument(*pInstrument);
319            // Notify we've changes...
320            emit m_model.reset();
321    }
322    
323    
324    // Update form actions enablement...
325    void InstrumentListForm::stabilizeForm (void)
326    {
327            MainForm *pMainForm = MainForm::getInstance();
328    
329            bool bEnabled = (pMainForm && pMainForm->client());
330            m_ui.newInstrumentAction->setEnabled(bEnabled);
331            const QModelIndex& index = m_ui.InstrumentTable->currentIndex();
332            bEnabled = (bEnabled && index.isValid());
333            m_ui.editInstrumentAction->setEnabled(bEnabled);
334            m_ui.deleteInstrumentAction->setEnabled(bEnabled);
335    }
336    
337    
338    // Handle custom context menu here...
339    void InstrumentListForm::contextMenu ( const QPoint& pos )
340    {
341            if (!m_ui.newInstrumentAction->isEnabled())
342                    return;
343    
344            m_ui.contextMenu->exec(
345                    (m_ui.InstrumentTable->viewport())->mapToGlobal(pos));
346    }
347    
348    
349  } // namespace QSampler  } // namespace QSampler
350    
351    

Legend:
Removed from v.1464  
changed lines
  Added in v.1840

  ViewVC Help
Powered by ViewVC