Skip to content

Commit dbce353

Browse files
committed
GDAL driver selection: show driver extension, flags and long name
1 parent dabc492 commit dbce353

3 files changed

Lines changed: 158 additions & 18 deletions

File tree

‎src/app/qgsoptions.cpp‎

Lines changed: 122 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#define CPL_SUPRESS_CPLUSPLUS
4646
#include <gdal.h>
4747
#include <geos_c.h>
48+
#include <cpl_conv.h> // for setting gdal options
4849

4950
#include "qgsconfig.h"
5051

@@ -541,10 +542,11 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WFlags fl ) :
541542
} //default is central point
542543

543544
restoreGeometry( settings.value( "/Windows/Options/geometry" ).toByteArray() );
544-
tabWidget->setCurrentIndex( settings.value( "/Windows/Options/row" ).toInt() );
545545

546-
loadGdalDriverList();
546+
// load gdal driver list only when gdal tab is first opened
547+
mLoadedGdalDriverList = false;
547548

549+
tabWidget->setCurrentIndex( settings.value( "/Windows/Options/row" ).toInt() );
548550
}
549551

550552
//! Destructor
@@ -916,7 +918,8 @@ void QgsOptions::saveOptions()
916918

917919

918920
// Gdal skip driver list
919-
saveGdalDriverList();
921+
if ( mLoadedGdalDriverList )
922+
saveGdalDriverList();
920923
}
921924

922925

@@ -1184,6 +1187,16 @@ void QgsOptions::on_mClearCache_clicked()
11841187
#endif
11851188
}
11861189

1190+
void QgsOptions::on_tabWidget_currentChanged( int theTab )
1191+
{
1192+
// load gdal driver list when gdal tab is first opened
1193+
if ( theTab == 1 && ! mLoadedGdalDriverList )
1194+
{
1195+
loadGdalDriverList();
1196+
}
1197+
}
1198+
1199+
#if 0
11871200
void QgsOptions::loadGdalDriverList()
11881201
{
11891202
QStringList mySkippedDrivers = QgsApplication::skippedGdalDrivers();
@@ -1228,19 +1241,120 @@ void QgsOptions::loadGdalDriverList()
12281241
lstGdalDrivers->addItem( mypItem );
12291242
}
12301243
}
1244+
#endif
1245+
1246+
void QgsOptions::loadGdalDriverList()
1247+
{
1248+
QStringList mySkippedDrivers = QgsApplication::skippedGdalDrivers();
1249+
GDALDriverH myGdalDriver; // current driver
1250+
QString myGdalDriverDescription;
1251+
QStringList myDrivers;
1252+
QMap<QString, QString> myDriversFlags, myDriversExt, myDriversLongName;
1253+
1254+
// make sure we save list when accept()
1255+
mLoadedGdalDriverList = true;
1256+
1257+
// allow to retrieve metadata from all drivers, they will be skipped again when saving
1258+
CPLSetConfigOption( "GDAL_SKIP", "" );
1259+
GDALAllRegister();
1260+
1261+
int myGdalDriverCount = GDALGetDriverCount();
1262+
for ( int i = 0; i < myGdalDriverCount; ++i )
1263+
{
1264+
myGdalDriver = GDALGetDriver( i );
1265+
1266+
Q_CHECK_PTR( myGdalDriver );
1267+
1268+
if ( !myGdalDriver )
1269+
{
1270+
QgsLogger::warning( "unable to get driver " + QString::number( i ) );
1271+
continue;
1272+
}
1273+
myGdalDriverDescription = GDALGetDescription( myGdalDriver );
1274+
myDrivers << myGdalDriverDescription;
1275+
1276+
QgsDebugMsg( QString( "driver #%1 - %2" ).arg( i ).arg( myGdalDriverDescription ) );
1277+
1278+
// get driver R/W flags, taken from GDALGeneralCmdLineProcessor()
1279+
const char *pszRWFlag, *pszVirtualIO;
1280+
if ( GDALGetMetadataItem( myGdalDriver, GDAL_DCAP_CREATE, NULL ) )
1281+
pszRWFlag = "rw+";
1282+
else if ( GDALGetMetadataItem( myGdalDriver, GDAL_DCAP_CREATECOPY,
1283+
NULL ) )
1284+
pszRWFlag = "rw";
1285+
else
1286+
pszRWFlag = "ro";
1287+
if ( GDALGetMetadataItem( myGdalDriver, GDAL_DCAP_VIRTUALIO, NULL ) )
1288+
pszVirtualIO = "v";
1289+
else
1290+
pszVirtualIO = "";
1291+
myDriversFlags[myGdalDriverDescription] = QString( "%1%2" ).arg( pszRWFlag ).arg( pszVirtualIO );
1292+
1293+
// get driver extensions and long name
1294+
// the gdal provider can override/add extensions but there is no interface to query this
1295+
// aside from parsing QgsRasterLayer::buildSupportedRasterFileFilter()
1296+
myDriversExt[myGdalDriverDescription] = QString( GDALGetMetadataItem( myGdalDriver, "DMD_EXTENSION", "" ) ).toLower();
1297+
myDriversLongName[myGdalDriverDescription] = QString( GDALGetMetadataItem( myGdalDriver, "DMD_LONGNAME", "" ) );
1298+
1299+
}
1300+
// restore GDAL_SKIP just in case
1301+
CPLSetConfigOption( "GDAL_SKIP", mySkippedDrivers.join( " " ).toUtf8() );
1302+
1303+
myDrivers.removeDuplicates();
1304+
// myDrivers.sort();
1305+
// sort list case insensitive - no existing function for this!
1306+
QMap<QString, QString> strMap;
1307+
foreach( QString str, myDrivers )
1308+
{
1309+
strMap.insert( str.toLower(), str );
1310+
}
1311+
myDrivers = strMap.values();
1312+
1313+
QStringListIterator myIterator( myDrivers );
1314+
1315+
while ( myIterator.hasNext() )
1316+
{
1317+
QString myName = myIterator.next();
1318+
1319+
// QListWidgetItem * mypItem = new QListWidgetItem( myName );
1320+
QTreeWidgetItem * mypItem = new QTreeWidgetItem( QStringList( myName ) );
1321+
if ( mySkippedDrivers.contains( myName ) )
1322+
{
1323+
mypItem->setCheckState( 0, Qt::Unchecked );
1324+
}
1325+
else
1326+
{
1327+
mypItem->setCheckState( 0, Qt::Checked );
1328+
}
1329+
1330+
// add driver metadata
1331+
mypItem->setText( 1, myDriversExt[myName] );
1332+
mypItem->setText( 2, myDriversFlags[myName] );
1333+
mypItem->setText( 3, myDriversLongName[myName] );
1334+
1335+
lstGdalDrivers->addTopLevelItem( mypItem );
1336+
}
1337+
// adjust column width
1338+
for ( int i = 0; i < 4; i++ )
1339+
{
1340+
lstGdalDrivers->resizeColumnToContents( i );
1341+
lstGdalDrivers->setColumnWidth( i, lstGdalDrivers->columnWidth( i ) + 5 );
1342+
}
1343+
}
12311344

12321345
void QgsOptions::saveGdalDriverList()
12331346
{
1234-
for ( int i = 0; i < lstGdalDrivers->count(); i++ )
1347+
for ( int i = 0; i < lstGdalDrivers->topLevelItemCount(); i++ )
12351348
{
1236-
QListWidgetItem * mypItem = lstGdalDrivers->item( i );
1237-
if ( mypItem->checkState() == Qt::Unchecked )
1349+
// QListWidgetItem * mypItem = lstGdalDrivers->item( i );
1350+
QTreeWidgetItem * mypItem = lstGdalDrivers->topLevelItem( i );
1351+
if ( mypItem->checkState( 0 ) == Qt::Unchecked )
12381352
{
1239-
QgsApplication::skipGdalDriver( mypItem->text() );
1353+
QgsApplication::skipGdalDriver( mypItem->text( 0 ) );
12401354
}
12411355
else
12421356
{
1243-
QgsApplication::restoreGdalDriver( mypItem->text() );
1357+
QgsApplication::restoreGdalDriver( mypItem->text( 0 ) );
12441358
}
12451359
}
12461360
QSettings mySettings;

‎src/app/qgsoptions.h‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,11 @@ class QgsOptions : public QDialog, private Ui::QgsOptionsBase
126126
void on_mBrowseCacheDirectory_clicked();
127127
void on_mClearCache_clicked();
128128

129+
/** Auto slot executed when the active page in the main widget stack is changed
130+
* @note added in 2.0
131+
*/
132+
void on_tabWidget_currentChanged( int theTab );
133+
129134
/* Load the list of drivers available in GDAL
130135
* @note added in 2.0
131136
*/
@@ -147,6 +152,7 @@ class QgsOptions : public QDialog, private Ui::QgsOptionsBase
147152
QStringList i18nList();
148153
QgsCoordinateReferenceSystem mDefaultCrs;
149154
QgsCoordinateReferenceSystem mLayerDefaultCrs;
155+
bool mLoadedGdalDriverList;
150156
};
151157

152158
#endif // #ifndef QGSOPTIONS_H

‎src/ui/qgsoptionsbase.ui‎

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -680,16 +680,6 @@
680680
<string>GDAL Drivers</string>
681681
</property>
682682
<layout class="QGridLayout" name="gridLayout_24">
683-
<item row="1" column="0">
684-
<widget class="QListWidget" name="lstGdalDrivers">
685-
<property name="minimumSize">
686-
<size>
687-
<width>0</width>
688-
<height>141</height>
689-
</size>
690-
</property>
691-
</widget>
692-
</item>
693683
<item row="0" column="0">
694684
<widget class="QLabel" name="label_17">
695685
<property name="text">
@@ -700,6 +690,36 @@
700690
</property>
701691
</widget>
702692
</item>
693+
<item row="1" column="0">
694+
<widget class="QTreeWidget" name="lstGdalDrivers">
695+
<property name="minimumSize">
696+
<size>
697+
<width>0</width>
698+
<height>141</height>
699+
</size>
700+
</property>
701+
<column>
702+
<property name="text">
703+
<string>Name</string>
704+
</property>
705+
</column>
706+
<column>
707+
<property name="text">
708+
<string>ext</string>
709+
</property>
710+
</column>
711+
<column>
712+
<property name="text">
713+
<string>Flags</string>
714+
</property>
715+
</column>
716+
<column>
717+
<property name="text">
718+
<string>Description</string>
719+
</property>
720+
</column>
721+
</widget>
722+
</item>
703723
</layout>
704724
</widget>
705725
</item>

0 commit comments

Comments
 (0)