Skip to content

Commit

Permalink
PG raster: PR recommendations
Browse files Browse the repository at this point in the history
  • Loading branch information
elpaso committed Mar 5, 2020
1 parent e833a64 commit 404fbb5
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 45 deletions.
13 changes: 10 additions & 3 deletions src/app/qgisapp.cpp
Expand Up @@ -2623,7 +2623,7 @@ void QgisApp::createActions()
connect( mActionSetLayerCRS, &QAction::triggered, this, &QgisApp::setLayerCrs );
connect( mActionSetProjectCRSFromLayer, &QAction::triggered, this, &QgisApp::setProjectCrsFromLayer );
connect( mActionLayerProperties, &QAction::triggered, this, &QgisApp::layerProperties );
connect( mActionLayerSubsetString, &QAction::triggered, this, &QgisApp::layerSubsetString );
connect( mActionLayerSubsetString, &QAction::triggered, this, qgis::overload<>::of( &QgisApp::layerSubsetString ) );
connect( mActionAddToOverview, &QAction::triggered, this, &QgisApp::isInOverview );
connect( mActionAddAllToOverview, &QAction::triggered, this, &QgisApp::addAllToOverview );
connect( mActionRemoveAllFromOverview, &QAction::triggered, this, &QgisApp::removeAllFromOverview );
Expand Down Expand Up @@ -10479,13 +10479,20 @@ void QgisApp::duplicateVectorStyle( QgsVectorLayer *srcLayer, QgsVectorLayer *de
}
}


void QgisApp::layerSubsetString()
{
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( activeLayer() );
layerSubsetString( activeLayer() );
}

void QgisApp::layerSubsetString( QgsMapLayer *mapLayer )
{

QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mapLayer );
if ( !vlayer )
{
// Try PG raster
QgsRasterLayer *rlayer = qobject_cast<QgsRasterLayer *>( activeLayer() );
QgsRasterLayer *rlayer = qobject_cast<QgsRasterLayer *>( mapLayer );
if ( rlayer )
{
QgsRasterDataProvider *provider = rlayer->dataProvider();
Expand Down
10 changes: 8 additions & 2 deletions src/app/qgisapp.h
Expand Up @@ -957,8 +957,14 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
//! Duplicate map layer(s) in legend
void duplicateLayers( const QList<QgsMapLayer *> &lyrList = QList<QgsMapLayer *>() );

//! change layer subset of current vector layer
void layerSubsetString();
/**
* Changes layer subset of \a mapLayer
* \since QGIS 3.12
*/
void layerSubsetString( QgsMapLayer *mapLayer );

//! change layer subset of the active layer
void layerSubsetString( );

//! Sets scale visibility of selected layers
void setLayerScaleVisibility();
Expand Down
5 changes: 2 additions & 3 deletions src/app/qgsapplayertreeviewmenuprovider.cpp
Expand Up @@ -248,17 +248,16 @@ QMenu *QgsAppLayerTreeViewMenuProvider::createContextMenu()

if ( provider && provider->supportsSubsetString() )
{
QAction *action = menu->addAction( tr( "&Filter…" ), QgisApp::instance(), &QgisApp::layerSubsetString );
QAction *action = menu->addAction( tr( "&Filter…" ), QgisApp::instance(), qgis::overload<>::of( &QgisApp::layerSubsetString ) );
action->setEnabled( !vlayer->isEditable() );
}
}

// PG raster: activate filter
if ( rlayer &&
rlayer->dataProvider() &&
rlayer->dataProvider()->supportsSubsetString() )
{
menu->addAction( tr( "&Filter…" ), QgisApp::instance(), &QgisApp::layerSubsetString );
menu->addAction( tr( "&Filter…" ), QgisApp::instance(), qgis::overload<>::of( &QgisApp::layerSubsetString ) );
}

// change data source is only supported for vectors and rasters
Expand Down
40 changes: 3 additions & 37 deletions src/app/qgslayertreeviewfilterindicator.cpp
Expand Up @@ -22,6 +22,7 @@
#include "qgsquerybuilder.h"
#include "qgsvectorlayer.h"
#include "qgsrasterlayer.h"
#include "qgisapp.h"


QgsLayerTreeViewFilterIndicatorProvider::QgsLayerTreeViewFilterIndicatorProvider( QgsLayerTreeView *view )
Expand All @@ -35,42 +36,8 @@ void QgsLayerTreeViewFilterIndicatorProvider::onIndicatorClicked( const QModelIn
if ( !QgsLayerTree::isLayer( node ) )
return;

QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( QgsLayerTree::toLayer( node )->layer() );
if ( vlayer && !vlayer->isEditable() )
{
QgsQueryBuilder qb( vlayer );
qb.setSql( vlayer->subsetString() );
if ( qb.exec() )
vlayer->setSubsetString( qb.sql() );
}

// raster
QgsRasterLayer *rlayer = qobject_cast<QgsRasterLayer *>( QgsLayerTree::toLayer( node )->layer() );
if ( rlayer && rlayer->dataProvider() && rlayer->dataProvider()->supportsSubsetString() )
{
// PG raster is the only one for now
if ( rlayer->dataProvider()->name() == QStringLiteral( "postgresraster" ) )
{
QgsDataSourceUri vectorUri { rlayer->dataProvider()->dataSourceUri() };
vectorUri.setGeometryColumn( QString() );
vectorUri.setSrid( QString() );
QgsVectorLayer vlayer { vectorUri.uri( ), QStringLiteral( "pgrasterlayer" ), QStringLiteral( "postgres" ) };
if ( vlayer.isValid( ) )
{
// launch the query builder
QgsQueryBuilder qb { &vlayer };
QString subsetBefore = vlayer.subsetString();

// Set the sql in the query builder to the same in the prop dialog
// (in case the user has already changed it)
qb.setSql( rlayer->subsetString() );
if ( qb.exec() && subsetBefore != qb.sql() )
{
rlayer->setSubsetString( qb.sql() );
}
}
}
}
QgisApp::instance()->layerSubsetString( QgsLayerTree::toLayer( node )->layer() );

}

QString QgsLayerTreeViewFilterIndicatorProvider::iconName( QgsMapLayer *layer )
Expand Down Expand Up @@ -114,7 +81,6 @@ void QgsLayerTreeViewFilterIndicatorProvider::disconnectSignals( QgsMapLayer *la
if ( vlayer )
disconnect( vlayer, &QgsVectorLayer::subsetStringChanged, this, &QgsLayerTreeViewFilterIndicatorProvider::onLayerChanged );

// PG raster
QgsRasterLayer *rlayer = qobject_cast<QgsRasterLayer *>( layer );
if ( rlayer && rlayer->dataProvider() && rlayer->dataProvider()->supportsSubsetString() )
disconnect( rlayer, &QgsRasterLayer::subsetStringChanged, this, &QgsLayerTreeViewFilterIndicatorProvider::onLayerChanged );
Expand Down

0 comments on commit 404fbb5

Please sign in to comment.