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); } }