1
1
#include " qgscomposerruler.h"
2
2
#include " qgscomposition.h"
3
3
#include " qgis.h"
4
+ #include < QDragEnterEvent>
5
+ #include < QGraphicsLineItem>
4
6
#include < QPainter>
5
7
#include < cmath>
6
8
7
9
const int RULER_MIN_SIZE = 20 ;
8
10
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 )
10
12
{
13
+ setMouseTracking ( true );
11
14
}
12
15
13
16
QgsComposerRuler::~QgsComposerRuler ()
@@ -111,29 +114,6 @@ void QgsComposerRuler::paintEvent( QPaintEvent* event )
111
114
}
112
115
}
113
116
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
-
137
117
p.setPen ( QColor ( Qt::red ) );
138
118
p.drawLine ( 0 , mMarkerPos .y (), RULER_MIN_SIZE, mMarkerPos .y () );
139
119
}
@@ -146,3 +126,56 @@ void QgsComposerRuler::setSceneTransform( const QTransform& transform )
146
126
mTransform = transform;
147
127
update ();
148
128
}
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
+ }
0 commit comments