24#include <QGraphicsLineItem>
33 , mOrientation( orientation )
34 , mPosition( position )
40 if ( mLayout && mLineItem )
42 mLayout->removeItem( mLineItem );
72 if ( !mLayout || !mLineItem )
82 double layoutPos = mLayout->convertToLayoutUnits( mPosition );
83 bool showGuide = mLayout->guides().visible();
84 switch ( mOrientation )
87 if ( layoutPos > mPage->rect().height() )
93 mLineItem->setLine( 0, layoutPos + mPage->y(), mPage->rect().width(), layoutPos + mPage->y() );
94 mLineItem->setVisible( showGuide );
100 if ( layoutPos > mPage->rect().width() )
106 mLineItem->setLine( layoutPos, mPage->y(), layoutPos, mPage->y() + mPage->rect().height() );
107 mLineItem->setVisible( showGuide );
124 switch ( mOrientation )
127 return mLineItem->mapToScene( mLineItem->line().p1() ).y();
130 return mLineItem->mapToScene( mLineItem->line().p1() ).x();
141 switch ( mOrientation )
144 p = mPage->mapFromScene( QPointF( 0,
position ) ).y();
148 p = mPage->mapFromScene( QPointF(
position, 0 ) ).x();
151 mPosition = mLayout->convertFromLayoutUnits( p, mPosition.
units() );
167 mLineItem =
new QGraphicsLineItem();
170 QPen linePen( Qt::DotLine );
171 linePen.setColor( Qt::red );
174 linePen.setWidthF( 0 );
175 mLineItem->setPen( linePen );
178 mLayout->addItem( mLineItem );
194 : QAbstractTableModel( layout )
196 , mPageCollection( pageCollection )
199 mHeaderSize = QFontMetrics( f ).boundingRect( QStringLiteral(
"XX" ) ).width();
206 qDeleteAll( mGuides );
216 return mGuides.count();
221 if ( parent.isValid() )
229 if ( !index.isValid() )
232 if ( index.row() >= mGuides.count() || index.row() < 0 )
238 case Qt::DisplayRole:
241 if ( index.column() == 0 )
248 return QVariant::fromValue( guide->
orientation() );
269 if ( !index.isValid() )
272 if ( index.row() >= mGuides.count() || index.row() < 0 )
282 double newPos = value.toDouble( &ok );
292 emit dataChanged( index, index, QVector<int>() << role );
298 double newPos = value.toDouble( &ok );
311 emit dataChanged( index, index, QVector<int>() << role );
318 double newPos = value.toDouble( &ok );
325 emit dataChanged( index, index, QVector<int>() << role );
332 int units = value.toInt( &ok );
342 emit dataChanged( index, index, QVector<int>() << role );
355 if ( !index.isValid() )
356 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
357 return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
362 if ( role == Qt::DisplayRole )
364 else if ( role == Qt::SizeHintRole )
366 return QSize( mHeaderSize, mHeaderSize );
368 return QAbstractTableModel::headerData( section, orientation, role );
373 if ( parent.isValid() )
376 if ( !mBlockUndoCommands )
378 beginRemoveRows( parent, row, row + count - 1 );
379 for (
int i = 0; i < count; ++ i )
381 delete mGuides.takeAt( row );
384 if ( !mBlockUndoCommands )
391 if ( guide->
layout() != mLayout )
394 if ( !mBlockUndoCommands )
396 beginInsertRows( QModelIndex(), mGuides.count(), mGuides.count() );
397 mGuides.append( guide );
399 if ( !mBlockUndoCommands )
402 QModelIndex index = createIndex( mGuides.length() - 1, 0 );
405 emit dataChanged( index, index );
411 int row = mGuides.indexOf( guide );
420 int row = mGuides.indexOf( guide );
431 qDeleteAll( mGuides );
440 mBlockUndoCommands =
true;
443 const auto constMGuides = mGuides;
446 if ( guide->page() != page )
451 const auto constMGuidesNew = mGuides;
454 for (
int p = 0; p < mPageCollection->
pageCount(); ++p )
456 if ( p == sourcePage )
459 std::unique_ptr< QgsLayoutGuide> newGuide(
new QgsLayoutGuide( guide->orientation(), guide->position(), mPageCollection->
page( p ) ) );
460 newGuide->setLayout( mLayout );
461 if ( newGuide->item()->isVisible() )
469 mBlockUndoCommands =
false;
474 const auto constMGuides = mGuides;
488 QList<QgsLayoutGuide *> res;
489 const auto constMGuides = mGuides;
492 if ( guide->orientation() == orientation && guide->item()->isVisible() &&
493 ( page < 0 || mPageCollection->
page( page ) == guide->
page() ) )
501 QList<QgsLayoutGuide *> res;
502 const auto constMGuides = mGuides;
505 if ( mPageCollection->
page( page ) == guide->
page() )
513 return mGuidesVisible;
524void QgsLayoutGuideCollection::pageAboutToBeRemoved(
int pageNumber )
526 mBlockUndoCommands =
true;
527 const auto constGuidesOnPage =
guidesOnPage( pageNumber );
532 mBlockUndoCommands =
false;
537 QDomElement element = document.createElement( QStringLiteral(
"GuideCollection" ) );
538 element.setAttribute( QStringLiteral(
"visible" ), mGuidesVisible );
539 const auto constMGuides = mGuides;
542 QDomElement guideElement = document.createElement( QStringLiteral(
"Guide" ) );
543 guideElement.setAttribute( QStringLiteral(
"orientation" ), guide->orientation() );
544 guideElement.setAttribute( QStringLiteral(
"page" ), mPageCollection->
pageNumber( guide->page() ) );
545 guideElement.setAttribute( QStringLiteral(
"position" ), guide->position().length() );
547 element.appendChild( guideElement );
550 parentElement.appendChild( element );
556 QDomElement element = e;
557 if ( element.nodeName() != QLatin1String(
"GuideCollection" ) )
559 element = element.firstChildElement( QStringLiteral(
"GuideCollection" ) );
562 if ( element.nodeName() != QLatin1String(
"GuideCollection" ) )
567 mBlockUndoCommands =
true;
569 qDeleteAll( mGuides );
572 mGuidesVisible = element.attribute( QStringLiteral(
"visible" ), QStringLiteral(
"0" ) ) != QLatin1String(
"0" );
573 QDomNodeList guideNodeList = element.elementsByTagName( QStringLiteral(
"Guide" ) );
574 for (
int i = 0; i < guideNodeList.size(); ++i )
576 QDomElement element = guideNodeList.at( i ).toElement();
577 Qt::Orientation orientation =
static_cast< Qt::Orientation
>( element.attribute( QStringLiteral(
"orientation" ), QStringLiteral(
"1" ) ).toInt() );
578 double pos = element.attribute( QStringLiteral(
"position" ), QStringLiteral(
"0" ) ).toDouble();
580 int page = element.attribute( QStringLiteral(
"page" ), QStringLiteral(
"0" ) ).toInt();
587 mBlockUndoCommands =
false;
596 : QSortFilterProxyModel( parent )
597 , mOrientation( orientation )
600 setDynamicSortFilter(
true );
612 QModelIndex index = sourceModel()->index( source_row, 0, source_parent );
614 if ( orientation != mOrientation )
618 return page == mPage;
625 return leftPos < rightPos;
LayoutUnit
Layout measurement units.
bool writeXml(QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores the collection's state in a DOM element.
int columnCount(const QModelIndex &) const override
void addGuide(QgsLayoutGuide *guide)
Adds a guide to the collection.
bool setData(const QModelIndex &index, const QVariant &value, int role) override
QgsLayout * layout() override
Returns the layout the object belongs to.
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
QgsLayoutGuideCollection(QgsLayout *layout, QgsLayoutPageCollection *pageCollection)
Constructor for QgsLayoutGuideCollection belonging to the specified layout, and linked to the specifi...
bool readXml(const QDomElement &collectionElement, const QDomDocument &document, const QgsReadWriteContext &context) override
Sets the collection's state from a DOM element.
@ Position
Guide position role.
@ LayoutPosition
Guide position in layout coordinates.
@ Orientation
Guide orientation role.
@ Units
Guide position units role.
QVariant data(const QModelIndex &index, int role) const override
void applyGuidesToAllOtherPages(int sourcePage)
Resets all other pages' guides to match the guides from the specified sourcePage.
void removeGuide(QgsLayoutGuide *guide)
Removes the specified guide, and deletes it.
QList< QgsLayoutGuide * > guidesOnPage(int page)
Returns the list of guides contained on a matching page.
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) override
~QgsLayoutGuideCollection() override
void setGuideLayoutPosition(QgsLayoutGuide *guide, double position)
Sets the absolute position (in layout coordinates) for guide within the layout.
QList< QgsLayoutGuide * > guides()
Returns a list of all guides contained in the collection.
int rowCount(const QModelIndex &) const override
void clear()
Removes all guides from the collection.
Qt::ItemFlags flags(const QModelIndex &index) const override
bool visible() const
Returns true if the guide lines should be drawn.
void update()
Updates the position (and visibility) of all guide line items.
void setVisible(bool visible)
Sets whether the guide lines should be visible.
void setPage(int page)
Sets the current page for filtering matching guides.
QgsLayoutGuideProxyModel(QObject *parent, Qt::Orientation orientation, int page)
Constructor for QgsLayoutGuideProxyModel, filtered to guides of the specified orientation and page on...
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override
Contains the configuration for a single snap guide used by a layout.
QgsLayoutMeasurement position() const
Returns the guide's position within the page.
QgsLayoutItemPage * page()
Returns the page the guide is contained within.
Qt::Orientation orientation() const
Returns the guide's orientation.
QgsLayout * layout() const
Returns the layout the guide belongs to.
void setLayout(QgsLayout *layout)
Sets the layout the guide belongs to.
~QgsLayoutGuide() override
void setLayoutPosition(double position)
Sets the guide's position in absolute layout units.
void setPage(QgsLayoutItemPage *page)
Sets the page the guide is contained within.
void setPosition(QgsLayoutMeasurement position)
Sets the guide's position within the page.
QgsLayoutGuide(Qt::Orientation orientation, QgsLayoutMeasurement position, QgsLayoutItemPage *page)
Constructor for a new guide with the specified orientation and initial position.
double layoutPosition() const
Returns the guide's position in absolute layout units.
void positionChanged()
Emitted when the guide's position is changed.
void update()
Updates the position of the guide's line item.
QGraphicsLineItem * item()
Returns the guide's line item.
Item representing the paper in a layout.
int page() const
Returns the page the item is currently on, with the first page returning 0.
This class provides a method of storing measurements for use in QGIS layouts using a variety of diffe...
void setLength(const double length)
Sets the length of the measurement.
Qgis::LayoutUnit units() const
Returns the units for the measurement.
void setUnits(const Qgis::LayoutUnit units)
Sets the units for the measurement.
double length() const
Returns the length of the measurement.
A manager for a collection of pages in a layout.
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.
QgsLayoutItemPage * page(int pageNumber)
Returns a specific page (by pageNumber) 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.
void endCommand()
Saves final state of an object and pushes the active command to the undo history.
void beginCommand(QgsLayoutUndoObjectInterface *object, const QString &commandText, int id=0)
Begins a new undo command for the specified object.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
@ ZGuide
Z-value for page guides.
QgsLayoutUndoStack * undoStack()
Returns a pointer to the layout's undo stack, which manages undo/redo states for the layout and it's ...
The class is used as a container of context for various read/write operations on other objects.
static Q_INVOKABLE QString toAbbreviatedString(Qgis::DistanceUnit unit)
Returns a translated abbreviation representing a distance unit.
static Q_INVOKABLE Qgis::LayoutUnit decodeLayoutUnit(const QString &string, bool *ok=nullptr)
Decodes a layout unit from a string.
static Q_INVOKABLE QString encodeUnit(Qgis::DistanceUnit unit)
Encodes a distance unit to a string.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.