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

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

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

revision 1013 by capela, Mon Jan 8 16:52:48 2007 UTC revision 1461 by schoenebeck, Sun Oct 28 23:30:36 2007 UTC
# Line 28  Line 28 
28  #include "qsamplerOptions.h"  #include "qsamplerOptions.h"
29  #include "qsamplerMainForm.h"  #include "qsamplerMainForm.h"
30    
31    #include <qapplication.h>
32  #include <qmessagebox.h>  #include <qmessagebox.h>
33    #include <qeventloop.h>
34  #include <qaction.h>  #include <qaction.h>
35    #include <qcursor.h>
36  #include <qfileinfo.h>  #include <qfileinfo.h>
37  #include <qpopupmenu.h>  
38    #include <QMenu>
39    
40  // Needed for lroundf()  // Needed for lroundf()
41  #include <math.h>  #include <math.h>
# Line 46  static inline long lroundf ( float x ) Line 50  static inline long lroundf ( float x )
50  }  }
51  #endif  #endif
52    
53    using namespace QSampler;
54    
55  //----------------------------------------------------------------------  //----------------------------------------------------------------------
56  // class qsamplerInstrumentGroup -- custom group list view item.  // class qsamplerInstrumentGroup -- custom group list view item.
57  //  //
58    
59    #if 0
60  // Constructors.  // Constructors.
61  qsamplerInstrumentGroup::qsamplerInstrumentGroup (  qsamplerInstrumentGroup::qsamplerInstrumentGroup (
62          qsamplerInstrumentList *pListView, const QString& sName,          qsamplerInstrumentList *pListView, const QString& sName,
# Line 336  qsamplerInstrumentItem *qsamplerInstrume Line 342  qsamplerInstrumentItem *qsamplerInstrume
342          // with the very same key (bank, program);          // with the very same key (bank, program);
343          // if yes, just remove it without prejudice...          // if yes, just remove it without prejudice...
344          qsamplerInstrumentItem *pItem = findItem(pInstrument);          qsamplerInstrumentItem *pItem = findItem(pInstrument);
345          if (pItem)          if (pItem) {
346                    // If exactly the same, just update view and bail out...
347                    if (pItem->instrument() == pInstrument) {
348                            pItem->update();
349                            return pItem;
350                    }
351                    // Remove it, as instrument keys must be unique.
352                  delete pItem;                  delete pItem;
353            }
354    
355          // Add the new item under proper group one, if any...          // Add the new item under proper group one, if any...
356          if (pParentGroup) {          if (pParentGroup) {
# Line 522  void qsamplerInstrumentList::editItemSlo Line 535  void qsamplerInstrumentList::editItemSlo
535                          pInstrument = pItem->instrument();                          pInstrument = pItem->instrument();
536                  if (pInstrument) {                  if (pInstrument) {
537                          // Save current key values...                          // Save current key values...
538                          int iMap  = pInstrument->map();                          qsamplerInstrument oldInstrument(*pInstrument);
                         int iBank = pInstrument->bank();  
                         int iProg = pInstrument->prog();  
539                          // Do the edit dance...                          // Do the edit dance...
540                          qsamplerInstrumentForm form(this);                          qsamplerInstrumentForm form(this);
541                          form.setup(pInstrument);                          form.setup(pInstrument);
# Line 532  void qsamplerInstrumentList::editItemSlo Line 543  void qsamplerInstrumentList::editItemSlo
543                                  // Commit...                                  // Commit...
544                                  pInstrument->mapInstrument();                                  pInstrument->mapInstrument();
545                                  // Check whether we changed instrument key...                                  // Check whether we changed instrument key...
546                                  if (iMap  == pInstrument->map()  &&                                  if (oldInstrument.map()  == pInstrument->map()  &&
547                                          iBank == pInstrument->bank() &&                                          oldInstrument.bank() == pInstrument->bank() &&
548                                          iProg == pInstrument->prog()) {                                          oldInstrument.prog() == pInstrument->prog()) {
549                                          // just update tree item...                                          // just update tree item...
550                                          pItem->update();                                          pItem->update();
551                                  } else {                                  } else {
552                                            // Unmap old instance...
553                                            oldInstrument.unmapInstrument();
554                                          // Change item tree, whether applicable...                                          // Change item tree, whether applicable...
555                                          if (m_iMidiMap < 0 || m_iMidiMap == pInstrument->map()) {                                          if (m_iMidiMap < 0 || m_iMidiMap == pInstrument->map()) {
556                                                  // Add new brand item into view...                                                  // Add new brand item into view...
# Line 628  void qsamplerInstrumentList::selectionCh Line 641  void qsamplerInstrumentList::selectionCh
641  void qsamplerInstrumentList::activatedSlot ( QListViewItem *pListItem )  void qsamplerInstrumentList::activatedSlot ( QListViewItem *pListItem )
642  {  {
643          // FIXME: Hope the list view item is the one selected.          // FIXME: Hope the list view item is the one selected.
644          if (pListItem->rtti() == Item)          if (pListItem && pListItem->rtti() == Item)
645                  editItemSlot();                  editItemSlot();
646  }  }
647    
# Line 683  void qsamplerInstrumentList::refresh (vo Line 696  void qsamplerInstrumentList::refresh (vo
696          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
697                  return;                  return;
698    
699            QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
700    
701            // Load the whole bunch of instrument items...
702          qsamplerInstrumentItem *pItem = NULL;          qsamplerInstrumentItem *pItem = NULL;
703          lscp_midi_instrument_t *pInstrs          lscp_midi_instrument_t *pInstrs
704                  = ::lscp_list_midi_instruments(pMainForm->client(), m_iMidiMap);                  = ::lscp_list_midi_instruments(pMainForm->client(), m_iMidiMap);
# Line 694  void qsamplerInstrumentList::refresh (vo Line 710  void qsamplerInstrumentList::refresh (vo
710                          = new qsamplerInstrument(iMap, iBank, iProg);                          = new qsamplerInstrument(iMap, iBank, iProg);
711                  if (pInstrument->getInstrument())                  if (pInstrument->getInstrument())
712                          pItem = new qsamplerInstrumentItem(this, pInstrument, pItem);                          pItem = new qsamplerInstrumentItem(this, pInstrument, pItem);
713                    // Try to keep it snappy :)
714                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
715          }          }
716    
717            QApplication::restoreOverrideCursor();
718    
719          if (pInstrs == NULL && ::lscp_client_get_errno(pMainForm->client())) {          if (pInstrs == NULL && ::lscp_client_get_errno(pMainForm->client())) {
720                  pMainForm->appendMessagesClient("lscp_list_midi_instruments");                  pMainForm->appendMessagesClient("lscp_list_midi_instruments");
721                  pMainForm->appendMessagesError(tr("Could not get current list of MIDI instrument mappings.\n\nSorry."));                  pMainForm->appendMessagesError(tr("Could not get current list of MIDI instrument mappings.\n\nSorry."));
# Line 703  void qsamplerInstrumentList::refresh (vo Line 723  void qsamplerInstrumentList::refresh (vo
723    
724          selectionChangedSlot();          selectionChangedSlot();
725  }  }
726    #endif
727    
728    MidiInstrumentsModel::MidiInstrumentsModel(QObject* parent) : QAbstractTableModel(parent) {
729        m_iMidiMap = LSCP_MIDI_MAP_ALL;
730    }
731    
732    int MidiInstrumentsModel::rowCount(const QModelIndex& /*parent*/) const {
733        if (m_iMidiMap == LSCP_MIDI_MAP_ALL) {
734            int n = 0;
735            for (InstrumentsMap::const_iterator itMap = instruments.begin(); itMap != instruments.end(); ++itMap)
736                n += (*itMap).size();
737            return n;
738        }
739        InstrumentsMap::const_iterator itMap = instruments.find(m_iMidiMap);
740        if (itMap == instruments.end()) return 0;
741        return (*itMap).size();
742    }
743    
744    int MidiInstrumentsModel::columnCount(const QModelIndex& /*parent*/) const {
745        return 9;
746    }
747    
748    QVariant MidiInstrumentsModel::data(const QModelIndex &index, int role) const {
749        if (!index.isValid() || role != Qt::DisplayRole) return QVariant();
750    
751        if (m_iMidiMap == LSCP_MIDI_MAP_ALL) {
752            int n = 0;
753            for (InstrumentsMap::const_iterator itMap = instruments.begin(); itMap != instruments.end(); ++itMap) {
754                n += (*itMap).size();
755                if (index.row() < n)
756                    return QVariant::fromValue(
757                        (*itMap)[index.row() + (*itMap).size() - n]
758                    );
759            }
760        } else {
761            // resolve MIDI instrument map
762            InstrumentsMap::const_iterator itMap = instruments.find(m_iMidiMap);
763            if (itMap == instruments.end()) return QVariant();
764            // resolve instrument in that map
765            if (index.row() >= (*itMap).size()) return QVariant();
766            return QVariant::fromValue(
767                (*itMap)[index.row()]
768            );
769        }
770    
771        return QVariant();
772    }
773    
774    QVariant MidiInstrumentsModel::headerData(int section, Qt::Orientation orientation, int role) const {
775        if (orientation != Qt::Horizontal || role != Qt::DisplayRole)
776            return QVariant();
777    
778        switch (section) {
779            case 0: return tr("Name");
780            case 1: return tr("Map");
781            case 2: return tr("Bank");
782            case 3: return tr("Prog");
783            case 4: return tr("Engine");
784            case 5: return tr("File");
785            case 6: return tr("Nr");
786            case 7: return tr("Vol");
787            case 8: return tr("Mode");
788            default: return QVariant();
789        }
790    }
791    
792    qsamplerInstrument* MidiInstrumentsModel::addInstrument(int iMap, int iBank, int iProg) {
793        // Check it there's already one instrument item
794        // with the very same key (bank, program);
795        // if yes, just remove it without prejudice...
796        for (int i = 0; i < instruments[iMap].size(); i++) {
797            if (
798                instruments[iMap][i].bank() == iBank &&
799                instruments[iMap][i].prog() == iProg
800            ) {
801                instruments[iMap].removeAt(i);
802                break;
803            }
804        }
805    
806        // resolve the appropriate place, we keep the list sorted that way ...
807        int i = 0;
808        for (; i < instruments[iMap].size(); i++)
809            if (
810                iBank > instruments[iMap][i].bank() ||
811                ( iBank == instruments[iMap][i].bank() &&
812                  iProg > instruments[iMap][i].prog() )
813            ) break;
814    
815        qsamplerInstrument& instr = instruments[iMap][i] = qsamplerInstrument(iMap, iBank, iProg);
816    
817        return &instr;
818    }
819    
820    void MidiInstrumentsModel::setMidiMap(int iMidiMap) {
821        if (iMidiMap < 0)
822            iMidiMap = LSCP_MIDI_MAP_ALL;
823    
824        m_iMidiMap = iMidiMap;
825    }
826    
827    int MidiInstrumentsModel::midiMap() const {
828        return m_iMidiMap;
829    }
830    
831    void MidiInstrumentsModel::refresh() {
832            instruments.clear();
833    
834            MainForm* pMainForm = MainForm::getInstance();
835            if (pMainForm == NULL)
836                    return;
837            if (pMainForm->client() == NULL)
838                    return;
839    
840            QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
841    
842            // Load the whole bunch of instrument items...
843            lscp_midi_instrument_t* pInstrs
844                    = ::lscp_list_midi_instruments(pMainForm->client(), m_iMidiMap);
845            for (int iInstr = 0; pInstrs && pInstrs[iInstr].map >= 0; ++iInstr) {
846                    const int iMap  = pInstrs[iInstr].map;
847                    const int iBank = pInstrs[iInstr].bank;
848                    const int iProg = pInstrs[iInstr].prog;
849                    addInstrument(iMap, iBank, iProg);
850                    // Try to keep it snappy :)
851                    QApplication::processEvents(QEventLoop::ExcludeUserInput);
852            }
853    
854            QApplication::restoreOverrideCursor();
855    
856            if (pInstrs == NULL && ::lscp_client_get_errno(pMainForm->client())) {
857                    pMainForm->appendMessagesClient("lscp_list_midi_instruments");
858                    pMainForm->appendMessagesError(tr("Could not get current list of MIDI instrument mappings.\n\nSorry."));
859            }
860    
861            //selectionChangedSlot();
862    }
863    
864    
865    MidiInstrumentsDelegate::MidiInstrumentsDelegate(QObject* parent) : QItemDelegate(parent) {
866    }
867    
868    QWidget* MidiInstrumentsDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const {
869        return new QLabel(index.model()->data(index, Qt::DisplayRole).toString(), parent);
870    }
871    
872    void MidiInstrumentsDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const {
873    }
874    
875    void MidiInstrumentsDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const {
876    }
877    
878    void MidiInstrumentsDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const {
879        if (editor) editor->setGeometry(option.rect);
880    }
881    
882  // end of qsamplerInstrumentList.cpp  // end of qsamplerInstrumentList.cpp
883    

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

  ViewVC Help
Powered by ViewVC