Skip to content

Commit a479fa6

Browse files
author
mhugent
committed
Some improvements and bugfixes for moving and resizing composer items
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@10776 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 7db0a84 commit a479fa6

File tree

2 files changed

+80
-34
lines changed

2 files changed

+80
-34
lines changed

src/core/composer/qgscomposeritem.cpp

+70-33
Original file line numberDiff line numberDiff line change
@@ -371,19 +371,21 @@ QgsComposerItem::MouseMoveAction QgsComposerItem::mouseMoveActionForPosition( co
371371
bool nearLowerBorder = false;
372372
bool nearUpperBorder = false;
373373

374-
if ( itemCoordPos.x() < 5 )
374+
double borderTolerance = rectHandlerBorderTolerance();
375+
376+
if ( itemCoordPos.x() < borderTolerance )
375377
{
376378
nearLeftBorder = true;
377379
}
378-
if ( itemCoordPos.y() < 5 )
380+
if ( itemCoordPos.y() < borderTolerance )
379381
{
380382
nearUpperBorder = true;
381383
}
382-
if ( itemCoordPos.x() > ( rect().width() - 5 ) )
384+
if ( itemCoordPos.x() > ( rect().width() - borderTolerance ) )
383385
{
384386
nearRightBorder = true;
385387
}
386-
if ( itemCoordPos.y() > ( rect().height() - 5 ) )
388+
if ( itemCoordPos.y() > ( rect().height() - borderTolerance ) )
387389
{
388390
nearLowerBorder = true;
389391
}
@@ -431,6 +433,9 @@ void QgsComposerItem::changeItemRectangle( const QPointF& currentPosition, const
431433
return;
432434
}
433435

436+
//test if change item is a composer item. If so, prefer call to setSceneRect() instead of setTransform() and setRect()
437+
QgsComposerItem* changeComposerItem = dynamic_cast<QgsComposerItem*>(changeItem);
438+
434439
double mx = 0.0, my = 0.0, rx = 0.0, ry = 0.0;
435440
QPointF snappedPosition = mComposition->snapPointToGrid( currentPosition );
436441
//double diffX = snappedPosition.x() - mouseMoveStartPos.x();
@@ -499,17 +504,34 @@ void QgsComposerItem::changeItemRectangle( const QPointF& currentPosition, const
499504
double moveRectX = snappedLeftPoint.x() - originalItem->transform().dx();
500505
double moveRectY = snappedLeftPoint.y() - originalItem->transform().dy();
501506

502-
QTransform moveTransform;
503-
moveTransform.translate( originalItem->transform().dx() + moveRectX, originalItem->transform().dy() + moveRectY );
504-
changeItem->setTransform( moveTransform );
507+
if(!changeComposerItem)
508+
{
509+
QTransform moveTransform;
510+
moveTransform.translate( originalItem->transform().dx() + moveRectX, originalItem->transform().dy() + moveRectY );
511+
changeItem->setTransform( moveTransform );
512+
}
513+
else //for composer items, we prefer setSceneRect as subclasses can implement custom behaviour (e.g. item group)
514+
{
515+
changeComposerItem->setSceneRect(QRectF(originalItem->transform().dx() + moveRectX, \
516+
originalItem->transform().dy() + moveRectY, \
517+
originalItem->rect().width(), originalItem->rect().height()));
518+
}
505519
return;
506520
}
507521

508-
QTransform itemTransform;
509-
itemTransform.translate( originalItem->transform().dx() + mx, originalItem->transform().dy() + my );
510-
changeItem->setTransform( itemTransform );
511-
QRectF itemRect( 0, 0, originalItem->rect().width() + rx, originalItem->rect().height() + ry );
512-
changeItem->setRect( itemRect );
522+
if(!changeComposerItem)
523+
{
524+
QTransform itemTransform;
525+
itemTransform.translate( originalItem->transform().dx() + mx, originalItem->transform().dy() + my );
526+
changeItem->setTransform( itemTransform );
527+
QRectF itemRect( 0, 0, originalItem->rect().width() + rx, originalItem->rect().height() + ry );
528+
changeItem->setRect( itemRect );
529+
}
530+
else //for composer items, we prefer setSceneRect as subclasses can implement custom behaviour (e.g. item group)
531+
{
532+
changeComposerItem->setSceneRect( QRectF(originalItem->transform().dx() + mx, originalItem->transform().dy() + my, \
533+
originalItem->rect().width() + rx, originalItem->rect().height() + ry) );
534+
}
513535
}
514536

515537
void QgsComposerItem::drawSelectionBoxes( QPainter* p )
@@ -523,26 +545,8 @@ void QgsComposerItem::drawSelectionBoxes( QPainter* p )
523545
{
524546
//size of symbol boxes depends on zoom level in composer view
525547
double viewScaleFactor = horizontalViewScaleFactor();
526-
double rectHandlerSize = 10.0 / viewScaleFactor;
527-
double lockSymbolSize = 20.0 / viewScaleFactor;
528-
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-
}
548+
double rectHandlerSize = rectHandlerBorderTolerance();
549+
double sizeLockSymbol = lockSymbolSize();
546550

547551
if(mItemPositionLocked)
548552
{
@@ -556,7 +560,7 @@ void QgsComposerItem::drawSelectionBoxes( QPainter* p )
556560
QImage lockImage(lockIconPath);
557561
if(!lockImage.isNull())
558562
{
559-
p->drawImage(QRectF(0, 0, lockSymbolSize, lockSymbolSize), lockImage, QRectF(0, 0, lockImage.width(), lockImage.height()));
563+
p->drawImage(QRectF(0, 0, sizeLockSymbol, sizeLockSymbol), lockImage, QRectF(0, 0, lockImage.width(), lockImage.height()));
560564
}
561565
}
562566
else //draw blue squares
@@ -743,6 +747,39 @@ double QgsComposerItem::horizontalViewScaleFactor() const
743747
return result;
744748
}
745749

750+
double QgsComposerItem::rectHandlerBorderTolerance() const
751+
{
752+
//size of symbol boxes depends on zoom level in composer view
753+
double viewScaleFactor = horizontalViewScaleFactor();
754+
double rectHandlerSize = 10.0 / viewScaleFactor;
755+
756+
//make sure the boxes don't get too large
757+
if(rectHandlerSize > (rect().width() / 3))
758+
{
759+
rectHandlerSize = rect().width() / 3;
760+
}
761+
if(rectHandlerSize > (rect().height() / 3))
762+
{
763+
rectHandlerSize = rect().height() / 3;
764+
}
765+
return rectHandlerSize;
766+
}
767+
768+
double QgsComposerItem::lockSymbolSize() const
769+
{
770+
double lockSymbolSize = 20.0 / horizontalViewScaleFactor();
771+
772+
if(lockSymbolSize > (rect().width() / 3))
773+
{
774+
lockSymbolSize = rect().width() / 3;
775+
}
776+
if(lockSymbolSize > (rect().height() / 3))
777+
{
778+
lockSymbolSize = rect().height() / 3;
779+
}
780+
return lockSymbolSize;
781+
}
782+
746783
void QgsComposerItem::updateCursor(const QPointF& itemPos)
747784
{
748785
setCursor( cursorForPosition(itemPos) );

src/core/composer/qgscomposeritem.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,17 @@ class CORE_EXPORT QgsComposerItem: public QGraphicsRectItem
220220
/**Draw background*/
221221
virtual void drawBackground( QPainter* p );
222222

223+
/**Returns the current (zoom level dependent) tolerance to decide if mouse position is close enough to the \
224+
item border for resizing*/
225+
double rectHandlerBorderTolerance() const;
226+
227+
/**Returns the size of the lock symbol depending on the composer zoom level and the item size
228+
@note: this function was introduced in version 1.2*/
229+
double lockSymbolSize() const;
230+
223231
/**Returns the zoom factor of the graphics view. If no
224-
graphics view exists, the default 1 is returned*/
232+
graphics view exists, the default 1 is returned
233+
@note: this function was introduced in version 1.2*/
225234
double horizontalViewScaleFactor() const;
226235
};
227236

0 commit comments

Comments
 (0)