##// END OF EJS Templates
Fix mouse event interception by scatter chart....
Fix mouse event interception by scatter chart. The scatter chart itself shouldn't be selectable. The scatter chart occupies the entire plot area of the chart, and therefore blocks mouse events from all items below it. Only the individual scatter markers need to be selectable. Change-Id: I664c16ced24e3fc4c068b850c8c612e2d797ee4b Reviewed-by: Titta Heikkala <titta.heikkala@theqtcompany.com>

File last commit:

r2740:377e4516d036
r2747:31ef05db7ba9
Show More
xlogydomain.cpp
239 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/xlogydomain_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
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;
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 qreal logMinY = log10(m_minY) / log10(m_logBaseY);
qreal logMaxY = log10(m_maxY) / log10(m_logBaseY);
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) {
y = (log10(point.y()) / 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;
qreal y = (log10(vector[i].y()) / log10(m_logBaseY)) * -deltaY - m_logLeftY * -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>();
}
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;
Marek Rosa
QChart mapping functions: return QPoint(0, 0) if series type is Pie...
r2351 qreal logMinY = log10(m_minY) / log10(m_logBaseY);
qreal logMaxY = log10(m_maxY) / log10(m_logBaseY);
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