18#include "moc_qgslayoutpagecollection.cpp" 
   32  createDefaultPageStyleSymbol();
 
 
   37  const auto constMPages = mPages;
 
   40    mLayout->removeItem( 
page );
 
 
   61  return mPageStyleSymbol.get();
 
 
   66  mPreviousItemPositions.clear();
 
   67  QList< QgsLayoutItem * > items;
 
   75    mPreviousItemPositions.insert( item->uuid(), qMakePair( item->page(), item->pagePositionWithUnits() ) );
 
 
   81  for ( 
auto it = mPreviousItemPositions.constBegin(); it != mPreviousItemPositions.constEnd(); ++it )
 
   83    const QString key { it.key() };
 
   86      if ( !mBlockUndoCommands )
 
   87        item->beginCommand( QString() );
 
   89      item->attemptMove( it.value().second, 
true, 
false, it.value().first );
 
   94        if ( !mBlockUndoCommands )
 
   99        item->cancelCommand();
 
  103  mPreviousItemPositions.clear();
 
 
  110  const auto constMPages = mPages;
 
 
  139    double area = pageSize.width() * pageSize.height();
 
  140    if ( area > maxArea )
 
 
  155    if ( !size.isValid() )
 
  160           || !
qgsDoubleNear( pageSize.height(), size.height(), 0.01 ) )
 
 
  170  double startNextPageY = 0;
 
  171  const auto constMPages = mPages;
 
  175    if ( startNextPageY > point.y() )
 
 
  187  if ( mPages.empty() )
 
  191  double startNextPageY = 0;
 
  192  const auto constMPages = mPages;
 
  196    if ( startNextPageY >= point.y() )
 
  201  if ( startNextPageY >= point.y() )
 
  207  double lastPageHeight = mPages.last()->rect().height();
 
  208  while ( startNextPageY < point.y() )
 
  211    if ( startNextPageY >= point.y() )
 
 
  221  const QList< QGraphicsItem * > items = mLayout->items( point );
 
  222  for ( QGraphicsItem *item : items )
 
  227      if ( 
page->mapToScene( 
page->rect() ).boundingRect().contains( point ) )
 
 
  237  if ( 
page > 0 && 
page < mPages.count() )
 
  239    layoutUnitsPos.ry() += mPages.at( 
page )->pos().y();
 
  241  return layoutUnitsPos;
 
 
  247  if ( 
page > 0 && 
page < mPages.count() )
 
 
  257  double startCurrentPageY = 0;
 
  258  double startNextPageY = 0;
 
  260  const auto constMPages = mPages;
 
  263    startCurrentPageY = startNextPageY;
 
  265    if ( startNextPageY > position.y() )
 
  280    y = position.y() - startCurrentPageY;
 
  282  return QPointF( position.x(), y );
 
 
  299  if ( bounds.isEmpty() )
 
  302  if ( !mBlockUndoCommands )
 
  310  if ( mPages.empty() )
 
  312    auto page = std::make_unique< QgsLayoutItemPage >( mLayout );
 
  323  bounds.setWidth( bounds.width() + marginLeft + marginRight );
 
  324  bounds.setHeight( bounds.height() + marginTop + marginBottom );
 
  332  double diffX = marginLeft - bounds.left();
 
  333  double diffY = marginTop - bounds.top();
 
  335  const QList<QGraphicsItem *> itemList = mLayout->items();
 
  336  for ( QGraphicsItem *item : itemList )
 
  344        layoutItem->attemptMoveBy( diffX, diffY );
 
  345        layoutItem->endCommand();
 
  352  const QList< QgsLayoutGuide * > verticalGuides = mLayout->
guides().
guides( Qt::Vertical );
 
  355    guide->setLayoutPosition( guide->layoutPosition() + diffX );
 
  357  const QList< QgsLayoutGuide * > horizontalGuides = mLayout->
guides().
guides( Qt::Horizontal );
 
  360    guide->setLayoutPosition( guide->layoutPosition() + diffY );
 
  364  if ( !mBlockUndoCommands )
 
 
  370  QDomElement element = document.createElement( QStringLiteral( 
"PageCollection" ) );
 
  373  element.appendChild( pageStyleElem );
 
  380  mGuideCollection->writeXml( element, document, context );
 
  382  parentElement.appendChild( element );
 
 
  388  QDomElement element = e;
 
  389  if ( element.nodeName() != QLatin1String( 
"PageCollection" ) )
 
  391    element = element.firstChildElement( QStringLiteral( 
"PageCollection" ) );
 
  394  if ( element.nodeName() != QLatin1String( 
"PageCollection" ) )
 
  399  mBlockUndoCommands = 
true;
 
  405    mLayout->removeItem( 
page );
 
  411  QDomElement pageStyleSymbolElem = element.firstChildElement( QStringLiteral( 
"symbol" ) );
 
  412  if ( !pageStyleSymbolElem.isNull() )
 
  414    mPageStyleSymbol = QgsSymbolLayerUtils::loadSymbol<QgsFillSymbol>( pageStyleSymbolElem, context );
 
  417  QDomNodeList pageList = element.elementsByTagName( QStringLiteral( 
"LayoutItem" ) );
 
  418  for ( 
int i = 0; i < pageList.size(); ++i )
 
  420    QDomElement pageElement = pageList.at( i ).toElement();
 
  421    auto page = std::make_unique<QgsLayoutItemPage>( mLayout );
 
  422    if ( mPageStyleSymbol )
 
  426    mPages.append( 
page.get() );
 
  427    mLayout->addItem( 
page.release() );
 
  432  mGuideCollection->readXml( element, document, context );
 
  434  mBlockUndoCommands = 
false;
 
 
  440  return *mGuideCollection;
 
 
  445  return *mGuideCollection;
 
 
  451  if ( !referencePage )
 
  457  mBlockUndoCommands = 
true;
 
  461    if ( 
page == referencePage )
 
  470  mBlockUndoCommands = 
false;
 
 
  476  const auto constMPages = mPages;
 
 
  495  return mPages.count();
 
 
  510  return mPages.indexOf( 
page );
 
 
  515  QList<QgsLayoutItemPage *> 
pages;
 
  516  const auto constMPages = mPages;
 
 
  529  const auto constMPages = mPages;
 
 
  560  QList<QgsLayoutItem *> itemList;
 
  561  const QList<QGraphicsItem *> graphicsItemList = mLayout->items();
 
  562  itemList.reserve( graphicsItemList.size() );
 
  563  for ( QGraphicsItem *graphicsItem : graphicsItemList )
 
  568      itemList.push_back( item );
 
 
  576  if ( 
page >= mPages.count() || 
page < 0 )
 
  587  QList<QgsLayoutFrame *> frames;
 
  591    if ( frame->hidePageIfEmpty() && frame->isEmpty() )
 
 
  602  if ( !mBlockUndoCommands )
 
  604  mPages.append( 
page );
 
  605  mLayout->addItem( 
page );
 
  607  if ( !mBlockUndoCommands )
 
 
  613  if ( mPages.empty() )
 
  617  auto newPage = std::make_unique< QgsLayoutItemPage >( mLayout );
 
  620  return mPages.at( mPages.count() - 1 );
 
 
  625  if ( !mBlockUndoCommands )
 
  631  if ( beforePage < 0 )
 
  635  if ( beforePage >= mPages.count() )
 
  637    mPages.append( 
page );
 
  641    mPages.insert( beforePage, 
page );
 
  643  mLayout->addItem( 
page );
 
  647  for ( 
auto it = mPreviousItemPositions.begin(); it != mPreviousItemPositions.end(); ++it ) 
 
  649    if ( it.value().first < beforePage )
 
  652    it.value().first = it.value().first + 1;
 
  656  if ( ! mBlockUndoCommands )
 
 
  665  if ( pageNumber < 0 || pageNumber >= mPages.count() )
 
  668  if ( !mBlockUndoCommands )
 
  676  mLayout->removeItem( 
page );
 
  681  for ( 
auto it = mPreviousItemPositions.begin(); it != mPreviousItemPositions.end(); ++it ) 
 
  686    it.value().first = it.value().first - 1;
 
  690  if ( ! mBlockUndoCommands )
 
 
  699  if ( !mPages.contains( 
page ) )
 
  702  if ( !mBlockUndoCommands )
 
  707  int pageIndex = mPages.indexOf( 
page );
 
  710  mPages.removeAll( 
page );
 
  714  mLayout->removeItem( 
page );
 
  718  for ( 
auto it = mPreviousItemPositions.begin(); it != mPreviousItemPositions.end(); ++it ) 
 
  720    if ( it.value().first <= pageIndex )
 
  723    it.value().first = it.value().first - 1;
 
  727  if ( !mBlockUndoCommands )
 
 
  736  if ( !mBlockUndoCommands )
 
  741  for ( 
int i = mPages.count() - 1;  i >= 0; --i )
 
  744    mPages.takeAt( i )->deleteLater();
 
  747  if ( !mBlockUndoCommands )
 
 
  756  mPages.removeAll( 
page );
 
 
  760void QgsLayoutPageCollection::createDefaultPageStyleSymbol()
 
  762  QVariantMap properties;
 
  763  properties.insert( QStringLiteral( 
"color" ), QStringLiteral( 
"white" ) );
 
  764  properties.insert( QStringLiteral( 
"style" ), QStringLiteral( 
"solid" ) );
 
  765  properties.insert( QStringLiteral( 
"style_border" ), QStringLiteral( 
"no" ) );
 
  766  properties.insert( QStringLiteral( 
"joinstyle" ), QStringLiteral( 
"miter" ) );
 
LayoutUnit
Layout measurement units.
 
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
 
static std::unique_ptr< QgsFillSymbol > createSimple(const QVariantMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties.
 
QgsFillSymbol * clone() const override
Returns a deep copy of this symbol.
 
Base class for frame items, which form a layout multiframe item.
 
Stores and manages the snap guides used by a layout.
 
QList< QgsLayoutGuide * > guides()
Returns a list of all guides contained in the collection.
 
void update()
Updates the position (and visibility) of all guide line items.
 
Contains the configuration for a single snap guide used by a layout.
 
Item representing the paper in a layout.
 
QRectF boundingRect() const override
 
void setPageSize(const QgsLayoutSize &size)
Sets the size of the page.
 
QgsLayoutSize pageSize() const
Returns the size of the page.
 
const QgsFillSymbol * pageStyleSymbol() const
Returns the symbol to use for drawing the page background.
 
void setPageStyleSymbol(QgsFillSymbol *symbol)
Sets the symbol to use for drawing the page background.
 
Base class for graphical items within a QgsLayout.
 
bool writeXml(QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context) const
Stores the item state in a DOM element.
 
QgsLayoutSize sizeWithUnits() const
Returns the item's current size, including units.
 
void beginCommand(const QString &commandText, UndoCommand command=UndoNone)
Starts new undo command for this item.
 
int page() const
Returns the page the item is currently on, with the first page returning 0.
 
virtual void finalizeRestoreFromXml()
Called after all pending items have been restored from XML.
 
bool readXml(const QDomElement &itemElement, const QDomDocument &document, const QgsReadWriteContext &context)
Sets the item state from a DOM element.
 
bool shouldDrawItem() const
Returns whether the item should be drawn in the current context.
 
virtual void attemptMove(const QgsLayoutPoint &point, bool useReferencePoint=true, bool includesFrame=false, int page=-1)
Attempts to move the item to a specified point.
 
Provides a method of storing measurements for use in QGIS layouts using a variety of different measur...
 
double length() const
Returns the length of the measurement.
 
QList< int > visiblePageNumbers(const QRectF ®ion) const
Returns a list of the page numbers which are visible within the specified region (in layout coordinat...
 
void deletePage(int pageNumber)
Deletes a page from the collection.
 
bool pageIsEmpty(int page) const
Returns whether a given page index is empty, ie, it contains no items except for the background paper...
 
bool readXml(const QDomElement &collectionElement, const QDomDocument &document, const QgsReadWriteContext &context) override
Sets the collection's state from a DOM element.
 
QPointF pagePositionToLayoutPosition(int page, const QgsLayoutPoint &position) const
Converts a position on a page to an absolute position in layout coordinates.
 
void addPage(QgsLayoutItemPage *page)
Adds a page to the collection.
 
void changed()
Emitted when pages are added or removed from the collection.
 
int pageNumberForPoint(QPointF point) const
Returns the page number corresponding to a point in the layout (in layout units).
 
QgsLayoutItemPage * takePage(QgsLayoutItemPage *page)
Takes a page from the collection, returning ownership of the page to the caller.
 
QList< QgsLayoutItemPage * > visiblePages(const QRectF ®ion) const
Returns a list of the pages which are visible within the specified region (in layout coordinates).
 
Q_DECL_DEPRECATED const QgsFillSymbol * pageStyleSymbol() const
Returns the symbol to use for drawing pages in the collection.
 
QgsLayoutPageCollection(QgsLayout *layout)
Constructor for QgsLayoutItemPage, with the specified parent layout.
 
void insertPage(QgsLayoutItemPage *page, int beforePage)
Inserts a page into a specific position in the collection.
 
void setPageStyleSymbol(QgsFillSymbol *symbol)
Sets the symbol to use for drawing pages in the collection.
 
void reflow()
Forces the page collection to reflow the arrangement of pages, e.g.
 
QgsLayoutItemPage * extendByNewPage()
Adds a new page to the end of the collection.
 
bool writeXml(QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores the collection's state in a DOM element.
 
QgsLayout * layout() override
Returns the layout the object belongs to.
 
double spaceBetweenPages() const
Returns the space between pages, in layout units.
 
QgsLayoutGuideCollection & guides()
Returns a reference to the collection's guide collection, which manages page snap guides.
 
int predictPageNumberForPoint(QPointF point) const
Returns the theoretical page number corresponding to a point in the layout (in layout units),...
 
void endPageSizeChange()
Should be called after changing any page item sizes, and preceded by a call to beginPageSizeChange().
 
QList< QgsLayoutItem * > itemsOnPage(int page) const
Returns a list of layout items on the specified page index.
 
QList< QgsLayoutItemPage * > pages()
Returns a list of pages in the collection.
 
void pageAboutToBeRemoved(int pageNumber)
Emitted just before a page is removed from the collection.
 
int pageCount() const
Returns the number of pages in the collection.
 
~QgsLayoutPageCollection() override
 
void applyPropertiesToAllOtherPages(int sourcePage)
Apply the source page properties (size & background color) to all other pages.
 
double maximumPageWidth() const
Returns the maximum width of pages in the collection.
 
QPointF positionOnPage(QPointF point) const
Returns the position within a page of a point in the layout (in layout units).
 
void resizeToContents(const QgsMargins &margins, Qgis::LayoutUnit marginUnits)
Resizes the layout to a single page which fits the current contents of the layout.
 
bool shouldExportPage(int page) const
Returns whether the specified page number should be included in exports of the layouts.
 
QgsLayoutItemPage * page(int pageNumber)
Returns a specific page (by pageNumber) from the collection.
 
void redraw()
Triggers a redraw for all pages.
 
QgsLayoutPoint pagePositionToAbsolute(int page, const QgsLayoutPoint &position) const
Converts a position on a page to an absolute position in (maintaining the units from the input positi...
 
double pageShadowWidth() const
Returns the size of the page shadow, in layout units.
 
void clear()
Removes all pages from the collection.
 
int pageNumber(QgsLayoutItemPage *page) const
Returns the page number for the specified page, or -1 if the page is not contained in the collection.
 
bool hasUniformPageSizes() const
Returns true if the layout has uniform page sizes, e.g.
 
void beginPageSizeChange()
Should be called before changing any page item sizes, and followed by a call to endPageSizeChange().
 
QgsLayoutItemPage * pageAtPoint(QPointF point) const
Returns the page at a specified point (in layout coordinates).
 
QSizeF maximumPageSize() const
Returns the maximum size of any page in the collection, by area.
 
Provides a method of storing points, consisting of an x and y coordinate, for use in QGIS layouts.
 
double x() const
Returns x coordinate of point.
 
double y() const
Returns y coordinate of point.
 
Qgis::LayoutUnit units() const
Returns the units for the point.
 
void setY(const double y)
Sets y coordinate of point.
 
Provides a method of storing sizes, consisting of a width and height, for use in QGIS layouts.
 
void endCommand()
Saves final state of an object and pushes the active command to the undo history.
 
void beginMacro(const QString &commandText)
Starts a macro command, with the given descriptive commandText.
 
void beginCommand(QgsLayoutUndoObjectInterface *object, const QString &commandText, int id=0)
Begins a new undo command for the specified object.
 
void endMacro()
Ends a macro command.
 
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
 
void updateBounds()
Updates the scene bounds of the layout.
 
QgsLayoutPageCollection * pageCollection()
Returns a pointer to the layout's page collection, which stores and manages page items in the layout.
 
void layoutItems(QList< T * > &itemList) const
Returns a list of layout items of a specific type.
 
QgsLayoutItem * itemByUuid(const QString &uuid, bool includeTemplateUuids=false) const
Returns the layout item with matching uuid unique identifier, or nullptr if a matching item could not...
 
QgsLayoutGuideCollection & guides()
Returns a reference to the layout's guide collection, which manages page snap guides.
 
double convertToLayoutUnits(QgsLayoutMeasurement measurement) const
Converts a measurement into the layout's native units.
 
QgsLayoutMeasurement convertFromLayoutUnits(double length, Qgis::LayoutUnit unit) const
Converts a length measurement from the layout's native units to a specified target unit.
 
QRectF layoutBounds(bool ignorePages=false, double margin=0.0) const
Calculates the bounds of all non-gui items in the layout.
 
void refresh()
Forces the layout, and all items contained within it, to refresh.
 
Qgis::LayoutUnit units() const
Returns the native units for the layout.
 
QgsLayoutUndoStack * undoStack()
Returns a pointer to the layout's undo stack, which manages undo/redo states for the layout and it's ...
 
Defines the four margins of a rectangle.
 
double top() const
Returns the top margin.
 
double right() const
Returns the right margin.
 
double bottom() const
Returns the bottom margin.
 
double left() const
Returns the left margin.
 
A container for the context for various read/write operations on objects.
 
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)