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(); }