##// END OF EJS Templates
Fix clicked, released and doubleClicked signal points...
Fix clicked, released and doubleClicked signal points The clicked, released and doubleClicked signals for line, spline and area series return the point where the press was triggered. Change-Id: I075bb213657a7cadabdec3a72fde7cf5f412e982 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@theqtcompany.com>

File last commit:

r2740:377e4516d036
r2746:4909289ecbd7
Show More
logxydomain.cpp
243 lines | 7.5 KiB | text/x-c | CppLexer
Marek Rosa
Domains added
r2275 /****************************************************************************
**
Titta Heikkala
Update copyright year...
r2688 ** Copyright (C) 2014 Digia Plc
Marek Rosa
Domains added
r2275 ** All rights reserved.
Titta Heikkala
Updated license headers...
r2740 ** For any questions to Digia, 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
** agreement between you and Digia.
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/logxydomain_p.h>
#include <private/qabstractaxis_p.h>
#include <QtCharts/QLogValueAxis>
#include <QtCore/QtMath>
Marek Rosa
Domains added
r2275
Titta Heikkala
Qt Charts project file structure change...
r2712 QT_CHARTS_BEGIN_NAMESPACE
Marek Rosa
Domains added
r2275
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;
Miikka Heikkinen
Add Polar chart support...
r2483 adjustLogDomainRanges(minX, maxX);
Marek Rosa
Domains added
r2275 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;
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 LogXYDomain::zoomIn(const QRectF &rect)
{
Miikka Heikkinen
Added QChart::zoomReset() and QChart::isZoomed()...
r2545 storeZoomReset();
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)
{
Miikka Heikkinen
Added QChart::zoomReset() and QChart::isZoomed()...
r2545 storeZoomReset();
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 {
Titta Heikkala
Fix logarithmic axis point calculation...
r2611 const qreal deltaX = m_size.width() / (m_logRightX - m_logLeftX);
const qreal deltaY = m_size.height() / (m_maxY - m_minY);
Marek Rosa
Domains added
r2275
Titta Heikkala
Fix logarithmic axis point calculation...
r2611 qreal x(0);
qreal y = (point.y() - m_minY) * -deltaY + m_size.height();
Marek Rosa
Negative values with log axis handled
r2356 if (point.x() > 0) {
Titta Heikkala
Fix logarithmic axis point calculation...
r2611 x = (log10(point.x()) / log10(m_logBaseX)) * deltaX - m_logLeftX * deltaX;
Marek Rosa
Negative values with log axis handled
r2356 ok = true;
} else {
Titta Heikkala
Fix logarithmic axis point calculation...
r2611 x = 0;
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> LogXYDomain::calculateGeometryPoints(const QList<QPointF> &vector) const
Marek Rosa
Domains added
r2275 {
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 {
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>();
}
Titta Heikkala
Fix logarithmic axis point calculation...
r2611
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);
}
Miikka Heikkinen
Add Polar chart support...
r2483 bool LogXYDomain::attachAxis(QAbstractAxis *axis)
Marek Rosa
Added attach/dettach axis domain implementations
r2290 {
AbstractDomain::attachAxis(axis);
QLogValueAxis *logAxis = qobject_cast<QLogValueAxis *>(axis);
Miikka Heikkinen
Add Polar chart support...
r2483 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;
}
Miikka Heikkinen
Add Polar chart support...
r2483 bool LogXYDomain::detachAxis(QAbstractAxis *axis)
Marek Rosa
Added attach/dettach axis domain implementations
r2290 {
AbstractDomain::detachAxis(axis);
QLogValueAxis *logAxis = qobject_cast<QLogValueAxis *>(axis);
Miikka Heikkinen
Add Polar chart support...
r2483 if (logAxis && logAxis->orientation() == Qt::Horizontal)
Marek Rosa
Added attach/dettach axis domain implementations
r2290 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
Titta Heikkala
Qt Charts project file structure change...
r2712 bool QT_CHARTS_AUTOTEST_EXPORT operator== (const LogXYDomain &domain1, const LogXYDomain &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 LogXYDomain &domain1, const LogXYDomain &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 LogXYDomain &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_logxydomain_p.cpp"
Titta Heikkala
Qt Charts project file structure change...
r2712 QT_CHARTS_END_NAMESPACE