mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-16 00:03:12 -04:00
Fix ownership issue with layout guides
This commit is contained in:
parent
94362fe218
commit
3fd2e0921d
@ -39,6 +39,8 @@ class QgsLayout : QGraphicsScene, QgsExpressionContextGenerator
|
||||
called on the new layout.
|
||||
%End
|
||||
|
||||
~QgsLayout();
|
||||
|
||||
void initializeDefaults();
|
||||
%Docstring
|
||||
Initializes an empty layout, e.g. by adding a default page to the layout. This should be called after creating
|
||||
|
@ -26,7 +26,7 @@ class QgsLayoutGuide : QObject
|
||||
Vertical,
|
||||
};
|
||||
|
||||
QgsLayoutGuide( Orientation orientation, const QgsLayoutMeasurement &position );
|
||||
QgsLayoutGuide( Orientation orientation, const QgsLayoutMeasurement &position, QgsLayoutItemPage *page );
|
||||
%Docstring
|
||||
Constructor for a new guide with the specified ``orientation`` and
|
||||
initial ``position``.
|
||||
@ -36,6 +36,8 @@ class QgsLayoutGuide : QObject
|
||||
the corresponding layout for you.
|
||||
%End
|
||||
|
||||
~QgsLayoutGuide();
|
||||
|
||||
QgsLayout *layout() const;
|
||||
%Docstring
|
||||
Returns the layout the guide belongs to.
|
||||
@ -82,21 +84,17 @@ class QgsLayoutGuide : QObject
|
||||
.. seealso:: position()
|
||||
%End
|
||||
|
||||
int page() const;
|
||||
QgsLayoutItemPage *page();
|
||||
%Docstring
|
||||
Returns the page number of the guide.
|
||||
|
||||
Page numbering begins at 0.
|
||||
Returns the page the guide is contained within.
|
||||
|
||||
.. seealso:: setPage()
|
||||
:rtype: int
|
||||
:rtype: QgsLayoutItemPage
|
||||
%End
|
||||
|
||||
void setPage( int page );
|
||||
void setPage( QgsLayoutItemPage *page );
|
||||
%Docstring
|
||||
Sets the ``page`` number of the guide.
|
||||
|
||||
Page numbering begins at 0.
|
||||
Sets the ``page`` the guide is contained within.
|
||||
|
||||
.. seealso:: page()
|
||||
%End
|
||||
@ -155,9 +153,10 @@ class QgsLayoutGuideCollection : QAbstractTableModel
|
||||
LayoutPositionRole,
|
||||
};
|
||||
|
||||
QgsLayoutGuideCollection( QgsLayout *layout );
|
||||
QgsLayoutGuideCollection( QgsLayout *layout, QgsLayoutPageCollection *pageCollection );
|
||||
%Docstring
|
||||
Constructor for QgsLayoutGuideCollection belonging to the specified layout.
|
||||
Constructor for QgsLayoutGuideCollection belonging to the specified layout,
|
||||
and linked to the specified ``pageCollection``.
|
||||
%End
|
||||
~QgsLayoutGuideCollection();
|
||||
|
||||
@ -210,9 +209,16 @@ class QgsLayoutGuideCollection : QAbstractTableModel
|
||||
Returns the list of guides contained in the collection with the specified
|
||||
``orientation`` and on a matching ``page``.
|
||||
If ``page`` is -1, guides from all pages will be returned.
|
||||
.. seealso:: guidesOnPage()
|
||||
:rtype: list of QgsLayoutGuide
|
||||
%End
|
||||
|
||||
QList< QgsLayoutGuide * > guidesOnPage( int page );
|
||||
%Docstring
|
||||
Returns the list of guides contained on a matching ``page``.
|
||||
.. seealso:: guides()
|
||||
:rtype: list of QgsLayoutGuide
|
||||
%End
|
||||
|
||||
bool visible() const;
|
||||
%Docstring
|
||||
|
@ -60,15 +60,13 @@ QgsLayoutGuideWidget::QgsLayoutGuideWidget( QWidget *parent, QgsLayout *layout,
|
||||
|
||||
void QgsLayoutGuideWidget::addHorizontalGuide()
|
||||
{
|
||||
std::unique_ptr< QgsLayoutGuide > newGuide( new QgsLayoutGuide( QgsLayoutGuide::Horizontal, QgsLayoutMeasurement( 0 ) ) );
|
||||
newGuide->setPage( mPage );
|
||||
std::unique_ptr< QgsLayoutGuide > newGuide( new QgsLayoutGuide( QgsLayoutGuide::Horizontal, QgsLayoutMeasurement( 0 ), mLayout->pageCollection()->page( mPage ) ) );
|
||||
mLayout->guides().addGuide( newGuide.release() );
|
||||
}
|
||||
|
||||
void QgsLayoutGuideWidget::addVerticalGuide()
|
||||
{
|
||||
std::unique_ptr< QgsLayoutGuide > newGuide( new QgsLayoutGuide( QgsLayoutGuide::Vertical, QgsLayoutMeasurement( 0 ) ) );
|
||||
newGuide->setPage( mPage );
|
||||
std::unique_ptr< QgsLayoutGuide > newGuide( new QgsLayoutGuide( QgsLayoutGuide::Vertical, QgsLayoutMeasurement( 0 ), mLayout->pageCollection()->page( mPage ) ) );
|
||||
mLayout->guides().addGuide( newGuide.release() );
|
||||
}
|
||||
|
||||
|
@ -22,13 +22,19 @@ QgsLayout::QgsLayout( QgsProject *project )
|
||||
: QGraphicsScene()
|
||||
, mProject( project )
|
||||
, mSnapper( QgsLayoutSnapper( this ) )
|
||||
, mGuideCollection( new QgsLayoutGuideCollection( this ) )
|
||||
, mPageCollection( new QgsLayoutPageCollection( this ) )
|
||||
, mGuideCollection( new QgsLayoutGuideCollection( this, mPageCollection.get() ) )
|
||||
{
|
||||
// just to make sure - this should be the default, but maybe it'll change in some future Qt version...
|
||||
setBackgroundBrush( Qt::NoBrush );
|
||||
}
|
||||
|
||||
QgsLayout::~QgsLayout()
|
||||
{
|
||||
// delete guide collection FIRST, since it depends on the page collection
|
||||
mGuideCollection.reset();
|
||||
}
|
||||
|
||||
void QgsLayout::initializeDefaults()
|
||||
{
|
||||
// default to a A4 landscape page
|
||||
|
@ -59,6 +59,8 @@ class CORE_EXPORT QgsLayout : public QGraphicsScene, public QgsExpressionContext
|
||||
*/
|
||||
QgsLayout( QgsProject *project );
|
||||
|
||||
~QgsLayout();
|
||||
|
||||
/**
|
||||
* Initializes an empty layout, e.g. by adding a default page to the layout. This should be called after creating
|
||||
* a new layout.
|
||||
@ -309,10 +311,11 @@ class CORE_EXPORT QgsLayout : public QGraphicsScene, public QgsExpressionContext
|
||||
QgsLayoutContext mContext;
|
||||
QgsLayoutSnapper mSnapper;
|
||||
QgsLayoutGridSettings mGridSettings;
|
||||
std::unique_ptr< QgsLayoutGuideCollection > mGuideCollection;
|
||||
|
||||
std::unique_ptr< QgsLayoutPageCollection > mPageCollection;
|
||||
|
||||
std::unique_ptr< QgsLayoutGuideCollection > mGuideCollection;
|
||||
|
||||
};
|
||||
|
||||
#endif //QGSLAYOUT_H
|
||||
|
@ -23,20 +23,20 @@
|
||||
// QgsLayoutGuide
|
||||
//
|
||||
|
||||
QgsLayoutGuide::QgsLayoutGuide( Orientation orientation, const QgsLayoutMeasurement &position )
|
||||
QgsLayoutGuide::QgsLayoutGuide( Orientation orientation, const QgsLayoutMeasurement &position, QgsLayoutItemPage *page )
|
||||
: QObject( nullptr )
|
||||
, mOrientation( orientation )
|
||||
, mPosition( position )
|
||||
, mLineItem( new QGraphicsLineItem() )
|
||||
, mPage( page )
|
||||
{}
|
||||
|
||||
QgsLayoutGuide::~QgsLayoutGuide()
|
||||
{
|
||||
mLineItem->hide();
|
||||
mLineItem->setZValue( QgsLayout::ZGuide );
|
||||
QPen linePen( Qt::DotLine );
|
||||
linePen.setColor( Qt::red );
|
||||
// use a pen width of 0, since this activates a cosmetic pen
|
||||
// which doesn't scale with the composer and keeps a constant size
|
||||
linePen.setWidthF( 0 );
|
||||
mLineItem->setPen( linePen );
|
||||
if ( mLayout && mLineItem )
|
||||
{
|
||||
mLayout->removeItem( mLineItem );
|
||||
delete mLineItem;
|
||||
}
|
||||
}
|
||||
|
||||
QgsLayoutMeasurement QgsLayoutGuide::position() const
|
||||
@ -51,12 +51,12 @@ void QgsLayoutGuide::setPosition( const QgsLayoutMeasurement &position )
|
||||
emit positionChanged();
|
||||
}
|
||||
|
||||
int QgsLayoutGuide::page() const
|
||||
QgsLayoutItemPage *QgsLayoutGuide::page()
|
||||
{
|
||||
return mPage;
|
||||
}
|
||||
|
||||
void QgsLayoutGuide::setPage( int page )
|
||||
void QgsLayoutGuide::setPage( QgsLayoutItemPage *page )
|
||||
{
|
||||
mPage = page;
|
||||
update();
|
||||
@ -64,43 +64,45 @@ void QgsLayoutGuide::setPage( int page )
|
||||
|
||||
void QgsLayoutGuide::update()
|
||||
{
|
||||
if ( !mLayout )
|
||||
if ( !mLayout || !mLineItem )
|
||||
return;
|
||||
|
||||
// first find matching page
|
||||
if ( mPage >= mLayout->pageCollection()->pageCount() )
|
||||
if ( !mPage )
|
||||
{
|
||||
mLineItem->hide();
|
||||
return;
|
||||
}
|
||||
|
||||
QgsLayoutItemPage *page = mLayout->pageCollection()->page( mPage );
|
||||
mLineItem->setParentItem( page );
|
||||
if ( mLineItem->parentItem() != mPage )
|
||||
{
|
||||
mLineItem->setParentItem( mPage );
|
||||
}
|
||||
double layoutPos = mLayout->convertToLayoutUnits( mPosition );
|
||||
bool showGuide = mLayout->guides().visible();
|
||||
switch ( mOrientation )
|
||||
{
|
||||
case Horizontal:
|
||||
if ( layoutPos > page->rect().height() )
|
||||
if ( layoutPos > mPage->rect().height() )
|
||||
{
|
||||
mLineItem->hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
mLineItem->setLine( 0, layoutPos, page->rect().width(), layoutPos );
|
||||
mLineItem->setLine( 0, layoutPos, mPage->rect().width(), layoutPos );
|
||||
mLineItem->setVisible( showGuide );
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case Vertical:
|
||||
if ( layoutPos > page->rect().width() )
|
||||
if ( layoutPos > mPage->rect().width() )
|
||||
{
|
||||
mLineItem->hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
mLineItem->setLine( layoutPos, 0, layoutPos, page->rect().height() );
|
||||
mLineItem->setLine( layoutPos, 0, layoutPos, mPage->rect().height() );
|
||||
mLineItem->setVisible( showGuide );
|
||||
}
|
||||
|
||||
@ -110,11 +112,14 @@ void QgsLayoutGuide::update()
|
||||
|
||||
QGraphicsLineItem *QgsLayoutGuide::item()
|
||||
{
|
||||
return mLineItem.get();
|
||||
return mLineItem;
|
||||
}
|
||||
|
||||
double QgsLayoutGuide::layoutPosition() const
|
||||
{
|
||||
if ( !mLineItem )
|
||||
return -999;
|
||||
|
||||
switch ( mOrientation )
|
||||
{
|
||||
case Horizontal:
|
||||
@ -128,6 +133,9 @@ double QgsLayoutGuide::layoutPosition() const
|
||||
|
||||
void QgsLayoutGuide::setLayoutPosition( double position )
|
||||
{
|
||||
if ( !mLayout )
|
||||
return;
|
||||
|
||||
double p = 0;
|
||||
switch ( mOrientation )
|
||||
{
|
||||
@ -152,7 +160,21 @@ QgsLayout *QgsLayoutGuide::layout() const
|
||||
void QgsLayoutGuide::setLayout( QgsLayout *layout )
|
||||
{
|
||||
mLayout = layout;
|
||||
mLayout->addItem( mLineItem.get() );
|
||||
|
||||
if ( !mLineItem )
|
||||
{
|
||||
mLineItem = new QGraphicsLineItem();
|
||||
mLineItem->hide();
|
||||
mLineItem->setZValue( QgsLayout::ZGuide );
|
||||
QPen linePen( Qt::DotLine );
|
||||
linePen.setColor( Qt::red );
|
||||
// use a pen width of 0, since this activates a cosmetic pen
|
||||
// which doesn't scale with the composer and keeps a constant size
|
||||
linePen.setWidthF( 0 );
|
||||
mLineItem->setPen( linePen );
|
||||
}
|
||||
|
||||
mLayout->addItem( mLineItem );
|
||||
update();
|
||||
}
|
||||
|
||||
@ -167,12 +189,15 @@ QgsLayoutGuide::Orientation QgsLayoutGuide::orientation() const
|
||||
// QgsLayoutGuideCollection
|
||||
//
|
||||
|
||||
QgsLayoutGuideCollection::QgsLayoutGuideCollection( QgsLayout *layout )
|
||||
QgsLayoutGuideCollection::QgsLayoutGuideCollection( QgsLayout *layout, QgsLayoutPageCollection *pageCollection )
|
||||
: QAbstractTableModel( layout )
|
||||
, mLayout( layout )
|
||||
, mPageCollection( pageCollection )
|
||||
{
|
||||
QFont f;
|
||||
mHeaderSize = QFontMetrics( f ).width( "XX" );
|
||||
|
||||
connect( mPageCollection, &QgsLayoutPageCollection::pageAboutToBeRemoved, this, &QgsLayoutGuideCollection::pageAboutToBeRemoved );
|
||||
}
|
||||
|
||||
QgsLayoutGuideCollection::~QgsLayoutGuideCollection()
|
||||
@ -223,7 +248,7 @@ QVariant QgsLayoutGuideCollection::data( const QModelIndex &index, int role ) co
|
||||
return guide->position().units();
|
||||
|
||||
case PageRole:
|
||||
return guide->page();
|
||||
return mPageCollection->pageNumber( guide->page() );
|
||||
|
||||
case LayoutPositionRole:
|
||||
return guide->layoutPosition();
|
||||
@ -358,23 +383,23 @@ void QgsLayoutGuideCollection::clear()
|
||||
|
||||
void QgsLayoutGuideCollection::applyGuidesToAllOtherPages( int sourcePage )
|
||||
{
|
||||
QgsLayoutItemPage *page = mPageCollection->page( sourcePage );
|
||||
// remove other page's guides
|
||||
Q_FOREACH ( QgsLayoutGuide *guide, mGuides )
|
||||
{
|
||||
if ( guide->page() != sourcePage )
|
||||
if ( guide->page() != page )
|
||||
removeGuide( guide );
|
||||
}
|
||||
|
||||
// remaining guides belong to source page - clone them to other pages
|
||||
Q_FOREACH ( QgsLayoutGuide *guide, mGuides )
|
||||
{
|
||||
for ( int p = 0; p < mLayout->pageCollection()->pageCount(); ++p )
|
||||
for ( int p = 0; p < mPageCollection->pageCount(); ++p )
|
||||
{
|
||||
if ( p == sourcePage )
|
||||
continue;
|
||||
|
||||
std::unique_ptr< QgsLayoutGuide> newGuide( new QgsLayoutGuide( guide->orientation(), guide->position() ) );
|
||||
newGuide->setPage( p );
|
||||
std::unique_ptr< QgsLayoutGuide> newGuide( new QgsLayoutGuide( guide->orientation(), guide->position(), mPageCollection->page( p ) ) );
|
||||
newGuide->setLayout( mLayout );
|
||||
if ( newGuide->item()->isVisible() )
|
||||
{
|
||||
@ -399,7 +424,18 @@ QList<QgsLayoutGuide *> QgsLayoutGuideCollection::guides( QgsLayoutGuide::Orient
|
||||
Q_FOREACH ( QgsLayoutGuide *guide, mGuides )
|
||||
{
|
||||
if ( guide->orientation() == orientation && guide->item()->isVisible() &&
|
||||
( page < 0 || page == guide->page() ) )
|
||||
( page < 0 || mPageCollection->page( page ) == guide->page() ) )
|
||||
res << guide;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
QList<QgsLayoutGuide *> QgsLayoutGuideCollection::guidesOnPage( int page )
|
||||
{
|
||||
QList<QgsLayoutGuide *> res;
|
||||
Q_FOREACH ( QgsLayoutGuide *guide, mGuides )
|
||||
{
|
||||
if ( mPageCollection->page( page ) == guide->page() )
|
||||
res << guide;
|
||||
}
|
||||
return res;
|
||||
@ -416,6 +452,14 @@ void QgsLayoutGuideCollection::setVisible( bool visible )
|
||||
update();
|
||||
}
|
||||
|
||||
void QgsLayoutGuideCollection::pageAboutToBeRemoved( int pageNumber )
|
||||
{
|
||||
Q_FOREACH ( QgsLayoutGuide *guide, guidesOnPage( pageNumber ) )
|
||||
{
|
||||
removeGuide( guide );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "qgis_core.h"
|
||||
#include "qgslayoutmeasurement.h"
|
||||
#include "qgslayoutpoint.h"
|
||||
#include "qgslayoutitempage.h"
|
||||
#include <QPen>
|
||||
#include <QAbstractListModel>
|
||||
#include <QSortFilterProxyModel>
|
||||
@ -26,6 +27,7 @@
|
||||
#include <memory>
|
||||
|
||||
class QgsLayout;
|
||||
class QgsLayoutPageCollection;
|
||||
|
||||
/**
|
||||
* \ingroup core
|
||||
@ -55,7 +57,9 @@ class CORE_EXPORT QgsLayoutGuide : public QObject
|
||||
* Adding the guide to a QgsLayoutGuideCollection will automatically set
|
||||
* the corresponding layout for you.
|
||||
*/
|
||||
QgsLayoutGuide( Orientation orientation, const QgsLayoutMeasurement &position );
|
||||
QgsLayoutGuide( Orientation orientation, const QgsLayoutMeasurement &position, QgsLayoutItemPage *page );
|
||||
|
||||
~QgsLayoutGuide();
|
||||
|
||||
/**
|
||||
* Returns the layout the guide belongs to.
|
||||
@ -99,22 +103,18 @@ class CORE_EXPORT QgsLayoutGuide : public QObject
|
||||
void setPosition( const QgsLayoutMeasurement &position );
|
||||
|
||||
/**
|
||||
* Returns the page number of the guide.
|
||||
*
|
||||
* Page numbering begins at 0.
|
||||
* Returns the page the guide is contained within.
|
||||
*
|
||||
* \see setPage()
|
||||
*/
|
||||
int page() const;
|
||||
QgsLayoutItemPage *page();
|
||||
|
||||
/**
|
||||
* Sets the \a page number of the guide.
|
||||
*
|
||||
* Page numbering begins at 0.
|
||||
* Sets the \a page the guide is contained within.
|
||||
*
|
||||
* \see page()
|
||||
*/
|
||||
void setPage( int page );
|
||||
void setPage( QgsLayoutItemPage *page );
|
||||
|
||||
/**
|
||||
* Updates the position of the guide's line item.
|
||||
@ -152,13 +152,13 @@ class CORE_EXPORT QgsLayoutGuide : public QObject
|
||||
//! Horizontal/vertical position of guide on page
|
||||
QgsLayoutMeasurement mPosition;
|
||||
|
||||
//! Page number, 0 index based
|
||||
int mPage = 0;
|
||||
//! Page
|
||||
QPointer< QgsLayoutItemPage > mPage;
|
||||
|
||||
QgsLayout *mLayout = nullptr;
|
||||
QPointer< QgsLayout > mLayout;
|
||||
|
||||
//! Line item used in scene for guide
|
||||
std::unique_ptr< QGraphicsLineItem > mLineItem;
|
||||
QGraphicsLineItem *mLineItem = nullptr;
|
||||
|
||||
};
|
||||
|
||||
@ -186,9 +186,10 @@ class CORE_EXPORT QgsLayoutGuideCollection : public QAbstractTableModel
|
||||
};
|
||||
|
||||
/**
|
||||
* Constructor for QgsLayoutGuideCollection belonging to the specified layout.
|
||||
* Constructor for QgsLayoutGuideCollection belonging to the specified layout,
|
||||
* and linked to the specified \a pageCollection.
|
||||
*/
|
||||
QgsLayoutGuideCollection( QgsLayout *layout );
|
||||
QgsLayoutGuideCollection( QgsLayout *layout, QgsLayoutPageCollection *pageCollection );
|
||||
~QgsLayoutGuideCollection();
|
||||
|
||||
int rowCount( const QModelIndex & ) const override;
|
||||
@ -233,9 +234,15 @@ class CORE_EXPORT QgsLayoutGuideCollection : public QAbstractTableModel
|
||||
* Returns the list of guides contained in the collection with the specified
|
||||
* \a orientation and on a matching \a page.
|
||||
* If \a page is -1, guides from all pages will be returned.
|
||||
* \see guidesOnPage()
|
||||
*/
|
||||
QList< QgsLayoutGuide * > guides( QgsLayoutGuide::Orientation orientation, int page = -1 );
|
||||
|
||||
/**
|
||||
* Returns the list of guides contained on a matching \a page.
|
||||
* \see guides()
|
||||
*/
|
||||
QList< QgsLayoutGuide * > guidesOnPage( int page );
|
||||
|
||||
/**
|
||||
* Returns true if the guide lines should be drawn.
|
||||
@ -249,9 +256,14 @@ class CORE_EXPORT QgsLayoutGuideCollection : public QAbstractTableModel
|
||||
*/
|
||||
void setVisible( bool visible );
|
||||
|
||||
private slots:
|
||||
|
||||
void pageAboutToBeRemoved( int pageNumber );
|
||||
|
||||
private:
|
||||
|
||||
QgsLayout *mLayout = nullptr;
|
||||
QgsLayoutPageCollection *mPageCollection = nullptr;
|
||||
|
||||
QList< QgsLayoutGuide * > mGuides;
|
||||
int mHeaderSize = 0;
|
||||
|
@ -281,14 +281,14 @@ void QgsLayoutRuler::drawMarkerPos( QPainter *painter )
|
||||
|
||||
void QgsLayoutRuler::drawGuideMarkers( QPainter *p, QgsLayout *layout )
|
||||
{
|
||||
QList< int > visiblePageNumbers = mView->visiblePageNumbers();
|
||||
QList< QgsLayoutItemPage * > visiblePages = mView->visiblePages();
|
||||
QList< QgsLayoutGuide * > guides = layout->guides().guides( mOrientation == Qt::Horizontal ? QgsLayoutGuide::Vertical : QgsLayoutGuide::Horizontal );
|
||||
p->save();
|
||||
p->setRenderHint( QPainter::Antialiasing, true );
|
||||
p->setPen( Qt::NoPen );
|
||||
Q_FOREACH ( QgsLayoutGuide *guide, guides )
|
||||
{
|
||||
if ( visiblePageNumbers.contains( guide->page() ) )
|
||||
if ( visiblePages.contains( guide->page() ) )
|
||||
{
|
||||
if ( guide == mHoverGuide )
|
||||
{
|
||||
@ -364,13 +364,13 @@ QPoint QgsLayoutRuler::convertLayoutPointToLocal( QPointF layoutPoint ) const
|
||||
QgsLayoutGuide *QgsLayoutRuler::guideAtPoint( QPoint localPoint ) const
|
||||
{
|
||||
QPointF layoutPoint = convertLocalPointToLayout( localPoint );
|
||||
QList< int > visiblePageNumbers = mView->visiblePageNumbers();
|
||||
QList< QgsLayoutItemPage * > visiblePages = mView->visiblePages();
|
||||
QList< QgsLayoutGuide * > guides = mView->currentLayout()->guides().guides( mOrientation == Qt::Horizontal ? QgsLayoutGuide::Vertical : QgsLayoutGuide::Horizontal );
|
||||
QgsLayoutGuide *closestGuide = nullptr;
|
||||
double minDelta = DBL_MAX;
|
||||
Q_FOREACH ( QgsLayoutGuide *guide, guides )
|
||||
{
|
||||
if ( visiblePageNumbers.contains( guide->page() ) )
|
||||
if ( visiblePages.contains( guide->page() ) )
|
||||
{
|
||||
double currentDelta = 0;
|
||||
switch ( mOrientation )
|
||||
@ -707,7 +707,7 @@ void QgsLayoutRuler::mouseReleaseEvent( QMouseEvent *event )
|
||||
QPointF layoutPoint = convertLocalPointToLayout( event->pos() );
|
||||
|
||||
// delete guide if it ends outside of page
|
||||
QgsLayoutItemPage *page = mView->currentLayout()->pageCollection()->page( mDraggingGuide->page() );
|
||||
QgsLayoutItemPage *page = mDraggingGuide->page();
|
||||
bool deleteGuide = false;
|
||||
switch ( mDraggingGuide->orientation() )
|
||||
{
|
||||
@ -759,7 +759,6 @@ void QgsLayoutRuler::mouseReleaseEvent( QMouseEvent *event )
|
||||
if ( !page )
|
||||
return; // dragged outside of a page
|
||||
|
||||
int pageNumber = layout->pageCollection()->pageNumber( page );
|
||||
std::unique_ptr< QgsLayoutGuide > guide;
|
||||
switch ( mOrientation )
|
||||
{
|
||||
@ -767,17 +766,16 @@ void QgsLayoutRuler::mouseReleaseEvent( QMouseEvent *event )
|
||||
{
|
||||
//mouse is creating a horizontal guide
|
||||
double posOnPage = layout->pageCollection()->positionOnPage( scenePos ).y();
|
||||
guide.reset( new QgsLayoutGuide( QgsLayoutGuide::Horizontal, QgsLayoutMeasurement( posOnPage, layout->units() ) ) );
|
||||
guide.reset( new QgsLayoutGuide( QgsLayoutGuide::Horizontal, QgsLayoutMeasurement( posOnPage, layout->units() ), page ) );
|
||||
break;
|
||||
}
|
||||
case Qt::Vertical:
|
||||
{
|
||||
//mouse is creating a vertical guide
|
||||
guide.reset( new QgsLayoutGuide( QgsLayoutGuide::Vertical, QgsLayoutMeasurement( scenePos.x(), layout->units() ) ) );
|
||||
guide.reset( new QgsLayoutGuide( QgsLayoutGuide::Vertical, QgsLayoutMeasurement( scenePos.x(), layout->units() ), page ) );
|
||||
break;
|
||||
}
|
||||
}
|
||||
guide->setPage( pageNumber );
|
||||
mView->currentLayout()->guides().addGuide( guide.release() );
|
||||
}
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
p = QgsProject()
|
||||
l = QgsLayout(p)
|
||||
l.initializeDefaults() # add a page
|
||||
g = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters))
|
||||
g = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters), None)
|
||||
self.assertEqual(g.orientation(), QgsLayoutGuide.Horizontal)
|
||||
self.assertEqual(g.position().length(), 5.0)
|
||||
self.assertEqual(g.position().units(), QgsUnitTypes.LayoutCentimeters)
|
||||
@ -55,14 +55,15 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
self.assertEqual(g.position().units(), QgsUnitTypes.LayoutInches)
|
||||
self.assertEqual(len(position_changed_spy), 1)
|
||||
|
||||
g.setPage(1)
|
||||
self.assertEqual(g.page(), 1)
|
||||
page = l.pageCollection().page(0)
|
||||
g.setPage(page)
|
||||
self.assertEqual(g.page(), page)
|
||||
|
||||
def testUpdateGuide(self):
|
||||
p = QgsProject()
|
||||
l = QgsLayout(p)
|
||||
l.initializeDefaults() # add a page
|
||||
g = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters))
|
||||
g = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters), l.pageCollection().page(0))
|
||||
g.setLayout(l)
|
||||
g.update()
|
||||
|
||||
@ -83,7 +84,7 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
self.assertEqual(g.layoutPosition(), 15)
|
||||
|
||||
# vertical guide
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Vertical, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters))
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Vertical, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters), l.pageCollection().page(0))
|
||||
g2.setLayout(l)
|
||||
g2.update()
|
||||
self.assertTrue(g2.item().isVisible())
|
||||
@ -93,11 +94,11 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
self.assertEqual(g2.item().line().y2(), 210)
|
||||
self.assertEqual(g2.layoutPosition(), 50)
|
||||
|
||||
g.setPage(10)
|
||||
g.setPage(None)
|
||||
g.update()
|
||||
self.assertFalse(g.item().isVisible())
|
||||
|
||||
g.setPage(0)
|
||||
g.setPage(l.pageCollection().page(0))
|
||||
g.update()
|
||||
self.assertTrue(g.item().isVisible())
|
||||
|
||||
@ -119,7 +120,7 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
self.assertFalse(guides.guides(QgsLayoutGuide.Vertical))
|
||||
|
||||
# add a guide
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters))
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters), l.pageCollection().page(0))
|
||||
guides.addGuide(g1)
|
||||
self.assertEqual(guides.rowCount(QModelIndex()), 1)
|
||||
self.assertEqual(guides.data(guides.index(0, 0), QgsLayoutGuideCollection.OrientationRole), QgsLayoutGuide.Horizontal)
|
||||
@ -128,8 +129,10 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
self.assertEqual(guides.data(guides.index(0, 0), QgsLayoutGuideCollection.PageRole), 0)
|
||||
self.assertEqual(guides.guides(QgsLayoutGuide.Horizontal), [g1])
|
||||
self.assertFalse(guides.guides(QgsLayoutGuide.Vertical))
|
||||
self.assertEqual(guides.guidesOnPage(0), [g1])
|
||||
self.assertEqual(guides.guidesOnPage(1), [])
|
||||
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(15))
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(15), l.pageCollection().page(0))
|
||||
guides.addGuide(g2)
|
||||
self.assertEqual(guides.rowCount(QModelIndex()), 2)
|
||||
self.assertEqual(guides.data(guides.index(1, 0), QgsLayoutGuideCollection.OrientationRole), QgsLayoutGuide.Horizontal)
|
||||
@ -138,12 +141,12 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
self.assertEqual(guides.data(guides.index(1, 0), QgsLayoutGuideCollection.PageRole), 0)
|
||||
self.assertEqual(guides.guides(QgsLayoutGuide.Horizontal), [g1, g2])
|
||||
self.assertFalse(guides.guides(QgsLayoutGuide.Vertical))
|
||||
self.assertEqual(guides.guidesOnPage(0), [g1, g2])
|
||||
|
||||
page2 = QgsLayoutItemPage(l)
|
||||
page2.setPageSize('A3')
|
||||
l.pageCollection().addPage(page2)
|
||||
g3 = QgsLayoutGuide(QgsLayoutGuide.Vertical, QgsLayoutMeasurement(35))
|
||||
g3.setPage(1)
|
||||
g3 = QgsLayoutGuide(QgsLayoutGuide.Vertical, QgsLayoutMeasurement(35), l.pageCollection().page(1))
|
||||
guides.addGuide(g3)
|
||||
self.assertEqual(guides.rowCount(QModelIndex()), 3)
|
||||
self.assertEqual(guides.data(guides.index(2, 0), QgsLayoutGuideCollection.OrientationRole), QgsLayoutGuide.Vertical)
|
||||
@ -157,6 +160,8 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
self.assertEqual(guides.guides(QgsLayoutGuide.Vertical, 0), [])
|
||||
self.assertEqual(guides.guides(QgsLayoutGuide.Vertical, 1), [g3])
|
||||
self.assertEqual(guides.guides(QgsLayoutGuide.Vertical, 2), [])
|
||||
self.assertEqual(guides.guidesOnPage(0), [g1, g2])
|
||||
self.assertEqual(guides.guidesOnPage(1), [g3])
|
||||
|
||||
def testDeleteRows(self):
|
||||
p = QgsProject()
|
||||
@ -164,11 +169,11 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
l.initializeDefaults()
|
||||
guides = l.guides()
|
||||
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters))
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters), l.pageCollection().page(0))
|
||||
guides.addGuide(g1)
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(15))
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(15), l.pageCollection().page(0))
|
||||
guides.addGuide(g2)
|
||||
g3 = QgsLayoutGuide(QgsLayoutGuide.Vertical, QgsLayoutMeasurement(35))
|
||||
g3 = QgsLayoutGuide(QgsLayoutGuide.Vertical, QgsLayoutMeasurement(35), l.pageCollection().page(0))
|
||||
guides.addGuide(g3)
|
||||
|
||||
self.assertTrue(guides.removeRows(1, 1))
|
||||
@ -201,12 +206,11 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
self.assertEqual(vert_filter.rowCount(QModelIndex()), 0)
|
||||
|
||||
# add some guides
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters))
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters), l.pageCollection().page(0))
|
||||
guides.addGuide(g1)
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(15))
|
||||
g2.setPage(1)
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(15), l.pageCollection().page(1))
|
||||
guides.addGuide(g2)
|
||||
g3 = QgsLayoutGuide(QgsLayoutGuide.Vertical, QgsLayoutMeasurement(35))
|
||||
g3 = QgsLayoutGuide(QgsLayoutGuide.Vertical, QgsLayoutMeasurement(35), l.pageCollection().page(0))
|
||||
guides.addGuide(g3)
|
||||
|
||||
self.assertEqual(hoz_filter.rowCount(QModelIndex()), 1)
|
||||
@ -228,7 +232,7 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
guides = l.guides()
|
||||
|
||||
# add a guide
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters))
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters), l.pageCollection().page(0))
|
||||
guides.addGuide(g1)
|
||||
self.assertEqual(guides.guides(QgsLayoutGuide.Horizontal), [g1])
|
||||
guides.removeGuide(None)
|
||||
@ -243,9 +247,9 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
guides = l.guides()
|
||||
|
||||
# add a guide
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters))
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters), l.pageCollection().page(0))
|
||||
guides.addGuide(g1)
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters))
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters), l.pageCollection().page(0))
|
||||
guides.addGuide(g2)
|
||||
self.assertEqual(guides.guides(QgsLayoutGuide.Horizontal), [g1, g2])
|
||||
guides.clear()
|
||||
@ -261,14 +265,13 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
guides = l.guides()
|
||||
|
||||
# add some guides
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5))
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5), l.pageCollection().page(0))
|
||||
guides.addGuide(g1)
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Vertical, QgsLayoutMeasurement(6))
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Vertical, QgsLayoutMeasurement(6), l.pageCollection().page(0))
|
||||
guides.addGuide(g2)
|
||||
g3 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(190))
|
||||
g3 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(190), l.pageCollection().page(0))
|
||||
guides.addGuide(g3)
|
||||
g4 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(1))
|
||||
g4.setPage(1)
|
||||
g4 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(1), l.pageCollection().page(1))
|
||||
guides.addGuide(g4)
|
||||
|
||||
# apply guides from page 0 - should delete g4
|
||||
@ -300,9 +303,9 @@ class TestQgsLayoutGuide(unittest.TestCase):
|
||||
guides = l.guides()
|
||||
|
||||
# add some guides
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5))
|
||||
g1 = QgsLayoutGuide(QgsLayoutGuide.Horizontal, QgsLayoutMeasurement(5), l.pageCollection().page(0))
|
||||
guides.addGuide(g1)
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Vertical, QgsLayoutMeasurement(6))
|
||||
g2 = QgsLayoutGuide(QgsLayoutGuide.Vertical, QgsLayoutMeasurement(6), l.pageCollection().page(0))
|
||||
guides.addGuide(g2)
|
||||
|
||||
guides.setVisible(False)
|
||||
|
Loading…
x
Reference in New Issue
Block a user