diff --git a/python/core/composer/qgscomposeritem.sip b/python/core/composer/qgscomposeritem.sip index 03af148e046..f31615e128a 100644 --- a/python/core/composer/qgscomposeritem.sip +++ b/python/core/composer/qgscomposeritem.sip @@ -660,6 +660,9 @@ class QgsComposerItem : QObject, QGraphicsRectItem */ bool dataDefinedEvaluate( QgsComposerItem::DataDefinedProperty property, QVariant &expressionValue ); + /**Update an item rect to consider data defined position and size of item*/ + QRectF evalItemRect( const QRectF &newRect ); + signals: /**Is emitted on item rotation change*/ void itemRotationChanged( double newRotation ); diff --git a/src/core/composer/qgscomposerarrow.cpp b/src/core/composer/qgscomposerarrow.cpp index 6238925e46d..f17eb191272 100644 --- a/src/core/composer/qgscomposerarrow.cpp +++ b/src/core/composer/qgscomposerarrow.cpp @@ -113,11 +113,14 @@ void QgsComposerArrow::paint( QPainter* painter, const QStyleOptionGraphicsItem void QgsComposerArrow::setSceneRect( const QRectF& rectangle ) { - if ( rectangle.width() < 0 ) + //update rect for data defined size and position + QRectF evaluatedRect = evalItemRect( rectangle ); + + if ( evaluatedRect.width() < 0 ) { mStartXIdx = 1 - mStartXIdx; } - if ( rectangle.height() < 0 ) + if ( evaluatedRect.height() < 0 ) { mStartYIdx = 1 - mStartYIdx; } @@ -125,7 +128,7 @@ void QgsComposerArrow::setSceneRect( const QRectF& rectangle ) double margin = computeMarkerMargin(); // Ensure the rectangle is at least as large as needed to include the markers - QRectF rect = rectangle.united( QRectF( rectangle.x(), rectangle.y(), 2. * margin, 2. * margin ) ); + QRectF rect = rectangle.united( QRectF( evaluatedRect.x(), evaluatedRect.y(), 2. * margin, 2. * margin ) ); // Compute new start and stop positions double x[2] = {rect.x(), rect.x() + rect.width()}; diff --git a/src/core/composer/qgscomposerattributetable.cpp b/src/core/composer/qgscomposerattributetable.cpp index 0ef0e77f573..51a41657aae 100644 --- a/src/core/composer/qgscomposerattributetable.cpp +++ b/src/core/composer/qgscomposerattributetable.cpp @@ -481,17 +481,20 @@ void QgsComposerAttributeTable::removeLayer( QString layerId ) void QgsComposerAttributeTable::setSceneRect( const QRectF& rectangle ) { + //update rect for data defined size and position + QRectF evaluatedRect = evalItemRect( rectangle ); + double titleHeight = 2 * mGridStrokeWidth + 2 * mLineTextDistance + fontAscentMillimeters( mHeaderFont ); double attributeHeight = mGridStrokeWidth + 2 * mLineTextDistance + fontAscentMillimeters( mContentFont ); - if (( rectangle.height() - titleHeight ) > 0 ) + if (( evaluatedRect.height() - titleHeight ) > 0 ) { - mMaximumNumberOfFeatures = ( rectangle.height() - titleHeight ) / attributeHeight; + mMaximumNumberOfFeatures = ( evaluatedRect.height() - titleHeight ) / attributeHeight; } else { mMaximumNumberOfFeatures = 0; } - QgsComposerItem::setSceneRect( rectangle ); + QgsComposerItem::setSceneRect( evaluatedRect ); //refresh table attributes, since number of features has likely changed refreshAttributes(); diff --git a/src/core/composer/qgscomposeritem.h b/src/core/composer/qgscomposeritem.h index 1975f23444a..4e3eda1e666 100644 --- a/src/core/composer/qgscomposeritem.h +++ b/src/core/composer/qgscomposeritem.h @@ -668,6 +668,9 @@ class CORE_EXPORT QgsComposerItem: public QObject, public QGraphicsRectItem */ bool dataDefinedEvaluate( QgsComposerItem::DataDefinedProperty property, QVariant &expressionValue ); + /**Update an item rect to consider data defined position and size of item*/ + QRectF evalItemRect( const QRectF &newRect ); + signals: /**Is emitted on item rotation change*/ void itemRotationChanged( double newRotation ); @@ -697,9 +700,6 @@ class CORE_EXPORT QgsComposerItem: public QObject, public QGraphicsRectItem /**Map of current data defined properties*/ QMap< QgsComposerItem::DataDefinedProperty, QgsDataDefined* > mDataDefinedProperties; - /**Update an item rect to consider data defined position and size of item*/ - QRectF evalItemRect( const QRectF &newRect ); - /**Refresh item's rotation, considering data defined rotation setting *@param updateItem set to false to prevent the item being automatically updated *@param rotateAroundCenter set to true to rotate the item around its center rather diff --git a/src/core/composer/qgscomposerlabel.cpp b/src/core/composer/qgscomposerlabel.cpp index 38ddd831d2d..c63707e6476 100644 --- a/src/core/composer/qgscomposerlabel.cpp +++ b/src/core/composer/qgscomposerlabel.cpp @@ -272,7 +272,9 @@ void QgsComposerLabel::adjustSizeToText() double yShift = 0; itemShiftAdjustSize( width, height, xShift, yShift ); - setSceneRect( QRectF( pos().x() + xShift, pos().y() + yShift, width, height ) ); + //update rect for data defined size and position + QRectF evaluatedRect = evalItemRect( QRectF( pos().x() + xShift, pos().y() + yShift, width, height ) ); + setSceneRect( evaluatedRect ); } QFont QgsComposerLabel::font() const diff --git a/src/core/composer/qgscomposerscalebar.cpp b/src/core/composer/qgscomposerscalebar.cpp index ff02b9b5f29..baacfa94231 100644 --- a/src/core/composer/qgscomposerscalebar.cpp +++ b/src/core/composer/qgscomposerscalebar.cpp @@ -382,7 +382,9 @@ void QgsComposerScaleBar::adjustBoxSize() } QRectF box = mStyle->calculateBoxSize(); - setSceneRect( box ); + + //update rect for data defined size and position + setSceneRect( evalItemRect( box ) ); } void QgsComposerScaleBar::update() diff --git a/src/core/composer/qgscomposershape.cpp b/src/core/composer/qgscomposershape.cpp index 9cc9bf0aa42..d7e53d0ecee 100644 --- a/src/core/composer/qgscomposershape.cpp +++ b/src/core/composer/qgscomposershape.cpp @@ -415,7 +415,11 @@ void QgsComposerShape::updateBoundingRect() void QgsComposerShape::setSceneRect( const QRectF& rectangle ) { // Reimplemented from QgsComposerItem as we need to call updateBoundingRect after the shape's size changes - QgsComposerItem::setSceneRect( rectangle ); + + //update rect for data defined size and position + QRectF evaluatedRect = evalItemRect( rectangle ); + QgsComposerItem::setSceneRect( evaluatedRect ); + updateBoundingRect(); update(); } diff --git a/src/core/composer/qgscomposertable.cpp b/src/core/composer/qgscomposertable.cpp index 94aa0c0ac6d..295e6d9609e 100644 --- a/src/core/composer/qgscomposertable.cpp +++ b/src/core/composer/qgscomposertable.cpp @@ -368,7 +368,10 @@ void QgsComposerTable::adaptItemFrame( const QMap& maxWidthMap, con totalWidth += ( 2 * maxWidthMap.size() * mLineTextDistance ); totalWidth += ( maxWidthMap.size() + 1 ) * mGridStrokeWidth; - QgsComposerItem::setSceneRect( QRectF( pos().x(), pos().y(), totalWidth, totalHeight ) ); + QRectF evaluatedRect = evalItemRect( QRectF( pos().x(), pos().y(), totalWidth, totalHeight ) ); + + //update rect for data defined size and position + QgsComposerItem::setSceneRect( evaluatedRect ); } void QgsComposerTable::drawHorizontalGridLines( QPainter* p, int nAttributes )