Skip to content

Commit

Permalink
Knobs/sliders: avoid stuck 'pressed' state after resetting with Ctrl+…
Browse files Browse the repository at this point in the history
…left-click on macOS
  • Loading branch information
ronso0 committed Aug 30, 2022
1 parent 9dfbca4 commit 8bd2b06
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 41 deletions.
54 changes: 30 additions & 24 deletions src/widget/knobeventhandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@ template <class T>
class KnobEventHandler {
public:
KnobEventHandler()
: m_bRightButtonPressed(false) {
QPixmap blankPixmap(32, 32);
blankPixmap.fill(QColor(0, 0, 0, 0));
m_blankCursor = QCursor(blankPixmap);
: m_bLeftButtonPressed(false),
m_bMiddleButtonPressed(false) {
QPixmap blankPixmap(32, 32);
blankPixmap.fill(QColor(0, 0, 0, 0));
m_blankCursor = QCursor(blankPixmap);
}

double valueFromMouseEvent(T* pWidget, QMouseEvent* e) {
Expand All @@ -43,7 +44,7 @@ class KnobEventHandler {
}

void mouseMoveEvent(T* pWidget, QMouseEvent* e) {
if (!m_bRightButtonPressed) {
if (m_bLeftButtonPressed || m_bMiddleButtonPressed) {
double value = valueFromMouseEvent(pWidget, e);
pWidget->setControlParameterDown(value);
pWidget->inputActivity();
Expand All @@ -54,38 +55,41 @@ class KnobEventHandler {
switch (e->button()) {
case Qt::RightButton:
pWidget->resetControlParameter();
m_bRightButtonPressed = true;
break;
return;
case Qt::LeftButton:
m_bLeftButtonPressed = true;
break;
case Qt::MiddleButton:
m_startPos = e->globalPos();
m_prevPos = m_startPos;
// Somehow using Qt::BlankCursor does not work on Windows
// https://mixxx.org/forums/viewtopic.php?p=40298#p40298
pWidget->setCursor(m_blankCursor);
m_bMiddleButtonPressed = true;
break;
default:
break;
return;
}

m_startPos = e->globalPos();
m_prevPos = m_startPos;
// Somehow using Qt::BlankCursor does not work on Windows
// https://mixxx.org/forums/viewtopic.php?p=40298#p40298
pWidget->setCursor(m_blankCursor);
}

void mouseReleaseEvent(T* pWidget, QMouseEvent* e) {
double value = 0.0;
switch (e->button()) {
case Qt::LeftButton:
case Qt::MiddleButton:
QCursor::setPos(m_startPos);
pWidget->unsetCursor();
value = valueFromMouseEvent(pWidget, e);
pWidget->setControlParameterUp(value);
pWidget->inputActivity();
m_bLeftButtonPressed = false;
break;
case Qt::RightButton:
m_bRightButtonPressed = false;
case Qt::MiddleButton:
m_bMiddleButtonPressed = false;
break;
default:
break;
return;
}
QCursor::setPos(m_startPos);
pWidget->unsetCursor();
value = valueFromMouseEvent(pWidget, e);
pWidget->setControlParameterUp(value);
pWidget->inputActivity();
}

void wheelEvent(T* pWidget, QWheelEvent* e) {
Expand All @@ -102,8 +106,10 @@ class KnobEventHandler {
}

private:
// True if right mouse button is pressed.
bool m_bRightButtonPressed;
// True while left mouse button is pressed
bool m_bLeftButtonPressed;
// True while middle mouse button is pressed
bool m_bMiddleButtonPressed;

// Starting point when left mouse button is pressed
QPoint m_startPos;
Expand Down
52 changes: 35 additions & 17 deletions src/widget/slidereventhandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,16 @@ class SliderEventHandler {
SliderEventHandler()
: m_dStartHandlePos(0),
m_dStartMousePos(0),
m_bRightButtonPressed(false),
m_bLeftButtonPressed(false),
m_bMiddleButtonPressed(false),
m_dOldParameter(-1.0), // virgin
m_dPos(0.0),
m_dHandleLength(0),
m_dSliderLength(0),
m_bHorizontal(false),
m_bDrag(false),
m_bEventWhileDrag(true) { }
m_bEventWhileDrag(true) {
}

void setHorizontal(bool horiz) {
m_bHorizontal = horiz;
Expand All @@ -40,7 +42,7 @@ class SliderEventHandler {
}

void mouseMoveEvent(T* pWidget, QMouseEvent* e) {
if (!m_bRightButtonPressed) {
if (m_bLeftButtonPressed || m_bMiddleButtonPressed) {
if (m_bHorizontal) {
m_dPos = e->x() - m_dHandleLength / 2;
} else {
Expand Down Expand Up @@ -76,17 +78,25 @@ class SliderEventHandler {
pWidget->mouseMoveEvent(e);
m_bDrag = true;
} else {
if (e->button() == Qt::RightButton) {
switch (e->button()) {
case Qt::RightButton:
pWidget->resetControlParameter();
m_bRightButtonPressed = true;
return;
case Qt::LeftButton:
m_bLeftButtonPressed = true;
break;
case Qt::MiddleButton:
m_bMiddleButtonPressed = true;
break;
default:
return;
}
if (m_bHorizontal) {
m_dStartMousePos = e->x() - m_dHandleLength / 2;
} else {
if (m_bHorizontal) {
m_dStartMousePos = e->x() - m_dHandleLength / 2;
} else {
m_dStartMousePos = e->y() - m_dHandleLength / 2;
}
m_dStartHandlePos = m_dPos;
m_dStartMousePos = e->y() - m_dHandleLength / 2;
}
m_dStartHandlePos = m_dPos;
}
}

Expand All @@ -95,11 +105,17 @@ class SliderEventHandler {
pWidget->mouseMoveEvent(e);
m_bDrag = false;
}
if (e->button() == Qt::RightButton) {
m_bRightButtonPressed = false;
} else {
pWidget->setControlParameter(m_dOldParameter);
switch (e->button()) {
case Qt::LeftButton:
m_bLeftButtonPressed = false;
break;
case Qt::MiddleButton:
m_bMiddleButtonPressed = false;
break;
default:
return;
}
pWidget->setControlParameter(m_dOldParameter);
}

void wheelEvent(T* pWidget, QWheelEvent* e) {
Expand Down Expand Up @@ -185,8 +201,10 @@ class SliderEventHandler {
// We record where the mouse was when the user started clicking so they
// don't need to perfectly grab the slider handle.
double m_dStartMousePos;
// True while right mouse button is pressed.
bool m_bRightButtonPressed;
// True while left mouse button is pressed
bool m_bLeftButtonPressed;
// True while middle mouse button is pressed
bool m_bMiddleButtonPressed;
// Previous parameter value of the control object, 0 to 1
double m_dOldParameter;
// Internal storage of slider position in pixels
Expand Down

0 comments on commit 8bd2b06

Please sign in to comment.