##// END OF EJS Templates
Fix default axis for DeclarativeChart...
Fix default axis for DeclarativeChart The range for the axis needs to be set if no axis has been defined for Chart. Change-Id: I036fd1264b53b150bc9aaf1c1571f4d1dbefbc81 Task-number: QTRD-3482 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@theqtcompany.com>

File last commit:

r2776:bc1f6aa59d42
r2789:bcb78508ec67
Show More
xlogydomain.cpp
240 lines | 7.6 KiB | text/x-c | CppLexer
Marek Rosa
Domains added
r2275 /****************************************************************************
**
Titta Heikkala
Copyright header changes...
r2776 ** Copyright (C) 2015 The Qt Company Ltd
Marek Rosa
Domains added
r2275 ** All rights reserved.
Titta Heikkala
Copyright header changes...
r2776 ** For any questions to The Qt Company, please use contact form at http://qt.io
Marek Rosa
Domains added
r2275 **
Titta Heikkala
Updated license headers...
r2740 ** This file is part of the Qt Charts module.
Marek Rosa
Domains added
r2275 **
Titta Heikkala
Updated license headers...
r2740 ** Licensees holding valid commercial license for Qt may use this file in
** accordance with the Qt License Agreement provided with the Software
** or, alternatively, in accordance with the terms contained in a written
Titta Heikkala
Copyright header changes...
r2776 ** agreement between you and The Qt Company.
Marek Rosa
Domains added
r2275 **
** If you have questions regarding the use of this file, please use
Titta Heikkala
Updated license headers...
r2740 ** contact form at http://qt.io
Marek Rosa
Domains added
r2275 **
****************************************************************************/
Titta Heikkala
Fix include syntax...
r2714 #include <private/xlogydomain_p.h>
#include <private/qabstractaxis_p.h>
#include <QtCharts/QLogValueAxis>
#include <QtCore/QtMath>
Titta Heikkala
Fix QNX build issue...
r2775 #include <cmath>
Marek Rosa
Domains added
r2275
Titta Heikkala
Qt Charts project file structure change...
r2712 QT_CHARTS_BEGIN_NAMESPACE
Marek Rosa
Domains added
r2275
XLogYDomain::XLogYDomain(QObject *parent)
: AbstractDomain(parent),
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 m_logLeftY(0),
m_logRightY(1),
Marek Rosa
Domains added
r2275 m_logBaseY(10)
{
}
XLogYDomain::~XLogYDomain()
{
}
void XLogYDomain::setRange(qreal minX, qreal maxX, qreal minY, qreal maxY)
{
bool axisXChanged = false;
bool axisYChanged = false;
Miikka Heikkinen
Add Polar chart support...
r2483 adjustLogDomainRanges(minY, maxY);
Marek Rosa
Domains added
r2275 if (!qFuzzyIsNull(m_minX - minX) || !qFuzzyIsNull(m_maxX - maxX)) {
m_minX = minX;
m_maxX = maxX;
axisXChanged = true;
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;
Titta Heikkala
Fix QNX build issue...
r2775 qreal logMinY = std::log10(m_minY) / std::log10(m_logBaseY);
qreal logMaxY = std::log10(m_maxY) / std::log10(m_logBaseY);
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 m_logLeftY = logMinY < logMaxY ? logMinY : logMaxY;
m_logRightY = logMinY > logMaxY ? logMinY : logMaxY;
Miikka Heikkinen
Add Polar chart support...
r2483 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 XLogYDomain::zoomIn(const QRectF &rect)
{
Miikka Heikkinen
Added QChart::zoomReset() and QChart::isZoomed()...
r2545 storeZoomReset();
Marek Rosa
Domains added
r2275 qreal dx = spanX() / m_size.width();
qreal maxX = m_maxX;
qreal minX = m_minX;
maxX = minX + dx * rect.right();
minX = minX + dx * rect.left();
Marek Rosa
Log domains zoomin, zoomout and move added
r2280
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 qreal logLeftY = m_logRightY - rect.bottom() * (m_logRightY - m_logLeftY) / m_size.height();
qreal logRightY = m_logRightY - rect.top() * (m_logRightY - m_logLeftY) / m_size.height();
qreal leftY = qPow(m_logBaseY, logLeftY);
qreal rightY = qPow(m_logBaseY, logRightY);
qreal minY = leftY < rightY ? leftY : rightY;
qreal maxY = leftY > rightY ? leftY : rightY;
Marek Rosa
Domains added
r2275
setRange(minX, maxX, minY, maxY);
}
void XLogYDomain::zoomOut(const QRectF &rect)
{
Miikka Heikkinen
Added QChart::zoomReset() and QChart::isZoomed()...
r2545 storeZoomReset();
Marek Rosa
Domains added
r2275 qreal dx = spanX() / rect.width();
qreal maxX = m_maxX;
qreal minX = m_minX;
minX = maxX - dx * rect.right();
maxX = minX + dx * m_size.width();
Marek Rosa
Log domains zoomin, zoomout and move added
r2280
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 const qreal factorY = m_size.height() / rect.height();
qreal newLogMinY = m_logLeftY + (m_logRightY - m_logLeftY) / 2 * (1 - factorY);
qreal newLogMaxY = m_logLeftY + (m_logRightY - m_logLeftY) / 2 * (1 + factorY);
qreal leftY = qPow(m_logBaseY, newLogMinY);
qreal rightY = qPow(m_logBaseY, newLogMaxY);
qreal minY = leftY < rightY ? leftY : rightY;
qreal maxY = leftY > rightY ? leftY : rightY;
Marek Rosa
Domains added
r2275
setRange(minX, maxX, minY, maxY);
}
void XLogYDomain::move(qreal dx, qreal dy)
{
qreal x = spanX() / m_size.width();
qreal maxX = m_maxX;
qreal minX = m_minX;
if (dx != 0) {
minX = minX + x * dx;
maxX = maxX + x * dx;
}
Marek Rosa
Log domains zoomin, zoomout and move added
r2280
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 qreal stepY = dy * (m_logRightY - m_logLeftY) / m_size.height();
qreal leftY = qPow(m_logBaseY, m_logLeftY + stepY);
qreal rightY = qPow(m_logBaseY, m_logRightY + stepY);
qreal minY = leftY < rightY ? leftY : rightY;
qreal maxY = leftY > rightY ? leftY : rightY;
Marek Rosa
Log domains zoomin, zoomout and move added
r2280
Marek Rosa
Domains added
r2275 setRange(minX, maxX, minY, maxY);
}
Marek Rosa
Negative values with log axis handled
r2356 QPointF XLogYDomain::calculateGeometryPoint(const QPointF &point, bool &ok) const
Marek Rosa
Domains added
r2275 {
Titta Heikkala
Fix logarithmic axis point calculation...
r2611 const qreal deltaX = m_size.width() / (m_maxX - m_minX);
const qreal deltaY = m_size.height() / qAbs(m_logRightY - m_logLeftY);
Marek Rosa
Negative values with log axis handled
r2356
Titta Heikkala
Fix logarithmic axis point calculation...
r2611 qreal x = (point.x() - m_minX) * deltaX;
qreal y(0);
if (point.y() > 0) {
Titta Heikkala
Fix QNX build issue...
r2775 y = (std::log10(point.y()) / std::log10(m_logBaseY)) * -deltaY - m_logLeftY * -deltaY + m_size.height();
Marek Rosa
Negative values with log axis handled
r2356 ok = true;
} else {
Titta Heikkala
Fix logarithmic axis point calculation...
r2611 y = m_size.height();
qWarning() << "Logarithms of zero and negative values are undefined.";
Marek Rosa
Negative values with log axis handled
r2356 ok = false;
}
Titta Heikkala
Fix logarithmic axis point calculation...
r2611 return QPointF(x, y);
Marek Rosa
Domains added
r2275 }
Miikka Heikkinen
Add Polar chart support...
r2483 QVector<QPointF> XLogYDomain::calculateGeometryPoints(const QList<QPointF> &vector) const
Marek Rosa
Domains added
r2275 {
const qreal deltaX = m_size.width() / (m_maxX - m_minX);
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 const qreal deltaY = m_size.height() / qAbs(m_logRightY - m_logLeftY);
Marek Rosa
Domains added
r2275
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].y() > 0) {
qreal x = (vector[i].x() - m_minX) * deltaX;
Titta Heikkala
Fix QNX build issue...
r2775 qreal y = (std::log10(vector[i].y()) / std::log10(m_logBaseY)) * -deltaY - m_logLeftY * -deltaY + m_size.height();
Marek Rosa
Negative values with log axis handled
r2356 result[i].setX(x);
result[i].setY(y);
} else {
Titta Heikkala
Fix logarithmic axis point calculation...
r2611 qWarning() << "Logarithms of zero and negative values are undefined.";
Marek Rosa
Negative values with log axis handled
r2356 return QVector<QPointF>();
}
Marek Rosa
Domains added
r2275 }
return result;
}
QPointF XLogYDomain::calculateDomainPoint(const QPointF &point) const
{
const qreal deltaX = m_size.width() / (m_maxX - m_minX);
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 const qreal deltaY = m_size.height() / qAbs(m_logRightY - m_logLeftY);
Marek Rosa
Domains added
r2275 qreal x = point.x() / deltaX + m_minX;
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 qreal y = qPow(m_logBaseY, m_logLeftY + (m_size.height() - point.y()) / deltaY);
Marek Rosa
Domains added
r2275 return QPointF(x, y);
}
Miikka Heikkinen
Add Polar chart support...
r2483 bool XLogYDomain::attachAxis(QAbstractAxis *axis)
Marek Rosa
Added attach/dettach axis domain implementations
r2290 {
QLogValueAxis *logAxis = qobject_cast<QLogValueAxis *>(axis);
Miikka Heikkinen
Add Polar chart support...
r2483 if (logAxis && logAxis->orientation() == Qt::Vertical) {
Marek Rosa
Added attach/dettach axis domain implementations
r2290 QObject::connect(logAxis, SIGNAL(baseChanged(qreal)), this, SLOT(handleVerticalAxisBaseChanged(qreal)));
Marek Rosa
Fix to domain initialization when log base was preset on axis before adding it to chart
r2295 handleVerticalAxisBaseChanged(logAxis->base());
Marek Rosa
Negative values with log axis handled
r2356 }
Michal Klocek
bugfix signals not reconnected when domain changed
r2292 return AbstractDomain::attachAxis(axis);
Marek Rosa
Added attach/dettach axis domain implementations
r2290 }
Miikka Heikkinen
Add Polar chart support...
r2483 bool XLogYDomain::detachAxis(QAbstractAxis *axis)
Marek Rosa
Added attach/dettach axis domain implementations
r2290 {
QLogValueAxis *logAxis = qobject_cast<QLogValueAxis *>(axis);
Miikka Heikkinen
Add Polar chart support...
r2483 if (logAxis && logAxis->orientation() == Qt::Vertical)
Marek Rosa
Added attach/dettach axis domain implementations
r2290 QObject::disconnect(logAxis, SIGNAL(baseChanged(qreal)), this, SLOT(handleVerticalAxisBaseChanged(qreal)));
Michal Klocek
bugfix signals not reconnected when domain changed
r2292 return AbstractDomain::detachAxis(axis);
Marek Rosa
Added attach/dettach axis domain implementations
r2290 }
void XLogYDomain::handleVerticalAxisBaseChanged(qreal baseY)
{
m_logBaseY = baseY;
Titta Heikkala
Fix QNX build issue...
r2775 qreal logMinY = std::log10(m_minY) / std::log10(m_logBaseY);
qreal logMaxY = std::log10(m_maxY) / std::log10(m_logBaseY);
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 m_logLeftY = logMinY < logMaxY ? logMinY : logMaxY;
m_logRightY = logMinY > logMaxY ? logMinY : logMaxY;
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
Titta Heikkala
Qt Charts project file structure change...
r2712 bool QT_CHARTS_AUTOTEST_EXPORT operator== (const XLogYDomain &domain1, const XLogYDomain &domain2)
Marek Rosa
Domains added
r2275 {
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));
Marek Rosa
Domains added
r2275 }
Titta Heikkala
Qt Charts project file structure change...
r2712 bool QT_CHARTS_AUTOTEST_EXPORT operator!= (const XLogYDomain &domain1, const XLogYDomain &domain2)
Marek Rosa
Domains added
r2275 {
return !(domain1 == domain2);
}
Titta Heikkala
Qt Charts project file structure change...
r2712 QDebug QT_CHARTS_AUTOTEST_EXPORT operator<<(QDebug dbg, const XLogYDomain &domain)
Marek Rosa
Domains added
r2275 {
Titta Heikkala
Fix Chart build when QT_NO_TEXTSTREAM is defined...
r2620 #ifdef QT_NO_TEXTSTREAM
Q_UNUSED(domain)
#else
Marek Rosa
Domains added
r2275 dbg.nospace() << "AbstractDomain(" << domain.m_minX << ',' << domain.m_maxX << ',' << domain.m_minY << ',' << domain.m_maxY << ')' << domain.m_size;
Titta Heikkala
Fix Chart build when QT_NO_TEXTSTREAM is defined...
r2620 #endif
Marek Rosa
Domains added
r2275 return dbg.maybeSpace();
}
#include "moc_xlogydomain_p.cpp"
Titta Heikkala
Qt Charts project file structure change...
r2712 QT_CHARTS_END_NAMESPACE