Skip to content

Commit

Permalink
Merge branch 'master' of github.com:qgis/Quantum-GIS
Browse files Browse the repository at this point in the history
  • Loading branch information
timlinux committed Sep 21, 2012
2 parents 88ca822 + 5243423 commit b220bd4
Show file tree
Hide file tree
Showing 8 changed files with 203 additions and 47 deletions.
2 changes: 1 addition & 1 deletion python/gui/qgsrasterformatsaveoptionswidget.sip
Expand Up @@ -29,7 +29,7 @@ class QgsRasterFormatSaveOptionsWidget : QWidget


void apply(); void apply();
void helpOptions(); void helpOptions();
bool validateOptions( bool gui = true ); QString validateOptions( bool gui = true, bool reportOk = true );


private slots: private slots:


Expand Down
5 changes: 5 additions & 0 deletions src/core/qgsrasterdataprovider.h
Expand Up @@ -597,6 +597,11 @@ class CORE_EXPORT QgsRasterDataProvider : public QgsDataProvider, public QgsRast
tr( "Cubic" ) << tr( "Mode" ) << tr( "None" ) : QStringList(); tr( "Cubic" ) << tr( "Mode" ) << tr( "None" ) : QStringList();
} }


/** Validates creation options for a specific dataset and destination format - used by GDAL provider only.
* See also validateCreationOptionsFormat() in gdal provider for validating options based on format only. */
virtual QString validateCreationOptions( const QStringList& createOptions, QString format )
{ Q_UNUSED( createOptions ); Q_UNUSED( format ); return QString(); }

signals: signals:
/** Emit a signal to notify of the progress event. /** Emit a signal to notify of the progress event.
* Emited theProgress is in percents (0.0-100.0) */ * Emited theProgress is in percents (0.0-100.0) */
Expand Down
122 changes: 77 additions & 45 deletions src/gui/qgsrasterformatsaveoptionswidget.cpp
Expand Up @@ -18,11 +18,8 @@
#include "qgsrasterformatsaveoptionswidget.h" #include "qgsrasterformatsaveoptionswidget.h"
#include "qgslogger.h" #include "qgslogger.h"
#include "qgsdialog.h" #include "qgsdialog.h"

#include "qgsrasterlayer.h"
#include "gdal.h" #include "qgsproviderregistry.h"
#include "cpl_string.h"
#include "cpl_conv.h"
#include "cpl_minixml.h"


#include <QSettings> #include <QSettings>
#include <QInputDialog> #include <QInputDialog>
Expand All @@ -31,28 +28,16 @@
#include <QMouseEvent> #include <QMouseEvent>
#include <QMenu> #include <QMenu>


// todo put this somewhere else - how can we access gdal provider?
char** papszFromStringList( const QStringList& list )
{
char **papszRetList = NULL;
foreach ( QString elem, list )
{
papszRetList = CSLAddString( papszRetList, elem.toLocal8Bit().constData() );
}
return papszRetList;
}


QMap< QString, QStringList > QgsRasterFormatSaveOptionsWidget::mBuiltinProfiles; QMap< QString, QStringList > QgsRasterFormatSaveOptionsWidget::mBuiltinProfiles;


QgsRasterFormatSaveOptionsWidget::QgsRasterFormatSaveOptionsWidget( QWidget* parent, QString format, QgsRasterFormatSaveOptionsWidget::QgsRasterFormatSaveOptionsWidget( QWidget* parent, QString format,
QgsRasterFormatSaveOptionsWidget::Type type, QgsRasterFormatSaveOptionsWidget::Type type, QString provider )
QString provider ) : QWidget( parent ), mFormat( format ), mProvider( provider ), mRasterLayer( 0 )
: QWidget( parent ), mFormat( format ), mProvider( provider )


{ {
setupUi( this ); setupUi( this );



setType( type ); setType( type );


if ( mBuiltinProfiles.isEmpty() ) if ( mBuiltinProfiles.isEmpty() )
Expand Down Expand Up @@ -104,6 +89,7 @@ QgsRasterFormatSaveOptionsWidget::QgsRasterFormatSaveOptionsWidget( QWidget* par
mOptionsLineEdit->installEventFilter( this ); mOptionsLineEdit->installEventFilter( this );
mOptionsStackedWidget->installEventFilter( this ); mOptionsStackedWidget->installEventFilter( this );


updateControls();
updateProfiles(); updateProfiles();
} }


Expand All @@ -114,12 +100,14 @@ QgsRasterFormatSaveOptionsWidget::~QgsRasterFormatSaveOptionsWidget()
void QgsRasterFormatSaveOptionsWidget::setFormat( QString format ) void QgsRasterFormatSaveOptionsWidget::setFormat( QString format )
{ {
mFormat = format; mFormat = format;
updateControls();
updateProfiles(); updateProfiles();
} }


void QgsRasterFormatSaveOptionsWidget::setProvider( QString provider ) void QgsRasterFormatSaveOptionsWidget::setProvider( QString provider )
{ {
mProvider = provider; mProvider = provider;
updateControls();
} }


// show/hide widgets - we need this function if widget is used in creator // show/hide widgets - we need this function if widget is used in creator
Expand Down Expand Up @@ -236,27 +224,35 @@ void QgsRasterFormatSaveOptionsWidget::apply()
setCreateOptions(); setCreateOptions();
} }


// typedefs for gdal provider function pointers
typedef QString validateCreationOptionsFormat_t( const QStringList& createOptions, QString format );
typedef QString helpCreationOptionsFormat_t( QString format );


void QgsRasterFormatSaveOptionsWidget::helpOptions() void QgsRasterFormatSaveOptionsWidget::helpOptions()
{ {
QString message; QString message;


if ( mProvider == "gdal" && mFormat != "" && mFormat != "_pyramids" ) if ( mProvider == "gdal" && mFormat != "" && mFormat != "_pyramids" )
{ {
GDALDriverH myGdalDriver = GDALGetDriverByName( mFormat.toLocal8Bit().constData() ); // get helpCreationOptionsFormat() function ptr for provider
if ( myGdalDriver ) QLibrary *library = QgsProviderRegistry::instance()->providerLibrary( mProvider );
if ( library )
{ {
// need to serialize xml to get newlines helpCreationOptionsFormat_t * helpCreationOptionsFormat =
CPLXMLNode *psCOL = CPLParseXMLString( GDALGetMetadataItem( myGdalDriver, ( helpCreationOptionsFormat_t * ) cast_to_fptr( library->resolve( "helpCreationOptionsFormat" ) );
GDAL_DMD_CREATIONOPTIONLIST, "" ) ); if ( helpCreationOptionsFormat )
char *pszFormattedXML = CPLSerializeXMLTree( psCOL ); {
if ( pszFormattedXML ) message = helpCreationOptionsFormat( mFormat );
message = tr( "Create Options:\n\n%1" ).arg( pszFormattedXML ); }
if ( psCOL ) else
CPLDestroyXMLNode( psCOL ); {
if ( pszFormattedXML ) message = library->fileName() + " does not have helpCreationOptionsFormat";
CPLFree( pszFormattedXML ); }
} }
else
message = QString( "cannot load provider library %1" ).arg( mProvider );


if ( message.isEmpty() ) if ( message.isEmpty() )
message = tr( "Cannot get create options for driver %1" ).arg( mFormat ); message = tr( "Cannot get create options for driver %1" ).arg( mFormat );
} }
Expand All @@ -267,36 +263,65 @@ void QgsRasterFormatSaveOptionsWidget::helpOptions()
QgsDialog *dlg = new QgsDialog( this ); QgsDialog *dlg = new QgsDialog( this );
QTextEdit *textEdit = new QTextEdit( dlg ); QTextEdit *textEdit = new QTextEdit( dlg );
textEdit->setReadOnly( true ); textEdit->setReadOnly( true );
message = tr( "Create Options:\n\n%1" ).arg( message );
textEdit->setText( message ); textEdit->setText( message );
dlg->layout()->addWidget( textEdit ); dlg->layout()->addWidget( textEdit );
dlg->resize( 600, 600 ); dlg->resize( 600, 400 );
dlg->show(); //non modal dlg->show(); //non modal
} }


bool QgsRasterFormatSaveOptionsWidget::validateOptions( bool gui ) QString QgsRasterFormatSaveOptionsWidget::validateOptions( bool gui, bool reportOK )
{ {
QStringList createOptions = options(); QStringList createOptions = options();
bool ok = false; QString message;


if ( !createOptions.isEmpty() && mProvider == "gdal" && mFormat != "" && mFormat != "_pyramids" ) if ( !createOptions.isEmpty() && mProvider == "gdal" && mFormat != "" && mFormat != "_pyramids" )
{ {
GDALDriverH myGdalDriver = GDALGetDriverByName( mFormat.toLocal8Bit().constData() ); if ( mRasterLayer )
if ( myGdalDriver ) {
QgsDebugMsg( "calling validate on layer's data provider" );
message = mRasterLayer->dataProvider()->validateCreationOptions( createOptions, mFormat );
}
else
{ {
// print error string? // get validateCreationOptionsFormat() function ptr for provider
char** papszOptions = papszFromStringList( createOptions ); QLibrary *library = QgsProviderRegistry::instance()->providerLibrary( mProvider );
ok = GDALValidateCreationOptions( myGdalDriver, papszOptions ); if ( library )
CSLDestroy( papszOptions );
if ( gui )
{ {
if ( ok ) validateCreationOptionsFormat_t * validateCreationOptionsFormat =
QMessageBox::information( this, "", tr( "Valid" ), QMessageBox::Close ); ( validateCreationOptionsFormat_t * ) cast_to_fptr( library->resolve( "validateCreationOptionsFormat" ) );
if ( validateCreationOptionsFormat )
{
message = validateCreationOptionsFormat( createOptions, mFormat );
}
else else
QMessageBox::warning( this, "", tr( "Invalid" ), QMessageBox::Close ); {
message = library->fileName() + " does not have validateCreationOptionsFormat";
}
}
else
message = QString( "cannot load provider library %1" ).arg( mProvider );
}

if ( gui )
{
if ( message.isNull() )
{
if ( reportOK )
QMessageBox::information( this, "", tr( "Valid" ), QMessageBox::Close );
}
else
{
QMessageBox::warning( this, "", tr( "Invalid creation option :\n\n%1\n\nClick on help button to get valid creation options for this format" ).arg( message ), QMessageBox::Close );
} }
} }
} }
return ok; else
{
QMessageBox::information( this, "", tr( "Cannot validate" ), QMessageBox::Close );
}

return message;
} }


void QgsRasterFormatSaveOptionsWidget::optionsTableChanged() void QgsRasterFormatSaveOptionsWidget::optionsTableChanged()
Expand Down Expand Up @@ -481,6 +506,13 @@ void QgsRasterFormatSaveOptionsWidget::swapOptionsUI( int newIndex )
updateOptions(); updateOptions();
} }


void QgsRasterFormatSaveOptionsWidget::updateControls()
{
bool enabled = ( mProvider == "gdal" && mFormat != "" && mFormat != "_pyramids" );
mOptionsValidateButton->setEnabled( enabled );
mOptionsHelpButton->setEnabled( enabled );
}

// map options label left mouse click to optionsToggle() // map options label left mouse click to optionsToggle()
bool QgsRasterFormatSaveOptionsWidget::eventFilter( QObject *obj, QEvent *event ) bool QgsRasterFormatSaveOptionsWidget::eventFilter( QObject *obj, QEvent *event )
{ {
Expand Down
7 changes: 6 additions & 1 deletion src/gui/qgsrasterformatsaveoptionswidget.h
Expand Up @@ -20,6 +20,8 @@


#include "ui_qgsrasterformatsaveoptionswidgetbase.h" #include "ui_qgsrasterformatsaveoptionswidgetbase.h"


class QgsRasterLayer;

/** \ingroup gui /** \ingroup gui
* A widget to select format-specific raster saving options * A widget to select format-specific raster saving options
*/ */
Expand All @@ -46,14 +48,15 @@ class GUI_EXPORT QgsRasterFormatSaveOptionsWidget: public QWidget,


void setFormat( QString format ); void setFormat( QString format );
void setProvider( QString provider ); void setProvider( QString provider );
void setRasterLayer( QgsRasterLayer* rasterLayer ) { mRasterLayer = rasterLayer; }
QStringList options() const; QStringList options() const;
void setType( QgsRasterFormatSaveOptionsWidget::Type type = Default ); void setType( QgsRasterFormatSaveOptionsWidget::Type type = Default );


public slots: public slots:


void apply(); void apply();
void helpOptions(); void helpOptions();
bool validateOptions( bool gui = true ); QString validateOptions( bool gui = true, bool reportOk = true );
void updateProfiles(); void updateProfiles();


private slots: private slots:
Expand All @@ -68,11 +71,13 @@ class GUI_EXPORT QgsRasterFormatSaveOptionsWidget: public QWidget,
void optionsTableEnableDeleteButton(); void optionsTableEnableDeleteButton();
void updateOptions(); void updateOptions();
void swapOptionsUI( int newIndex = -1 ); void swapOptionsUI( int newIndex = -1 );
void updateControls();


private: private:


QString mFormat; QString mFormat;
QString mProvider; QString mProvider;
QgsRasterLayer* mRasterLayer;
QMap< QString, QString> mOptionsMap; QMap< QString, QString> mOptionsMap;
static QMap< QString, QStringList > mBuiltinProfiles; static QMap< QString, QStringList > mBuiltinProfiles;


Expand Down
12 changes: 12 additions & 0 deletions src/gui/qgsrasterlayersaveasdialog.cpp
Expand Up @@ -76,6 +76,7 @@ QgsRasterLayerSaveAsDialog::QgsRasterLayerSaveAsDialog( QgsRasterLayer* rasterLa
{ {
mCreateOptionsWidget->setFormat( myFormats[0] ); mCreateOptionsWidget->setFormat( myFormats[0] );
} }
mCreateOptionsWidget->setRasterLayer( mRasterLayer );
mCreateOptionsWidget->update(); mCreateOptionsWidget->update();
} }


Expand Down Expand Up @@ -753,3 +754,14 @@ QgsRasterDataProvider::RasterBuildPyramids QgsRasterLayerSaveAsDialog::buildPyra
return QgsRasterDataProvider::PyramidsFlagYes; return QgsRasterDataProvider::PyramidsFlagYes;
} }


bool QgsRasterLayerSaveAsDialog::validate() const
{
if ( mCreateOptionsGroupBox->isChecked() )
{
QString message = mCreateOptionsWidget->validateOptions( true, false );
if ( !message.isNull() )
return false;
}
return true;
}

4 changes: 4 additions & 0 deletions src/gui/qgsrasterlayersaveasdialog.h
Expand Up @@ -67,6 +67,9 @@ class GUI_EXPORT QgsRasterLayerSaveAsDialog: public QDialog, private Ui::QgsRast
void hideFormat(); void hideFormat();
void hideOutput(); void hideOutput();


public slots:
virtual void accept() { if ( validate() ) return QDialog::accept(); }

private slots: private slots:
void on_mRawModeRadioButton_toggled( bool ); void on_mRawModeRadioButton_toggled( bool );
void on_mBrowseButton_clicked(); void on_mBrowseButton_clicked();
Expand Down Expand Up @@ -132,6 +135,7 @@ class GUI_EXPORT QgsRasterLayerSaveAsDialog: public QDialog, private Ui::QgsRast
void setNoDataToEdited( int row ); void setNoDataToEdited( int row );
double noDataCellValue( int row, int column ) const; double noDataCellValue( int row, int column ) const;
void adjustNoDataCellWidth( int row, int column ); void adjustNoDataCellWidth( int row, int column );
bool validate() const;
}; };




Expand Down

0 comments on commit b220bd4

Please sign in to comment.