##// END OF EJS Templates
Fix assert failure with percent bar series...
Titta Heikkala -
r2690:6c409268c150
parent child
Show More
@@ -1,134 +1,141
1 /****************************************************************************
1 /****************************************************************************
2 **
2 **
3 ** Copyright (C) 2014 Digia Plc
3 ** Copyright (C) 2014 Digia Plc
4 ** All rights reserved.
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
6 **
7 ** This file is part of the Qt Enterprise Charts Add-on.
7 ** This file is part of the Qt Enterprise Charts Add-on.
8 **
8 **
9 ** $QT_BEGIN_LICENSE$
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Enterprise licenses may use this file in
10 ** Licensees holding valid Qt Enterprise licenses may use this file in
11 ** accordance with the Qt Enterprise License Agreement provided with the
11 ** accordance with the Qt Enterprise License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
13 ** a written agreement between you and Digia.
14 **
14 **
15 ** If you have questions regarding the use of this file, please use
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
17 ** $QT_END_LICENSE$
18 **
18 **
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "horizontalpercentbarchartitem_p.h"
21 #include "horizontalpercentbarchartitem_p.h"
22 #include "qabstractbarseries_p.h"
22 #include "qabstractbarseries_p.h"
23 #include "qbarset_p.h"
23 #include "qbarset_p.h"
24 #include "bar_p.h"
24 #include "bar_p.h"
25
25
26 QTCOMMERCIALCHART_BEGIN_NAMESPACE
26 QTCOMMERCIALCHART_BEGIN_NAMESPACE
27
27
28 HorizontalPercentBarChartItem::HorizontalPercentBarChartItem(QAbstractBarSeries *series, QGraphicsItem* item)
28 HorizontalPercentBarChartItem::HorizontalPercentBarChartItem(QAbstractBarSeries *series, QGraphicsItem* item)
29 : AbstractBarChartItem(series, item)
29 : AbstractBarChartItem(series, item)
30 {
30 {
31 }
31 }
32
32
33 void HorizontalPercentBarChartItem::initializeLayout()
33 void HorizontalPercentBarChartItem::initializeLayout()
34 {
34 {
35 qreal categoryCount = m_series->d_func()->categoryCount();
35 qreal categoryCount = m_series->d_func()->categoryCount();
36 qreal setCount = m_series->count();
36 qreal setCount = m_series->count();
37 qreal barWidth = m_series->d_func()->barWidth();
37 qreal barWidth = m_series->d_func()->barWidth();
38
38
39 m_layout.clear();
39 m_layout.clear();
40 for(int category = 0; category < categoryCount; category++) {
40 for(int category = 0; category < categoryCount; category++) {
41 for (int set = 0; set < setCount; set++) {
41 for (int set = 0; set < setCount; set++) {
42 QRectF rect;
42 QRectF rect;
43 QPointF topLeft;
43 QPointF topLeft;
44 QPointF bottomRight;
44 QPointF bottomRight;
45 if (domain()->type() == AbstractDomain::LogXYDomain || domain()->type() == AbstractDomain::LogXLogYDomain) {
45 if (domain()->type() == AbstractDomain::LogXYDomain || domain()->type() == AbstractDomain::LogXLogYDomain) {
46 topLeft = domain()->calculateGeometryPoint(QPointF(domain()->minX(), category - barWidth / 2), m_validData);
46 topLeft = domain()->calculateGeometryPoint(QPointF(domain()->minX(), category - barWidth / 2), m_validData);
47 bottomRight = domain()->calculateGeometryPoint(QPointF(domain()->minX(), category + barWidth / 2), m_validData);
47 bottomRight = domain()->calculateGeometryPoint(QPointF(domain()->minX(), category + barWidth / 2), m_validData);
48 } else {
48 } else {
49 topLeft = domain()->calculateGeometryPoint(QPointF(0, category - barWidth / 2), m_validData);
49 topLeft = domain()->calculateGeometryPoint(QPointF(0, category - barWidth / 2), m_validData);
50 bottomRight = domain()->calculateGeometryPoint(QPointF(0, category + barWidth / 2), m_validData);
50 bottomRight = domain()->calculateGeometryPoint(QPointF(0, category + barWidth / 2), m_validData);
51 }
51 }
52
52
53 if (!m_validData)
53 if (!m_validData)
54 return;
54 return;
55
55
56 rect.setTopLeft(topLeft);
56 rect.setTopLeft(topLeft);
57 rect.setBottomRight(bottomRight);
57 rect.setBottomRight(bottomRight);
58 m_layout.append(rect.normalized());
58 m_layout.append(rect.normalized());
59 }
59 }
60 }
60 }
61 }
61 }
62
62
63 QVector<QRectF> HorizontalPercentBarChartItem::calculateLayout()
63 QVector<QRectF> HorizontalPercentBarChartItem::calculateLayout()
64 {
64 {
65 QVector<QRectF> layout;
65 QVector<QRectF> layout;
66
66
67 // Use temporary qreals for accuracy
67 // Use temporary qreals for accuracy
68 qreal categoryCount = m_series->d_func()->categoryCount();
68 qreal categoryCount = m_series->d_func()->categoryCount();
69 qreal setCount = m_series->count();
69 qreal setCount = m_series->count();
70 qreal barWidth = m_series->d_func()->barWidth();
70 qreal barWidth = m_series->d_func()->barWidth();
71
71
72 for(int category = 0; category < categoryCount; category++) {
72 for(int category = 0; category < categoryCount; category++) {
73 qreal sum = 0;
73 qreal sum = 0;
74 qreal categorySum = m_series->d_func()->categorySum(category);
74 qreal categorySum = m_series->d_func()->categorySum(category);
75 for (int set = 0; set < setCount; set++) {
75 for (int set = 0; set < setCount; set++) {
76 qreal value = m_series->barSets().at(set)->at(category);
76 qreal value = m_series->barSets().at(set)->at(category);
77 QRectF rect;
77 QRectF rect;
78 qreal topX = 0;
79 if (sum > 0)
80 topX = 100 * sum / categorySum;
81 qreal bottomX = 0;
82 qreal newSum = value + sum;
83 if (newSum > 0)
84 bottomX = 100 * newSum / categorySum;
78 QPointF topLeft;
85 QPointF topLeft;
79 if (domain()->type() == AbstractDomain::LogXYDomain || domain()->type() == AbstractDomain::LogXLogYDomain)
86 if (domain()->type() == AbstractDomain::LogXYDomain || domain()->type() == AbstractDomain::LogXLogYDomain)
80 topLeft = domain()->calculateGeometryPoint(QPointF(set ? 100 * sum/categorySum : domain()->minX(), category - barWidth/2), m_validData);
87 topLeft = domain()->calculateGeometryPoint(QPointF(set ? topX : domain()->minX(), category - barWidth/2), m_validData);
81 else
88 else
82 topLeft = domain()->calculateGeometryPoint(QPointF(set ? 100 * sum/categorySum : 0, category - barWidth/2), m_validData);
89 topLeft = domain()->calculateGeometryPoint(QPointF(set ? topX : 0, category - barWidth/2), m_validData);
83 QPointF bottomRight = domain()->calculateGeometryPoint(QPointF(100 * (value + sum)/categorySum, category + barWidth/2), m_validData);
90 QPointF bottomRight = domain()->calculateGeometryPoint(QPointF(bottomX, category + barWidth/2), m_validData);
84
91
85 rect.setTopLeft(topLeft);
92 rect.setTopLeft(topLeft);
86 rect.setBottomRight(bottomRight);
93 rect.setBottomRight(bottomRight);
87 layout.append(rect.normalized());
94 layout.append(rect.normalized());
88 sum +=value;
95 sum = newSum;
89 }
96 }
90 }
97 }
91 return layout;
98 return layout;
92 }
99 }
93
100
94 void HorizontalPercentBarChartItem::handleUpdatedBars()
101 void HorizontalPercentBarChartItem::handleUpdatedBars()
95 {
102 {
96 // Handle changes in pen, brush, labels etc.
103 // Handle changes in pen, brush, labels etc.
97 int categoryCount = m_series->d_func()->categoryCount();
104 int categoryCount = m_series->d_func()->categoryCount();
98 int setCount = m_series->count();
105 int setCount = m_series->count();
99 int itemIndex(0);
106 int itemIndex(0);
100 static const QString valueTag(QLatin1String("@value"));
107 static const QString valueTag(QLatin1String("@value"));
101
108
102 for (int category = 0; category < categoryCount; category++) {
109 for (int category = 0; category < categoryCount; category++) {
103 for (int set = 0; set < setCount; set++) {
110 for (int set = 0; set < setCount; set++) {
104 QBarSetPrivate *barSet = m_series->d_func()->barsetAt(set)->d_ptr.data();
111 QBarSetPrivate *barSet = m_series->d_func()->barsetAt(set)->d_ptr.data();
105 Bar *bar = m_bars.at(itemIndex);
112 Bar *bar = m_bars.at(itemIndex);
106 bar->setPen(barSet->m_pen);
113 bar->setPen(barSet->m_pen);
107 bar->setBrush(barSet->m_brush);
114 bar->setBrush(barSet->m_brush);
108 bar->update();
115 bar->update();
109
116
110 QGraphicsTextItem *label = m_labels.at(itemIndex);
117 QGraphicsTextItem *label = m_labels.at(itemIndex);
111 int p = m_series->d_func()->percentageAt(set, category) * 100;
118 int p = m_series->d_func()->percentageAt(set, category) * 100;
112 QString vString(QString::number(p));
119 QString vString(QString::number(p));
113 vString.truncate(3);
120 vString.truncate(3);
114 vString.append("%");
121 vString.append("%");
115 QString valueLabel;
122 QString valueLabel;
116 if (m_series->labelsFormat().isEmpty()) {
123 if (m_series->labelsFormat().isEmpty()) {
117 valueLabel = vString;
124 valueLabel = vString;
118 } else {
125 } else {
119 valueLabel = m_series->labelsFormat();
126 valueLabel = m_series->labelsFormat();
120 valueLabel.replace(valueTag, QString::number(barSet->value(category)));
127 valueLabel.replace(valueTag, QString::number(barSet->value(category)));
121 }
128 }
122 label->setHtml(valueLabel);
129 label->setHtml(valueLabel);
123 label->setFont(barSet->m_labelFont);
130 label->setFont(barSet->m_labelFont);
124 label->setDefaultTextColor(barSet->m_labelBrush.color());
131 label->setDefaultTextColor(barSet->m_labelBrush.color());
125 label->update();
132 label->update();
126 itemIndex++;
133 itemIndex++;
127 }
134 }
128 }
135 }
129 }
136 }
130
137
131 #include "moc_horizontalpercentbarchartitem_p.cpp"
138 #include "moc_horizontalpercentbarchartitem_p.cpp"
132
139
133 QTCOMMERCIALCHART_END_NAMESPACE
140 QTCOMMERCIALCHART_END_NAMESPACE
134
141
@@ -1,121 +1,124
1 /****************************************************************************
1 /****************************************************************************
2 **
2 **
3 ** Copyright (C) 2014 Digia Plc
3 ** Copyright (C) 2014 Digia Plc
4 ** All rights reserved.
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
6 **
7 ** This file is part of the Qt Enterprise Charts Add-on.
7 ** This file is part of the Qt Enterprise Charts Add-on.
8 **
8 **
9 ** $QT_BEGIN_LICENSE$
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Enterprise licenses may use this file in
10 ** Licensees holding valid Qt Enterprise licenses may use this file in
11 ** accordance with the Qt Enterprise License Agreement provided with the
11 ** accordance with the Qt Enterprise License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
13 ** a written agreement between you and Digia.
14 **
14 **
15 ** If you have questions regarding the use of this file, please use
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
17 ** $QT_END_LICENSE$
18 **
18 **
19 ****************************************************************************/
19 ****************************************************************************/
20 #include "qhorizontalpercentbarseries.h"
20 #include "qhorizontalpercentbarseries.h"
21 #include "qhorizontalpercentbarseries_p.h"
21 #include "qhorizontalpercentbarseries_p.h"
22 #include "horizontalpercentbarchartitem_p.h"
22 #include "horizontalpercentbarchartitem_p.h"
23
23
24 #include "chartdataset_p.h"
24 #include "chartdataset_p.h"
25 #include "charttheme_p.h"
25 #include "charttheme_p.h"
26
26
27 QTCOMMERCIALCHART_BEGIN_NAMESPACE
27 QTCOMMERCIALCHART_BEGIN_NAMESPACE
28
28
29 /*!
29 /*!
30 \class QHorizontalPercentBarSeries
30 \class QHorizontalPercentBarSeries
31 \inmodule Qt Charts
31 \inmodule Qt Charts
32 \brief Series for creating horizontal percent bar chart.
32 \brief Series for creating horizontal percent bar chart.
33 \mainclass
33 \mainclass
34
34
35 QHorizontalPercentBarSeries represents a series of data shown as bars. The purpose of this class is to draw bars
35 QHorizontalPercentBarSeries represents a series of data shown as bars. The purpose of this
36 as groups, where bars in same category are grouped next to each other. QHorizontalPercentBarSeries groups the data
36 class is to draw bars as groups, where bars in same category are grouped next to each other.
37 from sets to categories, which are defined by a QStringList.
37 QHorizontalPercentBarSeries groups the data from sets to categories, which are defined by a
38 QStringList. Bars with zero value are not drawn.
38
39
39 See the \l {HorizontalPercentBarChart Example} {horizontal percent bar chart example} to learn how to create a horizontal percent bar chart.
40 See the \l {HorizontalPercentBarChart Example} {horizontal percent bar chart example} to learn
41 how to create a horizontal percent bar chart.
40 \image examples_horizontalpercentbarchart.png
42 \image examples_horizontalpercentbarchart.png
41
43
42 \sa QBarSet, QBarSeries, QPercentBarSeries, QAbstractBarSeries, QStackedBarSeries, QHorizontalStackedBarSeries, QHorizontalBarSeries
44 \sa QBarSet, QBarSeries, QPercentBarSeries, QAbstractBarSeries, QStackedBarSeries,
45 QHorizontalStackedBarSeries, QHorizontalBarSeries
43 */
46 */
44 #ifdef QDOC_QT5
47 #ifdef QDOC_QT5
45 /*!
48 /*!
46 \qmltype HorizontalPercentBarSeries
49 \qmltype HorizontalPercentBarSeries
47 \instantiates QHorizontalPercentBarSeries
50 \instantiates QHorizontalPercentBarSeries
48 \inqmlmodule QtCommercial.Chart
51 \inqmlmodule QtCommercial.Chart
49
52
50 \include doc/src/horizontalpercentbarseries.qdocinc
53 \include doc/src/horizontalpercentbarseries.qdocinc
51 */
54 */
52 #else
55 #else
53 /*!
56 /*!
54 \qmlclass HorizontalPercentBarSeries QHorizontalPercentBarSeries
57 \qmlclass HorizontalPercentBarSeries QHorizontalPercentBarSeries
55
58
56 \include ../doc/src/horizontalpercentbarseries.qdocinc
59 \include ../doc/src/horizontalpercentbarseries.qdocinc
57 */
60 */
58 #endif
61 #endif
59
62
60 /*!
63 /*!
61 Constructs empty QHorizontalPercentBarSeries.
64 Constructs empty QHorizontalPercentBarSeries.
62 QHorizontalPercentBarSeries is QObject which is a child of a \a parent.
65 QHorizontalPercentBarSeries is QObject which is a child of a \a parent.
63 */
66 */
64 QHorizontalPercentBarSeries::QHorizontalPercentBarSeries(QObject *parent) :
67 QHorizontalPercentBarSeries::QHorizontalPercentBarSeries(QObject *parent) :
65 QAbstractBarSeries(*new QHorizontalPercentBarSeriesPrivate(this), parent)
68 QAbstractBarSeries(*new QHorizontalPercentBarSeriesPrivate(this), parent)
66 {
69 {
67 }
70 }
68
71
69 /*!
72 /*!
70 Returns QAbstractSeries::SeriesTypeHorizontalPercentBar.
73 Returns QAbstractSeries::SeriesTypeHorizontalPercentBar.
71 */
74 */
72 QAbstractSeries::SeriesType QHorizontalPercentBarSeries::type() const
75 QAbstractSeries::SeriesType QHorizontalPercentBarSeries::type() const
73 {
76 {
74 return QAbstractSeries::SeriesTypeHorizontalPercentBar;
77 return QAbstractSeries::SeriesTypeHorizontalPercentBar;
75 }
78 }
76
79
77 /*!
80 /*!
78 Destructor.
81 Destructor.
79 Removes series from chart.
82 Removes series from chart.
80 */
83 */
81 QHorizontalPercentBarSeries::~QHorizontalPercentBarSeries()
84 QHorizontalPercentBarSeries::~QHorizontalPercentBarSeries()
82 {
85 {
83 Q_D(QHorizontalPercentBarSeries);
86 Q_D(QHorizontalPercentBarSeries);
84 if (d->m_chart)
87 if (d->m_chart)
85 d->m_chart->removeSeries(this);
88 d->m_chart->removeSeries(this);
86 }
89 }
87
90
88 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
91 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
89
92
90 QHorizontalPercentBarSeriesPrivate::QHorizontalPercentBarSeriesPrivate(QHorizontalPercentBarSeries *q) : QAbstractBarSeriesPrivate(q)
93 QHorizontalPercentBarSeriesPrivate::QHorizontalPercentBarSeriesPrivate(QHorizontalPercentBarSeries *q) : QAbstractBarSeriesPrivate(q)
91 {
94 {
92
95
93 }
96 }
94
97
95 void QHorizontalPercentBarSeriesPrivate::initializeDomain()
98 void QHorizontalPercentBarSeriesPrivate::initializeDomain()
96 {
99 {
97 qreal minX(domain()->minX());
100 qreal minX(domain()->minX());
98 qreal minY(domain()->minY());
101 qreal minY(domain()->minY());
99 qreal maxX(domain()->maxX());
102 qreal maxX(domain()->maxX());
100 qreal maxY(domain()->maxY());
103 qreal maxY(domain()->maxY());
101
104
102 qreal y = categoryCount();
105 qreal y = categoryCount();
103 minX = 0;
106 minX = 0;
104 maxX = 100;
107 maxX = 100;
105 minY = qMin(minY, - (qreal)0.5);
108 minY = qMin(minY, - (qreal)0.5);
106 maxY = qMax(maxY, y - (qreal)0.5);
109 maxY = qMax(maxY, y - (qreal)0.5);
107
110
108 domain()->setRange(minX, maxX, minY, maxY);
111 domain()->setRange(minX, maxX, minY, maxY);
109 }
112 }
110
113
111 void QHorizontalPercentBarSeriesPrivate::initializeGraphics(QGraphicsItem* parent)
114 void QHorizontalPercentBarSeriesPrivate::initializeGraphics(QGraphicsItem* parent)
112 {
115 {
113 Q_Q(QHorizontalPercentBarSeries);
116 Q_Q(QHorizontalPercentBarSeries);
114 HorizontalPercentBarChartItem *bar = new HorizontalPercentBarChartItem(q,parent);
117 HorizontalPercentBarChartItem *bar = new HorizontalPercentBarChartItem(q,parent);
115 m_item.reset(bar);
118 m_item.reset(bar);
116 QAbstractSeriesPrivate::initializeGraphics(parent);
119 QAbstractSeriesPrivate::initializeGraphics(parent);
117 }
120 }
118
121
119 #include "moc_qhorizontalpercentbarseries.cpp"
122 #include "moc_qhorizontalpercentbarseries.cpp"
120
123
121 QTCOMMERCIALCHART_END_NAMESPACE
124 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,164 +1,171
1 /****************************************************************************
1 /****************************************************************************
2 **
2 **
3 ** Copyright (C) 2014 Digia Plc
3 ** Copyright (C) 2014 Digia Plc
4 ** All rights reserved.
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
6 **
7 ** This file is part of the Qt Enterprise Charts Add-on.
7 ** This file is part of the Qt Enterprise Charts Add-on.
8 **
8 **
9 ** $QT_BEGIN_LICENSE$
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Enterprise licenses may use this file in
10 ** Licensees holding valid Qt Enterprise licenses may use this file in
11 ** accordance with the Qt Enterprise License Agreement provided with the
11 ** accordance with the Qt Enterprise License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
13 ** a written agreement between you and Digia.
14 **
14 **
15 ** If you have questions regarding the use of this file, please use
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
17 ** $QT_END_LICENSE$
18 **
18 **
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "percentbarchartitem_p.h"
21 #include "percentbarchartitem_p.h"
22 #include "bar_p.h"
22 #include "bar_p.h"
23 #include "qabstractbarseries_p.h"
23 #include "qabstractbarseries_p.h"
24 #include "qbarset.h"
24 #include "qbarset.h"
25 #include "qbarset_p.h"
25 #include "qbarset_p.h"
26
26
27 QTCOMMERCIALCHART_BEGIN_NAMESPACE
27 QTCOMMERCIALCHART_BEGIN_NAMESPACE
28
28
29 PercentBarChartItem::PercentBarChartItem(QAbstractBarSeries *series, QGraphicsItem* item) :
29 PercentBarChartItem::PercentBarChartItem(QAbstractBarSeries *series, QGraphicsItem* item) :
30 AbstractBarChartItem(series, item)
30 AbstractBarChartItem(series, item)
31 {
31 {
32 connect(series, SIGNAL(labelsPositionChanged(QAbstractBarSeries::LabelsPosition)),
32 connect(series, SIGNAL(labelsPositionChanged(QAbstractBarSeries::LabelsPosition)),
33 this, SLOT(handleLabelsPositionChanged()));
33 this, SLOT(handleLabelsPositionChanged()));
34 connect(series, SIGNAL(labelsFormatChanged(QString)), this, SLOT(positionLabels()));
34 connect(series, SIGNAL(labelsFormatChanged(QString)), this, SLOT(positionLabels()));
35 }
35 }
36
36
37 void PercentBarChartItem::initializeLayout()
37 void PercentBarChartItem::initializeLayout()
38 {
38 {
39 qreal categoryCount = m_series->d_func()->categoryCount();
39 qreal categoryCount = m_series->d_func()->categoryCount();
40 qreal setCount = m_series->count();
40 qreal setCount = m_series->count();
41 qreal barWidth = m_series->d_func()->barWidth();
41 qreal barWidth = m_series->d_func()->barWidth();
42
42
43 m_layout.clear();
43 m_layout.clear();
44 for(int category = 0; category < categoryCount; category++) {
44 for(int category = 0; category < categoryCount; category++) {
45 for (int set = 0; set < setCount; set++) {
45 for (int set = 0; set < setCount; set++) {
46 QRectF rect;
46 QRectF rect;
47 QPointF topLeft;
47 QPointF topLeft;
48 QPointF bottomRight;
48 QPointF bottomRight;
49
49
50 if (domain()->type() == AbstractDomain::XLogYDomain || domain()->type() == AbstractDomain::LogXLogYDomain) {
50 if (domain()->type() == AbstractDomain::XLogYDomain || domain()->type() == AbstractDomain::LogXLogYDomain) {
51 topLeft = domain()->calculateGeometryPoint(QPointF(category - barWidth / 2, domain()->minY()), m_validData);
51 topLeft = domain()->calculateGeometryPoint(QPointF(category - barWidth / 2, domain()->minY()), m_validData);
52 bottomRight = domain()->calculateGeometryPoint(QPointF(category + barWidth / 2, domain()->minY()), m_validData);
52 bottomRight = domain()->calculateGeometryPoint(QPointF(category + barWidth / 2, domain()->minY()), m_validData);
53 } else {
53 } else {
54 topLeft = domain()->calculateGeometryPoint(QPointF(category - barWidth / 2, 0), m_validData);
54 topLeft = domain()->calculateGeometryPoint(QPointF(category - barWidth / 2, 0), m_validData);
55 bottomRight = domain()->calculateGeometryPoint(QPointF(category + barWidth / 2, 0), m_validData);
55 bottomRight = domain()->calculateGeometryPoint(QPointF(category + barWidth / 2, 0), m_validData);
56 }
56 }
57
57
58 if (!m_validData)
58 if (!m_validData)
59 return;
59 return;
60
60
61 rect.setTopLeft(topLeft);
61 rect.setTopLeft(topLeft);
62 rect.setBottomRight(bottomRight);
62 rect.setBottomRight(bottomRight);
63 m_layout.append(rect.normalized());
63 m_layout.append(rect.normalized());
64 }
64 }
65 }
65 }
66 }
66 }
67
67
68 QVector<QRectF> PercentBarChartItem::calculateLayout()
68 QVector<QRectF> PercentBarChartItem::calculateLayout()
69 {
69 {
70 QVector<QRectF> layout;
70 QVector<QRectF> layout;
71
71
72 // Use temporary qreals for accuracy
72 // Use temporary qreals for accuracy
73 qreal categoryCount = m_series->d_func()->categoryCount();
73 qreal categoryCount = m_series->d_func()->categoryCount();
74 qreal setCount = m_series->count();
74 qreal setCount = m_series->count();
75 qreal barWidth = m_series->d_func()->barWidth();
75 qreal barWidth = m_series->d_func()->barWidth();
76
76
77 for(int category = 0; category < categoryCount; category++) {
77 for(int category = 0; category < categoryCount; category++) {
78 qreal sum = 0;
78 qreal sum = 0;
79 qreal categorySum = m_series->d_func()->categorySum(category);
79 qreal categorySum = m_series->d_func()->categorySum(category);
80 for (int set = 0; set < setCount; set++) {
80 for (int set = 0; set < setCount; set++) {
81 qreal value = m_series->barSets().at(set)->at(category);
81 qreal value = m_series->barSets().at(set)->at(category);
82 QRectF rect;
82 QRectF rect;
83 QPointF topLeft = domain()->calculateGeometryPoint(QPointF(category - barWidth/2, 100 * (value + sum)/categorySum), m_validData);
83 qreal topY = 0;
84 qreal newSum = value + sum;
85 if (newSum > 0)
86 topY = 100 * newSum / categorySum;
87 qreal bottomY = 0;
88 if (sum > 0)
89 bottomY = 100 * sum / categorySum;
90 QPointF topLeft = domain()->calculateGeometryPoint(QPointF(category - barWidth/2, topY), m_validData);
84 QPointF bottomRight;
91 QPointF bottomRight;
85 if (domain()->type() == AbstractDomain::XLogYDomain || domain()->type() == AbstractDomain::LogXLogYDomain)
92 if (domain()->type() == AbstractDomain::XLogYDomain || domain()->type() == AbstractDomain::LogXLogYDomain)
86 bottomRight = domain()->calculateGeometryPoint(QPointF(category + barWidth/2, set ? 100 * sum/categorySum : domain()->minY()), m_validData);
93 bottomRight = domain()->calculateGeometryPoint(QPointF(category + barWidth/2, set ? bottomY : domain()->minY()), m_validData);
87 else
94 else
88 bottomRight = domain()->calculateGeometryPoint(QPointF(category + barWidth/2, set ? 100 * sum/categorySum : 0), m_validData);
95 bottomRight = domain()->calculateGeometryPoint(QPointF(category + barWidth/2, set ? bottomY : 0), m_validData);
89
96
90 rect.setTopLeft(topLeft);
97 rect.setTopLeft(topLeft);
91 rect.setBottomRight(bottomRight);
98 rect.setBottomRight(bottomRight);
92 layout.append(rect.normalized());
99 layout.append(rect.normalized());
93 sum +=value;
100 sum = newSum;
94 }
101 }
95 }
102 }
96 return layout;
103 return layout;
97 }
104 }
98
105
99 void PercentBarChartItem::handleUpdatedBars()
106 void PercentBarChartItem::handleUpdatedBars()
100 {
107 {
101 // Handle changes in pen, brush, labels etc.
108 // Handle changes in pen, brush, labels etc.
102 int categoryCount = m_series->d_func()->categoryCount();
109 int categoryCount = m_series->d_func()->categoryCount();
103 int setCount = m_series->count();
110 int setCount = m_series->count();
104 int itemIndex(0);
111 int itemIndex(0);
105 static const QString valueTag(QLatin1String("@value"));
112 static const QString valueTag(QLatin1String("@value"));
106
113
107 for (int category = 0; category < categoryCount; category++) {
114 for (int category = 0; category < categoryCount; category++) {
108 for (int set = 0; set < setCount; set++) {
115 for (int set = 0; set < setCount; set++) {
109 QBarSetPrivate *barSet = m_series->d_func()->barsetAt(set)->d_ptr.data();
116 QBarSetPrivate *barSet = m_series->d_func()->barsetAt(set)->d_ptr.data();
110 Bar *bar = m_bars.at(itemIndex);
117 Bar *bar = m_bars.at(itemIndex);
111 bar->setPen(barSet->m_pen);
118 bar->setPen(barSet->m_pen);
112 bar->setBrush(barSet->m_brush);
119 bar->setBrush(barSet->m_brush);
113 bar->update();
120 bar->update();
114
121
115 QGraphicsTextItem *label = m_labels.at(itemIndex);
122 QGraphicsTextItem *label = m_labels.at(itemIndex);
116 int p = m_series->d_func()->percentageAt(set, category) * 100;
123 int p = m_series->d_func()->percentageAt(set, category) * 100;
117 QString vString(QString::number(p));
124 QString vString(QString::number(p));
118 vString.truncate(3);
125 vString.truncate(3);
119 vString.append("%");
126 vString.append("%");
120 QString valueLabel;
127 QString valueLabel;
121 if (m_series->labelsFormat().isEmpty()) {
128 if (m_series->labelsFormat().isEmpty()) {
122 valueLabel = vString;
129 valueLabel = vString;
123 } else {
130 } else {
124 valueLabel = m_series->labelsFormat();
131 valueLabel = m_series->labelsFormat();
125 valueLabel.replace(valueTag, QString::number(barSet->value(category)));
132 valueLabel.replace(valueTag, QString::number(barSet->value(category)));
126 }
133 }
127 label->setHtml(valueLabel);
134 label->setHtml(valueLabel);
128 label->setFont(barSet->m_labelFont);
135 label->setFont(barSet->m_labelFont);
129 label->setDefaultTextColor(barSet->m_labelBrush.color());
136 label->setDefaultTextColor(barSet->m_labelBrush.color());
130 label->update();
137 label->update();
131 itemIndex++;
138 itemIndex++;
132 }
139 }
133 }
140 }
134 }
141 }
135
142
136 void PercentBarChartItem::handleLabelsPositionChanged()
143 void PercentBarChartItem::handleLabelsPositionChanged()
137 {
144 {
138 positionLabels();
145 positionLabels();
139 }
146 }
140
147
141 void PercentBarChartItem::positionLabels()
148 void PercentBarChartItem::positionLabels()
142 {
149 {
143 for (int i = 0; i < m_layout.count(); i++) {
150 for (int i = 0; i < m_layout.count(); i++) {
144 QGraphicsTextItem *label = m_labels.at(i);
151 QGraphicsTextItem *label = m_labels.at(i);
145 qreal xPos = m_layout.at(i).center().x() - label->boundingRect().center().x();
152 qreal xPos = m_layout.at(i).center().x() - label->boundingRect().center().x();
146 qreal yPos = 0;
153 qreal yPos = 0;
147
154
148 if (m_series->labelsPosition() == QAbstractBarSeries::LabelsCenter)
155 if (m_series->labelsPosition() == QAbstractBarSeries::LabelsCenter)
149 yPos = m_layout.at(i).center().y() - label->boundingRect().center().y();
156 yPos = m_layout.at(i).center().y() - label->boundingRect().center().y();
150 else if (m_series->labelsPosition() == QAbstractBarSeries::LabelsInsideEnd)
157 else if (m_series->labelsPosition() == QAbstractBarSeries::LabelsInsideEnd)
151 yPos = m_layout.at(i).top();
158 yPos = m_layout.at(i).top();
152 else if (m_series->labelsPosition() == QAbstractBarSeries::LabelsInsideBase)
159 else if (m_series->labelsPosition() == QAbstractBarSeries::LabelsInsideBase)
153 yPos = m_layout.at(i).bottom() - label->boundingRect().height();
160 yPos = m_layout.at(i).bottom() - label->boundingRect().height();
154 else if (m_series->labelsPosition() == QAbstractBarSeries::LabelsOutsideEnd)
161 else if (m_series->labelsPosition() == QAbstractBarSeries::LabelsOutsideEnd)
155 yPos = m_layout.at(i).top() - label->boundingRect().height();
162 yPos = m_layout.at(i).top() - label->boundingRect().height();
156
163
157 label->setPos(xPos, yPos);
164 label->setPos(xPos, yPos);
158 label->setZValue(zValue() + 1);
165 label->setZValue(zValue() + 1);
159 }
166 }
160 }
167 }
161
168
162 #include "moc_percentbarchartitem_p.cpp"
169 #include "moc_percentbarchartitem_p.cpp"
163
170
164 QTCOMMERCIALCHART_END_NAMESPACE
171 QTCOMMERCIALCHART_END_NAMESPACE
@@ -1,123 +1,125
1 /****************************************************************************
1 /****************************************************************************
2 **
2 **
3 ** Copyright (C) 2014 Digia Plc
3 ** Copyright (C) 2014 Digia Plc
4 ** All rights reserved.
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
6 **
7 ** This file is part of the Qt Enterprise Charts Add-on.
7 ** This file is part of the Qt Enterprise Charts Add-on.
8 **
8 **
9 ** $QT_BEGIN_LICENSE$
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Enterprise licenses may use this file in
10 ** Licensees holding valid Qt Enterprise licenses may use this file in
11 ** accordance with the Qt Enterprise License Agreement provided with the
11 ** accordance with the Qt Enterprise License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
13 ** a written agreement between you and Digia.
14 **
14 **
15 ** If you have questions regarding the use of this file, please use
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
17 ** $QT_END_LICENSE$
18 **
18 **
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include "qpercentbarseries.h"
21 #include "qpercentbarseries.h"
22 #include "qpercentbarseries_p.h"
22 #include "qpercentbarseries_p.h"
23 #include "percentbarchartitem_p.h"
23 #include "percentbarchartitem_p.h"
24 #include "chartdataset_p.h"
24 #include "chartdataset_p.h"
25 #include "charttheme_p.h"
25 #include "charttheme_p.h"
26 #include "qvalueaxis.h"
26 #include "qvalueaxis.h"
27
27
28 QTCOMMERCIALCHART_BEGIN_NAMESPACE
28 QTCOMMERCIALCHART_BEGIN_NAMESPACE
29
29
30 /*!
30 /*!
31 \class QPercentBarSeries
31 \class QPercentBarSeries
32 \inmodule Qt Charts
32 \inmodule Qt Charts
33 \brief Series for creating percent bar chart.
33 \brief Series for creating percent bar chart.
34 \mainclass
34 \mainclass
35
35
36 QPercentBarSeries represents a series of data shown as bars. The purpose of this class is to draw bars
36 QPercentBarSeries represents a series of data shown as bars. The purpose of this class is to
37 as stacks, where each bar is shown as percentage of all bars in that category.
37 draw bars as stacks, where each bar is shown as percentage of all bars in that category.
38 QPercentBarSeries groups the data from sets to categories, which are defined by a QStringList.
38 QPercentBarSeries groups the data from sets to categories, which are defined by a QStringList.
39 Bars with zero value are not drawn.
39
40
40 See the \l {PercentbarChart Example} {percent bar chart example} to learn how to create a percent bar chart.
41 See the \l {PercentbarChart Example} {percent bar chart example} to learn how to create a
42 percent bar chart.
41 \image examples_percentbarchart.png
43 \image examples_percentbarchart.png
42
44
43 \sa QBarSet, QStackedBarSeries, QAbstractBarSeries
45 \sa QBarSet, QStackedBarSeries, QAbstractBarSeries
44 */
46 */
45 #ifdef QDOC_QT5
47 #ifdef QDOC_QT5
46 /*!
48 /*!
47 \qmltype PercentBarSeries
49 \qmltype PercentBarSeries
48 \instantiates QPercentBarSeries
50 \instantiates QPercentBarSeries
49 \inqmlmodule QtCommercial.Chart
51 \inqmlmodule QtCommercial.Chart
50
52
51 \include doc/src/persentbarseries.qdocinc
53 \include doc/src/persentbarseries.qdocinc
52 */
54 */
53 #else
55 #else
54 /*!
56 /*!
55 \qmlclass PercentBarSeries QPercentBarSeries
57 \qmlclass PercentBarSeries QPercentBarSeries
56
58
57 \include ../doc/src/persentbarseries.qdocinc
59 \include ../doc/src/persentbarseries.qdocinc
58 */
60 */
59 #endif
61 #endif
60
62
61 /*!
63 /*!
62 Constructs empty QPercentBarSeries.
64 Constructs empty QPercentBarSeries.
63 QPercentBarSeries is QObject which is a child of a \a parent.
65 QPercentBarSeries is QObject which is a child of a \a parent.
64 */
66 */
65 QPercentBarSeries::QPercentBarSeries(QObject *parent)
67 QPercentBarSeries::QPercentBarSeries(QObject *parent)
66 : QAbstractBarSeries(*new QPercentBarSeriesPrivate(this), parent)
68 : QAbstractBarSeries(*new QPercentBarSeriesPrivate(this), parent)
67 {
69 {
68 }
70 }
69
71
70 /*!
72 /*!
71 Destructor. Removes series from chart.
73 Destructor. Removes series from chart.
72 */
74 */
73 QPercentBarSeries::~QPercentBarSeries()
75 QPercentBarSeries::~QPercentBarSeries()
74 {
76 {
75 Q_D(QPercentBarSeries);
77 Q_D(QPercentBarSeries);
76 if (d->m_chart)
78 if (d->m_chart)
77 d->m_chart->removeSeries(this);
79 d->m_chart->removeSeries(this);
78 }
80 }
79
81
80 /*!
82 /*!
81 Returns QAbstractSeries::SeriesTypePercentBar.
83 Returns QAbstractSeries::SeriesTypePercentBar.
82 */
84 */
83 QAbstractSeries::SeriesType QPercentBarSeries::type() const
85 QAbstractSeries::SeriesType QPercentBarSeries::type() const
84 {
86 {
85 return QAbstractSeries::SeriesTypePercentBar;
87 return QAbstractSeries::SeriesTypePercentBar;
86 }
88 }
87
89
88 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
90 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
89
91
90 QPercentBarSeriesPrivate::QPercentBarSeriesPrivate(QPercentBarSeries *q) : QAbstractBarSeriesPrivate(q)
92 QPercentBarSeriesPrivate::QPercentBarSeriesPrivate(QPercentBarSeries *q) : QAbstractBarSeriesPrivate(q)
91 {
93 {
92
94
93 }
95 }
94
96
95 void QPercentBarSeriesPrivate::initializeDomain()
97 void QPercentBarSeriesPrivate::initializeDomain()
96 {
98 {
97 qreal minX(domain()->minX());
99 qreal minX(domain()->minX());
98 qreal minY(domain()->minY());
100 qreal minY(domain()->minY());
99 qreal maxX(domain()->maxX());
101 qreal maxX(domain()->maxX());
100 qreal maxY(domain()->maxY());
102 qreal maxY(domain()->maxY());
101
103
102 qreal x = categoryCount();
104 qreal x = categoryCount();
103 minX = qMin(minX, - (qreal)0.5);
105 minX = qMin(minX, - (qreal)0.5);
104 maxX = qMax(maxX, x - (qreal)0.5);
106 maxX = qMax(maxX, x - (qreal)0.5);
105 minY = 0;
107 minY = 0;
106 maxY = 100;
108 maxY = 100;
107
109
108 domain()->setRange(minX, maxX, minY, maxY);
110 domain()->setRange(minX, maxX, minY, maxY);
109 }
111 }
110
112
111
113
112 void QPercentBarSeriesPrivate::initializeGraphics(QGraphicsItem* parent)
114 void QPercentBarSeriesPrivate::initializeGraphics(QGraphicsItem* parent)
113 {
115 {
114 Q_Q(QPercentBarSeries);
116 Q_Q(QPercentBarSeries);
115 PercentBarChartItem *bar = new PercentBarChartItem(q,parent);
117 PercentBarChartItem *bar = new PercentBarChartItem(q,parent);
116 m_item.reset(bar);
118 m_item.reset(bar);
117 QAbstractSeriesPrivate::initializeGraphics(parent);
119 QAbstractSeriesPrivate::initializeGraphics(parent);
118 }
120 }
119
121
120 #include "moc_qpercentbarseries.cpp"
122 #include "moc_qpercentbarseries.cpp"
121
123
122 QTCOMMERCIALCHART_END_NAMESPACE
124 QTCOMMERCIALCHART_END_NAMESPACE
123
125
@@ -1,659 +1,679
1 /****************************************************************************
1 /****************************************************************************
2 **
2 **
3 ** Copyright (C) 2014 Digia Plc
3 ** Copyright (C) 2014 Digia Plc
4 ** All rights reserved.
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
6 **
7 ** This file is part of the Qt Enterprise Charts Add-on.
7 ** This file is part of the Qt Enterprise Charts Add-on.
8 **
8 **
9 ** $QT_BEGIN_LICENSE$
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Enterprise licenses may use this file in
10 ** Licensees holding valid Qt Enterprise licenses may use this file in
11 ** accordance with the Qt Enterprise License Agreement provided with the
11 ** accordance with the Qt Enterprise License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
13 ** a written agreement between you and Digia.
14 **
14 **
15 ** If you have questions regarding the use of this file, please use
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
17 ** $QT_END_LICENSE$
18 **
18 **
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include <QtTest/QtTest>
21 #include <QtTest/QtTest>
22 #include <qhorizontalpercentbarseries.h>
22 #include <qhorizontalpercentbarseries.h>
23 #include <qbarset.h>
23 #include <qbarset.h>
24 #include <qchartview.h>
24 #include <qchartview.h>
25 #include <qchart.h>
25 #include <qchart.h>
26 #include "tst_definitions.h"
26 #include "tst_definitions.h"
27
27
28 QTCOMMERCIALCHART_USE_NAMESPACE
28 QTCOMMERCIALCHART_USE_NAMESPACE
29
29
30 Q_DECLARE_METATYPE(QBarSet*)
30 Q_DECLARE_METATYPE(QBarSet*)
31 Q_DECLARE_METATYPE(QAbstractBarSeries::LabelsPosition)
31 Q_DECLARE_METATYPE(QAbstractBarSeries::LabelsPosition)
32
32
33 class tst_QHorizontalPercentBarSeries : public QObject
33 class tst_QHorizontalPercentBarSeries : public QObject
34 {
34 {
35 Q_OBJECT
35 Q_OBJECT
36
36
37 public slots:
37 public slots:
38 void initTestCase();
38 void initTestCase();
39 void cleanupTestCase();
39 void cleanupTestCase();
40 void init();
40 void init();
41 void cleanup();
41 void cleanup();
42
42
43 private slots:
43 private slots:
44 void qhorizontalpercentbarseries_data();
44 void qhorizontalpercentbarseries_data();
45 void qhorizontalpercentbarseries();
45 void qhorizontalpercentbarseries();
46 void type_data();
46 void type_data();
47 void type();
47 void type();
48 void setLabelsFormat();
48 void setLabelsFormat();
49 void setLabelsPosition();
49 void setLabelsPosition();
50 void mouseclicked_data();
50 void mouseclicked_data();
51 void mouseclicked();
51 void mouseclicked();
52 void mousehovered_data();
52 void mousehovered_data();
53 void mousehovered();
53 void mousehovered();
54 void zeroValuesInSeries();
54
55
55 private:
56 private:
56 QHorizontalPercentBarSeries* m_barseries;
57 QHorizontalPercentBarSeries* m_barseries;
57 };
58 };
58
59
59 void tst_QHorizontalPercentBarSeries::initTestCase()
60 void tst_QHorizontalPercentBarSeries::initTestCase()
60 {
61 {
61 qRegisterMetaType<QBarSet*>("QBarSet*");
62 qRegisterMetaType<QBarSet*>("QBarSet*");
62 qRegisterMetaType<QAbstractBarSeries::LabelsPosition>("QAbstractBarSeries::LabelsPosition");
63 qRegisterMetaType<QAbstractBarSeries::LabelsPosition>("QAbstractBarSeries::LabelsPosition");
63 }
64 }
64
65
65 void tst_QHorizontalPercentBarSeries::cleanupTestCase()
66 void tst_QHorizontalPercentBarSeries::cleanupTestCase()
66 {
67 {
67 }
68 }
68
69
69 void tst_QHorizontalPercentBarSeries::init()
70 void tst_QHorizontalPercentBarSeries::init()
70 {
71 {
71 m_barseries = new QHorizontalPercentBarSeries();
72 m_barseries = new QHorizontalPercentBarSeries();
72 }
73 }
73
74
74 void tst_QHorizontalPercentBarSeries::cleanup()
75 void tst_QHorizontalPercentBarSeries::cleanup()
75 {
76 {
76 delete m_barseries;
77 delete m_barseries;
77 m_barseries = 0;
78 m_barseries = 0;
78 }
79 }
79
80
80 void tst_QHorizontalPercentBarSeries::qhorizontalpercentbarseries_data()
81 void tst_QHorizontalPercentBarSeries::qhorizontalpercentbarseries_data()
81 {
82 {
82 }
83 }
83
84
84 void tst_QHorizontalPercentBarSeries::qhorizontalpercentbarseries()
85 void tst_QHorizontalPercentBarSeries::qhorizontalpercentbarseries()
85 {
86 {
86 QHorizontalPercentBarSeries *barseries = new QHorizontalPercentBarSeries();
87 QHorizontalPercentBarSeries *barseries = new QHorizontalPercentBarSeries();
87 QVERIFY(barseries != 0);
88 QVERIFY(barseries != 0);
88 }
89 }
89
90
90 void tst_QHorizontalPercentBarSeries::type_data()
91 void tst_QHorizontalPercentBarSeries::type_data()
91 {
92 {
92
93
93 }
94 }
94
95
95 void tst_QHorizontalPercentBarSeries::type()
96 void tst_QHorizontalPercentBarSeries::type()
96 {
97 {
97 QVERIFY(m_barseries->type() == QAbstractSeries::SeriesTypeHorizontalPercentBar);
98 QVERIFY(m_barseries->type() == QAbstractSeries::SeriesTypeHorizontalPercentBar);
98 }
99 }
99
100
100 void tst_QHorizontalPercentBarSeries::setLabelsFormat()
101 void tst_QHorizontalPercentBarSeries::setLabelsFormat()
101 {
102 {
102 QSignalSpy labelsFormatSpy(m_barseries, SIGNAL(labelsFormatChanged(QString)));
103 QSignalSpy labelsFormatSpy(m_barseries, SIGNAL(labelsFormatChanged(QString)));
103 QCOMPARE(m_barseries->labelsFormat(), QString());
104 QCOMPARE(m_barseries->labelsFormat(), QString());
104
105
105 QString format("(@value)");
106 QString format("(@value)");
106 m_barseries->setLabelsFormat(format);
107 m_barseries->setLabelsFormat(format);
107 TRY_COMPARE(labelsFormatSpy.count(), 1);
108 TRY_COMPARE(labelsFormatSpy.count(), 1);
108 QList<QVariant> arguments = labelsFormatSpy.takeFirst();
109 QList<QVariant> arguments = labelsFormatSpy.takeFirst();
109 QVERIFY(arguments.at(0).toString() == format);
110 QVERIFY(arguments.at(0).toString() == format);
110 QCOMPARE(m_barseries->labelsFormat(), format);
111 QCOMPARE(m_barseries->labelsFormat(), format);
111
112
112 m_barseries->setLabelsFormat(QString());
113 m_barseries->setLabelsFormat(QString());
113 TRY_COMPARE(labelsFormatSpy.count(), 1);
114 TRY_COMPARE(labelsFormatSpy.count(), 1);
114 arguments = labelsFormatSpy.takeFirst();
115 arguments = labelsFormatSpy.takeFirst();
115 QVERIFY(arguments.at(0).toString() == QString());
116 QVERIFY(arguments.at(0).toString() == QString());
116 QCOMPARE(m_barseries->labelsFormat(), QString());
117 QCOMPARE(m_barseries->labelsFormat(), QString());
117 }
118 }
118
119
119 void tst_QHorizontalPercentBarSeries::setLabelsPosition()
120 void tst_QHorizontalPercentBarSeries::setLabelsPosition()
120 {
121 {
121 QSignalSpy labelsPositionSpy(m_barseries,
122 QSignalSpy labelsPositionSpy(m_barseries,
122 SIGNAL(labelsPositionChanged(QAbstractBarSeries::LabelsPosition)));
123 SIGNAL(labelsPositionChanged(QAbstractBarSeries::LabelsPosition)));
123 QCOMPARE(m_barseries->labelsPosition(), QHorizontalPercentBarSeries::LabelsCenter);
124 QCOMPARE(m_barseries->labelsPosition(), QHorizontalPercentBarSeries::LabelsCenter);
124
125
125 m_barseries->setLabelsPosition(QHorizontalPercentBarSeries::LabelsInsideEnd);
126 m_barseries->setLabelsPosition(QHorizontalPercentBarSeries::LabelsInsideEnd);
126 TRY_COMPARE(labelsPositionSpy.count(), 1);
127 TRY_COMPARE(labelsPositionSpy.count(), 1);
127 QList<QVariant> arguments = labelsPositionSpy.takeFirst();
128 QList<QVariant> arguments = labelsPositionSpy.takeFirst();
128 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
129 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
129 == QHorizontalPercentBarSeries::LabelsInsideEnd);
130 == QHorizontalPercentBarSeries::LabelsInsideEnd);
130 QCOMPARE(m_barseries->labelsPosition(), QHorizontalPercentBarSeries::LabelsInsideEnd);
131 QCOMPARE(m_barseries->labelsPosition(), QHorizontalPercentBarSeries::LabelsInsideEnd);
131
132
132 m_barseries->setLabelsPosition(QHorizontalPercentBarSeries::LabelsInsideBase);
133 m_barseries->setLabelsPosition(QHorizontalPercentBarSeries::LabelsInsideBase);
133 TRY_COMPARE(labelsPositionSpy.count(), 1);
134 TRY_COMPARE(labelsPositionSpy.count(), 1);
134 arguments = labelsPositionSpy.takeFirst();
135 arguments = labelsPositionSpy.takeFirst();
135 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
136 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
136 == QHorizontalPercentBarSeries::LabelsInsideBase);
137 == QHorizontalPercentBarSeries::LabelsInsideBase);
137 QCOMPARE(m_barseries->labelsPosition(), QHorizontalPercentBarSeries::LabelsInsideBase);
138 QCOMPARE(m_barseries->labelsPosition(), QHorizontalPercentBarSeries::LabelsInsideBase);
138
139
139 m_barseries->setLabelsPosition(QHorizontalPercentBarSeries::LabelsOutsideEnd);
140 m_barseries->setLabelsPosition(QHorizontalPercentBarSeries::LabelsOutsideEnd);
140 TRY_COMPARE(labelsPositionSpy.count(), 1);
141 TRY_COMPARE(labelsPositionSpy.count(), 1);
141 arguments = labelsPositionSpy.takeFirst();
142 arguments = labelsPositionSpy.takeFirst();
142 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
143 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
143 == QHorizontalPercentBarSeries::LabelsOutsideEnd);
144 == QHorizontalPercentBarSeries::LabelsOutsideEnd);
144 QCOMPARE(m_barseries->labelsPosition(), QHorizontalPercentBarSeries::LabelsOutsideEnd);
145 QCOMPARE(m_barseries->labelsPosition(), QHorizontalPercentBarSeries::LabelsOutsideEnd);
145
146
146 m_barseries->setLabelsPosition(QHorizontalPercentBarSeries::LabelsCenter);
147 m_barseries->setLabelsPosition(QHorizontalPercentBarSeries::LabelsCenter);
147 TRY_COMPARE(labelsPositionSpy.count(), 1);
148 TRY_COMPARE(labelsPositionSpy.count(), 1);
148 arguments = labelsPositionSpy.takeFirst();
149 arguments = labelsPositionSpy.takeFirst();
149 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
150 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
150 == QHorizontalPercentBarSeries::LabelsCenter);
151 == QHorizontalPercentBarSeries::LabelsCenter);
151 QCOMPARE(m_barseries->labelsPosition(), QHorizontalPercentBarSeries::LabelsCenter);
152 QCOMPARE(m_barseries->labelsPosition(), QHorizontalPercentBarSeries::LabelsCenter);
152 }
153 }
153
154
154 void tst_QHorizontalPercentBarSeries::mouseclicked_data()
155 void tst_QHorizontalPercentBarSeries::mouseclicked_data()
155 {
156 {
156
157
157 }
158 }
158
159
159 void tst_QHorizontalPercentBarSeries::mouseclicked()
160 void tst_QHorizontalPercentBarSeries::mouseclicked()
160 {
161 {
161 SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
162 SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
162
163
163 QHorizontalPercentBarSeries* series = new QHorizontalPercentBarSeries();
164 QHorizontalPercentBarSeries* series = new QHorizontalPercentBarSeries();
164
165
165 QBarSet* set1 = new QBarSet(QString("set 1"));
166 QBarSet* set1 = new QBarSet(QString("set 1"));
166 *set1 << 10 << 10 << 10;
167 *set1 << 10 << 10 << 10;
167 series->append(set1);
168 series->append(set1);
168
169
169 QBarSet* set2 = new QBarSet(QString("set 2"));
170 QBarSet* set2 = new QBarSet(QString("set 2"));
170 *set2 << 10 << 10 << 10;
171 *set2 << 10 << 10 << 10;
171 series->append(set2);
172 series->append(set2);
172
173
173 QList<QBarSet*> barSets = series->barSets();
174 QList<QBarSet*> barSets = series->barSets();
174
175
175 QSignalSpy seriesSpy(series,SIGNAL(clicked(int,QBarSet*)));
176 QSignalSpy seriesSpy(series,SIGNAL(clicked(int,QBarSet*)));
176
177
177 QChartView view(new QChart());
178 QChartView view(new QChart());
178 view.resize(400,300);
179 view.resize(400,300);
179 view.chart()->addSeries(series);
180 view.chart()->addSeries(series);
180 view.show();
181 view.show();
181 QTest::qWaitForWindowShown(&view);
182 QTest::qWaitForWindowShown(&view);
182
183
183 // Calculate expected layout for bars
184 // Calculate expected layout for bars
184 QRectF plotArea = view.chart()->plotArea();
185 QRectF plotArea = view.chart()->plotArea();
185 qreal width = plotArea.width();
186 qreal width = plotArea.width();
186 qreal height = plotArea.height();
187 qreal height = plotArea.height();
187 qreal rangeY = 3; // 3 values per set
188 qreal rangeY = 3; // 3 values per set
188 qreal rangeX = 100; // From 0 to 100 because of scaling to 100%
189 qreal rangeX = 100; // From 0 to 100 because of scaling to 100%
189 qreal scaleY = (height / rangeY);
190 qreal scaleY = (height / rangeY);
190 qreal scaleX = (width / rangeX);
191 qreal scaleX = (width / rangeX);
191
192
192 qreal setCount = series->count();
193 qreal setCount = series->count();
193 qreal domainMinY = -0.5; // These come from internal domain used by barseries.
194 qreal domainMinY = -0.5; // These come from internal domain used by barseries.
194 qreal domainMinX = 0; // No access to domain from outside, so use hard coded values.
195 qreal domainMinX = 0; // No access to domain from outside, so use hard coded values.
195 qreal rectHeight = scaleY * series->barWidth(); // On horizontal chart barWidth of the barseries means height of the rect.
196 qreal rectHeight = scaleY * series->barWidth(); // On horizontal chart barWidth of the barseries means height of the rect.
196
197
197 QVector<QRectF> layout;
198 QVector<QRectF> layout;
198
199
199 // 3 = count of values in set
200 // 3 = count of values in set
200 // Note that rects in this vector will be interleaved (set1 bar0, set2 bar0, set1 bar1, set2 bar1, etc.)
201 // Note that rects in this vector will be interleaved (set1 bar0, set2 bar0, set1 bar1, set2 bar1, etc.)
201 for (int i = 0; i < 3; i++) {
202 for (int i = 0; i < 3; i++) {
202 qreal colSum = 20; // Sum of values in column (10 + 10 in our test case)
203 qreal colSum = 20; // Sum of values in column (10 + 10 in our test case)
203 qreal percentage = (100 / colSum);
204 qreal percentage = (100 / colSum);
204 qreal xPos = -scaleX * domainMinX + plotArea.left();
205 qreal xPos = -scaleX * domainMinX + plotArea.left();
205 for (int set = 0; set < setCount; set++) {
206 for (int set = 0; set < setCount; set++) {
206 qreal yPos = (domainMinY +0.5 -i) * scaleY + plotArea.bottom() - rectHeight/2;
207 qreal yPos = (domainMinY +0.5 -i) * scaleY + plotArea.bottom() - rectHeight/2;
207 qreal rectWidth = barSets.at(set)->at(i) * percentage * scaleX;
208 qreal rectWidth = barSets.at(set)->at(i) * percentage * scaleX;
208 QRectF rect(xPos, yPos - rectHeight, rectWidth, rectHeight);
209 QRectF rect(xPos, yPos - rectHeight, rectWidth, rectHeight);
209 layout.append(rect);
210 layout.append(rect);
210 xPos += rectWidth;
211 xPos += rectWidth;
211 }
212 }
212 }
213 }
213
214
214 //====================================================================================
215 //====================================================================================
215 // barset 1, bar 0
216 // barset 1, bar 0
216 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(0).center().toPoint());
217 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(0).center().toPoint());
217 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
218 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
218
219
219 QCOMPARE(seriesSpy.count(), 1);
220 QCOMPARE(seriesSpy.count(), 1);
220
221
221 QList<QVariant> seriesSpyArg = seriesSpy.takeFirst();
222 QList<QVariant> seriesSpyArg = seriesSpy.takeFirst();
222 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
223 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
223 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
224 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
224 QVERIFY(seriesSpyArg.at(0).toInt() == 0);
225 QVERIFY(seriesSpyArg.at(0).toInt() == 0);
225
226
226 //====================================================================================
227 //====================================================================================
227 // barset 1, bar 1
228 // barset 1, bar 1
228 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(2).center().toPoint());
229 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(2).center().toPoint());
229 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
230 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
230
231
231 QCOMPARE(seriesSpy.count(), 1);
232 QCOMPARE(seriesSpy.count(), 1);
232
233
233 seriesSpyArg = seriesSpy.takeFirst();
234 seriesSpyArg = seriesSpy.takeFirst();
234 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
235 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
235 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
236 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
236 QVERIFY(seriesSpyArg.at(0).toInt() == 1);
237 QVERIFY(seriesSpyArg.at(0).toInt() == 1);
237
238
238 //====================================================================================
239 //====================================================================================
239 // barset 1, bar 2
240 // barset 1, bar 2
240 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(4).center().toPoint());
241 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(4).center().toPoint());
241 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
242 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
242
243
243 QCOMPARE(seriesSpy.count(), 1);
244 QCOMPARE(seriesSpy.count(), 1);
244
245
245 seriesSpyArg = seriesSpy.takeFirst();
246 seriesSpyArg = seriesSpy.takeFirst();
246 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
247 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
247 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
248 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
248 QVERIFY(seriesSpyArg.at(0).toInt() == 2);
249 QVERIFY(seriesSpyArg.at(0).toInt() == 2);
249
250
250 //====================================================================================
251 //====================================================================================
251 // barset 2, bar 0
252 // barset 2, bar 0
252 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(1).center().toPoint());
253 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(1).center().toPoint());
253 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
254 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
254
255
255 QCOMPARE(seriesSpy.count(), 1);
256 QCOMPARE(seriesSpy.count(), 1);
256
257
257 seriesSpyArg = seriesSpy.takeFirst();
258 seriesSpyArg = seriesSpy.takeFirst();
258 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
259 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
259 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
260 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
260 QVERIFY(seriesSpyArg.at(0).toInt() == 0);
261 QVERIFY(seriesSpyArg.at(0).toInt() == 0);
261
262
262 //====================================================================================
263 //====================================================================================
263 // barset 2, bar 1
264 // barset 2, bar 1
264 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(3).center().toPoint());
265 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(3).center().toPoint());
265 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
266 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
266
267
267 QCOMPARE(seriesSpy.count(), 1);
268 QCOMPARE(seriesSpy.count(), 1);
268
269
269 seriesSpyArg = seriesSpy.takeFirst();
270 seriesSpyArg = seriesSpy.takeFirst();
270 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
271 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
271 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
272 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
272 QVERIFY(seriesSpyArg.at(0).toInt() == 1);
273 QVERIFY(seriesSpyArg.at(0).toInt() == 1);
273
274
274 //====================================================================================
275 //====================================================================================
275 // barset 2, bar 2
276 // barset 2, bar 2
276 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(5).center().toPoint());
277 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(5).center().toPoint());
277 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
278 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
278
279
279 QCOMPARE(seriesSpy.count(), 1);
280 QCOMPARE(seriesSpy.count(), 1);
280
281
281 seriesSpyArg = seriesSpy.takeFirst();
282 seriesSpyArg = seriesSpy.takeFirst();
282 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
283 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
283 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
284 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
284 QVERIFY(seriesSpyArg.at(0).toInt() == 2);
285 QVERIFY(seriesSpyArg.at(0).toInt() == 2);
285 }
286 }
286
287
287 void tst_QHorizontalPercentBarSeries::mousehovered_data()
288 void tst_QHorizontalPercentBarSeries::mousehovered_data()
288 {
289 {
289
290
290 }
291 }
291
292
292 void tst_QHorizontalPercentBarSeries::mousehovered()
293 void tst_QHorizontalPercentBarSeries::mousehovered()
293 {
294 {
294 SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
295 SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
295
296
296 QHorizontalPercentBarSeries* series = new QHorizontalPercentBarSeries();
297 QHorizontalPercentBarSeries* series = new QHorizontalPercentBarSeries();
297
298
298 QBarSet* set1 = new QBarSet(QString("set 1"));
299 QBarSet* set1 = new QBarSet(QString("set 1"));
299 *set1 << 10 << 10 << 10;
300 *set1 << 10 << 10 << 10;
300 series->append(set1);
301 series->append(set1);
301
302
302 QBarSet* set2 = new QBarSet(QString("set 2"));
303 QBarSet* set2 = new QBarSet(QString("set 2"));
303 *set2 << 10 << 10 << 10;
304 *set2 << 10 << 10 << 10;
304 series->append(set2);
305 series->append(set2);
305
306
306 QList<QBarSet*> barSets = series->barSets();
307 QList<QBarSet*> barSets = series->barSets();
307
308
308 QSignalSpy seriesSpy(series,SIGNAL(hovered(bool,QBarSet*)));
309 QSignalSpy seriesSpy(series,SIGNAL(hovered(bool,QBarSet*)));
309 QSignalSpy seriesIndexSpy(series, SIGNAL(hovered(bool, int, QBarSet*)));
310 QSignalSpy seriesIndexSpy(series, SIGNAL(hovered(bool, int, QBarSet*)));
310 QSignalSpy setIndexSpy1(set1, SIGNAL(hovered(bool, int)));
311 QSignalSpy setIndexSpy1(set1, SIGNAL(hovered(bool, int)));
311 QSignalSpy setIndexSpy2(set2, SIGNAL(hovered(bool, int)));
312 QSignalSpy setIndexSpy2(set2, SIGNAL(hovered(bool, int)));
312
313
313 QChartView view(new QChart());
314 QChartView view(new QChart());
314 view.resize(400,300);
315 view.resize(400,300);
315 view.chart()->addSeries(series);
316 view.chart()->addSeries(series);
316 view.show();
317 view.show();
317 QTest::qWaitForWindowShown(&view);
318 QTest::qWaitForWindowShown(&view);
318
319
319 //this is hack since view does not get events otherwise
320 //this is hack since view does not get events otherwise
320 view.setMouseTracking(true);
321 view.setMouseTracking(true);
321
322
322 // Calculate expected layout for bars
323 // Calculate expected layout for bars
323 QRectF plotArea = view.chart()->plotArea();
324 QRectF plotArea = view.chart()->plotArea();
324 qreal width = plotArea.width();
325 qreal width = plotArea.width();
325 qreal height = plotArea.height();
326 qreal height = plotArea.height();
326 qreal rangeY = 3; // 3 values per set
327 qreal rangeY = 3; // 3 values per set
327 qreal rangeX = 100; // From 0 to 100 because of scaling to 100%
328 qreal rangeX = 100; // From 0 to 100 because of scaling to 100%
328 qreal scaleY = (height / rangeY);
329 qreal scaleY = (height / rangeY);
329 qreal scaleX = (width / rangeX);
330 qreal scaleX = (width / rangeX);
330
331
331 qreal setCount = series->count();
332 qreal setCount = series->count();
332 qreal domainMinY = -0.5; // These come from internal domain used by barseries.
333 qreal domainMinY = -0.5; // These come from internal domain used by barseries.
333 qreal domainMinX = 0; // No access to domain from outside, so use hard coded values.
334 qreal domainMinX = 0; // No access to domain from outside, so use hard coded values.
334 qreal rectHeight = scaleY * series->barWidth(); // On horizontal chart barWidth of the barseries means height of the rect.
335 qreal rectHeight = scaleY * series->barWidth(); // On horizontal chart barWidth of the barseries means height of the rect.
335
336
336 QVector<QRectF> layout;
337 QVector<QRectF> layout;
337
338
338 // 3 = count of values in set
339 // 3 = count of values in set
339 // Note that rects in this vector will be interleaved (set1 bar0, set2 bar0, set1 bar1, set2 bar1, etc.)
340 // Note that rects in this vector will be interleaved (set1 bar0, set2 bar0, set1 bar1, set2 bar1, etc.)
340 for (int i = 0; i < 3; i++) {
341 for (int i = 0; i < 3; i++) {
341 qreal colSum = 20; // Sum of values in column (10 + 10 in our test case)
342 qreal colSum = 20; // Sum of values in column (10 + 10 in our test case)
342 qreal percentage = (100 / colSum);
343 qreal percentage = (100 / colSum);
343 qreal xPos = -scaleX * domainMinX + plotArea.left();
344 qreal xPos = -scaleX * domainMinX + plotArea.left();
344 for (int set = 0; set < setCount; set++) {
345 for (int set = 0; set < setCount; set++) {
345 qreal yPos = (domainMinY +0.5 -i) * scaleY + plotArea.bottom() - rectHeight/2;
346 qreal yPos = (domainMinY +0.5 -i) * scaleY + plotArea.bottom() - rectHeight/2;
346 qreal rectWidth = barSets.at(set)->at(i) * percentage * scaleX;
347 qreal rectWidth = barSets.at(set)->at(i) * percentage * scaleX;
347 QRectF rect(xPos, yPos - rectHeight, rectWidth, rectHeight);
348 QRectF rect(xPos, yPos - rectHeight, rectWidth, rectHeight);
348 layout.append(rect);
349 layout.append(rect);
349 xPos += rectWidth;
350 xPos += rectWidth;
350 }
351 }
351 }
352 }
352
353
353 //=======================================================================
354 //=======================================================================
354 // move mouse to left border
355 // move mouse to left border
355 QTest::mouseMove(view.viewport(), QPoint(0, layout.at(4).center().y()));
356 QTest::mouseMove(view.viewport(), QPoint(0, layout.at(4).center().y()));
356 QCoreApplication::processEvents(QEventLoop::AllEvents, 10000);
357 QCoreApplication::processEvents(QEventLoop::AllEvents, 10000);
357 TRY_COMPARE(seriesSpy.count(), 0);
358 TRY_COMPARE(seriesSpy.count(), 0);
358 TRY_COMPARE(seriesIndexSpy.count(), 0);
359 TRY_COMPARE(seriesIndexSpy.count(), 0);
359
360
360 //=======================================================================
361 //=======================================================================
361 // move mouse on top of set1
362 // move mouse on top of set1
362 QTest::mouseMove(view.viewport(), layout.at(4).center().toPoint());
363 QTest::mouseMove(view.viewport(), layout.at(4).center().toPoint());
363 TRY_COMPARE(seriesSpy.count(), 1);
364 TRY_COMPARE(seriesSpy.count(), 1);
364 TRY_COMPARE(seriesIndexSpy.count(), 1);
365 TRY_COMPARE(seriesIndexSpy.count(), 1);
365 TRY_COMPARE(setIndexSpy1.count(), 1);
366 TRY_COMPARE(setIndexSpy1.count(), 1);
366 TRY_COMPARE(setIndexSpy2.count(), 0);
367 TRY_COMPARE(setIndexSpy2.count(), 0);
367
368
368 QList<QVariant> seriesSpyArg = seriesSpy.takeFirst();
369 QList<QVariant> seriesSpyArg = seriesSpy.takeFirst();
369 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
370 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
370 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
371 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
371 QVERIFY(seriesSpyArg.at(0).toBool() == true);
372 QVERIFY(seriesSpyArg.at(0).toBool() == true);
372
373
373 QList<QVariant> seriesIndexSpyArg = seriesIndexSpy.takeFirst();
374 QList<QVariant> seriesIndexSpyArg = seriesIndexSpy.takeFirst();
374 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
375 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
375 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
376 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
376 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
377 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
377
378
378 QList<QVariant> setIndexSpyArg = setIndexSpy1.takeFirst();
379 QList<QVariant> setIndexSpyArg = setIndexSpy1.takeFirst();
379 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
380 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
380 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
381 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
381
382
382 //=======================================================================
383 //=======================================================================
383 // move mouse from top of set1 to top of set2
384 // move mouse from top of set1 to top of set2
384 QTest::mouseMove(view.viewport(), layout.at(5).center().toPoint());
385 QTest::mouseMove(view.viewport(), layout.at(5).center().toPoint());
385 TRY_COMPARE(seriesSpy.count(), 2);
386 TRY_COMPARE(seriesSpy.count(), 2);
386 TRY_COMPARE(seriesIndexSpy.count(), 2);
387 TRY_COMPARE(seriesIndexSpy.count(), 2);
387 TRY_COMPARE(setIndexSpy1.count(), 1);
388 TRY_COMPARE(setIndexSpy1.count(), 1);
388 TRY_COMPARE(setIndexSpy2.count(), 1);
389 TRY_COMPARE(setIndexSpy2.count(), 1);
389
390
390 // should leave set1
391 // should leave set1
391 seriesSpyArg = seriesSpy.takeFirst();
392 seriesSpyArg = seriesSpy.takeFirst();
392 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
393 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
393 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
394 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
394 QVERIFY(seriesSpyArg.at(0).toBool() == false);
395 QVERIFY(seriesSpyArg.at(0).toBool() == false);
395
396
396 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
397 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
397 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
398 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
398 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
399 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
399 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
400 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
400
401
401 setIndexSpyArg = setIndexSpy1.takeFirst();
402 setIndexSpyArg = setIndexSpy1.takeFirst();
402 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
403 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
403 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
404 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
404
405
405 // should enter set2
406 // should enter set2
406 seriesSpyArg = seriesSpy.takeFirst();
407 seriesSpyArg = seriesSpy.takeFirst();
407 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
408 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
408 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
409 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
409 QVERIFY(seriesSpyArg.at(0).toBool() == true);
410 QVERIFY(seriesSpyArg.at(0).toBool() == true);
410
411
411 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
412 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
412 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
413 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
413 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
414 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
414 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
415 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
415
416
416 setIndexSpyArg = setIndexSpy2.takeFirst();
417 setIndexSpyArg = setIndexSpy2.takeFirst();
417 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
418 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
418 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
419 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
419
420
420 //=======================================================================
421 //=======================================================================
421 // move mouse from top of set2 to background
422 // move mouse from top of set2 to background
422 QTest::mouseMove(view.viewport(), QPoint(layout.at(5).center().x(), 0));
423 QTest::mouseMove(view.viewport(), QPoint(layout.at(5).center().x(), 0));
423 TRY_COMPARE(seriesSpy.count(), 1);
424 TRY_COMPARE(seriesSpy.count(), 1);
424 TRY_COMPARE(seriesIndexSpy.count(), 1);
425 TRY_COMPARE(seriesIndexSpy.count(), 1);
425 TRY_COMPARE(setIndexSpy1.count(), 0);
426 TRY_COMPARE(setIndexSpy1.count(), 0);
426 TRY_COMPARE(setIndexSpy2.count(), 1);
427 TRY_COMPARE(setIndexSpy2.count(), 1);
427
428
428 // should leave set2
429 // should leave set2
429 seriesSpyArg = seriesSpy.takeFirst();
430 seriesSpyArg = seriesSpy.takeFirst();
430 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
431 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
431 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
432 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
432 QVERIFY(seriesSpyArg.at(0).toBool() == false);
433 QVERIFY(seriesSpyArg.at(0).toBool() == false);
433
434
434 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
435 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
435 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
436 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
436 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
437 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
437 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
438 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
438
439
439 setIndexSpyArg = setIndexSpy2.takeFirst();
440 setIndexSpyArg = setIndexSpy2.takeFirst();
440 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
441 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
441 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
442 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
442
443
443 //=======================================================================
444 //=======================================================================
444 // move mouse on top of set1, bar0 to check the index (hover into set1)
445 // move mouse on top of set1, bar0 to check the index (hover into set1)
445 QTest::mouseMove(view.viewport(), layout.at(0).center().toPoint());
446 QTest::mouseMove(view.viewport(), layout.at(0).center().toPoint());
446
447
447 TRY_COMPARE(seriesSpy.count(), 1);
448 TRY_COMPARE(seriesSpy.count(), 1);
448 TRY_COMPARE(seriesIndexSpy.count(), 1);
449 TRY_COMPARE(seriesIndexSpy.count(), 1);
449 TRY_COMPARE(setIndexSpy1.count(), 1);
450 TRY_COMPARE(setIndexSpy1.count(), 1);
450 TRY_COMPARE(setIndexSpy2.count(), 0);
451 TRY_COMPARE(setIndexSpy2.count(), 0);
451
452
452 //should enter set1, bar0
453 //should enter set1, bar0
453 seriesSpyArg = seriesSpy.takeFirst();
454 seriesSpyArg = seriesSpy.takeFirst();
454 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
455 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
455 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
456 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
456 QVERIFY(seriesSpyArg.at(0).toBool() == true);
457 QVERIFY(seriesSpyArg.at(0).toBool() == true);
457
458
458 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
459 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
459 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
460 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
460 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
461 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
461 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
462 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
462 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
463 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
463 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
464 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
464
465
465 setIndexSpyArg = setIndexSpy1.takeFirst();
466 setIndexSpyArg = setIndexSpy1.takeFirst();
466 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
467 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
467 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
468 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
468 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
469 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
469 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
470 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
470
471
471 //=======================================================================
472 //=======================================================================
472 // move mouse on top of set2, bar0 to check the index (hover out set1,
473 // move mouse on top of set2, bar0 to check the index (hover out set1,
473 // hover in set2)
474 // hover in set2)
474 QTest::mouseMove(view.viewport(), layout.at(1).center().toPoint());
475 QTest::mouseMove(view.viewport(), layout.at(1).center().toPoint());
475 QCoreApplication::processEvents(QEventLoop::AllEvents, 10000);
476 QCoreApplication::processEvents(QEventLoop::AllEvents, 10000);
476
477
477 TRY_COMPARE(seriesSpy.count(), 2);
478 TRY_COMPARE(seriesSpy.count(), 2);
478 TRY_COMPARE(seriesIndexSpy.count(), 2);
479 TRY_COMPARE(seriesIndexSpy.count(), 2);
479 TRY_COMPARE(setIndexSpy1.count(), 1);
480 TRY_COMPARE(setIndexSpy1.count(), 1);
480 TRY_COMPARE(setIndexSpy2.count(), 1);
481 TRY_COMPARE(setIndexSpy2.count(), 1);
481
482
482 //should leave set1, bar0
483 //should leave set1, bar0
483 seriesSpyArg = seriesSpy.takeFirst();
484 seriesSpyArg = seriesSpy.takeFirst();
484 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
485 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
485 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
486 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
486 QVERIFY(seriesSpyArg.at(0).toBool() == false);
487 QVERIFY(seriesSpyArg.at(0).toBool() == false);
487
488
488 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
489 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
489 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
490 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
490 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
491 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
491 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
492 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
492 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
493 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
493 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
494 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
494
495
495 setIndexSpyArg = setIndexSpy1.takeFirst();
496 setIndexSpyArg = setIndexSpy1.takeFirst();
496 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
497 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
497 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
498 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
498 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
499 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
499 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
500 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
500
501
501 //should enter set2, bar0
502 //should enter set2, bar0
502 seriesSpyArg = seriesSpy.takeFirst();
503 seriesSpyArg = seriesSpy.takeFirst();
503 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
504 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
504 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
505 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
505 QVERIFY(seriesSpyArg.at(0).toBool() == true);
506 QVERIFY(seriesSpyArg.at(0).toBool() == true);
506
507
507 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
508 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
508 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
509 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
509 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
510 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
510 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
511 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
511 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
512 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
512 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
513 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
513
514
514 setIndexSpyArg = setIndexSpy2.takeFirst();
515 setIndexSpyArg = setIndexSpy2.takeFirst();
515 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
516 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
516 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
517 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
517 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
518 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
518 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
519 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
519
520
520 //=======================================================================
521 //=======================================================================
521 // move mouse on top of set1, bar1 to check the index (hover out set2,
522 // move mouse on top of set1, bar1 to check the index (hover out set2,
522 // hover in set1)
523 // hover in set1)
523 QTest::mouseMove(view.viewport(), layout.at(2).center().toPoint());
524 QTest::mouseMove(view.viewport(), layout.at(2).center().toPoint());
524
525
525 TRY_COMPARE(seriesSpy.count(), 2);
526 TRY_COMPARE(seriesSpy.count(), 2);
526 TRY_COMPARE(seriesIndexSpy.count(), 2);
527 TRY_COMPARE(seriesIndexSpy.count(), 2);
527 TRY_COMPARE(setIndexSpy1.count(), 1);
528 TRY_COMPARE(setIndexSpy1.count(), 1);
528 TRY_COMPARE(setIndexSpy2.count(), 1);
529 TRY_COMPARE(setIndexSpy2.count(), 1);
529
530
530 //should leave set2, bar0
531 //should leave set2, bar0
531 seriesSpyArg = seriesSpy.takeFirst();
532 seriesSpyArg = seriesSpy.takeFirst();
532 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
533 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
533 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
534 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
534 QVERIFY(seriesSpyArg.at(0).toBool() == false);
535 QVERIFY(seriesSpyArg.at(0).toBool() == false);
535
536
536 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
537 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
537 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
538 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
538 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
539 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
539 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
540 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
540 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
541 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
541 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
542 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
542
543
543 setIndexSpyArg = setIndexSpy2.takeFirst();
544 setIndexSpyArg = setIndexSpy2.takeFirst();
544 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
545 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
545 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
546 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
546 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
547 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
547 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
548 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
548
549
549 //should enter set1, bar1
550 //should enter set1, bar1
550 seriesSpyArg = seriesSpy.takeFirst();
551 seriesSpyArg = seriesSpy.takeFirst();
551 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
552 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
552 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
553 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
553 QVERIFY(seriesSpyArg.at(0).toBool() == true);
554 QVERIFY(seriesSpyArg.at(0).toBool() == true);
554
555
555 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
556 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
556 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
557 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
557 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
558 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
558 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
559 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
559 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
560 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
560 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
561 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
561
562
562 setIndexSpyArg = setIndexSpy1.takeFirst();
563 setIndexSpyArg = setIndexSpy1.takeFirst();
563 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
564 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
564 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
565 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
565 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
566 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
566 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
567 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
567
568
568 //=======================================================================
569 //=======================================================================
569 // move mouse between set1 and set2 (hover out set1)
570 // move mouse between set1 and set2 (hover out set1)
570 QTest::mouseMove(view.viewport(), QPoint(layout.at(3).left(),
571 QTest::mouseMove(view.viewport(), QPoint(layout.at(3).left(),
571 (layout.at(3).top() + layout.at(4).bottom()) / 2));
572 (layout.at(3).top() + layout.at(4).bottom()) / 2));
572
573
573 TRY_COMPARE(seriesSpy.count(), 1);
574 TRY_COMPARE(seriesSpy.count(), 1);
574 TRY_COMPARE(seriesIndexSpy.count(), 1);
575 TRY_COMPARE(seriesIndexSpy.count(), 1);
575 TRY_COMPARE(setIndexSpy1.count(), 1);
576 TRY_COMPARE(setIndexSpy1.count(), 1);
576 TRY_COMPARE(setIndexSpy2.count(), 0);
577 TRY_COMPARE(setIndexSpy2.count(), 0);
577
578
578 //should leave set1, bar1
579 //should leave set1, bar1
579 seriesSpyArg = seriesSpy.takeFirst();
580 seriesSpyArg = seriesSpy.takeFirst();
580 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
581 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
581 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
582 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
582 QVERIFY(seriesSpyArg.at(0).toBool() == false);
583 QVERIFY(seriesSpyArg.at(0).toBool() == false);
583
584
584 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
585 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
585 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
586 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
586 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
587 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
587 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
588 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
588 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
589 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
589 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
590 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
590
591
591 setIndexSpyArg = setIndexSpy1.takeFirst();
592 setIndexSpyArg = setIndexSpy1.takeFirst();
592 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
593 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
593 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
594 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
594 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
595 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
595 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
596 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
596
597
597 //=======================================================================
598 //=======================================================================
598 // move mouse on top of set2, bar1 to check the index (hover in set2)
599 // move mouse on top of set2, bar1 to check the index (hover in set2)
599 QTest::mouseMove(view.viewport(), layout.at(3).center().toPoint());
600 QTest::mouseMove(view.viewport(), layout.at(3).center().toPoint());
600
601
601 TRY_COMPARE(seriesSpy.count(), 1);
602 TRY_COMPARE(seriesSpy.count(), 1);
602 TRY_COMPARE(seriesIndexSpy.count(), 1);
603 TRY_COMPARE(seriesIndexSpy.count(), 1);
603 TRY_COMPARE(setIndexSpy1.count(), 0);
604 TRY_COMPARE(setIndexSpy1.count(), 0);
604 TRY_COMPARE(setIndexSpy2.count(), 1);
605 TRY_COMPARE(setIndexSpy2.count(), 1);
605
606
606 //should enter set2, bar1
607 //should enter set2, bar1
607 seriesSpyArg = seriesSpy.takeFirst();
608 seriesSpyArg = seriesSpy.takeFirst();
608 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
609 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
609 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
610 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
610 QVERIFY(seriesSpyArg.at(0).toBool() == true);
611 QVERIFY(seriesSpyArg.at(0).toBool() == true);
611
612
612 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
613 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
613 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
614 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
614 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
615 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
615 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
616 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
616 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
617 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
617 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
618 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
618
619
619 setIndexSpyArg = setIndexSpy2.takeFirst();
620 setIndexSpyArg = setIndexSpy2.takeFirst();
620 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
621 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
621 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
622 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
622 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
623 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
623 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
624 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
624
625
625 //=======================================================================
626 //=======================================================================
626 // move mouse between set1 and set2 (hover out set2)
627 // move mouse between set1 and set2 (hover out set2)
627 QTest::mouseMove(view.viewport(), QPoint(layout.at(3).left(),
628 QTest::mouseMove(view.viewport(), QPoint(layout.at(3).left(),
628 (layout.at(3).top() + layout.at(4).bottom()) / 2));
629 (layout.at(3).top() + layout.at(4).bottom()) / 2));
629
630
630 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
631 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
631 TRY_COMPARE(seriesSpy.count(), 1);
632 TRY_COMPARE(seriesSpy.count(), 1);
632 TRY_COMPARE(seriesIndexSpy.count(), 1);
633 TRY_COMPARE(seriesIndexSpy.count(), 1);
633 TRY_COMPARE(setIndexSpy1.count(), 0);
634 TRY_COMPARE(setIndexSpy1.count(), 0);
634 TRY_COMPARE(setIndexSpy2.count(), 1);
635 TRY_COMPARE(setIndexSpy2.count(), 1);
635
636
636 //should leave set1, bar1
637 //should leave set1, bar1
637 seriesSpyArg = seriesSpy.takeFirst();
638 seriesSpyArg = seriesSpy.takeFirst();
638 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
639 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
639 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
640 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
640 QVERIFY(seriesSpyArg.at(0).toBool() == false);
641 QVERIFY(seriesSpyArg.at(0).toBool() == false);
641
642
642 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
643 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
643 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
644 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
644 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
645 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
645 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
646 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
646 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
647 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
647 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
648 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
648
649
649 setIndexSpyArg = setIndexSpy2.takeFirst();
650 setIndexSpyArg = setIndexSpy2.takeFirst();
650 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
651 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
651 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
652 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
652 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
653 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
653 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
654 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
654 }
655 }
655
656
657 void tst_QHorizontalPercentBarSeries::zeroValuesInSeries()
658 {
659 QHorizontalPercentBarSeries *series = new QHorizontalPercentBarSeries();
660 QBarSet *set1 = new QBarSet(QString("set 1"));
661 *set1 << 100 << 0.0 << 10;
662 series->append(set1);
663
664 QBarSet *set2 = new QBarSet(QString("set 2"));
665 *set2 << 0.0 << 0.0 << 70;
666 series->append(set2);
667
668 QChartView view(new QChart());
669 view.chart()->addSeries(series);
670 view.chart()->createDefaultAxes();
671 view.show();
672
673 QTest::qWaitForWindowShown(&view);
674 }
675
656 QTEST_MAIN(tst_QHorizontalPercentBarSeries)
676 QTEST_MAIN(tst_QHorizontalPercentBarSeries)
657
677
658 #include "tst_qhorizontalpercentbarseries.moc"
678 #include "tst_qhorizontalpercentbarseries.moc"
659
679
@@ -1,663 +1,683
1 /****************************************************************************
1 /****************************************************************************
2 **
2 **
3 ** Copyright (C) 2014 Digia Plc
3 ** Copyright (C) 2014 Digia Plc
4 ** All rights reserved.
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
6 **
7 ** This file is part of the Qt Enterprise Charts Add-on.
7 ** This file is part of the Qt Enterprise Charts Add-on.
8 **
8 **
9 ** $QT_BEGIN_LICENSE$
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Enterprise licenses may use this file in
10 ** Licensees holding valid Qt Enterprise licenses may use this file in
11 ** accordance with the Qt Enterprise License Agreement provided with the
11 ** accordance with the Qt Enterprise License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
13 ** a written agreement between you and Digia.
14 **
14 **
15 ** If you have questions regarding the use of this file, please use
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
17 ** $QT_END_LICENSE$
18 **
18 **
19 ****************************************************************************/
19 ****************************************************************************/
20
20
21 #include <QtTest/QtTest>
21 #include <QtTest/QtTest>
22 #include <qpercentbarseries.h>
22 #include <qpercentbarseries.h>
23 #include <qbarset.h>
23 #include <qbarset.h>
24 #include <qchartview.h>
24 #include <qchartview.h>
25 #include <qchart.h>
25 #include <qchart.h>
26 #include "tst_definitions.h"
26 #include "tst_definitions.h"
27
27
28 QTCOMMERCIALCHART_USE_NAMESPACE
28 QTCOMMERCIALCHART_USE_NAMESPACE
29
29
30 Q_DECLARE_METATYPE(QBarSet*)
30 Q_DECLARE_METATYPE(QBarSet*)
31 Q_DECLARE_METATYPE(QAbstractBarSeries::LabelsPosition)
31 Q_DECLARE_METATYPE(QAbstractBarSeries::LabelsPosition)
32
32
33 class tst_QPercentBarSeries : public QObject
33 class tst_QPercentBarSeries : public QObject
34 {
34 {
35 Q_OBJECT
35 Q_OBJECT
36
36
37 public slots:
37 public slots:
38 void initTestCase();
38 void initTestCase();
39 void cleanupTestCase();
39 void cleanupTestCase();
40 void init();
40 void init();
41 void cleanup();
41 void cleanup();
42
42
43 private slots:
43 private slots:
44 void qpercentbarseries_data();
44 void qpercentbarseries_data();
45 void qpercentbarseries();
45 void qpercentbarseries();
46 void type_data();
46 void type_data();
47 void type();
47 void type();
48 void setLabelsFormat();
48 void setLabelsFormat();
49 void setLabelsPosition();
49 void setLabelsPosition();
50 void mouseclicked_data();
50 void mouseclicked_data();
51 void mouseclicked();
51 void mouseclicked();
52 void mousehovered_data();
52 void mousehovered_data();
53 void mousehovered();
53 void mousehovered();
54 void zeroValuesInSeries();
54
55
55 private:
56 private:
56 QPercentBarSeries* m_barseries;
57 QPercentBarSeries* m_barseries;
57 };
58 };
58
59
59 void tst_QPercentBarSeries::initTestCase()
60 void tst_QPercentBarSeries::initTestCase()
60 {
61 {
61 qRegisterMetaType<QBarSet*>("QBarSet*");
62 qRegisterMetaType<QBarSet*>("QBarSet*");
62 qRegisterMetaType<QAbstractBarSeries::LabelsPosition>("QAbstractBarSeries::LabelsPosition");
63 qRegisterMetaType<QAbstractBarSeries::LabelsPosition>("QAbstractBarSeries::LabelsPosition");
63 }
64 }
64
65
65 void tst_QPercentBarSeries::cleanupTestCase()
66 void tst_QPercentBarSeries::cleanupTestCase()
66 {
67 {
67 }
68 }
68
69
69 void tst_QPercentBarSeries::init()
70 void tst_QPercentBarSeries::init()
70 {
71 {
71 m_barseries = new QPercentBarSeries();
72 m_barseries = new QPercentBarSeries();
72 }
73 }
73
74
74 void tst_QPercentBarSeries::cleanup()
75 void tst_QPercentBarSeries::cleanup()
75 {
76 {
76 delete m_barseries;
77 delete m_barseries;
77 m_barseries = 0;
78 m_barseries = 0;
78 }
79 }
79
80
80 void tst_QPercentBarSeries::qpercentbarseries_data()
81 void tst_QPercentBarSeries::qpercentbarseries_data()
81 {
82 {
82 }
83 }
83
84
84 void tst_QPercentBarSeries::qpercentbarseries()
85 void tst_QPercentBarSeries::qpercentbarseries()
85 {
86 {
86 QPercentBarSeries *barseries = new QPercentBarSeries();
87 QPercentBarSeries *barseries = new QPercentBarSeries();
87 QVERIFY(barseries != 0);
88 QVERIFY(barseries != 0);
88 }
89 }
89
90
90 void tst_QPercentBarSeries::type_data()
91 void tst_QPercentBarSeries::type_data()
91 {
92 {
92
93
93 }
94 }
94
95
95 void tst_QPercentBarSeries::type()
96 void tst_QPercentBarSeries::type()
96 {
97 {
97 QVERIFY(m_barseries->type() == QAbstractSeries::SeriesTypePercentBar);
98 QVERIFY(m_barseries->type() == QAbstractSeries::SeriesTypePercentBar);
98 }
99 }
99
100
100 void tst_QPercentBarSeries::mouseclicked_data()
101 void tst_QPercentBarSeries::mouseclicked_data()
101 {
102 {
102
103
103 }
104 }
104
105
105 void tst_QPercentBarSeries::setLabelsFormat()
106 void tst_QPercentBarSeries::setLabelsFormat()
106 {
107 {
107 QSignalSpy labelsFormatSpy(m_barseries, SIGNAL(labelsFormatChanged(QString)));
108 QSignalSpy labelsFormatSpy(m_barseries, SIGNAL(labelsFormatChanged(QString)));
108 QCOMPARE(m_barseries->labelsFormat(), QString());
109 QCOMPARE(m_barseries->labelsFormat(), QString());
109
110
110 QString format("(@value)");
111 QString format("(@value)");
111 m_barseries->setLabelsFormat(format);
112 m_barseries->setLabelsFormat(format);
112 TRY_COMPARE(labelsFormatSpy.count(), 1);
113 TRY_COMPARE(labelsFormatSpy.count(), 1);
113 QList<QVariant> arguments = labelsFormatSpy.takeFirst();
114 QList<QVariant> arguments = labelsFormatSpy.takeFirst();
114 QVERIFY(arguments.at(0).toString() == format);
115 QVERIFY(arguments.at(0).toString() == format);
115 QCOMPARE(m_barseries->labelsFormat(), format);
116 QCOMPARE(m_barseries->labelsFormat(), format);
116
117
117 m_barseries->setLabelsFormat(QString());
118 m_barseries->setLabelsFormat(QString());
118 TRY_COMPARE(labelsFormatSpy.count(), 1);
119 TRY_COMPARE(labelsFormatSpy.count(), 1);
119 arguments = labelsFormatSpy.takeFirst();
120 arguments = labelsFormatSpy.takeFirst();
120 QVERIFY(arguments.at(0).toString() == QString());
121 QVERIFY(arguments.at(0).toString() == QString());
121 QCOMPARE(m_barseries->labelsFormat(), QString());
122 QCOMPARE(m_barseries->labelsFormat(), QString());
122 }
123 }
123
124
124 void tst_QPercentBarSeries::setLabelsPosition()
125 void tst_QPercentBarSeries::setLabelsPosition()
125 {
126 {
126 QSignalSpy labelsPositionSpy(m_barseries,
127 QSignalSpy labelsPositionSpy(m_barseries,
127 SIGNAL(labelsPositionChanged(QAbstractBarSeries::LabelsPosition)));
128 SIGNAL(labelsPositionChanged(QAbstractBarSeries::LabelsPosition)));
128 QCOMPARE(m_barseries->labelsPosition(), QPercentBarSeries::LabelsCenter);
129 QCOMPARE(m_barseries->labelsPosition(), QPercentBarSeries::LabelsCenter);
129
130
130 m_barseries->setLabelsPosition(QPercentBarSeries::LabelsInsideEnd);
131 m_barseries->setLabelsPosition(QPercentBarSeries::LabelsInsideEnd);
131 TRY_COMPARE(labelsPositionSpy.count(), 1);
132 TRY_COMPARE(labelsPositionSpy.count(), 1);
132 QList<QVariant> arguments = labelsPositionSpy.takeFirst();
133 QList<QVariant> arguments = labelsPositionSpy.takeFirst();
133 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
134 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
134 == QPercentBarSeries::LabelsInsideEnd);
135 == QPercentBarSeries::LabelsInsideEnd);
135 QCOMPARE(m_barseries->labelsPosition(), QPercentBarSeries::LabelsInsideEnd);
136 QCOMPARE(m_barseries->labelsPosition(), QPercentBarSeries::LabelsInsideEnd);
136
137
137 m_barseries->setLabelsPosition(QPercentBarSeries::LabelsInsideBase);
138 m_barseries->setLabelsPosition(QPercentBarSeries::LabelsInsideBase);
138 TRY_COMPARE(labelsPositionSpy.count(), 1);
139 TRY_COMPARE(labelsPositionSpy.count(), 1);
139 arguments = labelsPositionSpy.takeFirst();
140 arguments = labelsPositionSpy.takeFirst();
140 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
141 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
141 == QPercentBarSeries::LabelsInsideBase);
142 == QPercentBarSeries::LabelsInsideBase);
142 QCOMPARE(m_barseries->labelsPosition(), QPercentBarSeries::LabelsInsideBase);
143 QCOMPARE(m_barseries->labelsPosition(), QPercentBarSeries::LabelsInsideBase);
143
144
144 m_barseries->setLabelsPosition(QPercentBarSeries::LabelsOutsideEnd);
145 m_barseries->setLabelsPosition(QPercentBarSeries::LabelsOutsideEnd);
145 TRY_COMPARE(labelsPositionSpy.count(), 1);
146 TRY_COMPARE(labelsPositionSpy.count(), 1);
146 arguments = labelsPositionSpy.takeFirst();
147 arguments = labelsPositionSpy.takeFirst();
147 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
148 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
148 == QPercentBarSeries::LabelsOutsideEnd);
149 == QPercentBarSeries::LabelsOutsideEnd);
149 QCOMPARE(m_barseries->labelsPosition(), QPercentBarSeries::LabelsOutsideEnd);
150 QCOMPARE(m_barseries->labelsPosition(), QPercentBarSeries::LabelsOutsideEnd);
150
151
151 m_barseries->setLabelsPosition(QPercentBarSeries::LabelsCenter);
152 m_barseries->setLabelsPosition(QPercentBarSeries::LabelsCenter);
152 TRY_COMPARE(labelsPositionSpy.count(), 1);
153 TRY_COMPARE(labelsPositionSpy.count(), 1);
153 arguments = labelsPositionSpy.takeFirst();
154 arguments = labelsPositionSpy.takeFirst();
154 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
155 QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
155 == QPercentBarSeries::LabelsCenter);
156 == QPercentBarSeries::LabelsCenter);
156 QCOMPARE(m_barseries->labelsPosition(), QPercentBarSeries::LabelsCenter);
157 QCOMPARE(m_barseries->labelsPosition(), QPercentBarSeries::LabelsCenter);
157 }
158 }
158
159
159 void tst_QPercentBarSeries::mouseclicked()
160 void tst_QPercentBarSeries::mouseclicked()
160 {
161 {
161 SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
162 SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
162
163
163 QPercentBarSeries* series = new QPercentBarSeries();
164 QPercentBarSeries* series = new QPercentBarSeries();
164
165
165 QBarSet* set1 = new QBarSet(QString("set 1"));
166 QBarSet* set1 = new QBarSet(QString("set 1"));
166 *set1 << 10 << 10 << 10;
167 *set1 << 10 << 10 << 10;
167 series->append(set1);
168 series->append(set1);
168
169
169 QBarSet* set2 = new QBarSet(QString("set 2"));
170 QBarSet* set2 = new QBarSet(QString("set 2"));
170 *set2 << 10 << 10 << 10;
171 *set2 << 10 << 10 << 10;
171 series->append(set2);
172 series->append(set2);
172
173
173 QList<QBarSet*> barSets = series->barSets();
174 QList<QBarSet*> barSets = series->barSets();
174
175
175 QSignalSpy seriesSpy(series,SIGNAL(clicked(int,QBarSet*)));
176 QSignalSpy seriesSpy(series,SIGNAL(clicked(int,QBarSet*)));
176
177
177 QChartView view(new QChart());
178 QChartView view(new QChart());
178 view.resize(400,300);
179 view.resize(400,300);
179 view.chart()->addSeries(series);
180 view.chart()->addSeries(series);
180 view.show();
181 view.show();
181 QTest::qWaitForWindowShown(&view);
182 QTest::qWaitForWindowShown(&view);
182
183
183 // Calculate expected layout for bars
184 // Calculate expected layout for bars
184 QRectF plotArea = view.chart()->plotArea();
185 QRectF plotArea = view.chart()->plotArea();
185 qreal width = plotArea.width();
186 qreal width = plotArea.width();
186 qreal height = plotArea.height();
187 qreal height = plotArea.height();
187 qreal rangeY = 100; // From 0 to 100 because range is scaled to 100%
188 qreal rangeY = 100; // From 0 to 100 because range is scaled to 100%
188 qreal rangeX = 3; // 3 values per set
189 qreal rangeX = 3; // 3 values per set
189 qreal scaleY = (height / rangeY);
190 qreal scaleY = (height / rangeY);
190 qreal scaleX = (width / rangeX);
191 qreal scaleX = (width / rangeX);
191
192
192 qreal setCount = series->count();
193 qreal setCount = series->count();
193 qreal domainMinY = 0; // These come from internal domain used by barseries.
194 qreal domainMinY = 0; // These come from internal domain used by barseries.
194 qreal domainMinX = -0.5; // No access to domain from outside, so use hard coded values.
195 qreal domainMinX = -0.5; // No access to domain from outside, so use hard coded values.
195 qreal rectWidth = scaleX * series->barWidth();
196 qreal rectWidth = scaleX * series->barWidth();
196
197
197 QVector<QRectF> layout;
198 QVector<QRectF> layout;
198
199
199 // 3 = count of values in set
200 // 3 = count of values in set
200 // Note that rects in this vector will be interleaved (set1 bar0, set2 bar0, set1 bar1, set2 bar1, etc.)
201 // Note that rects in this vector will be interleaved (set1 bar0, set2 bar0, set1 bar1, set2 bar1, etc.)
201 for (int i = 0; i < 3; i++) {
202 for (int i = 0; i < 3; i++) {
202 qreal colSum = 20; // Sum of values in column (10 + 10 in our test case)
203 qreal colSum = 20; // Sum of values in column (10 + 10 in our test case)
203 qreal percentage = (100 / colSum);
204 qreal percentage = (100 / colSum);
204 qreal yPos = height + scaleY * domainMinY + plotArea.top();
205 qreal yPos = height + scaleY * domainMinY + plotArea.top();
205
206
206 for (int set = 0; set < setCount; set++) {
207 for (int set = 0; set < setCount; set++) {
207 qreal xPos = (i - domainMinX) * scaleX + plotArea.left() - rectWidth/2;
208 qreal xPos = (i - domainMinX) * scaleX + plotArea.left() - rectWidth/2;
208 qreal rectHeigth = barSets.at(set)->at(i) * percentage * scaleY;
209 qreal rectHeigth = barSets.at(set)->at(i) * percentage * scaleY;
209
210
210 QRectF rect(xPos, yPos-rectHeigth, rectWidth, rectHeigth);
211 QRectF rect(xPos, yPos-rectHeigth, rectWidth, rectHeigth);
211 layout.append(rect);
212 layout.append(rect);
212 yPos -= rectHeigth;
213 yPos -= rectHeigth;
213 }
214 }
214 }
215 }
215
216
216 //====================================================================================
217 //====================================================================================
217 // barset 1, bar 0
218 // barset 1, bar 0
218 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(0).center().toPoint());
219 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(0).center().toPoint());
219 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
220 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
220
221
221 QCOMPARE(seriesSpy.count(), 1);
222 QCOMPARE(seriesSpy.count(), 1);
222
223
223 QList<QVariant> seriesSpyArg = seriesSpy.takeFirst();
224 QList<QVariant> seriesSpyArg = seriesSpy.takeFirst();
224 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
225 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
225 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
226 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
226 QVERIFY(seriesSpyArg.at(0).toInt() == 0);
227 QVERIFY(seriesSpyArg.at(0).toInt() == 0);
227
228
228 //====================================================================================
229 //====================================================================================
229 // barset 1, bar 1
230 // barset 1, bar 1
230 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(2).center().toPoint());
231 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(2).center().toPoint());
231 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
232 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
232
233
233 QCOMPARE(seriesSpy.count(), 1);
234 QCOMPARE(seriesSpy.count(), 1);
234
235
235 seriesSpyArg = seriesSpy.takeFirst();
236 seriesSpyArg = seriesSpy.takeFirst();
236 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
237 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
237 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
238 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
238 QVERIFY(seriesSpyArg.at(0).toInt() == 1);
239 QVERIFY(seriesSpyArg.at(0).toInt() == 1);
239
240
240 //====================================================================================
241 //====================================================================================
241 // barset 1, bar 2
242 // barset 1, bar 2
242 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(4).center().toPoint());
243 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(4).center().toPoint());
243 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
244 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
244
245
245 QCOMPARE(seriesSpy.count(), 1);
246 QCOMPARE(seriesSpy.count(), 1);
246
247
247 seriesSpyArg = seriesSpy.takeFirst();
248 seriesSpyArg = seriesSpy.takeFirst();
248 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
249 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
249 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
250 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
250 QVERIFY(seriesSpyArg.at(0).toInt() == 2);
251 QVERIFY(seriesSpyArg.at(0).toInt() == 2);
251
252
252 //====================================================================================
253 //====================================================================================
253 // barset 2, bar 0
254 // barset 2, bar 0
254 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(1).center().toPoint());
255 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(1).center().toPoint());
255 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
256 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
256
257
257 QCOMPARE(seriesSpy.count(), 1);
258 QCOMPARE(seriesSpy.count(), 1);
258
259
259 seriesSpyArg = seriesSpy.takeFirst();
260 seriesSpyArg = seriesSpy.takeFirst();
260 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
261 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
261 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
262 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
262 QVERIFY(seriesSpyArg.at(0).toInt() == 0);
263 QVERIFY(seriesSpyArg.at(0).toInt() == 0);
263
264
264 //====================================================================================
265 //====================================================================================
265 // barset 2, bar 1
266 // barset 2, bar 1
266 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(3).center().toPoint());
267 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(3).center().toPoint());
267 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
268 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
268
269
269 QCOMPARE(seriesSpy.count(), 1);
270 QCOMPARE(seriesSpy.count(), 1);
270
271
271 seriesSpyArg = seriesSpy.takeFirst();
272 seriesSpyArg = seriesSpy.takeFirst();
272 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
273 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
273 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
274 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
274 QVERIFY(seriesSpyArg.at(0).toInt() == 1);
275 QVERIFY(seriesSpyArg.at(0).toInt() == 1);
275
276
276 //====================================================================================
277 //====================================================================================
277 // barset 2, bar 2
278 // barset 2, bar 2
278 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(5).center().toPoint());
279 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(5).center().toPoint());
279 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
280 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
280
281
281 QCOMPARE(seriesSpy.count(), 1);
282 QCOMPARE(seriesSpy.count(), 1);
282
283
283 seriesSpyArg = seriesSpy.takeFirst();
284 seriesSpyArg = seriesSpy.takeFirst();
284 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
285 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
285 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
286 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
286 QVERIFY(seriesSpyArg.at(0).toInt() == 2);
287 QVERIFY(seriesSpyArg.at(0).toInt() == 2);
287 }
288 }
288
289
289 void tst_QPercentBarSeries::mousehovered_data()
290 void tst_QPercentBarSeries::mousehovered_data()
290 {
291 {
291
292
292 }
293 }
293
294
294 void tst_QPercentBarSeries::mousehovered()
295 void tst_QPercentBarSeries::mousehovered()
295 {
296 {
296 SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
297 SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
297
298
298 QPercentBarSeries* series = new QPercentBarSeries();
299 QPercentBarSeries* series = new QPercentBarSeries();
299
300
300 QBarSet* set1 = new QBarSet(QString("set 1"));
301 QBarSet* set1 = new QBarSet(QString("set 1"));
301 *set1 << 10 << 10 << 10;
302 *set1 << 10 << 10 << 10;
302 series->append(set1);
303 series->append(set1);
303
304
304 QBarSet* set2 = new QBarSet(QString("set 2"));
305 QBarSet* set2 = new QBarSet(QString("set 2"));
305 *set2 << 10 << 10 << 10;
306 *set2 << 10 << 10 << 10;
306 series->append(set2);
307 series->append(set2);
307
308
308 QList<QBarSet*> barSets = series->barSets();
309 QList<QBarSet*> barSets = series->barSets();
309
310
310 QSignalSpy seriesSpy(series,SIGNAL(hovered(bool,QBarSet*)));
311 QSignalSpy seriesSpy(series,SIGNAL(hovered(bool,QBarSet*)));
311 QSignalSpy seriesIndexSpy(series, SIGNAL(hovered(bool, int, QBarSet*)));
312 QSignalSpy seriesIndexSpy(series, SIGNAL(hovered(bool, int, QBarSet*)));
312 QSignalSpy setIndexSpy1(set1, SIGNAL(hovered(bool, int)));
313 QSignalSpy setIndexSpy1(set1, SIGNAL(hovered(bool, int)));
313 QSignalSpy setIndexSpy2(set2, SIGNAL(hovered(bool, int)));
314 QSignalSpy setIndexSpy2(set2, SIGNAL(hovered(bool, int)));
314
315
315 QChartView view(new QChart());
316 QChartView view(new QChart());
316 view.resize(400,300);
317 view.resize(400,300);
317 view.chart()->addSeries(series);
318 view.chart()->addSeries(series);
318 view.show();
319 view.show();
319 QTest::qWaitForWindowShown(&view);
320 QTest::qWaitForWindowShown(&view);
320
321
321 //this is hack since view does not get events otherwise
322 //this is hack since view does not get events otherwise
322 view.setMouseTracking(true);
323 view.setMouseTracking(true);
323
324
324 // Calculate expected layout for bars
325 // Calculate expected layout for bars
325 QRectF plotArea = view.chart()->plotArea();
326 QRectF plotArea = view.chart()->plotArea();
326 qreal width = plotArea.width();
327 qreal width = plotArea.width();
327 qreal height = plotArea.height();
328 qreal height = plotArea.height();
328 qreal rangeY = 100; // From 0 to 100 because range is scaled to 100%
329 qreal rangeY = 100; // From 0 to 100 because range is scaled to 100%
329 qreal rangeX = 3; // 3 values per set
330 qreal rangeX = 3; // 3 values per set
330 qreal scaleY = (height / rangeY);
331 qreal scaleY = (height / rangeY);
331 qreal scaleX = (width / rangeX);
332 qreal scaleX = (width / rangeX);
332
333
333 qreal setCount = series->count();
334 qreal setCount = series->count();
334 qreal domainMinY = 0; // These come from internal domain used by barseries.
335 qreal domainMinY = 0; // These come from internal domain used by barseries.
335 qreal domainMinX = -0.5; // No access to domain from outside, so use hard coded values.
336 qreal domainMinX = -0.5; // No access to domain from outside, so use hard coded values.
336 qreal rectWidth = scaleX * series->barWidth();
337 qreal rectWidth = scaleX * series->barWidth();
337
338
338 QVector<QRectF> layout;
339 QVector<QRectF> layout;
339
340
340 // 3 = count of values in set
341 // 3 = count of values in set
341 // Note that rects in this vector will be interleaved (set1 bar0, set2 bar0, set1 bar1, set2 bar1, etc.)
342 // Note that rects in this vector will be interleaved (set1 bar0, set2 bar0, set1 bar1, set2 bar1, etc.)
342 for (int i = 0; i < 3; i++) {
343 for (int i = 0; i < 3; i++) {
343 qreal colSum = 20; // Sum of values in column (10 + 10 in our test case)
344 qreal colSum = 20; // Sum of values in column (10 + 10 in our test case)
344 qreal percentage = (100 / colSum);
345 qreal percentage = (100 / colSum);
345 qreal yPos = height + scaleY * domainMinY + plotArea.top();
346 qreal yPos = height + scaleY * domainMinY + plotArea.top();
346
347
347 for (int set = 0; set < setCount; set++) {
348 for (int set = 0; set < setCount; set++) {
348 qreal xPos = (i - domainMinX) * scaleX + plotArea.left() - rectWidth/2;
349 qreal xPos = (i - domainMinX) * scaleX + plotArea.left() - rectWidth/2;
349 qreal rectHeight = barSets.at(set)->at(i) * percentage * scaleY;
350 qreal rectHeight = barSets.at(set)->at(i) * percentage * scaleY;
350
351
351 QRectF rect(xPos, yPos-rectHeight, rectWidth, rectHeight);
352 QRectF rect(xPos, yPos-rectHeight, rectWidth, rectHeight);
352 layout.append(rect);
353 layout.append(rect);
353 yPos -= rectHeight;
354 yPos -= rectHeight;
354 }
355 }
355 }
356 }
356
357
357 //=======================================================================
358 //=======================================================================
358 // move mouse to left border
359 // move mouse to left border
359 QTest::mouseMove(view.viewport(), QPoint(0, layout.at(0).center().y()));
360 QTest::mouseMove(view.viewport(), QPoint(0, layout.at(0).center().y()));
360 QCoreApplication::processEvents(QEventLoop::AllEvents, 10000);
361 QCoreApplication::processEvents(QEventLoop::AllEvents, 10000);
361 TRY_COMPARE(seriesSpy.count(), 0);
362 TRY_COMPARE(seriesSpy.count(), 0);
362 TRY_COMPARE(seriesIndexSpy.count(), 0);
363 TRY_COMPARE(seriesIndexSpy.count(), 0);
363
364
364 //=======================================================================
365 //=======================================================================
365 // move mouse on top of set1
366 // move mouse on top of set1
366 QTest::mouseMove(view.viewport(), layout.at(0).center().toPoint());
367 QTest::mouseMove(view.viewport(), layout.at(0).center().toPoint());
367 TRY_COMPARE(seriesSpy.count(), 1);
368 TRY_COMPARE(seriesSpy.count(), 1);
368 TRY_COMPARE(seriesIndexSpy.count(), 1);
369 TRY_COMPARE(seriesIndexSpy.count(), 1);
369 TRY_COMPARE(setIndexSpy1.count(), 1);
370 TRY_COMPARE(setIndexSpy1.count(), 1);
370 TRY_COMPARE(setIndexSpy2.count(), 0);
371 TRY_COMPARE(setIndexSpy2.count(), 0);
371
372
372 QList<QVariant> seriesSpyArg = seriesSpy.takeFirst();
373 QList<QVariant> seriesSpyArg = seriesSpy.takeFirst();
373 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
374 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
374 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
375 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
375 QVERIFY(seriesSpyArg.at(0).toBool() == true);
376 QVERIFY(seriesSpyArg.at(0).toBool() == true);
376
377
377 QList<QVariant> seriesIndexSpyArg = seriesIndexSpy.takeFirst();
378 QList<QVariant> seriesIndexSpyArg = seriesIndexSpy.takeFirst();
378 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
379 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
379 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
380 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
380 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
381 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
381
382
382 QList<QVariant> setIndexSpyArg = setIndexSpy1.takeFirst();
383 QList<QVariant> setIndexSpyArg = setIndexSpy1.takeFirst();
383 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
384 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
384 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
385 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
385
386
386 //=======================================================================
387 //=======================================================================
387 // move mouse from top of set1 to top of set2
388 // move mouse from top of set1 to top of set2
388 QTest::mouseMove(view.viewport(), layout.at(1).center().toPoint());
389 QTest::mouseMove(view.viewport(), layout.at(1).center().toPoint());
389 TRY_COMPARE(seriesSpy.count(), 2);
390 TRY_COMPARE(seriesSpy.count(), 2);
390 TRY_COMPARE(seriesIndexSpy.count(), 2);
391 TRY_COMPARE(seriesIndexSpy.count(), 2);
391 TRY_COMPARE(setIndexSpy1.count(), 1);
392 TRY_COMPARE(setIndexSpy1.count(), 1);
392 TRY_COMPARE(setIndexSpy2.count(), 1);
393 TRY_COMPARE(setIndexSpy2.count(), 1);
393
394
394 // should leave set1
395 // should leave set1
395 seriesSpyArg = seriesSpy.takeFirst();
396 seriesSpyArg = seriesSpy.takeFirst();
396 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
397 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
397 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
398 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
398 QVERIFY(seriesSpyArg.at(0).toBool() == false);
399 QVERIFY(seriesSpyArg.at(0).toBool() == false);
399
400
400 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
401 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
401 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
402 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
402 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
403 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
403 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
404 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
404
405
405 setIndexSpyArg = setIndexSpy1.takeFirst();
406 setIndexSpyArg = setIndexSpy1.takeFirst();
406 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
407 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
407 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
408 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
408
409
409 // should enter set2
410 // should enter set2
410 seriesSpyArg = seriesSpy.takeFirst();
411 seriesSpyArg = seriesSpy.takeFirst();
411 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
412 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
412 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
413 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
413 QVERIFY(seriesSpyArg.at(0).toBool() == true);
414 QVERIFY(seriesSpyArg.at(0).toBool() == true);
414
415
415 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
416 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
416 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
417 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
417 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
418 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
418 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
419 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
419
420
420 setIndexSpyArg = setIndexSpy2.takeFirst();
421 setIndexSpyArg = setIndexSpy2.takeFirst();
421 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
422 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
422 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
423 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
423
424
424 //=======================================================================
425 //=======================================================================
425 // move mouse from top of set2 to background
426 // move mouse from top of set2 to background
426 QTest::mouseMove(view.viewport(), QPoint(layout.at(1).center().x(), 0));
427 QTest::mouseMove(view.viewport(), QPoint(layout.at(1).center().x(), 0));
427 TRY_COMPARE(seriesSpy.count(), 1);
428 TRY_COMPARE(seriesSpy.count(), 1);
428 TRY_COMPARE(seriesIndexSpy.count(), 1);
429 TRY_COMPARE(seriesIndexSpy.count(), 1);
429 TRY_COMPARE(setIndexSpy1.count(), 0);
430 TRY_COMPARE(setIndexSpy1.count(), 0);
430 TRY_COMPARE(setIndexSpy2.count(), 1);
431 TRY_COMPARE(setIndexSpy2.count(), 1);
431
432
432 // should leave set2
433 // should leave set2
433 seriesSpyArg = seriesSpy.takeFirst();
434 seriesSpyArg = seriesSpy.takeFirst();
434 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
435 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
435 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
436 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
436 QVERIFY(seriesSpyArg.at(0).toBool() == false);
437 QVERIFY(seriesSpyArg.at(0).toBool() == false);
437
438
438 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
439 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
439 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
440 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
440 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
441 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
441 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
442 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
442
443
443 setIndexSpyArg = setIndexSpy2.takeFirst();
444 setIndexSpyArg = setIndexSpy2.takeFirst();
444 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
445 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
445 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
446 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
446
447
447 //=======================================================================
448 //=======================================================================
448 // move mouse on top of set1, bar0 to check the index (hover into set1)
449 // move mouse on top of set1, bar0 to check the index (hover into set1)
449 QTest::mouseMove(view.viewport(), layout.at(0).center().toPoint());
450 QTest::mouseMove(view.viewport(), layout.at(0).center().toPoint());
450
451
451 TRY_COMPARE(seriesSpy.count(), 1);
452 TRY_COMPARE(seriesSpy.count(), 1);
452 TRY_COMPARE(seriesIndexSpy.count(), 1);
453 TRY_COMPARE(seriesIndexSpy.count(), 1);
453 TRY_COMPARE(setIndexSpy1.count(), 1);
454 TRY_COMPARE(setIndexSpy1.count(), 1);
454 TRY_COMPARE(setIndexSpy2.count(), 0);
455 TRY_COMPARE(setIndexSpy2.count(), 0);
455
456
456 //should enter set1, bar0
457 //should enter set1, bar0
457 seriesSpyArg = seriesSpy.takeFirst();
458 seriesSpyArg = seriesSpy.takeFirst();
458 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
459 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
459 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
460 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
460 QVERIFY(seriesSpyArg.at(0).toBool() == true);
461 QVERIFY(seriesSpyArg.at(0).toBool() == true);
461
462
462 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
463 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
463 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
464 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
464 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
465 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
465 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
466 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
466 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
467 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
467 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
468 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
468
469
469 setIndexSpyArg = setIndexSpy1.takeFirst();
470 setIndexSpyArg = setIndexSpy1.takeFirst();
470 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
471 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
471 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
472 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
472 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
473 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
473 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
474 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
474
475
475 //=======================================================================
476 //=======================================================================
476 // move mouse on top of set2, bar0 to check the index (hover out set1,
477 // move mouse on top of set2, bar0 to check the index (hover out set1,
477 // hover in set2)
478 // hover in set2)
478 QTest::mouseMove(view.viewport(), layout.at(1).center().toPoint());
479 QTest::mouseMove(view.viewport(), layout.at(1).center().toPoint());
479
480
480 TRY_COMPARE(seriesSpy.count(), 2);
481 TRY_COMPARE(seriesSpy.count(), 2);
481 TRY_COMPARE(seriesIndexSpy.count(), 2);
482 TRY_COMPARE(seriesIndexSpy.count(), 2);
482 TRY_COMPARE(setIndexSpy1.count(), 1);
483 TRY_COMPARE(setIndexSpy1.count(), 1);
483 TRY_COMPARE(setIndexSpy2.count(), 1);
484 TRY_COMPARE(setIndexSpy2.count(), 1);
484
485
485 //should leave set1, bar0
486 //should leave set1, bar0
486 seriesSpyArg = seriesSpy.takeFirst();
487 seriesSpyArg = seriesSpy.takeFirst();
487 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
488 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
488 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
489 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
489 QVERIFY(seriesSpyArg.at(0).toBool() == false);
490 QVERIFY(seriesSpyArg.at(0).toBool() == false);
490
491
491 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
492 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
492 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
493 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
493 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
494 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
494 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
495 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
495 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
496 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
496 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
497 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
497
498
498 setIndexSpyArg = setIndexSpy1.takeFirst();
499 setIndexSpyArg = setIndexSpy1.takeFirst();
499 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
500 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
500 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
501 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
501 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
502 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
502 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
503 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
503
504
504 //should enter set2, bar0
505 //should enter set2, bar0
505 seriesSpyArg = seriesSpy.takeFirst();
506 seriesSpyArg = seriesSpy.takeFirst();
506 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
507 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
507 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
508 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
508 QVERIFY(seriesSpyArg.at(0).toBool() == true);
509 QVERIFY(seriesSpyArg.at(0).toBool() == true);
509
510
510 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
511 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
511 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
512 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
512 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
513 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
513 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
514 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
514 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
515 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
515 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
516 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
516
517
517 setIndexSpyArg = setIndexSpy2.takeFirst();
518 setIndexSpyArg = setIndexSpy2.takeFirst();
518 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
519 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
519 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
520 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
520 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
521 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
521 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
522 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
522
523
523 //=======================================================================
524 //=======================================================================
524 // move mouse on top of set1, bar1 to check the index (hover out set2,
525 // move mouse on top of set1, bar1 to check the index (hover out set2,
525 // hover in set1)
526 // hover in set1)
526 QTest::mouseMove(view.viewport(), layout.at(2).center().toPoint());
527 QTest::mouseMove(view.viewport(), layout.at(2).center().toPoint());
527
528
528 TRY_COMPARE(seriesSpy.count(), 2);
529 TRY_COMPARE(seriesSpy.count(), 2);
529 TRY_COMPARE(seriesIndexSpy.count(), 2);
530 TRY_COMPARE(seriesIndexSpy.count(), 2);
530 TRY_COMPARE(setIndexSpy1.count(), 1);
531 TRY_COMPARE(setIndexSpy1.count(), 1);
531 TRY_COMPARE(setIndexSpy2.count(), 1);
532 TRY_COMPARE(setIndexSpy2.count(), 1);
532
533
533 //should leave set2, bar0
534 //should leave set2, bar0
534 seriesSpyArg = seriesSpy.takeFirst();
535 seriesSpyArg = seriesSpy.takeFirst();
535 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
536 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
536 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
537 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
537 QVERIFY(seriesSpyArg.at(0).toBool() == false);
538 QVERIFY(seriesSpyArg.at(0).toBool() == false);
538
539
539 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
540 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
540 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
541 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
541 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
542 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
542 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
543 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
543 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
544 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
544 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
545 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
545
546
546 setIndexSpyArg = setIndexSpy2.takeFirst();
547 setIndexSpyArg = setIndexSpy2.takeFirst();
547 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
548 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
548 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
549 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
549 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
550 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
550 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
551 QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
551
552
552 //should enter set1, bar1
553 //should enter set1, bar1
553 seriesSpyArg = seriesSpy.takeFirst();
554 seriesSpyArg = seriesSpy.takeFirst();
554 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
555 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
555 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
556 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
556 QVERIFY(seriesSpyArg.at(0).toBool() == true);
557 QVERIFY(seriesSpyArg.at(0).toBool() == true);
557
558
558 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
559 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
559 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
560 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
560 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
561 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
561 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
562 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
562 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
563 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
563 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
564 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
564
565
565 setIndexSpyArg = setIndexSpy1.takeFirst();
566 setIndexSpyArg = setIndexSpy1.takeFirst();
566 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
567 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
567 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
568 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
568 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
569 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
569 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
570 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
570
571
571 //=======================================================================
572 //=======================================================================
572 // move mouse between set1 and set2 (hover out set1)
573 // move mouse between set1 and set2 (hover out set1)
573 QTest::mouseMove(view.viewport(), QPoint((layout.at(3).right() + layout.at(4).left()) /2,
574 QTest::mouseMove(view.viewport(), QPoint((layout.at(3).right() + layout.at(4).left()) /2,
574 layout.at(2).top()));
575 layout.at(2).top()));
575
576
576 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
577 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
577 TRY_COMPARE(seriesSpy.count(), 1);
578 TRY_COMPARE(seriesSpy.count(), 1);
578 TRY_COMPARE(seriesIndexSpy.count(), 1);
579 TRY_COMPARE(seriesIndexSpy.count(), 1);
579 TRY_COMPARE(setIndexSpy1.count(), 1);
580 TRY_COMPARE(setIndexSpy1.count(), 1);
580 TRY_COMPARE(setIndexSpy2.count(), 0);
581 TRY_COMPARE(setIndexSpy2.count(), 0);
581
582
582 //should leave set1, bar1
583 //should leave set1, bar1
583 seriesSpyArg = seriesSpy.takeFirst();
584 seriesSpyArg = seriesSpy.takeFirst();
584 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
585 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
585 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
586 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
586 QVERIFY(seriesSpyArg.at(0).toBool() == false);
587 QVERIFY(seriesSpyArg.at(0).toBool() == false);
587
588
588 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
589 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
589 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
590 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
590 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
591 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
591 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
592 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
592 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
593 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
593 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
594 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
594
595
595 setIndexSpyArg = setIndexSpy1.takeFirst();
596 setIndexSpyArg = setIndexSpy1.takeFirst();
596 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
597 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
597 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
598 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
598 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
599 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
599 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
600 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
600
601
601 //=======================================================================
602 //=======================================================================
602 // move mouse on top of set2, bar1 to check the index (hover in set2)
603 // move mouse on top of set2, bar1 to check the index (hover in set2)
603 QTest::mouseMove(view.viewport(), layout.at(3).center().toPoint());
604 QTest::mouseMove(view.viewport(), layout.at(3).center().toPoint());
604
605
605 TRY_COMPARE(seriesSpy.count(), 1);
606 TRY_COMPARE(seriesSpy.count(), 1);
606 TRY_COMPARE(seriesIndexSpy.count(), 1);
607 TRY_COMPARE(seriesIndexSpy.count(), 1);
607 TRY_COMPARE(setIndexSpy1.count(), 0);
608 TRY_COMPARE(setIndexSpy1.count(), 0);
608 TRY_COMPARE(setIndexSpy2.count(), 1);
609 TRY_COMPARE(setIndexSpy2.count(), 1);
609
610
610 //should enter set2, bar1
611 //should enter set2, bar1
611 seriesSpyArg = seriesSpy.takeFirst();
612 seriesSpyArg = seriesSpy.takeFirst();
612 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
613 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
613 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
614 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
614 QVERIFY(seriesSpyArg.at(0).toBool() == true);
615 QVERIFY(seriesSpyArg.at(0).toBool() == true);
615
616
616 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
617 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
617 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
618 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
618 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
619 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
619 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
620 QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
620 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
621 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
621 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
622 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
622
623
623 setIndexSpyArg = setIndexSpy2.takeFirst();
624 setIndexSpyArg = setIndexSpy2.takeFirst();
624 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
625 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
625 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
626 QVERIFY(setIndexSpyArg.at(0).toBool() == true);
626 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
627 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
627 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
628 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
628
629
629 //=======================================================================
630 //=======================================================================
630 // move mouse between set1 and set2 (hover out set2)
631 // move mouse between set1 and set2 (hover out set2)
631 QTest::mouseMove(view.viewport(), QPoint((layout.at(3).right() + layout.at(4).left()) /2,
632 QTest::mouseMove(view.viewport(), QPoint((layout.at(3).right() + layout.at(4).left()) /2,
632 layout.at(2).top()));
633 layout.at(2).top()));
633
634
634 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
635 QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
635 TRY_COMPARE(seriesSpy.count(), 1);
636 TRY_COMPARE(seriesSpy.count(), 1);
636 TRY_COMPARE(seriesIndexSpy.count(), 1);
637 TRY_COMPARE(seriesIndexSpy.count(), 1);
637 TRY_COMPARE(setIndexSpy1.count(), 0);
638 TRY_COMPARE(setIndexSpy1.count(), 0);
638 TRY_COMPARE(setIndexSpy2.count(), 1);
639 TRY_COMPARE(setIndexSpy2.count(), 1);
639
640
640 //should leave set1, bar1
641 //should leave set1, bar1
641 seriesSpyArg = seriesSpy.takeFirst();
642 seriesSpyArg = seriesSpy.takeFirst();
642 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
643 QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
643 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
644 QVERIFY(seriesSpyArg.at(0).type() == QVariant::Bool);
644 QVERIFY(seriesSpyArg.at(0).toBool() == false);
645 QVERIFY(seriesSpyArg.at(0).toBool() == false);
645
646
646 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
647 seriesIndexSpyArg = seriesIndexSpy.takeFirst();
647 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
648 QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
648 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
649 QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
649 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
650 QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
650 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
651 QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
651 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
652 QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
652
653
653 setIndexSpyArg = setIndexSpy2.takeFirst();
654 setIndexSpyArg = setIndexSpy2.takeFirst();
654 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
655 QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
655 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
656 QVERIFY(setIndexSpyArg.at(0).toBool() == false);
656 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
657 QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
657 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
658 QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
658 }
659 }
659
660
661 void tst_QPercentBarSeries::zeroValuesInSeries()
662 {
663 QPercentBarSeries *series = new QPercentBarSeries();
664 QBarSet *set1 = new QBarSet(QString("set 1"));
665 *set1 << 100 << 0.0 << 10;
666 series->append(set1);
667
668 QBarSet *set2 = new QBarSet(QString("set 2"));
669 *set2 << 0.0 << 0.0 << 70;
670 series->append(set2);
671
672 QChartView view(new QChart());
673 view.chart()->addSeries(series);
674 view.chart()->createDefaultAxes();
675 view.show();
676
677 QTest::qWaitForWindowShown(&view);
678 }
679
660 QTEST_MAIN(tst_QPercentBarSeries)
680 QTEST_MAIN(tst_QPercentBarSeries)
661
681
662 #include "tst_qpercentbarseries.moc"
682 #include "tst_qpercentbarseries.moc"
663
683
General Comments 0
You need to be logged in to leave comments. Login now