@@ -328,6 +328,7 @@ void QgsComposerView::mousePressEvent( QMouseEvent* e )
328328 return ;
329329 }
330330
331+ // create rubber band for adding line items
331332 case AddArrow:
332333 {
333334 mRubberBandStartPos = QPointF ( snappedScenePoint.x (), snappedScenePoint.y () );
@@ -338,12 +339,16 @@ void QgsComposerView::mousePressEvent( QMouseEvent* e )
338339 break ;
339340 }
340341
341- // create rubber band for map and ellipse items
342+ // create rubber band for adding rectangular items
342343 case AddMap:
343344 case AddRectangle:
344345 case AddTriangle:
345346 case AddEllipse:
346347 case AddHtml:
348+ case AddPicture:
349+ case AddLabel:
350+ case AddLegend:
351+ case AddTable:
347352 {
348353 QTransform t;
349354 mRubberBandItem = new QGraphicsRectItem ( 0 , 0 , 0 , 0 );
@@ -356,24 +361,6 @@ void QgsComposerView::mousePressEvent( QMouseEvent* e )
356361 }
357362 break ;
358363
359- case AddLabel:
360- if ( composition () )
361- {
362- QgsComposerLabel* newLabelItem = new QgsComposerLabel ( composition () );
363- newLabelItem->setText ( tr ( " QGIS" ) );
364- newLabelItem->adjustSizeToText ();
365- newLabelItem->setSceneRect ( QRectF ( snappedScenePoint.x (), snappedScenePoint.y (), newLabelItem->rect ().width (), newLabelItem->rect ().height () ) );
366- composition ()->addComposerLabel ( newLabelItem );
367-
368- composition ()->clearSelection ();
369- newLabelItem->setSelected ( true );
370- emit selectedItemChanged ( newLabelItem );
371-
372- emit actionFinished ();
373- composition ()->pushAddRemoveCommand ( newLabelItem, tr ( " Label added" ) );
374- }
375- break ;
376-
377364 case AddScalebar:
378365 if ( composition () )
379366 {
@@ -396,54 +383,6 @@ void QgsComposerView::mousePressEvent( QMouseEvent* e )
396383 }
397384 break ;
398385
399- case AddLegend:
400- {
401- if ( composition () )
402- {
403- QgsComposerLegend* newLegend = new QgsComposerLegend ( composition () );
404- newLegend->setSceneRect ( QRectF ( snappedScenePoint.x (), snappedScenePoint.y (), newLegend->rect ().width (), newLegend->rect ().height () ) );
405- composition ()->addComposerLegend ( newLegend );
406- newLegend->updateLegend ();
407-
408- composition ()->clearSelection ();
409- newLegend->setSelected ( true );
410- emit selectedItemChanged ( newLegend );
411-
412- emit actionFinished ();
413- composition ()->pushAddRemoveCommand ( newLegend, tr ( " Legend added" ) );
414- }
415- break ;
416- }
417- case AddPicture:
418- if ( composition () )
419- {
420- QgsComposerPicture* newPicture = new QgsComposerPicture ( composition () );
421- newPicture->setSceneRect ( QRectF ( snappedScenePoint.x (), snappedScenePoint.y (), 30 , 30 ) );
422- composition ()->addComposerPicture ( newPicture );
423-
424- composition ()->clearSelection ();
425- newPicture->setSelected ( true );
426- emit selectedItemChanged ( newPicture );
427-
428- emit actionFinished ();
429- composition ()->pushAddRemoveCommand ( newPicture, tr ( " Picture added" ) );
430- }
431- break ;
432- case AddTable:
433- if ( composition () )
434- {
435- QgsComposerAttributeTable* newTable = new QgsComposerAttributeTable ( composition () );
436- newTable->setSceneRect ( QRectF ( snappedScenePoint.x (), snappedScenePoint.y (), 50 , 50 ) );
437- composition ()->addComposerTable ( newTable );
438-
439- composition ()->clearSelection ();
440- newTable->setSelected ( true );
441- emit selectedItemChanged ( newTable );
442-
443- emit actionFinished ();
444- composition ()->pushAddRemoveCommand ( newTable, tr ( " Table added" ) );
445- }
446- break ;
447386 default :
448387 break ;
449388 }
@@ -794,7 +733,14 @@ void QgsComposerView::mouseReleaseEvent( QMouseEvent* e )
794733 break ;
795734 }
796735 case AddArrow:
797- if ( composition () )
736+ if ( !composition () || !mRubberBandLineItem )
737+ {
738+ scene ()->removeItem ( mRubberBandLineItem );
739+ delete mRubberBandLineItem ;
740+ mRubberBandLineItem = 0 ;
741+ return ;
742+ }
743+ else
798744 {
799745 QPointF scenePoint = mapToScene ( e->pos () );
800746 QPointF snappedScenePoint = composition ()->snapPointToGrid ( scenePoint );
@@ -820,12 +766,12 @@ void QgsComposerView::mouseReleaseEvent( QMouseEvent* e )
820766 break ;
821767
822768 case AddMap:
823- if ( !mRubberBandItem || ( mRubberBandItem ->rect ().width () < 0.1 && mRubberBandItem ->rect ().height () < 0.1 ) )
769+ if ( !composition () || ! mRubberBandItem || ( mRubberBandItem ->rect ().width () < 0.1 && mRubberBandItem ->rect ().height () < 0.1 ) )
824770 {
825771 removeRubberBand ();
826772 return ;
827773 }
828- if ( composition () )
774+ else
829775 {
830776 QgsComposerMap* composerMap = new QgsComposerMap ( composition (), mRubberBandItem ->transform ().dx (), mRubberBandItem ->transform ().dy (), mRubberBandItem ->rect ().width (), mRubberBandItem ->rect ().height () );
831777 composition ()->addComposerMap ( composerMap );
@@ -840,8 +786,119 @@ void QgsComposerView::mouseReleaseEvent( QMouseEvent* e )
840786 }
841787 break ;
842788
789+ case AddPicture:
790+ if ( !composition () || !mRubberBandItem || ( mRubberBandItem ->rect ().width () < 0.1 && mRubberBandItem ->rect ().height () < 0.1 ) )
791+ {
792+ removeRubberBand ();
793+ return ;
794+ }
795+ else
796+ {
797+ QgsComposerPicture* newPicture = new QgsComposerPicture ( composition () );
798+ newPicture->setSceneRect ( QRectF ( mRubberBandItem ->transform ().dx (), mRubberBandItem ->transform ().dy (), mRubberBandItem ->rect ().width (), mRubberBandItem ->rect ().height () ) );
799+ composition ()->addComposerPicture ( newPicture );
800+
801+ composition ()->clearSelection ();
802+ newPicture->setSelected ( true );
803+ emit selectedItemChanged ( newPicture );
804+
805+ removeRubberBand ();
806+ emit actionFinished ();
807+ composition ()->pushAddRemoveCommand ( newPicture, tr ( " Picture added" ) );
808+ }
809+ break ;
810+
811+ case AddLabel:
812+ if ( !composition () || !mRubberBandItem )
813+ {
814+ removeRubberBand ();
815+ return ;
816+ }
817+ else
818+ {
819+ QgsComposerLabel* newLabelItem = new QgsComposerLabel ( composition () );
820+ newLabelItem->setText ( tr ( " QGIS" ) );
821+ newLabelItem->adjustSizeToText ();
822+
823+ // make sure label size is sufficient to fit text
824+ double labelWidth = qMax ( mRubberBandItem ->rect ().width (), newLabelItem->rect ().width () );
825+ double labelHeight = qMax ( mRubberBandItem ->rect ().height (), newLabelItem->rect ().height () );
826+ newLabelItem->setSceneRect ( QRectF ( mRubberBandItem ->transform ().dx (), mRubberBandItem ->transform ().dy (), labelWidth, labelHeight ) );
827+
828+ composition ()->addComposerLabel ( newLabelItem );
829+
830+ composition ()->clearSelection ();
831+ newLabelItem->setSelected ( true );
832+ emit selectedItemChanged ( newLabelItem );
833+
834+ removeRubberBand ();
835+ emit actionFinished ();
836+ composition ()->pushAddRemoveCommand ( newLabelItem, tr ( " Label added" ) );
837+ }
838+ break ;
839+
840+ case AddLegend:
841+ if ( !composition () || !mRubberBandItem )
842+ {
843+ removeRubberBand ();
844+ return ;
845+ }
846+ else
847+ {
848+ QgsComposerLegend* newLegend = new QgsComposerLegend ( composition () );
849+ newLegend->setSceneRect ( QRectF ( mRubberBandItem ->transform ().dx (), mRubberBandItem ->transform ().dy (), mRubberBandItem ->rect ().width (), mRubberBandItem ->rect ().height () ) );
850+ composition ()->addComposerLegend ( newLegend );
851+ newLegend->updateLegend ();
852+
853+ composition ()->clearSelection ();
854+ newLegend->setSelected ( true );
855+ emit selectedItemChanged ( newLegend );
856+
857+ removeRubberBand ();
858+ emit actionFinished ();
859+ composition ()->pushAddRemoveCommand ( newLegend, tr ( " Legend added" ) );
860+ }
861+ break ;
862+
863+ case AddTable:
864+ if ( !composition () || !mRubberBandItem )
865+ {
866+ removeRubberBand ();
867+ return ;
868+ }
869+ else
870+ {
871+ QgsComposerAttributeTable* newTable = new QgsComposerAttributeTable ( composition () );
872+ newTable->setSceneRect ( QRectF ( mRubberBandItem ->transform ().dx (), mRubberBandItem ->transform ().dy (), mRubberBandItem ->rect ().width (), qMax ( mRubberBandItem ->rect ().height (), 15.0 ) ) );
873+ QList<const QgsComposerMap*> mapItemList = composition ()->composerMapItems ();
874+ if ( mapItemList.size () > 0 )
875+ {
876+ newTable->setComposerMap ( mapItemList.at ( 0 ) );
877+ newTable->setDisplayOnlyVisibleFeatures ( true );
878+ }
879+ else
880+ {
881+ newTable->setDisplayOnlyVisibleFeatures ( false );
882+ }
883+ composition ()->addComposerTable ( newTable );
884+
885+ composition ()->clearSelection ();
886+ newTable->setSelected ( true );
887+ emit selectedItemChanged ( newTable );
888+
889+ removeRubberBand ();
890+ emit actionFinished ();
891+ composition ()->pushAddRemoveCommand ( newTable, tr ( " Table added" ) );
892+ }
893+ break ;
894+
843895 case AddHtml:
844- if ( composition () )
896+ if ( !composition () || !mRubberBandItem || ( mRubberBandItem ->rect ().width () < 0.1 && mRubberBandItem ->rect ().height () < 0.1 ) )
897+ {
898+ removeRubberBand ();
899+ return ;
900+ }
901+ else
845902 {
846903 QgsComposerHtml* composerHtml = new QgsComposerHtml ( composition (), true );
847904 QgsAddRemoveMultiFrameCommand* command = new QgsAddRemoveMultiFrameCommand ( QgsAddRemoveMultiFrameCommand::Added,
@@ -932,6 +989,10 @@ void QgsComposerView::mouseMoveEvent( QMouseEvent* e )
932989 case AddTriangle:
933990 case AddEllipse:
934991 case AddHtml:
992+ case AddPicture:
993+ case AddLabel:
994+ case AddLegend:
995+ case AddTable:
935996 // adjust rubber band item
936997 {
937998 updateRubberBand ( scenePoint );
0 commit comments