1 /****************************************************************************
2 **
3 ** Copyright (C) 2018 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtLocation module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL3$
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 http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPLv3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or later as published by the Free
28 ** Software Foundation and appearing in the file LICENSE.GPL included in
29 ** the packaging of this file. Please review the following information to
30 ** ensure the GNU General Public License version 2.0 requirements will be
31 ** met: http://www.gnu.org/licenses/gpl-2.0.html.
32 **
33 ** $QT_END_LICENSE$
34 **
35 ****************************************************************************/
36
37 #include "qdeclarativegeomap_p.h"
38 #include "qgeomapobject_p.h"
39 #include "qgeomapobject_p_p.h"
40
41 QT_BEGIN_NAMESPACE
42
43 /*!
44 \internal
45
46 \qmltype GeoMapObject
47 \instantiates QGeoMapObject
48 \inqmlmodule Qt.labs.location
49 \ingroup qml-QtLocation5-maps
50
51 \brief The GeoObject type is a base class for geographical objects that can be added to a map.
52
53 The difference between a GeoMapObject and a MapItem is twofold. First, GeoMapObject are always backed
54 by a plugin-specific implementation and do not come with a default implementation. If a plugin does
55 not support a specific GeoMapObject type, adding such a GeoMapObject will have no effect.
56 Second, GeoMapObject are not QQuickItems, thus being a much more lightweight way to add content to
57 a map.
58
59 GeoMapObject support is plugin-dependent, and is documented per plugin.
60 */
61
62 template<>
clone()63 QGeoMapObjectPrivate *QExplicitlySharedDataPointer<QGeoMapObjectPrivate>::clone()
64 {
65 return d->clone();
66 }
67
~QGeoMapObject()68 QGeoMapObject::~QGeoMapObject()
69 {
70
71 }
72
73 /*!
74 Returns whether this geographical object and \a other are equal.
75 */
operator ==(const QGeoMapObject & other) const76 bool QGeoMapObject::operator ==(const QGeoMapObject &other) const
77 {
78 return ( (d_ptr.constData() == other.d_ptr.constData())
79 || (*d_ptr) == (*other.d_ptr));
80 }
81
82 /*!
83 Returns whether this geographical object and \a other are not equal.
84 */
operator !=(const QGeoMapObject & other) const85 bool QGeoMapObject::operator !=(const QGeoMapObject &other) const
86 {
87 return !(operator==(other));
88 }
89
90 /*!
91 \internal
92 Returns which features are supported by the geographical object
93 */
features() const94 QGeoMapObject::Features QGeoMapObject::features() const
95 {
96 return d_ptr->features();
97 }
98
implementation() const99 QGeoMapObjectPrivate *QGeoMapObject::implementation() const
100 {
101 return d_ptr.data();
102 }
103
setImplementation(const QExplicitlySharedDataPointer<QGeoMapObjectPrivate> & pimpl)104 bool QGeoMapObject::setImplementation(const QExplicitlySharedDataPointer<QGeoMapObjectPrivate> &pimpl)
105 {
106 if (d_ptr->type() != pimpl->type())
107 return false;
108 d_ptr = pimpl;
109 return true;
110 }
111
implemented() const112 bool QGeoMapObject::implemented() const
113 {
114 return !d_ptr->engineName().isEmpty();
115 }
116
visible() const117 bool QGeoMapObject::visible() const
118 {
119 return d_ptr->visible();
120 }
121
setVisible(bool visible)122 void QGeoMapObject::setVisible(bool visible)
123 {
124 if (visible == d_ptr->m_visible)
125 return;
126
127 const bool oldVisible = QGeoMapObject::visible();
128 d_ptr->setVisible(visible);
129 if (d_ptr->m_componentCompleted)
130 setChildrenVisibility();
131 if (QGeoMapObject::visible() != oldVisible)
132 emit visibleChanged();
133 }
134
setParentVisiblity(bool visible)135 void QGeoMapObject::setParentVisiblity(bool visible)
136 {
137 if (visible == d_ptr->m_parentVisible)
138 return;
139
140 const bool oldVisible = QGeoMapObject::visible();
141 d_ptr->setParentVisibility(visible);
142 if (d_ptr->m_componentCompleted)
143 setChildrenVisibility();
144 if (QGeoMapObject::visible() != oldVisible)
145 emit visibleChanged();
146 }
147
type() const148 QGeoMapObject::Type QGeoMapObject::type() const
149 {
150 return d_ptr->type();
151 }
152
geoMapObjectChildren() const153 QList<QGeoMapObject *> QGeoMapObject::geoMapObjectChildren() const
154 {
155 return quickChildren<QGeoMapObject>();
156 }
157
QGeoMapObject(const QExplicitlySharedDataPointer<QGeoMapObjectPrivate> & dd,QObject * parent)158 QGeoMapObject::QGeoMapObject(const QExplicitlySharedDataPointer<QGeoMapObjectPrivate> &dd, QObject *parent)
159 : QParameterizableObject(parent), d_ptr(dd)
160 {
161 }
162
setChildrenVisibility()163 void QGeoMapObject::setChildrenVisibility()
164 {
165 const bool v = visible();
166 const QList<QGeoMapObject *> kids = geoMapObjectChildren();
167 for (auto kid : qAsConst(kids))
168 kid->setParentVisiblity(v);
169 }
170
classBegin()171 void QGeoMapObject::classBegin()
172 {
173
174 }
175
completeComponent()176 void QGeoMapObject::completeComponent()
177 {
178 d_ptr->m_componentCompleted = true;
179 setChildrenVisibility();
180 }
181
componentComplete()182 void QGeoMapObject::componentComplete()
183 {
184 completeComponent();
185 emit completed();
186 }
187
setMap(QGeoMap * map)188 void QGeoMapObject::setMap(QGeoMap *map)
189 {
190 if (d_ptr->m_map == map)
191 return;
192
193 if (map) {
194 bool oldVisible = d_ptr->m_visible;
195 bool oldCmponentCompleted = d_ptr->m_componentCompleted;
196 if (!map->createMapObjectImplementation(this)) {
197 if (type() != ViewType)
198 qWarning() << "Unsupported type " << type();
199 }
200 // old implementation gets destroyed if/when d_ptr gets replaced
201 d_ptr->m_componentCompleted = oldCmponentCompleted;
202 d_ptr->setVisible(oldVisible);
203 d_ptr->setMap(map);
204 }
205
206 const QList<QGeoMapObject *> kids = geoMapObjectChildren();
207 for (auto kid : kids)
208 kid->setMap(map);
209
210 // Each subclass is in charge to do the equivalent of
211 // if (!map) {
212 // // Map was set, now it has ben re-set to NULL, but not inside d_ptr.
213 // // so m_map inside d_ptr can still be used to remove itself, inside the destructor.
214 // d_ptr = new QMapCircleObjectPrivateDefault(*d);
215 // // Old pimpl deleted implicitly by QExplicitlySharedDataPointer
216 // }
217 // After this method is called.
218 }
219
map() const220 QGeoMap *QGeoMapObject::map() const
221 {
222 return d_ptr->m_map;
223 }
224
geoShape() const225 QGeoShape QGeoMapObject::geoShape() const
226 {
227 return d_ptr->geoShape();
228 }
229
setGeoShape(const QGeoShape & shape)230 void QGeoMapObject::setGeoShape(const QGeoShape &shape)
231 {
232 d_ptr->setGeoShape(shape);
233 }
234
235
236 //
237 // QGeoMapObjectPrivate
238 //
239
QGeoMapObjectPrivate()240 QGeoMapObjectPrivate::QGeoMapObjectPrivate()
241 {
242 }
243
QGeoMapObjectPrivate(QGeoMapObject * q)244 QGeoMapObjectPrivate::QGeoMapObjectPrivate(QGeoMapObject *q) : q(q)
245 {
246 }
247
QGeoMapObjectPrivate(const QGeoMapObjectPrivate & other)248 QGeoMapObjectPrivate::QGeoMapObjectPrivate(const QGeoMapObjectPrivate &other)
249 :QSharedData(other)
250 ,q(other.q)
251 ,m_componentCompleted(other.m_componentCompleted)
252 ,m_visible(other.m_visible)
253 {
254
255 }
256
~QGeoMapObjectPrivate()257 QGeoMapObjectPrivate::~QGeoMapObjectPrivate()
258 {
259 }
260
operator ==(const QGeoMapObjectPrivate & other) const261 bool QGeoMapObjectPrivate::operator ==(const QGeoMapObjectPrivate &other) const
262 {
263 return (type() == other.type() && engineName() == other.engineName()
264 && equals(other));
265 }
266
engineName() const267 QByteArray QGeoMapObjectPrivate::engineName() const
268 {
269 return QByteArray();
270 }
271
type() const272 QGeoMapObject::Type QGeoMapObjectPrivate::type() const
273 {
274 return QGeoMapObject::InvalidType;
275 }
276
features() const277 QGeoMapObject::Features QGeoMapObjectPrivate::features() const
278 {
279 return QGeoMapObject::NoFeature;
280 }
281
equals(const QGeoMapObjectPrivate & other) const282 bool QGeoMapObjectPrivate::equals(const QGeoMapObjectPrivate &other) const
283 {
284 return (visible() == other.visible() && type() == other.type()
285 && engineName() == other.engineName() && features() == other.features()
286 && m_map == other.m_map);
287 }
288
visible() const289 bool QGeoMapObjectPrivate::visible() const
290 {
291 return m_visible && m_parentVisible;
292 }
293
setVisible(bool visible)294 void QGeoMapObjectPrivate::setVisible(bool visible)
295 {
296 m_visible = visible;
297 }
298
setParentVisibility(bool visible)299 void QGeoMapObjectPrivate::setParentVisibility(bool visible)
300 {
301 m_parentVisible = visible;
302 }
303
setMap(QGeoMap * map)304 void QGeoMapObjectPrivate::setMap(QGeoMap *map)
305 {
306 m_map = map;
307 }
308
309 QT_END_NAMESPACE
310