39 changes: 38 additions & 1 deletion src/gui/qgscomposerruler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ void QgsComposerRuler::mouseReleaseEvent( QMouseEvent* event )
if ( removeItem )
{
mComposition->removeSnapLine( mLineSnapItem );
mSnappedItems.clear();
}
mLineSnapItem = 0;
}
Expand All @@ -171,7 +172,7 @@ void QgsComposerRuler::mousePressEvent( QMouseEvent* event )
}

//horizontal ruler means vertical snap line
QGraphicsLineItem* line = mComposition->nearestSnapLine( mDirection != Horizontal, x, y, 10.0 );
QGraphicsLineItem* line = mComposition->nearestSnapLine( mDirection != Horizontal, x, y, 10.0, mSnappedItems );
if ( !line )
{
//create new snap line
Expand Down Expand Up @@ -206,6 +207,42 @@ void QgsComposerRuler::setSnapLinePosition( const QPointF& pos )
{
mLineSnapItem->setLine( QLineF( 0, transformedPt.y(), mComposition->paperWidth(), transformedPt.y() ) );
}

//move snapped items together with the snap line
QList< QPair< QgsComposerItem*, QgsComposerItem::ItemPositionMode > >::iterator itemIt = mSnappedItems.begin();
for ( ; itemIt != mSnappedItems.end(); ++itemIt )
{
if ( mDirection == Horizontal )
{
if ( itemIt->second == QgsComposerItem::MiddleLeft )
{
itemIt->first->setItemPosition( transformedPt.x(), itemIt->first->transform().dy(), QgsComposerItem::UpperLeft );
}
else if ( itemIt->second == QgsComposerItem::Middle )
{
itemIt->first->setItemPosition( transformedPt.x(), itemIt->first->transform().dy(), QgsComposerItem::UpperMiddle );
}
else
{
itemIt->first->setItemPosition( transformedPt.x(), itemIt->first->transform().dy(), QgsComposerItem::UpperRight );
}
}
else
{
if ( itemIt->second == QgsComposerItem::UpperMiddle )
{
itemIt->first->setItemPosition( itemIt->first->transform().dx(), transformedPt.y(), QgsComposerItem::UpperLeft );
}
else if ( itemIt->second == QgsComposerItem::Middle )
{
itemIt->first->setItemPosition( itemIt->first->transform().dx(), transformedPt.y(), QgsComposerItem::MiddleLeft );
}
else
{
itemIt->first->setItemPosition( itemIt->first->transform().dx(), transformedPt.y(), QgsComposerItem::LowerLeft );
}
}
}
}

QGraphicsLineItem* QgsComposerRuler::createLineSnapItem()
Expand Down
3 changes: 3 additions & 0 deletions src/gui/qgscomposerruler.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#ifndef QGSCOMPOSERRULER_H
#define QGSCOMPOSERRULER_H

#include "qgscomposeritem.h"
#include <QWidget>
class QgsComposition;
class QGraphicsLineItem;
Expand Down Expand Up @@ -38,6 +39,8 @@ class QgsComposerRuler: public QWidget
QPointF mMarkerPos;
QgsComposition* mComposition; //reference to composition for paper size, nPages
QGraphicsLineItem* mLineSnapItem;
//items snapped to the current snap line
QList< QPair< QgsComposerItem*, QgsComposerItem::ItemPositionMode > > mSnappedItems;

void setSnapLinePosition( const QPointF& pos );
static QGraphicsLineItem* createLineSnapItem();
Expand Down