qchart.cpp
360 lines
| 8.7 KiB
| text/x-c
|
CppLexer
/ src / qchart.cpp
Michal Klocek
|
r12 | #include "qchart.h" | ||
Michal Klocek
|
r85 | #include "qchartaxis.h" | ||
sauimone
|
r524 | #include "qlegend.h" | ||
Michal Klocek
|
r131 | #include "chartpresenter_p.h" | ||
#include "chartdataset_p.h" | ||||
Tero Ahola
|
r42 | #include <QGraphicsScene> | ||
Michal Klocek
|
r115 | #include <QGraphicsSceneResizeEvent> | ||
Michal Klocek
|
r21 | #include <QDebug> | ||
Michal Klocek
|
r12 | |||
Marek Rosa
|
r277 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||
/*! | ||||
\enum QChart::ChartTheme | ||||
This enum describes the theme used by the chart. | ||||
Tero Ahola
|
r581 | \value ChartThemeDefault Follows the GUI style of the Operating System | ||
Marek Rosa
|
r277 | \value ChartThemeVanilla | ||
\value ChartThemeIcy | ||||
\value ChartThemeGrayscale | ||||
\value ChartThemeScientific | ||||
Tero Ahola
|
r581 | \value ChartThemeBlueCerulean | ||
Tero Ahola
|
r584 | \value ChartThemeLight | ||
Tero Ahola
|
r581 | \value ChartThemeCount Not really a theme; the total count of themes. | ||
Marek Rosa
|
r277 | */ | ||
Tero Ahola
|
r302 | /*! | ||
\enum QChart::AnimationOption | ||||
For enabling/disabling animations. Defaults to NoAnimation. | ||||
\value NoAnimation | ||||
\value GridAxisAnimations | ||||
\value SeriesAnimations | ||||
\value AllAnimations | ||||
*/ | ||||
Tero Ahola
|
r264 | /*! | ||
\class QChart | ||||
\brief QtCommercial chart API. | ||||
QChart is a QGraphicsWidget that you can show in a QGraphicsScene. It manages the graphical | ||||
representation of different types of QChartSeries and other chart related objects like | ||||
QChartAxis and QChartLegend. If you simply want to show a chart in a layout, you can use the | ||||
convenience class QChartView instead of QChart. | ||||
Marek Rosa
|
r274 | \sa QChartView | ||
Tero Ahola
|
r264 | */ | ||
/*! | ||||
Marek Rosa
|
r287 | Constructs a chart object which is a child of a\a parent. Parameter \a wFlags is passed to the QGraphicsWidget constructor. | ||
Tero Ahola
|
r264 | */ | ||
Michal Klocek
|
r115 | QChart::QChart(QGraphicsItem *parent, Qt::WindowFlags wFlags) : QGraphicsWidget(parent,wFlags), | ||
Tero Ahola
|
r264 | m_backgroundItem(0), | ||
m_titleItem(0), | ||||
Tero Ahola
|
r550 | m_legend(new QLegend(this)), | ||
Tero Ahola
|
r264 | m_dataset(new ChartDataSet(this)), | ||
sauimone
|
r540 | m_presenter(new ChartPresenter(this,m_dataset)) | ||
Michal Klocek
|
r12 | { | ||
Tero Ahola
|
r550 | connect(m_dataset,SIGNAL(seriesAdded(QSeries*,Domain*)),m_legend,SLOT(handleSeriesAdded(QSeries*,Domain*))); | ||
connect(m_dataset,SIGNAL(seriesRemoved(QSeries*)),m_legend,SLOT(handleSeriesRemoved(QSeries*))); | ||||
Michal Klocek
|
r12 | } | ||
Tero Ahola
|
r264 | /*! | ||
Destroys the object and it's children, like QChartSeries and QChartAxis object added to it. | ||||
*/ | ||||
QChart::~QChart() | ||||
{ | ||||
Tero Ahola
|
r550 | disconnect(m_dataset,SIGNAL(seriesAdded(QSeries*,Domain*)),m_legend,SLOT(handleSeriesAdded(QSeries*,Domain*))); | ||
disconnect(m_dataset,SIGNAL(seriesRemoved(QSeries*)),m_legend,SLOT(handleSeriesRemoved(QSeries*))); | ||||
Tero Ahola
|
r264 | } | ||
Michal Klocek
|
r12 | |||
Tero Ahola
|
r264 | /*! | ||
Marek Rosa
|
r285 | Adds the \a series and optional \a axisY onto the chart and takes the ownership of the objects. | ||
Tero Ahola
|
r264 | If auto scaling is enabled, re-scales the axes the series is bound to (both the x axis and | ||
the y axis). | ||||
*/ | ||||
Michal Klocek
|
r360 | void QChart::addSeries(QSeries* series, QChartAxis* axisY) | ||
Michal Klocek
|
r223 | { | ||
Tero Ahola
|
r264 | m_dataset->addSeries(series, axisY); | ||
Michal Klocek
|
r223 | } | ||
Tero Ahola
|
r42 | |||
Marek Rosa
|
r274 | /*! | ||
Marek Rosa
|
r285 | Removes the \a series specified in a perameter from the QChartView. | ||
Marek Rosa
|
r274 | It releses its ownership of the specified QChartSeries object. | ||
It does not delete the pointed QChartSeries data object | ||||
Marek Rosa
|
r285 | \sa addSeries(), removeAllSeries() | ||
Marek Rosa
|
r274 | */ | ||
Michal Klocek
|
r360 | void QChart::removeSeries(QSeries* series) | ||
Michal Klocek
|
r223 | { | ||
m_dataset->removeSeries(series); | ||||
Tero Ahola
|
r42 | } | ||
Tero Ahola
|
r48 | |||
Marek Rosa
|
r274 | /*! | ||
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() | ||
{ | ||||
m_dataset->removeAllSeries(); | ||||
} | ||||
Marek Rosa
|
r287 | /*! | ||
Sets the \a brush that is used for painting the background of the chart area. | ||||
*/ | ||||
Michal Klocek
|
r122 | void QChart::setChartBackgroundBrush(const QBrush& brush) | ||
{ | ||||
Michal Klocek
|
r223 | createChartBackgroundItem(); | ||
Michal Klocek
|
r122 | m_backgroundItem->setBrush(brush); | ||
m_backgroundItem->update(); | ||||
} | ||||
Marek Rosa
|
r287 | /*! | ||
Sets the \a pen that is used for painting the background of the chart area. | ||||
*/ | ||||
Michal Klocek
|
r122 | void QChart::setChartBackgroundPen(const QPen& pen) | ||
{ | ||||
Michal Klocek
|
r223 | createChartBackgroundItem(); | ||
Michal Klocek
|
r122 | m_backgroundItem->setPen(pen); | ||
m_backgroundItem->update(); | ||||
} | ||||
Marek Rosa
|
r274 | /*! | ||
Michal Klocek
|
r481 | Sets the chart \a title. The description text that is drawn above the chart. | ||
Marek Rosa
|
r274 | */ | ||
Michal Klocek
|
r192 | void QChart::setChartTitle(const QString& title) | ||
Michal Klocek
|
r69 | { | ||
Michal Klocek
|
r223 | createChartTitleItem(); | ||
Michal Klocek
|
r476 | m_titleItem->setText(title); | ||
Michal Klocek
|
r571 | updateLayout(); | ||
Michal Klocek
|
r476 | } | ||
/*! | ||||
Michal Klocek
|
r481 | Returns the chart title. The description text that is drawn above the chart. | ||
Michal Klocek
|
r476 | */ | ||
QString QChart::chartTitle() const | ||||
{ | ||||
if(m_titleItem) | ||||
return m_titleItem->text(); | ||||
else | ||||
return QString(); | ||||
Michal Klocek
|
r192 | } | ||
Marek Rosa
|
r274 | /*! | ||
Marek Rosa
|
r277 | Sets the \a font that is used for rendering the description text that is rendered above the chart. | ||
Marek Rosa
|
r274 | */ | ||
Michal Klocek
|
r192 | void QChart::setChartTitleFont(const QFont& font) | ||
{ | ||||
Michal Klocek
|
r223 | createChartTitleItem(); | ||
Michal Klocek
|
r87 | m_titleItem->setFont(font); | ||
Michal Klocek
|
r571 | updateLayout(); | ||
Michal Klocek
|
r69 | } | ||
Tero Ahola
|
r495 | /*! | ||
Sets the \a brush used for rendering the title text. | ||||
*/ | ||||
void QChart::setChartTitleBrush(const QBrush &brush) | ||||
{ | ||||
createChartTitleItem(); | ||||
m_titleItem->setBrush(brush); | ||||
Michal Klocek
|
r571 | updateLayout(); | ||
Tero Ahola
|
r495 | } | ||
/*! | ||||
Returns the brush used for rendering the title text. | ||||
*/ | ||||
QBrush QChart::chartTitleBrush() | ||||
{ | ||||
createChartTitleItem(); | ||||
return m_titleItem->brush(); | ||||
} | ||||
Michal Klocek
|
r223 | void QChart::createChartBackgroundItem() | ||
{ | ||||
if(!m_backgroundItem) { | ||||
m_backgroundItem = new QGraphicsRectItem(this); | ||||
Michal Klocek
|
r272 | m_backgroundItem->setPen(Qt::NoPen); | ||
Michal Klocek
|
r262 | m_backgroundItem->setZValue(ChartPresenter::BackgroundZValue); | ||
Michal Klocek
|
r223 | } | ||
} | ||||
void QChart::createChartTitleItem() | ||||
{ | ||||
Michal Klocek
|
r262 | if(!m_titleItem) { | ||
Michal Klocek
|
r476 | m_titleItem = new QGraphicsSimpleTextItem(this); | ||
Michal Klocek
|
r262 | m_titleItem->setZValue(ChartPresenter::BackgroundZValue); | ||
} | ||||
Michal Klocek
|
r223 | } | ||
Marek Rosa
|
r277 | /*! | ||
Returns the chart margin, which is the distance between the widget edge and the part of the chart where the actual data can be displayed. | ||||
\sa setMargin() | ||||
*/ | ||||
Michal Klocek
|
r28 | int QChart::margin() const | ||
{ | ||||
Jani Honkonen
|
r142 | return m_presenter->margin(); | ||
Michal Klocek
|
r28 | } | ||
Marek Rosa
|
r277 | /*! | ||
Sets the chart \a margin, which is the distance between the widget edge and the part of the chart where the actual data can be displayed. | ||||
\sa margin() | ||||
*/ | ||||
Michal Klocek
|
r12 | void QChart::setMargin(int margin) | ||
{ | ||||
Michal Klocek
|
r143 | m_presenter->setMargin(margin); | ||
Michal Klocek
|
r571 | updateLayout(); | ||
Michal Klocek
|
r12 | } | ||
Marek Rosa
|
r277 | /*! | ||
Marek Rosa
|
r285 | Sets the \a theme used by the chart for rendering the graphical representation of the data | ||
Marek Rosa
|
r277 | \sa ChartTheme, chartTheme() | ||
*/ | ||||
Michal Klocek
|
r153 | void QChart::setChartTheme(QChart::ChartTheme theme) | ||
Tero Ahola
|
r64 | { | ||
Michal Klocek
|
r153 | m_presenter->setChartTheme(theme); | ||
Tero Ahola
|
r64 | } | ||
Marek Rosa
|
r277 | /*! | ||
Returns the theme enum used by the chart. | ||||
\sa ChartTheme, setChartTheme() | ||||
*/ | ||||
Michal Klocek
|
r153 | QChart::ChartTheme QChart::chartTheme() const | ||
Tero Ahola
|
r120 | { | ||
Michal Klocek
|
r153 | return m_presenter->chartTheme(); | ||
Tero Ahola
|
r120 | } | ||
Marek Rosa
|
r285 | /*! | ||
Zooms in the view by a factor of 2 | ||||
*/ | ||||
Michal Klocek
|
r223 | void QChart::zoomIn() | ||
Michal Klocek
|
r67 | { | ||
Michal Klocek
|
r439 | m_presenter->zoomIn(); | ||
Michal Klocek
|
r67 | } | ||
Marek Rosa
|
r285 | /*! | ||
Zooms in the view to a maximum level at which \a rect is still fully visible. | ||||
*/ | ||||
Michal Klocek
|
r223 | void QChart::zoomIn(const QRectF& rect) | ||
Michal Klocek
|
r67 | { | ||
Michal Klocek
|
r439 | |||
Michal Klocek
|
r223 | if(!rect.isValid()) return; | ||
Michal Klocek
|
r439 | m_presenter->zoomIn(rect); | ||
Michal Klocek
|
r67 | } | ||
Marek Rosa
|
r285 | /*! | ||
Restores the view zoom level to the previous one. | ||||
*/ | ||||
Michal Klocek
|
r67 | void QChart::zoomOut() | ||
{ | ||||
Michal Klocek
|
r439 | m_presenter->zoomOut(); | ||
Michal Klocek
|
r67 | } | ||
Marek Rosa
|
r287 | /*! | ||
Resets to the default view. | ||||
*/ | ||||
Tero Ahola
|
r93 | void QChart::zoomReset() | ||
{ | ||||
Michal Klocek
|
r439 | m_presenter->zoomReset(); | ||
Michal Klocek
|
r176 | } | ||
Marek Rosa
|
r277 | /*! | ||
Returns the pointer to the x axis object of the chart | ||||
*/ | ||||
Michal Klocek
|
r223 | QChartAxis* QChart::axisX() const | ||
Michal Klocek
|
r176 | { | ||
Michal Klocek
|
r223 | return m_dataset->axisX(); | ||
Michal Klocek
|
r176 | } | ||
Marek Rosa
|
r277 | /*! | ||
Returns the pointer to the y axis object of the chart | ||||
*/ | ||||
Michal Klocek
|
r223 | QChartAxis* QChart::axisY() const | ||
Michal Klocek
|
r176 | { | ||
Michal Klocek
|
r223 | return m_dataset->axisY(); | ||
Michal Klocek
|
r85 | } | ||
sauimone
|
r524 | /*! | ||
Returns the legend object of the chart | ||||
*/ | ||||
sauimone
|
r540 | QLegend* QChart::legend() | ||
sauimone
|
r524 | { | ||
return m_legend; | ||||
} | ||||
Marek Rosa
|
r287 | /*! | ||
Resizes and updates the chart area using the \a event data | ||||
*/ | ||||
Michal Klocek
|
r115 | void QChart::resizeEvent(QGraphicsSceneResizeEvent *event) | ||
{ | ||||
m_rect = QRectF(QPoint(0,0),event->newSize()); | ||||
Michal Klocek
|
r571 | updateLayout(); | ||
Michal Klocek
|
r117 | QGraphicsWidget::resizeEvent(event); | ||
Michal Klocek
|
r115 | update(); | ||
} | ||||
Michal Klocek
|
r298 | /*! | ||
Tero Ahola
|
r302 | Sets animation \a options for the chart | ||
Michal Klocek
|
r298 | */ | ||
void QChart::setAnimationOptions(AnimationOptions options) | ||||
{ | ||||
m_presenter->setAnimationOptions(options); | ||||
} | ||||
/*! | ||||
Returns animation options for the chart | ||||
*/ | ||||
QChart::AnimationOptions QChart::animationOptions() const | ||||
{ | ||||
return m_presenter->animationOptions(); | ||||
} | ||||
Michal Klocek
|
r600 | void QChart::scrollLeft() | ||
{ | ||||
m_presenter->scroll(-m_presenter->geometry().width()/(axisX()->ticksCount()-1),0); | ||||
} | ||||
void QChart::scrollRight() | ||||
{ | ||||
m_presenter->scroll(m_presenter->geometry().width()/(axisX()->ticksCount()-1),0); | ||||
} | ||||
void QChart::scrollUp() | ||||
{ | ||||
m_presenter->scroll(0,m_presenter->geometry().width()/(axisY()->ticksCount()-1)); | ||||
} | ||||
void QChart::scrollDown() | ||||
{ | ||||
Michal Klocek
|
r531 | m_presenter->scroll(0,-m_presenter->geometry().width()/(axisY()->ticksCount()-1)); | ||
} | ||||
Michal Klocek
|
r571 | void QChart::updateLayout() | ||
{ | ||||
if(!m_rect.isValid()) return; | ||||
QRectF rect = m_rect.adjusted(margin(),margin(), -margin(), -margin()); | ||||
// recalculate title position | ||||
if (m_titleItem) { | ||||
QPointF center = m_rect.center() -m_titleItem->boundingRect().center(); | ||||
m_titleItem->setPos(center.x(),m_rect.top()/2 + margin()/2); | ||||
} | ||||
//recalculate background gradient | ||||
if (m_backgroundItem) { | ||||
m_backgroundItem->setRect(rect); | ||||
} | ||||
sauimone
|
r582 | |||
// recalculate legend position | ||||
// TODO: better layout | ||||
if (m_legend) { | ||||
QRectF boundingRect(m_rect.adjusted(margin(), | ||||
sauimone
|
r585 | rect.height() + margin() + margin()/2, | ||
sauimone
|
r582 | -margin(), | ||
sauimone
|
r585 | -margin()/2 + m_legend->minimumSize().height())); | ||
sauimone
|
r582 | m_legend->handleGeometryChanged(boundingRect); | ||
} | ||||
Michal Klocek
|
r571 | } | ||
Tero Ahola
|
r64 | #include "moc_qchart.cpp" | ||
Tero Ahola
|
r48 | |||
Tero Ahola
|
r30 | QTCOMMERCIALCHART_END_NAMESPACE | ||