Skip to content

Commit

Permalink
[Feature] Paste in place in the composer using ctrl+alt+v.
Browse files Browse the repository at this point in the history
  • Loading branch information
olivierdalang authored and mhugent committed Mar 7, 2013
1 parent e65f208 commit 89f1aaa
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 12 deletions.
87 changes: 78 additions & 9 deletions src/core/composer/qgscomposition.cpp
Expand Up @@ -446,8 +446,13 @@ bool QgsComposition::loadFromTemplate( const QDomDocument& doc, QMap<QString, QS
}

void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocument& doc, QMap< QgsComposerMap*, int >* mapsToRestore,
bool addUndoCommands, QPointF* pos )
bool addUndoCommands, QPointF* pos, bool pasteInPlace )
{
QPointF* pasteInPlacePt;
if( pasteInPlace )
{
pasteInPlacePt = new QPointF(0, pageNumberAt( *pos ) * (mPageHeight+mSpaceBetweenPages) );
}
QDomNodeList composerLabelList = elem.elementsByTagName( "ComposerLabel" );
for ( int i = 0; i < composerLabelList.size(); ++i )
{
Expand All @@ -456,7 +461,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
newLabel->readXML( currentComposerLabelElem, doc );
if ( pos )
{
newLabel->setItemPosition( pos->x(), pos->y() );
if ( pasteInPlace )
{
newLabel->setItemPosition( newLabel->transform().dx(), fmod(newLabel->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
newLabel->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
}
else
{
newLabel->setItemPosition( pos->x(), pos->y() );
}
}
addComposerLabel( newLabel );
if ( addUndoCommands )
Expand All @@ -482,7 +495,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen

if ( pos )
{
newMap->setItemPosition( pos->x(), pos->y() );
if ( pasteInPlace )
{
newMap->setItemPosition( newMap->transform().dx(), fmod(newMap->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
newMap->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
}
else
{
newMap->setItemPosition( pos->x(), pos->y() );
}
}

if ( addUndoCommands )
Expand All @@ -499,7 +520,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
newArrow->readXML( currentComposerArrowElem, doc );
if ( pos )
{
newArrow->setItemPosition( pos->x(), pos->y() );
if ( pasteInPlace )
{
newArrow->setItemPosition( newArrow->transform().dx(), fmod(newArrow->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
newArrow->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
}
else
{
newArrow->setItemPosition( pos->x(), pos->y() );
}
}
addComposerArrow( newArrow );
if ( addUndoCommands )
Expand All @@ -516,7 +545,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
newScaleBar->readXML( currentComposerScaleBarElem, doc );
if ( pos )
{
newScaleBar->setItemPosition( pos->x(), pos->y() );
if ( pasteInPlace )
{
newScaleBar->setItemPosition( newScaleBar->transform().dx(), fmod(newScaleBar->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
newScaleBar->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
}
else
{
newScaleBar->setItemPosition( pos->x(), pos->y() );
}
}
addComposerScaleBar( newScaleBar );
if ( addUndoCommands )
Expand All @@ -533,7 +570,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
newShape->readXML( currentComposerShapeElem, doc );
if ( pos )
{
newShape->setItemPosition( pos->x(), pos->y() );
if ( pasteInPlace )
{
newShape->setItemPosition( newShape->transform().dx(), fmod(newShape->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
newShape->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
}
else
{
newShape->setItemPosition( pos->x(), pos->y() );
}
}
addComposerShape( newShape );
if ( addUndoCommands )
Expand All @@ -550,7 +595,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
newPicture->readXML( currentComposerPictureElem, doc );
if ( pos )
{
newPicture->setItemPosition( pos->x(), pos->y() );
if ( pasteInPlace )
{
newPicture->setItemPosition( newPicture->transform().dx(), fmod(newPicture->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
newPicture->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
}
else
{
newPicture->setItemPosition( pos->x(), pos->y() );
}
}
addComposerPicture( newPicture );
if ( addUndoCommands )
Expand All @@ -567,7 +620,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
newLegend->readXML( currentComposerLegendElem, doc );
if ( pos )
{
newLegend->setItemPosition( pos->x(), pos->y() );
if ( pasteInPlace )
{
newLegend->setItemPosition( newLegend->transform().dx(), fmod(newLegend->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
newLegend->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
}
else
{
newLegend->setItemPosition( pos->x(), pos->y() );
}
}
addComposerLegend( newLegend );
if ( addUndoCommands )
Expand All @@ -584,7 +645,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
newTable->readXML( currentComposerTableElem, doc );
if ( pos )
{
newTable->setItemPosition( pos->x(), pos->y() );
if ( pasteInPlace )
{
newTable->setItemPosition( newTable->transform().dx(), fmod(newTable->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
newTable->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
}
else
{
newTable->setItemPosition( pos->x(), pos->y() );
}
}
addComposerTable( newTable );
if ( addUndoCommands )
Expand Down
3 changes: 2 additions & 1 deletion src/core/composer/qgscomposition.h
Expand Up @@ -207,10 +207,11 @@ class CORE_EXPORT QgsComposition: public QGraphicsScene
@param mapsToRestore for reading from project file: set preview move 'rectangle' to all maps and save the preview states to show composer maps on demand
@param addUndoCommands insert AddItem commands if true (e.g. for copy/paste)
@param pos item position. Optional, take position from xml if 0
@param pasteInPlace wheter the position should be kept but mapped to the page origin. (the page is the page under to the mouse cursor)
@note not available in python bindings
*/
void addItemsFromXML( const QDomElement& elem, const QDomDocument& doc, QMap< QgsComposerMap*, int >* mapsToRestore = 0,
bool addUndoCommands = false, QPointF* pos = 0 );
bool addUndoCommands = false, QPointF* pos = 0, bool pasteInPlace = false );

/**Adds item to z list. Usually called from constructor of QgsComposerItem*/
void addItemToZList( QgsComposerItem* item );
Expand Down
7 changes: 5 additions & 2 deletions src/gui/qgscomposerview.cpp
Expand Up @@ -448,6 +448,7 @@ void QgsComposerView::mouseDoubleClickEvent( QMouseEvent* e )

void QgsComposerView::keyPressEvent( QKeyEvent * e )
{
//TODO : those should be actions (so we could also display menu items and/or toolbar items)
if ( e->key() == Qt::Key_Shift )
{
mShiftKeyPressed = true;
Expand Down Expand Up @@ -491,7 +492,8 @@ void QgsComposerView::keyPressEvent( QKeyEvent * e )
clipboard->setMimeData( mimeData );
}

if ( e->matches( QKeySequence::Paste ) )
//TODO : "Ctrl+Shift+V" is one way to paste, but on some platefoms you can use Shift+Ins and F18
if ( e->matches( QKeySequence::Paste ) || (e->key() == Qt::Key_V && e->modifiers() & Qt::ControlModifier && e->modifiers() & Qt::AltModifier) )
{
QDomDocument doc;
QClipboard *clipboard = QApplication::clipboard();
Expand All @@ -503,7 +505,8 @@ void QgsComposerView::keyPressEvent( QKeyEvent * e )
if ( composition() )
{
QPointF pt = mapToScene( mapFromGlobal( QCursor::pos() ) );
composition()->addItemsFromXML( docElem, doc, 0, true, &pt );
bool pasteInPlace = (e->modifiers() & Qt::AltModifier);
composition()->addItemsFromXML( docElem, doc, 0, true, &pt, pasteInPlace );
}
}
}
Expand Down

0 comments on commit 89f1aaa

Please sign in to comment.