Skip to content

Commit 7db0a84

Browse files
author
mhugent
committedMay 12, 2009
Possibility to lock/unlock composer item position by right mouse click
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@10775 c8812cc2-4d05-0410-92ff-de0c093fc19c

File tree

6 files changed

+159
-35
lines changed

6 files changed

+159
-35
lines changed
 

‎images/themes/default/mIconLock.png

1.11 KB
Loading

‎src/core/composer/qgscomposeritem.cpp

Lines changed: 121 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,25 @@
1616
***************************************************************************/
1717
#include <QWidget>
1818
#include <QDomNode>
19+
#include <QFile>
1920
#include <QGraphicsScene>
2021
#include <QGraphicsSceneMouseEvent>
22+
#include <QGraphicsView>
2123
#include <QPainter>
2224

2325
#include "qgscomposition.h"
2426
#include "qgscomposeritem.h"
2527

28+
2629
#include <limits>
30+
#include "qgsapplication.h"
2731
#include "qgsrectangle.h" //just for debugging
2832
#include "qgslogger.h"
2933

3034
#define FONT_WORKAROUND_SCALE 10 //scale factor for upscaling fontsize and downscaling painter
3135

32-
QgsComposerItem::QgsComposerItem( QgsComposition* composition, bool manageZValue ): QGraphicsRectItem( 0 ), mComposition( composition ), mBoundingResizeRectangle( 0 ), mFrame( true )
36+
QgsComposerItem::QgsComposerItem( QgsComposition* composition, bool manageZValue ): QGraphicsRectItem( 0 ), mComposition( composition ), mBoundingResizeRectangle( 0 ), \
37+
mFrame( true ), mItemPositionLocked(false)
3338
{
3439
setFlag( QGraphicsItem::ItemIsSelectable, true );
3540
setAcceptsHoverEvents( true );
@@ -119,6 +124,17 @@ bool QgsComposerItem::_writeXML( QDomElement& itemElem, QDomDocument& doc ) cons
119124
composerItemElem.setAttribute( "zValue", QString::number( zValue() ) );
120125
composerItemElem.setAttribute( "outlineWidth", QString::number( pen().widthF() ) );
121126

127+
//position lock for mouse moves/resizes
128+
if(mItemPositionLocked)
129+
{
130+
composerItemElem.setAttribute( "positionLock", "true");
131+
}
132+
else
133+
{
134+
composerItemElem.setAttribute( "positionLock", "false");
135+
}
136+
137+
122138
//frame color
123139
QDomElement frameColorElem = doc.createElement( "FrameColor" );
124140
QColor frameColor = pen().color();
@@ -160,6 +176,17 @@ bool QgsComposerItem::_readXML( const QDomElement& itemElem, const QDomDocument&
160176
mFrame = false;
161177
}
162178

179+
//position lock for mouse moves/resizes
180+
QString positionLock = itemElem.attribute("positionLock");
181+
if(positionLock.compare("true", Qt::CaseInsensitive) == 0)
182+
{
183+
mItemPositionLocked = true;
184+
}
185+
else
186+
{
187+
mItemPositionLocked = false;
188+
}
189+
163190
//position
164191
double x, y, width, height;
165192
bool xOk, yOk, widthOk, heightOk;
@@ -219,7 +246,11 @@ bool QgsComposerItem::_readXML( const QDomElement& itemElem, const QDomDocument&
219246

220247
void QgsComposerItem::mouseMoveEvent( QGraphicsSceneMouseEvent * event )
221248
{
222-
qWarning( "QgsComposerItem::mouseMoveEvent" );
249+
if(mItemPositionLocked)
250+
{
251+
return;
252+
}
253+
223254
if ( mBoundingResizeRectangle )
224255
{
225256
double diffX = event->lastScenePos().x() - mLastMouseEventPos.x();
@@ -232,6 +263,11 @@ void QgsComposerItem::mouseMoveEvent( QGraphicsSceneMouseEvent * event )
232263

233264
void QgsComposerItem::mousePressEvent( QGraphicsSceneMouseEvent * event )
234265
{
266+
if(mItemPositionLocked)
267+
{
268+
return;
269+
}
270+
235271
//set current position and type of mouse move action
236272
mMouseMoveStartPos = event->lastScenePos();
237273
mLastMouseEventPos = event->lastScenePos();
@@ -260,6 +296,12 @@ void QgsComposerItem::mousePressEvent( QGraphicsSceneMouseEvent * event )
260296

261297
void QgsComposerItem::mouseReleaseEvent( QGraphicsSceneMouseEvent * event )
262298
{
299+
300+
if(mItemPositionLocked)
301+
{
302+
return;
303+
}
304+
263305
//delete frame rectangle
264306
if ( mBoundingResizeRectangle )
265307
{
@@ -289,6 +331,10 @@ Qt::CursorShape QgsComposerItem::cursorForPosition( const QPointF& itemCoordPos
289331
{
290332
QgsComposerItem::MouseMoveAction mouseAction = mouseMoveActionForPosition( itemCoordPos );
291333

334+
if( mouseAction == QgsComposerItem::NoAction)
335+
{
336+
return Qt::ForbiddenCursor;
337+
}
292338
if ( mouseAction == QgsComposerItem::MoveItem )
293339
{
294340
return Qt::ClosedHandCursor;
@@ -314,8 +360,11 @@ Qt::CursorShape QgsComposerItem::cursorForPosition( const QPointF& itemCoordPos
314360
QgsComposerItem::MouseMoveAction QgsComposerItem::mouseMoveActionForPosition( const QPointF& itemCoordPos )
315361
{
316362

317-
//move content tool
318-
363+
//no action at all if item position is locked for mouse
364+
if(mItemPositionLocked)
365+
{
366+
return QgsComposerItem::NoAction;
367+
}
319368

320369
bool nearLeftBorder = false;
321370
bool nearRightBorder = false;
@@ -472,15 +521,53 @@ void QgsComposerItem::drawSelectionBoxes( QPainter* p )
472521

473522
if ( mComposition->plotStyle() == QgsComposition::Preview )
474523
{
475-
p->setPen( QPen( QColor( 0, 0, 255 ) ) );
476-
p->setBrush( QBrush( QColor( 0, 0, 255 ) ) );
524+
//size of symbol boxes depends on zoom level in composer view
525+
double viewScaleFactor = horizontalViewScaleFactor();
526+
double rectHandlerSize = 10.0 / viewScaleFactor;
527+
double lockSymbolSize = 20.0 / viewScaleFactor;
477528

478-
double s = 5;
529+
//make sure the boxes don't get too large
530+
if(rectHandlerSize > (rect().width() / 3))
531+
{
532+
rectHandlerSize = rect().width() / 3;
533+
}
534+
if(rectHandlerSize > (rect().height() / 3))
535+
{
536+
rectHandlerSize = rect().height() / 3;
537+
}
538+
if(lockSymbolSize > (rect().width() / 3))
539+
{
540+
lockSymbolSize = rect().width() / 3;
541+
}
542+
if(lockSymbolSize > (rect().height() / 3))
543+
{
544+
lockSymbolSize = rect().height() / 3;
545+
}
479546

480-
p->drawRect( QRectF( 0, 0, s, s ) );
481-
p->drawRect( QRectF( rect().width() - s, 0, s, s ) );
482-
p->drawRect( QRectF( rect().width() - s, rect().height() - s, s, s ) );
483-
p->drawRect( QRectF( 0, rect().height() - s, s, s ) );
547+
if(mItemPositionLocked)
548+
{
549+
//draw lock symbol at upper left edge. Use QImage to be independant of the graphic system
550+
QString lockIconPath = QgsApplication::activeThemePath() + "/mIconLock.png";
551+
if(!QFile::exists(lockIconPath))
552+
{
553+
lockIconPath = QgsApplication::defaultThemePath() + "/mIconLock.png";
554+
}
555+
556+
QImage lockImage(lockIconPath);
557+
if(!lockImage.isNull())
558+
{
559+
p->drawImage(QRectF(0, 0, lockSymbolSize, lockSymbolSize), lockImage, QRectF(0, 0, lockImage.width(), lockImage.height()));
560+
}
561+
}
562+
else //draw blue squares
563+
{
564+
p->setPen( QPen( QColor( 0, 0, 255 ) ) );
565+
p->setBrush( QBrush( QColor( 0, 0, 255 ) ) );
566+
p->drawRect( QRectF( 0, 0, rectHandlerSize, rectHandlerSize ) );
567+
p->drawRect( QRectF( rect().width() - rectHandlerSize, 0, rectHandlerSize, rectHandlerSize ) );
568+
p->drawRect( QRectF( rect().width() - rectHandlerSize, rect().height() - rectHandlerSize, rectHandlerSize, rectHandlerSize ) );
569+
p->drawRect( QRectF( 0, rect().height() - rectHandlerSize, rectHandlerSize, rectHandlerSize ) );
570+
}
484571
}
485572
}
486573

@@ -637,3 +724,26 @@ QFont QgsComposerItem::scaledFontPixelSize( const QFont& font ) const
637724
scaledFont.setPixelSize( pixelSize );
638725
return scaledFont;
639726
}
727+
728+
double QgsComposerItem::horizontalViewScaleFactor() const
729+
{
730+
double result = 1;
731+
if ( scene() )
732+
{
733+
QList<QGraphicsView*> viewList = scene()->views();
734+
if ( viewList.size() > 0 )
735+
{
736+
result = viewList.at( 0 )->transform().m11();
737+
}
738+
else
739+
{
740+
return 1; //probably called from non-gui code
741+
}
742+
}
743+
return result;
744+
}
745+
746+
void QgsComposerItem::updateCursor(const QPointF& itemPos)
747+
{
748+
setCursor( cursorForPosition(itemPos) );
749+
}

‎src/core/composer/qgscomposeritem.h

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ class CORE_EXPORT QgsComposerItem: public QGraphicsRectItem
4545
ResizeLeftUp,
4646
ResizeRightUp,
4747
ResizeLeftDown,
48-
ResizeRightDown
48+
ResizeRightDown,
49+
NoAction
4950
};
5051

5152
enum ItemPositionMode
@@ -155,6 +156,18 @@ class CORE_EXPORT QgsComposerItem: public QGraphicsRectItem
155156
/**Returns a font where size is in pixel and font size is upscaled with FONT_WORKAROUND_SCALE*/
156157
QFont scaledFontPixelSize( const QFont& font ) const;
157158

159+
/**Locks / unlocks the item position for mouse drags
160+
@note this method was added in version 1.2*/
161+
void setPositionLock(bool lock){mItemPositionLocked = lock;}
162+
163+
/**Returns position lock for mouse drags (true means locked)
164+
@note this method was added in version 1.2*/
165+
bool positionLock() const {return mItemPositionLocked;}
166+
167+
/**Update mouse cursor at (item) position
168+
@note this method was added in version 1.2*/
169+
void updateCursor(const QPointF& itemPos);
170+
158171
protected:
159172

160173
QgsComposition* mComposition;
@@ -171,6 +184,10 @@ class CORE_EXPORT QgsComposerItem: public QGraphicsRectItem
171184
/**True if item fram needs to be painted*/
172185
bool mFrame;
173186

187+
/**True if item position and size cannot be changed with mouse move
188+
@note: this member was added in version 1.2*/
189+
bool mItemPositionLocked;
190+
174191
//event handlers
175192
virtual void mouseMoveEvent( QGraphicsSceneMouseEvent * event );
176193
virtual void mousePressEvent( QGraphicsSceneMouseEvent * event );
@@ -202,6 +219,10 @@ class CORE_EXPORT QgsComposerItem: public QGraphicsRectItem
202219

203220
/**Draw background*/
204221
virtual void drawBackground( QPainter* p );
222+
223+
/**Returns the zoom factor of the graphics view. If no
224+
graphics view exists, the default 1 is returned*/
225+
double horizontalViewScaleFactor() const;
205226
};
206227

207228
#endif

‎src/core/composer/qgscomposermap.cpp

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
#include "qgslabelattributes.h"
3535

3636
#include <QGraphicsScene>
37-
#include <QGraphicsView>
3837
#include <QPainter>
3938
#include <QSettings>
4039
#include <iostream>
@@ -457,24 +456,6 @@ bool QgsComposerMap::containsWMSLayer() const
457456
return false;
458457
}
459458

460-
double QgsComposerMap::horizontalViewScaleFactor() const
461-
{
462-
double result = 1;
463-
if ( scene() )
464-
{
465-
QList<QGraphicsView*> viewList = scene()->views();
466-
if ( viewList.size() > 0 )
467-
{
468-
result = viewList.at( 0 )->transform().m11();
469-
}
470-
else
471-
{
472-
return 1; //probably called from non-gui code
473-
}
474-
}
475-
return result;
476-
}
477-
478459
void QgsComposerMap::connectUpdateSlot()
479460
{
480461
//connect signal from layer registry to update in case of new or deleted layers

‎src/core/composer/qgscomposermap.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,6 @@ class CORE_EXPORT QgsComposerMap : /*public QWidget, private Ui::QgsComposerMapB
185185

186186
/**Establishes signal/slot connection for update in case of layer change*/
187187
void connectUpdateSlot();
188-
189-
/**Returns the zoom factor of the graphics view. If no
190-
graphics view exists, the default 1 is returned*/
191-
double horizontalViewScaleFactor() const;
192188
};
193189

194190
#endif

‎src/gui/qgscomposerview.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,22 @@ void QgsComposerView::mousePressEvent( QMouseEvent* e )
4545
QPointF scenePoint = mapToScene( e->pos() );
4646
QPointF snappedScenePoint = composition()->snapPointToGrid( scenePoint );
4747

48+
//lock/unlock position of item with right click
49+
if(e->button() == Qt::RightButton)
50+
{
51+
QgsComposerItem* selectedItem = composition()->composerItemAt( scenePoint );
52+
if(selectedItem)
53+
{
54+
bool lock = selectedItem->positionLock() ? false : true;
55+
selectedItem->setPositionLock(lock);
56+
selectedItem->update();
57+
//make sure the new cursor is correct
58+
QPointF itemPoint = selectedItem->mapFromScene( scenePoint );
59+
selectedItem->updateCursor(itemPoint);
60+
}
61+
return;
62+
}
63+
4864
switch ( mCurrentTool )
4965
{
5066
//select/deselect items and pass mouse event further

0 commit comments

Comments
 (0)
Please sign in to comment.