@@ -24,6 +24,7 @@ QgsLayerCapabilitiesModel::QgsLayerCapabilitiesModel( QgsProject *project, QObje
24
24
: QSortFilterProxyModel( parent )
25
25
{
26
26
mNonIdentifiableLayers = project->nonIdentifiableLayers ();
27
+ mRequiredLayers = project->requiredLayers ();
27
28
28
29
const QMap<QString, QgsMapLayer *> &mapLayers = QgsProject::instance ()->mapLayers ();
29
30
for ( QMap<QString, QgsMapLayer *>::const_iterator it = mapLayers.constBegin (); it != mapLayers.constEnd (); ++it )
@@ -71,6 +72,11 @@ QStringList QgsLayerCapabilitiesModel::nonIdentifiableLayers() const
71
72
return mNonIdentifiableLayers ;
72
73
}
73
74
75
+ QSet<QgsMapLayer *> QgsLayerCapabilitiesModel::requiredLayers () const
76
+ {
77
+ return mRequiredLayers ;
78
+ }
79
+
74
80
bool QgsLayerCapabilitiesModel::readOnly ( QgsMapLayer *layer ) const
75
81
{
76
82
return mReadOnlyLayers .value ( layer, true );
@@ -84,7 +90,7 @@ bool QgsLayerCapabilitiesModel::searchable( QgsMapLayer *layer ) const
84
90
int QgsLayerCapabilitiesModel::columnCount ( const QModelIndex &parent ) const
85
91
{
86
92
Q_UNUSED ( parent );
87
- return 4 ;
93
+ return 5 ;
88
94
}
89
95
90
96
QVariant QgsLayerCapabilitiesModel::headerData ( int section, Qt::Orientation orientation, int role ) const
@@ -95,14 +101,31 @@ QVariant QgsLayerCapabilitiesModel::headerData( int section, Qt::Orientation ori
95
101
{
96
102
switch ( section )
97
103
{
98
- case 0 :
104
+ case LayerColumn :
99
105
return tr ( " Layer" );
100
- case 1 :
106
+ case IdentifiableColumn :
101
107
return tr ( " Identifiable" );
102
- case 2 :
108
+ case ReadOnlyColumn :
103
109
return tr ( " Read-only" );
104
- case 3 :
110
+ case SearchableColumn :
105
111
return tr ( " Searchable" );
112
+ case RequiredColumn:
113
+ return tr ( " Required" );
114
+ default :
115
+ return QVariant ();
116
+ }
117
+ }
118
+ if ( role == Qt::ToolTipRole )
119
+ {
120
+ switch ( section )
121
+ {
122
+ case LayerColumn:
123
+ case IdentifiableColumn:
124
+ case ReadOnlyColumn:
125
+ case SearchableColumn:
126
+ return QVariant ();
127
+ case RequiredColumn:
128
+ return tr ( " Layers which are protected from inadvertent removal from the project." );
106
129
default :
107
130
return QVariant ();
108
131
}
@@ -158,6 +181,10 @@ Qt::ItemFlags QgsLayerCapabilitiesModel::flags( const QModelIndex &idx ) const
158
181
return nullptr ;
159
182
}
160
183
}
184
+ else if ( idx.column () == RequiredColumn )
185
+ {
186
+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsUserCheckable;
187
+ }
161
188
}
162
189
return nullptr ;
163
190
}
@@ -243,6 +270,10 @@ QVariant QgsLayerCapabilitiesModel::data( const QModelIndex &idx, int role ) con
243
270
if ( layer->type () == QgsMapLayer::VectorLayer )
244
271
return mSearchableLayers .value ( layer, true ) ? trueValue : falseValue;
245
272
}
273
+ else if ( idx.column () == RequiredColumn )
274
+ {
275
+ return mRequiredLayers .contains ( layer ) ? trueValue : falseValue;
276
+ }
246
277
}
247
278
}
248
279
@@ -288,6 +319,17 @@ bool QgsLayerCapabilitiesModel::setData( const QModelIndex &index, const QVarian
288
319
return true ;
289
320
}
290
321
}
322
+ else if ( index .column () == RequiredColumn )
323
+ {
324
+ bool required = value == Qt::Checked;
325
+ bool containsLayer = mRequiredLayers .contains ( layer );
326
+ if ( containsLayer && !required )
327
+ mRequiredLayers .remove ( layer );
328
+ if ( !containsLayer && required )
329
+ mRequiredLayers .insert ( layer );
330
+ emit dataChanged ( index , index );
331
+ return true ;
332
+ }
291
333
}
292
334
}
293
335
return false ;
0 commit comments