slider: update behavior for usability and qt 5.15

This commit is contained in:
itsmattkc
2020-06-16 14:52:53 +10:00
parent 8d21a2c1ef
commit 89b3fa33f8
2 changed files with 49 additions and 31 deletions
+43 -28
View File
@@ -27,6 +27,7 @@
#include <QVBoxLayout>
#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<float>(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<float>(elements_.first()->y()),
static_cast<float>(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),
+6 -3
View File
@@ -22,6 +22,7 @@
#define SLIDERLADDER_H
#include <QLabel>
#include <QTimer>
#include <QWidget>
#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