summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-06-03 10:12:04 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-06-03 11:01:15 +0300
commitd1d46096c185f7969d0a015222f131dbb2c73368 (patch)
tree842073e01ea76178c63f3d6a63500dfbd13e1c87 /src
parent9f0ff996f5284ca0b814e5c7eb52940dd5511f42 (diff)
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>
Diffstat (limited to 'src')
-rw-r--r--src/chartdataset.cpp25
-rw-r--r--src/chartdataset_p.h2
-rw-r--r--src/domain/abstractdomain.cpp30
-rw-r--r--src/domain/abstractdomain_p.h9
-rw-r--r--src/domain/logxlogydomain.cpp2
-rw-r--r--src/domain/logxlogypolardomain.cpp2
-rw-r--r--src/domain/logxydomain.cpp2
-rw-r--r--src/domain/logxypolardomain.cpp2
-rw-r--r--src/domain/xlogydomain.cpp2
-rw-r--r--src/domain/xlogypolardomain.cpp2
-rw-r--r--src/domain/xydomain.cpp2
-rw-r--r--src/domain/xypolardomain.cpp2
-rw-r--r--src/qchart.cpp30
-rw-r--r--src/qchart.h2
-rw-r--r--src/qchart_p.h2
-rw-r--r--src/qchartview.cpp2
16 files changed, 116 insertions, 2 deletions
diff --git a/src/chartdataset.cpp b/src/chartdataset.cpp
index 4d7e1a09..a3bf5a48 100644
--- a/src/chartdataset.cpp
+++ b/src/chartdataset.cpp
@@ -445,6 +445,31 @@ void ChartDataSet::zoomOutDomain(const QRectF &rect)
domain->blockRangeSignals(false);
}
+void ChartDataSet::zoomResetDomain()
+{
+ QList<AbstractDomain*> domains;
+ foreach (QAbstractSeries *s, m_seriesList) {
+ AbstractDomain *domain = s->d_ptr->domain();
+ s->d_ptr->m_domain->blockRangeSignals(true);
+ domains << domain;
+ }
+
+ foreach (AbstractDomain *domain, domains)
+ domain->zoomReset();
+
+ foreach (AbstractDomain *domain, domains)
+ domain->blockRangeSignals(false);
+}
+
+bool ChartDataSet::isZoomedDomain()
+{
+ foreach (QAbstractSeries *s, m_seriesList) {
+ if (s->d_ptr->domain()->isZoomed())
+ return true;
+ }
+ return false;
+}
+
void ChartDataSet::scrollDomain(qreal dx, qreal dy)
{
QList<AbstractDomain*> domains;
diff --git a/src/chartdataset_p.h b/src/chartdataset_p.h
index 3305c682..442cc6ba 100644
--- a/src/chartdataset_p.h
+++ b/src/chartdataset_p.h
@@ -62,6 +62,8 @@ public:
void zoomInDomain(const QRectF &rect);
void zoomOutDomain(const QRectF &rect);
+ void zoomResetDomain();
+ bool isZoomedDomain();
void scrollDomain(qreal dx, qreal dy);
QPointF mapToValue(const QPointF &position, QAbstractSeries *series = 0);
diff --git a/src/domain/abstractdomain.cpp b/src/domain/abstractdomain.cpp
index 277472d1..f5ec9f47 100644
--- a/src/domain/abstractdomain.cpp
+++ b/src/domain/abstractdomain.cpp
@@ -30,7 +30,13 @@ AbstractDomain::AbstractDomain(QObject *parent)
m_maxX(0),
m_minY(0),
m_maxY(0),
- m_signalsBlocked(false)
+ m_signalsBlocked(false),
+ m_zoomed(false),
+ m_zoomResetMinX(0),
+ m_zoomResetMaxX(0),
+ m_zoomResetMinY(0),
+ m_zoomResetMaxY(0)
+
{
}
@@ -131,6 +137,28 @@ void AbstractDomain::blockRangeSignals(bool block)
}
}
+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;
+ }
+}
+
//algorithm defined by Paul S.Heckbert GraphicalGems I
void AbstractDomain::looseNiceNumbers(qreal &min, qreal &max, int &ticksCount)
diff --git a/src/domain/abstractdomain_p.h b/src/domain/abstractdomain_p.h
index cf7c2bac..19c82fef 100644
--- a/src/domain/abstractdomain_p.h
+++ b/src/domain/abstractdomain_p.h
@@ -80,6 +80,10 @@ public:
void blockRangeSignals(bool block);
bool rangeSignalsBlocked() const { return m_signalsBlocked; }
+ void zoomReset();
+ void storeZoomReset();
+ bool isZoomed() { return m_zoomed; }
+
friend bool QTCOMMERCIALCHART_AUTOTEST_EXPORT operator== (const AbstractDomain &domain1, const AbstractDomain &domain2);
friend bool QTCOMMERCIALCHART_AUTOTEST_EXPORT operator!= (const AbstractDomain &domain1, const AbstractDomain &domain2);
friend QDebug QTCOMMERCIALCHART_AUTOTEST_EXPORT operator<<(QDebug dbg, const AbstractDomain &domain);
@@ -116,6 +120,11 @@ protected:
qreal m_maxY;
QSizeF m_size;
bool m_signalsBlocked;
+ bool m_zoomed;
+ qreal m_zoomResetMinX;
+ qreal m_zoomResetMaxX;
+ qreal m_zoomResetMinY;
+ qreal m_zoomResetMaxY;
};
QTCOMMERCIALCHART_END_NAMESPACE
diff --git a/src/domain/logxlogydomain.cpp b/src/domain/logxlogydomain.cpp
index adb9bc1d..3732bbf9 100644
--- a/src/domain/logxlogydomain.cpp
+++ b/src/domain/logxlogydomain.cpp
@@ -78,6 +78,7 @@ void LogXLogYDomain::setRange(qreal minX, qreal maxX, qreal minY, qreal maxY)
void LogXLogYDomain::zoomIn(const QRectF &rect)
{
+ storeZoomReset();
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);
@@ -97,6 +98,7 @@ void LogXLogYDomain::zoomIn(const QRectF &rect)
void LogXLogYDomain::zoomOut(const QRectF &rect)
{
+ storeZoomReset();
const qreal factorX = m_size.width() / rect.width();
const qreal factorY = m_size.height() / rect.height();
diff --git a/src/domain/logxlogypolardomain.cpp b/src/domain/logxlogypolardomain.cpp
index a193ce11..1c3cc847 100644
--- a/src/domain/logxlogypolardomain.cpp
+++ b/src/domain/logxlogypolardomain.cpp
@@ -78,6 +78,7 @@ void LogXLogYPolarDomain::setRange(qreal minX, qreal maxX, qreal minY, qreal max
void LogXLogYPolarDomain::zoomIn(const QRectF &rect)
{
+ storeZoomReset();
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);
@@ -97,6 +98,7 @@ void LogXLogYPolarDomain::zoomIn(const QRectF &rect)
void LogXLogYPolarDomain::zoomOut(const QRectF &rect)
{
+ storeZoomReset();
const qreal factorX = m_size.width() / rect.width();
qreal logLeftX = m_logLeftX + (m_logRightX - m_logLeftX) / 2.0 * (1.0 - factorX);
diff --git a/src/domain/logxydomain.cpp b/src/domain/logxydomain.cpp
index da6e210a..62a041c1 100644
--- a/src/domain/logxydomain.cpp
+++ b/src/domain/logxydomain.cpp
@@ -70,6 +70,7 @@ void LogXYDomain::setRange(qreal minX, qreal maxX, qreal minY, qreal maxY)
void LogXYDomain::zoomIn(const QRectF &rect)
{
+ storeZoomReset();
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);
@@ -89,6 +90,7 @@ void LogXYDomain::zoomIn(const QRectF &rect)
void LogXYDomain::zoomOut(const QRectF &rect)
{
+ storeZoomReset();
const qreal factorX = m_size.width() / rect.width();
qreal logLeftX = m_logLeftX + (m_logRightX - m_logLeftX) / 2 * (1 - factorX);
diff --git a/src/domain/logxypolardomain.cpp b/src/domain/logxypolardomain.cpp
index b08f6a04..b720352c 100644
--- a/src/domain/logxypolardomain.cpp
+++ b/src/domain/logxypolardomain.cpp
@@ -70,6 +70,7 @@ void LogXYPolarDomain::setRange(qreal minX, qreal maxX, qreal minY, qreal maxY)
void LogXYPolarDomain::zoomIn(const QRectF &rect)
{
+ storeZoomReset();
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);
@@ -89,6 +90,7 @@ void LogXYPolarDomain::zoomIn(const QRectF &rect)
void LogXYPolarDomain::zoomOut(const QRectF &rect)
{
+ storeZoomReset();
const qreal factorX = m_size.width() / rect.width();
qreal logLeftX = m_logLeftX + (m_logRightX - m_logLeftX) / 2.0 * (1.0 - factorX);
diff --git a/src/domain/xlogydomain.cpp b/src/domain/xlogydomain.cpp
index 850eb99b..9934cbd0 100644
--- a/src/domain/xlogydomain.cpp
+++ b/src/domain/xlogydomain.cpp
@@ -70,6 +70,7 @@ void XLogYDomain::setRange(qreal minX, qreal maxX, qreal minY, qreal maxY)
void XLogYDomain::zoomIn(const QRectF &rect)
{
+ storeZoomReset();
qreal dx = spanX() / m_size.width();
qreal maxX = m_maxX;
qreal minX = m_minX;
@@ -89,6 +90,7 @@ void XLogYDomain::zoomIn(const QRectF &rect)
void XLogYDomain::zoomOut(const QRectF &rect)
{
+ storeZoomReset();
qreal dx = spanX() / rect.width();
qreal maxX = m_maxX;
qreal minX = m_minX;
diff --git a/src/domain/xlogypolardomain.cpp b/src/domain/xlogypolardomain.cpp
index 730a9dcd..1843191a 100644
--- a/src/domain/xlogypolardomain.cpp
+++ b/src/domain/xlogypolardomain.cpp
@@ -70,6 +70,7 @@ void XLogYPolarDomain::setRange(qreal minX, qreal maxX, qreal minY, qreal maxY)
void XLogYPolarDomain::zoomIn(const QRectF &rect)
{
+ storeZoomReset();
qreal dx = spanX() / m_size.width();
qreal maxX = m_maxX;
qreal minX = m_minX;
@@ -89,6 +90,7 @@ void XLogYPolarDomain::zoomIn(const QRectF &rect)
void XLogYPolarDomain::zoomOut(const QRectF &rect)
{
+ storeZoomReset();
qreal dx = spanX() / rect.width();
qreal maxX = m_maxX;
qreal minX = m_minX;
diff --git a/src/domain/xydomain.cpp b/src/domain/xydomain.cpp
index 8ac1f0a0..f2f37b35 100644
--- a/src/domain/xydomain.cpp
+++ b/src/domain/xydomain.cpp
@@ -61,6 +61,7 @@ void XYDomain::setRange(qreal minX, qreal maxX, qreal minY, qreal maxY)
void XYDomain::zoomIn(const QRectF &rect)
{
+ storeZoomReset();
qreal dx = spanX() / m_size.width();
qreal dy = spanY() / m_size.height();
@@ -79,6 +80,7 @@ void XYDomain::zoomIn(const QRectF &rect)
void XYDomain::zoomOut(const QRectF &rect)
{
+ storeZoomReset();
qreal dx = spanX() / rect.width();
qreal dy = spanY() / rect.height();
diff --git a/src/domain/xypolardomain.cpp b/src/domain/xypolardomain.cpp
index e9471293..1e8c2601 100644
--- a/src/domain/xypolardomain.cpp
+++ b/src/domain/xypolardomain.cpp
@@ -61,6 +61,7 @@ void XYPolarDomain::setRange(qreal minX, qreal maxX, qreal minY, qreal maxY)
void XYPolarDomain::zoomIn(const QRectF &rect)
{
+ storeZoomReset();
qreal dx = spanX() / m_size.width();
qreal dy = spanY() / m_size.height();
@@ -79,6 +80,7 @@ void XYPolarDomain::zoomIn(const QRectF &rect)
void XYPolarDomain::zoomOut(const QRectF &rect)
{
+ storeZoomReset();
qreal dx = spanX() / rect.width();
qreal dy = spanY() / rect.height();
diff --git a/src/qchart.cpp b/src/qchart.cpp
index 93e28151..6eed3a5b 100644
--- a/src/qchart.cpp
+++ b/src/qchart.cpp
@@ -347,6 +347,26 @@ void QChart::zoom(qreal factor)
d_ptr->zoomOut(1.0 / factor);
}
+
+/*!
+ Resets the series domains to what they were before any zoom method was called.
+ Note that this will also reset any scrolls and explicit axis range settings done between
+ the first zoom operation and calling this method. If no zoom operation has been
+ done, this method does nothing.
+ */
+void QChart::zoomReset()
+{
+ d_ptr->zoomReset();
+}
+
+/*!
+ Returns true if any series has a zoomed domain.
+ */
+bool QChart::isZoomed()
+{
+ return d_ptr->isZoomed();
+}
+
/*!
Returns a pointer to the horizontal axis attached to the specified \a series.
If no \a series is specified, the first horizontal axis added to the chart is returned.
@@ -749,6 +769,16 @@ void QChartPrivate::zoomIn(const QRectF &rect)
}
+void QChartPrivate::zoomReset()
+{
+ m_dataset->zoomResetDomain();
+}
+
+bool QChartPrivate::isZoomed()
+{
+ return m_dataset->isZoomedDomain();
+}
+
void QChartPrivate::zoomOut(qreal factor)
{
const QRectF geometry = m_presenter->geometry();
diff --git a/src/qchart.h b/src/qchart.h
index 6f478302..1c6e8c99 100644
--- a/src/qchart.h
+++ b/src/qchart.h
@@ -126,6 +126,8 @@ public:
void zoomIn(const QRectF &rect);
void zoom(qreal factor);
+ void zoomReset();
+ bool isZoomed();
void scroll(qreal dx, qreal dy);
diff --git a/src/qchart_p.h b/src/qchart_p.h
index e8a4be36..4794e03a 100644
--- a/src/qchart_p.h
+++ b/src/qchart_p.h
@@ -61,6 +61,8 @@ public:
void zoomIn(qreal factor);
void zoomOut(qreal factor);
void zoomIn(const QRectF &rect);
+ void zoomReset();
+ bool isZoomed();
void scroll(qreal dx, qreal dy);
};
diff --git a/src/qchartview.cpp b/src/qchartview.cpp
index 62961097..7695fd7c 100644
--- a/src/qchartview.cpp
+++ b/src/qchartview.cpp
@@ -177,7 +177,7 @@ void QChartView::mouseMoveEvent(QMouseEvent *event)
/*!
If left mouse button is released and the rubber band is enabled then \a event is accepted and
the view is zoomed into the rect specified by the rubber band.
- If it is a right mouse button \a event then the rubber band is dismissed and the zoom is canceled.
+ If it is a right mouse button \a event then the view is zoomed out.
*/
void QChartView::mouseReleaseEvent(QMouseEvent *event)
{