void TrackListView::toggleTrackPart(QStandardItem* item)/*{{{*/ { if(!item) return; m_editing = true; int type = item->data(TrackRole).toInt(); int column = item->column(); bool checked = (item->checkState() == Qt::Checked); qint64 tid = item->data(TrackIdRole).toLongLong(); QString trackName = item->data(TrackNameRole).toString(); QString partName; m_selectedIndex = item->row(); QString newName = item->text(); if(type == 1) { if(trackName == newName) column = 0; else column = 1; } else { partName = item->data(PartNameRole).toString(); if(partName == newName) column = 0; else column = 1; } MidiTrack* track = song->findTrackById(tid); if(!track || !m_editor) { m_editing = false; return; } PartList* list = track->parts(); if(list->empty()) { m_editing = false; updateCheck(); return; } switch(type) { case 1: //Track { if(!column) { if(checked) { m_editor->addParts(list); m_selectedTracks.append(track->id()); if(!list->empty()) { updatePartSelection(list->begin()->second); updateCheck(list, checked); } } else { m_editor->removeParts(list); m_editor->updateCanvas(); m_selectedTracks.removeAll(track->id()); updateCheck(); song->update(SC_SELECTION); } } else { bool valid = true; if(newName.isEmpty()) { valid = false; } if(valid) { for (iMidiTrack i = song->tracks()->begin(); i != song->tracks()->end(); ++i) { if ((*i)->name() == newName) { valid = false; break; } } } if(!valid) { QMessageBox::critical(this, tr("LOS: bad trackname"), tr("please choose a unique track name"), QMessageBox::Ok, Qt::NoButton, Qt::NoButton); m_model->blockSignals(true); item->setText(item->data(TrackNameRole).toString()); m_model->blockSignals(false); update(); m_editing = false; return; } m_model->blockSignals(true); item->setData(newName, TrackNameRole); m_model->blockSignals(false); Track* newTrack = track->clone(false); newTrack->setName(newName); track->setName(newName); audio->msgChangeTrack((MidiTrack*)newTrack, track); } } break; case 2: //Part { int sn = item->data(PartRole).toInt(); unsigned tick = item->data(TickRole).toInt(); Part* part = list->find(tick, sn); if(part) { if(!column) { if(checked) { m_editor->addPart(part); updatePartSelection(part); } else { m_editor->removePart(sn); m_editor->updateCanvas(); updateCheck(); song->update(SC_SELECTION); } } else { if(partName.isEmpty()) { QMessageBox::critical(this, tr("LOS: Invalid part name"), tr("Please choose a name with at least one charactor"), QMessageBox::Ok, Qt::NoButton, Qt::NoButton); m_model->blockSignals(true); item->setText(item->data(PartNameRole).toString()); m_model->blockSignals(false); update(); m_editing = false; return; } m_model->blockSignals(true); item->setData(newName, PartNameRole); m_model->blockSignals(false); Part* newPart = part->clone(); newPart->setName(newName); // Indicate do undo, and do port controller values but not clone parts. audio->msgChangePart(part, newPart, true, true, false); song->update(SC_PART_MODIFIED); } } } break; } update(); if(m_selectedIndex < m_model->rowCount()) { m_table->selectRow(m_selectedIndex); m_table->scrollTo(m_model->index(m_selectedIndex, 0)); } m_editing = false; }/*}}}*/