Navigation Menu

Skip to content

Commit

Permalink
When creating new fields, only expose the 'Comment' option for
Browse files Browse the repository at this point in the history
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!
  • Loading branch information
nyalldawson committed Apr 14, 2023
1 parent 0d62c65 commit 276ff97
Show file tree
Hide file tree
Showing 10 changed files with 136 additions and 55 deletions.
8 changes: 8 additions & 0 deletions python/core/auto_additions/qgis.py
Expand Up @@ -341,6 +341,14 @@
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__
# --
Qgis.FeatureCountState.baseClass = Qgis
# monkey patching scoped based enum
Qgis.VectorDataProviderAttributeEditCapability.EditAlias.__doc__ = "Allows editing aliases"
Qgis.VectorDataProviderAttributeEditCapability.EditComment.__doc__ = "Allows editing comments"
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__
# --
Qgis.VectorDataProviderAttributeEditCapability.baseClass = Qgis
Qgis.VectorDataProviderAttributeEditCapabilities.baseClass = Qgis
VectorDataProviderAttributeEditCapabilities = Qgis # dirty hack since SIP seems to introduce the flags in module
QgsSymbol.SymbolType = Qgis.SymbolType
# monkey patching scoped based enum
QgsSymbol.Marker = Qgis.SymbolType.Marker
Expand Down
12 changes: 12 additions & 0 deletions python/core/auto_generated/qgis.sip.in
Expand Up @@ -208,6 +208,16 @@ The development version
UnknownCount,
};

enum class VectorDataProviderAttributeEditCapability
{
EditAlias,
EditComment,
};


typedef QFlags<Qgis::VectorDataProviderAttributeEditCapability> VectorDataProviderAttributeEditCapabilities;


enum class SymbolType
{
Marker,
Expand Down Expand Up @@ -2053,6 +2063,8 @@ QFlags<Qgis::MapLayerProperty> operator|(Qgis::MapLayerProperty f1, QFlags<Qgis:

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

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

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

QFlags<Qgis::PlotToolFlag> operator|(Qgis::PlotToolFlag f1, QFlags<Qgis::PlotToolFlag> f2);
Expand Down
11 changes: 11 additions & 0 deletions python/core/auto_generated/vector/qgsvectordataprovider.sip.in
Expand Up @@ -424,11 +424,22 @@ Returns flags containing the supported capabilities
\note, some capabilities may change depending on whether
a spatial filter is active on this provider, so it may
be prudent to check this value per intended operation.

.. seealso:: :py:func:`attributeEditCapabilities`
%End

QString capabilitiesString() const;
%Docstring
Returns the above in friendly format.
%End

virtual Qgis::VectorDataProviderAttributeEditCapabilities attributeEditCapabilities() const;
%Docstring
Returns the provider's supported attribute editing capabilities.

.. seealso:: :py:func:`capabilities`

.. versionadded:: 3.32
%End

virtual void setEncoding( const QString &e );
Expand Down
22 changes: 22 additions & 0 deletions src/core/qgis.h
Expand Up @@ -312,6 +312,27 @@ class CORE_EXPORT Qgis
};
Q_ENUM( FeatureCountState )

/**
* Attribute editing capabilities which may be supported by vector data providers.
*
* \since QGIS 3.32
*/
enum class VectorDataProviderAttributeEditCapability
{
EditAlias = 1 << 0, //!< Allows editing aliases
EditComment = 1 << 1, //!< Allows editing comments
};

Q_ENUM( VectorDataProviderAttributeEditCapability )

/**
* Attribute editing capabilities which may be supported by vector data providers.
*
* \since QGIS 3.32
*/
Q_DECLARE_FLAGS( VectorDataProviderAttributeEditCapabilities, VectorDataProviderAttributeEditCapability )
Q_FLAG( VectorDataProviderAttributeEditCapabilities )

/**
* \brief Symbol types
* \since QGIS 3.20
Expand Down Expand Up @@ -3498,6 +3519,7 @@ Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::TextRendererFlags )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::HistoryProviderBackends )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::MapLayerProperties )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::DataProviderFlags )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::VectorDataProviderAttributeEditCapabilities )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::SnappingTypes )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::PlotToolFlags )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::ProfileGeneratorFlags )
Expand Down
5 changes: 5 additions & 0 deletions src/core/vector/qgsvectordataprovider.cpp
Expand Up @@ -395,6 +395,11 @@ QString QgsVectorDataProvider::capabilitiesString() const
return abilitiesList.join( QLatin1String( ", " ) );
}

Qgis::VectorDataProviderAttributeEditCapabilities QgsVectorDataProvider::attributeEditCapabilities() const
{
return Qgis::VectorDataProviderAttributeEditCapabilities();
}

int QgsVectorDataProvider::fieldNameIndex( const QString &fieldName ) const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
Expand Down
10 changes: 10 additions & 0 deletions src/core/vector/qgsvectordataprovider.h
Expand Up @@ -409,6 +409,8 @@ class CORE_EXPORT QgsVectorDataProvider : public QgsDataProvider, public QgsFeat
* \note, some capabilities may change depending on whether
* a spatial filter is active on this provider, so it may
* be prudent to check this value per intended operation.
*
* \see attributeEditCapabilities()
*/
Q_INVOKABLE virtual QgsVectorDataProvider::Capabilities capabilities() const;

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

/**
* Returns the provider's supported attribute editing capabilities.
*
* \see capabilities()
* \since QGIS 3.32
*/
virtual Qgis::VectorDataProviderAttributeEditCapabilities attributeEditCapabilities() const;

/**
* Set encoding used for accessing data from layer.
*
Expand Down
10 changes: 9 additions & 1 deletion src/gui/qgsaddattrdialog.cpp
Expand Up @@ -31,9 +31,11 @@ QgsAddAttrDialog::QgsAddAttrDialog( QgsVectorLayer *vlayer, QWidget *parent, Qt:
connect( mTypeBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsAddAttrDialog::mTypeBox_currentIndexChanged );
connect( mLength, &QSpinBox::editingFinished, this, &QgsAddAttrDialog::mLength_editingFinished );

if ( !vlayer )
if ( !vlayer || !vlayer->dataProvider() )
return;

const Qgis::VectorDataProviderAttributeEditCapabilities attributeEditCapabilities = vlayer->dataProvider()->attributeEditCapabilities();

//fill data types into the combo box
const QList< QgsVectorDataProvider::NativeType > &typelist = vlayer->dataProvider()->nativeTypes();
for ( int i = 0; i < typelist.size(); i++ )
Expand Down Expand Up @@ -66,6 +68,12 @@ QgsAddAttrDialog::QgsAddAttrDialog( QgsVectorLayer *vlayer, QWidget *parent, Qt:
mNameEdit->setMaxLength( 10 );

mNameEdit->setFocus();

if ( !( attributeEditCapabilities & Qgis::VectorDataProviderAttributeEditCapability::EditComment ) )
{
mLabelComment->hide();
mCommentEdit->hide();
}
}

void QgsAddAttrDialog::setIllegalFieldNames( const QSet<QString> &names )
Expand Down
5 changes: 5 additions & 0 deletions src/providers/postgres/qgspostgresprovider.cpp
Expand Up @@ -3696,6 +3696,11 @@ QgsVectorDataProvider::Capabilities QgsPostgresProvider::capabilities() const
return mEnabledCapabilities;
}

Qgis::VectorDataProviderAttributeEditCapabilities QgsPostgresProvider::attributeEditCapabilities() const
{
return Qgis::VectorDataProviderAttributeEditCapability::EditComment;
}

QgsFeatureSource::SpatialIndexPresence QgsPostgresProvider::hasSpatialIndex() const
{
QgsPostgresProviderConnection conn( mUri.uri(), QVariantMap() );
Expand Down
1 change: 1 addition & 0 deletions src/providers/postgres/qgspostgresprovider.h
Expand Up @@ -181,6 +181,7 @@ class QgsPostgresProvider final: public QgsVectorDataProvider
bool setSubsetString( const QString &theSQL, bool updateFeatureCount = true ) override;
bool supportsSubsetString() const override { return true; }
QgsVectorDataProvider::Capabilities capabilities() const override;
Qgis::VectorDataProviderAttributeEditCapabilities attributeEditCapabilities() const override;
SpatialIndexPresence hasSpatialIndex() const override;

/**
Expand Down
107 changes: 53 additions & 54 deletions src/ui/qgsaddattrdialogbase.ui
Expand Up @@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>245</width>
<height>201</height>
<width>279</width>
<height>236</height>
</rect>
</property>
<property name="windowTitle">
Expand All @@ -17,6 +17,16 @@
<bool>true</bool>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="3" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Provider type</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="mNameEdit"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="textLabel1">
<property name="text">
Expand All @@ -27,21 +37,31 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="mNameEdit"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="textLabel1_2">
<item row="5" column="0">
<widget class="QLabel" name="mPrecLabel">
<property name="toolTip">
<string>Maximum number of digits after the decimal place. For example 123.45 requires a field precision of 2.</string>
</property>
<property name="text">
<string>Comment</string>
<string>Precision</string>
</property>
<property name="buddy">
<cstring>mCommentEdit</cstring>
<cstring>mPrec</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="mCommentEdit"/>
<item row="4" column="0">
<widget class="QLabel" name="mLengthLabel">
<property name="toolTip">
<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>
</property>
<property name="text">
<string>Length</string>
</property>
<property name="buddy">
<cstring>mLength</cstring>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="textLabel2">
Expand All @@ -53,13 +73,10 @@
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="mTypeBox"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Provider type</string>
<item row="8" column="1">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
Expand All @@ -73,47 +90,24 @@
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="mLengthLabel">
<item row="5" column="1">
<widget class="QgsSpinBox" name="mPrec">
<property name="toolTip">
<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>
</property>
<property name="text">
<string>Length</string>
</property>
<property name="buddy">
<cstring>mLength</cstring>
<string>Maximum number of digits after the decimal place. For example 123.45 requires a field precision of 2.</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="mTypeBox"/>
</item>
<item row="4" column="1">
<widget class="QgsSpinBox" name="mLength">
<property name="toolTip">
<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>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="mPrecLabel">
<property name="toolTip">
<string>Maximum number of digits after the decimal place. For example 123.45 requires a field precision of 2.</string>
</property>
<property name="text">
<string>Precision</string>
</property>
<property name="buddy">
<cstring>mPrec</cstring>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QgsSpinBox" name="mPrec">
<property name="toolTip">
<string>Maximum number of digits after the decimal place. For example 123.45 requires a field precision of 2.</string>
</property>
</widget>
</item>
<item row="6" column="1">
<item row="7" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
Expand All @@ -126,26 +120,31 @@
</property>
</spacer>
</item>
<item row="7" column="1">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<item row="6" column="0">
<widget class="QLabel" name="mLabelComment">
<property name="text">
<string>Comment</string>
</property>
<property name="buddy">
<cstring>mCommentEdit</cstring>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="mCommentEdit"/>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>QgsSpinBox</class>
<extends>QSpinBox</extends>
<header>qgsspinbox.h</header>
</customwidget>
</customwidgets>
<layoutdefault spacing="6" margin="11"/>
<tabstops>
<tabstop>mNameEdit</tabstop>
<tabstop>mCommentEdit</tabstop>
<tabstop>mTypeBox</tabstop>
<tabstop>mLength</tabstop>
<tabstop>mPrec</tabstop>
Expand Down

0 comments on commit 276ff97

Please sign in to comment.