00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <QMainWindow>
00019 #include <QMouseEvent>
00020 #include <QKeyEvent>
00021
00022 #include "qgscomposerview.h"
00023 #include "qgscomposerarrow.h"
00024 #include "qgscomposerlabel.h"
00025 #include "qgscomposerlegend.h"
00026 #include "qgscomposermap.h"
00027 #include "qgscomposeritemgroup.h"
00028 #include "qgscomposerpicture.h"
00029 #include "qgscomposerscalebar.h"
00030 #include "qgscomposershape.h"
00031 #include "qgscomposerattributetable.h"
00032
00033 QgsComposerView::QgsComposerView( QWidget* parent, const char* name, Qt::WFlags f ) :
00034 QGraphicsView( parent ), mShiftKeyPressed( false ), mRubberBandItem( 0 ), mRubberBandLineItem( 0 ), mMoveContentItem( 0 )
00035 {
00036 setResizeAnchor( QGraphicsView::AnchorViewCenter );
00037 setMouseTracking( true );
00038 viewport()->setMouseTracking( true );
00039 }
00040
00041 void QgsComposerView::mousePressEvent( QMouseEvent* e )
00042 {
00043 if ( !composition() )
00044 {
00045 return;
00046 }
00047
00048 QPointF scenePoint = mapToScene( e->pos() );
00049 QPointF snappedScenePoint = composition()->snapPointToGrid( scenePoint );
00050
00051
00052 if ( e->button() == Qt::RightButton )
00053 {
00054 QgsComposerItem* selectedItem = composition()->composerItemAt( scenePoint );
00055 if ( selectedItem )
00056 {
00057 bool lock = selectedItem->positionLock() ? false : true;
00058 selectedItem->setPositionLock( lock );
00059 selectedItem->update();
00060
00061 QPointF itemPoint = selectedItem->mapFromScene( scenePoint );
00062 selectedItem->updateCursor( itemPoint );
00063 }
00064 return;
00065 }
00066
00067 switch ( mCurrentTool )
00068 {
00069
00070 case Select:
00071 {
00072 if ( !mShiftKeyPressed )
00073 {
00074 composition()->clearSelection();
00075 }
00076
00077
00078 QgsComposerItem* selectedItem = composition()->composerItemAt( scenePoint );
00079 if ( !selectedItem )
00080 {
00081 break;
00082 }
00083
00084 selectedItem->setSelected( true );
00085 QGraphicsView::mousePressEvent( e );
00086 emit selectedItemChanged( selectedItem );
00087 break;
00088 }
00089
00090 case MoveItemContent:
00091 {
00092
00093 QgsComposerItem* item = dynamic_cast<QgsComposerItem *>( itemAt( e->pos() ) );
00094 if ( item )
00095 {
00096 mMoveContentStartPos = scenePoint;
00097 }
00098 mMoveContentItem = item;
00099 break;
00100 }
00101
00102 case AddArrow:
00103 {
00104 mRubberBandStartPos = QPointF( snappedScenePoint.x(), snappedScenePoint.y() );
00105 mRubberBandLineItem = new QGraphicsLineItem( snappedScenePoint.x(), snappedScenePoint.y(), snappedScenePoint.x(), snappedScenePoint.y() );
00106 mRubberBandLineItem->setZValue( 100 );
00107 scene()->addItem( mRubberBandLineItem );
00108 scene()->update();
00109 break;
00110 }
00111
00112
00113 case AddMap:
00114 case AddShape:
00115 {
00116 QTransform t;
00117 mRubberBandItem = new QGraphicsRectItem( 0, 0, 0, 0 );
00118 mRubberBandStartPos = QPointF( snappedScenePoint.x(), snappedScenePoint.y() );
00119 t.translate( snappedScenePoint.x(), snappedScenePoint.y() );
00120 mRubberBandItem->setTransform( t );
00121 mRubberBandItem->setZValue( 100 );
00122 scene()->addItem( mRubberBandItem );
00123 scene()->update();
00124 }
00125 break;
00126
00127 case AddLabel:
00128 {
00129 QgsComposerLabel* newLabelItem = new QgsComposerLabel( composition() );
00130 newLabelItem->setText( tr( "Quantum GIS" ) );
00131 newLabelItem->adjustSizeToText();
00132 newLabelItem->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), newLabelItem->rect().width(), newLabelItem->rect().height() ) );
00133 addComposerLabel( newLabelItem );
00134 emit actionFinished();
00135 }
00136 break;
00137
00138 case AddScalebar:
00139 {
00140 QgsComposerScaleBar* newScaleBar = new QgsComposerScaleBar( composition() );
00141 addComposerScaleBar( newScaleBar );
00142 newScaleBar->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), 20, 20 ) );
00143 emit actionFinished();
00144 }
00145 break;
00146
00147 case AddLegend:
00148 {
00149 QgsComposerLegend* newLegend = new QgsComposerLegend( composition() );
00150 addComposerLegend( newLegend );
00151 newLegend->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), newLegend->rect().width(), newLegend->rect().height() ) );
00152 emit actionFinished();
00153 break;
00154 }
00155 case AddPicture:
00156 {
00157 QgsComposerPicture* newPicture = new QgsComposerPicture( composition() );
00158 addComposerPicture( newPicture );
00159 newPicture->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), 30, 30 ) );
00160 emit actionFinished();
00161 break;
00162 }
00163 case AddTable:
00164 {
00165 QgsComposerAttributeTable* newTable = new QgsComposerAttributeTable( composition() );
00166 addComposerTable( newTable );
00167 newTable->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), 50, 50 ) );
00168 emit actionFinished();
00169 break;
00170 }
00171
00172 default:
00173 break;
00174 }
00175 }
00176
00177 void QgsComposerView::mouseReleaseEvent( QMouseEvent* e )
00178 {
00179 if ( !composition() )
00180 {
00181 return;
00182 }
00183
00184 QPointF scenePoint = mapToScene( e->pos() );
00185
00186 switch ( mCurrentTool )
00187 {
00188 case Select:
00189 {
00190 QGraphicsView::mouseReleaseEvent( e );
00191 break;
00192 }
00193
00194 case MoveItemContent:
00195 {
00196 if ( mMoveContentItem )
00197 {
00198
00199 QgsComposerMap* composerMap = dynamic_cast<QgsComposerMap *>( mMoveContentItem );
00200 if ( composerMap )
00201 {
00202 composerMap->setOffset( 0, 0 );
00203 }
00204
00205 double moveX = scenePoint.x() - mMoveContentStartPos.x();
00206 double moveY = scenePoint.y() - mMoveContentStartPos.y();
00207 mMoveContentItem->moveContent( -moveX, -moveY );
00208 mMoveContentItem = 0;
00209 }
00210 break;
00211 }
00212 case AddArrow:
00213 {
00214 QPointF scenePoint = mapToScene( e->pos() );
00215 QPointF snappedScenePoint = composition()->snapPointToGrid( scenePoint );
00216 QgsComposerArrow* composerArrow = new QgsComposerArrow( mRubberBandStartPos, QPointF( snappedScenePoint.x(), snappedScenePoint.y() ), composition() );
00217 addComposerArrow( composerArrow );
00218 scene()->removeItem( mRubberBandLineItem );
00219 delete mRubberBandLineItem;
00220 mRubberBandLineItem = 0;
00221 emit actionFinished();
00222 break;
00223 }
00224
00225 case AddShape:
00226 {
00227 if ( !mRubberBandItem || mRubberBandItem->rect().width() < 0.1 || mRubberBandItem->rect().width() < 0.1 )
00228 {
00229 scene()->removeItem( mRubberBandItem );
00230 delete mRubberBandItem;
00231 mRubberBandItem = 0;
00232 return;
00233 }
00234
00235 QgsComposerShape* composerShape = new QgsComposerShape( mRubberBandItem->transform().dx(), mRubberBandItem->transform().dy(), mRubberBandItem->rect().width(), mRubberBandItem->rect().height(), composition() );
00236 addComposerShape( composerShape );
00237 scene()->removeItem( mRubberBandItem );
00238 delete mRubberBandItem;
00239 mRubberBandItem = 0;
00240 emit actionFinished();
00241 break;
00242 }
00243
00244 case AddMap:
00245 {
00246 if ( !mRubberBandItem || mRubberBandItem->rect().width() < 0.1 || mRubberBandItem->rect().width() < 0.1 )
00247 {
00248 if ( mRubberBandItem )
00249 {
00250 scene()->removeItem( mRubberBandItem );
00251 delete mRubberBandItem;
00252 mRubberBandItem = 0;
00253 }
00254 return;
00255 }
00256
00257 QgsComposerMap* composerMap = new QgsComposerMap( composition(), mRubberBandItem->transform().dx(), mRubberBandItem->transform().dy(), mRubberBandItem->rect().width(), mRubberBandItem->rect().height() );
00258 addComposerMap( composerMap );
00259 scene()->removeItem( mRubberBandItem );
00260 delete mRubberBandItem;
00261 mRubberBandItem = 0;
00262 emit actionFinished();
00263 }
00264 break;
00265
00266 default:
00267 break;
00268 }
00269 }
00270
00271 void QgsComposerView::mouseMoveEvent( QMouseEvent* e )
00272 {
00273 if ( !composition() )
00274 {
00275 return;
00276 }
00277
00278 if ( e->buttons() == Qt::NoButton )
00279 {
00280 if ( mCurrentTool == Select )
00281 {
00282 QGraphicsView::mouseMoveEvent( e );
00283 }
00284 }
00285 else
00286 {
00287 QPointF scenePoint = mapToScene( e->pos() );
00288
00289 switch ( mCurrentTool )
00290 {
00291 case Select:
00292 QGraphicsView::mouseMoveEvent( e );
00293 break;
00294
00295 case AddArrow:
00296 {
00297 if ( mRubberBandLineItem )
00298 {
00299 mRubberBandLineItem->setLine( mRubberBandStartPos.x(), mRubberBandStartPos.y(), scenePoint.x(), scenePoint.y() );
00300 }
00301 break;
00302 }
00303
00304 case AddMap:
00305 case AddShape:
00306
00307 {
00308 double x = 0;
00309 double y = 0;
00310 double width = 0;
00311 double height = 0;
00312
00313 double dx = scenePoint.x() - mRubberBandStartPos.x();
00314 double dy = scenePoint.y() - mRubberBandStartPos.y();
00315
00316 if ( dx < 0 )
00317 {
00318 x = scenePoint.x();
00319 width = -dx;
00320 }
00321 else
00322 {
00323 x = mRubberBandStartPos.x();
00324 width = dx;
00325 }
00326
00327 if ( dy < 0 )
00328 {
00329 y = scenePoint.y();
00330 height = -dy;
00331 }
00332 else
00333 {
00334 y = mRubberBandStartPos.y();
00335 height = dy;
00336 }
00337
00338 if ( mRubberBandItem )
00339 {
00340 mRubberBandItem->setRect( 0, 0, width, height );
00341 QTransform t;
00342 t.translate( x, y );
00343 mRubberBandItem->setTransform( t );
00344 }
00345 break;
00346 }
00347
00348 case MoveItemContent:
00349 {
00350
00351 QgsComposerMap* composerMap = dynamic_cast<QgsComposerMap *>( mMoveContentItem );
00352 if ( composerMap )
00353 {
00354 composerMap->setOffset( scenePoint.x() - mMoveContentStartPos.x(), scenePoint.y() - mMoveContentStartPos.y() );
00355 composerMap->update();
00356 }
00357 break;
00358 }
00359 default:
00360 break;
00361 }
00362 }
00363 }
00364
00365 void QgsComposerView::mouseDoubleClickEvent( QMouseEvent* e )
00366 {
00367 e->ignore();
00368 }
00369
00370 void QgsComposerView::keyPressEvent( QKeyEvent * e )
00371 {
00372 if ( e->key() == Qt::Key_Shift )
00373 {
00374 mShiftKeyPressed = true;
00375 }
00376
00377 if ( !composition() )
00378 {
00379 return;
00380 }
00381
00382 QList<QgsComposerItem*> composerItemList = composition()->selectedComposerItems();
00383 QList<QgsComposerItem*>::iterator itemIt = composerItemList.begin();
00384
00385
00386 if ( e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace )
00387 {
00388 for ( ; itemIt != composerItemList.end(); ++itemIt )
00389 {
00390 QgsComposerMap* map = dynamic_cast<QgsComposerMap *>( *itemIt );
00391 if ( !map || !map->isDrawing() )
00392 {
00393 composition()->removeItem( *itemIt );
00394 emit itemRemoved( *itemIt );
00395 }
00396 }
00397 }
00398
00399 else if ( e->key() == Qt::Key_Left )
00400 {
00401 for ( ; itemIt != composerItemList.end(); ++itemIt )
00402 {
00403 ( *itemIt )->move( -1.0, 0.0 );
00404 }
00405 }
00406 else if ( e->key() == Qt::Key_Right )
00407 {
00408 for ( ; itemIt != composerItemList.end(); ++itemIt )
00409 {
00410 ( *itemIt )->move( 1.0, 0.0 );
00411 }
00412 }
00413 else if ( e->key() == Qt::Key_Down )
00414 {
00415 for ( ; itemIt != composerItemList.end(); ++itemIt )
00416 {
00417 ( *itemIt )->move( 0.0, 1.0 );
00418 }
00419 }
00420 else if ( e->key() == Qt::Key_Up )
00421 {
00422 for ( ; itemIt != composerItemList.end(); ++itemIt )
00423 {
00424 ( *itemIt )->move( 0.0, -1.0 );
00425 }
00426 }
00427 }
00428
00429 void QgsComposerView::keyReleaseEvent( QKeyEvent * e )
00430 {
00431 if ( e->key() == Qt::Key_Shift )
00432 {
00433 mShiftKeyPressed = false;
00434 }
00435 }
00436
00437 void QgsComposerView::wheelEvent( QWheelEvent* event )
00438 {
00439 QPointF scenePoint = mapToScene( event->pos() );
00440
00441
00442 QgsComposerItem* theItem = composition()->composerItemAt( scenePoint );
00443 if ( theItem )
00444 {
00445 if ( theItem->isSelected() )
00446 {
00447 QPointF itemPoint = theItem->mapFromScene( scenePoint );
00448 theItem->zoomContent( event->delta(), itemPoint.x(), itemPoint.y() );
00449 }
00450 }
00451 }
00452
00453 void QgsComposerView::setComposition( QgsComposition* c )
00454 {
00455 setScene( c );
00456 }
00457
00458 QgsComposition* QgsComposerView::composition()
00459 {
00460 if ( scene() )
00461 {
00462 QgsComposition* c = dynamic_cast<QgsComposition *>( scene() );
00463 if ( c )
00464 {
00465 return c;
00466 }
00467 }
00468 return 0;
00469 }
00470
00471 void QgsComposerView::addComposerArrow( QgsComposerArrow* arrow )
00472 {
00473 composition()->addItem( arrow );
00474 emit composerArrowAdded( arrow );
00475 scene()->clearSelection();
00476 arrow->setSelected( true );
00477 emit selectedItemChanged( arrow );
00478 }
00479
00480 void QgsComposerView::addComposerLabel( QgsComposerLabel* label )
00481 {
00482 composition()->addItem( label );
00483 emit composerLabelAdded( label );
00484 scene()->clearSelection();
00485 label->setSelected( true );
00486 emit selectedItemChanged( label );
00487 }
00488
00489 void QgsComposerView::addComposerMap( QgsComposerMap* map )
00490 {
00491 scene()->addItem( map );
00492
00493 map->setPreviewMode( QgsComposerMap::Cache );
00494 map->cache();
00495 emit composerMapAdded( map );
00496 scene()->clearSelection();
00497 map->setSelected( true );
00498 emit selectedItemChanged( map );
00499 }
00500
00501 void QgsComposerView::addComposerScaleBar( QgsComposerScaleBar* scaleBar )
00502 {
00503
00504 QList<const QgsComposerMap*> mapItemList = composition()->composerMapItems();
00505 if ( mapItemList.size() > 0 )
00506 {
00507 scaleBar->setComposerMap( mapItemList.at( 0 ) );
00508 }
00509 scaleBar->applyDefaultSettings();
00510 scene()->addItem( scaleBar );
00511 emit composerScaleBarAdded( scaleBar );
00512 scene()->clearSelection();
00513 scaleBar->setSelected( true );
00514 emit selectedItemChanged( scaleBar );
00515 }
00516
00517 void QgsComposerView::addComposerLegend( QgsComposerLegend* legend )
00518 {
00519 scene()->addItem( legend );
00520 emit composerLegendAdded( legend );
00521 scene()->clearSelection();
00522 legend->setSelected( true );
00523 emit selectedItemChanged( legend );
00524 }
00525
00526 void QgsComposerView::addComposerPicture( QgsComposerPicture* picture )
00527 {
00528 scene()->addItem( picture );
00529 emit composerPictureAdded( picture );
00530 scene()->clearSelection();
00531 picture->setSelected( true );
00532 emit selectedItemChanged( picture );
00533 }
00534
00535 void QgsComposerView::addComposerShape( QgsComposerShape* shape )
00536 {
00537 scene()->addItem( shape );
00538 emit composerShapeAdded( shape );
00539 scene()->clearSelection();
00540 shape->setSelected( true );
00541 emit selectedItemChanged( shape );
00542 }
00543
00544 void QgsComposerView::addComposerTable( QgsComposerAttributeTable* table )
00545 {
00546 scene()->addItem( table );
00547 emit composerTableAdded( table );
00548 scene()->clearSelection();
00549 table->setSelected( true );
00550 emit selectedItemChanged( table );
00551 }
00552
00553 void QgsComposerView::groupItems()
00554 {
00555 if ( !composition() )
00556 {
00557 return;
00558 }
00559
00560 QList<QgsComposerItem*> selectionList = composition()->selectedComposerItems();
00561 if ( selectionList.size() < 2 )
00562 {
00563 return;
00564 }
00565
00566 QgsComposerItemGroup* itemGroup = new QgsComposerItemGroup( composition() );
00567
00568 connect( itemGroup, SIGNAL( childItemDeleted( QgsComposerItem* ) ), this, SLOT( sendItemRemovedSignal( QgsComposerItem* ) ) );
00569
00570 QList<QgsComposerItem*>::iterator itemIter = selectionList.begin();
00571 for ( ; itemIter != selectionList.end(); ++itemIter )
00572 {
00573 itemGroup->addItem( *itemIter );
00574 }
00575 composition()->addItem( itemGroup );
00576 itemGroup->setSelected( true );
00577 emit selectedItemChanged( itemGroup );
00578 }
00579
00580 void QgsComposerView::ungroupItems()
00581 {
00582 if ( !composition() )
00583 {
00584 return;
00585 }
00586
00587 QList<QgsComposerItem*> selectionList = composition()->selectedComposerItems();
00588 QList<QgsComposerItem*>::iterator itemIter = selectionList.begin();
00589 for ( ; itemIter != selectionList.end(); ++itemIter )
00590 {
00591 QgsComposerItemGroup* itemGroup = dynamic_cast<QgsComposerItemGroup *>( *itemIter );
00592 if ( itemGroup )
00593 {
00594 itemGroup->removeItems();
00595 composition()->removeItem( *itemIter );
00596 delete( *itemIter );
00597 emit itemRemoved( *itemIter );
00598 }
00599 }
00600
00601 }
00602
00603 void QgsComposerView::sendItemRemovedSignal( QgsComposerItem* item )
00604 {
00605 emit itemRemoved( item );
00606 }
00607
00608 QMainWindow* QgsComposerView::composerWindow()
00609 {
00610 QMainWindow* composerObject = 0;
00611 QObject* currentObject = parent();
00612 if ( !currentObject )
00613 {
00614 return qobject_cast<QMainWindow *>( currentObject );
00615 }
00616
00617 while ( true )
00618 {
00619 composerObject = qobject_cast<QMainWindow*>( currentObject );
00620 if ( composerObject || currentObject->parent() == 0 )
00621 {
00622 return composerObject;
00623 }
00624 currentObject = currentObject->parent();
00625 }
00626
00627 return 0;
00628 }
00629