Skip to content

Commit cb1f5c3

Browse files
committed
Show snap lines in ruler mouse move event
1 parent 31a9021 commit cb1f5c3

File tree

3 files changed

+69
-27
lines changed

3 files changed

+69
-27
lines changed

src/app/composer/qgscomposer.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
254254
mHorizontalRuler = new QgsComposerRuler( QgsComposerRuler::Horizontal );
255255
mVerticalRuler = new QgsComposerRuler( QgsComposerRuler::Vertical );
256256
QWidget* fake = new QWidget();
257+
fake->setAttribute( Qt::WA_NoMousePropagation );
257258
fake->setBackgroundRole( QPalette::Window );
258259
fake->setFixedSize( 20, 20 );
259260
mViewLayout->addWidget( fake, 0, 0 );

src/gui/qgscomposerruler.cpp

+57-24
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
#include "qgscomposerruler.h"
22
#include "qgscomposition.h"
33
#include "qgis.h"
4+
#include <QDragEnterEvent>
5+
#include <QGraphicsLineItem>
46
#include <QPainter>
57
#include <cmath>
68

79
const int RULER_MIN_SIZE = 20;
810

9-
QgsComposerRuler::QgsComposerRuler( QgsComposerRuler::Direction d ): QWidget( 0 ), mDirection( d ), mComposition( 0 )
11+
QgsComposerRuler::QgsComposerRuler( QgsComposerRuler::Direction d ): QWidget( 0 ), mDirection( d ), mComposition( 0 ), mLineSnapItem( 0 )
1012
{
13+
setMouseTracking( true );
1114
}
1215

1316
QgsComposerRuler::~QgsComposerRuler()
@@ -111,29 +114,6 @@ void QgsComposerRuler::paintEvent( QPaintEvent* event )
111114
}
112115
}
113116

114-
#if 0
115-
double markerPos = ( floor( startY / mmDisplay ) + 1 ) * mmDisplay; //marker position in mm
116-
while ( markerPos <= endY )
117-
{
118-
int page = ( int )( markerPos / ( mComposition->paperHeight() + mComposition->spaceBetweenPages() ) );
119-
double pageCoord = markerPos - page * ( mComposition->paperHeight() + mComposition->spaceBetweenPages() );
120-
if ( page >= mComposition->numPages() )
121-
{
122-
break;
123-
}
124-
125-
if ( pageCoord < 0 || pageCoord > mComposition->paperHeight() ) //marker is in a page gap
126-
{
127-
markerPos += mmDisplay;
128-
continue;
129-
}
130-
double pixelCoord = mTransform.map( QPointF( 0, markerPos ) ).y();
131-
p.drawLine( 0, pixelCoord, RULER_MIN_SIZE, pixelCoord );
132-
p.drawText( QPointF( 0, pixelCoord - 2.0 ), QString::number( pageCoord ) );
133-
markerPos += mmDisplay;
134-
}
135-
#endif //0
136-
137117
p.setPen( QColor( Qt::red ) );
138118
p.drawLine( 0, mMarkerPos.y(), RULER_MIN_SIZE, mMarkerPos.y() );
139119
}
@@ -146,3 +126,56 @@ void QgsComposerRuler::setSceneTransform( const QTransform& transform )
146126
mTransform = transform;
147127
update();
148128
}
129+
130+
void QgsComposerRuler::mouseMoveEvent( QMouseEvent* event )
131+
{
132+
qWarning( "QgsComposerRuler::mouseMoveEvent" );
133+
updateMarker( event->posF() );
134+
setSnapLinePosition( event->posF() );
135+
}
136+
137+
void QgsComposerRuler::mouseReleaseEvent( QMouseEvent* event )
138+
{
139+
Q_UNUSED( event );
140+
delete mLineSnapItem;
141+
mLineSnapItem = 0;
142+
}
143+
144+
void QgsComposerRuler::mousePressEvent( QMouseEvent* event )
145+
{
146+
delete mLineSnapItem;
147+
mLineSnapItem = 0;
148+
mLineSnapItem = createLineSnapItem();
149+
mComposition->addItem( mLineSnapItem );
150+
setSnapLinePosition( event->posF() );
151+
mLineSnapItem->show();
152+
}
153+
154+
void QgsComposerRuler::setSnapLinePosition( const QPointF& pos )
155+
{
156+
if ( !mLineSnapItem || !mComposition )
157+
{
158+
return;
159+
}
160+
161+
QPointF transformedPt = mTransform.inverted().map( pos );
162+
if ( mDirection == Horizontal )
163+
{
164+
mLineSnapItem->setLine( QLineF( transformedPt.x(), 0, transformedPt.x(), mComposition->height() ) );
165+
}
166+
else //vertical
167+
{
168+
mLineSnapItem->setLine( QLineF( 0, transformedPt.y(), mComposition->width(), transformedPt.y() ) );
169+
}
170+
}
171+
172+
QGraphicsLineItem* QgsComposerRuler::createLineSnapItem()
173+
{
174+
QGraphicsLineItem* item = new QGraphicsLineItem();
175+
QPen linePen( Qt::SolidLine );
176+
linePen.setColor( Qt::red );
177+
linePen.setWidthF( 0.5 );
178+
item->setPen( linePen );
179+
item->setZValue( 100 );
180+
return item;
181+
}

src/gui/qgscomposerruler.h

+11-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include <QWidget>
55
class QgsComposition;
6+
class QGraphicsLineItem;
67

78
/**A class to show paper scale and the current cursor position*/
89
class QgsComposerRuler: public QWidget
@@ -22,17 +23,24 @@ class QgsComposerRuler: public QWidget
2223
void setSceneTransform( const QTransform& transform );
2324
void updateMarker( const QPointF& pos ) { mMarkerPos = pos; repaint(); }
2425

25-
void setComposition( const QgsComposition* c ) { mComposition = c; }
26-
const QgsComposition* composition() const { return mComposition; }
26+
void setComposition( QgsComposition* c ) { mComposition = c; }
27+
QgsComposition* composition() { return mComposition; }
2728

2829
protected:
2930
void paintEvent( QPaintEvent* event );
31+
void mouseMoveEvent( QMouseEvent* event );
32+
void mouseReleaseEvent( QMouseEvent* event );
33+
void mousePressEvent( QMouseEvent* event );
3034

3135
private:
3236
Direction mDirection;
3337
QTransform mTransform;
3438
QPointF mMarkerPos;
35-
const QgsComposition* mComposition; //reference to composition for paper size, nPages
39+
QgsComposition* mComposition; //reference to composition for paper size, nPages
40+
QGraphicsLineItem* mLineSnapItem;
41+
42+
void setSnapLinePosition( const QPointF& pos );
43+
static QGraphicsLineItem* createLineSnapItem();
3644
};
3745

3846
#endif // QGSCOMPOSERRULER_H

0 commit comments

Comments
 (0)