##// END OF EJS Templates
Optimize polar chart radius calculation a bit....
Optimize polar chart radius calculation a bit. Current algorithm still results in an occasional extra unneeded iteration, as it uses only crude approximation for radius reduction. However, any speedup gained by accurately calculating needed reduction would be very minor compared to approximations used, so it doesn't seem worth the effort to figure out the complex math. Change-Id: If670a1b058a85cd0305b93f62e6388b463bafd0d Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>

File last commit:

r2432:53927f716a3d
r2542:189023d9a551
Show More
scroller.cpp
216 lines | 5.1 KiB | text/x-c | CppLexer
Michal Klocek
Refactor qledgend handling...
r855 /****************************************************************************
**
Miikka Heikkinen
Fixed the copyright year 2012 -> 2013
r2432 ** Copyright (C) 2013 Digia Plc
Michal Klocek
Refactor qledgend handling...
r855 ** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
** This file is part of the Qt Commercial Charts Add-on.
**
** $QT_BEGIN_LICENSE$
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.
**
** If you have questions regarding the use of this file, please use
** contact form at http://qt.digia.com
** $QT_END_LICENSE$
**
****************************************************************************/
#include "scroller_p.h"
#include "qlegend.h"
#include <QGraphicsSceneMouseEvent>
Michal Klocek
Improves build configuration...
r996 #include <QDebug>
Michal Klocek
Refactor qledgend handling...
r855
QTCOMMERCIALCHART_BEGIN_NAMESPACE
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 Scroller::Scroller()
: m_ticker(this),
sauimone
Kinetic scrolling is back for legend
r2189 m_timeTresholdMin(50),
m_timeTresholdMax(300),
sauimone
moving mouse event handling logic to scroller
r2199 m_state(Idle),
m_treshold(10)
Michal Klocek
Refactor qledgend handling...
r855 {
}
Scroller::~Scroller()
{
}
sauimone
Kinetic scrolling is back for legend
r2189 void Scroller::move(const QPointF &delta)
Michal Klocek
Refactor qledgend handling...
r855 {
switch (m_state) {
sauimone
moving mouse event handling logic to scroller
r2199 case Pressed:
sauimone
Kinetic scrolling is back for legend
r2189 m_timeStamp = QTime::currentTime();
break;
Michal Klocek
Refactor qledgend handling...
r855 case Scroll:
sauimone
Kinetic scrolling is back for legend
r2189 stopTicker();
m_timeStamp = QTime::currentTime();
break;
default:
Michal Klocek
Refactor qledgend handling...
r855 break;
}
sauimone
Kinetic scrolling is back for legend
r2189 setOffset(offset() - delta);
Michal Klocek
Refactor qledgend handling...
r855 }
sauimone
better implementation of mouse event handling in legend
r2197 void Scroller::scrollTo(const QPointF &delta)
Michal Klocek
Refactor qledgend handling...
r855 {
sauimone
Kinetic scrolling is back for legend
r2189 // Starts scrolling, if at least m_timeTresholdMin msecs has gone since timestamp
// current time is no more than m_timeTresholdMax from timestamp
Michal Klocek
Refactor qledgend handling...
r855
sauimone
Kinetic scrolling is back for legend
r2189 if ((m_timeStamp.elapsed() > m_timeTresholdMin) && (m_timeStamp.msecsTo(QTime::currentTime()) < m_timeTresholdMax)) {
// Release was quick enough. Start scrolling.
sauimone
accurate speed calculation to kinetic scrolling
r2190 qreal interval = 25;
qreal time = m_timeStamp.msecsTo(QTime::currentTime());
Marek Rosa
Replaced qFuzzyIsNull with qFuzzyCompare. Once qchart test case still uses qFuzzyIsNull becasue it started failing when qFuzzyCompare was used
r2242 if (qFuzzyCompare(time, 0)) {
sauimone
accurate speed calculation to kinetic scrolling
r2190 m_speed = delta / 5;
sauimone
minor code style fix
r2191 } else {
sauimone
accurate speed calculation to kinetic scrolling
r2190 m_speed = delta * interval / time;
sauimone
minor code style fix
r2191 }
Michal Klocek
Refactor qledgend handling...
r855
sauimone
Kinetic scrolling is back for legend
r2189 qreal fraction = qMax(qAbs(m_speed.x()), qAbs(m_speed.y()));
Marek Rosa
Replaced qFuzzyIsNull with qFuzzyCompare. Once qchart test case still uses qFuzzyIsNull becasue it started failing when qFuzzyCompare was used
r2242 if (!qFuzzyCompare(fraction, 0)) {
sauimone
Kinetic scrolling is back for legend
r2189 m_fraction.setX(qAbs(m_speed.x() / fraction));
m_fraction.setY(qAbs(m_speed.y() / fraction));
} else {
m_fraction.setX(1);
m_fraction.setY(1);
Michal Klocek
Refactor qledgend handling...
r855 }
sauimone
accurate speed calculation to kinetic scrolling
r2190 startTicker(interval);
sauimone
Kinetic scrolling is back for legend
r2189 } else {
stopTicker(); // Stop ticker, if one is running.
Michal Klocek
Refactor qledgend handling...
r855 }
}
sauimone
moving mouse event handling logic to scroller
r2199 void Scroller::handleMousePressEvent(QGraphicsSceneMouseEvent *event)
{
stopTicker();
m_pressPos = event->screenPos();
m_lastPos = m_pressPos;
m_state = Pressed;
event->accept();
}
void Scroller::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
QPointF delta = event->screenPos() - m_lastPos;
switch (m_state) {
case Pressed: {
// calculate treshold. If enough, change to move state and send out move deltas.
if (qAbs(delta.x()) > m_treshold || qAbs(delta.y()) > m_treshold) {
m_lastPos = event->screenPos();
move(delta);
m_state = Move;
}
event->accept();
break;
}
case Move: {
m_lastPos = event->screenPos();
move(delta);
event->accept();
break;
}
case Idle:
default: {
event->ignore();
break;
}
}
}
void Scroller::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
switch (m_state) {
case Move:
{
scrollTo(m_lastPos - m_pressPos);
event->accept();
break;
}
default:
{
m_state = Idle;
event->ignore();
break;
}
}
}
sauimone
Kinetic scrolling is back for legend
r2189 void Scroller::startTicker(int interval)
sauimone
Legend can now handle clicked and do scrolling
r2183 {
sauimone
Kinetic scrolling is back for legend
r2189 m_state = Scroll;
m_ticker.start(interval);
sauimone
Legend can now handle clicked and do scrolling
r2183 }
sauimone
Kinetic scrolling is back for legend
r2189 void Scroller::stopTicker()
{
m_state = Idle;
m_ticker.stop();
}
sauimone
Legend can now handle clicked and do scrolling
r2183
Michal Klocek
Refactor qledgend handling...
r855 void Scroller::scrollTick()
{
switch (m_state) {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 case Scroll:
lowerSpeed(m_speed);
sauimone
Kinetic scrolling is back for legend
r2189 setOffset(offset() - m_speed);
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (m_speed == QPointF(0, 0)) {
m_state = Idle;
Michal Klocek
Refactor qledgend handling...
r855 m_ticker.stop();
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 }
break;
sauimone
moving mouse event handling logic to scroller
r2199 default:
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 qWarning() << __FUNCTION__ << "Scroller unexpected state" << m_state;
m_ticker.stop();
sauimone
Kinetic scrolling is back for legend
r2189 m_state = Idle;
Michal Klocek
Refactor qledgend handling...
r855 break;
}
}
Jani Honkonen
more coding style fixes for src-folder...
r2104 void Scroller::lowerSpeed(QPointF &speed, qreal maxSpeed)
Michal Klocek
Refactor qledgend handling...
r855 {
qreal x = qBound(-maxSpeed, speed.x(), maxSpeed);
qreal y = qBound(-maxSpeed, speed.y(), maxSpeed);
x = (x == 0) ? x :
(x > 0) ? qMax(qreal(0), x - m_fraction.x()) : qMin(qreal(0), x + m_fraction.x());
y = (y == 0) ? y :
(y > 0) ? qMax(qreal(0), y - m_fraction.y()) : qMin(qreal(0), y + m_fraction.y());
speed.setX(x);
speed.setY(y);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Jani Honkonen
more coding style fixes for src-folder...
r2104 ScrollTicker::ScrollTicker(Scroller *scroller, QObject *parent)
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 : QObject(parent),
m_scroller(scroller)
Michal Klocek
Refactor qledgend handling...
r855 {
}
void ScrollTicker::start(int interval)
{
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 if (!m_timer.isActive())
Michal Klocek
Refactor qledgend handling...
r855 m_timer.start(interval, this);
}
void ScrollTicker::stop()
{
m_timer.stop();
}
void ScrollTicker::timerEvent(QTimerEvent *event)
{
Q_UNUSED(event);
m_scroller->scrollTick();
}
Michal Klocek
Krazy reported errors...
r974 #include "moc_scroller_p.cpp"
Michal Klocek
Refactor qledgend handling...
r855 QTCOMMERCIALCHART_END_NAMESPACE