From 99aa12e06eaa07db65026519d5875ee24f33da20 Mon Sep 17 00:00:00 2001 From: Harshit Maurya Date: Thu, 14 May 2020 03:43:58 +0530 Subject: wwaveformviewer: highlight hovered mark --- src/waveform/renderers/waveformmark.cpp | 1 + src/waveform/renderers/waveformwidgetrenderer.cpp | 17 ++----- src/waveform/renderers/waveformwidgetrenderer.h | 2 +- src/widget/wwaveformviewer.cpp | 57 +++++++++++++++++++++-- src/widget/wwaveformviewer.h | 8 +++- 5 files changed, 65 insertions(+), 20 deletions(-) diff --git a/src/waveform/renderers/waveformmark.cpp b/src/waveform/renderers/waveformmark.cpp index 5d8e7d1164..cb7fae606b 100644 --- a/src/waveform/renderers/waveformmark.cpp +++ b/src/waveform/renderers/waveformmark.cpp @@ -99,6 +99,7 @@ WaveformMark::WaveformMark(const QString& group, } void WaveformMark::setBaseColor(QColor baseColor) { + m_image = QImage(); m_fillColor = baseColor; m_borderColor = Color::chooseContrastColor(baseColor); m_labelColor = Color::chooseColorByBrightness(baseColor, QColor(255,255,255,255), QColor(0,0,0,255)); diff --git a/src/waveform/renderers/waveformwidgetrenderer.cpp b/src/waveform/renderers/waveformwidgetrenderer.cpp index 79499d0712..58f4764651 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.cpp +++ b/src/waveform/renderers/waveformwidgetrenderer.cpp @@ -289,7 +289,7 @@ void WaveformWidgetRenderer::setTrack(TrackPointer track) { } } -CuePointer WaveformWidgetRenderer::getCueAtPoint(QPoint point) { +WaveformMarkPointer WaveformWidgetRenderer::getCueMarkAtPoint(QPoint point) { WaveformMarkPointer pSelectedMark; const int lineHoverpadding = 5; for (const auto& pMark : m_markLabelOffsets.keys()) { @@ -328,19 +328,8 @@ CuePointer WaveformWidgetRenderer::getCueAtPoint(QPoint point) { if (labelRectangleInWaveformWidgetSpace.contains(point) || markLineVicinity.contains(point)) { - pSelectedMark = pMark; - break; + return pMark; } } - if (!pSelectedMark) { - return static_cast(nullptr); - } - - QList cueList = getTrackInfo()->getCuePoints(); - for (const auto& pCue : cueList) { - if (pCue->getHotCue() == pSelectedMark->getHotCue()) { - return pCue; - } - } - return static_cast(nullptr); + return static_cast(nullptr); } diff --git a/src/waveform/renderers/waveformwidgetrenderer.h b/src/waveform/renderers/waveformwidgetrenderer.h index 0ab5731511..3f58560e4a 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.h +++ b/src/waveform/renderers/waveformwidgetrenderer.h @@ -41,7 +41,7 @@ class WaveformWidgetRenderer { inline const char* getGroup() const { return m_group;} const TrackPointer getTrackInfo() const { return m_pTrack;} // Get cue at a point on the waveform widget. - CuePointer getCueAtPoint(QPoint point); + WaveformMarkPointer getCueMarkAtPoint(QPoint point); double getFirstDisplayedPosition() const { return m_firstDisplayedPosition;} double getLastDisplayedPosition() const { return m_lastDisplayedPosition;} diff --git a/src/widget/wwaveformviewer.cpp b/src/widget/wwaveformviewer.cpp index ab98eebc36..4cae01b9ea 100644 --- a/src/widget/wwaveformviewer.cpp +++ b/src/widget/wwaveformviewer.cpp @@ -80,10 +80,12 @@ void WWaveformViewer::mousePressEvent(QMouseEvent* event) { m_pScratchPositionEnable->slotSet(1.0); } else if (event->button() == Qt::RightButton) { const auto currentTrack = m_waveformWidget->getTrackInfo(); - auto cueAtClickPos = m_waveformWidget->getCueAtPoint(m_mouseAnchor); - if (cueAtClickPos) { - m_pCueMenuPopup->setTrackAndCue(currentTrack, cueAtClickPos); - m_pCueMenuPopup->popup(event->globalPos()); + if (m_pHoveredMark) { + auto cueAtClickPos = getCuePointerFromCueMark(m_pHoveredMark); + if (cueAtClickPos) { + m_pCueMenuPopup->setTrackAndCue(currentTrack, cueAtClickPos); + m_pCueMenuPopup->popup(event->globalPos()); + } } else { // If we are scratching then disable and reset because the two shouldn't // be used at once. @@ -131,6 +133,24 @@ void WWaveformViewer::mouseMoveEvent(QMouseEvent* event) { // clamp to [0.0, 1.0] v = math_clamp(v, 0.0, 1.0); m_pWheel->setParameter(v); + } else { + WaveformMarkPointer pMark; + pMark = m_waveformWidget->getCueMarkAtPoint(event->pos()); + if (pMark) { + if (!m_pHoveredMark) { + m_pHoveredMark = pMark; + highlightMark(pMark); + } else if (pMark != m_pHoveredMark) { + unhighlightMark(m_pHoveredMark); + m_pHoveredMark = pMark; + highlightMark(pMark); + } + } else { + if (m_pHoveredMark) { + unhighlightMark(m_pHoveredMark); + m_pHoveredMark = nullptr; + } + } } } @@ -167,6 +187,13 @@ void WWaveformViewer::dropEvent(QDropEvent* event) { DragAndDropHelper::handleTrackDropEvent(event, *this, m_pGroup, m_pConfig); } +void WWaveformViewer::leaveEvent(QEvent*) { + if (m_pHoveredMark) { + unhighlightMark(m_pHoveredMark); + m_pHoveredMark = nullptr; + } +} + void WWaveformViewer::slotTrackLoaded(TrackPointer track) { if (m_waveformWidget) { m_waveformWidget->setTrack(track); @@ -230,3 +257,25 @@ void WWaveformViewer::setWaveformWidget(WaveformWidgetAbstract* waveformWidget) m_waveformWidget->getWidget()->setMouseTracking(true); } } + +CuePointer WWaveformViewer::getCuePointerFromCueMark(WaveformMarkPointer pMark) { + if (pMark) { + QList cueList = m_waveformWidget->getTrackInfo()->getCuePoints(); + for (const auto& pCue : cueList) { + if (pCue->getHotCue() == pMark->getHotCue()) { + return pCue; + } + } + } + return static_cast(nullptr); +} + +void WWaveformViewer::highlightMark(WaveformMarkPointer pMark) { + QColor highlightColor = Color::chooseContrastColor(pMark->fillColor()); + pMark->setBaseColor(highlightColor); +} + +void WWaveformViewer::unhighlightMark(WaveformMarkPointer pMark) { + QColor originalColor = mixxx::RgbColor::toQColor(getCuePointerFromCueMark(pMark)->getColor()); + pMark->setBaseColor(originalColor); +} diff --git a/src/widget/wwaveformviewer.h b/src/widget/wwaveformviewer.h index 8091785c69..c02333285f 100644 --- a/src/widget/wwaveformviewer.h +++ b/src/widget/wwaveformviewer.h @@ -34,8 +34,9 @@ class WWaveformViewer : public WWidget, public TrackDropTarget { void mousePressEvent(QMouseEvent * /*unused*/) override; void mouseMoveEvent(QMouseEvent * /*unused*/) override; void mouseReleaseEvent(QMouseEvent * /*unused*/) override; + void leaveEvent(QEvent* /*unused*/) override; -signals: + signals: void trackDropped(QString filename, QString group) override; void cloneDeck(QString source_group, QString target_group) override; @@ -75,10 +76,15 @@ private: bool m_bBending; QPoint m_mouseAnchor; parented_ptr m_pCueMenuPopup; + WaveformMarkPointer m_pHoveredMark; WaveformWidgetAbstract* m_waveformWidget; friend class WaveformWidgetFactory; + + CuePointer getCuePointerFromCueMark(WaveformMarkPointer pMark); + void highlightMark(WaveformMarkPointer pMark); + void unhighlightMark(WaveformMarkPointer pMark); }; #endif -- cgit v1.2.3