void TrackListView::selectionChanged(const QModelIndex current, const QModelIndex)/*{{{*/ { if(!current.isValid()) return; int row = current.row(); m_selectedIndex = row; QStandardItem* item = m_model->item(row); if(item) { int type = item->data(TrackRole).toInt(); qint64 tid = item->data(TrackIdRole).toLongLong(); bool checked = (item->checkState() == Qt::Checked); //QString trackName = item->data(TrackNameRole).toString(); MidiTrack* track = song->findTrackById(tid); if(!track || !m_editor || type == 1 || !checked) return; PartList* list = track->parts(); int sn = item->data(PartRole).toInt(); unsigned tick = item->data(TickRole).toInt(); Part* part = list->find(tick, sn); updatePartSelection(part); } }/*}}}*/
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; }/*}}}*/
void TrackListView::contextPopupMenu(QPoint pos)/*{{{*/ { QModelIndex mindex = m_table->indexAt(pos); if(!mindex.isValid()) return; //int row = mindex.row(); QStandardItem* item = m_model->itemFromIndex(mindex); if(item) { m_selectedIndex = item->row(); //Make it works even if you rightclick on the checkbox QString trackName = item->data(TrackNameRole).toString(); int type = item->data(TrackRole).toInt(); MidiTrack* track = song->findTrack(trackName); if(!track || !m_editor) return; QMenu* p = new QMenu(this); QString title(tr("Part Color")); int index = track->getDefaultPartColor(); Part* npart = 0; if(type == 1) title = QString(tr("Default Part Color")); else { PartList* list = track->parts(); int sn = item->data(PartRole).toInt(); unsigned tick = item->data(TickRole).toInt(); npart = list->find(tick, sn); if(npart) index = npart->colorIndex(); } QMenu* colorPopup = p->addMenu(title); QMenu* colorSub; for (int i = 0; i < NUM_PARTCOLORS; ++i) { QString colorname(config.partColorNames[i]); if(colorname.contains("menu:", Qt::CaseSensitive)) { colorSub = colorPopup->addMenu(colorname.replace("menu:", "")); } else { if(index == i) { colorname = QString(config.partColorNames[i]); colorPopup->setIcon(partColorIconsSelected.at(i)); colorPopup->setTitle(colorSub->title()+": "+colorname); colorname = QString("* "+config.partColorNames[i]); QAction *act_color = colorSub->addAction(partColorIconsSelected.at(i), colorname); act_color->setData(20 + i); } else { colorname = QString(" "+config.partColorNames[i]); QAction *act_color = colorSub->addAction(partColorIcons.at(i), colorname); act_color->setData(20 + i); } } } p->addAction(tr("Add Part"))->setData(1); p->addAction(tr("Add Part and Select"))->setData(2); if(type == 2) p->addAction(tr("Delete Part"))->setData(3); QAction* act = p->exec(QCursor::pos()); if (act) { int selection = act->data().toInt(); switch(selection) { case 1: { CItem *citem = los->composer->addCanvasPart(track); if(citem) { Part* mp = citem->part(); populateTable();//update check state //Select and scroll to the added part if(mp) { int psn = mp->sn(); for(int i = 0; i < m_model->rowCount(); ++i) { QStandardItem* item = m_model->item(i, 0); if(item) { int type = item->data(TrackRole).toInt(); if(type == 1) {//TrackMode continue; } else {//PartMode int sn = item->data(PartRole).toInt(); if(psn == sn) { //m_tempColor = item->foreground(); m_model->blockSignals(true); item->setForeground(QColor(99, 36, 36)); m_model->blockSignals(false); update(); m_selectedIndex = item->row(); m_table->selectRow(m_selectedIndex); m_table->scrollTo(m_model->index(m_selectedIndex, 0)); m_colorRows.append(m_selectedIndex); QTimer::singleShot(350, this, SLOT(updateColor())); break; } } } } } } } break; case 2: { CItem* citem = los->composer->addCanvasPart(track); if(citem) { Part* mp = citem->part(); if(mp) { m_editor->addPart(mp); populateTable();//update check state updatePartSelection(mp); } } break; } case 3: { if(npart) { audio->msgRemovePart(npart); populateTable();//update check state scrollPos = pos; /*if(row < m_model->rowCount()) { QModelIndex rowIndex = m_table->indexAt(pos); m_table->scrollTo(rowIndex, QAbstractItemView::PositionAtTop); }*/ } break; } case 20 ... NUM_PARTCOLORS + 20: { int curColorIndex = selection - 20; if(npart) { npart->setColorIndex(curColorIndex); song->update(SC_PART_COLOR_MODIFIED); } else { track->setDefaultPartColor(curColorIndex); } populateTable();//update check state break; } } } delete p; } }/*}}}*/