void WaveformRenderMark::slotCuesUpdated() { TrackPointer trackInfo = m_waveformRenderer->getTrackInfo(); if (!trackInfo){ return; } QList<CuePointer> loadedCues = trackInfo->getCuePoints(); for (const CuePointer pCue: loadedCues) { int hotCue = pCue->getHotCue(); if (hotCue < 0) { continue; } // Here we assume no two cues can have the same hotcue assigned, // because WaveformMarkSet stores one mark for each hotcue. WaveformMarkPointer pMark = m_marks.getHotCueMark(hotCue); if (pMark.isNull()) { continue; } WaveformMarkProperties markProperties = pMark->getProperties(); QString newLabel = pCue->getLabel(); QColor newColor = m_predefinedColorsRepresentation.representationFor(pCue->getColor()); if (markProperties.m_text.isNull() || newLabel != markProperties.m_text || !markProperties.fillColor().isValid() || newColor != markProperties.fillColor()) { markProperties.m_text = newLabel; markProperties.setBaseColor(newColor); pMark->setProperties(markProperties); generateMarkImage(pMark.data()); } } }
void WaveformRenderMark::draw(QPainter* painter, QPaintEvent* /*event*/) { painter->save(); /* //DEBUG for (int i = 0; i < m_markPoints.size(); i++) { if (m_waveformWidget->getTrackSamples()) painter->drawText(40*i,12+12*(i%3),QString::number(m_markPoints[i]->get() / (double)m_waveformWidget->getTrackSamples())); } */ painter->setWorldMatrixEnabled(false); for (const auto& pMark: m_marks) { if (!pMark->isValid()) continue; if (pMark->hasVisible() && !pMark->isVisible()) { continue; } // Generate image on first paint can't be done in setup since we need // render widget to be resized yet ... if (pMark->m_image.isNull()) { generateMarkImage(pMark.data()); } double samplePosition = pMark->getSamplePosition(); if (samplePosition != -1.0) { double currentMarkPoint = m_waveformRenderer->transformSamplePositionInRendererWorld(samplePosition); if (m_waveformRenderer->getOrientation() == Qt::Horizontal) { // NOTE: vRince I guess image width is odd to display the center on the exact line ! // external image should respect that ... const int markHalfWidth = pMark->m_image.width() / 2.0; // Check if the current point need to be displayed if (currentMarkPoint > -markHalfWidth && currentMarkPoint < m_waveformRenderer->getWidth() + markHalfWidth) { painter->drawImage(QPoint(currentMarkPoint - markHalfWidth, 0), pMark->m_image); } } else { const int markHalfHeight = pMark->m_image.height() / 2.0; if (currentMarkPoint > -markHalfHeight && currentMarkPoint < m_waveformRenderer->getHeight() + markHalfHeight) { painter->drawImage(QPoint(0,currentMarkPoint - markHalfHeight), pMark->m_image); } } } } painter->restore(); }
void WaveformRenderMark::draw(QPainter* painter, QPaintEvent* /*event*/) { painter->save(); /* //DEBUG for (int i = 0; i < m_markPoints.size(); i++) { if (m_waveformWidget->getTrackSamples()) painter->drawText(40*i,12+12*(i%3),QString::number(m_markPoints[i]->get() / (double)m_waveformWidget->getTrackSamples())); } */ painter->setWorldMatrixEnabled(false); for (int i = 0; i < m_marks.size(); i++) { WaveformMark& mark = m_marks[i]; if (!mark.m_pPointCos) continue; // Generate image on first paint can't be done in setup since we need // render widget to be resized yet ... if (mark.m_image.isNull()) { generateMarkImage(mark); } int samplePosition = mark.m_pPointCos->get(); if (samplePosition > 0.0) { double currentMarkPoint = m_waveformRenderer->transformSampleIndexInRendererWorld(samplePosition); // NOTE: vRince I guess image width is odd to display the center on the exact line ! //external image should respect that ... const int markHalfWidth = mark.m_image.width() / 2.0; //check if the current point need to be displayed if (currentMarkPoint > -markHalfWidth && currentMarkPoint < m_waveformRenderer->getWidth() + markHalfWidth) { painter->drawImage(QPoint(currentMarkPoint-markHalfWidth,0), mark.m_image); } } } painter->restore(); }