Skip to content

Commit 68ddf3b

Browse files
committed
[offline-editing] Add a warning icon and tooltip to WFS sources
Fixes #16753 off-line editing synchronization cripples the original datasource if this is a WFS-T Layer
1 parent 4bc4494 commit 68ddf3b

File tree

2 files changed

+53
-19
lines changed

2 files changed

+53
-19
lines changed

src/plugins/offline_editing/offline_editing_plugin_gui.cpp

Lines changed: 52 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,33 +30,67 @@
3030
#include <QFileDialog>
3131
#include <QMessageBox>
3232

33-
3433
QgsSelectLayerTreeModel::QgsSelectLayerTreeModel( QgsLayerTree *rootNode, QObject *parent )
3534
: QgsLayerTreeModel( rootNode, parent )
3635
{
3736
setFlag( QgsLayerTreeModel::ShowLegend, false );
3837
setFlag( QgsLayerTreeModel::AllowNodeChangeVisibility, true );
3938
}
4039

40+
int QgsSelectLayerTreeModel::columnCount( const QModelIndex &parent ) const
41+
{
42+
Q_UNUSED( parent );
43+
return QgsLayerTreeModel::columnCount( parent ) + 1;
44+
}
45+
46+
4147
QVariant QgsSelectLayerTreeModel::data( const QModelIndex &index, int role ) const
4248
{
43-
if ( role == Qt::CheckStateRole )
49+
QgsLayerTreeNode *node = index2node( index );
50+
if ( index.column() == 0 )
4451
{
45-
QgsLayerTreeNode *node = index2node( index );
46-
if ( QgsLayerTree::isLayer( node ) )
52+
if ( role == Qt::CheckStateRole )
4753
{
48-
QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node );
49-
return nodeLayer->isVisible();
54+
if ( QgsLayerTree::isLayer( node ) )
55+
{
56+
QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node );
57+
return nodeLayer->isVisible();
58+
}
59+
else if ( QgsLayerTree::isGroup( node ) )
60+
{
61+
QgsLayerTreeGroup *nodeGroup = QgsLayerTree::toGroup( node );
62+
return nodeGroup->isVisible();
63+
}
64+
else
65+
{
66+
return QVariant();
67+
}
5068
}
51-
else if ( QgsLayerTree::isGroup( node ) )
52-
{
53-
QgsLayerTreeGroup *nodeGroup = QgsLayerTree::toGroup( node );
54-
return nodeGroup->isVisible();
55-
}
56-
else
69+
}
70+
else
71+
{
72+
if ( QgsLayerTree::isLayer( node ) && index.column() > 0 )
5773
{
58-
return QVariant();
74+
QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node );
75+
if ( nodeLayer->layer()->dataProvider()->name() == QStringLiteral( "WFS" ) )
76+
{
77+
switch ( role )
78+
{
79+
case Qt::ToolTipRole:
80+
return tr( "The source of this layer is a <b>WFS</b> server.<br>"
81+
"Some WFS layers are not suitable for offline<br>"
82+
"editing due to unreliable/missing primary<br>"
83+
"keys, please check with your system<br>"
84+
"administrator if this WFS layer can<br>"
85+
"be used for offline editing." );
86+
break;
87+
case Qt::DecorationRole:
88+
return QgsApplication::getThemeIcon( "/mIconWarning.svg" );
89+
break;
90+
}
91+
}
5992
}
93+
return QVariant();
6094
}
6195
return QgsLayerTreeModel::data( index, role );
6296
}
@@ -79,6 +113,7 @@ QgsOfflineEditingPluginGui::QgsOfflineEditingPluginGui( QWidget *parent, Qt::Win
79113
QgsLayerTree *rootNode = QgsProject::instance()->layerTreeRoot()->clone();
80114
QgsLayerTreeModel *treeModel = new QgsSelectLayerTreeModel( rootNode, this );
81115
mLayerTree->setModel( treeModel );
116+
mLayerTree->header()->setResizeMode( QHeaderView::ResizeToContents );
82117

83118
connect( mSelectAllButton, &QAbstractButton::clicked, this, &QgsOfflineEditingPluginGui::selectAll );
84119
connect( mDeselectAllButton, &QAbstractButton::clicked, this, &QgsOfflineEditingPluginGui::deSelectAll );
@@ -87,8 +122,8 @@ QgsOfflineEditingPluginGui::QgsOfflineEditingPluginGui( QWidget *parent, Qt::Win
87122
QgsOfflineEditingPluginGui::~QgsOfflineEditingPluginGui()
88123
{
89124
QgsSettings settings;
90-
settings.setValue( QStringLiteral( "Plugin-OfflineEditing/geometry" ), saveGeometry() );
91-
settings.setValue( QStringLiteral( "Plugin-OfflineEditing/offline_data_path" ), mOfflineDataPath );
125+
settings.setValue( QStringLiteral( "OfflineEditing/geometry" ), saveGeometry(), QgsSettings::Section::Plugins );
126+
settings.setValue( QStringLiteral( "OfflineEditing/offline_data_path" ), mOfflineDataPath, QgsSettings::Section::Plugins );
92127
}
93128

94129
QString QgsOfflineEditingPluginGui::offlineDataPath()
@@ -172,8 +207,8 @@ void QgsOfflineEditingPluginGui::showHelp()
172207
void QgsOfflineEditingPluginGui::restoreState()
173208
{
174209
QgsSettings settings;
175-
mOfflineDataPath = settings.value( QStringLiteral( "Plugin-OfflineEditing/offline_data_path" ), QDir::homePath() ).toString();
176-
restoreGeometry( settings.value( QStringLiteral( "Plugin-OfflineEditing/geometry" ) ).toByteArray() );
210+
mOfflineDataPath = settings.value( QStringLiteral( "OfflineEditing/offline_data_path" ), QDir::homePath(), QgsSettings::Section::Plugins ).toString();
211+
restoreGeometry( settings.value( QStringLiteral( "OfflineEditing/geometry" ), QgsSettings::Section::Plugins ).toByteArray() );
177212
}
178213

179214
void QgsOfflineEditingPluginGui::selectAll()

src/plugins/offline_editing/offline_editing_plugin_gui.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,8 @@ class QgsSelectLayerTreeModel : public QgsLayerTreeModel
3030
Q_OBJECT
3131
public:
3232
QgsSelectLayerTreeModel( QgsLayerTree *rootNode, QObject *parent = nullptr );
33-
33+
int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
3434
QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
35-
// bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ) override;
3635
};
3736

3837
class QgsOfflineEditingPluginGui : public QDialog, private Ui::QgsOfflineEditingPluginGuiBase

0 commit comments

Comments
 (0)