1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the Qt Charts module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 or (at your option) any later version
20 ** approved by the KDE Free Qt Foundation. The licenses are as published by
21 ** the Free Software Foundation and appearing in the file LICENSE.GPL3
22 ** included in the packaging of this file. Please review the following
23 ** information to ensure the GNU General Public License requirements will
24 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
25 **
26 ** $QT_END_LICENSE$
27 **
28 ****************************************************************************/
29 
30 #include "declarativepieseries_p.h"
31 #include <QtCharts/QPieSlice>
32 #include <QtCharts/QVPieModelMapper>
33 #include <QtCharts/QHPieModelMapper>
34 
35 QT_CHARTS_BEGIN_NAMESPACE
36 
DeclarativePieSlice(QObject * parent)37 DeclarativePieSlice::DeclarativePieSlice(QObject *parent)
38     : QPieSlice(parent)
39 {
40     connect(this, SIGNAL(brushChanged()), this, SLOT(handleBrushChanged()));
41 }
42 
brushFilename() const43 QString DeclarativePieSlice::brushFilename() const
44 {
45     return m_brushFilename;
46 }
47 
setBrushFilename(const QString & brushFilename)48 void DeclarativePieSlice::setBrushFilename(const QString &brushFilename)
49 {
50     QImage brushImage(brushFilename);
51     if (QPieSlice::brush().textureImage() != brushImage) {
52         QBrush brush = QPieSlice::brush();
53         brush.setTextureImage(brushImage);
54         QPieSlice::setBrush(brush);
55         m_brushFilename = brushFilename;
56         m_brushImage = brushImage;
57         emit brushFilenameChanged(brushFilename);
58     }
59 }
60 
handleBrushChanged()61 void DeclarativePieSlice::handleBrushChanged()
62 {
63     // If the texture image of the brush has changed along the brush
64     // the brush file name needs to be cleared.
65     if (!m_brushFilename.isEmpty() && QPieSlice::brush().textureImage() != m_brushImage) {
66         m_brushFilename.clear();
67         emit brushFilenameChanged(QString(""));
68     }
69 }
70 
71 // Declarative pie series =========================================================================
DeclarativePieSeries(QQuickItem * parent)72 DeclarativePieSeries::DeclarativePieSeries(QQuickItem *parent) :
73     QPieSeries(parent)
74 {
75     connect(this, SIGNAL(added(QList<QPieSlice*>)), this, SLOT(handleAdded(QList<QPieSlice*>)));
76     connect(this, SIGNAL(removed(QList<QPieSlice*>)), this, SLOT(handleRemoved(QList<QPieSlice*>)));
77 }
78 
classBegin()79 void DeclarativePieSeries::classBegin()
80 {
81 }
82 
componentComplete()83 void DeclarativePieSeries::componentComplete()
84 {
85     foreach (QObject *child, children()) {
86         if (qobject_cast<QPieSlice *>(child)) {
87             QPieSeries::append(qobject_cast<QPieSlice *>(child));
88         } else if (qobject_cast<QVPieModelMapper *>(child)) {
89             QVPieModelMapper *mapper = qobject_cast<QVPieModelMapper *>(child);
90             mapper->setSeries(this);
91         } else if (qobject_cast<QHPieModelMapper *>(child)) {
92             QHPieModelMapper *mapper = qobject_cast<QHPieModelMapper *>(child);
93             mapper->setSeries(this);
94         }
95     }
96 }
97 
seriesChildren()98 QQmlListProperty<QObject> DeclarativePieSeries::seriesChildren()
99 {
100     return QQmlListProperty<QObject>(this, 0, &DeclarativePieSeries::appendSeriesChildren ,0,0,0);
101 }
102 
appendSeriesChildren(QQmlListProperty<QObject> * list,QObject * element)103 void DeclarativePieSeries::appendSeriesChildren(QQmlListProperty<QObject> * list, QObject *element)
104 {
105     // Empty implementation; the children are parsed in componentComplete instead
106     Q_UNUSED(list);
107     Q_UNUSED(element);
108 }
109 
at(int index)110 QPieSlice *DeclarativePieSeries::at(int index)
111 {
112     QList<QPieSlice *> sliceList = slices();
113     if (index >= 0 && index < sliceList.count())
114         return sliceList[index];
115 
116     return 0;
117 }
118 
find(QString label)119 QPieSlice *DeclarativePieSeries::find(QString label)
120 {
121     foreach (QPieSlice *slice, slices()) {
122         if (slice->label() == label)
123             return slice;
124     }
125     return 0;
126 }
127 
append(QString label,qreal value)128 DeclarativePieSlice *DeclarativePieSeries::append(QString label, qreal value)
129 {
130     DeclarativePieSlice *slice = new DeclarativePieSlice(this);
131     slice->setLabel(label);
132     slice->setValue(value);
133     if (QPieSeries::append(slice))
134         return slice;
135     delete slice;
136     return 0;
137 }
138 
remove(QPieSlice * slice)139 bool DeclarativePieSeries::remove(QPieSlice *slice)
140 {
141     return QPieSeries::remove(slice);
142 }
143 
clear()144 void DeclarativePieSeries::clear()
145 {
146     QPieSeries::clear();
147 }
148 
handleAdded(QList<QPieSlice * > slices)149 void DeclarativePieSeries::handleAdded(QList<QPieSlice *> slices)
150 {
151     foreach (QPieSlice *slice, slices)
152         emit sliceAdded(slice);
153 }
154 
handleRemoved(QList<QPieSlice * > slices)155 void DeclarativePieSeries::handleRemoved(QList<QPieSlice *> slices)
156 {
157     foreach (QPieSlice *slice, slices)
158         emit sliceRemoved(slice);
159 }
160 
161 QT_CHARTS_END_NAMESPACE
162 
163 #include "moc_declarativepieseries_p.cpp"
164