QGIS API Documentation  3.8.0-Zanzibar (11aff65)
qgslayertreeembeddedconfigwidget.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayertreeembeddedconfigwidget.cpp
3  --------------------------------------
4  Date : May 2016
5  Copyright : (C) 2016 by Martin Dobias
6  Email : wonder dot sk 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 
17 
18 #include "qgsmaplayer.h"
20 #include "qgsgui.h"
21 #include <QStringListModel>
22 #include <QStandardItemModel>
23 
25  : QWidget( parent )
26 
27 {
28  setupUi( this );
29 }
30 
32 {
33  mLayer = layer;
34 
35  connect( mBtnAdd, &QAbstractButton::clicked, this, &QgsLayerTreeEmbeddedConfigWidget::onAddClicked );
36  connect( mBtnRemove, &QAbstractButton::clicked, this, &QgsLayerTreeEmbeddedConfigWidget::onRemoveClicked );
37 
38  QStandardItemModel *modelAvailable = new QStandardItemModel( this );
39  QStandardItemModel *modelUsed = new QStandardItemModel( this );
40 
41  // populate available
42  const auto constProviders = QgsGui::layerTreeEmbeddedWidgetRegistry()->providers();
43  for ( const QString &providerId : constProviders )
44  {
46  if ( provider->supportsLayer( mLayer ) )
47  {
48  QStandardItem *item = new QStandardItem( provider->name() );
49  item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
50  item->setData( provider->id(), Qt::UserRole + 1 );
51  modelAvailable->appendRow( item );
52  }
53  }
54  mListAvailable->setModel( modelAvailable );
55 
56  // populate used
57  int widgetsCount = layer->customProperty( QStringLiteral( "embeddedWidgets/count" ), 0 ).toInt();
58  for ( int i = 0; i < widgetsCount; ++i )
59  {
60  QString providerId = layer->customProperty( QStringLiteral( "embeddedWidgets/%1/id" ).arg( i ) ).toString();
61  if ( QgsLayerTreeEmbeddedWidgetProvider *provider = QgsGui::layerTreeEmbeddedWidgetRegistry()->provider( providerId ) )
62  {
63  QStandardItem *item = new QStandardItem( provider->name() );
64  item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
65  item->setData( provider->id(), Qt::UserRole + 1 );
66  modelUsed->appendRow( item );
67  }
68  }
69  mListUsed->setModel( modelUsed );
70 }
71 
72 void QgsLayerTreeEmbeddedConfigWidget::onAddClicked()
73 {
74  if ( !mListAvailable->currentIndex().isValid() )
75  return;
76 
77  QString providerId = mListAvailable->model()->data( mListAvailable->currentIndex(), Qt::UserRole + 1 ).toString();
79  if ( !provider )
80  return;
81 
82  if ( QStandardItemModel *model = qobject_cast<QStandardItemModel *>( mListUsed->model() ) )
83  {
84  QStandardItem *item = new QStandardItem( provider->name() );
85  item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
86  item->setData( provider->id(), Qt::UserRole + 1 );
87  model->appendRow( item );
88  }
89 }
90 
91 void QgsLayerTreeEmbeddedConfigWidget::onRemoveClicked()
92 {
93  if ( !mListUsed->currentIndex().isValid() )
94  return;
95 
96  int row = mListUsed->currentIndex().row();
97  mListUsed->model()->removeRow( row );
98 }
99 
101 {
102  if ( !mLayer )
103  return;
104 
105  // clear old properties
106  int widgetsCount = mLayer->customProperty( QStringLiteral( "embeddedWidgets/count" ), 0 ).toInt();
107  for ( int i = 0; i < widgetsCount; ++i )
108  {
109  mLayer->removeCustomProperty( QStringLiteral( "embeddedWidgets/%1/id" ).arg( i ) );
110  }
111 
112  // setup new properties
113  int newCount = mListUsed->model()->rowCount();
114  mLayer->setCustomProperty( QStringLiteral( "embeddedWidgets/count" ), newCount );
115  for ( int i = 0; i < newCount; ++i )
116  {
117  QString providerId = mListUsed->model()->data( mListUsed->model()->index( i, 0 ), Qt::UserRole + 1 ).toString();
118  mLayer->setCustomProperty( QStringLiteral( "embeddedWidgets/%1/id" ).arg( i ), providerId );
119  }
120 }
Base class for all map layer types.
Definition: qgsmaplayer.h:78
void setCustomProperty(const QString &key, const QVariant &value)
Set a custom property for layer.
virtual QString id() const =0
Unique name of the provider (among other providers)
virtual bool supportsLayer(QgsMapLayer *layer)=0
Whether it makes sense to use this widget for a particular layer.
static QgsLayerTreeEmbeddedWidgetRegistry * layerTreeEmbeddedWidgetRegistry()
Returns the global layer tree embedded widget registry, used for registering widgets that may be embe...
Definition: qgsgui.cpp:74
Provider interface to be implemented in order to introduce new kinds of embedded widgets for use in l...
void applyToLayer()
Store changes made in the widget to the layer.
QStringList providers() const
Returns list of all registered providers.
void removeCustomProperty(const QString &key)
Remove a custom property from layer.
QgsLayerTreeEmbeddedConfigWidget(QWidget *parent=nullptr)
A widget to configure layer tree embedded widgets for a particular map layer.
QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
void setLayer(QgsMapLayer *layer)
Initialize widget with a map layer.
QgsLayerTreeEmbeddedWidgetProvider * provider(const QString &providerId) const
Gets provider object from the provider&#39;s ID.
virtual QString name() const =0
Human readable name - may be translatable with tr()