##// END OF EJS Templates
Initial revision of boxplot series handling...
Mika Salmela -
r2461:95a0f898019d
parent child
Show More
@@ -0,0 +1,16
1 INCLUDEPATH += $$PWD
2 DEPENDPATH += $$PWD
3
4 SOURCES += \
5 $$PWD/boxplotchartitem.cpp \
6 $$PWD/qboxplotseries.cpp \
7 $$PWD/boxwhiskers.cpp
8
9 PRIVATE_HEADERS += \
10 $$PWD/boxplotchartitem_p.h \
11 $$PWD/qboxplotseries_p.h \
12 $$PWD/boxwhiskers_p.h \
13 $$PWD/boxwhiskersdata_p.h
14
15 PUBLIC_HEADERS += \
16 $$PWD/qboxplotseries.h
@@ -0,0 +1,196
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 #include "boxplotchartitem_p.h"
22 #include "qboxplotseries_p.h"
23 #include "bar_p.h"
24 #include "qbarset_p.h"
25 #include "qabstractbarseries_p.h"
26 #include "qbarset.h"
27 #include "boxwhiskers_p.h"
28 #include <QPainter>
29
30 QTCOMMERCIALCHART_BEGIN_NAMESPACE
31
32 BoxPlotChartItem::BoxPlotChartItem(QBoxPlotSeries *series, QGraphicsItem* item) :
33 ChartItem(series->d_func(), item),
34 m_series(series),
35 m_animation(0),
36 m_animate(0)
37 {
38 connect(series->d_func(), SIGNAL(restructuredBars()), this, SLOT(handleDataStructureChanged()));
39 connect(series->d_func(), SIGNAL(updatedLayout()), this, SLOT(handleLayoutChanged()));
40 connect(series->d_func(), SIGNAL(updatedBars()), this, SLOT(handleUpdatedBars()));
41 connect(series->d_func(), SIGNAL(updated()), this, SLOT(handleUpdatedBars()));
42 // QBoxPlotSeriesPrivate calls handleDataStructureChanged(), don't do it here
43 setZValue(ChartPresenter::BoxPlotSeriesZValue);
44
45 m_barSets = m_series->barSets();
46 }
47
48 BoxPlotChartItem::~BoxPlotChartItem()
49 {
50 qDebug() << "BoxPlotChartItem::~BoxPlotChartItem() " << m_seriesIndex;
51 }
52
53 void BoxPlotChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
54 {
55 Q_UNUSED(painter);
56 Q_UNUSED(option);
57 Q_UNUSED(widget);
58
59 //painter->setClipRect(QRectF(QPointF(0,0),domain()->size()));
60
61 //qDebug() << "ALERT EMPTY: BoxPlotChartItem::paint";
62 }
63
64 void BoxPlotChartItem::setAnimation(BoxPlotAnimation *animation)
65 {
66 //qDebug() << "BoxPlotChartItem::setAnimation :" << animation;
67
68 m_animation = animation;
69 if (m_animation) {
70 foreach (BoxWhiskers *item, m_boxTable.values()) {
71 m_animation->addBox(item);
72 }
73 handleDomainUpdated();
74 }
75 }
76
77 void BoxPlotChartItem::handleDataStructureChanged()
78 {
79 //qDebug() << "BoxPlotChartItem::handleDataStructureChanged()";
80 int setCount = m_series->count();
81
82 for (int s = 0; s < setCount; s++) {
83 QBarSet *set = m_series->d_func()->barsetAt(s);
84
85 BoxWhiskers *boxWhiskersItem = m_boxTable.value(set);
86 if (boxWhiskersItem == 0) {
87 // Item is not yet created, make a box and add it to hash table
88 boxWhiskersItem = new BoxWhiskers(domain(), this);
89 m_boxTable.insert(set, boxWhiskersItem);
90
91 boxWhiskersItem->setBrush(m_series->brush());
92 boxWhiskersItem->setPen(m_series->pen());
93 }
94 updateBoxGeometry(boxWhiskersItem, s);
95
96 boxWhiskersItem->updateGeometry();
97
98 if (m_animation)
99 m_animation->addBox(boxWhiskersItem);
100 }
101
102 //
103 handleDomainUpdated();
104 }
105
106 void BoxPlotChartItem::handleUpdatedBars()
107 {
108 //qDebug() << "BoxPlotChartItem::handleUpdatedBars()";
109
110 foreach (BoxWhiskers *item, m_boxTable.values()) {
111 item->setBrush(m_series->brush());
112 item->setPen(m_series->pen());
113 }
114 }
115
116 void BoxPlotChartItem::handleDomainUpdated()
117 {
118 //qDebug() << "BoxPlotChartItem::handleDomainUpdated() domain()->size() = " << domain()->size();
119
120 if ((domain()->size().width() <= 0) || (domain()->size().height() <= 0))
121 return;
122
123 // Set my bounding rect to same as domain size
124 m_boundingRect.setRect(0.0, 0.0, domain()->size().width(), domain()->size().height());
125
126 foreach (BoxWhiskers *item, m_boxTable.values()) {
127 // Update the domain size for each BoxWhisker item
128 item->setDomainSize(domain()->size());
129
130 // If the animation is set, start the animation for each BoxWhisker item
131 if (m_animation) {
132 presenter()->startAnimation(m_animation->boxAnimation(item));
133 }
134 }
135 }
136
137 void BoxPlotChartItem::handleLayoutChanged()
138 {
139 //qDebug() << "BoxPlotChartItem::handleLayoutChanged() domain()->size() = " << domain()->size();
140 //foreach (BoxWhiskers *boxWhiskersItem, m_boxes)
141 // boxWhiskersItem->updateGeometry();
142 }
143
144 void BoxPlotChartItem::handleSeriesRemove(QAbstractSeries *series)
145 {
146 qDebug() << "BoxPlotChartItem::handleSeriesRemove " << m_seriesIndex;
147 QBoxPlotSeries *removedSeries = static_cast<QBoxPlotSeries *>(series);
148 if (m_series == removedSeries) {
149 return;
150 }
151
152 m_seriesCount = m_seriesCount - 1;
153
154 handleDataStructureChanged();
155 }
156
157 QRectF BoxPlotChartItem::boundingRect() const
158 {
159 return m_boundingRect;
160 }
161
162 void BoxPlotChartItem::initializeLayout()
163 {
164 qDebug() << "ALERT EMPTY: BoxPlotChartItem::initializeLayout";
165 }
166
167 QVector<QRectF> BoxPlotChartItem::calculateLayout()
168 {
169 return QVector<QRectF>();
170 }
171
172 void BoxPlotChartItem::updateBoxGeometry(BoxWhiskers *box, int index)
173 {
174 QBarSet *set = m_series->d_func()->barsetAt(index);
175 //QBarSet *set = m_barSets.at(index);
176 BoxWhiskersData &data = box->m_data;
177 data.m_lowerExtreme = set->at(0);
178 data.m_lowerQuartile = set->at(1);
179 data.m_median = set->at(2);
180 data.m_upperQuartile = set->at(3);
181 data.m_upperExtreme = set->at(4);
182 data.m_index = index;
183 data.m_boxItems = m_series->count();
184
185 data.m_maxX = domain()->maxX();
186 data.m_minX = domain()->minX();
187 data.m_maxY = domain()->maxY();
188 data.m_minY = domain()->minY();
189
190 data.m_seriesIndex = m_seriesIndex;
191 data.m_seriesCount = m_seriesCount;
192 }
193
194 #include "moc_boxplotchartitem_p.cpp"
195
196 QTCOMMERCIALCHART_END_NAMESPACE
@@ -0,0 +1,87
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 // W A R N I N G
22 // -------------
23 //
24 // This file is not part of the QtCommercial Chart API. It exists purely as an
25 // implementation detail. This header file may change from version to
26 // version without notice, or even be removed.
27 //
28 // We mean it.
29
30
31 #ifndef BOXPLOTCHARTITEM_H
32 #define BOXPLOTCHARTITEM_H
33
34 #include "boxwhiskers_p.h"
35 #include "qboxplotseries.h"
36 #include "chartitem_p.h"
37 #include "boxplotanimation_p.h"
38 #include <QGraphicsItem>
39
40 QTCOMMERCIALCHART_BEGIN_NAMESPACE
41
42 class BoxPlotSeriesPrivate;
43
44 class BoxPlotChartItem : public ChartItem
45 {
46 Q_OBJECT
47 public:
48 BoxPlotChartItem(QBoxPlotSeries *series, QGraphicsItem* item =0);
49 ~BoxPlotChartItem();
50
51 void setAnimation(BoxPlotAnimation *animation);
52
53 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
54 QRectF boundingRect() const;
55
56 public Q_SLOTS:
57 void handleDataStructureChanged();
58 void handleDomainUpdated();
59 void handleLayoutChanged();
60 void handleUpdatedBars();
61 void handleSeriesRemove(QAbstractSeries *series);
62
63 private:
64 virtual QVector<QRectF> calculateLayout();
65 void initializeLayout();
66 void updateBoxGeometry(BoxWhiskers *box, int index);
67
68 protected:
69 friend class QBoxPlotSeriesPrivate;
70 QBoxPlotSeries *m_series; // Not owned.
71 QList<BoxWhiskers *> m_boxes;
72 QHash<QBarSet *, BoxWhiskers *> m_boxTable;
73 QList<QBarSet *> m_barSets;
74 int m_seriesIndex;
75 int m_seriesCount;
76
77 BoxPlotAnimation *m_animation;
78 bool m_animate;
79
80 QRectF m_boundingRect;
81
82 //QList<BoxPlotAnimation *> m_animations;
83 };
84
85 QTCOMMERCIALCHART_END_NAMESPACE
86
87 #endif // BOXPLOTCHARTITEM_H
@@ -0,0 +1,193
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 #include "boxwhiskers_p.h"
22 #include <QPainter>
23 #include <QDebug>
24 #include <QWidget>
25
26 QTCOMMERCIALCHART_BEGIN_NAMESPACE
27
28 BoxWhiskers::BoxWhiskers(AbstractDomain *domain, QGraphicsObject *parent) :
29 QGraphicsObject(parent),
30 m_domain(domain)
31 {
32 }
33
34 BoxWhiskers::~BoxWhiskers()
35 {
36 //qDebug() << "BoxWhiskers::~BoxWhiskers()";
37 }
38
39 void BoxWhiskers::mousePressEvent(QGraphicsSceneMouseEvent *event)
40 {
41 Q_UNUSED(event)
42
43 qDebug() << "BoxWhiskers::mousePressEvent";
44 }
45
46 void BoxWhiskers::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
47 {
48 Q_UNUSED(event)
49
50 qDebug() << "BoxWhiskers::hoverEnterEvent";
51 }
52
53 void BoxWhiskers::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
54 {
55 Q_UNUSED(event)
56
57 qDebug() << "BoxWhiskers::hoverLeaveEvent";
58 }
59
60 void BoxWhiskers::setBrush(const QBrush &brush)
61 {
62 m_brush = brush;
63 }
64
65 void BoxWhiskers::setPen(const QPen &pen)
66 {
67 m_pen = pen;
68 }
69
70 void BoxWhiskers::setLayout(const BoxWhiskersData &data)
71 {
72 m_data = data;
73 // if (m_data.m_index == 1)
74 // qDebug() << "BoxWhiskers::setLayout";
75 updateGeometry();
76 //update(0.0, 0.0, m_data.m_domainSize.width(), m_data.m_domainSize.height());
77 update();
78 }
79
80
81 QSizeF BoxWhiskers::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
82 {
83 //Q_UNUSED(which)
84 Q_UNUSED(constraint)
85
86 qDebug() << "BoxWhiskers::sizeHint, which = " << which;
87
88 return QSizeF();
89 }
90
91 void BoxWhiskers::setGeometry(const QRectF &rect) // TODO: Unused?
92 {
93 Q_UNUSED(rect)
94
95 qDebug() << "BoxWhiskers::setGeometry";
96 }
97
98 void BoxWhiskers::setDomainSize(const QSizeF &size)
99 {
100 m_domainSize = size;
101
102 updateBoundingRect();
103 }
104
105 QRectF BoxWhiskers::boundingRect() const
106 {
107 return m_boundingRect;
108 }
109
110 void BoxWhiskers::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
111 {
112 Q_UNUSED(option)
113 Q_UNUSED(widget)
114 //Q_UNUSED(painter)
115
116 //painter->save();
117 //painter->setClipRect(parentItem()->boundingRect());
118 painter->setPen(m_pen);
119 painter->setBrush(m_brush);
120 qreal spanY = m_data.m_maxY - m_data.m_minY;
121 //painter->setClipRect(parentItem()->boundingRect());
122 painter->scale(m_domainSize.width() / m_data.m_boxItems, m_domainSize.height() / spanY);
123 painter->drawPath(m_boxPath);
124 //painter->restore();
125 }
126
127 void BoxWhiskers::updateGeometry()
128 {
129 prepareGeometryChange();
130
131 QPainterPath path;
132
133 // TODO: Dirty hack
134 if (m_data.m_seriesCount == 0) m_data.m_seriesCount = 1;
135
136 qreal columnWidth = 1.0 / m_data.m_seriesCount;
137 qreal left = 0.25 * columnWidth + columnWidth * m_data.m_seriesIndex;
138 qreal right = 0.75 * columnWidth + columnWidth * m_data.m_seriesIndex;
139 qreal middle = 0.5 * columnWidth + columnWidth * m_data.m_seriesIndex;
140
141 //whisker = 0.35 0.75
142
143 // Upper whisker
144 path.moveTo(left + m_data.m_index, m_data.m_maxY - m_data.m_upperExtreme);
145 path.lineTo(right + m_data.m_index, m_data.m_maxY - m_data.m_upperExtreme);
146 path.moveTo(middle + m_data.m_index, m_data.m_maxY - m_data.m_upperExtreme);
147 path.lineTo(middle + m_data.m_index, m_data.m_maxY - m_data.m_upperQuartile);
148 path.closeSubpath();
149
150 // Middle Box
151 path.addRect(left + m_data.m_index, m_data.m_maxY - m_data.m_upperQuartile,
152 0.5 * columnWidth, m_data.m_upperQuartile - m_data.m_lowerQuartile);
153
154 // Median/mean line
155 path.moveTo(left + m_data.m_index, m_data.m_maxY - m_data.m_median);
156 path.lineTo(right + m_data.m_index, m_data.m_maxY - m_data.m_median);
157
158 // Lower whisker
159 path.moveTo(left + m_data.m_index, m_data.m_maxY - m_data.m_lowerExtreme);
160 path.lineTo(right + m_data.m_index, m_data.m_maxY - m_data.m_lowerExtreme);
161 path.moveTo(middle + m_data.m_index, m_data.m_maxY - m_data.m_lowerExtreme);
162 path.lineTo(middle + m_data.m_index, m_data.m_maxY - m_data.m_lowerQuartile);
163 path.closeSubpath();
164
165 m_boxPath = path;
166
167 updateBoundingRect();
168
169 // qreal scaleY = m_domainSize.height() / (m_data.m_maxY - m_data.m_minY);
170 // qreal scaleX = m_domainSize.width() / m_data.m_boxItems;
171 // QRectF br = path.boundingRect();
172 // m_boundingRect = QRectF( br.x() * scaleX, br.y() * scaleY, br.width() * scaleX, br.height() * scaleY);
173
174 if (m_data.m_index == 5) {
175 //qDebug() << "myValue = " << myValue;
176 //qDebug() << "m_data.m_upperExtreme" << m_data.m_upperExtreme;
177 //qDebug() << "m_boundingRect = " << m_boundingRect;
178 // qDebug() << "x = " << m_boundingRect.x() << ", y = " << m_boundingRect.y() << ", width = "
179 // << m_boundingRect.width() << ", height = " << m_boundingRect.height();
180 }
181 }
182
183 void BoxWhiskers::updateBoundingRect()
184 {
185 qreal scaleY = m_domainSize.height() / (m_data.m_maxY - m_data.m_minY);
186 qreal scaleX = m_domainSize.width() / m_data.m_boxItems;
187 QRectF br = m_boxPath.boundingRect();
188 m_boundingRect = QRectF( br.x() * scaleX, br.y() * scaleY, br.width() * scaleX, br.height() * scaleY);
189 }
190
191 #include "moc_boxwhiskers_p.cpp"
192
193 QTCOMMERCIALCHART_END_NAMESPACE
@@ -0,0 +1,96
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 // W A R N I N G
22 // -------------
23 //
24 // This file is not part of the QtCommercial Chart API. It exists purely as an
25 // implementation detail. This header file may change from version to
26 // version without notice, or even be removed.
27 //
28 // We mean it.
29
30 #ifndef BOXWHISKERS_H
31 #define BOXWHISKERS_H
32
33 #include "boxwhiskersdata_p.h"
34 #include "qchartglobal.h"
35 #include "qbarset.h"
36 #include "abstractdomain_p.h"
37 #include <QGraphicsRectItem>
38 #include <QGraphicsLineItem>
39 #include <QGraphicsLayoutItem>
40 #include <QPainterPath>
41
42 QTCOMMERCIALCHART_BEGIN_NAMESPACE
43
44 class QBarSet;
45
46 class BoxWhiskers : public QGraphicsObject/*, public QGraphicsLayoutItem*/
47 {
48 Q_OBJECT
49 //Q_INTERFACES(QGraphicsLayoutItem)
50 public:
51 BoxWhiskers(AbstractDomain *domain, QGraphicsObject *parent);
52 ~BoxWhiskers();
53
54 void setBrush(const QBrush &brush);
55 void setPen(const QPen &pen);
56 void setLayout(const BoxWhiskersData &data);
57 void setDomainSize(const QSizeF &size);
58
59 void mousePressEvent(QGraphicsSceneMouseEvent *event);
60 void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
61 void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
62
63 QRectF boundingRect() const;
64 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
65
66 // From QGraphicsLayoutItem // TODO tarkista nοΏ½mοΏ½ jollei ole QGraphicsLayoutItem
67 void updateGeometry();
68 protected:
69 QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const;
70 void setGeometry(const QRectF &rect);
71
72 private:
73 void updateBoundingRect();
74
75 Q_SIGNALS:
76 void clicked(int index, QBarSet *barset);
77 void hovered(bool status, QBarSet *barset);
78
79 private:
80 friend class BoxPlotChartItem;
81 friend class BoxPlotAnimation;
82
83 AbstractDomain *m_domain;
84 QPainterPath m_boxPath;
85 QRectF m_boundingRect;
86 bool m_hovering;
87 bool m_validData;
88 QBrush m_brush;
89 QPen m_pen;
90 BoxWhiskersData m_data;
91 QSizeF m_domainSize;
92 };
93
94 QTCOMMERCIALCHART_END_NAMESPACE
95
96 #endif // BOXWHISKERS_H
@@ -0,0 +1,80
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 // W A R N I N G
22 // -------------
23 //
24 // This file is not part of the QtCommercial Chart API. It exists purely as an
25 // implementation detail. This header file may change from version to
26 // version without notice, or even be removed.
27 //
28 // We mean it.
29
30 #ifndef BOXWHISKERSDATA_P_H
31 #define BOXWHISKERSDATA_P_H
32
33 #include "qchartglobal.h"
34 #include <QSizeF>
35
36 QTCOMMERCIALCHART_BEGIN_NAMESPACE
37
38 class BoxWhiskersData
39 {
40 public:
41 BoxWhiskersData() :
42 m_lowerExtreme(0.0),
43 m_lowerQuartile(0.0),
44 m_median(0.0),
45 m_upperQuartile(0.0),
46 m_upperExtreme(0.0),
47 m_index(0),
48 m_boxItems(0),
49 m_maxX(0.0),
50 m_minX(0.0),
51 m_maxY(0.0),
52 m_minY(0.0),
53 m_seriesIndex(0),
54 m_seriesCount(0)
55 {
56 }
57
58 // Box related statistics
59 qreal m_lowerExtreme;
60 qreal m_lowerQuartile;
61 qreal m_median;
62 qreal m_upperQuartile;
63 qreal m_upperExtreme;
64 int m_index;
65 int m_boxItems;
66
67 // Domain boundaries, axis
68 qreal m_maxX;
69 qreal m_minX;
70 qreal m_maxY;
71 qreal m_minY;
72
73 // Serieses related data
74 int m_seriesIndex;
75 int m_seriesCount;
76 };
77
78 QTCOMMERCIALCHART_END_NAMESPACE
79
80 #endif // BOXWHISKERSDATA_P_H
@@ -0,0 +1,280
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 #include "qboxplotseries.h"
22 #include "qboxplotseries_p.h"
23 #include "qboxplotlegendmarker.h"
24 #include "boxplotchartitem_p.h"
25 #include "chartdataset_p.h"
26 #include "charttheme_p.h"
27 #include "qvalueaxis.h"
28 #include "charttheme_p.h"
29 #include "boxplotanimation_p.h"
30 #include "qchart_p.h"
31
32 #include <QDebug>
33
34 QTCOMMERCIALCHART_BEGIN_NAMESPACE
35
36 /*!
37 \class QBoxPlotSeries
38 \brief Series for creating stacked bar chart
39 \mainclass
40
41 QBoxPlotSeries represents a series of data shown as bars. The purpose of this class is to draw bars
42 as stacks, where bars in same category are stacked on top of each other.
43 QBoxPlotSeries groups the data from sets to categories, which are defined by QStringList.
44
45 See the \l {BoxPlotChart Example} {stacked bar chart example} to learn how to create a stacked bar chart.
46 \image examples_boxplotchart.png
47
48 \sa QBarSet, QPercentBarSeries, QAbstractBarSeries
49 */
50
51 /*!
52 \qmlclass BoxPlotSeries QBoxPlotSeries
53 \inherits AbstractBarSeries
54
55 The following QML shows how to create a simple stacked bar chart:
56 \snippet ../demos/qmlchart/qml/qmlchart/View7.qml 1
57 \beginfloatleft
58 \image demos_qmlchart7.png
59 \endfloat
60 \clearfloat
61 */
62
63 /*!
64 Constructs empty QBoxPlotSeries.
65 QBoxPlotSeries is QObject which is a child of a \a parent.
66 */
67 QBoxPlotSeries::QBoxPlotSeries(QObject *parent)
68 : QAbstractBarSeries(*new QBoxPlotSeriesPrivate(this), parent)
69 {
70 }
71
72 /*!
73 Destructor. Removes series from chart.
74 */
75 QBoxPlotSeries::~QBoxPlotSeries()
76 {
77 qDebug() << "QBoxPlotSeries::~QBoxPlotSeries";
78
79 Q_D(QBoxPlotSeries);
80 if (d->m_chart)
81 d->m_chart->removeSeries(this);
82 }
83
84 /*!
85 Returns QChartSeries::SeriesTypeBoxPlot.
86 */
87 QAbstractSeries::SeriesType QBoxPlotSeries::type() const
88 {
89 return QAbstractSeries::SeriesTypeBoxPlot;
90 }
91
92 void QBoxPlotSeries::setBrush(const QBrush &brush)
93 {
94 Q_D(QBoxPlotSeries);
95
96 if (d->m_brush != brush) {
97 d->m_brush = brush;
98 emit d->updated();
99 }
100 }
101
102 QBrush QBoxPlotSeries::brush() const
103 {
104 Q_D(const QBoxPlotSeries);
105
106 return d->m_brush;
107 }
108
109 void QBoxPlotSeries::setPen(const QPen &pen)
110 {
111 Q_D(QBoxPlotSeries);
112
113 if (d->m_pen != pen) {
114 d->m_pen = pen;
115 emit d->updated();
116 }
117 }
118
119 QPen QBoxPlotSeries::pen() const
120 {
121 Q_D(const QBoxPlotSeries);
122
123 return d->m_pen;
124 }
125
126 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
127
128 QBoxPlotSeriesPrivate::QBoxPlotSeriesPrivate(QBoxPlotSeries *q)
129 : QAbstractBarSeriesPrivate(q),
130 m_pen(QPen(Qt::NoPen)),
131 m_brush(QBrush(Qt::NoBrush))
132 {
133 }
134
135 QBoxPlotSeriesPrivate::~QBoxPlotSeriesPrivate()
136 {
137 qDebug() << "QBoxPlotSeriesPrivate::~QBoxPlotSeriesPrivate()";
138 disconnect(this, 0, 0, 0);
139 }
140
141 void QBoxPlotSeriesPrivate::initializeDomain()
142 {
143 qreal minX(domain()->minX());
144 qreal minY(domain()->minY());
145 qreal maxX(domain()->maxX());
146 qreal maxY(domain()->maxY());
147
148 qreal x = categoryCount();
149 minX = qMin(minX, - (qreal)0.5);
150 minY = qMin(minY, bottom());
151 maxX = qMax(maxX, x - (qreal)0.5);
152 //maxY = qMax(maxY, top());
153 maxY = qMax(maxY, max());
154
155 domain()->setRange(minX, maxX, minY, maxY);
156 }
157
158 void QBoxPlotSeriesPrivate::initializeGraphics(QGraphicsItem* parent)
159 {
160 Q_Q(QBoxPlotSeries);
161
162 BoxPlotChartItem *boxPlot = new BoxPlotChartItem(q,parent);
163 m_item.reset(boxPlot);
164 QAbstractSeriesPrivate::initializeGraphics(parent);
165
166 if (m_chart) {
167 connect(m_chart->d_ptr->m_dataset, SIGNAL(seriesAdded(QAbstractSeries*)), this, SLOT(handleSeriesChange(QAbstractSeries*)) );
168 connect(m_chart->d_ptr->m_dataset, SIGNAL(seriesRemoved(QAbstractSeries*)), this, SLOT(handleSeriesRemove(QAbstractSeries*)) );
169
170 QList<QAbstractSeries *> serieses = m_chart->series();
171 boxPlot->m_seriesCount = serieses.count();
172
173 // Tries to find this series from the Chart's list of serieses and deduce the index
174 int index = 0;
175 foreach (QAbstractSeries *s, serieses) {
176 if (q == static_cast<QBoxPlotSeries *>(s)) {
177 boxPlot->m_seriesIndex = index;
178 m_index = index;
179 }
180 index++;
181 }
182 }
183
184 // Make BoxPlotChartItem to instantiate box & whisker items
185 boxPlot->handleDataStructureChanged();
186 }
187
188 void QBoxPlotSeriesPrivate::initializeTheme(int index, ChartTheme* theme, bool forced)
189 {
190 Q_Q(QBoxPlotSeries);
191
192 const QList<QGradient> gradients = theme->seriesGradients();
193
194 if (forced || m_brush == QBrush(Qt::NoBrush)) {
195 QColor brushColor = ChartThemeManager::colorAt(gradients.at(index % gradients.size()), 0.1);
196 q->setBrush(brushColor);
197 }
198
199 if (forced || m_pen == QPen(Qt::NoPen)) {
200 QPen pen;
201 pen.setColor(ChartThemeManager::colorAt(gradients.at(index % gradients.size()), 1.0));
202 pen.setWidthF(1.0);
203 pen.setCosmetic(true);
204 q->setPen(pen);
205 }
206 }
207
208 void QBoxPlotSeriesPrivate::initializeAnimations(QtCommercialChart::QChart::AnimationOptions options)
209 {
210 BoxPlotChartItem *item = static_cast<BoxPlotChartItem *>(m_item.data());
211 Q_ASSERT(item);
212 if (options.testFlag(QChart::SeriesAnimations)) {
213 item->setAnimation(new BoxPlotAnimation(item));
214 }else{
215 item->setAnimation((BoxPlotAnimation *)0);
216 }
217 QAbstractSeriesPrivate::initializeAnimations(options);
218 }
219
220 QList<QLegendMarker*> QBoxPlotSeriesPrivate::createLegendMarkers(QLegend *legend)
221 {
222 Q_Q(QBoxPlotSeries);
223 QList<QLegendMarker*> list;
224 return list << new QBoxPlotLegendMarker(q, legend);
225 }
226
227 void QBoxPlotSeriesPrivate::handleSeriesRemove(QAbstractSeries *series)
228 {
229 qDebug() << "QBoxPlotSeriesPrivate::handleSeriesRemove";
230 Q_Q(QBoxPlotSeries);
231
232 QBoxPlotSeries *removedSeries = static_cast<QBoxPlotSeries *>(series);
233 QObject::disconnect(m_chart->d_ptr->m_dataset, 0, removedSeries->d_func(), 0);
234
235 // Test if series removed is me, then don't do anything
236 if (q != removedSeries) {
237 BoxPlotChartItem *item = static_cast<BoxPlotChartItem *>(m_item.data());
238 if (item) {
239 item->m_seriesCount = item->m_seriesCount - 1;
240 if (removedSeries->d_func()->m_index < m_index) {
241 m_index--;
242 item->m_seriesIndex = m_index;
243 }
244
245 item->handleDataStructureChanged();
246 }
247 }
248 }
249
250 void QBoxPlotSeriesPrivate::handleSeriesChange(QAbstractSeries *series)
251 {
252 Q_UNUSED(series);
253
254 Q_Q(QBoxPlotSeries);
255
256 BoxPlotChartItem *boxPlot = static_cast<BoxPlotChartItem *>(m_item.data());
257
258 if (m_chart) {
259 QList<QAbstractSeries *> serieses = m_chart->series();
260 boxPlot->m_seriesCount = serieses.count();
261
262 // Tries to find this series from the Chart's list of serieses and deduce the index
263 int index = 0;
264 foreach (QAbstractSeries *s, serieses) {
265 if (q == static_cast<QBoxPlotSeries *>(s)) {
266 boxPlot->m_seriesIndex = index;
267 m_index = index;
268 }
269 index++;
270 }
271 }
272
273 boxPlot->handleDataStructureChanged();
274 }
275
276 #include "moc_qboxplotseries.cpp"
277 #include "moc_qboxplotseries_p.cpp"
278
279 QTCOMMERCIALCHART_END_NAMESPACE
280
@@ -0,0 +1,57
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 #ifndef QBOXPLOTSERIES_H
22 #define QBOXPLOTSERIES_H
23
24 #include <qchartglobal.h>
25 #include <qabstractbarseries.h>
26
27 QTCOMMERCIALCHART_BEGIN_NAMESPACE
28
29 class QBoxPlotSeriesPrivate;
30 //class QBarSet;
31
32 class QTCOMMERCIALCHART_EXPORT QBoxPlotSeries : public QAbstractBarSeries
33 {
34 Q_OBJECT
35 public:
36 explicit QBoxPlotSeries(QObject *parent = 0);
37 ~QBoxPlotSeries();
38
39 QAbstractSeries::SeriesType type() const;
40
41 void mika();
42
43 void setBrush(const QBrush &brush);
44 QBrush brush() const;
45 void setPen(const QPen &pen);
46 QPen pen() const;
47
48 private:
49 Q_DECLARE_PRIVATE(QBoxPlotSeries)
50 Q_DISABLE_COPY(QBoxPlotSeries)
51 friend class BoxPlotChartItem;
52 friend class QBoxPlotLegendMarkerPrivate;
53 };
54
55 QTCOMMERCIALCHART_END_NAMESPACE
56
57 #endif // QBOXPLOTSERIES_H
@@ -0,0 +1,73
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc
4 ** All rights reserved.
5 ** For any questions to Digia, please use contact form at http://qt.digia.com
6 **
7 ** This file is part of the Qt Commercial Charts Add-on.
8 **
9 ** $QT_BEGIN_LICENSE$
10 ** Licensees holding valid Qt Commercial licenses may use this file in
11 ** accordance with the Qt Commercial License Agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.
14 **
15 ** If you have questions regarding the use of this file, please use
16 ** contact form at http://qt.digia.com
17 ** $QT_END_LICENSE$
18 **
19 ****************************************************************************/
20
21 // W A R N I N G
22 // -------------
23 //
24 // This file is not part of the QtCommercial Chart API. It exists purely as an
25 // implementation detail. This header file may change from version to
26 // version without notice, or even be removed.
27 //
28 // We mean it.
29
30 #ifndef QBOXPLOTSERIES_P_H
31 #define QBOXPLOTSERIES_P_H
32
33 #include "qboxplotseries.h"
34 #include "qabstractbarseries_p.h"
35 #include "abstractdomain_p.h"
36 #include "qbarset.h"
37
38 QTCOMMERCIALCHART_BEGIN_NAMESPACE
39
40 class QBoxPlotSeriesPrivate : public QAbstractBarSeriesPrivate
41 {
42 Q_OBJECT
43
44 public:
45 QBoxPlotSeriesPrivate(QBoxPlotSeries *q);
46 ~QBoxPlotSeriesPrivate();
47
48 void initializeGraphics(QGraphicsItem* parent);
49 void initializeDomain();
50 void initializeAnimations(QChart::AnimationOptions options);
51 void initializeTheme(int index, ChartTheme* theme, bool forced = false);
52
53 QList<QLegendMarker*> createLegendMarkers(QLegend *legend);
54
55 Q_SIGNALS:
56 void updated();
57
58 private slots:
59 void handleSeriesChange(QAbstractSeries *series);
60 void handleSeriesRemove(QAbstractSeries *series);
61
62 protected:
63 QPen m_pen;
64 QBrush m_brush;
65 int m_index;
66
67 private:
68 Q_DECLARE_PUBLIC(QBoxPlotSeries)
69 };
70
71 QTCOMMERCIALCHART_END_NAMESPACE
72
73 #endif
@@ -1,255 +1,256
1 !include( ../config.pri ):error( "Couldn't find the config.pri file!" )
1 !include( ../config.pri ):error( "Couldn't find the config.pri file!" )
2
2
3 ############################# BUILD CONFIG ######################################
3 ############################# BUILD CONFIG ######################################
4
4
5 TARGET = $$LIBRARY_NAME
5 TARGET = $$LIBRARY_NAME
6 DESTDIR = $$CHART_BUILD_LIB_DIR
6 DESTDIR = $$CHART_BUILD_LIB_DIR
7 TEMPLATE = lib
7 TEMPLATE = lib
8 QT = core gui
8 QT = core gui
9 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
9 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
10 DEFINES += QTCOMMERCIALCHART_LIBRARY
10 DEFINES += QTCOMMERCIALCHART_LIBRARY
11 win32:CONFIG += create_prl
11 win32:CONFIG += create_prl
12 # treat warnings as errors
12 # treat warnings as errors
13 win32-msvc*: {
13 win32-msvc*: {
14 QMAKE_CXXFLAGS += /WX
14 QMAKE_CXXFLAGS += /WX
15 } else {
15 } else {
16 # QMAKE_CXXFLAGS += -Werror
16 # QMAKE_CXXFLAGS += -Werror
17 }
17 }
18
18
19 unix:!qnx {
19 unix:!qnx {
20 QMAKE_CXXFLAGS += -fvisibility=hidden -fvisibility-inlines-hidden
20 QMAKE_CXXFLAGS += -fvisibility=hidden -fvisibility-inlines-hidden
21 }
21 }
22
22
23 ############################# DEPEDENCES ########################################
23 ############################# DEPEDENCES ########################################
24
24
25 win32-msvc*: LIBS += User32.lib
25 win32-msvc*: LIBS += User32.lib
26 LIBS -= -l$$LIBRARY_NAME
26 LIBS -= -l$$LIBRARY_NAME
27 INCLUDEPATH += ../include .
27 INCLUDEPATH += ../include .
28
28
29 ############################# SOURCES ##########################################
29 ############################# SOURCES ##########################################
30
30
31 SOURCES += \
31 SOURCES += \
32 $$PWD/chartdataset.cpp \
32 $$PWD/chartdataset.cpp \
33 $$PWD/chartpresenter.cpp \
33 $$PWD/chartpresenter.cpp \
34 $$PWD/chartthememanager.cpp \
34 $$PWD/chartthememanager.cpp \
35 $$PWD/qchart.cpp \
35 $$PWD/qchart.cpp \
36 $$PWD/qchartview.cpp \
36 $$PWD/qchartview.cpp \
37 $$PWD/qabstractseries.cpp \
37 $$PWD/qabstractseries.cpp \
38 $$PWD/chartbackground.cpp \
38 $$PWD/chartbackground.cpp \
39 $$PWD/chartelement.cpp \
39 $$PWD/chartelement.cpp \
40 $$PWD/chartitem.cpp \
40 $$PWD/chartitem.cpp \
41 $$PWD/scroller.cpp \
41 $$PWD/scroller.cpp \
42 $$PWD/chartlayout.cpp \
42 $$PWD/chartlayout.cpp \
43 $$PWD/charttitle.cpp
43 $$PWD/charttitle.cpp
44 PRIVATE_HEADERS += \
44 PRIVATE_HEADERS += \
45 $$PWD/chartdataset_p.h \
45 $$PWD/chartdataset_p.h \
46 $$PWD/chartitem_p.h \
46 $$PWD/chartitem_p.h \
47 $$PWD/chartpresenter_p.h \
47 $$PWD/chartpresenter_p.h \
48 $$PWD/chartthememanager_p.h \
48 $$PWD/chartthememanager_p.h \
49 $$PWD/chartbackground_p.h \
49 $$PWD/chartbackground_p.h \
50 $$PWD/chartelement_p.h \
50 $$PWD/chartelement_p.h \
51 $$PWD/chartconfig_p.h \
51 $$PWD/chartconfig_p.h \
52 $$PWD/qchart_p.h \
52 $$PWD/qchart_p.h \
53 $$PWD/qchartview_p.h \
53 $$PWD/qchartview_p.h \
54 $$PWD/scroller_p.h \
54 $$PWD/scroller_p.h \
55 $$PWD/qabstractseries_p.h \
55 $$PWD/qabstractseries_p.h \
56 $$PWD/chartlayout_p.h \
56 $$PWD/chartlayout_p.h \
57 $$PWD/charttitle_p.h \
57 $$PWD/charttitle_p.h \
58 $$PWD/charthelpers_p.h
58 $$PWD/charthelpers_p.h
59 PUBLIC_HEADERS += \
59 PUBLIC_HEADERS += \
60 $$PWD/qchart.h \
60 $$PWD/qchart.h \
61 $$PWD/qchartglobal.h \
61 $$PWD/qchartglobal.h \
62 $$PWD/qabstractseries.h \
62 $$PWD/qabstractseries.h \
63 $$PWD/qchartview.h \
63 $$PWD/qchartview.h \
64 $$PWD/chartsnamespace.h
64 $$PWD/chartsnamespace.h
65
65
66 include(animations/animations.pri)
66 include(animations/animations.pri)
67 include(areachart/areachart.pri)
67 include(areachart/areachart.pri)
68 include(axis/axis.pri)
68 include(axis/axis.pri)
69 include(domain/domain.pri)
69 include(domain/domain.pri)
70 include(barchart/barchart.pri)
70 include(barchart/barchart.pri)
71 include(legend/legend.pri)
71 include(legend/legend.pri)
72 include(linechart/linechart.pri)
72 include(linechart/linechart.pri)
73 include(piechart/piechart.pri)
73 include(piechart/piechart.pri)
74 include(scatterchart/scatter.pri)
74 include(scatterchart/scatter.pri)
75 include(splinechart/splinechart.pri)
75 include(splinechart/splinechart.pri)
76 include(themes/themes.pri)
76 include(themes/themes.pri)
77 include(xychart/xychart.pri)
77 include(xychart/xychart.pri)
78 include(boxplotchart/boxplotchart.pri)
78
79
79 HEADERS += $$PUBLIC_HEADERS
80 HEADERS += $$PUBLIC_HEADERS
80 HEADERS += $$PRIVATE_HEADERS
81 HEADERS += $$PRIVATE_HEADERS
81 HEADERS += $$THEMES
82 HEADERS += $$THEMES
82
83
83 ############################# BUILD PATH ##########################################
84 ############################# BUILD PATH ##########################################
84
85
85 OBJECTS_DIR = $$CHART_BUILD_DIR/lib
86 OBJECTS_DIR = $$CHART_BUILD_DIR/lib
86 MOC_DIR = $$CHART_BUILD_DIR/lib
87 MOC_DIR = $$CHART_BUILD_DIR/lib
87 UI_DIR = $$CHART_BUILD_DIR/lib
88 UI_DIR = $$CHART_BUILD_DIR/lib
88 RCC_DIR = $$CHART_BUILD_DIR/lib
89 RCC_DIR = $$CHART_BUILD_DIR/lib
89
90
90 ############################# PUBLIC HEADERS GENERATOR ##########################################
91 ############################# PUBLIC HEADERS GENERATOR ##########################################
91
92
92 !exists($$CHART_BUILD_PUBLIC_HEADER_DIR/QChartGlobal)
93 !exists($$CHART_BUILD_PUBLIC_HEADER_DIR/QChartGlobal)
93 {
94 {
94 system($$QMAKE_MKDIR $$CHART_BUILD_PUBLIC_HEADER_DIR)
95 system($$QMAKE_MKDIR $$CHART_BUILD_PUBLIC_HEADER_DIR)
95 contains(QMAKE_HOST.os, Windows) {
96 contains(QMAKE_HOST.os, Windows) {
96 command = "echo $${LITERAL_HASH}include \"qchartglobal.h\" > $$CHART_BUILD_PUBLIC_HEADER_DIR/QChartGlobal"
97 command = "echo $${LITERAL_HASH}include \"qchartglobal.h\" > $$CHART_BUILD_PUBLIC_HEADER_DIR/QChartGlobal"
97 }else{
98 }else{
98 command = "echo \"$${LITERAL_HASH}include \\\"qchartglobal.h\\\"\" > $$CHART_BUILD_PUBLIC_HEADER_DIR/QChartGlobal"
99 command = "echo \"$${LITERAL_HASH}include \\\"qchartglobal.h\\\"\" > $$CHART_BUILD_PUBLIC_HEADER_DIR/QChartGlobal"
99 }
100 }
100 PUBLIC_QT_HEADERS += $$CHART_BUILD_PUBLIC_HEADER_DIR/QChartGlobal
101 PUBLIC_QT_HEADERS += $$CHART_BUILD_PUBLIC_HEADER_DIR/QChartGlobal
101 system($$command)
102 system($$command)
102 }
103 }
103
104
104 for(file, PUBLIC_HEADERS) {
105 for(file, PUBLIC_HEADERS) {
105 name = $$split(file,'/')
106 name = $$split(file,'/')
106 name = $$last(name)
107 name = $$last(name)
107 class = "$$cat($$file)"
108 class = "$$cat($$file)"
108 class = $$find(class,class)
109 class = $$find(class,class)
109 !isEmpty(class){
110 !isEmpty(class){
110 class = $$split(class,QTCOMMERCIALCHART_EXPORT)
111 class = $$split(class,QTCOMMERCIALCHART_EXPORT)
111 class = $$member(class,1)
112 class = $$member(class,1)
112 class = $$split(class,' ')
113 class = $$split(class,' ')
113 class = $$replace(class,' ','')
114 class = $$replace(class,' ','')
114 class = $$member(class,0)
115 class = $$member(class,0)
115 contains(QMAKE_HOST.os, Windows) {
116 contains(QMAKE_HOST.os, Windows) {
116 command = "echo $${LITERAL_HASH}include \"$$name\" > $$CHART_BUILD_PUBLIC_HEADER_DIR/$$class"
117 command = "echo $${LITERAL_HASH}include \"$$name\" > $$CHART_BUILD_PUBLIC_HEADER_DIR/$$class"
117 }else{
118 }else{
118 command = "echo \"$${LITERAL_HASH}include \\\"$$name\\\"\" > $$CHART_BUILD_PUBLIC_HEADER_DIR/$$class"
119 command = "echo \"$${LITERAL_HASH}include \\\"$$name\\\"\" > $$CHART_BUILD_PUBLIC_HEADER_DIR/$$class"
119 }
120 }
120 PUBLIC_QT_HEADERS += $$CHART_BUILD_PUBLIC_HEADER_DIR/$$class
121 PUBLIC_QT_HEADERS += $$CHART_BUILD_PUBLIC_HEADER_DIR/$$class
121 system($$command)
122 system($$command)
122 }
123 }
123 }
124 }
124
125
125 ############################# INSTALLERS ##########################################
126 ############################# INSTALLERS ##########################################
126
127
127 public_headers.path = $$[QT_INSTALL_HEADERS]/QtCommercialChart
128 public_headers.path = $$[QT_INSTALL_HEADERS]/QtCommercialChart
128 public_headers.files = $$PUBLIC_HEADERS $$PUBLIC_QT_HEADERS
129 public_headers.files = $$PUBLIC_HEADERS $$PUBLIC_QT_HEADERS
129 INSTALLS += public_headers
130 INSTALLS += public_headers
130
131
131 install_build_public_headers.name = build_public_headers
132 install_build_public_headers.name = build_public_headers
132 install_build_public_headers.output = $$CHART_BUILD_PUBLIC_HEADER_DIR/${QMAKE_FILE_BASE}.h
133 install_build_public_headers.output = $$CHART_BUILD_PUBLIC_HEADER_DIR/${QMAKE_FILE_BASE}.h
133 install_build_public_headers.input = PUBLIC_HEADERS
134 install_build_public_headers.input = PUBLIC_HEADERS
134 install_build_public_headers.commands = $$QMAKE_COPY \
135 install_build_public_headers.commands = $$QMAKE_COPY \
135 ${QMAKE_FILE_NAME} \
136 ${QMAKE_FILE_NAME} \
136 $$CHART_BUILD_PUBLIC_HEADER_DIR
137 $$CHART_BUILD_PUBLIC_HEADER_DIR
137 install_build_public_headers.CONFIG += target_predeps \
138 install_build_public_headers.CONFIG += target_predeps \
138 no_link
139 no_link
139
140
140 install_build_private_headers.name = build_private_headers
141 install_build_private_headers.name = build_private_headers
141 install_build_private_headers.output = $$CHART_BUILD_PRIVATE_HEADER_DIR/${QMAKE_FILE_BASE}.h
142 install_build_private_headers.output = $$CHART_BUILD_PRIVATE_HEADER_DIR/${QMAKE_FILE_BASE}.h
142 install_build_private_headers.input = PRIVATE_HEADERS
143 install_build_private_headers.input = PRIVATE_HEADERS
143 install_build_private_headers.commands = $$QMAKE_COPY \
144 install_build_private_headers.commands = $$QMAKE_COPY \
144 ${QMAKE_FILE_NAME} \
145 ${QMAKE_FILE_NAME} \
145 $$CHART_BUILD_PRIVATE_HEADER_DIR
146 $$CHART_BUILD_PRIVATE_HEADER_DIR
146 install_build_private_headers.CONFIG += target_predeps \
147 install_build_private_headers.CONFIG += target_predeps \
147 no_link
148 no_link
148
149
149 QMAKE_EXTRA_COMPILERS += install_build_public_headers \
150 QMAKE_EXTRA_COMPILERS += install_build_public_headers \
150 install_build_private_headers \
151 install_build_private_headers \
151
152
152 win32:{
153 win32:{
153 bintarget.CONFIG += no_check_exist
154 bintarget.CONFIG += no_check_exist
154 !staticlib: {
155 !staticlib: {
155 bintarget.files += $$CHART_BUILD_LIB_DIR\\$${TARGET}.dll
156 bintarget.files += $$CHART_BUILD_LIB_DIR\\$${TARGET}.dll
156 }
157 }
157 win32-msvc*:CONFIG(debug, debug|release): {
158 win32-msvc*:CONFIG(debug, debug|release): {
158 bintarget.files += $$CHART_BUILD_LIB_DIR\\$${TARGET}.pdb
159 bintarget.files += $$CHART_BUILD_LIB_DIR\\$${TARGET}.pdb
159 }
160 }
160 bintarget.path = $$[QT_INSTALL_BINS]
161 bintarget.path = $$[QT_INSTALL_BINS]
161
162
162 libtarget.CONFIG += no_check_exist
163 libtarget.CONFIG += no_check_exist
163 libtarget.files = $$CHART_BUILD_LIB_DIR\\$${TARGET}.prl
164 libtarget.files = $$CHART_BUILD_LIB_DIR\\$${TARGET}.prl
164 win32-msvc*: {
165 win32-msvc*: {
165 libtarget.files += $$CHART_BUILD_LIB_DIR\\$${TARGET}.lib
166 libtarget.files += $$CHART_BUILD_LIB_DIR\\$${TARGET}.lib
166 } else {
167 } else {
167 libtarget.files += $$CHART_BUILD_LIB_DIR\\lib$${TARGET}.a
168 libtarget.files += $$CHART_BUILD_LIB_DIR\\lib$${TARGET}.a
168 }
169 }
169 libtarget.path = $$[QT_INSTALL_LIBS]
170 libtarget.path = $$[QT_INSTALL_LIBS]
170
171
171 DLLDESTDIR = $$CHART_BUILD_BIN_DIR
172 DLLDESTDIR = $$CHART_BUILD_BIN_DIR
172 INSTALLS += bintarget libtarget
173 INSTALLS += bintarget libtarget
173 }else{
174 }else{
174 target.path=$$[QT_INSTALL_LIBS]
175 target.path=$$[QT_INSTALL_LIBS]
175 INSTALLS += target
176 INSTALLS += target
176 }
177 }
177
178
178 mac: !staticlib: {
179 mac: !staticlib: {
179 # Update the name (id) of the library on OSX to point to the lib path
180 # Update the name (id) of the library on OSX to point to the lib path
180 MAC_CHARTS_LIB_NAME = "lib"$$LIBRARY_NAME".1.dylib"
181 MAC_CHARTS_LIB_NAME = "lib"$$LIBRARY_NAME".1.dylib"
181 QMAKE_POST_LINK += "install_name_tool -id $$CHART_BUILD_LIB_DIR"/"$$MAC_CHARTS_LIB_NAME $$CHART_BUILD_LIB_DIR"/"$$MAC_CHARTS_LIB_NAME"
182 QMAKE_POST_LINK += "install_name_tool -id $$CHART_BUILD_LIB_DIR"/"$$MAC_CHARTS_LIB_NAME $$CHART_BUILD_LIB_DIR"/"$$MAC_CHARTS_LIB_NAME"
182
183
183 # Update the name (id) of the installed library on OSX to point to the installation path
184 # Update the name (id) of the installed library on OSX to point to the installation path
184 postinstall.path = $$[QT_INSTALL_LIBS]
185 postinstall.path = $$[QT_INSTALL_LIBS]
185 postinstall.extra = "install_name_tool -id $$[QT_INSTALL_LIBS]"/"$$MAC_CHARTS_LIB_NAME $$[QT_INSTALL_LIBS]"/"$$MAC_CHARTS_LIB_NAME"
186 postinstall.extra = "install_name_tool -id $$[QT_INSTALL_LIBS]"/"$$MAC_CHARTS_LIB_NAME $$[QT_INSTALL_LIBS]"/"$$MAC_CHARTS_LIB_NAME"
186 INSTALLS += postinstall
187 INSTALLS += postinstall
187 }
188 }
188
189
189 ################################ DEVELOPMENT BUILD ##########################################
190 ################################ DEVELOPMENT BUILD ##########################################
190 # There is a problem with jom.exe currently. It does not seem to understand QMAKE_EXTRA_TARGETS properly.
191 # There is a problem with jom.exe currently. It does not seem to understand QMAKE_EXTRA_TARGETS properly.
191 # This is the case at least with shadow builds.
192 # This is the case at least with shadow builds.
192 # http://qt-project.org/wiki/jom
193 # http://qt-project.org/wiki/jom
193
194
194 development_build:!win32-msvc*:{
195 development_build:!win32-msvc*:{
195 chartversion.target = $$PWD/qchartversion_p.h
196 chartversion.target = $$PWD/qchartversion_p.h
196
197
197 unix:{
198 unix:{
198 chartversion.commands = @echo \
199 chartversion.commands = @echo \
199 \" $${LITERAL_HASH}ifndef QCHARTVERSION_P_H\\n\
200 \" $${LITERAL_HASH}ifndef QCHARTVERSION_P_H\\n\
200 $${LITERAL_HASH}define QCHARTVERSION_P_H\\n\
201 $${LITERAL_HASH}define QCHARTVERSION_P_H\\n\
201 const char *buildTime = \\\"`date +'%y%m%d%H%M'`\\\" ; \\n\
202 const char *buildTime = \\\"`date +'%y%m%d%H%M'`\\\" ; \\n\
202 const char *gitHead = \\\"`git rev-parse HEAD`\\\" ; \\n \
203 const char *gitHead = \\\"`git rev-parse HEAD`\\\" ; \\n \
203 $${LITERAL_HASH}endif \" \
204 $${LITERAL_HASH}endif \" \
204 > \
205 > \
205 $$chartversion.target;
206 $$chartversion.target;
206 }else{
207 }else{
207 chartversion.commands = @echo \
208 chartversion.commands = @echo \
208 "const char *buildTime = \"%date%_%time%\" ; \
209 "const char *buildTime = \"%date%_%time%\" ; \
209 const char *gitHead = \"unknown\" ; " \
210 const char *gitHead = \"unknown\" ; " \
210 > \
211 > \
211 $$chartversion.target
212 $$chartversion.target
212 }
213 }
213
214
214 chartversion.depends = $$HEADERS \
215 chartversion.depends = $$HEADERS \
215 $$SOURCES
216 $$SOURCES
216
217
217 PRE_TARGETDEPS += $$chartversion.target
218 PRE_TARGETDEPS += $$chartversion.target
218 QMAKE_CLEAN += $$PWD/qchartversion_p.h
219 QMAKE_CLEAN += $$PWD/qchartversion_p.h
219 QMAKE_EXTRA_TARGETS += chartversion
220 QMAKE_EXTRA_TARGETS += chartversion
220 }
221 }
221
222
222 ############################### CLEAN ###########################################
223 ############################### CLEAN ###########################################
223
224
224 unix:QMAKE_DISTCLEAN += -r \
225 unix:QMAKE_DISTCLEAN += -r \
225 $$CHART_BUILD_HEADER_DIR \
226 $$CHART_BUILD_HEADER_DIR \
226 $$CHART_BUILD_LIB_DIR
227 $$CHART_BUILD_LIB_DIR
227 win32:QMAKE_DISTCLEAN += /Q \
228 win32:QMAKE_DISTCLEAN += /Q \
228 $$CHART_BUILD_HEADER_DIR \
229 $$CHART_BUILD_HEADER_DIR \
229 $$CHART_BUILD_LIB_DIR
230 $$CHART_BUILD_LIB_DIR
230
231
231 ############################## COVERAGE #########################################
232 ############################## COVERAGE #########################################
232
233
233 unix:coverage:{
234 unix:coverage:{
234
235
235 QMAKE_CXXFLAGS += -fprofile-arcs -ftest-coverage
236 QMAKE_CXXFLAGS += -fprofile-arcs -ftest-coverage
236 QMAKE_LDFLAGS += -fprofile-arcs -ftest-coverage
237 QMAKE_LDFLAGS += -fprofile-arcs -ftest-coverage
237
238
238 LIBS += -lgcov
239 LIBS += -lgcov
239
240
240 QMAKE_CLEAN += $$OBJECTS_DIR/*.gcda $$OBJECTS_DIR/*.gcno $$PWD/*.gcov ../coverage/*.info
241 QMAKE_CLEAN += $$OBJECTS_DIR/*.gcda $$OBJECTS_DIR/*.gcno $$PWD/*.gcov ../coverage/*.info
241 QMAKE_EXTRA_TARGETS += preparecoverage gencoverage
242 QMAKE_EXTRA_TARGETS += preparecoverage gencoverage
242
243
243 preparecoverage.target = prepare_coverage
244 preparecoverage.target = prepare_coverage
244 preparecoverage.depends = all
245 preparecoverage.depends = all
245 preparecoverage.commands = lcov --directory $$OBJECTS_DIR --zerocounters ;\
246 preparecoverage.commands = lcov --directory $$OBJECTS_DIR --zerocounters ;\
246 lcov -i -d $$OBJECTS_DIR -c -o ../coverage/base.info -b $$PWD;
247 lcov -i -d $$OBJECTS_DIR -c -o ../coverage/base.info -b $$PWD;
247
248
248 gencoverage.target = gen_coverage
249 gencoverage.target = gen_coverage
249 gencoverage.depends = all
250 gencoverage.depends = all
250 gencoverage.commands = lcov -d $$OBJECTS_DIR -c -o ../coverage/src.info -b $$PWD;\
251 gencoverage.commands = lcov -d $$OBJECTS_DIR -c -o ../coverage/src.info -b $$PWD;\
251 lcov -e ../coverage/base.info $$PWD/* $$PWD/animations/* $$PWD/areachart/* $$PWD/axis/* $$PWD/barchart/* $$PWD/legend/* $$PWD/linechart/* $$PWD/piechart/* $$PWD/scatterchart/* $$PWD/splinechart/* $$PWD/themes/* $$PWD/xychart/* -o ../coverage/base.info;\
252 lcov -e ../coverage/base.info $$PWD/* $$PWD/animations/* $$PWD/areachart/* $$PWD/axis/* $$PWD/barchart/* $$PWD/legend/* $$PWD/linechart/* $$PWD/piechart/* $$PWD/scatterchart/* $$PWD/splinechart/* $$PWD/themes/* $$PWD/xychart/* -o ../coverage/base.info;\
252 lcov -e ../coverage/src.info $$PWD/* $$PWD/animations/* $$PWD/areachart/* $$PWD/axis/* $$PWD/barchart/* $$PWD/legend/* $$PWD/linechart/* $$PWD/piechart/* $$PWD/scatterchart/* $$PWD/splinechart/* $$PWD/themes/* $$PWD/xychart/* -o ../coverage/src.info;\
253 lcov -e ../coverage/src.info $$PWD/* $$PWD/animations/* $$PWD/areachart/* $$PWD/axis/* $$PWD/barchart/* $$PWD/legend/* $$PWD/linechart/* $$PWD/piechart/* $$PWD/scatterchart/* $$PWD/splinechart/* $$PWD/themes/* $$PWD/xychart/* -o ../coverage/src.info;\
253 lcov -a ../coverage/base.info -a ../coverage/src.info -o ../coverage/coverage.info;
254 lcov -a ../coverage/base.info -a ../coverage/src.info -o ../coverage/coverage.info;
254 }
255 }
255
256
General Comments 0
You need to be logged in to leave comments. Login now