@@ -1831,14 +1831,17 @@ void QgsLayoutDesignerDialog::exportToRaster()
1831
1831
if ( !showFileSizeWarning () )
1832
1832
return ;
1833
1833
1834
- QgsSettings s;
1835
- QString outputFileName = QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () );
1834
+ QString outputFileName;
1836
1835
QgsLayoutAtlas *printAtlas = atlas ();
1836
+ QString lastUsedDir = defaultExportPath ();
1837
1837
if ( printAtlas && printAtlas->enabled () && mActionAtlasPreview ->isChecked () )
1838
1838
{
1839
- QString lastUsedDir = s.value ( QStringLiteral ( " lastSaveAsImageDir" ), QDir::homePath (), QgsSettings::App ).toString ();
1840
1839
outputFileName = QDir ( lastUsedDir ).filePath ( QgsFileUtils::stringToSafeFilename ( printAtlas->currentFilename () ) );
1841
1840
}
1841
+ else
1842
+ {
1843
+ outputFileName = QDir ( lastUsedDir ).filePath ( QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () ) );
1844
+ }
1842
1845
1843
1846
#ifdef Q_OS_MAC
1844
1847
QgisApp::instance ()->activateWindow ();
@@ -1852,6 +1855,8 @@ void QgsLayoutDesignerDialog::exportToRaster()
1852
1855
return ;
1853
1856
}
1854
1857
1858
+ setLastExportPath ( fileNExt.first );
1859
+
1855
1860
QgsLayoutExporter::ImageExportSettings settings;
1856
1861
QSize imageSize;
1857
1862
if ( !getRasterExportSettings ( settings, imageSize ) )
@@ -1921,19 +1926,17 @@ void QgsLayoutDesignerDialog::exportToPdf()
1921
1926
showForceVectorWarning ();
1922
1927
}
1923
1928
1924
- QgsSettings settings;
1925
- QString lastUsedFile = settings.value ( QStringLiteral ( " lastSaveAsPdfFile" ), QStringLiteral ( " qgis.pdf" ), QgsSettings::App ).toString ();
1926
- QFileInfo file ( lastUsedFile );
1929
+ const QString exportPath = defaultExportPath ();
1927
1930
QString outputFileName;
1928
1931
1929
1932
QgsLayoutAtlas *printAtlas = atlas ();
1930
1933
if ( printAtlas && printAtlas->enabled () && mActionAtlasPreview ->isChecked () )
1931
1934
{
1932
- outputFileName = QDir ( file. path () ).filePath ( QgsFileUtils::stringToSafeFilename ( printAtlas->currentFilename () ) + QStringLiteral ( " .pdf" ) );
1935
+ outputFileName = QDir ( exportPath ).filePath ( QgsFileUtils::stringToSafeFilename ( printAtlas->currentFilename () ) + QStringLiteral ( " .pdf" ) );
1933
1936
}
1934
1937
else
1935
1938
{
1936
- outputFileName = file. path () + ' /' + QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () ) + QStringLiteral ( " .pdf" );
1939
+ outputFileName = exportPath + ' /' + QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () ) + QStringLiteral ( " .pdf" );
1937
1940
}
1938
1941
1939
1942
#ifdef Q_OS_MAC
@@ -1956,7 +1959,7 @@ void QgsLayoutDesignerDialog::exportToPdf()
1956
1959
outputFileName += QLatin1String ( " .pdf" );
1957
1960
}
1958
1961
1959
- settings. setValue ( QStringLiteral ( " lastSaveAsPdfFile " ), outputFileName, QgsSettings::App );
1962
+ setLastExportPath ( outputFileName );
1960
1963
1961
1964
mView ->setPaintingEnabled ( false );
1962
1965
QgsTemporaryCursorOverride cursorOverride ( Qt::BusyCursor );
@@ -2025,19 +2028,17 @@ void QgsLayoutDesignerDialog::exportToSvg()
2025
2028
2026
2029
showSvgExportWarning ();
2027
2030
2028
- QgsSettings settings;
2029
- QString lastUsedFile = settings.value ( QStringLiteral ( " lastSaveAsSvgFile" ), QStringLiteral ( " qgis.svg" ), QgsSettings::App ).toString ();
2030
- QFileInfo file ( lastUsedFile );
2031
+ const QString defaultPath = defaultExportPath ();
2031
2032
QString outputFileName = QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () );
2032
2033
2033
2034
QgsLayoutAtlas *printAtlas = atlas ();
2034
2035
if ( printAtlas && printAtlas->enabled () && mActionAtlasPreview ->isChecked () )
2035
2036
{
2036
- outputFileName = QDir ( file. path () ).filePath ( QgsFileUtils::stringToSafeFilename ( printAtlas->currentFilename () + QStringLiteral ( " .svg" ) ) );
2037
+ outputFileName = QDir ( defaultPath ).filePath ( QgsFileUtils::stringToSafeFilename ( printAtlas->currentFilename () + QStringLiteral ( " .svg" ) ) );
2037
2038
}
2038
2039
else
2039
2040
{
2040
- outputFileName = file. path () + ' /' + QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () ) + QStringLiteral ( " .svg" );
2041
+ outputFileName = defaultPath + ' /' + QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () ) + QStringLiteral ( " .svg" );
2041
2042
}
2042
2043
2043
2044
#ifdef Q_OS_MAC
@@ -2061,7 +2062,7 @@ void QgsLayoutDesignerDialog::exportToSvg()
2061
2062
}
2062
2063
2063
2064
bool prevSettingLabelsAsOutlines = mLayout ->project ()->readBoolEntry ( QStringLiteral ( " PAL" ), QStringLiteral ( " /DrawOutlineLabels" ), true );
2064
- settings. setValue ( QStringLiteral ( " lastSaveAsSvgFile " ), outputFileName, QgsSettings::App );
2065
+ setLastExportPath ( outputFileName );
2065
2066
2066
2067
QgsLayoutExporter::SvgExportSettings svgSettings;
2067
2068
bool exportAsText = false ;
@@ -2437,8 +2438,7 @@ void QgsLayoutDesignerDialog::exportAtlasToRaster()
2437
2438
printAtlas->setFilenameExpression ( QStringLiteral ( " 'output_'||@atlas_featurenumber" ), error );
2438
2439
}
2439
2440
2440
- QgsSettings s;
2441
- QString lastUsedDir = s.value ( QStringLiteral ( " lastSaveAtlasAsImagesDir" ), QDir::homePath (), QgsSettings::App ).toString ();
2441
+ QString lastUsedDir = defaultExportPath ();
2442
2442
2443
2443
QFileDialog dlg ( this , tr ( " Export Atlas to Directory" ) );
2444
2444
dlg.setFileMode ( QFileDialog::Directory );
@@ -2461,7 +2461,7 @@ void QgsLayoutDesignerDialog::exportAtlasToRaster()
2461
2461
{
2462
2462
return ;
2463
2463
}
2464
- s. setValue ( QStringLiteral ( " lastSaveAtlasAsImagesDir " ), dir, QgsSettings::App );
2464
+ setLastExportPath ( dir );
2465
2465
2466
2466
// test directory (if it exists and is writable)
2467
2467
if ( !QDir ( dir ).exists () || !QFileInfo ( dir ).isWritable () )
@@ -2592,8 +2592,7 @@ void QgsLayoutDesignerDialog::exportAtlasToSvg()
2592
2592
printAtlas->setFilenameExpression ( QStringLiteral ( " 'output_'||@atlas_featurenumber" ), error );
2593
2593
}
2594
2594
2595
- QgsSettings s;
2596
- QString lastUsedDir = s.value ( QStringLiteral ( " lastSaveAtlasAsSvgDir" ), QDir::homePath (), QgsSettings::App ).toString ();
2595
+ QString lastUsedDir = defaultExportPath ();
2597
2596
2598
2597
QFileDialog dlg ( this , tr ( " Export Atlas to Directory" ) );
2599
2598
dlg.setFileMode ( QFileDialog::Directory );
@@ -2619,7 +2618,7 @@ void QgsLayoutDesignerDialog::exportAtlasToSvg()
2619
2618
{
2620
2619
return ;
2621
2620
}
2622
- s. setValue ( QStringLiteral ( " lastSaveAtlasAsSvgDir " ), dir, QgsSettings::App );
2621
+ setLastExportPath ( dir );
2623
2622
2624
2623
// test directory (if it exists and is writable)
2625
2624
if ( !QDir ( dir ).exists () || !QFileInfo ( dir ).isWritable () )
@@ -2754,13 +2753,11 @@ void QgsLayoutDesignerDialog::exportAtlasToPdf()
2754
2753
bool singleFile = mLayout ->customProperty ( QStringLiteral ( " singleFile" ), true ).toBool ();
2755
2754
2756
2755
QString outputFileName;
2757
- QgsSettings settings;
2758
2756
QString dir;
2759
2757
if ( singleFile )
2760
2758
{
2761
- QString lastUsedFile = settings.value ( QStringLiteral ( " lastSaveAsPdfFile" ), QStringLiteral ( " qgis.pdf" ), QgsSettings::App ).toString ();
2762
- QFileInfo file ( lastUsedFile );
2763
- outputFileName = file.path () + ' /' + QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () ) + QStringLiteral ( " .pdf" );
2759
+ const QString defaultPath = defaultExportPath ();
2760
+ outputFileName = defaultPath + ' /' + QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () ) + QStringLiteral ( " .pdf" );
2764
2761
2765
2762
#ifdef Q_OS_MAC
2766
2763
QgisApp::instance ()->activateWindow ();
@@ -2781,7 +2778,7 @@ void QgsLayoutDesignerDialog::exportAtlasToPdf()
2781
2778
{
2782
2779
outputFileName += QLatin1String ( " .pdf" );
2783
2780
}
2784
- settings. setValue ( QStringLiteral ( " lastSaveAsPdfFile " ), outputFileName, QgsSettings::App );
2781
+ setLastExportPath ( outputFileName );
2785
2782
}
2786
2783
else
2787
2784
{
@@ -2800,7 +2797,7 @@ void QgsLayoutDesignerDialog::exportAtlasToPdf()
2800
2797
}
2801
2798
2802
2799
2803
- QString lastUsedDir = settings. value ( QStringLiteral ( " lastSaveAtlasAsPdfDir " ), QDir::homePath (), QgsSettings::App ). toString ();
2800
+ const QString lastUsedDir = defaultExportPath ();
2804
2801
2805
2802
QFileDialog dlg ( this , tr ( " Export Atlas to Directory" ) );
2806
2803
dlg.setFileMode ( QFileDialog::Directory );
@@ -2826,7 +2823,7 @@ void QgsLayoutDesignerDialog::exportAtlasToPdf()
2826
2823
{
2827
2824
return ;
2828
2825
}
2829
- settings. setValue ( QStringLiteral ( " lastSaveAtlasAsPdfDir " ), dir, QgsSettings::App );
2826
+ setLastExportPath ( dir );
2830
2827
2831
2828
// test directory (if it exists and is writable)
2832
2829
if ( !QDir ( dir ).exists () || !QFileInfo ( dir ).isWritable () )
@@ -2950,7 +2947,6 @@ void QgsLayoutDesignerDialog::exportAtlasToPdf()
2950
2947
2951
2948
void QgsLayoutDesignerDialog::exportReportToRaster ()
2952
2949
{
2953
- QgsSettings s;
2954
2950
QString outputFileName = QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () );
2955
2951
2956
2952
QPair<QString, QString> fileNExt = QgsGuiUtils::getSaveAsImageName ( this , tr ( " Save Report As" ), outputFileName );
@@ -2961,6 +2957,8 @@ void QgsLayoutDesignerDialog::exportReportToRaster()
2961
2957
return ;
2962
2958
}
2963
2959
2960
+ setLastExportPath ( fileNExt.first );
2961
+
2964
2962
#ifdef Q_OS_MAC
2965
2963
QgisApp::instance ()->activateWindow ();
2966
2964
this ->raise ();
@@ -3051,10 +3049,8 @@ void QgsLayoutDesignerDialog::exportReportToSvg()
3051
3049
{
3052
3050
showSvgExportWarning ();
3053
3051
3054
- QgsSettings settings;
3055
- QString lastUsedFile = settings.value ( QStringLiteral ( " lastSaveAsSvgFile" ), QStringLiteral ( " qgis.svg" ), QgsSettings::App ).toString ();
3056
- QFileInfo file ( lastUsedFile );
3057
- QString outputFileName = file.path () + ' /' + QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () ) + QStringLiteral ( " .svg" );
3052
+ const QString defaultPath = defaultExportPath ();
3053
+ QString outputFileName = defaultPath + ' /' + QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () ) + QStringLiteral ( " .svg" );
3058
3054
3059
3055
outputFileName = QFileDialog::getSaveFileName (
3060
3056
this ,
@@ -3076,7 +3072,7 @@ void QgsLayoutDesignerDialog::exportReportToSvg()
3076
3072
this ->raise ();
3077
3073
#endif
3078
3074
bool prevSettingLabelsAsOutlines = mMasterLayout ->layoutProject ()->readBoolEntry ( QStringLiteral ( " PAL" ), QStringLiteral ( " /DrawOutlineLabels" ), true );
3079
- settings. setValue ( QStringLiteral ( " lastSaveAsSvgFile " ), outputFileName, QgsSettings::App );
3075
+ setLastExportPath ( outputFileName );
3080
3076
3081
3077
QgsLayoutExporter::SvgExportSettings svgSettings;
3082
3078
bool exportAsText = false ;
@@ -3179,12 +3175,9 @@ void QgsLayoutDesignerDialog::exportReportToSvg()
3179
3175
3180
3176
void QgsLayoutDesignerDialog::exportReportToPdf ()
3181
3177
{
3182
- QgsSettings settings ;
3178
+ const QString defaultPath = defaultExportPath () ;
3183
3179
3184
- QString lastUsedFile = settings.value ( QStringLiteral ( " lastSaveAsPdfFile" ), QStringLiteral ( " qgis.pdf" ), QgsSettings::App ).toString ();
3185
- QFileInfo file ( lastUsedFile );
3186
-
3187
- QString outputFileName = file.path () + ' /' + QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () ) + QStringLiteral ( " .pdf" );
3180
+ QString outputFileName = defaultPath + ' /' + QgsFileUtils::stringToSafeFilename ( mMasterLayout ->name () ) + QStringLiteral ( " .pdf" );
3188
3181
3189
3182
#ifdef Q_OS_MAC
3190
3183
QgisApp::instance ()->activateWindow ();
@@ -3205,7 +3198,7 @@ void QgsLayoutDesignerDialog::exportReportToPdf()
3205
3198
{
3206
3199
outputFileName += QLatin1String ( " .pdf" );
3207
3200
}
3208
- settings. setValue ( QStringLiteral ( " lastSaveAsPdfFile " ), outputFileName, QgsSettings::App );
3201
+ setLastExportPath ( outputFileName );
3209
3202
3210
3203
mView ->setPaintingEnabled ( false );
3211
3204
QgsTemporaryCursorOverride cursorOverride ( Qt::BusyCursor );
@@ -4151,6 +4144,36 @@ void QgsLayoutDesignerDialog::updateActionNames( QgsMasterLayoutInterface::Type
4151
4144
}
4152
4145
}
4153
4146
4147
+ QString QgsLayoutDesignerDialog::defaultExportPath () const
4148
+ {
4149
+ // first priority - last export folder saved in project
4150
+ const QString projectLastExportPath = QgsFileUtils::findClosestExistingPath ( QgsProject::instance ()->readEntry ( QStringLiteral ( " Layouts" ), QStringLiteral ( " /lastLayoutExportDir" ), QString () ) );
4151
+ if ( !projectLastExportPath.isEmpty () )
4152
+ return projectLastExportPath;
4153
+
4154
+ // second priority - project home path
4155
+ const QString projectHome = QgsFileUtils::findClosestExistingPath ( QgsProject::instance ()->homePath () );
4156
+ if ( !projectHome.isEmpty () )
4157
+ return projectHome;
4158
+
4159
+ // last priority - app setting last export folder, with homepath as backup
4160
+ QgsSettings s;
4161
+ return QgsFileUtils::findClosestExistingPath ( s.value ( QStringLiteral ( " lastLayoutExportDir" ), QDir::homePath (), QgsSettings::App ).toString () );
4162
+ }
4163
+
4164
+ void QgsLayoutDesignerDialog::setLastExportPath ( const QString &path ) const
4165
+ {
4166
+ QFileInfo fi ( path );
4167
+ QString savePath;
4168
+ if ( fi.isFile () )
4169
+ savePath = fi.path ();
4170
+ else
4171
+ savePath = path;
4172
+
4173
+ QgsProject::instance ()->writeEntry ( QStringLiteral ( " Layouts" ), QStringLiteral ( " /lastLayoutExportDir" ), savePath );
4174
+ QgsSettings ().setValue ( QStringLiteral ( " lastLayoutExportDir" ), savePath, QgsSettings::App );
4175
+ }
4176
+
4154
4177
void QgsLayoutDesignerDialog::updateWindowTitle ()
4155
4178
{
4156
4179
QString title;
0 commit comments