Refactoring. Smooth scrolling.
--HG-- branch : develop
This commit is contained in:
parent
6ba9bb8b28
commit
3beb8a8b7c
|
@ -90,29 +90,19 @@ void GraphicsViewZoom::set_zoom_factor_base(double value)
|
||||||
void GraphicsViewZoom::scrollingTime(qreal x)
|
void GraphicsViewZoom::scrollingTime(qreal x)
|
||||||
{
|
{
|
||||||
Q_UNUSED(x);
|
Q_UNUSED(x);
|
||||||
qreal factor = 1.0;
|
|
||||||
if (_numScheduledScalings < 0)
|
qreal scroll = _view->verticalScrollBar()->pageStep()/60;
|
||||||
|
if (_numScheduledScalings > 0)
|
||||||
{
|
{
|
||||||
factor = factor*13.8;
|
scroll = scroll * -1;
|
||||||
}
|
}
|
||||||
else
|
_view->verticalScrollBar()->setValue(qRound(_view->verticalScrollBar()->value() + scroll));
|
||||||
{
|
|
||||||
factor = factor*-13.8;
|
|
||||||
}
|
|
||||||
_view->verticalScrollBar()->setValue(qRound(_view->verticalScrollBar()->value() + factor));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void GraphicsViewZoom::animFinished()
|
void GraphicsViewZoom::animFinished()
|
||||||
{
|
{
|
||||||
if (_numScheduledScalings > 0)
|
_numScheduledScalings > 0 ? _numScheduledScalings-- : _numScheduledScalings++;
|
||||||
{
|
|
||||||
_numScheduledScalings--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_numScheduledScalings++;
|
|
||||||
}
|
|
||||||
anim->stop();
|
anim->stop();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -133,53 +123,69 @@ void GraphicsViewZoom::animFinished()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
bool GraphicsViewZoom::eventFilter(QObject *object, QEvent *event)
|
bool GraphicsViewZoom::eventFilter(QObject *object, QEvent *event)
|
||||||
{
|
{
|
||||||
if (event->type() == QEvent::MouseMove)
|
if (event->type() == QEvent::MouseMove)
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Here we are saving cursor position on view and scene.
|
|
||||||
* This data need for gentle_zoom().
|
|
||||||
* Almoust the same we do in method GraphicsViewZoom::animFinished.
|
|
||||||
*/
|
|
||||||
QMouseEvent* mouse_event = static_cast<QMouseEvent*>(event);
|
|
||||||
QPointF delta = target_viewport_pos - mouse_event->pos();
|
|
||||||
if (qAbs(delta.x()) > 5 || qAbs(delta.y()) > 5)
|
|
||||||
{
|
{
|
||||||
target_viewport_pos = mouse_event->pos();
|
/*
|
||||||
target_scene_pos = _view->mapToScene(mouse_event->pos());
|
* Here we are saving cursor position on view and scene.
|
||||||
}
|
* This data need for gentle_zoom().
|
||||||
}
|
* Almoust the same we do in method GraphicsViewZoom::animFinished.
|
||||||
else if (event->type() == QEvent::Wheel)
|
*/
|
||||||
{
|
QMouseEvent* mouse_event = static_cast<QMouseEvent*>(event);
|
||||||
QWheelEvent* wheel_event = static_cast<QWheelEvent*>(event);
|
QPointF delta = target_viewport_pos - mouse_event->pos();
|
||||||
if (QApplication::keyboardModifiers() == _modifiers)
|
if (qAbs(delta.x()) > 5 || qAbs(delta.y()) > 5)
|
||||||
{
|
|
||||||
if (wheel_event->orientation() == Qt::Vertical)
|
|
||||||
{
|
|
||||||
double angle = wheel_event->angleDelta().y();
|
|
||||||
double factor = qPow(_zoom_factor_base, angle);
|
|
||||||
gentle_zoom(factor);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int numSteps = wheel_event->delta() / 8 / 15; // see QWheelEvent documentation
|
|
||||||
|
|
||||||
_numScheduledScalings += numSteps;
|
|
||||||
if (_numScheduledScalings * numSteps < 0)
|
|
||||||
{ // if user moved the wheel in another direction, we reset
|
|
||||||
_numScheduledScalings = numSteps; // previously scheduled scalings
|
|
||||||
}
|
|
||||||
|
|
||||||
if (anim->state() != QTimeLine::Running)
|
|
||||||
{
|
{
|
||||||
anim->start();
|
target_viewport_pos = mouse_event->pos();
|
||||||
|
target_scene_pos = _view->mapToScene(mouse_event->pos());
|
||||||
}
|
}
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
else if (event->type() == QEvent::Wheel)
|
||||||
Q_UNUSED(object)
|
{
|
||||||
return false;
|
QWheelEvent* wheel_event = static_cast<QWheelEvent*>(event);
|
||||||
|
if (QApplication::keyboardModifiers() == _modifiers)
|
||||||
|
{
|
||||||
|
if (wheel_event->orientation() == Qt::Vertical)
|
||||||
|
{
|
||||||
|
double angle = wheel_event->angleDelta().y();
|
||||||
|
double factor = qPow(_zoom_factor_base, angle);
|
||||||
|
gentle_zoom(factor);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const QPoint numPixels = wheel_event->pixelDelta();
|
||||||
|
const QPoint numDegrees = wheel_event->angleDelta() / 8;
|
||||||
|
int numSteps;
|
||||||
|
|
||||||
|
if (not numPixels.isNull())
|
||||||
|
{
|
||||||
|
numSteps = numPixels.y();
|
||||||
|
}
|
||||||
|
else if (not numDegrees.isNull())
|
||||||
|
{
|
||||||
|
numSteps = numDegrees.y() / 15;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return true;//Just ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
_numScheduledScalings += numSteps;
|
||||||
|
if (_numScheduledScalings * numSteps < 0)
|
||||||
|
{ // if user moved the wheel in another direction, we reset
|
||||||
|
_numScheduledScalings = numSteps; // previously scheduled scalings
|
||||||
|
}
|
||||||
|
|
||||||
|
if (anim->state() != QTimeLine::Running)
|
||||||
|
{
|
||||||
|
anim->start();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QObject::eventFilter(object, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -73,6 +73,8 @@ signals:
|
||||||
public slots:
|
public slots:
|
||||||
void scrollingTime(qreal x);
|
void scrollingTime(qreal x);
|
||||||
void animFinished();
|
void animFinished();
|
||||||
|
protected:
|
||||||
|
virtual bool eventFilter(QObject* object, QEvent* event) Q_DECL_OVERRIDE;
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(GraphicsViewZoom)
|
Q_DISABLE_COPY(GraphicsViewZoom)
|
||||||
QGraphicsView* _view;
|
QGraphicsView* _view;
|
||||||
|
@ -84,7 +86,6 @@ private:
|
||||||
/** @brief _numScheduledScalings keep number scheduled scalings. */
|
/** @brief _numScheduledScalings keep number scheduled scalings. */
|
||||||
qint32 _numScheduledScalings;
|
qint32 _numScheduledScalings;
|
||||||
|
|
||||||
virtual bool eventFilter(QObject* object, QEvent* event) Q_DECL_OVERRIDE;
|
|
||||||
void FictiveSceneRect(QGraphicsScene *sc, QGraphicsView *view);
|
void FictiveSceneRect(QGraphicsScene *sc, QGraphicsView *view);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user