diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/waveform/renderers/waveformrendermark.cpp | 8 | ||||
-rw-r--r-- | src/waveform/renderers/waveformrendermark.h | 1 | ||||
-rw-r--r-- | src/waveform/renderers/waveformwidgetrenderer.cpp | 27 | ||||
-rw-r--r-- | src/waveform/renderers/waveformwidgetrenderer.h | 10 | ||||
-rw-r--r-- | src/widget/wwaveformviewer.cpp | 9 | ||||
-rw-r--r-- | src/widget/wwaveformviewer.h | 5 |
6 files changed, 56 insertions, 4 deletions
diff --git a/src/waveform/renderers/waveformrendermark.cpp b/src/waveform/renderers/waveformrendermark.cpp index 2a51726d4c..f3ff3f915e 100644 --- a/src/waveform/renderers/waveformrendermark.cpp +++ b/src/waveform/renderers/waveformrendermark.cpp @@ -69,7 +69,10 @@ void WaveformRenderMark::draw(QPainter* painter, QPaintEvent* /*event*/) { // 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); + int drawOffset = currentMarkPoint - markHalfWidth; + const auto topLeft = QPoint(drawOffset, 0); + painter->drawImage(topLeft, pMark->m_image); + m_markBoundaries[pMark].setTopLeft(topLeft); } } else { const int markHalfHeight = pMark->m_image.height() / 2.0; @@ -80,6 +83,7 @@ void WaveformRenderMark::draw(QPainter* painter, QPaintEvent* /*event*/) { } } } + m_waveformRenderer->setMarkLabelBoundaries(m_markBoundaries); } void WaveformRenderMark::onResize() { @@ -185,6 +189,8 @@ void WaveformRenderMark::generateMarkImage(WaveformMarkPointer pMark) { int labelRectHeight = wordRect.height() + 2 * marginY + 4; QRectF labelRect(0, 0, (float)labelRectWidth, (float)labelRectHeight); + m_markBoundaries[pMark].setWidth(labelRectWidth); + m_markBoundaries[pMark].setHeight(labelRectHeight); int width; int height; diff --git a/src/waveform/renderers/waveformrendermark.h b/src/waveform/renderers/waveformrendermark.h index dc0fad17c9..bccc5691af 100644 --- a/src/waveform/renderers/waveformrendermark.h +++ b/src/waveform/renderers/waveformrendermark.h @@ -36,6 +36,7 @@ class WaveformRenderMark : public QObject, public WaveformRendererAbstract { void generateMarkImage(WaveformMarkPointer pMark); WaveformMarkSet m_marks; + QMap<WaveformMarkPointer, QRect> m_markBoundaries; DISALLOW_COPY_AND_ASSIGN(WaveformRenderMark); }; diff --git a/src/waveform/renderers/waveformwidgetrenderer.cpp b/src/waveform/renderers/waveformwidgetrenderer.cpp index 8c37c2d2cd..fb1de6cd7c 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.cpp +++ b/src/waveform/renderers/waveformwidgetrenderer.cpp @@ -288,3 +288,30 @@ void WaveformWidgetRenderer::setTrack(TrackPointer track) { m_rendererStack[i]->onSetTrack(); } } + +std::optional<CuePointer> WaveformWidgetRenderer::getCueAtPoint(QPoint point) { + WaveformMarkPointer pSelectedMark; + for (auto pMark : m_markBoundaries.keys()) { + if (m_markBoundaries[pMark].contains(point)) { + pSelectedMark = pMark; + break; + } + } + if (!pSelectedMark) { + return std::nullopt; + } + + CuePointer pSelectedCue; + QList<CuePointer> cueList = getTrackInfo()->getCuePoints(); + for (const auto& pCue : cueList) { + if (pCue->getHotCue() == pSelectedMark->getHotCue()) { + pSelectedCue = pCue; + break; + } + } + if (pSelectedCue != nullptr) { + return pSelectedCue; + } + + return std::nullopt; +} diff --git a/src/waveform/renderers/waveformwidgetrenderer.h b/src/waveform/renderers/waveformwidgetrenderer.h index 9cab36f6c8..4df068fdd6 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.h +++ b/src/waveform/renderers/waveformwidgetrenderer.h @@ -8,9 +8,10 @@ #include "track/track.h" #include "util/class.h" +#include "util/performancetimer.h" +#include "waveform/renderers/waveformmark.h" #include "waveform/renderers/waveformrendererabstract.h" #include "waveform/renderers/waveformsignalcolors.h" -#include "util/performancetimer.h" //#define WAVEFORMWIDGETRENDERER_DEBUG @@ -39,6 +40,8 @@ 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. + std::optional<CuePointer> getCueAtPoint(QPoint point); double getFirstDisplayedPosition() const { return m_firstDisplayedPosition;} double getLastDisplayedPosition() const { return m_lastDisplayedPosition;} @@ -93,6 +96,10 @@ class WaveformWidgetRenderer { } void setTrack(TrackPointer track); + inline void setMarkLabelBoundaries( + const QMap<WaveformMarkPointer, QRect>& markLabelBoundaries) { + m_markBoundaries = markLabelBoundaries; + } double getPlayMarkerPosition() { return m_playMarkerPosition; @@ -151,6 +158,7 @@ class WaveformWidgetRenderer { private: DISALLOW_COPY_AND_ASSIGN(WaveformWidgetRenderer); friend class WaveformWidgetFactory; + QMap<WaveformMarkPointer, QRect> m_markBoundaries; }; #endif // WAVEFORMWIDGETRENDERER_H diff --git a/src/widget/wwaveformviewer.cpp b/src/widget/wwaveformviewer.cpp index d64448103e..0fb4e989bb 100644 --- a/src/widget/wwaveformviewer.cpp +++ b/src/widget/wwaveformviewer.cpp @@ -16,13 +16,14 @@ #include "util/dnd.h" #include "util/math.h" -WWaveformViewer::WWaveformViewer(const char *group, UserSettingsPointer pConfig, QWidget * parent) +WWaveformViewer::WWaveformViewer(const char* group, UserSettingsPointer pConfig, QWidget* parent) : WWidget(parent), m_pGroup(group), m_pConfig(pConfig), m_zoomZoneWidth(20), m_bScratching(false), m_bBending(false), + m_pCueMenuPopup(make_parented<WCueMenuPopup>(pConfig, this)), m_waveformWidget(nullptr) { setAcceptDrops(true); @@ -77,6 +78,12 @@ void WWaveformViewer::mousePressEvent(QMouseEvent* event) { m_pScratchPosition->set(targetPosition); m_pScratchPositionEnable->slotSet(1.0); } else if (event->button() == Qt::RightButton) { + const auto currentTrack = m_waveformWidget->getTrackInfo(); + auto cueAtClickPos = m_waveformWidget->getCueAtPoint(event->pos()); + if (cueAtClickPos) { + m_pCueMenuPopup->setTrackAndCue(currentTrack, *cueAtClickPos); + m_pCueMenuPopup->popup(event->globalPos()); + } // If we are scratching then disable and reset because the two shouldn't // be used at once. if (m_bScratching) { diff --git a/src/widget/wwaveformviewer.h b/src/widget/wwaveformviewer.h index bc9ffe1b7d..af23fcb917 100644 --- a/src/widget/wwaveformviewer.h +++ b/src/widget/wwaveformviewer.h @@ -8,10 +8,12 @@ #include <QList> #include <QMutex> +#include "skin/skincontext.h" #include "track/track.h" +#include "util/parented_ptr.h" #include "widget/trackdroptarget.h" +#include "widget/wcuemenupopup.h" #include "widget/wwidget.h" -#include "skin/skincontext.h" class ControlProxy; class WaveformWidgetAbstract; @@ -72,6 +74,7 @@ private: bool m_bScratching; bool m_bBending; QPoint m_mouseAnchor; + parented_ptr<WCueMenuPopup> m_pCueMenuPopup; WaveformWidgetAbstract* m_waveformWidget; |