|
QGIS API Documentation
master-59fd5e0
|
00001 /*************************************************************************** 00002 qgscomposerview.cpp 00003 ------------------- 00004 begin : January 2005 00005 copyright : (C) 2005 by Radim Blazek 00006 email : blazek@itc.it 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * * 00011 * This program is free software; you can redistribute it and/or modify * 00012 * it under the terms of the GNU General Public License as published by * 00013 * the Free Software Foundation; either version 2 of the License, or * 00014 * (at your option) any later version. * 00015 * * 00016 ***************************************************************************/ 00017 00018 #include <QApplication> 00019 #include <QMainWindow> 00020 #include <QMouseEvent> 00021 #include <QKeyEvent> 00022 #include <QClipboard> 00023 #include <QMimeData> 00024 #include <QGridLayout> 00025 00026 #include "qgscomposerview.h" 00027 #include "qgscomposerarrow.h" 00028 #include "qgscomposerframe.h" 00029 #include "qgscomposerhtml.h" 00030 #include "qgscomposerlabel.h" 00031 #include "qgscomposerlegend.h" 00032 #include "qgscomposermap.h" 00033 #include "qgscomposeritemgroup.h" 00034 #include "qgscomposerpicture.h" 00035 #include "qgscomposerruler.h" 00036 #include "qgscomposerscalebar.h" 00037 #include "qgscomposershape.h" 00038 #include "qgscomposerattributetable.h" 00039 #include "qgslogger.h" 00040 #include "qgsaddremovemultiframecommand.h" 00041 00042 QgsComposerView::QgsComposerView( QWidget* parent, const char* name, Qt::WFlags f ) 00043 : QGraphicsView( parent ) 00044 , mRubberBandItem( 0 ) 00045 , mRubberBandLineItem( 0 ) 00046 , mMoveContentItem( 0 ) 00047 , mPaintingEnabled( true ) 00048 , mHorizontalRuler( 0 ) 00049 , mVerticalRuler( 0 ) 00050 { 00051 Q_UNUSED( f ); 00052 Q_UNUSED( name ); 00053 00054 setResizeAnchor( QGraphicsView::AnchorViewCenter ); 00055 setMouseTracking( true ); 00056 viewport()->setMouseTracking( true ); 00057 setFrameShape( QFrame::NoFrame ); 00058 } 00059 00060 void QgsComposerView::mousePressEvent( QMouseEvent* e ) 00061 { 00062 if ( !composition() ) 00063 { 00064 return; 00065 } 00066 00067 QPointF scenePoint = mapToScene( e->pos() ); 00068 QPointF snappedScenePoint = composition()->snapPointToGrid( scenePoint ); 00069 00070 //lock/unlock position of item with right click 00071 if ( e->button() == Qt::RightButton ) 00072 { 00073 QgsComposerItem* selectedItem = composition()->composerItemAt( scenePoint ); 00074 if ( selectedItem ) 00075 { 00076 bool lock = selectedItem->positionLock() ? false : true; 00077 selectedItem->setPositionLock( lock ); 00078 selectedItem->update(); 00079 //make sure the new cursor is correct 00080 QPointF itemPoint = selectedItem->mapFromScene( scenePoint ); 00081 selectedItem->updateCursor( itemPoint ); 00082 } 00083 return; 00084 } 00085 00086 switch ( mCurrentTool ) 00087 { 00088 //select/deselect items and pass mouse event further 00089 case Select: 00090 { 00091 if ( !( e->modifiers() & Qt::ShiftModifier ) ) //keep selection if shift key pressed 00092 { 00093 composition()->clearSelection(); 00094 } 00095 00096 //select topmost item at position of event 00097 QgsComposerItem* selectedItem = composition()->composerItemAt( scenePoint ); 00098 if ( !selectedItem ) 00099 { 00100 break; 00101 } 00102 00103 selectedItem->setSelected( true ); 00104 QGraphicsView::mousePressEvent( e ); 00105 emit selectedItemChanged( selectedItem ); 00106 break; 00107 } 00108 00109 case MoveItemContent: 00110 { 00111 //store item as member if it is selected and cursor is over item 00112 QgsComposerItem* item = dynamic_cast<QgsComposerItem *>( itemAt( e->pos() ) ); 00113 if ( item ) 00114 { 00115 mMoveContentStartPos = scenePoint; 00116 } 00117 mMoveContentItem = item; 00118 break; 00119 } 00120 00121 case AddArrow: 00122 { 00123 mRubberBandStartPos = QPointF( snappedScenePoint.x(), snappedScenePoint.y() ); 00124 mRubberBandLineItem = new QGraphicsLineItem( snappedScenePoint.x(), snappedScenePoint.y(), snappedScenePoint.x(), snappedScenePoint.y() ); 00125 mRubberBandLineItem->setZValue( 100 ); 00126 scene()->addItem( mRubberBandLineItem ); 00127 scene()->update(); 00128 break; 00129 } 00130 00131 //create rubber band for map and ellipse items 00132 case AddMap: 00133 case AddRectangle: 00134 case AddTriangle: 00135 case AddEllipse: 00136 case AddHtml: 00137 { 00138 QTransform t; 00139 mRubberBandItem = new QGraphicsRectItem( 0, 0, 0, 0 ); 00140 mRubberBandStartPos = QPointF( snappedScenePoint.x(), snappedScenePoint.y() ); 00141 t.translate( snappedScenePoint.x(), snappedScenePoint.y() ); 00142 mRubberBandItem->setTransform( t ); 00143 mRubberBandItem->setZValue( 100 ); 00144 scene()->addItem( mRubberBandItem ); 00145 scene()->update(); 00146 } 00147 break; 00148 00149 case AddLabel: 00150 if ( composition() ) 00151 { 00152 QgsComposerLabel* newLabelItem = new QgsComposerLabel( composition() ); 00153 newLabelItem->setText( tr( "QGIS" ) ); 00154 newLabelItem->adjustSizeToText(); 00155 newLabelItem->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), newLabelItem->rect().width(), newLabelItem->rect().height() ) ); 00156 composition()->addComposerLabel( newLabelItem ); 00157 emit actionFinished(); 00158 composition()->pushAddRemoveCommand( newLabelItem, tr( "Label added" ) ); 00159 } 00160 break; 00161 00162 case AddScalebar: 00163 if ( composition() ) 00164 { 00165 QgsComposerScaleBar* newScaleBar = new QgsComposerScaleBar( composition() ); 00166 newScaleBar->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), 20, 20 ) ); 00167 composition()->addComposerScaleBar( newScaleBar ); 00168 QList<const QgsComposerMap*> mapItemList = composition()->composerMapItems(); 00169 if ( mapItemList.size() > 0 ) 00170 { 00171 newScaleBar->setComposerMap( mapItemList.at( 0 ) ); 00172 } 00173 newScaleBar->applyDefaultSize(); //4 segments, 1/5 of composer map width 00174 emit actionFinished(); 00175 composition()->pushAddRemoveCommand( newScaleBar, tr( "Scale bar added" ) ); 00176 } 00177 break; 00178 00179 case AddLegend: 00180 { 00181 if ( composition() ) 00182 { 00183 QgsComposerLegend* newLegend = new QgsComposerLegend( composition() ); 00184 newLegend->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), newLegend->rect().width(), newLegend->rect().height() ) ); 00185 composition()->addComposerLegend( newLegend ); 00186 newLegend->updateLegend(); 00187 emit actionFinished(); 00188 composition()->pushAddRemoveCommand( newLegend, tr( "Legend added" ) ); 00189 } 00190 break; 00191 } 00192 case AddPicture: 00193 if ( composition() ) 00194 { 00195 QgsComposerPicture* newPicture = new QgsComposerPicture( composition() ); 00196 newPicture->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), 30, 30 ) ); 00197 composition()->addComposerPicture( newPicture ); 00198 emit actionFinished(); 00199 composition()->pushAddRemoveCommand( newPicture, tr( "Picture added" ) ); 00200 } 00201 break; 00202 case AddTable: 00203 if ( composition() ) 00204 { 00205 QgsComposerAttributeTable* newTable = new QgsComposerAttributeTable( composition() ); 00206 newTable->setSceneRect( QRectF( snappedScenePoint.x(), snappedScenePoint.y(), 50, 50 ) ); 00207 composition()->addComposerTable( newTable ); 00208 emit actionFinished(); 00209 composition()->pushAddRemoveCommand( newTable, tr( "Table added" ) ); 00210 } 00211 break; 00212 default: 00213 break; 00214 } 00215 } 00216 00217 void QgsComposerView::addShape( Tool currentTool ) 00218 { 00219 QgsComposerShape::Shape shape = QgsComposerShape::Ellipse; 00220 00221 if ( currentTool == AddRectangle ) 00222 shape = QgsComposerShape::Rectangle; 00223 else if ( currentTool == AddTriangle ) 00224 shape = QgsComposerShape::Triangle; 00225 00226 if ( !mRubberBandItem || mRubberBandItem->rect().width() < 0.1 || mRubberBandItem->rect().width() < 0.1 ) 00227 { 00228 scene()->removeItem( mRubberBandItem ); 00229 delete mRubberBandItem; 00230 mRubberBandItem = 0; 00231 return; 00232 } 00233 if ( composition() ) 00234 { 00235 QgsComposerShape* composerShape = new QgsComposerShape( mRubberBandItem->transform().dx(), mRubberBandItem->transform().dy(), mRubberBandItem->rect().width(), mRubberBandItem->rect().height(), composition() ); 00236 composerShape->setShapeType( shape ); 00237 composition()->addComposerShape( composerShape ); 00238 scene()->removeItem( mRubberBandItem ); 00239 delete mRubberBandItem; 00240 mRubberBandItem = 0; 00241 emit actionFinished(); 00242 composition()->pushAddRemoveCommand( composerShape, tr( "Shape added" ) ); 00243 } 00244 } 00245 00246 void QgsComposerView::updateRulers() 00247 { 00248 if ( mHorizontalRuler ) 00249 { 00250 mHorizontalRuler->setSceneTransform( viewportTransform() ); 00251 } 00252 if ( mVerticalRuler ) 00253 { 00254 mVerticalRuler->setSceneTransform( viewportTransform() ); 00255 } 00256 } 00257 00258 void QgsComposerView::mouseReleaseEvent( QMouseEvent* e ) 00259 { 00260 if ( !composition() ) 00261 { 00262 return; 00263 } 00264 00265 QPointF scenePoint = mapToScene( e->pos() ); 00266 00267 switch ( mCurrentTool ) 00268 { 00269 case Select: 00270 { 00271 QGraphicsView::mouseReleaseEvent( e ); 00272 break; 00273 } 00274 00275 case MoveItemContent: 00276 { 00277 if ( mMoveContentItem ) 00278 { 00279 //update map preview if composer map 00280 QgsComposerMap* composerMap = dynamic_cast<QgsComposerMap *>( mMoveContentItem ); 00281 if ( composerMap ) 00282 { 00283 composerMap->setOffset( 0, 0 ); 00284 } 00285 00286 double moveX = scenePoint.x() - mMoveContentStartPos.x(); 00287 double moveY = scenePoint.y() - mMoveContentStartPos.y(); 00288 00289 composition()->beginCommand( mMoveContentItem, tr( "Move item content" ) ); 00290 mMoveContentItem->moveContent( -moveX, -moveY ); 00291 composition()->endCommand(); 00292 mMoveContentItem = 0; 00293 } 00294 break; 00295 } 00296 case AddArrow: 00297 if ( composition() ) 00298 { 00299 QPointF scenePoint = mapToScene( e->pos() ); 00300 QPointF snappedScenePoint = composition()->snapPointToGrid( scenePoint ); 00301 QgsComposerArrow* composerArrow = new QgsComposerArrow( mRubberBandStartPos, QPointF( snappedScenePoint.x(), snappedScenePoint.y() ), composition() ); 00302 composition()->addComposerArrow( composerArrow ); 00303 scene()->removeItem( mRubberBandLineItem ); 00304 delete mRubberBandLineItem; 00305 mRubberBandLineItem = 0; 00306 emit actionFinished(); 00307 composition()->pushAddRemoveCommand( composerArrow, tr( "Arrow added" ) ); 00308 } 00309 break; 00310 00311 case AddRectangle: 00312 case AddTriangle: 00313 case AddEllipse: 00314 addShape( mCurrentTool ); 00315 break; 00316 00317 case AddMap: 00318 if ( !mRubberBandItem || mRubberBandItem->rect().width() < 0.1 || mRubberBandItem->rect().width() < 0.1 ) 00319 { 00320 if ( mRubberBandItem ) 00321 { 00322 scene()->removeItem( mRubberBandItem ); 00323 delete mRubberBandItem; 00324 mRubberBandItem = 0; 00325 } 00326 return; 00327 } 00328 if ( composition() ) 00329 { 00330 QgsComposerMap* composerMap = new QgsComposerMap( composition(), mRubberBandItem->transform().dx(), mRubberBandItem->transform().dy(), mRubberBandItem->rect().width(), mRubberBandItem->rect().height() ); 00331 composition()->addComposerMap( composerMap ); 00332 scene()->removeItem( mRubberBandItem ); 00333 delete mRubberBandItem; 00334 mRubberBandItem = 0; 00335 emit actionFinished(); 00336 composition()->pushAddRemoveCommand( composerMap, tr( "Map added" ) ); 00337 } 00338 break; 00339 00340 case AddHtml: 00341 if ( composition() ) 00342 { 00343 QgsComposerHtml* composerHtml = new QgsComposerHtml( composition(), true ); 00344 QgsAddRemoveMultiFrameCommand* command = new QgsAddRemoveMultiFrameCommand( QgsAddRemoveMultiFrameCommand::Added, 00345 composerHtml, composition(), tr( "Html item added" ) ); 00346 composition()->undoStack()->push( command ); 00347 QgsComposerFrame* frame = new QgsComposerFrame( composition(), composerHtml, mRubberBandItem->transform().dx(), 00348 mRubberBandItem->transform().dy(), mRubberBandItem->rect().width(), 00349 mRubberBandItem->rect().height() ); 00350 composition()->beginMultiFrameCommand( composerHtml, tr( "Html frame added" ) ); 00351 composerHtml->addFrame( frame ); 00352 composition()->endMultiFrameCommand(); 00353 scene()->removeItem( mRubberBandItem ); 00354 delete mRubberBandItem; 00355 mRubberBandItem = 0; 00356 emit actionFinished(); 00357 } 00358 default: 00359 break; 00360 } 00361 } 00362 00363 void QgsComposerView::mouseMoveEvent( QMouseEvent* e ) 00364 { 00365 if ( !composition() ) 00366 { 00367 return; 00368 } 00369 00370 updateRulers(); 00371 if ( mHorizontalRuler ) 00372 { 00373 mHorizontalRuler->updateMarker( e->posF() ); 00374 } 00375 if ( mVerticalRuler ) 00376 { 00377 mVerticalRuler->updateMarker( e->posF() ); 00378 } 00379 00380 if ( e->buttons() == Qt::NoButton ) 00381 { 00382 if ( mCurrentTool == Select ) 00383 { 00384 QGraphicsView::mouseMoveEvent( e ); 00385 } 00386 } 00387 else 00388 { 00389 QPointF scenePoint = mapToScene( e->pos() ); 00390 00391 switch ( mCurrentTool ) 00392 { 00393 case Select: 00394 QGraphicsView::mouseMoveEvent( e ); 00395 break; 00396 00397 case AddArrow: 00398 { 00399 if ( mRubberBandLineItem ) 00400 { 00401 mRubberBandLineItem->setLine( mRubberBandStartPos.x(), mRubberBandStartPos.y(), scenePoint.x(), scenePoint.y() ); 00402 } 00403 break; 00404 } 00405 00406 case AddMap: 00407 case AddRectangle: 00408 case AddTriangle: 00409 case AddEllipse: 00410 case AddHtml: 00411 //adjust rubber band item 00412 { 00413 double x = 0; 00414 double y = 0; 00415 double width = 0; 00416 double height = 0; 00417 00418 double dx = scenePoint.x() - mRubberBandStartPos.x(); 00419 double dy = scenePoint.y() - mRubberBandStartPos.y(); 00420 00421 if ( dx < 0 ) 00422 { 00423 x = scenePoint.x(); 00424 width = -dx; 00425 } 00426 else 00427 { 00428 x = mRubberBandStartPos.x(); 00429 width = dx; 00430 } 00431 00432 if ( dy < 0 ) 00433 { 00434 y = scenePoint.y(); 00435 height = -dy; 00436 } 00437 else 00438 { 00439 y = mRubberBandStartPos.y(); 00440 height = dy; 00441 } 00442 00443 if ( mRubberBandItem ) 00444 { 00445 mRubberBandItem->setRect( 0, 0, width, height ); 00446 QTransform t; 00447 t.translate( x, y ); 00448 mRubberBandItem->setTransform( t ); 00449 } 00450 break; 00451 } 00452 00453 case MoveItemContent: 00454 { 00455 //update map preview if composer map 00456 QgsComposerMap* composerMap = dynamic_cast<QgsComposerMap *>( mMoveContentItem ); 00457 if ( composerMap ) 00458 { 00459 composerMap->setOffset( scenePoint.x() - mMoveContentStartPos.x(), scenePoint.y() - mMoveContentStartPos.y() ); 00460 composerMap->update(); 00461 } 00462 break; 00463 } 00464 default: 00465 break; 00466 } 00467 } 00468 } 00469 00470 void QgsComposerView::mouseDoubleClickEvent( QMouseEvent* e ) 00471 { 00472 e->ignore(); 00473 } 00474 00475 void QgsComposerView::keyPressEvent( QKeyEvent * e ) 00476 { 00477 //TODO : those should be actions (so we could also display menu items and/or toolbar items) 00478 00479 if ( !composition() ) 00480 { 00481 return; 00482 } 00483 00484 QList<QgsComposerItem*> composerItemList = composition()->selectedComposerItems(); 00485 QList<QgsComposerItem*>::iterator itemIt = composerItemList.begin(); 00486 00487 if ( e->matches( QKeySequence::Copy ) || e->matches( QKeySequence::Cut ) ) 00488 { 00489 QDomDocument doc; 00490 QDomElement documentElement = doc.createElement( "ComposerItemClipboard" ); 00491 for ( ; itemIt != composerItemList.end(); ++itemIt ) 00492 { 00493 // copy each item in a group 00494 QgsComposerItemGroup* itemGroup = dynamic_cast<QgsComposerItemGroup*>( *itemIt ); 00495 if ( itemGroup && composition() ) 00496 { 00497 QSet<QgsComposerItem*> groupedItems = itemGroup->items(); 00498 QSet<QgsComposerItem*>::iterator it = groupedItems.begin(); 00499 for ( ; it != groupedItems.end(); ++it ) 00500 { 00501 ( *it )->writeXML( documentElement, doc ); 00502 } 00503 } 00504 ( *itemIt )->writeXML( documentElement, doc ); 00505 if ( e->matches( QKeySequence::Cut ) ) 00506 { 00507 composition()->removeComposerItem( *itemIt ); 00508 } 00509 } 00510 doc.appendChild( documentElement ); 00511 00512 //if it's a copy, we have to remove the UUIDs since we don't want any duplicate UUID 00513 if ( e->matches( QKeySequence::Copy ) ) 00514 { 00515 // remove all uuid attributes 00516 QDomNodeList composerItemsNodes = doc.elementsByTagName( "ComposerItem" ); 00517 for ( int i = 0; i < composerItemsNodes.count(); ++i ) 00518 { 00519 QDomNode composerItemNode = composerItemsNodes.at( i ); 00520 if ( composerItemNode.isElement() ) 00521 { 00522 composerItemNode.toElement().removeAttribute( "uuid" ); 00523 } 00524 } 00525 } 00526 00527 QMimeData *mimeData = new QMimeData; 00528 mimeData->setData( "text/xml", doc.toByteArray() ); 00529 QClipboard *clipboard = QApplication::clipboard(); 00530 clipboard->setMimeData( mimeData ); 00531 } 00532 00533 //TODO : "Ctrl+Shift+V" is one way to paste, but on some platefoms you can use Shift+Ins and F18 00534 if ( e->matches( QKeySequence::Paste ) || ( e->key() == Qt::Key_V && e->modifiers() & Qt::ControlModifier && e->modifiers() & Qt::ShiftModifier ) ) 00535 { 00536 QDomDocument doc; 00537 QClipboard *clipboard = QApplication::clipboard(); 00538 if ( doc.setContent( clipboard->mimeData()->data( "text/xml" ) ) ) 00539 { 00540 QDomElement docElem = doc.documentElement(); 00541 if ( docElem.tagName() == "ComposerItemClipboard" ) 00542 { 00543 if ( composition() ) 00544 { 00545 QPointF pt = mapToScene( mapFromGlobal( QCursor::pos() ) ); 00546 bool pasteInPlace = ( e->modifiers() & Qt::ShiftModifier ); 00547 composition()->addItemsFromXML( docElem, doc, 0, true, &pt, pasteInPlace ); 00548 } 00549 } 00550 } 00551 } 00552 00553 //delete selected items 00554 if ( e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace ) 00555 { 00556 for ( ; itemIt != composerItemList.end(); ++itemIt ) 00557 { 00558 if ( composition() ) 00559 { 00560 composition()->removeComposerItem( *itemIt ); 00561 } 00562 } 00563 } 00564 00565 else if ( e->key() == Qt::Key_Left ) 00566 { 00567 for ( ; itemIt != composerItemList.end(); ++itemIt ) 00568 { 00569 ( *itemIt )->beginCommand( tr( "Item moved" ), QgsComposerMergeCommand::ItemMove ); 00570 ( *itemIt )->move( -1.0, 0.0 ); 00571 ( *itemIt )->endCommand(); 00572 } 00573 } 00574 else if ( e->key() == Qt::Key_Right ) 00575 { 00576 for ( ; itemIt != composerItemList.end(); ++itemIt ) 00577 { 00578 ( *itemIt )->beginCommand( tr( "Item moved" ), QgsComposerMergeCommand::ItemMove ); 00579 ( *itemIt )->move( 1.0, 0.0 ); 00580 ( *itemIt )->endCommand(); 00581 } 00582 } 00583 else if ( e->key() == Qt::Key_Down ) 00584 { 00585 for ( ; itemIt != composerItemList.end(); ++itemIt ) 00586 { 00587 ( *itemIt )->beginCommand( tr( "Item moved" ), QgsComposerMergeCommand::ItemMove ); 00588 ( *itemIt )->move( 0.0, 1.0 ); 00589 ( *itemIt )->endCommand(); 00590 } 00591 } 00592 else if ( e->key() == Qt::Key_Up ) 00593 { 00594 for ( ; itemIt != composerItemList.end(); ++itemIt ) 00595 { 00596 ( *itemIt )->beginCommand( tr( "Item moved" ), QgsComposerMergeCommand::ItemMove ); 00597 ( *itemIt )->move( 0.0, -1.0 ); 00598 ( *itemIt )->endCommand(); 00599 } 00600 } 00601 } 00602 00603 void QgsComposerView::wheelEvent( QWheelEvent* event ) 00604 { 00605 QPointF scenePoint = mapToScene( event->pos() ); 00606 00607 //select topmost item at position of event 00608 QgsComposerItem* theItem = composition()->composerItemAt( scenePoint ); 00609 if ( theItem ) 00610 { 00611 if ( theItem->isSelected() ) 00612 { 00613 QPointF itemPoint = theItem->mapFromScene( scenePoint ); 00614 theItem->beginCommand( tr( "Zoom item content" ) ); 00615 theItem->zoomContent( event->delta(), itemPoint.x(), itemPoint.y() ); 00616 theItem->endCommand(); 00617 } 00618 } 00619 } 00620 00621 void QgsComposerView::paintEvent( QPaintEvent* event ) 00622 { 00623 if ( mPaintingEnabled ) 00624 { 00625 QGraphicsView::paintEvent( event ); 00626 event->accept(); 00627 } 00628 else 00629 { 00630 event->ignore(); 00631 } 00632 } 00633 00634 void QgsComposerView::hideEvent( QHideEvent* e ) 00635 { 00636 emit( composerViewHide( this ) ); 00637 e->ignore(); 00638 } 00639 00640 void QgsComposerView::showEvent( QShowEvent* e ) 00641 { 00642 emit( composerViewShow( this ) ); 00643 e->ignore(); 00644 } 00645 00646 void QgsComposerView::resizeEvent( QResizeEvent* event ) 00647 { 00648 QGraphicsView::resizeEvent( event ); 00649 updateRulers(); 00650 } 00651 00652 void QgsComposerView::scrollContentsBy( int dx, int dy ) 00653 { 00654 QGraphicsView::scrollContentsBy( dx, dy ); 00655 updateRulers(); 00656 } 00657 00658 void QgsComposerView::setComposition( QgsComposition* c ) 00659 { 00660 setScene( c ); 00661 if ( mHorizontalRuler ) 00662 { 00663 mHorizontalRuler->setComposition( c ); 00664 } 00665 if ( mVerticalRuler ) 00666 { 00667 mVerticalRuler->setComposition( c ); 00668 } 00669 } 00670 00671 QgsComposition* QgsComposerView::composition() 00672 { 00673 if ( scene() ) 00674 { 00675 QgsComposition* c = dynamic_cast<QgsComposition *>( scene() ); 00676 if ( c ) 00677 { 00678 return c; 00679 } 00680 } 00681 return 0; 00682 } 00683 00684 void QgsComposerView::groupItems() 00685 { 00686 if ( !composition() ) 00687 { 00688 return; 00689 } 00690 00691 QList<QgsComposerItem*> selectionList = composition()->selectedComposerItems(); 00692 if ( selectionList.size() < 2 ) 00693 { 00694 return; //not enough items for a group 00695 } 00696 QgsComposerItemGroup* itemGroup = new QgsComposerItemGroup( composition() ); 00697 00698 QList<QgsComposerItem*>::iterator itemIter = selectionList.begin(); 00699 for ( ; itemIter != selectionList.end(); ++itemIter ) 00700 { 00701 itemGroup->addItem( *itemIter ); 00702 } 00703 00704 composition()->addItem( itemGroup ); 00705 itemGroup->setSelected( true ); 00706 emit selectedItemChanged( itemGroup ); 00707 } 00708 00709 void QgsComposerView::ungroupItems() 00710 { 00711 if ( !composition() ) 00712 { 00713 return; 00714 } 00715 00716 QList<QgsComposerItem*> selectionList = composition()->selectedComposerItems(); 00717 QList<QgsComposerItem*>::iterator itemIter = selectionList.begin(); 00718 for ( ; itemIter != selectionList.end(); ++itemIter ) 00719 { 00720 QgsComposerItemGroup* itemGroup = dynamic_cast<QgsComposerItemGroup *>( *itemIter ); 00721 if ( itemGroup ) 00722 { 00723 itemGroup->removeItems(); 00724 composition()->removeItem( *itemIter ); 00725 delete( *itemIter ); 00726 emit itemRemoved( *itemIter ); 00727 } 00728 } 00729 } 00730 00731 QMainWindow* QgsComposerView::composerWindow() 00732 { 00733 QMainWindow* composerObject = 0; 00734 QObject* currentObject = parent(); 00735 if ( !currentObject ) 00736 { 00737 return qobject_cast<QMainWindow *>( currentObject ); 00738 } 00739 00740 while ( true ) 00741 { 00742 composerObject = qobject_cast<QMainWindow*>( currentObject ); 00743 if ( composerObject || currentObject->parent() == 0 ) 00744 { 00745 return composerObject; 00746 } 00747 currentObject = currentObject->parent(); 00748 } 00749 00750 return 0; 00751 }