From 2ff4f264aa68e6de8ebb46be3f402ee0a4cf8e07 2012-02-10 13:02:04 From: sauimone Date: 2012-02-10 13:02:04 Subject: [PATCH] bug fix in bar charts. Crashed, if layout was set before data. Also integrated to test app. --- diff --git a/src/barchart/barchartmodel.cpp b/src/barchart/barchartmodel.cpp index 506dd99..bd1b6c5 100644 --- a/src/barchart/barchartmodel.cpp +++ b/src/barchart/barchartmodel.cpp @@ -13,7 +13,7 @@ BarChartModel::BarChartModel(QObject *parent) : BarChartModel::~BarChartModel() { - qDebug() << "BarChartModel::~BarChartModel"; +// qDebug() << "BarChartModel::~BarChartModel"; foreach (DataContainer* c, mDataModel) { delete c; } @@ -21,7 +21,7 @@ BarChartModel::~BarChartModel() int BarChartModel::addData(QList data) { - qDebug() << "BarChartModel::addData" << data.count(); +// qDebug() << "BarChartModel::addData" << data.count(); DataContainer* c = new DataContainer(data,mRunningId); mDataModel.append(c); mRunningId++; @@ -30,7 +30,7 @@ int BarChartModel::addData(QList data) void BarChartModel::removeData(int id) { - qDebug() << "BarChartModel::removeData"; +// qDebug() << "BarChartModel::removeData"; foreach(DataContainer* c, mDataModel) { if (c->mId == id) { mDataModel.removeOne(c); @@ -41,13 +41,13 @@ void BarChartModel::removeData(int id) int BarChartModel::countRows() { - qDebug() << "BarChartModel::countRows"; +// qDebug() << "BarChartModel::countRows"; return mDataModel.count(); } int BarChartModel::countColumns() { - qDebug() << "BarChartModel::countColumns"; +// qDebug() << "BarChartModel::countColumns"; int count(0); for (int i=0; i 0); // TODO: make min and max members and update them when data changes. // This is slower since they are checked every time, even if data is same since previous call. @@ -90,7 +88,7 @@ int BarChartModel::min() int BarChartModel::max() { - qDebug() << "BarChartModel::max"; +// qDebug() << "BarChartModel::max"; Q_ASSERT(mDataModel.count() > 0); // TODO: make min and max members and update them when data changes. @@ -112,7 +110,7 @@ int BarChartModel::max() qreal BarChartModel::valueAt(int series, int item) { - qDebug() << "BarChartModel::valueAt" << series << item; +// qDebug() << "BarChartModel::valueAt" << series << item; if ((series < 0) || (series >= mDataModel.count())) { // No series, no value. return 0; @@ -121,13 +119,13 @@ qreal BarChartModel::valueAt(int series, int item) return 0; } - qDebug() << "ValueAt" << series << item << "=" << mDataModel.at(series)->valueAt(item); +// qDebug() << "ValueAt" << series << item << "=" << mDataModel.at(series)->valueAt(item); return mDataModel.at(series)->valueAt(item); } qreal BarChartModel::columnSum(int column) { - qDebug() << "BarChartModel::columnSum"; +// qDebug() << "BarChartModel::columnSum"; int sum(0); int count = mDataModel.count(); // Count rows @@ -141,7 +139,7 @@ qreal BarChartModel::columnSum(int column) qreal BarChartModel::maxColumnSum() { - qDebug() << "BarChartModel::maxColumnSum"; +// qDebug() << "BarChartModel::maxColumnSum"; int max = INT_MIN; int count = countColumns(); diff --git a/src/barchart/bargroup.cpp b/src/barchart/bargroup.cpp index a77da51..f0a0b61 100644 --- a/src/barchart/bargroup.cpp +++ b/src/barchart/bargroup.cpp @@ -20,6 +20,11 @@ void BarGroup::layoutChanged() return; } + if (childItems().count() == 0) { + qDebug() << "WARNING: BarGroup::layoutChanged called before graphics items are created!"; + return; + } + // TODO: better way to auto-layout? // Use reals for accurancy (we might get some compiler warnings... :) int itemCount = mModel.countColumns(); diff --git a/src/barchart/bargroupbase.cpp b/src/barchart/bargroupbase.cpp index ab2ace3..09a2944 100644 --- a/src/barchart/bargroupbase.cpp +++ b/src/barchart/bargroupbase.cpp @@ -25,7 +25,7 @@ void BarGroupBase::setSeparatorsVisible(bool visible) void BarGroupBase::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { - qDebug() << "BarGroupBase::paint" << childItems().count(); +// qDebug() << "BarGroupBase::paint" << childItems().count(); if (!mLayoutSet) { qDebug() << "BarGroupBase::paint called without layout set. Aborting."; return; @@ -42,13 +42,7 @@ QRectF BarGroupBase::boundingRect() const { return QRectF(0,0,mWidth,mHeight); } -/* -void BarGroupBase::themeChanged(ChartTheme *theme) -{ - qDebug() << "BarGroupBase::themeChanged" -// mTheme = theme; -} -*/ + void BarGroupBase::setBarWidth( int w ) { mBarDefaultWidth = w; @@ -56,7 +50,7 @@ void BarGroupBase::setBarWidth( int w ) int BarGroupBase::addColor( QColor color ) { - qDebug() << "BarGroupBase::addColor"; +// qDebug() << "BarGroupBase::addColor"; int colorIndex = mColors.count(); mColors.append(color); return colorIndex; @@ -64,13 +58,13 @@ int BarGroupBase::addColor( QColor color ) void BarGroupBase::resetColors() { - qDebug() << "BarGroupBase::resetColors"; +// qDebug() << "BarGroupBase::resetColors"; mColors.clear(); } void BarGroupBase::dataChanged() { - qDebug() << "BarGroupBase::dataChanged"; +// qDebug() << "BarGroupBase::dataChanged"; // Delete old bars foreach (QGraphicsItem* item, childItems()) { @@ -108,19 +102,19 @@ void BarGroupBase::dataChanged() void BarGroupBase::handleModelChanged(int index) { - qDebug() << "BarGroupBase::handleModelChanged" << index; +// qDebug() << "BarGroupBase::handleModelChanged" << index; dataChanged(); } void BarGroupBase::handleDomainChanged(const Domain& domain) { - qDebug() << "BarGroupBase::handleDomainChanged"; +// qDebug() << "BarGroupBase::handleDomainChanged"; dataChanged(); } void BarGroupBase::handleGeometryChanged(const QRectF& rect) { - qDebug() << "BarGroupBase::handleGeometryChanged"; +// qDebug() << "BarGroupBase::handleGeometryChanged"; mWidth = rect.width(); mHeight = rect.height(); layoutChanged(); diff --git a/src/barchart/percentbargroup.cpp b/src/barchart/percentbargroup.cpp index 9eba91e..8ff5af9 100644 --- a/src/barchart/percentbargroup.cpp +++ b/src/barchart/percentbargroup.cpp @@ -21,6 +21,11 @@ void PercentBarGroup::layoutChanged() return; } + if (childItems().count() == 0) { + qDebug() << "WARNING: PercentBarGroup::layoutChanged called before graphics items are created!"; + return; + } + // TODO: better way to auto-layout // Use reals for accurancy (we might get some compiler warnings... :) int count = mModel.countColumns(); @@ -28,7 +33,6 @@ void PercentBarGroup::layoutChanged() qreal tW = mWidth; qreal tC = count+1; qreal xStep = (tW/tC); -// qreal xPos = ((tW/tC) + mBarDefaultWidth / 2); qreal xPos = ((tW/tC) - mBarDefaultWidth / 2); int labelIndex = mModel.countColumns() * mModel.countRows(); diff --git a/src/barchart/stackedbargroup.cpp b/src/barchart/stackedbargroup.cpp index 7c9137f..0b047ca 100644 --- a/src/barchart/stackedbargroup.cpp +++ b/src/barchart/stackedbargroup.cpp @@ -26,6 +26,11 @@ void StackedBarGroup::layoutChanged() return; } + if (childItems().count() == 0) { + qDebug() << "WARNING: StackedBarGroup::layoutChanged called before graphics items are created!"; + return; + } + // TODO: better way to auto-layout // Use reals for accurancy (we might get some compiler warnings... :) // TODO: use temp variable for column count... diff --git a/test/chartwidgettest/dataseriedialog.cpp b/test/chartwidgettest/dataseriedialog.cpp index 5ae8175..6c64d4a 100644 --- a/test/chartwidgettest/dataseriedialog.cpp +++ b/test/chartwidgettest/dataseriedialog.cpp @@ -14,6 +14,8 @@ DataSerieDialog::DataSerieDialog(QString defaultType, QWidget *parent) : m_seriesTypeCombo->addItem("Line"); m_seriesTypeCombo->addItem("Area"); m_seriesTypeCombo->addItem("Bar"); + m_seriesTypeCombo->addItem("StackedBar"); + m_seriesTypeCombo->addItem("PercentBar"); m_seriesTypeCombo->addItem("Pie"); m_seriesTypeCombo->addItem("Scatter"); m_seriesTypeCombo->addItem("Spline"); @@ -31,6 +33,7 @@ DataSerieDialog::DataSerieDialog(QString defaultType, QWidget *parent) : m_testDataCombo->addItem("linear, 1M"); m_testDataCombo->addItem("SIN"); m_testDataCombo->addItem("SIN + random"); + m_testDataCombo->addItem("Table, 5 series"); m_testDataCombo->addItem("TODO From file..."); m_testDataCombo->addItem("TODO From URL..."); diff --git a/test/chartwidgettest/mainwidget.cpp b/test/chartwidgettest/mainwidget.cpp index 437843b..c5a0177 100644 --- a/test/chartwidgettest/mainwidget.cpp +++ b/test/chartwidgettest/mainwidget.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -177,6 +178,12 @@ void MainWidget::addSeries(QString series, QString data) QList x; QList y; + QList data0; + QList data1; + QList data2; + QList data3; + QList data4; + if (data == "linear") { for (int i = 0; i < 20; i++) { x.append(i); @@ -202,6 +209,13 @@ void MainWidget::addSeries(QString series, QString data) x.append(i + (rand() % 5)); y.append(abs(sin(3.14159265358979 / 50 * i) * 100) + (rand() % 5)); } + } else if (data == "Table, 5 series"){ + // Create some test data to chart + data0 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10; + data1 << 5 << 0 << 0 << 4 << 0 << 7 << 8 << 9 << 9 << 0; + data2 << 3 << 5 << 8 << 13 << 8 << 5 << 3 << 2 << 1 << 1; + data3 << 5 << 6 << 7 << 3 << 4 << 5 << 8 << 9 << 10 << 5; + data4 << 9 << 7 << 5 << 3 << 1 << 2 << 4 << 6 << 8 << 10; } else { // TODO: check if data has a valid file name Q_ASSERT(false); @@ -229,36 +243,38 @@ void MainWidget::addSeries(QString series, QString data) series0->add(x.at(i), y.at(i)); m_chartWidget->addSeries(series0); newSeries = series0; - } else { - // TODO - } - - // BarChart - if (series == "Bar") { - // This is the another way of creating series. Should we create test cases for both ways, if we support them? + } else if (series == "Bar") { + qDebug() << "Bar chart series"; + BarChartSeries* series0 = new BarChartSeries(this); + series0->addData(data0); + series0->addData(data1); + series0->addData(data2); + series0->addData(data3); + series0->addData(data4); + m_chartWidget->addSeries(series0); + newSeries = series0; + } else if (series == "StackedBar") { qDebug() << "Bar chart series"; StackedBarChartSeries* series0 = new StackedBarChartSeries(this); - - // Create some test data to chart - QList data0; - data0 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10; - QList data1; - data1 << 5 << 0 << 0 << 4 << 0 << 7 << 8 << 9 << 9 << 0; - QList data2; - data2 << 3 << 5 << 8 << 13 << 8 << 5 << 3 << 2 << 1 << 1; - QList data3; - data3 << 5 << 6 << 7 << 3 << 4 << 5 << 8 << 9 << 10 << 5; - QList data4; - data4 << 9 << 7 << 5 << 3 << 1 << 2 << 4 << 6 << 8 << 10; - series0->addData(data0); series0->addData(data1); series0->addData(data2); series0->addData(data3); series0->addData(data4); - m_chartWidget->addSeries(series0); newSeries = series0; + } else if (series == "PercentBar") { + qDebug() << "Bar chart series"; + PercentBarChartSeries* series0 = new PercentBarChartSeries(this); + series0->addData(data0); + series0->addData(data1); + series0->addData(data2); + series0->addData(data3); + series0->addData(data4); + m_chartWidget->addSeries(series0); + newSeries = series0; + } else { + qDebug() << "Something weird going on in MainWidget::addSeries"; } setCurrentSeries(newSeries); @@ -277,6 +293,12 @@ void MainWidget::setCurrentSeries(QChartSeries *series) case QChartSeries::SeriesTypeBar: qDebug() << "setCurrentSeries (bar)"; break; + case QChartSeries::SeriesTypeStackedBar: + qDebug() << "setCurrentSeries (Stackedbar)"; + break; + case QChartSeries::SeriesTypePercentBar: + qDebug() << "setCurrentSeries (Percentbar)"; + break; default: Q_ASSERT(false); break;