##// END OF EJS Templates
Added QChart::zoomReset() and QChart::isZoomed()...
Added QChart::zoomReset() and QChart::isZoomed() QChart::zoomReset() will restore all series domains to whatever they were before first zoom operation was called. QChart::isZoomed() indicates if any zoom operations have been called since chart creation or previous zoom reset. Also fixed related QChartView right mouse button release docs. Task-number: QTRD-1944 Change-Id: I5eec2352a2aa6d1b8ed7e6c97653bb327fb92cd3 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>

File last commit:

r2545:d1d46096c185
r2545:d1d46096c185
Show More
abstractdomain.cpp
262 lines | 6.9 KiB | text/x-c | CppLexer
/ src / domain / abstractdomain.cpp
Jani Honkonen
Add license headers
r794 /****************************************************************************
**
Miikka Heikkinen
Fixed the copyright year 2012 -> 2013
r2432 ** Copyright (C) 2013 Digia Plc
Jani Honkonen
Add license headers
r794 ** 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$
**
****************************************************************************/
Marek Rosa
Domains added
r2275 #include "abstractdomain_p.h"
Michal Klocek
Refactors Domain and Axis...
r1698 #include "qabstractaxis_p.h"
Michal Klocek
Refactors internals...
r2273 #include <qmath.h>
Michal Klocek
Refactors qchart , adds line animation...
r131
QTCOMMERCIALCHART_BEGIN_NAMESPACE
Marek Rosa
Domains added
r2275 AbstractDomain::AbstractDomain(QObject *parent)
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 : QObject(parent),
m_minX(0),
m_maxX(0),
m_minY(0),
Michal Klocek
Refactors internals...
r2273 m_maxY(0),
Miikka Heikkinen
Added QChart::zoomReset() and QChart::isZoomed()...
r2545 m_signalsBlocked(false),
m_zoomed(false),
m_zoomResetMinX(0),
m_zoomResetMaxX(0),
m_zoomResetMinY(0),
m_zoomResetMaxY(0)
Michal Klocek
Refactors qchart , adds line animation...
r131 {
}
Marek Rosa
Domains added
r2275 AbstractDomain::~AbstractDomain()
Michal Klocek
Refactors qchart , adds line animation...
r131 {
}
Miikka Heikkinen
Add Polar chart support...
r2483 void AbstractDomain::setSize(const QSizeF &size)
Michal Klocek
Refactors internals...
r2273 {
if(m_size!=size)
{
m_size=size;
emit updated();
}
}
Marek Rosa
Domains added
r2275 QSizeF AbstractDomain::size() const
Michal Klocek
Refactors internals...
r2273 {
return m_size;
}
Marek Rosa
Domains added
r2275 void AbstractDomain::setRangeX(qreal min, qreal max)
Michal Klocek
Refactor domain model...
r439 {
Jani Honkonen
astyle and manual coding style fixes for src-folder
r2097 setRange(min, max, m_minY, m_maxY);
Michal Klocek
Refactor domain model...
r439 }
Michal Klocek
Refactors barchart axis hadnling...
r679
Marek Rosa
Domains added
r2275 void AbstractDomain::setRangeY(qreal min, qreal max)
Michal Klocek
Refactor domain model...
r439 {
Michal Klocek
Adds loosenumber algorithm...
r678 setRange(m_minX, m_maxX, min, max);
Michal Klocek
Refactor domain model...
r439 }
Marek Rosa
Domains added
r2275 void AbstractDomain::setMinX(qreal min)
Michal Klocek
Refactor domain model...
r439 {
Michal Klocek
Adds loosenumber algorithm...
r678 setRange(min, m_maxX, m_minY, m_maxY);
Michal Klocek
Refactor domain model...
r439 }
Marek Rosa
Domains added
r2275 void AbstractDomain::setMaxX(qreal max)
Michal Klocek
Refactor domain model...
r439 {
Michal Klocek
Adds loosenumber algorithm...
r678 setRange(m_minX, max, m_minY, m_maxY);
Michal Klocek
Refactor domain model...
r439 }
Marek Rosa
Domains added
r2275 void AbstractDomain::setMinY(qreal min)
Michal Klocek
Refactor domain model...
r439 {
Michal Klocek
Adds loosenumber algorithm...
r678 setRange(m_minX, m_maxX, min, m_maxY);
Michal Klocek
Refactor domain model...
r439 }
Marek Rosa
Domains added
r2275 void AbstractDomain::setMaxY(qreal max)
Michal Klocek
Refactor domain model...
r439 {
setRange(m_minX, m_maxX, m_minY, max);
}
Marek Rosa
Domains added
r2275 qreal AbstractDomain::spanX() const
Michal Klocek
Refactors qchart , adds line animation...
r131 {
Michal Klocek
Refactor domain model...
r439 Q_ASSERT(m_maxX >= m_minX);
return m_maxX - m_minX;
Michal Klocek
Refactors qchart , adds line animation...
r131 }
Marek Rosa
Domains added
r2275 qreal AbstractDomain::spanY() const
Michal Klocek
Refactors qchart , adds line animation...
r131 {
Michal Klocek
Refactor domain model...
r439 Q_ASSERT(m_maxY >= m_minY);
return m_maxY - m_minY;
Michal Klocek
Refactors qchart , adds line animation...
r131 }
Marek Rosa
Domains added
r2275 bool AbstractDomain::isEmpty() const
Michal Klocek
Adds isEmpty to domain
r388 {
Marek Rosa
Domains added
r2275 return qFuzzyIsNull(spanX()) || qFuzzyIsNull(spanY()) || m_size.isEmpty() ;
Michal Klocek
Adds isEmpty to domain
r388 }
Marek Rosa
Domains added
r2275 QPointF AbstractDomain::calculateDomainPoint(const QPointF &point) const
Michal Klocek
Refactors internals...
r2273 {
const qreal deltaX = m_size.width() / (m_maxX - m_minX);
const qreal deltaY = m_size.height() / (m_maxY - m_minY);
qreal x = point.x() / deltaX + m_minX;
qreal y = (point.y() - m_size.height()) / (-deltaY) + m_minY;
return QPointF(x, y);
}
// handlers
Marek Rosa
Domains added
r2275 void AbstractDomain::handleVerticalAxisRangeChanged(qreal min, qreal max)
Michal Klocek
Refactors internals...
r2273 {
Michal Klocek
Bugfix resize event during zoomin
r2289 setRangeY(min, max);
Michal Klocek
Refactors internals...
r2273 }
Marek Rosa
Domains added
r2275 void AbstractDomain::handleHorizontalAxisRangeChanged(qreal min, qreal max)
Michal Klocek
Refactors internals...
r2273 {
Michal Klocek
Bugfix resize event during zoomin
r2289 setRangeX(min, max);
Michal Klocek
Refactors internals...
r2273 }
Michal Klocek
Bugfix resize event during zoomin
r2289 void AbstractDomain::blockRangeSignals(bool block)
Michal Klocek
Refactors internals...
r2273 {
Miikka Heikkinen
Add Polar chart support...
r2483 if (m_signalsBlocked!=block) {
Michal Klocek
Bugfix resize event during zoomin
r2289 m_signalsBlocked=block;
Miikka Heikkinen
Add Polar chart support...
r2483 if (!block) {
Michal Klocek
Bugfix resize event during zoomin
r2289 emit rangeHorizontalChanged(m_minX,m_maxX);
emit rangeVerticalChanged(m_minY,m_maxY);
}
}
Michal Klocek
Refactors internals...
r2273 }
Miikka Heikkinen
Added QChart::zoomReset() and QChart::isZoomed()...
r2545 void AbstractDomain::zoomReset()
{
if (m_zoomed) {
setRange(m_zoomResetMinX,
m_zoomResetMaxX,
m_zoomResetMinY,
m_zoomResetMaxY);
m_zoomed = false;
}
}
void AbstractDomain::storeZoomReset()
{
if (!m_zoomed) {
m_zoomed = true;
m_zoomResetMinX = m_minX;
m_zoomResetMaxX = m_maxX;
m_zoomResetMinY = m_minY;
m_zoomResetMaxY = m_maxY;
}
}
Michal Klocek
Refactors internals...
r2273 //algorithm defined by Paul S.Heckbert GraphicalGems I
Marek Rosa
Domains added
r2275 void AbstractDomain::looseNiceNumbers(qreal &min, qreal &max, int &ticksCount)
Michal Klocek
Refactors internals...
r2273 {
qreal range = niceNumber(max - min, true); //range with ceiling
qreal step = niceNumber(range / (ticksCount - 1), false);
min = qFloor(min / step);
max = qCeil(max / step);
ticksCount = int(max - min) + 1;
min *= step;
max *= step;
}
//nice numbers can be expressed as form of 1*10^n, 2* 10^n or 5*10^n
Marek Rosa
Domains added
r2275 qreal AbstractDomain::niceNumber(qreal x, bool ceiling)
Michal Klocek
Refactors internals...
r2273 {
qreal z = qPow(10, qFloor(log10(x))); //find corresponding number of the form of 10^n than is smaller than x
qreal q = x / z; //q<10 && q>=1;
if (ceiling) {
if (q <= 1.0) q = 1;
else if (q <= 2.0) q = 2;
else if (q <= 5.0) q = 5;
else q = 10;
} else {
if (q < 1.5) q = 1;
else if (q < 3.0) q = 2;
else if (q < 7.0) q = 5;
else q = 10;
}
return q * z;
}
Miikka Heikkinen
Add Polar chart support...
r2483 bool AbstractDomain::attachAxis(QAbstractAxis *axis)
Michal Klocek
Adds domains swap logic
r2284 {
Miikka Heikkinen
Add Polar chart support...
r2483 if (axis->orientation() == Qt::Vertical) {
Michal Klocek
Adds domains swap logic
r2284 QObject::connect(axis->d_ptr.data(), SIGNAL(rangeChanged(qreal,qreal)), this, SLOT(handleVerticalAxisRangeChanged(qreal,qreal)));
QObject::connect(this, SIGNAL(rangeVerticalChanged(qreal,qreal)), axis->d_ptr.data(), SLOT(handleRangeChanged(qreal,qreal)));
}
Miikka Heikkinen
Add Polar chart support...
r2483 if (axis->orientation() == Qt::Horizontal) {
Michal Klocek
Adds domains swap logic
r2284 QObject::connect(axis->d_ptr.data(), SIGNAL(rangeChanged(qreal,qreal)), this, SLOT(handleHorizontalAxisRangeChanged(qreal,qreal)));
QObject::connect(this, SIGNAL(rangeHorizontalChanged(qreal,qreal)), axis->d_ptr.data(), SLOT(handleRangeChanged(qreal,qreal)));
}
return true;
}
Miikka Heikkinen
Add Polar chart support...
r2483 bool AbstractDomain::detachAxis(QAbstractAxis *axis)
Michal Klocek
Adds domains swap logic
r2284 {
Miikka Heikkinen
Add Polar chart support...
r2483 if (axis->orientation() == Qt::Vertical) {
Michal Klocek
Adds domains swap logic
r2284 QObject::disconnect(axis->d_ptr.data(), SIGNAL(rangeChanged(qreal,qreal)), this, SLOT(handleVerticalAxisRangeChanged(qreal,qreal)));
QObject::disconnect(this, SIGNAL(rangeVerticalChanged(qreal,qreal)), axis->d_ptr.data(), SLOT(handleRangeChanged(qreal,qreal)));
}
Miikka Heikkinen
Add Polar chart support...
r2483 if (axis->orientation() == Qt::Horizontal) {
Michal Klocek
Adds domains swap logic
r2284 QObject::disconnect(axis->d_ptr.data(), SIGNAL(rangeChanged(qreal,qreal)), this, SLOT(handleHorizontalAxisRangeChanged(qreal,qreal)));
QObject::disconnect(this, SIGNAL(rangeHorizontalChanged(qreal,qreal)), axis->d_ptr.data(), SLOT(handleRangeChanged(qreal,qreal)));
}
return true;
}
Michal Klocek
Refactors internals...
r2273
// operators
Marek Rosa
Domains added
r2275 bool QTCOMMERCIALCHART_AUTOTEST_EXPORT operator== (const AbstractDomain &domain1, const AbstractDomain &domain2)
Michal Klocek
Add overloaded comparison operators to domain
r220 {
Miikka Heikkinen
Add Polar chart support...
r2483 return (qFuzzyIsNull(domain1.m_maxX - domain2.m_maxX)
&& qFuzzyIsNull(domain1.m_maxY - domain2.m_maxY)
&& qFuzzyIsNull(domain1.m_minX - domain2.m_minX)
&& qFuzzyIsNull(domain1.m_minY - domain2.m_minY));
Michal Klocek
Add overloaded comparison operators to domain
r220 }
Michal Klocek
Another attempt to fix issue with visual sutudio hidden export attributes in domain
r1066
Marek Rosa
Domains added
r2275 bool QTCOMMERCIALCHART_AUTOTEST_EXPORT operator!= (const AbstractDomain &domain1, const AbstractDomain &domain2)
Michal Klocek
Add overloaded comparison operators to domain
r220 {
return !(domain1 == domain2);
}
Michal Klocek
Another attempt to fix issue with visual sutudio hidden export attributes in domain
r1066
Marek Rosa
Domains added
r2275 QDebug QTCOMMERCIALCHART_AUTOTEST_EXPORT operator<<(QDebug dbg, const AbstractDomain &domain)
Michal Klocek
Adds debug operator to domain
r222 {
Marek Rosa
Domains added
r2275 dbg.nospace() << "AbstractDomain(" << domain.m_minX << ',' << domain.m_maxX << ',' << domain.m_minY << ',' << domain.m_maxY << ')' << domain.m_size;
Michal Klocek
Adds debug operator to domain
r222 return dbg.maybeSpace();
}
Miikka Heikkinen
Add Polar chart support...
r2483 // This function adjusts min/max ranges to failsafe values if negative/zero values are attempted.
void AbstractDomain::adjustLogDomainRanges(qreal &min, qreal &max)
{
if (min <= 0) {
min = 1.0;
if (max <= min)
max = min + 1.0;
}
}
Marek Rosa
Domains added
r2275 #include "moc_abstractdomain_p.cpp"
Michal Klocek
Refactor domain model...
r439
Michal Klocek
Refactors qchart , adds line animation...
r131 QTCOMMERCIALCHART_END_NAMESPACE