Skip to content

Commit

Permalink
Support vector and raster mime URIs at the same time
Browse files Browse the repository at this point in the history
Fixes #41563
  • Loading branch information
elpaso committed Mar 2, 2021
1 parent c6699b2 commit dccef52
Show file tree
Hide file tree
Showing 10 changed files with 60 additions and 24 deletions.
16 changes: 15 additions & 1 deletion python/core/auto_generated/qgsdataitem.sip.in
Expand Up @@ -246,14 +246,28 @@ A draggable item has to implement :py:func:`~QgsDataItem.mimeUri` that will be u
.. versionadded:: 3.0
%End

virtual QgsMimeDataUtils::Uri mimeUri() const;
virtual QgsMimeDataUtils::Uri mimeUri() const;
%Docstring
Returns mime URI for the data item.
Items that return valid URI will be returned in mime data when dragging a selection from browser model.

.. seealso:: :py:func:`hasDragEnabled`

.. deprecated:: QGIS 3.18
use :py:func:`~QgsDataItem.mimeUris` instead

.. versionadded:: 3.0
%End

virtual QgsMimeDataUtils::UriList mimeUris() const;
%Docstring
Returns mime URIs for the data item, most data providers will only return a single URI
but some data collection items (e.g. GPKG, OGR) may report multiple URIs (e.g. for vector and
raster layer types).

Items that return valid URI will be returned in mime data when dragging a selection from browser model.

.. versionadded:: 3.18
%End

enum Capability
Expand Down
2 changes: 1 addition & 1 deletion src/app/browser/qgsinbuiltdataitemproviders.cpp
Expand Up @@ -566,7 +566,7 @@ bool QgsLayerItemGuiProvider::handleDoubleClick( QgsDataItem *item, QgsDataItemG

if ( QgsLayerItem *layerItem = qobject_cast<QgsLayerItem *>( item ) )
{
const QgsMimeDataUtils::UriList layerUriList = QgsMimeDataUtils::UriList() << layerItem->mimeUri();
const QgsMimeDataUtils::UriList layerUriList = layerItem->mimeUris();
QgisApp::instance()->handleDropUriList( layerUriList );
return true;
}
Expand Down
18 changes: 10 additions & 8 deletions src/core/providers/ogr/qgsgeopackagedataitems.cpp
Expand Up @@ -375,8 +375,7 @@ bool QgsGeoPackageVectorLayerItem::executeDeleteLayer( QString &errCause )
else
{
errCause = QObject::tr( "There was an error deleting '%1' on '%2'!" )
.arg( tableName )
.arg( parent()->path() );
.arg( tableName, parent()->path() );
return false;
}
return true;
Expand All @@ -395,11 +394,14 @@ bool QgsGeoPackageCollectionItem::hasDragEnabled() const
return true;
}

QgsMimeDataUtils::Uri QgsGeoPackageCollectionItem::mimeUri() const
QgsMimeDataUtils::UriList QgsGeoPackageCollectionItem::mimeUris() const
{
QgsMimeDataUtils::Uri u;
u.providerKey = QStringLiteral( "ogr" );
u.uri = path();
u.layerType = QStringLiteral( "vector" );
return u;
QgsMimeDataUtils::Uri vectorUri;
vectorUri.providerKey = QStringLiteral( "ogr" );
vectorUri.uri = path();
vectorUri.layerType = QStringLiteral( "vector" );
QgsMimeDataUtils::Uri rasterUri { vectorUri };
rasterUri.layerType = QStringLiteral( "raster" );
rasterUri.providerKey = QStringLiteral( "gdal" );
return { vectorUri, rasterUri };
}
2 changes: 1 addition & 1 deletion src/core/providers/ogr/qgsgeopackagedataitems.h
Expand Up @@ -66,7 +66,7 @@ class CORE_EXPORT QgsGeoPackageCollectionItem : public QgsDataCollectionItem
public:
bool layerCollection() const override;
bool hasDragEnabled() const override;
QgsMimeDataUtils::Uri mimeUri() const override;
QgsMimeDataUtils::UriList mimeUris() const override;
};


Expand Down
15 changes: 9 additions & 6 deletions src/core/providers/ogr/qgsogrdataitems.cpp
Expand Up @@ -452,13 +452,16 @@ bool QgsOgrDataCollectionItem::hasDragEnabled() const
return true;
}

QgsMimeDataUtils::Uri QgsOgrDataCollectionItem::mimeUri() const
QgsMimeDataUtils::UriList QgsOgrDataCollectionItem::mimeUris() const
{
QgsMimeDataUtils::Uri u;
u.providerKey = QStringLiteral( "ogr" );
u.uri = path();
u.layerType = QStringLiteral( "vector" );
return u;
QgsMimeDataUtils::Uri vectorUri;
vectorUri.providerKey = QStringLiteral( "ogr" );
vectorUri.uri = path();
vectorUri.layerType = QStringLiteral( "vector" );
QgsMimeDataUtils::Uri rasterUri { vectorUri };
rasterUri.layerType = QStringLiteral( "raster" );
rasterUri.providerKey = QStringLiteral( "gdal" );
return { vectorUri, rasterUri };
}

QgsAbstractDatabaseProviderConnection *QgsOgrDataCollectionItem::databaseConnection() const
Expand Down
2 changes: 1 addition & 1 deletion src/core/providers/ogr/qgsogrdataitems.h
Expand Up @@ -131,7 +131,7 @@ class CORE_EXPORT QgsOgrDataCollectionItem final: public QgsDataCollectionItem
static bool createConnection( const QString &name, const QString &extensions, const QString &ogrDriverName );

bool hasDragEnabled() const override;
QgsMimeDataUtils::Uri mimeUri() const override;
QgsMimeDataUtils::UriList mimeUris() const override;

QgsAbstractDatabaseProviderConnection *databaseConnection() const override;

Expand Down
6 changes: 4 additions & 2 deletions src/core/qgsbrowsermodel.cpp
Expand Up @@ -633,9 +633,11 @@ QMimeData *QgsBrowserModel::mimeData( const QModelIndexList &indexes ) const
if ( index.isValid() )
{
QgsDataItem *ptr = reinterpret_cast< QgsDataItem * >( index.internalPointer() );
QgsMimeDataUtils::Uri uri = ptr->mimeUri();
if ( uri.isValid() )
const QgsMimeDataUtils::UriList uris = ptr->mimeUris();
for ( const auto &uri : qgis::as_const( uris ) )
{
lst.append( uri );
}
}
}
return QgsMimeDataUtils::encodeUriList( lst );
Expand Down
16 changes: 15 additions & 1 deletion src/core/qgsdataitem.h
Expand Up @@ -260,9 +260,23 @@ class CORE_EXPORT QgsDataItem : public QObject
* Returns mime URI for the data item.
* Items that return valid URI will be returned in mime data when dragging a selection from browser model.
* \see hasDragEnabled()
* \deprecated since QGIS 3.18, use mimeUris() instead
* \since QGIS 3.0
*/
virtual QgsMimeDataUtils::Uri mimeUri() const { return QgsMimeDataUtils::Uri(); }
Q_DECL_DEPRECATED virtual QgsMimeDataUtils::Uri mimeUri() const
{
return mimeUris().isEmpty() ? QgsMimeDataUtils::Uri() : mimeUris().first();
}

/**
* Returns mime URIs for the data item, most data providers will only return a single URI
* but some data collection items (e.g. GPKG, OGR) may report multiple URIs (e.g. for vector and
* raster layer types).
*
* Items that return valid URI will be returned in mime data when dragging a selection from browser model.
* \since QGIS 3.18
*/
virtual QgsMimeDataUtils::UriList mimeUris() const { return QgsMimeDataUtils::UriList(); }

enum Capability
{
Expand Down
5 changes: 3 additions & 2 deletions src/providers/wms/qgswmsdataitems.cpp
Expand Up @@ -416,7 +416,8 @@ bool QgsWMSLayerCollectionItem::hasDragEnabled() const
return false;
}

QgsMimeDataUtils::Uri QgsWMSLayerCollectionItem::mimeUri() const

QgsMimeDataUtils::UriList QgsWMSLayerCollectionItem::mimeUris() const
{
QgsMimeDataUtils::Uri u;

Expand All @@ -427,7 +428,7 @@ QgsMimeDataUtils::Uri QgsWMSLayerCollectionItem::mimeUri() const
u.supportedCrs = mLayerProperty.crs;
u.supportedFormats = mCapabilitiesProperty.capability.request.getMap.format;

return u;
return { u };
}

// ---------------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion src/providers/wms/qgswmsdataitems.h
Expand Up @@ -98,7 +98,7 @@ class QgsWMSLayerCollectionItem : public QgsDataCollectionItem, public QgsWMSIte

bool hasDragEnabled() const override;

QgsMimeDataUtils::Uri mimeUri() const override;
QgsMimeDataUtils::UriList mimeUris() const override;

protected:
//! The URI
Expand Down

0 comments on commit dccef52

Please sign in to comment.