summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/waveform/renderers/waveformrendermark.cpp8
-rw-r--r--src/waveform/renderers/waveformrendermark.h1
-rw-r--r--src/waveform/renderers/waveformwidgetrenderer.cpp27
-rw-r--r--src/waveform/renderers/waveformwidgetrenderer.h10
-rw-r--r--src/widget/wwaveformviewer.cpp9
-rw-r--r--src/widget/wwaveformviewer.h5
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;