Added horizontal scrolling by pressiong Shift + mouse wheel.
--HG-- branch : develop
This commit is contained in:
parent
43660ce425
commit
77c09063ff
|
@ -1,4 +1,5 @@
|
||||||
# Version 0.5.0
|
# Version 0.5.0
|
||||||
|
- Added horizontal scrolling by pressiong Shift + mouse wheel.
|
||||||
- [#366] Update 'Point from Distance and Angle' tool to read distance and angle between points.
|
- [#366] Update 'Point from Distance and Angle' tool to read distance and angle between points.
|
||||||
- [#395] Create Curve tool which uses point as control handle.
|
- [#395] Create Curve tool which uses point as control handle.
|
||||||
- pdftops updated to version 3.04.
|
- pdftops updated to version 3.04.
|
||||||
|
|
|
@ -44,15 +44,27 @@ const int GraphicsViewZoom::updateInterval = 40;
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
GraphicsViewZoom::GraphicsViewZoom(QGraphicsView* view)
|
GraphicsViewZoom::GraphicsViewZoom(QGraphicsView* view)
|
||||||
: QObject(view), _view(view), _modifiers(Qt::ControlModifier), _zoom_factor_base(1.0015),
|
: QObject(view),
|
||||||
target_scene_pos(QPointF()), target_viewport_pos(QPointF()), anim(nullptr), _numScheduledScrollings(0)
|
_view(view),
|
||||||
|
_modifiers(Qt::ControlModifier),
|
||||||
|
_zoom_factor_base(1.0015),
|
||||||
|
target_scene_pos(QPointF()),
|
||||||
|
target_viewport_pos(QPointF()),
|
||||||
|
verticalScrollAnim(new QTimeLine(duration, this)),
|
||||||
|
_numScheduledVerticalScrollings(0),
|
||||||
|
horizontalScrollAnim(new QTimeLine(duration, this)),
|
||||||
|
_numScheduledHorizontalScrollings(0)
|
||||||
{
|
{
|
||||||
_view->viewport()->installEventFilter(this);
|
_view->viewport()->installEventFilter(this);
|
||||||
_view->setMouseTracking(true);
|
_view->setMouseTracking(true);
|
||||||
anim = new QTimeLine(duration, this);
|
|
||||||
anim->setUpdateInterval(updateInterval);
|
verticalScrollAnim->setUpdateInterval(updateInterval);
|
||||||
connect(anim, &QTimeLine::valueChanged, this, &GraphicsViewZoom::scrollingTime, Qt::UniqueConnection);
|
connect(verticalScrollAnim, &QTimeLine::valueChanged, this, &GraphicsViewZoom::VerticalScrollingTime);
|
||||||
connect(anim, &QTimeLine::finished, this, &GraphicsViewZoom::animFinished, Qt::UniqueConnection);
|
connect(verticalScrollAnim, &QTimeLine::finished, this, &GraphicsViewZoom::animFinished);
|
||||||
|
|
||||||
|
horizontalScrollAnim->setUpdateInterval(updateInterval);
|
||||||
|
connect(horizontalScrollAnim, &QTimeLine::valueChanged, this, &GraphicsViewZoom::HorizontalScrollingTime);
|
||||||
|
connect(horizontalScrollAnim, &QTimeLine::finished, this, &GraphicsViewZoom::animFinished);
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -91,31 +103,53 @@ void GraphicsViewZoom::set_zoom_factor_base(double value)
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void GraphicsViewZoom::scrollingTime(qreal x)
|
void GraphicsViewZoom::VerticalScrollingTime(qreal x)
|
||||||
{
|
{
|
||||||
Q_UNUSED(x);
|
Q_UNUSED(x);
|
||||||
// Try to adapt scrolling to speed of rotating mouse wheel and scale factor
|
// Try to adapt scrolling to speed of rotating mouse wheel and scale factor
|
||||||
// Value of _numScheduledScrollings is too short, so we scale the value
|
// Value of _numScheduledScrollings is too short, so we scale the value
|
||||||
|
|
||||||
qreal scroll = (qAbs(_numScheduledScrollings)*(10 + 10/_view->transform().m22()))/(duration/updateInterval);
|
qreal scroll = (qAbs(_numScheduledVerticalScrollings)*(10 + 10/_view->transform().m22()))/(duration/updateInterval);
|
||||||
|
|
||||||
if (qAbs(scroll) < 1)
|
if (qAbs(scroll) < 1)
|
||||||
{
|
{
|
||||||
scroll = 1;
|
scroll = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_numScheduledScrollings > 0)
|
if (_numScheduledVerticalScrollings > 0)
|
||||||
{
|
{
|
||||||
scroll = scroll * -1;
|
scroll = scroll * -1;
|
||||||
}
|
}
|
||||||
_view->verticalScrollBar()->setValue(qRound(_view->verticalScrollBar()->value() + scroll));
|
_view->verticalScrollBar()->setValue(qRound(_view->verticalScrollBar()->value() + scroll));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void GraphicsViewZoom::HorizontalScrollingTime(qreal x)
|
||||||
|
{
|
||||||
|
Q_UNUSED(x);
|
||||||
|
// Try to adapt scrolling to speed of rotating mouse wheel and scale factor
|
||||||
|
// Value of _numScheduledScrollings is too short, so we scale the value
|
||||||
|
|
||||||
|
qreal scroll = (qAbs(_numScheduledHorizontalScrollings)*(10 + 10/_view->transform().m11()))/
|
||||||
|
(duration/updateInterval);
|
||||||
|
|
||||||
|
if (qAbs(scroll) < 1)
|
||||||
|
{
|
||||||
|
scroll = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_numScheduledHorizontalScrollings > 0)
|
||||||
|
{
|
||||||
|
scroll = scroll * -1;
|
||||||
|
}
|
||||||
|
_view->horizontalScrollBar()->setValue(qRound(_view->horizontalScrollBar()->value() + scroll));
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void GraphicsViewZoom::animFinished()
|
void GraphicsViewZoom::animFinished()
|
||||||
{
|
{
|
||||||
_numScheduledScrollings = 0;
|
_numScheduledVerticalScrollings = 0;
|
||||||
anim->stop();
|
verticalScrollAnim->stop();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In moust cases cursor position on view doesn't change, but for scene after scrolling position will be different.
|
* In moust cases cursor position on view doesn't change, but for scene after scrolling position will be different.
|
||||||
|
@ -154,6 +188,7 @@ bool GraphicsViewZoom::eventFilter(QObject *object, QEvent *event)
|
||||||
else if (event->type() == QEvent::Wheel)
|
else if (event->type() == QEvent::Wheel)
|
||||||
{
|
{
|
||||||
QWheelEvent* wheel_event = static_cast<QWheelEvent*>(event);
|
QWheelEvent* wheel_event = static_cast<QWheelEvent*>(event);
|
||||||
|
SCASSERT(wheel_event != nullptr);
|
||||||
if (QApplication::keyboardModifiers() == _modifiers)
|
if (QApplication::keyboardModifiers() == _modifiers)
|
||||||
{
|
{
|
||||||
if (wheel_event->orientation() == Qt::Vertical)
|
if (wheel_event->orientation() == Qt::Vertical)
|
||||||
|
@ -166,34 +201,14 @@ bool GraphicsViewZoom::eventFilter(QObject *object, QEvent *event)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const QPoint numPixels = wheel_event->pixelDelta();
|
if (QApplication::keyboardModifiers() == Qt::ShiftModifier)
|
||||||
const QPoint numDegrees = wheel_event->angleDelta() / 8;
|
|
||||||
int numSteps;
|
|
||||||
|
|
||||||
if (not numPixels.isNull())
|
|
||||||
{
|
{
|
||||||
numSteps = numPixels.y();
|
return StartHorizontalScrollings(wheel_event);
|
||||||
}
|
|
||||||
else if (not numDegrees.isNull())
|
|
||||||
{
|
|
||||||
numSteps = numDegrees.y() / 15;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return true;//Just ignore
|
return StartVerticalScrollings(wheel_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
_numScheduledScrollings += numSteps;
|
|
||||||
if (_numScheduledScrollings * numSteps < 0)
|
|
||||||
{ // if user moved the wheel in another direction, we reset previously scheduled scalings
|
|
||||||
_numScheduledScrollings = numSteps;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (anim->state() != QTimeLine::Running)
|
|
||||||
{
|
|
||||||
anim->start();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,6 +245,76 @@ void GraphicsViewZoom::FictiveSceneRect(QGraphicsScene *sc, QGraphicsView *view)
|
||||||
sc->setSceneRect(newRect);
|
sc->setSceneRect(newRect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool GraphicsViewZoom::StartVerticalScrollings(QWheelEvent *wheel_event)
|
||||||
|
{
|
||||||
|
SCASSERT(wheel_event != nullptr);
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
_numScheduledVerticalScrollings += numSteps;
|
||||||
|
if (_numScheduledVerticalScrollings * numSteps < 0)
|
||||||
|
{ // if user moved the wheel in another direction, we reset previously scheduled scalings
|
||||||
|
_numScheduledVerticalScrollings = numSteps;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verticalScrollAnim->state() != QTimeLine::Running)
|
||||||
|
{
|
||||||
|
verticalScrollAnim->start();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool GraphicsViewZoom::StartHorizontalScrollings(QWheelEvent *wheel_event)
|
||||||
|
{
|
||||||
|
SCASSERT(wheel_event != nullptr);
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
_numScheduledHorizontalScrollings += numSteps;
|
||||||
|
if (_numScheduledHorizontalScrollings * numSteps < 0)
|
||||||
|
{ // if user moved the wheel in another direction, we reset previously scheduled scalings
|
||||||
|
_numScheduledHorizontalScrollings = numSteps;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (horizontalScrollAnim->state() != QTimeLine::Running)
|
||||||
|
{
|
||||||
|
horizontalScrollAnim->start();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief VMainGraphicsView constructor.
|
* @brief VMainGraphicsView constructor.
|
||||||
|
|
|
@ -71,25 +71,32 @@ public:
|
||||||
signals:
|
signals:
|
||||||
void zoomed();
|
void zoomed();
|
||||||
public slots:
|
public slots:
|
||||||
void scrollingTime(qreal x);
|
void VerticalScrollingTime(qreal x);
|
||||||
|
void HorizontalScrollingTime(qreal x);
|
||||||
void animFinished();
|
void animFinished();
|
||||||
protected:
|
protected:
|
||||||
virtual bool eventFilter(QObject* object, QEvent* event) Q_DECL_OVERRIDE;
|
virtual bool eventFilter(QObject* object, QEvent* event) Q_DECL_OVERRIDE;
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(GraphicsViewZoom)
|
Q_DISABLE_COPY(GraphicsViewZoom)
|
||||||
QGraphicsView* _view;
|
QGraphicsView *_view;
|
||||||
Qt::KeyboardModifiers _modifiers;
|
Qt::KeyboardModifiers _modifiers;
|
||||||
double _zoom_factor_base;
|
double _zoom_factor_base;
|
||||||
QPointF target_scene_pos;
|
QPointF target_scene_pos;
|
||||||
QPointF target_viewport_pos;
|
QPointF target_viewport_pos;
|
||||||
QTimeLine *anim;
|
QTimeLine *verticalScrollAnim;
|
||||||
/** @brief _numScheduledScalings keep number scheduled scalings. */
|
/** @brief _numScheduledVerticalScrollings keep number scheduled vertical scrollings. */
|
||||||
qint32 _numScheduledScrollings;
|
qint32 _numScheduledVerticalScrollings;
|
||||||
|
QTimeLine *horizontalScrollAnim;
|
||||||
|
/** @brief _numScheduledHorizontalScrollings keep number scheduled horizontal scrollings. */
|
||||||
|
qint32 _numScheduledHorizontalScrollings;
|
||||||
|
|
||||||
static const int duration;
|
static const int duration;
|
||||||
static const int updateInterval;
|
static const int updateInterval;
|
||||||
|
|
||||||
void FictiveSceneRect(QGraphicsScene *sc, QGraphicsView *view);
|
void FictiveSceneRect(QGraphicsScene *sc, QGraphicsView *view);
|
||||||
|
|
||||||
|
bool StartVerticalScrollings(QWheelEvent* wheel_event);
|
||||||
|
bool StartHorizontalScrollings(QWheelEvent* wheel_event);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue
Block a user