From ab3fbe16ea336f7fe5e2913bd49f3fe48765f08b 2012-04-18 12:23:25 From: Marek Rosa Date: 2012-04-18 12:23:25 Subject: [PATCH] QXYSeries: support for removing data from model when using custom mapping --- diff --git a/src/barchart/qbarseries.cpp b/src/barchart/qbarseries.cpp index 2802ddc..21977fe 100644 --- a/src/barchart/qbarseries.cpp +++ b/src/barchart/qbarseries.cpp @@ -226,8 +226,7 @@ QBarSeriesPrivate::QBarSeriesPrivate(QBarCategories categories, QBarSeries *q) : m_categories(categories), m_mapCategories(-1), m_mapBarBottom(-1), - m_mapBarTop(-1), - m_mapOrientation(Qt::Vertical) + m_mapBarTop(-1) { } diff --git a/src/barchart/qbarseries_p.h b/src/barchart/qbarseries_p.h index a658c6b..605725d 100644 --- a/src/barchart/qbarseries_p.h +++ b/src/barchart/qbarseries_p.h @@ -51,7 +51,6 @@ protected: int m_mapCategories; int m_mapBarBottom; int m_mapBarTop; - Qt::Orientation m_mapOrientation; private: Q_DECLARE_PUBLIC(QBarSeries) }; diff --git a/src/piechart/qpieseries.cpp b/src/piechart/qpieseries.cpp index f8ae3b5..2860e33 100644 --- a/src/piechart/qpieseries.cpp +++ b/src/piechart/qpieseries.cpp @@ -475,8 +475,7 @@ QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent) : m_pieEndAngle(360), m_sum(0), m_mapValues(0), - m_mapLabels(0), - m_mapOrientation(Qt::Vertical) + m_mapLabels(0) { } diff --git a/src/piechart/qpieseries_p.h b/src/piechart/qpieseries_p.h index f00cfcc..452cfdd 100644 --- a/src/piechart/qpieseries_p.h +++ b/src/piechart/qpieseries_p.h @@ -70,7 +70,6 @@ public: // model map int m_mapValues; int m_mapLabels; - Qt::Orientation m_mapOrientation; private: friend class QLegendPrivate; diff --git a/src/qabstractseries.cpp b/src/qabstractseries.cpp index 9882c26..ff7d1d1 100644 --- a/src/qabstractseries.cpp +++ b/src/qabstractseries.cpp @@ -105,11 +105,17 @@ int QAbstractSeries::mapFirst() const { return d_ptr->m_mapFirst; } + int QAbstractSeries::mapCount() const { return d_ptr->m_mapCount; } +int QAbstractSeries::mapOrientation() const +{ + return d_ptr->m_mapOrientation; +} + void QAbstractSeries::setName(const QString& name) { d_ptr->m_name = name; @@ -130,7 +136,8 @@ QAbstractSeriesPrivate::QAbstractSeriesPrivate(QAbstractSeries* q): q_ptr(q), m_model(0), m_mapFirst(0), - m_mapCount(-1) + m_mapCount(-1), + m_mapOrientation(Qt::Vertical) { } diff --git a/src/qabstractseries.h b/src/qabstractseries.h index fb4059a..7c32ca2 100644 --- a/src/qabstractseries.h +++ b/src/qabstractseries.h @@ -59,6 +59,7 @@ public: QAbstractItemModel* model() const; int mapFirst() const; int mapCount() const; + int mapOrientation() const; void setName(const QString& name); QString name() const; diff --git a/src/qabstractseries_p.h b/src/qabstractseries_p.h index e6d93d7..628de93 100644 --- a/src/qabstractseries_p.h +++ b/src/qabstractseries_p.h @@ -58,6 +58,7 @@ protected: QAbstractItemModel *m_model; int m_mapFirst; int m_mapCount; + Qt::Orientation m_mapOrientation; QString m_name; friend class QAbstractSeries; diff --git a/src/xychart/qxyseries.cpp b/src/xychart/qxyseries.cpp index 95223ff..75f04b6 100644 --- a/src/xychart/qxyseries.cpp +++ b/src/xychart/qxyseries.cpp @@ -430,7 +430,6 @@ void QXYSeries::setModelMappingRange(int first, int count) QXYSeriesPrivate::QXYSeriesPrivate(QXYSeries *q) : QAbstractSeriesPrivate(q), m_mapX(-1), m_mapY(-1), - m_mapOrientation( Qt::Vertical), m_pointsVisible(false) { } diff --git a/src/xychart/qxyseries_p.h b/src/xychart/qxyseries_p.h index e0f1b56..b809f0b 100644 --- a/src/xychart/qxyseries_p.h +++ b/src/xychart/qxyseries_p.h @@ -70,7 +70,6 @@ protected: int m_mapX; int m_mapY; - Qt::Orientation m_mapOrientation; bool m_pointsVisible; private: diff --git a/src/xychart/xychartitem.cpp b/src/xychart/xychartitem.cpp index 1269069..1b2650f 100644 --- a/src/xychart/xychartitem.cpp +++ b/src/xychart/xychartitem.cpp @@ -25,6 +25,7 @@ #include "chartanimator_p.h" #include #include +#include QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -189,6 +190,67 @@ void XYChartItem::handlePointsRemoved(int start, int end) { Q_UNUSED(start) Q_UNUSED(end) + if (m_series->model() == 0) { + for (int i = end; i >= start; i--) + handlePointRemoved(i); + } else { + // series uses model as a data source + int first = m_series->mapFirst(); + int count = m_series->mapCount(); + int removedCount = end - start + 1; + if (count != -1 && start >= first + count) { + return; + } + + // removing items from unlimited map + else if (count == -1 && start >= first) { + for (int i = end; i >= start; i--) + handlePointRemoved(i - first); + } else if (count == - 1 && start < first) { + // not all removed items + for (int i = first + removedCount - 1; i >= first; i--) + handlePointRemoved(i - first); + } + + // removing items from limited map + else if (start >= first) { + // + int lastExisting = qMin(first + m_points.size() - 1, end); + for (int i = lastExisting; i >= start; i--) { + handlePointRemoved(i - first); + } + + // the map is limited, so after removing the items some new items may have fall into the map + int itemsAvailable; + if (m_series->mapOrientation() == Qt::Vertical) + itemsAvailable = m_series->model()->rowCount() - first - m_points.size(); + else + itemsAvailable = m_series->model()->columnCount() - first - m_points.size(); + int toBeAdded = qMin(itemsAvailable, count - m_points.size()); + int currentSize = m_points.size(); + if (itemsAvailable > 0) + for (int i = m_points.size(); i < currentSize + toBeAdded; i++) + handlePointAdded(i); + } else { + // TODO: + int toRemove = qMin(m_points.size() - 1, removedCount); + for (int i = first; i < first + toRemove; i++) + handlePointRemoved(0); + + // the map is limited, so after removing the items some new items may have fall into the map + int itemsAvailable; + if (m_series->mapOrientation() == Qt::Vertical) + itemsAvailable = m_series->model()->rowCount() - first - m_points.size(); + else + itemsAvailable = m_series->model()->columnCount() - first - m_points.size(); + int toBeAdded = qMin(itemsAvailable, count - m_points.size()); + int currentSize = m_points.size(); + if (itemsAvailable > 0) + for (int i = m_points.size(); i < currentSize + toBeAdded; i++) + handlePointAdded(i); + } + } + } void XYChartItem::handlePointReplaced(int index)