Skip to content

Commit 69da2b3

Browse files
committed
Layer tree view interface for context menu configuration
1 parent 6a5b752 commit 69da2b3

File tree

5 files changed

+122
-30
lines changed

5 files changed

+122
-30
lines changed

src/app/qgisapp.cpp

+60
Original file line numberDiff line numberDiff line change
@@ -2173,6 +2173,64 @@ QgsMessageBar* QgisApp::messageBar()
21732173
return mInfoBar;
21742174
}
21752175

2176+
2177+
2178+
2179+
// ===========
2180+
// TODO: move to a separate file
2181+
#include "qgslayertreenode.h"
2182+
#include "qgslayertreeviewdefaultactions.h"
2183+
2184+
class QgsAppLayerTreeViewMenuProvider : public QgsLayerTreeViewMenuProvider
2185+
{
2186+
public:
2187+
QgsAppLayerTreeViewMenuProvider(QgsLayerTreeView* view, QgsMapCanvas* canvas) : mView(view), mCanvas(canvas) {}
2188+
2189+
QMenu* createContextMenu();
2190+
2191+
protected:
2192+
QgsLayerTreeView* mView;
2193+
QgsMapCanvas* mCanvas;
2194+
};
2195+
2196+
QMenu* QgsAppLayerTreeViewMenuProvider::createContextMenu()
2197+
{
2198+
QMenu* menu = new QMenu;
2199+
2200+
QgsLayerTreeViewDefaultActions* actions = mView->defaultActions();
2201+
2202+
QModelIndex idx = mView->currentIndex();
2203+
if (!idx.isValid())
2204+
{
2205+
// global menu
2206+
menu->addAction( actions->actionAddGroup(menu) );
2207+
}
2208+
else if (QgsLayerTreeNode* node = mView->layerTreeModel()->index2node(idx))
2209+
{
2210+
// layer or group selected
2211+
if (node->nodeType() == QgsLayerTreeNode::NodeGroup)
2212+
{
2213+
menu->addAction( actions->actionZoomToGroup(mCanvas, menu) );
2214+
menu->addAction( actions->actionAddGroup(menu) );
2215+
}
2216+
else if (node->nodeType() == QgsLayerTreeNode::NodeLayer)
2217+
{
2218+
menu->addAction( actions->actionZoomToLayer(mCanvas, menu) );
2219+
menu->addAction( actions->actionShowInOverview(menu) );
2220+
}
2221+
2222+
menu->addAction( actions->actionRemoveGroupOrLayer(menu) );
2223+
menu->addAction( actions->actionRenameGroupOrLayer(menu) );
2224+
}
2225+
else
2226+
{
2227+
// symbology item?
2228+
}
2229+
2230+
return menu;
2231+
}
2232+
2233+
21762234
void QgisApp::initLayerTreeView()
21772235
{
21782236
mLayerTreeDock = new QDockWidget( tr( "Layers NEW" ), this );
@@ -2184,11 +2242,13 @@ void QgisApp::initLayerTreeView()
21842242

21852243
mLayerTreeView = new QgsLayerTreeView( this );
21862244
mLayerTreeView->setModel( model );
2245+
mLayerTreeView->setMenuProvider( new QgsAppLayerTreeViewMenuProvider(mLayerTreeView, mMapCanvas) );
21872246

21882247
mLayerTreeDock->setWidget( mLayerTreeView );
21892248
addDockWidget( Qt::LeftDockWidgetArea, mLayerTreeDock );
21902249
}
21912250

2251+
21922252
void QgisApp::initLegend()
21932253
{
21942254
mMapLegend->setWhatsThis( tr( "Map legend that displays all the layers currently on the map canvas. Click on the check box to turn a layer on or off. Double click on a layer in the legend to customize its appearance and set other properties." ) );

src/gui/layertree/qgslayertreeview.cpp

+18-23
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ QgsLayerTreeView::QgsLayerTreeView(QWidget *parent)
1111
: QTreeView(parent)
1212
, mCurrentLayer(0)
1313
, mDefaultActions(0)
14+
, mMenuProvider(0)
1415
{
1516
setHeaderHidden(true);
1617

@@ -24,6 +25,11 @@ QgsLayerTreeView::QgsLayerTreeView(QWidget *parent)
2425
connect(this, SIGNAL(expanded(QModelIndex)), this, SLOT(updateExpandedStateToNode(QModelIndex)));
2526
}
2627

28+
QgsLayerTreeView::~QgsLayerTreeView()
29+
{
30+
delete mMenuProvider;
31+
}
32+
2733
void QgsLayerTreeView::setModel(QAbstractItemModel* model)
2834
{
2935
if (!qobject_cast<QgsLayerTreeModel*>(model))
@@ -50,6 +56,12 @@ QgsLayerTreeViewDefaultActions* QgsLayerTreeView::defaultActions()
5056
return mDefaultActions;
5157
}
5258

59+
void QgsLayerTreeView::setMenuProvider(QgsLayerTreeViewMenuProvider* menuProvider)
60+
{
61+
delete mMenuProvider;
62+
mMenuProvider = menuProvider;
63+
}
64+
5365
QgsMapLayer* QgsLayerTreeView::currentLayer() const
5466
{
5567
return mCurrentLayer;
@@ -67,34 +79,17 @@ void QgsLayerTreeView::setCurrentLayer(QgsMapLayer* layer)
6779

6880
void QgsLayerTreeView::contextMenuEvent(QContextMenuEvent *event)
6981
{
70-
QMenu menu;
82+
if (!mMenuProvider)
83+
return;
7184

7285
QModelIndex idx = indexAt(event->pos());
7386
if (!idx.isValid())
74-
{
7587
setCurrentIndex(QModelIndex());
7688

77-
menu.addAction( defaultActions()->actionAddGroup(&menu) );
78-
}
79-
else
80-
{
81-
QgsLayerTreeNode* node = layerTreeModel()->index2node(idx);
82-
if (!node)
83-
return; // probably a symbology item
84-
85-
if (node->nodeType() == QgsLayerTreeNode::NodeGroup)
86-
menu.addAction( defaultActions()->actionAddGroup(&menu) );
87-
else if (node->nodeType() == QgsLayerTreeNode::NodeLayer)
88-
{
89-
// TODO menu.addAction( defaultActions()->actionZoomToLayer(canvas, &menu) );
90-
menu.addAction( defaultActions()->actionShowInOverview(&menu) ); // TODO: should be custom action
91-
}
92-
93-
menu.addAction( defaultActions()->actionRemoveGroupOrLayer(&menu) );
94-
menu.addAction( defaultActions()->actionRenameGroupOrLayer(&menu) );
95-
}
96-
97-
menu.exec(mapToGlobal(event->pos()));
89+
QMenu* menu = mMenuProvider->createContextMenu();
90+
if (menu)
91+
menu->exec(mapToGlobal(event->pos()));
92+
delete menu;
9893
}
9994

10095

src/gui/layertree/qgslayertreeview.h

+15
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,25 @@ class QgsLayerTreeGroup;
77
class QgsLayerTreeModel;
88
class QgsLayerTreeNode;
99
class QgsLayerTreeViewDefaultActions;
10+
class QgsLayerTreeViewMenuProvider;
1011
class QgsMapLayer;
1112

1213
class GUI_EXPORT QgsLayerTreeView : public QTreeView
1314
{
1415
Q_OBJECT
1516
public:
1617
explicit QgsLayerTreeView(QWidget *parent = 0);
18+
~QgsLayerTreeView();
1719

1820
virtual void setModel(QAbstractItemModel* model);
1921

2022
QgsLayerTreeModel* layerTreeModel() const;
2123

2224
QgsLayerTreeViewDefaultActions* defaultActions();
2325

26+
void setMenuProvider(QgsLayerTreeViewMenuProvider* menuProvider); // takes ownership
27+
QgsLayerTreeViewMenuProvider* menuProvider() const { return mMenuProvider; }
28+
2429
QgsMapLayer* currentLayer() const;
2530
void setCurrentLayer(QgsMapLayer* layer);
2631

@@ -51,6 +56,16 @@ protected slots:
5156
QgsMapLayer* mCurrentLayer;
5257

5358
QgsLayerTreeViewDefaultActions* mDefaultActions;
59+
QgsLayerTreeViewMenuProvider* mMenuProvider;
60+
};
61+
62+
/** interface to allow custom menus */
63+
class GUI_EXPORT QgsLayerTreeViewMenuProvider
64+
{
65+
public:
66+
virtual ~QgsLayerTreeViewMenuProvider() {}
67+
68+
virtual QMenu* createContextMenu() = 0;
5469
};
5570

5671

src/gui/layertree/qgslayertreeviewdefaultactions.cpp

+26-7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "qgslayertreenode.h"
66
#include "qgslayertreeview.h"
77
#include "qgsmapcanvas.h"
8+
#include "qgsmaplayerregistry.h"
89
#include "qgsvectorlayer.h"
910

1011
#include <QAction>
@@ -24,7 +25,7 @@ QAction* QgsLayerTreeViewDefaultActions::actionAddGroup(QObject* parent)
2425

2526
QAction* QgsLayerTreeViewDefaultActions::actionRemoveGroupOrLayer(QObject* parent)
2627
{
27-
QAction* a = new QAction(tr("Remove"), parent);
28+
QAction* a = new QAction(QgsApplication::getThemeIcon( "/mActionRemoveLayer.svg" ), tr("&Remove"), parent);
2829
connect(a, SIGNAL(triggered()), this, SLOT(removeGroupOrLayer()));
2930
return a;
3031
}
@@ -35,7 +36,7 @@ QAction* QgsLayerTreeViewDefaultActions::actionShowInOverview(QObject* parent)
3536
if (!node)
3637
return 0;
3738

38-
QAction* a = new QAction(tr("Show in overview"), parent);
39+
QAction* a = new QAction(tr("&Show in overview"), parent);
3940
connect(a, SIGNAL(triggered()), this, SLOT(showInOverview()));
4041
a->setCheckable(true);
4142
a->setChecked(node->customProperty("overview", 0).toInt());
@@ -52,12 +53,21 @@ QAction* QgsLayerTreeViewDefaultActions::actionRenameGroupOrLayer(QObject* paren
5253
QAction* QgsLayerTreeViewDefaultActions::actionZoomToLayer(QgsMapCanvas* canvas, QObject* parent)
5354
{
5455
QAction* a = new QAction(QgsApplication::getThemeIcon( "/mActionZoomToLayer.svg" ),
55-
tr("&Zoom to Layer Extent"), parent);
56+
tr("&Zoom to Layer"), parent);
5657
a->setData(QVariant::fromValue(reinterpret_cast<void*>(canvas)));
5758
connect(a, SIGNAL(triggered()), this, SLOT(zoomToLayer()));
5859
return a;
5960
}
6061

62+
QAction* QgsLayerTreeViewDefaultActions::actionZoomToGroup(QgsMapCanvas* canvas, QObject* parent)
63+
{
64+
QAction* a = new QAction(QgsApplication::getThemeIcon( "/mActionZoomToLayer.svg" ),
65+
tr("&Zoom to Group"), parent);
66+
a->setData(QVariant::fromValue(reinterpret_cast<void*>(canvas)));
67+
connect(a, SIGNAL(triggered()), this, SLOT(zoomToGroup()));
68+
return a;
69+
}
70+
6171
void QgsLayerTreeViewDefaultActions::addGroup()
6272
{
6373
QgsLayerTreeGroup* group = mView->currentGroupNode();
@@ -82,10 +92,6 @@ void QgsLayerTreeViewDefaultActions::removeGroupOrLayer()
8292

8393
void QgsLayerTreeViewDefaultActions::renameGroupOrLayer()
8494
{
85-
/*QgsLayerTreeNode* node = mView->currentNode();
86-
if (!node)
87-
return;*/
88-
8995
mView->edit(mView->currentIndex());
9096
}
9197

@@ -112,6 +118,18 @@ void QgsLayerTreeViewDefaultActions::zoomToLayer()
112118
zoomToLayers(canvas, layers);
113119
}
114120

121+
void QgsLayerTreeViewDefaultActions::zoomToGroup()
122+
{
123+
QAction* s = qobject_cast<QAction*>(sender());
124+
QgsMapCanvas* canvas = reinterpret_cast<QgsMapCanvas*>(s->data().value<void*>());
125+
126+
QList<QgsMapLayer*> layers;
127+
foreach (QString layerId, mView->currentGroupNode()->childLayerIds())
128+
layers << QgsMapLayerRegistry::instance()->mapLayer(layerId);
129+
130+
zoomToLayers(canvas, layers);
131+
}
132+
115133

116134
void QgsLayerTreeViewDefaultActions::zoomToLayers(QgsMapCanvas* canvas, const QList<QgsMapLayer*>& layers)
117135
{
@@ -148,4 +166,5 @@ void QgsLayerTreeViewDefaultActions::zoomToLayers(QgsMapCanvas* canvas, const QL
148166

149167
//zoom to bounding box
150168
canvas->setExtent( extent );
169+
canvas->refresh();
151170
}

src/gui/layertree/qgslayertreeviewdefaultactions.h

+3
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,16 @@ class GUI_EXPORT QgsLayerTreeViewDefaultActions : public QObject
2121
QAction* actionRenameGroupOrLayer(QObject* parent = 0);
2222

2323
QAction* actionZoomToLayer(QgsMapCanvas* canvas, QObject* parent = 0);
24+
QAction* actionZoomToGroup(QgsMapCanvas* canvas, QObject* parent = 0);
25+
// TODO: zoom to selected
2426

2527
protected slots:
2628
void addGroup();
2729
void removeGroupOrLayer();
2830
void renameGroupOrLayer();
2931
void showInOverview();
3032
void zoomToLayer();
33+
void zoomToGroup();
3134

3235
protected:
3336
void zoomToLayers(QgsMapCanvas* canvas, const QList<QgsMapLayer*>& layers);

0 commit comments

Comments
 (0)