23 #include <QGraphicsLineItem>
32 , mOrientation( orientation )
33 , mPosition( position )
39 if ( mLayout && mLineItem )
41 mLayout->removeItem( mLineItem );
71 if ( !mLayout || !mLineItem )
81 double layoutPos = mLayout->convertToLayoutUnits( mPosition );
82 bool showGuide = mLayout->guides().visible();
83 switch ( mOrientation )
86 if ( layoutPos > mPage->rect().height() )
92 mLineItem->setLine( 0, layoutPos + mPage->y(), mPage->rect().width(), layoutPos + mPage->y() );
93 mLineItem->setVisible( showGuide );
99 if ( layoutPos > mPage->rect().width() )
105 mLineItem->setLine( layoutPos, mPage->y(), layoutPos, mPage->y() + mPage->rect().height() );
106 mLineItem->setVisible( showGuide );
123 switch ( mOrientation )
126 return mLineItem->mapToScene( mLineItem->line().p1() ).y();
129 return mLineItem->mapToScene( mLineItem->line().p1() ).x();
140 switch ( mOrientation )
143 p = mPage->mapFromScene( QPointF( 0,
position ) ).y();
147 p = mPage->mapFromScene( QPointF(
position, 0 ) ).x();
150 mPosition = mLayout->convertFromLayoutUnits( p, mPosition.
units() );
166 mLineItem =
new QGraphicsLineItem();
169 QPen linePen( Qt::DotLine );
170 linePen.setColor( Qt::red );
173 linePen.setWidthF( 0 );
174 mLineItem->setPen( linePen );
177 mLayout->addItem( mLineItem );
193 : QAbstractTableModel( layout )
195 , mPageCollection( pageCollection )
198 mHeaderSize = QFontMetrics( f ).boundingRect( QStringLiteral(
"XX" ) ).width();
205 qDeleteAll( mGuides );
215 return mGuides.count();
220 if ( parent.isValid() )
228 if ( !index.isValid() )
231 if ( index.row() >= mGuides.count() || index.row() < 0 )
237 case Qt::DisplayRole:
240 if ( index.column() == 0 )
268 if ( !index.isValid() )
271 if ( index.row() >= mGuides.count() || index.row() < 0 )
281 double newPos = value.toDouble( &ok );
291 emit dataChanged( index, index, QVector<int>() << role );
297 double newPos = value.toDouble( &ok );
310 emit dataChanged( index, index, QVector<int>() << role );
317 double newPos = value.toDouble( &ok );
324 emit dataChanged( index, index, QVector<int>() << role );
331 int units = value.toInt( &ok );
341 emit dataChanged( index, index, QVector<int>() << role );
351 if ( !index.isValid() )
352 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
353 return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
358 if ( role == Qt::DisplayRole )
360 else if ( role == Qt::SizeHintRole )
362 return QSize( mHeaderSize, mHeaderSize );
364 return QAbstractTableModel::headerData( section, orientation, role );
369 if ( parent.isValid() )
372 if ( !mBlockUndoCommands )
374 beginRemoveRows( parent, row, row + count - 1 );
375 for (
int i = 0; i < count; ++ i )
377 delete mGuides.takeAt( row );
380 if ( !mBlockUndoCommands )
389 if ( !mBlockUndoCommands )
391 beginInsertRows( QModelIndex(), mGuides.count(), mGuides.count() );
392 mGuides.append( guide );
394 if ( !mBlockUndoCommands )
397 QModelIndex index = createIndex( mGuides.length() - 1, 0 );
400 emit dataChanged( index, index );
406 int row = mGuides.indexOf( guide );
415 int row = mGuides.indexOf( guide );
426 qDeleteAll( mGuides );
435 mBlockUndoCommands =
true;
438 const auto constMGuides = mGuides;
441 if ( guide->page() != page )
448 for (
int p = 0; p < mPageCollection->
pageCount(); ++p )
450 if ( p == sourcePage )
453 std::unique_ptr< QgsLayoutGuide> newGuide(
new QgsLayoutGuide( guide->orientation(), guide->position(), mPageCollection->
page( p ) ) );
454 newGuide->setLayout( mLayout );
455 if ( newGuide->item()->isVisible() )
463 mBlockUndoCommands =
false;
468 const auto constMGuides = mGuides;
482 QList<QgsLayoutGuide *> res;
483 const auto constMGuides = mGuides;
486 if ( guide->orientation() == orientation && guide->item()->isVisible() &&
487 ( page < 0 || mPageCollection->page( page ) == guide->page() ) )
495 QList<QgsLayoutGuide *> res;
496 const auto constMGuides = mGuides;
499 if ( mPageCollection->
page( page ) == guide->
page() )
507 return mGuidesVisible;
518 void QgsLayoutGuideCollection::pageAboutToBeRemoved(
int pageNumber )
520 mBlockUndoCommands =
true;
521 const auto constGuidesOnPage =
guidesOnPage( pageNumber );
526 mBlockUndoCommands =
false;
531 QDomElement element = document.createElement( QStringLiteral(
"GuideCollection" ) );
532 element.setAttribute( QStringLiteral(
"visible" ), mGuidesVisible );
533 const auto constMGuides = mGuides;
536 QDomElement guideElement = document.createElement( QStringLiteral(
"Guide" ) );
537 guideElement.setAttribute( QStringLiteral(
"orientation" ), guide->orientation() );
538 guideElement.setAttribute( QStringLiteral(
"page" ), mPageCollection->
pageNumber( guide->page() ) );
539 guideElement.setAttribute( QStringLiteral(
"position" ), guide->position().length() );
541 element.appendChild( guideElement );
544 parentElement.appendChild( element );
550 QDomElement element = e;
551 if ( element.nodeName() != QStringLiteral(
"GuideCollection" ) )
553 element = element.firstChildElement( QStringLiteral(
"GuideCollection" ) );
556 if ( element.nodeName() != QStringLiteral(
"GuideCollection" ) )
561 mBlockUndoCommands =
true;
563 qDeleteAll( mGuides );
566 mGuidesVisible = element.attribute( QStringLiteral(
"visible" ), QStringLiteral(
"0" ) ) != QLatin1String(
"0" );
567 QDomNodeList guideNodeList = element.elementsByTagName( QStringLiteral(
"Guide" ) );
568 for (
int i = 0; i < guideNodeList.size(); ++i )
570 QDomElement element = guideNodeList.at( i ).toElement();
571 Qt::Orientation orientation =
static_cast< Qt::Orientation
>( element.attribute( QStringLiteral(
"orientation" ), QStringLiteral(
"1" ) ).toInt() );
572 double pos = element.attribute( QStringLiteral(
"position" ), QStringLiteral(
"0" ) ).toDouble();
574 int page = element.attribute( QStringLiteral(
"page" ), QStringLiteral(
"0" ) ).toInt();
581 mBlockUndoCommands =
false;
590 : QSortFilterProxyModel( parent )
591 , mOrientation( orientation )
594 setDynamicSortFilter(
true );
606 QModelIndex index = sourceModel()->index( source_row, 0, source_parent );
608 if ( orientation != mOrientation )
612 return page == mPage;
619 return leftPos < rightPos;