summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-03-19 11:30:49 +0200
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-03-19 11:39:50 +0200
commit5b27b7b1d72ab53651ea3bec3a875cebcb8abd1f (patch)
treea9e3d24f1d7d7d844723f96987e800e414f0f939
parent7fe25bf61dfb2ffc19e488d218b0a80d12833daf (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.cpp7
-rw-r--r--src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp7
-rw-r--r--src/axis/categoryaxis/chartcategoryaxisx.cpp5
-rw-r--r--src/axis/categoryaxis/chartcategoryaxisy.cpp5
-rw-r--r--src/axis/datetimeaxis/chartdatetimeaxisx.cpp14
-rw-r--r--src/axis/datetimeaxis/chartdatetimeaxisy.cpp15
-rw-r--r--src/axis/logvalueaxis/chartlogvalueaxisx.cpp12
-rw-r--r--src/axis/logvalueaxis/chartlogvalueaxisy.cpp11
-rw-r--r--src/axis/valueaxis/chartvalueaxisx.cpp12
-rw-r--r--src/axis/valueaxis/chartvalueaxisy.cpp11
-rw-r--r--src/axis/verticalaxis.cpp4
-rw-r--r--src/chartlayout.cpp12
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;