chartdataset.cpp
639 lines
| 18.6 KiB
| text/x-c
|
CppLexer
Michal Klocek
|
r771 | /**************************************************************************** | ||
** | ||||
Titta Heikkala
|
r2776 | ** Copyright (C) 2015 The Qt Company Ltd | ||
Michal Klocek
|
r771 | ** All rights reserved. | ||
Titta Heikkala
|
r2776 | ** For any questions to The Qt Company, please use contact form at http://qt.io | ||
Michal Klocek
|
r771 | ** | ||
Titta Heikkala
|
r2740 | ** This file is part of the Qt Charts module. | ||
Michal Klocek
|
r771 | ** | ||
Titta Heikkala
|
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
|
r2776 | ** agreement between you and The Qt Company. | ||
Michal Klocek
|
r771 | ** | ||
** If you have questions regarding the use of this file, please use | ||||
Titta Heikkala
|
r2740 | ** contact form at http://qt.io | ||
Michal Klocek
|
r771 | ** | ||
****************************************************************************/ | ||||
Titta Heikkala
|
r2714 | #include <private/chartdataset_p.h> | ||
#include <private/chartpresenter_p.h> | ||||
#include <QtCharts/QChart> | ||||
#include <private/qchart_p.h> | ||||
#include <QtCharts/QValueAxis> | ||||
#include <QtCharts/QBarCategoryAxis> | ||||
#include <private/qvalueaxis_p.h> | ||||
#include <QtCharts/QCategoryAxis> | ||||
#include <private/qabstractseries_p.h> | ||||
#include <QtCharts/QAbstractBarSeries> | ||||
#include <QtCharts/QStackedBarSeries> | ||||
#include <QtCharts/QPercentBarSeries> | ||||
#include <QtCharts/QPieSeries> | ||||
#include <private/chartitem_p.h> | ||||
#include <private/xydomain_p.h> | ||||
#include <private/xypolardomain_p.h> | ||||
#include <private/xlogydomain_p.h> | ||||
#include <private/logxydomain_p.h> | ||||
#include <private/logxlogydomain_p.h> | ||||
#include <private/xlogypolardomain_p.h> | ||||
#include <private/logxypolardomain_p.h> | ||||
#include <private/logxlogypolardomain_p.h> | ||||
Miikka Heikkinen
|
r2820 | #include <private/glxyseriesdata_p.h> | ||
Michal Klocek
|
r131 | |||
Marek Rosa
|
r1867 | #ifndef QT_ON_ARM | ||
Titta Heikkala
|
r2714 | #include <QtCharts/QDateTimeAxis> | ||
Marek Rosa
|
r1867 | #endif | ||
Titta Heikkala
|
r2712 | QT_CHARTS_BEGIN_NAMESPACE | ||
Michal Klocek
|
r131 | |||
Michal Klocek
|
r2273 | ChartDataSet::ChartDataSet(QChart *chart) | ||
: QObject(chart), | ||||
Miikka Heikkinen
|
r2820 | m_chart(chart), | ||
m_glXYSeriesDataManager(new GLXYSeriesDataManager(this)) | ||||
Michal Klocek
|
r131 | { | ||
Michal Klocek
|
r1556 | |||
Michal Klocek
|
r131 | } | ||
ChartDataSet::~ChartDataSet() | ||||
{ | ||||
Michal Klocek
|
r2284 | deleteAllSeries(); | ||
deleteAllAxes(); | ||||
Michal Klocek
|
r131 | } | ||
Michal Klocek
|
r2273 | /* | ||
* This method adds series to chartdataset, series ownership is taken from caller. | ||||
*/ | ||||
Jani Honkonen
|
r2104 | void ChartDataSet::addSeries(QAbstractSeries *series) | ||
Michal Klocek
|
r131 | { | ||
Michal Klocek
|
r2273 | if (m_seriesList.contains(series)) { | ||
qWarning() << QObject::tr("Can not add series. Series already on the chart."); | ||||
return; | ||||
} | ||||
Miikka Heikkinen
|
r2483 | // Ignore unsupported series added to polar chart | ||
if (m_chart && m_chart->chartType() == QChart::ChartTypePolar) { | ||||
if (!(series->type() == QAbstractSeries::SeriesTypeArea | ||||
|| series->type() == QAbstractSeries::SeriesTypeLine | ||||
|| series->type() == QAbstractSeries::SeriesTypeScatter | ||||
|| series->type() == QAbstractSeries::SeriesTypeSpline)) { | ||||
qWarning() << QObject::tr("Can not add series. Series type is not supported by a polar chart."); | ||||
return; | ||||
} | ||||
Miikka Heikkinen
|
r2820 | // Disable OpenGL for series in polar charts | ||
series->setUseOpenGL(false); | ||||
Miikka Heikkinen
|
r2483 | series->d_ptr->setDomain(new XYPolarDomain()); | ||
Titta Heikkala
|
r2791 | // Set the correct domain for upper and lower series too | ||
if (series->type() == QAbstractSeries::SeriesTypeArea) { | ||||
foreach (QObject *child, series->children()) { | ||||
if (qobject_cast<QAbstractSeries *>(child)) { | ||||
QAbstractSeries *childSeries = qobject_cast<QAbstractSeries *>(child); | ||||
childSeries->d_ptr->setDomain(new XYPolarDomain()); | ||||
} | ||||
} | ||||
} | ||||
Miikka Heikkinen
|
r2483 | } else { | ||
series->d_ptr->setDomain(new XYDomain()); | ||||
} | ||||
Michal Klocek
|
r2273 | series->d_ptr->initializeDomain(); | ||
m_seriesList.append(series); | ||||
series->setParent(this); // take ownership | ||||
series->d_ptr->m_chart = m_chart; | ||||
emit seriesAdded(series); | ||||
} | ||||
Michal Klocek
|
r910 | |||
Michal Klocek
|
r2273 | /* | ||
* This method adds axis to chartdataset, axis ownership is taken from caller. | ||||
*/ | ||||
Miikka Heikkinen
|
r2483 | void ChartDataSet::addAxis(QAbstractAxis *axis, Qt::Alignment aligment) | ||
Michal Klocek
|
r2273 | { | ||
if (m_axisList.contains(axis)) { | ||||
qWarning() << QObject::tr("Can not add axis. Axis already on the chart."); | ||||
Michal Klocek
|
r439 | return; | ||
} | ||||
Michal Klocek
|
r223 | |||
Michal Klocek
|
r2273 | axis->d_ptr->setAlignment(aligment); | ||
Michal Klocek
|
r1695 | |||
Miikka Heikkinen
|
r2483 | if (!axis->alignment()) { | ||
qWarning() << QObject::tr("No alignment specified !"); | ||||
Michal Klocek
|
r2273 | return; | ||
}; | ||||
Michal Klocek
|
r1695 | |||
Miikka Heikkinen
|
r2483 | AbstractDomain *newDomain; | ||
Miikka Heikkinen
|
r2547 | if (m_chart && m_chart->chartType() == QChart::ChartTypePolar) | ||
Miikka Heikkinen
|
r2483 | newDomain = new XYPolarDomain(); | ||
Miikka Heikkinen
|
r2547 | else | ||
Miikka Heikkinen
|
r2483 | newDomain = new XYDomain(); | ||
QSharedPointer<AbstractDomain> domain(newDomain); | ||||
Michal Klocek
|
r2273 | axis->d_ptr->initializeDomain(domain.data()); | ||
Michal Klocek
|
r223 | |||
Michal Klocek
|
r2273 | axis->setParent(this); | ||
axis->d_ptr->m_chart = m_chart; | ||||
m_axisList.append(axis); | ||||
Michal Klocek
|
r421 | |||
Michal Klocek
|
r2273 | emit axisAdded(axis); | ||
Michal Klocek
|
r1695 | } | ||
Michal Klocek
|
r2273 | /* | ||
* This method removes series form chartdataset, series ownership is passed back to caller. | ||||
*/ | ||||
Jani Honkonen
|
r2104 | void ChartDataSet::removeSeries(QAbstractSeries *series) | ||
Michal Klocek
|
r1695 | { | ||
Michal Klocek
|
r2273 | if (! m_seriesList.contains(series)) { | ||
qWarning() << QObject::tr("Can not remove series. Series not found on the chart."); | ||||
Michal Klocek
|
r1695 | return; | ||
} | ||||
Michal Klocek
|
r2273 | QList<QAbstractAxis*> axes = series->d_ptr->m_axes; | ||
Michal Klocek
|
r1695 | |||
Michal Klocek
|
r2273 | foreach(QAbstractAxis* axis, axes) { | ||
Michal Klocek
|
r2299 | detachAxis(series,axis); | ||
Michal Klocek
|
r910 | } | ||
Michal Klocek
|
r2284 | |||
Michal Klocek
|
r2299 | emit seriesRemoved(series); | ||
m_seriesList.removeAll(series); | ||||
Miikka Heikkinen
|
r2483 | // Reset domain to default | ||
series->d_ptr->setDomain(new XYDomain()); | ||||
Michal Klocek
|
r2299 | series->setParent(0); | ||
series->d_ptr->m_chart = 0; | ||||
Miikka Heikkinen
|
r2820 | |||
QXYSeries *xySeries = qobject_cast<QXYSeries *>(series); | ||||
if (xySeries) | ||||
m_glXYSeriesDataManager->removeSeries(xySeries); | ||||
Michal Klocek
|
r1695 | } | ||
Michal Klocek
|
r910 | |||
Michal Klocek
|
r2273 | /* | ||
* This method removes axis form chartdataset, series ownership is passed back to caller. | ||||
*/ | ||||
void ChartDataSet::removeAxis(QAbstractAxis *axis) | ||||
Michal Klocek
|
r1577 | { | ||
Michal Klocek
|
r2273 | if (! m_axisList.contains(axis)) { | ||
qWarning() << QObject::tr("Can not remove axis. Axis not found on the chart."); | ||||
Tero Ahola
|
r1813 | return; | ||
Michal Klocek
|
r1588 | } | ||
Michal Klocek
|
r1577 | |||
Michal Klocek
|
r2299 | QList<QAbstractSeries*> series = axis->d_ptr->m_series; | ||
foreach(QAbstractSeries* s, series) { | ||||
detachAxis(s,axis); | ||||
} | ||||
Michal Klocek
|
r2273 | emit axisRemoved(axis); | ||
m_axisList.removeAll(axis); | ||||
Michal Klocek
|
r1577 | |||
Michal Klocek
|
r2273 | axis->setParent(0); | ||
axis->d_ptr->m_chart = 0; | ||||
Michal Klocek
|
r1577 | } | ||
Michal Klocek
|
r2273 | /* | ||
Michal Klocek
|
r2284 | * This method attaches axis to series, return true if success. | ||
Michal Klocek
|
r2273 | */ | ||
Miikka Heikkinen
|
r2483 | bool ChartDataSet::attachAxis(QAbstractSeries *series,QAbstractAxis *axis) | ||
Michal Klocek
|
r1588 | { | ||
Michal Klocek
|
r2273 | Q_ASSERT(axis); | ||
Michal Klocek
|
r1588 | |||
Kimmo Leppälä
|
r2669 | if (!series) | ||
return false; | ||||
Miikka Heikkinen
|
r2483 | QList<QAbstractSeries *> attachedSeriesList = axis->d_ptr->m_series; | ||
QList<QAbstractAxis *> attachedAxisList = series->d_ptr->m_axes; | ||||
Michal Klocek
|
r1588 | |||
Michal Klocek
|
r2273 | if (!m_seriesList.contains(series)) { | ||
qWarning() << QObject::tr("Can not find series on the chart."); | ||||
return false; | ||||
} | ||||
Michal Klocek
|
r1588 | |||
Michal Klocek
|
r2273 | if (axis && !m_axisList.contains(axis)) { | ||
qWarning() << QObject::tr("Can not find axis on the chart."); | ||||
return false; | ||||
} | ||||
Michal Klocek
|
r1588 | |||
Michal Klocek
|
r2273 | if (attachedAxisList.contains(axis)) { | ||
qWarning() << QObject::tr("Axis already attached to series."); | ||||
return false; | ||||
Michal Klocek
|
r1695 | } | ||
Michal Klocek
|
r1588 | |||
Michal Klocek
|
r2284 | if (attachedSeriesList.contains(series)) { | ||
qWarning() << QObject::tr("Axis already attached to series."); | ||||
return false; | ||||
} | ||||
Miikka Heikkinen
|
r2483 | AbstractDomain *domain = series->d_ptr->domain(); | ||
Michal Klocek
|
r2284 | AbstractDomain::DomainType type = selectDomain(attachedAxisList<<axis); | ||
Miikka Heikkinen
|
r2483 | if (type == AbstractDomain::UndefinedDomain) return false; | ||
Michal Klocek
|
r910 | |||
Miikka Heikkinen
|
r2483 | if (domain->type() != type) { | ||
Marek Rosa
|
r2373 | AbstractDomain *old = domain; | ||
Miikka Heikkinen
|
r2483 | domain = createDomain(type); | ||
Marek Rosa
|
r2373 | domain->setRange(old->minX(), old->maxX(), old->minY(), old->maxY()); | ||
Miikka Heikkinen
|
r2483 | // Initialize domain size to old domain size, as it won't get updated | ||
// unless geometry changes. | ||||
domain->setSize(old->size()); | ||||
Michal Klocek
|
r439 | } | ||
Michal Klocek
|
r223 | |||
Miikka Heikkinen
|
r2483 | if (!domain) | ||
return false; | ||||
if (!domain->attachAxis(axis)) | ||||
return false; | ||||
Michal Klocek
|
r2284 | |||
Miikka Heikkinen
|
r2483 | QList<AbstractDomain *> blockedDomains; | ||
domain->blockRangeSignals(true); | ||||
blockedDomains << domain; | ||||
Michal Klocek
|
r2284 | |||
Miikka Heikkinen
|
r2483 | if (domain != series->d_ptr->domain()) { | ||
foreach (QAbstractAxis *axis, series->d_ptr->m_axes) { | ||||
Michal Klocek
|
r2292 | series->d_ptr->domain()->detachAxis(axis); | ||
domain->attachAxis(axis); | ||||
Miikka Heikkinen
|
r2483 | foreach (QAbstractSeries *otherSeries, axis->d_ptr->m_series) { | ||
if (otherSeries != series && otherSeries->d_ptr->domain()) { | ||||
if (!otherSeries->d_ptr->domain()->rangeSignalsBlocked()) { | ||||
otherSeries->d_ptr->domain()->blockRangeSignals(true); | ||||
blockedDomains << otherSeries->d_ptr->domain(); | ||||
} | ||||
} | ||||
} | ||||
Michal Klocek
|
r2292 | } | ||
Michal Klocek
|
r2288 | series->d_ptr->setDomain(domain); | ||
series->d_ptr->initializeDomain(); | ||||
} | ||||
Michal Klocek
|
r2292 | |||
series->d_ptr->m_axes<<axis; | ||||
axis->d_ptr->m_series<<series; | ||||
Michal Klocek
|
r2273 | series->d_ptr->initializeAxes(); | ||
Michal Klocek
|
r2285 | axis->d_ptr->initializeDomain(domain); | ||
Michal Klocek
|
r2273 | |||
Miikka Heikkinen
|
r2483 | foreach (AbstractDomain *blockedDomain, blockedDomains) | ||
blockedDomain->blockRangeSignals(false); | ||||
Michal Klocek
|
r2273 | return true; | ||
Michal Klocek
|
r139 | } | ||
Michal Klocek
|
r2273 | /* | ||
Michal Klocek
|
r2284 | * This method detaches axis to series, return true if success. | ||
Michal Klocek
|
r2273 | */ | ||
bool ChartDataSet::detachAxis(QAbstractSeries* series,QAbstractAxis *axis) | ||||
Michal Klocek
|
r1725 | { | ||
Michal Klocek
|
r2273 | Q_ASSERT(series); | ||
Q_ASSERT(axis); | ||||
Michal Klocek
|
r1725 | |||
Michal Klocek
|
r2273 | QList<QAbstractSeries* > attachedSeriesList = axis->d_ptr->m_series; | ||
QList<QAbstractAxis* > attachedAxisList = series->d_ptr->m_axes; | ||||
Michal Klocek
|
r2285 | AbstractDomain* domain = series->d_ptr->domain(); | ||
Michal Klocek
|
r1725 | |||
Michal Klocek
|
r2273 | if (!m_seriesList.contains(series)) { | ||
qWarning() << QObject::tr("Can not find series on the chart."); | ||||
return false; | ||||
} | ||||
Michal Klocek
|
r1725 | |||
Michal Klocek
|
r2273 | if (axis && !m_axisList.contains(axis)) { | ||
qWarning() << QObject::tr("Can not find axis on the chart."); | ||||
return false; | ||||
} | ||||
Michal Klocek
|
r1725 | |||
Michal Klocek
|
r2273 | if (!attachedAxisList.contains(axis)) { | ||
qWarning() << QObject::tr("Axis not attached to series."); | ||||
return false; | ||||
Michal Klocek
|
r1725 | } | ||
Michal Klocek
|
r2273 | Q_ASSERT(axis->d_ptr->m_series.contains(series)); | ||
Michal Klocek
|
r2284 | domain->detachAxis(axis); | ||
Michal Klocek
|
r2273 | series->d_ptr->m_axes.removeAll(axis); | ||
axis->d_ptr->m_series.removeAll(series); | ||||
Michal Klocek
|
r139 | |||
Michal Klocek
|
r2273 | return true; | ||
Michal Klocek
|
r139 | } | ||
Michal Klocek
|
r2273 | void ChartDataSet::createDefaultAxes() | ||
Michal Klocek
|
r139 | { | ||
Michal Klocek
|
r2273 | if (m_seriesList.isEmpty()) | ||
return; | ||||
Michal Klocek
|
r1593 | |||
Michal Klocek
|
r2273 | QAbstractAxis::AxisTypes typeX(0); | ||
QAbstractAxis::AxisTypes typeY(0); | ||||
Michal Klocek
|
r1652 | |||
Michal Klocek
|
r2273 | // Remove possibly existing axes | ||
Michal Klocek
|
r2284 | deleteAllAxes(); | ||
Michal Klocek
|
r1593 | |||
Michal Klocek
|
r2273 | Q_ASSERT(m_axisList.isEmpty()); | ||
Michal Klocek
|
r1593 | |||
Michal Klocek
|
r2273 | // Select the required axis x and axis y types based on the types of the current series | ||
foreach(QAbstractSeries* s, m_seriesList) { | ||||
typeX |= s->d_ptr->defaultAxisType(Qt::Horizontal); | ||||
typeY |= s->d_ptr->defaultAxisType(Qt::Vertical); | ||||
Michal Klocek
|
r223 | } | ||
Michal Klocek
|
r1593 | |||
Miikka Heikkinen
|
r2719 | createAxes(typeX, Qt::Horizontal); | ||
createAxes(typeY, Qt::Vertical); | ||||
Michal Klocek
|
r439 | } | ||
Michal Klocek
|
r223 | |||
Michal Klocek
|
r2273 | void ChartDataSet::createAxes(QAbstractAxis::AxisTypes type, Qt::Orientation orientation) | ||
Michal Klocek
|
r439 | { | ||
Michal Klocek
|
r2273 | QAbstractAxis *axis = 0; | ||
//decide what axis should be created | ||||
Michal Klocek
|
r1593 | |||
Michal Klocek
|
r2273 | switch (type) { | ||
case QAbstractAxis::AxisTypeValue: | ||||
axis = new QValueAxis(this); | ||||
break; | ||||
case QAbstractAxis::AxisTypeBarCategory: | ||||
axis = new QBarCategoryAxis(this); | ||||
break; | ||||
case QAbstractAxis::AxisTypeCategory: | ||||
axis = new QCategoryAxis(this); | ||||
break; | ||||
#ifndef Q_WS_QWS | ||||
case QAbstractAxis::AxisTypeDateTime: | ||||
axis = new QDateTimeAxis(this); | ||||
break; | ||||
#endif | ||||
default: | ||||
axis = 0; | ||||
break; | ||||
Michal Klocek
|
r439 | } | ||
Michal Klocek
|
r1593 | |||
Michal Klocek
|
r2273 | if (axis) { | ||
//create one axis for all | ||||
Michal Klocek
|
r1593 | |||
Michal Klocek
|
r2273 | addAxis(axis,orientation==Qt::Horizontal?Qt::AlignBottom:Qt::AlignLeft); | ||
Michal Klocek
|
r2408 | qreal min = 0; | ||
qreal max = 0; | ||||
findMinMaxForSeries(m_seriesList,orientation,min,max); | ||||
Michal Klocek
|
r2273 | foreach(QAbstractSeries *s, m_seriesList) { | ||
attachAxis(s,axis); | ||||
Michal Klocek
|
r1738 | } | ||
Michal Klocek
|
r2408 | axis->setRange(min,max); | ||
Miikka Heikkinen
|
r2719 | } else { | ||
// Create separate axis for each series | ||||
Michal Klocek
|
r2273 | foreach(QAbstractSeries *s, m_seriesList) { | ||
QAbstractAxis *axis = s->d_ptr->createDefaultAxis(orientation); | ||||
if(axis) { | ||||
addAxis(axis,orientation==Qt::Horizontal?Qt::AlignBottom:Qt::AlignLeft); | ||||
attachAxis(s,axis); | ||||
} | ||||
} | ||||
Tero Ahola
|
r538 | } | ||
} | ||||
Michal Klocek
|
r2408 | void ChartDataSet::findMinMaxForSeries(QList<QAbstractSeries *> series,Qt::Orientations orientation, qreal &min, qreal &max) | ||
{ | ||||
Titta Heikkala
|
r2712 | Q_ASSERT(!series.isEmpty()); | ||
Michal Klocek
|
r2408 | |||
Miikka Heikkinen
|
r2483 | AbstractDomain *domain = series.first()->d_ptr->domain(); | ||
Titta Heikkala
|
r2712 | min = (orientation == Qt::Vertical) ? domain->minY() : domain->minX(); | ||
max = (orientation == Qt::Vertical) ? domain->maxY() : domain->maxX(); | ||||
Michal Klocek
|
r2408 | |||
Miikka Heikkinen
|
r2483 | for (int i = 1; i< series.size(); i++) { | ||
AbstractDomain *domain = series[i]->d_ptr->domain(); | ||||
Titta Heikkala
|
r2712 | min = qMin((orientation == Qt::Vertical) ? domain->minY() : domain->minX(), min); | ||
max = qMax((orientation == Qt::Vertical) ? domain->maxY() : domain->maxX(), max); | ||||
} | ||||
Mika Salmela
|
r2414 | if (min == max) { | ||
min -= 0.5; | ||||
max += 0.5; | ||||
} | ||||
Michal Klocek
|
r2408 | } | ||
Michal Klocek
|
r2284 | void ChartDataSet::deleteAllSeries() | ||
sauimone
|
r1554 | { | ||
Michal Klocek
|
r2284 | foreach (QAbstractSeries *s , m_seriesList){ | ||
Michal Klocek
|
r2273 | removeSeries(s); | ||
Michal Klocek
|
r2299 | s->deleteLater(); | ||
Michal Klocek
|
r2284 | } | ||
Michal Klocek
|
r2273 | Q_ASSERT(m_seriesList.count() == 0); | ||
sauimone
|
r1554 | } | ||
Michal Klocek
|
r2284 | void ChartDataSet::deleteAllAxes() | ||
Michal Klocek
|
r223 | { | ||
Michal Klocek
|
r2284 | foreach (QAbstractAxis *a , m_axisList){ | ||
Michal Klocek
|
r2273 | removeAxis(a); | ||
Michal Klocek
|
r2299 | a->deleteLater(); | ||
Michal Klocek
|
r2284 | } | ||
Michal Klocek
|
r2273 | Q_ASSERT(m_axisList.count() == 0); | ||
Michal Klocek
|
r223 | } | ||
Michal Klocek
|
r2273 | void ChartDataSet::zoomInDomain(const QRectF &rect) | ||
sauimone
|
r1554 | { | ||
Marek Rosa
|
r2275 | QList<AbstractDomain*> domains; | ||
Michal Klocek
|
r2273 | foreach(QAbstractSeries *s, m_seriesList) { | ||
Michal Klocek
|
r2285 | AbstractDomain* domain = s->d_ptr->domain(); | ||
Michal Klocek
|
r2289 | s->d_ptr->m_domain->blockRangeSignals(true); | ||
Michal Klocek
|
r2273 | domains<<domain; | ||
Michal Klocek
|
r1699 | } | ||
Marek Rosa
|
r2275 | foreach(AbstractDomain *domain, domains) | ||
Michal Klocek
|
r2273 | domain->zoomIn(rect); | ||
Michal Klocek
|
r1564 | |||
Marek Rosa
|
r2275 | foreach(AbstractDomain *domain, domains) | ||
Michal Klocek
|
r2289 | domain->blockRangeSignals(false); | ||
Michal Klocek
|
r2273 | } | ||
Michal Klocek
|
r1564 | |||
Michal Klocek
|
r2273 | void ChartDataSet::zoomOutDomain(const QRectF &rect) | ||
{ | ||||
Marek Rosa
|
r2275 | QList<AbstractDomain*> domains; | ||
Michal Klocek
|
r2273 | foreach(QAbstractSeries *s, m_seriesList) { | ||
Michal Klocek
|
r2285 | AbstractDomain* domain = s->d_ptr->domain(); | ||
Michal Klocek
|
r2289 | s->d_ptr->m_domain->blockRangeSignals(true); | ||
Michal Klocek
|
r2273 | domains<<domain; | ||
Michal Klocek
|
r1564 | } | ||
Marek Rosa
|
r2275 | foreach(AbstractDomain *domain, domains) | ||
Michal Klocek
|
r2273 | domain->zoomOut(rect); | ||
Michal Klocek
|
r1564 | |||
Marek Rosa
|
r2275 | foreach(AbstractDomain *domain, domains) | ||
Michal Klocek
|
r2289 | domain->blockRangeSignals(false); | ||
Michal Klocek
|
r2273 | } | ||
Tero Ahola
|
r1813 | |||
Miikka Heikkinen
|
r2545 | 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; | ||||
} | ||||
Michal Klocek
|
r2273 | void ChartDataSet::scrollDomain(qreal dx, qreal dy) | ||
{ | ||||
Marek Rosa
|
r2275 | QList<AbstractDomain*> domains; | ||
Michal Klocek
|
r2273 | foreach(QAbstractSeries *s, m_seriesList) { | ||
Michal Klocek
|
r2289 | AbstractDomain* domain = s->d_ptr->domain(); | ||
s->d_ptr->m_domain->blockRangeSignals(true); | ||||
Michal Klocek
|
r2273 | domains<<domain; | ||
Michal Klocek
|
r1577 | } | ||
Michal Klocek
|
r1564 | |||
Marek Rosa
|
r2275 | foreach(AbstractDomain *domain, domains) | ||
Michal Klocek
|
r2273 | domain->move(dx, dy); | ||
Michal Klocek
|
r1564 | |||
Marek Rosa
|
r2275 | foreach(AbstractDomain *domain, domains) | ||
Michal Klocek
|
r2289 | domain->blockRangeSignals(false); | ||
Michal Klocek
|
r1542 | } | ||
Marek Rosa
|
r2344 | QPointF ChartDataSet::mapToValue(const QPointF &position, QAbstractSeries *series) | ||
{ | ||||
QPointF point; | ||||
if (series == 0 && !m_seriesList.isEmpty()) | ||||
series = m_seriesList.first(); | ||||
Marek Rosa
|
r2351 | if (series && series->type() == QAbstractSeries::SeriesTypePie) | ||
return point; | ||||
Marek Rosa
|
r2344 | if (series && m_seriesList.contains(series)) | ||
Marek Rosa
|
r2351 | point = series->d_ptr->m_domain->calculateDomainPoint(position - m_chart->plotArea().topLeft()); | ||
Marek Rosa
|
r2344 | return point; | ||
} | ||||
QPointF ChartDataSet::mapToPosition(const QPointF &value, QAbstractSeries *series) | ||||
{ | ||||
QPointF point = m_chart->plotArea().topLeft(); | ||||
if (series == 0 && !m_seriesList.isEmpty()) | ||||
series = m_seriesList.first(); | ||||
Marek Rosa
|
r2351 | if (series && series->type() == QAbstractSeries::SeriesTypePie) | ||
return QPoint(0, 0); | ||||
Marek Rosa
|
r2356 | bool ok; | ||
Marek Rosa
|
r2344 | if (series && m_seriesList.contains(series)) | ||
Marek Rosa
|
r2356 | point += series->d_ptr->m_domain->calculateGeometryPoint(value, ok); | ||
Marek Rosa
|
r2344 | return point; | ||
} | ||||
Miikka Heikkinen
|
r2483 | QList<QAbstractAxis *> ChartDataSet::axes() const | ||
Michal Klocek
|
r531 | { | ||
Michal Klocek
|
r2273 | return m_axisList; | ||
Michal Klocek
|
r1078 | } | ||
Jani Honkonen
|
r2104 | QList<QAbstractSeries *> ChartDataSet::series() const | ||
Michal Klocek
|
r1078 | { | ||
Michal Klocek
|
r2273 | return m_seriesList; | ||
Michal Klocek
|
r531 | } | ||
Michal Klocek
|
r2273 | |||
Miikka Heikkinen
|
r2483 | AbstractDomain::DomainType ChartDataSet::selectDomain(QList<QAbstractAxis *> axes) | ||
Michal Klocek
|
r2284 | { | ||
enum Type { | ||||
Michal Klocek
|
r2288 | Undefined = 0, | ||
Michal Klocek
|
r2284 | LogType = 0x1, | ||
ValueType = 0x2 | ||||
}; | ||||
Michal Klocek
|
r2288 | int horizontal(Undefined); | ||
int vertical(Undefined); | ||||
Michal Klocek
|
r2284 | |||
Miikka Heikkinen
|
r2483 | // Assume cartesian chart type, unless chart is set | ||
QChart::ChartType chartType(QChart::ChartTypeCartesian); | ||||
if (m_chart) | ||||
chartType = m_chart->chartType(); | ||||
Michal Klocek
|
r2288 | |||
Miikka Heikkinen
|
r2483 | foreach (QAbstractAxis *axis, axes) | ||
{ | ||||
switch (axis->type()) { | ||||
case QAbstractAxis::AxisTypeLogValue: | ||||
if (axis->orientation() == Qt::Horizontal) | ||||
horizontal |= LogType; | ||||
if (axis->orientation() == Qt::Vertical) | ||||
vertical |= LogType; | ||||
Michal Klocek
|
r2284 | break; | ||
Miikka Heikkinen
|
r2483 | case QAbstractAxis::AxisTypeValue: | ||
case QAbstractAxis::AxisTypeBarCategory: | ||||
case QAbstractAxis::AxisTypeCategory: | ||||
case QAbstractAxis::AxisTypeDateTime: | ||||
if (axis->orientation() == Qt::Horizontal) | ||||
horizontal |= ValueType; | ||||
if (axis->orientation() == Qt::Vertical) | ||||
vertical |= ValueType; | ||||
Michal Klocek
|
r2284 | break; | ||
Miikka Heikkinen
|
r2483 | default: | ||
qWarning() << "Undefined type"; | ||||
Michal Klocek
|
r2284 | break; | ||
} | ||||
} | ||||
Miikka Heikkinen
|
r2483 | if (vertical == Undefined) | ||
vertical = ValueType; | ||||
if (horizontal == Undefined) | ||||
horizontal = ValueType; | ||||
Michal Klocek
|
r2288 | |||
Miikka Heikkinen
|
r2483 | if (vertical == ValueType && horizontal == ValueType) { | ||
if (chartType == QChart::ChartTypeCartesian) | ||||
return AbstractDomain::XYDomain; | ||||
else if (chartType == QChart::ChartTypePolar) | ||||
return AbstractDomain::XYPolarDomain; | ||||
Michal Klocek
|
r2284 | } | ||
Miikka Heikkinen
|
r2483 | if (vertical == LogType && horizontal == ValueType) { | ||
if (chartType == QChart::ChartTypeCartesian) | ||||
return AbstractDomain::XLogYDomain; | ||||
if (chartType == QChart::ChartTypePolar) | ||||
return AbstractDomain::XLogYPolarDomain; | ||||
Michal Klocek
|
r2284 | } | ||
Miikka Heikkinen
|
r2483 | if (vertical == ValueType && horizontal == LogType) { | ||
if (chartType == QChart::ChartTypeCartesian) | ||||
return AbstractDomain::LogXYDomain; | ||||
else if (chartType == QChart::ChartTypePolar) | ||||
return AbstractDomain::LogXYPolarDomain; | ||||
Michal Klocek
|
r2284 | } | ||
Miikka Heikkinen
|
r2483 | if (vertical == LogType && horizontal == LogType) { | ||
if (chartType == QChart::ChartTypeCartesian) | ||||
return AbstractDomain::LogXLogYDomain; | ||||
else if (chartType == QChart::ChartTypePolar) | ||||
return AbstractDomain::LogXLogYPolarDomain; | ||||
Michal Klocek
|
r2284 | } | ||
return AbstractDomain::UndefinedDomain; | ||||
} | ||||
//refactor create factory | ||||
AbstractDomain* ChartDataSet::createDomain(AbstractDomain::DomainType type) | ||||
{ | ||||
Miikka Heikkinen
|
r2483 | switch (type) | ||
{ | ||||
case AbstractDomain::LogXLogYDomain: | ||||
return new LogXLogYDomain(); | ||||
case AbstractDomain::XYDomain: | ||||
return new XYDomain(); | ||||
case AbstractDomain::XLogYDomain: | ||||
return new XLogYDomain(); | ||||
case AbstractDomain::LogXYDomain: | ||||
return new LogXYDomain(); | ||||
case AbstractDomain::XYPolarDomain: | ||||
return new XYPolarDomain(); | ||||
case AbstractDomain::XLogYPolarDomain: | ||||
return new XLogYPolarDomain(); | ||||
case AbstractDomain::LogXYPolarDomain: | ||||
return new LogXYPolarDomain(); | ||||
case AbstractDomain::LogXLogYPolarDomain: | ||||
return new LogXLogYPolarDomain(); | ||||
default: | ||||
return 0; | ||||
} | ||||
Michal Klocek
|
r2284 | } | ||
Michal Klocek
|
r131 | #include "moc_chartdataset_p.cpp" | ||
Titta Heikkala
|
r2712 | QT_CHARTS_END_NAMESPACE | ||