From 89b3fa33f88201b2f17bf8ffec0a7ac93b169067 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 16 Jun 2020 14:52:53 +1000 Subject: [PATCH] slider: update behavior for usability and qt 5.15 --- app/widget/slider/sliderladder.cpp | 71 ++++++++++++++++++------------ app/widget/slider/sliderladder.h | 9 ++-- 2 files changed, 49 insertions(+), 31 deletions(-) diff --git a/app/widget/slider/sliderladder.cpp b/app/widget/slider/sliderladder.cpp index 33768b58e..e49651159 100644 --- a/app/widget/slider/sliderladder.cpp +++ b/app/widget/slider/sliderladder.cpp @@ -27,6 +27,7 @@ #include #include "common/clamp.h" +#include "common/lerp.h" OLIVE_NAMESPACE_ENTER @@ -62,6 +63,9 @@ SliderLadder::SliderLadder(double start_val, double drag_multiplier, int nb_oute elements_.first()->SetMultiplierVisible(false); } + drag_timer_.setInterval(10); + connect(&drag_timer_, &QTimer::timeout, this, &SliderLadder::TimerUpdate); + #if defined(Q_OS_MAC) CGAssociateMouseAndMouseCursorPosition(false); CGDisplayHideCursor(kCGDirectMainDisplay); @@ -90,34 +94,6 @@ void SliderLadder::SetValue(double val) } } -void SliderLadder::mouseMoveEvent(QMouseEvent *event) -{ - Q_UNUSED(event) - - int32_t x_mvmt, y_mvmt; - - // Keep cursor in the same position -#if defined(Q_OS_MAC) - CGGetLastMouseDelta(&x_mvmt, &y_mvmt); -#else - QPoint current_pos = QCursor::pos(); - - x_mvmt = current_pos.x() - drag_start_.x(); - y_mvmt = current_pos.y() - drag_start_.y(); - - QCursor::setPos(drag_start_); -#endif - - // Determine which element we're in - relative_y_ = clamp(relative_y_ + y_mvmt, - elements_.first()->y(), - elements_.last()->y() + elements_.last()->height() - 1); - - SetActiveElement(); - - emit DraggedByValue(x_mvmt, active_element_->GetMultiplier()); -} - void SliderLadder::mouseReleaseEvent(QMouseEvent *event) { Q_UNUSED(event) @@ -130,6 +106,7 @@ void SliderLadder::showEvent(QShowEvent *event) QWidget::showEvent(event); QMetaObject::invokeMethod(this, "InitRelativeY", Qt::QueuedConnection); + QMetaObject::invokeMethod(&drag_timer_, "start", Qt::QueuedConnection); } void SliderLadder::SetActiveElement() @@ -148,6 +125,7 @@ void SliderLadder::SetActiveElement() // This is the element! active_element_ = ele; active_element_->SetHighlighted(true); + relative_y_ = active_element_->y() + active_element_->height() / 2; break; } } @@ -161,6 +139,43 @@ void SliderLadder::InitRelativeY() SetActiveElement(); } +void SliderLadder::TimerUpdate() +{ + int32_t x_mvmt, y_mvmt; + + // Keep cursor in the same position +#if defined(Q_OS_MAC) + CGGetLastMouseDelta(&x_mvmt, &y_mvmt); +#else + QPoint current_pos = QCursor::pos(); + + x_mvmt = current_pos.x() - drag_start_.x(); + y_mvmt = current_pos.y() - drag_start_.y(); + + QCursor::setPos(drag_start_); +#endif + + int target = active_element_->y() + active_element_->height() / 2; + qDebug() << "Lerping" << relative_y_ << "to" << target << QDateTime::currentMSecsSinceEpoch(); + relative_y_ = lerp(relative_y_, static_cast(target), 0.1f); + qDebug() << " Relative Y:" << relative_y_; + + if (!x_mvmt && !y_mvmt) { + return; + } + + // Determine which element we're in + relative_y_ = clamp(relative_y_ + y_mvmt, + static_cast(elements_.first()->y()), + static_cast(elements_.last()->y() + elements_.last()->height() - 1)); + + SetActiveElement(); + + if (qAbs(x_mvmt) > qAbs(y_mvmt)) { + emit DraggedByValue(x_mvmt, active_element_->GetMultiplier()); + } +} + SliderLadderElement::SliderLadderElement(const double &multiplier, QWidget *parent) : QWidget(parent), multiplier_(multiplier), diff --git a/app/widget/slider/sliderladder.h b/app/widget/slider/sliderladder.h index 8c518ae05..d404b1fb0 100644 --- a/app/widget/slider/sliderladder.h +++ b/app/widget/slider/sliderladder.h @@ -22,6 +22,7 @@ #define SLIDERLADDER_H #include +#include #include #include "common/define.h" @@ -70,8 +71,6 @@ public: void SetValue(double val); protected: - virtual void mouseMoveEvent(QMouseEvent *event) override; - virtual void mouseReleaseEvent(QMouseEvent *event) override; virtual void showEvent(QShowEvent *event) override; @@ -92,11 +91,15 @@ private: SliderLadderElement* active_element_; - int relative_y_; + float relative_y_; + + QTimer drag_timer_; private slots: void InitRelativeY(); + void TimerUpdate(); + }; OLIVE_NAMESPACE_EXIT