Skip to content

Commit b40d0af

Browse files
committedAug 8, 2012
Further changes to undo-mechanism. Currently not working
1 parent b2782c0 commit b40d0af

13 files changed

+127
-40
lines changed
 

‎src/core/composer/qgscomposerframe.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ QgsComposerFrame::QgsComposerFrame( QgsComposition* c, QgsComposerMultiFrame* mf
2121
{
2222
}
2323

24+
QgsComposerFrame::QgsComposerFrame(): QgsComposerItem( 0, 0, 0, 0, 0 ), mMultiFrame( 0 )
25+
{
26+
}
27+
2428
QgsComposerFrame::~QgsComposerFrame()
2529
{
2630
}
@@ -70,3 +74,19 @@ void QgsComposerFrame::paint( QPainter* painter, const QStyleOptionGraphicsItem*
7074
drawSelectionBoxes( painter );
7175
}
7276
}
77+
78+
void QgsComposerFrame::beginItemCommand( const QString& text )
79+
{
80+
if ( mComposition )
81+
{
82+
mComposition->beginMultiFrameCommand( multiFrame(), text );
83+
}
84+
}
85+
86+
void QgsComposerFrame::endItemCommand()
87+
{
88+
if ( mComposition )
89+
{
90+
mComposition->endMultiFrameCommand();
91+
}
92+
}

‎src/core/composer/qgscomposerframe.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,17 @@ class QgsComposerFrame: public QgsComposerItem
3333

3434
void paint( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle, QWidget* pWidget );
3535

36+
void beginItemCommand( const QString& text );
37+
void endItemCommand();
38+
3639
bool writeXML( QDomElement& elem, QDomDocument & doc ) const;
3740
bool readXML( const QDomElement& itemElem, const QDomDocument& doc );
3841

3942
int type() const { return ComposerFrame; }
4043

4144
QgsComposerMultiFrame* multiFrame() { return mMultiFrame; }
4245

46+
4347
private:
4448
QgsComposerFrame(); //forbidden
4549

‎src/core/composer/qgscomposerhtml.cpp

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

25-
QgsComposerHtml::QgsComposerHtml( QgsComposition* c, qreal x, qreal y, qreal width, qreal height ): QgsComposerMultiFrame( c ), mWebPage( 0 ),
26-
mLoaded( false ), mHtmlUnitsToMM( 1.0 )
25+
QgsComposerHtml::QgsComposerHtml( QgsComposition* c, qreal x, qreal y, qreal width, qreal height, bool createUndoCommands ): QgsComposerMultiFrame( c, createUndoCommands ),
26+
mWebPage( 0 ), mLoaded( false ), mHtmlUnitsToMM( 1.0 )
2727
{
2828
mHtmlUnitsToMM = htmlUnitsToMM();
2929
mWebPage = new QWebPage();
@@ -38,7 +38,7 @@ QgsComposerHtml::QgsComposerHtml( QgsComposition* c, qreal x, qreal y, qreal wid
3838
}
3939
}
4040

41-
QgsComposerHtml::QgsComposerHtml(): QgsComposerMultiFrame( 0 ), mWebPage( 0 ), mLoaded( false ), mHtmlUnitsToMM( 1.0 )
41+
QgsComposerHtml::QgsComposerHtml(): QgsComposerMultiFrame( 0, false ), mWebPage( 0 ), mLoaded( false ), mHtmlUnitsToMM( 1.0 )
4242
{
4343
}
4444

@@ -126,6 +126,7 @@ bool QgsComposerHtml::writeXML( QDomElement& elem, QDomDocument & doc, bool igno
126126

127127
bool QgsComposerHtml::readXML( const QDomElement& itemElem, const QDomDocument& doc, bool ignoreFrames )
128128
{
129+
deleteFrames();
129130
QString urlString = itemElem.attribute( "url" );
130131
if ( !urlString.isEmpty() )
131132
{

‎src/core/composer/qgscomposerhtml.h

Lines changed: 1 addition & 1 deletion
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 );
28+
QgsComposerHtml( QgsComposition* c, qreal x, qreal y, qreal width, qreal height, bool createUndoCommands );
2929
QgsComposerHtml();
3030
~QgsComposerHtml();
3131

‎src/core/composer/qgscomposeritem.cpp

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

2525
#include "qgscomposition.h"
2626
#include "qgscomposeritem.h"
27+
#include "qgscomposerframe.h"
2728

2829

2930
#include <limits>
@@ -380,9 +381,9 @@ void QgsComposerItem::mouseReleaseEvent( QGraphicsSceneMouseEvent * event )
380381
return;
381382
}
382383

383-
beginCommand( tr( "Change item position" ) );
384+
beginItemCommand( tr( "Change item position" ) );
384385
changeItemRectangle( mouseMoveStopPoint, mMouseMoveStartPos, this, diffX, diffY, this );
385-
endCommand();
386+
endItemCommand();
386387

387388
//reset default action
388389
mCurrentMouseMoveAction = QgsComposerItem::MoveItem;

‎src/core/composer/qgscomposeritem.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,14 @@ class CORE_EXPORT QgsComposerItem: public QObject, public QGraphicsRectItem
190190

191191
const QgsComposition* composition() const {return mComposition;}
192192

193+
virtual void beginItemCommand( const QString& text ) { beginCommand( text ); }
194+
193195
/**Starts new composer undo command
194196
@param commandText command title
195197
@param c context for mergeable commands (unknown for non-mergeable commands*/
196198
void beginCommand( const QString& commandText, QgsComposerMergeCommand::Context c = QgsComposerMergeCommand::Unknown );
199+
200+
virtual void endItemCommand() { endCommand(); }
197201
/**Finish current command and push it onto the undo stack */
198202
void endCommand();
199203
void cancelCommand();

‎src/core/composer/qgscomposermultiframe.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#include "qgscomposerframe.h"
1818
#include "qgsaddremovemultiframecommand.h"
1919

20-
QgsComposerMultiFrame::QgsComposerMultiFrame( QgsComposition* c ): mComposition( c ), mResizeMode( UseExistingFrames )
20+
QgsComposerMultiFrame::QgsComposerMultiFrame( QgsComposition* c, bool createUndoCommands ): mComposition( c ), mResizeMode( UseExistingFrames ), mCreateUndoCommands( createUndoCommands )
2121
{
2222
mComposition->addMultiFrame( this );
2323
}
@@ -158,6 +158,17 @@ void QgsComposerMultiFrame::update()
158158
}
159159
}
160160

161+
void QgsComposerMultiFrame::deleteFrames()
162+
{
163+
QList<QgsComposerFrame*>::iterator frameIt = mFrameItems.begin();
164+
for ( ; frameIt != mFrameItems.end(); ++frameIt )
165+
{
166+
mComposition->removeComposerItem( *frameIt );
167+
delete *frameIt;
168+
}
169+
mFrameItems.clear();
170+
}
171+
161172
bool QgsComposerMultiFrame::_writeXML( QDomElement& elem, QDomDocument& doc, bool ignoreFrames ) const
162173
{
163174
elem.setAttribute( "resizeMode", mResizeMode );

‎src/core/composer/qgscomposermultiframe.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class QgsComposerMultiFrame: public QObject
3939
ExtendToNextPage //duplicates last frame to next page to fit the total size
4040
};
4141

42-
QgsComposerMultiFrame( QgsComposition* c );
42+
QgsComposerMultiFrame( QgsComposition* c, bool createUndoCommands );
4343
virtual ~QgsComposerMultiFrame();
4444
virtual QSizeF totalSize() const = 0;
4545
virtual void render( QPainter* p, const QRectF& renderExtent ) = 0;
@@ -58,10 +58,18 @@ class QgsComposerMultiFrame: public QObject
5858

5959
QgsComposition* composition() { return mComposition; }
6060

61+
bool createUndoCommands() const { return mCreateUndoCommands; }
62+
void setCreateUndoCommands( bool enabled ) { mCreateUndoCommands = enabled; }
63+
64+
/**Removes and deletes all frames from mComposition*/
65+
void deleteFrames();
66+
6167
protected:
6268
QgsComposition* mComposition;
6369
QList<QgsComposerFrame*> mFrameItems;
6470
ResizeMode mResizeMode;
71+
/**True: creates QgsMultiFrameCommands on internal changes (e.g. changing frames )*/
72+
bool mCreateUndoCommands;
6573

6674
virtual void addFrame( QgsComposerFrame* frame ) = 0;
6775

‎src/core/composer/qgscomposermultiframecommand.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@
1919
#include "qgscomposermultiframe.h"
2020

2121
QgsComposerMultiFrameCommand::QgsComposerMultiFrameCommand( QgsComposerMultiFrame* multiFrame, const QString& text, QUndoCommand* parent ):
22-
QUndoCommand( text, parent ), mMultiFrame( multiFrame ), mFirstRun( false )
22+
QUndoCommand( text, parent ), mMultiFrame( multiFrame ), mFirstRun( true )
23+
{
24+
}
25+
26+
QgsComposerMultiFrameCommand::QgsComposerMultiFrameCommand(): QUndoCommand( "", 0 ), mMultiFrame( 0 ), mFirstRun( false )
2327
{
2428
}
2529

@@ -43,18 +47,12 @@ void QgsComposerMultiFrameCommand::redo()
4347

4448
void QgsComposerMultiFrameCommand::savePreviousState()
4549
{
46-
if ( mMultiFrame )
47-
{
48-
saveState( mPreviousState );
49-
}
50+
saveState( mPreviousState );
5051
}
5152

5253
void QgsComposerMultiFrameCommand::saveAfterState()
5354
{
54-
if ( mMultiFrame )
55-
{
56-
saveState( mAfterState );
57-
}
55+
saveState( mAfterState );
5856
}
5957

6058
void QgsComposerMultiFrameCommand::saveState( QDomDocument& stateDoc )
@@ -80,7 +78,7 @@ bool QgsComposerMultiFrameCommand::checkFirstRun()
8078
{
8179
if ( !mFirstRun )
8280
{
83-
false;
81+
return false;
8482
}
8583
mFirstRun = false;
8684
return true;

‎src/core/composer/qgscomposition.cpp

Lines changed: 51 additions & 17 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 "qgscomposermultiframecommand.h"
3031
#include "qgslogger.h"
3132
#include "qgspaintenginehack.h"
3233
#include "qgspaperitem.h"
@@ -39,7 +40,7 @@
3940

4041
QgsComposition::QgsComposition( QgsMapRenderer* mapRenderer ):
4142
QGraphicsScene( 0 ), mMapRenderer( mapRenderer ), mPlotStyle( QgsComposition::Preview ), mPageWidth( 297 ), mPageHeight( 210 ), mSpaceBetweenPages( 10 ), mPrintAsRaster( false ), mSelectionTolerance( 0.0 ),
42-
mSnapToGrid( false ), mSnapGridResolution( 0.0 ), mSnapGridOffsetX( 0.0 ), mSnapGridOffsetY( 0.0 ), mActiveCommand( 0 )
43+
mSnapToGrid( false ), mSnapGridResolution( 0.0 ), mSnapGridOffsetX( 0.0 ), mSnapGridOffsetY( 0.0 ), mActiveItemCommand( 0 ), mActiveMultiFrameCommand( 0 )
4344
{
4445
setBackgroundBrush( Qt::gray );
4546
addPaperItem();
@@ -50,7 +51,7 @@ QgsComposition::QgsComposition( QgsMapRenderer* mapRenderer ):
5051

5152
QgsComposition::QgsComposition():
5253
QGraphicsScene( 0 ), mMapRenderer( 0 ), mPlotStyle( QgsComposition::Preview ), mPageWidth( 297 ), mPageHeight( 210 ), mSpaceBetweenPages( 10 ), mPrintAsRaster( false ),
53-
mSelectionTolerance( 0.0 ), mSnapToGrid( false ), mSnapGridResolution( 0.0 ), mSnapGridOffsetX( 0.0 ), mSnapGridOffsetY( 0.0 ), mActiveCommand( 0 )
54+
mSelectionTolerance( 0.0 ), mSnapToGrid( false ), mSnapGridResolution( 0.0 ), mSnapGridOffsetX( 0.0 ), mSnapGridOffsetY( 0.0 ), mActiveItemCommand( 0 ), mActiveMultiFrameCommand( 0 )
5455
{
5556
loadSettings();
5657
}
@@ -62,6 +63,8 @@ QgsComposition::~QgsComposition()
6263
// this class is deconstructed - to avoid segfaults
6364
// when composer items access in destructor composition that isn't valid anymore
6465
clear();
66+
delete mActiveItemCommand;
67+
delete mActiveMultiFrameCommand;
6568
}
6669

6770
void QgsComposition::setPaperSize( double width, double height )
@@ -459,7 +462,7 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
459462
for ( int i = 0; i < composerHtmlList.size(); ++i )
460463
{
461464
QDomElement currentHtmlElem = composerHtmlList.at( i ).toElement();
462-
QgsComposerHtml* newHtml = new QgsComposerHtml( this, 0, 0, 0, 0 );
465+
QgsComposerHtml* newHtml = new QgsComposerHtml( this, 0, 0, 0, 0, true );
463466
newHtml->readXML( currentHtmlElem, doc );
464467
this->addMultiFrame( newHtml );
465468
}
@@ -993,45 +996,69 @@ void QgsComposition::saveSettings()
993996

994997
void QgsComposition::beginCommand( QgsComposerItem* item, const QString& commandText, QgsComposerMergeCommand::Context c )
995998
{
996-
delete mActiveCommand;
999+
delete mActiveItemCommand;
9971000
if ( !item )
9981001
{
999-
mActiveCommand = 0;
1002+
mActiveItemCommand = 0;
10001003
return;
10011004
}
10021005

10031006
if ( c == QgsComposerMergeCommand::Unknown )
10041007
{
1005-
mActiveCommand = new QgsComposerItemCommand( item, commandText );
1008+
mActiveItemCommand = new QgsComposerItemCommand( item, commandText );
10061009
}
10071010
else
10081011
{
1009-
mActiveCommand = new QgsComposerMergeCommand( c, item, commandText );
1012+
mActiveItemCommand = new QgsComposerMergeCommand( c, item, commandText );
10101013
}
1011-
mActiveCommand->savePreviousState();
1014+
mActiveItemCommand->savePreviousState();
10121015
}
10131016

10141017
void QgsComposition::endCommand()
10151018
{
1016-
if ( mActiveCommand )
1019+
if ( mActiveItemCommand )
10171020
{
1018-
mActiveCommand->saveAfterState();
1019-
if ( mActiveCommand->containsChange() ) //protect against empty commands
1021+
mActiveItemCommand->saveAfterState();
1022+
if ( mActiveItemCommand->containsChange() ) //protect against empty commands
10201023
{
1021-
mUndoStack.push( mActiveCommand );
1024+
mUndoStack.push( mActiveItemCommand );
10221025
}
10231026
else
10241027
{
1025-
delete mActiveCommand;
1028+
delete mActiveItemCommand;
10261029
}
1027-
mActiveCommand = 0;
1030+
mActiveItemCommand = 0;
10281031
}
10291032
}
10301033

10311034
void QgsComposition::cancelCommand()
10321035
{
1033-
delete mActiveCommand;
1034-
mActiveCommand = 0;
1036+
delete mActiveItemCommand;
1037+
mActiveItemCommand = 0;
1038+
}
1039+
1040+
void QgsComposition::beginMultiFrameCommand( QgsComposerMultiFrame* multiFrame, const QString& text )
1041+
{
1042+
delete mActiveMultiFrameCommand;
1043+
mActiveMultiFrameCommand = new QgsComposerMultiFrameCommand( multiFrame, text );
1044+
mActiveMultiFrameCommand->savePreviousState();
1045+
}
1046+
1047+
void QgsComposition::endMultiFrameCommand()
1048+
{
1049+
if ( mActiveMultiFrameCommand )
1050+
{
1051+
mActiveMultiFrameCommand->saveAfterState();
1052+
if ( mActiveMultiFrameCommand->containsChange() )
1053+
{
1054+
mUndoStack.push( mActiveMultiFrameCommand );
1055+
}
1056+
else
1057+
{
1058+
delete mActiveMultiFrameCommand;
1059+
}
1060+
mActiveMultiFrameCommand = 0;
1061+
}
10351062
}
10361063

10371064
void QgsComposition::addMultiFrame( QgsComposerMultiFrame* multiFrame )
@@ -1177,7 +1204,14 @@ void QgsComposition::removeComposerItem( QgsComposerItem* item )
11771204
else
11781205
{
11791206
emit itemRemoved( item );
1180-
pushAddRemoveCommand( item, tr( "Item deleted" ), QgsAddRemoveItemCommand::Removed );
1207+
if ( item->type() == QgsComposerItem::ComposerFrame ) //multiframe tracks item changes
1208+
{
1209+
1210+
}
1211+
else
1212+
{
1213+
pushAddRemoveCommand( item, tr( "Item deleted" ), QgsAddRemoveItemCommand::Removed );
1214+
}
11811215
}
11821216
}
11831217
}

‎src/core/composer/qgscomposition.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
#include <QSet>
2323
#include <QUndoStack>
2424

25-
#include "qgscomposeritemcommand.h"
2625
#include "qgsaddremoveitemcommand.h"
26+
#include "qgscomposeritemcommand.h"
2727

2828
class QgsComposerFrame;
2929
class QgsComposerItem;
@@ -43,6 +43,7 @@ class QgsComposerScaleBar;
4343
class QgsComposerShape;
4444
class QgsComposerAttributeTable;
4545
class QgsComposerMultiFrame;
46+
class QgsComposerMultiFrameCommand;
4647

4748
/** \ingroup MapComposer
4849
* Graphics scene for map printing. The class manages the paper item which always
@@ -202,6 +203,9 @@ class CORE_EXPORT QgsComposition: public QGraphicsScene
202203
/**Deletes current command*/
203204
void cancelCommand();
204205

206+
void beginMultiFrameCommand( QgsComposerMultiFrame* multiFrame, const QString& text );
207+
void endMultiFrameCommand();
208+
205209
void addMultiFrame( QgsComposerMultiFrame* multiFrame );
206210
/**Removes multi frame (but does not delete it)*/
207211
void removeMultiFrame( QgsComposerMultiFrame* multiFrame );
@@ -283,7 +287,8 @@ class CORE_EXPORT QgsComposition: public QGraphicsScene
283287

284288
QUndoStack mUndoStack;
285289

286-
QgsComposerItemCommand* mActiveCommand;
290+
QgsComposerItemCommand* mActiveItemCommand;
291+
QgsComposerMultiFrameCommand* mActiveMultiFrameCommand;
287292

288293
QgsComposition(); //default constructor is forbidden
289294

‎src/gui/qgscomposerview.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,8 @@ void QgsComposerView::mouseReleaseEvent( QMouseEvent* e )
324324
if ( composition() )
325325
{
326326
QgsComposerHtml* composerHtml = new QgsComposerHtml( composition(), mRubberBandItem->transform().dx(), mRubberBandItem->transform().dy(),
327-
mRubberBandItem->rect().width(), mRubberBandItem->rect().height() );
327+
mRubberBandItem->rect().width(), mRubberBandItem->rect().height(), true );
328+
Q_UNUSED( composerHtml );
328329
scene()->removeItem( mRubberBandItem );
329330
delete mRubberBandItem;
330331
mRubberBandItem = 0;

‎tests/src/core/testqgscomposerhtml.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void TestQgsComposerHtml::cleanup()
5858

5959
void TestQgsComposerHtml::table()
6060
{
61-
QgsComposerHtml* htmlItem = new QgsComposerHtml( mComposition, 0, 0, 100, 200 );
61+
QgsComposerHtml* htmlItem = new QgsComposerHtml( mComposition, 0, 0, 100, 200, false );
6262
htmlItem->setUrl( QUrl( QString( "file:///%1" ).arg( QString( TEST_DATA_DIR ) + QDir::separator() + "html_table.html" ) ) );
6363
QgsCompositionChecker checker( "Composer html table", mComposition, QString( QString( TEST_DATA_DIR ) + QDir::separator() +
6464
"control_images" + QDir::separator() + "expected_composerhtml" + QDir::separator() + "composerhtml_table.png" ) );
@@ -70,7 +70,7 @@ void TestQgsComposerHtml::table()
7070

7171
void TestQgsComposerHtml::tableMultiFrame()
7272
{
73-
QgsComposerHtml* htmlItem = new QgsComposerHtml( mComposition, 10, 10, 100, 50 );
73+
QgsComposerHtml* htmlItem = new QgsComposerHtml( mComposition, 10, 10, 100, 50, false );
7474
htmlItem->setResizeMode( QgsComposerMultiFrame::ExtendToNextPage );
7575
bool result = true;
7676
//page1

0 commit comments

Comments
 (0)
Please sign in to comment.