@@ -295,6 +295,12 @@ void QgsLegend::mouseMoveEvent( QMouseEvent * e )
295
295
// record which items were selected and hide them
296
296
foreach ( QTreeWidgetItem * item, selectedItems () )
297
297
{
298
+ // prevent to drag out content under groups that are embedded from other
299
+ // project files.
300
+ if ( parentGroupEmbedded ( item ) )
301
+ {
302
+ continue ;
303
+ }
298
304
item->setHidden ( true );
299
305
mItemsBeingMoved << item;
300
306
}
@@ -324,6 +330,7 @@ void QgsLegend::mouseMoveEvent( QMouseEvent * e )
324
330
if ( mItemsBeingMoved .isEmpty () )
325
331
{
326
332
QgsDebugMsg ( " nothing to move" );
333
+ setCursor ( QCursor ( Qt::ArrowCursor ) );
327
334
return ;
328
335
}
329
336
@@ -364,36 +371,47 @@ void QgsLegend::mouseMoveEvent( QMouseEvent * e )
364
371
365
372
mDropTarget = layer;
366
373
367
- if ( e->y () < ( y0 + y1 ) / 2 )
374
+ // prevent inserting content into embedded groups
375
+ if ( !parentGroupEmbedded ( litem ) )
368
376
{
369
- QgsDebugMsg ( " insert before layer" );
370
- mDropAction = BEFORE;
371
- line_y = y0;
372
- }
373
- else
374
- {
375
- QgsDebugMsg ( " insert after layer" );
376
- mDropAction = AFTER;
377
- line_y = y1;
377
+ if ( e->y () < ( y0 + y1 ) / 2 )
378
+ {
379
+ QgsDebugMsg ( " insert before layer" );
380
+ mDropAction = BEFORE;
381
+ line_y = y0;
382
+ }
383
+ else
384
+ {
385
+ QgsDebugMsg ( " insert after layer" );
386
+ mDropAction = AFTER;
387
+ line_y = y1;
388
+ }
378
389
}
379
390
}
380
- else if ( group )
381
- {
391
+ else if ( group )
392
+ {
382
393
if ( yCoordAboveCenter ( litem, e->y () ) ) // over center of item
383
394
{
384
395
QgsDebugMsg ( " insert before group" );
385
396
386
- line_y = visualItemRect ( item ).top () + 1 ;
387
- mDropTarget = item;
388
- mDropAction = BEFORE;
397
+ // prevent inserting content into embedded groups
398
+ if ( !parentGroupEmbedded ( item ) )
399
+ {
400
+ line_y = visualItemRect ( item ).top () + 1 ;
401
+ mDropTarget = item;
402
+ mDropAction = BEFORE;
403
+ }
389
404
}
390
405
else // below center of item
391
406
{
392
- QgsDebugMsg ( " insert into group" );
407
+ if ( !groupEmbedded ( item ) )
408
+ {
409
+ QgsDebugMsg ( " insert into group" );
393
410
394
- line_y = visualItemRect ( item ).bottom () - 2 ;
395
- mDropTarget = item;
396
- mDropAction = INSERT;
411
+ line_y = visualItemRect ( item ).bottom () - 2 ;
412
+ mDropTarget = item;
413
+ mDropAction = INSERT;
414
+ }
397
415
}
398
416
}
399
417
else
@@ -566,7 +584,7 @@ void QgsLegend::handleRightClickEvent( QTreeWidgetItem* item, const QPoint& posi
566
584
{
567
585
qobject_cast<QgsLegendLayer*>( li )->addToPopupMenu ( theMenu );
568
586
569
- if ( li->parent () )
587
+ if ( li->parent () && ! parentGroupEmbedded ( li ) )
570
588
{
571
589
theMenu.addAction ( tr ( " &Make to toplevel item" ), this , SLOT ( makeToTopLevelItem () ) );
572
590
}
@@ -583,7 +601,7 @@ void QgsLegend::handleRightClickEvent( QTreeWidgetItem* item, const QPoint& posi
583
601
tr ( " &Set group CRS" ), this , SLOT ( legendGroupSetCRS () ) );
584
602
}
585
603
586
- if ( li->type () == QgsLegendItem::LEGEND_LAYER || li->type () == QgsLegendItem::LEGEND_GROUP )
604
+ if ( ( li->type () == QgsLegendItem::LEGEND_LAYER || li->type () == QgsLegendItem::LEGEND_GROUP ) && ! groupEmbedded ( li ) && ! parentGroupEmbedded ( li ) )
587
605
{
588
606
theMenu.addAction ( tr ( " Re&name" ), this , SLOT ( openEditor () ) );
589
607
}
@@ -644,6 +662,13 @@ QgsLegendGroup* QgsLegend::addEmbeddedGroup( const QString& groupName, const QSt
644
662
QDomElement legendElem = legendGroupList.at (i).toElement ();
645
663
if ( legendElem.attribute (" name" ) == groupName )
646
664
{
665
+ // embedded groups cannot be embedded again
666
+ if ( legendElem.attribute (" embedded" ) == " 1" )
667
+ {
668
+ mEmbeddedGroups .remove ( groupName );
669
+ return 0 ;
670
+ }
671
+
647
672
QgsLegendGroup* group = 0 ;
648
673
if ( parent )
649
674
{
@@ -678,6 +703,7 @@ QgsLegendGroup* QgsLegend::addEmbeddedGroup( const QString& groupName, const QSt
678
703
addEmbeddedGroup ( childElem.attribute (" name" ), projectFilePath, group );
679
704
}
680
705
}
706
+ checkLayerOrderUpdate ();
681
707
return group;
682
708
}
683
709
}
@@ -1092,6 +1118,12 @@ bool QgsLegend::writeXML( QList<QTreeWidgetItem *> items, QDomNode &node, QDomDo
1092
1118
legendlayerfilenode.setAttribute ( " layerid" , layer->id () );
1093
1119
layerfilegroupnode.appendChild ( legendlayerfilenode );
1094
1120
1121
+ // embedded layer?
1122
+ if ( !QgsProject::instance ()->layerIsEmbedded ( layer->id () ).isEmpty () )
1123
+ {
1124
+ legendlayerfilenode.setAttribute ( " embedded" , " 1" );
1125
+ }
1126
+
1095
1127
// visible flag
1096
1128
legendlayerfilenode.setAttribute ( " visible" , ll->isVisible () );
1097
1129
@@ -1814,7 +1846,10 @@ void QgsLegend::openEditor()
1814
1846
QTreeWidgetItem* theItem = currentItem ();
1815
1847
if ( theItem )
1816
1848
{
1817
- editItem ( theItem, 0 );
1849
+ if ( !groupEmbedded ( theItem ) && !parentGroupEmbedded ( theItem ) )
1850
+ {
1851
+ editItem ( theItem, 0 );
1852
+ }
1818
1853
}
1819
1854
}
1820
1855
@@ -1823,10 +1858,13 @@ void QgsLegend::makeToTopLevelItem()
1823
1858
QgsLegendItem* theItem = dynamic_cast <QgsLegendItem *>( currentItem () );
1824
1859
if ( theItem )
1825
1860
{
1826
- theItem->storeAppearanceSettings ();
1827
- removeItem ( theItem );
1828
- addTopLevelItem ( theItem );
1829
- theItem->restoreAppearanceSettings ();
1861
+ if ( !parentGroupEmbedded ( theItem ) )
1862
+ {
1863
+ theItem->storeAppearanceSettings ();
1864
+ removeItem ( theItem );
1865
+ addTopLevelItem ( theItem );
1866
+ theItem->restoreAppearanceSettings ();
1867
+ }
1830
1868
}
1831
1869
}
1832
1870
@@ -2130,3 +2168,39 @@ void QgsLegend::setCRSForSelectedLayers( const QgsCoordinateReferenceSystem &crs
2130
2168
if ( renderFlagState )
2131
2169
mMapCanvas ->setRenderFlag ( true );
2132
2170
}
2171
+
2172
+ bool QgsLegend::parentGroupEmbedded ( QTreeWidgetItem* item ) const
2173
+ {
2174
+ if ( !item )
2175
+ {
2176
+ return false ;
2177
+ }
2178
+
2179
+ QgsLegendItem* lItem = dynamic_cast <QgsLegendItem*>(item);
2180
+ if ( lItem && lItem->parent () )
2181
+ {
2182
+ QgsLegendGroup* parentGroup = dynamic_cast <QgsLegendGroup*>( lItem->parent () );
2183
+ if ( parentGroup && parentGroup->type () == QgsLegendItem::LEGEND_GROUP
2184
+ && mEmbeddedGroups .contains ( parentGroup->text ( 0 ) ) )
2185
+ {
2186
+ return true ;
2187
+ }
2188
+ }
2189
+ return false ;
2190
+ }
2191
+
2192
+ bool QgsLegend::groupEmbedded ( QTreeWidgetItem* item ) const
2193
+ {
2194
+ if ( !item )
2195
+ {
2196
+ return false ;
2197
+ }
2198
+
2199
+ QgsLegendGroup* gItem = dynamic_cast <QgsLegendGroup*>(item);
2200
+ if ( !gItem )
2201
+ {
2202
+ return false ;
2203
+ }
2204
+
2205
+ return mEmbeddedGroups .contains ( gItem ->text ( 0 ) );
2206
+ }
0 commit comments