Skip to content

Commit f749a5e

Browse files
committedJan 27, 2012
use native file dialogs wherever possible (fixes #3763)
1 parent f294c16 commit f749a5e

File tree

7 files changed

+187
-400
lines changed

7 files changed

+187
-400
lines changed
 

‎src/app/composer/qgscomposer.cpp

Lines changed: 39 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -534,37 +534,27 @@ class QgsPaintEngineHack : public QPaintEngine
534534
void QgsComposer::on_mActionExportAsPDF_triggered()
535535
{
536536
QSettings myQSettings; // where we keep last used filter in persistent state
537-
QString myLastUsedFile = myQSettings.value( "/UI/lastSaveAsPdfFile", "qgis.pdf" ).toString();
538-
QFileInfo file( myLastUsedFile );
539-
QFileDialog *myQFileDialog = new QFileDialog( this, tr( "Choose a file name to save the map as" ),
540-
file.path(), tr( "PDF Format" ) + " (*.pdf *PDF)" );
541-
myQFileDialog->selectFile( file.fileName() );
542-
myQFileDialog->setFileMode( QFileDialog::AnyFile );
543-
myQFileDialog->setConfirmOverwrite( true );
544-
myQFileDialog->setAcceptMode( QFileDialog::AcceptSave );
545-
546-
int result = myQFileDialog->exec();
547-
raise();
548-
if ( result != QDialog::Accepted )
537+
QString lastUsedFile = myQSettings.value( "/UI/lastSaveAsPdfFile", "qgis.pdf" ).toString();
538+
QFileInfo file( lastUsedFile );
539+
540+
QString outputFileName = QFileDialog::getSaveFileName(
541+
this,
542+
tr( "Choose a file name to save the map as" ),
543+
file.path(),
544+
tr( "PDF Format" ) + " (*.pdf *.PDF)" );
545+
if ( outputFileName.isEmpty() )
549546
return;
550547

551-
QString myOutputFileNameQString = myQFileDialog->selectedFiles().first();
552-
if ( myOutputFileNameQString == "" )
553-
{
554-
return;
555-
}
556-
557-
if ( !myOutputFileNameQString.endsWith( ".pdf", Qt::CaseInsensitive ) )
548+
if ( !outputFileName.endsWith( ".pdf", Qt::CaseInsensitive ) )
558549
{
559-
myOutputFileNameQString.append( ".pdf" );
550+
outputFileName += ".pdf";
560551
}
561552

562-
myQSettings.setValue( "/UI/lastSaveAsPdfFile", myOutputFileNameQString );
553+
myQSettings.setValue( "/UI/lastSaveAsPdfFile", outputFileName );
563554

564555
QPrinter printer;
565-
566556
printer.setOutputFormat( QPrinter::PdfFormat );
567-
printer.setOutputFileName( myOutputFileNameQString );
557+
printer.setOutputFileName( outputFileName );
568558
printer.setPaperSize( QSizeF( mComposition->paperWidth(), mComposition->paperHeight() ), QPrinter::Millimeter );
569559

570560
QPaintEngine *engine = printer.paintEngine();
@@ -697,93 +687,12 @@ void QgsComposer::on_mActionExportAsImage_triggered()
697687
return;
698688
}
699689

700-
// Get file and format (stolen from qgisapp.cpp but modified significantely)
701-
702-
//create a map to hold the QImageIO names and the filter names
703-
//the QImageIO name must be passed to the mapcanvas saveas image function
704-
typedef QMap<QString, QString> FilterMap;
705-
FilterMap myFilterMap;
706-
707-
//find out the last used filter
708-
QSettings myQSettings; // where we keep last used filter in persistent state
709-
QString myLastUsedFormat = myQSettings.value( "/UI/lastSaveAsImageFormat", "png" ).toString();
710-
QString myLastUsedFile = myQSettings.value( "/UI/lastSaveAsImageFile", "qgis.png" ).toString();
711-
QFileInfo file( myLastUsedFile );
712-
713-
// get a list of supported output image types
714-
int myCounterInt = 0;
715-
QString myFilters;
716-
QString myLastUsedFilter;
717-
for ( ; myCounterInt < QImageWriter::supportedImageFormats().count(); myCounterInt++ )
718-
{
719-
QString myFormat = QString( QImageWriter::supportedImageFormats().at( myCounterInt ) );
720-
QString myFilter = tr( "%1 format (*.%2 *.%3)" )
721-
.arg( myFormat ).arg( myFormat.toLower() ).arg( myFormat.toUpper() );
722-
723-
if ( myCounterInt > 0 )
724-
myFilters += ";;";
725-
myFilters += myFilter;
726-
myFilterMap[myFilter] = myFormat;
727-
if ( myFormat == myLastUsedFormat )
728-
{
729-
myLastUsedFilter = myFilter;
730-
}
731-
}
732-
#ifdef QGISDEBUG
733-
QgsDebugMsg( "Available Filters Map: " );
734-
FilterMap::Iterator myIterator;
735-
for ( myIterator = myFilterMap.begin(); myIterator != myFilterMap.end(); ++myIterator )
736-
{
737-
QgsDebugMsg( QString( "%1 : %2" ).arg( myIterator.key() ).arg( myIterator.value() ) );
738-
}
739-
#endif
740-
741-
//create a file dialog using the the filter list generated above
742-
std::auto_ptr < QFileDialog > myQFileDialog(
743-
new QFileDialog(
744-
this,
745-
tr( "Choose a file name to save the map image as" ),
746-
file.path(),
747-
myFilters
748-
)
749-
);
750-
751-
myQFileDialog->setFileMode( QFileDialog::AnyFile );
752-
myQFileDialog->setConfirmOverwrite( true );
753-
754-
// set the filter to the last one used
755-
myQFileDialog->selectFilter( myLastUsedFilter );
756-
757-
// set the 'Open' button to something that makes more sense
758-
myQFileDialog->setAcceptMode( QFileDialog::AcceptSave );
759-
760-
//prompt the user for a file name
761-
QString myOutputFileNameQString;
762-
763-
int result = myQFileDialog->exec();
764-
//raise();
765-
766-
if ( result != QDialog::Accepted )
767-
{
768-
return;
769-
}
770-
771-
myOutputFileNameQString = myQFileDialog->selectedFiles().last();
772-
QgsDebugMsg( myOutputFileNameQString );
773-
QString myFilterString = myQFileDialog->selectedFilter();
774-
QgsDebugMsg( QString( "Selected filter: %1" ).arg( myFilterString ) );
775-
QgsDebugMsg( QString( "Image type: %1" ).arg( myFilterMap[myFilterString] ) );
776-
777-
// Add the file type suffix to the fileName if required
778-
if ( !myOutputFileNameQString.endsWith( myFilterMap[myFilterString] ) )
779-
{
780-
myOutputFileNameQString += "." + myFilterMap[myFilterString];
781-
}
690+
QPair<QString, QString> fileNExt = QgisGui::getSaveAsImageName( this, tr( "Choose a file name to save the map image as" ) );
782691

783-
myQSettings.setValue( "/UI/lastSaveAsImageFormat", myFilterMap[myFilterString] );
784-
myQSettings.setValue( "/UI/lastSaveAsImageFile", myOutputFileNameQString );
692+
QgsDebugMsg( QString( "Selected filter: %1" ).arg( fileNExt.first ) );
693+
QgsDebugMsg( QString( "Image type: %1" ).arg( fileNExt.second ) );
785694

786-
if ( myOutputFileNameQString == "" )
695+
if ( fileNExt.first.isEmpty() )
787696
return;
788697

789698
QImage image( QSize( width, height ), QImage::Format_ARGB32 );
@@ -809,7 +718,7 @@ void QgsComposer::on_mActionExportAsImage_triggered()
809718
p.end();
810719
mComposition->setPlotStyle( QgsComposition::Preview );
811720
mView->setPaintingEnabled( true );
812-
image.save( myOutputFileNameQString, myFilterMap[myFilterString].toLocal8Bit().data() );
721+
image.save( fileNExt.first, fileNExt.second.toLocal8Bit().constData() );
813722
}
814723

815724

@@ -820,10 +729,10 @@ void QgsComposer::on_mActionExportAsSVG_triggered()
820729
showWMSPrintingWarning();
821730
}
822731

823-
QString myQSettingsLabel = "/UI/displaySVGWarning";
824-
QSettings myQSettings;
732+
QString settingsLabel = "/UI/displaySVGWarning";
733+
QSettings settings;
825734

826-
bool displaySVGWarning = myQSettings.value( myQSettingsLabel, true ).toBool();
735+
bool displaySVGWarning = settings.value( settingsLabel, true ).toBool();
827736

828737
if ( displaySVGWarning )
829738
{
@@ -832,7 +741,7 @@ void QgsComposer::on_mActionExportAsSVG_triggered()
832741
m->setCheckBoxText( tr( "Don't show this message again" ) );
833742
m->setCheckBoxState( Qt::Unchecked );
834743
m->setCheckBoxVisible( true );
835-
m->setCheckBoxQSettingsLabel( myQSettingsLabel );
744+
m->setCheckBoxQSettingsLabel( settingsLabel );
836745
m->setMessageAsHtml( tr( "<p>The SVG export function in Qgis has several "
837746
"problems due to bugs and deficiencies in the " )
838747
+ tr( "Qt4 svg code. In particular, there are problems "
@@ -845,39 +754,31 @@ void QgsComposer::on_mActionExportAsSVG_triggered()
845754
"</p>" ) );
846755
m->exec();
847756
}
848-
QString myLastUsedFile = myQSettings.value( "/UI/lastSaveAsSvgFile", "qgis.svg" ).toString();
849-
QFileInfo file( myLastUsedFile );
850-
QFileDialog *myQFileDialog = new QFileDialog( this, tr( "Choose a file name to save the map as" ),
851-
file.path(), tr( "SVG Format" ) + " (*.svg *SVG)" );
852-
myQFileDialog->selectFile( file.fileName() );
853-
myQFileDialog->setFileMode( QFileDialog::AnyFile );
854-
myQFileDialog->setConfirmOverwrite( true );
855-
myQFileDialog->setAcceptMode( QFileDialog::AcceptSave );
856757

857-
int result = myQFileDialog->exec();
858-
raise();
859-
if ( result != QDialog::Accepted )
860-
return;
758+
QString lastUsedFile = settings.value( "/UI/lastSaveAsSvgFile", "qgis.svg" ).toString();
759+
QFileInfo file( lastUsedFile );
861760

862-
QString myOutputFileNameQString = myQFileDialog->selectedFiles().first();
863-
if ( myOutputFileNameQString == "" )
864-
{
761+
QString outputFileName = QFileDialog::getSaveFileName(
762+
this,
763+
tr( "Choose a file name to save the map as" ),
764+
file.path(),
765+
tr( "SVG Format" ) + " (*.svg *.SVG)" );
766+
if ( outputFileName.isEmpty() )
865767
return;
866-
}
867768

868-
if ( !myOutputFileNameQString.endsWith( ".svg", Qt::CaseInsensitive ) )
769+
if ( !outputFileName.endsWith( ".svg", Qt::CaseInsensitive ) )
869770
{
870-
myOutputFileNameQString.append( ".svg" );
771+
outputFileName += ".svg";
871772
}
872773

873-
myQSettings.setValue( "/UI/lastSaveAsSvgFile", myOutputFileNameQString );
774+
settings.setValue( "/UI/lastSaveAsSvgFile", outputFileName );
874775
mComposition->setPlotStyle( QgsComposition::Print );
875776

876777
QSvgGenerator generator;
877778
#if QT_VERSION >= 0x040500
878779
generator.setTitle( QgsProject::instance()->title() );
879780
#endif
880-
generator.setFileName( myOutputFileNameQString );
781+
generator.setFileName( outputFileName );
881782
//width in pixel
882783
int width = ( int )( mComposition->paperWidth() * mComposition->printResolution() / 25.4 );
883784
//height in pixel
@@ -976,11 +877,13 @@ void QgsComposer::on_mActionSaveAsTemplate_triggered()
976877
//show file dialog
977878
QSettings settings;
978879
QString lastSaveDir = settings.value( "UI/lastComposerTemplateDir", "" ).toString();
979-
QString saveFileName = QFileDialog::getSaveFileName( 0, tr( "save template" ), lastSaveDir, "*.qpt" );
880+
QString saveFileName = QFileDialog::getSaveFileName(
881+
this,
882+
tr( "Save template" ),
883+
lastSaveDir,
884+
tr( "Composer templates" ) + " (*.qpt *.QPT)" );
980885
if ( saveFileName.isEmpty() )
981-
{
982886
return;
983-
}
984887

985888
QFileInfo saveFileInfo( saveFileName );
986889
//check if suffix has been added

‎src/app/qgisapp.cpp

Lines changed: 18 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2701,7 +2701,7 @@ void QgisApp::fileOpen()
27012701
// Retrieve last used project dir from persistent settings
27022702
QSettings settings;
27032703
QString lastUsedDir = settings.value( "/UI/lastProjectDir", "." ).toString();
2704-
QString fullPath = QFileDialog::getOpenFileName( this, tr( "Choose a QGIS project file to open" ), lastUsedDir, tr( "QGis files (*.qgs)" ) );
2704+
QString fullPath = QFileDialog::getOpenFileName( this, tr( "Choose a QGIS project file to open" ), lastUsedDir, tr( "QGis files (*.qgs *.QGS)" ) );
27052705
if ( fullPath.isNull() )
27062706
{
27072707
return;
@@ -2840,31 +2840,20 @@ bool QgisApp::fileSave()
28402840
QSettings settings;
28412841
QString lastUsedDir = settings.value( "/UI/lastProjectDir", "." ).toString();
28422842

2843-
std::auto_ptr<QFileDialog> saveFileDialog( new QFileDialog( this,
2844-
tr( "Choose a QGIS project file" ),
2845-
lastUsedDir, tr( "QGis files (*.qgs)" ) ) );
2843+
QString path = QFileDialog::getSaveFileName(
2844+
this,
2845+
tr( "Choose a QGIS project file" ),
2846+
lastUsedDir + "/" + QgsProject::instance()->title(),
2847+
tr( "QGis files (*.qgs *.QGS)" ) );
2848+
if ( path.isEmpty() )
2849+
return true;
28462850

2847-
saveFileDialog->setFileMode( QFileDialog::AnyFile );
2848-
saveFileDialog->setAcceptMode( QFileDialog::AcceptSave );
2849-
saveFileDialog->setConfirmOverwrite( true );
2850-
saveFileDialog->selectFile( QgsProject::instance()->title() );
2851-
2852-
if ( saveFileDialog->exec() == QDialog::Accepted )
2853-
{
2854-
fullPath.setFile( saveFileDialog->selectedFiles().first() );
2855-
}
2856-
else
2857-
{
2858-
// if they didn't select anything, just return
2859-
// delete saveFileDialog; auto_ptr auto destroys
2860-
return false;
2861-
}
2851+
QFileInfo fullPath( path );
28622852

28632853
// make sure we have the .qgs extension in the file name
2864-
if ( "qgs" != fullPath.suffix() )
2854+
if ( "qgs" != fullPath.suffix().toLower() )
28652855
{
2866-
QString newFilePath = fullPath.filePath() + ".qgs";
2867-
fullPath.setFile( newFilePath );
2856+
fullPath.setFile( fullPath.filePath() + ".qgs" );
28682857
}
28692858

28702859

@@ -2904,33 +2893,18 @@ void QgisApp::fileSaveAs()
29042893
QSettings settings;
29052894
QString lastUsedDir = settings.value( "/UI/lastProjectDir", "." ).toString();
29062895

2907-
std::auto_ptr<QFileDialog> saveFileDialog( new QFileDialog( this,
2908-
tr( "Choose a file name to save the QGIS project file as" ),
2909-
lastUsedDir, tr( "QGis files (*.qgs)" ) ) );
2910-
saveFileDialog->setFileMode( QFileDialog::AnyFile );
2911-
saveFileDialog->setAcceptMode( QFileDialog::AcceptSave );
2912-
saveFileDialog->setConfirmOverwrite( true );
2913-
saveFileDialog->selectFile( QgsProject::instance()->title() );
2914-
2915-
QFileInfo fullPath;
2916-
if ( saveFileDialog->exec() == QDialog::Accepted )
2917-
{
2918-
//saveFilePath = saveFileDialog->selectedFiles().first();
2919-
fullPath.setFile( saveFileDialog->selectedFiles().first() );
2920-
}
2921-
else
2922-
{
2896+
QString path = QFileDialog::getSaveFileName( this, tr( "Choose a file name to save the QGIS project file as" ), lastUsedDir + "/" + QgsProject::instance()->title(), tr( "QGis files (*.qgs *.QGS)" ) );
2897+
if ( path.isEmpty() )
29232898
return;
2924-
}
29252899

2926-
QString myPath = fullPath.path();
2927-
settings.setValue( "/UI/lastProjectDir", myPath );
2900+
QFileInfo fullPath( path );
2901+
2902+
settings.setValue( "/UI/lastProjectDir", fullPath.path() );
29282903

29292904
// make sure the .qgs extension is included in the path name. if not, add it...
2930-
if ( "qgs" != fullPath.suffix() )
2905+
if ( "qgs" != fullPath.suffix().toLower() )
29312906
{
2932-
myPath = fullPath.filePath() + ".qgs";
2933-
fullPath.setFile( myPath );
2907+
fullPath.setFile( fullPath.filePath() + ".qgs" );
29342908
}
29352909

29362910
QgsProject::instance()->setFileName( fullPath.filePath() );

‎src/app/qgsembedlayerdialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ void QgsEmbedLayerDialog::on_mBrowseFileToolButton_clicked()
6262
mProjectFileLineEdit->blockSignals( true );
6363

6464
QSettings s;
65-
QString projectFile = QFileDialog::getOpenFileName( 0, tr( "Select project file" ), s.value( "/qgis/last_embedded_project_path" ).toString() , tr( "QGIS project files (*.qgs)" ) );
65+
QString projectFile = QFileDialog::getOpenFileName( 0, tr( "Select project file" ), s.value( "/qgis/last_embedded_project_path" ).toString() , tr( "QGIS project files (*.qgs *.QGS)" ) );
6666
if ( !projectFile.isEmpty() )
6767
{
6868
mProjectFileLineEdit->setText( projectFile );

‎src/app/qgsrasterlayerproperties.cpp

Lines changed: 37 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -2950,131 +2950,61 @@ void QgsRasterLayerProperties::on_pbnSaveDefaultStyle_clicked()
29502950

29512951
void QgsRasterLayerProperties::on_pbnLoadStyle_clicked()
29522952
{
2953-
QSettings myQSettings; // where we keep last used filter in persistent state
2954-
QString myLastUsedDir = myQSettings.value( "style/lastStyleDir", "." ).toString();
2953+
QSettings settings;
2954+
QString lastUsedDir = settings.value( "style/lastStyleDir", "." ).toString();
2955+
2956+
QString fileName = QFileDialog::getOpenFileName(
2957+
this,
2958+
tr( "Load layer properties from style file (.qml)" ),
2959+
lastUsedDir,
2960+
tr( "QGIS Layer Style File (*.qml)" ) );
2961+
if ( fileName.isEmpty() )
2962+
return;
29552963

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

2969-
//prompt the user for a file name
2970-
QString myFileName;
2971-
if ( myFileDialog->exec() == QDialog::Accepted )
2968+
bool defaultLoadedFlag = false;
2969+
QString message = mRasterLayer->loadNamedStyle( fileName, defaultLoadedFlag );
2970+
if ( defaultLoadedFlag )
29722971
{
2973-
QStringList myFiles = myFileDialog->selectedFiles();
2974-
if ( !myFiles.isEmpty() )
2975-
{
2976-
myFileName = myFiles[0];
2977-
}
2972+
sync();
29782973
}
2979-
2980-
if ( !myFileName.isEmpty() )
2974+
else
29812975
{
2982-
if ( myFileDialog->selectedFilter() == tr( "QGIS Layer Style File (*.qml)" ) )
2983-
{
2984-
//ensure the user never omitted the extension from the file name
2985-
if ( !myFileName.toUpper().endsWith( ".QML" ) )
2986-
{
2987-
myFileName += ".qml";
2988-
}
2989-
bool defaultLoadedFlag = false;
2990-
QString myMessage = mRasterLayer->loadNamedStyle( myFileName, defaultLoadedFlag );
2991-
//reset if the default style was loaded ok only
2992-
if ( defaultLoadedFlag )
2993-
{
2994-
sync();
2995-
}
2996-
else
2997-
{
2998-
//let the user know something went wrong...
2999-
QMessageBox::information( this,
3000-
tr( "Saved Style" ),
3001-
myMessage
3002-
);
3003-
}
3004-
}
3005-
else
3006-
{
3007-
QMessageBox::warning( this, tr( "QGIS" ), tr( "Unknown style format: %1" ).arg( myFileDialog->selectedFilter() ) );
3008-
3009-
}
3010-
myQSettings.setValue( "style/lastStyleDir", myFileDialog->directory().absolutePath() );
2976+
QMessageBox::information( this, tr( "Saved Style" ), message );
30112977
}
2978+
2979+
settings.setValue( "style/lastStyleDir", QFileInfo( fileName ).absolutePath() );
30122980
}
30132981

30142982

30152983
void QgsRasterLayerProperties::on_pbnSaveStyleAs_clicked()
30162984
{
2985+
QSettings settings;
2986+
QString lastUsedDir = settings.value( "style/lastStyleDir", "." ).toString();
30172987

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

3021-
//create a file dialog
3022-
std::auto_ptr < QFileDialog > myFileDialog
3023-
(
3024-
new QFileDialog(
3025-
this,
3026-
QFileDialog::tr( "Save layer properties as style file (.qml)" ),
3027-
myLastUsedDir,
3028-
tr( "QGIS Layer Style File (*.qml)" )
3029-
)
3030-
);
3031-
myFileDialog->setFileMode( QFileDialog::AnyFile );
3032-
myFileDialog->setAcceptMode( QFileDialog::AcceptSave );
2992+
// ensure the user never omits the extension from the file name
2993+
if ( !outputFileName.endsWith( ".qml", Qt::CaseInsensitive ) )
2994+
outputFileName += ".qml";
30332995

3034-
//prompt the user for a file name
3035-
QString myOutputFileName;
3036-
if ( myFileDialog->exec() == QDialog::Accepted )
2996+
bool defaultLoadedFlag = false;
2997+
QString message = mRasterLayer->saveNamedStyle( outputFileName, defaultLoadedFlag );
2998+
if ( defaultLoadedFlag )
30372999
{
3038-
QStringList myFiles = myFileDialog->selectedFiles();
3039-
if ( !myFiles.isEmpty() )
3040-
{
3041-
myOutputFileName = myFiles[0];
3042-
}
3000+
sync();
30433001
}
3044-
3045-
if ( !myOutputFileName.isEmpty() )
3002+
else
30463003
{
3047-
if ( myFileDialog->selectedFilter() == tr( "QGIS Layer Style File (*.qml)" ) )
3048-
{
3049-
//ensure the user never omitted the extension from the file name
3050-
if ( !myOutputFileName.toUpper().endsWith( ".QML" ) )
3051-
{
3052-
myOutputFileName += ".qml";
3053-
}
3054-
bool defaultLoadedFlag = false;
3055-
QString myMessage = mRasterLayer->saveNamedStyle( myOutputFileName, defaultLoadedFlag );
3056-
//reset if the default style was loaded ok only
3057-
if ( defaultLoadedFlag )
3058-
{
3059-
//don't show the message if all went well...
3060-
sync();
3061-
}
3062-
else
3063-
{
3064-
//if something went wrong let the user know why
3065-
QMessageBox::information( this,
3066-
tr( "Saved Style" ),
3067-
myMessage
3068-
);
3069-
}
3070-
}
3071-
else
3072-
{
3073-
QMessageBox::warning( this, tr( "QGIS" ), tr( "Unknown style format: %1" ).arg( myFileDialog->selectedFilter() ) );
3074-
3075-
}
3076-
myQSettings.setValue( "style/lastStyleDir", myFileDialog->directory().absolutePath() );
3004+
QMessageBox::information( this, tr( "Saved Style" ), message );
30773005
}
3006+
3007+
settings.setValue( "style/lastStyleDir", QFileInfo( outputFileName ).absolutePath() );
30783008
}
30793009

30803010
void QgsRasterLayerProperties::on_btnResetNull_clicked( )

‎src/gui/qgisgui.cpp

Lines changed: 59 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,8 @@ namespace QgisGui
3131
{
3232
Q_UNUSED( enc );
3333

34-
bool haveLastUsedFilter = false; // by default, there is no last
35-
// used filter
36-
37-
QSettings settings; // where we keep last used filter in
38-
// persistent state
39-
40-
haveLastUsedFilter = settings.contains( "/UI/" + filterName );
41-
QString lastUsedFilter = settings.value( "/UI/" + filterName,
42-
QVariant( QString::null ) ).toString();
43-
34+
QSettings settings;
35+
QString lastUsedFilter = settings.value( "/UI/" + filterName, "" ).toString();
4436
QString lastUsedDir = settings.value( "/UI/" + filterName + "Dir", "." ).toString();
4537

4638
QgsDebugMsg( "Opening file dialog with filters: " + filters );
@@ -51,9 +43,11 @@ namespace QgisGui
5143
else //we have to use non-native dialog to add cancel all button
5244
{
5345
QgsEncodingFileDialog* openFileDialog = new QgsEncodingFileDialog( 0, title, lastUsedDir, filters, QString( "" ) );
46+
5447
// allow for selection of more than one file
5548
openFileDialog->setFileMode( QFileDialog::ExistingFiles );
56-
if ( haveLastUsedFilter ) // set the filter to the last one used
49+
50+
if ( !lastUsedFilter.isEmpty() )
5751
{
5852
openFileDialog->selectFilter( lastUsedFilter );
5953
}
@@ -77,104 +71,100 @@ namespace QgisGui
7771
// Fix by Tim - getting the dirPath from the dialog
7872
// directly truncates the last node in the dir path.
7973
// This is a workaround for that
80-
QString myFirstFileName = selectedFiles.first();
81-
QFileInfo myFI( myFirstFileName );
82-
QString myPath = myFI.path();
74+
QString firstFileName = selectedFiles.first();
75+
QFileInfo fi( firstFileName );
76+
QString path = fi.path();
8377

84-
QgsDebugMsg( "Writing last used dir: " + myPath );
78+
QgsDebugMsg( "Writing last used dir: " + path );
8579

8680
settings.setValue( "/UI/" + filterName, lastUsedFilter );
87-
settings.setValue( "/UI/" + filterName + "Dir", myPath );
81+
settings.setValue( "/UI/" + filterName + "Dir", path );
8882
}
8983
return false;
9084
}
9185

92-
QPair<QString, QString> GUI_EXPORT getSaveAsImageName( QWidget * theParent, QString theMessage )
86+
QPair<QString, QString> GUI_EXPORT getSaveAsImageName( QWidget *theParent, QString theMessage )
9387
{
94-
Q_UNUSED( theMessage );
95-
//create a map to hold the QImageIO names and the filter names
96-
//the QImageIO name must be passed to the mapcanvas saveas image function
97-
typedef QMap<QString, QString> FilterMap;
98-
FilterMap myFilterMap;
99-
100-
//find out the last used filter
101-
QSettings myQSettings; // where we keep last used filter in persistent state
102-
QString myLastUsedFilter = myQSettings.value( "/UI/lastSaveAsImageFilter" ).toString();
103-
QString myLastUsedDir = myQSettings.value( "/UI/lastSaveAsImageDir", "." ).toString();
104-
10588
// get a list of supported output image types
106-
int myCounterInt = 0;
107-
QString myFilters;
108-
QList<QByteArray> formats = QImageWriter::supportedImageFormats();
109-
110-
for ( ; myCounterInt < formats.count(); myCounterInt++ )
89+
QMap<QString, QString> filterMap;
90+
foreach( QByteArray format, QImageWriter::supportedImageFormats() )
11191
{
112-
QString myFormat = QString( formats.at( myCounterInt ) );
11392
//svg doesnt work so skip it
114-
if ( myFormat == "svg" )
93+
if ( format == "svg" )
11594
continue;
11695

117-
QString myFilter = createFileFilter_( myFormat + " format", "*." + myFormat );
118-
if ( !myFilters.isEmpty() )
119-
myFilters += ";;";
120-
myFilters += myFilter;
121-
myFilterMap[myFilter] = myFormat;
96+
filterMap.insert( createFileFilter_( format + " format", "*." + format ), format );
12297
}
98+
12399
#ifdef QGISDEBUG
124100
QgsDebugMsg( "Available Filters Map: " );
125-
FilterMap::Iterator myIterator;
126-
for ( myIterator = myFilterMap.begin(); myIterator != myFilterMap.end(); ++myIterator )
101+
for ( QMap<QString, QString>::iterator it = filterMap.begin(); it != filterMap.end(); ++it )
127102
{
128-
QgsDebugMsg( myIterator.key() + " : " + myIterator.value() );
103+
QgsDebugMsg( it.key() + " : " + it.value() );
129104
}
130105
#endif
131106

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

137-
// allow for selection of more than one file
138-
myQFileDialog->setFileMode( QFileDialog::AnyFile );
112+
QString outputFileName;
113+
QString selectedFilter = lastUsedFilter;
114+
QString ext;
139115

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

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

130+
// allow for selection of more than one file
131+
fileDialog->setFileMode( QFileDialog::AnyFile );
132+
fileDialog->setAcceptMode( QFileDialog::AcceptSave );
133+
fileDialog->setConfirmOverwrite( true );
144134

145-
if ( !myLastUsedFilter.isEmpty() ) // set the filter to the last one used
135+
if ( !lastUsedFilter.isEmpty() ) // set the filter to the last one used
146136
{
147-
myQFileDialog->selectFilter( myLastUsedFilter );
137+
fileDialog->selectFilter( lastUsedFilter );
148138
}
149139

150140
//prompt the user for a fileName
151-
QString myOutputFileName; // = myQFileDialog->getSaveFileName(); //delete this
152-
if ( myQFileDialog->exec() == QDialog::Accepted )
141+
if ( fileDialog->exec() == QDialog::Accepted )
153142
{
154-
myOutputFileName = myQFileDialog->selectedFiles().first();
143+
outputFileName = fileDialog->selectedFiles().first();
155144
}
156145

157-
QString myFilterString = myQFileDialog->selectedFilter();
158-
QgsDebugMsg( "Selected filter: " + myFilterString );
159-
QgsDebugMsg( "Image type: " + myFilterMap[myFilterString] );
146+
selectedFilter = fileDialog->selectedFilter();
147+
QgsDebugMsg( "Selected filter: " + selectedFilter );
148+
ext = filterMap.value( selectedFilter, QString::null );
149+
150+
if ( !ext.isNull() )
151+
settings.setValue( "/UI/lastSaveAsImageFilter", selectedFilter );
152+
153+
settings.setValue( "/UI/lastSaveAsImageDir", fileDialog->directory().absolutePath() );
154+
#endif
160155

161156
// Add the file type suffix to the fileName if required
162-
if ( !myOutputFileName.endsWith( myFilterMap[myFilterString] ) )
157+
if ( !ext.isNull() && !outputFileName.endsWith( "." + ext ) )
163158
{
164-
myOutputFileName += "." + myFilterMap[myFilterString];
159+
outputFileName += "." + ext;
165160
}
166161

167-
myQSettings.setValue( "/UI/lastSaveAsImageFilter", myFilterString );
168-
myQSettings.setValue( "/UI/lastSaveAsImageDir", myQFileDialog->directory().absolutePath() );
169-
QPair <QString, QString> myPair;
170-
myPair.first = myOutputFileName;
171-
myPair.second = myFilterMap[myFilterString];
172-
return myPair;
173-
} //
162+
return qMakePair<QString, QString>( outputFileName, ext );
163+
}
174164

175165
QString createFileFilter_( QString const &longName, QString const &glob )
176166
{
177167
return longName + " (" + glob.toLower() + " " + glob.toUpper() + ")";
178-
} // createFileFilter_
168+
}
179169

180170
} // end of QgisGui namespace

‎src/plugins/grass/qgsgrassmodule.cpp

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3409,46 +3409,39 @@ QStringList QgsGrassModuleFile::options()
34093409

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

3415-
static QDir currentDir = QDir::current();
3416-
fd->setDirectory( currentDir );
3417-
3418-
switch ( mType )
3414+
if ( mType == Multiple )
34193415
{
3420-
case New:
3421-
fd->setFileMode( QFileDialog::AnyFile );
3422-
fd->setAcceptMode( QFileDialog::AcceptSave );
3423-
break;
3424-
case Multiple:
3425-
fd->setFileMode( QFileDialog::ExistingFiles );
3426-
fd->setAcceptMode( QFileDialog::AcceptOpen );
3427-
break;
3428-
case Directory:
3429-
fd->setFileMode( QFileDialog::Directory );
3430-
fd->setAcceptMode( QFileDialog::AcceptOpen );
3431-
break;
3432-
default:
3433-
fd->setFileMode( QFileDialog::ExistingFile );
3434-
fd->setAcceptMode( QFileDialog::AcceptOpen );
3435-
}
3416+
QString path = mLineEdit->text().split( "," ).first();
3417+
if ( path.isEmpty() )
3418+
path = lastDir;
3419+
else
3420+
path = QFileInfo( path ).absolutePath();
34363421

3437-
if ( mFilters.size() > 0 )
3438-
{
3439-
fd->setFilters( mFilters );
3440-
}
3441-
fd->setDefaultSuffix( mSuffix );
3422+
QStringList files = QFileDialog::getOpenFileNames( this, 0, path );
3423+
if ( files.isEmpty() )
3424+
return;
34423425

3443-
if ( fd->exec() == QDialog::Accepted )
3426+
lastDir = QFileInfo( files[0] ).absolutePath();
3427+
3428+
mLineEdit->setText( files.join( "," ) );
3429+
}
3430+
else
34443431
{
3445-
QString selectedFile = fd->selectedFiles().last();
3446-
QFileInfo fi = QFileInfo( selectedFile );
3447-
currentDir = fi.absoluteDir();
3448-
if ( mType == Multiple )
3449-
{
3450-
selectedFile = fd->selectedFiles().join( "," );
3451-
}
3432+
QString selectedFile = mLineEdit->text();
3433+
if ( selectedFile.isEmpty() )
3434+
selectedFile = lastDir;
3435+
3436+
if ( mType == New )
3437+
selectedFile = QFileDialog::getSaveFileName( this, 0, selectedFile );
3438+
else if ( mType == Directory )
3439+
selectedFile = QFileDialog::getExistingDirectory( this, 0, selectedFile );
3440+
else
3441+
selectedFile = QFileDialog::getOpenFileName( this, 0, selectedFile );
3442+
3443+
lastDir = QFileInfo( selectedFile ).absolutePath();
3444+
34523445
mLineEdit->setText( selectedFile );
34533446
}
34543447
}

‎src/plugins/grass/qgsgrassnewmapset.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,12 @@ QgsGrassNewMapset::~QgsGrassNewMapset()
154154
/*************************** DATABASE *******************************/
155155
void QgsGrassNewMapset::browseDatabase()
156156
{
157-
// TODO: unfortunately QFileDialog does not support 'new' directory
158-
QFileDialog *fd = new QFileDialog( this, NULL, mDatabaseLineEdit->text() );
159-
fd->setFileMode( QFileDialog::DirectoryOnly );
157+
QString selectedDir = QFileDialog::getExistingDirectory( this, NULL, mDatabaseLineEdit->text() );
158+
if ( selectedDir.isEmpty() )
159+
return;
160160

161-
if ( fd->exec() == QDialog::Accepted )
162-
{
163-
mDatabaseLineEdit->setText( fd->selectedFiles().first() );
164-
databaseChanged();
165-
}
161+
mDatabaseLineEdit->setText( selectedDir );
162+
databaseChanged();
166163
}
167164

168165
void QgsGrassNewMapset::databaseChanged()

0 commit comments

Comments
 (0)
Please sign in to comment.