diff --git a/plugins/editor/src/editor/Editor.cpp b/plugins/editor/src/editor/Editor.cpp index 281e1796..f56b7f0a 100644 --- a/plugins/editor/src/editor/Editor.cpp +++ b/plugins/editor/src/editor/Editor.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -58,6 +59,7 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { enum { kTagLoadSfzFile, kTagEditSfzFile, + kTagCreateNewSfzFile, kTagOpenSfzFolder, kTagPreviousSfzFile, kTagNextSfzFile, @@ -135,6 +137,7 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { } void chooseSfzFile(); + void createNewSfzFile(); void changeSfzFile(const std::string& filePath); void changeToNextSfzFile(long offset); void chooseScalaFile(); @@ -849,6 +852,7 @@ void Editor::Impl::createFrameContents() if (SActionMenu* menu = fileOperationsMenu_) { menu->addEntry("Load file", kTagLoadSfzFile); menu->addEntry("Edit file", kTagEditSfzFile); + menu->addEntry("Create new file", kTagCreateNewSfzFile); menu->addEntry("Open SFZ folder", kTagOpenSfzFolder); } @@ -914,6 +918,44 @@ void Editor::Impl::chooseSfzFile() } } +/// +static const char defaultSfzText[] = + "sample=*sine" "\n" + "ampeg_attack=0.02 ampeg_release=0.1" "\n"; + +static void createDefaultSfzFileIfNotExisting(const fs::path& path) +{ + if (!fs::exists(path)) + fs::ofstream { path } << defaultSfzText; +} + +/// +void Editor::Impl::createNewSfzFile() +{ + SharedPointer fs = owned(CNewFileSelector::create(frame_, CNewFileSelector::kSelectSaveFile)); + + fs->setTitle("Create SFZ file"); + fs->setDefaultExtension(CFileExtension("SFZ", "sfz")); + + std::string initialDir = getFileChooserInitialDir(currentSfzFile_); + if (!initialDir.empty()) + fs->setInitialDirectory(initialDir.c_str()); + + if (fs->runModal()) { + UTF8StringPtr file = fs->getSelectedFile(0); + std::string fileStr; + if (file && !absl::EndsWithIgnoreCase(file, ".sfz")) { + fileStr = std::string(file) + ".sfz"; + file = fileStr.c_str(); + } + if (file) { + createDefaultSfzFileIfNotExisting(fs::u8path(file)); + changeSfzFile(file); + openFileInExternalEditor(file); + } + } +} + void Editor::Impl::changeSfzFile(const std::string& filePath) { ctrl_->uiSendValue(EditId::SfzFile, filePath); @@ -1322,6 +1364,13 @@ void Editor::Impl::valueChanged(CControl* ctl) openFileInExternalEditor(currentSfzFile_.c_str()); break; + case kTagCreateNewSfzFile: + if (value != 1) + break; + + createNewSfzFile(); + break; + case kTagOpenSfzFolder: if (value != 1) break;