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