static void rangef_func(const RangeF& rangef) { CHECK(rangef == RangeF(.5,1.5)); }
void GraphView::redraw(const QSizeF &size) { QRectF r; QSizeF mx, my; RangeF rx, ry; qreal sx, sy; if (_visible.isEmpty() || _bounds.isNull()) { removeItem(_xAxis); removeItem(_yAxis); removeItem(_slider); removeItem(_info); removeItem(_grid); _scene->setSceneRect(QRectF()); return; } addItem(_xAxis); addItem(_yAxis); addItem(_slider); addItem(_info); addItem(_grid); rx = RangeF(bounds().left() * _xScale, bounds().right() * _xScale); ry = RangeF(bounds().top() * _yScale + _yOffset, bounds().bottom() * _yScale + _yOffset); if (ry.size() < _minYRange) ry.resize(_minYRange); _xAxis->setRange(rx); _yAxis->setRange(ry); mx = _xAxis->margin(); my = _yAxis->margin(); r = _bounds; if (r.height() < _minYRange) r.adjust(0, -(_minYRange/2 - r.height()/2), 0, _minYRange/2 - r.height()/2); sx = (size.width() - (my.width() + mx.width())) / r.width(); sy = (size.height() - (mx.height() + my.height()) - _info->boundingRect().height()) / r.height(); for (int i = 0; i < _visible.size(); i++) _visible.at(i)->setScale(sx, sy); QPointF p(r.left() * sx, r.top() * sy); QSizeF s(r.width() * sx, r.height() * sy); r = QRectF(p, s); if (r.height() < _minYRange * sy) r.adjust(0, -(_minYRange/2 * sy - r.height()/2), 0, (_minYRange/2) * sy - r.height()/2); _xAxis->setSize(r.width()); _yAxis->setSize(r.height()); _xAxis->setPos(r.bottomLeft()); _yAxis->setPos(r.bottomLeft()); _grid->setSize(r.size()); _grid->setTicks(_xAxis->ticks(), _yAxis->ticks()); _grid->setPos(r.bottomLeft()); _slider->setArea(r); updateSliderPosition(); r |= _xAxis->sceneBoundingRect(); r |= _yAxis->sceneBoundingRect(); _info->setPos(r.topLeft() + QPointF(r.width()/2 - _info->boundingRect().width()/2, -_info->boundingRect().height())); _scene->setSceneRect(_scene->itemsBoundingRect()); }