Skip to content

Commit

Permalink
Overview: abort play pos dragging if cursor is relased outside the va…
Browse files Browse the repository at this point in the history
…lid area
  • Loading branch information
ronso0 committed Oct 9, 2024
1 parent 9a78a30 commit fe428ef
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 4 deletions.
5 changes: 5 additions & 0 deletions res/images/cross_circle_red.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions res/mixxx.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
<RCC version="1.0">
<qresource prefix="/">
<file>../LICENSE</file>
<!-- for track dnd cursor -->
<file>images/library/ic_library_drag_and_drop.svg</file>
<!-- for drag abort cursor in overveiw waveform -->
<file>images/cross_circle_red.svg</file>
<!-- open/closed lock icons for BPM button -->
<file>images/library/ic_library_locked.svg</file>
<file>images/library/ic_library_unlocked.svg</file>
Expand Down
54 changes: 50 additions & 4 deletions src/widget/woverview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@
#include "widget/controlwidgetconnection.h"
#include "wskincolor.h"

namespace {
// Horizontal and vertical margin around the widget where we accept play pos dragging.
constexpr int kDragOutsideLimitX = 100;
constexpr int kDragOutsideLimitY = 50;
} // anonymous namespace

WOverview::WOverview(
const QString& group,
PlayerManager* pPlayerManager,
Expand All @@ -50,6 +56,8 @@ WOverview::WOverview(
m_iPlayPos(0),
m_bTimeRulerActive(false),
m_orientation(Qt::Horizontal),
m_dragMarginH(kDragOutsideLimitX),
m_dragMarginV(kDragOutsideLimitY),
m_iLabelFontSize(10),
m_a(1.0),
m_b(0.0),
Expand Down Expand Up @@ -115,6 +123,12 @@ WOverview::WOverview(
this, &WOverview::onTrackAnalyzerProgress);

connect(m_pCueMenuPopup.get(), &WCueMenuPopup::aboutToHide, this, &WOverview::slotCueMenuPopupAboutToHide);

// Style the cursor we show when the cursor leaves the valid
// play pos dragging area.
QPixmap abortPixmap(32, 32);
abortPixmap.load(":/images/cross_circle_red.svg");
m_dragAbortCursor = QCursor(abortPixmap);
}

void WOverview::setup(const QDomNode& node, const SkinContext& context) {
Expand Down Expand Up @@ -226,6 +240,8 @@ void WOverview::setup(const QDomNode& node, const SkinContext& context) {
QString orientationString = context.selectString(node, "Orientation").toLower();
if (orientationString == "vertical") {
m_orientation = Qt::Vertical;
m_dragMarginH = kDragOutsideLimitY;
m_dragMarginV = kDragOutsideLimitX;
} else {
m_orientation = Qt::Horizontal;
}
Expand Down Expand Up @@ -487,6 +503,23 @@ void WOverview::receiveCuesUpdated() {

void WOverview::mouseMoveEvent(QMouseEvent* e) {
if (m_bLeftClickDragging) {
if (isPosInAllowedPosDragZone(e->pos())) {
m_bTimeRulerActive = true;
m_timeRulerPos = e->pos();
unsetCursor();
} else {
// Remove the time ruler to indicate dragging position is invalid,
// don't abort dragging!
m_iPickupPos = m_iPlayPos;
m_bTimeRulerActive = false;

setCursor(m_dragAbortCursor);
// Remember to restore cursor everywhere where we cancel dragging.
// Update immediately.
update();
return;
}

if (m_orientation == Qt::Horizontal) {
m_iPickupPos = math_clamp(e->pos().x(), 0, width() - 1);
} else {
Expand Down Expand Up @@ -515,16 +548,28 @@ void WOverview::mouseReleaseEvent(QMouseEvent* e) {
mouseMoveEvent(e);
if (m_bPassthroughEnabled) {
m_bLeftClickDragging = false;
// We may be dragging, and we may be outside the valid dragging area.
// If so, we've set the 'invalid drag' cursor. Restore the cursor now.
unsetCursor();
return;
}
//qDebug() << "WOverview::mouseReleaseEvent" << e->pos() << m_iPos << ">>" << dValue;

if (e->button() == Qt::LeftButton) {
if (m_bLeftClickDragging) {
m_iPlayPos = m_iPickupPos;
double dValue = positionToValue(m_iPickupPos);
setControlParameterUp(dValue);
m_bLeftClickDragging = false;
unsetCursor();
if (isPosInAllowedPosDragZone(e->pos())) {
m_iPlayPos = m_iPickupPos;
double dValue = positionToValue(m_iPickupPos);
setControlParameterUp(dValue);
m_bLeftClickDragging = false;
} else {
// Abort dragging if we are way outside the widget.
m_iPickupPos = m_iPlayPos;
m_bLeftClickDragging = false;
m_bTimeRulerActive = false;
return;
}
}
m_bTimeRulerActive = false;
} else if (e->button() == Qt::RightButton) {
Expand Down Expand Up @@ -568,6 +613,7 @@ void WOverview::mousePressEvent(QMouseEvent* e) {
m_iPickupPos = m_iPlayPos;
m_bLeftClickDragging = false;
m_bTimeRulerActive = false;
unsetCursor();
} else if (m_pHoveredMark == nullptr) {
m_bTimeRulerActive = true;
m_timeRulerPos = e->pos();
Expand Down
11 changes: 11 additions & 0 deletions src/widget/woverview.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,15 @@ class WOverview : public WWidget, public TrackDropTarget {
return m_orientation == Qt::Horizontal ? height() : width();
}

inline bool isPosInAllowedPosDragZone(const QPoint pos) {
const QRect dragZone = rect().marginsAdded(QMargins(
m_dragMarginH,
m_dragMarginV,
m_dragMarginH,
m_dragMarginV));
return dragZone.contains(pos);
}

ConstWaveformPointer getWaveform() const {
return m_pWaveform;
}
Expand Down Expand Up @@ -164,6 +173,8 @@ class WOverview : public WWidget, public TrackDropTarget {
int m_iPlayPos;
bool m_bTimeRulerActive;
Qt::Orientation m_orientation;
int m_dragMarginH;
int m_dragMarginV;
int m_iLabelFontSize;

// Coefficient value-position linear transposition
Expand Down

0 comments on commit fe428ef

Please sign in to comment.