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

📄 bankeditordialog.cpp

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