144 changes: 37 additions & 107 deletions src/app/qgsrasterlayerproperties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2950,131 +2950,61 @@ void QgsRasterLayerProperties::on_pbnSaveDefaultStyle_clicked()

void QgsRasterLayerProperties::on_pbnLoadStyle_clicked()
{
QSettings myQSettings; // where we keep last used filter in persistent state
QString myLastUsedDir = myQSettings.value( "style/lastStyleDir", "." ).toString();
QSettings settings;
QString lastUsedDir = settings.value( "style/lastStyleDir", "." ).toString();

QString fileName = QFileDialog::getOpenFileName(
this,
tr( "Load layer properties from style file (.qml)" ),
lastUsedDir,
tr( "QGIS Layer Style File (*.qml)" ) );
if ( fileName.isEmpty() )
return;

//create a file dialog
std::auto_ptr < QFileDialog > myFileDialog
(
new QFileDialog(
this,
QFileDialog::tr( "Load layer properties from style file (.qml)" ),
myLastUsedDir,
tr( "QGIS Layer Style File (*.qml)" )
)
);
myFileDialog->setFileMode( QFileDialog::AnyFile );
myFileDialog->setAcceptMode( QFileDialog::AcceptOpen );
// ensure the user never omits the extension from the file name
if ( !fileName.endsWith( ".qml", Qt::CaseInsensitive ) )
fileName += ".qml";

//prompt the user for a file name
QString myFileName;
if ( myFileDialog->exec() == QDialog::Accepted )
bool defaultLoadedFlag = false;
QString message = mRasterLayer->loadNamedStyle( fileName, defaultLoadedFlag );
if ( defaultLoadedFlag )
{
QStringList myFiles = myFileDialog->selectedFiles();
if ( !myFiles.isEmpty() )
{
myFileName = myFiles[0];
}
sync();
}

if ( !myFileName.isEmpty() )
else
{
if ( myFileDialog->selectedFilter() == tr( "QGIS Layer Style File (*.qml)" ) )
{
//ensure the user never omitted the extension from the file name
if ( !myFileName.toUpper().endsWith( ".QML" ) )
{
myFileName += ".qml";
}
bool defaultLoadedFlag = false;
QString myMessage = mRasterLayer->loadNamedStyle( myFileName, defaultLoadedFlag );
//reset if the default style was loaded ok only
if ( defaultLoadedFlag )
{
sync();
}
else
{
//let the user know something went wrong...
QMessageBox::information( this,
tr( "Saved Style" ),
myMessage
);
}
}
else
{
QMessageBox::warning( this, tr( "QGIS" ), tr( "Unknown style format: %1" ).arg( myFileDialog->selectedFilter() ) );

}
myQSettings.setValue( "style/lastStyleDir", myFileDialog->directory().absolutePath() );
QMessageBox::information( this, tr( "Saved Style" ), message );
}

settings.setValue( "style/lastStyleDir", QFileInfo( fileName ).absolutePath() );
}


void QgsRasterLayerProperties::on_pbnSaveStyleAs_clicked()
{
QSettings settings;
QString lastUsedDir = settings.value( "style/lastStyleDir", "." ).toString();

QSettings myQSettings; // where we keep last used filter in persistent state
QString myLastUsedDir = myQSettings.value( "style/lastStyleDir", "." ).toString();
QString outputFileName = QFileDialog::getSaveFileName( this, tr( "Save layer properties as style file (.qml)" ), lastUsedDir );
if ( outputFileName.isEmpty() )
return;

//create a file dialog
std::auto_ptr < QFileDialog > myFileDialog
(
new QFileDialog(
this,
QFileDialog::tr( "Save layer properties as style file (.qml)" ),
myLastUsedDir,
tr( "QGIS Layer Style File (*.qml)" )
)
);
myFileDialog->setFileMode( QFileDialog::AnyFile );
myFileDialog->setAcceptMode( QFileDialog::AcceptSave );
// ensure the user never omits the extension from the file name
if ( !outputFileName.endsWith( ".qml", Qt::CaseInsensitive ) )
outputFileName += ".qml";

//prompt the user for a file name
QString myOutputFileName;
if ( myFileDialog->exec() == QDialog::Accepted )
bool defaultLoadedFlag = false;
QString message = mRasterLayer->saveNamedStyle( outputFileName, defaultLoadedFlag );
if ( defaultLoadedFlag )
{
QStringList myFiles = myFileDialog->selectedFiles();
if ( !myFiles.isEmpty() )
{
myOutputFileName = myFiles[0];
}
sync();
}

if ( !myOutputFileName.isEmpty() )
else
{
if ( myFileDialog->selectedFilter() == tr( "QGIS Layer Style File (*.qml)" ) )
{
//ensure the user never omitted the extension from the file name
if ( !myOutputFileName.toUpper().endsWith( ".QML" ) )
{
myOutputFileName += ".qml";
}
bool defaultLoadedFlag = false;
QString myMessage = mRasterLayer->saveNamedStyle( myOutputFileName, defaultLoadedFlag );
//reset if the default style was loaded ok only
if ( defaultLoadedFlag )
{
//don't show the message if all went well...
sync();
}
else
{
//if something went wrong let the user know why
QMessageBox::information( this,
tr( "Saved Style" ),
myMessage
);
}
}
else
{
QMessageBox::warning( this, tr( "QGIS" ), tr( "Unknown style format: %1" ).arg( myFileDialog->selectedFilter() ) );

}
myQSettings.setValue( "style/lastStyleDir", myFileDialog->directory().absolutePath() );
QMessageBox::information( this, tr( "Saved Style" ), message );
}

settings.setValue( "style/lastStyleDir", QFileInfo( outputFileName ).absolutePath() );
}

void QgsRasterLayerProperties::on_btnResetNull_clicked( )
Expand Down
128 changes: 59 additions & 69 deletions src/gui/qgisgui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,8 @@ namespace QgisGui
{
Q_UNUSED( enc );

bool haveLastUsedFilter = false; // by default, there is no last
// used filter

QSettings settings; // where we keep last used filter in
// persistent state

haveLastUsedFilter = settings.contains( "/UI/" + filterName );
QString lastUsedFilter = settings.value( "/UI/" + filterName,
QVariant( QString::null ) ).toString();

QSettings settings;
QString lastUsedFilter = settings.value( "/UI/" + filterName, "" ).toString();
QString lastUsedDir = settings.value( "/UI/" + filterName + "Dir", "." ).toString();

QgsDebugMsg( "Opening file dialog with filters: " + filters );
Expand All @@ -51,9 +43,11 @@ namespace QgisGui
else //we have to use non-native dialog to add cancel all button
{
QgsEncodingFileDialog* openFileDialog = new QgsEncodingFileDialog( 0, title, lastUsedDir, filters, QString( "" ) );

// allow for selection of more than one file
openFileDialog->setFileMode( QFileDialog::ExistingFiles );
if ( haveLastUsedFilter ) // set the filter to the last one used

if ( !lastUsedFilter.isEmpty() )
{
openFileDialog->selectFilter( lastUsedFilter );
}
Expand All @@ -77,104 +71,100 @@ namespace QgisGui
// Fix by Tim - getting the dirPath from the dialog
// directly truncates the last node in the dir path.
// This is a workaround for that
QString myFirstFileName = selectedFiles.first();
QFileInfo myFI( myFirstFileName );
QString myPath = myFI.path();
QString firstFileName = selectedFiles.first();
QFileInfo fi( firstFileName );
QString path = fi.path();

QgsDebugMsg( "Writing last used dir: " + myPath );
QgsDebugMsg( "Writing last used dir: " + path );

settings.setValue( "/UI/" + filterName, lastUsedFilter );
settings.setValue( "/UI/" + filterName + "Dir", myPath );
settings.setValue( "/UI/" + filterName + "Dir", path );
}
return false;
}

QPair<QString, QString> GUI_EXPORT getSaveAsImageName( QWidget * theParent, QString theMessage )
QPair<QString, QString> GUI_EXPORT getSaveAsImageName( QWidget *theParent, QString theMessage )
{
Q_UNUSED( theMessage );
//create a map to hold the QImageIO names and the filter names
//the QImageIO name must be passed to the mapcanvas saveas image function
typedef QMap<QString, QString> FilterMap;
FilterMap myFilterMap;

//find out the last used filter
QSettings myQSettings; // where we keep last used filter in persistent state
QString myLastUsedFilter = myQSettings.value( "/UI/lastSaveAsImageFilter" ).toString();
QString myLastUsedDir = myQSettings.value( "/UI/lastSaveAsImageDir", "." ).toString();

// get a list of supported output image types
int myCounterInt = 0;
QString myFilters;
QList<QByteArray> formats = QImageWriter::supportedImageFormats();

for ( ; myCounterInt < formats.count(); myCounterInt++ )
QMap<QString, QString> filterMap;
foreach( QByteArray format, QImageWriter::supportedImageFormats() )
{
QString myFormat = QString( formats.at( myCounterInt ) );
//svg doesnt work so skip it
if ( myFormat == "svg" )
if ( format == "svg" )
continue;

QString myFilter = createFileFilter_( myFormat + " format", "*." + myFormat );
if ( !myFilters.isEmpty() )
myFilters += ";;";
myFilters += myFilter;
myFilterMap[myFilter] = myFormat;
filterMap.insert( createFileFilter_( format + " format", "*." + format ), format );
}

#ifdef QGISDEBUG
QgsDebugMsg( "Available Filters Map: " );
FilterMap::Iterator myIterator;
for ( myIterator = myFilterMap.begin(); myIterator != myFilterMap.end(); ++myIterator )
for ( QMap<QString, QString>::iterator it = filterMap.begin(); it != filterMap.end(); ++it )
{
QgsDebugMsg( myIterator.key() + " : " + myIterator.value() );
QgsDebugMsg( it.key() + " : " + it.value() );
}
#endif

//create a file dialog using the the filter list generated above
std::auto_ptr < QFileDialog > myQFileDialog( new QFileDialog( theParent,
QObject::tr( "Choose a file name to save the map image as" ),
myLastUsedDir, myFilters ) );
//find out the last used filter
QSettings settings; // where we keep last used filter in persistent state
QString lastUsedFilter = settings.value( "/UI/lastSaveAsImageFilter" ).toString();
QString lastUsedDir = settings.value( "/UI/lastSaveAsImageDir", "." ).toString();

// allow for selection of more than one file
myQFileDialog->setFileMode( QFileDialog::AnyFile );
QString outputFileName;
QString selectedFilter = lastUsedFilter;
QString ext;

myQFileDialog->setAcceptMode( QFileDialog::AcceptSave );
#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
outputFileName = QFileDialog::getSaveFileName( theParent, theMessage, lastUsedDir, QStringList( filterMap.keys() ).join( ";;" ), &selectedFilter );

myQFileDialog->setConfirmOverwrite( true );
if ( !outputFileName.isNull() )
{
ext = filterMap.value( selectedFilter, QString::null );
if ( !ext.isNull() )
settings.setValue( "/UI/lastSaveAsImageFilter", selectedFilter );
settings.setValue( "/UI/lastSaveAsImageDir", QFileInfo( outputFileName ).absolutePath() );
}
#else
//create a file dialog using the the filter list generated above
std::auto_ptr<QFileDialog> fileDialog( new QFileDialog( theParent, theMessage, lastUsedDir, QStringList( filterMap.keys() ).join( ";;" ) ) );

// allow for selection of more than one file
fileDialog->setFileMode( QFileDialog::AnyFile );
fileDialog->setAcceptMode( QFileDialog::AcceptSave );
fileDialog->setConfirmOverwrite( true );

if ( !myLastUsedFilter.isEmpty() ) // set the filter to the last one used
if ( !lastUsedFilter.isEmpty() ) // set the filter to the last one used
{
myQFileDialog->selectFilter( myLastUsedFilter );
fileDialog->selectFilter( lastUsedFilter );
}

//prompt the user for a fileName
QString myOutputFileName; // = myQFileDialog->getSaveFileName(); //delete this
if ( myQFileDialog->exec() == QDialog::Accepted )
if ( fileDialog->exec() == QDialog::Accepted )
{
myOutputFileName = myQFileDialog->selectedFiles().first();
outputFileName = fileDialog->selectedFiles().first();
}

QString myFilterString = myQFileDialog->selectedFilter();
QgsDebugMsg( "Selected filter: " + myFilterString );
QgsDebugMsg( "Image type: " + myFilterMap[myFilterString] );
selectedFilter = fileDialog->selectedFilter();
QgsDebugMsg( "Selected filter: " + selectedFilter );
ext = filterMap.value( selectedFilter, QString::null );

if ( !ext.isNull() )
settings.setValue( "/UI/lastSaveAsImageFilter", selectedFilter );

settings.setValue( "/UI/lastSaveAsImageDir", fileDialog->directory().absolutePath() );
#endif

// Add the file type suffix to the fileName if required
if ( !myOutputFileName.endsWith( myFilterMap[myFilterString] ) )
if ( !ext.isNull() && !outputFileName.endsWith( "." + ext ) )
{
myOutputFileName += "." + myFilterMap[myFilterString];
outputFileName += "." + ext;
}

myQSettings.setValue( "/UI/lastSaveAsImageFilter", myFilterString );
myQSettings.setValue( "/UI/lastSaveAsImageDir", myQFileDialog->directory().absolutePath() );
QPair <QString, QString> myPair;
myPair.first = myOutputFileName;
myPair.second = myFilterMap[myFilterString];
return myPair;
} //
return qMakePair<QString, QString>( outputFileName, ext );
}

QString createFileFilter_( QString const &longName, QString const &glob )
{
return longName + " (" + glob.toLower() + " " + glob.toUpper() + ")";
} // createFileFilter_
}

} // end of QgisGui namespace
63 changes: 28 additions & 35 deletions src/plugins/grass/qgsgrassmodule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3409,46 +3409,39 @@ QStringList QgsGrassModuleFile::options()

void QgsGrassModuleFile::browse()
{
// TODO: unfortunately QFileDialog does not support 'new' directory
QFileDialog *fd = new QFileDialog( this, NULL, mLineEdit->text() );
static QString lastDir = QDir::currentPath();

static QDir currentDir = QDir::current();
fd->setDirectory( currentDir );

switch ( mType )
if ( mType == Multiple )
{
case New:
fd->setFileMode( QFileDialog::AnyFile );
fd->setAcceptMode( QFileDialog::AcceptSave );
break;
case Multiple:
fd->setFileMode( QFileDialog::ExistingFiles );
fd->setAcceptMode( QFileDialog::AcceptOpen );
break;
case Directory:
fd->setFileMode( QFileDialog::Directory );
fd->setAcceptMode( QFileDialog::AcceptOpen );
break;
default:
fd->setFileMode( QFileDialog::ExistingFile );
fd->setAcceptMode( QFileDialog::AcceptOpen );
}
QString path = mLineEdit->text().split( "," ).first();
if ( path.isEmpty() )
path = lastDir;
else
path = QFileInfo( path ).absolutePath();

if ( mFilters.size() > 0 )
{
fd->setFilters( mFilters );
}
fd->setDefaultSuffix( mSuffix );
QStringList files = QFileDialog::getOpenFileNames( this, 0, path );
if ( files.isEmpty() )
return;

if ( fd->exec() == QDialog::Accepted )
lastDir = QFileInfo( files[0] ).absolutePath();

mLineEdit->setText( files.join( "," ) );
}
else
{
QString selectedFile = fd->selectedFiles().last();
QFileInfo fi = QFileInfo( selectedFile );
currentDir = fi.absoluteDir();
if ( mType == Multiple )
{
selectedFile = fd->selectedFiles().join( "," );
}
QString selectedFile = mLineEdit->text();
if ( selectedFile.isEmpty() )
selectedFile = lastDir;

if ( mType == New )
selectedFile = QFileDialog::getSaveFileName( this, 0, selectedFile );
else if ( mType == Directory )
selectedFile = QFileDialog::getExistingDirectory( this, 0, selectedFile );
else
selectedFile = QFileDialog::getOpenFileName( this, 0, selectedFile );

lastDir = QFileInfo( selectedFile ).absolutePath();

mLineEdit->setText( selectedFile );
}
}
Expand Down
13 changes: 5 additions & 8 deletions src/plugins/grass/qgsgrassnewmapset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,15 +154,12 @@ QgsGrassNewMapset::~QgsGrassNewMapset()
/*************************** DATABASE *******************************/
void QgsGrassNewMapset::browseDatabase()
{
// TODO: unfortunately QFileDialog does not support 'new' directory
QFileDialog *fd = new QFileDialog( this, NULL, mDatabaseLineEdit->text() );
fd->setFileMode( QFileDialog::DirectoryOnly );
QString selectedDir = QFileDialog::getExistingDirectory( this, NULL, mDatabaseLineEdit->text() );
if ( selectedDir.isEmpty() )
return;

if ( fd->exec() == QDialog::Accepted )
{
mDatabaseLineEdit->setText( fd->selectedFiles().first() );
databaseChanged();
}
mDatabaseLineEdit->setText( selectedDir );
databaseChanged();
}

void QgsGrassNewMapset::databaseChanged()
Expand Down