@@ -122,6 +122,11 @@ void QgsComposerItem::init( bool manageZValue )
122
122
setGraphicsEffect ( mEffect );
123
123
124
124
// data defined strings
125
+ mDataDefinedNames .insert ( PageNumber, QString ( " dataDefinedPageNumber" ) );
126
+ mDataDefinedNames .insert ( PositionX, QString ( " dataDefinedPositionX" ) );
127
+ mDataDefinedNames .insert ( PositionY, QString ( " dataDefinedPositionY" ) );
128
+ mDataDefinedNames .insert ( ItemWidth, QString ( " dataDefinedWidth" ) );
129
+ mDataDefinedNames .insert ( ItemHeight, QString ( " dataDefinedHeight" ) );
125
130
mDataDefinedNames .insert ( ItemRotation, QString ( " dataDefinedRotation" ) );
126
131
mDataDefinedNames .insert ( Transparency, QString ( " dataDefinedTransparency" ) );
127
132
mDataDefinedNames .insert ( BlendMode, QString ( " dataDefinedBlendMode" ) );
@@ -351,7 +356,6 @@ bool QgsComposerItem::_readXML( const QDomElement& itemElem, const QDomDocument&
351
356
352
357
mLastValidViewScaleFactor = itemElem.attribute ( " lastValidViewScaleFactor" , " -1" ).toDouble ();
353
358
354
- setSceneRect ( QRectF ( x, y, width, height ) );
355
359
setZValue ( itemElem.attribute ( " zValue" ).toDouble () );
356
360
357
361
// pen
@@ -409,6 +413,9 @@ bool QgsComposerItem::_readXML( const QDomElement& itemElem, const QDomDocument&
409
413
mComposition ->readDataDefinedPropertyMap ( itemElem, &mDataDefinedNames , &mDataDefinedProperties );
410
414
}
411
415
416
+ QRectF evaluatedRect = evalItemRect ( QRectF ( x, y, width, height ) );
417
+ setSceneRect ( evaluatedRect );
418
+
412
419
return true ;
413
420
}
414
421
@@ -542,7 +549,7 @@ double QgsComposerItem::itemRotation( PropertyValueType valueType ) const
542
549
void QgsComposerItem::move ( double dx, double dy )
543
550
{
544
551
QRectF newSceneRect ( pos ().x () + dx, pos ().y () + dy, rect ().width (), rect ().height () );
545
- setSceneRect ( newSceneRect );
552
+ setSceneRect ( evalItemRect ( newSceneRect ) );
546
553
}
547
554
548
555
int QgsComposerItem::page () const
@@ -571,7 +578,11 @@ void QgsComposerItem::updatePagePos( double newPageWidth, double newPageHeight )
571
578
Q_UNUSED ( newPageWidth )
572
579
QPointF curPagePos = pagePos ();
573
580
int curPage = page () - 1 ;
574
- setY ( curPage * ( newPageHeight + composition ()->spaceBetweenPages () ) + curPagePos.y () );
581
+
582
+ double y = curPage * ( newPageHeight + composition ()->spaceBetweenPages () ) + curPagePos.y ();
583
+ QRectF newSceneRect ( pos ().x (), y, rect ().width (), rect ().height () );
584
+
585
+ setSceneRect ( evalItemRect ( newSceneRect ) );
575
586
emit sizeChanged ();
576
587
}
577
588
@@ -638,7 +649,10 @@ void QgsComposerItem::setItemPosition( double x, double y, double width, double
638
649
height -= 2 * estimatedFrameBleed ();
639
650
}
640
651
641
- setSceneRect ( QRectF ( upperLeftX, upperLeftY, width, height ) );
652
+ // consider data defined item size and position before finalising rect
653
+ QRectF newRect = evalItemRect ( QRectF ( upperLeftX, upperLeftY, width, height ) );
654
+
655
+ setSceneRect ( newRect );
642
656
}
643
657
644
658
void QgsComposerItem::setSceneRect ( const QRectF& rectangle )
@@ -662,13 +676,109 @@ void QgsComposerItem::setSceneRect( const QRectF& rectangle )
662
676
yTranslation -= newHeight;
663
677
}
664
678
665
- QRectF newRect ( 0 , 0 , newWidth, newHeight );
666
- QGraphicsRectItem::setRect ( newRect );
667
- setPos ( xTranslation, yTranslation );
679
+ QGraphicsRectItem::setRect ( QRectF ( 0 , 0 , newWidth, newHeight ) );
680
+ setPos ( QPointF ( xTranslation, yTranslation ) );
668
681
669
682
emit sizeChanged ();
670
683
}
671
684
685
+ QRectF QgsComposerItem::evalItemRect ( const QRectF &newRect )
686
+ {
687
+ QRectF result = newRect;
688
+
689
+ // data defined position or size set? if so, update rect with data defined values
690
+ QVariant exprVal;
691
+ // evaulate width and height first, since they may affect position if non-top-left reference point set
692
+ if ( dataDefinedEvaluate ( QgsComposerItem::ItemWidth, exprVal ) )
693
+ {
694
+ bool ok;
695
+ double width = exprVal.toDouble ( &ok );
696
+ QgsDebugMsg ( QString ( " exprVal Width:%1" ).arg ( width ) );
697
+ if ( ok )
698
+ {
699
+ result.setWidth ( width );
700
+ }
701
+ }
702
+ if ( dataDefinedEvaluate ( QgsComposerItem::ItemHeight, exprVal ) )
703
+ {
704
+ bool ok;
705
+ double height = exprVal.toDouble ( &ok );
706
+ QgsDebugMsg ( QString ( " exprVal Height:%1" ).arg ( height ) );
707
+ if ( ok )
708
+ {
709
+ result.setHeight ( height );
710
+ }
711
+ }
712
+
713
+ double x = result.left ();
714
+ // initially adjust for position mode to get top-left coordinate
715
+ if ( mLastUsedPositionMode == UpperMiddle || mLastUsedPositionMode == Middle || mLastUsedPositionMode == LowerMiddle )
716
+ {
717
+ x += newRect.width () / 2.0 ;
718
+ }
719
+ else if ( mLastUsedPositionMode == UpperRight || mLastUsedPositionMode == MiddleRight || mLastUsedPositionMode == LowerRight )
720
+ {
721
+ x += newRect.width ();
722
+ }
723
+ if ( dataDefinedEvaluate ( QgsComposerItem::PositionX, exprVal ) )
724
+ {
725
+ bool ok;
726
+ double positionX = exprVal.toDouble ( &ok );
727
+ QgsDebugMsg ( QString ( " exprVal Position X:%1" ).arg ( positionX ) );
728
+ if ( ok )
729
+ {
730
+ x = positionX;
731
+ }
732
+ }
733
+
734
+ double y = result.top ();
735
+ // adjust y-coordinate if placement is not done to an upper point
736
+ if ( mLastUsedPositionMode == MiddleLeft || mLastUsedPositionMode == Middle || mLastUsedPositionMode == MiddleRight )
737
+ {
738
+ y += newRect.height () / 2.0 ;
739
+ }
740
+ else if ( mLastUsedPositionMode == LowerLeft || mLastUsedPositionMode == LowerMiddle || mLastUsedPositionMode == LowerRight )
741
+ {
742
+ y += newRect.height ();
743
+ }
744
+
745
+ if ( dataDefinedEvaluate ( QgsComposerItem::PositionY, exprVal ) )
746
+ {
747
+ bool ok;
748
+ double positionY = exprVal.toDouble ( &ok );
749
+ QgsDebugMsg ( QString ( " exprVal Position Y:%1" ).arg ( positionY ) );
750
+ if ( ok )
751
+ {
752
+ y = positionY;
753
+ }
754
+ }
755
+
756
+ // adjust x-coordinate if placement is not done to a left point
757
+ if ( mLastUsedPositionMode == UpperMiddle || mLastUsedPositionMode == Middle || mLastUsedPositionMode == LowerMiddle )
758
+ {
759
+ x -= result.width () / 2.0 ;
760
+ }
761
+ else if ( mLastUsedPositionMode == UpperRight || mLastUsedPositionMode == MiddleRight || mLastUsedPositionMode == LowerRight )
762
+ {
763
+ x -= result.width ();
764
+ }
765
+
766
+ // adjust y-coordinate if placement is not done to an upper point
767
+ if ( mLastUsedPositionMode == MiddleLeft || mLastUsedPositionMode == Middle || mLastUsedPositionMode == MiddleRight )
768
+ {
769
+ y -= result.height () / 2.0 ;
770
+ }
771
+ else if ( mLastUsedPositionMode == LowerLeft || mLastUsedPositionMode == LowerMiddle || mLastUsedPositionMode == LowerRight )
772
+ {
773
+ y -= result.height ();
774
+ }
775
+
776
+ result.moveLeft ( x );
777
+ result.moveTop ( y );
778
+
779
+ return result;
780
+ }
781
+
672
782
void QgsComposerItem::drawBackground ( QPainter* p )
673
783
{
674
784
if ( mBackground && p )
@@ -1326,6 +1436,13 @@ void QgsComposerItem::repaint()
1326
1436
void QgsComposerItem::refreshDataDefinedProperty ( QgsComposerItem::DataDefinedProperty property )
1327
1437
{
1328
1438
// update data defined properties and redraw item to match
1439
+ if ( property == QgsComposerItem::PositionX || property == QgsComposerItem::PositionY ||
1440
+ property == QgsComposerItem::ItemWidth || property == QgsComposerItem::ItemHeight ||
1441
+ property == QgsComposerItem::AllProperties )
1442
+ {
1443
+ QRectF evaluatedRect = evalItemRect ( QRectF ( pos ().x (), pos ().y (), rect ().width (), rect ().height () ) );
1444
+ setSceneRect ( evaluatedRect );
1445
+ }
1329
1446
if ( property == QgsComposerItem::ItemRotation || property == QgsComposerItem::AllProperties )
1330
1447
{
1331
1448
refreshRotation ( false , true );
0 commit comments