Skip to content

Commit a914d43

Browse files
committed
[composer] Composer items which set their own size must consider data defined width and height
1 parent da97684 commit a914d43

8 files changed

+33
-13
lines changed

python/core/composer/qgscomposeritem.sip

+3
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,9 @@ class QgsComposerItem : QObject, QGraphicsRectItem
660660
*/
661661
bool dataDefinedEvaluate( QgsComposerItem::DataDefinedProperty property, QVariant &expressionValue );
662662

663+
/**Update an item rect to consider data defined position and size of item*/
664+
QRectF evalItemRect( const QRectF &newRect );
665+
663666
signals:
664667
/**Is emitted on item rotation change*/
665668
void itemRotationChanged( double newRotation );

src/core/composer/qgscomposerarrow.cpp

+6-3
Original file line numberDiff line numberDiff line change
@@ -113,19 +113,22 @@ void QgsComposerArrow::paint( QPainter* painter, const QStyleOptionGraphicsItem
113113

114114
void QgsComposerArrow::setSceneRect( const QRectF& rectangle )
115115
{
116-
if ( rectangle.width() < 0 )
116+
//update rect for data defined size and position
117+
QRectF evaluatedRect = evalItemRect( rectangle );
118+
119+
if ( evaluatedRect.width() < 0 )
117120
{
118121
mStartXIdx = 1 - mStartXIdx;
119122
}
120-
if ( rectangle.height() < 0 )
123+
if ( evaluatedRect.height() < 0 )
121124
{
122125
mStartYIdx = 1 - mStartYIdx;
123126
}
124127

125128
double margin = computeMarkerMargin();
126129

127130
// Ensure the rectangle is at least as large as needed to include the markers
128-
QRectF rect = rectangle.united( QRectF( rectangle.x(), rectangle.y(), 2. * margin, 2. * margin ) );
131+
QRectF rect = rectangle.united( QRectF( evaluatedRect.x(), evaluatedRect.y(), 2. * margin, 2. * margin ) );
129132

130133
// Compute new start and stop positions
131134
double x[2] = {rect.x(), rect.x() + rect.width()};

src/core/composer/qgscomposerattributetable.cpp

+6-3
Original file line numberDiff line numberDiff line change
@@ -481,17 +481,20 @@ void QgsComposerAttributeTable::removeLayer( QString layerId )
481481

482482
void QgsComposerAttributeTable::setSceneRect( const QRectF& rectangle )
483483
{
484+
//update rect for data defined size and position
485+
QRectF evaluatedRect = evalItemRect( rectangle );
486+
484487
double titleHeight = 2 * mGridStrokeWidth + 2 * mLineTextDistance + fontAscentMillimeters( mHeaderFont );
485488
double attributeHeight = mGridStrokeWidth + 2 * mLineTextDistance + fontAscentMillimeters( mContentFont );
486-
if (( rectangle.height() - titleHeight ) > 0 )
489+
if (( evaluatedRect.height() - titleHeight ) > 0 )
487490
{
488-
mMaximumNumberOfFeatures = ( rectangle.height() - titleHeight ) / attributeHeight;
491+
mMaximumNumberOfFeatures = ( evaluatedRect.height() - titleHeight ) / attributeHeight;
489492
}
490493
else
491494
{
492495
mMaximumNumberOfFeatures = 0;
493496
}
494-
QgsComposerItem::setSceneRect( rectangle );
497+
QgsComposerItem::setSceneRect( evaluatedRect );
495498

496499
//refresh table attributes, since number of features has likely changed
497500
refreshAttributes();

src/core/composer/qgscomposeritem.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,9 @@ class CORE_EXPORT QgsComposerItem: public QObject, public QGraphicsRectItem
668668
*/
669669
bool dataDefinedEvaluate( QgsComposerItem::DataDefinedProperty property, QVariant &expressionValue );
670670

671+
/**Update an item rect to consider data defined position and size of item*/
672+
QRectF evalItemRect( const QRectF &newRect );
673+
671674
signals:
672675
/**Is emitted on item rotation change*/
673676
void itemRotationChanged( double newRotation );
@@ -697,9 +700,6 @@ class CORE_EXPORT QgsComposerItem: public QObject, public QGraphicsRectItem
697700
/**Map of current data defined properties*/
698701
QMap< QgsComposerItem::DataDefinedProperty, QgsDataDefined* > mDataDefinedProperties;
699702

700-
/**Update an item rect to consider data defined position and size of item*/
701-
QRectF evalItemRect( const QRectF &newRect );
702-
703703
/**Refresh item's rotation, considering data defined rotation setting
704704
*@param updateItem set to false to prevent the item being automatically updated
705705
*@param rotateAroundCenter set to true to rotate the item around its center rather

src/core/composer/qgscomposerlabel.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,9 @@ void QgsComposerLabel::adjustSizeToText()
272272
double yShift = 0;
273273
itemShiftAdjustSize( width, height, xShift, yShift );
274274

275-
setSceneRect( QRectF( pos().x() + xShift, pos().y() + yShift, width, height ) );
275+
//update rect for data defined size and position
276+
QRectF evaluatedRect = evalItemRect( QRectF( pos().x() + xShift, pos().y() + yShift, width, height ) );
277+
setSceneRect( evaluatedRect );
276278
}
277279

278280
QFont QgsComposerLabel::font() const

src/core/composer/qgscomposerscalebar.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,9 @@ void QgsComposerScaleBar::adjustBoxSize()
382382
}
383383

384384
QRectF box = mStyle->calculateBoxSize();
385-
setSceneRect( box );
385+
386+
//update rect for data defined size and position
387+
setSceneRect( evalItemRect( box ) );
386388
}
387389

388390
void QgsComposerScaleBar::update()

src/core/composer/qgscomposershape.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,11 @@ void QgsComposerShape::updateBoundingRect()
415415
void QgsComposerShape::setSceneRect( const QRectF& rectangle )
416416
{
417417
// Reimplemented from QgsComposerItem as we need to call updateBoundingRect after the shape's size changes
418-
QgsComposerItem::setSceneRect( rectangle );
418+
419+
//update rect for data defined size and position
420+
QRectF evaluatedRect = evalItemRect( rectangle );
421+
QgsComposerItem::setSceneRect( evaluatedRect );
422+
419423
updateBoundingRect();
420424
update();
421425
}

src/core/composer/qgscomposertable.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,10 @@ void QgsComposerTable::adaptItemFrame( const QMap<int, double>& maxWidthMap, con
368368
totalWidth += ( 2 * maxWidthMap.size() * mLineTextDistance );
369369
totalWidth += ( maxWidthMap.size() + 1 ) * mGridStrokeWidth;
370370

371-
QgsComposerItem::setSceneRect( QRectF( pos().x(), pos().y(), totalWidth, totalHeight ) );
371+
QRectF evaluatedRect = evalItemRect( QRectF( pos().x(), pos().y(), totalWidth, totalHeight ) );
372+
373+
//update rect for data defined size and position
374+
QgsComposerItem::setSceneRect( evaluatedRect );
372375
}
373376

374377
void QgsComposerTable::drawHorizontalGridLines( QPainter* p, int nAttributes )

0 commit comments

Comments
 (0)