diff --git a/src/Gui/DlgCreateNewPreferencePack.ui b/src/Gui/DlgCreateNewPreferencePack.ui
index 98f4589f0e..38bf2d6ed2 100644
--- a/src/Gui/DlgCreateNewPreferencePack.ui
+++ b/src/Gui/DlgCreateNewPreferencePack.ui
@@ -32,6 +32,13 @@
-
+ -
+
+
+ Browse
+
+
+
-
@@ -39,12 +46,12 @@
1
-
- 50
-
250
+
+ 50
+
true
diff --git a/src/Gui/DlgCreateNewPreferencePackImp.cpp b/src/Gui/DlgCreateNewPreferencePackImp.cpp
index af7f586c2e..5f0656ea38 100644
--- a/src/Gui/DlgCreateNewPreferencePackImp.cpp
+++ b/src/Gui/DlgCreateNewPreferencePackImp.cpp
@@ -32,6 +32,7 @@
#include "DlgCreateNewPreferencePackImp.h"
#include "ui_DlgCreateNewPreferencePack.h"
+#include "FileDialog.h"
using namespace Gui::Dialog;
@@ -54,6 +55,7 @@ DlgCreateNewPreferencePackImp::DlgCreateNewPreferencePackImp(QWidget* parent)
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
connect(ui->treeWidget, &QTreeWidget::itemChanged, this, &DlgCreateNewPreferencePackImp::onItemChanged);
connect(ui->lineEdit, &QLineEdit::textEdited, this, &DlgCreateNewPreferencePackImp::onLineEditTextEdited);
+ connect(ui->pushButton, &QPushButton::clicked, this, &DlgCreateNewPreferencePackImp::onBrowseButtonClicked);
}
@@ -114,6 +116,11 @@ std::string DlgCreateNewPreferencePackImp::preferencePackName() const
return ui->lineEdit->text().toStdString();
}
+std::string Gui::Dialog::DlgCreateNewPreferencePackImp::preferencePackDirectory() const
+{
+ return _cfgFileDirectory.toStdString();
+}
+
void DlgCreateNewPreferencePackImp::onItemChanged(QTreeWidgetItem* item, int column)
{
Q_UNUSED(column);
@@ -151,6 +158,11 @@ void DlgCreateNewPreferencePackImp::onLineEditTextEdited(const QString& text)
ui->buttonBox->button(QDialogButtonBox::Ok)->setDisabled(text.isEmpty());
}
+void DlgCreateNewPreferencePackImp::onBrowseButtonClicked()
+{
+ _cfgFileDirectory = FileDialog::getExistingDirectory(this, tr("Export Config"), _cfgFileDirectory);
+}
+
void Gui::Dialog::DlgCreateNewPreferencePackImp::accept()
{
// Ensure that the chosen name is either unique, or that the user actually wants to overwrite the old one
diff --git a/src/Gui/DlgCreateNewPreferencePackImp.h b/src/Gui/DlgCreateNewPreferencePackImp.h
index 9e4211b414..bf3b390c48 100644
--- a/src/Gui/DlgCreateNewPreferencePackImp.h
+++ b/src/Gui/DlgCreateNewPreferencePackImp.h
@@ -59,6 +59,7 @@ public:
std::vector selectedTemplates() const;
std::string preferencePackName() const;
+ std::string preferencePackDirectory() const;
protected Q_SLOTS:
@@ -66,6 +67,8 @@ protected Q_SLOTS:
void onLineEditTextEdited(const QString &text);
+ void onBrowseButtonClicked();
+
void accept() override;
private:
@@ -74,6 +77,7 @@ private:
std::vector _templates;
QRegularExpressionValidator _nameValidator;
std::vector _existingPackNames;
+ QString _cfgFileDirectory;
};
} // namespace Dialog
diff --git a/src/Gui/PreferencePackManager.cpp b/src/Gui/PreferencePackManager.cpp
index 54b42784e4..d443926d8b 100644
--- a/src/Gui/PreferencePackManager.cpp
+++ b/src/Gui/PreferencePackManager.cpp
@@ -504,12 +504,11 @@ static void copyTemplateParameters(/*const*/ ParameterManager& templateParameter
}
}
-void PreferencePackManager::save(const std::string& name, const std::vector& templates)
+void PreferencePackManager::save(const std::string& name, const std::string& directory, const std::vector& templates)
{
if (templates.empty())
return;
- AddPackToMetadata(name);
// Create the config file
auto outputParameterManager = ParameterManager::Create();
@@ -519,9 +518,17 @@ void PreferencePackManager::save(const std::string& name, const std::vectorLoadDocument(Base::FileInfo::pathToString(t.path).c_str());
copyTemplateParameters(*templateParameterManager, *outputParameterManager);
}
- auto savedPreferencePacksDirectory = getSavedPreferencePacksPath();
- auto cfgFilename = savedPreferencePacksDirectory / name / (name + ".cfg");
- outputParameterManager->SaveDocument(Base::FileInfo::pathToString(cfgFilename).c_str());
+
+ std::string cfgFilename;
+ if (directory.empty()) {
+ AddPackToMetadata(name);
+ auto savedPreferencePacksDirectory = getSavedPreferencePacksPath();
+ cfgFilename = Base::FileInfo::pathToString(savedPreferencePacksDirectory / name / (name + ".cfg"));
+ }
+ else {
+ cfgFilename = Base::FileInfo::pathToString(fs::path(directory) / (name + ".cfg"));
+ }
+ outputParameterManager->SaveDocument(cfgFilename.c_str());
}
static std::vector scanForTemplateFolders(const std::string& groupName, const fs::path& entry)
diff --git a/src/Gui/PreferencePackManager.h b/src/Gui/PreferencePackManager.h
index 0358fe77ea..bb87917447 100644
--- a/src/Gui/PreferencePackManager.h
+++ b/src/Gui/PreferencePackManager.h
@@ -176,7 +176,7 @@ namespace Gui {
*
* If the named preferencePack does not exist, this creates it on disk. If it does exist, this overwrites the original.
*/
- void save(const std::string& name, const std::vector& templates);
+ void save(const std::string& name, const std::string& directory, const std::vector& templates);
std::vector templateFiles(bool rescan = false);
diff --git a/src/Gui/PreferencePages/DlgSettingsGeneral.cpp b/src/Gui/PreferencePages/DlgSettingsGeneral.cpp
index 876c24bafb..4ae81c7de1 100644
--- a/src/Gui/PreferencePages/DlgSettingsGeneral.cpp
+++ b/src/Gui/PreferencePages/DlgSettingsGeneral.cpp
@@ -719,7 +719,8 @@ void DlgSettingsGeneral::newPreferencePackDialogAccepted()
return false;
});
auto preferencePackName = newPreferencePackDialog->preferencePackName();
- Application::Instance->prefPackManager()->save(preferencePackName, selectedTemplates);
+ auto preferencePackDirectory = newPreferencePackDialog->preferencePackDirectory();
+ Application::Instance->prefPackManager()->save(preferencePackName, preferencePackDirectory, selectedTemplates);
recreatePreferencePackMenu();
}