axisitem.cpp
176 lines
| 4.2 KiB
| text/x-c
|
CppLexer
/ src / axisitem.cpp
|
r67 | #include "axisitem_p.h" | ||
|
r140 | #include "qchartaxis.h" | ||
|
r67 | #include <QPainter> | ||
#include <QDebug> | ||||
|
r85 | #define LABEL_PADDING 5 | ||
|
r67 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||
|
r140 | AxisItem::AxisItem(QChartAxis* axis,AxisType type,QGraphicsItem* parent) : | ||
|
r104 | ChartItem(parent), | ||
|
r140 | m_axis(axis), | ||
|
r103 | m_ticks(4), | ||
m_type(type) | ||||
|
r67 | { | ||
|
r145 | //initial initialization | ||
handleAxisChanged(); | ||||
|
r67 | } | ||
AxisItem::~AxisItem() | ||||
{ | ||||
} | ||||
QRectF AxisItem::boundingRect() const | ||||
{ | ||||
return m_rect; | ||||
} | ||||
|
r103 | |||
|
r85 | /* | ||
|
r67 | void AxisItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget) | ||
{ | ||||
if (!m_rect.isValid()) | ||||
|
r85 | return; | ||
|
r67 | |||
if(m_type==X_AXIS) { | ||||
|
r85 | const qreal deltaX = m_rect.width() / m_ticks; | ||
for (int i = 0; i <= m_ticks; ++i) { | ||||
int x = i * deltaX + m_rect.left(); | ||||
|
r67 | |||
|
r85 | if(i==0) x--; | ||
if(i==m_ticks) x++; | ||||
|
r67 | |||
|
r85 | qreal label = m_plotDomain.m_minX + (i * m_plotDomain.spanX() | ||
/ m_ticks); | ||||
painter->drawLine(x, m_rect.top()-1, x, m_rect.bottom()+1); | ||||
// painter->drawLine(x, m_rect.bottom()-1, x, m_rect.bottom()-1 + 5); | ||||
|
r67 | |||
|
r85 | painter->drawText(x - 50, m_rect.bottom() + 5, 100, 20,Qt::AlignHCenter | Qt::AlignTop, QString::number(label)); | ||
} | ||||
|
r67 | } | ||
if(m_type==Y_AXIS) { | ||||
|
r85 | const qreal deltaY = (m_rect.height()) / m_ticks; | ||
|
r67 | |||
|
r85 | for (int j = 0; j <= m_ticks; ++j) { | ||
|
r67 | |||
|
r85 | int y = j * -deltaY + m_rect.bottom(); | ||
|
r67 | |||
|
r85 | if(j==0) y++; | ||
if(j==m_ticks) y--; | ||||
qreal label = m_plotDomain.m_minY + (j * m_plotDomain.spanY() | ||||
/ m_ticks); | ||||
painter->drawLine(m_rect.left()-1, y, m_rect.right()+1, y); | ||||
//painter->drawLine(m_rect.left() - 5, y, m_rect.left(), y); | ||||
//TODO : margin = 50 ; | ||||
painter->drawText(m_rect.left() - 50, y - 10, 50 - 5, 20, | ||||
Qt::AlignRight | Qt::AlignVCenter, | ||||
QString::number(label)); | ||||
} | ||||
|
r67 | } | ||
//painter->drawRect(m_rect.adjusted(0, 0, -1, -1)); | ||||
|
r85 | } | ||
*/ | ||||
void AxisItem::createItems() | ||||
{ | ||||
|
r140 | if(!m_rect.isValid()) return; | ||
|
r85 | |||
|
r145 | switch (m_type) | ||
{ | ||||
case X_AXIS: | ||||
{ | ||||
const qreal deltaX = m_rect.width() / m_ticks; | ||||
|
r85 | |||
|
r145 | for (int i = 0; i <= m_ticks; ++i) { | ||
|
r85 | |||
|
r145 | int x = i * deltaX + m_rect.left(); | ||
|
r85 | |||
|
r145 | qreal label = m_domain.m_minX + (i * m_domain.spanX()/ m_ticks); | ||
|
r85 | |||
|
r145 | m_grid<<new QGraphicsLineItem(x, m_rect.top(), x, m_rect.bottom(),this); | ||
|
r85 | |||
|
r145 | QGraphicsSimpleTextItem* text = new QGraphicsSimpleTextItem(QString::number(label),this); | ||
QPointF center = text->boundingRect().center(); | ||||
text->setPos(x - center.x(), m_rect.bottom() + LABEL_PADDING); | ||||
//text->rotate(-45); | ||||
m_labels<<text; | ||||
} | ||||
} | ||||
break; | ||||
|
r85 | |||
|
r145 | case Y_AXIS: | ||
{ | ||||
const qreal deltaY = m_rect.height()/ m_ticks; | ||||
|
r85 | |||
|
r145 | for (int j = 0; j <= m_ticks; ++j) { | ||
|
r85 | |||
|
r145 | int y = j * -deltaY + m_rect.bottom(); | ||
|
r85 | |||
|
r145 | qreal label = m_domain.m_minY + (j * m_domain.spanY() | ||
/ m_ticks); | ||||
|
r85 | |||
|
r145 | m_grid<<new QGraphicsLineItem(m_rect.left() , y, m_rect.right(), y,this); | ||
QGraphicsSimpleTextItem* text = new QGraphicsSimpleTextItem(QString::number(label),this); | ||||
QPointF center = text->boundingRect().center(); | ||||
text->setPos(m_rect.left() - text->boundingRect().width() - LABEL_PADDING , y-center.y()); | ||||
|
r85 | |||
|
r145 | m_labels<<text; | ||
|
r67 | |||
|
r145 | } | ||
} | ||||
break; | ||||
default: | ||||
qDebug()<<"Unknown axis type"; | ||||
break; | ||||
} | ||||
|
r67 | } | ||
|
r140 | void AxisItem::clear() | ||
{ | ||||
qDeleteAll(m_shades); | ||||
m_shades.clear(); | ||||
qDeleteAll(m_grid); | ||||
m_grid.clear(); | ||||
qDeleteAll(m_labels); | ||||
m_labels.clear(); | ||||
} | ||||
void AxisItem::updateDomain() | ||||
{ | ||||
clear(); | ||||
createItems(); | ||||
} | ||||
void AxisItem::handleAxisChanged() | ||||
{ | ||||
//m_axis-> | ||||
} | ||||
void AxisItem::handleDomainChanged(const Domain& domain) | ||||
{ | ||||
m_domain = domain; | ||||
clear(); | ||||
createItems(); | ||||
} | ||||
void AxisItem::handleGeometryChanged(const QRectF& rect) | ||||
{ | ||||
Q_ASSERT(rect.isValid()); | ||||
m_rect = rect; | ||||
clear(); | ||||
createItems(); | ||||
} | ||||
|
r67 | //TODO "nice numbers algorithm" | ||
|
r140 | #include "moc_axisitem_p.cpp" | ||
|
r67 | |||
QTCOMMERCIALCHART_END_NAMESPACE | ||||