From d136a6135e13e31523e39996cbe89d1fc99cd54c 2012-09-04 06:24:52 From: Marek Rosa Date: 2012-09-04 06:24:52 Subject: [PATCH] QCategoryAxis scrolling support added --- diff --git a/demos/chartviewer/charts/charts.pri b/demos/chartviewer/charts/charts.pri index 790c10d..43eba96 100644 --- a/demos/chartviewer/charts/charts.pri +++ b/demos/chartviewer/charts/charts.pri @@ -6,6 +6,7 @@ SOURCES += \ xyseries/scatterchart.cpp \ xyseries/splinechart.cpp \ xyseries/areachart.cpp \ + xyseries/categorylinechart.cpp \ barseries/verticalstackedbarchart.cpp \ barseries/horizontalstackedbarchart.cpp \ barseries/verticalbarchart.cpp \ diff --git a/demos/chartviewer/charts/xyseries/categorylinechart.cpp b/demos/chartviewer/charts/xyseries/categorylinechart.cpp new file mode 100644 index 0000000..b3df7f9 --- /dev/null +++ b/demos/chartviewer/charts/xyseries/categorylinechart.cpp @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** 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 "charts.h" +#include "qchart.h" +#include "qlineseries.h" +#include + +class CategoryLineChart: public Chart +{ +public: + QString name() { return QObject::tr("CategoryLineChart"); } + QString category() { return QObject::tr("XYSeries"); } + QString subCategory() { return QString::null; } + + QChart* createChart(const DataTable& table) { + + QChart* chart = new QChart(); + chart->setTitle("Category Line chart"); + + QString name("Series "); + int nameIndex = 0; + foreach (DataList list, table) { + QLineSeries *series = new QLineSeries(chart); + foreach (Data data, list) + series->append(data.first); + series->setName(name + QString::number(nameIndex)); + nameIndex++; + chart->addSeries(series); + } + +// chart->createDefaultAxes(); + QCategoryAxis *axisX = new QCategoryAxis; + axisX->append("low", 5); + axisX->append("optimal", 12); + axisX->append("high", 19); + axisX->setRange(-1, 20); + chart->setAxisX(axisX, chart->series().at(0)); + + QCategoryAxis *axisY = new QCategoryAxis; + axisY->append("low", 5); + axisY->append("optimal", 8); + axisY->append("high", 12); + axisY->setRange(-5, 20); + chart->setAxisY(axisY, chart->series().at(0)); + + return chart; + } + +}; + +DECLARE_CHART(CategoryLineChart) + diff --git a/src/axis/categoryaxis/chartcategoryaxisx.cpp b/src/axis/categoryaxis/chartcategoryaxisx.cpp index d252c5c..59d490a 100644 --- a/src/axis/categoryaxis/chartcategoryaxisx.cpp +++ b/src/axis/categoryaxis/chartcategoryaxisx.cpp @@ -80,8 +80,10 @@ void ChartCategoryAxisX::updateGeometry() QList shades = m_shades->childItems(); QList axis = m_arrow->childItems(); - // Q_ASSERT(labels.size() == ticksList.size()); - // Q_ASSERT(layout.size() == ticksList.size()); + + for (int i = 0; i < labels.count(); i++) { + labels.at(i)->setVisible(false); + } // axis base line QGraphicsLineItem *lineItem = static_cast(axis.at(0)); @@ -97,10 +99,17 @@ void ChartCategoryAxisX::updateGeometry() const QRectF& rect = labelItem->boundingRect(); QPointF center = rect.center(); labelItem->setTransformOriginPoint(center.x(), center.y()); - if (i < ticksList.count()) + if (i < layout.size() - 1) { labelItem->setPos(layout[i] + (layout[i + 1] - layout[i]) / 2 - center.x(), m_rect.bottom() + label_padding); - else + } else { labelItem->setPos(layout[i] - center.x(), m_rect.bottom() + label_padding); + } + + // check if the label should be shown + if (labelItem->pos().x() + center.x() < m_rect.left() || labelItem->pos().x() + center.x() > m_rect.right()) + labelItem->setVisible(false); + else + labelItem->setVisible(true); m_minWidth += rect.width(); m_minHeight = qMax(rect.height()+ label_padding, m_minHeight); @@ -111,16 +120,22 @@ void ChartCategoryAxisX::updateGeometry() } // grid lines and axis line ticks - if (layout[i] < m_rect.left() || layout[i] > m_rect.right()) - continue; - QGraphicsLineItem *lineItem = static_cast(lines.at(i)); lineItem->setPos(layout[i], m_rect.top()); lineItem->setLine(0, 0, 0, m_rect.height()); - lineItem = static_cast(axis.at(i+1)); - lineItem->setPos(layout[i], m_rect.bottom()); - lineItem->setLine(0, 0, 0, 5); + QGraphicsLineItem *tickLineItem = static_cast(axis.at(i+1)); + tickLineItem->setPos(layout[i], m_rect.bottom()); + tickLineItem->setLine(0, 0, 0, 5); + + // check if the grid line and the axis tick should be shown + if (lineItem->pos().x() < m_rect.left() || lineItem->pos().x() > m_rect.right()) { + lineItem->setVisible(false); + tickLineItem->setVisible(false); + } else { + lineItem->setVisible(true); + tickLineItem->setVisible(true); + } } } diff --git a/src/axis/categoryaxis/chartcategoryaxisy.cpp b/src/axis/categoryaxis/chartcategoryaxisy.cpp index 43038f3..82f2e32 100644 --- a/src/axis/categoryaxis/chartcategoryaxisy.cpp +++ b/src/axis/categoryaxis/chartcategoryaxisy.cpp @@ -82,10 +82,11 @@ void ChartCategoryAxisY::updateGeometry() QList shades = m_shades->childItems(); QList axis = m_arrow->childItems(); - // Q_ASSERT(labels.size() == ticksList.size()); - // Q_ASSERT(layout.size() == ticksList.size()); +// qreal height = 2*m_rect.bottom(); - qreal height = 2*m_rect.bottom(); + for (int i = 0; i < labels.count(); i++) { + labels.at(i)->setVisible(false); + } // axis base line QGraphicsLineItem *lineItem = static_cast(axis.at(0)); @@ -95,7 +96,6 @@ void ChartCategoryAxisY::updateGeometry() // label items QGraphicsSimpleTextItem *labelItem = static_cast(labels.at(i)); - if (i < ticksList.count()) { labelItem->setText(ticksList.at(i)); } @@ -104,18 +104,24 @@ void ChartCategoryAxisY::updateGeometry() QPointF center = rect.center(); labelItem->setTransformOriginPoint(center.x(), center.y()); - if (i < ticksList.count()) + if (i < layout.size() - 1) labelItem->setPos(m_rect.left() - rect.width() - label_padding , layout[i] + (layout[i + 1] - layout[i]) / 2 - center.y()); else labelItem->setPos(m_rect.left() - rect.width() - label_padding , layout[i]-center.y()); - if(labelItem->pos().y()+rect.height()>height) { + // check if the label should be shown + if (labelItem->pos().y() + center.y() < m_rect.top() || labelItem->pos().y() + center.y() > m_rect.bottom()) labelItem->setVisible(false); - } - else { + else labelItem->setVisible(true); - height=labelItem->pos().y(); - } + +// if(labelItem->pos().y()+rect.height()>height) { +// labelItem->setVisible(false); +// } +// else { +// labelItem->setVisible(true); +// height=labelItem->pos().y(); +// } m_minWidth=qMax(rect.width()+label_padding,m_minWidth); m_minHeight+=rect.height(); @@ -126,16 +132,22 @@ void ChartCategoryAxisY::updateGeometry() } // grid lines and axis line ticks - if (layout[i] < m_rect.left() || layout[i] > m_rect.right()) - continue; - QGraphicsLineItem *lineItem = static_cast(lines.at(i)); lineItem->setPos(m_rect.left(), layout[i]); lineItem->setLine(0, 0, m_rect.width(), 0); - lineItem = static_cast(axis.at(i+1)); - lineItem->setPos(m_rect.left(), layout[i]); - lineItem->setLine(-5, 0, 0, 0); + QGraphicsLineItem *tickLineItem = static_cast(axis.at(i+1)); + tickLineItem->setPos(m_rect.left(), layout[i]); + tickLineItem->setLine(-5, 0, 0, 0); + + // check if the grid line and the axis tick should be shown + if (lineItem->pos().y() < m_rect.top() || lineItem->pos().y() > m_rect.bottom()) { + lineItem->setVisible(false); + tickLineItem->setVisible(false); + } else { + lineItem->setVisible(true); + tickLineItem->setVisible(true); + } } }