Skip to content

Commit f633bbc

Browse files
committed
[needs-docs] Use an indicator icon for embedded layers
The previous approach of showing these layers with italic text is not obvious for users to understand, and the interface gives little clues as to why a layer cannot be edited. There's also no way to see what project a layer has been embedded from! So use a new indicator icon in the layer tree to flag embedded layers, with a tooltip showing the path to the embedded project location.
1 parent 404f07d commit f633bbc

4 files changed

+128
-0
lines changed

src/app/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ SET(QGIS_APP_SRCS
5252
qgslabelengineconfigdialog.cpp
5353
qgslabelinggui.cpp
5454
qgslabelingwidget.cpp
55+
qgslayertreeviewembeddedindicator.cpp
5556
qgslayertreeviewfilterindicator.cpp
5657
qgsloadstylefromdbdialog.cpp
5758
qgsmapcanvasdockwidget.cpp
@@ -263,6 +264,7 @@ SET (QGIS_APP_MOC_HDRS
263264
qgslabelinggui.h
264265
qgslabelingwidget.h
265266
qgslabelpropertydialog.h
267+
qgslayertreeviewembeddedindicator.h
266268
qgslayertreeviewfilterindicator.h
267269
qgsloadstylefromdbdialog.h
268270
qgsmapcanvasdockwidget.h

src/app/qgisapp.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ Q_GUI_EXPORT extern int qt_defaultDpiX();
202202
#include "qgslayertreeutils.h"
203203
#include "qgslayertreeview.h"
204204
#include "qgslayertreeviewdefaultactions.h"
205+
#include "qgslayertreeviewembeddedindicator.h"
205206
#include "qgslayertreeviewfilterindicator.h"
206207
#include "qgslayout.h"
207208
#include "qgslayoutatlas.h"
@@ -3726,6 +3727,7 @@ void QgisApp::initLayerTreeView()
37263727
mLayerTreeView->setModel( model );
37273728
mLayerTreeView->setMenuProvider( new QgsAppLayerTreeViewMenuProvider( mLayerTreeView, mMapCanvas ) );
37283729
new QgsLayerTreeViewFilterIndicatorProvider( mLayerTreeView ); // gets parented to the layer view
3730+
new QgsLayerTreeViewEmbeddedIndicatorProvider( mLayerTreeView ); // gets parented to the layer view
37293731

37303732
setupLayerTreeViewFromSettings();
37313733

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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+
21+
QgsLayerTreeViewEmbeddedIndicatorProvider::QgsLayerTreeViewEmbeddedIndicatorProvider( QgsLayerTreeView *view )
22+
: QObject( view )
23+
, mLayerTreeView( view )
24+
{
25+
mIcon = QgsApplication::getThemeIcon( QStringLiteral( "/mIndicatorFilter.svg" ) );
26+
27+
QgsLayerTree *tree = mLayerTreeView->layerTreeModel()->rootGroup();
28+
onAddedChildren( tree, 0, tree->children().count() - 1 );
29+
30+
connect( tree, &QgsLayerTree::addedChildren, this, &QgsLayerTreeViewEmbeddedIndicatorProvider::onAddedChildren );
31+
}
32+
33+
void QgsLayerTreeViewEmbeddedIndicatorProvider::onAddedChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo )
34+
{
35+
// recursively populate indicators
36+
QList<QgsLayerTreeNode *> children = node->children();
37+
for ( int i = indexFrom; i <= indexTo; ++i )
38+
{
39+
QgsLayerTreeNode *childNode = children[i];
40+
41+
if ( QgsLayerTree::isGroup( childNode ) )
42+
{
43+
onAddedChildren( childNode, 0, childNode->children().count() - 1 );
44+
}
45+
else if ( QgsLayerTree::isLayer( childNode ) && childNode->customProperty( QStringLiteral( "embedded" ) ).toInt() )
46+
{
47+
QgsLayerTreeLayer *childLayerNode = QgsLayerTree::toLayer( childNode );
48+
addIndicatorForEmbeddedLayer( childLayerNode );
49+
}
50+
}
51+
}
52+
53+
QgsLayerTreeViewIndicator *QgsLayerTreeViewEmbeddedIndicatorProvider::newIndicator( const QString &project )
54+
{
55+
QgsLayerTreeViewIndicator *indicator = new QgsLayerTreeViewIndicator( this );
56+
indicator->setIcon( mIcon );
57+
indicator->setToolTip( tr( "Embedded from <b>%1</b>" ).arg( project ) );
58+
mIndicators.insert( indicator );
59+
return indicator;
60+
}
61+
62+
void QgsLayerTreeViewEmbeddedIndicatorProvider::addIndicatorForEmbeddedLayer( QgsLayerTreeNode *node )
63+
{
64+
const QList<QgsLayerTreeViewIndicator *> nodeIndicators = mLayerTreeView->indicators( node );
65+
66+
// maybe the indicator exists already
67+
for ( QgsLayerTreeViewIndicator *indicator : nodeIndicators )
68+
{
69+
if ( mIndicators.contains( indicator ) )
70+
{
71+
return;
72+
}
73+
}
74+
75+
// it does not exist: need to create a new one
76+
mLayerTreeView->addIndicator( node, newIndicator( node->customProperty( QStringLiteral( "embedded_project" ) ).toString() ) );
77+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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+
#ifndef QGSLAYERTREEVIEWEMBEDDEDINDICATOR_H
17+
#define QGSLAYERTREEVIEWEMBEDDEDINDICATOR_H
18+
19+
#include "qgslayertreeviewindicator.h"
20+
21+
#include <QSet>
22+
23+
class QgsLayerTreeNode;
24+
class QgsLayerTreeView;
25+
26+
//! Adds indicators showing whether layers are embedded.
27+
class QgsLayerTreeViewEmbeddedIndicatorProvider : public QObject
28+
{
29+
Q_OBJECT
30+
public:
31+
explicit QgsLayerTreeViewEmbeddedIndicatorProvider( QgsLayerTreeView *view );
32+
33+
private slots:
34+
//! Connects to signals of layers newly added to the tree
35+
void onAddedChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo );
36+
37+
private:
38+
QgsLayerTreeViewIndicator *newIndicator( const QString &project );
39+
void addIndicatorForEmbeddedLayer( QgsLayerTreeNode *node );
40+
41+
private:
42+
QgsLayerTreeView *mLayerTreeView = nullptr;
43+
QIcon mIcon;
44+
QSet<QgsLayerTreeViewIndicator *> mIndicators;
45+
};
46+
47+
#endif // QGSLAYERTREEVIEWEMBEDDEDINDICATOR_H

0 commit comments

Comments
 (0)