Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgscptcityarchive.h
3 : : ---------------------
4 : : begin : August 2012
5 : : copyright : (C) 2009 by Martin Dobias
6 : : copyright : (C) 2012 by Etienne Tourigny
7 : : email : etourigny.dev at gmail.com
8 : : ***************************************************************************
9 : : * *
10 : : * This program is free software; you can redistribute it and/or modify *
11 : : * it under the terms of the GNU General Public License as published by *
12 : : * the Free Software Foundation; either version 2 of the License, or *
13 : : * (at your option) any later version. *
14 : : * *
15 : : ***************************************************************************/
16 : :
17 : : #ifndef QGSCPTCITYARCHIVE_H
18 : : #define QGSCPTCITYARCHIVE_H
19 : :
20 : : #include "qgis_core.h"
21 : : #include "qgis_sip.h"
22 : : #include "qgis.h"
23 : : #include "qgscolorramp.h"
24 : :
25 : : #include <QAbstractItemModel>
26 : : #include <QIcon>
27 : : #include <QMimeData>
28 : : #include <QAction>
29 : :
30 : : class QgsCptCityColorRamp;
31 : : class QgsCptCityDataItem;
32 : : class QgsCptCitySelectionItem;
33 : :
34 : : #define DEFAULT_CPTCITY_ARCHIVE "cpt-city-qgis-min"
35 : :
36 : : /**
37 : : * \class QgsCptCityArchive
38 : : * \ingroup core
39 : : */
40 : : class CORE_EXPORT QgsCptCityArchive
41 : : {
42 : : public:
43 : : QgsCptCityArchive( const QString &archiveName = DEFAULT_CPTCITY_ARCHIVE,
44 : : const QString &baseDir = QString() );
45 : : ~QgsCptCityArchive();
46 : :
47 : : //! QgsCptCityArchive cannot be copied
48 : : QgsCptCityArchive( const QgsCptCityArchive &rh ) = delete;
49 : : //! QgsCptCityArchive cannot be copied
50 : : QgsCptCityArchive &operator=( const QgsCptCityArchive &rh ) = delete;
51 : :
52 : : // basic dir info
53 : : QString baseDir() const;
54 : : static QString baseDir( QString archiveName );
55 : : static QString defaultBaseDir();
56 : : void setBaseDir( const QString &dirName ) { mBaseDir = dirName; }
57 : :
58 : : // collection + selection info
59 : : QString copyingFileName( const QString &dirName ) const;
60 : : QString descFileName( const QString &dirName ) const;
61 : : static QString findFileName( const QString &target, const QString &startDir, const QString &baseDir );
62 : : static QMap< QString, QString > copyingInfo( const QString &fileName );
63 : : static QMap< QString, QString > description( const QString &fileName );
64 : : //! \note not available in Python bindings
65 : : static QMap< double, QPair<QColor, QColor> > gradientColorMap( const QString &fileName ) SIP_SKIP;
66 : :
67 : : // archive management
68 : : bool isEmpty();
69 : : QString archiveName() const { return mArchiveName; }
70 : : static void initArchives( bool loadAll = false );
71 : : static void initArchive( const QString &archiveName, const QString &archiveBaseDir );
72 : : static void initDefaultArchive();
73 : : static void clearArchives();
74 : : static QgsCptCityArchive *defaultArchive();
75 : : static QMap< QString, QgsCptCityArchive * > archiveRegistry();
76 : :
77 : : // items
78 : 0 : QVector< QgsCptCityDataItem * > rootItems() const { return mRootItems; }
79 : 0 : QVector< QgsCptCityDataItem * > selectionItems() const { return mSelectionItems; }
80 : :
81 : : private:
82 : :
83 : : QString mArchiveName;
84 : : QString mBaseDir;
85 : : // root items, namely directories at root of archive
86 : : QVector< QgsCptCityDataItem * > mRootItems;
87 : : QVector<QgsCptCityDataItem *> mSelectionItems;
88 : :
89 : : private:
90 : : #ifdef SIP_RUN
91 : : QgsCptCityArchive( const QgsCptCityArchive &rh );
92 : : #endif
93 : :
94 : : };
95 : :
96 : : /**
97 : : * Base class for all items in the model
98 : : * \ingroup core
99 : : */
100 : 0 : class CORE_EXPORT QgsCptCityDataItem : public QObject
101 : : {
102 : : Q_OBJECT
103 : : public:
104 : : enum Type
105 : : {
106 : : ColorRamp,
107 : : Collection,
108 : : Directory,
109 : : Selection,
110 : : AllRamps
111 : : };
112 : :
113 : : QgsCptCityDataItem( QgsCptCityDataItem::Type type, QgsCptCityDataItem *parent,
114 : : const QString &name, const QString &path );
115 : :
116 : : bool hasChildren();
117 : :
118 : : int rowCount();
119 : : // retrieve total count of "leaf" items (all children which are end nodes)
120 : : virtual int leafCount() const;
121 : :
122 : : //
123 : :
124 : : virtual void refresh();
125 : :
126 : : // Create vector of children
127 : : virtual QVector<QgsCptCityDataItem *> createChildren();
128 : :
129 : : // Populate children using children vector created by createChildren()
130 : : virtual void populate();
131 : 0 : bool isPopulated() { return mPopulated; }
132 : :
133 : : // Insert new child using alphabetical order based on mName, emits necessary signal to model before and after, sets parent and connects signals
134 : : // refresh - refresh populated item, emit signals to model
135 : : virtual void addChildItem( QgsCptCityDataItem *child SIP_TRANSFER, bool refresh = false );
136 : :
137 : : // remove and delete child item, signals to browser are emitted
138 : : virtual void deleteChildItem( QgsCptCityDataItem *child );
139 : :
140 : : // remove child item but don't delete it, signals to browser are emitted
141 : : // returns pointer to the removed item or null if no such item was found
142 : : virtual QgsCptCityDataItem *removeChildItem( QgsCptCityDataItem *child ) SIP_TRANSFERBACK;
143 : :
144 : : virtual bool equal( const QgsCptCityDataItem *other );
145 : :
146 : : virtual QWidget *paramWidget() SIP_FACTORY { return nullptr; }
147 : :
148 : : // list of actions provided by this item - usually used for popup menu on right-click
149 : : virtual QList<QAction *> actions() { return QList<QAction *>(); }
150 : :
151 : : // whether accepts drag&drop'd layers - e.g. for import
152 : : virtual bool acceptDrop() { return false; }
153 : :
154 : : // try to process the data dropped on this item
155 : : virtual bool handleDrop( const QMimeData * /*data*/, Qt::DropAction /*action*/ ) { return false; }
156 : :
157 : : // static methods
158 : :
159 : : // Find child index in vector of items using '==' operator
160 : : static int findItem( QVector<QgsCptCityDataItem *> items, QgsCptCityDataItem *item );
161 : :
162 : : // members
163 : :
164 : 0 : Type type() const { return mType; }
165 : 0 : QgsCptCityDataItem *parent() const { return mParent; }
166 : 0 : void setParent( QgsCptCityDataItem *parent ) { mParent = parent; }
167 : 0 : QVector<QgsCptCityDataItem *> children() const { return mChildren; }
168 : : virtual QIcon icon() { return mIcon; }
169 : : virtual QIcon icon( QSize size ) { Q_UNUSED( size ) return icon(); }
170 : 0 : QString name() const { return mName; }
171 : 0 : QString path() const { return mPath; }
172 : 0 : QString info() const { return mInfo; }
173 : : QString shortInfo() const { return mShortInfo; }
174 : :
175 : : void setIcon( const QIcon &icon ) { mIcon = icon; }
176 : :
177 : : void setToolTip( const QString &msg ) { mToolTip = msg; }
178 : 0 : QString toolTip() const { return mToolTip; }
179 : :
180 : 0 : bool isValid() { return mValid; }
181 : :
182 : : protected:
183 : :
184 : : Type mType;
185 : : QgsCptCityDataItem *mParent = nullptr;
186 : : QVector<QgsCptCityDataItem *> mChildren; // easier to have it always
187 : : bool mPopulated;
188 : : QString mName;
189 : : QString mPath; // it is also used to identify item in tree
190 : : QString mInfo;
191 : : QString mShortInfo;
192 : : QString mToolTip;
193 : : QIcon mIcon;
194 : : bool mValid;
195 : :
196 : : signals:
197 : : void beginInsertItems( QgsCptCityDataItem *parent, int first, int last );
198 : : void endInsertItems();
199 : : void beginRemoveItems( QgsCptCityDataItem *parent, int first, int last );
200 : : void endRemoveItems();
201 : : };
202 : :
203 : : /**
204 : : * Item that represents a layer that can be opened with one of the providers
205 : : * \ingroup core
206 : : */
207 : : class CORE_EXPORT QgsCptCityColorRampItem : public QgsCptCityDataItem
208 : : {
209 : 0 : Q_OBJECT
210 : : public:
211 : : QgsCptCityColorRampItem( QgsCptCityDataItem *parent,
212 : : const QString &name, const QString &path,
213 : : const QString &variantName = QString(),
214 : : bool initialize = false );
215 : : QgsCptCityColorRampItem( QgsCptCityDataItem *parent,
216 : : const QString &name, const QString &path,
217 : : const QStringList &variantList,
218 : : bool initialize = false );
219 : :
220 : : // --- reimplemented from QgsCptCityDataItem ---
221 : :
222 : : bool equal( const QgsCptCityDataItem *other ) override;
223 : : int leafCount() const override { return 1; }
224 : :
225 : : // --- New virtual methods for layer item derived classes ---
226 : 0 : const QgsCptCityColorRamp &ramp() const { return mRamp; }
227 : : QIcon icon() override;
228 : : QIcon icon( QSize size ) override;
229 : : void init();
230 : :
231 : : protected:
232 : :
233 : : bool mInitialized;
234 : : QgsCptCityColorRamp mRamp;
235 : : QList< QIcon > mIcons;
236 : : };
237 : :
238 : :
239 : : /**
240 : : * A Collection: logical collection of subcollections and color ramps
241 : : * \ingroup core
242 : : */
243 : : class CORE_EXPORT QgsCptCityCollectionItem : public QgsCptCityDataItem
244 : : {
245 : : Q_OBJECT
246 : : public:
247 : : QgsCptCityCollectionItem( QgsCptCityDataItem *parent,
248 : : const QString &name, const QString &path );
249 : : ~QgsCptCityCollectionItem() override;
250 : :
251 : : void setPopulated() { mPopulated = true; }
252 : : void addChild( QgsCptCityDataItem *item SIP_TRANSFER ) { mChildren.append( item ); }
253 : : QVector<QgsCptCityDataItem *> childrenRamps( bool recursive );
254 : :
255 : : protected:
256 : : bool mPopulatedRamps;
257 : : };
258 : :
259 : : /**
260 : : * A directory: contains subdirectories and color ramps
261 : : * \ingroup core
262 : : */
263 : : class CORE_EXPORT QgsCptCityDirectoryItem : public QgsCptCityCollectionItem
264 : : {
265 : : Q_OBJECT
266 : : public:
267 : : QgsCptCityDirectoryItem( QgsCptCityDataItem *parent,
268 : : const QString &name, const QString &path );
269 : :
270 : : QVector<QgsCptCityDataItem *> createChildren() override;
271 : :
272 : : bool equal( const QgsCptCityDataItem *other ) override;
273 : :
274 : : static QgsCptCityDataItem *dataItem( QgsCptCityDataItem *parent,
275 : : const QString &name, const QString &path );
276 : :
277 : : protected:
278 : : QMap< QString, QStringList > rampsMap();
279 : : QStringList dirEntries() const;
280 : : QMap< QString, QStringList > mRampsMap;
281 : : };
282 : :
283 : : /**
284 : : * \ingroup core
285 : : * \class QgsCptCitySelectionItem
286 : : * \brief A selection: contains subdirectories and color ramps
287 : : */
288 : : class CORE_EXPORT QgsCptCitySelectionItem : public QgsCptCityCollectionItem
289 : : {
290 : : Q_OBJECT
291 : : public:
292 : : QgsCptCitySelectionItem( QgsCptCityDataItem *parent, const QString &name, const QString &path );
293 : :
294 : : QVector<QgsCptCityDataItem *> createChildren() override;
295 : :
296 : : bool equal( const QgsCptCityDataItem *other ) override;
297 : :
298 : 0 : QStringList selectionsList() const { return mSelectionsList; }
299 : :
300 : : protected:
301 : : void parseXml();
302 : : QStringList mSelectionsList;
303 : : };
304 : :
305 : : /**
306 : : * \ingroup core
307 : : * \brief An "All ramps item", which contains all items in a flat hierarchy
308 : : */
309 : : class CORE_EXPORT QgsCptCityAllRampsItem : public QgsCptCityCollectionItem
310 : : {
311 : : Q_OBJECT
312 : : public:
313 : : QgsCptCityAllRampsItem( QgsCptCityDataItem *parent, const QString &name,
314 : : const QVector<QgsCptCityDataItem *> &items );
315 : :
316 : : QVector<QgsCptCityDataItem *> createChildren() override;
317 : :
318 : : protected:
319 : : QVector<QgsCptCityDataItem *> mItems;
320 : : };
321 : :
322 : : /**
323 : : * \ingroup core
324 : : * \class QgsCptCityBrowserModel
325 : : */
326 : : class CORE_EXPORT QgsCptCityBrowserModel : public QAbstractItemModel
327 : : {
328 : 0 : Q_OBJECT
329 : :
330 : : public:
331 : :
332 : : enum ViewType
333 : : {
334 : : Authors = 0,
335 : : Selections = 1,
336 : : List = 2 // not used anymore
337 : : };
338 : :
339 : : QgsCptCityBrowserModel( QObject *parent SIP_TRANSFERTHIS = nullptr,
340 : : QgsCptCityArchive *archive = QgsCptCityArchive::defaultArchive(),
341 : : ViewType Type = Authors );
342 : : ~QgsCptCityBrowserModel() override;
343 : :
344 : : // implemented methods from QAbstractItemModel for read-only access
345 : : Qt::ItemFlags flags( const QModelIndex &index ) const override;
346 : : QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
347 : : QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
348 : : int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
349 : : int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
350 : : QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const override;
351 : :
352 : : QModelIndex findItem( QgsCptCityDataItem *item, QgsCptCityDataItem *parent = nullptr ) const;
353 : :
354 : : QModelIndex parent( const QModelIndex &index ) const override;
355 : :
356 : : //! Returns a list of mime that can describe model indexes
357 : : /* virtual QStringList mimeTypes() const; */
358 : :
359 : : //! Returns an object that contains serialized items of data corresponding to the list of indexes specified
360 : : /* virtual QMimeData * mimeData( const QModelIndexList &indexes ) const; */
361 : :
362 : : //! Handles the data supplied by a drag and drop operation that ended with the given action
363 : : /* virtual bool dropMimeData( const QMimeData * data, Qt::DropAction action, int row, int column, const QModelIndex & parent ); */
364 : :
365 : : QgsCptCityDataItem *dataItem( const QModelIndex &idx ) const;
366 : :
367 : : bool hasChildren( const QModelIndex &parent = QModelIndex() ) const override;
368 : :
369 : : // Reload the whole model
370 : : void reload();
371 : :
372 : : // Refresh item specified by path
373 : : void refresh( const QString &path );
374 : :
375 : : // Refresh item children
376 : : void refresh( const QModelIndex &index = QModelIndex() );
377 : :
378 : : //! Returns index of a path
379 : : QModelIndex findPath( const QString &path );
380 : :
381 : : void connectItem( QgsCptCityDataItem *item );
382 : :
383 : : bool canFetchMore( const QModelIndex &parent ) const override;
384 : : void fetchMore( const QModelIndex &parent ) override;
385 : :
386 : : signals:
387 : :
388 : : public slots:
389 : : //void removeItems( QgsCptCityDataItem * parent, QVector<QgsCptCityDataItem *>items );
390 : : //void addItems( QgsCptCityDataItem * parent, QVector<QgsCptCityDataItem *>items );
391 : : //void refreshItems( QgsCptCityDataItem * parent, QVector<QgsCptCityDataItem *>items );
392 : :
393 : : void beginInsertItems( QgsCptCityDataItem *parent, int first, int last );
394 : : void endInsertItems();
395 : : void beginRemoveItems( QgsCptCityDataItem *parent, int first, int last );
396 : : void endRemoveItems();
397 : :
398 : : protected:
399 : :
400 : : // populates the model
401 : : void addRootItems();
402 : : void removeRootItems();
403 : :
404 : : QVector<QgsCptCityDataItem *> mRootItems;
405 : : QgsCptCityArchive *mArchive = nullptr;
406 : : ViewType mViewType;
407 : : QSize mIconSize;
408 : : };
409 : :
410 : : // clazy:excludeall=qstring-allocations
411 : :
412 : : #endif
|