diff options
author | Miikka Heikkinen <miikka.heikkinen@theqtcompany.com> | 2015-09-28 16:11:49 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@theqtcompany.com> | 2015-09-29 07:42:48 +0000 |
commit | 7557d1ea51b55c7f01c8ad8518042ee1aebe8f1d (patch) | |
tree | 63c462a536b280778ba613bfb6d61966c10ede8c /src/charts | |
parent | 2dcfcd4a9f6976067c41adc7202f9414f0a4c369 (diff) |
Fix label clipping issues using QOpenGLWidget as ChartView viewport
Task-number: QTRD-3701
Change-Id: I8efc20300d2aa6065918e02190da746463a5d504
Reviewed-by: Titta Heikkala <titta.heikkala@theqtcompany.com>
Diffstat (limited to 'src/charts')
-rw-r--r-- | src/charts/axis/horizontalaxis.cpp | 21 | ||||
-rw-r--r-- | src/charts/axis/verticalaxis.cpp | 22 | ||||
-rw-r--r-- | src/charts/layout/abstractchartlayout.cpp | 4 | ||||
-rw-r--r-- | src/charts/legend/legendlayout.cpp | 22 |
4 files changed, 41 insertions, 28 deletions
diff --git a/src/charts/axis/horizontalaxis.cpp b/src/charts/axis/horizontalaxis.cpp index fa4b0382..12d2cf8c 100644 --- a/src/charts/axis/horizontalaxis.cpp +++ b/src/charts/axis/horizontalaxis.cpp @@ -141,9 +141,10 @@ void HorizontalAxis::updateGeometry() qreal widthDiff = rect.width() - boundingRect.width(); //ticks and label position + QPointF labelPos; if (axis()->alignment() == Qt::AlignTop) { if (axis()->isReverse()) { - labelItem->setPos(gridRect.right() - layout[layout.size() - i - 1] + labelPos = QPointF(gridRect.right() - layout[layout.size() - i - 1] + gridRect.left() - center.x(), axisRect.bottom() - rect.height() + (heightDiff / 2.0) - labelPadding()); @@ -152,21 +153,21 @@ void HorizontalAxis::updateGeometry() gridRect.right() + gridRect.left() - layout[i], axisRect.bottom() - labelPadding()); } else { - labelItem->setPos(layout[i] - center.x(), axisRect.bottom() - rect.height() + labelPos = QPointF(layout[i] - center.x(), axisRect.bottom() - rect.height() + (heightDiff / 2.0) - labelPadding()); tickItem->setLine(layout[i], axisRect.bottom(), layout[i], axisRect.bottom() - labelPadding()); } } else if (axis()->alignment() == Qt::AlignBottom) { if (axis()->isReverse()) { - labelItem->setPos(gridRect.right() - layout[layout.size() - i - 1] + labelPos = QPointF(gridRect.right() - layout[layout.size() - i - 1] + gridRect.left() - center.x(), axisRect.top() - (heightDiff / 2.0) + labelPadding()); tickItem->setLine(gridRect.right() + gridRect.left() - layout[i], axisRect.top(), gridRect.right() + gridRect.left() - layout[i], axisRect.top() + labelPadding()); } else { - labelItem->setPos(layout[i] - center.x(), axisRect.top() - (heightDiff / 2.0) + labelPos = QPointF(layout[i] - center.x(), axisRect.top() - (heightDiff / 2.0) + labelPadding()); tickItem->setLine(layout[i], axisRect.top(), layout[i], axisRect.top() + labelPadding()); @@ -193,7 +194,7 @@ void HorizontalAxis::updateGeometry() && (leftBound == gridRect.left() || rightBound == gridRect.right())) { forceHide = true; } else { - labelItem->setPos(leftBound + (delta / 2.0) - center.x(), labelItem->pos().y()); + labelPos.setX(leftBound + (delta / 2.0) - center.x()); } } else { QCategoryAxis *categoryAxis = static_cast<QCategoryAxis *>(axis()); @@ -202,19 +203,21 @@ void HorizontalAxis::updateGeometry() && (leftBound == gridRect.left() || rightBound == gridRect.right())) { forceHide = true; } else { - labelItem->setPos(leftBound + (delta / 2.0) - center.x(), - labelItem->pos().y()); + labelPos.setX(leftBound + (delta / 2.0) - center.x()); } } else if (categoryAxis->labelsPosition() == QCategoryAxis::AxisLabelsPositionOnValue) { if (axis()->isReverse()) - labelItem->setPos(leftBound - center.x(), labelItem->pos().y()); + labelPos.setX(leftBound - center.x()); else - labelItem->setPos(rightBound - center.x(), labelItem->pos().y()); + labelPos.setX(rightBound - center.x()); } } } + // Round to full pixel via QPoint to avoid one pixel clipping on the edge in some cases + labelItem->setPos(labelPos.toPoint()); + //label overlap detection - compensate one pixel for rounding errors if ((labelItem->pos().x() < width && labelItem->toPlainText() == ellipsis) || forceHide || (labelItem->pos().x() + (widthDiff / 2.0)) < (axisRect.left() - 1.0) || diff --git a/src/charts/axis/verticalaxis.cpp b/src/charts/axis/verticalaxis.cpp index dfa1a3b0..0d858704 100644 --- a/src/charts/axis/verticalaxis.cpp +++ b/src/charts/axis/verticalaxis.cpp @@ -143,9 +143,10 @@ void VerticalAxis::updateGeometry() qreal heightDiff = rect.height() - boundingRect.height(); //ticks and label position + QPointF labelPos; if (axis()->alignment() == Qt::AlignLeft) { if (axis()->isReverse()) { - labelItem->setPos(axisRect.right() - rect.width() + (widthDiff / 2.0) + labelPos = QPointF(axisRect.right() - rect.width() + (widthDiff / 2.0) - labelPadding(), gridRect.top() + gridRect.bottom() - layout[layout.size() - i - 1] - center.y()); @@ -154,7 +155,7 @@ void VerticalAxis::updateGeometry() axisRect.right(), gridRect.top() + gridRect.bottom() - layout[i]); } else { - labelItem->setPos(axisRect.right() - rect.width() + (widthDiff / 2.0) + labelPos = QPointF(axisRect.right() - rect.width() + (widthDiff / 2.0) - labelPadding(), layout[i] - center.y()); tickItem->setLine(axisRect.right() - labelPadding(), layout[i], @@ -166,11 +167,11 @@ void VerticalAxis::updateGeometry() gridRect.top() + gridRect.bottom() - layout[i], axisRect.left() + labelPadding(), gridRect.top() + gridRect.bottom() - layout[i]); - labelItem->setPos(axisRect.left() + labelPadding() - (widthDiff / 2.0), + labelPos = QPointF(axisRect.left() + labelPadding() - (widthDiff / 2.0), gridRect.top() + gridRect.bottom() - layout[layout.size() - i - 1] - center.y()); } else { - labelItem->setPos(axisRect.left() + labelPadding() - (widthDiff / 2.0), + labelPos = QPointF(axisRect.left() + labelPadding() - (widthDiff / 2.0), layout[i] - center.y()); tickItem->setLine(axisRect.left(), layout[i], axisRect.left() + labelPadding(), layout[i]); @@ -199,8 +200,7 @@ void VerticalAxis::updateGeometry() && (lowerBound == gridRect.bottom() || upperBound == gridRect.top())) { forceHide = true; } else { - labelItem->setPos(labelItem->pos().x(), - lowerBound - (delta / 2.0) - center.y()); + labelPos.setY(lowerBound - (delta / 2.0) - center.y()); } } else { QCategoryAxis *categoryAxis = static_cast<QCategoryAxis *>(axis()); @@ -209,22 +209,24 @@ void VerticalAxis::updateGeometry() && (lowerBound == gridRect.bottom() || upperBound == gridRect.top())) { forceHide = true; } else { - labelItem->setPos(labelItem->pos().x(), - lowerBound - (delta / 2.0) - center.y()); + labelPos.setY(lowerBound - (delta / 2.0) - center.y()); } } else if (categoryAxis->labelsPosition() == QCategoryAxis::AxisLabelsPositionOnValue) { labelOnValue = true; if (axis()->isReverse()) { - labelItem->setPos(labelItem->pos().x(), gridRect.top() + gridRect.bottom() + labelPos.setY(gridRect.top() + gridRect.bottom() - layout[i + 1] - center.y()); } else { - labelItem->setPos(labelItem->pos().x(), upperBound - center.y()); + labelPos.setY(upperBound - center.y()); } } } } + // Round to full pixel via QPoint to avoid one pixel clipping on the edge in some cases + labelItem->setPos(labelPos.toPoint()); + //label overlap detection - compensate one pixel for rounding errors if (axis()->isReverse()) { if (forceHide) diff --git a/src/charts/layout/abstractchartlayout.cpp b/src/charts/layout/abstractchartlayout.cpp index 32158988..223600b7 100644 --- a/src/charts/layout/abstractchartlayout.cpp +++ b/src/charts/layout/abstractchartlayout.cpp @@ -156,7 +156,9 @@ QRectF AbstractChartLayout::calculateLegendMinimum(const QRectF &geometry, QLege QRectF AbstractChartLayout::calculateTitleGeometry(const QRectF &geometry, ChartTitle *title) const { title->setGeometry(geometry); - QPointF center = geometry.center() - title->boundingRect().center(); + // Round to full pixel via QPoint to avoid one pixel clipping on the edge in some cases + QPointF center((geometry.center() - title->boundingRect().center()).toPoint()); + title->setPos(center.x(), title->pos().y()); return geometry.adjusted(0, title->boundingRect().height()+1, 0, 0); } diff --git a/src/charts/legend/legendlayout.cpp b/src/charts/legend/legendlayout.cpp index c7d88e18..1d7ea112 100644 --- a/src/charts/legend/legendlayout.cpp +++ b/src/charts/legend/legendlayout.cpp @@ -233,10 +233,13 @@ void LegendLayout::setAttachedGeometry(const QRectF &rect) // Delete structs from the container qDeleteAll(legendWidthList); - if (m_width < geometry.width()) - m_legend->d_ptr->items()->setPos(geometry.width() / 2 - m_width / 2, geometry.top()); - else - m_legend->d_ptr->items()->setPos(geometry.topLeft()); + // Round to full pixel via QPoint to avoid one pixel clipping on the edge in some cases + if (m_width < geometry.width()) { + m_legend->d_ptr->items()->setPos(QPoint(geometry.width() / 2 - m_width / 2, + geometry.top())); + } else { + m_legend->d_ptr->items()->setPos(geometry.topLeft().toPoint()); + } m_height = size.height(); } break; @@ -262,10 +265,13 @@ void LegendLayout::setAttachedGeometry(const QRectF &rect) } } - if (m_height < geometry.height()) - m_legend->d_ptr->items()->setPos(geometry.left(), geometry.height() / 2 - m_height / 2); - else - m_legend->d_ptr->items()->setPos(geometry.topLeft()); + // Round to full pixel via QPoint to avoid one pixel clipping on the edge in some cases + if (m_height < geometry.height()) { + m_legend->d_ptr->items()->setPos(QPoint(geometry.left(), + geometry.height() / 2 - m_height / 2)); + } else { + m_legend->d_ptr->items()->setPos(geometry.topLeft().toPoint()); + } m_width = size.width(); break; } |