Skip to content

Commit

Permalink
Introduce Qgis::ProviderStyleStorageCapabilities
Browse files Browse the repository at this point in the history
  • Loading branch information
manisandro committed Sep 18, 2023
1 parent 30753aa commit e2169be
Show file tree
Hide file tree
Showing 25 changed files with 119 additions and 66 deletions.
9 changes: 9 additions & 0 deletions python/core/auto_additions/qgis.py
Expand Up @@ -3647,6 +3647,15 @@
Qgis.DatabaseProviderConnectionCapabilities2.baseClass = Qgis
DatabaseProviderConnectionCapabilities2 = Qgis # dirty hack since SIP seems to introduce the flags in module
# monkey patching scoped based enum
Qgis.ProviderStyleStorageCapability.SaveToDatabase.__doc__ = ""
Qgis.ProviderStyleStorageCapability.LoadFromDatabase.__doc__ = ""
Qgis.ProviderStyleStorageCapability.DeleteFromDatabase.__doc__ = ""
Qgis.ProviderStyleStorageCapability.__doc__ = "The StorageCapability enum represents the style storage operations supported by the provider.\n\n.. versionadded:: 3.34\n\n" + '* ``SaveToDatabase``: ' + Qgis.ProviderStyleStorageCapability.SaveToDatabase.__doc__ + '\n' + '* ``LoadFromDatabase``: ' + Qgis.ProviderStyleStorageCapability.LoadFromDatabase.__doc__ + '\n' + '* ``DeleteFromDatabase``: ' + Qgis.ProviderStyleStorageCapability.DeleteFromDatabase.__doc__
# --
Qgis.ProviderStyleStorageCapability.baseClass = Qgis
Qgis.ProviderStyleStorageCapabilities.baseClass = Qgis
ProviderStyleStorageCapabilities = Qgis # dirty hack since SIP seems to introduce the flags in module
# monkey patching scoped based enum
Qgis.UserProfileSelectionPolicy.LastProfile.__doc__ = "Open the last closed profile (only mode supported prior to QGIS 3.32)"
Qgis.UserProfileSelectionPolicy.DefaultProfile.__doc__ = "Open a specific profile"
Qgis.UserProfileSelectionPolicy.AskUser.__doc__ = "Let the user choose which profile to open"
Expand Down
11 changes: 3 additions & 8 deletions python/core/auto_generated/providers/qgsdataprovider.sip.in
Expand Up @@ -474,16 +474,11 @@ String sequence used for separating components of sublayers strings.
.. versionadded:: 3.12
%End

virtual bool isSaveAndLoadStyleToDatabaseSupported() const;
virtual Qgis::ProviderStyleStorageCapabilities styleStorageCapabilities() const;
%Docstring
It returns ``False`` by default.
Must be implemented by providers that support saving and loading styles to db returning ``True``
%End
Returns the style storage capabilities.

virtual bool isDeleteStyleFromDatabaseSupported() const;
%Docstring
It returns ``False`` by default.
Must be implemented by providers that support delete styles from db returning ``True``
.. versionadded:: 3.34
%End

signals:
Expand Down
9 changes: 9 additions & 0 deletions python/core/auto_generated/qgis.sip.in
Expand Up @@ -2109,6 +2109,15 @@ The development version
typedef QFlags<Qgis::DatabaseProviderConnectionCapability2> DatabaseProviderConnectionCapabilities2;


enum class ProviderStyleStorageCapability
{
SaveToDatabase,
LoadFromDatabase,
DeleteFromDatabase
};
typedef QFlags<Qgis::ProviderStyleStorageCapability> ProviderStyleStorageCapabilities;


enum class UserProfileSelectionPolicy
{
LastProfile,
Expand Down
19 changes: 9 additions & 10 deletions src/core/providers/ogr/qgsogrprovider.cpp
Expand Up @@ -3990,17 +3990,16 @@ bool QgsOgrProvider::leaveUpdateMode()
return true;
}

bool QgsOgrProvider::isSaveAndLoadStyleToDatabaseSupported() const
Qgis::ProviderStyleStorageCapabilities QgsOgrProvider::styleStorageCapabilities() const
{
// We could potentially extend support for styling to other drivers
// with multiple layer support.
return mGDALDriverName == QLatin1String( "GPKG" ) ||
mGDALDriverName == QLatin1String( "SQLite" );
}

bool QgsOgrProvider::isDeleteStyleFromDatabaseSupported() const
{
return isSaveAndLoadStyleToDatabaseSupported();
Qgis::ProviderStyleStorageCapabilities storageCapabilities;
if ( isValid() && ( mGDALDriverName == QLatin1String( "GPKG" ) || mGDALDriverName == QLatin1String( "SQLite" ) ) )
{
storageCapabilities |= Qgis::ProviderStyleStorageCapability::SaveToDatabase;
storageCapabilities |= Qgis::ProviderStyleStorageCapability::LoadFromDatabase;
storageCapabilities |= Qgis::ProviderStyleStorageCapability::DeleteFromDatabase;
}
return storageCapabilities;
}

QString QgsOgrProvider::fileVectorFilters() const
Expand Down
3 changes: 1 addition & 2 deletions src/core/providers/ogr/qgsogrprovider.h
Expand Up @@ -115,8 +115,7 @@ class QgsOgrProvider final: public QgsVectorDataProvider
void setEncoding( const QString &e ) override;
bool enterUpdateMode() override { return _enterUpdateMode(); }
bool leaveUpdateMode() override;
bool isSaveAndLoadStyleToDatabaseSupported() const override;
bool isDeleteStyleFromDatabaseSupported() const override;
Qgis::ProviderStyleStorageCapabilities styleStorageCapabilities() const override;
QString fileVectorFilters() const override;
bool isValid() const override;
QVariant minimumValue( int index ) const override;
Expand Down
13 changes: 2 additions & 11 deletions src/core/providers/qgsdataprovider.cpp
Expand Up @@ -142,16 +142,7 @@ QString QgsDataProvider::sublayerSeparator()
return SUBLAYER_SEPARATOR;
}

bool QgsDataProvider::isSaveAndLoadStyleToDatabaseSupported() const
Qgis::ProviderStyleStorageCapabilities QgsDataProvider::styleStorageCapabilities() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
return false;
return Qgis::ProviderStyleStorageCapabilities();
}

bool QgsDataProvider::isDeleteStyleFromDatabaseSupported() const
{
QGIS_PROTECT_QOBJECT_THREAD_ACCESS

return false;
}

13 changes: 4 additions & 9 deletions src/core/providers/qgsdataprovider.h
Expand Up @@ -639,16 +639,11 @@ class CORE_EXPORT QgsDataProvider : public QObject
static QString sublayerSeparator();

/**
* It returns FALSE by default.
* Must be implemented by providers that support saving and loading styles to db returning TRUE
*/
virtual bool isSaveAndLoadStyleToDatabaseSupported() const;

/**
* It returns FALSE by default.
* Must be implemented by providers that support delete styles from db returning TRUE
* Returns the style storage capabilities.
*
* \since QGIS 3.34
*/
virtual bool isDeleteStyleFromDatabaseSupported() const;
virtual Qgis::ProviderStyleStorageCapabilities styleStorageCapabilities() const;

signals:

Expand Down
15 changes: 15 additions & 0 deletions src/core/qgis.h
Expand Up @@ -3663,6 +3663,21 @@ class CORE_EXPORT Qgis
Q_DECLARE_FLAGS( DatabaseProviderConnectionCapabilities2, DatabaseProviderConnectionCapability2 )
Q_FLAG( DatabaseProviderConnectionCapabilities2 )

/**
* The StorageCapability enum represents the style storage operations supported by the provider.
*
* \since QGIS 3.34
*/
enum class ProviderStyleStorageCapability
{
SaveToDatabase = 1 << 1,
LoadFromDatabase = 1 << 2,
DeleteFromDatabase = 1 << 3
};
Q_ENUM( ProviderStyleStorageCapability );
Q_DECLARE_FLAGS( ProviderStyleStorageCapabilities, ProviderStyleStorageCapability )
Q_FLAG( ProviderStyleStorageCapabilities )

/**
* User profile selection policy.
*
Expand Down
2 changes: 1 addition & 1 deletion src/core/qgsmaplayer.cpp
Expand Up @@ -2405,7 +2405,7 @@ QString QgsMapLayer::loadNamedStyle( const QString &theURI, bool &resultFlag, bo
QString returnMessage;
QString qml, errorMsg;
QString styleName;
if ( !loadFromLocalDB && dataProvider() && dataProvider()->isSaveAndLoadStyleToDatabaseSupported() )
if ( !loadFromLocalDB && dataProvider() && dataProvider()->styleStorageCapabilities().testFlag( Qgis::ProviderStyleStorageCapability::LoadFromDatabase ) )
{
qml = QgsProviderRegistry::instance()->loadStoredStyle( mProviderKey, mDataSource, styleName, errorMsg );
}
Expand Down
2 changes: 1 addition & 1 deletion src/core/vector/qgsvectorlayer.cpp
Expand Up @@ -1957,7 +1957,7 @@ QString QgsVectorLayer::loadDefaultStyle( bool &resultFlag )
if ( resultFlag )
{
// Try to load all stored styles from DB
if ( mLoadAllStoredStyle && mDataProvider && mDataProvider->isSaveAndLoadStyleToDatabaseSupported() )
if ( mLoadAllStoredStyle && mDataProvider && mDataProvider->styleStorageCapabilities().testFlag( Qgis::ProviderStyleStorageCapability::LoadFromDatabase ) )
{
QStringList ids, names, descriptions;
QString errorMessage;
Expand Down
4 changes: 2 additions & 2 deletions src/gui/qgslayerpropertiesdialog.cpp
Expand Up @@ -291,7 +291,7 @@ void QgsLayerPropertiesDialog::loadDefaultStyle()
const QgsDataProvider *provider = mLayer->dataProvider();
if ( !provider )
return;
if ( provider->isSaveAndLoadStyleToDatabaseSupported() )
if ( provider->styleStorageCapabilities().testFlag( Qgis::ProviderStyleStorageCapability::LoadFromDatabase ) )
{
QMessageBox askToUser;
askToUser.setText( tr( "Load default style from: " ) );
Expand Down Expand Up @@ -350,7 +350,7 @@ void QgsLayerPropertiesDialog::saveDefaultStyle()
const QgsDataProvider *provider = mLayer->dataProvider();
if ( !provider )
return;
if ( provider->isSaveAndLoadStyleToDatabaseSupported() )
if ( provider->styleStorageCapabilities().testFlag( Qgis::ProviderStyleStorageCapability::SaveToDatabase ) )
{
QMessageBox askToUser;
askToUser.setText( tr( "Save default style to: " ) );
Expand Down
4 changes: 2 additions & 2 deletions src/gui/qgsmaplayerloadstyledialog.cpp
Expand Up @@ -61,15 +61,15 @@ QgsMapLayerLoadStyleDialog::QgsMapLayerLoadStyleDialog( QgsMapLayer *layer, QWid
mFileLabel->setVisible( type != QgsLayerPropertiesDialog::StyleType::DatasourceDatabase && type != QgsLayerPropertiesDialog::StyleType::UserDatabase );
mFileWidget->setVisible( type != QgsLayerPropertiesDialog::StyleType::DatasourceDatabase && type != QgsLayerPropertiesDialog::StyleType::UserDatabase );
mFromDbWidget->setVisible( type == QgsLayerPropertiesDialog::StyleType::DatasourceDatabase );
mDeleteButton->setVisible( type == QgsLayerPropertiesDialog::StyleType::DatasourceDatabase && mLayer->dataProvider()->isDeleteStyleFromDatabaseSupported() );
mDeleteButton->setVisible( type == QgsLayerPropertiesDialog::StyleType::DatasourceDatabase && mLayer->dataProvider()->styleStorageCapabilities().testFlag( Qgis::ProviderStyleStorageCapability::DeleteFromDatabase ) );

mStyleCategoriesListView->setEnabled( currentStyleType() != QgsLayerPropertiesDialog::StyleType::SLD );
updateLoadButtonState();
} );
mStyleTypeComboBox->addItem( tr( "From File" ), QgsLayerPropertiesDialog::QML ); // QML is used as entry, but works for SLD too, see currentStyleType()
mStyleTypeComboBox->addItem( tr( "Default from local database" ), QgsLayerPropertiesDialog::UserDatabase );

if ( mLayer->dataProvider()->isSaveAndLoadStyleToDatabaseSupported() )
if ( mLayer->dataProvider()->styleStorageCapabilities().testFlag( Qgis::ProviderStyleStorageCapability::LoadFromDatabase ) )
{
mStyleTypeComboBox->addItem( tr( "From Database (%1)" ).arg( providerName ), QgsLayerPropertiesDialog::StyleType::DatasourceDatabase );
if ( settings.value( QStringLiteral( "style/lastLoadStyleTypeSelection" ) ) == QgsLayerPropertiesDialog::StyleType::DatasourceDatabase )
Expand Down
2 changes: 1 addition & 1 deletion src/gui/qgsmaplayersavestyledialog.cpp
Expand Up @@ -96,7 +96,7 @@ void QgsMapLayerSaveStyleDialog::populateStyleComboBox()
mStyleTypeComboBox->addItem( tr( "As QGIS QML Style File" ), QgsLayerPropertiesDialog::QML );
mStyleTypeComboBox->addItem( tr( "As SLD Style File" ), QgsLayerPropertiesDialog::SLD );

if ( mLayer->dataProvider()->isSaveAndLoadStyleToDatabaseSupported() )
if ( mLayer->dataProvider()->styleStorageCapabilities().testFlag( Qgis::ProviderStyleStorageCapability::SaveToDatabase ) )
mStyleTypeComboBox->addItem( tr( "In Database (%1)" ).arg( providerName ), QgsLayerPropertiesDialog::DatasourceDatabase );

if ( mSaveOnlyCurrentStyle )
Expand Down
11 changes: 11 additions & 0 deletions src/providers/mssql/qgsmssqlprovider.cpp
Expand Up @@ -1129,6 +1129,17 @@ bool QgsMssqlProvider::isValid() const
return mValid;
}

Qgis::ProviderStyleStorageCapabilities QgsMssqlProvider::styleStorageCapabilities() const
{
Qgis::ProviderStyleStorageCapabilities storageCapabilities;
if ( isValid() )
{
storageCapabilities |= Qgis::ProviderStyleStorageCapability::SaveToDatabase;
storageCapabilities |= Qgis::ProviderStyleStorageCapability::LoadFromDatabase;
}
return storageCapabilities;
}

bool QgsMssqlProvider::addFeatures( QgsFeatureList &flist, Flags flags )
{
for ( QgsFeatureList::iterator it = flist.begin(); it != flist.end(); ++it )
Expand Down
2 changes: 1 addition & 1 deletion src/providers/mssql/qgsmssqlprovider.h
Expand Up @@ -115,7 +115,7 @@ class QgsMssqlProvider final: public QgsVectorDataProvider

bool isValid() const override;

bool isSaveAndLoadStyleToDatabaseSupported() const override { return true; }
Qgis::ProviderStyleStorageCapabilities styleStorageCapabilities() const override;

bool addFeatures( QgsFeatureList &flist, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override;

Expand Down
8 changes: 8 additions & 0 deletions src/providers/oracle/qgsoracleprovider.cpp
Expand Up @@ -337,6 +337,14 @@ bool QgsOracleProvider::execLoggedStatic( QSqlQuery &qry, const QString &sql, co
return res;
}

Qgis::ProviderStyleStorageCapabilities QgsOracleProvider::styleStorageCapabilities() const
{
Qgis::ProviderStyleStorageCapabilities storageCapabilities;
storageCapabilities |= Qgis::ProviderStyleStorageCapability::SaveToDatabase;
storageCapabilities |= Qgis::ProviderStyleStorageCapability::LoadFromDatabase;
return storageCapabilities;
}

void QgsOracleProvider::setTransaction( QgsTransaction *transaction )
{
// static_cast since layers cannot be added to a transaction of a non-matching provider
Expand Down
2 changes: 1 addition & 1 deletion src/providers/oracle/qgsoracleprovider.h
Expand Up @@ -185,7 +185,7 @@ class QgsOracleProvider final: public QgsVectorDataProvider

static bool execLoggedStatic( QSqlQuery &qry, const QString &sql, const QVariantList &args, const QString &uri, const QString &originatorClass = QString(), const QString &queryOrigin = QString() );

bool isSaveAndLoadStyleToDatabaseSupported() const override { return true; }
Qgis::ProviderStyleStorageCapabilities styleStorageCapabilities() const override;
void setTransaction( QgsTransaction *transaction ) override;
QgsTransaction *transaction() const override;

Expand Down
12 changes: 12 additions & 0 deletions src/providers/postgres/qgspostgresprovider.cpp
Expand Up @@ -2269,6 +2269,18 @@ bool QgsPostgresProvider::isValid() const
return mValid;
}

Qgis::ProviderStyleStorageCapabilities QgsPostgresProvider::styleStorageCapabilities() const
{
Qgis::ProviderStyleStorageCapabilities storageCapabilities;
if ( isValid() )
{
storageCapabilities |= Qgis::ProviderStyleStorageCapability::SaveToDatabase;
storageCapabilities |= Qgis::ProviderStyleStorageCapability::LoadFromDatabase;
storageCapabilities |= Qgis::ProviderStyleStorageCapability::DeleteFromDatabase;
}
return storageCapabilities;
}

QString QgsPostgresProvider::defaultValueClause( int fieldId ) const
{
QString defVal = mDefaultValues.value( fieldId, QString() );
Expand Down
3 changes: 1 addition & 2 deletions src/providers/postgres/qgspostgresprovider.h
Expand Up @@ -154,8 +154,7 @@ class QgsPostgresProvider final: public QgsVectorDataProvider
QgsFeedback *feedback = nullptr ) const override;
void enumValues( int index, QStringList &enumList ) const override;
bool isValid() const override;
bool isSaveAndLoadStyleToDatabaseSupported() const override { return true; }
bool isDeleteStyleFromDatabaseSupported() const override { return true; }
Qgis::ProviderStyleStorageCapabilities styleStorageCapabilities() const override;
QgsAttributeList attributeIndexes() const override;
QgsAttributeList pkAttributeIndexes() const override { return mPrimaryKeyAttrs; }
QString defaultValueClause( int fieldId ) const override;
Expand Down
10 changes: 8 additions & 2 deletions src/providers/spatialite/qgsspatialiteprovider.cpp
Expand Up @@ -3780,9 +3780,15 @@ bool QgsSpatiaLiteProvider::isValid() const
return mValid;
}

bool QgsSpatiaLiteProvider::isSaveAndLoadStyleToDatabaseSupported() const
Qgis::ProviderStyleStorageCapabilities QgsSpatiaLiteProvider::styleStorageCapabilities() const
{
return mValid;
Qgis::ProviderStyleStorageCapabilities storageCapabilities;
if ( isValid() )
{
storageCapabilities |= Qgis::ProviderStyleStorageCapability::SaveToDatabase;
storageCapabilities |= Qgis::ProviderStyleStorageCapability::LoadFromDatabase;
}
return storageCapabilities;
}

QString QgsSpatiaLiteProvider::name() const
Expand Down
2 changes: 1 addition & 1 deletion src/providers/spatialite/qgsspatialiteprovider.h
Expand Up @@ -114,7 +114,7 @@ class QgsSpatiaLiteProvider final: public QgsVectorDataProvider
QgsFeedback *feedback = nullptr ) const override;

bool isValid() const override;
bool isSaveAndLoadStyleToDatabaseSupported() const override;
Qgis::ProviderStyleStorageCapabilities styleStorageCapabilities() const override;
bool addFeatures( QgsFeatureList &flist, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override;
bool deleteFeatures( const QgsFeatureIds &id ) override;
bool truncate() override;
Expand Down
5 changes: 3 additions & 2 deletions tests/src/python/test_provider_mssql.py
Expand Up @@ -15,6 +15,7 @@
from qgis.PyQt.QtCore import QDate, QDateTime, QDir, QTime, QVariant
from qgis.core import (
NULL,
Qgis,
QgsCoordinateReferenceSystem,
QgsDataProvider,
QgsDataSourceUri,
Expand Down Expand Up @@ -403,8 +404,8 @@ def testStyle(self):

vl = self.getSource()
self.assertTrue(vl.isValid())
self.assertTrue(
vl.dataProvider().isSaveAndLoadStyleToDatabaseSupported())
self.assertEqual(int(vl.dataProvider().styleStorageCapabilities()) & Qgis.ProviderStyleStorageCapability.LoadFromDatabase, Qgis.ProviderStyleStorageCapability.LoadFromDatabase)
self.assertEqual(int(vl.dataProvider().styleStorageCapabilities()) & Qgis.ProviderStyleStorageCapability.SaveToDatabase, Qgis.ProviderStyleStorageCapability.SaveToDatabase)

# table layer_styles does not exist

Expand Down
6 changes: 4 additions & 2 deletions tests/src/python/test_provider_ogr_gpkg.py
Expand Up @@ -662,7 +662,8 @@ def testStyle(self):
# First test with invalid URI
vl = QgsVectorLayer('/idont/exist.gpkg', 'test', 'ogr')

self.assertFalse(vl.dataProvider().isSaveAndLoadStyleToDatabaseSupported())
self.assertEqual(int(vl.dataProvider().styleStorageCapabilities()) & Qgis.ProviderStyleStorageCapability.LoadFromDatabase, 0)
self.assertEqual(int(vl.dataProvider().styleStorageCapabilities()) & Qgis.ProviderStyleStorageCapability.SaveToDatabase, 0)

res, err = QgsProviderRegistry.instance().styleExists('ogr', '/idont/exist.gpkg', '')
self.assertFalse(res)
Expand Down Expand Up @@ -711,7 +712,8 @@ def testStyle(self):
vl2 = QgsVectorLayer(f'{tmpfile}|layername=test2', 'test2', 'ogr')
self.assertTrue(vl2.isValid())

self.assertTrue(vl.dataProvider().isSaveAndLoadStyleToDatabaseSupported())
self.assertEqual(int(vl.dataProvider().styleStorageCapabilities()) & Qgis.ProviderStyleStorageCapability.LoadFromDatabase, Qgis.ProviderStyleStorageCapability.LoadFromDatabase)
self.assertEqual(int(vl.dataProvider().styleStorageCapabilities()) & Qgis.ProviderStyleStorageCapability.SaveToDatabase, Qgis.ProviderStyleStorageCapability.SaveToDatabase)

# style tables don't exist yet
res, err = QgsProviderRegistry.instance().styleExists('ogr', vl.source(), '')
Expand Down
12 changes: 6 additions & 6 deletions tests/src/python/test_provider_postgres.py
Expand Up @@ -1941,9 +1941,9 @@ def testStyle(self):

vl = self.getEditableLayer()
self.assertTrue(vl.isValid())
self.assertTrue(
vl.dataProvider().isSaveAndLoadStyleToDatabaseSupported())
self.assertTrue(vl.dataProvider().isDeleteStyleFromDatabaseSupported())
self.assertEqual(int(vl.dataProvider().styleStorageCapabilities()) & Qgis.ProviderStyleStorageCapability.LoadFromDatabase, Qgis.ProviderStyleStorageCapability.LoadFromDatabase)
self.assertEqual(int(vl.dataProvider().styleStorageCapabilities()) & Qgis.ProviderStyleStorageCapability.SaveToDatabase, Qgis.ProviderStyleStorageCapability.SaveToDatabase)
self.assertEqual(int(vl.dataProvider().styleStorageCapabilities()) & Qgis.ProviderStyleStorageCapability.DeleteFromDatabase, Qgis.ProviderStyleStorageCapability.DeleteFromDatabase)

# table layer_styles does not exist

Expand Down Expand Up @@ -2125,9 +2125,9 @@ def testSaveStyleInvalidXML(self):

vl = self.getEditableLayer()
self.assertTrue(vl.isValid())
self.assertTrue(
vl.dataProvider().isSaveAndLoadStyleToDatabaseSupported())
self.assertTrue(vl.dataProvider().isDeleteStyleFromDatabaseSupported())
self.assertEqual(int(vl.dataProvider().styleStorageCapabilities()) & Qgis.ProviderStyleStorageCapability.LoadFromDatabase, Qgis.ProviderStyleStorageCapability.LoadFromDatabase)
self.assertEqual(int(vl.dataProvider().styleStorageCapabilities()) & Qgis.ProviderStyleStorageCapability.SaveToDatabase, Qgis.ProviderStyleStorageCapability.SaveToDatabase)
self.assertEqual(int(vl.dataProvider().styleStorageCapabilities()) & Qgis.ProviderStyleStorageCapability.DeleteFromDatabase, Qgis.ProviderStyleStorageCapability.DeleteFromDatabase)

mFilePath = QDir.toNativeSeparators(
f"{unitTestDataPath()}/symbol_layer/fontSymbol.qml")
Expand Down

0 comments on commit e2169be

Please sign in to comment.