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