diff --git a/stfslider.cpp b/stfslider.cpp index a24a7a8..af5e5c2 100644 --- a/stfslider.cpp +++ b/stfslider.cpp @@ -21,6 +21,8 @@ STFSlider::STFSlider(QWidget *parent) : QWidget(parent) m_midPoint = 0.5; m_whitePoint = 1; m_grabbed = -1; + m_fineTune = false; + setToolTip(tr("Press Shift for fine tuning")); } float STFSlider::blackPoint() const @@ -94,20 +96,34 @@ void STFSlider::mouseMoveEvent(QMouseEvent *event) else unsetCursor(); + qreal x = (qreal)event->x()/width(); + if(event->modifiers() & Qt::ShiftModifier && !m_fineTune) + { + m_fineTune = true; + m_fineTuneX = x; + } + if(!(event->modifiers() & Qt::ShiftModifier) && m_fineTune) + m_fineTune = false; + + if(m_fineTune) + { + x = m_fineTuneX + (x - m_fineTuneX) * 0.2; + } + switch(m_grabbed) { case 0: - m_blackPoint = clamp((qreal)event->x()/width()); + m_blackPoint = clamp(x); m_whitePoint = std::max(m_whitePoint, m_blackPoint); QToolTip::showText(event->globalPos(), QString::number(m_blackPoint), this); break; case 1: - m_midPoint = ((qreal)event->x()/width() - m_blackPoint) / (m_whitePoint - m_blackPoint); + m_midPoint = (x - m_blackPoint) / (m_whitePoint - m_blackPoint); m_midPoint = clamp(m_midPoint); QToolTip::showText(event->globalPos(), QString::number(m_midPoint), this); break; case 2: - m_whitePoint = clamp((qreal)event->x()/width()); + m_whitePoint = clamp(x); m_blackPoint = std::min(m_blackPoint, m_whitePoint); QToolTip::showText(event->globalPos(), QString::number(m_whitePoint), this); break; @@ -121,6 +137,12 @@ void STFSlider::mouseMoveEvent(QMouseEvent *event) void STFSlider::mousePressEvent(QMouseEvent *event) { + if(event->modifiers() & Qt::ShiftModifier) + { + m_fineTune = true; + m_fineTuneX = (qreal)event->x()/width(); + } + if(std::abs((m_blackPoint + (m_whitePoint - m_blackPoint) * m_midPoint)*width() - event->x()) < 5) m_grabbed = 1; else if(std::abs(m_blackPoint*width() - event->x()) < 5) @@ -134,5 +156,6 @@ void STFSlider::mousePressEvent(QMouseEvent *event) void STFSlider::mouseReleaseEvent(QMouseEvent *) { m_grabbed = -1; + m_fineTune = false; emit paramChanged(m_blackPoint, midPoint(), m_whitePoint); } diff --git a/stfslider.h b/stfslider.h index 29746a7..f86530a 100644 --- a/stfslider.h +++ b/stfslider.h @@ -11,6 +11,8 @@ class STFSlider : public QWidget float m_midPoint; float m_whitePoint; int m_grabbed; + bool m_fineTune; + float m_fineTuneX; public: explicit STFSlider(QWidget *parent = nullptr); float blackPoint() const;