From 505ff5d19e3d335d4fade04bb80e94f306cd4d67 2012-05-21 07:59:21 From: Marek Rosa Date: 2012-05-21 07:59:21 Subject: [PATCH] Pie now has defualt Model to which slice data is copied. --- diff --git a/qmlplugin/declarativepieseries.cpp b/qmlplugin/declarativepieseries.cpp index 8bb7915..e3a87f7 100644 --- a/qmlplugin/declarativepieseries.cpp +++ b/qmlplugin/declarativepieseries.cpp @@ -33,13 +33,13 @@ DeclarativePieSeries::DeclarativePieSeries(QObject *parent) : // setModel(new DeclarativeTableModel()); // TODO: Set default mapper parameters to allow easy to use PieSeries api? - QPieModelMapper *mapper = new QPieModelMapper(); + QPieModelMapper *mapper = modelMapper();//new QPieModelMapper(); mapper->setMapLabels(0); mapper->setMapValues(1); mapper->setOrientation(Qt::Vertical); mapper->setFirst(0); mapper->setCount(-1); - setModelMapper(mapper); +// setModelMapper(mapper); } void DeclarativePieSeries::classBegin() diff --git a/src/piechart/qpieseries.cpp b/src/piechart/qpieseries.cpp index 0ce2106..2d9b7e4 100644 --- a/src/piechart/qpieseries.cpp +++ b/src/piechart/qpieseries.cpp @@ -26,7 +26,8 @@ #include "charttheme_p.h" #include "chartanimator_p.h" #include "legendmarker_p.h" -#include +//#include +#include #include "qpiemodelmapper.h" QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -215,16 +216,33 @@ bool QPieSeries::insert(int index, QPieSlice* slice) if (!slice || d->m_slices.contains(slice)) return false; - slice->setParent(this); - d->m_slices.insert(index, slice); + d->m_model->insertRow(index); + if (d->m_mapper->orientation() == Qt::Vertical) { + d->m_model->setData(d->m_model->index(index, d->m_mapper->mapValues()), slice->value()); + d->m_model->setData(d->m_model->index(index, d->m_mapper->mapLabels()), slice->label()); + } else { + d->m_model->setData(d->m_model->index(d->m_mapper->mapValues(), index), slice->value()); + d->m_model->setData(d->m_model->index(d->m_mapper->mapLabels(), index), slice->label()); + } - d->updateDerivativeData(); + // if (index < 0 || index > d->m_slices.count()) + // return false; + + // if (!slice || d->m_slices.contains(slice)) + // return false; + + // slice->setParent(this); + // d->m_slices.insert(index, slice); + + // d->updateDerivativeData(); + + // connect(slice, SIGNAL(changed()), d, SLOT(sliceChanged())); + // connect(slice, SIGNAL(clicked()), d, SLOT(sliceClicked())); + // connect(slice, SIGNAL(hovered(bool)), d, SLOT(sliceHovered(bool))); + + // emit d->added(QList() << slice); - connect(slice, SIGNAL(changed()), d, SLOT(sliceChanged())); - connect(slice, SIGNAL(clicked()), d, SLOT(sliceClicked())); - connect(slice, SIGNAL(hovered(bool)), d, SLOT(sliceHovered(bool))); - emit d->added(QList() << slice); return true; } @@ -257,18 +275,24 @@ bool QPieSeries::remove(QPieSlice* slice) void QPieSeries::clear() { Q_D(QPieSeries); - if (d->m_slices.count() == 0) + if (count() == 0) return; + if (d->m_mapper->orientation() == Qt::Vertical) + d->m_model->removeRows(d->m_mapper->first(), count()); + else + d->m_model->removeColumns(d->m_mapper->first(), count()); + // if (d->m_slices.count() == 0) + // return; - QList slices = d->m_slices; - foreach (QPieSlice* s, d->m_slices) { - d->m_slices.removeOne(s); - delete s; - } + // QList slices = d->m_slices; + // foreach (QPieSlice* s, d->m_slices) { + // d->m_slices.removeOne(s); + // delete s; + // } - d->updateDerivativeData(); + // d->updateDerivativeData(); - emit d->removed(slices); + // emit d->removed(slices); } /*! @@ -277,7 +301,31 @@ void QPieSeries::clear() int QPieSeries::count() const { Q_D(const QPieSeries); - return d->m_slices.count(); + // return d->m_slices.count(); + + // if (d->m_model && d->m_mapper) { + + if (d->m_mapper->orientation() == Qt::Vertical) { + // data is in a column. Return the number of mapped items if the model's column have enough items + // or the number of items that can be mapped + if (d->m_mapper->mapValues() >= d->m_model->columnCount() || d->m_mapper->mapLabels() >= d->m_model->columnCount()) + return 0; // mapped columns are not existing + else if (d->m_mapper->count() != -1) + // void setModelMapper(QPieModelMapper *mapper); + return qMin(d->m_mapper->count(), qMax(d->m_model->rowCount() - d->m_mapper->first(), 0)); + else + return qMax(d->m_model->rowCount() - d->m_mapper->first(), 0); + } else { + // data is in a row. Return the number of mapped items if the model's row have enough items + // or the number of items that can be mapped + if (d->m_mapper->mapValues() >= d->m_model->rowCount() || d->m_mapper->mapLabels() >= d->m_model->rowCount()) + return 0; // mapped rows are not existing + else if (d->m_mapper->count() != -1) + return qMin(d->m_mapper->count(), qMax(d->m_model->columnCount() - d->m_mapper->first(), 0)); + else + return qMax(d->m_model->columnCount() - d->m_mapper->first(), 0); + } + // } } /*! @@ -429,15 +477,14 @@ qreal QPieSeries::sum() const void QPieSeries::setModel(QAbstractItemModel* model) { Q_D(QPieSeries); - // disconnect signals from old model - if(d->m_model) - { - disconnect(d->m_model, 0, this, 0); - } // set new model if(model) { + // disconnect signals from old model and delete it + disconnect(d->m_model, 0, this, 0); + delete d->m_model; + d->m_model = model; // connect signals from the model connect(d->m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), d, SLOT(modelUpdated(QModelIndex,QModelIndex))); @@ -449,31 +496,37 @@ void QPieSeries::setModel(QAbstractItemModel* model) if (d->m_mapper) d->initializePieFromModel(); } - else - { - d->m_model = 0; - } -} - -void QPieSeries::setModelMapper(QPieModelMapper *mapper) -{ - Q_D(QPieSeries); - // disconnect signals from old mapper - if (d->m_mapper) { - QObject::disconnect(d->m_mapper, 0, this, 0); - } - - if (mapper) { - d->m_mapper = mapper; - // connect the signal from the mapper - connect(d->m_mapper, SIGNAL(updated()), d, SLOT(initializePieFromModel())); - - if (d->m_model) - d->initializePieFromModel(); - } else { - d->m_mapper = 0; - } -} + // else + // { + // d->m_model = new QStandardItemModel; + // d->m_mapper->reset(); + // d->m_mapper->setMapLabels(0); + // d->m_mapper->setMapValues(1); + // } +} + +//void QPieSeries::setModelMapper(QPieModelMapper *mapper) +//{ +// Q_D(QPieSeries); +// // disconnect signals from old mapper +// if (d->m_mapper) { +// QObject::disconnect(d->m_mapper, 0, this, 0); +// } + +// if (mapper) { +// d->m_mapper = mapper; + +// if (d->m_model) +// d->initializePieFromModel(); +// } else { +// d->m_mapper = new QPieModelMapper; +// d->m_mapper->setMapLabels(0); +// d->m_mapper->setMapValues(1); +// } + +// // connect the signal from the mapper +// connect(d->m_mapper, SIGNAL(updated()), d, SLOT(initializePieFromModel())); +//} QPieModelMapper* QPieSeries::modelMapper() const { @@ -492,9 +545,18 @@ QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent) : m_pieStartAngle(0), m_pieEndAngle(360), m_sum(0), - m_mapper(0) + m_model(new QStandardItemModel), + m_mapper(new QPieModelMapper) { + // connect signals from the model + connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex,QModelIndex))); + connect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(modelRowsAdded(QModelIndex,int,int))); + connect(m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(modelRowsRemoved(QModelIndex,int,int))); + connect(m_model, SIGNAL(columnsInserted(QModelIndex,int,int)), this, SLOT(modelColumnsAdded(QModelIndex,int,int))); + connect(m_model, SIGNAL(columnsRemoved(QModelIndex,int,int)), this, SLOT(modelColumnsRemoved(QModelIndex,int,int))); + // connect the signal from the mapper + connect(m_mapper, SIGNAL(updated()), this, SLOT(initializePieFromModel())); } QPieSeriesPrivate::~QPieSeriesPrivate() @@ -549,6 +611,23 @@ QPieSeriesPrivate* QPieSeriesPrivate::seriesData(QPieSeries &series) void QPieSeriesPrivate::sliceChanged() { Q_ASSERT(m_slices.contains(qobject_cast(sender()))); + QPieSlice *slice = qobject_cast(sender()); + int sliceIndex = m_slices.indexOf(slice); + if (m_mapper->orientation() == Qt::Vertical) { + QModelIndex modelIndex = m_model->index(sliceIndex + m_mapper->first(), m_mapper->mapValues()); + if (m_model->data(modelIndex).toReal() != slice->value()) + m_model->setData(modelIndex, slice->value()); + modelIndex = m_model->index(sliceIndex + m_mapper->first(), m_mapper->mapLabels()); + if (m_model->data(modelIndex).toString() != slice->label()) + m_model->setData(modelIndex, slice->label()); + } else { + QModelIndex modelIndex = m_model->index(m_mapper->mapValues(), sliceIndex + m_mapper->first()); + if (m_model->data(modelIndex).toReal() != slice->value()) + m_model->setData(modelIndex, slice->value()); + modelIndex = m_model->index(m_mapper->mapLabels(), sliceIndex + m_mapper->first()); + if (m_model->data(modelIndex).toString() != slice->label()) + m_model->setData(modelIndex, slice->label()); + } updateDerivativeData(); } @@ -568,6 +647,59 @@ void QPieSeriesPrivate::sliceHovered(bool state) emit q->hovered(slice, state); } +void QPieSeriesPrivate::doClear() +{ + if (m_slices.count() == 0) + return; + + QList slices = m_slices; + foreach (QPieSlice* s, m_slices) { + m_slices.removeOne(s); + delete s; + } + + updateDerivativeData(); + + emit removed(slices); +} + +void QPieSeriesPrivate::doRemove(QPieSlice* slice) +{ + if (!m_slices.removeOne(slice)) + return;// false; + + updateDerivativeData(); + + emit removed(QList() << slice); + + delete slice; + slice = 0; + + return;// true; +} + +void QPieSeriesPrivate::doInsert(int index, QPieSlice* slice) +{ + if (index < 0 || index > m_slices.count()) + return;// false; + + if (!slice || m_slices.contains(slice)) + return;// false; + + slice->setParent(this); + m_slices.insert(index, slice); + + updateDerivativeData(); + + connect(slice, SIGNAL(changed()), this, SLOT(sliceChanged())); + connect(slice, SIGNAL(clicked()), this, SLOT(sliceClicked())); + connect(slice, SIGNAL(hovered(bool)), this, SLOT(sliceHovered(bool))); + + emit added(QList() << slice); + + return;// true; +} + void QPieSeriesPrivate::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight) { if (m_mapper) { @@ -663,11 +795,13 @@ void QPieSeriesPrivate::insertData(int start, int end) slice->setLabel(m_model->data(m_model->index(m_mapper->mapLabels(), i), Qt::DisplayRole).toString()); } slice->setLabelVisible(); - q->insert(i - m_mapper->first(), slice); + // q->insert(i - m_mapper->first(), slice); + doInsert(i - m_mapper->first(), slice); } if (m_mapper->count() != -1 && m_slices.size() > m_mapper->count()) for (int i = m_slices.size() - 1; i >= m_mapper->count(); i--) - q->remove(q->slices().at(i)); + // q->remove(q->slices().at(i)); + doRemove(q->slices().at(i)); } } } @@ -684,7 +818,8 @@ void QPieSeriesPrivate::removeData(int start, int end) int first = qMax(start, m_mapper->first()); // get the index of the first item that will be removed. int last = qMin(first + toRemove - 1, m_slices.size() + m_mapper->first() - 1); // get the index of the last item that will be removed. for (int i = last; i >= first; i--) - q->remove(q->slices().at(i - m_mapper->first())); + // q->remove(q->slices().at(i - m_mapper->first())); + doRemove(q->slices().at(i - m_mapper->first())); if (m_mapper->count() != -1) { int itemsAvailable; // check how many are available to be added @@ -705,7 +840,8 @@ void QPieSeriesPrivate::removeData(int start, int end) slice->setLabel(m_model->data(m_model->index(m_mapper->mapLabels(), i + m_mapper->first()), Qt::DisplayRole).toString()); } slice->setLabelVisible(); - q->insert(i, slice); + // q->insert(i, slice); + doInsert(i, slice); } } } @@ -717,7 +853,7 @@ void QPieSeriesPrivate::initializePieFromModel() Q_Q(QPieSeries); // clear current content - q->clear(); + doClear(); if (m_model == 0 || m_mapper == 0) return; diff --git a/src/piechart/qpieseries.h b/src/piechart/qpieseries.h index 1d8dd26..5ff24f7 100644 --- a/src/piechart/qpieseries.h +++ b/src/piechart/qpieseries.h @@ -75,7 +75,7 @@ public: void setLabelsVisible(bool visible = true); void setModel(QAbstractItemModel* model); - void setModelMapper(QPieModelMapper *mapper); +// void setModelMapper(QPieModelMapper *mapper); QPieModelMapper* modelMapper() const; Q_SIGNALS: diff --git a/src/piechart/qpieseries_p.h b/src/piechart/qpieseries_p.h index 9eb0cff..96b9f83 100644 --- a/src/piechart/qpieseries_p.h +++ b/src/piechart/qpieseries_p.h @@ -65,6 +65,9 @@ public Q_SLOTS: bool setRealValue(qreal &value, qreal newValue, qreal max, qreal min = 0.0); private: + void doClear(); + void doRemove(QPieSlice* slice); + void doInsert(int index, QPieSlice* slice); void insertData(int start, int end); void removeData(int start, int end); @@ -77,7 +80,8 @@ public: qreal m_pieEndAngle; qreal m_sum; - // model map + // model + QAbstractItemModel *m_model; QPieModelMapper *m_mapper; private: diff --git a/src/piechart/qpieslice.cpp b/src/piechart/qpieslice.cpp index b8a9eac..b244c46 100644 --- a/src/piechart/qpieslice.cpp +++ b/src/piechart/qpieslice.cpp @@ -20,6 +20,7 @@ #include "qpieslice.h" #include "pieslicedata_p.h" +#include QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -271,6 +272,7 @@ void QPieSlice::setLabel(QString label) { if (d->m_labelText != label) { d->m_labelText = label; + emit changed(); } } diff --git a/test/auto/qpieseries/tst_qpieseries.cpp b/test/auto/qpieseries/tst_qpieseries.cpp index d92931b..766ecb2 100644 --- a/test/auto/qpieseries/tst_qpieseries.cpp +++ b/test/auto/qpieseries/tst_qpieseries.cpp @@ -351,10 +351,10 @@ void tst_qpieseries::model() QVERIFY2(series->slices().count() == 0, "Mapper has not been set, so the number of slices should be 0"); // set the mapper - QPieModelMapper *mapper = new QPieModelMapper; + QPieModelMapper *mapper = series->modelMapper();//new QPieModelMapper; mapper->setMapValues(0); mapper->setMapLabels(0); - series->setModelMapper(mapper); // this should cause the Pie to get initialized from the model, since there is now both the model and the mapper defined +// series->setModelMapper(mapper); // this should cause the Pie to get initialized from the model, since there is now both the model and the mapper defined QCOMPARE(series->slices().count(), rowCount); // set the mappings to be outside of the model @@ -373,9 +373,9 @@ void tst_qpieseries::model() // unset the model and the mapper series->setModel(0); - series->setModelMapper(0); +// series->setModelMapper(0); QVERIFY(series->model() == 0); // Model should be unset - QVERIFY(series->modelMapper() == 0); // Model mapper should be unset +// QVERIFY(series->modelMapper() == 0); // Model mapper should be unset } void tst_qpieseries::modelCustomMap() @@ -397,10 +397,10 @@ void tst_qpieseries::modelCustomMap() chartView->show(); series->setModel(stdModel); - QPieModelMapper *mapper = new QPieModelMapper; + QPieModelMapper *mapper = series->modelMapper();//new QPieModelMapper; mapper->setMapValues(0); mapper->setMapLabels(0); - series->setModelMapper(mapper); +// series->setModelMapper(mapper); QCOMPARE(series->slices().count(), rowCount); // lets change the orientation to horizontal @@ -442,10 +442,10 @@ void tst_qpieseries::modelUpdate() chartView->show(); series->setModel(stdModel); - QPieModelMapper *mapper = new QPieModelMapper; + QPieModelMapper *mapper = series->modelMapper();//new QPieModelMapper; mapper->setMapValues(0); mapper->setMapLabels(0); - series->setModelMapper(mapper); +// series->setModelMapper(mapper); stdModel->insertRows(3, 5); QCOMPARE(series->slices().count(), rowCount + 5); diff --git a/test/tablemodelchart/tablewidget.cpp b/test/tablemodelchart/tablewidget.cpp index 161c04c..4c837f9 100644 --- a/test/tablemodelchart/tablewidget.cpp +++ b/test/tablemodelchart/tablewidget.cpp @@ -342,12 +342,12 @@ void TableWidget::updateChartType(bool toggle) QPieSeries* pieSeries = new QPieSeries; pieSeries->setModel(m_model); - QPieModelMapper *mapper = new QPieModelMapper; - mapper->setMapValues(-1); - mapper->setMapLabels(-1); + QPieModelMapper *mapper = pieSeries->modelMapper();//new QPieModelMapper; + mapper->setMapValues(1); + mapper->setMapLabels(0); mapper->setFirst(2); mapper->setCount(5); - pieSeries->setModelMapper(mapper); +// pieSeries->setModelMapper(mapper); pieSeries->setLabelsVisible(true); pieSeries->setPieSize(0.75); @@ -355,9 +355,13 @@ void TableWidget::updateChartType(bool toggle) // pieSeries->setVerticalPosition(0.3); m_chart->addSeries(pieSeries); -// seriesColorHex = "#" + QString::number(pieSeries->slices().at(pieSeries->slices().count()/2)->brush().color().rgb(), 16).right(6).toUpper(); + seriesColorHex = "#" + QString::number(pieSeries->slices().at(pieSeries->slices().count()/2)->brush().color().rgb(), 16).right(6).toUpper(); m_model->addMapping(seriesColorHex, QRect(0, 2, 2, 5)); + + pieSeries->slices().at(0)->setValue(400); + pieSeries->slices().at(0)->setLabel(QString("36")); + // // pie 2 // pieSeries = new QPieSeries; // pieSeries->setModel(m_model); @@ -453,7 +457,7 @@ void TableWidget::updateChartType(bool toggle) void TableWidget::testPie() { - m_series->modelMapper()->setMapX(4); +// m_series->modelMapper()->setMapX(4); // m_tableView->setColumnWidth(10, 250); // if (specialPie) { // specialPie->remove(specialPie->slices().at(2));