##// END OF EJS Templates
adds Andy's customer request, first call to createDaultAxis scales whole domain (if on common axis)
adds Andy's customer request, first call to createDaultAxis scales whole domain (if on common axis)

File last commit:

r2356:c0053ad31507
r2408:f065af9daaed
Show More
logxydomain.cpp
236 lines | 7.4 KiB | text/x-c | CppLexer
Marek Rosa
Domains added
r2275 /****************************************************************************
**
** Copyright (C) 2012 Digia Plc
** 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 "logxydomain_p.h"
#include "qabstractaxis_p.h"
Marek Rosa
Added attach/dettach axis domain implementations
r2290 #include "qlogvalueaxis.h"
Marek Rosa
Domains added
r2275 #include <qmath.h>
QTCOMMERCIALCHART_BEGIN_NAMESPACE
LogXYDomain::LogXYDomain(QObject *parent)
: AbstractDomain(parent),
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 m_logLeftX(0),
m_logRightX(1),
Marek Rosa
Domains added
r2275 m_logBaseX(10)
{
}
LogXYDomain::~LogXYDomain()
{
}
void LogXYDomain::setRange(qreal minX, qreal maxX, qreal minY, qreal maxY)
{
bool axisXChanged = false;
bool axisYChanged = false;
if (!qFuzzyCompare(m_minX, minX) || !qFuzzyCompare(m_maxX, maxX)) {
m_minX = minX;
m_maxX = maxX;
axisXChanged = true;
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 qreal logMinX = log10(m_minX) / log10(m_logBaseX);
qreal logMaxX = log10(m_maxX) / log10(m_logBaseX);
m_logLeftX = logMinX < logMaxX ? logMinX : logMaxX;
m_logRightX = logMinX > logMaxX ? logMinX : logMaxX;
Michal Klocek
Fix domain switching
r2288 if(!m_signalsBlocked)
Marek Rosa
Negative values with log axis handled
r2356 emit rangeHorizontalChanged(m_minX, m_maxX);
Marek Rosa
Domains added
r2275 }
if (!qFuzzyIsNull(m_minY - minY) || !qFuzzyIsNull(m_maxY - maxY)) {
m_minY = minY;
m_maxY = maxY;
axisYChanged = true;
Michal Klocek
Fix domain switching
r2288 if(!m_signalsBlocked)
Marek Rosa
Negative values with log axis handled
r2356 emit rangeVerticalChanged(m_minY, m_maxY);
Marek Rosa
Domains added
r2275 }
if (axisXChanged || axisYChanged)
emit updated();
}
void LogXYDomain::zoomIn(const QRectF &rect)
{
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 qreal logLeftX = rect.left() * (m_logRightX - m_logLeftX) / m_size.width() + m_logLeftX;
qreal logRightX = rect.right() * (m_logRightX - m_logLeftX) / m_size.width() + m_logLeftX;
qreal leftX = qPow(m_logBaseX, logLeftX);
qreal rightX = qPow(m_logBaseX, logRightX);
qreal minX = leftX < rightX ? leftX : rightX;
qreal maxX = leftX > rightX ? leftX : rightX;
Marek Rosa
Domains added
r2275
Marek Rosa
Log domains zoomin, zoomout and move added
r2280 qreal dy = spanY() / m_size.height();
Marek Rosa
Domains added
r2275 qreal minY = m_minY;
qreal maxY = m_maxY;
minY = maxY - dy * rect.bottom();
maxY = maxY - dy * rect.top();
setRange(minX, maxX, minY, maxY);
}
void LogXYDomain::zoomOut(const QRectF &rect)
{
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 const qreal factorX = m_size.width() / rect.width();
qreal logLeftX = m_logLeftX + (m_logRightX - m_logLeftX) / 2 * (1 - factorX);
qreal logRIghtX = m_logLeftX + (m_logRightX - m_logLeftX) / 2 * (1 + factorX);
qreal leftX = qPow(m_logBaseX, logLeftX);
qreal rightX = qPow(m_logBaseX, logRIghtX);
qreal minX = leftX < rightX ? leftX : rightX;
qreal maxX = leftX > rightX ? leftX : rightX;
Marek Rosa
Domains added
r2275
Marek Rosa
Log domains zoomin, zoomout and move added
r2280 qreal dy = spanY() / rect.height();
Marek Rosa
Domains added
r2275 qreal minY = m_minY;
qreal maxY = m_maxY;
maxY = minY + dy * rect.bottom();
minY = maxY - dy * m_size.height();
setRange(minX, maxX, minY, maxY);
}
void LogXYDomain::move(qreal dx, qreal dy)
{
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 qreal stepX = dx * (m_logRightX - m_logLeftX) / m_size.width();
qreal leftX = qPow(m_logBaseX, m_logLeftX + stepX);
qreal rightX = qPow(m_logBaseX, m_logRightX + stepX);
qreal minX = leftX < rightX ? leftX : rightX;
qreal maxX = leftX > rightX ? leftX : rightX;
Marek Rosa
Domains added
r2275
Marek Rosa
Log domains zoomin, zoomout and move added
r2280 qreal y = spanY() / m_size.height();
Marek Rosa
Domains added
r2275 qreal minY = m_minY;
qreal maxY = m_maxY;
if (dy != 0) {
minY = minY + y * dy;
maxY = maxY + y * dy;
}
setRange(minX, maxX, minY, maxY);
}
Marek Rosa
Negative values with log axis handled
r2356 QPointF LogXYDomain::calculateGeometryPoint(const QPointF &point, bool &ok) const
Marek Rosa
Domains added
r2275 {
Marek Rosa
Negative values with log axis handled
r2356 if (point.x() > 0) {
const qreal deltaX = m_size.width() / (m_logRightX - m_logLeftX);
const qreal deltaY = m_size.height() / (m_maxY - m_minY);
qreal x = (log10(point.x()) / log10(m_logBaseX)) * deltaX - m_logLeftX * deltaX;
qreal y = (point.y() - m_minY) * -deltaY + m_size.height();
ok = true;
return QPointF(x, y);
} else {
qWarning() << "Logarithm of negative value is undefined. Empty layout returned";
ok = false;
return QPointF();
}
Marek Rosa
Domains added
r2275 }
QVector<QPointF> LogXYDomain::calculateGeometryPoints(const QList<QPointF>& vector) const
{
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 const qreal deltaX = m_size.width() / (m_logRightX - m_logLeftX);
Marek Rosa
Domains added
r2275 const qreal deltaY = m_size.height() / (m_maxY - m_minY);
QVector<QPointF> result;
result.resize(vector.count());
for (int i = 0; i < vector.count(); ++i) {
Marek Rosa
Negative values with log axis handled
r2356 if (vector[i].x() > 0) {
qreal x = (log10(vector[i].x()) / log10(m_logBaseX)) * deltaX - m_logLeftX * deltaX;
qreal y = (vector[i].y() - m_minY) * -deltaY + m_size.height();
result[i].setX(x);
result[i].setY(y);
} else {
qWarning() << "Logarithm of negative value is undefined. Empty layout returned";
return QVector<QPointF>();
}
Marek Rosa
Domains added
r2275 }
return result;
}
QPointF LogXYDomain::calculateDomainPoint(const QPointF &point) const
{
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 const qreal deltaX = m_size.width() / (m_logRightX - m_logLeftX);
Marek Rosa
Domains added
r2275 const qreal deltaY = m_size.height() / (m_maxY - m_minY);
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 qreal x = qPow(m_logBaseX, m_logLeftX + point.x() / deltaX);
Marek Rosa
Domains added
r2275 qreal y = (point.y() - m_size.height()) / (-deltaY) + m_minY;
return QPointF(x, y);
}
Marek Rosa
Added attach/dettach axis domain implementations
r2290 bool LogXYDomain::attachAxis(QAbstractAxis* axis)
{
AbstractDomain::attachAxis(axis);
QLogValueAxis *logAxis = qobject_cast<QLogValueAxis *>(axis);
Marek Rosa
Fix to domain initialization when log base was preset on axis before adding it to chart
r2295 if(logAxis && logAxis->orientation()==Qt::Horizontal) {
Marek Rosa
Added attach/dettach axis domain implementations
r2290 QObject::connect(logAxis, SIGNAL(baseChanged(qreal)), this, SLOT(handleHorizontalAxisBaseChanged(qreal)));
Marek Rosa
Fix to domain initialization when log base was preset on axis before adding it to chart
r2295 handleHorizontalAxisBaseChanged(logAxis->base());
}
Marek Rosa
Added attach/dettach axis domain implementations
r2290
return true;
}
bool LogXYDomain::detachAxis(QAbstractAxis* axis)
{
AbstractDomain::detachAxis(axis);
QLogValueAxis *logAxis = qobject_cast<QLogValueAxis *>(axis);
if(logAxis && logAxis->orientation()==Qt::Horizontal)
QObject::disconnect(logAxis, SIGNAL(baseChanged(qreal)), this, SLOT(handleHorizontalAxisBaseChanged(qreal)));
return true;
}
void LogXYDomain::handleHorizontalAxisBaseChanged(qreal baseX)
{
m_logBaseX = baseX;
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 qreal logMinX = log10(m_minX) / log10(m_logBaseX);
qreal logMaxX = log10(m_maxX) / log10(m_logBaseX);
m_logLeftX = logMinX < logMaxX ? logMinX : logMaxX;
m_logRightX = logMinX > logMaxX ? logMinX : logMaxX;
Marek Rosa
Fixed: chart not redrawing when logaxis's logBase value changed
r2322 emit updated();
Marek Rosa
Added attach/dettach axis domain implementations
r2290 }
Marek Rosa
Domains added
r2275 // operators
bool QTCOMMERCIALCHART_AUTOTEST_EXPORT operator== (const LogXYDomain &domain1, const LogXYDomain &domain2)
{
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));
}
bool QTCOMMERCIALCHART_AUTOTEST_EXPORT operator!= (const LogXYDomain &domain1, const LogXYDomain &domain2)
{
return !(domain1 == domain2);
}
QDebug QTCOMMERCIALCHART_AUTOTEST_EXPORT operator<<(QDebug dbg, const LogXYDomain &domain)
{
dbg.nospace() << "AbstractDomain(" << domain.m_minX << ',' << domain.m_maxX << ',' << domain.m_minY << ',' << domain.m_maxY << ')' << domain.m_size;
return dbg.maybeSpace();
}
#include "moc_logxydomain_p.cpp"
QTCOMMERCIALCHART_END_NAMESPACE