Skip to content

Commit 89f1aaa

Browse files
olivierdalangmhugent
authored andcommittedMar 7, 2013
[Feature] Paste in place in the composer using ctrl+alt+v.
1 parent e65f208 commit 89f1aaa

File tree

3 files changed

+85
-12
lines changed

3 files changed

+85
-12
lines changed
 

‎src/core/composer/qgscomposition.cpp

Lines changed: 78 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -446,8 +446,13 @@ bool QgsComposition::loadFromTemplate( const QDomDocument& doc, QMap<QString, QS
446446
}
447447

448448
void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocument& doc, QMap< QgsComposerMap*, int >* mapsToRestore,
449-
bool addUndoCommands, QPointF* pos )
449+
bool addUndoCommands, QPointF* pos, bool pasteInPlace )
450450
{
451+
QPointF* pasteInPlacePt;
452+
if( pasteInPlace )
453+
{
454+
pasteInPlacePt = new QPointF(0, pageNumberAt( *pos ) * (mPageHeight+mSpaceBetweenPages) );
455+
}
451456
QDomNodeList composerLabelList = elem.elementsByTagName( "ComposerLabel" );
452457
for ( int i = 0; i < composerLabelList.size(); ++i )
453458
{
@@ -456,7 +461,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
456461
newLabel->readXML( currentComposerLabelElem, doc );
457462
if ( pos )
458463
{
459-
newLabel->setItemPosition( pos->x(), pos->y() );
464+
if ( pasteInPlace )
465+
{
466+
newLabel->setItemPosition( newLabel->transform().dx(), fmod(newLabel->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
467+
newLabel->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
468+
}
469+
else
470+
{
471+
newLabel->setItemPosition( pos->x(), pos->y() );
472+
}
460473
}
461474
addComposerLabel( newLabel );
462475
if ( addUndoCommands )
@@ -482,7 +495,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
482495

483496
if ( pos )
484497
{
485-
newMap->setItemPosition( pos->x(), pos->y() );
498+
if ( pasteInPlace )
499+
{
500+
newMap->setItemPosition( newMap->transform().dx(), fmod(newMap->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
501+
newMap->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
502+
}
503+
else
504+
{
505+
newMap->setItemPosition( pos->x(), pos->y() );
506+
}
486507
}
487508

488509
if ( addUndoCommands )
@@ -499,7 +520,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
499520
newArrow->readXML( currentComposerArrowElem, doc );
500521
if ( pos )
501522
{
502-
newArrow->setItemPosition( pos->x(), pos->y() );
523+
if ( pasteInPlace )
524+
{
525+
newArrow->setItemPosition( newArrow->transform().dx(), fmod(newArrow->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
526+
newArrow->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
527+
}
528+
else
529+
{
530+
newArrow->setItemPosition( pos->x(), pos->y() );
531+
}
503532
}
504533
addComposerArrow( newArrow );
505534
if ( addUndoCommands )
@@ -516,7 +545,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
516545
newScaleBar->readXML( currentComposerScaleBarElem, doc );
517546
if ( pos )
518547
{
519-
newScaleBar->setItemPosition( pos->x(), pos->y() );
548+
if ( pasteInPlace )
549+
{
550+
newScaleBar->setItemPosition( newScaleBar->transform().dx(), fmod(newScaleBar->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
551+
newScaleBar->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
552+
}
553+
else
554+
{
555+
newScaleBar->setItemPosition( pos->x(), pos->y() );
556+
}
520557
}
521558
addComposerScaleBar( newScaleBar );
522559
if ( addUndoCommands )
@@ -533,7 +570,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
533570
newShape->readXML( currentComposerShapeElem, doc );
534571
if ( pos )
535572
{
536-
newShape->setItemPosition( pos->x(), pos->y() );
573+
if ( pasteInPlace )
574+
{
575+
newShape->setItemPosition( newShape->transform().dx(), fmod(newShape->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
576+
newShape->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
577+
}
578+
else
579+
{
580+
newShape->setItemPosition( pos->x(), pos->y() );
581+
}
537582
}
538583
addComposerShape( newShape );
539584
if ( addUndoCommands )
@@ -550,7 +595,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
550595
newPicture->readXML( currentComposerPictureElem, doc );
551596
if ( pos )
552597
{
553-
newPicture->setItemPosition( pos->x(), pos->y() );
598+
if ( pasteInPlace )
599+
{
600+
newPicture->setItemPosition( newPicture->transform().dx(), fmod(newPicture->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
601+
newPicture->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
602+
}
603+
else
604+
{
605+
newPicture->setItemPosition( pos->x(), pos->y() );
606+
}
554607
}
555608
addComposerPicture( newPicture );
556609
if ( addUndoCommands )
@@ -567,7 +620,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
567620
newLegend->readXML( currentComposerLegendElem, doc );
568621
if ( pos )
569622
{
570-
newLegend->setItemPosition( pos->x(), pos->y() );
623+
if ( pasteInPlace )
624+
{
625+
newLegend->setItemPosition( newLegend->transform().dx(), fmod(newLegend->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
626+
newLegend->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
627+
}
628+
else
629+
{
630+
newLegend->setItemPosition( pos->x(), pos->y() );
631+
}
571632
}
572633
addComposerLegend( newLegend );
573634
if ( addUndoCommands )
@@ -584,7 +645,15 @@ void QgsComposition::addItemsFromXML( const QDomElement& elem, const QDomDocumen
584645
newTable->readXML( currentComposerTableElem, doc );
585646
if ( pos )
586647
{
587-
newTable->setItemPosition( pos->x(), pos->y() );
648+
if ( pasteInPlace )
649+
{
650+
newTable->setItemPosition( newTable->transform().dx(), fmod(newTable->transform().dy(), (paperHeight()+spaceBetweenPages()) ) );
651+
newTable->move( pasteInPlacePt->x(),pasteInPlacePt->y() );
652+
}
653+
else
654+
{
655+
newTable->setItemPosition( pos->x(), pos->y() );
656+
}
588657
}
589658
addComposerTable( newTable );
590659
if ( addUndoCommands )

‎src/core/composer/qgscomposition.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,10 +207,11 @@ class CORE_EXPORT QgsComposition: public QGraphicsScene
207207
@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
208208
@param addUndoCommands insert AddItem commands if true (e.g. for copy/paste)
209209
@param pos item position. Optional, take position from xml if 0
210+
@param pasteInPlace wheter the position should be kept but mapped to the page origin. (the page is the page under to the mouse cursor)
210211
@note not available in python bindings
211212
*/
212213
void addItemsFromXML( const QDomElement& elem, const QDomDocument& doc, QMap< QgsComposerMap*, int >* mapsToRestore = 0,
213-
bool addUndoCommands = false, QPointF* pos = 0 );
214+
bool addUndoCommands = false, QPointF* pos = 0, bool pasteInPlace = false );
214215

215216
/**Adds item to z list. Usually called from constructor of QgsComposerItem*/
216217
void addItemToZList( QgsComposerItem* item );

‎src/gui/qgscomposerview.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ void QgsComposerView::mouseDoubleClickEvent( QMouseEvent* e )
448448

449449
void QgsComposerView::keyPressEvent( QKeyEvent * e )
450450
{
451+
//TODO : those should be actions (so we could also display menu items and/or toolbar items)
451452
if ( e->key() == Qt::Key_Shift )
452453
{
453454
mShiftKeyPressed = true;
@@ -491,7 +492,8 @@ void QgsComposerView::keyPressEvent( QKeyEvent * e )
491492
clipboard->setMimeData( mimeData );
492493
}
493494

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

0 commit comments

Comments
 (0)
Please sign in to comment.