void HBox::draw( const ControlContext& cx, DrawableList& out ) { Container::draw( cx, out ); for( ControlList::const_iterator i = _controls.begin(); i != _controls.end(); ++i ) i->get()->draw( cx, out ); }
void HBox::calcSize(const ControlContext& cx, osg::Vec2f& out_size) { if ( visible() == true ) { _renderSize.set( 0, 0 ); // collect all the members, growing the container is its orientation. for( ControlList::const_iterator i = _controls.begin(); i != _controls.end(); ++i ) { Control* child = i->get(); osg::Vec2f childSize; bool first = i == _controls.begin(); child->calcSize( cx, childSize ); _renderSize.x() += first ? childSize.x() : spacing() + childSize.x(); _renderSize.y() = osg::maximum( _renderSize.y(), childSize.y() ); } _renderSize.set( _renderSize.x() + padding().left() + padding().right(), _renderSize.y() + padding().top() + padding().bottom() ); out_size.set( _renderSize.x() + margin().left() + margin().right(), _renderSize.y() + margin().top() + margin().bottom() ); Container::calcSize( cx, out_size ); } }
void VBox::calcPos(const ControlContext& cx, const osg::Vec2f& cursor, const osg::Vec2f& parentSize) { Container::calcPos( cx, cursor, parentSize ); osg::Vec2f childCursor( _renderPos.x() + padding().left(), _renderPos.y() + padding().top() ); for( ControlList::const_iterator i = _controls.begin(); i != _controls.end(); ++i ) { Control* child = i->get(); child->calcPos( cx, childCursor, _renderSize ); childCursor.y() += child->margin().top() + child->renderSize().y() + child->margin().bottom() + spacing(); } }
ControlList MidiDevice::getIPBControlParameters() const { ControlList retList; Rosegarden::MidiByte MIDI_CONTROLLER_VOLUME = 0x07; for (ControlList::const_iterator it = m_controlList.begin(); it != m_controlList.end(); ++it) { if (it->getIPBPosition() != -1 && it->getControllerValue() != MIDI_CONTROLLER_VOLUME) retList.push_back(*it); } return retList; }
void HBox::calcPos(const ControlContext& cx, const osg::Vec2f& cursor, const osg::Vec2f& parentSize) { Container::calcPos( cx, cursor, parentSize ); osg::Vec2f childCursor( _renderPos.x() + padding().left(), _renderPos.y() + padding().top() ); // collect all the members, growing the container is its orientation. for( ControlList::const_iterator i = _controls.begin(); i != _controls.end(); ++i ) { Control* child = i->get(); child->calcPos( cx, childCursor, _renderSize ); childCursor.x() += child->margin().left() + child->renderSize().x() + child->margin().right() + spacing(); } }
const ControlParameter * MidiDevice:: findControlParameter(std::string type, MidiByte conNumber) const { ControlList::const_iterator it = m_controlList.begin(); for (; it != m_controlList.end(); ++it) { if (it->getType() == type) { if (it->getType() == Rosegarden::Controller::EventType && it->getControllerValue() != conNumber) { continue; } return &*it; } } return 0; }
void MidiDevice::deviceToInstrControllerPush() { // Copy the instruments // InstrumentList::iterator iIt = m_instruments.begin(); for (; iIt != m_instruments.end(); ++iIt) { (*iIt)->clearStaticControllers(); ControlList::const_iterator cIt = m_controlList.begin(); for (; cIt != m_controlList.end(); ++cIt) { // It appears -1 means not to display an IPB controller if (isVisibleControlParameter(*cIt)) { MidiByte controllerValue = cIt->getControllerValue(); int defaultValue = cIt->getDefault(); (*iIt)->setControllerValue(controllerValue, defaultValue); } } } }
void MidiDevice::addInstrument(Instrument *instrument) { // Check / add controls to this instrument // No controls are pushed when called from the contructor since they are // not generated yet! ControlList::const_iterator it = m_controlList.begin(); for (; it != m_controlList.end(); ++it) { if (isVisibleControlParameter(*it)) { int controller = (*it).getControllerValue(); try { instrument->getControllerValue(controller); } catch(...) { instrument->setControllerValue(controller, it->getDefault()); } } } m_instruments.push_back(instrument); generatePresentationList(); }
std::string MidiDevice::toXmlString() const { std::stringstream midiDevice; midiDevice << " <device id=\"" << m_id << "\" name=\"" << m_name << "\" direction=\"" << (m_direction == Play ? "play" : "record") << "\" variation=\"" << (m_variationType == VariationFromLSB ? "LSB" : m_variationType == VariationFromMSB ? "MSB" : "") << "\" connection=\"" << encode(m_connection) << "\" type=\"midi\">" << std::endl << std::endl; midiDevice << " <librarian name=\"" << encode(m_librarian.first) << "\" email=\"" << encode(m_librarian.second) << "\"/>" << std::endl; if (m_metronome) { // Write out the metronome - watch the MidiBytes // when using the stringstream // midiDevice << " <metronome " << "instrument=\"" << m_metronome->getInstrument() << "\" " << "barpitch=\"" << (int)m_metronome->getBarPitch() << "\" " << "beatpitch=\"" << (int)m_metronome->getBeatPitch() << "\" " << "subbeatpitch=\"" << (int)m_metronome->getSubBeatPitch() << "\" " << "depth=\"" << (int)m_metronome->getDepth() << "\" " << "barvelocity=\"" << (int)m_metronome->getBarVelocity() << "\" " << "beatvelocity=\"" << (int)m_metronome->getBeatVelocity() << "\" " << "subbeatvelocity=\"" << (int)m_metronome->getSubBeatVelocity() << "\"/>" << std::endl << std::endl; } // and now bank information // BankList::const_iterator it; InstrumentList::const_iterator iit; ProgramList::const_iterator pt; for (it = m_bankList.begin(); it != m_bankList.end(); ++it) { midiDevice << " <bank " << "name=\"" << encode(it->getName()) << "\" " << "percussion=\"" << (it->isPercussion() ? "true" : "false") << "\" " << "msb=\"" << (int)it->getMSB() << "\" " << "lsb=\"" << (int)it->getLSB() << "\">" << std::endl; // Not terribly efficient // for (pt = m_programList.begin(); pt != m_programList.end(); ++pt) { if (pt->getBank().partialCompare(*it)) { midiDevice << " <program " << "id=\"" << (int)pt->getProgram() << "\" " << "name=\"" << encode(pt->getName()) << "\" "; if (!pt->getKeyMapping().empty()) { midiDevice << "keymapping=\"" << encode(pt->getKeyMapping()) << "\" "; } midiDevice << "/>" << std::endl; } } midiDevice << " </bank>" << std::endl << std::endl; } // Now controllers (before Instruments, which can depend on // Controller colours) // midiDevice << " <controls>" << std::endl; ControlList::const_iterator cIt; for (cIt = m_controlList.begin(); cIt != m_controlList.end() ; ++cIt) midiDevice << cIt->toXmlString(); midiDevice << " </controls>" << std::endl << std::endl; // Add instruments // for (iit = m_instruments.begin(); iit != m_instruments.end(); ++iit) midiDevice << (*iit)->toXmlString(); KeyMappingList::const_iterator kit; for (kit = m_keyMappingList.begin(); kit != m_keyMappingList.end(); ++kit) { midiDevice << " <keymapping " << "name=\"" << encode(kit->getName()) << "\">\n"; for (MidiKeyMapping::KeyNameMap::const_iterator nmi = kit->getMap().begin(); nmi != kit->getMap().end(); ++nmi) { midiDevice << " <key number=\"" << (int)nmi->first << "\" name=\"" << encode(nmi->second) << "\"/>\n"; } midiDevice << " </keymapping>\n"; } midiDevice << " </device>" << std::endl; return midiDevice.str(); }
void ControlEditorDialog::slotUpdate(bool added) { RG_DEBUG << "ControlEditorDialog::slotUpdate" << endl; MidiDevice *md = dynamic_cast<MidiDevice *>(m_studio->getDevice(m_device)); if (!md) return ; ControlList::const_iterator it = md->beginControllers(); ControlParameterItem *item; int i = 0; // Attempt to track last controller selected so we can reselect it int lastControllerId = -1; ControlParameterItem *lastItem = dynamic_cast<ControlParameterItem *>(m_treeWidget->currentItem()); if (lastItem) { lastControllerId = lastItem->getId(); } m_treeWidget->clear(); for (; it != md->endControllers(); ++it) { Composition &comp = m_doc->getComposition(); QString colour = strtoqstr(comp.getGeneralColourMap().getNameByIndex(it->getColourIndex())); if (colour == "") colour = tr("<default>"); QString position = QString("%1").arg(it->getIPBPosition()); if (position.toInt() == -1) position = tr("<not showing>"); QString value; value.sprintf("%d (0x%x)", it->getControllerValue(), it->getControllerValue()); if (it->getType() == PitchBend::EventType) { item = new ControlParameterItem( i++, m_treeWidget, QStringList() << strtoqstr(it->getName()) << strtoqstr(it->getType()) << QString("-") << strtoqstr(it->getDescription()) << QString("%1").arg(it->getMin()) << QString("%1").arg(it->getMax()) << QString("%1").arg(it->getDefault()) << colour << position ); } else { item = new ControlParameterItem( i++, m_treeWidget, QStringList() << strtoqstr(it->getName()) << strtoqstr(it->getType()) << value << strtoqstr(it->getDescription()) << QString("%1").arg(it->getMin()) << QString("%1").arg(it->getMax()) << QString("%1").arg(it->getDefault()) << colour << position ); } if (item->getId() == lastControllerId) { m_treeWidget->setCurrentItem(item); } // create and set a colour pixmap // QPixmap colourPixmap(16, 16); Colour c = comp.getGeneralColourMap().getColourByIndex(it->getColourIndex()); colourPixmap.fill(QColor(c.getRed(), c.getGreen(), c.getBlue())); item->setIcon(7, QIcon(colourPixmap)); m_treeWidget->addTopLevelItem(item); } if(m_treeWidget->topLevelItemCount() == 0) { QTreeWidgetItem *item = new QTreeWidgetItem(m_treeWidget, QStringList(tr("<none>"))); m_treeWidget->addTopLevelItem(item); m_treeWidget->setSelectionMode(QAbstractItemView::NoSelection); } else { m_treeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); } // This logic is kind of frigged up, and may be too fragile. It assumes // that if you added an item, the last thing iterated through will be that // new item, so the value of the variable item will be the last thing // iterated through, and therefore the newest item you just added and want // to edit. // // I got substantially far along the way to making this quick and dirty hack // work before I thought it would be a lot cleaner to have the // AddControlParameterCommand itself launch the dialog and allow the user to // edit the parameters before ever adding it to the list at all. That would // be a lot cleaner, but it would also require going against the flow of how // this logic always worked, so it would require a lot more thought to // achieve the same end result that way. Instead, I just used this hack // overloaded slotUpdate() to tell it when a new controller was added, so we // could grab it here and launch the dialog on the generic blah we just added // to the list right before this slot got called with the optional bool set // true. // // (so much for verbose comments being helpful... I wrote that not too long // ago, and reading it now, I have NO fscking idea what I was talking about) // if (added) { RG_DEBUG << "ControlEditorDialog: detected new item entered; launching editor" << endl; m_treeWidget->setCurrentItem(item); slotEdit(item, 0); } }