##// END OF EJS Templates
Fix: do not return duplicates in axes in case of common axis
Fix: do not return duplicates in axes in case of common axis

File last commit:

r2297:bf59b22cf3e9
r2298:67ab42f1f262
Show More
verticalaxis.cpp
212 lines | 7.2 KiB | text/x-c | CppLexer
/ src / axis / verticalaxis.cpp
Michal Klocek
Refactors axis updateGeometry handling...
r2111 /****************************************************************************
**
** Copyright (C) 2012 Digia Plc
** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
** This file is part of the Qt Commercial Charts Add-on.
**
** $QT_BEGIN_LICENSE$
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.
**
** If you have questions regarding the use of this file, please use
** contact form at http://qt.digia.com
** $QT_END_LICENSE$
**
****************************************************************************/
#include "verticalaxis_p.h"
#include "qabstractaxis.h"
#include <QFontMetrics>
Michal Klocek
Adds title support for mulitaxis...
r2139 #include <QDebug>
Michal Klocek
Refactors axis updateGeometry handling...
r2111
QTCOMMERCIALCHART_BEGIN_NAMESPACE
Michal Klocek
Refactors internals...
r2273 VerticalAxis::VerticalAxis(QAbstractAxis *axis, QGraphicsItem* item, bool intervalAxis)
: ChartAxis(axis, item, intervalAxis)
Michal Klocek
Refactors axis updateGeometry handling...
r2111 {
}
VerticalAxis::~VerticalAxis()
{
}
void VerticalAxis::updateGeometry()
{
const QVector<qreal> &layout = ChartAxis::layout();
Jani Honkonen
src folder: another massive victory for coding style police
r2131 if (layout.isEmpty())
return;
Michal Klocek
Refactors axis updateGeometry handling...
r2111
QStringList labelList = labels();
QList<QGraphicsItem *> lines = lineItems();
QList<QGraphicsItem *> labels = labelItems();
QList<QGraphicsItem *> shades = shadeItems();
QList<QGraphicsItem *> axis = arrowItems();
Michal Klocek
Adds title support for mulitaxis...
r2139 QGraphicsSimpleTextItem* title = titleItem();
Michal Klocek
Refactors axis updateGeometry handling...
r2111
Q_ASSERT(labels.size() == labelList.size());
Q_ASSERT(layout.size() == labelList.size());
Jani Honkonen
src folder: another massive victory for coding style police
r2131 const QRectF &axisRect = axisGeometry();
const QRectF &gridRect = gridGeometry();
Michal Klocek
Refactors axis updateGeometry handling...
r2111
qreal height = axisRect.bottom();
Michal Klocek
Updates axis drawing code...
r2133 //arrow
QGraphicsLineItem *arrowItem = static_cast<QGraphicsLineItem*>(axis.at(0));
//arrow position
if (alignment()==Qt::AlignLeft)
arrowItem->setLine( axisRect.right() , gridRect.top(), axisRect.right(), gridRect.bottom());
else if(alignment()==Qt::AlignRight)
arrowItem->setLine( axisRect.left() , gridRect.top(), axisRect.left(), gridRect.bottom());
Michal Klocek
Refactors axis updateGeometry handling...
r2111
QFontMetrics fn(font());
Michal Klocek
Adds consider title boundary for axis label wrapping
r2148 //title
if (!titleText().isNull()) {
QFontMetrics fn(title->font());
int size(0);
size = gridRect.height();
QString titleText = this->titleText();
if (fn.boundingRect(titleText).width() > size) {
QString string = titleText + "...";
while (fn.boundingRect(string).width() > size && string.length() > 3)
string.remove(string.length() - 4, 1);
title->setText(string);
}
else {
title->setText(titleText);
}
QPointF center = gridRect.center() - title->boundingRect().center();
if (alignment() == Qt::AlignLeft) {
title->setPos(axisRect.left() - title->boundingRect().width()/2 + title->boundingRect().height()/2 , center.y());
}
else if (alignment() == Qt::AlignRight) {
title->setPos(axisRect.right()- title->boundingRect().width()/2 - title->boundingRect().height()/2, center.y());
}
title->setTransformOriginPoint(title->boundingRect().center());
title->setRotation(270);
}
Michal Klocek
Refactors axis updateGeometry handling...
r2111 for (int i = 0; i < layout.size(); ++i) {
Michal Klocek
Updates axis drawing code...
r2133 //items
Jani Honkonen
src folder: another massive victory for coding style police
r2131 QGraphicsLineItem *gridItem = static_cast<QGraphicsLineItem *>(lines.at(i));
QGraphicsLineItem *tickItem = static_cast<QGraphicsLineItem *>(axis.at(i + 1));
QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem *>(labels.at(i));
Michal Klocek
Refactors axis updateGeometry handling...
r2111
//grid line
Jani Honkonen
src folder: another massive victory for coding style police
r2131 gridItem->setLine(gridRect.left() , layout[i], gridRect.right(), layout[i]);
Michal Klocek
Refactors axis updateGeometry handling...
r2111
Michal Klocek
Updates axis drawing code...
r2133 //label text wrapping
Michal Klocek
Refactors axis updateGeometry handling...
r2111 QString text = labelList.at(i);
Michal Klocek
Adds consider title boundary for axis label wrapping
r2148 qreal size = axisRect.right() - axisRect.left() - labelPadding() - title->boundingRect().height();
if (fn.boundingRect(text).width() > size) {
Michal Klocek
Refactors axis updateGeometry handling...
r2111 QString label = text + "...";
Michal Klocek
Adds consider title boundary for axis label wrapping
r2148 while (fn.boundingRect(label).width() > size && label.length() > 3)
Jani Honkonen
src folder: another massive victory for coding style police
r2131 label.remove(label.length() - 4, 1);
Michal Klocek
Refactors axis updateGeometry handling...
r2111 labelItem->setText(label);
Jani Honkonen
src folder: another massive victory for coding style police
r2131 } else {
Michal Klocek
Refactors axis updateGeometry handling...
r2111 labelItem->setText(text);
}
Michal Klocek
Updates axis drawing code...
r2133 //label transformation origin point
Jani Honkonen
src folder: another massive victory for coding style police
r2131 const QRectF &rect = labelItem->boundingRect();
Michal Klocek
Updates axis drawing code...
r2133
Michal Klocek
Refactors axis updateGeometry handling...
r2111 QPointF center = rect.center();
labelItem->setTransformOriginPoint(center.x(), center.y());
//ticks and label position
Jani Honkonen
src folder: another massive victory for coding style police
r2131 if (alignment() == Qt::AlignLeft) {
labelItem->setPos(axisRect.right() - rect.width() - labelPadding() , layout[i] - center.y());
tickItem->setLine(axisRect.right() - labelPadding(), layout[i], axisRect.right(), layout[i]);
} else if (alignment() == Qt::AlignRight) {
labelItem->setPos(axisRect.left() + labelPadding() , layout[i] - center.y());
tickItem->setLine(axisRect.left(), layout[i], axisRect.left() + labelPadding(), layout[i]);
Michal Klocek
Refactors axis updateGeometry handling...
r2111 }
Michal Klocek
Updates axis drawing code...
r2133
//label in beetwen
if(intervalAxis()&& i+1!=layout.size()) {
const qreal delta = (layout[i+1] - layout[i])/2;
Michal Klocek
Refactors axis updateGeometry handling...
r2111 labelItem->setPos(labelItem->pos().x() , layout[i] + delta - center.y());
}
Michal Klocek
Updates axis drawing code...
r2133 //label overlap detection
if(labelItem->pos().y() + rect.height() > height ||
labelItem->pos().y() + rect.height()/2 > gridRect.bottom() ||
labelItem->pos().y() + rect.height()/2 < gridRect.top()) {
Michal Klocek
Refactors axis updateGeometry handling...
r2111 labelItem->setVisible(false);
Michal Klocek
Updates axis drawing code...
r2133 }
else {
Michal Klocek
Refactors axis updateGeometry handling...
r2111 labelItem->setVisible(true);
Michal Klocek
Updates axis drawing code...
r2133 height=labelItem->pos().y();
Michal Klocek
Refactors axis updateGeometry handling...
r2111 }
//shades
Jani Honkonen
src folder: another massive victory for coding style police
r2131 if ((i + 1) % 2 && i > 1) {
QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem *>(shades.at(i / 2 - 1));
rectItem->setRect(gridRect.left(), layout[i], gridRect.width(), layout[i - 1] - layout[i]);
Michal Klocek
Refactors axis updateGeometry handling...
r2111 }
// check if the grid line and the axis tick should be shown
qreal y = gridItem->line().p1().y();
Michal Klocek
Updates axis drawing code...
r2133 if ((y < gridRect.top() || y > gridRect.bottom()))
{
Michal Klocek
Refactors axis updateGeometry handling...
r2111 gridItem->setVisible(false);
tickItem->setVisible(false);
Michal Klocek
Updates axis drawing code...
r2133 }else{
gridItem->setVisible(true);
tickItem->setVisible(true);
Michal Klocek
Refactors axis updateGeometry handling...
r2111 }
}
//begin/end grid line in case labels between
Jani Honkonen
src folder: another massive victory for coding style police
r2131 if (intervalAxis()) {
Michal Klocek
Refactors axis updateGeometry handling...
r2111 QGraphicsLineItem *gridLine;
Jani Honkonen
src folder: another massive victory for coding style police
r2131 gridLine = static_cast<QGraphicsLineItem *>(lines.at(layout.size()));
Michal Klocek
Refactors axis updateGeometry handling...
r2111 gridLine->setLine(gridRect.left(), gridRect.top(), gridRect.right(), gridRect.top());
Michal Klocek
Updates axis drawing code...
r2133 gridLine->setVisible(true);
gridLine = static_cast<QGraphicsLineItem*>(lines.at(layout.size()+1));
Michal Klocek
Refactors axis updateGeometry handling...
r2111 gridLine->setLine(gridRect.left(), gridRect.bottom(), gridRect.right(), gridRect.bottom());
Michal Klocek
Updates axis drawing code...
r2133 gridLine->setVisible(true);
Michal Klocek
Refactors axis updateGeometry handling...
r2111 }
}
Michal Klocek
Refactors ChartAxis...
r2138 QSizeF VerticalAxis::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
{
Q_UNUSED(constraint);
Michal Klocek
Adds title support for mulitaxis...
r2139 QFontMetrics fn(titleFont());
Michal Klocek
Refactors ChartAxis...
r2138 QSizeF sh;
Michal Klocek
Bugfix: axis visibily issues...
r2297 if (titleText().isNull() || !titleItem()->isVisible())
Michal Klocek
Refactors ChartAxis...
r2138 return sh;
switch (which) {
case Qt::MinimumSize:
sh = QSizeF(fn.height(), fn.boundingRect("...").width());
break;
case Qt::MaximumSize:
case Qt::PreferredSize:
Michal Klocek
Refactors internals...
r2273 sh = QSizeF(fn.height(), fn.boundingRect(axis()->titleText()).width());
Michal Klocek
Refactors ChartAxis...
r2138 break;
default:
break;
}
return sh;
}
Michal Klocek
Refactors axis updateGeometry handling...
r2111 QTCOMMERCIALCHART_END_NAMESPACE