[QGIS Commit] r9153 - in trunk/qgis: images/themes/default src/app/composer src/core/composer src/gui

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sun Aug 24 11:56:41 EDT 2008


Author: mhugent
Date: 2008-08-24 11:56:41 -0400 (Sun, 24 Aug 2008)
New Revision: 9153

Added:
   trunk/qgis/images/themes/default/mActionLowerItems.png
   trunk/qgis/images/themes/default/mActionMoveItemsToBottom.png
   trunk/qgis/images/themes/default/mActionMoveItemsToTop.png
   trunk/qgis/images/themes/default/mActionRaiseItems.png
Modified:
   trunk/qgis/src/app/composer/qgscomposer.cpp
   trunk/qgis/src/app/composer/qgscomposer.h
   trunk/qgis/src/core/composer/qgscomposeritem.cpp
   trunk/qgis/src/core/composer/qgscomposermap.cpp
   trunk/qgis/src/core/composer/qgscomposition.cpp
   trunk/qgis/src/core/composer/qgscomposition.h
   trunk/qgis/src/gui/qgscomposerview.cpp
Log:
Added functions to move composer items front/back

Added: trunk/qgis/images/themes/default/mActionLowerItems.png
===================================================================
(Binary files differ)


Property changes on: trunk/qgis/images/themes/default/mActionLowerItems.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/qgis/images/themes/default/mActionMoveItemsToBottom.png
===================================================================
(Binary files differ)


Property changes on: trunk/qgis/images/themes/default/mActionMoveItemsToBottom.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/qgis/images/themes/default/mActionMoveItemsToTop.png
===================================================================
(Binary files differ)


Property changes on: trunk/qgis/images/themes/default/mActionMoveItemsToTop.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/qgis/images/themes/default/mActionRaiseItems.png
===================================================================
(Binary files differ)


Property changes on: trunk/qgis/images/themes/default/mActionRaiseItems.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: trunk/qgis/src/app/composer/qgscomposer.cpp
===================================================================
--- trunk/qgis/src/app/composer/qgscomposer.cpp	2008-08-24 15:10:54 UTC (rev 9152)
+++ trunk/qgis/src/app/composer/qgscomposer.cpp	2008-08-24 15:56:41 UTC (rev 9153)
@@ -76,6 +76,10 @@
 
   toolBar->addAction( QIcon( QPixmap( myIconPath + "mActionGroupItems.png" ) ), tr( "&Group Items" ), this, SLOT( groupItems() ) );
   toolBar->addAction( QIcon( QPixmap( myIconPath + "mActionUngroupItems.png" ) ), tr( "&Ungroup Items" ), this, SLOT( ungroupItems() ) );
+  toolBar->addAction( QIcon( QPixmap( myIconPath + "mActionRaiseItems.png")), tr("Raise selected items"), this, SLOT(raiseSelectedItems()));
+  toolBar->addAction( QIcon( QPixmap( myIconPath + "mActionLowerItems.png")), tr("Lower selected items"), this, SLOT(lowerSelectedItems()));
+  toolBar->addAction( QIcon( QPixmap( myIconPath + "mActionMoveItemsToTop.png")), tr("Move selected items to top"), this, SLOT(moveSelectedItemsToTop()));
+  toolBar->addAction( QIcon( QPixmap( myIconPath + "mActionMoveItemsToBottom.png")), tr("Move selected items to bottom"), this, SLOT(moveSelectedItemsToBottom()));
 
   QActionGroup* toggleActionGroup = new QActionGroup( this );
   toggleActionGroup->addAction( moveItemContentAction );
@@ -1028,6 +1032,38 @@
   }
 }
 
+void QgsComposer::raiseSelectedItems()
+{
+  if(mComposition)
+    {
+      mComposition->raiseSelectedItems();
+    }
+}
+
+void QgsComposer::lowerSelectedItems()
+{
+  if(mComposition)
+    {
+      mComposition->lowerSelectedItems();
+    }
+}
+
+void QgsComposer::moveSelectedItemsToTop()
+{
+  if(mComposition)
+    {
+      mComposition->moveSelectedItemsToTop();
+    }
+}
+
+void QgsComposer::moveSelectedItemsToBottom()
+{
+  if(mComposition)
+    {
+      mComposition->moveSelectedItemsToBottom();
+    }
+}
+
 void QgsComposer::moveEvent( QMoveEvent *e ) { saveWindowState(); }
 
 void QgsComposer::resizeEvent( QResizeEvent *e )
@@ -1305,6 +1341,7 @@
     mComposition->update();
   }
 
+  mComposition->sortZList();
   mView->setComposition( mComposition );
 }
 

Modified: trunk/qgis/src/app/composer/qgscomposer.h
===================================================================
--- trunk/qgis/src/app/composer/qgscomposer.h	2008-08-24 15:10:54 UTC (rev 9152)
+++ trunk/qgis/src/app/composer/qgscomposer.h	2008-08-24 15:56:41 UTC (rev 9153)
@@ -147,6 +147,18 @@
     //! Ungroup selected item group
     void ungroupItems( void );
 
+    //! Move selected items one position up
+    void raiseSelectedItems();
+
+    //!Move selected items one position down
+    void lowerSelectedItems();
+
+    //!Move selected items to top
+    void moveSelectedItemsToTop();
+
+    //!Move selected items to bottom
+    void moveSelectedItemsToBottom();
+
     //! read project
     void projectRead();
 

Modified: trunk/qgis/src/core/composer/qgscomposeritem.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgscomposeritem.cpp	2008-08-24 15:10:54 UTC (rev 9152)
+++ trunk/qgis/src/core/composer/qgscomposeritem.cpp	2008-08-24 15:56:41 UTC (rev 9153)
@@ -37,6 +37,12 @@
   QPen defaultPen( QColor( 0, 0, 0 ) );
   defaultPen.setWidth( 1 );
   setPen( defaultPen );
+
+  //let z-Value be managed by composition
+  if(mComposition)
+    {
+      mComposition->addItemToZList(this);
+    }
 }
 
 QgsComposerItem::QgsComposerItem( qreal x, qreal y, qreal width, qreal height, QgsComposition* composition ): QGraphicsRectItem( 0, 0, width, height, 0 ), mComposition( composition ), mBoundingResizeRectangle( 0 ), mFrame( true )
@@ -53,10 +59,20 @@
   QPen defaultPen( QColor( 0, 0, 0 ) );
   defaultPen.setWidth( 1 );
   setPen( defaultPen );
+
+ //let z-Value be managed by composition
+  if(mComposition)
+    {
+      mComposition->addItemToZList(this);
+    }
 }
 
 QgsComposerItem::~QgsComposerItem()
 {
+  if(mComposition)
+    {
+      mComposition->removeItemFromZList(this);
+    }
 }
 
 void QgsComposerItem::setSelected( bool s )

Modified: trunk/qgis/src/core/composer/qgscomposermap.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgscomposermap.cpp	2008-08-24 15:10:54 UTC (rev 9152)
+++ trunk/qgis/src/core/composer/qgscomposermap.cpp	2008-08-24 15:56:41 UTC (rev 9153)
@@ -63,12 +63,7 @@
     mExtent = mMapRenderer->extent();
   }
   setSceneRect( QRectF( x, y, width, height ) );
-
-  QGraphicsRectItem::setZValue( 20 );
-
   setToolTip( tr( "Map" ) + " " + QString::number( mId ) );
-
-  QGraphicsRectItem::show();
 }
 
 QgsComposerMap::QgsComposerMap( QgsComposition *composition )

Modified: trunk/qgis/src/core/composer/qgscomposition.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgscomposition.cpp	2008-08-24 15:10:54 UTC (rev 9152)
+++ trunk/qgis/src/core/composer/qgscomposition.cpp	2008-08-24 15:56:41 UTC (rev 9153)
@@ -189,3 +189,215 @@
 
   return true;
 }
+
+void QgsComposition::addItemToZList(QgsComposerItem* item)
+{
+  if(!item)
+    {
+      return;
+    }
+  mItemZList.push_back(item);
+  qWarning(QString::number(mItemZList.size()).toLocal8Bit().data());
+  item->setZValue(mItemZList.size());
+}
+
+void QgsComposition::removeItemFromZList(QgsComposerItem* item)
+{
+  if(!item)
+    {
+      return;
+    }
+  mItemZList.removeAll(item);
+}
+
+void QgsComposition::raiseSelectedItems()
+{
+  QList<QgsComposerItem*> selectedItems = selectedComposerItems();
+  QList<QgsComposerItem*>::iterator it = selectedItems.begin();
+  for(; it != selectedItems.end(); ++it)
+    {
+      raiseItem(*it);
+    }
+
+  //update all positions
+  updateZValues();
+  update();
+}
+
+void QgsComposition::raiseItem(QgsComposerItem* item)
+{
+  //search item
+  QMutableLinkedListIterator<QgsComposerItem*> it(mItemZList);
+  if(it.findNext(item))
+    {
+      if(it.hasNext())
+	{
+	  it.remove();
+	  it.next();
+	  it.insert(item);
+	}
+    }
+}
+
+void QgsComposition::lowerSelectedItems()
+{
+  QList<QgsComposerItem*> selectedItems = selectedComposerItems();
+  QList<QgsComposerItem*>::iterator it = selectedItems.begin();
+  for(; it != selectedItems.end(); ++it)
+    {
+      lowerItem(*it);
+    }
+
+  //update all positions
+  updateZValues();
+  update();
+}
+
+void QgsComposition::lowerItem(QgsComposerItem* item)
+{
+  //search item
+  QMutableLinkedListIterator<QgsComposerItem*> it(mItemZList);
+  if(it.findNext(item))
+    {
+      it.previous();
+      if(it.hasPrevious())
+	{
+	  it.remove();
+	  it.previous();
+	  it.insert(item);
+	}
+    }
+}
+
+void QgsComposition::moveSelectedItemsToTop()
+{
+  QList<QgsComposerItem*> selectedItems = selectedComposerItems();
+  QList<QgsComposerItem*>::iterator it = selectedItems.begin();
+  for(; it != selectedItems.end(); ++it)
+    {
+      moveItemToTop(*it);
+    }
+
+  //update all positions
+  updateZValues();
+  update();
+}
+
+void QgsComposition::moveItemToTop(QgsComposerItem* item)
+{
+  //search item
+  QMutableLinkedListIterator<QgsComposerItem*> it(mItemZList);
+  if(it.findNext(item))
+    {
+      it.remove();
+    }
+  mItemZList.push_back(item);
+}
+ 
+void QgsComposition::moveSelectedItemsToBottom()
+{
+  QList<QgsComposerItem*> selectedItems = selectedComposerItems();
+  QList<QgsComposerItem*>::iterator it = selectedItems.begin();
+  for(; it != selectedItems.end(); ++it)
+    {
+      moveItemToBottom(*it);
+    }
+
+  //update all positions
+  updateZValues();
+  update();
+}
+
+void QgsComposition::moveItemToBottom(QgsComposerItem* item)
+{
+  //search item
+  QMutableLinkedListIterator<QgsComposerItem*> it(mItemZList);
+  if(it.findNext(item))
+    {
+      it.remove();
+    }
+  mItemZList.push_front(item);
+}
+
+void QgsComposition::updateZValues()
+{
+  int counter = 1;
+  QLinkedList<QgsComposerItem*>::iterator it = mItemZList.begin();
+  QgsComposerItem* currentItem = 0;
+
+  for(; it != mItemZList.end(); ++it)
+    {
+      currentItem = *it;
+      if(currentItem)
+	{
+	  qWarning(QString::number(counter).toLocal8Bit().data());
+	  currentItem->setZValue(counter);
+	}
+      ++counter;
+    }
+}
+
+void QgsComposition::sortZList()
+{
+  //debug: list before sorting
+  qWarning("before sorting");
+  QLinkedList<QgsComposerItem*>::iterator before_it = mItemZList.begin();
+  for(; before_it != mItemZList.end(); ++before_it)
+    {
+      qWarning(QString::number((*before_it)->zValue()).toLocal8Bit().data());
+    }
+
+  QMutableLinkedListIterator<QgsComposerItem*> it(mItemZList);
+  int previousZ, afterZ; //z values of items before and after
+  QgsComposerItem* previousItem;
+  QgsComposerItem* afterItem;
+
+  while(it.hasNext())
+    {
+      previousItem = it.next();
+      if(previousItem)
+	{
+	  previousZ = previousItem->zValue();
+	}
+      else
+	{
+	  previousZ = -1;
+	}
+
+      if(!it.hasNext())
+	{
+	  break; //this is the end...
+	}
+      afterItem = it.peekNext();
+
+      if(afterItem)
+	{
+	  afterZ = afterItem->zValue();
+	}
+      else
+	{
+	  afterZ = -1;
+	}
+
+      if(previousZ > afterZ)
+	{
+	  //swap items
+	  if(previousItem && afterItem)
+	    {
+	      it.remove();
+	      it.next();
+	      it.insert(previousItem);
+	      it.previous();
+	    }
+	}
+    }
+
+  //debug: list after sorting
+  //debug: list before sorting
+  qWarning("after sorting");
+  QLinkedList<QgsComposerItem*>::iterator after_it = mItemZList.begin();
+  for(; after_it != mItemZList.end(); ++after_it)
+    {
+      qWarning(QString::number((*after_it)->zValue()).toLocal8Bit().data());
+    }
+}

Modified: trunk/qgis/src/core/composer/qgscomposition.h
===================================================================
--- trunk/qgis/src/core/composer/qgscomposition.h	2008-08-24 15:10:54 UTC (rev 9152)
+++ trunk/qgis/src/core/composer/qgscomposition.h	2008-08-24 15:56:41 UTC (rev 9153)
@@ -17,6 +17,7 @@
 #define QGSCOMPOSITION_H
 
 #include <QGraphicsScene>
+#include <QLinkedList>
 
 class QgsComposerItem;
 class QgsComposerMap;
@@ -27,8 +28,10 @@
 class QDomElement;
 
 /** \ingroup MapComposer
- * Graphics scene for map printing. It manages the paper item which always
- * is the item in the back (z-value 0).
+ * Graphics scene for map printing. The class manages the paper item which always
+ * is the item in the back (z-value 0). It maintains the z-Values of the items and stores
+ * them in a list in ascending z-Order. This list can be changed to lower/raise items one position 
+ * or to bring them to front/back.
  * */
 class CORE_EXPORT QgsComposition: public QGraphicsScene
 {
@@ -89,16 +92,41 @@
     /**Reads settings from xml file*/
     bool readXML( const QDomElement& compositionElem, const QDomDocument& doc );
 
+    /**Adds item to z list. Usually called from constructor of QgsComposerItem*/
+    void addItemToZList(QgsComposerItem* item);
+    /**Removes item from z list. Usually called from destructor of QgsComposerItem*/
+    void removeItemFromZList(QgsComposerItem* item);
+
+    void raiseSelectedItems();
+    void raiseItem(QgsComposerItem* item);
+    void lowerSelectedItems();
+    void lowerItem(QgsComposerItem* item);
+    void moveSelectedItemsToTop();
+    void moveItemToTop(QgsComposerItem* item);
+    void moveSelectedItemsToBottom();
+    void moveItemToBottom(QgsComposerItem* item);
+
+    /**Sorts the zList. The only time where this function needs to be called is from QgsComposer
+     after reading all the items from xml file*/
+    void sortZList();
+    
+
   private:
     /**Pointer to map renderer of QGIS main map*/
     QgsMapRenderer* mMapRenderer;
     QgsComposition::PlotStyle mPlotStyle;
     QGraphicsRectItem* mPaperItem;
 
+    /**Maintains z-Order of items. Starts with item at position 1 (position 0 is always paper item)*/
+    QLinkedList<QgsComposerItem*> mItemZList;
+
     /**Dpi for printout*/
     int mPrintoutResolution;
 
     QgsComposition(); //default constructor is forbidden
+
+    /**Reset z-values of items based on position in z list*/
+    void updateZValues();
 };
 
 #endif

Modified: trunk/qgis/src/gui/qgscomposerview.cpp
===================================================================
--- trunk/qgis/src/gui/qgscomposerview.cpp	2008-08-24 15:10:54 UTC (rev 9152)
+++ trunk/qgis/src/gui/qgscomposerview.cpp	2008-08-24 15:56:41 UTC (rev 9153)
@@ -101,7 +101,6 @@
       emit composerLabelAdded( newLabelItem );
       scene()->clearSelection();
       newLabelItem->setSceneRect( QRectF( scenePoint.x(), scenePoint.y(), newLabelItem->rect().width(), newLabelItem->rect().height() ) );
-      newLabelItem->setZValue( 60 );
       newLabelItem->setSelected( true );
       emit selectedItemChanged( newLabelItem );
       emit actionFinished();
@@ -124,7 +123,6 @@
       scene()->addItem( newScaleBar );
       emit composerScaleBarAdded( newScaleBar );
       scene()->clearSelection();
-      newScaleBar->setZValue( 60 );
       newScaleBar->setSelected( true );
       emit selectedItemChanged( newScaleBar );
       emit actionFinished();
@@ -137,7 +135,6 @@
       scene()->addItem( newLegend );
       emit composerLegendAdded( newLegend );
       scene()->clearSelection();
-      newLegend->setZValue( 60 );
       newLegend->setSceneRect( QRectF( scenePoint.x(), scenePoint.y(), newLegend->rect().width(), newLegend->rect().height() ) );
       newLegend->setSelected( true );
       emit selectedItemChanged( newLegend );
@@ -150,7 +147,6 @@
       scene()->addItem( newPicture );
       emit composerPictureAdded( newPicture );
       scene()->clearSelection();
-      newPicture->setZValue( 60 );
       newPicture->setSceneRect( QRectF( scenePoint.x(), scenePoint.y(), 30, 30 ) );
       newPicture->setSelected( true );
       emit selectedItemChanged( newPicture );
@@ -212,8 +208,6 @@
       composerMap->setPreviewMode( QgsComposerMap::Rectangle );
 
       emit composerMapAdded( composerMap );
-
-      composerMap->setZValue( 50 );
       scene()->addItem( composerMap );
       scene()->clearSelection();
 



More information about the QGIS-commit mailing list