📄 bankeditordialog.cpp
字号:
while (child) { MidiBankListViewItem *bankItem = dynamic_cast<MidiBankListViewItem *>(child); if (bankItem) { bool percussion = bankItem->isPercussion(); int msb = bankItem->text(2).toInt(); int lsb = bankItem->text(3).toInt(); std::string bankName = midiDevice->getBankName (MidiBank(percussion, msb, lsb)); if (bankName != "" && bankItem->text(0) != strtoqstr(bankName)) { bankItem->setText(0, strtoqstr(bankName)); } } child = child->nextSibling(); } } } continue; } m_deviceNameMap[midiDevice->getId()] = midiDevice->getName(); QString itemName = strtoqstr(midiDevice->getName()); RG_DEBUG << "BankEditorDialog::updateDialog - adding " << itemName << endl; QListViewItem* deviceItem = new MidiDeviceListViewItem (midiDevice->getId(), m_listView, itemName); deviceItem->setOpen(true); populateDeviceItem(deviceItem, midiDevice); } // delete items whose corresponding devices are no longer present, // and update the other ones // std::vector<MidiDeviceListViewItem*> itemsToDelete; MidiDeviceListViewItem* sibling = dynamic_cast<MidiDeviceListViewItem*> (m_listView->firstChild()); while (sibling) { if (m_deviceNameMap.find(sibling->getDeviceId()) == m_deviceNameMap.end()) itemsToDelete.push_back(sibling); else updateDeviceItem(sibling); sibling = dynamic_cast<MidiDeviceListViewItem*>(sibling->nextSibling()); } for (unsigned int i = 0; i < itemsToDelete.size(); ++i) delete itemsToDelete[i]; m_listView->sort(); if (deviceLabelUpdate) emit deviceNamesChanged();}voidBankEditorDialog::setCurrentDevice(DeviceId device){ for (QListViewItem *item = m_listView->firstChild(); item; item = item->nextSibling()) { MidiDeviceListViewItem * deviceItem = dynamic_cast<MidiDeviceListViewItem *>(item); if (deviceItem && deviceItem->getDeviceId() == device) { m_listView->setSelected(item, true); break; } }}voidBankEditorDialog::populateDeviceItem(QListViewItem* deviceItem, MidiDevice* midiDevice){ clearItemChildren(deviceItem); QString itemName = strtoqstr(midiDevice->getName()); BankList banks = midiDevice->getBanks(); // add banks for this device for (unsigned int i = 0; i < banks.size(); ++i) { RG_DEBUG << "BankEditorDialog::populateDeviceItem - adding " << itemName << " - " << strtoqstr(banks[i].getName()) << endl; new MidiBankListViewItem(midiDevice->getId(), i, deviceItem, strtoqstr(banks[i].getName()), banks[i].isPercussion(), banks[i].getMSB(), banks[i].getLSB()); } const KeyMappingList &mappings = midiDevice->getKeyMappings(); for (unsigned int i = 0; i < mappings.size(); ++i) { RG_DEBUG << "BankEditorDialog::populateDeviceItem - adding key mapping " << itemName << " - " << strtoqstr(mappings[i].getName()) << endl; new MidiKeyMapListViewItem(midiDevice->getId(), deviceItem, strtoqstr(mappings[i].getName())); }}voidBankEditorDialog::updateDeviceItem(MidiDeviceListViewItem* deviceItem){ MidiDevice* midiDevice = getMidiDevice(deviceItem->getDeviceId()); if (!midiDevice) { RG_DEBUG << "BankEditorDialog::updateDeviceItem : WARNING no midi device for this item\n"; return ; } QString itemName = strtoqstr(midiDevice->getName()); BankList banks = midiDevice->getBanks(); KeyMappingList keymaps = midiDevice->getKeyMappings(); // add missing banks for this device // for (unsigned int i = 0; i < banks.size(); ++i) { if (deviceItemHasBank(deviceItem, i)) continue; RG_DEBUG << "BankEditorDialog::updateDeviceItem - adding " << itemName << " - " << strtoqstr(banks[i].getName()) << endl; new MidiBankListViewItem(midiDevice->getId(), i, deviceItem, strtoqstr(banks[i].getName()), banks[i].isPercussion(), banks[i].getMSB(), banks[i].getLSB()); } for (unsigned int i = 0; i < keymaps.size(); ++i) { QListViewItem *child = deviceItem->firstChild(); bool have = false; while (child) { MidiKeyMapListViewItem *keyItem = dynamic_cast<MidiKeyMapListViewItem*>(child); if (keyItem) { if (keyItem->getName() == strtoqstr(keymaps[i].getName())) { have = true; } } child = child->nextSibling(); } if (have) continue; RG_DEBUG << "BankEditorDialog::updateDeviceItem - adding " << itemName << " - " << strtoqstr(keymaps[i].getName()) << endl; new MidiKeyMapListViewItem(midiDevice->getId(), deviceItem, strtoqstr(keymaps[i].getName())); } // delete banks which are no longer present // std::vector<QListViewItem*> childrenToDelete; QListViewItem* child = deviceItem->firstChild(); while (child) { MidiBankListViewItem *bankItem = dynamic_cast<MidiBankListViewItem *>(child); if (bankItem) { if (bankItem->getBank() >= int(banks.size())) childrenToDelete.push_back(child); else { // update the banks MSB/LSB which might have changed bankItem->setPercussion(banks[bankItem->getBank()].isPercussion()); bankItem->setMSB(banks[bankItem->getBank()].getMSB()); bankItem->setLSB(banks[bankItem->getBank()].getLSB()); } } MidiKeyMapListViewItem *keyItem = dynamic_cast<MidiKeyMapListViewItem *>(child); if (keyItem) { if (!midiDevice->getKeyMappingByName(qstrtostr(keyItem->getName()))) { childrenToDelete.push_back(child); } } child = child->nextSibling(); } for (unsigned int i = 0; i < childrenToDelete.size(); ++i) delete childrenToDelete[i];}boolBankEditorDialog::deviceItemHasBank(MidiDeviceListViewItem* deviceItem, int bankNb){ QListViewItem *child = deviceItem->firstChild(); while (child) { MidiBankListViewItem *bankItem = dynamic_cast<MidiBankListViewItem*>(child); if (bankItem) { if (bankItem->getBank() == bankNb) return true; } child = child->nextSibling(); } return false;}voidBankEditorDialog::clearItemChildren(QListViewItem* item){ QListViewItem* child = 0; while ((child = item->firstChild())) delete child;}MidiDevice*BankEditorDialog::getCurrentMidiDevice(){ return getMidiDevice(m_listView->currentItem());}voidBankEditorDialog::checkModified(){ if (!m_modified) return ; setModified(false); // // then ask if we want to apply the changes // int reply = KMessageBox::questionYesNo(this, // i18n("Apply pending changes?")); ModifyDeviceCommand *command = 0; MidiDevice *device = getMidiDevice(m_lastDevice); if (!device) { RG_DEBUG << "%%% WARNING : BankEditorDialog::checkModified() - NO MIDI DEVICE for device " << m_lastDevice << endl; return ; } if (m_bankList.size() == 0 && m_programList.size() == 0) { command = new ModifyDeviceCommand(m_studio, m_lastDevice, m_deviceNameMap[m_lastDevice], device->getLibrarianName(), device->getLibrarianEmail()); // rename command->clearBankAndProgramList(); } else { MidiDevice::VariationType variation = MidiDevice::NoVariations; if (m_variationToggle->isChecked()) { if (m_variationCombo->currentItem() == 0) { variation = MidiDevice::VariationFromLSB; } else { variation = MidiDevice::VariationFromMSB; } } command = new ModifyDeviceCommand(m_studio, m_lastDevice, m_deviceNameMap[m_lastDevice], device->getLibrarianName(), device->getLibrarianEmail()); command->setVariation(variation); command->setBankList(m_bankList); command->setProgramList(m_programList); } addCommandToHistory(command); setModified(false);}voidBankEditorDialog::slotPopulateDevice(QListViewItem* item){ RG_DEBUG << "BankEditorDialog::slotPopulateDevice" << endl; if (!item) return ; checkModified(); populateDevice(item);}voidBankEditorDialog::populateDevice(QListViewItem* item){ RG_DEBUG << "BankEditorDialog::populateDevice\n"; if (!item) return ; MidiKeyMapListViewItem *keyItem = dynamic_cast<MidiKeyMapListViewItem *>(item); if (keyItem) { stateChanged("on_key_item"); stateChanged("on_bank_item", KXMLGUIClient::StateReverse); m_delete->setEnabled(true); MidiDevice *device = getMidiDevice(keyItem->getDeviceId()); if (!device) return ; setProgramList(device); m_keyMappingEditor->populate(item); m_programEditor->hide(); m_keyMappingEditor->show(); m_lastDevice = keyItem->getDeviceId(); return ; } MidiBankListViewItem* bankItem = dynamic_cast<MidiBankListViewItem*>(item); if (bankItem) { stateChanged("on_bank_item"); stateChanged("on_key_item", KXMLGUIClient::StateReverse); m_delete->setEnabled(true); m_copyPrograms->setEnabled(true); if (m_copyBank.first != Device::NO_DEVICE) m_pastePrograms->setEnabled(true); MidiDevice *device = getMidiDevice(bankItem->getDeviceId()); if (!device) return ; if (!m_keepBankList || m_bankList.size() == 0) m_bankList = device->getBanks(); else m_keepBankList = false; setProgramList(device); m_variationToggle->setChecked(device->getVariationType() != MidiDevice::NoVariations); m_variationCombo->setEnabled(m_variationToggle->isChecked()); m_variationCombo->setCurrentItem (device->getVariationType() == MidiDevice::VariationFromLSB ? 0 : 1); m_lastBank = m_bankList[bankItem->getBank()]; m_programEditor->populate(item); m_keyMappingEditor->hide(); m_programEditor->show(); m_lastDevice = bankItem->getDeviceId(); return ; } // Device, not bank or key mapping // Ensure we fill these lists for the new device // MidiDeviceListViewItem* deviceItem = getParentDeviceItem(item); m_lastDevice = deviceItem->getDeviceId(); MidiDevice *device = getMidiDevice(deviceItem); if (!device) { RG_DEBUG << "BankEditorDialog::populateDevice - no device for this item\n"; return ; } m_bankList = device->getBanks(); setProgramList(device); RG_DEBUG << "BankEditorDialog::populateDevice : not a bank item - disabling" << endl; m_delete->setEnabled(false); m_copyPrograms->setEnabled(false); m_pastePrograms->setEnabled(false); m_variationToggle->setChecked(device->getVariationType() != MidiDevice::NoVariations); m_variationCombo->setEnabled(m_variationToggle->isChecked()); m_variationCombo->setCurrentItem (device->getVariationType() == MidiDevice::VariationFromLSB ? 0 : 1); stateChanged("on_bank_item", KXMLGUIClient::StateReverse); stateChanged("on_key_item", KXMLGUIClient::StateReverse); m_programEditor->clearAll(); m_keyMappingEditor->clearAll();}voidBankEditorDialog::slotApply(){ RG_DEBUG << "BankEditorDialog::slotApply()\n"; ModifyDeviceCommand *command = 0; MidiDevice *device = getMidiDevice(m_lastDevice); // Make sure that we don't delete all the banks and programs // if we've not populated them here yet. // if (m_bankList.size() == 0 && m_programList.size() == 0 && m_deleteAllReally == false) { RG_DEBUG << "BankEditorDialog::slotApply() : m_bankList size = 0\n";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -