10#include <QtCore/QAbstractItemModel>
11#include <QtQml/QQmlContext>
12#include <QtQuick/private/qquickanimation_p.h>
13#include <QtQml/QQmlListProperty>
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
43
44
45
46
47
48
49
52
53
54
55
56
57
58
60QDeclarativeGeoMapItemView::QDeclarativeGeoMapItemView(QQuickItem *parent)
61 : QDeclarativeGeoMapItemGroup(parent)
63 m_exit =
new QQuickTransition(
this);
64 QQmlListProperty<QQuickAbstractAnimation> anims = m_exit->animations();
65 QQuickNumberAnimation *ani =
new QQuickNumberAnimation(m_exit);
66 ani->setProperty(QStringLiteral(
"opacity"));
68 ani->setDuration(300.0);
69 anims.append(&anims, ani);
72QDeclarativeGeoMapItemView::~QDeclarativeGeoMapItemView()
79
80
81void QDeclarativeGeoMapItemView::componentComplete()
83 QDeclarativeGeoMapItemGroup::componentComplete();
84 m_componentCompleted =
true;
85 if (!m_itemModel.isNull())
86 m_delegateModel->setModel(std::exchange(m_itemModel, QVariant()));
89 m_delegateModel->setDelegate(m_delegate);
91 m_delegateModel->setDelegateModelAccess(m_delegateModelAccess);
92 m_delegateModel->componentComplete();
96 QObject::connect(m_delegateModel, &QQmlDelegateModel::modelChanged,
97 this, &QDeclarativeGeoMapItemView::modelChanged);
100void QDeclarativeGeoMapItemView::classBegin()
102 QDeclarativeGeoMapItemGroup::classBegin();
103 QQmlContext *ctx = qmlContext(
this);
104 m_delegateModel =
new QQmlDelegateModel(ctx,
this);
105 m_delegateModel->classBegin();
107 connect(m_delegateModel, &QQmlInstanceModel::modelUpdated,
this, &QDeclarativeGeoMapItemView::modelUpdated);
108 connect(m_delegateModel, &QQmlInstanceModel::createdItem,
this, &QDeclarativeGeoMapItemView::createdItem);
113void QDeclarativeGeoMapItemView::destroyingItem(QObject * )
118void QDeclarativeGeoMapItemView::initItem(
int , QObject * )
123void QDeclarativeGeoMapItemView::createdItem(
int index, QObject * )
135 if (m_creatingObject) {
140 QQuickItem *item = qobject_cast<QQuickItem *>(m_delegateModel->object(index, m_incubationMode));
142 addDelegateToMap(item, index,
true);
144 qWarning() <<
"QQmlDelegateModel:: object called in createdItem for " << index <<
" produced a null item";
147void QDeclarativeGeoMapItemView::modelUpdated(
const QQmlChangeSet &changeSet,
bool reset)
156 removeInstantiatedItems();
159 const QList<QQmlChangeSet::Change> &removes = changeSet.removes();
160 std::map<
int,
int> mapRemoves;
161 for (qsizetype i = 0; i < removes.size(); i++)
162 mapRemoves.insert(std::pair<
int,
int>(removes.at(i).start(), i));
164 for (
auto rit = mapRemoves.rbegin(); rit != mapRemoves.rend(); ++rit) {
165 const QQmlChangeSet::Change &c = removes.at(rit->second);
166 for (
auto idx = c.end() - 1; idx >= c.start(); --idx)
167 removeDelegateFromMap(idx);
171 QScopedValueRollback createBlocker(m_creatingObject,
true);
172 for (
const QQmlChangeSet::Change &c: changeSet.inserts()) {
173 for (
auto idx = c.start(); idx < c.end(); idx++) {
174 QObject *delegateInstance = m_delegateModel->object(idx, m_incubationMode);
175 addDelegateToMap(qobject_cast<QQuickItem *>(delegateInstance), idx);
183
184
185
186
187
188QVariant QDeclarativeGeoMapItemView::model()
const
190 return m_componentCompleted
191 ? m_delegateModel->model()
195void QDeclarativeGeoMapItemView::setModel(
const QVariant &model)
197 if (m_componentCompleted) {
198 if (m_delegateModel->model() == model)
202 m_delegateModel->drainReusableItemsPool(0);
203 removeInstantiatedItems(
false);
205 m_delegateModel->setModel(model);
209 if (model == m_itemModel)
217
218
219
220
221
222
223QQmlComponent *QDeclarativeGeoMapItemView::delegate()
const
228void QDeclarativeGeoMapItemView::setDelegate(QQmlComponent *delegate)
230 if (m_delegate == delegate)
233 m_delegate = delegate;
234 if (m_componentCompleted)
235 m_delegateModel->setDelegate(m_delegate);
237 emit delegateChanged();
241
242
243
244
245
246
247
248bool QDeclarativeGeoMapItemView::autoFitViewport()
const
250 return m_fitViewport;
253void QDeclarativeGeoMapItemView::setAutoFitViewport(
const bool &fit)
255 if (fit == m_fitViewport)
259 emit autoFitViewportChanged();
263
264
265void QDeclarativeGeoMapItemView::fitViewport()
268 if (!m_map || !m_map->mapReady() || !m_fitViewport)
271 if (m_map->mapItems().size() > 0)
272 m_map->fitViewportToMapItems();
276
277
278void QDeclarativeGeoMapItemView::setMap(QDeclarativeGeoMap *map)
283 instantiateAllItems();
287
288
289void QDeclarativeGeoMapItemView::removeInstantiatedItems(
bool transition)
296 for (qsizetype i = m_instantiatedItems.size() -1; i >= 0 ; i--)
297 removeDelegateFromMap(i, transition);
301
302
303
304
305void QDeclarativeGeoMapItemView::instantiateAllItems()
308 if (!m_componentCompleted
311 || m_delegateModel->model().isNull()
312 || !m_instantiatedItems.isEmpty()) {
317 QScopedValueRollback createBlocker(m_creatingObject,
true);
318 for (qsizetype i = 0; i < m_delegateModel->count(); i++) {
319 QObject *delegateInstance = m_delegateModel->object(i, m_incubationMode);
320 addDelegateToMap(qobject_cast<QQuickItem *>(delegateInstance), i);
326void QDeclarativeGeoMapItemView::setIncubateDelegates(
bool useIncubators)
328 const QQmlIncubator::IncubationMode incubationMode =
329 (useIncubators) ? QQmlIncubator::Asynchronous : QQmlIncubator::Synchronous;
330 if (m_incubationMode == incubationMode)
332 m_incubationMode = incubationMode;
333 emit incubateDelegatesChanged();
336bool QDeclarativeGeoMapItemView::incubateDelegates()
const
338 return m_incubationMode == QQmlIncubator::Asynchronous;
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363QQmlDelegateModel::DelegateModelAccess QDeclarativeGeoMapItemView::delegateModelAccess()
const
365 return m_delegateModelAccess;
368void QDeclarativeGeoMapItemView::setDelegateModelAccess(
369 QQmlDelegateModel::DelegateModelAccess delegateModelAccess)
371 if (m_delegateModelAccess == delegateModelAccess)
374 m_delegateModelAccess = delegateModelAccess;
375 if (m_componentCompleted)
376 m_delegateModel->setDelegateModelAccess(m_delegateModelAccess);
378 emit delegateModelAccessChanged();
381QList<QQuickItem *> QDeclarativeGeoMapItemView::mapItems()
383 return m_instantiatedItems;
386QQmlInstanceModel::ReleaseFlags QDeclarativeGeoMapItemView::disposeDelegate(QQuickItem *item)
388 disconnect(item, 0,
this, 0);
389 removeDelegateFromMap(item);
390 item->setParentItem(
nullptr);
391 item->setParent(
nullptr);
392 QQmlInstanceModel::ReleaseFlags releaseStatus = m_delegateModel->release(item);
393 return releaseStatus;
396void QDeclarativeGeoMapItemView::removeDelegateFromMap(
int index,
bool transition)
398 if (index >= 0 && index < m_instantiatedItems.size()) {
399 QQuickItem *item = m_instantiatedItems.takeAt(index);
405 m_delegateModel->cancel(index);
409 if (m_exit && m_map && transition) {
410 transitionItemOut(item);
412 if (m_exit && m_map && !transition) {
415 terminateExitTransition(item);
417 QQmlInstanceModel::ReleaseFlags releaseStatus = disposeDelegate(item);
419 if (releaseStatus == QQmlInstanceModel::Referenced)
420 qWarning() <<
"item "<< index <<
"(" << item <<
") still referenced";
422 Q_UNUSED(releaseStatus);
428void QDeclarativeGeoMapItemView::removeDelegateFromMap(QQuickItem *o)
433 QDeclarativeGeoMapItemBase *item = qobject_cast<QDeclarativeGeoMapItemBase *>(o);
435 m_map->removeMapItem(item);
438 QDeclarativeGeoMapItemView *view = qobject_cast<QDeclarativeGeoMapItemView *>(o);
440 m_map->removeMapItemView(view);
443 QDeclarativeGeoMapItemGroup *group = qobject_cast<QDeclarativeGeoMapItemGroup *>(o);
445 m_map->removeMapItemGroup(group);
450void QDeclarativeGeoMapItemView::transitionItemOut(QQuickItem *o)
452 QDeclarativeGeoMapItemGroup *group = qobject_cast<QDeclarativeGeoMapItemGroup *>(o);
454 if (!group->m_transitionManager) {
455 std::unique_ptr<QDeclarativeGeoMapItemTransitionManager>manager(
new QDeclarativeGeoMapItemTransitionManager(group));
456 group->m_transitionManager.swap(manager);
457 group->m_transitionManager->m_view =
this;
459 connect(group, &QDeclarativeGeoMapItemGroup::removeTransitionFinished,
460 this, &QDeclarativeGeoMapItemView::exitTransitionFinished);
462 group->m_transitionManager->transitionExit();
465 QDeclarativeGeoMapItemBase *item = qobject_cast<QDeclarativeGeoMapItemBase *>(o);
467 if (!item->m_transitionManager) {
468 std::unique_ptr<QDeclarativeGeoMapItemTransitionManager> manager(
new QDeclarativeGeoMapItemTransitionManager(item));
469 item->m_transitionManager.swap(manager);
470 item->m_transitionManager->m_view =
this;
472 connect(item, &QDeclarativeGeoMapItemBase::removeTransitionFinished,
473 this, &QDeclarativeGeoMapItemView::exitTransitionFinished);
475 item->m_transitionManager->transitionExit();
480void QDeclarativeGeoMapItemView::terminateExitTransition(QQuickItem *o)
482 QDeclarativeGeoMapItemGroup *group = qobject_cast<QDeclarativeGeoMapItemGroup *>(o);
483 if (group && group->m_transitionManager) {
484 group->m_transitionManager->cancel();
487 QDeclarativeGeoMapItemBase *item = qobject_cast<QDeclarativeGeoMapItemBase *>(o);
488 if (item && item->m_transitionManager) {
489 item->m_transitionManager->cancel();
494void QDeclarativeGeoMapItemView::exitTransitionFinished()
496 QQuickItem *item = qobject_cast<QQuickItem *>(sender());
499 QQmlInstanceModel::ReleaseFlags releaseStatus = disposeDelegate(item);
501 if (releaseStatus == QQmlInstanceModel::Referenced)
502 qWarning() <<
"item "<<item<<
" still referenced";
504 Q_UNUSED(releaseStatus);
508void QDeclarativeGeoMapItemView::addItemToMap(QDeclarativeGeoMapItemBase *item,
int index,
bool createdItem)
511 if (m_map && item->quickMap() == m_map)
515 insertInstantiatedItem(index, item, createdItem);
516 item->setParentItem(
this);
517 m_map->addMapItem(item);
519 if (!item->m_transitionManager) {
520 std::unique_ptr<QDeclarativeGeoMapItemTransitionManager>manager(
new QDeclarativeGeoMapItemTransitionManager(item));
521 item->m_transitionManager.swap(manager);
523 item->m_transitionManager->m_view =
this;
524 item->m_transitionManager->transitionEnter();
529void QDeclarativeGeoMapItemView::insertInstantiatedItem(
int index, QQuickItem *o,
bool createdItem)
532 m_instantiatedItems.replace(index, o);
534 m_instantiatedItems.insert(index, o);
537void QDeclarativeGeoMapItemView::addItemViewToMap(QDeclarativeGeoMapItemView *item,
int index,
bool createdItem)
539 if (m_map && item->quickMap() == m_map)
543 insertInstantiatedItem(index, item, createdItem);
544 item->setParentItem(
this);
545 m_map->addMapItemView(item);
547 if (!item->m_transitionManager) {
548 std::unique_ptr<QDeclarativeGeoMapItemTransitionManager> manager(
new QDeclarativeGeoMapItemTransitionManager(item));
549 item->m_transitionManager.swap(manager);
551 item->m_transitionManager->m_view =
this;
552 item->m_transitionManager->transitionEnter();
557void QDeclarativeGeoMapItemView::addItemGroupToMap(QDeclarativeGeoMapItemGroup *item,
int index,
bool createdItem)
559 if (m_map && item->quickMap() == m_map)
563 insertInstantiatedItem(index, item, createdItem);
564 item->setParentItem(
this);
565 m_map->addMapItemGroup(item);
567 if (!item->m_transitionManager) {
568 std::unique_ptr<QDeclarativeGeoMapItemTransitionManager>manager(
new QDeclarativeGeoMapItemTransitionManager(item));
569 item->m_transitionManager.swap(manager);
571 item->m_transitionManager->m_view =
this;
572 item->m_transitionManager->transitionEnter();
577void QDeclarativeGeoMapItemView::addDelegateToMap(QQuickItem *object,
int index,
bool createdItem)
581 m_instantiatedItems.insert(index,
nullptr);
584 QDeclarativeGeoMapItemBase *item = qobject_cast<QDeclarativeGeoMapItemBase *>(object);
586 addItemToMap(item, index, createdItem);
589 QDeclarativeGeoMapItemView *view = qobject_cast<QDeclarativeGeoMapItemView *>(object);
591 addItemViewToMap(view, index, createdItem);
594 QDeclarativeGeoMapItemGroup *group = qobject_cast<QDeclarativeGeoMapItemGroup *>(object);
596 addItemGroupToMap(group, index, createdItem);
599 qWarning() <<
"addDelegateToMap called with a "<< object->metaObject()->className();
Combined button and popup list for selecting options.