Skip to content

Commit e0df5d4

Browse files
committedOct 14, 2014
Merge pull request #1621 from manisandro/bad_layer_improvements
Bad layer dialog improvements
2 parents 89b0d7a + 2e943c9 commit e0df5d4

File tree

6 files changed

+52
-14
lines changed

6 files changed

+52
-14
lines changed
 

‎python/core/qgsproviderregistry.sip

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ class QgsProviderRegistry
3939
QgsDataProvider *provider( const QString & providerKey,
4040
const QString & dataSource );
4141

42+
/** Return the provider capabilities
43+
@param providerKey identificator of the provider
44+
@note Added in 2.6
45+
*/
46+
int getProviderCapabilities( const QString& providerKey ) const;
47+
4248
QWidget *selectWidget( const QString & providerKey,
4349
QWidget * parent = 0, Qt::WindowFlags fl = 0 );
4450

‎src/app/qgshandlebadlayers.cpp

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@
2626

2727
#include <QDomDocument>
2828
#include <QDomElement>
29+
#include <QFileDialog>
2930
#include <QPushButton>
3031
#include <QMessageBox>
32+
#include <QSettings>
3133
#include <QUrl>
3234

3335
QgsHandleBadLayersHandler::QgsHandleBadLayersHandler()
@@ -71,7 +73,6 @@ QgsHandleBadLayers::QgsHandleBadLayers( const QList<QDomNode> &layers, const QDo
7173

7274
connect( mLayerList, SIGNAL( itemSelectionChanged() ), this, SLOT( selectionChanged() ) );
7375
connect( mBrowseButton, SIGNAL( clicked() ), this, SLOT( browseClicked() ) );
74-
connect( buttonBox, SIGNAL( accepted() ), this, SLOT( accept() ) );
7576
connect( buttonBox->button( QDialogButtonBox::Apply ), SIGNAL( clicked() ), this, SLOT( apply() ) );
7677

7778
mLayerList->clear();
@@ -94,12 +95,14 @@ QgsHandleBadLayers::QgsHandleBadLayers( const QList<QDomNode> &layers, const QDo
9495
QString name = node.namedItem( "layername" ).toElement().text();
9596
QString type = node.toElement().attribute( "type" );
9697
QString datasource = node.namedItem( "datasource" ).toElement().text();
97-
QString provider = type == "vector" ? node.namedItem( "provider" ).toElement().text() : tr( "none" );
98+
QString provider = node.namedItem( "provider" ).toElement().text();
99+
QString vectorProvider = type == "vector" ? provider : tr( "none" );
100+
bool providerFileBased = ( QgsProviderRegistry::instance()->getProviderCapabilities( provider ) & QgsDataProvider::File ) != 0;
98101

99102
QgsDebugMsg( QString( "name=%1 type=%2 provider=%3 datasource='%4'" )
100103
.arg( name )
101104
.arg( type )
102-
.arg( provider )
105+
.arg( vectorProvider )
103106
.arg( datasource ) );
104107

105108
mLayerList->setRowCount( j + 1 );
@@ -112,10 +115,11 @@ QgsHandleBadLayers::QgsHandleBadLayers( const QList<QDomNode> &layers, const QDo
112115
mLayerList->setItem( j, 0, item );
113116

114117
item = new QTableWidgetItem( type );
118+
item->setData( Qt::UserRole + 0, providerFileBased );
115119
item->setFlags( item->flags() & ~Qt::ItemIsEditable );
116120
mLayerList->setItem( j, 1, item );
117121

118-
item = new QTableWidgetItem( provider );
122+
item = new QTableWidgetItem( vectorProvider );
119123
item->setFlags( item->flags() & ~Qt::ItemIsEditable );
120124
mLayerList->setItem( j, 2, item );
121125

@@ -143,6 +147,10 @@ void QgsHandleBadLayers::selectionChanged()
143147
if ( item->column() != 0 )
144148
continue;
145149

150+
bool providerFileBased = mLayerList->item( item->row(), 1 )->data( Qt::UserRole + 0 ).toBool();
151+
if ( !providerFileBased )
152+
continue;
153+
146154
mRows << item->row();
147155
}
148156

@@ -261,31 +269,34 @@ void QgsHandleBadLayers::browseClicked()
261269
}
262270
else if ( mRows.size() > 1 )
263271
{
264-
QStringList selectedFiles;
265-
QString enc;
266272
QString title = tr( "Select new directory of selected files" );
267273

268-
QgisGui::openFilesRememberingFilter( "missingDirectory", tr( "All files (*)" ), selectedFiles, enc, title );
269-
if ( selectedFiles.isEmpty() )
274+
QSettings settings;
275+
QString lastDir = settings.value( "/UI/missingDirectory", "" ).toString();
276+
QString selectedFolder = QFileDialog::getExistingDirectory( this, title, lastDir );
277+
if ( selectedFolder.isEmpty() )
270278
{
271279
return;
272280
}
273281

274-
QFileInfo path( selectedFiles[0] );
275-
if ( !path.exists() )
282+
QDir dir( selectedFolder );
283+
if ( !dir.exists() )
276284
{
277285
return;
278286
}
279287

280288
foreach ( int row, mRows )
281289
{
282-
QString type = mLayerList->item( row, 1 )->text();
290+
bool providerFileBased = mLayerList->item( row, 1 )->data( Qt::UserRole + 0 ).toBool();
291+
if ( !providerFileBased )
292+
continue;
293+
283294
QString fn = filename( row );
284295
if ( fn.isEmpty() )
285296
continue;
286297

287298
QFileInfo fi( fn );
288-
fi.setFile( path.dir(), fi.fileName() );
299+
fi.setFile( dir, fi.fileName() );
289300
if ( !fi.exists() )
290301
continue;
291302

‎src/core/qgsdataitem.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@
3232
class QgsDataProvider;
3333
class QgsDataItem;
3434

35-
// TODO: bad place, where to put this? qgsproviderregistry.h?
36-
typedef int dataCapabilities_t();
3735
typedef QgsDataItem * dataItem_t( QString, QgsDataItem* );
3836

3937

‎src/core/qgsdataprovider.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
//#include "qgsdataitem.h"
2525
#include "qgserror.h"
2626

27+
typedef int dataCapabilities_t();
28+
2729
class QgsRectangle;
2830
class QgsCoordinateReferenceSystem;
2931

‎src/core/qgsproviderregistry.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,21 @@ QgsDataProvider *QgsProviderRegistry::provider( QString const & providerKey, QSt
371371
return dataProvider;
372372
} // QgsProviderRegistry::setDataProvider
373373

374+
int QgsProviderRegistry::getProviderCapabilities( const QString &providerKey ) const
Code has comments. Press enter to view.
375+
{
376+
QLibrary *library = providerLibrary( providerKey );
377+
if ( !library )
378+
{
379+
return QgsDataProvider::NoDataCapabilities;
380+
}
381+
dataCapabilities_t * dataCapabilities = ( dataCapabilities_t * ) cast_to_fptr( library->resolve( "dataCapabilities" ) );
382+
if ( !dataCapabilities )
383+
{
384+
return QgsDataProvider::NoDataCapabilities;
385+
}
386+
return dataCapabilities();
387+
}
388+
374389
// This should be QWidget, not QDialog
375390
typedef QWidget * selectFactoryFunction_t( QWidget * parent, Qt::WindowFlags fl );
376391

‎src/core/qgsproviderregistry.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ class CORE_EXPORT QgsProviderRegistry
6868
QgsDataProvider *provider( const QString & providerKey,
6969
const QString & dataSource );
7070

71+
/** Return the provider capabilities
72+
@param providerKey identificator of the provider
73+
@note Added in 2.6
74+
*/
75+
int getProviderCapabilities( const QString& providerKey ) const;
76+
7177
QWidget *selectWidget( const QString & providerKey,
7278
QWidget * parent = 0, Qt::WindowFlags fl = 0 );
7379

0 commit comments

Comments
 (0)
Please sign in to comment.