diff options
Diffstat (limited to 'src/waveform')
-rw-r--r-- | src/waveform/renderers/waveformrendermark.cpp | 19 | ||||
-rw-r--r-- | src/waveform/renderers/waveformwidgetrenderer.cpp | 41 | ||||
-rw-r--r-- | src/waveform/renderers/waveformwidgetrenderer.h | 6 |
3 files changed, 46 insertions, 20 deletions
diff --git a/src/waveform/renderers/waveformrendermark.cpp b/src/waveform/renderers/waveformrendermark.cpp index 882b748f1a..1c1f9d02d8 100644 --- a/src/waveform/renderers/waveformrendermark.cpp +++ b/src/waveform/renderers/waveformrendermark.cpp @@ -31,7 +31,8 @@ void WaveformRenderMark::setup(const QDomNode& node, const SkinContext& context) void WaveformRenderMark::draw(QPainter* painter, QPaintEvent* /*event*/) { PainterScope PainterScope(painter); - QMap<WaveformMarkPointer, QRect> marksOnScreen; + // Maps mark image offset to mark object. + QMap<WaveformMarkPointer, int> marksOnScreen; /* //DEBUG for (int i = 0; i < m_markPoints.size(); i++) { @@ -60,7 +61,6 @@ void WaveformRenderMark::draw(QPainter* painter, QPaintEvent* /*event*/) { if (samplePosition != -1.0) { double currentMarkPoint = m_waveformRenderer->transformSamplePositionInRendererWorld(samplePosition); - const auto& labelBoundingRect = pMark->m_label.area(); 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 ... @@ -70,12 +70,8 @@ void WaveformRenderMark::draw(QPainter* painter, QPaintEvent* /*event*/) { // Check if the current point need to be displayed if (currentMarkPoint > -markHalfWidth && currentMarkPoint < m_waveformRenderer->getWidth() + markHalfWidth) { int drawOffset = currentMarkPoint - markHalfWidth; - int labelBoundaryStartOffset = drawOffset + labelBoundingRect.left(); painter->drawImage(QPoint(drawOffset, 0), pMark->m_image); - marksOnScreen[pMark] = QRect(labelBoundaryStartOffset, - labelBoundingRect.top(), - labelBoundingRect.width(), - labelBoundingRect.height()); + marksOnScreen[pMark] = drawOffset; } } else { const int markHalfHeight = pMark->m_image.height() / 2.0; @@ -83,13 +79,8 @@ void WaveformRenderMark::draw(QPainter* painter, QPaintEvent* /*event*/) { currentMarkPoint < m_waveformRenderer->getHeight() + markHalfHeight) { int drawOffset = currentMarkPoint - markHalfHeight; - int labelBoundaryStartOffset = - drawOffset + labelBoundingRect.top(); painter->drawImage(QPoint(0, drawOffset), pMark->m_image); - marksOnScreen[pMark] = QRect(labelBoundingRect.left(), - labelBoundaryStartOffset, - labelBoundingRect.width(), - labelBoundingRect.height()); + marksOnScreen[pMark] = drawOffset; } } } @@ -251,6 +242,7 @@ void WaveformRenderMark::generateMarkImage(WaveformMarkPointer pMark) { // Draw marker lines if (m_waveformRenderer->getOrientation() == Qt::Horizontal) { int middle = width / 2; + pMark->m_linePosition = middle; if (markAlignH == Qt::AlignHCenter) { if (labelRect.top() > 0) { painter.setPen(pMark->fillColor()); @@ -279,6 +271,7 @@ void WaveformRenderMark::generateMarkImage(WaveformMarkPointer pMark) { } } else { // Vertical int middle = height / 2; + pMark->m_linePosition = middle; if (markAlignV == Qt::AlignVCenter) { if (labelRect.left() > 0) { painter.setPen(pMark->fillColor()); diff --git a/src/waveform/renderers/waveformwidgetrenderer.cpp b/src/waveform/renderers/waveformwidgetrenderer.cpp index d79c2628a6..ce6b9b5cd7 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.cpp +++ b/src/waveform/renderers/waveformwidgetrenderer.cpp @@ -291,9 +291,43 @@ void WaveformWidgetRenderer::setTrack(TrackPointer track) { std::optional<CuePointer> WaveformWidgetRenderer::getCueAtPoint(QPoint point) { WaveformMarkPointer pSelectedMark; - for (auto pMark : m_markBoundaries.keys()) { - const auto labelRectangle = m_markBoundaries[pMark]; - if (labelRectangle.contains(point)) { + const int lineHoverpadding = 5; + for (const auto& pMark : m_markLabelOffsets.keys()) { + QRectF labelBoundingRectInMarkImageSpace = pMark->m_label.area(); + int markImageOffsetInWaveformWidgetSpace = m_markLabelOffsets[pMark]; + int markLineOffset = markImageOffsetInWaveformWidgetSpace + pMark->m_linePosition; + QRect labelRectangleInWaveformWidgetSpace; + QRect markLineVicinity; + if (getOrientation() == Qt::Horizontal) { + int labelBoundaryStartOffset = + markImageOffsetInWaveformWidgetSpace + + labelBoundingRectInMarkImageSpace.left(); + labelRectangleInWaveformWidgetSpace = + QRect(labelBoundaryStartOffset, + labelBoundingRectInMarkImageSpace.top(), + labelBoundingRectInMarkImageSpace.width(), + labelBoundingRectInMarkImageSpace.height()); + markLineVicinity = QRect(markLineOffset - lineHoverpadding, + 0, + lineHoverpadding * 2, + getHeight()); + } else { /* Vertical */ + int labelBoundaryStartOffset = + markImageOffsetInWaveformWidgetSpace + + labelBoundingRectInMarkImageSpace.top(); + labelRectangleInWaveformWidgetSpace = + QRect(labelBoundingRectInMarkImageSpace.left(), + labelBoundaryStartOffset, + labelBoundingRectInMarkImageSpace.width(), + labelBoundingRectInMarkImageSpace.height()); + markLineVicinity = QRect(0, + markLineOffset - lineHoverpadding, + getWidth(), + lineHoverpadding * 2); + } + + if (labelRectangleInWaveformWidgetSpace.contains(point) || + markLineVicinity.contains(point)) { pSelectedMark = pMark; break; } @@ -301,7 +335,6 @@ std::optional<CuePointer> WaveformWidgetRenderer::getCueAtPoint(QPoint point) { if (!pSelectedMark) { return std::nullopt; } - CuePointer pSelectedCue; QList<CuePointer> cueList = getTrackInfo()->getCuePoints(); for (const auto& pCue : cueList) { diff --git a/src/waveform/renderers/waveformwidgetrenderer.h b/src/waveform/renderers/waveformwidgetrenderer.h index 4df068fdd6..4b67dc599b 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.h +++ b/src/waveform/renderers/waveformwidgetrenderer.h @@ -97,8 +97,8 @@ class WaveformWidgetRenderer { void setTrack(TrackPointer track); inline void setMarkLabelBoundaries( - const QMap<WaveformMarkPointer, QRect>& markLabelBoundaries) { - m_markBoundaries = markLabelBoundaries; + QMap<WaveformMarkPointer, int> markLabelOffsets) { + m_markLabelOffsets = markLabelOffsets; } double getPlayMarkerPosition() { @@ -158,7 +158,7 @@ class WaveformWidgetRenderer { private: DISALLOW_COPY_AND_ASSIGN(WaveformWidgetRenderer); friend class WaveformWidgetFactory; - QMap<WaveformMarkPointer, QRect> m_markBoundaries; + QMap<WaveformMarkPointer, int> m_markLabelOffsets; }; #endif // WAVEFORMWIDGETRENDERER_H |