23 #include <QDomElement> 
   24 #include <QTextStream> 
   26 static void _readOldLegendGroup( 
const QDomElement &groupElem, 
QgsLayerTreeGroup *parent );
 
   27 static void _readOldLegendLayer( 
const QDomElement &layerElem, 
QgsLayerTreeGroup *parent );
 
   31   if ( legendElem.isNull() )
 
   34   const QDomNodeList legendChildren = legendElem.childNodes();
 
   36   for ( 
int i = 0; i < legendChildren.size(); ++i )
 
   38     const QDomElement currentChildElem = legendChildren.at( i ).toElement();
 
   39     if ( currentChildElem.tagName() == QLatin1String( 
"legendlayer" ) )
 
   41       _readOldLegendLayer( currentChildElem, root );
 
   43     else if ( currentChildElem.tagName() == QLatin1String( 
"legendgroup" ) )
 
   45       _readOldLegendGroup( currentChildElem, root );
 
   54 static bool _readOldLegendLayerOrderGroup( 
const QDomElement &groupElem, QMap<int, QString> &layerIndexes )
 
   56   const QDomNodeList legendChildren = groupElem.childNodes();
 
   58   for ( 
int i = 0; i < legendChildren.size(); ++i )
 
   60     const QDomElement currentChildElem = legendChildren.at( i ).toElement();
 
   61     if ( currentChildElem.tagName() == QLatin1String( 
"legendlayer" ) )
 
   63       const QDomElement layerFileElem = currentChildElem.firstChildElement( QStringLiteral( 
"filegroup" ) ).firstChildElement( QStringLiteral( 
"legendlayerfile" ) );
 
   65       const int layerIndex = currentChildElem.attribute( QStringLiteral( 
"drawingOrder" ) ).toInt();
 
   66       if ( layerIndex == -1 )
 
   68       layerIndexes.insert( layerIndex, layerFileElem.attribute( QStringLiteral( 
"layerid" ) ) );
 
   70     else if ( currentChildElem.tagName() == QLatin1String( 
"legendgroup" ) )
 
   72       if ( !_readOldLegendLayerOrderGroup( currentChildElem, layerIndexes ) )
 
   83   if ( legendElem.isNull() )
 
   86   hasCustomOrder = legendElem.attribute( QStringLiteral( 
"updateDrawingOrder" ) ) == QLatin1String( 
"false" );
 
   89   QMap<int, QString> layerIndexes;
 
   92   const bool res = _readOldLegendLayerOrderGroup( legendElem, layerIndexes );
 
   94   if ( !res && hasCustomOrder )
 
   97   const auto constLayerIndexes = layerIndexes;
 
   98   for ( 
const QString &layerId : constLayerIndexes )
 
  101     order.append( layerId );
 
  108 static QDomElement _writeOldLegendLayer( QDomDocument &doc, 
QgsLayerTreeLayer *nodeLayer, 
bool hasCustomOrder, 
const QList<QgsMapLayer *> &order )
 
  110   int drawingOrder = -1;
 
  111   if ( hasCustomOrder )
 
  112     drawingOrder = order.indexOf( nodeLayer->
layer() );
 
  114   QDomElement layerElem = doc.createElement( QStringLiteral( 
"legendlayer" ) );
 
  115   layerElem.setAttribute( QStringLiteral( 
"drawingOrder" ), drawingOrder );
 
  116   layerElem.setAttribute( QStringLiteral( 
"open" ), nodeLayer->
isExpanded() ? QStringLiteral( 
"true" ) : QStringLiteral( 
"false" ) );
 
  118   layerElem.setAttribute( QStringLiteral( 
"name" ), nodeLayer->
name() );
 
  119   layerElem.setAttribute( QStringLiteral( 
"showFeatureCount" ), nodeLayer->
customProperty( QStringLiteral( 
"showFeatureCount" ) ).toInt() );
 
  121   QDomElement fileGroupElem = doc.createElement( QStringLiteral( 
"filegroup" ) );
 
  122   fileGroupElem.setAttribute( QStringLiteral( 
"open" ), nodeLayer->
isExpanded() ? QStringLiteral( 
"true" ) : QStringLiteral( 
"false" ) );
 
  123   fileGroupElem.setAttribute( QStringLiteral( 
"hidden" ), QStringLiteral( 
"false" ) );
 
  125   QDomElement layerFileElem = doc.createElement( QStringLiteral( 
"legendlayerfile" ) );
 
  126   layerFileElem.setAttribute( QStringLiteral( 
"isInOverview" ), nodeLayer->
customProperty( QStringLiteral( 
"overview" ) ).toInt() );
 
  127   layerFileElem.setAttribute( QStringLiteral( 
"layerid" ), nodeLayer->
layerId() );
 
  128   layerFileElem.setAttribute( QStringLiteral( 
"visible" ), nodeLayer->
isVisible() ? 1 : 0 );
 
  130   layerElem.appendChild( fileGroupElem );
 
  131   fileGroupElem.appendChild( layerFileElem );
 
  136 static void _writeOldLegendGroupChildren( QDomDocument &doc, QDomElement &groupElem, 
QgsLayerTreeGroup *nodeGroup, 
bool hasCustomOrder, 
const QList<QgsMapLayer *> &order );
 
  138 static QDomElement _writeOldLegendGroup( QDomDocument &doc, 
QgsLayerTreeGroup *nodeGroup, 
bool hasCustomOrder, 
const QList<QgsMapLayer *> &order )
 
  140   QDomElement groupElem = doc.createElement( QStringLiteral( 
"legendgroup" ) );
 
  141   groupElem.setAttribute( QStringLiteral( 
"open" ), nodeGroup->
isExpanded() ? QStringLiteral( 
"true" ) : QStringLiteral( 
"false" ) );
 
  142   groupElem.setAttribute( QStringLiteral( 
"name" ), nodeGroup->
name() );
 
  145   if ( nodeGroup->
customProperty( QStringLiteral( 
"embedded" ) ).toInt() )
 
  147     groupElem.setAttribute( QStringLiteral( 
"embedded" ), 1 );
 
  148     groupElem.setAttribute( QStringLiteral( 
"project" ), nodeGroup->
customProperty( QStringLiteral( 
"embedded_project" ) ).toString() );
 
  151   _writeOldLegendGroupChildren( doc, groupElem, nodeGroup, hasCustomOrder, order );
 
  156 static void _writeOldLegendGroupChildren( QDomDocument &doc, QDomElement &groupElem, 
QgsLayerTreeGroup *nodeGroup, 
bool hasCustomOrder, 
const QList<QgsMapLayer *> &order )
 
  158   const auto constChildren = nodeGroup->
children();
 
  163       groupElem.appendChild( _writeOldLegendGroup( doc, 
QgsLayerTree::toGroup( node ), hasCustomOrder, order ) );
 
  167       groupElem.appendChild( _writeOldLegendLayer( doc, 
QgsLayerTree::toLayer( node ), hasCustomOrder, order ) );
 
  175   QDomElement legendElem = doc.createElement( QStringLiteral( 
"legend" ) );
 
  176   legendElem.setAttribute( QStringLiteral( 
"updateDrawingOrder" ), hasCustomOrder ? QStringLiteral( 
"false" ) : QStringLiteral( 
"true" ) );
 
  178   _writeOldLegendGroupChildren( doc, legendElem, root, hasCustomOrder, order );
 
  189       return QStringLiteral( 
"Qt::Unchecked" );
 
  190     case Qt::PartiallyChecked:
 
  191       return QStringLiteral( 
"Qt::PartiallyChecked" );
 
  193       return QStringLiteral( 
"Qt::Checked" );
 
  200   if ( txt == QLatin1String( 
"Qt::Unchecked" ) )
 
  201     return Qt::Unchecked;
 
  202   else if ( txt == QLatin1String( 
"Qt::PartiallyChecked" ) )
 
  203     return Qt::PartiallyChecked;
 
  210 static void _readOldLegendGroup( 
const QDomElement &groupElem, 
QgsLayerTreeGroup *parent )
 
  212   const QDomNodeList groupChildren = groupElem.childNodes();
 
  217   groupNode->
setExpanded( groupElem.attribute( QStringLiteral( 
"open" ) ) == QLatin1String( 
"true" ) );
 
  219   if ( groupElem.attribute( QStringLiteral( 
"embedded" ) ) == QLatin1String( 
"1" ) )
 
  222     groupNode->
setCustomProperty( QStringLiteral( 
"embedded_project" ), groupElem.attribute( QStringLiteral( 
"project" ) ) );
 
  225   for ( 
int i = 0; i < groupChildren.size(); ++i )
 
  227     const QDomElement currentChildElem = groupChildren.at( i ).toElement();
 
  228     if ( currentChildElem.tagName() == QLatin1String( 
"legendlayer" ) )
 
  230       _readOldLegendLayer( currentChildElem, groupNode );
 
  232     else if ( currentChildElem.tagName() == QLatin1String( 
"legendgroup" ) )
 
  234       _readOldLegendGroup( currentChildElem, groupNode );
 
  241 static void _readOldLegendLayer( 
const QDomElement &layerElem, 
QgsLayerTreeGroup *parent )
 
  243   const QDomElement layerFileElem = layerElem.firstChildElement( QStringLiteral( 
"filegroup" ) ).firstChildElement( QStringLiteral( 
"legendlayerfile" ) );
 
  244   const QString layerId = layerFileElem.attribute( QStringLiteral( 
"layerid" ) );
 
  248   layerNode->
setExpanded( layerElem.attribute( QStringLiteral( 
"open" ) ) == QLatin1String( 
"true" ) );
 
  250   if ( layerFileElem.attribute( QStringLiteral( 
"isInOverview" ) ) == QLatin1String( 
"1" ) )
 
  253   if ( layerElem.attribute( QStringLiteral( 
"embedded" ) ) == QLatin1String( 
"1" ) )
 
  256   if ( layerElem.attribute( QStringLiteral( 
"showFeatureCount" ) ) == QLatin1String( 
"1" ) )
 
  266   const auto constLayerNodes = layerNodes;
 
  281   const auto constLayerNodes = layerNodes;
 
  296   QList<QgsLayerTreeNode *> nodesToRemove;
 
  297   const auto constChildren = group->
children();
 
  305         nodesToRemove << node;
 
  309   const auto constNodesToRemove = nodesToRemove;
 
  316   const QDomElement projectLayersElement { doc->documentElement().firstChildElement( QStringLiteral( 
"projectlayers" ) ) };
 
  328         QDomElement layerElement { projectLayersElement.firstChildElement( QStringLiteral( 
"maplayer" ) ) };
 
  329         while ( ! layerElement.isNull() )
 
  331           const QString id( layerElement.firstChildElement( QStringLiteral( 
"id" ) ).firstChild().nodeValue() );
 
  335             QTextStream stream( &
str );
 
  336             layerElement.save( stream, 4  );
 
  337             l->setOriginalXmlProperties( QStringLiteral( 
"<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>\n%1" ).arg( 
str ) );
 
  340           layerElement = layerElement.nextSiblingElement( );
 
  346       const QList<QgsLayerTreeNode *> constChildren( node->children( ) );
 
  347       for ( 
const auto &childNode : constChildren )
 
  354   const QList<QgsLayerTreeNode *> children = group->
children();
 
  370       if ( child->itemVisibilityChecked() == Qt::Unchecked )
 
  389   const auto constChildren = group->
children();
 
  394       if ( child->customProperty( QStringLiteral( 
"embedded" ) ).toInt() )
 
  396         child->setCustomProperty( QStringLiteral( 
"embedded-invisible-layers" ), 
invisibleLayerList( child ) );
 
  410   const auto constChildren = group->
children();
 
  413     if ( !node->customProperty( QStringLiteral( 
"embedded_project" ) ).toString().isEmpty() )
 
  416       const QString newPath = project->
writePath( node->customProperty( QStringLiteral( 
"embedded_project" ) ).toString() );
 
  417       node->setCustomProperty( QStringLiteral( 
"embedded_project" ), newPath );
 
  430   layer.
setCustomProperty( QStringLiteral( 
"legend/expressionFilterEnabled" ), enabled && !expr.isEmpty() );
 
  435   const QString expression = layer.
customProperty( QStringLiteral( 
"legend/expressionFilter" ), QString() ).toString();
 
  437     *enabled = !expression.isEmpty() && layer.
customProperty( QStringLiteral( 
"legend/expressionFilterEnabled" ), QString() ).toBool();
 
  443   const auto constFindLayers = group.
findLayers();
 
  448     if ( exprEnabled && !expr.isEmpty() )
 
  475   return parent->
insertLayer( idx + 1, layerToInsert );
 
  478 static void _collectMapLayers( 
const QList<QgsLayerTreeNode *> &nodes, QSet<QgsMapLayer *> &layersSet )
 
  485       if ( nodeLayer->
layer() )
 
  486         layersSet << nodeLayer->
layer();
 
  497   QSet<QgsMapLayer *> layersSet;
 
  498   _collectMapLayers( nodes, layersSet );
 
  512   const QList<QgsLayerTreeNode *> children = tree->
children();