The following commit has been merged in the master branch: commit 227263928f96e382f96b4abbb6651bf87076a34a Author: Etienne Tourigny <etourigny....@gmail.com> Date: Fri Mar 9 15:37:22 2012 -0300
browser dock: add selected layers via context menu and tool button diff --git a/src/app/qgsbrowserdockwidget.cpp b/src/app/qgsbrowserdockwidget.cpp index 681a183..15815df 100644 --- a/src/app/qgsbrowserdockwidget.cpp +++ b/src/app/qgsbrowserdockwidget.cpp @@ -68,16 +68,35 @@ QgsBrowserDockWidget::QgsBrowserDockWidget( QWidget * parent ) : mBrowserView = new QgsBrowserTreeView( this ); - mRefreshButton = new QToolButton( this ); - mRefreshButton->setIcon( QgisApp::instance()->getThemeIcon( "mActionDraw.png" ) ); - mRefreshButton->setText( tr( "Refresh" ) ); - mRefreshButton->setAutoRaise( true ); - connect( mRefreshButton, SIGNAL( clicked() ), this, SLOT( refresh() ) ); + QToolButton* refreshButton = new QToolButton( this ); + refreshButton->setIcon( QgisApp::instance()->getThemeIcon( "mActionDraw.png" ) ); + // remove this to save space + refreshButton->setToolButtonStyle( Qt::ToolButtonTextBesideIcon ); + refreshButton->setText( tr( "Refresh" ) ); + refreshButton->setToolTip( tr( "Refresh" ) ); + refreshButton->setAutoRaise( true ); + connect( refreshButton, SIGNAL( clicked() ), this, SLOT( refresh() ) ); + + QToolButton* addLayersButton = new QToolButton( this ); + addLayersButton->setIcon( QgisApp::instance()->getThemeIcon( "mActionAddLayer.png" ) ); + // remove this to save space + addLayersButton->setToolButtonStyle( Qt::ToolButtonTextBesideIcon ); + addLayersButton->setText( tr( "Add Selection" ) ); + addLayersButton->setToolTip( tr( "Add Selected Layers" ) ); + addLayersButton->setAutoRaise( true ); + connect( addLayersButton, SIGNAL( clicked() ), this, SLOT( addSelectedLayers() ) ); QVBoxLayout* layout = new QVBoxLayout(); + QHBoxLayout* hlayout = new QHBoxLayout(); layout->setContentsMargins( 0, 0, 0, 0 ); layout->setSpacing( 0 ); - layout->addWidget( mRefreshButton ); + hlayout->setContentsMargins( 0, 0, 0, 0 ); + hlayout->setSpacing( 5 ); + hlayout->setAlignment( Qt::AlignLeft ); + + hlayout->addWidget( refreshButton ); + hlayout->addWidget( addLayersButton ); + layout->addLayout( hlayout ); layout->addWidget( mBrowserView ); QWidget* innerWidget = new QWidget( this ); @@ -110,55 +129,13 @@ void QgsBrowserDockWidget::showEvent( QShowEvent * e ) 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; + QgsDataItem *dataItem = mModel->dataItem( index ); - QgsMapLayer::LayerType type = layerItem->mapLayerType(); - QString providerKey = layerItem->providerKey(); - - QgsDebugMsg( providerKey + " : " + uri ); - if ( type == QgsMapLayer::VectorLayer ) + if ( dataItem != NULL && dataItem->type() == QgsDataItem::Layer ) { - QgisApp::instance()->addVectorLayer( 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( " " ) ); - - QgisApp::instance()->addRasterLayer( rasterLayerPath, layerItem->name(), providerKey, layers, styles, format, crs ); + QgsLayerItem *layerItem = qobject_cast<QgsLayerItem*>( dataItem ); + if ( layerItem != NULL ) + addLayer( layerItem ); } } @@ -189,6 +166,12 @@ void QgsBrowserDockWidget::showContextMenu( const QPoint & pt ) } } + else if ( item->type() == QgsDataItem::Layer ) + { + menu->addAction( tr( "Add Layer" ), this, SLOT( itemClicked( idx ) ) ); + menu->addAction( tr( "Add Selected Layers" ), this, SLOT( addSelectedLayers() ) ); + } + QList<QAction*> actions = item->actions(); if ( !actions.isEmpty() ) { @@ -279,3 +262,76 @@ void QgsBrowserDockWidget::refreshModel( const QModelIndex& index ) } } } + +void QgsBrowserDockWidget::addLayer( QgsLayerItem *layerItem ) +{ + if ( layerItem == NULL ) + return; + + QString uri = layerItem->uri(); + if ( uri.isEmpty() ) + return; + + QgsMapLayer::LayerType type = layerItem->mapLayerType(); + QString providerKey = layerItem->providerKey(); + + QgsDebugMsg( providerKey + " : " + uri ); + if ( type == QgsMapLayer::VectorLayer ) + { + QgisApp::instance()->addVectorLayer( 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( " " ) ); + + QgisApp::instance()->addRasterLayer( rasterLayerPath, layerItem->name(), providerKey, layers, styles, format, crs ); + } +} + +void QgsBrowserDockWidget::addSelectedLayers() +{ + QApplication::setOverrideCursor( Qt::WaitCursor ); + + // get a sorted list of selected indexes + QModelIndexList list = mBrowserView->selectionModel()->selectedIndexes(); + qSort( list ); + + // add items in reverse order so they are in correct order in the layers dock + for ( int i = list.size() - 1; i >= 0; i-- ) + { + QModelIndex index = list[i]; + QgsDataItem *dataItem = mModel->dataItem( index ); + if ( dataItem && dataItem->type() == QgsDataItem::Layer ) + { + QgsLayerItem *layerItem = qobject_cast<QgsLayerItem*>( dataItem ); + if ( layerItem ) + addLayer( layerItem ); + } + } + + QApplication::restoreOverrideCursor(); +} diff --git a/src/app/qgsbrowserdockwidget.h b/src/app/qgsbrowserdockwidget.h index 631a81f..fcaf6d7 100644 --- a/src/app/qgsbrowserdockwidget.h +++ b/src/app/qgsbrowserdockwidget.h @@ -6,7 +6,7 @@ class QgsBrowserModel; class QModelIndex; class QTreeView; -class QToolButton; +class QgsLayerItem; class QgsBrowserDockWidget : public QDockWidget { @@ -25,14 +25,17 @@ class QgsBrowserDockWidget : public QDockWidget void refresh(); + void addSelectedLayers(); + protected: void refreshModel( const QModelIndex& index ); void showEvent( QShowEvent * event ); + void addLayer( QgsLayerItem *layerItem ); + QTreeView* mBrowserView; - QToolButton* mRefreshButton; QgsBrowserModel* mModel; }; -- The Quantum GIS in Debian project _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel