QString createFileFilter_( QString const &format ) { QString longName = format.toUpper() + " format"; QString glob = "*." + format; return createFileFilter_( longName, glob ); }
QPair<QString, QString> GUI_EXPORT getSaveAsImageName( QWidget *parent, const QString &message, const QString &defaultFilename ) { // get a list of supported output image types QMap<QString, QString> filterMap; Q_FOREACH ( const QByteArray &format, QImageWriter::supportedImageFormats() ) { //svg doesn't work so skip it if ( format == "svg" ) continue; filterMap.insert( createFileFilter_( format ), format ); } #ifdef QGISDEBUG QgsDebugMsg( QStringLiteral( "Available Filters Map: " ) ); for ( QMap<QString, QString>::iterator it = filterMap.begin(); it != filterMap.end(); ++it ) { QgsDebugMsg( it.key() + " : " + it.value() ); } #endif QgsSettings settings; // where we keep last used filter in persistent state QString lastUsedDir = settings.value( QStringLiteral( "UI/lastSaveAsImageDir" ), QDir::homePath() ).toString(); // Prefer "png" format unless the user previously chose a different format QString pngExtension = QStringLiteral( "png" ); QString pngFilter = createFileFilter_( pngExtension ); QString selectedFilter = settings.value( QStringLiteral( "UI/lastSaveAsImageFilter" ), pngFilter ).toString(); QString initialPath; if ( defaultFilename.isNull() ) { //no default filename provided, just use last directory initialPath = lastUsedDir; } else { //a default filename was provided, so use it to build the initial path initialPath = QDir( lastUsedDir ).filePath( defaultFilename ); } QString outputFileName; QString ext; #if defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(Q_OS_LINUX) outputFileName = QFileDialog::getSaveFileName( parent, message, initialPath, QStringList( filterMap.keys() ).join( QStringLiteral( ";;" ) ), &selectedFilter ); if ( !outputFileName.isNull() ) { ext = filterMap.value( selectedFilter, QString() ); if ( !ext.isNull() ) settings.setValue( QStringLiteral( "UI/lastSaveAsImageFilter" ), selectedFilter ); settings.setValue( QStringLiteral( "UI/lastSaveAsImageDir" ), QFileInfo( outputFileName ).absolutePath() ); } #else //create a file dialog using the filter list generated above std::unique_ptr<QFileDialog> fileDialog( new QFileDialog( parent, message, initialPath, QStringList( filterMap.keys() ).join( ";;" ) ) ); // allow for selection of more than one file fileDialog->setFileMode( QFileDialog::AnyFile ); fileDialog->setAcceptMode( QFileDialog::AcceptSave ); fileDialog->setOption( QFileDialog::DontConfirmOverwrite, false ); if ( !selectedFilter.isEmpty() ) // set the filter to the last one used { fileDialog->selectNameFilter( selectedFilter ); } //prompt the user for a fileName if ( fileDialog->exec() == QDialog::Accepted ) { outputFileName = fileDialog->selectedFiles().first(); } selectedFilter = fileDialog->selectedNameFilter(); QgsDebugMsg( "Selected filter: " + selectedFilter ); ext = filterMap.value( selectedFilter, QString() ); 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 ( !ext.isNull() && !outputFileName.endsWith( '.' + ext.toLower(), Qt::CaseInsensitive ) ) { outputFileName += '.' + ext; } return qMakePair<QString, QString>( outputFileName, ext ); }
QPair<QString, QString> GUI_EXPORT getSaveAsImageName( QWidget *theParent, QString theMessage, QString defaultFilename ) { // get a list of supported output image types QMap<QString, QString> filterMap; foreach ( QByteArray format, QImageWriter::supportedImageFormats() ) { //svg doesnt work so skip it if ( format == "svg" ) continue; filterMap.insert( createFileFilter_( format.toUpper() + " format", "*." + format ), format ); } #ifdef QGISDEBUG QgsDebugMsg( "Available Filters Map: " ); for ( QMap<QString, QString>::iterator it = filterMap.begin(); it != filterMap.end(); ++it ) { QgsDebugMsg( it.key() + " : " + it.value() ); } #endif //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(); QString outputFileName; QString selectedFilter = lastUsedFilter; QString ext; QString initialPath; if ( defaultFilename.isNull() ) { //no default filename provided, just use last directory initialPath = lastUsedDir; } else { //a default filename was provided, so use it to build the initial path initialPath = QDir( lastUsedDir ).filePath( defaultFilename ); } #if defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(Q_OS_LINUX) outputFileName = QFileDialog::getSaveFileName( theParent, theMessage, initialPath, QStringList( filterMap.keys() ).join( ";;" ), &selectedFilter ); 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 filter list generated above QScopedPointer<QFileDialog> fileDialog( new QFileDialog( theParent, theMessage, initialPath, QStringList( filterMap.keys() ).join( ";;" ) ) ); // allow for selection of more than one file fileDialog->setFileMode( QFileDialog::AnyFile ); fileDialog->setAcceptMode( QFileDialog::AcceptSave ); fileDialog->setConfirmOverwrite( true ); if ( !lastUsedFilter.isEmpty() ) // set the filter to the last one used { fileDialog->selectNameFilter( lastUsedFilter ); } //prompt the user for a fileName if ( fileDialog->exec() == QDialog::Accepted ) { outputFileName = fileDialog->selectedFiles().first(); } 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 ( !ext.isNull() && !outputFileName.toLower().endsWith( "." + ext.toLower() ) ) { outputFileName += "." + ext; } return qMakePair<QString, QString>( outputFileName, ext ); }