axisitem.cpp
318 lines
| 7.5 KiB
| text/x-c
|
CppLexer
/ src / axisitem.cpp
Michal Klocek
|
r67 | #include "axisitem_p.h" | ||
Michal Klocek
|
r140 | #include "qchartaxis.h" | ||
Michal Klocek
|
r67 | #include <QPainter> | ||
#include <QDebug> | ||||
Michal Klocek
|
r176 | static int label_padding = 5; | ||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r67 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||
Michal Klocek
|
r176 | AxisItem::AxisItem(AxisType type,QGraphicsItem* parent) : | ||
ChartItem(parent), | ||||
m_ticks(4), | ||||
m_type(type), | ||||
m_labelsAngle(0), | ||||
m_shadesEnabled(true), | ||||
Michal Klocek
|
r184 | m_grid(parent), | ||
m_shades(parent), | ||||
m_labels(parent) | ||||
Michal Klocek
|
r67 | { | ||
Michal Klocek
|
r145 | //initial initialization | ||
Michal Klocek
|
r184 | m_shades.setZValue(0); | ||
m_grid.setZValue(2); | ||||
Michal Klocek
|
r176 | createItems(); | ||
Michal Klocek
|
r67 | } | ||
AxisItem::~AxisItem() | ||||
{ | ||||
} | ||||
QRectF AxisItem::boundingRect() const | ||||
{ | ||||
return m_rect; | ||||
} | ||||
Michal Klocek
|
r176 | void AxisItem::createItems() | ||
{ | ||||
for (int i = 0; i <= m_ticks; ++i) { | ||||
m_grid.addToGroup(new QGraphicsLineItem(this)); | ||||
m_labels.addToGroup(new QGraphicsSimpleTextItem(this)); | ||||
if(i%2) m_shades.addToGroup(new QGraphicsRectItem(this)); | ||||
} | ||||
} | ||||
void AxisItem::clear() | ||||
{ | ||||
foreach(QGraphicsItem* item , m_shades.childItems()) { | ||||
delete item; | ||||
} | ||||
foreach(QGraphicsItem* item , m_grid.childItems()) { | ||||
delete item; | ||||
} | ||||
foreach(QGraphicsItem* item , m_labels.childItems()) { | ||||
delete item; | ||||
} | ||||
} | ||||
void AxisItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | ||||
{ | ||||
Tero Ahola
|
r103 | |||
Michal Klocek
|
r176 | } | ||
void AxisItem::updateDomain() | ||||
Michal Klocek
|
r67 | { | ||
Michal Klocek
|
r176 | QList<QGraphicsItem *> lines = m_grid.childItems(); | ||
QList<QGraphicsItem *> labels = m_labels.childItems(); | ||||
QList<QGraphicsItem *> shades = m_shades.childItems(); | ||||
Michal Klocek
|
r67 | |||
Michal Klocek
|
r176 | switch (m_type) | ||
{ | ||||
case X_AXIS: | ||||
{ | ||||
const qreal deltaX = m_rect.width() / m_ticks; | ||||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r184 | m_axis.setLine(m_rect.left(), m_rect.bottom(), m_rect.right(), m_rect.bottom()); | ||
Michal Klocek
|
r176 | for (int i = 0; i <= m_ticks; ++i) { | ||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r176 | int x = i * deltaX + m_rect.left(); | ||
Michal Klocek
|
r67 | |||
Michal Klocek
|
r176 | qreal label = m_domain.m_minX + (i * m_domain.spanX()/ m_ticks); | ||
Michal Klocek
|
r67 | |||
Michal Klocek
|
r176 | QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(lines.at(i)); | ||
lineItem->setLine(x, m_rect.top(), x, m_rect.bottom()); | ||||
Michal Klocek
|
r67 | |||
Michal Klocek
|
r176 | QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem*>(labels.at(i)); | ||
labelItem->setText(QString::number(label)); | ||||
QPointF center = labelItem->boundingRect().center(); | ||||
labelItem->setTransformOriginPoint(center.x(), center.y()); | ||||
labelItem->setPos(x - center.x(), m_rect.bottom() + label_padding); | ||||
Michal Klocek
|
r67 | |||
Michal Klocek
|
r176 | if(i%2){ | ||
QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2)); | ||||
rectItem->setRect(x,m_rect.top(),deltaX,m_rect.height()); | ||||
} | ||||
} | ||||
} | ||||
break; | ||||
Michal Klocek
|
r67 | |||
Michal Klocek
|
r176 | case Y_AXIS: | ||
{ | ||||
const qreal deltaY = m_rect.height()/ m_ticks; | ||||
Michal Klocek
|
r67 | |||
Michal Klocek
|
r184 | m_axis.setLine(m_rect.left() , m_rect.top(), m_rect.left(), m_rect.bottom()); | ||
Michal Klocek
|
r176 | for (int i = 0; i <= m_ticks; ++i) { | ||
Michal Klocek
|
r67 | |||
Michal Klocek
|
r176 | int y = i * -deltaY + m_rect.bottom(); | ||
Michal Klocek
|
r67 | |||
Michal Klocek
|
r176 | qreal label = m_domain.m_minY + (i * m_domain.spanY()/ m_ticks); | ||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r176 | QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(lines.at(i)); | ||
lineItem->setLine(m_rect.left() , y, m_rect.right(), y); | ||||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r176 | QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem*>(labels.at(i)); | ||
labelItem->setText(QString::number(label)); | ||||
QPointF center = labelItem->boundingRect().center(); | ||||
labelItem->setTransformOriginPoint(center.x(), center.y()); | ||||
labelItem->setPos(m_rect.left() - labelItem->boundingRect().width() - label_padding , y-center.y()); | ||||
Michal Klocek
|
r67 | |||
Michal Klocek
|
r176 | |||
if(i%2){ | ||||
QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2)); | ||||
rectItem->setRect(m_rect.left(),y,m_rect.width(),deltaY); | ||||
} | ||||
} | ||||
} | ||||
break; | ||||
default: | ||||
qDebug()<<"Unknown axis type"; | ||||
break; | ||||
} | ||||
Michal Klocek
|
r85 | } | ||
Michal Klocek
|
r176 | |||
void AxisItem::handleAxisChanged(const QChartAxis& axis) | ||||
Michal Klocek
|
r85 | { | ||
Michal Klocek
|
r184 | if(axis.isAxisVisible()) { | ||
setAxisOpacity(100); | ||||
} | ||||
else { | ||||
setAxisOpacity(0); | ||||
} | ||||
Michal Klocek
|
r176 | if(axis.isGridVisible()) { | ||
setGridOpacity(100); | ||||
} | ||||
else { | ||||
setGridOpacity(0); | ||||
} | ||||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r176 | if(axis.isLabelsVisible()) | ||
{ | ||||
setLabelsOpacity(100); | ||||
} | ||||
else { | ||||
setLabelsOpacity(0); | ||||
} | ||||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r176 | if(axis.isShadesVisible()) { | ||
setShadesOpacity(100); | ||||
} | ||||
else { | ||||
setShadesOpacity(0); | ||||
} | ||||
switch(axis.labelsOrientation()) | ||||
Michal Klocek
|
r145 | { | ||
Michal Klocek
|
r176 | case QChartAxis::LabelsOrientationHorizontal: | ||
setLabelsAngle(0); | ||||
break; | ||||
case QChartAxis::LabelsOrientationVertical: | ||||
setLabelsAngle(90); | ||||
break; | ||||
case QChartAxis::LabelsOrientationSlide: | ||||
setLabelsAngle(-45); | ||||
break; | ||||
default: | ||||
break; | ||||
} | ||||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r184 | setAxisPen(axis.axisPen()); | ||
Michal Klocek
|
r176 | setLabelsPen(axis.labelsPen()); | ||
setLabelsBrush(axis.labelsBrush()); | ||||
setLabelsFont(axis.labelFont()); | ||||
setGridPen(axis.gridPen()); | ||||
setShadesPen(axis.shadesPen()); | ||||
setShadesBrush(axis.shadesBrush()); | ||||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r176 | } | ||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r176 | void AxisItem::handleDomainChanged(const Domain& domain) | ||
{ | ||||
m_domain = domain; | ||||
updateDomain(); | ||||
update(); | ||||
} | ||||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r176 | void AxisItem::handleGeometryChanged(const QRectF& rect) | ||
{ | ||||
m_rect = rect; | ||||
updateDomain(); | ||||
update(); | ||||
} | ||||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r184 | void AxisItem::setAxisOpacity(qreal opacity) | ||
{ | ||||
m_axis.setOpacity(opacity); | ||||
} | ||||
qreal AxisItem::axisOpacity() const | ||||
{ | ||||
return m_axis.opacity(); | ||||
} | ||||
Michal Klocek
|
r176 | void AxisItem::setGridOpacity(qreal opacity) | ||
{ | ||||
m_grid.setOpacity(opacity); | ||||
} | ||||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r176 | qreal AxisItem::gridOpacity() const | ||
{ | ||||
return m_grid.opacity(); | ||||
} | ||||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r176 | void AxisItem::setLabelsOpacity(qreal opacity) | ||
{ | ||||
m_labels.setOpacity(opacity); | ||||
} | ||||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r176 | qreal AxisItem::labelsOpacity() const | ||
{ | ||||
return m_labels.opacity(); | ||||
} | ||||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r176 | void AxisItem::setShadesOpacity(qreal opacity) | ||
{ | ||||
m_shades.setOpacity(opacity); | ||||
} | ||||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r176 | qreal AxisItem::shadesOpacity() const | ||
{ | ||||
return m_shades.opacity(); | ||||
} | ||||
Michal Klocek
|
r67 | |||
Michal Klocek
|
r176 | void AxisItem::setLabelsAngle(int angle) | ||
{ | ||||
foreach(QGraphicsItem* item , m_labels.childItems()) { | ||||
QPointF center = item->boundingRect().center(); | ||||
item->setRotation(angle); | ||||
Michal Klocek
|
r145 | } | ||
Michal Klocek
|
r176 | |||
m_labelsAngle=angle; | ||||
Michal Klocek
|
r67 | } | ||
Michal Klocek
|
r176 | void AxisItem::setLabelsPen(const QPen& pen) | ||
Michal Klocek
|
r140 | { | ||
Michal Klocek
|
r176 | foreach(QGraphicsItem* item , m_labels.childItems()) { | ||
static_cast<QGraphicsSimpleTextItem*>(item)->setPen(pen); | ||||
} | ||||
Michal Klocek
|
r140 | } | ||
Michal Klocek
|
r176 | void AxisItem::setLabelsBrush(const QBrush& brush) | ||
Michal Klocek
|
r140 | { | ||
Michal Klocek
|
r176 | foreach(QGraphicsItem* item , m_labels.childItems()) { | ||
static_cast<QGraphicsSimpleTextItem*>(item)->setBrush(brush); | ||||
} | ||||
Michal Klocek
|
r140 | } | ||
Michal Klocek
|
r176 | void AxisItem::setLabelsFont(const QFont& font) | ||
Michal Klocek
|
r140 | { | ||
Michal Klocek
|
r176 | foreach(QGraphicsItem* item , m_labels.childItems()) { | ||
static_cast<QGraphicsSimpleTextItem*>(item)->setFont(font); | ||||
} | ||||
Michal Klocek
|
r140 | } | ||
Michal Klocek
|
r176 | void AxisItem::setShadesBrush(const QBrush& brush) | ||
Michal Klocek
|
r140 | { | ||
Michal Klocek
|
r176 | foreach(QGraphicsItem* item , m_shades.childItems()) { | ||
static_cast<QGraphicsRectItem*>(item)->setBrush(brush); | ||||
} | ||||
Michal Klocek
|
r140 | } | ||
Michal Klocek
|
r176 | void AxisItem::setShadesPen(const QPen& pen) | ||
Michal Klocek
|
r140 | { | ||
Michal Klocek
|
r176 | foreach(QGraphicsItem* item , m_shades.childItems()) { | ||
static_cast<QGraphicsRectItem*>(item)->setPen(pen); | ||||
} | ||||
} | ||||
Michal Klocek
|
r184 | void AxisItem::setAxisPen(const QPen& pen) | ||
{ | ||||
m_axis.setPen(pen); | ||||
} | ||||
Michal Klocek
|
r176 | void AxisItem::setGridPen(const QPen& pen) | ||
{ | ||||
foreach(QGraphicsItem* item , m_grid.childItems()) { | ||||
static_cast<QGraphicsLineItem*>(item)->setPen(pen); | ||||
} | ||||
} | ||||
void AxisItem::setTicks(int count) | ||||
{ | ||||
if(count!=m_ticks){ | ||||
Michal Klocek
|
r140 | clear(); | ||
Michal Klocek
|
r176 | m_ticks=count; | ||
Michal Klocek
|
r140 | createItems(); | ||
Michal Klocek
|
r176 | } | ||
Michal Klocek
|
r140 | } | ||
Michal Klocek
|
r67 | //TODO "nice numbers algorithm" | ||
Michal Klocek
|
r140 | #include "moc_axisitem_p.cpp" | ||
Michal Klocek
|
r67 | |||
QTCOMMERCIALCHART_END_NAMESPACE | ||||