Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslayoutmanager.h 3 : : ------------------ 4 : : Date : January 2017 5 : : Copyright : (C) 2017 Nyall Dawson 6 : : Email : nyall dot dawson at gmail dot 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 QGSLAYOUTMANAGER_H 17 : : #define QGSLAYOUTMANAGER_H 18 : : 19 : : #include "qgis_core.h" 20 : : #include "qgis_sip.h" 21 : : #include "qgsmasterlayoutinterface.h" 22 : : #include <QObject> 23 : : #include <QAbstractListModel> 24 : : #include <QSortFilterProxyModel> 25 : : 26 : : class QgsProject; 27 : : class QgsPrintLayout; 28 : : class QgsStyleEntityVisitorInterface; 29 : : 30 : : /** 31 : : * \ingroup core 32 : : * \class QgsLayoutManager 33 : : * 34 : : * \brief Manages storage of a set of layouts. 35 : : * 36 : : * QgsLayoutManager handles the storage, serializing and deserializing 37 : : * of print layouts and reports. Usually this class is not constructed directly, but 38 : : * rather accessed through a QgsProject via QgsProject::layoutManager(). 39 : : * 40 : : * QgsLayoutManager retains ownership of all the layouts contained 41 : : * in the manager. 42 : : * \since QGIS 3.0 43 : : */ 44 : : class CORE_EXPORT QgsLayoutManager : public QObject 45 : : { 46 : 0 : Q_OBJECT 47 : : 48 : : public: 49 : : 50 : : /** 51 : : * Constructor for QgsLayoutManager. The project will become the parent object for this 52 : : * manager. 53 : : */ 54 : : explicit QgsLayoutManager( QgsProject *project SIP_TRANSFERTHIS = nullptr ); 55 : : 56 : : ~QgsLayoutManager() override; 57 : : 58 : : /** 59 : : * Adds a \a layout to the manager. Ownership of the layout is transferred to the manager. 60 : : * Returns TRUE if the addition was successful, or FALSE if the layout could not be added (eg 61 : : * as a result of a duplicate layout name). 62 : : * \see removeLayout() 63 : : * \see layoutAdded() 64 : : */ 65 : : bool addLayout( QgsMasterLayoutInterface *layout SIP_TRANSFER ); 66 : : 67 : : /** 68 : : * Removes a \a layout from the manager. The layout is deleted. 69 : : * Returns TRUE if the removal was successful, or FALSE if the removal failed (eg as a result 70 : : * of removing a layout which is not contained in the manager). 71 : : * \see addLayout() 72 : : * \see layoutRemoved() 73 : : * \see layoutAboutToBeRemoved() 74 : : * \see clear() 75 : : */ 76 : : bool removeLayout( QgsMasterLayoutInterface *layout ); 77 : : 78 : : /** 79 : : * Removes and deletes all layouts from the manager. 80 : : * \see removeLayout() 81 : : */ 82 : : void clear(); 83 : : 84 : : /** 85 : : * Returns a list of all layouts contained in the manager. 86 : : */ 87 : : QList< QgsMasterLayoutInterface * > layouts() const; 88 : : 89 : : /** 90 : : * Returns a list of all print layouts contained in the manager. 91 : : */ 92 : : QList< QgsPrintLayout * > printLayouts() const; 93 : : 94 : : /** 95 : : * Returns the layout with a matching name, or NULLPTR if no matching layouts 96 : : * were found. 97 : : */ 98 : : QgsMasterLayoutInterface *layoutByName( const QString &name ) const; 99 : : 100 : : /** 101 : : * Reads the manager's state from a DOM element, restoring all layouts 102 : : * present in the XML document. 103 : : * \see writeXml() 104 : : */ 105 : : bool readXml( const QDomElement &element, const QDomDocument &doc ); 106 : : 107 : : /** 108 : : * Returns a DOM element representing the state of the manager. 109 : : * \see readXml() 110 : : */ 111 : : QDomElement writeXml( QDomDocument &doc ) const; 112 : : 113 : : /** 114 : : * Duplicates an existing \a layout from the manager. The new 115 : : * layout will automatically be stored in the manager. 116 : : * Returns the new layout if duplication was successful. 117 : : */ 118 : : QgsMasterLayoutInterface *duplicateLayout( const QgsMasterLayoutInterface *layout, const QString &newName ); 119 : : 120 : : /** 121 : : * Generates a unique title for a new layout of the specified \a type, which does not 122 : : * clash with any already contained by the manager. 123 : : */ 124 : : QString generateUniqueTitle( QgsMasterLayoutInterface::Type type = QgsMasterLayoutInterface::PrintLayout ) const; 125 : : 126 : : /** 127 : : * Accepts the specified style entity \a visitor, causing it to visit all style entities associated 128 : : * within the contained layouts. 129 : : * 130 : : * Returns TRUE if the visitor should continue visiting other objects, or FALSE if visiting 131 : : * should be canceled. 132 : : * 133 : : * \since QGIS 3.10 134 : : */ 135 : : bool accept( QgsStyleEntityVisitorInterface *visitor ) const; 136 : : 137 : : signals: 138 : : 139 : : //! Emitted when a layout is about to be added to the manager 140 : : void layoutAboutToBeAdded( const QString &name ); 141 : : 142 : : //! Emitted when a layout has been added to the manager 143 : : void layoutAdded( const QString &name ); 144 : : 145 : : //! Emitted when a layout was removed from the manager 146 : : void layoutRemoved( const QString &name ); 147 : : 148 : : //! Emitted when a layout is about to be removed from the manager 149 : : void layoutAboutToBeRemoved( const QString &name ); 150 : : 151 : : //! Emitted when a layout is renamed 152 : : void layoutRenamed( QgsMasterLayoutInterface *layout, const QString &newName ); 153 : : 154 : : private: 155 : : 156 : : QgsProject *mProject = nullptr; 157 : : 158 : : QList< QgsMasterLayoutInterface * > mLayouts; 159 : : 160 : : }; 161 : : 162 : : 163 : : /** 164 : : * \ingroup core 165 : : * \class QgsLayoutManagerModel 166 : : * 167 : : * \brief List model representing the print layouts and reports available in a 168 : : * layout manager. 169 : : * 170 : : * \since QGIS 3.8 171 : : */ 172 : : class CORE_EXPORT QgsLayoutManagerModel : public QAbstractListModel 173 : : { 174 : 0 : Q_OBJECT 175 : : 176 : : public: 177 : : 178 : : //! Custom model roles 179 : : enum Role 180 : : { 181 : : LayoutRole = Qt::UserRole + 1, //!< Layout object 182 : : }; 183 : : 184 : : /** 185 : : * Constructor for QgsLayoutManagerModel, showing the layouts from the specified \a manager. 186 : : */ 187 : : explicit QgsLayoutManagerModel( QgsLayoutManager *manager, QObject *parent SIP_TRANSFERTHIS = nullptr ); 188 : : 189 : : int rowCount( const QModelIndex &parent ) const override; 190 : : QVariant data( const QModelIndex &index, int role ) const override; 191 : : bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ) override; 192 : : Qt::ItemFlags flags( const QModelIndex &index ) const override; 193 : : 194 : : /** 195 : : * Returns the layout at the corresponding \a index. 196 : : * \see indexFromLayout() 197 : : */ 198 : : QgsMasterLayoutInterface *layoutFromIndex( const QModelIndex &index ) const; 199 : : 200 : : /** 201 : : * Returns the model index corresponding to a \a layout. 202 : : * \see layoutFromIndex() 203 : : */ 204 : : QModelIndex indexFromLayout( QgsMasterLayoutInterface *layout ) const; 205 : : 206 : : /** 207 : : * Sets whether an optional empty layout ("not set") option is present in the model. 208 : : * \see allowEmptyLayout() 209 : : */ 210 : : void setAllowEmptyLayout( bool allowEmpty ); 211 : : 212 : : /** 213 : : * Returns TRUE if the model allows the empty layout ("not set") choice. 214 : : * \see setAllowEmptyLayout() 215 : : */ 216 : 0 : bool allowEmptyLayout() const { return mAllowEmpty; } 217 : : 218 : : private slots: 219 : : void layoutAboutToBeAdded( const QString &name ); 220 : : void layoutAboutToBeRemoved( const QString &name ); 221 : : void layoutAdded( const QString &name ); 222 : : void layoutRemoved( const QString &name ); 223 : : void layoutRenamed( QgsMasterLayoutInterface *layout, const QString &newName ); 224 : : private: 225 : : QgsLayoutManager *mLayoutManager = nullptr; 226 : : bool mAllowEmpty = false; 227 : : }; 228 : : 229 : : 230 : : /** 231 : : * \ingroup core 232 : : * \class QgsLayoutManagerProxyModel 233 : : * 234 : : * \brief QSortFilterProxyModel subclass for QgsLayoutManagerModel 235 : : * 236 : : * \since QGIS 3.8 237 : : */ 238 : : class CORE_EXPORT QgsLayoutManagerProxyModel : public QSortFilterProxyModel 239 : : { 240 : : Q_OBJECT 241 : : 242 : : public: 243 : : 244 : : //! Available filter flags for filtering the model 245 : : enum Filter 246 : : { 247 : : FilterPrintLayouts = 1 << 1, //!< Includes print layouts 248 : : FilterReports = 1 << 2, //!< Includes reports 249 : : }; 250 : : Q_DECLARE_FLAGS( Filters, Filter ) 251 : : Q_FLAG( Filters ) 252 : : 253 : : /** 254 : : * Constructor for QgsLayoutManagerProxyModel. 255 : : */ 256 : : explicit QgsLayoutManagerProxyModel( QObject *parent SIP_TRANSFERTHIS = nullptr ); 257 : : bool lessThan( const QModelIndex &left, const QModelIndex &right ) const override; 258 : : bool filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent ) const override; 259 : : 260 : : /** 261 : : * Returns the current filters used for filtering available layouts. 262 : : * 263 : : * \see setFilters() 264 : : */ 265 : : QgsLayoutManagerProxyModel::Filters filters() const; 266 : : 267 : : /** 268 : : * Sets the current \a filters used for filtering available layouts. 269 : : * 270 : : * \see filters() 271 : : */ 272 : : void setFilters( QgsLayoutManagerProxyModel::Filters filters ); 273 : : 274 : : /** 275 : : * Returns the current filter string, if set. 276 : : * 277 : : * \see setFilterString() 278 : : * \since QGIS 3.12 279 : : */ 280 : : QString filterString() const { return mFilterString; } 281 : : 282 : : public slots: 283 : : 284 : : /** 285 : : * Sets a \a filter string, such that only layouts with names containing the 286 : : * specified string will be shown. 287 : : * 288 : : * \see filterString() 289 : : * \since QGIS 3.12 290 : : */ 291 : : void setFilterString( const QString &filter ); 292 : : 293 : : private: 294 : : 295 : : Filters mFilters = Filters( FilterPrintLayouts | FilterReports ); 296 : : 297 : : QString mFilterString; 298 : : }; 299 : : 300 : : Q_DECLARE_OPERATORS_FOR_FLAGS( QgsLayoutManagerProxyModel::Filters ) 301 : : 302 : : #endif // QGSLAYOUTMANAGER_H