📄 bankeditordialog.cpp
字号:
command = new ModifyDeviceCommand(m_studio, m_lastDevice, m_deviceNameMap[m_lastDevice], device->getLibrarianName(), device->getLibrarianEmail()); command->clearBankAndProgramList(); } else { MidiDevice::VariationType variation = MidiDevice::NoVariations; if (m_variationToggle->isChecked()) { if (m_variationCombo->currentItem() == 0) { variation = MidiDevice::VariationFromLSB; } else { variation = MidiDevice::VariationFromMSB; } } RG_DEBUG << "BankEditorDialog::slotApply() : m_bankList size = " << m_bankList.size() << endl; command = new ModifyDeviceCommand(m_studio, m_lastDevice, m_deviceNameMap[m_lastDevice], device->getLibrarianName(), device->getLibrarianEmail()); MidiKeyMapListViewItem *keyItem = dynamic_cast<MidiKeyMapListViewItem*> (m_listView->currentItem()); if (keyItem) { KeyMappingList kml(device->getKeyMappings()); for (int i = 0; i < kml.size(); ++i) { if (kml[i].getName() == qstrtostr(keyItem->getName())) { kml[i] = m_keyMappingEditor->getMapping(); break; } } command->setKeyMappingList(kml); } command->setVariation(variation); command->setBankList(m_bankList); command->setProgramList(m_programList); } addCommandToHistory(command); // Our freaky fudge to update instrument/device names externally // if (m_updateDeviceList) { emit deviceNamesChanged(); m_updateDeviceList = false; } setModified(false);}voidBankEditorDialog::slotReset(){ resetProgramList(); m_programEditor->reset(); m_programEditor->populate(m_listView->currentItem()); m_keyMappingEditor->reset(); m_keyMappingEditor->populate(m_listView->currentItem()); MidiDeviceListViewItem* deviceItem = getParentDeviceItem (m_listView->currentItem()); if (deviceItem) { MidiDevice *device = getMidiDevice(deviceItem); m_variationToggle->setChecked(device->getVariationType() != MidiDevice::NoVariations); m_variationCombo->setEnabled(m_variationToggle->isChecked()); m_variationCombo->setCurrentItem (device->getVariationType() == MidiDevice::VariationFromLSB ? 0 : 1); } updateDialog(); setModified(false);}voidBankEditorDialog::resetProgramList(){ m_programList = m_oldProgramList;}voidBankEditorDialog::setProgramList(MidiDevice *device){ m_programList = device->getPrograms(); m_oldProgramList = m_programList;}voidBankEditorDialog::slotUpdate(){ updateDialog();}MidiDeviceListViewItem*BankEditorDialog::getParentDeviceItem(QListViewItem* item){ if (!item) return 0; if (dynamic_cast<MidiBankListViewItem*>(item)) // go up to the parent device item item = item->parent(); if (dynamic_cast<MidiKeyMapListViewItem*>(item)) // go up to the parent device item item = item->parent(); if (!item) { RG_DEBUG << "BankEditorDialog::getParentDeviceItem : missing parent device item for bank item - this SHOULD NOT HAPPEN" << endl; return 0; } return dynamic_cast<MidiDeviceListViewItem*>(item);}voidBankEditorDialog::slotAddBank(){ if (!m_listView->currentItem()) return ; QListViewItem* currentItem = m_listView->currentItem(); MidiDeviceListViewItem* deviceItem = getParentDeviceItem(currentItem); MidiDevice *device = getMidiDevice(currentItem); if (device) { // If the bank and program lists are empty then try to // populate them. // if (m_bankList.size() == 0 && m_programList.size() == 0) { m_bankList = device->getBanks(); setProgramList(device); } std::pair<int, int> bank = getFirstFreeBank(m_listView->currentItem()); MidiBank newBank(false, bank.first, bank.second, qstrtostr(i18n("<new bank>"))); m_bankList.push_back(newBank); QListViewItem* newBankItem = new MidiBankListViewItem(deviceItem->getDeviceId(), m_bankList.size() - 1, deviceItem, strtoqstr(newBank.getName()), newBank.isPercussion(), newBank.getMSB(), newBank.getLSB()); keepBankListForNextPopulate(); m_listView->setCurrentItem(newBankItem); slotApply(); selectDeviceItem(device); }}voidBankEditorDialog::slotAddKeyMapping(){ if (!m_listView->currentItem()) return ; QListViewItem* currentItem = m_listView->currentItem(); MidiDeviceListViewItem* deviceItem = getParentDeviceItem(currentItem); MidiDevice *device = getMidiDevice(currentItem); if (device) { QString name = ""; int n = 0; while (name == "" || device->getKeyMappingByName(qstrtostr(name)) != 0) { ++n; if (n == 1) name = i18n("<new mapping>"); else name = i18n("<new mapping %1>").arg(n); } MidiKeyMapping newKeyMapping(qstrtostr(name)); ModifyDeviceCommand *command = new ModifyDeviceCommand (m_studio, device->getId(), device->getName(), device->getLibrarianName(), device->getLibrarianEmail()); KeyMappingList kml; kml.push_back(newKeyMapping); command->setKeyMappingList(kml); command->setOverwrite(false); command->setRename(false); addCommandToHistory(command); updateDialog(); selectDeviceItem(device); }}voidBankEditorDialog::slotDelete(){ if (!m_listView->currentItem()) return ; QListViewItem* currentItem = m_listView->currentItem(); MidiBankListViewItem* bankItem = dynamic_cast<MidiBankListViewItem*>(currentItem); MidiDevice *device = getMidiDevice(currentItem); if (device && bankItem) { int currentBank = bankItem->getBank(); int reply = KMessageBox::warningYesNo(this, i18n("Really delete this bank?")); if (reply == KMessageBox::Yes) { MidiBank bank = m_bankList[currentBank]; // Copy across all programs that aren't in the doomed bank // ProgramList::iterator it; ProgramList tempList; for (it = m_programList.begin(); it != m_programList.end(); it++) if (!(it->getBank() == bank)) tempList.push_back(*it); // Erase the bank and repopulate // BankList::iterator er = m_bankList.begin(); er += currentBank; m_bankList.erase(er); m_programList = tempList; keepBankListForNextPopulate(); // the listview automatically selects a new current item m_listView->blockSignals(true); delete currentItem; m_listView->blockSignals(false); // Don't allow pasting from this defunct device // if (m_copyBank.first == bankItem->getDeviceId() && m_copyBank.second == bankItem->getBank()) { m_pastePrograms->setEnabled(false); m_copyBank = std::pair<DeviceId, int> (Device::NO_DEVICE, -1); } slotApply(); selectDeviceItem(device); } return ; } MidiKeyMapListViewItem* keyItem = dynamic_cast<MidiKeyMapListViewItem*>(currentItem); if (keyItem && device) { int reply = KMessageBox::warningYesNo(this, i18n("Really delete this key mapping?")); if (reply == KMessageBox::Yes) { std::string keyMappingName = qstrtostr(keyItem->getName()); ModifyDeviceCommand *command = new ModifyDeviceCommand (m_studio, device->getId(), device->getName(), device->getLibrarianName(), device->getLibrarianEmail()); KeyMappingList kml = device->getKeyMappings(); for (KeyMappingList::iterator i = kml.begin(); i != kml.end(); ++i) { if (i->getName() == keyMappingName) { RG_DEBUG << "erasing " << keyMappingName << endl; kml.erase(i); break; } } RG_DEBUG << " setting " << kml.size() << " key mappings to device " << endl; command->setKeyMappingList(kml); command->setOverwrite(true); addCommandToHistory(command); RG_DEBUG << " device has " << device->getKeyMappings().size() << " key mappings now " << endl; updateDialog(); } return ; }}voidBankEditorDialog::slotDeleteAll(){ if (!m_listView->currentItem()) return ; QListViewItem* currentItem = m_listView->currentItem(); MidiDeviceListViewItem* deviceItem = getParentDeviceItem(currentItem); MidiDevice *device = getMidiDevice(deviceItem); QString question = i18n("Really delete all banks for ") + strtoqstr(device->getName()) + QString(" ?"); int reply = KMessageBox::warningYesNo(this, question); if (reply == KMessageBox::Yes) { // erase all bank items QListViewItem* child = 0; while ((child = deviceItem->firstChild())) delete child; m_bankList.clear(); m_programList.clear(); // Don't allow pasting from this defunct device // if (m_copyBank.first == deviceItem->getDeviceId()) { m_pastePrograms->setEnabled(false); m_copyBank = std::pair<DeviceId, int> (Device::NO_DEVICE, -1); } // Urgh, we have this horrible flag that we're using to frig this. // (we might not need this anymore but I'm too scared to remove it // now). // m_deleteAllReally = true; slotApply(); m_deleteAllReally = false; selectDeviceItem(device); }}MidiDevice*BankEditorDialog::getMidiDevice(DeviceId id){ Device *device = m_studio->getDevice(id); MidiDevice *midiDevice = dynamic_cast<MidiDevice *>(device); /* if (device) { if (!midiDevice) { std::cerr << "ERROR: BankEditorDialog::getMidiDevice: device " << id << " is not a MIDI device" << std::endl; } } else { std::cerr << "ERROR: BankEditorDialog::getMidiDevice: no such device as " << id << std::endl; } */ return midiDevice;}MidiDevice*BankEditorDialog::getMidiDevice(QListViewItem* item){ MidiDeviceListViewItem* deviceItem = dynamic_cast<MidiDeviceListViewItem*>(item); if (!deviceItem) return 0; return getMidiDevice(deviceItem->getDeviceId());}std::pair<int, int>BankEditorDialog::getFirstFreeBank(QListViewItem* item){ //!!! percussion? this is actually only called in the expectation // that percussion==false at the moment for (int msb = 0; msb < 128; ++msb) { for (int lsb = 0; lsb < 128; ++lsb) { BankList::iterator i = m_bankList.begin(); for ( ; i != m_bankList.end(); ++i) { if (i->getLSB() == lsb && i->getMSB() == msb) { break; } } if (i == m_bankList.end()) return std::pair<int, int>(msb, lsb); } } return std::pair<int, int>(0, 0);}voidBankEditorDialog::slotModifyDeviceOrBankName(QListViewItem* item, const QString &label, int){ RG_DEBUG << "BankEditorDialog::slotModifyDeviceOrBankName" << endl; MidiDeviceListViewItem* deviceItem = dynamic_cast<MidiDeviceListViewItem*>(item); MidiBankListViewItem* bankItem = dynamic_cast<MidiBankListViewItem*>(item);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -