##// END OF EJS Templates
Added support for data from model to QBarSeries. Various fixes and small modifications to data from model support to other series
Added support for data from model to QBarSeries. Various fixes and small modifications to data from model support to other series

File last commit:

r611:e622b3a8d8a0
r630:dd8db9a3a988
Show More
axisitem.cpp
406 lines | 10.1 KiB | text/x-c | CppLexer
Michal Klocek
Add zoom support...
r67 #include "axisitem_p.h"
Michal Klocek
Adds refactored axis to presenter
r140 #include "qchartaxis.h"
Michal Klocek
Adds ZOrder enum to presenter
r262 #include "chartpresenter_p.h"
Michal Klocek
Animation refactor...
r530 #include "chartanimator_p.h"
Michal Klocek
Add zoom support...
r67 #include <QPainter>
#include <QDebug>
Michal Klocek
Adds more axis handling...
r176 static int label_padding = 5;
Michal Klocek
Refactora axis and line chart to use graphics items insted of painter.
r85
Michal Klocek
Add zoom support...
r67 QTCOMMERCIALCHART_BEGIN_NAMESPACE
Michal Klocek
Animation refactor...
r530 AxisItem::AxisItem(QChartAxis* axis,ChartPresenter* presenter,AxisType type,QGraphicsItem* parent) :
Michal Klocek
Adds more axis handling...
r176 ChartItem(parent),
Michal Klocek
Animation refactor...
r530 m_presenter(presenter),
Michal Klocek
Refactor domain model...
r439 m_chartAxis(axis),
Michal Klocek
Adds more axis handling...
r176 m_type(type),
m_labelsAngle(0),
Michal Klocek
Fixes wrong shades zvalues
r184 m_grid(parent),
m_shades(parent),
Michal Klocek
Adds ZOrder enum to presenter
r262 m_labels(parent),
Michal Klocek
Axis refactoring to support better barcharts
r502 m_axis(parent),
m_min(0),
m_max(0),
Michal Klocek
Adds scroll support...
r531 m_ticksCount(0)
Michal Klocek
Add zoom support...
r67 {
Michal Klocek
Fix previous broken commit
r145 //initial initialization
Michal Klocek
Fix zorder of axis, and ticks
r272 m_axis.setZValue(ChartPresenter::AxisZValue);
Michal Klocek
Adds ZOrder enum to presenter
r262 m_shades.setZValue(ChartPresenter::ShadesZValue);
m_grid.setZValue(ChartPresenter::GridZValue);
Michal Klocek
Fix zorder of axis, and ticks
r272 setFlags(QGraphicsItem::ItemHasNoContents);
Michal Klocek
Refactor domain model...
r439
QObject::connect(m_chartAxis,SIGNAL(updated()),this,SLOT(handleAxisUpdated()));
Michal Klocek
Adds draft of axis bar label support
r497 QObject::connect(m_chartAxis->categories(),SIGNAL(updated()),this,SLOT(handleAxisCategoriesUpdated()));
Michal Klocek
Axis refactoring to support better barcharts
r502
handleAxisUpdated();
Michal Klocek
Add zoom support...
r67 }
AxisItem::~AxisItem()
{
}
QRectF AxisItem::boundingRect() const
{
Michal Klocek
Refactors axis layout managment...
r291 return QRectF();
Michal Klocek
Add zoom support...
r67 }
Michal Klocek
Refactors axis handling...
r223 void AxisItem::createItems(int count)
Michal Klocek
Adds more axis handling...
r176 {
Michal Klocek
Animation refactor...
r530
Michal Klocek
Refactors axis layout managment...
r291 if(m_axis.children().size()==0)
m_axis.addToGroup(new QGraphicsLineItem());
Michal Klocek
Refactors axis handling...
r223 for (int i = 0; i < count; ++i) {
Michal Klocek
Refactors axis layout managment...
r291 m_grid.addToGroup(new QGraphicsLineItem());
m_labels.addToGroup(new QGraphicsSimpleTextItem());
m_axis.addToGroup(new QGraphicsLineItem());
Michal Klocek
Animation refactor...
r530 if((m_grid.childItems().size())%2 && m_grid.childItems().size()>2) m_shades.addToGroup(new QGraphicsRectItem());
Michal Klocek
Adds more axis handling...
r176 }
}
Michal Klocek
Axis refactoring to support better barcharts
r502 void AxisItem::deleteItems(int count)
Michal Klocek
Adds more axis handling...
r176 {
Michal Klocek
Refactors axis layout managment...
r291 QList<QGraphicsItem *> lines = m_grid.childItems();
QList<QGraphicsItem *> labels = m_labels.childItems();
QList<QGraphicsItem *> shades = m_shades.childItems();
QList<QGraphicsItem *> axis = m_axis.childItems();
Michal Klocek
Adds more axis handling...
r176
Michal Klocek
Refactors axis layout managment...
r291 for (int i = 0; i < count; ++i) {
Michal Klocek
Animation refactor...
r530 if(lines.size()%2 && lines.size()>1) delete(shades.takeLast());
Michal Klocek
Refactors axis layout managment...
r291 delete(lines.takeLast());
delete(labels.takeLast());
delete(axis.takeLast());
Michal Klocek
Fix zorder of axis, and ticks
r272 }
Michal Klocek
Adds more axis handling...
r176 }
Michal Klocek
Axis refactoring to support better barcharts
r502 void AxisItem::updateLayout(QVector<qreal>& layout)
Michal Klocek
Adds more axis handling...
r176 {
Michal Klocek
Animation refactor...
r530 if(m_animator){
m_animator->applyLayout(this,layout);
}
else setLayout(layout);
Michal Klocek
Refactora axis and line chart to use graphics items insted of painter.
r85 }
Michal Klocek
Adds more axis handling...
r176
Michal Klocek
Axis refactoring to support better barcharts
r502 QStringList AxisItem::createLabels(int ticks, qreal min, qreal max) const
Michal Klocek
Refactora axis and line chart to use graphics items insted of painter.
r85 {
Michal Klocek
Refactor domain model...
r439 Q_ASSERT(max>=min);
Michal Klocek
Axis refactoring to support better barcharts
r502 Q_ASSERT(ticks>0);
Michal Klocek
Refactora axis and line chart to use graphics items insted of painter.
r85
Michal Klocek
Refactor domain model...
r439 QStringList labels;
Michal Klocek
Refactora axis and line chart to use graphics items insted of painter.
r85
Michal Klocek
Adds draft of axis bar label support
r497 QChartAxisCategories* categories = m_chartAxis->categories();
Michal Klocek
Refactors axis layout managment...
r291
Michal Klocek
Axis refactoring to support better barcharts
r502 for(int i=0; i< ticks; i++) {
qreal value = min + (i * (max - min)/ (ticks-1));
Michal Klocek
Adds draft of axis bar label support
r497 if(categories->count()==0) {
Michal Klocek
Refactor domain model...
r439 labels << QString::number(value);
}
else {
Michal Klocek
Adds missing ticks hadnling
r554
Michal Klocek
Adds draft of axis bar label support
r497 QString label = categories->label(value);
Michal Klocek
Refactor domain model...
r439 labels << label;
}
Michal Klocek
Refactors axis handling...
r223 }
Michal Klocek
Refactor domain model...
r439 return labels;
Michal Klocek
Adds more axis handling...
r176 }
Michal Klocek
Refactora axis and line chart to use graphics items insted of painter.
r85
Michal Klocek
Fixes wrong shades zvalues
r184 void AxisItem::setAxisOpacity(qreal opacity)
{
m_axis.setOpacity(opacity);
}
qreal AxisItem::axisOpacity() const
{
return m_axis.opacity();
}
Michal Klocek
Adds more axis handling...
r176 void AxisItem::setGridOpacity(qreal opacity)
{
m_grid.setOpacity(opacity);
}
Michal Klocek
Refactora axis and line chart to use graphics items insted of painter.
r85
Michal Klocek
Adds more axis handling...
r176 qreal AxisItem::gridOpacity() const
{
return m_grid.opacity();
}
Michal Klocek
Refactora axis and line chart to use graphics items insted of painter.
r85
Michal Klocek
Adds more axis handling...
r176 void AxisItem::setLabelsOpacity(qreal opacity)
{
m_labels.setOpacity(opacity);
}
Michal Klocek
Refactora axis and line chart to use graphics items insted of painter.
r85
Michal Klocek
Adds more axis handling...
r176 qreal AxisItem::labelsOpacity() const
{
return m_labels.opacity();
}
Michal Klocek
Refactora axis and line chart to use graphics items insted of painter.
r85
Michal Klocek
Adds more axis handling...
r176 void AxisItem::setShadesOpacity(qreal opacity)
{
m_shades.setOpacity(opacity);
}
Michal Klocek
Refactora axis and line chart to use graphics items insted of painter.
r85
Michal Klocek
Adds more axis handling...
r176 qreal AxisItem::shadesOpacity() const
{
return m_shades.opacity();
}
Michal Klocek
Add zoom support...
r67
Michal Klocek
Adds more axis handling...
r176 void AxisItem::setLabelsAngle(int angle)
{
foreach(QGraphicsItem* item , m_labels.childItems()) {
QPointF center = item->boundingRect().center();
item->setRotation(angle);
Michal Klocek
Fix previous broken commit
r145 }
Michal Klocek
Adds more axis handling...
r176
m_labelsAngle=angle;
Michal Klocek
Add zoom support...
r67 }
Michal Klocek
Adds more axis handling...
r176 void AxisItem::setLabelsPen(const QPen& pen)
Michal Klocek
Adds refactored axis to presenter
r140 {
Michal Klocek
Adds more axis handling...
r176 foreach(QGraphicsItem* item , m_labels.childItems()) {
static_cast<QGraphicsSimpleTextItem*>(item)->setPen(pen);
}
Michal Klocek
Adds refactored axis to presenter
r140 }
Michal Klocek
Adds more axis handling...
r176 void AxisItem::setLabelsBrush(const QBrush& brush)
Michal Klocek
Adds refactored axis to presenter
r140 {
Michal Klocek
Adds more axis handling...
r176 foreach(QGraphicsItem* item , m_labels.childItems()) {
static_cast<QGraphicsSimpleTextItem*>(item)->setBrush(brush);
}
Michal Klocek
Adds refactored axis to presenter
r140 }
Michal Klocek
Adds more axis handling...
r176 void AxisItem::setLabelsFont(const QFont& font)
Michal Klocek
Adds refactored axis to presenter
r140 {
Michal Klocek
Adds more axis handling...
r176 foreach(QGraphicsItem* item , m_labels.childItems()) {
static_cast<QGraphicsSimpleTextItem*>(item)->setFont(font);
}
Michal Klocek
Adds refactored axis to presenter
r140 }
Michal Klocek
Adds more axis handling...
r176 void AxisItem::setShadesBrush(const QBrush& brush)
Michal Klocek
Adds refactored axis to presenter
r140 {
Michal Klocek
Adds more axis handling...
r176 foreach(QGraphicsItem* item , m_shades.childItems()) {
static_cast<QGraphicsRectItem*>(item)->setBrush(brush);
}
Michal Klocek
Adds refactored axis to presenter
r140 }
Michal Klocek
Adds more axis handling...
r176 void AxisItem::setShadesPen(const QPen& pen)
Michal Klocek
Adds refactored axis to presenter
r140 {
Michal Klocek
Adds more axis handling...
r176 foreach(QGraphicsItem* item , m_shades.childItems()) {
static_cast<QGraphicsRectItem*>(item)->setPen(pen);
}
}
Michal Klocek
Fixes wrong shades zvalues
r184 void AxisItem::setAxisPen(const QPen& pen)
{
Michal Klocek
Fix zorder of axis, and ticks
r272 foreach(QGraphicsItem* item , m_axis.childItems()) {
static_cast<QGraphicsLineItem*>(item)->setPen(pen);
}
Michal Klocek
Fixes wrong shades zvalues
r184 }
Michal Klocek
Adds more axis handling...
r176 void AxisItem::setGridPen(const QPen& pen)
{
foreach(QGraphicsItem* item , m_grid.childItems()) {
static_cast<QGraphicsLineItem*>(item)->setPen(pen);
}
}
Michal Klocek
Clean up axis animation code
r393 QVector<qreal> AxisItem::calculateLayout() const
Michal Klocek
Refactors axis layout managment...
r291 {
Michal Klocek
Axis refactoring to support better barcharts
r502 Q_ASSERT(m_ticksCount>=2);
Michal Klocek
Clean up axis animation code
r393 QVector<qreal> points;
Michal Klocek
Axis refactoring to support better barcharts
r502 points.resize(m_ticksCount);
Michal Klocek
Clean up axis animation code
r393
Michal Klocek
Refactors axis layout managment...
r291 switch (m_type)
{
case X_AXIS:
{
Michal Klocek
Axis refactoring to support better barcharts
r502 const qreal deltaX = m_rect.width()/(m_ticksCount-1);
for (int i = 0; i < m_ticksCount; ++i) {
Michal Klocek
Refactors axis layout managment...
r291 int x = i * deltaX + m_rect.left();
Michal Klocek
Clean up axis animation code
r393 points[i] = x;
Michal Klocek
Refactors axis layout managment...
r291 }
}
break;
case Y_AXIS:
{
Michal Klocek
Axis refactoring to support better barcharts
r502 const qreal deltaY = m_rect.height()/(m_ticksCount-1);
for (int i = 0; i < m_ticksCount; ++i) {
Michal Klocek
Refactors axis layout managment...
r291 int y = i * -deltaY + m_rect.bottom();
Michal Klocek
Clean up axis animation code
r393 points[i] = y;
Michal Klocek
Refactors axis layout managment...
r291 }
}
break;
}
Michal Klocek
Clean up axis animation code
r393 return points;
Michal Klocek
Refactors axis layout managment...
r291 }
Michal Klocek
Axis refactoring to support better barcharts
r502 void AxisItem::setLayout(QVector<qreal>& layout)
Michal Klocek
Refactors axis layout managment...
r291 {
Michal Klocek
Axis refactoring to support better barcharts
r502 int diff = m_layoutVector.size() - layout.size();
if(diff>0) {
deleteItems(diff);
}
else if(diff<0) {
createItems(-diff);
}
Michal Klocek
Adding zoom in out animation support
r513 if(diff!=0) handleAxisUpdated();
Michal Klocek
Animation refactor...
r530 QStringList ticksList = createLabels(layout.size(),m_min,m_max);
Michal Klocek
Adding zoom in out animation support
r513
Michal Klocek
Axis refactoring to support better barcharts
r502 QList<QGraphicsItem *> lines = m_grid.childItems();
QList<QGraphicsItem *> labels = m_labels.childItems();
QList<QGraphicsItem *> shades = m_shades.childItems();
QList<QGraphicsItem *> axis = m_axis.childItems();
Michal Klocek
Adding zoom in out animation support
r513 Q_ASSERT(labels.size() == ticksList.size());
Q_ASSERT(layout.size() == ticksList.size());
Michal Klocek
Axis refactoring to support better barcharts
r502
switch (m_type)
{
case X_AXIS:
{
QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(axis.at(0));
lineItem->setLine(m_rect.left(), m_rect.bottom(), m_rect.right(), m_rect.bottom());
for (int i = 0; i < layout.size(); ++i) {
QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(lines.at(i));
lineItem->setLine(layout[i], m_rect.top(), layout[i], m_rect.bottom());
QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem*>(labels.at(i));
Michal Klocek
Adding zoom in out animation support
r513 labelItem->setText(ticksList.at(i));
Michal Klocek
Axis refactoring to support better barcharts
r502 QPointF center = labelItem->boundingRect().center();
labelItem->setTransformOriginPoint(center.x(), center.y());
labelItem->setPos(layout[i] - center.x(), m_rect.bottom() + label_padding);
Michal Klocek
Fixes shades counter
r551 if((i+1)%2 && i>1) {
QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2-1));
rectItem->setRect(layout[i-1],m_rect.top(),layout[i]-layout[i-1],m_rect.height());
Michal Klocek
Axis refactoring to support better barcharts
r502 }
lineItem = static_cast<QGraphicsLineItem*>(axis.at(i+1));
lineItem->setLine(layout[i],m_rect.bottom(),layout[i],m_rect.bottom()+5);
}
}
break;
case Y_AXIS:
{
QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(axis.at(0));
lineItem->setLine(m_rect.left() , m_rect.top(), m_rect.left(), m_rect.bottom());
for (int i = 0; i < layout.size(); ++i) {
QGraphicsLineItem *lineItem = static_cast<QGraphicsLineItem*>(lines.at(i));
lineItem->setLine(m_rect.left() , layout[i], m_rect.right(), layout[i]);
QGraphicsSimpleTextItem *labelItem = static_cast<QGraphicsSimpleTextItem*>(labels.at(i));
Michal Klocek
Adding zoom in out animation support
r513 labelItem->setText(ticksList.at(i));
Michal Klocek
Axis refactoring to support better barcharts
r502 QPointF center = labelItem->boundingRect().center();
labelItem->setTransformOriginPoint(center.x(), center.y());
labelItem->setPos(m_rect.left() - labelItem->boundingRect().width() - label_padding , layout[i]-center.y());
Michal Klocek
Fixes shades counter
r551 if((i+1)%2 && i>1) {
QGraphicsRectItem *rectItem = static_cast<QGraphicsRectItem*>(shades.at(i/2-1));
Michal Klocek
Bugfix y shades drawn upsidedown
r578 rectItem->setRect(m_rect.left(),layout[i],m_rect.width(),layout[i-1]-layout[i]);
Michal Klocek
Axis refactoring to support better barcharts
r502 }
lineItem = static_cast<QGraphicsLineItem*>(axis.at(i+1));
lineItem->setLine(m_rect.left()-5,layout[i],m_rect.left(),layout[i]);
}
}
break;
default:
qDebug()<<"Unknown axis type";
break;
}
m_layoutVector=layout;
}
Michal Klocek
Refactors axis layout managment...
r291
Michal Klocek
Axis refactoring to support better barcharts
r502 bool AxisItem::isEmpty()
{
return m_rect.isEmpty() || m_min==m_max || m_ticksCount==0;
Michal Klocek
Refactors axis layout managment...
r291 }
Michal Klocek
Adds refactored axis to presenter
r140
Michal Klocek
Refactor domain model...
r439 //handlers
Michal Klocek
Adds draft of axis bar label support
r497 void AxisItem::handleAxisCategoriesUpdated()
{
Michal Klocek
Axis refactoring to support better barcharts
r502 if(isEmpty()) return;
updateLayout(m_layoutVector);
Michal Klocek
Adds draft of axis bar label support
r497 }
Michal Klocek
Refactor domain model...
r439 void AxisItem::handleAxisUpdated()
{
Michal Klocek
Adds draft of axis bar label support
r497
Michal Klocek
Refacotr axisitem to handle ticks changes
r452 if(isEmpty()) return;
Michal Klocek
Refactor domain model...
r439
if(m_chartAxis->isAxisVisible()) {
setAxisOpacity(100);
}
else {
setAxisOpacity(0);
}
Michal Klocek
Renames Grid to GridLine
r535 if(m_chartAxis->isGridLineVisible()) {
Michal Klocek
Refactor domain model...
r439 setGridOpacity(100);
}
else {
setGridOpacity(0);
}
if(m_chartAxis->labelsVisible())
{
setLabelsOpacity(100);
}
else {
setLabelsOpacity(0);
}
if(m_chartAxis->shadesVisible()) {
setShadesOpacity(m_chartAxis->shadesOpacity());
}
else {
setShadesOpacity(0);
}
setLabelsAngle(m_chartAxis->labelsAngle());
setAxisPen(m_chartAxis->axisPen());
setLabelsPen(m_chartAxis->labelsPen());
setLabelsBrush(m_chartAxis->labelsBrush());
setLabelsFont(m_chartAxis->labelsFont());
Michal Klocek
Renames Grid to GridLine
r535 setGridPen(m_chartAxis->gridLinePen());
Michal Klocek
Refactor domain model...
r439 setShadesPen(m_chartAxis->shadesPen());
setShadesBrush(m_chartAxis->shadesBrush());
Michal Klocek
Refacotr axisitem to handle ticks changes
r452
Michal Klocek
Refactor domain model...
r439 }
Michal Klocek
Adds scroll support...
r531 void AxisItem::handleRangeChanged(qreal min, qreal max,int tickCount)
Michal Klocek
Refactor domain model...
r439 {
Michal Klocek
Adds missing ticks hadnling
r554 if(min==max || tickCount<2) return;
Michal Klocek
Refacotr axisitem to handle ticks changes
r452 m_min = min;
m_max = max;
Michal Klocek
Adds missing ticks hadnling
r554 m_ticksCount= tickCount;
Michal Klocek
Adding zoom in out animation support
r513
Michal Klocek
Refacotr axisitem to handle ticks changes
r452 if(isEmpty()) return;
Michal Klocek
Axis refactoring to support better barcharts
r502 QVector<qreal> layout = calculateLayout();
updateLayout(layout);
Michal Klocek
Refactor domain model...
r439
Michal Klocek
Refacotr axisitem to handle ticks changes
r452 }
Michal Klocek
Refactor domain model...
r439
void AxisItem::handleGeometryChanged(const QRectF& rect)
{
m_rect = rect;
Michal Klocek
Refacotr axisitem to handle ticks changes
r452 if(isEmpty()) return;
Michal Klocek
Axis refactoring to support better barcharts
r502 QVector<qreal> layout = calculateLayout();
updateLayout(layout);
Michal Klocek
Refacotr axisitem to handle ticks changes
r452 }
Michal Klocek
Refactor domain model...
r439
Michal Klocek
Axis refactoring to support better barcharts
r502 //painter
void AxisItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Michal Klocek
Refacotr axisitem to handle ticks changes
r452 {
Tero Ahola
Squashed bunch of warnings
r611 Q_UNUSED(painter)
Q_UNUSED(option)
Q_UNUSED(widget)
Michal Klocek
Refactor domain model...
r439 }
Michal Klocek
Add zoom support...
r67 //TODO "nice numbers algorithm"
Michal Klocek
Adds refactored axis to presenter
r140 #include "moc_axisitem_p.cpp"
Michal Klocek
Add zoom support...
r67
QTCOMMERCIALCHART_END_NAMESPACE