summaryrefslogtreecommitdiffstats
path: root/src/charts
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2015-09-28 16:11:49 +0300
committerMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2015-09-29 07:42:48 +0000
commit7557d1ea51b55c7f01c8ad8518042ee1aebe8f1d (patch)
tree63c462a536b280778ba613bfb6d61966c10ede8c /src/charts
parent2dcfcd4a9f6976067c41adc7202f9414f0a4c369 (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.cpp21
-rw-r--r--src/charts/axis/verticalaxis.cpp22
-rw-r--r--src/charts/layout/abstractchartlayout.cpp4
-rw-r--r--src/charts/legend/legendlayout.cpp22
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;
}