summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSami Varanka <sami.varanka@qt.io>2024-04-28 19:25:51 +0300
committerSami Varanka <sami.varanka@qt.io>2024-05-06 10:24:18 +0300
commit805ba144e68dc300ae878f839b9cd7bce63fdcb0 (patch)
tree4f36d857a39ad66921ee222a9334f8c6583dc6cc
parent6b1b6eade584cead849965065a7a1cde05840cc6 (diff)
Delete extra bar rectangles
Internal rectangle reprentations were never freed which caused them to be left visible when the set was removed from the series. Fixes: QTBUG-124812 Change-Id: Id541c1ad2231456876fb9ebaf47e4c7e13b98d9d Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> Reviewed-by: Kwanghyo Park <kwanghyo.park@qt.io>
-rw-r--r--src/graphs2d/barchart/qbarseries.cpp3
-rw-r--r--src/graphs2d/qabstractseries.cpp11
-rw-r--r--src/graphs2d/qabstractseries_p.h1
-rw-r--r--src/graphs2d/qsgrenderer/barsrenderer.cpp23
4 files changed, 32 insertions, 6 deletions
diff --git a/src/graphs2d/barchart/qbarseries.cpp b/src/graphs2d/barchart/qbarseries.cpp
index abd5d14..a5637f8 100644
--- a/src/graphs2d/barchart/qbarseries.cpp
+++ b/src/graphs2d/barchart/qbarseries.cpp
@@ -526,8 +526,8 @@ bool QBarSeries::append(QBarSet *set)
QObject::connect(set, &QBarSet::update, this, &QBarSeries::update);
emit barsetsAdded(sets);
emit countChanged();
+ emit update();
}
- emit update();
return success;
}
@@ -546,6 +546,7 @@ bool QBarSeries::remove(QBarSet *set)
QObject::disconnect(set, &QBarSet::update, this, &QBarSeries::update);
emit barsetsRemoved(sets);
emit countChanged();
+ emit update();
delete set;
set = 0;
}
diff --git a/src/graphs2d/qabstractseries.cpp b/src/graphs2d/qabstractseries.cpp
index cc2d182..0fa9ae9 100644
--- a/src/graphs2d/qabstractseries.cpp
+++ b/src/graphs2d/qabstractseries.cpp
@@ -515,13 +515,22 @@ QAbstractSeriesPrivate::~QAbstractSeriesPrivate()
void QAbstractSeriesPrivate::setLegendData(const QList<QLegendData> &legendData)
{
- Q_Q(QAbstractSeries);
if (legendData.data() != m_legendData.data()) {
+ Q_Q(QAbstractSeries);
m_legendData = legendData;
emit q->legendDataChanged();
}
}
+void QAbstractSeriesPrivate::clearLegendData()
+{
+ if (!m_legendData.empty()) {
+ Q_Q(QAbstractSeries);
+ m_legendData.clear();
+ emit q->legendDataChanged();
+ }
+}
+
QT_END_NAMESPACE
#include "moc_qabstractseries.cpp"
diff --git a/src/graphs2d/qabstractseries_p.h b/src/graphs2d/qabstractseries_p.h
index 196b6a0..1af0db3 100644
--- a/src/graphs2d/qabstractseries_p.h
+++ b/src/graphs2d/qabstractseries_p.h
@@ -33,6 +33,7 @@ public:
virtual void initializeAxes(){};
void setLegendData(const QList<QLegendData> &legendData);
+ void clearLegendData();
protected:
QGraphsView *m_graph;
diff --git a/src/graphs2d/qsgrenderer/barsrenderer.cpp b/src/graphs2d/qsgrenderer/barsrenderer.cpp
index afa7801..4bdc2fc 100644
--- a/src/graphs2d/qsgrenderer/barsrenderer.cpp
+++ b/src/graphs2d/qsgrenderer/barsrenderer.cpp
@@ -222,6 +222,7 @@ void BarsRenderer::updateVerticalBars(QBarSeries *series, int setCount, int valu
// Clear the selection rects
// These will be filled only if series is selectable
m_rectNodesInputRects.clear();
+ m_seriesData.clear();
float seriesPos = 0;
float posXInSet = 0;
@@ -333,6 +334,7 @@ void BarsRenderer::updateHorizontalBars(QBarSeries *series, int setCount, int va
// Clear the selection rects
// These will be filled only if series is selectable
m_rectNodesInputRects.clear();
+ m_seriesData.clear();
float seriesPos = 0;
float posYInSet = 0;
@@ -426,8 +428,10 @@ void BarsRenderer::handlePolish(QBarSeries *series)
return;
int setCount = series->barSets().size();
- if (setCount == 0)
+ if (setCount == 0) {
+ series->d_func()->clearLegendData();
return;
+ }
if (m_colorIndex < 0)
@@ -454,22 +458,33 @@ void BarsRenderer::handlePolish(QBarSeries *series)
void BarsRenderer::updateSeries(QBarSeries *series)
{
- if (series->barSets().isEmpty())
+ if (series->barSets().isEmpty()) {
+ auto it = m_rectNodes.begin();
+ while (it != m_rectNodes.end())
+ delete *it++;
+ m_rectNodes.clear();
return;
+ }
auto seriesTheme = series->theme();
if (!seriesTheme)
return;
+ int difference = m_seriesData.size() - m_rectNodes.size();
+ for (int i = m_rectNodes.size() - 1; i >= m_seriesData.size(); --i)
+ delete m_rectNodes[i];
+ if (difference != 0)
+ m_rectNodes.resize(m_seriesData.size());
+
if (!series->barComponent()) {
// Update default rectangle nodes
int barIndex = 0;
for (auto i = m_seriesData.cbegin(), end = m_seriesData.cend(); i != end; ++i) {
- if (m_rectNodes.size() <= barIndex) {
+ if (m_rectNodes[barIndex] == nullptr) {
// Create more rectangle nodes as needed
auto bi = new QSGDefaultInternalRectangleNode();
m_graph->m_backgroundNode->appendChildNode(bi);
- m_rectNodes << bi;
+ m_rectNodes[barIndex] = bi;
}
if (m_rectNodes.size() > barIndex) {
auto &barItem = m_rectNodes[barIndex];