qchart.cpp
665 lines
| 18.5 KiB
| text/x-c
|
CppLexer
/ src / qchart.cpp
Michal Klocek
|
r746 | /**************************************************************************** | ||
** | ||||
** Copyright (C) 2012 Digia Plc | ||||
** All rights reserved. | ||||
** For any questions to Digia, please use contact form at http://qt.digia.com | ||||
** | ||||
** This file is part of the Qt Commercial Charts Add-on. | ||||
** | ||||
** $QT_BEGIN_LICENSE$ | ||||
** Licensees holding valid Qt Commercial licenses may use this file in | ||||
** accordance with the Qt Commercial License Agreement provided with the | ||||
** Software or, alternatively, in accordance with the terms contained in | ||||
** a written agreement between you and Digia. | ||||
** | ||||
** If you have questions regarding the use of this file, please use | ||||
** contact form at http://qt.digia.com | ||||
** $QT_END_LICENSE$ | ||||
** | ||||
****************************************************************************/ | ||||
Michal Klocek
|
r12 | #include "qchart.h" | ||
Michal Klocek
|
r740 | #include "qchart_p.h" | ||
Michal Klocek
|
r950 | #include "legendscroller_p.h" | ||
#include "qlegend_p.h" | ||||
Michal Klocek
|
r1006 | #include "chartbackground_p.h" | ||
Michal Klocek
|
r1541 | #include "qabstractaxis.h" | ||
Michal Klocek
|
r2105 | #include "chartlayout_p.h" | ||
Michal Klocek
|
r2273 | #include "charttheme_p.h" | ||
#include "chartpresenter_p.h" | ||||
#include "chartdataset_p.h" | ||||
Tero Ahola
|
r42 | #include <QGraphicsScene> | ||
Michal Klocek
|
r115 | #include <QGraphicsSceneResizeEvent> | ||
Michal Klocek
|
r12 | |||
Marek Rosa
|
r277 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||
/*! | ||||
Michal Klocek
|
r740 | \enum QChart::ChartTheme | ||
Marek Rosa
|
r277 | |||
Michal Klocek
|
r740 | This enum describes the theme used by the chart. | ||
Marek Rosa
|
r277 | |||
Tero Ahola
|
r853 | \value ChartThemeLight The default theme | ||
Michal Klocek
|
r740 | \value ChartThemeBlueCerulean | ||
\value ChartThemeDark | ||||
\value ChartThemeBrownSand | ||||
\value ChartThemeBlueNcs | ||||
Tero Ahola
|
r757 | \value ChartThemeHighContrast | ||
\value ChartThemeBlueIcy | ||||
Michal Klocek
|
r740 | */ | ||
Marek Rosa
|
r277 | |||
Tero Ahola
|
r302 | /*! | ||
Michal Klocek
|
r740 | \enum QChart::AnimationOption | ||
Tero Ahola
|
r302 | |||
Michal Klocek
|
r740 | For enabling/disabling animations. Defaults to NoAnimation. | ||
Tero Ahola
|
r302 | |||
Michal Klocek
|
r740 | \value NoAnimation | ||
\value GridAxisAnimations | ||||
\value SeriesAnimations | ||||
\value AllAnimations | ||||
*/ | ||||
Tero Ahola
|
r302 | |||
Tero Ahola
|
r264 | /*! | ||
Michal Klocek
|
r740 | \class QChart | ||
\brief QtCommercial chart API. | ||||
Tero Ahola
|
r264 | |||
Michal Klocek
|
r740 | QChart is a QGraphicsWidget that you can show in a QGraphicsScene. It manages the graphical | ||
Jani Honkonen
|
r1023 | representation of different types of series and other chart related objects like | ||
QAxis and QLegend. If you simply want to show a chart in a layout, you can use the | ||||
Michal Klocek
|
r740 | convenience class QChartView instead of QChart. | ||
\sa QChartView | ||||
*/ | ||||
Tero Ahola
|
r264 | |||
Tero Ahola
|
r1526 | /*! | ||
\property QChart::animationOptions | ||||
The animation \a options for the chart. Animations are enabled/disabled based on this setting. | ||||
*/ | ||||
/*! | ||||
\property QChart::backgroundVisible | ||||
Whether the chart background is visible or not. | ||||
\sa setBackgroundBrush(), setBackgroundPen() | ||||
*/ | ||||
/*! | ||||
\property QChart::dropShadowEnabled | ||||
If set to true, the background drop shadow effect is enabled. If set to false, it is disabled. Note that the drop | ||||
shadow effect depends on theme, which means the setting may be changed if you switch to another theme. | ||||
*/ | ||||
/*! | ||||
sauimone
|
r1982 | \property QChart::minimumMargins | ||
Minimum margins between the plot area (axes) and the edge of the chart widget. | ||||
Tero Ahola
|
r1526 | */ | ||
Tero Ahola
|
r2360 | /*! | ||
\property QChart::margins | ||||
Minimum between the plot area (axes) and the edge of the chart widget. | ||||
*/ | ||||
Tero Ahola
|
r1526 | /*! | ||
\property QChart::theme | ||||
Theme is a built-in collection of UI style related settings applied for all visual elements of a chart, like colors, | ||||
pens, brushes and fonts of series, axes, title and legend. \l {Chart themes demo} shows an example with a few | ||||
different themes. | ||||
Note: changing the theme will overwrite all customizations previously applied to the series. | ||||
*/ | ||||
/*! | ||||
\property QChart::title | ||||
Title is the name (label) of a chart. It is shown as a headline on top of the chart. | ||||
*/ | ||||
Tero Ahola
|
r264 | /*! | ||
Michal Klocek
|
r740 | Constructs a chart object which is a child of a\a parent. Parameter \a wFlags is passed to the QGraphicsWidget constructor. | ||
*/ | ||||
Jani Honkonen
|
r2131 | QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) | ||
: QGraphicsWidget(parent, wFlags), | ||||
Michal Klocek
|
r2273 | d_ptr(new QChartPrivate(this)) | ||
Michal Klocek
|
r12 | { | ||
Michal Klocek
|
r950 | d_ptr->m_legend = new LegendScroller(this); | ||
Michal Klocek
|
r2273 | setTheme(QChart::ChartThemeLight); | ||
Michal Klocek
|
r2407 | //TODO: what is that ? | ||
//connect(d_ptr->m_presenter, SIGNAL(marginsChanged(QRectF)), this, SIGNAL(marginsChanged(QRectF))); | ||||
Michal Klocek
|
r1534 | setLayout(d_ptr->m_presenter->layout()); | ||
Michal Klocek
|
r12 | } | ||
Tero Ahola
|
r264 | /*! | ||
Jani Honkonen
|
r1023 | Destroys the object and it's children, like series and axis objects added to it. | ||
Michal Klocek
|
r740 | */ | ||
Tero Ahola
|
r264 | QChart::~QChart() | ||
{ | ||||
Michal Klocek
|
r2273 | //start by deleting dataset, it will remove all series and axes | ||
delete d_ptr->m_dataset; | ||||
d_ptr->m_dataset = 0; | ||||
Tero Ahola
|
r264 | } | ||
Michal Klocek
|
r12 | |||
Tero Ahola
|
r264 | /*! | ||
sauimone
|
r1575 | Adds the \a series onto the chart and takes the ownership of the object. | ||
Michal Klocek
|
r740 | If auto scaling is enabled, re-scales the axes the series is bound to (both the x axis and | ||
the y axis). | ||||
Jani Honkonen
|
r1316 | |||
\sa removeSeries(), removeAllSeries() | ||||
Michal Klocek
|
r740 | */ | ||
Michal Klocek
|
r1541 | void QChart::addSeries(QAbstractSeries *series) | ||
Michal Klocek
|
r223 | { | ||
Michal Klocek
|
r895 | Q_ASSERT(series); | ||
Michal Klocek
|
r1541 | d_ptr->m_dataset->addSeries(series); | ||
Michal Klocek
|
r223 | } | ||
Tero Ahola
|
r42 | |||
Marek Rosa
|
r274 | /*! | ||
Michal Klocek
|
r740 | Removes the \a series specified in a perameter from the QChartView. | ||
It releses its ownership of the specified QChartSeries object. | ||||
It does not delete the pointed QChartSeries data object | ||||
\sa addSeries(), removeAllSeries() | ||||
*/ | ||||
Tero Ahola
|
r988 | void QChart::removeSeries(QAbstractSeries *series) | ||
Michal Klocek
|
r223 | { | ||
Michal Klocek
|
r895 | Q_ASSERT(series); | ||
Michal Klocek
|
r740 | d_ptr->m_dataset->removeSeries(series); | ||
Tero Ahola
|
r42 | } | ||
Tero Ahola
|
r48 | |||
Marek Rosa
|
r274 | /*! | ||
Michal Klocek
|
r740 | Removes all the QChartSeries that have been added to the QChartView | ||
It also deletes the pointed QChartSeries data objects | ||||
\sa addSeries(), removeSeries() | ||||
*/ | ||||
Michal Klocek
|
r258 | void QChart::removeAllSeries() | ||
{ | ||||
Michal Klocek
|
r2284 | foreach (QAbstractSeries *s , d_ptr->m_dataset->series()){ | ||
removeSeries(s); | ||||
delete s; | ||||
} | ||||
Michal Klocek
|
r258 | } | ||
Marek Rosa
|
r287 | /*! | ||
Michal Klocek
|
r740 | Sets the \a brush that is used for painting the background of the chart area. | ||
*/ | ||||
Jani Honkonen
|
r2131 | void QChart::setBackgroundBrush(const QBrush &brush) | ||
Michal Klocek
|
r122 | { | ||
Michal Klocek
|
r1534 | d_ptr->m_presenter->setBackgroundBrush(brush); | ||
Michal Klocek
|
r122 | } | ||
Marek Rosa
|
r924 | /*! | ||
Gets the brush that is used for painting the background of the chart area. | ||||
*/ | ||||
Michal Klocek
|
r645 | QBrush QChart::backgroundBrush() const | ||
{ | ||||
Michal Klocek
|
r1534 | return d_ptr->m_presenter->backgroundBrush(); | ||
Michal Klocek
|
r645 | } | ||
Marek Rosa
|
r287 | /*! | ||
Michal Klocek
|
r740 | Sets the \a pen that is used for painting the background of the chart area. | ||
*/ | ||||
Jani Honkonen
|
r2131 | void QChart::setBackgroundPen(const QPen &pen) | ||
Michal Klocek
|
r122 | { | ||
Michal Klocek
|
r1534 | d_ptr->m_presenter->setBackgroundPen(pen); | ||
Michal Klocek
|
r122 | } | ||
Marek Rosa
|
r924 | /*! | ||
Gets the pen that is used for painting the background of the chart area. | ||||
*/ | ||||
Michal Klocek
|
r645 | QPen QChart::backgroundPen() const | ||
{ | ||||
Michal Klocek
|
r1534 | return d_ptr->m_presenter->backgroundPen(); | ||
Michal Klocek
|
r645 | } | ||
Marek Rosa
|
r274 | /*! | ||
Michal Klocek
|
r740 | Sets the chart \a title. The description text that is drawn above the chart. | ||
*/ | ||||
Jani Honkonen
|
r2131 | void QChart::setTitle(const QString &title) | ||
Michal Klocek
|
r69 | { | ||
Michal Klocek
|
r1534 | d_ptr->m_presenter->setTitle(title); | ||
Michal Klocek
|
r476 | } | ||
/*! | ||||
Michal Klocek
|
r740 | Returns the chart title. The description text that is drawn above the chart. | ||
*/ | ||||
Michal Klocek
|
r645 | QString QChart::title() const | ||
Michal Klocek
|
r476 | { | ||
Michal Klocek
|
r1534 | return d_ptr->m_presenter->title(); | ||
Michal Klocek
|
r192 | } | ||
Marek Rosa
|
r274 | /*! | ||
Marek Rosa
|
r924 | Sets the \a font that is used for drawing the chart description text that is rendered above the chart. | ||
Michal Klocek
|
r740 | */ | ||
Jani Honkonen
|
r2131 | void QChart::setTitleFont(const QFont &font) | ||
Michal Klocek
|
r192 | { | ||
Michal Klocek
|
r1534 | d_ptr->m_presenter->setTitleFont(font); | ||
Michal Klocek
|
r69 | } | ||
Marek Rosa
|
r924 | /*! | ||
Gets the font that is used for drawing the chart description text that is rendered above the chart. | ||||
*/ | ||||
Michal Klocek
|
r895 | QFont QChart::titleFont() const | ||
{ | ||||
Michal Klocek
|
r1534 | return d_ptr->m_presenter->titleFont(); | ||
Michal Klocek
|
r895 | } | ||
Tero Ahola
|
r495 | /*! | ||
Michal Klocek
|
r740 | Sets the \a brush used for rendering the title text. | ||
*/ | ||||
Michal Klocek
|
r645 | void QChart::setTitleBrush(const QBrush &brush) | ||
Tero Ahola
|
r495 | { | ||
Michal Klocek
|
r1534 | d_ptr->m_presenter->setTitleBrush(brush); | ||
Tero Ahola
|
r495 | } | ||
/*! | ||||
Michal Klocek
|
r740 | Returns the brush used for rendering the title text. | ||
*/ | ||||
Michal Klocek
|
r645 | QBrush QChart::titleBrush() const | ||
Tero Ahola
|
r495 | { | ||
Michal Klocek
|
r1534 | return d_ptr->m_presenter->titleBrush(); | ||
Michal Klocek
|
r223 | } | ||
Michal Klocek
|
r740 | void QChart::setTheme(QChart::ChartTheme theme) | ||
Tero Ahola
|
r64 | { | ||
Michal Klocek
|
r2273 | d_ptr->m_themeManager->setTheme(theme); | ||
Tero Ahola
|
r64 | } | ||
Michal Klocek
|
r740 | QChart::ChartTheme QChart::theme() const | ||
Tero Ahola
|
r120 | { | ||
Michal Klocek
|
r2273 | return d_ptr->m_themeManager->theme()->id(); | ||
Tero Ahola
|
r120 | } | ||
Marek Rosa
|
r285 | /*! | ||
Michal Klocek
|
r740 | Zooms in the view by a factor of 2 | ||
*/ | ||||
Michal Klocek
|
r223 | void QChart::zoomIn() | ||
Michal Klocek
|
r67 | { | ||
Michal Klocek
|
r2273 | d_ptr->zoomIn(2.0); | ||
Michal Klocek
|
r67 | } | ||
Marek Rosa
|
r285 | /*! | ||
Michal Klocek
|
r740 | Zooms in the view to a maximum level at which \a rect is still fully visible. | ||
*/ | ||||
Jani Honkonen
|
r2131 | void QChart::zoomIn(const QRectF &rect) | ||
Michal Klocek
|
r67 | { | ||
Marek Rosa
|
r2344 | d_ptr->zoomIn(rect); | ||
Michal Klocek
|
r67 | } | ||
Marek Rosa
|
r285 | /*! | ||
Michal Klocek
|
r740 | Restores the view zoom level to the previous one. | ||
*/ | ||||
Michal Klocek
|
r67 | void QChart::zoomOut() | ||
{ | ||||
Michal Klocek
|
r2273 | d_ptr->zoomOut(2.0); | ||
Jani Honkonen
|
r1187 | } | ||
/*! | ||||
Zooms in the view by a \a factor. | ||||
A factor over 1.0 zooms the view in and factor between 0.0 and 1.0 zooms out. | ||||
*/ | ||||
void QChart::zoom(qreal factor) | ||||
{ | ||||
Marek Rosa
|
r2242 | if (qFuzzyCompare(factor, 0)) | ||
Jani Honkonen
|
r1187 | return; | ||
Marek Rosa
|
r1679 | if (qFuzzyCompare(factor, (qreal)1.0)) | ||
Jani Honkonen
|
r1187 | return; | ||
if (factor < 0) | ||||
return; | ||||
if (factor > 1.0) | ||||
Michal Klocek
|
r2273 | d_ptr->zoomIn(factor); | ||
Jani Honkonen
|
r1187 | else | ||
Michal Klocek
|
r2273 | d_ptr->zoomOut(1.0 / factor); | ||
Michal Klocek
|
r67 | } | ||
Marek Rosa
|
r277 | /*! | ||
Marek Rosa
|
r1633 | Returns the pointer to the x axis object of the chart asociated with the specified \a series | ||
Marek Rosa
|
r1638 | If no series is provided then pointer to currently visible axis is provided | ||
Michal Klocek
|
r740 | */ | ||
Jani Honkonen
|
r2131 | QAbstractAxis *QChart::axisX(QAbstractSeries *series) const | ||
Michal Klocek
|
r176 | { | ||
Tero Ahola
|
r2384 | QList<QAbstractAxis *> axisList = axes(Qt::Horizontal, series); | ||
if (axisList.count()) | ||||
return axisList[0]; | ||||
return 0; | ||||
Michal Klocek
|
r176 | } | ||
Marek Rosa
|
r277 | /*! | ||
Marek Rosa
|
r1633 | Returns the pointer to the y axis object of the chart asociated with the specified \a series | ||
Marek Rosa
|
r1638 | If no series is provided then pointer to currently visible axis is provided | ||
Michal Klocek
|
r740 | */ | ||
Jani Honkonen
|
r2131 | QAbstractAxis *QChart::axisY(QAbstractSeries *series) const | ||
Michal Klocek
|
r176 | { | ||
Tero Ahola
|
r2384 | QList<QAbstractAxis *> axisList = axes(Qt::Vertical, series); | ||
if (axisList.count()) | ||||
return axisList[0]; | ||||
return 0; | ||||
Michal Klocek
|
r2273 | } | ||
Tero Ahola
|
r2360 | /*! | ||
Tero Ahola
|
r2384 | Returns the axes added for the \a series with \a orientation. If no series is provided, then all axes with the | ||
specified orientation are returned. | ||||
Tero Ahola
|
r2360 | \sa addAxis(), createDefaultAxes() | ||
*/ | ||||
Michal Klocek
|
r2273 | QList<QAbstractAxis *> QChart::axes(Qt::Orientations orientation, QAbstractSeries *series) const | ||
{ | ||||
QList<QAbstractAxis *> result ; | ||||
Tero Ahola
|
r2296 | if (series) { | ||
foreach (QAbstractAxis *axis, series->attachedAxes()){ | ||||
if (orientation.testFlag(axis->orientation())) | ||||
result << axis; | ||||
} | ||||
} else { | ||||
Tero Ahola
|
r2384 | foreach (QAbstractAxis *axis, d_ptr->m_dataset->axes()){ | ||
if (orientation.testFlag(axis->orientation()) && !result.contains(axis)) | ||||
result << axis; | ||||
Tero Ahola
|
r2296 | } | ||
Michal Klocek
|
r2273 | } | ||
return result; | ||||
Michal Klocek
|
r85 | } | ||
Marek Rosa
|
r1633 | /*! | ||
NOTICE: This function has to be called after series has been added to the chart if no customized axes are set to the chart. Otherwise axisX(), axisY() calls return NULL. | ||||
Creates the axes for the chart based on the series that has already been added to the chart. | ||||
Marek Rosa
|
r1638 | |||
\table | ||||
\header | ||||
\o Series type | ||||
\o X-axis | ||||
\o Y-axis | ||||
\row | ||||
\o QXYSeries | ||||
Marek Rosa
|
r1804 | \o QValueAxis | ||
\o QValueAxis | ||||
Marek Rosa
|
r1638 | \row | ||
\o QBarSeries | ||||
Marek Rosa
|
r1809 | \o QBarCategoryAxis | ||
Marek Rosa
|
r1804 | \o QValueAxis | ||
Marek Rosa
|
r1638 | \row | ||
\o QPieSeries | ||||
\o None | ||||
\o None | ||||
\endtable | ||||
Marek Rosa
|
r1633 | If there are several QXYSeries derived series added to the chart and no other series type has been added then only one pair of axes is created. | ||
If there are sevaral series added of different types then each series gets its own axes pair. | ||||
NOTICE: if there is more than one x and y axes created then no axis is drawn by default and one needs to choose explicitly which axis should be shown. | ||||
Axis specifix to the series can be later obtained from the chart by providing the series as the parameter of axisX(), axisY() function calls. | ||||
QPieSeries does not create any axes. | ||||
\sa axisX(), axisY(), setAxisX(), setAxisY() | ||||
*/ | ||||
Michal Klocek
|
r1577 | void QChart::createDefaultAxes() | ||
{ | ||||
Jani Honkonen
|
r2131 | d_ptr->m_dataset->createDefaultAxes(); | ||
Michal Klocek
|
r1577 | } | ||
sauimone
|
r524 | /*! | ||
Michal Klocek
|
r740 | Returns the legend object of the chart. Ownership stays in chart. | ||
*/ | ||||
Jani Honkonen
|
r2131 | QLegend *QChart::legend() const | ||
sauimone
|
r524 | { | ||
sauimone
|
r783 | return d_ptr->m_legend; | ||
sauimone
|
r524 | } | ||
Jani Honkonen
|
r2272 | /*! | ||
Sets the minimum \a margins between the plot area (axes) and the edge of the chart widget. | ||||
Deprecated. Use setMargins(). | ||||
*/ | ||||
void QChart::setMinimumMargins(const QMargins &margins) | ||||
{ | ||||
qWarning() << "QChart::setMinimumMargins is deprecated. Use QChart::setMargins instead."; | ||||
d_ptr->m_presenter->layout()->setMargins(margins); | ||||
} | ||||
/*! | ||||
Returns the rect that contains information about margins (distance between chart widget edge and axes). | ||||
Individual margins can be obtained by calling left, top, right, bottom on the returned rect. | ||||
Deprecated. Use margins(). | ||||
*/ | ||||
QMargins QChart::minimumMargins() const | ||||
{ | ||||
qWarning() << "QChart::minimumMargins is deprecated. Use QChart::margins instead."; | ||||
return d_ptr->m_presenter->layout()->margins(); | ||||
} | ||||
Michal Klocek
|
r1883 | /*! | ||
Sets the minimum \a margins between the plot area (axes) and the edge of the chart widget. | ||||
*/ | ||||
Jani Honkonen
|
r2131 | void QChart::setMargins(const QMargins &margins) | ||
Michal Klocek
|
r1883 | { | ||
Michal Klocek
|
r2105 | d_ptr->m_presenter->layout()->setMargins(margins); | ||
Michal Klocek
|
r1883 | } | ||
Marek Rosa
|
r924 | /*! | ||
Returns the rect that contains information about margins (distance between chart widget edge and axes). | ||||
Individual margins can be obtained by calling left, top, right, bottom on the returned rect. | ||||
*/ | ||||
Michal Klocek
|
r1965 | QMargins QChart::margins() const | ||
sauimone
|
r803 | { | ||
Michal Klocek
|
r2105 | return d_ptr->m_presenter->layout()->margins(); | ||
sauimone
|
r803 | } | ||
Marek Rosa
|
r1657 | /*! | ||
Returns the the rect within which the drawing of the chart is done. | ||||
It does not include the area defines by margins. | ||||
*/ | ||||
Michal Klocek
|
r1648 | QRectF QChart::plotArea() const | ||
{ | ||||
Michal Klocek
|
r2273 | return d_ptr->m_presenter->geometry(); | ||
Michal Klocek
|
r1648 | } | ||
Michal Klocek
|
r2407 | ///*! | ||
// TODO: Dummy. | ||||
// Adjest the ranges of the axes so that all the data of the specified \a series is visible | ||||
// */ | ||||
//void QChart::adjustViewToSeries(QAbstractSeries* series) | ||||
//{ | ||||
// // | ||||
//} | ||||
Marek Rosa
|
r287 | /*! | ||
Michal Klocek
|
r1534 | Sets animation \a options for the chart | ||
Michal Klocek
|
r740 | */ | ||
Michal Klocek
|
r298 | void QChart::setAnimationOptions(AnimationOptions options) | ||
{ | ||||
Michal Klocek
|
r740 | d_ptr->m_presenter->setAnimationOptions(options); | ||
Michal Klocek
|
r298 | } | ||
QChart::AnimationOptions QChart::animationOptions() const | ||||
{ | ||||
Michal Klocek
|
r740 | return d_ptr->m_presenter->animationOptions(); | ||
Michal Klocek
|
r298 | } | ||
Jani Honkonen
|
r1187 | /*! | ||
sauimone
|
r1575 | Scrolls the visible area of the chart by the distance defined in the \a dx and \a dy. | ||
Jani Honkonen
|
r1187 | */ | ||
Michal Klocek
|
r1553 | void QChart::scroll(qreal dx, qreal dy) | ||
Jani Honkonen
|
r1187 | { | ||
Michal Klocek
|
r2273 | d_ptr->scroll(dx,dy); | ||
Jani Honkonen
|
r1187 | } | ||
Michal Klocek
|
r740 | void QChart::setBackgroundVisible(bool visible) | ||
{ | ||||
Michal Klocek
|
r1534 | d_ptr->m_presenter->setBackgroundVisible(visible); | ||
Michal Klocek
|
r740 | } | ||
sauimone
|
r716 | |||
Michal Klocek
|
r740 | bool QChart::isBackgroundVisible() const | ||
{ | ||||
Michal Klocek
|
r1534 | return d_ptr->m_presenter->isBackgroundVisible(); | ||
sauimone
|
r716 | } | ||
Tero Ahola
|
r1462 | void QChart::setDropShadowEnabled(bool enabled) | ||
Tero Ahola
|
r1001 | { | ||
Michal Klocek
|
r1534 | d_ptr->m_presenter->setBackgroundDropShadowEnabled(enabled); | ||
Tero Ahola
|
r1001 | } | ||
Tero Ahola
|
r1462 | bool QChart::isDropShadowEnabled() const | ||
Tero Ahola
|
r1001 | { | ||
Michal Klocek
|
r1534 | return d_ptr->m_presenter->isBackgroundDropShadowEnabled(); | ||
Tero Ahola
|
r1001 | } | ||
Jani Honkonen
|
r1316 | /*! | ||
Returns all the series that are added to the chart. | ||||
\sa addSeries(), removeSeries(), removeAllSeries() | ||||
*/ | ||||
Jani Honkonen
|
r2131 | QList<QAbstractSeries *> QChart::series() const | ||
Michal Klocek
|
r1107 | { | ||
return d_ptr->m_dataset->series(); | ||||
} | ||||
Michal Klocek
|
r1534 | |||
Marek Rosa
|
r1633 | /*! | ||
Sets \a axis to the chart, which will control the presentation of the \a series | ||||
\sa axisX(), axisY(), setAxisY(), createDefaultAxes() | ||||
*/ | ||||
Jani Honkonen
|
r2131 | void QChart::setAxisX(QAbstractAxis *axis , QAbstractSeries *series) | ||
Michal Klocek
|
r1541 | { | ||
Marek Rosa
|
r2344 | QList<QAbstractAxis*> list = axes(Qt::Horizontal,series); | ||
Michal Klocek
|
r2273 | |||
Marek Rosa
|
r2344 | foreach(QAbstractAxis* a, list){ | ||
Michal Klocek
|
r2278 | d_ptr->m_dataset->removeAxis(a); | ||
delete a; | ||||
Marek Rosa
|
r2344 | } | ||
Michal Klocek
|
r2273 | |||
Marek Rosa
|
r2344 | if(!d_ptr->m_dataset->axes().contains(axis)) | ||
d_ptr->m_dataset->addAxis(axis,Qt::AlignBottom); | ||||
d_ptr->m_dataset->attachAxis(series,axis); | ||||
Michal Klocek
|
r1541 | } | ||
Marek Rosa
|
r1633 | /*! | ||
Sets \a axis to the chart, which will control the presentation of the \a series | ||||
\sa axisX(), axisY(), setAxisX(), createDefaultAxes() | ||||
*/ | ||||
Jani Honkonen
|
r2131 | void QChart::setAxisY(QAbstractAxis *axis , QAbstractSeries *series) | ||
Michal Klocek
|
r1541 | { | ||
Michal Klocek
|
r2273 | QList<QAbstractAxis*> list = axes(Qt::Vertical,series); | ||
foreach(QAbstractAxis* a, list) { | ||||
Michal Klocek
|
r2278 | d_ptr->m_dataset->removeAxis(a); | ||
delete a; | ||||
Michal Klocek
|
r2273 | } | ||
if(!d_ptr->m_dataset->axes().contains(axis)) | ||||
Marek Rosa
|
r2344 | d_ptr->m_dataset->addAxis(axis,Qt::AlignLeft); | ||
Michal Klocek
|
r2273 | d_ptr->m_dataset->attachAxis(series,axis); | ||
} | ||||
Tero Ahola
|
r2360 | /*! | ||
Adds \a axis to the chart with \a alignment. The chart takes the ownership of the axis. | ||||
\sa removeAxis(), createDefaultAxes(), QAbstractSeries::attachAxis() | ||||
*/ | ||||
void QChart::addAxis(QAbstractAxis *axis, Qt::Alignment alignment) | ||||
Michal Klocek
|
r2273 | { | ||
Tero Ahola
|
r2360 | d_ptr->m_dataset->addAxis(axis, alignment); | ||
Michal Klocek
|
r2273 | } | ||
Tero Ahola
|
r2360 | /*! | ||
Removes \a axis from the chart. The ownership is returned to the caller. | ||||
\sa addAxis(), createDefaultAxes(), QAbstractSeries::detachAxis() | ||||
*/ | ||||
Michal Klocek
|
r2273 | void QChart::removeAxis(QAbstractAxis *axis) | ||
{ | ||||
Marek Rosa
|
r2344 | d_ptr->m_dataset->removeAxis(axis); | ||
} | ||||
Marek Rosa
|
r2357 | /*! | ||
Returns the value in the \a series domain that coresponds to the charts widget point defines by \a position. | ||||
*/ | ||||
Marek Rosa
|
r2344 | QPointF QChart::mapToValue(const QPointF &position, QAbstractSeries *series) | ||
{ | ||||
return d_ptr->m_dataset->mapToValue(position, series); | ||||
} | ||||
Marek Rosa
|
r2357 | /*! | ||
Returns the position on the charts widget that coresponds to the \a value in the \a series domain. | ||||
*/ | ||||
Marek Rosa
|
r2344 | QPointF QChart::mapToPosition(const QPointF &value, QAbstractSeries *series) | ||
{ | ||||
return d_ptr->m_dataset->mapToPosition(value, series); | ||||
Michal Klocek
|
r1541 | } | ||
Michal Klocek
|
r740 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
Michal Klocek
|
r639 | |||
Michal Klocek
|
r2273 | QChartPrivate::QChartPrivate(QChart *q): | ||
q_ptr(q), | ||||
Marek Rosa
|
r924 | m_legend(0), | ||
Michal Klocek
|
r2273 | m_dataset(new ChartDataSet(q)), | ||
m_presenter(new ChartPresenter(q)), | ||||
m_themeManager(new ChartThemeManager(q)) | ||||
Michal Klocek
|
r639 | { | ||
Michal Klocek
|
r2273 | QObject::connect(m_dataset, SIGNAL(seriesAdded(QAbstractSeries*)), m_presenter, SLOT(handleSeriesAdded(QAbstractSeries*))); | ||
QObject::connect(m_dataset, SIGNAL(seriesRemoved(QAbstractSeries*)), m_presenter, SLOT(handleSeriesRemoved(QAbstractSeries*))); | ||||
QObject::connect(m_dataset, SIGNAL(axisAdded(QAbstractAxis*)), m_presenter, SLOT(handleAxisAdded(QAbstractAxis*))); | ||||
QObject::connect(m_dataset, SIGNAL(axisRemoved(QAbstractAxis*)), m_presenter, SLOT(handleAxisRemoved(QAbstractAxis*))); | ||||
QObject::connect(m_dataset, SIGNAL(seriesAdded(QAbstractSeries*)), m_themeManager, SLOT(handleSeriesAdded(QAbstractSeries*))); | ||||
QObject::connect(m_dataset, SIGNAL(seriesRemoved(QAbstractSeries*)), m_themeManager, SLOT(handleSeriesRemoved(QAbstractSeries*))); | ||||
QObject::connect(m_dataset, SIGNAL(axisAdded(QAbstractAxis*)), m_themeManager, SLOT(handleAxisAdded(QAbstractAxis*))); | ||||
QObject::connect(m_dataset, SIGNAL(axisRemoved(QAbstractAxis*)), m_themeManager, SLOT(handleAxisRemoved(QAbstractAxis*))); | ||||
Michal Klocek
|
r639 | } | ||
Michal Klocek
|
r740 | QChartPrivate::~QChartPrivate() | ||
Michal Klocek
|
r639 | { | ||
Michal Klocek
|
r740 | |||
Michal Klocek
|
r639 | } | ||
Michal Klocek
|
r2273 | void QChartPrivate::zoomIn(qreal factor) | ||
Michal Klocek
|
r871 | { | ||
Michal Klocek
|
r2273 | QRectF rect = m_presenter->geometry(); | ||
rect.setWidth(rect.width() / factor); | ||||
rect.setHeight(rect.height() / factor); | ||||
rect.moveCenter(m_presenter->geometry().center()); | ||||
zoomIn(rect); | ||||
} | ||||
void QChartPrivate::zoomIn(const QRectF &rect) | ||||
{ | ||||
if (!rect.isValid()) | ||||
Marek Rosa
|
r2344 | return; | ||
Michal Klocek
|
r2273 | |||
QRectF r = rect.normalized(); | ||||
const QRectF geometry = m_presenter->geometry(); | ||||
r.translate(-geometry.topLeft()); | ||||
if (!r.isValid()) | ||||
return; | ||||
QPointF zoomPoint(r.center().x() / geometry.width(), r.center().y() / geometry.height()); | ||||
m_presenter->setState(ChartPresenter::ZoomInState,zoomPoint); | ||||
m_dataset->zoomInDomain(r); | ||||
m_presenter->setState(ChartPresenter::ShowState,QPointF()); | ||||
} | ||||
void QChartPrivate::zoomOut(qreal factor) | ||||
{ | ||||
const QRectF geometry = m_presenter->geometry(); | ||||
QRectF r; | ||||
r.setSize(geometry.size() / factor); | ||||
r.moveCenter(QPointF(geometry.size().width()/2 ,geometry.size().height()/2)); | ||||
if (!r.isValid()) | ||||
return; | ||||
QPointF zoomPoint(r.center().x() / geometry.width(), r.center().y() / geometry.height()); | ||||
m_presenter->setState(ChartPresenter::ZoomOutState,zoomPoint); | ||||
m_dataset->zoomOutDomain(r); | ||||
m_presenter->setState(ChartPresenter::ShowState,QPointF()); | ||||
} | ||||
void QChartPrivate::scroll(qreal dx, qreal dy) | ||||
{ | ||||
if (dx < 0) m_presenter->setState(ChartPresenter::ScrollLeftState,QPointF()); | ||||
if (dx > 0) m_presenter->setState(ChartPresenter::ScrollRightState,QPointF()); | ||||
if (dy < 0) m_presenter->setState(ChartPresenter::ScrollUpState,QPointF()); | ||||
if (dy > 0) m_presenter->setState(ChartPresenter::ScrollDownState,QPointF()); | ||||
m_dataset->scrollDomain(dx, dy); | ||||
m_presenter->setState(ChartPresenter::ShowState,QPointF()); | ||||
Michal Klocek
|
r871 | } | ||
Tero Ahola
|
r64 | #include "moc_qchart.cpp" | ||
Tero Ahola
|
r48 | |||
Tero Ahola
|
r30 | QTCOMMERCIALCHART_END_NAMESPACE | ||