1 /***************************************************************************
2   qgslayertreeviewembeddedindicator.h
3   --------------------------------------
4   Date                 : June 2018
5   Copyright            : (C) 2018 by Nyall Dawson
6   Email                : nyall dot dawson at gmail dot com
7  ***************************************************************************
8  *                                                                         *
9  *   This program is free software; you can redistribute it and/or modify  *
10  *   it under the terms of the GNU General Public License as published by  *
11  *   the Free Software Foundation; either version 2 of the License, or     *
12  *   (at your option) any later version.                                   *
13  *                                                                         *
14  ***************************************************************************/
15 
16 #include "qgslayertreeviewembeddedindicator.h"
17 #include "qgslayertree.h"
18 #include "qgslayertreemodel.h"
19 #include "qgslayertreeview.h"
20 #include "qgsapplication.h"
21 
QgsLayerTreeViewEmbeddedIndicatorProvider(QgsLayerTreeView * view)22 QgsLayerTreeViewEmbeddedIndicatorProvider::QgsLayerTreeViewEmbeddedIndicatorProvider( QgsLayerTreeView *view )
23   : QObject( view )
24   , mLayerTreeView( view )
25 {
26   mIcon = QgsApplication::getThemeIcon( QStringLiteral( "/mIndicatorEmbedded.svg" ) );
27 
28   QgsLayerTree *tree = mLayerTreeView->layerTreeModel()->rootGroup();
29   onAddedChildren( tree, 0, tree->children().count() - 1 );
30 
31   connect( tree, &QgsLayerTree::addedChildren, this, &QgsLayerTreeViewEmbeddedIndicatorProvider::onAddedChildren );
32 }
33 
onAddedChildren(QgsLayerTreeNode * node,int indexFrom,int indexTo)34 void QgsLayerTreeViewEmbeddedIndicatorProvider::onAddedChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo )
35 {
36   // recursively populate indicators
37   QList<QgsLayerTreeNode *> children = node->children();
38   for ( int i = indexFrom; i <= indexTo; ++i )
39   {
40     QgsLayerTreeNode *childNode = children[i];
41 
42     if ( QgsLayerTree::isGroup( childNode ) )
43     {
44       onAddedChildren( childNode, 0, childNode->children().count() - 1 );
45       if ( childNode->customProperty( QStringLiteral( "embedded" ) ).toInt() )
46       {
47         addIndicatorForEmbeddedLayer( childNode );
48       }
49     }
50     else if ( QgsLayerTree::isLayer( childNode ) && childNode->customProperty( QStringLiteral( "embedded" ) ).toInt() )
51     {
52       addIndicatorForEmbeddedLayer( childNode );
53     }
54   }
55 }
56 
newIndicator(const QString & project)57 std::unique_ptr< QgsLayerTreeViewIndicator > QgsLayerTreeViewEmbeddedIndicatorProvider::newIndicator( const QString &project )
58 {
59   std::unique_ptr< QgsLayerTreeViewIndicator > indicator = qgis::make_unique< QgsLayerTreeViewIndicator >( this );
60   indicator->setIcon( mIcon );
61   indicator->setToolTip( tr( "Embedded from <b>%1</b>" ).arg( project ) );
62   mIndicators.insert( indicator.get() );
63   return indicator;
64 }
65 
addIndicatorForEmbeddedLayer(QgsLayerTreeNode * node)66 void QgsLayerTreeViewEmbeddedIndicatorProvider::addIndicatorForEmbeddedLayer( QgsLayerTreeNode *node )
67 {
68   QString project = node->customProperty( QStringLiteral( "embedded_project" ) ).toString();
69   QgsLayerTreeNode *nextNode = node;
70   while ( project.isEmpty() && nextNode )
71   {
72     nextNode = nextNode->parent();
73     if ( nextNode )
74       project = nextNode->customProperty( QStringLiteral( "embedded_project" ) ).toString();
75   }
76 
77   const QList<QgsLayerTreeViewIndicator *> nodeIndicators = mLayerTreeView->indicators( node );
78 
79   // maybe the indicator exists already
80   for ( QgsLayerTreeViewIndicator *indicator : nodeIndicators )
81   {
82     if ( mIndicators.contains( indicator ) )
83     {
84       return;
85     }
86   }
87 
88   // it does not exist: need to create a new one
89   mLayerTreeView->addIndicator( node, newIndicator( project ).release() );
90 }
91