QGIS API Documentation 3.99.0-Master (a8882ad4560)
Loading...
Searching...
No Matches
qgsdataitem.h
Go to the documentation of this file.
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.h"
21#include "qgis_core.h"
22#include "qgis_sip.h"
23#include "qgsmimedatautils.h"
24
25#include <QFutureWatcher>
26#include <QIcon>
27#include <QObject>
28
29class QgsDataItem;
30class QMenu;
32class QgsAnimatedIcon;
34
35class QAction;
36class QWidget;
37
39
46class CORE_EXPORT QgsDataItem : public QObject
47{
48 //SIP_TYPEHEADER_INCLUDE( "qgslayeritem.h" );
49 //SIP_TYPEHEADER_INCLUDE( "qgsdirectoryitem.h" );
50 //SIP_TYPEHEADER_INCLUDE( "qgsfavoritesitem.h" );
51 //SIP_TYPEHEADER_INCLUDE( "qgszipitem.h" );
52 //SIP_TYPEHEADER_INCLUDE( "qgsdatacollectionitem.h" );
53 //SIP_TYPEHEADER_INCLUDE( "qgsprojectitem.h" );
54
55#ifdef SIP_RUN
57 if ( qobject_cast<QgsLayerItem *>( sipCpp ) )
58 sipType = sipType_QgsLayerItem;
59 else if ( qobject_cast<QgsErrorItem *>( sipCpp ) )
60 sipType = sipType_QgsErrorItem;
61 else if ( qobject_cast<QgsDirectoryItem *>( sipCpp ) )
62 sipType = sipType_QgsDirectoryItem;
63 else if ( qobject_cast<QgsFavoritesItem *>( sipCpp ) )
64 sipType = sipType_QgsFavoritesItem;
65 else if ( qobject_cast<QgsZipItem *>( sipCpp ) )
66 sipType = sipType_QgsZipItem;
67 else if ( qobject_cast<QgsDataCollectionItem *>( sipCpp ) )
68 sipType = sipType_QgsDataCollectionItem;
69 else if ( qobject_cast<QgsProjectItem *>( sipCpp ) )
70 sipType = sipType_QgsProjectItem;
71 else
72 sipType = 0;
74#endif
75
76 Q_OBJECT
77
78 public:
79
91 QgsDataItem( Qgis::BrowserItemType type, QgsDataItem *parent SIP_TRANSFERTHIS, const QString &name, const QString &path, const QString &providerKey = QString() );
92
93 ~QgsDataItem() override;
94
95#ifdef SIP_RUN
96 SIP_PYOBJECT __repr__();
97 % MethodCode
98 QString str = u"<QgsDataItem: \"%1\" %2>"_s.arg( sipCpp->name(), sipCpp->path() );
99 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
100 % End
101#endif
102
106 bool hasChildren() const;
107
113 virtual bool layerCollection() const;
114
118 int rowCount() const;
119
124 virtual QVector<QgsDataItem *> createChildren() SIP_TRANSFERBACK;
125#ifdef SIP_RUN
127 PyObject *sipResObj = sipCallMethod( 0, sipMethod, "" );
128 // H = Convert a Python object to a mapped type instance.
129 // 5 = 1 (disallows the conversion of Py_None to NULL) + 4 (returns a copy of the C/C++ instance)
130 sipIsErr = !sipResObj || sipParseResult( 0, sipMethod, sipResObj, "H5", sipType_QVector_0101QgsDataItem, &sipRes ) < 0;
131 if ( !sipIsErr )
132 {
133 for ( QgsDataItem *item : sipRes )
134 {
135 PyObject *pyItem = sipGetPyObject( item, sipType_QgsDataItem );
136 if ( pyItem != NULL )
137 {
138 // pyItem is given an extra reference which is removed when the C++ instance’s destructor is called.
139 sipTransferTo( pyItem, Py_None );
140 }
141 }
142 }
143 if ( sipResObj != NULL )
144 {
145 Py_DECREF( sipResObj );
146 }
147 SIP_END
148#endif
149
167 int creatorAncestorDepth() const;
168
170
175 virtual void setState( Qgis::BrowserItemState state );
176
183 virtual void addChildItem( QgsDataItem *child SIP_TRANSFER, bool refresh = false );
184
190 virtual void deleteChildItem( QgsDataItem *child );
191
198
202 virtual bool equal( const QgsDataItem *other );
203
211 Q_DECL_DEPRECATED virtual QWidget *paramWidget() SIP_FACTORY SIP_DEPRECATED { return nullptr; }
212
220 virtual QList<QAction *> actions( QWidget *parent );
221
229 virtual QList<QMenu *> menus( QWidget *parent );
230
239 Q_DECL_DEPRECATED virtual bool acceptDrop() SIP_DEPRECATED { return false; }
240
241#ifdef __clang__
242#pragma clang diagnostic push
243#pragma clang diagnostic ignored "-Woverloaded-virtual"
244#endif
245
254 Q_DECL_DEPRECATED virtual bool handleDrop( const QMimeData * /*data*/, Qt::DropAction /*action*/ ) SIP_DEPRECATED { return false; }
255#ifdef __clang__
256#pragma clang diagnostic pop
257#endif
258
264 virtual bool handleDoubleClick();
265
272 virtual bool hasDragEnabled() const { return false; }
273
280 Q_DECL_DEPRECATED virtual QgsMimeDataUtils::Uri mimeUri() const SIP_DEPRECATED;
281
290 virtual QgsMimeDataUtils::UriList mimeUris() const;
291
298 Q_DECL_DEPRECATED virtual bool setCrs( const QgsCoordinateReferenceSystem &crs ) SIP_DEPRECATED;
299
312 Q_DECL_DEPRECATED virtual bool rename( const QString &name ) SIP_DEPRECATED;
313
314 // ### QGIS 5 - rename to capabilities()
315
321 virtual Qgis::BrowserItemCapabilities capabilities2() const { return mCapabilities; }
322
328 virtual void setCapabilities( Qgis::BrowserItemCapabilities capabilities ) SIP_PYNAME( setCapabilitiesV2 ) { mCapabilities = capabilities; }
329
333 Q_DECL_DEPRECATED void setCapabilities( int capabilities ) SIP_DEPRECATED;
334
335 // static methods
336
337 // Find child index in vector of items using '==' operator
338 static int findItem( QVector<QgsDataItem *> items, QgsDataItem *item );
339
340#ifndef SIP_RUN
341
347 template<class T>
348 static QList< T * > filteredItems( const QList< QgsDataItem * > &items )
349 {
350 QList< T * > result;
351 result.reserve( items.size() );
352 for ( QgsDataItem *item : items )
353 {
354 if ( T *matchedItem = qobject_cast< T * >( item ) )
355 result << matchedItem;
356 }
357 return result;
358 }
359#endif
360
361 // members
362
363 Qgis::BrowserItemType type() const { return mType; }
364
369 QgsDataItem *parent() const { return mParent; }
370
381 QgsDataItem *ancestorAtDepth( int depth ) const;
382
387 void setParent( QgsDataItem *parent );
388 QVector<QgsDataItem *> children() const { return mChildren; }
389 virtual QIcon icon();
390
396 QString name() const { return mName; }
397
403 void setName( const QString &name );
404
405 QString path() const { return mPath; }
406 void setPath( const QString &path ) { mPath = path; }
407
416 QString providerKey() const;
417
426 void setProviderKey( const QString &value );
427
429 static QString pathComponent( const QString &component );
430
440 virtual QVariant sortKey() const;
441
446 void setSortKey( const QVariant &key );
447
448
449 // Because QIcon (QPixmap) must not be used in outside the GUI thread, it is
450 // not possible to set mIcon in constructor. Either use mIconName/setIconName()
451 // or implement icon().
452 void setIcon( const QIcon &icon ) { mIcon = icon; }
453 void setIconName( const QString &iconName ) { mIconName = iconName; }
454
455 void setToolTip( const QString &msg ) { mToolTip = msg; }
456 QString toolTip() const { return mToolTip; }
457
458 // deleteLater() items and clear the vector
459 static void deleteLater( QVector<QgsDataItem *> &items );
460
462 void moveToThread( QThread *targetThread );
463
473 virtual QgsAbstractDatabaseProviderConnection *databaseConnection() const SIP_FACTORY;
474
475 // TODO should be private, but MSSQL data item provider is badly behaved and needs to
476 // manually manipulate this!
481
482 protected:
483 virtual void populate( const QVector<QgsDataItem *> &children );
484
488 virtual void refresh( const QVector<QgsDataItem *> &children );
489
500 bool deferredDelete() const { return mDeferredDelete; }
501
505 QVector<QgsDataItem *> mChildren; // easier to have it always
507 QString mName;
509 // Path is slash ('/') separated chain of item identifiers which are usually item names, but may be different if it is
510 // necessary to distinguish paths of two providers to the same source (e.g GRASS location and standard directory have the same
511 // name but different paths). Identifiers in path must not contain '/' characters.
512 // The path is used to identify item in tree.
513 QString mPath;
514 QString mToolTip;
515 QString mIconName;
516 QIcon mIcon;
517 QMap<QString, QIcon> mIconMap;
518
520 QVariant mSortKey;
521
522 public slots:
523
533 virtual void deleteLater();
534
535 // Populate children using children vector created by createChildren()
536 // \param foreground run createChildren in foreground
537 virtual void populate( bool foreground = false );
538
540 virtual void depopulate();
541
542 virtual void refresh();
543
550 virtual void refreshConnections( const QString &providerKey = QString() );
551
552 virtual void childrenCreated();
553
554 signals:
555
567 void beginInsertItems( QgsDataItem *parent, int first, int last );
568
577
589 void beginRemoveItems( QgsDataItem *parent, int first, int last );
590
599
604
609
617 void connectionsChanged( const QString &providerKey = QString() );
618
619 protected slots:
620
625 void updateIcon();
626
627 private:
628 static QVector<QgsDataItem *> runCreateChildren( QgsDataItem *item );
629
630 // Set to true if object has to be deleted when possible (nothing running in threads)
631 bool mDeferredDelete = false;
632 std::unique_ptr<QFutureWatcher<QVector<QgsDataItem *> >> mFutureWatcher;
633
634 // number of items currently in loading (populating) state
635 static QgsAnimatedIcon *sPopulatingIcon;
636};
637
642class CORE_EXPORT QgsErrorItem : public QgsDataItem
643{
644 Q_OBJECT
645 public:
646
647 QgsErrorItem( QgsDataItem *parent, const QString &error, const QString &path );
648
649#ifdef SIP_RUN
650 SIP_PYOBJECT __repr__();
651 % MethodCode
652 QString str = u"<QgsErrorItem: \"%1\" %2>"_s.arg( sipCpp->name(), sipCpp->path() );
653 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
654 % End
655#endif
656
657};
658
659#endif // QGSDATAITEM_H
660
661
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:59
BrowserItemState
Browser item states.
Definition qgis.h:945
@ NotPopulated
Children not yet created.
Definition qgis.h:946
@ NoCapabilities
Item has no capabilities.
Definition qgis.h:959
BrowserItemType
Browser item types.
Definition qgis.h:926
QFlags< BrowserItemCapability > BrowserItemCapabilities
Browser item capabilities.
Definition qgis.h:972
Provides common functionality for database based connections.
Animated icon is keeping an animation running if there are listeners connected to frameChanged.
Represents a coordinate reference system (CRS).
Base class for all items in the model.
Definition qgsdataitem.h:47
void stateChanged(QgsDataItem *item, Qgis::BrowserItemState oldState)
Emitted when an item's state is changed.
QString mToolTip
bool hasChildren() const
Returns whether this item has children.
QString mName
Qgis::BrowserItemType mType
int rowCount() const
Returns the number of rows of this item.
virtual void deleteChildItem(QgsDataItem *child)
Removes and deletes a child item, emitting relevant signals to the model.
QVector< QgsDataItem * > mChildren
int mCreatorAncestorDepth
Creator ancestor depth.
Qgis::BrowserItemState mState
void setToolTip(const QString &msg)
virtual Q_DECL_DEPRECATED bool handleDrop(const QMimeData *, Qt::DropAction)
Attempts to process the mime data dropped on this item.
virtual void refresh(const QVector< QgsDataItem * > &children)
Refresh the items from a specified list of child items.
void dataChanged(QgsDataItem *item)
Emitted when data changes for an item.
int creatorAncestorDepth() const
Returns the hierarchical depth of the item's original creator/source.
static void deleteLater(QVector< QgsDataItem * > &items)
void endRemoveItems()
Emitted after child items have been removed from this data item.
virtual bool layerCollection() const
Returns true if the data item is a collection of layers The default implementation returns false,...
QString mPath
QVector< QgsDataItem * > children() const
void beginRemoveItems(QgsDataItem *parent, int first, int last)
Emitted before child items are removed from this data item.
virtual Q_DECL_DEPRECATED bool acceptDrop()
Returns whether the item accepts drag and dropped layers - e.g.
Qgis::BrowserItemCapabilities mCapabilities
Qgis::BrowserItemType type() const
QgsDataItem(Qgis::BrowserItemType type, QgsDataItem *parent, const QString &name, const QString &path, const QString &providerKey=QString())
Constructor for QgsDataItem, with the specified parent item.
QString mIconName
virtual QVector< QgsDataItem * > createChildren()
Create children.
QMap< QString, QIcon > mIconMap
Qgis::BrowserItemState state() const
virtual void childrenCreated()
virtual QgsDataItem * removeChildItem(QgsDataItem *child)
Removes a child item and returns it without deleting it.
virtual bool hasDragEnabled() const
Returns true if the item may be dragged.
QVariant mSortKey
Custom sort key. If invalid, name() will be used for sorting instead.
void updateIcon()
Will request a repaint of this icon.
void connectionsChanged(const QString &providerKey=QString())
Emitted when the connections of the provider with the specified providerKey have changed.
QgsDataItem * mParent
QString name() const
Returns the name of the item (the displayed text for the item).
QString path() const
virtual QIcon icon()
virtual void setState(Qgis::BrowserItemState state)
Set item state.
void beginInsertItems(QgsDataItem *parent, int first, int last)
Emitted before child items are added to this data item.
virtual void refreshConnections(const QString &providerKey=QString())
Causes a data item provider to refresh all registered connections.
virtual void setCapabilities(Qgis::BrowserItemCapabilities capabilities)
Sets the capabilities for the data item.
virtual void addChildItem(QgsDataItem *child, bool refresh=false)
Inserts a new child item.
QString toolTip() const
QgsDataItem * parent() const
Gets item parent.
virtual Q_DECL_DEPRECATED QWidget * paramWidget()
Returns source widget from data item for QgsBrowserPropertiesWidget.
void setIcon(const QIcon &icon)
void setIconName(const QString &iconName)
void setPath(const QString &path)
QString providerKey() const
Returns the provider key that created this item (e.g.
void endInsertItems()
Emitted after child items have been added to this data item.
virtual Qgis::BrowserItemCapabilities capabilities2() const
Returns the capabilities for the data item.
QString mProviderKey
virtual void populate(const QVector< QgsDataItem * > &children)
virtual bool equal(const QgsDataItem *other)
Returns true if this item is equal to another item (by testing item type and path).
virtual void depopulate()
Remove children recursively and set as not populated. This is used when refreshing collapsed items.
bool deferredDelete() const
Returns true if the item is scheduled to be deleted.
static QList< T * > filteredItems(const QList< QgsDataItem * > &items)
Returns a filtered list of data items which match the template type.
QgsErrorItem(QgsDataItem *parent, const QString &error, const QString &path)
Contains utility functions for working with MIME data.
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition qgis_sip.h:199
#define SIP_DEPRECATED
Definition qgis_sip.h:114
#define SIP_TRANSFERTHIS
Definition qgis_sip.h:53
#define SIP_SKIP
Definition qgis_sip.h:134
#define SIP_PYNAME(name)
Definition qgis_sip.h:89
#define SIP_TRANSFER
Definition qgis_sip.h:36
#define SIP_TRANSFERBACK
Definition qgis_sip.h:48
#define SIP_FACTORY
Definition qgis_sip.h:84
#define SIP_VIRTUAL_CATCHER_CODE(code)
Definition qgis_sip.h:226
#define SIP_END
Definition qgis_sip.h:216
QgsDataItem * dataItem_t(QString, QgsDataItem *)
Definition qgsdataitem.h:38