Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsdataitem.h - Items representing data
3 : : -------------------
4 : : begin : 2011-04-01
5 : : copyright : (C) 2011 Radim Blazek
6 : : email : radim dot blazek at gmail dot com
7 : : ***************************************************************************/
8 : :
9 : : /***************************************************************************
10 : : * *
11 : : * This program is free software; you can redistribute it and/or modify *
12 : : * it under the terms of the GNU General Public License as published by *
13 : : * the Free Software Foundation; either version 2 of the License, or *
14 : : * (at your option) any later version. *
15 : : * *
16 : : ***************************************************************************/
17 : : #ifndef QGSDATAITEM_H
18 : : #define QGSDATAITEM_H
19 : :
20 : : #include "qgis_sip.h"
21 : : #include "qgis_core.h"
22 : : #include <QFileSystemWatcher>
23 : : #include <QFutureWatcher>
24 : : #include <QIcon>
25 : : #include <QObject>
26 : : #include <QPixmap>
27 : : #include <QString>
28 : : #include <QTreeWidget>
29 : : #include <QVector>
30 : : #include <QDateTime>
31 : :
32 : : #include "qgsmaplayer.h"
33 : : #include "qgscoordinatereferencesystem.h"
34 : : #include "qgsmimedatautils.h"
35 : : #include "qgswkbtypes.h"
36 : : #include "qgsabstractdatabaseproviderconnection.h"
37 : :
38 : : class QgsDataProvider;
39 : : class QgsDataItem;
40 : : class QgsAnimatedIcon;
41 : : class QgsBookmarkManager;
42 : :
43 : : typedef QgsDataItem *dataItem_t( QString, QgsDataItem * ) SIP_SKIP;
44 : :
45 : : /**
46 : : * \ingroup core
47 : : * \brief Base class for all items in the model.
48 : : *
49 : : * Parent/children hierarchy is not based on QObject.
50 : : */
51 : : class CORE_EXPORT QgsDataItem : public QObject
52 : : {
53 : :
54 : : #ifdef SIP_RUN
55 : : SIP_CONVERT_TO_SUBCLASS_CODE
56 : : if ( qobject_cast<QgsLayerItem *>( sipCpp ) )
57 : : sipType = sipType_QgsLayerItem;
58 : : else if ( qobject_cast<QgsErrorItem *>( sipCpp ) )
59 : : sipType = sipType_QgsErrorItem;
60 : : else if ( qobject_cast<QgsDirectoryItem *>( sipCpp ) )
61 : : sipType = sipType_QgsDirectoryItem;
62 : : else if ( qobject_cast<QgsFavoritesItem *>( sipCpp ) )
63 : : sipType = sipType_QgsFavoritesItem;
64 : : else if ( qobject_cast<QgsZipItem *>( sipCpp ) )
65 : : sipType = sipType_QgsZipItem;
66 : : else if ( qobject_cast<QgsDataCollectionItem *>( sipCpp ) )
67 : : sipType = sipType_QgsDataCollectionItem;
68 : : else if ( qobject_cast<QgsProjectItem *>( sipCpp ) )
69 : : sipType = sipType_QgsProjectItem;
70 : : else
71 : : sipType = 0;
72 : : SIP_END
73 : : #endif
74 : :
75 : : Q_OBJECT
76 : :
77 : : public:
78 : : enum Type
79 : : {
80 : : Collection,
81 : : Directory,
82 : : Layer,
83 : : Error,
84 : : Favorites, //!< Represents a favorite item
85 : : Project, //!< Represents a QGIS project
86 : : Custom, //!< Custom item type
87 : : Fields, //!< Collection of fields
88 : : Field, //!< Vector layer field
89 : : };
90 : :
91 : : Q_ENUM( Type )
92 : :
93 : : /**
94 : : * Constructor for QgsDataItem, with the specified \a parent item.
95 : : *
96 : : * The \a name argument specifies the text to show in the model for the item. A translated string should
97 : : * be used wherever appropriate.
98 : : *
99 : : * The \a path argument gives the item path in the browser tree. The \a path string can take any form,
100 : : * but QgsDataItem items pointing to different logical locations should always use a different item \a path.
101 : : *
102 : : * The optional \a providerKey string (added in QGIS 3.12) can be used to specify the key for the QgsDataItemProvider that created this item.
103 : : */
104 : : QgsDataItem( QgsDataItem::Type type, QgsDataItem *parent SIP_TRANSFERTHIS, const QString &name, const QString &path, const QString &providerKey = QString() );
105 : :
106 : : ~QgsDataItem() override;
107 : :
108 : : bool hasChildren();
109 : :
110 : : /**
111 : : * Returns TRUE if the data item is a collection of layers
112 : : * The default implementation returns FALSE, subclasses must implement this method if their children are layers.
113 : : * \since QGIS 3.14
114 : : */
115 : : virtual bool layerCollection() const;
116 : :
117 : : int rowCount();
118 : :
119 : : /**
120 : : * Create children. Children are not expected to have parent set.
121 : : * \warning This method MUST BE THREAD SAFE.
122 : : */
123 : : virtual QVector<QgsDataItem *> createChildren() SIP_TRANSFERBACK;
124 : : #ifdef SIP_RUN
125 : : SIP_VIRTUAL_CATCHER_CODE
126 : : PyObject *sipResObj = sipCallMethod( 0, sipMethod, "" );
127 : : // H = Convert a Python object to a mapped type instance.
128 : : // 5 = 1 (disallows the conversion of Py_None to NULL) + 4 (returns a copy of the C/C++ instance)
129 : : sipIsErr = !sipResObj || sipParseResult( 0, sipMethod, sipResObj, "H5", sipType_QVector_0101QgsDataItem, &sipRes ) < 0;
130 : : if ( !sipIsErr )
131 : : {
132 : : for ( QgsDataItem *item : sipRes )
133 : : {
134 : : PyObject *pyItem = sipGetPyObject( item, sipType_QgsDataItem );
135 : : if ( pyItem != NULL )
136 : : {
137 : : // pyItem is given an extra reference which is removed when the C++ instance’s destructor is called.
138 : : sipTransferTo( pyItem, Py_None );
139 : : }
140 : : }
141 : : }
142 : : if ( sipResObj != NULL )
143 : : {
144 : : Py_DECREF( sipResObj );
145 : : }
146 : : SIP_END
147 : : #endif
148 : :
149 : : enum State
150 : : {
151 : : NotPopulated, //!< Children not yet created
152 : : Populating, //!< Creating children in separate thread (populating or refreshing)
153 : : Populated //!< Children created
154 : : };
155 : 0 : Q_ENUM( State )
156 : :
157 : : //! \since QGIS 2.8
158 : : State state() const;
159 : :
160 : : /**
161 : : * Set item state. It also take care about starting/stopping loading icon animation.
162 : : * \param state
163 : : * \since QGIS 2.8
164 : : */
165 : : virtual void setState( State state );
166 : :
167 : : /**
168 : : * Inserts a new child item. The child will be inserted at a position using an alphabetical order based on mName.
169 : : * \param child child item to insert. Ownership is transferred, and item parent will be set and relevant connections made.
170 : : * \param refresh - set to TRUE to refresh populated item, emitting relevant signals to the model
171 : : * \see deleteChildItem()
172 : : */
173 : : virtual void addChildItem( QgsDataItem *child SIP_TRANSFER, bool refresh = false );
174 : :
175 : : /**
176 : : * Removes and deletes a child item, emitting relevant signals to the model.
177 : : * \param child child to remove. Item must exist as a current child.
178 : : * \see addChildItem()
179 : : */
180 : : virtual void deleteChildItem( QgsDataItem *child );
181 : :
182 : : /**
183 : : * Removes a child item and returns it without deleting it. Emits relevant signals to model as required.
184 : : * \param child child to remove
185 : : * \returns pointer to the removed item or NULLPTR if no such item was found
186 : : */
187 : : virtual QgsDataItem *removeChildItem( QgsDataItem *child ) SIP_TRANSFERBACK;
188 : :
189 : : /**
190 : : * Returns TRUE if this item is equal to another item (by testing item type and path).
191 : : */
192 : : virtual bool equal( const QgsDataItem *other );
193 : :
194 : : /**
195 : : * Returns source widget from data item for QgsBrowserPropertiesWidget
196 : : *
197 : : * Use QgsDataItemGuiProvider::createParamWidget() instead
198 : : *
199 : : * \deprecated QGIS 3.10
200 : : */
201 : : Q_DECL_DEPRECATED virtual QWidget *paramWidget() SIP_FACTORY SIP_DEPRECATED { return nullptr; }
202 : :
203 : : /**
204 : : * Returns the list of actions available for this item. This is usually used for the popup menu on right-clicking
205 : : * the item. Subclasses should override this to provide actions.
206 : : *
207 : : * Subclasses should ensure that ownership of created actions is correctly handled by parenting them
208 : : * to the specified parent widget.
209 : : */
210 : : virtual QList<QAction *> actions( QWidget *parent );
211 : :
212 : : /**
213 : : * Returns the list of menus available for this item. This is usually used for the popup menu on right-clicking
214 : : * the item. Subclasses should override this to provide actions. Subclasses should ensure that ownership of
215 : : * created menus is correctly handled by parenting them to the specified parent widget.
216 : : * \param parent a parent widget of the menu
217 : : * \returns list of menus
218 : : * \since QGIS 3.0
219 : : */
220 : : virtual QList<QMenu *> menus( QWidget *parent );
221 : :
222 : : /**
223 : : * Returns whether the item accepts drag and dropped layers - e.g. for importing a dataset to a provider.
224 : : * Subclasses should override this and handleDrop() to accept dropped layers.
225 : : * \see handleDrop()
226 : : * \see QgsDataItemGuiProvider::handleDrop()
227 : : *
228 : : * \deprecated QGIS 3.10
229 : : */
230 : : Q_DECL_DEPRECATED virtual bool acceptDrop() SIP_DEPRECATED { return false; }
231 : :
232 : : /**
233 : : * Attempts to process the mime data dropped on this item. Subclasses must override this and acceptDrop() if they
234 : : * accept dropped layers.
235 : : * \see acceptDrop()
236 : : * \see QgsDataItemGuiProvider::handleDrop()
237 : : *
238 : : * \deprecated QGIS 3.10
239 : : */
240 : : Q_DECL_DEPRECATED virtual bool handleDrop( const QMimeData * /*data*/, Qt::DropAction /*action*/ ) SIP_DEPRECATED { return false; }
241 : :
242 : : /**
243 : : * Called when a user double clicks on the item. Subclasses should return TRUE
244 : : * if they have implemented a double-click handler and do not want the default
245 : : * double-click behavior for items.
246 : : * \since QGIS 3.0
247 : : */
248 : : virtual bool handleDoubleClick();
249 : :
250 : : /**
251 : : * Returns TRUE if the item may be dragged.
252 : : * Default implementation returns FALSE.
253 : : * A draggable item has to implement mimeUris() that will be used to pass data.
254 : : * \see mimeUris()
255 : : * \since QGIS 3.0
256 : : */
257 : : virtual bool hasDragEnabled() const { return false; }
258 : :
259 : : /**
260 : : * Returns mime URI for the data item.
261 : : * Items that return valid URI will be returned in mime data when dragging a selection from browser model.
262 : : * \see hasDragEnabled()
263 : : * \deprecated since QGIS 3.18, use mimeUris() instead
264 : : * \since QGIS 3.0
265 : : */
266 : : Q_DECL_DEPRECATED virtual QgsMimeDataUtils::Uri mimeUri() const SIP_DEPRECATED;
267 : :
268 : : /**
269 : : * Returns mime URIs for the data item, most data providers will only return a single URI
270 : : * but some data collection items (e.g. GPKG, OGR) may report multiple URIs (e.g. for vector and
271 : : * raster layer types).
272 : : *
273 : : * Items that return valid URI will be returned in mime data when dragging a selection from browser model.
274 : : * \since QGIS 3.18
275 : : */
276 : : virtual QgsMimeDataUtils::UriList mimeUris() const { return QgsMimeDataUtils::UriList(); }
277 : :
278 : : enum Capability
279 : : {
280 : : NoCapabilities = 0,
281 : : SetCrs = 1 << 0, //!< Can set CRS on layer or group of layers. \deprecated since QGIS 3.6 -- no longer used by QGIS and will be removed in QGIS 4.0
282 : : Fertile = 1 << 1, //!< Can create children. Even items without this capability may have children, but cannot create them, it means that children are created by item ancestors.
283 : : Fast = 1 << 2, //!< CreateChildren() is fast enough to be run in main thread when refreshing items, most root items (wms,wfs,wcs,postgres...) are considered fast because they are reading data only from QgsSettings
284 : : Collapse = 1 << 3, //!< The collapse/expand status for this items children should be ignored in order to avoid undesired network connections (wms etc.)
285 : : Rename = 1 << 4, //!< Item can be renamed
286 : : Delete = 1 << 5, //!< Item can be deleted
287 : : };
288 : : Q_DECLARE_FLAGS( Capabilities, Capability )
289 : :
290 : : /**
291 : : * Writes the selected crs into data source. The original data source will be modified when calling this
292 : : * method.
293 : : *
294 : : * \deprecated since QGIS 3.6. This method is no longer used by QGIS and will be removed in QGIS 4.0.
295 : : */
296 : : Q_DECL_DEPRECATED virtual bool setCrs( const QgsCoordinateReferenceSystem &crs ) SIP_DEPRECATED
297 : : {
298 : : Q_UNUSED( crs )
299 : : return false;
300 : : }
301 : :
302 : : /**
303 : : * Sets a new \a name for the item, and returns TRUE if the item was successfully renamed.
304 : : *
305 : : * Items which implement this method should return the QgsDataItem::Rename capability.
306 : : *
307 : : * The default implementation does nothing.
308 : : *
309 : : * Use QgsDataItemGuiProvider:
310 : : *
311 : : * \since QGIS 3.4
312 : : * \deprecated QGIS 3.10
313 : : */
314 : : Q_DECL_DEPRECATED virtual bool rename( const QString &name ) SIP_DEPRECATED;
315 : :
316 : : // ### QGIS 4 - rename to capabilities()
317 : :
318 : : /**
319 : : * Returns the capabilities for the data item.
320 : : *
321 : : * \see setCapabilities()
322 : : */
323 : : virtual Capabilities capabilities2() const { return mCapabilities; }
324 : :
325 : : /**
326 : : * Sets the capabilities for the data item.
327 : : *
328 : : * \see capabilities2()
329 : : */
330 : : virtual void setCapabilities( Capabilities capabilities ) { mCapabilities = capabilities; }
331 : :
332 : : // static methods
333 : :
334 : : // Find child index in vector of items using '==' operator
335 : : static int findItem( QVector<QgsDataItem *> items, QgsDataItem *item );
336 : :
337 : : // members
338 : :
339 : 0 : Type type() const { return mType; }
340 : :
341 : : /**
342 : : * Gets item parent. QgsDataItem maintains its own items hierarchy, it does not use
343 : : * QObject hierarchy.
344 : : */
345 : 0 : QgsDataItem *parent() const { return mParent; }
346 : :
347 : : /**
348 : : * Set item parent and connect / disconnect parent to / from item signals.
349 : : * It does not add itself to parents children (mChildren)
350 : : */
351 : : void setParent( QgsDataItem *parent );
352 : 0 : QVector<QgsDataItem *> children() const { return mChildren; }
353 : : virtual QIcon icon();
354 : :
355 : : /**
356 : : * Returns the name of the item (the displayed text for the item).
357 : : *
358 : : * \see setName()
359 : : */
360 : 0 : QString name() const { return mName; }
361 : :
362 : : /**
363 : : * Sets the \a name of the item (the displayed text for the item).
364 : : *
365 : : * \see name()
366 : : */
367 : : void setName( const QString &name );
368 : :
369 : 0 : QString path() const { return mPath; }
370 : : void setPath( const QString &path ) { mPath = path; }
371 : :
372 : : /**
373 : : * Returns the provider key that created this item (e.g. "PostGIS")
374 : : *
375 : : * If key has a prefix "special:", it marks that the item was not created with a provider,
376 : : * but manually. For example "special:Favorites", "special:Home"
377 : : *
378 : : * \since QGIS 3.12
379 : : */
380 : : QString providerKey() const;
381 : :
382 : : /**
383 : : * Sets the provider key that created this item (e.g. "PostGIS")
384 : : *
385 : : * If key has a prefix "special:", it marks that the item was not created with a provider,
386 : : * but manually. For example "special:Favorites"
387 : : *
388 : : * \since QGIS 3.12
389 : : */
390 : : void setProviderKey( const QString &value );
391 : :
392 : : //! Create path component replacing path separators
393 : : static QString pathComponent( const QString &component );
394 : :
395 : : /**
396 : : * Returns the sorting key for the item. By default name() is returned,
397 : : * but setSortKey() can be used to set a custom sort key for the item.
398 : : *
399 : : * Alternatively subclasses can override this method to return a custom
400 : : * sort key.
401 : : *
402 : : * \see setSortKey()
403 : : * \since QGIS 3.0
404 : : */
405 : : virtual QVariant sortKey() const;
406 : :
407 : : /**
408 : : * Sets a custom sorting \a key for the item.
409 : : * \see sortKey()
410 : : * \since QGIS 3.0
411 : : */
412 : : void setSortKey( const QVariant &key );
413 : :
414 : :
415 : : // Because QIcon (QPixmap) must not be used in outside the GUI thread, it is
416 : : // not possible to set mIcon in constructor. Either use mIconName/setIconName()
417 : : // or implement icon().
418 : : void setIcon( const QIcon &icon ) { mIcon = icon; }
419 : : void setIconName( const QString &iconName ) { mIconName = iconName; }
420 : :
421 : 0 : void setToolTip( const QString &msg ) { mToolTip = msg; }
422 : 0 : QString toolTip() const { return mToolTip; }
423 : :
424 : : // deleteLater() items and clear the vector
425 : : static void deleteLater( QVector<QgsDataItem *> &items );
426 : :
427 : : //! Move object and all its descendants to thread
428 : : void moveToThread( QThread *targetThread );
429 : :
430 : : /**
431 : : * For data items that represent a DB connection or one of its children,
432 : : * this method returns a connection.
433 : : * All other data items will return NULL.
434 : : *
435 : : * Ownership of the returned objects is transferred to the caller.
436 : : *
437 : : * \since QGIS 3.16
438 : : */
439 : : virtual QgsAbstractDatabaseProviderConnection *databaseConnection() const SIP_FACTORY;
440 : :
441 : : protected:
442 : : virtual void populate( const QVector<QgsDataItem *> &children );
443 : :
444 : : /**
445 : : * Refresh the items from a specified list of child items.
446 : : */
447 : : virtual void refresh( const QVector<QgsDataItem *> &children );
448 : :
449 : : /**
450 : : * The item is scheduled to be deleted. E.g. if deleteLater() is called when
451 : : * item is in Populating state (createChildren() running in another thread),
452 : : * the deferredDelete() returns TRUE and item will be deleted once Populating finished.
453 : : * Items with slow reateChildren() (for example network or database based) may
454 : : * check during createChildren() if deferredDelete() returns TRUE and return from
455 : : * createChildren() immediately because result will be useless.
456 : : */
457 : 0 : bool deferredDelete() { return mDeferredDelete; }
458 : :
459 : : Type mType;
460 : : Capabilities mCapabilities;
461 : : QgsDataItem *mParent = nullptr;
462 : : QVector<QgsDataItem *> mChildren; // easier to have it always
463 : : State mState;
464 : : QString mName;
465 : : QString mProviderKey;
466 : : // Path is slash ('/') separated chain of item identifiers which are usually item names, but may be different if it is
467 : : // necessary to distinguish paths of two providers to the same source (e.g GRASS location and standard directory have the same
468 : : // name but different paths). Identifiers in path must not contain '/' characters.
469 : : // The path is used to identify item in tree.
470 : : QString mPath;
471 : : QString mToolTip;
472 : : QString mIconName;
473 : : QIcon mIcon;
474 : : QMap<QString, QIcon> mIconMap;
475 : :
476 : : //! Custom sort key. If invalid, name() will be used for sorting instead.
477 : : QVariant mSortKey;
478 : :
479 : : public slots:
480 : :
481 : : /**
482 : : * Safely delete the item:
483 : : *
484 : : * - disconnects parent
485 : : * - unsets parent (but does not remove itself)
486 : : * - deletes all its descendants recursively
487 : : * - waits until Populating state (createChildren() in thread) finished without blocking main thread
488 : : * - calls QObject::deleteLater()
489 : : */
490 : : virtual void deleteLater();
491 : :
492 : : // Populate children using children vector created by createChildren()
493 : : // \param foreground run createChildren in foreground
494 : : virtual void populate( bool foreground = false );
495 : :
496 : : //! Remove children recursively and set as not populated. This is used when refreshing collapsed items.
497 : : virtual void depopulate();
498 : :
499 : : virtual void refresh();
500 : :
501 : : /**
502 : : * Causes a data item provider to refresh all registered connections.
503 : : *
504 : : * If \a providerKey is specified then only the matching provider will be refreshed. Otherwise,
505 : : * all providers will be refreshed (which is potentially very expensive!).
506 : : */
507 : : virtual void refreshConnections( const QString &providerKey = QString() );
508 : :
509 : : virtual void childrenCreated();
510 : :
511 : : signals:
512 : : void beginInsertItems( QgsDataItem *parent, int first, int last );
513 : : void endInsertItems();
514 : : void beginRemoveItems( QgsDataItem *parent, int first, int last );
515 : : void endRemoveItems();
516 : : void dataChanged( QgsDataItem *item );
517 : : void stateChanged( QgsDataItem *item, QgsDataItem::State oldState );
518 : :
519 : : /**
520 : : * Emitted when the connections of the provider with the specified \a providerKey have changed.
521 : : *
522 : : * This signal is normally forwarded to the app in order to refresh the connection
523 : : * item in the provider dialogs and to refresh the connection items in the other
524 : : * open browsers.
525 : : */
526 : : void connectionsChanged( const QString &providerKey = QString() );
527 : :
528 : : protected slots:
529 : :
530 : : /**
531 : : * Will request a repaint of this icon.
532 : : *
533 : : * \since QGIS 3.0
534 : : */
535 : : void updateIcon();
536 : :
537 : : private:
538 : : static QVector<QgsDataItem *> runCreateChildren( QgsDataItem *item );
539 : :
540 : : // Set to true if object has to be deleted when possible (nothing running in threads)
541 : : bool mDeferredDelete;
542 : : QFutureWatcher< QVector <QgsDataItem *> > *mFutureWatcher;
543 : : // number of items currently in loading (populating) state
544 : : static QgsAnimatedIcon *sPopulatingIcon;
545 : : };
546 : :
547 : 0 : Q_DECLARE_OPERATORS_FOR_FLAGS( QgsDataItem::Capabilities )
548 : :
549 : : /**
550 : : * \ingroup core
551 : : * \brief Item that represents a layer that can be opened with one of the providers
552 : : */
553 : 0 : class CORE_EXPORT QgsLayerItem : public QgsDataItem
554 : : {
555 : : Q_OBJECT
556 : :
557 : : public:
558 : : enum LayerType
559 : : {
560 : : NoType,
561 : : Vector,
562 : : Raster,
563 : : Point,
564 : : Line,
565 : : Polygon,
566 : : TableLayer,
567 : : Database,
568 : : Table,
569 : : Plugin, //!< Added in 2.10
570 : : Mesh, //!< Added in 3.2
571 : : VectorTile, //!< Added in 3.14
572 : : PointCloud //!< Added in 3.18
573 : : };
574 : :
575 : : Q_ENUM( LayerType )
576 : :
577 : : QgsLayerItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &uri, LayerType layerType, const QString &providerKey );
578 : :
579 : : // --- reimplemented from QgsDataItem ---
580 : :
581 : : bool equal( const QgsDataItem *other ) override;
582 : :
583 : : bool hasDragEnabled() const override { return true; }
584 : :
585 : : QgsMimeDataUtils::UriList mimeUris() const override;
586 : :
587 : : // --- New virtual methods for layer item derived classes ---
588 : :
589 : : //! Returns QgsMapLayerType
590 : : QgsMapLayerType mapLayerType() const;
591 : :
592 : : /**
593 : : * Returns the layer item type corresponding to a QgsMapLayer \a layer.
594 : : * \since QGIS 3.6
595 : : */
596 : : static LayerType typeFromMapLayer( QgsMapLayer *layer );
597 : :
598 : : //! Returns layer uri or empty string if layer cannot be created
599 : 0 : QString uri() const { return mUri; }
600 : :
601 : : //! Returns provider key
602 : 0 : QString providerKey() const { return mProviderKey; }
603 : :
604 : : /**
605 : : * Returns the supported CRS
606 : : * \since QGIS 2.8
607 : : */
608 : 0 : QStringList supportedCrs() const { return mSupportedCRS; }
609 : :
610 : : /**
611 : : * Returns the supported formats
612 : : * \since QGIS 2.8
613 : : */
614 : 0 : QStringList supportedFormats() const { return mSupportFormats; }
615 : :
616 : : /**
617 : : * Returns comments of the layer
618 : : * \since QGIS 2.12
619 : : */
620 : : virtual QString comments() const { return QString(); }
621 : :
622 : : /**
623 : : * Returns the string representation of the given \a layerType
624 : : * \since QGIS 3
625 : : */
626 : : static QString layerTypeAsString( LayerType layerType );
627 : :
628 : : /**
629 : : * Returns the icon name of the given \a layerType
630 : : * \since QGIS 3
631 : : */
632 : : static QString iconName( LayerType layerType );
633 : :
634 : : /**
635 : : * Delete this layer item
636 : : * Use QgsDataItemGuiProvider::deleteLayer instead
637 : : *
638 : : * \deprecated QGIS 3.10
639 : : */
640 : : Q_DECL_DEPRECATED virtual bool deleteLayer() SIP_DEPRECATED;
641 : :
642 : : protected:
643 : : //! The URI
644 : : QString mUri;
645 : : //! The layer type
646 : : LayerType mLayerType;
647 : : //! The list of supported CRS
648 : : QStringList mSupportedCRS;
649 : : //! The list of supported formats
650 : : QStringList mSupportFormats;
651 : :
652 : : public:
653 : :
654 : : /**
655 : : * Returns the icon for a vector layer whose geometry type is provided.
656 : : * \since QGIS 3.18
657 : : */
658 : : static QIcon iconForWkbType( QgsWkbTypes::Type type );
659 : :
660 : : static QIcon iconPoint();
661 : : static QIcon iconLine();
662 : : static QIcon iconPolygon();
663 : : static QIcon iconTable();
664 : : static QIcon iconRaster();
665 : : static QIcon iconDefault();
666 : : //! Returns icon for mesh layer type
667 : : static QIcon iconMesh();
668 : : //! Returns icon for vector tile layer
669 : : static QIcon iconVectorTile();
670 : : //! Returns icon for point cloud layer
671 : : static QIcon iconPointCloud();
672 : : //! \returns the layer name
673 : : virtual QString layerName() const { return name(); }
674 : :
675 : : };
676 : :
677 : :
678 : : /**
679 : : * \ingroup core
680 : : * \brief A Collection: logical collection of layers or subcollections, e.g. GRASS location/mapset, database? wms source?
681 : : */
682 : : class CORE_EXPORT QgsDataCollectionItem : public QgsDataItem
683 : : {
684 : : Q_OBJECT
685 : : public:
686 : :
687 : : /**
688 : : * Constructor for QgsDataCollectionItem, with the specified \a parent item.
689 : : *
690 : : * The \a name argument specifies the text to show in the model for the item. A translated string should
691 : : * be used wherever appropriate.
692 : : *
693 : : * The \a path argument gives the item path in the browser tree. The \a path string can take any form,
694 : : * but QgsDataCollectionItem items pointing to different logical locations should always use a different item \a path.
695 : : *
696 : : * The optional \a providerKey string can be used to specify the key for the QgsDataItemProvider that created this item.
697 : : */
698 : : QgsDataCollectionItem( QgsDataItem *parent SIP_TRANSFERTHIS, const QString &name, const QString &path = QString(), const QString &providerKey = QString() );
699 : :
700 : : ~QgsDataCollectionItem() override;
701 : :
702 : : void addChild( QgsDataItem *item SIP_TRANSFER ) { mChildren.append( item ); }
703 : :
704 : : /**
705 : : * Returns the standard browser directory icon.
706 : : * \see iconDataCollection()
707 : : */
708 : : static QIcon iconDir();
709 : :
710 : : /**
711 : : * Returns the standard browser data collection icon.
712 : : * \see iconDir()
713 : : */
714 : : static QIcon iconDataCollection();
715 : :
716 : : QgsAbstractDatabaseProviderConnection *databaseConnection() const override;
717 : :
718 : : protected:
719 : :
720 : : /**
721 : : * Shared open directory icon.
722 : : * \since QGIS 3.4
723 : : */
724 : : static QIcon openDirIcon();
725 : :
726 : : /**
727 : : * Shared home directory icon.
728 : : * \since QGIS 3.4
729 : : */
730 : : static QIcon homeDirIcon();
731 : :
732 : : };
733 : :
734 : :
735 : : /**
736 : : * \ingroup core
737 : : * \brief A Collection that represents a database schema item
738 : : * \since QGIS 3.16
739 : : */
740 : : class CORE_EXPORT QgsDatabaseSchemaItem : public QgsDataCollectionItem
741 : : {
742 : : Q_OBJECT
743 : : public:
744 : :
745 : : /**
746 : : * Constructor for QgsDatabaseSchemaItem, with the specified \a parent item.
747 : : *
748 : : * The \a name argument specifies the text to show in the model for the item. A translated string should
749 : : * be used wherever appropriate.
750 : : *
751 : : * The \a path argument gives the item path in the browser tree. The \a path string can take any form,
752 : : * but QgsSchemaItem items pointing to different logical locations should always use a different item \a path.
753 : : *
754 : : * The optional \a providerKey string can be used to specify the key for the QgsDataItemProvider that created this item.
755 : : */
756 : : QgsDatabaseSchemaItem( QgsDataItem *parent SIP_TRANSFERTHIS, const QString &name, const QString &path = QString(), const QString &providerKey = QString() );
757 : :
758 : : ~QgsDatabaseSchemaItem() override;
759 : :
760 : : QgsAbstractDatabaseProviderConnection *databaseConnection() const override;
761 : :
762 : : /**
763 : : * Returns the standard browser data collection icon.
764 : : * \see iconDir()
765 : : */
766 : : static QIcon iconDataCollection();
767 : :
768 : : };
769 : :
770 : :
771 : :
772 : : /**
773 : : * \ingroup core
774 : : * \brief A Collection that represents a root group of connections from a single data provider
775 : : * \since QGIS 3.16
776 : : */
777 : : class CORE_EXPORT QgsConnectionsRootItem : public QgsDataCollectionItem
778 : : {
779 : : Q_OBJECT
780 : : public:
781 : :
782 : : /**
783 : : * Constructor for QgsConnectionsRootItem, with the specified \a parent item.
784 : : *
785 : : * The \a name argument specifies the text to show in the model for the item. A translated string should
786 : : * be used wherever appropriate.
787 : : *
788 : : * The \a path argument gives the item path in the browser tree. The \a path string can take any form,
789 : : * but QgsSchemaItem items pointing to different logical locations should always use a different item \a path.
790 : : *
791 : : * The optional \a providerKey string can be used to specify the key for the QgsDataItemProvider that created this item.
792 : : */
793 : : QgsConnectionsRootItem( QgsDataItem *parent SIP_TRANSFERTHIS, const QString &name, const QString &path = QString(), const QString &providerKey = QString() );
794 : :
795 : 0 : ~QgsConnectionsRootItem() override = default;
796 : : };
797 : :
798 : :
799 : : /**
800 : : * \ingroup core
801 : : * \brief A directory: contains subdirectories and layers
802 : : */
803 : : class CORE_EXPORT QgsDirectoryItem : public QgsDataCollectionItem
804 : : {
805 : : Q_OBJECT
806 : : public:
807 : :
808 : : /**
809 : : * Constructor for QgsDirectoryItem, with the specified \a parent item.
810 : : *
811 : : * The \a name argument specifies the text to show in the model for the item. This is usually
812 : : * the directory name, but in certain cases may differ for special directories (e.g. "Home").
813 : : * If a non-directory-name text is used, it should be a translated string when appropriate.
814 : : *
815 : : * The \a path argument specifies the directory path in the file system (e.g. "/home/gsherman/stuff"). A valid
816 : : * directory path must be specified.
817 : : */
818 : : QgsDirectoryItem( QgsDataItem *parent SIP_TRANSFERTHIS, const QString &name, const QString &path );
819 : :
820 : :
821 : : // TODO QGIS 4.0 -- rename "name" to "title" or "text" or something more descriptive, and "path" to something
822 : : // else to clarify the role of dirPath vs path
823 : :
824 : : /**
825 : : * Constructor for QgsDirectoryItem, with the specified \a parent item.
826 : : *
827 : : * The \a name argument specifies the text to show in the model for the item. This is usually
828 : : * the directory name, but in certain cases may differ for special directories (e.g. "Home").
829 : : * If a non-directory-name text is used, it should be a translated string when appropriate.
830 : : *
831 : : * The \a dirPath argument specifies the directory path in the file system (e.g. "/home/gsherman/stuff"). A valid
832 : : * directory path must be specified.
833 : : *
834 : : * The \a path argument gives the item path in the browser tree. The \a path string can take any form, but is usually
835 : : * the same as \a dirPath or \a dirPath with a prefix, e.g. "favorites:/home/gsherman/Downloads"). QgsDirectoryItem
836 : : * items pointing to different \a dirPaths should always use a different item \a path.
837 : : *
838 : : * The optional \a providerKey string can be used to specify the key for the QgsDataItemProvider that created this item.
839 : : */
840 : : QgsDirectoryItem( QgsDataItem *parent SIP_TRANSFERTHIS, const QString &name, const QString &dirPath, const QString &path, const QString &providerKey = QString() );
841 : :
842 : : void setState( State state ) override;
843 : :
844 : : QVector<QgsDataItem *> createChildren() override;
845 : :
846 : : /**
847 : : * Returns the full path to the directory the item represents.
848 : : */
849 : 0 : QString dirPath() const { return mDirPath; }
850 : :
851 : : bool equal( const QgsDataItem *other ) override;
852 : : QIcon icon() override;
853 : : Q_DECL_DEPRECATED QWidget *paramWidget() override SIP_FACTORY SIP_DEPRECATED;
854 : : bool hasDragEnabled() const override { return true; }
855 : : QgsMimeDataUtils::UriList mimeUris() const override;
856 : :
857 : : //! Check if the given path is hidden from the browser model
858 : : static bool hiddenPath( const QString &path );
859 : :
860 : : public slots:
861 : : void childrenCreated() override;
862 : : void directoryChanged();
863 : :
864 : : protected:
865 : : void init();
866 : : QString mDirPath;
867 : :
868 : : private:
869 : : QFileSystemWatcher *mFileSystemWatcher = nullptr;
870 : : bool mRefreshLater;
871 : : QDateTime mLastScan;
872 : : };
873 : :
874 : : /**
875 : : * \ingroup core
876 : : * \brief Data item that can be used to represent QGIS projects.
877 : : */
878 : : class CORE_EXPORT QgsProjectItem : public QgsDataItem
879 : : {
880 : : Q_OBJECT
881 : : public:
882 : :
883 : : /**
884 : : * \brief A data item holding a reference to a QGIS project file.
885 : : * \param parent The parent data item.
886 : : * \param name The name of the of the project. Displayed to the user.
887 : : * \param path The full path to the project.
888 : : * \param providerKey key of the provider that created this item
889 : : */
890 : : QgsProjectItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &providerKey = QString() );
891 : :
892 : : bool hasDragEnabled() const override { return true; }
893 : :
894 : : QgsMimeDataUtils::UriList mimeUris() const override;
895 : :
896 : : };
897 : :
898 : : /**
899 : : * \ingroup core
900 : : * \brief Data item that can be used to report problems (e.g. network error)
901 : : */
902 : : class CORE_EXPORT QgsErrorItem : public QgsDataItem
903 : : {
904 : : Q_OBJECT
905 : : public:
906 : :
907 : : QgsErrorItem( QgsDataItem *parent, const QString &error, const QString &path );
908 : :
909 : : };
910 : :
911 : : // ---------
912 : :
913 : : // TODO: move to qgis_gui for QGIS 4
914 : :
915 : : /**
916 : : * \ingroup core
917 : : * \class QgsDirectoryParamWidget
918 : : *
919 : : * \brief Browser parameter widget implementation for directory items.
920 : : */
921 : : class CORE_EXPORT QgsDirectoryParamWidget : public QTreeWidget
922 : : {
923 : 0 : Q_OBJECT
924 : :
925 : : public:
926 : : QgsDirectoryParamWidget( const QString &path, QWidget *parent SIP_TRANSFERTHIS = nullptr );
927 : :
928 : : protected:
929 : : void mousePressEvent( QMouseEvent *event ) override;
930 : :
931 : : public slots:
932 : : void showHideColumn();
933 : : };
934 : :
935 : : /**
936 : : * \ingroup core
937 : : * \brief Contains various Favorites directories
938 : : * \since QGIS 3.0
939 : : */
940 : : class CORE_EXPORT QgsFavoritesItem : public QgsDataCollectionItem
941 : : {
942 : : Q_OBJECT
943 : : public:
944 : :
945 : : /**
946 : : * Constructor for QgsFavoritesItem. Accepts a path argument specifying the file path associated with
947 : : * the item.
948 : : */
949 : : QgsFavoritesItem( QgsDataItem *parent, const QString &name, const QString &path = QString() );
950 : :
951 : : QVector<QgsDataItem *> createChildren() override;
952 : :
953 : : /**
954 : : * Adds a new \a directory to the favorites group.
955 : : *
956 : : * If \a name is specified, it will be used as the favorite's name. Otherwise
957 : : * the name will be set to match \a directory.
958 : : *
959 : : * \see removeDirectory()
960 : : */
961 : : void addDirectory( const QString &directory, const QString &name = QString() );
962 : :
963 : : /**
964 : : * Removes an existing directory from the favorites group.
965 : : * \see addDirectory()
966 : : */
967 : : void removeDirectory( QgsDirectoryItem *item );
968 : :
969 : : /**
970 : : * Renames the stored favorite with corresponding \a path a new \a name.
971 : : */
972 : : void renameFavorite( const QString &path, const QString &name );
973 : :
974 : : //! Icon for favorites group
975 : : static QIcon iconFavorites();
976 : :
977 : : QVariant sortKey() const override;
978 : :
979 : : private:
980 : : QVector<QgsDataItem *> createChildren( const QString &favDir, const QString &name );
981 : : };
982 : :
983 : : /**
984 : : * \ingroup core
985 : : * \brief A zip file: contains layers, using GDAL/OGR VSIFILE mechanism
986 : : */
987 : : class CORE_EXPORT QgsZipItem : public QgsDataCollectionItem
988 : : {
989 : : Q_OBJECT
990 : :
991 : : protected:
992 : : QString mFilePath;
993 : : QString mVsiPrefix;
994 : : QStringList mZipFileList;
995 : :
996 : : public:
997 : : //! Constructor
998 : : QgsZipItem( QgsDataItem *parent, const QString &name, const QString &path );
999 : :
1000 : : //! Constructor
1001 : : QgsZipItem( QgsDataItem *parent, const QString &name, const QString &filePath, const QString &path, const QString &providerKey = QString() );
1002 : :
1003 : : QVector<QgsDataItem *> createChildren() override;
1004 : : QStringList getZipFileList();
1005 : :
1006 : : //! \note not available via Python bindings
1007 : : static QVector<dataItem_t *> sDataItemPtr SIP_SKIP;
1008 : : static QStringList sProviderNames;
1009 : :
1010 : 187 : static QString vsiPrefix( const QString &uri ) { return qgsVsiPrefix( uri ); }
1011 : :
1012 : : /**
1013 : : * Creates a new data item from the specified path.
1014 : : */
1015 : : static QgsDataItem *itemFromPath( QgsDataItem *parent, const QString &path, const QString &name ) SIP_FACTORY;
1016 : :
1017 : : /**
1018 : : * Creates a new data item from the specified path.
1019 : : * \note available in Python as itemFromFilePath
1020 : : */
1021 : : static QgsDataItem *itemFromPath( QgsDataItem *parent, const QString &filePath, const QString &name, const QString &path ) SIP_FACTORY SIP_PYNAME( itemFromFilePath );
1022 : :
1023 : : static QIcon iconZip();
1024 : :
1025 : : private:
1026 : : void init();
1027 : : };
1028 : :
1029 : :
1030 : : /**
1031 : : * \ingroup core
1032 : : * \brief A collection of field items with some internal logic to retrieve
1033 : : * the fields and a the vector layer instance from a connection URI,
1034 : : * the schema and the table name.
1035 : : * \since QGIS 3.16
1036 : : */
1037 : : class CORE_EXPORT QgsFieldsItem : public QgsDataItem
1038 : : {
1039 : 0 : Q_OBJECT
1040 : :
1041 : : public:
1042 : :
1043 : : /**
1044 : : * Constructor for QgsFieldsItem, with the specified \a parent item.
1045 : : *
1046 : : * The \a path argument gives the item path in the browser tree. The \a path string can take any form,
1047 : : * but QgsDataItem items pointing to different logical locations should always use a different item \a path.
1048 : : * The \a connectionUri argument is the connection part of the layer URI that it is used internally to create
1049 : : * a connection and retrieve fields information.
1050 : : * The \a providerKey string can be used to specify the key for the QgsDataItemProvider that created this item.
1051 : : * The \a schema and \a tableName are used to retrieve the layer and field information from the \a connectionUri.
1052 : : */
1053 : : QgsFieldsItem( QgsDataItem *parent SIP_TRANSFERTHIS,
1054 : : const QString &path,
1055 : : const QString &connectionUri,
1056 : : const QString &providerKey,
1057 : : const QString &schema,
1058 : : const QString &tableName );
1059 : :
1060 : : ~QgsFieldsItem() override;
1061 : :
1062 : : QVector<QgsDataItem *> createChildren() override;
1063 : :
1064 : : QIcon icon() override;
1065 : :
1066 : : /**
1067 : : * Returns the schema name
1068 : : */
1069 : : QString schema() const;
1070 : :
1071 : : /**
1072 : : * Returns the table name
1073 : : */
1074 : : QString tableName() const;
1075 : :
1076 : : /**
1077 : : * Returns the connection URI
1078 : : */
1079 : : QString connectionUri() const;
1080 : :
1081 : : /**
1082 : : * Creates and returns a (possibly NULL) layer from the connection URI and schema/table information
1083 : : */
1084 : : QgsVectorLayer *layer() SIP_FACTORY;
1085 : :
1086 : : /**
1087 : : * Returns the (possibly NULL) properties of the table this fields belong to.
1088 : : * \since QGIS 3.16
1089 : : */
1090 : : QgsAbstractDatabaseProviderConnection::TableProperty *tableProperty() const;
1091 : :
1092 : : private:
1093 : :
1094 : : QString mSchema;
1095 : : QString mTableName;
1096 : : QString mConnectionUri;
1097 : : std::unique_ptr<QgsAbstractDatabaseProviderConnection::TableProperty> mTableProperty;
1098 : :
1099 : : };
1100 : :
1101 : :
1102 : : /**
1103 : : * \ingroup core
1104 : : * \brief A layer field item, information about the connection URI, the schema and the
1105 : : * table as well as the layer instance the field belongs to can be retrieved
1106 : : * from the parent QgsFieldsItem object.
1107 : : * \since QGIS 3.16
1108 : : */
1109 : : class CORE_EXPORT QgsFieldItem : public QgsDataItem
1110 : : {
1111 : : Q_OBJECT
1112 : : public:
1113 : :
1114 : : /**
1115 : : * Constructor for QgsFieldItem, with the specified \a parent item and \a field.
1116 : : * \note parent item must be a QgsFieldsItem
1117 : : */
1118 : : QgsFieldItem( QgsDataItem *parent SIP_TRANSFERTHIS,
1119 : : const QgsField &field );
1120 : :
1121 : : ~QgsFieldItem() override;
1122 : :
1123 : : QIcon icon() override;
1124 : :
1125 : : //QgsField field() const;
1126 : :
1127 : :
1128 : : private:
1129 : :
1130 : : const QgsField mField;
1131 : :
1132 : : };
1133 : :
1134 : :
1135 : :
1136 : : ///@cond PRIVATE
1137 : : #ifndef SIP_RUN
1138 : :
1139 : : /**
1140 : : * \ingroup core
1141 : : * \brief A directory item showing the current project directory.
1142 : : * \since QGIS 3.0
1143 : : */
1144 : : class CORE_EXPORT QgsProjectHomeItem : public QgsDirectoryItem
1145 : : {
1146 : : Q_OBJECT
1147 : :
1148 : : public:
1149 : :
1150 : : QgsProjectHomeItem( QgsDataItem *parent, const QString &name, const QString &dirPath, const QString &path );
1151 : :
1152 : : QIcon icon() override;
1153 : : QVariant sortKey() const override;
1154 : :
1155 : : };
1156 : :
1157 : : /**
1158 : : * \ingroup core
1159 : : * \brief A directory item showing the a single favorite directory.
1160 : : * \since QGIS 3.0
1161 : : */
1162 : : Q_NOWARN_DEPRECATED_PUSH // rename is deprecated
1163 : : class CORE_EXPORT QgsFavoriteItem : public QgsDirectoryItem
1164 : : {
1165 : : Q_OBJECT
1166 : :
1167 : : public:
1168 : :
1169 : : QgsFavoriteItem( QgsFavoritesItem *parent, const QString &name, const QString &dirPath, const QString &path );
1170 : :
1171 : : bool rename( const QString &name ) override;
1172 : :
1173 : : private:
1174 : :
1175 : : QgsFavoritesItem *mFavorites = nullptr;
1176 : : };
1177 : : Q_NOWARN_DEPRECATED_POP
1178 : :
1179 : : #endif
1180 : : ///@endcond
1181 : :
1182 : : #endif // QGSDATAITEM_H
1183 : :
1184 : :
|