void TrackView::paintTrack(QStylePainter &painter, const QRegion ®ion, int track) { const QRect &rect = region.boundingRect(); int firstRow = qBound(0, getRowFromPhysicalY(qMax(rect.top(), topMarginHeight)), getRows() - 1); int lastRow = qBound(0, getRowFromPhysicalY(qMax(rect.bottom(), topMarginHeight)), getRows() - 1); QRect selection = getSelection(); const SyncTrack *t = getTrack(track); for (int row = firstRow; row <= lastRow; ++row) { QRect patternDataRect(getPhysicalX(track), getPhysicalY(row), trackWidth, rowHeight); if (!region.intersects(patternDataRect)) continue; const SyncTrack::TrackKey *key = t->getPrevKeyFrame(row); SyncTrack::TrackKey::KeyType interpolationType = key ? key->type : SyncTrack::TrackKey::STEP; bool selected = selection.contains(track, row); QBrush baseBrush = bgBaseBrush; QBrush darkBrush = bgDarkBrush; if (selected) { baseBrush = selectBaseBrush; darkBrush = selectDarkBrush; } QBrush bgBrush = (row % 8 == 0) ? darkBrush : baseBrush; QRect fillRect = patternDataRect; painter.fillRect(fillRect, bgBrush); if (row % 8 == 0) { painter.setPen(selected ? rowSelectPen : rowPen); painter.drawLine(QPointF(patternDataRect.left() + 0.5, patternDataRect.top() + 0.5), QPointF(patternDataRect.right() + 0.5, patternDataRect.top() + 0.5)); } if (interpolationType != SyncTrack::TrackKey::STEP) { painter.setPen(getInterpolationPen(interpolationType)); painter.drawLine(QPoint(patternDataRect.right(), patternDataRect.top() + 1), QPoint(patternDataRect.right(), patternDataRect.bottom())); } if (row == editRow && track == editTrack) { QRectF selectRect = QRectF(patternDataRect).adjusted(0.5, 0.5, -0.5, -0.5); painter.setPen(QColor(0, 0, 0)); painter.drawRect(selectRect); } painter.setPen(selected ? palette().color(QPalette::HighlightedText) : palette().color(QPalette::WindowText)); painter.drawText(patternDataRect, t->isKeyFrame(row) ? QString::number(t->getKeyFrame(row).value, 'f', 2) : " ---"); } }