@@ -371,19 +371,21 @@ QgsComposerItem::MouseMoveAction QgsComposerItem::mouseMoveActionForPosition( co
371
371
bool nearLowerBorder = false ;
372
372
bool nearUpperBorder = false ;
373
373
374
- if ( itemCoordPos.x () < 5 )
374
+ double borderTolerance = rectHandlerBorderTolerance ();
375
+
376
+ if ( itemCoordPos.x () < borderTolerance )
375
377
{
376
378
nearLeftBorder = true ;
377
379
}
378
- if ( itemCoordPos.y () < 5 )
380
+ if ( itemCoordPos.y () < borderTolerance )
379
381
{
380
382
nearUpperBorder = true ;
381
383
}
382
- if ( itemCoordPos.x () > ( rect ().width () - 5 ) )
384
+ if ( itemCoordPos.x () > ( rect ().width () - borderTolerance ) )
383
385
{
384
386
nearRightBorder = true ;
385
387
}
386
- if ( itemCoordPos.y () > ( rect ().height () - 5 ) )
388
+ if ( itemCoordPos.y () > ( rect ().height () - borderTolerance ) )
387
389
{
388
390
nearLowerBorder = true ;
389
391
}
@@ -431,6 +433,9 @@ void QgsComposerItem::changeItemRectangle( const QPointF& currentPosition, const
431
433
return ;
432
434
}
433
435
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
+
434
439
double mx = 0.0 , my = 0.0 , rx = 0.0 , ry = 0.0 ;
435
440
QPointF snappedPosition = mComposition ->snapPointToGrid ( currentPosition );
436
441
// double diffX = snappedPosition.x() - mouseMoveStartPos.x();
@@ -499,17 +504,34 @@ void QgsComposerItem::changeItemRectangle( const QPointF& currentPosition, const
499
504
double moveRectX = snappedLeftPoint.x () - originalItem->transform ().dx ();
500
505
double moveRectY = snappedLeftPoint.y () - originalItem->transform ().dy ();
501
506
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
+ }
505
519
return ;
506
520
}
507
521
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
+ }
513
535
}
514
536
515
537
void QgsComposerItem::drawSelectionBoxes ( QPainter* p )
@@ -523,26 +545,8 @@ void QgsComposerItem::drawSelectionBoxes( QPainter* p )
523
545
{
524
546
// size of symbol boxes depends on zoom level in composer view
525
547
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 ();
546
550
547
551
if (mItemPositionLocked )
548
552
{
@@ -556,7 +560,7 @@ void QgsComposerItem::drawSelectionBoxes( QPainter* p )
556
560
QImage lockImage (lockIconPath);
557
561
if (!lockImage.isNull ())
558
562
{
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 ()));
560
564
}
561
565
}
562
566
else // draw blue squares
@@ -743,6 +747,39 @@ double QgsComposerItem::horizontalViewScaleFactor() const
743
747
return result;
744
748
}
745
749
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
+
746
783
void QgsComposerItem::updateCursor (const QPointF& itemPos)
747
784
{
748
785
setCursor ( cursorForPosition (itemPos) );
0 commit comments