diff options
author | Samuel Fadel <samuelfadel@gmail.com> | 2016-02-09 17:38:28 -0200 |
---|---|---|
committer | Samuel Fadel <samuelfadel@gmail.com> | 2016-02-09 17:38:28 -0200 |
commit | 886bdd0fa43a2fcdeca306648b643b623af99f88 (patch) | |
tree | 7ffa1e622724862b8b99387199fb1ef7cbf79b28 /transitioncontrol.cpp | |
parent | 962114b867c044240919ebc558c0b25f105db963 (diff) |
Added TransitionControl and plot rewinding.
New component overlays main view and handles middle clicks/drags
to performing rewinding. Also sports smooth transitioning back to
current projection whenever the mouse button is lifted.
Next up, the same kind of transitions in the displayed values.
Diffstat (limited to 'transitioncontrol.cpp')
-rw-r--r-- | transitioncontrol.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/transitioncontrol.cpp b/transitioncontrol.cpp new file mode 100644 index 0000000..cf8f644 --- /dev/null +++ b/transitioncontrol.cpp @@ -0,0 +1,61 @@ +#include "transitioncontrol.h" + +#include <QObject> +#include <QThread> + +#include "rewindworkerthread.h" + +// The mouse button used for interaction +static const Qt::MouseButton MOUSE_BUTTON = Qt::MiddleButton; + +TransitionControl::TransitionControl() + : m_t(1.0) + , m_startPos(-1) +{ +} + +void TransitionControl::setT(double t) +{ + if (t < 0.0 || t > 1.0) { + return; + } + + m_t = t; + emit tChanged(m_t); +} + +void TransitionControl::mousePressEvent(QMouseEvent *event) +{ + if (event->button() != MOUSE_BUTTON) { + return; + } + + m_t = 1.0; + m_startPos = event->pos().x(); +} + +void TransitionControl::mouseMoveEvent(QMouseEvent *event) +{ + int x = event->pos().x(); + if (!(event->buttons() & MOUSE_BUTTON) || x > m_startPos || x < 0) { + return; + } + + m_t = double(x) / m_startPos; + emit tChanged(m_t); +} + +void TransitionControl::mouseReleaseEvent(QMouseEvent *event) +{ + if (event->button() != MOUSE_BUTTON) { + return; + } + + // Back to initial state + m_startPos = -1; + + // We now have to smoothly go back to m_t == 1.0 + m_rewindThread = new RewindWorkerThread(this); + connect(m_rewindThread, &QThread::finished, m_rewindThread, &QObject::deleteLater); + m_rewindThread->start(); +} |