Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslayoutguidecollection.h 3 : : -------------------------- 4 : : begin : July 2017 5 : : copyright : (C) 2017 by Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 7 : : ***************************************************************************/ 8 : : /*************************************************************************** 9 : : * * 10 : : * This program is free software; you can redistribute it and/or modify * 11 : : * it under the terms of the GNU General Public License as published by * 12 : : * the Free Software Foundation; either version 2 of the License, or * 13 : : * (at your option) any later version. * 14 : : * * 15 : : ***************************************************************************/ 16 : : #ifndef QGSLAYOUTGUIDECOLLECTION_H 17 : : #define QGSLAYOUTGUIDECOLLECTION_H 18 : : 19 : : #include "qgis_core.h" 20 : : #include "qgslayoutmeasurement.h" 21 : : #include "qgslayoutpoint.h" 22 : : #include "qgslayoutitempage.h" 23 : : #include "qgslayoutserializableobject.h" 24 : : #include <QPen> 25 : : #include <QAbstractListModel> 26 : : #include <QSortFilterProxyModel> 27 : : #include <QGraphicsLineItem> 28 : : #include <memory> 29 : : 30 : : class QgsLayout; 31 : : class QgsLayoutPageCollection; 32 : : class QDomElement; 33 : : class QDomDocument; 34 : : class QgsReadWriteContext; 35 : : 36 : : /** 37 : : * \ingroup core 38 : : * \class QgsLayoutGuide 39 : : * \brief Contains the configuration for a single snap guide used by a layout. 40 : : * \since QGIS 3.0 41 : : */ 42 : : class CORE_EXPORT QgsLayoutGuide : public QObject 43 : : { 44 : : 45 : : Q_OBJECT 46 : : 47 : : public: 48 : : 49 : : /** 50 : : * Constructor for a new guide with the specified \a orientation and 51 : : * initial \a position. 52 : : * 53 : : * A layout must be set by calling setLayout() before the guide can be used. 54 : : * Adding the guide to a QgsLayoutGuideCollection will automatically set 55 : : * the corresponding layout for you. 56 : : */ 57 : : QgsLayoutGuide( Qt::Orientation orientation, QgsLayoutMeasurement position, QgsLayoutItemPage *page ); 58 : : 59 : : ~QgsLayoutGuide() override; 60 : : 61 : : /** 62 : : * Returns the layout the guide belongs to. 63 : : * \see setLayout() 64 : : */ 65 : : QgsLayout *layout() const; 66 : : 67 : : /** 68 : : * Sets the \a layout the guide belongs to. 69 : : * 70 : : * \note Adding the guide to a QgsLayoutGuideCollection will automatically set 71 : : * the corresponding layout for you. 72 : : * 73 : : * \see layout() 74 : : */ 75 : : void setLayout( QgsLayout *layout ); 76 : : 77 : : /** 78 : : * Returns the guide's orientation. 79 : : */ 80 : : Qt::Orientation orientation() const; 81 : : 82 : : /** 83 : : * Returns the guide's position within the page. 84 : : * 85 : : * The position indicates either the horizontal or vertical position 86 : : * of the guide, depending on the guide's orientation(). 87 : : * 88 : : * \see setPosition() 89 : : */ 90 : : QgsLayoutMeasurement position() const; 91 : : 92 : : /** 93 : : * Sets the guide's \a position within the page. 94 : : * 95 : : * The \a position argument indicates either the horizontal or vertical position 96 : : * of the guide, depending on the guide's orientation(). 97 : : * 98 : : * \see position() 99 : : */ 100 : : void setPosition( QgsLayoutMeasurement position ); 101 : : 102 : : /** 103 : : * Returns the page the guide is contained within. 104 : : * 105 : : * \see setPage() 106 : : */ 107 : : QgsLayoutItemPage *page(); 108 : : 109 : : /** 110 : : * Sets the \a page the guide is contained within. 111 : : * 112 : : * \see page() 113 : : */ 114 : : void setPage( QgsLayoutItemPage *page ); 115 : : 116 : : /** 117 : : * Updates the position of the guide's line item. 118 : : */ 119 : : void update(); 120 : : 121 : : /** 122 : : * Returns the guide's line item. 123 : : */ 124 : : QGraphicsLineItem *item(); 125 : : 126 : : /** 127 : : * Returns the guide's position in absolute layout units. 128 : : * \see setLayoutPosition() 129 : : */ 130 : : double layoutPosition() const; 131 : : 132 : : /** 133 : : * Sets the guide's \a position in absolute layout units. 134 : : * \see layoutPosition() 135 : : */ 136 : : void setLayoutPosition( double position ); 137 : : 138 : : signals: 139 : : 140 : : /** 141 : : * Emitted when the guide's position is changed. 142 : : */ 143 : : void positionChanged(); 144 : : 145 : : private: 146 : : 147 : : Qt::Orientation mOrientation = Qt::Vertical; 148 : : 149 : : //! Horizontal/vertical position of guide on page 150 : : QgsLayoutMeasurement mPosition; 151 : : 152 : : //! Page 153 : : QPointer< QgsLayoutItemPage > mPage; 154 : : 155 : : QPointer< QgsLayout > mLayout; 156 : : 157 : : //! Line item used in scene for guide 158 : : QGraphicsLineItem *mLineItem = nullptr; 159 : : 160 : : }; 161 : : 162 : : /** 163 : : * \ingroup core 164 : : * \class QgsLayoutGuideCollection 165 : : * \brief Stores and manages the snap guides used by a layout. 166 : : * \since QGIS 3.0 167 : : */ 168 : : class CORE_EXPORT QgsLayoutGuideCollection : public QAbstractTableModel, public QgsLayoutSerializableObject 169 : : { 170 : : 171 : 0 : Q_OBJECT 172 : : 173 : : public: 174 : : 175 : : //! Model roles 176 : : enum Roles 177 : : { 178 : : OrientationRole = Qt::UserRole, //!< Guide orientation role 179 : : PositionRole, //!< Guide position role 180 : : UnitsRole, //!< Guide position units role 181 : : PageRole, //!< Guide page role 182 : : LayoutPositionRole, //!< Guide position in layout coordinates 183 : : }; 184 : : 185 : : /** 186 : : * Constructor for QgsLayoutGuideCollection belonging to the specified layout, 187 : : * and linked to the specified \a pageCollection. 188 : : */ 189 : : QgsLayoutGuideCollection( QgsLayout *layout, QgsLayoutPageCollection *pageCollection ); 190 : : ~QgsLayoutGuideCollection() override; 191 : : 192 : : QString stringType() const override { return QStringLiteral( "LayoutGuideCollection" ); } 193 : : QgsLayout *layout() override; 194 : : 195 : : int rowCount( const QModelIndex & ) const override; 196 : : int columnCount( const QModelIndex & ) const override; 197 : : QVariant data( const QModelIndex &index, int role ) const override; 198 : : bool setData( const QModelIndex &index, const QVariant &value, int role ) override; 199 : : Qt::ItemFlags flags( const QModelIndex &index ) const override; 200 : : QVariant headerData( int section, Qt::Orientation orientation, 201 : : int role = Qt::DisplayRole ) const override; 202 : : bool removeRows( int row, int count, const QModelIndex &parent = QModelIndex() ) override; 203 : : 204 : : /** 205 : : * Adds a \a guide to the collection. Ownership of the guide is transferred to the 206 : : * collection, and the guide will automatically have the correct layout 207 : : * set. 208 : : */ 209 : : void addGuide( QgsLayoutGuide *guide SIP_TRANSFER ); 210 : : 211 : : /** 212 : : * Removes the specified \a guide, and deletes it. 213 : : * \see clear() 214 : : */ 215 : : void removeGuide( QgsLayoutGuide *guide ); 216 : : 217 : : /** 218 : : * Sets the absolute \a position (in layout coordinates) for \a guide within the layout. 219 : : */ 220 : : void setGuideLayoutPosition( QgsLayoutGuide *guide, double position ); 221 : : 222 : : /** 223 : : * Removes all guides from the collection. 224 : : * \see removeGuide() 225 : : */ 226 : : void clear(); 227 : : 228 : : /** 229 : : * Resets all other pages' guides to match the guides from the specified \a sourcePage. 230 : : */ 231 : : void applyGuidesToAllOtherPages( int sourcePage ); 232 : : 233 : : /** 234 : : * Updates the position (and visibility) of all guide line items. 235 : : */ 236 : : void update(); 237 : : 238 : : /** 239 : : * Returns a list of all guides contained in the collection. 240 : : */ 241 : : QList< QgsLayoutGuide * > guides(); 242 : : 243 : : /** 244 : : * Returns the list of guides contained in the collection with the specified 245 : : * \a orientation and on a matching \a page. 246 : : * If \a page is -1, guides from all pages will be returned. 247 : : * \see guidesOnPage() 248 : : */ 249 : : QList< QgsLayoutGuide * > guides( Qt::Orientation orientation, int page = -1 ); 250 : : 251 : : /** 252 : : * Returns the list of guides contained on a matching \a page. 253 : : * \see guides() 254 : : */ 255 : : QList< QgsLayoutGuide * > guidesOnPage( int page ); 256 : : 257 : : /** 258 : : * Returns TRUE if the guide lines should be drawn. 259 : : * \see setVisible() 260 : : */ 261 : : bool visible() const; 262 : : 263 : : /** 264 : : * Sets whether the guide lines should be \a visible. 265 : : * \see visible() 266 : : */ 267 : : void setVisible( bool visible ); 268 : : 269 : : /** 270 : : * Stores the collection's state in a DOM element. The \a parentElement should refer to the parent layout's DOM element. 271 : : * \see readXml() 272 : : */ 273 : : bool writeXml( QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context ) const override; 274 : : 275 : : /** 276 : : * Sets the collection's state from a DOM element. collectionElement is the DOM node corresponding to the collection. 277 : : * \see writeXml() 278 : : */ 279 : : bool readXml( const QDomElement &collectionElement, const QDomDocument &document, const QgsReadWriteContext &context ) override; 280 : : 281 : : private slots: 282 : : 283 : : void pageAboutToBeRemoved( int pageNumber ); 284 : : 285 : : private: 286 : : 287 : : enum UndoRoles 288 : : { 289 : : Move = 10000, 290 : : Remove = 20000, 291 : : }; 292 : : 293 : : QgsLayout *mLayout = nullptr; 294 : : QgsLayoutPageCollection *mPageCollection = nullptr; 295 : : 296 : : QList< QgsLayoutGuide * > mGuides; 297 : : int mHeaderSize = 0; 298 : : 299 : : bool mGuidesVisible = true; 300 : : bool mBlockUndoCommands = false; 301 : : 302 : : friend class QgsLayoutGuideCollectionUndoCommand; 303 : : 304 : : }; 305 : : 306 : : 307 : : /** 308 : : * \ingroup core 309 : : * \class QgsLayoutGuideProxyModel 310 : : * \brief Filters QgsLayoutGuideCollection models to guides of a single orientation (horizontal or vertical). 311 : : * \since QGIS 3.0 312 : : */ 313 : : class CORE_EXPORT QgsLayoutGuideProxyModel : public QSortFilterProxyModel 314 : : { 315 : : Q_OBJECT 316 : : 317 : : public: 318 : : 319 : : /** 320 : : * Constructor for QgsLayoutGuideProxyModel, filtered to guides of the specified \a orientation and \a page only. 321 : : * 322 : : * Page numbers begin at 0. 323 : : */ 324 : : explicit QgsLayoutGuideProxyModel( QObject *parent SIP_TRANSFERTHIS, Qt::Orientation orientation, int page ); 325 : : 326 : : /** 327 : : * Sets the current \a page for filtering matching guides. Page numbers begin at 0. 328 : : */ 329 : : void setPage( int page ); 330 : : 331 : : bool filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent ) const override; 332 : : bool lessThan( const QModelIndex &left, const QModelIndex &right ) const override; 333 : : 334 : : private: 335 : : Qt::Orientation mOrientation = Qt::Horizontal; 336 : : int mPage = 0; 337 : : 338 : : }; 339 : : 340 : : #endif //QGSLAYOUTGUIDECOLLECTION_H