qbarseries.cpp
380 lines
| 10.0 KiB
| text/x-c
|
CppLexer
sauimone
|
r71 | #include <QDebug> | ||
sauimone
|
r338 | #include "qbarseries.h" | ||
sauimone
|
r172 | #include "qbarset.h" | ||
#include "barchartmodel_p.h" | ||||
sauimone
|
r126 | |||
sauimone
|
r56 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||
sauimone
|
r313 | /*! | ||
sauimone
|
r338 | \class QBarSeries | ||
sauimone
|
r313 | \brief part of QtCommercial chart API. | ||
sauimone
|
r338 | QBarSeries represents a series of data shown as bars. One QBarSeries can contain multible | ||
QBarSet data sets. QBarSeries groups the data from sets to categories, which are defined | ||||
sauimone
|
r377 | by QStringList. | ||
sauimone
|
r313 | |||
sauimone
|
r319 | \mainclass | ||
sauimone
|
r377 | \sa QBarSet, QStackedBarSeries, QPercentBarSeries | ||
sauimone
|
r313 | */ | ||
/*! | ||||
Michal Klocek
|
r360 | \fn virtual QSeriesType QBarSeries::type() const | ||
sauimone
|
r313 | \brief Returns type of series. | ||
Michal Klocek
|
r360 | \sa QSeries, QSeriesType | ||
sauimone
|
r313 | */ | ||
sauimone
|
r425 | |||
sauimone
|
r313 | /*! | ||
sauimone
|
r338 | \fn void QBarSeries::showToolTip(QPoint pos, QString tip) | ||
sauimone
|
r319 | \brief \internal \a pos \a tip | ||
sauimone
|
r313 | */ | ||
/*! | ||||
sauimone
|
r387 | Constructs empty QBarSeries. Parameter \a categories defines the categories for chart. | ||
sauimone
|
r338 | QBarSeries is QObject which is a child of a \a parent. | ||
sauimone
|
r313 | */ | ||
Michal Klocek
|
r703 | QBarSeries::QBarSeries(QBarCategories categories, QObject *parent) | ||
Michal Klocek
|
r360 | : QSeries(parent) | ||
sauimone
|
r377 | ,mModel(new BarChartModel(categories, this)) | ||
sauimone
|
r71 | { | ||
Marek Rosa
|
r528 | m_model = NULL; | ||
m_mapCategories = -1; | ||||
Jani Honkonen
|
r609 | m_mapBarBottom = -1; | ||
m_mapBarTop = -1; | ||||
Marek Rosa
|
r630 | m_mapOrientation = Qt::Vertical; | ||
sauimone
|
r71 | } | ||
sauimone
|
r313 | /*! | ||
sauimone
|
r425 | Adds a set of bars to series. Takes ownership of \a set. | ||
Connects the clicked(QString) and rightClicked(QString) signals | ||||
of \a set to this series | ||||
sauimone
|
r313 | */ | ||
sauimone
|
r338 | void QBarSeries::addBarSet(QBarSet *set) | ||
sauimone
|
r171 | { | ||
sauimone
|
r172 | mModel->addBarSet(set); | ||
sauimone
|
r425 | connect(set,SIGNAL(clicked(QString)),this,SLOT(barsetClicked(QString))); | ||
connect(set,SIGNAL(rightClicked(QString)),this,SLOT(barsetRightClicked(QString))); | ||||
Marek Rosa
|
r655 | connect(set, SIGNAL(valueChanged()), this, SLOT(barsetChanged())); | ||
sauimone
|
r681 | emit updatedBars(); | ||
sauimone
|
r171 | } | ||
sauimone
|
r313 | /*! | ||
Removes a set of bars from series. Releases ownership of \a set. Doesnt delete \a set. | ||||
sauimone
|
r425 | Disconnects the clicked(QString) and rightClicked(QString) signals | ||
of \a set from this series | ||||
sauimone
|
r313 | */ | ||
sauimone
|
r338 | void QBarSeries::removeBarSet(QBarSet *set) | ||
sauimone
|
r171 | { | ||
sauimone
|
r425 | disconnect(set,SIGNAL(clicked(QString)),this,SLOT(barsetClicked(QString))); | ||
disconnect(set,SIGNAL(rightClicked(QString)),this,SLOT(barsetRightClicked(QString))); | ||||
sauimone
|
r172 | mModel->removeBarSet(set); | ||
sauimone
|
r681 | emit updatedBars(); | ||
sauimone
|
r172 | } | ||
Marek Rosa
|
r662 | void QBarSeries::insertBarSet(int i, QBarSet *set) | ||
{ | ||||
mModel->insertBarSet(i, set); | ||||
// emit barsetChanged(); | ||||
} | ||||
void QBarSeries::insertCategory(int i, QString category) | ||||
{ | ||||
mModel->insertCategory(i, category); | ||||
} | ||||
Marek Rosa
|
r663 | void QBarSeries::removeCategory(int i) | ||
{ | ||||
mModel->removeCategory(i); | ||||
} | ||||
sauimone
|
r313 | /*! | ||
Returns number of sets in series. | ||||
*/ | ||||
sauimone
|
r366 | int QBarSeries::barsetCount() | ||
sauimone
|
r214 | { | ||
Marek Rosa
|
r662 | // if(m_model) | ||
// return m_mapBarTop - m_mapBarBottom; | ||||
// else | ||||
return mModel->barsetCount(); | ||||
sauimone
|
r214 | } | ||
sauimone
|
r323 | /*! | ||
Returns number of categories in series | ||||
*/ | ||||
sauimone
|
r366 | int QBarSeries::categoryCount() | ||
sauimone
|
r323 | { | ||
sauimone
|
r387 | return mModel->categoryCount(); | ||
sauimone
|
r323 | } | ||
sauimone
|
r313 | /*! | ||
sauimone
|
r357 | Returns a list of sets in series. Keeps ownership of sets. | ||
*/ | ||||
QList<QBarSet*> QBarSeries::barSets() | ||||
sauimone
|
r214 | { | ||
sauimone
|
r357 | return mModel->barSets(); | ||
sauimone
|
r214 | } | ||
sauimone
|
r313 | /*! | ||
sauimone
|
r357 | \internal \a index | ||
sauimone
|
r313 | */ | ||
sauimone
|
r357 | QBarSet* QBarSeries::barsetAt(int index) | ||
sauimone
|
r288 | { | ||
return mModel->setAt(index); | ||||
} | ||||
sauimone
|
r313 | /*! | ||
sauimone
|
r319 | \internal \a category | ||
sauimone
|
r313 | */ | ||
sauimone
|
r412 | QString QBarSeries::categoryName(int category) | ||
sauimone
|
r288 | { | ||
sauimone
|
r412 | return mModel->categoryName(category); | ||
sauimone
|
r288 | } | ||
sauimone
|
r313 | /*! | ||
Enables or disables tooltip depending on parameter \a enabled. | ||||
Tooltip shows the name of set, when mouse is hovering on top of bar. | ||||
Calling without parameter \a enabled, enables the tooltip | ||||
*/ | ||||
sauimone
|
r357 | void QBarSeries::setToolTipEnabled(bool enabled) | ||
sauimone
|
r280 | { | ||
sauimone
|
r487 | // TODO: what if we add sets after call to this function? Those sets won't have tooltip enabled. | ||
sauimone
|
r296 | if (enabled) { | ||
sauimone
|
r387 | for (int i=0; i<mModel->barsetCount(); i++) { | ||
sauimone
|
r296 | QBarSet *set = mModel->setAt(i); | ||
connect(set,SIGNAL(showToolTip(QPoint,QString)),this,SIGNAL(showToolTip(QPoint,QString))); | ||||
} | ||||
} else { | ||||
sauimone
|
r387 | for (int i=0; i<mModel->barsetCount(); i++) { | ||
sauimone
|
r296 | QBarSet *set = mModel->setAt(i); | ||
disconnect(set,SIGNAL(showToolTip(QPoint,QString)),this,SIGNAL(showToolTip(QPoint,QString))); | ||||
} | ||||
} | ||||
sauimone
|
r288 | } | ||
sauimone
|
r425 | |||
/*! | ||||
\internal \a category | ||||
*/ | ||||
void QBarSeries::barsetClicked(QString category) | ||||
{ | ||||
emit clicked(qobject_cast<QBarSet*>(sender()), category); | ||||
} | ||||
/*! | ||||
\internal \a category | ||||
*/ | ||||
void QBarSeries::barsetRightClicked(QString category) | ||||
{ | ||||
emit rightClicked(qobject_cast<QBarSet*>(sender()), category); | ||||
} | ||||
sauimone
|
r313 | /*! | ||
sauimone
|
r319 | \internal | ||
sauimone
|
r313 | */ | ||
sauimone
|
r338 | qreal QBarSeries::min() | ||
sauimone
|
r172 | { | ||
return mModel->min(); | ||||
} | ||||
sauimone
|
r313 | /*! | ||
sauimone
|
r319 | \internal | ||
sauimone
|
r313 | */ | ||
sauimone
|
r338 | qreal QBarSeries::max() | ||
sauimone
|
r172 | { | ||
return mModel->max(); | ||||
sauimone
|
r171 | } | ||
sauimone
|
r313 | /*! | ||
sauimone
|
r319 | \internal \a set \a category | ||
sauimone
|
r313 | */ | ||
sauimone
|
r338 | qreal QBarSeries::valueAt(int set, int category) | ||
sauimone
|
r172 | { | ||
return mModel->valueAt(set,category); | ||||
} | ||||
sauimone
|
r313 | /*! | ||
sauimone
|
r319 | \internal \a set \a category | ||
sauimone
|
r313 | */ | ||
sauimone
|
r338 | qreal QBarSeries::percentageAt(int set, int category) | ||
sauimone
|
r288 | { | ||
return mModel->percentageAt(set,category); | ||||
} | ||||
sauimone
|
r313 | /*! | ||
sauimone
|
r319 | \internal \a category | ||
sauimone
|
r313 | */ | ||
sauimone
|
r338 | qreal QBarSeries::categorySum(int category) | ||
sauimone
|
r288 | { | ||
return mModel->categorySum(category); | ||||
} | ||||
sauimone
|
r313 | /*! | ||
sauimone
|
r319 | \internal | ||
sauimone
|
r313 | */ | ||
sauimone
|
r338 | qreal QBarSeries::maxCategorySum() | ||
sauimone
|
r172 | { | ||
return mModel->maxCategorySum(); | ||||
} | ||||
sauimone
|
r313 | /*! | ||
sauimone
|
r319 | \internal | ||
sauimone
|
r313 | */ | ||
sauimone
|
r338 | BarChartModel& QBarSeries::model() | ||
sauimone
|
r172 | { | ||
return *mModel; | ||||
} | ||||
Marek Rosa
|
r527 | bool QBarSeries::setModel(QAbstractItemModel* model) | ||
{ | ||||
Marek Rosa
|
r630 | // disconnect signals from old model | ||
if(m_model) | ||||
{ | ||||
disconnect(m_model, 0, this, 0); | ||||
m_mapCategories = -1; | ||||
m_mapBarBottom = -1; | ||||
m_mapBarTop = -1; | ||||
m_mapOrientation = Qt::Vertical; | ||||
} | ||||
// set new model | ||||
if(model) | ||||
{ | ||||
m_model = model; | ||||
return true; | ||||
} | ||||
else | ||||
{ | ||||
m_model = NULL; | ||||
return false; | ||||
} | ||||
Marek Rosa
|
r527 | } | ||
Tero Ahola
|
r611 | // TODO | ||
Marek Rosa
|
r630 | void QBarSeries::setModelMapping(int categories, int bottomBoundry, int topBoundry, Qt::Orientation orientation) | ||
Marek Rosa
|
r527 | { | ||
Marek Rosa
|
r630 | if (m_model == NULL) | ||
return; | ||||
m_mapCategories = categories; | ||||
m_mapBarBottom = bottomBoundry; | ||||
m_mapBarTop = topBoundry; | ||||
m_mapOrientation = orientation; | ||||
// connect the signals | ||||
if (m_mapOrientation == Qt::Vertical) | ||||
{ | ||||
connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); | ||||
connect(m_model,SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); | ||||
connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); | ||||
} | ||||
else | ||||
{ | ||||
connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); | ||||
connect(m_model,SIGNAL(columnsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); | ||||
connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); | ||||
} | ||||
// create the initial bars | ||||
delete mModel; | ||||
if (m_mapOrientation == Qt::Vertical) | ||||
{ | ||||
QStringList categories; | ||||
Marek Rosa
|
r650 | for (int k = 0; k < m_model->rowCount(); k++) | ||
categories << m_model->data(m_model->index(k, m_mapCategories), Qt::DisplayRole).toString(); | ||||
Marek Rosa
|
r630 | mModel = new BarChartModel(categories, this); | ||
for (int i = m_mapBarBottom; i <= m_mapBarTop; i++) | ||||
{ | ||||
Marek Rosa
|
r650 | QBarSet* barSet = new QBarSet(QString("Column: %1").arg(i + 1)); | ||
for(int m = 0; m < m_model->rowCount(); m++) | ||||
*barSet << m_model->data(m_model->index(m, i), Qt::DisplayRole).toDouble(); | ||||
Marek Rosa
|
r630 | addBarSet(barSet); | ||
} | ||||
} | ||||
else | ||||
{ | ||||
QStringList categories; | ||||
Marek Rosa
|
r650 | for (int k = 0; k < m_model->columnCount(); k++) | ||
categories << m_model->data(m_model->index(m_mapCategories, k), Qt::DisplayRole).toString(); | ||||
Marek Rosa
|
r630 | mModel = new BarChartModel(categories, this); | ||
for (int i = m_mapBarBottom; i <= m_mapBarTop; i++) | ||||
{ | ||||
Marek Rosa
|
r650 | QBarSet* barSet = new QBarSet(QString("Row: %1").arg(i + 1)); | ||
for(int m = 0; m < m_model->columnCount(); m++) | ||||
*barSet << m_model->data(m_model->index(i, m), Qt::DisplayRole).toDouble(); | ||||
Marek Rosa
|
r630 | addBarSet(barSet); | ||
} | ||||
} | ||||
Marek Rosa
|
r527 | } | ||
Marek Rosa
|
r630 | void QBarSeries::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight) | ||
{ | ||||
Q_UNUSED(bottomRight) | ||||
if (m_mapOrientation == Qt::Vertical) | ||||
{ | ||||
if (topLeft.column() >= m_mapBarBottom && topLeft.column() <= m_mapBarTop) | ||||
Marek Rosa
|
r650 | barsetAt(topLeft.column() - m_mapBarBottom)->setValue(topLeft.row(), m_model->data(topLeft, Qt::DisplayRole).toDouble()); | ||
Marek Rosa
|
r662 | // else if (topLeft.column() == m_mapCategories) | ||
// slices().at(topLeft.row())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString()); | ||||
Marek Rosa
|
r630 | } | ||
else | ||||
{ | ||||
if (topLeft.row() >= m_mapBarBottom && topLeft.row() <= m_mapBarTop) | ||||
Marek Rosa
|
r650 | barsetAt(topLeft.row() - m_mapBarBottom)->setValue(topLeft.column(), m_model->data(topLeft, Qt::DisplayRole).toDouble()); | ||
Marek Rosa
|
r662 | // else if (topLeft.row() == m_mapCategories) | ||
// slices().at(topLeft.column())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString()); | ||||
Marek Rosa
|
r630 | } | ||
} | ||||
Marek Rosa
|
r662 | void QBarSeries::modelDataAdded(QModelIndex /*parent*/, int start, int /*end*/) | ||
Marek Rosa
|
r630 | { | ||
Marek Rosa
|
r662 | if (m_mapOrientation == Qt::Vertical) | ||
{ | ||||
insertCategory(start, QString("Row: %1").arg(start + 1)); | ||||
for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++) | ||||
{ | ||||
barsetAt(i)->insertValue(start, m_model->data(m_model->index(start, i), Qt::DisplayRole).toDouble()); | ||||
} | ||||
} | ||||
else | ||||
{ | ||||
insertCategory(start, QString("Column: %1").arg(start + 1)); | ||||
for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++) | ||||
{ | ||||
barsetAt(i)->insertValue(start, m_model->data(m_model->index(i, start), Qt::DisplayRole).toDouble()); | ||||
} | ||||
} | ||||
emit restructuredBar(1); | ||||
Marek Rosa
|
r630 | } | ||
Marek Rosa
|
r663 | void QBarSeries::modelDataRemoved(QModelIndex /*parent*/, int start, int /*end*/) | ||
Marek Rosa
|
r630 | { | ||
Marek Rosa
|
r663 | removeCategory(start); | ||
for (int i = 0; i <= m_mapBarTop - m_mapBarBottom; i++) | ||||
{ | ||||
barsetAt(i)->removeValue(start); | ||||
} | ||||
emit restructuredBar(1); | ||||
Marek Rosa
|
r630 | } | ||
void QBarSeries::barsetChanged() | ||||
Marek Rosa
|
r527 | { | ||
Marek Rosa
|
r655 | emit updatedBars(); | ||
Marek Rosa
|
r527 | } | ||
Michal Klocek
|
r703 | QBarCategories QBarSeries::categories() const | ||
{ | ||||
QBarCategories categories; | ||||
int count = mModel->categoryCount(); | ||||
for (int i=1; i<=count; i++) { | ||||
categories.insert(i, mModel->categoryName(i-1)); | ||||
} | ||||
return categories; | ||||
} | ||||
sauimone
|
r338 | #include "moc_qbarseries.cpp" | ||
sauimone
|
r71 | |||
sauimone
|
r56 | QTCOMMERCIALCHART_END_NAMESPACE | ||