@@ -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
515537void 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+
746783void QgsComposerItem::updateCursor (const QPointF& itemPos)
747784{
748785 setCursor ( cursorForPosition (itemPos) );
0 commit comments