Skip to content

Commit

Permalink
Further changes to undo-mechanism. Currently not working
Browse files Browse the repository at this point in the history
  • Loading branch information
mhugent committed Aug 8, 2012
1 parent b2782c0 commit b40d0af
Show file tree
Hide file tree
Showing 13 changed files with 127 additions and 40 deletions.
20 changes: 20 additions & 0 deletions src/core/composer/qgscomposerframe.cpp
Expand Up @@ -21,6 +21,10 @@ QgsComposerFrame::QgsComposerFrame( QgsComposition* c, QgsComposerMultiFrame* mf
{ {
} }


QgsComposerFrame::QgsComposerFrame(): QgsComposerItem( 0, 0, 0, 0, 0 ), mMultiFrame( 0 )
{
}

QgsComposerFrame::~QgsComposerFrame() QgsComposerFrame::~QgsComposerFrame()
{ {
} }
Expand Down Expand Up @@ -70,3 +74,19 @@ void QgsComposerFrame::paint( QPainter* painter, const QStyleOptionGraphicsItem*
drawSelectionBoxes( painter ); drawSelectionBoxes( painter );
} }
} }

void QgsComposerFrame::beginItemCommand( const QString& text )
{
if ( mComposition )
{
mComposition->beginMultiFrameCommand( multiFrame(), text );
}
}

void QgsComposerFrame::endItemCommand()
{
if ( mComposition )
{
mComposition->endMultiFrameCommand();
}
}
4 changes: 4 additions & 0 deletions src/core/composer/qgscomposerframe.h
Expand Up @@ -33,13 +33,17 @@ class QgsComposerFrame: public QgsComposerItem


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


void beginItemCommand( const QString& text );
void endItemCommand();

bool writeXML( QDomElement& elem, QDomDocument & doc ) const; bool writeXML( QDomElement& elem, QDomDocument & doc ) const;
bool readXML( const QDomElement& itemElem, const QDomDocument& doc ); bool readXML( const QDomElement& itemElem, const QDomDocument& doc );


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


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



private: private:
QgsComposerFrame(); //forbidden QgsComposerFrame(); //forbidden


Expand Down
7 changes: 4 additions & 3 deletions src/core/composer/qgscomposerhtml.cpp
Expand Up @@ -22,8 +22,8 @@
#include <QWebFrame> #include <QWebFrame>
#include <QWebPage> #include <QWebPage>


QgsComposerHtml::QgsComposerHtml( QgsComposition* c, qreal x, qreal y, qreal width, qreal height ): QgsComposerMultiFrame( c ), mWebPage( 0 ), QgsComposerHtml::QgsComposerHtml( QgsComposition* c, qreal x, qreal y, qreal width, qreal height, bool createUndoCommands ): QgsComposerMultiFrame( c, createUndoCommands ),
mLoaded( false ), mHtmlUnitsToMM( 1.0 ) mWebPage( 0 ), mLoaded( false ), mHtmlUnitsToMM( 1.0 )
{ {
mHtmlUnitsToMM = htmlUnitsToMM(); mHtmlUnitsToMM = htmlUnitsToMM();
mWebPage = new QWebPage(); mWebPage = new QWebPage();
Expand All @@ -38,7 +38,7 @@ QgsComposerHtml::QgsComposerHtml( QgsComposition* c, qreal x, qreal y, qreal wid
} }
} }


QgsComposerHtml::QgsComposerHtml(): QgsComposerMultiFrame( 0 ), mWebPage( 0 ), mLoaded( false ), mHtmlUnitsToMM( 1.0 ) QgsComposerHtml::QgsComposerHtml(): QgsComposerMultiFrame( 0, false ), mWebPage( 0 ), mLoaded( false ), mHtmlUnitsToMM( 1.0 )
{ {
} }


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


bool QgsComposerHtml::readXML( const QDomElement& itemElem, const QDomDocument& doc, bool ignoreFrames ) bool QgsComposerHtml::readXML( const QDomElement& itemElem, const QDomDocument& doc, bool ignoreFrames )
{ {
deleteFrames();
QString urlString = itemElem.attribute( "url" ); QString urlString = itemElem.attribute( "url" );
if ( !urlString.isEmpty() ) if ( !urlString.isEmpty() )
{ {
Expand Down
2 changes: 1 addition & 1 deletion src/core/composer/qgscomposerhtml.h
Expand Up @@ -25,7 +25,7 @@ class QgsComposerHtml: public QgsComposerMultiFrame
{ {
Q_OBJECT Q_OBJECT
public: public:
QgsComposerHtml( QgsComposition* c, qreal x, qreal y, qreal width, qreal height ); QgsComposerHtml( QgsComposition* c, qreal x, qreal y, qreal width, qreal height, bool createUndoCommands );
QgsComposerHtml(); QgsComposerHtml();
~QgsComposerHtml(); ~QgsComposerHtml();


Expand Down
5 changes: 3 additions & 2 deletions src/core/composer/qgscomposeritem.cpp
Expand Up @@ -24,6 +24,7 @@


#include "qgscomposition.h" #include "qgscomposition.h"
#include "qgscomposeritem.h" #include "qgscomposeritem.h"
#include "qgscomposerframe.h"




#include <limits> #include <limits>
Expand Down Expand Up @@ -380,9 +381,9 @@ void QgsComposerItem::mouseReleaseEvent( QGraphicsSceneMouseEvent * event )
return; return;
} }


beginCommand( tr( "Change item position" ) ); beginItemCommand( tr( "Change item position" ) );
changeItemRectangle( mouseMoveStopPoint, mMouseMoveStartPos, this, diffX, diffY, this ); changeItemRectangle( mouseMoveStopPoint, mMouseMoveStartPos, this, diffX, diffY, this );
endCommand(); endItemCommand();


//reset default action //reset default action
mCurrentMouseMoveAction = QgsComposerItem::MoveItem; mCurrentMouseMoveAction = QgsComposerItem::MoveItem;
Expand Down
4 changes: 4 additions & 0 deletions src/core/composer/qgscomposeritem.h
Expand Up @@ -190,10 +190,14 @@ class CORE_EXPORT QgsComposerItem: public QObject, public QGraphicsRectItem


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


virtual void beginItemCommand( const QString& text ) { beginCommand( text ); }

/**Starts new composer undo command /**Starts new composer undo command
@param commandText command title @param commandText command title
@param c context for mergeable commands (unknown for non-mergeable commands*/ @param c context for mergeable commands (unknown for non-mergeable commands*/
void beginCommand( const QString& commandText, QgsComposerMergeCommand::Context c = QgsComposerMergeCommand::Unknown ); void beginCommand( const QString& commandText, QgsComposerMergeCommand::Context c = QgsComposerMergeCommand::Unknown );

virtual void endItemCommand() { endCommand(); }
/**Finish current command and push it onto the undo stack */ /**Finish current command and push it onto the undo stack */
void endCommand(); void endCommand();
void cancelCommand(); void cancelCommand();
Expand Down
13 changes: 12 additions & 1 deletion src/core/composer/qgscomposermultiframe.cpp
Expand Up @@ -17,7 +17,7 @@
#include "qgscomposerframe.h" #include "qgscomposerframe.h"
#include "qgsaddremovemultiframecommand.h" #include "qgsaddremovemultiframecommand.h"


QgsComposerMultiFrame::QgsComposerMultiFrame( QgsComposition* c ): mComposition( c ), mResizeMode( UseExistingFrames ) QgsComposerMultiFrame::QgsComposerMultiFrame( QgsComposition* c, bool createUndoCommands ): mComposition( c ), mResizeMode( UseExistingFrames ), mCreateUndoCommands( createUndoCommands )
{ {
mComposition->addMultiFrame( this ); mComposition->addMultiFrame( this );
} }
Expand Down Expand Up @@ -158,6 +158,17 @@ void QgsComposerMultiFrame::update()
} }
} }


void QgsComposerMultiFrame::deleteFrames()
{
QList<QgsComposerFrame*>::iterator frameIt = mFrameItems.begin();
for ( ; frameIt != mFrameItems.end(); ++frameIt )
{
mComposition->removeComposerItem( *frameIt );
delete *frameIt;
}
mFrameItems.clear();
}

bool QgsComposerMultiFrame::_writeXML( QDomElement& elem, QDomDocument& doc, bool ignoreFrames ) const bool QgsComposerMultiFrame::_writeXML( QDomElement& elem, QDomDocument& doc, bool ignoreFrames ) const
{ {
elem.setAttribute( "resizeMode", mResizeMode ); elem.setAttribute( "resizeMode", mResizeMode );
Expand Down
10 changes: 9 additions & 1 deletion src/core/composer/qgscomposermultiframe.h
Expand Up @@ -39,7 +39,7 @@ class QgsComposerMultiFrame: public QObject
ExtendToNextPage //duplicates last frame to next page to fit the total size ExtendToNextPage //duplicates last frame to next page to fit the total size
}; };


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


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


bool createUndoCommands() const { return mCreateUndoCommands; }
void setCreateUndoCommands( bool enabled ) { mCreateUndoCommands = enabled; }

/**Removes and deletes all frames from mComposition*/
void deleteFrames();

protected: protected:
QgsComposition* mComposition; QgsComposition* mComposition;
QList<QgsComposerFrame*> mFrameItems; QList<QgsComposerFrame*> mFrameItems;
ResizeMode mResizeMode; ResizeMode mResizeMode;
/**True: creates QgsMultiFrameCommands on internal changes (e.g. changing frames )*/
bool mCreateUndoCommands;


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


Expand Down
18 changes: 8 additions & 10 deletions src/core/composer/qgscomposermultiframecommand.cpp
Expand Up @@ -19,7 +19,11 @@
#include "qgscomposermultiframe.h" #include "qgscomposermultiframe.h"


QgsComposerMultiFrameCommand::QgsComposerMultiFrameCommand( QgsComposerMultiFrame* multiFrame, const QString& text, QUndoCommand* parent ): QgsComposerMultiFrameCommand::QgsComposerMultiFrameCommand( QgsComposerMultiFrame* multiFrame, const QString& text, QUndoCommand* parent ):
QUndoCommand( text, parent ), mMultiFrame( multiFrame ), mFirstRun( false ) QUndoCommand( text, parent ), mMultiFrame( multiFrame ), mFirstRun( true )
{
}

QgsComposerMultiFrameCommand::QgsComposerMultiFrameCommand(): QUndoCommand( "", 0 ), mMultiFrame( 0 ), mFirstRun( false )
{ {
} }


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


void QgsComposerMultiFrameCommand::savePreviousState() void QgsComposerMultiFrameCommand::savePreviousState()
{ {
if ( mMultiFrame ) saveState( mPreviousState );
{
saveState( mPreviousState );
}
} }


void QgsComposerMultiFrameCommand::saveAfterState() void QgsComposerMultiFrameCommand::saveAfterState()
{ {
if ( mMultiFrame ) saveState( mAfterState );
{
saveState( mAfterState );
}
} }


void QgsComposerMultiFrameCommand::saveState( QDomDocument& stateDoc ) void QgsComposerMultiFrameCommand::saveState( QDomDocument& stateDoc )
Expand All @@ -80,7 +78,7 @@ bool QgsComposerMultiFrameCommand::checkFirstRun()
{ {
if ( !mFirstRun ) if ( !mFirstRun )
{ {
false; return false;
} }
mFirstRun = false; mFirstRun = false;
return true; return true;
Expand Down
68 changes: 51 additions & 17 deletions src/core/composer/qgscomposition.cpp
Expand Up @@ -27,6 +27,7 @@
#include "qgscomposerscalebar.h" #include "qgscomposerscalebar.h"
#include "qgscomposershape.h" #include "qgscomposershape.h"
#include "qgscomposerattributetable.h" #include "qgscomposerattributetable.h"
#include "qgscomposermultiframecommand.h"
#include "qgslogger.h" #include "qgslogger.h"
#include "qgspaintenginehack.h" #include "qgspaintenginehack.h"
#include "qgspaperitem.h" #include "qgspaperitem.h"
Expand All @@ -39,7 +40,7 @@


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


QgsComposition::QgsComposition(): QgsComposition::QgsComposition():
QGraphicsScene( 0 ), mMapRenderer( 0 ), mPlotStyle( QgsComposition::Preview ), mPageWidth( 297 ), mPageHeight( 210 ), mSpaceBetweenPages( 10 ), mPrintAsRaster( false ), QGraphicsScene( 0 ), mMapRenderer( 0 ), mPlotStyle( QgsComposition::Preview ), mPageWidth( 297 ), mPageHeight( 210 ), mSpaceBetweenPages( 10 ), mPrintAsRaster( false ),
mSelectionTolerance( 0.0 ), mSnapToGrid( false ), mSnapGridResolution( 0.0 ), mSnapGridOffsetX( 0.0 ), mSnapGridOffsetY( 0.0 ), mActiveCommand( 0 ) mSelectionTolerance( 0.0 ), mSnapToGrid( false ), mSnapGridResolution( 0.0 ), mSnapGridOffsetX( 0.0 ), mSnapGridOffsetY( 0.0 ), mActiveItemCommand( 0 ), mActiveMultiFrameCommand( 0 )
{ {
loadSettings(); loadSettings();
} }
Expand All @@ -62,6 +63,8 @@ QgsComposition::~QgsComposition()
// this class is deconstructed - to avoid segfaults // this class is deconstructed - to avoid segfaults
// when composer items access in destructor composition that isn't valid anymore // when composer items access in destructor composition that isn't valid anymore
clear(); clear();
delete mActiveItemCommand;
delete mActiveMultiFrameCommand;
} }


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


void QgsComposition::beginCommand( QgsComposerItem* item, const QString& commandText, QgsComposerMergeCommand::Context c ) void QgsComposition::beginCommand( QgsComposerItem* item, const QString& commandText, QgsComposerMergeCommand::Context c )
{ {
delete mActiveCommand; delete mActiveItemCommand;
if ( !item ) if ( !item )
{ {
mActiveCommand = 0; mActiveItemCommand = 0;
return; return;
} }


if ( c == QgsComposerMergeCommand::Unknown ) if ( c == QgsComposerMergeCommand::Unknown )
{ {
mActiveCommand = new QgsComposerItemCommand( item, commandText ); mActiveItemCommand = new QgsComposerItemCommand( item, commandText );
} }
else else
{ {
mActiveCommand = new QgsComposerMergeCommand( c, item, commandText ); mActiveItemCommand = new QgsComposerMergeCommand( c, item, commandText );
} }
mActiveCommand->savePreviousState(); mActiveItemCommand->savePreviousState();
} }


void QgsComposition::endCommand() void QgsComposition::endCommand()
{ {
if ( mActiveCommand ) if ( mActiveItemCommand )
{ {
mActiveCommand->saveAfterState(); mActiveItemCommand->saveAfterState();
if ( mActiveCommand->containsChange() ) //protect against empty commands if ( mActiveItemCommand->containsChange() ) //protect against empty commands
{ {
mUndoStack.push( mActiveCommand ); mUndoStack.push( mActiveItemCommand );
} }
else else
{ {
delete mActiveCommand; delete mActiveItemCommand;
} }
mActiveCommand = 0; mActiveItemCommand = 0;
} }
} }


void QgsComposition::cancelCommand() void QgsComposition::cancelCommand()
{ {
delete mActiveCommand; delete mActiveItemCommand;
mActiveCommand = 0; mActiveItemCommand = 0;
}

void QgsComposition::beginMultiFrameCommand( QgsComposerMultiFrame* multiFrame, const QString& text )
{
delete mActiveMultiFrameCommand;
mActiveMultiFrameCommand = new QgsComposerMultiFrameCommand( multiFrame, text );
mActiveMultiFrameCommand->savePreviousState();
}

void QgsComposition::endMultiFrameCommand()
{
if ( mActiveMultiFrameCommand )
{
mActiveMultiFrameCommand->saveAfterState();
if ( mActiveMultiFrameCommand->containsChange() )
{
mUndoStack.push( mActiveMultiFrameCommand );
}
else
{
delete mActiveMultiFrameCommand;
}
mActiveMultiFrameCommand = 0;
}
} }


void QgsComposition::addMultiFrame( QgsComposerMultiFrame* multiFrame ) void QgsComposition::addMultiFrame( QgsComposerMultiFrame* multiFrame )
Expand Down Expand Up @@ -1177,7 +1204,14 @@ void QgsComposition::removeComposerItem( QgsComposerItem* item )
else else
{ {
emit itemRemoved( item ); emit itemRemoved( item );
pushAddRemoveCommand( item, tr( "Item deleted" ), QgsAddRemoveItemCommand::Removed ); if ( item->type() == QgsComposerItem::ComposerFrame ) //multiframe tracks item changes
{

}
else
{
pushAddRemoveCommand( item, tr( "Item deleted" ), QgsAddRemoveItemCommand::Removed );
}
} }
} }
} }
Expand Down
9 changes: 7 additions & 2 deletions src/core/composer/qgscomposition.h
Expand Up @@ -22,8 +22,8 @@
#include <QSet> #include <QSet>
#include <QUndoStack> #include <QUndoStack>


#include "qgscomposeritemcommand.h"
#include "qgsaddremoveitemcommand.h" #include "qgsaddremoveitemcommand.h"
#include "qgscomposeritemcommand.h"


class QgsComposerFrame; class QgsComposerFrame;
class QgsComposerItem; class QgsComposerItem;
Expand All @@ -43,6 +43,7 @@ class QgsComposerScaleBar;
class QgsComposerShape; class QgsComposerShape;
class QgsComposerAttributeTable; class QgsComposerAttributeTable;
class QgsComposerMultiFrame; class QgsComposerMultiFrame;
class QgsComposerMultiFrameCommand;


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


void beginMultiFrameCommand( QgsComposerMultiFrame* multiFrame, const QString& text );
void endMultiFrameCommand();

void addMultiFrame( QgsComposerMultiFrame* multiFrame ); void addMultiFrame( QgsComposerMultiFrame* multiFrame );
/**Removes multi frame (but does not delete it)*/ /**Removes multi frame (but does not delete it)*/
void removeMultiFrame( QgsComposerMultiFrame* multiFrame ); void removeMultiFrame( QgsComposerMultiFrame* multiFrame );
Expand Down Expand Up @@ -283,7 +287,8 @@ class CORE_EXPORT QgsComposition: public QGraphicsScene


QUndoStack mUndoStack; QUndoStack mUndoStack;


QgsComposerItemCommand* mActiveCommand; QgsComposerItemCommand* mActiveItemCommand;
QgsComposerMultiFrameCommand* mActiveMultiFrameCommand;


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


Expand Down

0 comments on commit b40d0af

Please sign in to comment.