diff --git a/src/axis/categoriesaxis/chartcategoriesaxisx.cpp b/src/axis/categoriesaxis/chartcategoriesaxisx.cpp index 1b3e35b..fdac3de 100644 --- a/src/axis/categoriesaxis/chartcategoriesaxisx.cpp +++ b/src/axis/categoriesaxis/chartcategoriesaxisx.cpp @@ -1,36 +1,34 @@ /**************************************************************************** -** -** 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$ -** -****************************************************************************/ + ** + ** 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 "chartcategoriesaxisx_p.h" #include "chartpresenter_p.h" -#include "chartanimator_p.h" -#include "qbarcategoriesaxis.h" -#include -#include +#include "qbarcategoriesaxis_p.h" +#include static int label_padding = 5; QTCOMMERCIALCHART_BEGIN_NAMESPACE ChartCategoriesAxisX::ChartCategoriesAxisX(QBarCategoriesAxis *axis,ChartPresenter *presenter) : ChartAxis(axis,presenter), - m_categoriesAxis(axis) +m_categoriesAxis(axis) { } @@ -46,12 +44,24 @@ QVector ChartCategoriesAxisX::calculateLayout() const QVector points; points.resize(m_categoriesAxis->categories().count()+1); - // TODO: shift logic - const qreal deltaX = m_rect.width()/(m_categoriesAxis->categories().count()); - for (int i = 0; i < m_categoriesAxis->categories().count()+1; ++i) { - int x = i * deltaX + m_rect.left(); + const qreal delta = m_rect.width()/(m_categoriesAxis->categories().count()); + const qreal min = m_categoriesAxis->d_ptr->min(); + const qreal max = m_categoriesAxis->d_ptr->max(); + qreal start =-min-0.5; + if(start<=0) { + start = fmod(start * m_rect.width()/(max - min),delta) + delta; + } + else { + start = fmod(start * m_rect.width()/(max - min),delta); + } + + points[m_categoriesAxis->categories().count()] = m_rect.left() + m_rect.width(); + + for (int i = 0; i < m_categoriesAxis->categories().count(); ++i) { + qreal x = start + i * delta + m_rect.left(); points[i] = x; } + return points; } @@ -73,27 +83,40 @@ void ChartCategoriesAxisX::updateGeometry() QList shades = m_shades->childItems(); QList axis = m_axis->childItems(); - Q_ASSERT(labels.size()-1 == ticksList.size()); - Q_ASSERT(layout.size()-1 == ticksList.size()); + Q_ASSERT(labels.size() == ticksList.size()); + Q_ASSERT(layout.size() == ticksList.size()); + + const qreal delta = m_rect.width()/(m_categoriesAxis->categories().count()); QGraphicsLineItem *lineItem = static_cast(axis.at(0)); lineItem->setLine(m_rect.left(), m_rect.bottom(), m_rect.right(), m_rect.bottom()); + qreal width = m_rect.left(); for (int i = 0; i < layout.size(); ++i) { QGraphicsLineItem *lineItem = static_cast(lines.at(i)); lineItem->setLine(layout[i], m_rect.top(), layout[i], m_rect.bottom()); QGraphicsSimpleTextItem *labelItem = static_cast(labels.at(i)); - if (i>=1) { - labelItem->setText(ticksList.at(i-1)); + labelItem->setText(ticksList.at(i)); const QRectF& rect = labelItem->boundingRect(); QPointF center = rect.center(); labelItem->setTransformOriginPoint(center.x(), center.y()); - labelItem->setPos(layout[i] - (layout[i] - layout[i-1])/2 - center.x(), m_rect.bottom() + label_padding); - m_minWidth+=rect.width(); - m_minHeight=qMax(rect.height()+label_padding,m_minHeight); + + if(i==layout.size()-1){ + labelItem->setPos(layout[i-1] + (delta)/2 - center.x(), m_rect.bottom() + label_padding); }else{ + labelItem->setPos(layout[i] - (delta)/2 - center.x(), m_rect.bottom() + label_padding); + } + + if(labelItem->pos().x()<=width || labelItem->pos().x()+ rect.width()>m_rect.right()) { labelItem->setVisible(false); } + else { + labelItem->setVisible(true); + width=rect.width()+labelItem->pos().x(); + } + + m_minWidth+=rect.width(); + m_minHeight=qMax(rect.height()+label_padding,m_minHeight); if ((i+1)%2 && i>1) { QGraphicsRectItem *rectItem = static_cast(shades.at(i/2-1)); diff --git a/src/axis/categoriesaxis/chartcategoriesaxisy.cpp b/src/axis/categoriesaxis/chartcategoriesaxisy.cpp index 9b0f78d..28e9f67 100644 --- a/src/axis/categoriesaxis/chartcategoriesaxisy.cpp +++ b/src/axis/categoriesaxis/chartcategoriesaxisy.cpp @@ -1,37 +1,35 @@ /**************************************************************************** -** -** 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$ -** -****************************************************************************/ + ** + ** 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 "chartcategoriesaxisy_p.h" #include "chartpresenter_p.h" -#include "chartanimator_p.h" -#include "qbarcategoriesaxis.h" -#include -#include -#include +#include "qbarcategoriesaxis_p.h" +#include +#include static int label_padding = 5; QTCOMMERCIALCHART_BEGIN_NAMESPACE ChartCategoriesAxisY::ChartCategoriesAxisY(QBarCategoriesAxis *axis,ChartPresenter *presenter) : ChartAxis(axis,presenter), - m_categoriesAxis(axis) +m_categoriesAxis(axis) { } @@ -46,9 +44,24 @@ QVector ChartCategoriesAxisY::calculateLayout() const QVector points; points.resize(m_categoriesAxis->categories().count()+1); - const qreal deltaY = m_rect.height()/(m_categoriesAxis->categories().count()); - for (int i = 0; i < m_categoriesAxis->categories().count()+1; ++i) { - int y = i * -deltaY + m_rect.bottom(); + qreal delta = m_rect.height()/(m_categoriesAxis->categories().count()); + + const qreal min = m_categoriesAxis->d_ptr->min(); + const qreal max = m_categoriesAxis->d_ptr->max(); + + qreal start =-min-0.5; + + if(start<=0) { + start = fmod(start * m_rect.height()/(max - min),delta) + delta; + } + else { + start = fmod(start * m_rect.height()/(max - min),delta); + } + + points[m_categoriesAxis->categories().count()] = m_rect.top(); + + for (int i = 0; i < m_categoriesAxis->categories().count(); ++i) { + int y = m_rect.bottom() - i * delta - start; points[i] = y; } @@ -73,28 +86,41 @@ void ChartCategoriesAxisY::updateGeometry() QList shades = m_shades->childItems(); QList axis = m_axis->childItems(); - Q_ASSERT(labels.size()-1 == ticksList.size()); - Q_ASSERT(layout.size()-1 == ticksList.size()); + Q_ASSERT(labels.size() == ticksList.size()); + Q_ASSERT(layout.size() == ticksList.size()); + + const qreal delta = m_rect.height()/(m_categoriesAxis->categories().count()); QGraphicsLineItem *lineItem = static_cast(axis.at(0)); lineItem->setLine(m_rect.left() , m_rect.top(), m_rect.left(), m_rect.bottom()); + qreal height = m_rect.bottom(); for (int i = 0; i < layout.size(); ++i) { QGraphicsLineItem *lineItem = static_cast(lines.at(i)); lineItem->setLine(m_rect.left() , layout[i], m_rect.right(), layout[i]); QGraphicsSimpleTextItem *labelItem = static_cast(labels.at(i)); - if(i>=1){ - labelItem->setText(ticksList.at(i-1)); + labelItem->setText(ticksList.at(i)); const QRectF& rect = labelItem->boundingRect(); QPointF center = rect.center(); labelItem->setTransformOriginPoint(center.x(), center.y()); - labelItem->setPos(m_rect.left() - rect.width() - label_padding , layout[i] - (layout[i] - layout[i-1])/2 -center.y()); - m_minWidth+=rect.width(); - m_minHeight=qMax(rect.height()+label_padding,m_minHeight); - }else{ - labelItem->setVisible(false); + + if(i==layout.size()-1) { + labelItem->setPos(m_rect.left() - rect.width() - label_padding ,layout[i-1] - (delta)/2 - center.y()); + } + else { + labelItem->setPos(m_rect.left() - rect.width() - label_padding ,layout[i] + (delta)/2 - center.y()); } + if(labelItem->pos().y()+rect.height()>= height || labelItem->pos().y() < m_rect.top()) { + labelItem->setVisible(false); + } + else { + labelItem->setVisible(true); + height=labelItem->pos().y(); + } + + m_minWidth+=rect.width(); + m_minHeight=qMax(rect.height()+label_padding,m_minHeight); if ((i+1)%2 && i>1) { QGraphicsRectItem *rectItem = static_cast(shades.at(i/2-1)); @@ -105,7 +131,6 @@ void ChartCategoriesAxisY::updateGeometry() } } - void ChartCategoriesAxisY::handleAxisUpdated() { diff --git a/src/axis/categoriesaxis/qbarcategoriesaxis.cpp b/src/axis/categoriesaxis/qbarcategoriesaxis.cpp index 0fb0342..dbdcdf2 100644 --- a/src/axis/categoriesaxis/qbarcategoriesaxis.cpp +++ b/src/axis/categoriesaxis/qbarcategoriesaxis.cpp @@ -311,7 +311,9 @@ QAbstractAxis::AxisType QBarCategoriesAxis::type() const ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// QBarCategoriesAxisPrivate::QBarCategoriesAxisPrivate(QBarCategoriesAxis* q): - QAbstractAxisPrivate(q) + QAbstractAxisPrivate(q), + m_min(0.0), + m_max(0.0) { } @@ -342,17 +344,27 @@ void QBarCategoriesAxisPrivate::setRange(const QVariant &min, const QVariant &ma qreal QBarCategoriesAxisPrivate::min() { //TODO:: cache it - return m_categories.indexOf(m_minCategory) - 0.5; + return m_min;//m_categories.indexOf(m_minCategory) - 0.5; } qreal QBarCategoriesAxisPrivate::max() { //TODO:: cache it - return m_categories.indexOf(m_maxCategory) + 0.5; + return m_max;//m_categories.indexOf(m_maxCategory) + 0.5; } void QBarCategoriesAxisPrivate::handleDomainUpdated() { + Domain* domain = qobject_cast(sender()); + + if(m_orientation==Qt::Horizontal){ + m_min = domain->minX(); + m_max = domain->maxX(); + }else if(m_orientation==Qt::Vertical){ + m_min = domain->minY(); + m_max = domain->maxY(); + } + // Q_Q(QBarCategoriesAxis); // TODO: causes crash in some situations. added to known issues diff --git a/src/axis/categoriesaxis/qbarcategoriesaxis_p.h b/src/axis/categoriesaxis/qbarcategoriesaxis_p.h index 6a237bb..445c1f2 100644 --- a/src/axis/categoriesaxis/qbarcategoriesaxis_p.h +++ b/src/axis/categoriesaxis/qbarcategoriesaxis_p.h @@ -62,6 +62,8 @@ private: QStringList m_categories; QString m_minCategory; QString m_maxCategory; + qreal m_min; + qreal m_max; private: Q_DECLARE_PUBLIC(QBarCategoriesAxis) diff --git a/src/axis/chartaxis.cpp b/src/axis/chartaxis.cpp index 69d85e1..30183d6 100644 --- a/src/axis/chartaxis.cpp +++ b/src/axis/chartaxis.cpp @@ -374,11 +374,11 @@ void ChartAxis::createCategoryLabels(QStringList &labels,qreal min, qreal max,co Q_ASSERT(max>min); Q_UNUSED(max); - int x = qCeil(min); + int x = qFloor(min+0.5); int count = 0; // Try to find category for x coordinate - while (count < categories.count()) { + while (count < categories.count()+1) { if ((x < categories.count()) && (x >= 0)) { labels << categories.at(x); } else {