Skip to content

Commit 276ff97

Browse files
committedApr 14, 2023
When creating new fields, only expose the 'Comment' option for
datasources which support editing comments This support is currently limited to the postgres provider, so exposing the comment field for all other vector layer types is just misleading to users. The comment will be completed discarded without any warning!
1 parent 0d62c65 commit 276ff97

File tree

10 files changed

+136
-55
lines changed

10 files changed

+136
-55
lines changed
 

‎python/core/auto_additions/qgis.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,14 @@
341341
Qgis.FeatureCountState.__doc__ = 'Enumeration of feature count states\n\n.. versionadded:: 3.20\n\n' + '* ``Uncounted``: ' + Qgis.FeatureCountState.Uncounted.__doc__ + '\n' + '* ``UnknownCount``: ' + Qgis.FeatureCountState.UnknownCount.__doc__
342342
# --
343343
Qgis.FeatureCountState.baseClass = Qgis
344+
# monkey patching scoped based enum
345+
Qgis.VectorDataProviderAttributeEditCapability.EditAlias.__doc__ = "Allows editing aliases"
346+
Qgis.VectorDataProviderAttributeEditCapability.EditComment.__doc__ = "Allows editing comments"
347+
Qgis.VectorDataProviderAttributeEditCapability.__doc__ = 'Attribute editing capabilities which may be supported by vector data providers.\n\n.. versionadded:: 3.32\n\n' + '* ``EditAlias``: ' + Qgis.VectorDataProviderAttributeEditCapability.EditAlias.__doc__ + '\n' + '* ``EditComment``: ' + Qgis.VectorDataProviderAttributeEditCapability.EditComment.__doc__
348+
# --
349+
Qgis.VectorDataProviderAttributeEditCapability.baseClass = Qgis
350+
Qgis.VectorDataProviderAttributeEditCapabilities.baseClass = Qgis
351+
VectorDataProviderAttributeEditCapabilities = Qgis # dirty hack since SIP seems to introduce the flags in module
344352
QgsSymbol.SymbolType = Qgis.SymbolType
345353
# monkey patching scoped based enum
346354
QgsSymbol.Marker = Qgis.SymbolType.Marker

‎python/core/auto_generated/qgis.sip.in

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,16 @@ The development version
208208
UnknownCount,
209209
};
210210

211+
enum class VectorDataProviderAttributeEditCapability
212+
{
213+
EditAlias,
214+
EditComment,
215+
};
216+
217+
218+
typedef QFlags<Qgis::VectorDataProviderAttributeEditCapability> VectorDataProviderAttributeEditCapabilities;
219+
220+
211221
enum class SymbolType
212222
{
213223
Marker,
@@ -2053,6 +2063,8 @@ QFlags<Qgis::MapLayerProperty> operator|(Qgis::MapLayerProperty f1, QFlags<Qgis:
20532063

20542064
QFlags<Qgis::DataProviderFlag> operator|(Qgis::DataProviderFlag f1, QFlags<Qgis::DataProviderFlag> f2);
20552065

2066+
QFlags<Qgis::VectorDataProviderAttributeEditCapability> operator|(Qgis::VectorDataProviderAttributeEditCapability f1, QFlags<Qgis::VectorDataProviderAttributeEditCapability> f2);
2067+
20562068
QFlags<Qgis::SnappingType> operator|(Qgis::SnappingType f1, QFlags<Qgis::SnappingType> f2);
20572069

20582070
QFlags<Qgis::PlotToolFlag> operator|(Qgis::PlotToolFlag f1, QFlags<Qgis::PlotToolFlag> f2);

‎python/core/auto_generated/vector/qgsvectordataprovider.sip.in

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,11 +424,22 @@ Returns flags containing the supported capabilities
424424
\note, some capabilities may change depending on whether
425425
a spatial filter is active on this provider, so it may
426426
be prudent to check this value per intended operation.
427+
428+
.. seealso:: :py:func:`attributeEditCapabilities`
427429
%End
428430

429431
QString capabilitiesString() const;
430432
%Docstring
431433
Returns the above in friendly format.
434+
%End
435+
436+
virtual Qgis::VectorDataProviderAttributeEditCapabilities attributeEditCapabilities() const;
437+
%Docstring
438+
Returns the provider's supported attribute editing capabilities.
439+
440+
.. seealso:: :py:func:`capabilities`
441+
442+
.. versionadded:: 3.32
432443
%End
433444

434445
virtual void setEncoding( const QString &e );

‎src/core/qgis.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,27 @@ class CORE_EXPORT Qgis
312312
};
313313
Q_ENUM( FeatureCountState )
314314

315+
/**
316+
* Attribute editing capabilities which may be supported by vector data providers.
317+
*
318+
* \since QGIS 3.32
319+
*/
320+
enum class VectorDataProviderAttributeEditCapability
321+
{
322+
EditAlias = 1 << 0, //!< Allows editing aliases
323+
EditComment = 1 << 1, //!< Allows editing comments
324+
};
325+
326+
Q_ENUM( VectorDataProviderAttributeEditCapability )
327+
328+
/**
329+
* Attribute editing capabilities which may be supported by vector data providers.
330+
*
331+
* \since QGIS 3.32
332+
*/
333+
Q_DECLARE_FLAGS( VectorDataProviderAttributeEditCapabilities, VectorDataProviderAttributeEditCapability )
334+
Q_FLAG( VectorDataProviderAttributeEditCapabilities )
335+
315336
/**
316337
* \brief Symbol types
317338
* \since QGIS 3.20
@@ -3498,6 +3519,7 @@ Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::TextRendererFlags )
34983519
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::HistoryProviderBackends )
34993520
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::MapLayerProperties )
35003521
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::DataProviderFlags )
3522+
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::VectorDataProviderAttributeEditCapabilities )
35013523
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::SnappingTypes )
35023524
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::PlotToolFlags )
35033525
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::ProfileGeneratorFlags )

‎src/core/vector/qgsvectordataprovider.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,11 @@ QString QgsVectorDataProvider::capabilitiesString() const
395395
return abilitiesList.join( QLatin1String( ", " ) );
396396
}
397397

398+
Qgis::VectorDataProviderAttributeEditCapabilities QgsVectorDataProvider::attributeEditCapabilities() const
399+
{
400+
return Qgis::VectorDataProviderAttributeEditCapabilities();
401+
}
402+
398403
int QgsVectorDataProvider::fieldNameIndex( const QString &fieldName ) const
399404
{
400405
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

‎src/core/vector/qgsvectordataprovider.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,8 @@ class CORE_EXPORT QgsVectorDataProvider : public QgsDataProvider, public QgsFeat
409409
* \note, some capabilities may change depending on whether
410410
* a spatial filter is active on this provider, so it may
411411
* be prudent to check this value per intended operation.
412+
*
413+
* \see attributeEditCapabilities()
412414
*/
413415
Q_INVOKABLE virtual QgsVectorDataProvider::Capabilities capabilities() const;
414416

@@ -417,6 +419,14 @@ class CORE_EXPORT QgsVectorDataProvider : public QgsDataProvider, public QgsFeat
417419
*/
418420
QString capabilitiesString() const;
419421

422+
/**
423+
* Returns the provider's supported attribute editing capabilities.
424+
*
425+
* \see capabilities()
426+
* \since QGIS 3.32
427+
*/
428+
virtual Qgis::VectorDataProviderAttributeEditCapabilities attributeEditCapabilities() const;
429+
420430
/**
421431
* Set encoding used for accessing data from layer.
422432
*

‎src/gui/qgsaddattrdialog.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ QgsAddAttrDialog::QgsAddAttrDialog( QgsVectorLayer *vlayer, QWidget *parent, Qt:
3131
connect( mTypeBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsAddAttrDialog::mTypeBox_currentIndexChanged );
3232
connect( mLength, &QSpinBox::editingFinished, this, &QgsAddAttrDialog::mLength_editingFinished );
3333

34-
if ( !vlayer )
34+
if ( !vlayer || !vlayer->dataProvider() )
3535
return;
3636

37+
const Qgis::VectorDataProviderAttributeEditCapabilities attributeEditCapabilities = vlayer->dataProvider()->attributeEditCapabilities();
38+
3739
//fill data types into the combo box
3840
const QList< QgsVectorDataProvider::NativeType > &typelist = vlayer->dataProvider()->nativeTypes();
3941
for ( int i = 0; i < typelist.size(); i++ )
@@ -66,6 +68,12 @@ QgsAddAttrDialog::QgsAddAttrDialog( QgsVectorLayer *vlayer, QWidget *parent, Qt:
6668
mNameEdit->setMaxLength( 10 );
6769

6870
mNameEdit->setFocus();
71+
72+
if ( !( attributeEditCapabilities & Qgis::VectorDataProviderAttributeEditCapability::EditComment ) )
73+
{
74+
mLabelComment->hide();
75+
mCommentEdit->hide();
76+
}
6977
}
7078

7179
void QgsAddAttrDialog::setIllegalFieldNames( const QSet<QString> &names )

‎src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3696,6 +3696,11 @@ QgsVectorDataProvider::Capabilities QgsPostgresProvider::capabilities() const
36963696
return mEnabledCapabilities;
36973697
}
36983698

3699+
Qgis::VectorDataProviderAttributeEditCapabilities QgsPostgresProvider::attributeEditCapabilities() const
3700+
{
3701+
return Qgis::VectorDataProviderAttributeEditCapability::EditComment;
3702+
}
3703+
36993704
QgsFeatureSource::SpatialIndexPresence QgsPostgresProvider::hasSpatialIndex() const
37003705
{
37013706
QgsPostgresProviderConnection conn( mUri.uri(), QVariantMap() );

‎src/providers/postgres/qgspostgresprovider.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ class QgsPostgresProvider final: public QgsVectorDataProvider
181181
bool setSubsetString( const QString &theSQL, bool updateFeatureCount = true ) override;
182182
bool supportsSubsetString() const override { return true; }
183183
QgsVectorDataProvider::Capabilities capabilities() const override;
184+
Qgis::VectorDataProviderAttributeEditCapabilities attributeEditCapabilities() const override;
184185
SpatialIndexPresence hasSpatialIndex() const override;
185186

186187
/**

‎src/ui/qgsaddattrdialogbase.ui

Lines changed: 53 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>245</width>
10-
<height>201</height>
9+
<width>279</width>
10+
<height>236</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
@@ -17,6 +17,16 @@
1717
<bool>true</bool>
1818
</property>
1919
<layout class="QGridLayout" name="gridLayout">
20+
<item row="3" column="0">
21+
<widget class="QLabel" name="label">
22+
<property name="text">
23+
<string>Provider type</string>
24+
</property>
25+
</widget>
26+
</item>
27+
<item row="0" column="1">
28+
<widget class="QLineEdit" name="mNameEdit"/>
29+
</item>
2030
<item row="0" column="0">
2131
<widget class="QLabel" name="textLabel1">
2232
<property name="text">
@@ -27,21 +37,31 @@
2737
</property>
2838
</widget>
2939
</item>
30-
<item row="0" column="1">
31-
<widget class="QLineEdit" name="mNameEdit"/>
32-
</item>
33-
<item row="1" column="0">
34-
<widget class="QLabel" name="textLabel1_2">
40+
<item row="5" column="0">
41+
<widget class="QLabel" name="mPrecLabel">
42+
<property name="toolTip">
43+
<string>Maximum number of digits after the decimal place. For example 123.45 requires a field precision of 2.</string>
44+
</property>
3545
<property name="text">
36-
<string>Comment</string>
46+
<string>Precision</string>
3747
</property>
3848
<property name="buddy">
39-
<cstring>mCommentEdit</cstring>
49+
<cstring>mPrec</cstring>
4050
</property>
4151
</widget>
4252
</item>
43-
<item row="1" column="1">
44-
<widget class="QLineEdit" name="mCommentEdit"/>
53+
<item row="4" column="0">
54+
<widget class="QLabel" name="mLengthLabel">
55+
<property name="toolTip">
56+
<string>Total length of field (including the number of digits after the decimal place for decimal fields).&lt;br&gt;For example 123.45 requires a decimal field length of 5, and 123456 requires an integer field length of 6.</string>
57+
</property>
58+
<property name="text">
59+
<string>Length</string>
60+
</property>
61+
<property name="buddy">
62+
<cstring>mLength</cstring>
63+
</property>
64+
</widget>
4565
</item>
4666
<item row="2" column="0">
4767
<widget class="QLabel" name="textLabel2">
@@ -53,13 +73,10 @@
5373
</property>
5474
</widget>
5575
</item>
56-
<item row="2" column="1">
57-
<widget class="QComboBox" name="mTypeBox"/>
58-
</item>
59-
<item row="3" column="0">
60-
<widget class="QLabel" name="label">
61-
<property name="text">
62-
<string>Provider type</string>
76+
<item row="8" column="1">
77+
<widget class="QDialogButtonBox" name="buttonBox">
78+
<property name="standardButtons">
79+
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
6380
</property>
6481
</widget>
6582
</item>
@@ -73,47 +90,24 @@
7390
</property>
7491
</widget>
7592
</item>
76-
<item row="4" column="0">
77-
<widget class="QLabel" name="mLengthLabel">
93+
<item row="5" column="1">
94+
<widget class="QgsSpinBox" name="mPrec">
7895
<property name="toolTip">
79-
<string>Total length of field (including the number of digits after the decimal place for decimal fields).&lt;br&gt;For example 123.45 requires a decimal field length of 5, and 123456 requires an integer field length of 6.</string>
80-
</property>
81-
<property name="text">
82-
<string>Length</string>
83-
</property>
84-
<property name="buddy">
85-
<cstring>mLength</cstring>
96+
<string>Maximum number of digits after the decimal place. For example 123.45 requires a field precision of 2.</string>
8697
</property>
8798
</widget>
8899
</item>
100+
<item row="2" column="1">
101+
<widget class="QComboBox" name="mTypeBox"/>
102+
</item>
89103
<item row="4" column="1">
90104
<widget class="QgsSpinBox" name="mLength">
91105
<property name="toolTip">
92106
<string>Total length of field (including the number of digits after the decimal place for decimal fields).&lt;br&gt;For example 123.45 requires a decimal field length of 5, and 123456 requires an integer field length of 6.</string>
93107
</property>
94108
</widget>
95109
</item>
96-
<item row="5" column="0">
97-
<widget class="QLabel" name="mPrecLabel">
98-
<property name="toolTip">
99-
<string>Maximum number of digits after the decimal place. For example 123.45 requires a field precision of 2.</string>
100-
</property>
101-
<property name="text">
102-
<string>Precision</string>
103-
</property>
104-
<property name="buddy">
105-
<cstring>mPrec</cstring>
106-
</property>
107-
</widget>
108-
</item>
109-
<item row="5" column="1">
110-
<widget class="QgsSpinBox" name="mPrec">
111-
<property name="toolTip">
112-
<string>Maximum number of digits after the decimal place. For example 123.45 requires a field precision of 2.</string>
113-
</property>
114-
</widget>
115-
</item>
116-
<item row="6" column="1">
110+
<item row="7" column="1">
117111
<spacer name="verticalSpacer">
118112
<property name="orientation">
119113
<enum>Qt::Vertical</enum>
@@ -126,26 +120,31 @@
126120
</property>
127121
</spacer>
128122
</item>
129-
<item row="7" column="1">
130-
<widget class="QDialogButtonBox" name="buttonBox">
131-
<property name="standardButtons">
132-
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
123+
<item row="6" column="0">
124+
<widget class="QLabel" name="mLabelComment">
125+
<property name="text">
126+
<string>Comment</string>
127+
</property>
128+
<property name="buddy">
129+
<cstring>mCommentEdit</cstring>
133130
</property>
134131
</widget>
135132
</item>
133+
<item row="6" column="1">
134+
<widget class="QLineEdit" name="mCommentEdit"/>
135+
</item>
136136
</layout>
137137
</widget>
138+
<layoutdefault spacing="6" margin="11"/>
138139
<customwidgets>
139140
<customwidget>
140141
<class>QgsSpinBox</class>
141142
<extends>QSpinBox</extends>
142143
<header>qgsspinbox.h</header>
143144
</customwidget>
144145
</customwidgets>
145-
<layoutdefault spacing="6" margin="11"/>
146146
<tabstops>
147147
<tabstop>mNameEdit</tabstop>
148-
<tabstop>mCommentEdit</tabstop>
149148
<tabstop>mTypeBox</tabstop>
150149
<tabstop>mLength</tabstop>
151150
<tabstop>mPrec</tabstop>

0 commit comments

Comments
 (0)
Please sign in to comment.