From 7627f7c074a118e38bb6b78d2acd78f91542b0e3 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Mon, 22 Feb 2021 07:40:30 +0100 Subject: [PATCH] Have the file chooser automatically open SFZ dir --- plugins/editor/src/editor/EditIds.h | 1 + plugins/editor/src/editor/Editor.cpp | 46 ++++++++++++++++++++++------ plugins/vst/SfizzVstEditor.cpp | 1 + 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/plugins/editor/src/editor/EditIds.h b/plugins/editor/src/editor/EditIds.h index d9b43957..869d1c44 100644 --- a/plugins/editor/src/editor/EditIds.h +++ b/plugins/editor/src/editor/EditIds.h @@ -20,6 +20,7 @@ enum class EditId : int { StretchTuning, CanEditUserFilesDir, UserFilesDir, + FallbackFilesDir, // Controller0, ControllerLast = Controller0 + sfz::config::numCCs - 1, diff --git a/plugins/editor/src/editor/Editor.cpp b/plugins/editor/src/editor/Editor.cpp index 0b5c6e5a..5afaa804 100644 --- a/plugins/editor/src/editor/Editor.cpp +++ b/plugins/editor/src/editor/Editor.cpp @@ -42,6 +42,8 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { std::string currentSfzFile_; std::string currentScalaFile_; + std::string userFilesDir_; + std::string fallbackFilesDir_; enum { kPanelGeneral, @@ -137,6 +139,7 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { void chooseScalaFile(); void changeScalaFile(const std::string& filePath); void chooseUserFilesDir(); + std::string getFileChooserInitialDir(const std::string& previousFilePath) const; static bool scanDirectoryFiles(const fs::path& dirPath, std::function filter, std::vector& fileNames); @@ -319,7 +322,13 @@ void Editor::Impl::uiReceiveValue(EditId id, const EditValue& v) } case EditId::UserFilesDir: { - updateUserFilesDirLabel(v.to_string()); + userFilesDir_ = v.to_string(); + updateUserFilesDirLabel(userFilesDir_); + break; + } + case EditId::FallbackFilesDir: + { + fallbackFilesDir_ = v.to_string(); break; } case EditId::UINumCurves: @@ -891,10 +900,10 @@ void Editor::Impl::chooseSfzFile() fs->setTitle("Load SFZ file"); fs->setDefaultExtension(CFileExtension("SFZ", "sfz")); - if (!currentSfzFile_.empty()) { - std::string initialDir = fs::path(currentSfzFile_).parent_path().u8string() + '/'; + + std::string initialDir = getFileChooserInitialDir(currentSfzFile_); + if (!initialDir.empty()) fs->setInitialDirectory(initialDir.c_str()); - } if (fs->runModal()) { UTF8StringPtr file = fs->getSelectedFile(0); @@ -969,10 +978,10 @@ void Editor::Impl::chooseScalaFile() fs->setTitle("Load Scala file"); fs->setDefaultExtension(CFileExtension("SCL", "scl")); - if (!currentScalaFile_.empty()) { - std::string initialDir = fs::path(currentScalaFile_).parent_path().u8string() + '/'; + + std::string initialDir = getFileChooserInitialDir(currentScalaFile_); + if (!initialDir.empty()) fs->setInitialDirectory(initialDir.c_str()); - } if (fs->runModal()) { UTF8StringPtr file = fs->getSelectedFile(0); @@ -998,12 +1007,31 @@ void Editor::Impl::chooseUserFilesDir() if (fs->runModal()) { UTF8StringPtr dir = fs->getSelectedFile(0); if (dir) { - updateUserFilesDirLabel(dir); - ctrl_->uiSendValue(EditId::UserFilesDir, std::string(dir)); + userFilesDir_ = std::string(dir); + updateUserFilesDirLabel(userFilesDir_); + ctrl_->uiSendValue(EditId::UserFilesDir, userFilesDir_); } } } +std::string Editor::Impl::getFileChooserInitialDir(const std::string& previousFilePath) const +{ + fs::path initialPath; + + if (!previousFilePath.empty()) + initialPath = fs::u8path(previousFilePath).parent_path(); + else if (!userFilesDir_.empty()) + initialPath = fs::u8path(userFilesDir_); + else if (!fallbackFilesDir_.empty()) + initialPath = fs::u8path(fallbackFilesDir_); + + std::string initialDir = initialPath.u8string(); + if (!initialDir.empty()) + initialDir.push_back('/'); + + return initialDir; +} + bool Editor::Impl::scanDirectoryFiles(const fs::path& dirPath, std::function filter, std::vector& fileNames) { std::error_code ec; diff --git a/plugins/vst/SfizzVstEditor.cpp b/plugins/vst/SfizzVstEditor.cpp index d5788b48..8345c274 100644 --- a/plugins/vst/SfizzVstEditor.cpp +++ b/plugins/vst/SfizzVstEditor.cpp @@ -91,6 +91,7 @@ bool PLUGIN_API SfizzVstEditor::open(void* parent, const VSTGUI::PlatformType& p absl::optional userFilesDir = SfizzPaths::getSfzConfigDefaultPath(); uiReceiveValue(EditId::CanEditUserFilesDir, 1); uiReceiveValue(EditId::UserFilesDir, userFilesDir.value_or(fs::path()).u8string()); + uiReceiveValue(EditId::FallbackFilesDir, SfizzPaths::getSfzFallbackDefaultPath().u8string()); return true; }