Bad layer dialog improvements (Funded by Sourcepole)

This commit is contained in:
Sandro Mani 2014-10-09 16:42:53 +02:00
parent 7a92293e0c
commit 2e943c936c
6 changed files with 52 additions and 14 deletions

View File

@ -39,6 +39,12 @@ class QgsProviderRegistry
QgsDataProvider *provider( const QString & providerKey, QgsDataProvider *provider( const QString & providerKey,
const QString & dataSource ); const QString & dataSource );
/** Return the provider capabilities
@param providerKey identificator of the provider
@note Added in 2.6
*/
int getProviderCapabilities( const QString& providerKey ) const;
QWidget *selectWidget( const QString & providerKey, QWidget *selectWidget( const QString & providerKey,
QWidget * parent = 0, Qt::WindowFlags fl = 0 ); QWidget * parent = 0, Qt::WindowFlags fl = 0 );

View File

@ -26,8 +26,10 @@
#include <QDomDocument> #include <QDomDocument>
#include <QDomElement> #include <QDomElement>
#include <QFileDialog>
#include <QPushButton> #include <QPushButton>
#include <QMessageBox> #include <QMessageBox>
#include <QSettings>
#include <QUrl> #include <QUrl>
QgsHandleBadLayersHandler::QgsHandleBadLayersHandler() QgsHandleBadLayersHandler::QgsHandleBadLayersHandler()
@ -71,7 +73,6 @@ QgsHandleBadLayers::QgsHandleBadLayers( const QList<QDomNode> &layers, const QDo
connect( mLayerList, SIGNAL( itemSelectionChanged() ), this, SLOT( selectionChanged() ) ); connect( mLayerList, SIGNAL( itemSelectionChanged() ), this, SLOT( selectionChanged() ) );
connect( mBrowseButton, SIGNAL( clicked() ), this, SLOT( browseClicked() ) ); connect( mBrowseButton, SIGNAL( clicked() ), this, SLOT( browseClicked() ) );
connect( buttonBox, SIGNAL( accepted() ), this, SLOT( accept() ) );
connect( buttonBox->button( QDialogButtonBox::Apply ), SIGNAL( clicked() ), this, SLOT( apply() ) ); connect( buttonBox->button( QDialogButtonBox::Apply ), SIGNAL( clicked() ), this, SLOT( apply() ) );
mLayerList->clear(); mLayerList->clear();
@ -94,12 +95,14 @@ QgsHandleBadLayers::QgsHandleBadLayers( const QList<QDomNode> &layers, const QDo
QString name = node.namedItem( "layername" ).toElement().text(); QString name = node.namedItem( "layername" ).toElement().text();
QString type = node.toElement().attribute( "type" ); QString type = node.toElement().attribute( "type" );
QString datasource = node.namedItem( "datasource" ).toElement().text(); QString datasource = node.namedItem( "datasource" ).toElement().text();
QString provider = type == "vector" ? node.namedItem( "provider" ).toElement().text() : tr( "none" ); QString provider = node.namedItem( "provider" ).toElement().text();
QString vectorProvider = type == "vector" ? provider : tr( "none" );
bool providerFileBased = ( QgsProviderRegistry::instance()->getProviderCapabilities( provider ) & QgsDataProvider::File ) != 0;
QgsDebugMsg( QString( "name=%1 type=%2 provider=%3 datasource='%4'" ) QgsDebugMsg( QString( "name=%1 type=%2 provider=%3 datasource='%4'" )
.arg( name ) .arg( name )
.arg( type ) .arg( type )
.arg( provider ) .arg( vectorProvider )
.arg( datasource ) ); .arg( datasource ) );
mLayerList->setRowCount( j + 1 ); mLayerList->setRowCount( j + 1 );
@ -112,10 +115,11 @@ QgsHandleBadLayers::QgsHandleBadLayers( const QList<QDomNode> &layers, const QDo
mLayerList->setItem( j, 0, item ); mLayerList->setItem( j, 0, item );
item = new QTableWidgetItem( type ); item = new QTableWidgetItem( type );
item->setData( Qt::UserRole + 0, providerFileBased );
item->setFlags( item->flags() & ~Qt::ItemIsEditable ); item->setFlags( item->flags() & ~Qt::ItemIsEditable );
mLayerList->setItem( j, 1, item ); mLayerList->setItem( j, 1, item );
item = new QTableWidgetItem( provider ); item = new QTableWidgetItem( vectorProvider );
item->setFlags( item->flags() & ~Qt::ItemIsEditable ); item->setFlags( item->flags() & ~Qt::ItemIsEditable );
mLayerList->setItem( j, 2, item ); mLayerList->setItem( j, 2, item );
@ -143,6 +147,10 @@ void QgsHandleBadLayers::selectionChanged()
if ( item->column() != 0 ) if ( item->column() != 0 )
continue; continue;
bool providerFileBased = mLayerList->item( item->row(), 1 )->data( Qt::UserRole + 0 ).toBool();
if ( !providerFileBased )
continue;
mRows << item->row(); mRows << item->row();
} }
@ -261,31 +269,34 @@ void QgsHandleBadLayers::browseClicked()
} }
else if ( mRows.size() > 1 ) else if ( mRows.size() > 1 )
{ {
QStringList selectedFiles;
QString enc;
QString title = tr( "Select new directory of selected files" ); QString title = tr( "Select new directory of selected files" );
QgisGui::openFilesRememberingFilter( "missingDirectory", tr( "All files (*)" ), selectedFiles, enc, title ); QSettings settings;
if ( selectedFiles.isEmpty() ) QString lastDir = settings.value( "/UI/missingDirectory", "" ).toString();
QString selectedFolder = QFileDialog::getExistingDirectory( this, title, lastDir );
if ( selectedFolder.isEmpty() )
{ {
return; return;
} }
QFileInfo path( selectedFiles[0] ); QDir dir( selectedFolder );
if ( !path.exists() ) if ( !dir.exists() )
{ {
return; return;
} }
foreach ( int row, mRows ) foreach ( int row, mRows )
{ {
QString type = mLayerList->item( row, 1 )->text(); bool providerFileBased = mLayerList->item( row, 1 )->data( Qt::UserRole + 0 ).toBool();
if ( !providerFileBased )
continue;
QString fn = filename( row ); QString fn = filename( row );
if ( fn.isEmpty() ) if ( fn.isEmpty() )
continue; continue;
QFileInfo fi( fn ); QFileInfo fi( fn );
fi.setFile( path.dir(), fi.fileName() ); fi.setFile( dir, fi.fileName() );
if ( !fi.exists() ) if ( !fi.exists() )
continue; continue;

View File

@ -32,8 +32,6 @@
class QgsDataProvider; class QgsDataProvider;
class QgsDataItem; class QgsDataItem;
// TODO: bad place, where to put this? qgsproviderregistry.h?
typedef int dataCapabilities_t();
typedef QgsDataItem * dataItem_t( QString, QgsDataItem* ); typedef QgsDataItem * dataItem_t( QString, QgsDataItem* );

View File

@ -24,6 +24,8 @@
//#include "qgsdataitem.h" //#include "qgsdataitem.h"
#include "qgserror.h" #include "qgserror.h"
typedef int dataCapabilities_t();
class QgsRectangle; class QgsRectangle;
class QgsCoordinateReferenceSystem; class QgsCoordinateReferenceSystem;

View File

@ -371,6 +371,21 @@ QgsDataProvider *QgsProviderRegistry::provider( QString const & providerKey, QSt
return dataProvider; return dataProvider;
} // QgsProviderRegistry::setDataProvider } // QgsProviderRegistry::setDataProvider
int QgsProviderRegistry::getProviderCapabilities( const QString &providerKey ) const
{
QLibrary *library = providerLibrary( providerKey );
if ( !library )
{
return QgsDataProvider::NoDataCapabilities;
}
dataCapabilities_t * dataCapabilities = ( dataCapabilities_t * ) cast_to_fptr( library->resolve( "dataCapabilities" ) );
if ( !dataCapabilities )
{
return QgsDataProvider::NoDataCapabilities;
}
return dataCapabilities();
}
// This should be QWidget, not QDialog // This should be QWidget, not QDialog
typedef QWidget * selectFactoryFunction_t( QWidget * parent, Qt::WindowFlags fl ); typedef QWidget * selectFactoryFunction_t( QWidget * parent, Qt::WindowFlags fl );

View File

@ -68,6 +68,12 @@ class CORE_EXPORT QgsProviderRegistry
QgsDataProvider *provider( const QString & providerKey, QgsDataProvider *provider( const QString & providerKey,
const QString & dataSource ); const QString & dataSource );
/** Return the provider capabilities
@param providerKey identificator of the provider
@note Added in 2.6
*/
int getProviderCapabilities( const QString& providerKey ) const;
QWidget *selectWidget( const QString & providerKey, QWidget *selectWidget( const QString & providerKey,
QWidget * parent = 0, Qt::WindowFlags fl = 0 ); QWidget * parent = 0, Qt::WindowFlags fl = 0 );