From 2f3c0756d825c6be7b5456bf6e5239bed369fff8 2012-05-30 08:26:24 From: Marek Rosa Date: 2012-05-30 08:26:24 Subject: [PATCH] BarModelMapper: implemented model updated slots. Some more work needed with categories --- diff --git a/src/barchart/qbarmodelmapper.cpp b/src/barchart/qbarmodelmapper.cpp index 6d2c7f9..46412b7 100644 --- a/src/barchart/qbarmodelmapper.cpp +++ b/src/barchart/qbarmodelmapper.cpp @@ -179,6 +179,21 @@ void QBarModelMapperPrivate::blockSeriesSignals(bool block) m_seriesSignalsBlock = block; } +QBarSet* QBarModelMapperPrivate::barSet(QModelIndex index) +{ + if (!index.isValid()) + return 0; + + if (m_orientation == Qt::Vertical && index.column() >= m_firstBarSection && index.column() <= m_lastBarSection) { + if (index.row() >= m_first && (m_count == - 1 || index.row() < m_first + m_count)) + return m_series->barSets().at(index.column() - m_firstBarSection); + } else if (m_orientation == Qt::Horizontal && index.row() >= m_firstBarSection && index.row() <= m_lastBarSection) { + if (index.column() >= m_first && (m_count == - 1 || index.column() < m_first + m_count)) + return m_series->barSets().at(index.row() - m_firstBarSection); + } + return 0; // This part of model has not been mapped to any slice +} + QModelIndex QBarModelMapperPrivate::barModelIndex(int barSection, int posInBar) { if (m_count != -1 && posInBar >= m_count) @@ -215,43 +230,36 @@ void QBarModelMapperPrivate::modelUpdated(QModelIndex topLeft, QModelIndex botto if (m_modelSignalsBlock) return; - // blockSeriesSignals(); - // QModelIndex index; + blockSeriesSignals(); + QModelIndex index; // QPointF oldPoint; // QPointF newPoint; - // for (int row = topLeft.row(); row <= bottomRight.row(); row++) { - // for (int column = topLeft.column(); column <= bottomRight.column(); column++) { - // index = topLeft.sibling(row, column); - // if (m_orientation == Qt::Vertical && (index.column() == m_xSection|| index.column() == m_ySection)) { - // if (index.row() >= m_first && (m_count == - 1 || index.row() < m_first + m_count)) { - // oldPoint = m_series->points().at(index.row() - m_first); - // newPoint.setX(m_model->data(m_model->index(index.row(), m_xSection)).toReal()); - // newPoint.setY(m_model->data(m_model->index(index.row(), m_ySection)).toReal()); - // } - // } else if (m_orientation == Qt::Horizontal && (index.row() == m_xSection || index.row() == m_ySection)) { - // if (index.column() >= m_first && (m_count == - 1 || index.column() < m_first + m_count)) { - // oldPoint = m_series->points().at(index.column() - m_first); - // newPoint.setX(m_model->data(m_model->index(m_xSection, index.column())).toReal()); - // newPoint.setY(m_model->data(m_model->index(m_ySection, index.column())).toReal()); - // } - // } else { - // continue; - // } - // m_series->replace(oldPoint, newPoint); - // } - // blockSeriesSignals(false); - // } + for (int row = topLeft.row(); row <= bottomRight.row(); row++) { + for (int column = topLeft.column(); column <= bottomRight.column(); column++) { + index = topLeft.sibling(row, column); + QBarSet* bar = barSet(index); + if (bar) { + if (m_orientation == Qt::Vertical) + bar->replace(row - m_first, m_model->data(index).toReal()); + else + bar->replace(column - m_first, m_model->data(index).toReal()); + } + } + } + blockSeriesSignals(false); } void QBarModelMapperPrivate::modelRowsAdded(QModelIndex parent, int start, int end) { Q_UNUSED(parent); + Q_UNUSED(end) if (m_modelSignalsBlock) return; blockSeriesSignals(); if (m_orientation == Qt::Vertical) - insertData(start, end); + // insertData(start, end); + initializeBarFromModel(); else if (start <= m_firstBarSection || start <= m_lastBarSection || start <= m_categoriesSection) // if the changes affect the map - reinitialize initializeBarFromModel(); blockSeriesSignals(false); @@ -260,12 +268,14 @@ void QBarModelMapperPrivate::modelRowsAdded(QModelIndex parent, int start, int e void QBarModelMapperPrivate::modelRowsRemoved(QModelIndex parent, int start, int end) { Q_UNUSED(parent); + Q_UNUSED(end) if (m_modelSignalsBlock) return; blockSeriesSignals(); if (m_orientation == Qt::Vertical) - removeData(start, end); + // removeData(start, end); + initializeBarFromModel(); else if (start <= m_firstBarSection || start <= m_lastBarSection || start <= m_categoriesSection) // if the changes affect the map - reinitialize initializeBarFromModel(); blockSeriesSignals(false); @@ -274,12 +284,14 @@ void QBarModelMapperPrivate::modelRowsRemoved(QModelIndex parent, int start, int void QBarModelMapperPrivate::modelColumnsAdded(QModelIndex parent, int start, int end) { Q_UNUSED(parent); + Q_UNUSED(end) if (m_modelSignalsBlock) return; blockSeriesSignals(); if (m_orientation == Qt::Horizontal) - insertData(start, end); + // insertData(start, end); + initializeBarFromModel(); else if (start <= m_firstBarSection || start <= m_lastBarSection || start <= m_categoriesSection) // if the changes affect the map - reinitialize initializeBarFromModel(); blockSeriesSignals(false); @@ -288,12 +300,14 @@ void QBarModelMapperPrivate::modelColumnsAdded(QModelIndex parent, int start, in void QBarModelMapperPrivate::modelColumnsRemoved(QModelIndex parent, int start, int end) { Q_UNUSED(parent); + Q_UNUSED(end) if (m_modelSignalsBlock) return; blockSeriesSignals(); if (m_orientation == Qt::Horizontal) - removeData(start, end); + // removeData(start, end); + initializeBarFromModel(); else if (start <= m_firstBarSection || start <= m_lastBarSection || start <= m_categoriesSection) // if the changes affect the map - reinitialize initializeBarFromModel(); blockSeriesSignals(false); @@ -313,11 +327,13 @@ void QBarModelMapperPrivate::insertData(int start, int end) addedCount = m_count; int first = qMax(start, m_first); int last = qMin(first + addedCount - 1, m_orientation == Qt::Vertical ? m_model->rowCount() - 1 : m_model->columnCount() - 1); - for (int i = first; i <= last; i++) { - QPointF point; - point.setX(m_model->data(xModelIndex(i - m_first), Qt::DisplayRole).toDouble()); - point.setY(m_model->data(yModelIndex(i - m_first), Qt::DisplayRole).toDouble()); - m_series->insert(i - m_first, point); + for (int k = 0; k < m_series->barSets().count(); k++) { + for (int i = first; i <= last; i++) { + QBar point; + point.setX(m_model->data(xModelIndex(i - m_first), Qt::DisplayRole).toDouble()); + point.setY(m_model->data(yModelIndex(i - m_first), Qt::DisplayRole).toDouble()); + m_series->insert(i - m_first, point); + } } // remove excess of slices (abouve m_count) @@ -371,7 +387,7 @@ void QBarModelMapperPrivate::initializeBarFromModel() blockSeriesSignals(); // clear current content - // m_series->clear(); + m_series->clear(); // create the initial bar sets for (int i = m_firstBarSection; i <= m_lastBarSection; i++) { diff --git a/src/barchart/qbarmodelmapper_p.h b/src/barchart/qbarmodelmapper_p.h index e08476f..f79c205 100644 --- a/src/barchart/qbarmodelmapper_p.h +++ b/src/barchart/qbarmodelmapper_p.h @@ -9,6 +9,8 @@ class QModelIndex; QTCOMMERCIALCHART_BEGIN_NAMESPACE +class QBarSet; + class QBarModelMapperPrivate : public QObject { Q_OBJECT @@ -31,6 +33,7 @@ public Q_SLOTS: void initializeBarFromModel(); private: + QBarSet* barSet(QModelIndex index); QModelIndex barModelIndex(int barSection, int posInBar); QModelIndex categoriesModelIndex(int posInCategories); void insertData(int start, int end); diff --git a/src/barchart/qbarseries.cpp b/src/barchart/qbarseries.cpp index 9285ac0..f8383df 100644 --- a/src/barchart/qbarseries.cpp +++ b/src/barchart/qbarseries.cpp @@ -161,6 +161,13 @@ bool QBarSeries::remove(QList sets) return d->remove(sets); } +void QBarSeries::clear() +{ + Q_D(QBarSeries); + d->m_barSets.clear(); + d->m_categories.clear(); +} + /*! Returns number of sets in series. */ diff --git a/src/barchart/qbarseries.h b/src/barchart/qbarseries.h index 98a085c..6be6eb9 100644 --- a/src/barchart/qbarseries.h +++ b/src/barchart/qbarseries.h @@ -54,6 +54,7 @@ public: int categoryCount() const; QList barSets() const; QBarCategories categories() const; + void clear(); void setVisible(bool visible = true); bool isVisible() const; diff --git a/src/xychart/qxymodelmapper.cpp b/src/xychart/qxymodelmapper.cpp index 634b7fc..35d19e4 100644 --- a/src/xychart/qxymodelmapper.cpp +++ b/src/xychart/qxymodelmapper.cpp @@ -15,7 +15,7 @@ QXYModelMapper::~QXYModelMapper() { Q_D(QXYModelMapper); disconnect(d->m_model, 0, d, 0); -// disconnect(d->m_series, 0, d, 0); + // disconnect(d->m_series, 0, d, 0); } QAbstractItemModel* QXYModelMapper::model() const @@ -270,8 +270,8 @@ void QXYModelMapperPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottom } m_series->replace(oldPoint, newPoint); } - blockSeriesSignals(false); } + blockSeriesSignals(false); } void QXYModelMapperPrivate::modelRowsAdded(QModelIndex parent, int start, int end) diff --git a/tests/tablemodelchart/tablewidget.cpp b/tests/tablemodelchart/tablewidget.cpp index dfdd0ce..8c853cc 100644 --- a/tests/tablemodelchart/tablewidget.cpp +++ b/tests/tablemodelchart/tablewidget.cpp @@ -476,13 +476,13 @@ void TableWidget::updateChartType(bool toggle) // barSeries->setModelMapping(5, 2, 4, Qt::Vertical); int first = 3; - int count = 4; +// int count = 4; QVBarModelMapper *mapper = new QVBarModelMapper; mapper->setCategoriesSection(5); mapper->setFirstBarSection(2); mapper->setLastBarSection(4); mapper->setFirst(first); - mapper->setCount(count); +// mapper->setCount(count); mapper->setSeries(barSeries); mapper->setModel(m_model); // barSeries->setModelMapper(mapper); @@ -490,7 +490,7 @@ void TableWidget::updateChartType(bool toggle) QList barsets = barSeries->barSets(); for (int i = 0; i < barsets.count(); i++) { seriesColorHex = "#" + QString::number(barsets.at(i)->brush().color().rgb(), 16).right(6).toUpper(); - m_model->addMapping(seriesColorHex, QRect(2 + i, first, 1, count)); + m_model->addMapping(seriesColorHex, QRect(2 + i, first, 1, barsets.at(i)->count())); } }