##// END OF EJS Templates
Fix zooming in crash...
Titta Heikkala -
r2603:1e4c29e111d4
parent child
Show More
@@ -110,10 +110,16 void AreaChartItem::updatePath()
110 110 }
111 111 }
112 112 path.closeSubpath();
113 prepareGeometryChange();
114 m_path = path;
115 m_rect = path.boundingRect();
116 update();
113
114 // Only zoom in if the bounding rect of the path fits inside int limits. QWidget::update() uses
115 // a region that has to be compatible with QRect.
116 if (path.boundingRect().height() <= INT_MAX
117 && path.boundingRect().width() <= INT_MAX) {
118 prepareGeometryChange();
119 m_path = path;
120 m_rect = path.boundingRect();
121 update();
122 }
117 123 }
118 124
119 125 void AreaChartItem::handleUpdated()
@@ -276,13 +276,26 void LineChartItem::updateGeometry()
276 276 stroker.setCapStyle(Qt::SquareCap);
277 277 stroker.setMiterLimit(m_linePen.miterLimit());
278 278
279 prepareGeometryChange();
279 QPainterPath checkShapePath = stroker.createStroke(fullPath);
280
281 // Only zoom in if the bounding rects of the paths fit inside int limits. QWidget::update() uses
282 // a region that has to be compatible with QRect.
283 if (checkShapePath.boundingRect().height() <= INT_MAX
284 && checkShapePath.boundingRect().width() <= INT_MAX
285 && linePath.boundingRect().height() <= INT_MAX
286 && linePath.boundingRect().width() <= INT_MAX
287 && fullPath.boundingRect().height() <= INT_MAX
288 && fullPath.boundingRect().width() <= INT_MAX) {
289 prepareGeometryChange();
280 290
281 m_linePath = linePath;
282 m_fullPath = fullPath;
283 m_shapePath = stroker.createStroke(fullPath);
291 m_linePath = linePath;
292 m_fullPath = fullPath;
293 m_shapePath = checkShapePath;
284 294
285 m_rect = m_shapePath.boundingRect();
295 m_rect = m_shapePath.boundingRect();
296 } else {
297 update();
298 }
286 299 }
287 300
288 301 void LineChartItem::handleUpdated()
@@ -126,31 +126,36 void ScatterChartItem::updateGeometry()
126 126
127 127 QRectF clipRect(QPointF(0,0),domain()->size());
128 128
129 QVector<bool> offGridStatus = offGridStatusVector();
130 const int seriesLastIndex = m_series->count() - 1;
131
132 for (int i = 0; i < points.size(); i++) {
133 QGraphicsItem *item = items.at(i);
134 const QPointF &point = points.at(i);
135 const QRectF &rect = item->boundingRect();
136 // During remove animation series may have different number of points,
137 // so ensure we don't go over the index. Animation handling itself ensures that
138 // if there is actually no points in the series, then it won't generate a fake point,
139 // so we can be assured there is always at least one point in m_series here.
140 // Note that marker map values can be technically incorrect during the animation,
141 // if it was caused by an insert, but this shouldn't be a problem as the points are
142 // fake anyway. After remove animation stops, geometry is updated to correct one.
143 m_markerMap[item] = m_series->at(qMin(seriesLastIndex, i));
144 item->setPos(point.x() - rect.width() / 2, point.y() - rect.height() / 2);
145
146 if (!m_visible || offGridStatus.at(i))
147 item->setVisible(false);
148 else
149 item->setVisible(true);
150 }
129 // Only zoom in if the clipRect fits inside int limits. QWidget::update() uses
130 // a region that has to be compatible with QRect.
131 if (clipRect.height() <= INT_MAX
132 && clipRect.width() <= INT_MAX) {
133 QVector<bool> offGridStatus = offGridStatusVector();
134 const int seriesLastIndex = m_series->count() - 1;
135
136 for (int i = 0; i < points.size(); i++) {
137 QGraphicsItem *item = items.at(i);
138 const QPointF &point = points.at(i);
139 const QRectF &rect = item->boundingRect();
140 // During remove animation series may have different number of points,
141 // so ensure we don't go over the index. Animation handling itself ensures that
142 // if there is actually no points in the series, then it won't generate a fake point,
143 // so we can be assured there is always at least one point in m_series here.
144 // Note that marker map values can be technically incorrect during the animation,
145 // if it was caused by an insert, but this shouldn't be a problem as the points are
146 // fake anyway. After remove animation stops, geometry is updated to correct one.
147 m_markerMap[item] = m_series->at(qMin(seriesLastIndex, i));
148 item->setPos(point.x() - rect.width() / 2, point.y() - rect.height() / 2);
149
150 if (!m_visible || offGridStatus.at(i))
151 item->setVisible(false);
152 else
153 item->setVisible(true);
154 }
151 155
152 prepareGeometryChange();
153 m_rect = clipRect;
156 prepareGeometryChange();
157 m_rect = clipRect;
158 }
154 159 }
155 160
156 161 void ScatterChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
@@ -267,7 +267,6 void SplineChartItem::updateGeometry()
267 267 }
268 268 fullPath = splinePath;
269 269 }
270 m_path = splinePath;
271 270
272 271 QPainterPathStroker stroker;
273 272 // The full path is comprised of three separate paths.
@@ -278,10 +277,20 void SplineChartItem::updateGeometry()
278 277 stroker.setCapStyle(Qt::SquareCap);
279 278 stroker.setMiterLimit(m_linePen.miterLimit());
280 279
281 prepareGeometryChange();
280 // Only zoom in if the bounding rects of the path fit inside int limits. QWidget::update() uses
281 // a region that has to be compatible with QRect.
282 QPainterPath checkShapePath = stroker.createStroke(fullPath);
283 if (checkShapePath.boundingRect().height() <= INT_MAX
284 && checkShapePath.boundingRect().width() <= INT_MAX
285 && splinePath.boundingRect().height() <= INT_MAX
286 && splinePath.boundingRect().width() <= INT_MAX) {
287 m_path = splinePath;
282 288
283 m_fullPath = stroker.createStroke(fullPath);
284 m_rect = m_fullPath.boundingRect();
289 prepareGeometryChange();
290
291 m_fullPath = checkShapePath;
292 m_rect = m_fullPath.boundingRect();
293 }
285 294 }
286 295
287 296 /*!
General Comments 0
You need to be logged in to leave comments. Login now