⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bankeditordialog.cpp

📁 LINUX下的混音软件
💻 CPP
📖 第 1 页 / 共 4 页
字号:
                    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 + -