9#include <QtCore/QAbstractItemModel>
10#include <QtQml/QQmlContext>
11#include <QtQuick/private/qquickanimation_p.h>
12#include <QtQml/QQmlListProperty>
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
42
43
44
45
46
47
48
51
52
53
54
55
56
57
59QDeclarativeGeoMapItemView::QDeclarativeGeoMapItemView(QQuickItem *parent)
60 : QDeclarativeGeoMapItemGroup(parent)
62 m_exit =
new QQuickTransition(
this);
63 QQmlListProperty<QQuickAbstractAnimation> anims = m_exit->animations();
64 QQuickNumberAnimation *ani =
new QQuickNumberAnimation(m_exit);
65 ani->setProperty(QStringLiteral(
"opacity"));
67 ani->setDuration(300.0);
68 anims.append(&anims, ani);
71QDeclarativeGeoMapItemView::~QDeclarativeGeoMapItemView()
78
79
80void QDeclarativeGeoMapItemView::componentComplete()
82 QDeclarativeGeoMapItemGroup::componentComplete();
83 m_componentCompleted =
true;
84 if (!m_itemModel.isNull())
85 m_delegateModel->setModel(std::exchange(m_itemModel, QVariant()));
88 m_delegateModel->setDelegate(m_delegate);
90 m_delegateModel->setDelegateModelAccess(m_delegateModelAccess);
91 m_delegateModel->componentComplete();
95 QObject::connect(m_delegateModel, &QQmlDelegateModel::modelChanged,
96 this, &QDeclarativeGeoMapItemView::modelChanged);
99void QDeclarativeGeoMapItemView::classBegin()
101 QDeclarativeGeoMapItemGroup::classBegin();
102 QQmlContext *ctx = qmlContext(
this);
103 m_delegateModel =
new QQmlDelegateModel(ctx,
this);
104 m_delegateModel->classBegin();
106 connect(m_delegateModel, &QQmlInstanceModel::modelUpdated,
this, &QDeclarativeGeoMapItemView::modelUpdated);
107 connect(m_delegateModel, &QQmlInstanceModel::createdItem,
this, &QDeclarativeGeoMapItemView::createdItem);
112void QDeclarativeGeoMapItemView::destroyingItem(QObject * )
117void QDeclarativeGeoMapItemView::initItem(
int , QObject * )
122void QDeclarativeGeoMapItemView::createdItem(
int index, QObject * )
134 if (m_creatingObject) {
139 QQuickItem *item = qobject_cast<QQuickItem *>(m_delegateModel->object(index, m_incubationMode));
141 addDelegateToMap(item, index,
true);
143 qWarning() <<
"QQmlDelegateModel:: object called in createdItem for " << index <<
" produced a null item";
146void QDeclarativeGeoMapItemView::modelUpdated(
const QQmlChangeSet &changeSet,
bool reset)
155 removeInstantiatedItems();
158 const QList<QQmlChangeSet::Change> &removes = changeSet.removes();
159 std::map<
int,
int> mapRemoves;
160 for (qsizetype i = 0; i < removes.size(); i++)
161 mapRemoves.insert(std::pair<
int,
int>(removes.at(i).start(), i));
163 for (
auto rit = mapRemoves.rbegin(); rit != mapRemoves.rend(); ++rit) {
164 const QQmlChangeSet::Change &c = removes.at(rit->second);
165 for (
auto idx = c.end() - 1; idx >= c.start(); --idx)
166 removeDelegateFromMap(idx);
170 QScopedValueRollback createBlocker(m_creatingObject,
true);
171 for (
const QQmlChangeSet::Change &c: changeSet.inserts()) {
172 for (
auto idx = c.start(); idx < c.end(); idx++) {
173 QObject *delegateInstance = m_delegateModel->object(idx, m_incubationMode);
174 addDelegateToMap(qobject_cast<QQuickItem *>(delegateInstance), idx);
182
183
184
185
186
187QVariant QDeclarativeGeoMapItemView::model()
const
189 return m_componentCompleted
190 ? m_delegateModel->model()
194void QDeclarativeGeoMapItemView::setModel(
const QVariant &model)
196 if (m_componentCompleted) {
197 if (m_delegateModel->model() == model)
201 m_delegateModel->drainReusableItemsPool(0);
202 removeInstantiatedItems(
false);
204 m_delegateModel->setModel(model);
208 if (model == m_itemModel)
216
217
218
219
220
221
222QQmlComponent *QDeclarativeGeoMapItemView::delegate()
const
227void QDeclarativeGeoMapItemView::setDelegate(QQmlComponent *delegate)
229 if (m_delegate == delegate)
232 m_delegate = delegate;
233 if (m_componentCompleted)
234 m_delegateModel->setDelegate(m_delegate);
236 emit delegateChanged();
240
241
242
243
244
245
246
247bool QDeclarativeGeoMapItemView::autoFitViewport()
const
249 return m_fitViewport;
252void QDeclarativeGeoMapItemView::setAutoFitViewport(
const bool &fit)
254 if (fit == m_fitViewport)
258 emit autoFitViewportChanged();
262
263
264void QDeclarativeGeoMapItemView::fitViewport()
267 if (!m_map || !m_map->mapReady() || !m_fitViewport)
270 if (m_map->mapItems().size() > 0)
271 m_map->fitViewportToMapItems();
275
276
277void QDeclarativeGeoMapItemView::setMap(QDeclarativeGeoMap *map)
282 instantiateAllItems();
286
287
288void QDeclarativeGeoMapItemView::removeInstantiatedItems(
bool transition)
295 for (qsizetype i = m_instantiatedItems.size() -1; i >= 0 ; i--)
296 removeDelegateFromMap(i, transition);
300
301
302
303
304void QDeclarativeGeoMapItemView::instantiateAllItems()
307 if (!m_componentCompleted
310 || m_delegateModel->model().isNull()
311 || !m_instantiatedItems.isEmpty()) {
316 QScopedValueRollback createBlocker(m_creatingObject,
true);
317 for (qsizetype i = 0; i < m_delegateModel->count(); i++) {
318 QObject *delegateInstance = m_delegateModel->object(i, m_incubationMode);
319 addDelegateToMap(qobject_cast<QQuickItem *>(delegateInstance), i);
325void QDeclarativeGeoMapItemView::setIncubateDelegates(
bool useIncubators)
327 const QQmlIncubator::IncubationMode incubationMode =
328 (useIncubators) ? QQmlIncubator::Asynchronous : QQmlIncubator::Synchronous;
329 if (m_incubationMode == incubationMode)
331 m_incubationMode = incubationMode;
332 emit incubateDelegatesChanged();
335bool QDeclarativeGeoMapItemView::incubateDelegates()
const
337 return m_incubationMode == QQmlIncubator::Asynchronous;
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362QQmlDelegateModel::DelegateModelAccess QDeclarativeGeoMapItemView::delegateModelAccess()
const
364 return m_delegateModelAccess;
367void QDeclarativeGeoMapItemView::setDelegateModelAccess(
368 QQmlDelegateModel::DelegateModelAccess delegateModelAccess)
370 if (m_delegateModelAccess == delegateModelAccess)
373 m_delegateModelAccess = delegateModelAccess;
374 if (m_componentCompleted)
375 m_delegateModel->setDelegateModelAccess(m_delegateModelAccess);
377 emit delegateModelAccessChanged();
380QList<QQuickItem *> QDeclarativeGeoMapItemView::mapItems()
382 return m_instantiatedItems;
385QQmlInstanceModel::ReleaseFlags QDeclarativeGeoMapItemView::disposeDelegate(QQuickItem *item)
387 disconnect(item, 0,
this, 0);
388 removeDelegateFromMap(item);
389 item->setParentItem(
nullptr);
390 item->setParent(
nullptr);
391 QQmlInstanceModel::ReleaseFlags releaseStatus = m_delegateModel->release(item);
392 return releaseStatus;
395void QDeclarativeGeoMapItemView::removeDelegateFromMap(
int index,
bool transition)
397 if (index >= 0 && index < m_instantiatedItems.size()) {
398 QQuickItem *item = m_instantiatedItems.takeAt(index);
404 m_delegateModel->cancel(index);
408 if (m_exit && m_map && transition) {
409 transitionItemOut(item);
411 if (m_exit && m_map && !transition) {
414 terminateExitTransition(item);
416 QQmlInstanceModel::ReleaseFlags releaseStatus = disposeDelegate(item);
418 if (releaseStatus == QQmlInstanceModel::Referenced)
419 qWarning() <<
"item "<< index <<
"(" << item <<
") still referenced";
421 Q_UNUSED(releaseStatus);
427void QDeclarativeGeoMapItemView::removeDelegateFromMap(QQuickItem *o)
432 QDeclarativeGeoMapItemBase *item = qobject_cast<QDeclarativeGeoMapItemBase *>(o);
434 m_map->removeMapItem(item);
437 QDeclarativeGeoMapItemView *view = qobject_cast<QDeclarativeGeoMapItemView *>(o);
439 m_map->removeMapItemView(view);
442 QDeclarativeGeoMapItemGroup *group = qobject_cast<QDeclarativeGeoMapItemGroup *>(o);
444 m_map->removeMapItemGroup(group);
449void QDeclarativeGeoMapItemView::transitionItemOut(QQuickItem *o)
451 QDeclarativeGeoMapItemGroup *group = qobject_cast<QDeclarativeGeoMapItemGroup *>(o);
453 if (!group->m_transitionManager) {
454 std::unique_ptr<QDeclarativeGeoMapItemTransitionManager>manager(
new QDeclarativeGeoMapItemTransitionManager(group));
455 group->m_transitionManager.swap(manager);
456 group->m_transitionManager->m_view =
this;
458 connect(group, &QDeclarativeGeoMapItemGroup::removeTransitionFinished,
459 this, &QDeclarativeGeoMapItemView::exitTransitionFinished);
461 group->m_transitionManager->transitionExit();
464 QDeclarativeGeoMapItemBase *item = qobject_cast<QDeclarativeGeoMapItemBase *>(o);
466 if (!item->m_transitionManager) {
467 std::unique_ptr<QDeclarativeGeoMapItemTransitionManager> manager(
new QDeclarativeGeoMapItemTransitionManager(item));
468 item->m_transitionManager.swap(manager);
469 item->m_transitionManager->m_view =
this;
471 connect(item, &QDeclarativeGeoMapItemBase::removeTransitionFinished,
472 this, &QDeclarativeGeoMapItemView::exitTransitionFinished);
474 item->m_transitionManager->transitionExit();
479void QDeclarativeGeoMapItemView::terminateExitTransition(QQuickItem *o)
481 QDeclarativeGeoMapItemGroup *group = qobject_cast<QDeclarativeGeoMapItemGroup *>(o);
482 if (group && group->m_transitionManager) {
483 group->m_transitionManager->cancel();
486 QDeclarativeGeoMapItemBase *item = qobject_cast<QDeclarativeGeoMapItemBase *>(o);
487 if (item && item->m_transitionManager) {
488 item->m_transitionManager->cancel();
493void QDeclarativeGeoMapItemView::exitTransitionFinished()
495 QQuickItem *item = qobject_cast<QQuickItem *>(sender());
498 QQmlInstanceModel::ReleaseFlags releaseStatus = disposeDelegate(item);
500 if (releaseStatus == QQmlInstanceModel::Referenced)
501 qWarning() <<
"item "<<item<<
" still referenced";
503 Q_UNUSED(releaseStatus);
507void QDeclarativeGeoMapItemView::addItemToMap(QDeclarativeGeoMapItemBase *item,
int index,
bool createdItem)
510 if (m_map && item->quickMap() == m_map)
514 insertInstantiatedItem(index, item, createdItem);
515 item->setParentItem(
this);
516 m_map->addMapItem(item);
518 if (!item->m_transitionManager) {
519 std::unique_ptr<QDeclarativeGeoMapItemTransitionManager>manager(
new QDeclarativeGeoMapItemTransitionManager(item));
520 item->m_transitionManager.swap(manager);
522 item->m_transitionManager->m_view =
this;
523 item->m_transitionManager->transitionEnter();
528void QDeclarativeGeoMapItemView::insertInstantiatedItem(
int index, QQuickItem *o,
bool createdItem)
531 m_instantiatedItems.replace(index, o);
533 m_instantiatedItems.insert(index, o);
536void QDeclarativeGeoMapItemView::addItemViewToMap(QDeclarativeGeoMapItemView *item,
int index,
bool createdItem)
538 if (m_map && item->quickMap() == m_map)
542 insertInstantiatedItem(index, item, createdItem);
543 item->setParentItem(
this);
544 m_map->addMapItemView(item);
546 if (!item->m_transitionManager) {
547 std::unique_ptr<QDeclarativeGeoMapItemTransitionManager> manager(
new QDeclarativeGeoMapItemTransitionManager(item));
548 item->m_transitionManager.swap(manager);
550 item->m_transitionManager->m_view =
this;
551 item->m_transitionManager->transitionEnter();
556void QDeclarativeGeoMapItemView::addItemGroupToMap(QDeclarativeGeoMapItemGroup *item,
int index,
bool createdItem)
558 if (m_map && item->quickMap() == m_map)
562 insertInstantiatedItem(index, item, createdItem);
563 item->setParentItem(
this);
564 m_map->addMapItemGroup(item);
566 if (!item->m_transitionManager) {
567 std::unique_ptr<QDeclarativeGeoMapItemTransitionManager>manager(
new QDeclarativeGeoMapItemTransitionManager(item));
568 item->m_transitionManager.swap(manager);
570 item->m_transitionManager->m_view =
this;
571 item->m_transitionManager->transitionEnter();
576void QDeclarativeGeoMapItemView::addDelegateToMap(QQuickItem *object,
int index,
bool createdItem)
580 m_instantiatedItems.insert(index,
nullptr);
583 QDeclarativeGeoMapItemBase *item = qobject_cast<QDeclarativeGeoMapItemBase *>(object);
585 addItemToMap(item, index, createdItem);
588 QDeclarativeGeoMapItemView *view = qobject_cast<QDeclarativeGeoMapItemView *>(object);
590 addItemViewToMap(view, index, createdItem);
593 QDeclarativeGeoMapItemGroup *group = qobject_cast<QDeclarativeGeoMapItemGroup *>(object);
595 addItemGroupToMap(group, index, createdItem);
598 qWarning() <<
"addDelegateToMap called with a "<< object->metaObject()->className();