Skip to content

Commit 1f1532a

Browse files
author
mhugent
committedAug 24, 2008
Added functions to move composer items front/back
git-svn-id: http://svn.osgeo.org/qgis/trunk@9153 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent d64e451 commit 1f1532a

File tree

11 files changed

+307
-13
lines changed

11 files changed

+307
-13
lines changed
 
860 Bytes
Loading
430 Bytes
Loading
514 Bytes
Loading
877 Bytes
Loading

‎src/app/composer/qgscomposer.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ QgsComposer::QgsComposer( QgisApp *qgis ): QMainWindow()
7676

7777
toolBar->addAction( QIcon( QPixmap( myIconPath + "mActionGroupItems.png" ) ), tr( "&Group Items" ), this, SLOT( groupItems() ) );
7878
toolBar->addAction( QIcon( QPixmap( myIconPath + "mActionUngroupItems.png" ) ), tr( "&Ungroup Items" ), this, SLOT( ungroupItems() ) );
79+
toolBar->addAction( QIcon( QPixmap( myIconPath + "mActionRaiseItems.png")), tr("Raise selected items"), this, SLOT(raiseSelectedItems()));
80+
toolBar->addAction( QIcon( QPixmap( myIconPath + "mActionLowerItems.png")), tr("Lower selected items"), this, SLOT(lowerSelectedItems()));
81+
toolBar->addAction( QIcon( QPixmap( myIconPath + "mActionMoveItemsToTop.png")), tr("Move selected items to top"), this, SLOT(moveSelectedItemsToTop()));
82+
toolBar->addAction( QIcon( QPixmap( myIconPath + "mActionMoveItemsToBottom.png")), tr("Move selected items to bottom"), this, SLOT(moveSelectedItemsToBottom()));
7983

8084
QActionGroup* toggleActionGroup = new QActionGroup( this );
8185
toggleActionGroup->addAction( moveItemContentAction );
@@ -1028,6 +1032,38 @@ void QgsComposer::ungroupItems( void )
10281032
}
10291033
}
10301034

1035+
void QgsComposer::raiseSelectedItems()
1036+
{
1037+
if(mComposition)
1038+
{
1039+
mComposition->raiseSelectedItems();
1040+
}
1041+
}
1042+
1043+
void QgsComposer::lowerSelectedItems()
1044+
{
1045+
if(mComposition)
1046+
{
1047+
mComposition->lowerSelectedItems();
1048+
}
1049+
}
1050+
1051+
void QgsComposer::moveSelectedItemsToTop()
1052+
{
1053+
if(mComposition)
1054+
{
1055+
mComposition->moveSelectedItemsToTop();
1056+
}
1057+
}
1058+
1059+
void QgsComposer::moveSelectedItemsToBottom()
1060+
{
1061+
if(mComposition)
1062+
{
1063+
mComposition->moveSelectedItemsToBottom();
1064+
}
1065+
}
1066+
10311067
void QgsComposer::moveEvent( QMoveEvent *e ) { saveWindowState(); }
10321068

10331069
void QgsComposer::resizeEvent( QResizeEvent *e )
@@ -1305,6 +1341,7 @@ void QgsComposer::readXML( const QDomDocument& doc )
13051341
mComposition->update();
13061342
}
13071343

1344+
mComposition->sortZList();
13081345
mView->setComposition( mComposition );
13091346
}
13101347

‎src/app/composer/qgscomposer.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,18 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
147147
//! Ungroup selected item group
148148
void ungroupItems( void );
149149

150+
//! Move selected items one position up
151+
void raiseSelectedItems();
152+
153+
//!Move selected items one position down
154+
void lowerSelectedItems();
155+
156+
//!Move selected items to top
157+
void moveSelectedItemsToTop();
158+
159+
//!Move selected items to bottom
160+
void moveSelectedItemsToBottom();
161+
150162
//! read project
151163
void projectRead();
152164

‎src/core/composer/qgscomposeritem.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ QgsComposerItem::QgsComposerItem( QgsComposition* composition ): QGraphicsRectIt
3737
QPen defaultPen( QColor( 0, 0, 0 ) );
3838
defaultPen.setWidth( 1 );
3939
setPen( defaultPen );
40+
41+
//let z-Value be managed by composition
42+
if(mComposition)
43+
{
44+
mComposition->addItemToZList(this);
45+
}
4046
}
4147

4248
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 @@ QgsComposerItem::QgsComposerItem( qreal x, qreal y, qreal width, qreal height, Q
5359
QPen defaultPen( QColor( 0, 0, 0 ) );
5460
defaultPen.setWidth( 1 );
5561
setPen( defaultPen );
62+
63+
//let z-Value be managed by composition
64+
if(mComposition)
65+
{
66+
mComposition->addItemToZList(this);
67+
}
5668
}
5769

5870
QgsComposerItem::~QgsComposerItem()
5971
{
72+
if(mComposition)
73+
{
74+
mComposition->removeItemFromZList(this);
75+
}
6076
}
6177

6278
void QgsComposerItem::setSelected( bool s )

‎src/core/composer/qgscomposermap.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,7 @@ QgsComposerMap::QgsComposerMap( QgsComposition *composition, int x, int y, int w
6363
mExtent = mMapRenderer->extent();
6464
}
6565
setSceneRect( QRectF( x, y, width, height ) );
66-
67-
QGraphicsRectItem::setZValue( 20 );
68-
6966
setToolTip( tr( "Map" ) + " " + QString::number( mId ) );
70-
71-
QGraphicsRectItem::show();
7267
}
7368

7469
QgsComposerMap::QgsComposerMap( QgsComposition *composition )

‎src/core/composer/qgscomposition.cpp

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,215 @@ bool QgsComposition::readXML( const QDomElement& compositionElem, const QDomDocu
189189

190190
return true;
191191
}
192+
193+
void QgsComposition::addItemToZList(QgsComposerItem* item)
194+
{
195+
if(!item)
196+
{
197+
return;
198+
}
199+
mItemZList.push_back(item);
200+
qWarning(QString::number(mItemZList.size()).toLocal8Bit().data());
201+
item->setZValue(mItemZList.size());
202+
}
203+
204+
void QgsComposition::removeItemFromZList(QgsComposerItem* item)
205+
{
206+
if(!item)
207+
{
208+
return;
209+
}
210+
mItemZList.removeAll(item);
211+
}
212+
213+
void QgsComposition::raiseSelectedItems()
214+
{
215+
QList<QgsComposerItem*> selectedItems = selectedComposerItems();
216+
QList<QgsComposerItem*>::iterator it = selectedItems.begin();
217+
for(; it != selectedItems.end(); ++it)
218+
{
219+
raiseItem(*it);
220+
}
221+
222+
//update all positions
223+
updateZValues();
224+
update();
225+
}
226+
227+
void QgsComposition::raiseItem(QgsComposerItem* item)
228+
{
229+
//search item
230+
QMutableLinkedListIterator<QgsComposerItem*> it(mItemZList);
231+
if(it.findNext(item))
232+
{
233+
if(it.hasNext())
234+
{
235+
it.remove();
236+
it.next();
237+
it.insert(item);
238+
}
239+
}
240+
}
241+
242+
void QgsComposition::lowerSelectedItems()
243+
{
244+
QList<QgsComposerItem*> selectedItems = selectedComposerItems();
245+
QList<QgsComposerItem*>::iterator it = selectedItems.begin();
246+
for(; it != selectedItems.end(); ++it)
247+
{
248+
lowerItem(*it);
249+
}
250+
251+
//update all positions
252+
updateZValues();
253+
update();
254+
}
255+
256+
void QgsComposition::lowerItem(QgsComposerItem* item)
257+
{
258+
//search item
259+
QMutableLinkedListIterator<QgsComposerItem*> it(mItemZList);
260+
if(it.findNext(item))
261+
{
262+
it.previous();
263+
if(it.hasPrevious())
264+
{
265+
it.remove();
266+
it.previous();
267+
it.insert(item);
268+
}
269+
}
270+
}
271+
272+
void QgsComposition::moveSelectedItemsToTop()
273+
{
274+
QList<QgsComposerItem*> selectedItems = selectedComposerItems();
275+
QList<QgsComposerItem*>::iterator it = selectedItems.begin();
276+
for(; it != selectedItems.end(); ++it)
277+
{
278+
moveItemToTop(*it);
279+
}
280+
281+
//update all positions
282+
updateZValues();
283+
update();
284+
}
285+
286+
void QgsComposition::moveItemToTop(QgsComposerItem* item)
287+
{
288+
//search item
289+
QMutableLinkedListIterator<QgsComposerItem*> it(mItemZList);
290+
if(it.findNext(item))
291+
{
292+
it.remove();
293+
}
294+
mItemZList.push_back(item);
295+
}
296+
297+
void QgsComposition::moveSelectedItemsToBottom()
298+
{
299+
QList<QgsComposerItem*> selectedItems = selectedComposerItems();
300+
QList<QgsComposerItem*>::iterator it = selectedItems.begin();
301+
for(; it != selectedItems.end(); ++it)
302+
{
303+
moveItemToBottom(*it);
304+
}
305+
306+
//update all positions
307+
updateZValues();
308+
update();
309+
}
310+
311+
void QgsComposition::moveItemToBottom(QgsComposerItem* item)
312+
{
313+
//search item
314+
QMutableLinkedListIterator<QgsComposerItem*> it(mItemZList);
315+
if(it.findNext(item))
316+
{
317+
it.remove();
318+
}
319+
mItemZList.push_front(item);
320+
}
321+
322+
void QgsComposition::updateZValues()
323+
{
324+
int counter = 1;
325+
QLinkedList<QgsComposerItem*>::iterator it = mItemZList.begin();
326+
QgsComposerItem* currentItem = 0;
327+
328+
for(; it != mItemZList.end(); ++it)
329+
{
330+
currentItem = *it;
331+
if(currentItem)
332+
{
333+
qWarning(QString::number(counter).toLocal8Bit().data());
334+
currentItem->setZValue(counter);
335+
}
336+
++counter;
337+
}
338+
}
339+
340+
void QgsComposition::sortZList()
341+
{
342+
//debug: list before sorting
343+
qWarning("before sorting");
344+
QLinkedList<QgsComposerItem*>::iterator before_it = mItemZList.begin();
345+
for(; before_it != mItemZList.end(); ++before_it)
346+
{
347+
qWarning(QString::number((*before_it)->zValue()).toLocal8Bit().data());
348+
}
349+
350+
QMutableLinkedListIterator<QgsComposerItem*> it(mItemZList);
351+
int previousZ, afterZ; //z values of items before and after
352+
QgsComposerItem* previousItem;
353+
QgsComposerItem* afterItem;
354+
355+
while(it.hasNext())
356+
{
357+
previousItem = it.next();
358+
if(previousItem)
359+
{
360+
previousZ = previousItem->zValue();
361+
}
362+
else
363+
{
364+
previousZ = -1;
365+
}
366+
367+
if(!it.hasNext())
368+
{
369+
break; //this is the end...
370+
}
371+
afterItem = it.peekNext();
372+
373+
if(afterItem)
374+
{
375+
afterZ = afterItem->zValue();
376+
}
377+
else
378+
{
379+
afterZ = -1;
380+
}
381+
382+
if(previousZ > afterZ)
383+
{
384+
//swap items
385+
if(previousItem && afterItem)
386+
{
387+
it.remove();
388+
it.next();
389+
it.insert(previousItem);
390+
it.previous();
391+
}
392+
}
393+
}
394+
395+
//debug: list after sorting
396+
//debug: list before sorting
397+
qWarning("after sorting");
398+
QLinkedList<QgsComposerItem*>::iterator after_it = mItemZList.begin();
399+
for(; after_it != mItemZList.end(); ++after_it)
400+
{
401+
qWarning(QString::number((*after_it)->zValue()).toLocal8Bit().data());
402+
}
403+
}

‎src/core/composer/qgscomposition.h

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#define QGSCOMPOSITION_H
1818

1919
#include <QGraphicsScene>
20+
#include <QLinkedList>
2021

2122
class QgsComposerItem;
2223
class QgsComposerMap;
@@ -27,8 +28,10 @@ class QDomDocument;
2728
class QDomElement;
2829

2930
/** \ingroup MapComposer
30-
* Graphics scene for map printing. It manages the paper item which always
31-
* is the item in the back (z-value 0).
31+
* Graphics scene for map printing. The class manages the paper item which always
32+
* is the item in the back (z-value 0). It maintains the z-Values of the items and stores
33+
* them in a list in ascending z-Order. This list can be changed to lower/raise items one position
34+
* or to bring them to front/back.
3235
* */
3336
class CORE_EXPORT QgsComposition: public QGraphicsScene
3437
{
@@ -89,16 +92,41 @@ class CORE_EXPORT QgsComposition: public QGraphicsScene
8992
/**Reads settings from xml file*/
9093
bool readXML( const QDomElement& compositionElem, const QDomDocument& doc );
9194

95+
/**Adds item to z list. Usually called from constructor of QgsComposerItem*/
96+
void addItemToZList(QgsComposerItem* item);
97+
/**Removes item from z list. Usually called from destructor of QgsComposerItem*/
98+
void removeItemFromZList(QgsComposerItem* item);
99+
100+
void raiseSelectedItems();
101+
void raiseItem(QgsComposerItem* item);
102+
void lowerSelectedItems();
103+
void lowerItem(QgsComposerItem* item);
104+
void moveSelectedItemsToTop();
105+
void moveItemToTop(QgsComposerItem* item);
106+
void moveSelectedItemsToBottom();
107+
void moveItemToBottom(QgsComposerItem* item);
108+
109+
/**Sorts the zList. The only time where this function needs to be called is from QgsComposer
110+
after reading all the items from xml file*/
111+
void sortZList();
112+
113+
92114
private:
93115
/**Pointer to map renderer of QGIS main map*/
94116
QgsMapRenderer* mMapRenderer;
95117
QgsComposition::PlotStyle mPlotStyle;
96118
QGraphicsRectItem* mPaperItem;
97119

120+
/**Maintains z-Order of items. Starts with item at position 1 (position 0 is always paper item)*/
121+
QLinkedList<QgsComposerItem*> mItemZList;
122+
98123
/**Dpi for printout*/
99124
int mPrintoutResolution;
100125

101126
QgsComposition(); //default constructor is forbidden
127+
128+
/**Reset z-values of items based on position in z list*/
129+
void updateZValues();
102130
};
103131

104132
#endif

‎src/gui/qgscomposerview.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ void QgsComposerView::mousePressEvent( QMouseEvent* e )
101101
emit composerLabelAdded( newLabelItem );
102102
scene()->clearSelection();
103103
newLabelItem->setSceneRect( QRectF( scenePoint.x(), scenePoint.y(), newLabelItem->rect().width(), newLabelItem->rect().height() ) );
104-
newLabelItem->setZValue( 60 );
105104
newLabelItem->setSelected( true );
106105
emit selectedItemChanged( newLabelItem );
107106
emit actionFinished();
@@ -124,7 +123,6 @@ void QgsComposerView::mousePressEvent( QMouseEvent* e )
124123
scene()->addItem( newScaleBar );
125124
emit composerScaleBarAdded( newScaleBar );
126125
scene()->clearSelection();
127-
newScaleBar->setZValue( 60 );
128126
newScaleBar->setSelected( true );
129127
emit selectedItemChanged( newScaleBar );
130128
emit actionFinished();
@@ -137,7 +135,6 @@ void QgsComposerView::mousePressEvent( QMouseEvent* e )
137135
scene()->addItem( newLegend );
138136
emit composerLegendAdded( newLegend );
139137
scene()->clearSelection();
140-
newLegend->setZValue( 60 );
141138
newLegend->setSceneRect( QRectF( scenePoint.x(), scenePoint.y(), newLegend->rect().width(), newLegend->rect().height() ) );
142139
newLegend->setSelected( true );
143140
emit selectedItemChanged( newLegend );
@@ -150,7 +147,6 @@ void QgsComposerView::mousePressEvent( QMouseEvent* e )
150147
scene()->addItem( newPicture );
151148
emit composerPictureAdded( newPicture );
152149
scene()->clearSelection();
153-
newPicture->setZValue( 60 );
154150
newPicture->setSceneRect( QRectF( scenePoint.x(), scenePoint.y(), 30, 30 ) );
155151
newPicture->setSelected( true );
156152
emit selectedItemChanged( newPicture );
@@ -212,8 +208,6 @@ void QgsComposerView::mouseReleaseEvent( QMouseEvent* e )
212208
composerMap->setPreviewMode( QgsComposerMap::Rectangle );
213209

214210
emit composerMapAdded( composerMap );
215-
216-
composerMap->setZValue( 50 );
217211
scene()->addItem( composerMap );
218212
scene()->clearSelection();
219213

0 commit comments

Comments
 (0)
Please sign in to comment.