Skip to content
Permalink
Browse files

[composer] Implement min size method for frames. Minimum height for

first frame in tables is set so that headers are always shown.
(Sponsored by City of Uster, Switzerland)
  • Loading branch information
nyalldawson committed Sep 17, 2014
1 parent 37dbbd5 commit c833a93340d19d5f211ea36598f9198c56981bc8
@@ -128,6 +128,7 @@ QgsComposerAttributeTableV2::QgsComposerAttributeTableV2( QgsComposition* compos
//connect to atlas feature changes to update table rows
connect( &mComposition->atlasComposition(), SIGNAL( featureChanged( QgsFeature* ) ), this, SLOT( refreshAttributes() ) );
}
refreshAttributes();
}

QgsComposerAttributeTableV2::~QgsComposerAttributeTableV2()
@@ -23,6 +23,11 @@ QgsComposerFrame::QgsComposerFrame( QgsComposition* c, QgsComposerMultiFrame* mf
{
//repaint frame when multiframe content changes
connect( mf, SIGNAL( contentsChanged() ), this, SLOT( repaint() ) );
if ( mf )
{
//force recalculation of rect, so that multiframe specified sizes can be applied
setSceneRect( QRectF( pos().x(), pos().y(), rect().width(), rect().height() ) );
}
}

QgsComposerFrame::QgsComposerFrame()
@@ -80,14 +85,26 @@ QString QgsComposerFrame::displayName() const
void QgsComposerFrame::setSceneRect( const QRectF &rectangle )
{
QRectF fixedRect = rectangle;
QSizeF fixedSize = mMultiFrame->fixedFrameSize();
if ( fixedSize.width() > 0 )
{
fixedRect.setWidth( fixedSize.width() );
}
if ( fixedSize.height() > 0 )

if ( mMultiFrame )
{
fixedRect.setHeight( fixedSize.height() );
//calculate index of frame
int frameIndex = mMultiFrame->frameIndex( this );

QSizeF fixedSize = mMultiFrame->fixedFrameSize( frameIndex );
if ( fixedSize.width() > 0 )
{
fixedRect.setWidth( fixedSize.width() );
}
if ( fixedSize.height() > 0 )
{
fixedRect.setHeight( fixedSize.height() );
}

//check minimum size
QSizeF minSize = mMultiFrame->minFrameSize( frameIndex );
fixedRect.setWidth( qMax( minSize.width(), fixedRect.width() ) );
fixedRect.setHeight( qMax( minSize.height(), fixedRect.height() ) );
}

QgsComposerItem::setSceneRect( fixedRect );
@@ -176,6 +176,22 @@ void QgsComposerMultiFrame::recalculateFrameSizes()
}
}

void QgsComposerMultiFrame::recalculateFrameRects()
{
if ( mFrameItems.size() < 1 )
{
//no frames, nothing to do
return;
}

QList<QgsComposerFrame*>::iterator frameIt = mFrameItems.begin();
for ( ; frameIt != mFrameItems.end(); ++frameIt )
{
( *frameIt )->setSceneRect( QRectF(( *frameIt )->scenePos().x(), ( *frameIt )->scenePos().y(),
( *frameIt )->rect().width(), ( *frameIt )->rect().height() ) );
}
}

QgsComposerFrame* QgsComposerMultiFrame::createNewFrame( QgsComposerFrame* currentFrame, QPointF pos, QSizeF size )
{
if ( !currentFrame )
@@ -47,13 +47,29 @@ class CORE_EXPORT QgsComposerMultiFrame: public QgsComposerObject
virtual ~QgsComposerMultiFrame();
virtual QSizeF totalSize() const = 0;

/**Returns a fixed size for the frames, if desired.
/**Returns a fixed size for the frames, if desired. If the fixed frame size changes,
* the sizes of all frames can be recalculated by calling recalculateFrameRects().
* @param frameIndex frame number
* @returns fixed size for frames. If the size has a width or height of 0, then
* the frame size is not fixed in that direction and frames can have variable width
* or height accordingly.
* @note added in version 2.5
* @see minFrameSize
* @see recalculateFrameRects
*/
virtual QSizeF fixedFrameSize() const { return QSizeF( 0, 0 ); }
virtual QSizeF fixedFrameSize( const int frameIndex = -1 ) const { Q_UNUSED( frameIndex ); return QSizeF( 0, 0 ); }

/**Returns the minimum size size for the frames, if desired. If the minimum
* size changes, the sizes of all frames can be recalculated by calling
* recalculateFrameRects().
* @param frameIndex frame number
* @returns minimum size for frames. If the size has a width or height of 0, then
* the frame size has no minimum in that direction.
* @note added in version 2.5
* @see fixedFrameSize
* @see recalculateFrameRects
*/
virtual QSizeF minFrameSize( const int frameIndex = -1 ) const { Q_UNUSED( frameIndex ); return QSizeF( 0, 0 ); }

Q_DECL_DEPRECATED virtual void render( QPainter* p, const QRectF& renderExtent );

@@ -128,6 +144,15 @@ class CORE_EXPORT QgsComposerMultiFrame: public QgsComposerObject
*/
void recalculateFrameSizes();

/**Forces a recalculation of all the associated frame's scene rectangles. This
* method is useful for multiframes which implement a minFrameSize() or
* fixedFrameSize() method.
* @note added in version 2.5
* @see minFrameSize()
* @see fixedFrameSize()
*/
void recalculateFrameRects();

protected:
QList<QgsComposerFrame*> mFrameItems;
ResizeMode mResizeMode;
@@ -31,7 +31,14 @@ QgsComposerTableV2::QgsComposerTableV2( QgsComposition *composition, bool create
, mGridStrokeWidth( 0.5 )
, mGridColor( Qt::black )
{

//get default composer font from settings
QSettings settings;
QString defaultFontString = settings.value( "/Composer/defaultFont" ).toString();
if ( !defaultFontString.isEmpty() )
{
mHeaderFont.setFamily( defaultFontString );
mContentFont.setFamily( defaultFontString );
}
}

QgsComposerTableV2::QgsComposerTableV2()
@@ -42,7 +49,8 @@ QgsComposerTableV2::QgsComposerTableV2()

QgsComposerTableV2::~QgsComposerTableV2()
{

qDeleteAll( mColumns );
mColumns.clear();
}

bool QgsComposerTableV2::writeXML( QDomElement& elem, QDomDocument & doc, bool ignoreFrames ) const
@@ -398,11 +406,24 @@ QMap<int, QString> QgsComposerTableV2::headerLabels() const
return headers;
}

QSizeF QgsComposerTableV2::fixedFrameSize() const
QSizeF QgsComposerTableV2::fixedFrameSize( const int frameIndex ) const
{
Q_UNUSED( frameIndex );
return QSizeF( mTableSize.width(), 0 );
}

QSizeF QgsComposerTableV2::minFrameSize( const int frameIndex ) const
{
double height = 0;
if ( frameIndex == 0 )
{
//force first frame to be high enough for header
//TODO - handle different header modes
height = 2 * mGridStrokeWidth + 2 * mCellMargin + QgsComposerUtils::fontAscentMM( mHeaderFont );
}
return QSizeF( 0, height );
}

void QgsComposerTableV2::refreshAttributes()
{
mMaxColumnWidthMap.clear();
@@ -542,4 +563,9 @@ void QgsComposerTableV2::drawVerticalGridLines( QPainter *painter, const QMap<in
void QgsComposerTableV2::adjustFrameToSize()
{
mTableSize = QSizeF( totalWidth(), totalHeight() );
//force recalculation of frame rects, so that they are set to the correct
//fixed and minimum frame sizes
recalculateFrameRects();

recalculateFrameSizes();
}
@@ -236,7 +236,10 @@ class CORE_EXPORT QgsComposerTableV2: public QgsComposerMultiFrame
virtual bool getTableContents( QgsComposerTableContents &contents ) = 0;

//reimplemented to return fixed table width
virtual QSizeF fixedFrameSize() const;
virtual QSizeF fixedFrameSize( const int frameIndex = -1 ) const;

//reimplemented to return min frame height
virtual QSizeF minFrameSize( const int frameIndex = -1 ) const;

public slots:

0 comments on commit c833a93

Please sign in to comment.
You can’t perform that action at this time.