1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 Jolla Ltd.
4 ** Contact: Aaron McCarthy <aaron.mccarthy@jollamobile.com>
5 ** Copyright (C) 2015 The Qt Company Ltd.
6 ** Contact: http://www.qt.io/licensing/
7 **
8 ** This file is part of the QtLocation module of the Qt Toolkit.
9 **
10 ** $QT_BEGIN_LICENSE:LGPL3$
11 ** Commercial License Usage
12 ** Licensees holding valid commercial Qt licenses may use this file in
13 ** accordance with the commercial license agreement provided with the
14 ** Software or, alternatively, in accordance with the terms contained in
15 ** a written agreement between you and The Qt Company. For licensing terms
16 ** and conditions see http://www.qt.io/terms-conditions. For further
17 ** information use the contact form at http://www.qt.io/contact-us.
18 **
19 ** GNU Lesser General Public License Usage
20 ** Alternatively, this file may be used under the terms of the GNU Lesser
21 ** General Public License version 3 as published by the Free Software
22 ** Foundation and appearing in the file LICENSE.LGPLv3 included in the
23 ** packaging of this file. Please review the following information to
24 ** ensure the GNU Lesser General Public License version 3 requirements
25 ** will be met: https://www.gnu.org/licenses/lgpl.html.
26 **
27 ** GNU General Public License Usage
28 ** Alternatively, this file may be used under the terms of the GNU
29 ** General Public License version 2.0 or later as published by the Free
30 ** Software Foundation and appearing in the file LICENSE.GPL included in
31 ** the packaging of this file. Please review the following information to
32 ** ensure the GNU General Public License version 2.0 requirements will be
33 ** met: http://www.gnu.org/licenses/gpl-2.0.html.
34 **
35 ** $QT_END_LICENSE$
36 **
37 ****************************************************************************/
38 
39 #ifndef QDECLARATIVEGEOMAPITEMVIEW_H
40 #define QDECLARATIVEGEOMAPITEMVIEW_H
41 
42 //
43 //  W A R N I N G
44 //  -------------
45 //
46 // This file is not part of the Qt API.  It exists purely as an
47 // implementation detail.  This header file may change from version to
48 // version without notice, or even be removed.
49 //
50 // We mean it.
51 //
52 
53 #include <QtLocation/private/qlocationglobal_p.h>
54 #include <map>
55 #include <QtCore/QModelIndex>
56 #include <QtQml/QQmlParserStatus>
57 #include <QtQml/QQmlIncubator>
58 #include <QtQml/qqml.h>
59 #include <private/qqmldelegatemodel_p.h>
60 #include <QtQuick/private/qquicktransition_p.h>
61 #include <QtLocation/private/qdeclarativegeomapitemgroup_p.h>
62 
63 QT_BEGIN_NAMESPACE
64 
65 class QAbstractItemModel;
66 class QQmlComponent;
67 class QQuickItem;
68 class QDeclarativeGeoMap;
69 class QDeclarativeGeoMapItemBase;
70 class QQmlOpenMetaObject;
71 class QQmlOpenMetaObjectType;
72 class MapItemViewDelegateIncubator;
73 class QDeclarativeGeoMapItemViewItemData;
74 class QDeclarativeGeoMapItemView;
75 class QDeclarativeGeoMapItemGroup;
76 
77 class Q_LOCATION_PRIVATE_EXPORT QDeclarativeGeoMapItemView : public QDeclarativeGeoMapItemGroup
78 {
79     Q_OBJECT
80 
81     Q_PROPERTY(QVariant model READ model WRITE setModel NOTIFY modelChanged)
82     Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
83     Q_PROPERTY(bool autoFitViewport READ autoFitViewport WRITE setAutoFitViewport NOTIFY autoFitViewportChanged)
84     Q_PROPERTY(QQuickTransition *add MEMBER m_enter REVISION 12)
85     Q_PROPERTY(QQuickTransition *remove MEMBER m_exit REVISION 12)
86     Q_PROPERTY(QList<QQuickItem *> mapItems READ mapItems REVISION 12)
87     Q_PROPERTY(bool incubateDelegates READ incubateDelegates WRITE setIncubateDelegates NOTIFY incubateDelegatesChanged REVISION 12)
88 
89 public:
90     explicit QDeclarativeGeoMapItemView(QQuickItem *parent = 0);
91     ~QDeclarativeGeoMapItemView();
92 
93     QVariant model() const;
94     void setModel(const QVariant &);
95 
96     QQmlComponent *delegate() const;
97     void setDelegate(QQmlComponent *);
98 
99     bool autoFitViewport() const;
100     void setAutoFitViewport(const bool &fit);
101 
102     void setMap(QDeclarativeGeoMap *);
103     void removeInstantiatedItems(bool transition = true);
104     void instantiateAllItems();
105 
106     void setIncubateDelegates(bool useIncubators);
107     bool incubateDelegates() const;
108 
109     QList<QQuickItem *> mapItems();
110 
111     // From QQmlParserStatus
112     void componentComplete() override;
113     void classBegin() override;
114 
115 Q_SIGNALS:
116     void modelChanged();
117     void delegateChanged();
118     void autoFitViewportChanged();
119     void incubateDelegatesChanged();
120 
121 private Q_SLOTS:
122     void destroyingItem(QObject *object);
123     void initItem(int index, QObject *object);
124     void createdItem(int index, QObject *object);
125     void modelUpdated(const QQmlChangeSet &changeSet, bool reset);
126     void exitTransitionFinished();
127 
128 private:
129     void fitViewport();
130     void removeDelegateFromMap(int index, bool transition = true);
131     void removeDelegateFromMap(QQuickItem *o);
132     void transitionItemOut(QQuickItem *o);
133     void terminateExitTransition(QQuickItem *o);
134     QQmlInstanceModel::ReleaseFlags disposeDelegate(QQuickItem *item);
135 
136     void insertInstantiatedItem(int index, QQuickItem *o, bool createdItem);
137     void addItemToMap(QDeclarativeGeoMapItemBase *item, int index, bool createdItem);
138     void addItemViewToMap(QDeclarativeGeoMapItemView *item, int index, bool createdItem);
139     void addItemGroupToMap(QDeclarativeGeoMapItemGroup *item, int index, bool createdItem);
140     void addDelegateToMap(QQuickItem *object, int index, bool createdItem = false);
141 
142     bool m_componentCompleted;
143     QQmlIncubator::IncubationMode m_incubationMode = QQmlIncubator::Asynchronous;
144     QQmlComponent *m_delegate;
145     QVariant m_itemModel;
146     QDeclarativeGeoMap *m_map;
147     QList<QQuickItem *> m_instantiatedItems;
148     bool m_fitViewport;
149     bool m_creatingObject = false;
150     QQmlDelegateModel *m_delegateModel;
151     QQuickTransition *m_enter = nullptr;
152     QQuickTransition *m_exit = nullptr;
153 
154     friend class QDeclarativeGeoMap;
155     friend class QDeclarativeGeoMapItemBase;
156     friend class QDeclarativeGeoMapItemTransitionManager;
157 };
158 
159 QT_END_NAMESPACE
160 
161 QML_DECLARE_TYPE(QDeclarativeGeoMapItemView)
162 
163 #endif
164