Skip to content

Commit 9a3d6ab

Browse files
committedAug 8, 2012
Move adding the first html frame out of QgsComposerHtml
1 parent 4969d67 commit 9a3d6ab

File tree

7 files changed

+60
-32
lines changed

7 files changed

+60
-32
lines changed
 

‎src/core/composer/qgscomposerhtml.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,15 @@
2222
#include <QWebFrame>
2323
#include <QWebPage>
2424

25-
QgsComposerHtml::QgsComposerHtml( QgsComposition* c, qreal x, qreal y, qreal width, qreal height, bool createUndoCommands ): QgsComposerMultiFrame( c, createUndoCommands ),
25+
QgsComposerHtml::QgsComposerHtml( QgsComposition* c, bool createUndoCommands ): QgsComposerMultiFrame( c, createUndoCommands ),
2626
mWebPage( 0 ), mLoaded( false ), mHtmlUnitsToMM( 1.0 )
2727
{
2828
mHtmlUnitsToMM = htmlUnitsToMM();
2929
mWebPage = new QWebPage();
3030
QObject::connect( mWebPage, SIGNAL( loadFinished( bool ) ), this, SLOT( frameLoaded( bool ) ) );
31-
32-
if ( mComposition && width > 0 && height > 0 )
31+
if ( mComposition )
3332
{
34-
QgsComposerFrame* frame = new QgsComposerFrame( c, this, x, y, width, height );
35-
addFrame( frame );
3633
QObject::connect( mComposition, SIGNAL( itemRemoved( QgsComposerItem* ) ), this, SLOT( handleFrameRemoval( QgsComposerItem* ) ) );
37-
recalculateFrameSizes();
3834
}
3935
}
4036

@@ -105,14 +101,19 @@ double QgsComposerHtml::htmlUnitsToMM()
105101
return ( mComposition->printResolution() / 96.0 ); //webkit seems to assume a standard dpi of 96
106102
}
107103

108-
void QgsComposerHtml::addFrame( QgsComposerFrame* frame )
104+
void QgsComposerHtml::addFrame( QgsComposerFrame* frame, bool recalcFrameSizes )
109105
{
110106
mFrameItems.push_back( frame );
111107
QObject::connect( frame, SIGNAL( sizeChanged() ), this, SLOT( recalculateFrameSizes() ) );
112108
if ( mComposition )
113109
{
114110
mComposition->addComposerHtmlFrame( this, frame );
115111
}
112+
113+
if ( recalcFrameSizes )
114+
{
115+
recalculateFrameSizes();
116+
}
116117
}
117118

118119
bool QgsComposerHtml::writeXML( QDomElement& elem, QDomDocument & doc, bool ignoreFrames ) const

‎src/core/composer/qgscomposerhtml.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class QgsComposerHtml: public QgsComposerMultiFrame
2525
{
2626
Q_OBJECT
2727
public:
28-
QgsComposerHtml( QgsComposition* c, qreal x, qreal y, qreal width, qreal height, bool createUndoCommands );
28+
QgsComposerHtml( QgsComposition* c, bool createUndoCommands );
2929
QgsComposerHtml();
3030
~QgsComposerHtml();
3131

@@ -38,8 +38,7 @@ class QgsComposerHtml: public QgsComposerMultiFrame
3838
bool writeXML( QDomElement& elem, QDomDocument & doc, bool ignoreFrames = false ) const;
3939
bool readXML( const QDomElement& itemElem, const QDomDocument& doc, bool ignoreFrames = false );
4040

41-
protected:
42-
void addFrame( QgsComposerFrame* frame );
41+
void addFrame( QgsComposerFrame* frame, bool recalcFrameSizes = true );
4342

4443
private slots:
4544
void frameLoaded( bool ok );

‎src/core/composer/qgscomposermultiframe.cpp

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
#include "qgscomposermultiframe.h"
1717
#include "qgscomposerframe.h"
18-
#include "qgsaddremovemultiframecommand.h"
1918

2019
QgsComposerMultiFrame::QgsComposerMultiFrame( QgsComposition* c, bool createUndoCommands ): mComposition( c ), mResizeMode( UseExistingFrames ), mCreateUndoCommands( createUndoCommands )
2120
{
@@ -107,7 +106,7 @@ void QgsComposerMultiFrame::recalculateFrameSizes()
107106
newFrame->setContentSection( QRectF( 0, currentY, newFrame->rect().width(), newFrame->rect().height() ) );
108107
currentY += newFrame->rect().height();
109108
currentItem = newFrame;
110-
addFrame( newFrame );
109+
addFrame( newFrame, false );
111110
}
112111
}
113112
}
@@ -125,16 +124,7 @@ void QgsComposerMultiFrame::handleFrameRemoval( QgsComposerItem* item )
125124
return;
126125
}
127126
mFrameItems.removeAt( index );
128-
129-
if ( mFrameItems.size() < 1 )
130-
{
131-
if ( mComposition )
132-
{
133-
//schedule this composer multi frame for deletion
134-
mComposition->removeMultiFrame( this );
135-
}
136-
}
137-
else
127+
if ( mFrameItems.size() > 0 )
138128
{
139129
recalculateFrameSizes();
140130
}

‎src/core/composer/qgscomposermultiframe.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ class QgsComposerMultiFrame: public QObject
4343
virtual ~QgsComposerMultiFrame();
4444
virtual QSizeF totalSize() const = 0;
4545
virtual void render( QPainter* p, const QRectF& renderExtent ) = 0;
46+
47+
virtual void addFrame( QgsComposerFrame* frame, bool recalcFrameSizes = true ) = 0;
48+
4649
void removeFrame( int i );
4750

4851
void update();
@@ -64,15 +67,15 @@ class QgsComposerMultiFrame: public QObject
6467
/**Removes and deletes all frames from mComposition*/
6568
void deleteFrames();
6669

70+
int nFrames() const { return mFrameItems.size(); }
71+
6772
protected:
6873
QgsComposition* mComposition;
6974
QList<QgsComposerFrame*> mFrameItems;
7075
ResizeMode mResizeMode;
7176
/**True: creates QgsMultiFrameCommands on internal changes (e.g. changing frames )*/
7277
bool mCreateUndoCommands;
7378

74-
virtual void addFrame( QgsComposerFrame* frame ) = 0;
75-
7679
protected slots:
7780
void recalculateFrameSizes();
7881
/**Called before a frame is going to be removed (update frame list)*/

‎src/core/composer/qgscomposition.cpp

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "qgscomposerscalebar.h"
2828
#include "qgscomposershape.h"
2929
#include "qgscomposerattributetable.h"
30+
#include "qgsaddremovemultiframecommand.h"
3031
#include "qgscomposermultiframecommand.h"
3132
#include "qgslogger.h"
3233
#include "qgspaintenginehack.h"
@@ -462,7 +463,7 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
462463
for ( int i = 0; i < composerHtmlList.size(); ++i )
463464
{
464465
QDomElement currentHtmlElem = composerHtmlList.at( i ).toElement();
465-
QgsComposerHtml* newHtml = new QgsComposerHtml( this, 0, 0, 0, 0, true );
466+
QgsComposerHtml* newHtml = new QgsComposerHtml( this, true );
466467
newHtml->readXML( currentHtmlElem, doc );
467468
this->addMultiFrame( newHtml );
468469
}
@@ -1069,7 +1070,6 @@ void QgsComposition::addMultiFrame( QgsComposerMultiFrame* multiFrame )
10691070
void QgsComposition::removeMultiFrame( QgsComposerMultiFrame* multiFrame )
10701071
{
10711072
mMultiFrames.remove( multiFrame );
1072-
//delete multiFrame; //e.v. use deleteLater() in case of stability problems
10731073
}
10741074

10751075
void QgsComposition::addComposerArrow( QgsComposerArrow* arrow )
@@ -1203,10 +1203,13 @@ void QgsComposition::removeComposerItem( QgsComposerItem* item, bool createComma
12031203
}
12041204
else
12051205
{
1206+
bool frameItem = ( item->type() == QgsComposerItem::ComposerFrame );
1207+
QgsComposerMultiFrame* multiFrame = 0;
12061208
if ( createCommand )
12071209
{
1208-
if ( item->type() == QgsComposerItem::ComposerFrame ) //multiframe tracks item changes
1210+
if ( frameItem ) //multiframe tracks item changes
12091211
{
1212+
multiFrame = static_cast<QgsComposerFrame*>( item )->multiFrame();
12101213
item->beginItemCommand( tr( "Frame deleted" ) );
12111214
emit itemRemoved( item );
12121215
item->endItemCommand();
@@ -1221,6 +1224,25 @@ void QgsComposition::removeComposerItem( QgsComposerItem* item, bool createComma
12211224
{
12221225
emit itemRemoved( item );
12231226
}
1227+
1228+
//check if there are frames left. If not, remove the multi frame
1229+
if ( frameItem && multiFrame )
1230+
{
1231+
if ( multiFrame->nFrames() < 1 )
1232+
{
1233+
removeMultiFrame( multiFrame );
1234+
if ( createCommand )
1235+
{
1236+
QgsAddRemoveMultiFrameCommand* command = new QgsAddRemoveMultiFrameCommand( QgsAddRemoveMultiFrameCommand::Removed,
1237+
multiFrame, this, tr( "Multiframe removed" ) );
1238+
undoStack()->push( command );
1239+
}
1240+
else
1241+
{
1242+
delete multiFrame;
1243+
}
1244+
}
1245+
}
12241246
}
12251247
}
12261248
}

‎src/gui/qgscomposerview.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#include "qgscomposerview.h"
2626
#include "qgscomposerarrow.h"
27+
#include "qgscomposerframe.h"
2728
#include "qgscomposerhtml.h"
2829
#include "qgscomposerlabel.h"
2930
#include "qgscomposerlegend.h"
@@ -323,9 +324,16 @@ void QgsComposerView::mouseReleaseEvent( QMouseEvent* e )
323324
case AddHtml:
324325
if ( composition() )
325326
{
326-
QgsComposerHtml* composerHtml = new QgsComposerHtml( composition(), mRubberBandItem->transform().dx(), mRubberBandItem->transform().dy(),
327-
mRubberBandItem->rect().width(), mRubberBandItem->rect().height(), true );
328-
Q_UNUSED( composerHtml );
327+
QgsComposerHtml* composerHtml = new QgsComposerHtml( composition(), true );
328+
QgsAddRemoveMultiFrameCommand* command = new QgsAddRemoveMultiFrameCommand( QgsAddRemoveMultiFrameCommand::Added,
329+
composerHtml, composition(), tr( "Html item added" ) );
330+
composition()->undoStack()->push( command );
331+
QgsComposerFrame* frame = new QgsComposerFrame( composition(), composerHtml, mRubberBandItem->transform().dx(),
332+
mRubberBandItem->transform().dy(), mRubberBandItem->rect().width(),
333+
mRubberBandItem->rect().height() );
334+
composition()->beginMultiFrameCommand( composerHtml, tr( "Html frame added" ) );
335+
composerHtml->addFrame( frame );
336+
composition()->endMultiFrameCommand();
329337
scene()->removeItem( mRubberBandItem );
330338
delete mRubberBandItem;
331339
mRubberBandItem = 0;

‎tests/src/core/testqgscomposerhtml.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
***************************************************************************/
1717

1818
#include "qgscomposerhtml.h"
19+
#include "qgscomposerframe.h"
1920
#include "qgscomposition.h"
2021
#include "qgscompositionchecker.h"
2122
#include <QObject>
@@ -58,7 +59,9 @@ void TestQgsComposerHtml::cleanup()
5859

5960
void TestQgsComposerHtml::table()
6061
{
61-
QgsComposerHtml* htmlItem = new QgsComposerHtml( mComposition, 0, 0, 100, 200, false );
62+
QgsComposerHtml* htmlItem = new QgsComposerHtml( mComposition, false );
63+
QgsComposerFrame* htmlFrame = new QgsComposerFrame( mComposition, htmlItem, 0, 0, 100, 200 );
64+
htmlItem->addFrame( htmlFrame );
6265
htmlItem->setUrl( QUrl( QString( "file:///%1" ).arg( QString( TEST_DATA_DIR ) + QDir::separator() + "html_table.html" ) ) );
6366
QgsCompositionChecker checker( "Composer html table", mComposition, QString( QString( TEST_DATA_DIR ) + QDir::separator() +
6467
"control_images" + QDir::separator() + "expected_composerhtml" + QDir::separator() + "composerhtml_table.png" ) );
@@ -70,7 +73,9 @@ void TestQgsComposerHtml::table()
7073

7174
void TestQgsComposerHtml::tableMultiFrame()
7275
{
73-
QgsComposerHtml* htmlItem = new QgsComposerHtml( mComposition, 10, 10, 100, 50, false );
76+
QgsComposerHtml* htmlItem = new QgsComposerHtml( mComposition, false );
77+
QgsComposerFrame* htmlFrame = new QgsComposerFrame( mComposition, htmlItem, 0, 0, 100, 200 );
78+
htmlItem->addFrame( htmlFrame );
7479
htmlItem->setResizeMode( QgsComposerMultiFrame::ExtendToNextPage );
7580
bool result = true;
7681
//page1

0 commit comments

Comments
 (0)
Please sign in to comment.