Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsmaplayermodel.h 3 : : -------------------------------------- 4 : : Date : 01.04.2014 5 : : Copyright : (C) 2014 Denis Rouzaud 6 : : Email : denis.rouzaud@gmail.com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : 16 : : #ifndef QGSMAPLAYERMODEL_H 17 : : #define QGSMAPLAYERMODEL_H 18 : : 19 : : #include <QAbstractItemModel> 20 : : #include <QSortFilterProxyModel> 21 : : #include <QStringList> 22 : : 23 : : #include "qgis_core.h" 24 : : #include "qgis_sip.h" 25 : : 26 : : class QgsMapLayer; 27 : : class QgsProject; 28 : : 29 : : /** 30 : : * \ingroup core 31 : : * \brief The QgsMapLayerModel class is a model to display layers in widgets. 32 : : * \see QgsMapLayerProxyModel to sort and/filter the layers 33 : : * \see QgsFieldModel to combine in with a field selector. 34 : : * \since QGIS 2.3 35 : : */ 36 : : class CORE_EXPORT QgsMapLayerModel : public QAbstractItemModel 37 : : { 38 : 0 : Q_OBJECT 39 : : 40 : : Q_PROPERTY( bool allowEmptyLayer READ allowEmptyLayer WRITE setAllowEmptyLayer ) 41 : : Q_PROPERTY( bool showCrs READ showCrs WRITE setShowCrs ) 42 : : Q_PROPERTY( bool itemsCheckable READ itemsCheckable WRITE setItemsCheckable ) 43 : : Q_PROPERTY( QStringList additionalItems READ additionalItems WRITE setAdditionalItems ) 44 : : 45 : : public: 46 : : 47 : : //! Item data roles 48 : : enum ItemDataRole 49 : : { 50 : : LayerIdRole = Qt::UserRole + 1, //!< Stores the map layer ID 51 : : LayerRole, //!< Stores pointer to the map layer itself 52 : : EmptyRole, //!< True if index corresponds to the empty (not set) value 53 : : AdditionalRole, //!< True if index corresponds to an additional (non map layer) item 54 : : }; 55 : : Q_ENUM( ItemDataRole ) 56 : : 57 : : /** 58 : : * \brief QgsMapLayerModel creates a model to display layers in widgets. 59 : : * 60 : : * If a specific \a project is not specified then the QgsProject::instance() project will be used to 61 : : * populate the model. 62 : : */ 63 : : explicit QgsMapLayerModel( QObject *parent SIP_TRANSFERTHIS = nullptr, QgsProject *project = nullptr ); 64 : : 65 : : /** 66 : : * \brief QgsMapLayerModel creates a model to display a specific list of layers in a widget. 67 : : * 68 : : * If a specific \a project is not specified then the QgsProject::instance() project will be used to 69 : : * populate the model. 70 : : */ 71 : : explicit QgsMapLayerModel( const QList<QgsMapLayer *> &layers, QObject *parent = nullptr, QgsProject *project = nullptr ); 72 : : 73 : : /** 74 : : * \brief setItemsCheckable defines if layers should be selectable in the widget 75 : : */ 76 : : void setItemsCheckable( bool checkable ); 77 : : 78 : : /** 79 : : * Sets whether items in the model can be reordered via drag and drop. 80 : : * 81 : : * \see itemsCanBeReordered() 82 : : * \since QGIS 3.14 83 : : */ 84 : : void setItemsCanBeReordered( bool allow ); 85 : : 86 : : /** 87 : : * Returns TRUE if items in the model can be reordered via drag and drop. 88 : : * 89 : : * \see setItemsCanBeReordered() 90 : : * \since QGIS 3.14 91 : : */ 92 : : bool itemsCanBeReordered() const; 93 : : 94 : : /** 95 : : * \brief checkAll changes the checkstate for all the layers 96 : : */ 97 : : void checkAll( Qt::CheckState checkState ); 98 : : 99 : : /** 100 : : * Sets whether an optional empty layer ("not set") option is present in the model. 101 : : * \see allowEmptyLayer() 102 : : * \since QGIS 3.0 103 : : */ 104 : : void setAllowEmptyLayer( bool allowEmpty ); 105 : : 106 : : /** 107 : : * Returns TRUE if the model allows the empty layer ("not set") choice. 108 : : * \see setAllowEmptyLayer() 109 : : * \since QGIS 3.0 110 : : */ 111 : : bool allowEmptyLayer() const { return mAllowEmpty; } 112 : : 113 : : /** 114 : : * Sets whether the CRS of layers is also included in the model's display role. 115 : : * \see showCrs() 116 : : * \since QGIS 3.0 117 : : */ 118 : : void setShowCrs( bool showCrs ); 119 : : 120 : : /** 121 : : * Returns TRUE if the model includes layer's CRS in the display role. 122 : : * \see setShowCrs() 123 : : * \since QGIS 3.0 124 : : */ 125 : : bool showCrs() const { return mShowCrs; } 126 : : 127 : : /** 128 : : * \brief layersChecked returns the list of layers which are checked (or unchecked) 129 : : */ 130 : : QList<QgsMapLayer *> layersChecked( Qt::CheckState checkState = Qt::Checked ); 131 : : 132 : : /** 133 : : * Sets which layers are checked in the model. 134 : : */ 135 : : void setLayersChecked( const QList< QgsMapLayer * > &layers ); 136 : : 137 : : //! returns if the items can be checked or not 138 : : bool itemsCheckable() const { return mItemCheckable; } 139 : : 140 : : /** 141 : : * \brief indexFromLayer returns the model index for a given layer 142 : : * \see layerFromIndex() 143 : : */ 144 : : QModelIndex indexFromLayer( QgsMapLayer *layer ) const; 145 : : 146 : : /** 147 : : * Returns the map layer corresponding to the specified \a index. 148 : : * \see indexFromLayer() 149 : : * \since QGIS 3.0 150 : : */ 151 : : QgsMapLayer *layerFromIndex( const QModelIndex &index ) const; 152 : : 153 : : /** 154 : : * Sets a list of additional (non map layer) items to include at the end of the model. 155 : : * These may represent additional layers such as layers which are not included in the map 156 : : * layer registry, or paths to layers which have not yet been loaded into QGIS. 157 : : * \see additionalItems() 158 : : * \since QGIS 3.0 159 : : */ 160 : : void setAdditionalItems( const QStringList &items ); 161 : : 162 : : /** 163 : : * Returns the list of additional (non map layer) items included at the end of the model. 164 : : * \see setAdditionalItems() 165 : : * \since QGIS 3.0 166 : : */ 167 : : QStringList additionalItems() const { return mAdditionalItems; } 168 : : 169 : : // QAbstractItemModel interface 170 : : QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const override; 171 : : QModelIndex parent( const QModelIndex &child ) const override; 172 : : int rowCount( const QModelIndex &parent = QModelIndex() ) const override; 173 : : int columnCount( const QModelIndex &parent = QModelIndex() ) const override; 174 : : QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override; 175 : : bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ) override; 176 : : Qt::ItemFlags flags( const QModelIndex &index ) const override; 177 : : bool insertRows( int row, int count, const QModelIndex &parent = QModelIndex() ) override; 178 : : bool removeRows( int row, int count, const QModelIndex &parent = QModelIndex() ) override; 179 : : QStringList mimeTypes() const override; 180 : : bool canDropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent ) const override; 181 : : QMimeData *mimeData( const QModelIndexList &indexes ) const override; 182 : : bool dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent ) override; 183 : : Qt::DropActions supportedDropActions() const override; 184 : : 185 : : /** 186 : : * Returns strings for all roles supported by this model. 187 : : * 188 : : * \note Available only with Qt5 (Python and c++) 189 : : */ 190 : : QHash<int, QByteArray> roleNames() const override SIP_SKIP; 191 : : 192 : : /** 193 : : * Returns the icon corresponding to a specified map \a layer. 194 : : * \since QGIS 3.0 195 : : */ 196 : : static QIcon iconForLayer( QgsMapLayer *layer ); 197 : : 198 : : protected slots: 199 : : void removeLayers( const QStringList &layerIds ); 200 : : void addLayers( const QList<QgsMapLayer *> &layers ); 201 : : 202 : : protected: 203 : : QList<QgsMapLayer *> mLayers; 204 : : QMap<QString, Qt::CheckState> mLayersChecked; 205 : : bool mItemCheckable = false; 206 : : bool mCanReorder = false; 207 : : 208 : : QgsProject *mProject = nullptr; 209 : : 210 : : private: 211 : : 212 : : bool mAllowEmpty = false; 213 : : bool mShowCrs = false; 214 : : QStringList mAdditionalItems; 215 : : }; 216 : : 217 : : #endif // QGSMAPLAYERMODEL_H