diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-03-19 11:30:49 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-03-19 11:39:50 +0200 |
commit | 5b27b7b1d72ab53651ea3bec3a875cebcb8abd1f (patch) | |
tree | a9e3d24f1d7d7d844723f96987e800e414f0f939 | |
parent | 7fe25bf61dfb2ffc19e488d218b0a80d12833daf (diff) |
Fix vanishing labels for first and last ticks.RC2_1.2.1
Extra space must be reserved by layout for the axes that have wide
labels for first or last tick. Changed the logic how axis sizeHint
is interpreted to make the previously irrelevant height or width
(depending on orientation) of the sizeHint to indicate how far
the widest label extends past the first/last tick, and adjust the
grid size accordingly in layout.
Reviewed-by: Mika Salmela
-rw-r--r-- | src/axis/barcategoryaxis/chartbarcategoryaxisx.cpp | 7 | ||||
-rw-r--r-- | src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp | 7 | ||||
-rw-r--r-- | src/axis/categoryaxis/chartcategoryaxisx.cpp | 5 | ||||
-rw-r--r-- | src/axis/categoryaxis/chartcategoryaxisy.cpp | 5 | ||||
-rw-r--r-- | src/axis/datetimeaxis/chartdatetimeaxisx.cpp | 14 | ||||
-rw-r--r-- | src/axis/datetimeaxis/chartdatetimeaxisy.cpp | 15 | ||||
-rw-r--r-- | src/axis/logvalueaxis/chartlogvalueaxisx.cpp | 12 | ||||
-rw-r--r-- | src/axis/logvalueaxis/chartlogvalueaxisy.cpp | 11 | ||||
-rw-r--r-- | src/axis/valueaxis/chartvalueaxisx.cpp | 12 | ||||
-rw-r--r-- | src/axis/valueaxis/chartvalueaxisy.cpp | 11 | ||||
-rw-r--r-- | src/axis/verticalaxis.cpp | 4 | ||||
-rw-r--r-- | src/chartlayout.cpp | 12 |
12 files changed, 69 insertions, 46 deletions
diff --git a/src/axis/barcategoryaxis/chartbarcategoryaxisx.cpp b/src/axis/barcategoryaxis/chartbarcategoryaxisx.cpp index e06561f1..b4b296ec 100644 --- a/src/axis/barcategoryaxis/chartbarcategoryaxisx.cpp +++ b/src/axis/barcategoryaxis/chartbarcategoryaxisx.cpp @@ -109,13 +109,12 @@ QSizeF ChartBarCategoryAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constra QSizeF base = HorizontalAxis::sizeHint(which, constraint); QStringList ticksList = m_categoriesAxis->categories(); - qreal width=0; - qreal height=0; + qreal width = 0; // Width is irrelevant for X axes with interval labels + qreal height = 0; switch (which) { case Qt::MinimumSize: { QRectF boundingRect = labelBoundingRect(fn, "..."); - width = qMax(boundingRect.width(), base.width()); height = boundingRect.height() + labelPadding(); height += base.height(); sh = QSizeF(width, height); @@ -126,11 +125,9 @@ QSizeF ChartBarCategoryAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constra foreach (const QString& s, ticksList) { QRect rect = labelBoundingRect(fn, s); labelHeight = qMax(rect.height(), labelHeight); - width += rect.width(); } height = labelHeight + labelPadding(); height += base.height(); - width = qMax(width, base.width()); sh = QSizeF(width, height); break; } diff --git a/src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp b/src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp index f6f3cf42..e35aea69 100644 --- a/src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp +++ b/src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp @@ -107,8 +107,8 @@ QSizeF ChartBarCategoryAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constra QSizeF sh; QSizeF base = VerticalAxis::sizeHint(which, constraint); QStringList ticksList = m_categoriesAxis->categories(); - qreal width=0; - qreal height=0; + qreal width = 0; + qreal height = 0; // Height is irrelevant for Y axes with interval labels switch (which) { case Qt::MinimumSize: { @@ -117,7 +117,6 @@ QSizeF ChartBarCategoryAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constra width += base.width(); if (base.width() > 0) width += labelPadding(); - height = qMax(boundingRect.height(), base.height()); sh = QSizeF(width, height); break; } @@ -126,13 +125,11 @@ QSizeF ChartBarCategoryAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constra foreach (const QString& s, ticksList) { QRect rect = labelBoundingRect(fn, s); labelWidth = qMax(rect.width(), labelWidth); - height += rect.height(); } width = labelWidth + labelPadding() + 1; width += base.width(); if (base.width() > 0) width += labelPadding(); - height = qMax(height, base.height()); sh = QSizeF(width, height); break; } diff --git a/src/axis/categoryaxis/chartcategoryaxisx.cpp b/src/axis/categoryaxis/chartcategoryaxisx.cpp index c0685acf..b0d66510 100644 --- a/src/axis/categoryaxis/chartcategoryaxisx.cpp +++ b/src/axis/categoryaxis/chartcategoryaxisx.cpp @@ -84,13 +84,12 @@ QSizeF ChartCategoryAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint QSizeF sh; QSizeF base = HorizontalAxis::sizeHint(which, constraint); QStringList ticksList = m_axis->categoriesLabels(); - qreal width = 0; + qreal width = 0; // Width is irrelevant for X axes with interval labels qreal height = 0; switch (which) { case Qt::MinimumSize: { QRectF boundingRect = labelBoundingRect(fn, "..."); - width = qMax(boundingRect.width(), base.width()); height = boundingRect.height() + labelPadding(); height += base.height(); sh = QSizeF(width, height); @@ -101,11 +100,9 @@ QSizeF ChartCategoryAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint foreach (const QString& s, ticksList) { QRect rect = labelBoundingRect(fn, s); labelHeight = qMax(rect.height(), labelHeight); - width += rect.width(); } height = labelHeight + labelPadding(); height += base.height(); - width = qMax(width, base.width()); sh = QSizeF(width, height); break; } diff --git a/src/axis/categoryaxis/chartcategoryaxisy.cpp b/src/axis/categoryaxis/chartcategoryaxisy.cpp index b957856e..ea86b561 100644 --- a/src/axis/categoryaxis/chartcategoryaxisy.cpp +++ b/src/axis/categoryaxis/chartcategoryaxisy.cpp @@ -86,14 +86,13 @@ QSizeF ChartCategoryAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint QSizeF base = VerticalAxis::sizeHint(which, constraint); QStringList ticksList = m_axis->categoriesLabels(); qreal width = 0; - qreal height = 0; + qreal height = 0; // Height is irrelevant for Y axes with interval labels switch (which) { case Qt::MinimumSize: { QRectF boundingRect = labelBoundingRect(fn, "..."); width = boundingRect.width() + labelPadding(); width += base.width(); - height = qMax(boundingRect.height(), base.height()); sh = QSizeF(width, height); break; } @@ -102,11 +101,9 @@ QSizeF ChartCategoryAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint foreach (const QString& s, ticksList) { QRect rect = labelBoundingRect(fn, s); labelWidth = qMax(rect.width(), labelWidth); - height += rect.height(); } width = labelWidth + labelPadding() + 1; width += base.width(); - height = qMax(height, base.height()); sh = QSizeF(width, height); break; } diff --git a/src/axis/datetimeaxis/chartdatetimeaxisx.cpp b/src/axis/datetimeaxis/chartdatetimeaxisx.cpp index c7932852..591daf94 100644 --- a/src/axis/datetimeaxis/chartdatetimeaxisx.cpp +++ b/src/axis/datetimeaxis/chartdatetimeaxisx.cpp @@ -90,17 +90,18 @@ QSizeF ChartDateTimeAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint QSizeF base = HorizontalAxis::sizeHint(which, constraint); QStringList ticksList = createDateTimeLabels(min(),max(),m_axis->tickCount(),m_axis->format()); + // Width of horizontal axis sizeHint indicates the maximum distance labels can extend past + // first and last ticks. Base width is irrelevant. qreal width = 0; qreal height = 0; - if(ticksList.empty()){ + if (ticksList.empty()) return sh; - } switch (which) { case Qt::MinimumSize:{ QRectF boundingRect = labelBoundingRect(fn, "..."); - width = qMax(boundingRect.width(), base.width()); + width = boundingRect.width() / 2.0; height = boundingRect.height() + labelPadding(); height += base.height(); sh = QSizeF(width, height); @@ -108,14 +109,17 @@ QSizeF ChartDateTimeAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint } case Qt::PreferredSize: { int labelHeight = 0; + int firstWidth = -1; foreach (const QString& s, ticksList) { QRect rect = labelBoundingRect(fn, s); labelHeight = qMax(rect.height(), labelHeight); - width += rect.width(); + width = rect.width(); + if (firstWidth < 0) + firstWidth = width; } height = labelHeight + labelPadding(); height += base.height(); - width = qMax(width, base.width()); + width = qMax(width, qreal(firstWidth)) / 2.0; sh = QSizeF(width, height); break; } diff --git a/src/axis/datetimeaxis/chartdatetimeaxisy.cpp b/src/axis/datetimeaxis/chartdatetimeaxisy.cpp index b9a14073..8b27d1c4 100644 --- a/src/axis/datetimeaxis/chartdatetimeaxisy.cpp +++ b/src/axis/datetimeaxis/chartdatetimeaxisy.cpp @@ -92,32 +92,35 @@ QSizeF ChartDateTimeAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint QSizeF base = VerticalAxis::sizeHint(which, constraint); QStringList ticksList = createDateTimeLabels(min(),max(),m_axis->tickCount(),m_axis->format()); qreal width = 0; + // Height of vertical axis sizeHint indicates the maximum distance labels can extend past + // first and last ticks. Base height is irrelevant. qreal height = 0; - - if(ticksList.empty()){ + if (ticksList.empty()) return sh; - } switch (which) { case Qt::MinimumSize: { QRectF boundingRect = labelBoundingRect(fn, "..."); width = boundingRect.width() + labelPadding(); width += base.width(); - height = qMax(boundingRect.height(), base.height()); + height = boundingRect.height() / 2.0; sh = QSizeF(width, height); break; } case Qt::PreferredSize: { int labelWidth = 0; + int firstHeight = -1; foreach (const QString& s, ticksList) { QRect rect = labelBoundingRect(fn, s); labelWidth = qMax(rect.width(), labelWidth); - height += rect.height(); + height = rect.height(); + if (firstHeight < 0) + firstHeight = height; } width = labelWidth + labelPadding() + 2; //two pixels of tolerance width += base.width(); - height = qMax(height, base.height()); + height = qMax(height, qreal(firstHeight)) / 2.0; sh = QSizeF(width, height); break; } diff --git a/src/axis/logvalueaxis/chartlogvalueaxisx.cpp b/src/axis/logvalueaxis/chartlogvalueaxisx.cpp index 39e9db6a..426b7618 100644 --- a/src/axis/logvalueaxis/chartlogvalueaxisx.cpp +++ b/src/axis/logvalueaxis/chartlogvalueaxisx.cpp @@ -99,14 +99,15 @@ QSizeF ChartLogValueAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint ticksList = createLogValueLabels(m_axis->min(), m_axis->max(), m_axis->base(), tickCount, m_axis->labelFormat()); else ticksList.append(QString(" ")); + // Width of horizontal axis sizeHint indicates the maximum distance labels can extend past + // first and last ticks. Base width is irrelevant. qreal width = 0; qreal height = 0; - switch (which) { case Qt::MinimumSize:{ QRectF boundingRect = labelBoundingRect(fn, "..."); - width = qMax(boundingRect.width(), base.width()); + width = boundingRect.width() / 2.0; height = boundingRect.height() + labelPadding(); height += base.height(); sh = QSizeF(width, height); @@ -114,14 +115,17 @@ QSizeF ChartLogValueAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint } case Qt::PreferredSize: { int labelHeight = 0; + int firstWidth = -1; foreach (const QString& s, ticksList) { QRect rect = labelBoundingRect(fn, s); labelHeight = qMax(rect.height(), labelHeight); - width += rect.width(); + width = rect.width(); + if (firstWidth < 0) + firstWidth = width; } height = labelHeight + labelPadding(); height += base.height(); - width = qMax(width, base.width()); + width = qMax(width, qreal(firstWidth)) / 2.0; sh = QSizeF(width, height); break; } diff --git a/src/axis/logvalueaxis/chartlogvalueaxisy.cpp b/src/axis/logvalueaxis/chartlogvalueaxisy.cpp index d945e795..8a63a885 100644 --- a/src/axis/logvalueaxis/chartlogvalueaxisy.cpp +++ b/src/axis/logvalueaxis/chartlogvalueaxisy.cpp @@ -100,6 +100,8 @@ QSizeF ChartLogValueAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint else ticksList.append(QString(" ")); qreal width = 0; + // Height of vertical axis sizeHint indicates the maximum distance labels can extend past + // first and last ticks. Base height is irrelevant. qreal height = 0; switch (which) { @@ -107,20 +109,23 @@ QSizeF ChartLogValueAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint QRectF boundingRect = labelBoundingRect(fn, "..."); width = boundingRect.width() + labelPadding(); width += base.width(); - height = qMax(boundingRect.height(), base.height()); + height = boundingRect.height() / 2.0; sh = QSizeF(width, height); break; } case Qt::PreferredSize: { int labelWidth = 0; + int firstHeight = -1; foreach (const QString& s, ticksList) { QRect rect = labelBoundingRect(fn, s); labelWidth = qMax(rect.width(), labelWidth); - height += rect.height(); + height = rect.height(); + if (firstHeight < 0) + firstHeight = height; } width = labelWidth + labelPadding() + 2; //two pixels of tolerance width += base.width(); - height = qMax(height, base.height()); + height = qMax(height, qreal(firstHeight)) / 2.0; sh = QSizeF(width, height); break; } diff --git a/src/axis/valueaxis/chartvalueaxisx.cpp b/src/axis/valueaxis/chartvalueaxisx.cpp index ead4abf6..ccf49254 100644 --- a/src/axis/valueaxis/chartvalueaxisx.cpp +++ b/src/axis/valueaxis/chartvalueaxisx.cpp @@ -92,14 +92,15 @@ QSizeF ChartValueAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint) c QSizeF base = HorizontalAxis::sizeHint(which, constraint); QStringList ticksList = createValueLabels(min(),max(),m_axis->tickCount(),m_axis->labelFormat()); + // Width of horizontal axis sizeHint indicates the maximum distance labels can extend past + // first and last ticks. Base width is irrelevant. qreal width = 0; qreal height = 0; - switch (which) { case Qt::MinimumSize: { QRectF boundingRect = labelBoundingRect(fn, "..."); - width = qMax(boundingRect.width(), base.width()); + width = boundingRect.width() / 2.0; height = boundingRect.height() + labelPadding(); height += base.height(); sh = QSizeF(width, height); @@ -107,14 +108,17 @@ QSizeF ChartValueAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint) c } case Qt::PreferredSize: { int labelHeight = 0; + int firstWidth = -1; foreach (const QString& s, ticksList) { QRect rect = labelBoundingRect(fn, s); labelHeight = qMax(rect.height(), labelHeight); - width += rect.width(); + width = rect.width(); + if (firstWidth < 0) + firstWidth = width; } height = labelHeight + labelPadding(); height += base.height(); - width = qMax(width, base.width()); + width = qMax(width, qreal(firstWidth)) / 2.0; sh = QSizeF(width, height); break; } diff --git a/src/axis/valueaxis/chartvalueaxisy.cpp b/src/axis/valueaxis/chartvalueaxisy.cpp index 4ed2456d..848d4aeb 100644 --- a/src/axis/valueaxis/chartvalueaxisy.cpp +++ b/src/axis/valueaxis/chartvalueaxisy.cpp @@ -93,6 +93,8 @@ QSizeF ChartValueAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint) c QSizeF base = VerticalAxis::sizeHint(which, constraint); QStringList ticksList = createValueLabels(min(),max(),m_axis->tickCount(),m_axis->labelFormat()); qreal width = 0; + // Height of vertical axis sizeHint indicates the maximum distance labels can extend past + // first and last ticks. Base height is irrelevant. qreal height = 0; switch (which) { @@ -100,20 +102,23 @@ QSizeF ChartValueAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint) c QRectF boundingRect = labelBoundingRect(fn, "..."); width = boundingRect.width() + labelPadding(); width += base.width(); - height = qMax(boundingRect.height(), base.height()); + height = boundingRect.height() / 2.0; sh = QSizeF(width, height); break; } case Qt::PreferredSize: { int labelWidth = 0; + int firstHeight = -1; foreach (const QString& s, ticksList) { QRect rect = labelBoundingRect(fn, s); labelWidth = qMax(rect.width(), labelWidth); - height += rect.height(); + height = rect.height(); + if (firstHeight < 0) + firstHeight = height; } width = labelWidth + labelPadding() + 2; //two pixels of tolerance width += base.width(); - height = qMax(height, base.height()); + height = qMax(height, qreal(firstHeight)) / 2.0; sh = QSizeF(width, height); break; } diff --git a/src/axis/verticalaxis.cpp b/src/axis/verticalaxis.cpp index 29d62ae1..0c6ecace 100644 --- a/src/axis/verticalaxis.cpp +++ b/src/axis/verticalaxis.cpp @@ -154,8 +154,8 @@ void VerticalAxis::updateGeometry() //label overlap detection if(labelItem->pos().y() + boundingRect.height() > height || - labelItem->pos().y() + boundingRect.height()/2 > gridRect.bottom() || - labelItem->pos().y() + boundingRect.height()/2 < gridRect.top()) { + labelItem->pos().y() + boundingRect.height()/2 > axisRect.bottom() || + labelItem->pos().y() + boundingRect.height()/2 < axisRect.top()) { labelItem->setVisible(false); } else { diff --git a/src/chartlayout.cpp b/src/chartlayout.cpp index b3f34b76..bd885ba9 100644 --- a/src/chartlayout.cpp +++ b/src/chartlayout.cpp @@ -109,6 +109,7 @@ QRectF ChartLayout::calculateAxisGeometry(const QRectF &geometry, const QList<Ch QSizeF minBottom(0,0); QSizeF top(0,0); QSizeF minTop(0,0); + QSizeF labelExtents(0,0); int leftCount = 0; int rightCount = 0; int topCount = 0; @@ -119,7 +120,6 @@ QRectF ChartLayout::calculateAxisGeometry(const QRectF &geometry, const QList<Ch if (!axis->isVisible()) continue; - QSizeF size = axis->effectiveSizeHint(Qt::PreferredSize); //this is used to get single thick font size QSizeF minSize = axis->effectiveSizeHint(Qt::MinimumSize); @@ -130,6 +130,7 @@ QRectF ChartLayout::calculateAxisGeometry(const QRectF &geometry, const QList<Ch left.setHeight(qMax(left.height(),size.height())); minLeft.setWidth(minLeft.width()+minSize.width()); minLeft.setHeight(qMax(minLeft.height(),minSize.height())); + labelExtents.setHeight(qMax(size.height(), labelExtents.height())); leftCount++; break; case Qt::AlignRight: @@ -137,6 +138,7 @@ QRectF ChartLayout::calculateAxisGeometry(const QRectF &geometry, const QList<Ch right.setHeight(qMax(right.height(),size.height())); minRight.setWidth(minRight.width()+minSize.width()); minRight.setHeight(qMax(minRight.height(),minSize.height())); + labelExtents.setHeight(qMax(size.height(), labelExtents.height())); rightCount++; break; case Qt::AlignTop: @@ -144,6 +146,7 @@ QRectF ChartLayout::calculateAxisGeometry(const QRectF &geometry, const QList<Ch top.setHeight(top.height()+size.height()); minTop.setWidth(qMax(minTop.width(),minSize.width())); minTop.setHeight(minTop.height()+minSize.height()); + labelExtents.setWidth(qMax(size.width(), labelExtents.width())); topCount++; break; case Qt::AlignBottom: @@ -151,6 +154,7 @@ QRectF ChartLayout::calculateAxisGeometry(const QRectF &geometry, const QList<Ch bottom.setHeight(bottom.height() + size.height()); minBottom.setWidth(qMax(minBottom.width(),minSize.width())); minBottom.setHeight(minBottom.height() + minSize.height()); + labelExtents.setWidth(qMax(size.width(), labelExtents.width())); bottomCount++; break; default: @@ -208,6 +212,12 @@ QRectF ChartLayout::calculateAxisGeometry(const QRectF &geometry, const QList<Ch qreal minHeight = qMax(minLeft.height(),minRight.height()) + 1; qreal minWidth = qMax(minTop.width(),minBottom.width()) + 1; + // Ensure that there is enough space for first and last tick labels. + left.setWidth(qMax(labelExtents.width(), left.width())); + right.setWidth(qMax(labelExtents.width(), right.width())); + top.setHeight(qMax(labelExtents.height(), top.height())); + bottom.setHeight(qMax(labelExtents.height(), bottom.height())); + QRectF chartRect = geometry.adjusted(qMax(left.width(),minWidth/2), qMax(top.height(), minHeight/2),-qMax(right.width(),minWidth/2),-qMax(bottom.height(),minHeight/2)); qreal leftOffset = 0; |