diff --git a/src/widget/knobeventhandler.h b/src/widget/knobeventhandler.h index 348f4977005..511b841f554 100644 --- a/src/widget/knobeventhandler.h +++ b/src/widget/knobeventhandler.h @@ -13,10 +13,11 @@ template 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) { @@ -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(); @@ -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) { @@ -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; diff --git a/src/widget/slidereventhandler.h b/src/widget/slidereventhandler.h index a41aef7c6d1..5531e74c649 100644 --- a/src/widget/slidereventhandler.h +++ b/src/widget/slidereventhandler.h @@ -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; @@ -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 { @@ -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; } } @@ -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) { @@ -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