Skip to content

Commit 66cecd7

Browse files
committed
Allow changes of visibility from layer order widget
1 parent 393a415 commit 66cecd7

File tree

3 files changed

+44
-5
lines changed

3 files changed

+44
-5
lines changed

src/gui/layertree/qgscustomlayerorderwidget.cpp

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <QMimeData>
66
#include <QVBoxLayout>
77

8+
#include "qgslayertree.h"
89
#include "qgslayertreemapcanvasbridge.h"
910

1011
#include "qgsmaplayer.h"
@@ -26,36 +27,52 @@ class CustomLayerOrderModel : public QAbstractListModel
2627

2728
QVariant data(const QModelIndex &index, int role) const
2829
{
30+
QString id = mOrder.at(index.row());
31+
2932
if (role == Qt::DisplayRole)
3033
{
31-
QString id = mOrder.at(index.row());
3234
QgsMapLayer* layer = QgsMapLayerRegistry::instance()->mapLayer(id);
3335
if (layer)
3436
return layer->name();
3537
}
3638

3739
if (role == Qt::UserRole+1)
3840
{
39-
QString id = mOrder.at(index.row());
4041
QgsMapLayer* layer = QgsMapLayerRegistry::instance()->mapLayer(id);
4142
if (layer)
4243
return layer->id();
4344
}
4445

4546
if (role == Qt::CheckStateRole)
4647
{
47-
// TODO: layer visibility
48-
return Qt::Checked;
48+
QgsLayerTreeLayer* nodeLayer = mBridge->rootGroup()->findLayer(id);
49+
if (nodeLayer)
50+
return nodeLayer->isVisible();
4951
}
5052

5153
return QVariant();
5254
}
5355

56+
bool setData(const QModelIndex &index, const QVariant &value, int role)
57+
{
58+
if (role == Qt::CheckStateRole)
59+
{
60+
QString id = mOrder.at(index.row());
61+
QgsLayerTreeLayer* nodeLayer = mBridge->rootGroup()->findLayer(id);
62+
if (nodeLayer)
63+
{
64+
nodeLayer->setVisible((Qt::CheckState)value.toInt());
65+
return true;
66+
}
67+
}
68+
return false;
69+
}
70+
5471
Qt::ItemFlags flags(const QModelIndex &index) const
5572
{
5673
if (!index.isValid())
5774
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled;
58-
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled; // | Qt::ItemIsUserCheckable;
75+
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsUserCheckable;
5976
}
6077

6178
Qt::DropActions supportedDropActions() const
@@ -128,6 +145,13 @@ class CustomLayerOrderModel : public QAbstractListModel
128145

129146
QStringList order() const { return mOrder; }
130147

148+
void updateLayerVisibility(const QString& layerId)
149+
{
150+
int row = mOrder.indexOf(layerId);
151+
if (row != -1)
152+
emit dataChanged(index(row),index(row));
153+
}
154+
131155
protected:
132156
QgsLayerTreeMapCanvasBridge* mBridge;
133157
QStringList mOrder;
@@ -159,6 +183,8 @@ QgsCustomLayerOrderWidget::QgsCustomLayerOrderWidget(QgsLayerTreeMapCanvasBridge
159183
connect(mModel, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(modelUpdated()));
160184
connect(mModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(modelUpdated()));
161185

186+
connect(bridge->rootGroup(), SIGNAL(visibilityChanged(QgsLayerTreeNode*,Qt::CheckState)), this, SLOT(nodeVisibilityChanged(QgsLayerTreeNode*,Qt::CheckState)));
187+
162188
QVBoxLayout* l = new QVBoxLayout;
163189
l->setMargin( 0 );
164190
l->addWidget( mView );
@@ -179,6 +205,14 @@ void QgsCustomLayerOrderWidget::bridgeCustomLayerOrderChanged(const QStringList&
179205
mModel->refreshModel(mBridge->hasCustomLayerOrder() ? mBridge->customLayerOrder() : mBridge->defaultLayerOrder());
180206
}
181207

208+
void QgsCustomLayerOrderWidget::nodeVisibilityChanged(QgsLayerTreeNode* node, Qt::CheckState state)
209+
{
210+
if (QgsLayerTree::isLayer(node))
211+
{
212+
mModel->updateLayerVisibility(QgsLayerTree::toLayer(node)->layerId());
213+
}
214+
}
215+
182216
void QgsCustomLayerOrderWidget::modelUpdated()
183217
{
184218
mBridge->setCustomLayerOrder(mModel->order());

src/gui/layertree/qgscustomlayerorderwidget.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
class CustomLayerOrderModel;
77
class QgsLayerTreeMapCanvasBridge;
8+
class QgsLayerTreeNode;
89

910
class QCheckBox;
1011
class QListView;
@@ -20,6 +21,7 @@ class GUI_EXPORT QgsCustomLayerOrderWidget : public QWidget
2021
protected slots:
2122
void bridgeHasCustomLayerOrderChanged(bool override);
2223
void bridgeCustomLayerOrderChanged(const QStringList& order);
24+
void nodeVisibilityChanged(QgsLayerTreeNode* node, Qt::CheckState state);
2325

2426
void modelUpdated();
2527

src/gui/layertree/qgslayertreemapcanvasbridge.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ class GUI_EXPORT QgsLayerTreeMapCanvasBridge : public QObject
1919

2020
void clear();
2121

22+
QgsLayerTreeGroup* rootGroup() const { return mRoot; }
23+
QgsMapCanvas* mapCanvas() const { return mCanvas; }
24+
2225
bool hasCustomLayerOrder() const { return mHasCustomLayerOrder; }
2326
QStringList customLayerOrder() const { return mCustomLayerOrder; }
2427

0 commit comments

Comments
 (0)