summaryrefslogtreecommitdiffstats
path: root/src/waveform/renderers
diff options
context:
space:
mode:
authorHarshit Maurya <hmaurya999@gmail.com>2020-05-14 00:04:41 +0530
committerHarshit Maurya <hmaurya999@gmail.com>2020-05-16 02:17:43 +0530
commitdff5c2b2828b8c8e86d4958f42390e09794d513c (patch)
tree3a0013c36f595d64bbf23c9164a7fa856afce11e /src/waveform/renderers
parentdb10daabbe3f96749fd61f21c3e7f67995f81678 (diff)
wwaveformviewer: detect right click in mark line vicinity
Diffstat (limited to 'src/waveform/renderers')
-rw-r--r--src/waveform/renderers/waveformrendermark.cpp19
-rw-r--r--src/waveform/renderers/waveformwidgetrenderer.cpp41
-rw-r--r--src/waveform/renderers/waveformwidgetrenderer.h6
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