void QgsBrowserDockWidget::itemClicked( const QModelIndex& index ) { QgsDataItem *item = mModel->dataItem( index ); if ( !item ) return; QgsLayerItem *layerItem = qobject_cast<QgsLayerItem*>( mModel->dataItem( index ) ); if ( layerItem == NULL ) return; QString uri = layerItem->uri(); if ( uri.isEmpty() ) return; QgsMapLayer::LayerType type = layerItem->mapLayerType(); QString providerKey = layerItem->providerKey(); QgsDebugMsg( providerKey + " : " + uri ); QgsMapLayer* layer = NULL; if ( type == QgsMapLayer::VectorLayer ) { layer = new QgsVectorLayer( uri, layerItem->name(), providerKey ); } if ( type == QgsMapLayer::RasterLayer ) { // This should go to WMS provider QStringList URIParts = uri.split( "|" ); QString rasterLayerPath = URIParts.at( 0 ); QStringList layers; QStringList styles; QString format; QString crs; for ( int i = 1 ; i < URIParts.size(); i++ ) { QString part = URIParts.at( i ); int pos = part.indexOf( "=" ); QString field = part.left( pos ); QString value = part.mid( pos + 1 ); if ( field == "layers" ) layers = value.split( "," ); if ( field == "styles" ) styles = value.split( "," ); if ( field == "format" ) format = value; if ( field == "crs" ) crs = value; } QgsDebugMsg( "rasterLayerPath = " + rasterLayerPath ); QgsDebugMsg( "layers = " + layers.join( " " ) ); layer = new QgsRasterLayer( 0, rasterLayerPath, layerItem->name(), providerKey, layers, styles, format, crs ); } if ( !layer || !layer->isValid() ) { qDebug( "No layer" ); delete layer; return; } // add layer to the application QgsMapLayerRegistry::instance()->addMapLayer( layer ); }
void QgsBrowserDockWidget::showProperties( ) { QgsDebugMsg( "Entered" ); QgsDataItem* dataItem = mModel->dataItem( mBrowserView->currentIndex() ); if ( dataItem != NULL && dataItem->type() == QgsDataItem::Layer ) { QgsLayerItem *layerItem = qobject_cast<QgsLayerItem*>( dataItem ); if ( layerItem != NULL ) { QgsMapLayer::LayerType type = layerItem->mapLayerType(); QString layerMetadata = tr( "Error" ); QgsCoordinateReferenceSystem layerCrs; QString notice; // temporarily override /Projections/defaultBehaviour to avoid dialog prompt QSettings settings; QString defaultProjectionOption = settings.value( "/Projections/defaultBehaviour", "prompt" ).toString(); if ( settings.value( "/Projections/defaultBehaviour", "prompt" ).toString() == "prompt" ) { settings.setValue( "/Projections/defaultBehaviour", "useProject" ); } // find root item // we need to create a temporary layer to get metadata // we could use a provider but the metadata is not as complete and "pretty" and this is easier QgsDebugMsg( QString( "creating temporary layer using path %1" ).arg( layerItem->path() ) ); if ( type == QgsMapLayer::RasterLayer ) { QgsDebugMsg( "creating raster layer" ); // should copy code from addLayer() to split uri ? QgsRasterLayer* layer = new QgsRasterLayer( layerItem->uri(), layerItem->uri(), layerItem->providerKey() ); if ( layer != NULL ) { layerCrs = layer->crs(); layerMetadata = layer->metadata(); delete layer; } } else if ( type == QgsMapLayer::VectorLayer ) { QgsDebugMsg( "creating vector layer" ); QgsVectorLayer* layer = new QgsVectorLayer( layerItem->uri(), layerItem->name(), layerItem->providerKey() ); if ( layer != NULL ) { layerCrs = layer->crs(); layerMetadata = layer->metadata(); delete layer; } } // restore /Projections/defaultBehaviour if ( defaultProjectionOption == "prompt" ) { settings.setValue( "/Projections/defaultBehaviour", defaultProjectionOption ); } // initialize dialog QDialog *dialog = new QDialog( this ); Ui::QgsBrowserLayerPropertiesBase ui; ui.setupUi( dialog ); dialog->setWindowTitle( tr( "Layer Properties" ) ); ui.leName->setText( layerItem->name() ); ui.leSource->setText( layerItem->path() ); ui.leProvider->setText( layerItem->providerKey() ); QString myStyle = QgsApplication::reportStyleSheet(); ui.txtbMetadata->document()->setDefaultStyleSheet( myStyle ); ui.txtbMetadata->setHtml( layerMetadata ); // report if layer was set to to project crs without prompt (may give a false positive) if ( defaultProjectionOption == "prompt" ) { QgsCoordinateReferenceSystem defaultCrs = QgisApp::instance()->mapCanvas()->mapRenderer()->destinationCrs(); if ( layerCrs == defaultCrs ) ui.lblNotice->setText( "NOTICE: Layer srs set from project (" + defaultCrs.authid() + ")" ); } dialog->show(); } } }
void QgsBrowserLayerProperties::setItem( QgsDataItem* item ) { QgsLayerItem *layerItem = qobject_cast<QgsLayerItem*>( item ); if ( !layerItem ) return; mNoticeLabel->clear(); QgsMapLayer::LayerType type = layerItem->mapLayerType(); QString layerMetadata = tr( "Error" ); QgsCoordinateReferenceSystem layerCrs; // temporarily override /Projections/defaultBehaviour to avoid dialog prompt QSettings settings; QString defaultProjectionOption = settings.value( "/Projections/defaultBehaviour", "prompt" ).toString(); if ( settings.value( "/Projections/defaultBehaviour", "prompt" ).toString() == "prompt" ) { settings.setValue( "/Projections/defaultBehaviour", "useProject" ); } // find root item // we need to create a temporary layer to get metadata // we could use a provider but the metadata is not as complete and "pretty" and this is easier QgsDebugMsg( QString( "creating temporary layer using path %1" ).arg( layerItem->path() ) ); if ( type == QgsMapLayer::RasterLayer ) { QgsDebugMsg( "creating raster layer" ); // should copy code from addLayer() to split uri ? QgsRasterLayer* layer = new QgsRasterLayer( layerItem->uri(), layerItem->uri(), layerItem->providerKey() ); if ( layer ) { if ( layer->isValid() ) { layerCrs = layer->crs(); layerMetadata = layer->metadata(); } delete layer; } } else if ( type == QgsMapLayer::VectorLayer ) { QgsDebugMsg( "creating vector layer" ); QgsVectorLayer* layer = new QgsVectorLayer( layerItem->uri(), layerItem->name(), layerItem->providerKey() ); if ( layer ) { if ( layer->isValid() ) { layerCrs = layer->crs(); layerMetadata = layer->metadata(); } delete layer; } } else if ( type == QgsMapLayer::PluginLayer ) { // TODO: support display of properties for plugin layers return; } // restore /Projections/defaultBehaviour if ( defaultProjectionOption == "prompt" ) { settings.setValue( "/Projections/defaultBehaviour", defaultProjectionOption ); } mNameLabel->setText( layerItem->name() ); mUriLabel->setText( layerItem->uri() ); mProviderLabel->setText( layerItem->providerKey() ); QString myStyle = QgsApplication::reportStyleSheet(); mMetadataTextBrowser->document()->setDefaultStyleSheet( myStyle ); mMetadataTextBrowser->setHtml( layerMetadata ); // report if layer was set to to project crs without prompt (may give a false positive) if ( defaultProjectionOption == "prompt" ) { QgsCoordinateReferenceSystem defaultCrs = QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs(); if ( layerCrs == defaultCrs ) mNoticeLabel->setText( "NOTICE: Layer srs set from project (" + defaultCrs.authid() + ')' ); } if ( mNoticeLabel->text().isEmpty() ) { mNoticeLabel->hide(); } }
void QgsBrowserLayerProperties::setItem( QgsDataItem *item ) { QgsLayerItem *layerItem = qobject_cast<QgsLayerItem *>( item ); if ( !layerItem ) return; mNoticeLabel->clear(); QgsMapLayer::LayerType type = layerItem->mapLayerType(); QString layerMetadata = tr( "Error" ); QgsCoordinateReferenceSystem layerCrs; QString defaultProjectionOption = QgsSettings().value( QStringLiteral( "Projections/defaultBehavior" ), "prompt" ).toString(); // temporarily override /Projections/defaultBehavior to avoid dialog prompt // TODO - remove when there is a cleaner way to block the unknown projection dialog! ProjectionSettingRestorer restorer; ( void )restorer; // no warnings mLayer.reset(); // find root item // we need to create a temporary layer to get metadata // we could use a provider but the metadata is not as complete and "pretty" and this is easier QgsDebugMsg( QStringLiteral( "creating temporary layer using path %1" ).arg( layerItem->path() ) ); if ( type == QgsMapLayer::RasterLayer ) { QgsDebugMsg( QStringLiteral( "creating raster layer" ) ); // should copy code from addLayer() to split uri ? mLayer = qgis::make_unique< QgsRasterLayer >( layerItem->uri(), layerItem->name(), layerItem->providerKey() ); } else if ( type == QgsMapLayer::MeshLayer ) { QgsDebugMsg( QStringLiteral( "creating mesh layer" ) ); mLayer = qgis::make_unique < QgsMeshLayer >( layerItem->uri(), layerItem->name(), layerItem->providerKey() ); } else if ( type == QgsMapLayer::VectorLayer ) { QgsDebugMsg( QStringLiteral( "creating vector layer" ) ); mLayer = qgis::make_unique < QgsVectorLayer>( layerItem->uri(), layerItem->name(), layerItem->providerKey() ); } else if ( type == QgsMapLayer::PluginLayer ) { // TODO: support display of properties for plugin layers return; } if ( mLayer && mLayer->isValid() ) { bool ok = false; mLayer->loadDefaultMetadata( ok ); layerCrs = mLayer->crs(); layerMetadata = mLayer->htmlMetadata(); mMapCanvas->setDestinationCrs( mLayer->crs() ); mMapCanvas->setLayers( QList< QgsMapLayer * >() << mLayer.get() ); mMapCanvas->zoomToFullExtent(); } QString myStyle = QgsApplication::reportStyleSheet(); mMetadataTextBrowser->document()->setDefaultStyleSheet( myStyle ); mMetadataTextBrowser->setHtml( layerMetadata ); // report if layer was set to to project crs without prompt (may give a false positive) if ( defaultProjectionOption == QLatin1String( "prompt" ) ) { QgsCoordinateReferenceSystem defaultCrs = QgsProject::instance()->crs(); if ( layerCrs == defaultCrs ) mNoticeLabel->setText( "NOTICE: Layer CRS set from project (" + defaultCrs.authid() + ')' ); } if ( mNoticeLabel->text().isEmpty() ) { mNoticeLabel->hide(); } }