--- qsampler/trunk/src/qsamplerInstrumentListForm.cpp 2007/10/28 23:30:36 1461 +++ qsampler/trunk/src/qsamplerInstrumentListForm.cpp 2010/03/13 20:14:38 2067 @@ -1,63 +1,115 @@ +// qsamplerInstrumentListForm.cpp +// +/**************************************************************************** + Copyright (C) 2003-2010, rncbc aka Rui Nuno Capela. All rights reserved. + Copyright (C) 2007, Christian Schoenebeck + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*****************************************************************************/ + +#include "qsamplerAbout.h" #include "qsamplerInstrumentListForm.h" -#include "qsamplerMainForm.h" +#include "qsamplerInstrumentList.h" + +#include "qsamplerInstrumentForm.h" + #include "qsamplerOptions.h" #include "qsamplerInstrument.h" +#include "qsamplerMainForm.h" + +#include +#include +#include -#include namespace QSampler { -InstrumentListForm::InstrumentListForm(QWidget* parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) { - ui.setupUi(this); +//------------------------------------------------------------------------- +// QSampler::InstrumentListForm -- Instrument map list form implementation. +// + +InstrumentListForm::InstrumentListForm ( + QWidget* pParent, Qt::WindowFlags wflags ) + : QMainWindow(pParent, wflags) +{ + m_ui.setupUi(this); - ui.newInstrumentAction->setText(tr("New &Instrument...")); - ui.newInstrumentAction->setShortcut(Qt::Key_Insert); - ui.editInstrumentAction->setText(tr("&Edit...")); - ui.editInstrumentAction->setShortcut(Qt::Key_Enter); - ui.deleteInstrumentAction->setText(tr("&Delete")); - ui.deleteInstrumentAction->setShortcut(Qt::Key_Delete); - ui.refreshInstrumentsAction->setText(tr("&Refresh")); - ui.refreshInstrumentsAction->setShortcut(Qt::Key_F5); - - // Setup toolbar widgets. - InstrumentToolbar = addToolBar(tr("MIDI Instruments")); - m_pMapComboBox = new QComboBox(InstrumentToolbar); - m_pMapComboBox->setMinimumWidth(120); - m_pMapComboBox->setEnabled(false); - QToolTip::add(m_pMapComboBox, tr("Instrument Map")); - - InstrumentToolbar->addSeparator(); - ui.newInstrumentAction->addTo(InstrumentToolbar); - ui.editInstrumentAction->addTo(InstrumentToolbar); - ui.deleteInstrumentAction->addTo(InstrumentToolbar); - InstrumentToolbar->addSeparator(); - ui.refreshInstrumentsAction->addTo(InstrumentToolbar); + m_pInstrumentListView = new InstrumentListView(this); + QMainWindow::setCentralWidget(m_pInstrumentListView); - ui.InstrumentTable->setModel(&model); - //ui.InstrumentTable->setDelegate(delegate); + // Setup toolbar widgets. + m_pMapComboBox = new QComboBox(m_ui.instrumentToolbar); + m_pMapComboBox->setMinimumWidth(120); + m_pMapComboBox->setEnabled(false); + m_pMapComboBox->setToolTip(tr("Instrument Map")); + + m_ui.instrumentToolbar->addWidget(m_pMapComboBox); + m_ui.instrumentToolbar->addSeparator(); + m_ui.instrumentToolbar->addAction(m_ui.newInstrumentAction); + m_ui.instrumentToolbar->addAction(m_ui.editInstrumentAction); + m_ui.instrumentToolbar->addAction(m_ui.deleteInstrumentAction); + m_ui.instrumentToolbar->addSeparator(); + m_ui.instrumentToolbar->addAction(m_ui.refreshInstrumentsAction); QObject::connect(m_pMapComboBox, SIGNAL(activated(int)), SLOT(activateMap(int))); + QObject::connect(m_pInstrumentListView->selectionModel(), + SIGNAL(currentRowChanged(const QModelIndex&,const QModelIndex&)), + SLOT(stabilizeForm())); + QObject::connect( + m_pInstrumentListView, + SIGNAL(activated(const QModelIndex&)), + SLOT(editInstrument(const QModelIndex&))); + QObject::connect( + m_ui.newInstrumentAction, + SIGNAL(triggered()), + SLOT(newInstrument())); + QObject::connect( + m_ui.deleteInstrumentAction, + SIGNAL(triggered()), + SLOT(deleteInstrument())); + QObject::connect( + m_ui.editInstrumentAction, + SIGNAL(triggered()), + SLOT(editInstrument())); + QObject::connect( + m_ui.refreshInstrumentsAction, + SIGNAL(triggered()), + SLOT(refreshInstruments())); - connect( - ui.refreshInstrumentsAction, - SIGNAL(triggered()), SLOT(refreshInstruments(void)) - ); + // Things must be stable from the start. + stabilizeForm(); } -InstrumentListForm::~InstrumentListForm() { + +InstrumentListForm::~InstrumentListForm (void) +{ delete m_pMapComboBox; + delete m_pInstrumentListView; } // Notify our parent that we're emerging. void InstrumentListForm::showEvent ( QShowEvent *pShowEvent ) { - //MainForm* pMainForm = MainForm::getInstance(); - //if (pMainForm) - // pMainForm->stabilizeForm(); + MainForm* pMainForm = MainForm::getInstance(); + if (pMainForm) + pMainForm->stabilizeForm(); QWidget::showEvent(pShowEvent); } @@ -68,9 +120,20 @@ { QWidget::hideEvent(pHideEvent); - //MainForm* pMainForm = MainForm::getInstance(); - //if (pMainForm) - // pMainForm->stabilizeForm(); + MainForm* pMainForm = MainForm::getInstance(); + if (pMainForm) + pMainForm->stabilizeForm(); +} + + +// Just about to notify main-window that we're closing. +void InstrumentListForm::closeEvent ( QCloseEvent * /*pCloseEvent*/ ) +{ + QWidget::hide(); + + MainForm *pMainForm = MainForm::getInstance(); + if (pMainForm) + pMainForm->stabilizeForm(); } @@ -81,24 +144,24 @@ if (pMainForm == NULL) return; - qsamplerOptions *pOptions = pMainForm->options(); + Options *pOptions = pMainForm->options(); if (pOptions == NULL) return; // Get/save current map selection... - int iMap = m_pMapComboBox->currentItem(); + int iMap = m_pMapComboBox->currentIndex(); if (iMap < 0 || m_pMapComboBox->count() < 2) iMap = pOptions->iMidiMap + 1; // Populate maps list. m_pMapComboBox->clear(); - m_pMapComboBox->insertItem(tr("(All)")); - m_pMapComboBox->insertStringList(qsamplerInstrument::getMapNames()); + m_pMapComboBox->addItem(tr("(All)")); + m_pMapComboBox->insertItems(1, Instrument::getMapNames()); // Adjust to saved selection... if (iMap < 0 || iMap >= m_pMapComboBox->count()) iMap = 0; - m_pMapComboBox->setCurrentItem(iMap); + m_pMapComboBox->setCurrentIndex(iMap); m_pMapComboBox->setEnabled(m_pMapComboBox->count() > 1); activateMap(iMap); @@ -112,7 +175,7 @@ if (pMainForm == NULL) return; - qsamplerOptions *pOptions = pMainForm->options(); + Options *pOptions = pMainForm->options(); if (pOptions == NULL) return; @@ -120,8 +183,154 @@ if (iMidiMap >= 0) pOptions->iMidiMap = iMidiMap; - model.setMidiMap(iMidiMap); - model.refresh(); + m_pInstrumentListView->setMidiMap(iMidiMap); + m_pInstrumentListView->refresh(); + + stabilizeForm(); } + +void InstrumentListForm::newInstrument (void) +{ + Instrument instrument; + + InstrumentForm form(this); + form.setup(&instrument); + if (!form.exec()) + return; + + // Commit... + instrument.mapInstrument(); + + // add new item to the table model + m_pInstrumentListView->addInstrument( + instrument.map(), + instrument.bank(), + instrument.prog()); + + stabilizeForm(); +} + + +void InstrumentListForm::editInstrument (void) +{ + editInstrument(m_pInstrumentListView->currentIndex()); +} + + +void InstrumentListForm::editInstrument ( const QModelIndex& index ) +{ + if (!index.isValid()) + return; + + Instrument *pInstrument + = static_cast (index.internalPointer()); + if (pInstrument == NULL) + return; + + // Save current key values... + int iMap = pInstrument->map(); + int iBank = pInstrument->bank(); + int iProg = pInstrument->prog(); + + Instrument instrument(iMap, iBank, iProg); + + // Do the edit dance... + InstrumentForm form(this); + form.setup(&instrument); + if (!form.exec()) + return; + + // Commit... + instrument.mapInstrument(); + + // Check whether we changed instrument key... + if (instrument.map() == iMap && + instrument.bank() == iBank && + instrument.prog() == iProg) { + // Just update tree item... + //pItem->update(); + } else { + // Unmap old instance... + Instrument(iMap, iBank, iProg).unmapInstrument(); + // correct the position of the instrument in the model + m_pInstrumentListView->updateInstrument(pInstrument); + } + + stabilizeForm(); +} + + +void InstrumentListForm::deleteInstrument (void) +{ + const QModelIndex& index = m_pInstrumentListView->currentIndex(); + if (!index.isValid()) + return; + + Instrument *pInstrument + = static_cast (index.internalPointer()); + if (pInstrument == NULL) + return; + + MainForm *pMainForm = MainForm::getInstance(); + if (pMainForm == NULL) + return; + + // Prompt user if this is for real... + Options *pOptions = pMainForm->options(); + if (pOptions && pOptions->bConfirmRemove) { + if (QMessageBox::warning(this, + QSAMPLER_TITLE ": " + tr("Warning"), + tr("About to delete instrument map entry:\n\n" + "%1\n\n" + "Are you sure?") + .arg(pInstrument->name()), + QMessageBox::Ok | QMessageBox::Cancel) + == QMessageBox::Cancel) + return; + } + + pInstrument->unmapInstrument(); + + // let the instrument vanish from the table model + m_pInstrumentListView->removeInstrument(pInstrument); + + stabilizeForm(); +} + + +// Update form actions enablement... +void InstrumentListForm::stabilizeForm (void) +{ + MainForm *pMainForm = MainForm::getInstance(); + + bool bEnabled = (pMainForm && pMainForm->client()); + m_ui.newInstrumentAction->setEnabled(bEnabled); + const QModelIndex& index = m_pInstrumentListView->currentIndex(); + bEnabled = (bEnabled && index.isValid()); + m_ui.editInstrumentAction->setEnabled(bEnabled); + m_ui.deleteInstrumentAction->setEnabled(bEnabled); +} + + +// Context menu request. +void InstrumentListForm::contextMenuEvent ( + QContextMenuEvent *pContextMenuEvent ) +{ + QMenu menu(this); + + menu.addAction(m_ui.newInstrumentAction); + menu.addSeparator(); + menu.addAction(m_ui.editInstrumentAction); + menu.addAction(m_ui.deleteInstrumentAction); + menu.addSeparator(); + menu.addAction(m_ui.refreshInstrumentsAction); + + menu.exec(pContextMenuEvent->globalPos()); +} + + } // namespace QSampler + + +// end of qsamplerInstrumentListForm.cpp