##// END OF EJS Templates
Don't reserve space for chart title if it is empty....
Don't reserve space for chart title if it is empty. If title.isEmpty() returns true, chart title is no longer reserved any space. If you want to reserve space for "empty" title in the future, you can do so by specifying e.g. a single space for title. Task-number: QTRD-3480 Change-Id: I5b2b44acf715b3bd9b4243049c4985ca63a4a16d Reviewed-by: Titta Heikkala <titta.heikkala@theqtcompany.com>

File last commit:

r2776:bc1f6aa59d42
r2794:05fa3caa7879
Show More
polarchartaxisradial.cpp
295 lines | 11.3 KiB | text/x-c | CppLexer
/ src / charts / axis / polarchartaxisradial.cpp
Miikka Heikkinen
Add Polar chart support...
r2483 /****************************************************************************
**
Titta Heikkala
Copyright header changes...
r2776 ** Copyright (C) 2015 The Qt Company Ltd
Miikka Heikkinen
Add Polar chart support...
r2483 ** All rights reserved.
Titta Heikkala
Copyright header changes...
r2776 ** For any questions to The Qt Company, please use contact form at http://qt.io
Miikka Heikkinen
Add Polar chart support...
r2483 **
Titta Heikkala
Updated license headers...
r2740 ** This file is part of the Qt Charts module.
Miikka Heikkinen
Add Polar chart support...
r2483 **
Titta Heikkala
Updated license headers...
r2740 ** Licensees holding valid commercial license for Qt may use this file in
** accordance with the Qt License Agreement provided with the Software
** or, alternatively, in accordance with the terms contained in a written
Titta Heikkala
Copyright header changes...
r2776 ** agreement between you and The Qt Company.
Miikka Heikkinen
Add Polar chart support...
r2483 **
** If you have questions regarding the use of this file, please use
Titta Heikkala
Updated license headers...
r2740 ** contact form at http://qt.io
Miikka Heikkinen
Add Polar chart support...
r2483 **
****************************************************************************/
Titta Heikkala
Fix include syntax...
r2714 #include <private/polarchartaxisradial_p.h>
#include <private/chartpresenter_p.h>
#include <private/abstractchartlayout_p.h>
#include <private/qabstractaxis_p.h>
#include <private/linearrowitem_p.h>
#include <QtGui/QTextDocument>
Miikka Heikkinen
Add Polar chart support...
r2483
Titta Heikkala
Qt Charts project file structure change...
r2712 QT_CHARTS_BEGIN_NAMESPACE
Miikka Heikkinen
Add Polar chart support...
r2483
PolarChartAxisRadial::PolarChartAxisRadial(QAbstractAxis *axis, QGraphicsItem *item, bool intervalAxis)
: PolarChartAxis(axis, item, intervalAxis)
{
}
PolarChartAxisRadial::~PolarChartAxisRadial()
{
}
void PolarChartAxisRadial::updateGeometry()
{
const QVector<qreal> &layout = this->layout();
if (layout.isEmpty())
return;
createAxisLabels(layout);
QStringList labelList = labels();
QPointF center = axisGeometry().center();
QList<QGraphicsItem *> arrowItemList = arrowItems();
QList<QGraphicsItem *> gridItemList = gridItems();
QList<QGraphicsItem *> labelItemList = labelItems();
QList<QGraphicsItem *> shadeItemList = shadeItems();
Miikka Heikkinen
Added HTML support for various text items...
r2539 QGraphicsTextItem* title = titleItem();
Miikka Heikkinen
Add Polar chart support...
r2483 qreal radius = axisGeometry().height() / 2.0;
QLineF line(center, center + QPointF(0, -radius));
QGraphicsLineItem *axisLine = static_cast<QGraphicsLineItem *>(arrowItemList.at(0));
axisLine->setLine(line);
QRectF previousLabelRect;
bool firstShade = true;
bool nextTickVisible = false;
if (layout.size())
nextTickVisible = !(layout.at(0) < 0.0 || layout.at(0) > radius);
for (int i = 0; i < layout.size(); ++i) {
qreal radialCoordinate = layout.at(i);
QGraphicsEllipseItem *gridItem = static_cast<QGraphicsEllipseItem *>(gridItemList.at(i));
QGraphicsLineItem *tickItem = static_cast<QGraphicsLineItem *>(arrowItemList.at(i + 1));
Miikka Heikkinen
Added HTML support for various text items...
r2539 QGraphicsTextItem *labelItem = static_cast<QGraphicsTextItem *>(labelItemList.at(i));
Miikka Heikkinen
Add Polar chart support...
r2483 QGraphicsPathItem *shadeItem = 0;
if (i == 0)
shadeItem = static_cast<QGraphicsPathItem *>(shadeItemList.at(0));
else if (i % 2)
shadeItem = static_cast<QGraphicsPathItem *>(shadeItemList.at((i / 2) + 1));
// Ignore ticks outside valid range
bool currentTickVisible = nextTickVisible;
if ((i == layout.size() - 1)
|| layout.at(i + 1) < 0.0
|| layout.at(i + 1) > radius) {
nextTickVisible = false;
} else {
nextTickVisible = true;
}
qreal labelCoordinate = radialCoordinate;
qreal labelVisible = currentTickVisible;
qreal labelPad = labelPadding() / 2.0;
if (intervalAxis()) {
qreal farEdge;
if (i == (layout.size() - 1))
farEdge = radius;
else
farEdge = qMin(radius, layout.at(i + 1));
// Adjust the labelCoordinate to show it if next tick is visible
if (nextTickVisible)
Miikka Heikkinen
Fix some warnings for android build....
r2504 labelCoordinate = qMax(qreal(0.0), labelCoordinate);
Miikka Heikkinen
Add Polar chart support...
r2483
labelCoordinate = (labelCoordinate + farEdge) / 2.0;
if (labelCoordinate > 0.0 && labelCoordinate < radius)
labelVisible = true;
else
labelVisible = false;
}
// Radial axis label
if (axis()->labelsVisible() && labelVisible) {
Titta Heikkala
Fix multiline alignment...
r2607 QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(),
labelList.at(i),
axis()->labelsAngle());
labelItem->setTextWidth(boundingRect.width());
Miikka Heikkinen
Added HTML support for various text items...
r2539 labelItem->setHtml(labelList.at(i));
Miikka Heikkinen
Add Polar chart support...
r2483 QRectF labelRect = labelItem->boundingRect();
QPointF labelCenter = labelRect.center();
labelItem->setTransformOriginPoint(labelCenter.x(), labelCenter.y());
boundingRect.moveCenter(labelCenter);
QPointF positionDiff(labelRect.topLeft() - boundingRect.topLeft());
QPointF labelPoint = center;
if (intervalAxis())
labelPoint += QPointF(labelPad, -labelCoordinate - (boundingRect.height() / 2.0));
else
labelPoint += QPointF(labelPad, labelPad - labelCoordinate);
labelRect.moveTopLeft(labelPoint);
labelItem->setPos(labelRect.topLeft() + positionDiff);
// Label overlap detection
labelRect.setSize(boundingRect.size());
if ((i && previousLabelRect.intersects(labelRect))
|| !axisGeometry().contains(labelRect)) {
labelVisible = false;
} else {
previousLabelRect = labelRect;
labelVisible = true;
}
}
labelItem->setVisible(labelVisible);
if (!currentTickVisible) {
gridItem->setVisible(false);
tickItem->setVisible(false);
if (shadeItem)
shadeItem->setVisible(false);
continue;
}
// Radial grid line
QRectF gridRect;
gridRect.setWidth(radialCoordinate * 2.0);
gridRect.setHeight(radialCoordinate * 2.0);
gridRect.moveCenter(center);
gridItem->setRect(gridRect);
gridItem->setVisible(true);
// Tick
QLineF tickLine(-tickWidth(), 0.0, tickWidth(), 0.0);
tickLine.translate(center.rx(), gridRect.top());
tickItem->setLine(tickLine);
tickItem->setVisible(true);
// Shades
if (i % 2 || (i == 0 && !nextTickVisible)) {
QPainterPath path;
if (i == 0) {
// If first tick is also the last, we need to custom fill the inner circle
// or it won't get filled.
QRectF innerCircle(0.0, 0.0, layout.at(0) * 2.0, layout.at(0) * 2.0);
innerCircle.moveCenter(center);
path.addEllipse(innerCircle);
} else {
QRectF otherGridRect;
if (!nextTickVisible) { // Last visible tick
otherGridRect = axisGeometry();
} else {
qreal otherGridRectDimension = layout.at(i + 1) * 2.0;
otherGridRect.setWidth(otherGridRectDimension);
otherGridRect.setHeight(otherGridRectDimension);
otherGridRect.moveCenter(center);
}
path.addEllipse(gridRect);
path.addEllipse(otherGridRect);
// Add additional shading in first visible shade item if there is a partial tick
// to be filled at the center (log & category axes)
if (firstShade) {
QGraphicsPathItem *specialShadeItem = static_cast<QGraphicsPathItem *>(shadeItemList.at(0));
if (layout.at(i - 1) > 0.0) {
QRectF innerCircle(0.0, 0.0, layout.at(i - 1) * 2.0, layout.at(i - 1) * 2.0);
innerCircle.moveCenter(center);
QPainterPath specialPath;
specialPath.addEllipse(innerCircle);
specialShadeItem->setPath(specialPath);
specialShadeItem->setVisible(true);
} else {
specialShadeItem->setVisible(false);
}
}
}
shadeItem->setPath(path);
shadeItem->setVisible(true);
firstShade = false;
}
}
// Title, along the 0 axis
QString titleText = axis()->titleText();
if (!titleText.isEmpty() && axis()->isTitleVisible()) {
Titta Heikkala
Fix multiline alignment...
r2607 QRectF truncatedRect;
Titta Heikkala
Fix long labels visibility for QBarChart...
r2604 title->setHtml(ChartPresenter::truncatedText(axis()->titleFont(), titleText, qreal(0.0),
Titta Heikkala
Fix multiline alignment...
r2607 radius, radius, truncatedRect));
title->setTextWidth(truncatedRect.width());
Miikka Heikkinen
Add Polar chart support...
r2483
Miikka Heikkinen
Fix multiline axis label positioning....
r2534 QRectF titleBoundingRect = title->boundingRect();
Miikka Heikkinen
Add Polar chart support...
r2483 QPointF titleCenter = titleBoundingRect.center();
QPointF arrowCenter = axisLine->boundingRect().center();
QPointF titleCenterDiff = arrowCenter - titleCenter;
Miikka Heikkinen
Fix multiline axis titles truncation...
r2540 title->setPos(titleCenterDiff.x() - titlePadding() - (titleBoundingRect.height() / 2.0), titleCenterDiff.y());
Miikka Heikkinen
Add Polar chart support...
r2483 title->setTransformOriginPoint(titleCenter);
title->setRotation(270.0);
}
QGraphicsLayoutItem::updateGeometry();
}
Qt::Orientation PolarChartAxisRadial::orientation() const
{
return Qt::Vertical;
}
void PolarChartAxisRadial::createItems(int count)
{
if (arrowItems().count() == 0) {
// radial axis center line
QGraphicsLineItem *arrow = new LineArrowItem(this, presenter()->rootItem());
arrow->setPen(axis()->linePen());
arrowGroup()->addToGroup(arrow);
}
Titta Heikkala
Fix setting the axis title...
r2608 QGraphicsTextItem *title = titleItem();
title->setFont(axis()->titleFont());
title->setDefaultTextColor(axis()->titleBrush().color());
title->setHtml(axis()->titleText());
Miikka Heikkinen
Add Polar chart support...
r2483 for (int i = 0; i < count; ++i) {
QGraphicsLineItem *arrow = new QGraphicsLineItem(presenter()->rootItem());
QGraphicsEllipseItem *grid = new QGraphicsEllipseItem(presenter()->rootItem());
Miikka Heikkinen
Added HTML support for various text items...
r2539 QGraphicsTextItem *label = new QGraphicsTextItem(presenter()->rootItem());
Miikka Heikkinen
Fix text item margins...
r2592 label->document()->setDocumentMargin(ChartPresenter::textMargin());
Miikka Heikkinen
Add Polar chart support...
r2483 arrow->setPen(axis()->linePen());
grid->setPen(axis()->gridLinePen());
label->setFont(axis()->labelsFont());
Miikka Heikkinen
Added HTML support for various text items...
r2539 label->setDefaultTextColor(axis()->labelsBrush().color());
Miikka Heikkinen
Add Polar chart support...
r2483 label->setRotation(axis()->labelsAngle());
arrowGroup()->addToGroup(arrow);
gridGroup()->addToGroup(grid);
labelGroup()->addToGroup(label);
if (gridItems().size() == 1 || (((gridItems().size() + 1) % 2) && gridItems().size() > 0)) {
QGraphicsPathItem *shade = new QGraphicsPathItem(presenter()->rootItem());
shade->setPen(axis()->shadesPen());
shade->setBrush(axis()->shadesBrush());
shadeGroup()->addToGroup(shade);
}
}
}
void PolarChartAxisRadial::handleArrowPenChanged(const QPen &pen)
{
foreach (QGraphicsItem *item, arrowItems())
static_cast<QGraphicsLineItem *>(item)->setPen(pen);
}
void PolarChartAxisRadial::handleGridPenChanged(const QPen &pen)
{
foreach (QGraphicsItem *item, gridItems())
static_cast<QGraphicsEllipseItem *>(item)->setPen(pen);
}
QSizeF PolarChartAxisRadial::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
{
Q_UNUSED(which);
Q_UNUSED(constraint);
return QSizeF(-1.0, -1.0);
}
qreal PolarChartAxisRadial::preferredAxisRadius(const QSizeF &maxSize)
{
qreal radius = maxSize.height() / 2.0;
if (maxSize.width() < maxSize.height())
radius = maxSize.width() / 2.0;
return radius;
}
#include "moc_polarchartaxisradial_p.cpp"
Titta Heikkala
Qt Charts project file structure change...
r2712 QT_CHARTS_END_NAMESPACE