void Knob::mouseMoveEvent ( QMouseEvent *pMouseEvent ) { if (m_dialMode == QDialMode) { QDial::mouseMoveEvent(pMouseEvent); return; } if (!m_bMousePressed) return; const QPoint& posMouse = pMouseEvent->pos(); int xdelta = posMouse.x() - m_posMouse.x(); int ydelta = posMouse.y() - m_posMouse.y(); float angleDelta = mouseAngle(posMouse) - mouseAngle(m_posMouse); int iNewValue = sliderPosition(); switch (m_dialMode) { case LinearMode: iNewValue = int(m_lastDragValue + xdelta - ydelta); if (iNewValue > maximum()) iNewValue = maximum(); else if (iNewValue < minimum()) iNewValue = minimum(); break; case AngularMode: default: // Forget about the drag origin to be robust on full rotations if (angleDelta > +180.0f) angleDelta = angleDelta - 360.0f; if (angleDelta < -180.0f) angleDelta = angleDelta + 360.0f; m_lastDragValue += float(maximum() - minimum()) * angleDelta / 270.0f; if (m_lastDragValue > float(maximum())) m_lastDragValue = float(maximum()); if (m_lastDragValue < float(minimum())) m_lastDragValue = float(minimum()); m_posMouse = posMouse; iNewValue = int(m_lastDragValue + 0.5f); break; } updatePosition(iNewValue); }
void Knob::mouseMoveEvent ( QMouseEvent *pMouseEvent ) { if (m_dialMode == QDialMode) { QDial::mouseMoveEvent(pMouseEvent); return; } if (!m_bMousePressed) return; const QPoint& posMouse = pMouseEvent->pos(); int xdelta = posMouse.x() - m_posMouse.x(); int ydelta = posMouse.y() - m_posMouse.y(); double angleDelta = mouseAngle(posMouse) - mouseAngle(m_posMouse); int iNewValue = value(); switch (m_dialMode) { case LinearMode: iNewValue = int(m_lastDragValue + xdelta - ydelta); break; case AngularMode: default: // Forget about the drag origin to be robust on full rotations if (angleDelta > +180.0) angleDelta = angleDelta - 360.0; if (angleDelta < -180.0) angleDelta = angleDelta + 360.0; m_lastDragValue += double(maximum() - minimum()) * angleDelta / 270.0; if (m_lastDragValue > double(maximum())) m_lastDragValue = double(maximum()); if (m_lastDragValue < double(minimum())) m_lastDragValue = double(minimum()); m_posMouse = posMouse; iNewValue = int(m_lastDragValue + 0.5); break; } setValue(iNewValue); update(); emit sliderMoved(value()); }