/** Base class for all items in the model. * Parent/children hierarchy is not based on QObject. */ class QgsDataItem : QObject { %TypeHeaderCode #include %End %ConvertToSubClassCode if (qobject_cast(sipCpp)) sipType = sipType_QgsLayerItem; else if (qobject_cast(sipCpp)) sipType = sipType_QgsErrorItem; else if (qobject_cast(sipCpp)) sipType = sipType_QgsDirectoryItem; else if (qobject_cast(sipCpp)) sipType = sipType_QgsFavoritesItem; else if (qobject_cast(sipCpp)) sipType = sipType_QgsZipItem; else if (qobject_cast(sipCpp)) sipType = sipType_QgsDataCollectionItem; else if (qobject_cast(sipCpp)) sipType = sipType_QgsProjectItem; else sipType = 0; %End public: enum Type { Collection, Directory, Layer, Error, Favorites, //!< Represents a favorite item Project //!< Represents a QGIS project }; /** Create new data item. */ QgsDataItem( QgsDataItem::Type type, QgsDataItem* parent /TransferThis/, const QString& name, const QString& path ); virtual ~QgsDataItem(); bool hasChildren(); int rowCount(); /** Create children. Children are not expected to have parent set. * This method MUST BE THREAD SAFE. */ virtual QVector createChildren() /Factory/; enum State { NotPopulated, //!< Children not yet created Populating, //!< Creating children in separate thread (populating or refreshing) Populated //!< children created }; //! @note added in 2.8 State state() const; /** Set item state. It also take care about starting/stopping loading icon animation. * @param state * @note added in 2.8 */ virtual void setState( State state ); /** Inserts a new child item. The child will be inserted at a position using an alphabetical order based on mName. * @param child child item to insert. Ownership is transferred, and item parent will be set and relevant connections made. * @param refresh - set to true to refresh populated item, emitting relevant signals to the model * @see deleteChildItem() */ virtual void addChildItem( QgsDataItem *child /Transfer/, bool refresh = false ); /** Removes and deletes a child item, emitting relevant signals to the model. * @param child child to remove. Item must exist as a current child. * @see addChildItem() */ virtual void deleteChildItem( QgsDataItem * child ); /** Removes a child item and returns it without deleting it. Emits relevant signals to model as required. * @param child child to remove * @returns pointer to the removed item or null if no such item was found */ virtual QgsDataItem *removeChildItem( QgsDataItem * child ) /TransferBack/; /** Returns true if this item is equal to another item (by testing item type and path). */ virtual bool equal( const QgsDataItem *other ); virtual QWidget *paramWidget() /Factory/; /** Returns the list of actions available for this item. This is usually used for the popup menu on right-clicking * the item. Subclasses should override this to provide actions. */ virtual QList actions(); /** Returns whether the item accepts drag and dropped layers - e.g. for importing a dataset to a provider. * Subclasses should override this and handleDrop() to accept dropped layers. * @see handleDrop() */ virtual bool acceptDrop(); /** Attempts to process the mime data dropped on this item. Subclasses must override this and acceptDrop() if they * accept dropped layers. * @see acceptDrop() */ virtual bool handleDrop( const QMimeData * /*data*/, Qt::DropAction /*action*/ ); /** Returns true if the item may be dragged. * Default implementation returns false. * A draggable item has to implement mimeUri() that will be used to pass data. * @see mimeUri() * @note added in 3.0 */ virtual bool hasDragEnabled() const; /** Return mime URI for the data item. * Items that return valid URI will be returned in mime data when dragging a selection from browser model. * @see hasDragEnabled() * @note added in 3.0 */ virtual QgsMimeDataUtils::Uri mimeUri() const; enum Capability { NoCapabilities, SetCrs, //!< Can set CRS on layer or group of layers Fertile, //!< Can create children. Even items without this capability may have children, but cannot create them, it means that children are created by item ancestors. Fast //!< 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 }; typedef QFlags Capabilities; // This will _write_ selected crs in data source virtual bool setCrs( const QgsCoordinateReferenceSystem& crs ); // ### QGIS 3 - rename to capabilities() virtual Capabilities capabilities2() const; virtual void setCapabilities( Capabilities capabilities ); // static methods // Find child index in vector of items using '==' operator static int findItem( QVector items, QgsDataItem * item ); // members Type type() const; /** Get item parent. QgsDataItem maintains its own items hierarchy, it does not use * QObject hierarchy. */ QgsDataItem* parent() const; /** Set item parent and connect / disconnect parent to / from item signals. * It does not add itself to parents children (mChildren) */ void setParent( QgsDataItem* parent ); QVector children() const; QIcon icon(); QString name() const; void setName( const QString &name ); QString path() const; void setPath( const QString ); //! Create path component replacing path separators static QString pathComponent( const QString &component ); // Because QIcon (QPixmap) must not be used in outside the GUI thread, it is // not possible to set mIcon in constructor. Either use mIconName/setIconName() // or implement icon(). void setIcon( const QIcon& icon ); void setIconName( const QString & iconName ); void setToolTip( const QString& msg ); QString toolTip() const; // deleteLater() items anc clear the vector static void deleteLater( QVector &items ); /** Move object and all its descendants to thread */ void moveToThread( QThread * targetThread ); protected: virtual void populate( const QVector& children ); virtual void refresh( const QVector& children ); /** The item is scheduled to be deleted. E.g. if deleteLater() is called when * item is in Populating state (createChildren() running in another thread), * the deferredDelete() returns true and item will be deleted once Populating finished. * Items with slow reateChildren() (for example network or database based) may * check during createChildren() if deferredDelete() returns true and return from * createChildren() immediately because result will be useless. */ bool deferredDelete(); public slots: /** Safely delete the item: * - disconnects parent * - unsets parent (but does not remove itself) * - deletes all its descendants recursively * - waits until Populating state (createChildren() in thread) finished without blocking main thread * - calls QObject::deleteLater() */ virtual void deleteLater(); // Populate children using children vector created by createChildren() // @param foreground run createChildren in foreground virtual void populate( bool foreground = false ); /** Remove children recursively and set as not populated. This is used when refreshing collapsed items. */ virtual void depopulate(); virtual void refresh(); virtual void childrenCreated(); signals: void beginInsertItems( QgsDataItem* parent, int first, int last ); void endInsertItems(); void beginRemoveItems( QgsDataItem* parent, int first, int last ); void endRemoveItems(); void dataChanged( QgsDataItem * item ); void stateChanged( QgsDataItem * item, QgsDataItem::State oldState ); protected slots: void updateIcon(); }; QFlags operator|(QgsDataItem::Capability f1, QFlags f2); /** Item that represents a layer that can be opened with one of the providers */ class QgsLayerItem : QgsDataItem { %TypeHeaderCode #include %End public: enum LayerType { NoType, Vector, Raster, Point, Line, Polygon, TableLayer, Database, Table, Plugin //!< added in 2.10 }; QgsLayerItem( QgsDataItem* parent, const QString& name, const QString& path, const QString& uri, LayerType layerType, const QString& providerKey ); // --- reimplemented from QgsDataItem --- virtual bool equal( const QgsDataItem *other ); virtual bool hasDragEnabled() const; virtual QgsMimeDataUtils::Uri mimeUri() const; // --- New virtual methods for layer item derived classes --- // Returns QgsMapLayer::LayerType QgsMapLayer::LayerType mapLayerType() const; // Returns layer uri or empty string if layer cannot be created QString uri() const; // Returns provider key QString providerKey() const; /** Returns the supported CRS * @note Added in 2.8 */ QStringList supportedCrs() const; /** Returns the supported formats * @note Added in 2.8 */ QStringList supportedFormats() const; /** Returns comments of the layer * @note added in 2.12 */ virtual QString comments() const; public: static QIcon iconPoint(); static QIcon iconLine(); static QIcon iconPolygon(); static QIcon iconTable(); static QIcon iconRaster(); static QIcon iconDefault(); virtual QString layerName() const; }; /** A Collection: logical collection of layers or subcollections, e.g. GRASS location/mapset, database? wms source? */ class QgsDataCollectionItem : QgsDataItem { %TypeHeaderCode #include %End public: QgsDataCollectionItem( QgsDataItem* parent, const QString& name, const QString& path = QString::null ); ~QgsDataCollectionItem(); void addChild( QgsDataItem *item /Transfer/ ); static QIcon iconDir(); // shared icon: open/closed directory static QIcon iconDataCollection(); // default icon for data collection }; /** A directory: contains subdirectories and layers */ class QgsDirectoryItem : QgsDataCollectionItem { %TypeHeaderCode #include %End public: enum Column { Name, Size, Date, Permissions, Owner, Group, Type }; QgsDirectoryItem( QgsDataItem* parent, const QString& name, const QString& path ); /** Constructor. * @param parent * @param name directory name * @param dirPath path to directory in file system * @param path item path in the tree, it may be dirPath or dirPath with some prefix, e.g. favorites: */ QgsDirectoryItem( QgsDataItem* parent, const QString& name, const QString& dirPath, const QString& path ); ~QgsDirectoryItem(); virtual void setState( State state ); QVector createChildren(); QString dirPath() const; virtual bool equal( const QgsDataItem *other ); virtual QIcon icon(); virtual QWidget *paramWidget() /Factory/; /* static QVector mProviders; */ //! @note not available via python bindings // static QVector mLibraries; /** Check if the given path is hidden from the browser model */ static bool hiddenPath( const QString& path ); public slots: virtual void childrenCreated(); void directoryChanged(); protected: void init(); }; /** Data item that can be used to represent QGIS projects. */ class QgsProjectItem : QgsDataItem { %TypeHeaderCode #include %End public: /** * @brief A data item holding a reference to a QGIS project file. * @param parent The parent data item. * @param name The name of the of the project. Displayed to the user. * @param path The full path to the project. */ QgsProjectItem( QgsDataItem* parent, const QString& name, const QString& path ); ~QgsProjectItem(); virtual bool hasDragEnabled() const; }; /** Data item that can be used to report problems (e.g. network error) */ class QgsErrorItem : QgsDataItem { %TypeHeaderCode #include %End public: QgsErrorItem( QgsDataItem* parent, const QString& error, const QString& path ); ~QgsErrorItem(); }; // --------- class QgsDirectoryParamWidget : QTreeWidget { %TypeHeaderCode #include %End public: QgsDirectoryParamWidget( const QString& path, QWidget* parent /TransferThis/ = NULL ); protected: void mousePressEvent( QMouseEvent* event ); public slots: void showHideColumn(); }; /** \ingroup core * Contains various Favorites directories * \note added in QGIS 3.0 */ class QgsFavoritesItem : QgsDataCollectionItem { %TypeHeaderCode #include %End public: /** * Constructor for QgsFavoritesItem. Accepts a path argument specifying the file path associated with * the item. */ QgsFavoritesItem( QgsDataItem* parent, const QString& name, const QString& path = QString() ); ~QgsFavoritesItem(); QVector createChildren(); /** * Adds a new directory to the favorites group. * @see removeDirectory() */ void addDirectory( const QString& directory ); /** * Removes an existing directory from the favorites group. * @see addDirectory() */ void removeDirectory( QgsDirectoryItem *item ); //! Icon for favorites group static QIcon iconFavorites(); }; /** A zip file: contains layers, using GDAL/OGR VSIFILE mechanism */ class QgsZipItem : QgsDataCollectionItem { %TypeHeaderCode #include %End public: QgsZipItem( QgsDataItem* parent, const QString& name, const QString& path ); ~QgsZipItem(); QVector createChildren(); QStringList getZipFileList(); //! @note not available via python bindings // static QVector mDataItemPtr; static QStringList sProviderNames; static QString vsiPrefix( const QString& uri ); static QgsDataItem* itemFromPath( QgsDataItem* parent, const QString& path, const QString& name ) /Factory/; //! @note available in python as itemFromFilePath static QgsDataItem* itemFromPath( QgsDataItem* parent, const QString& filePath, const QString& name, const QString& path ) /Factory,PyName=itemFromFilePath/; static QIcon iconZip(); };