| @@ -248,14 +248,17 @@ struct ModuleLoadItem : ui::MenuItem { | |||||
| }; | }; | ||||
| struct ModulePresetPathItem : ui::MenuItem { | |||||
| static void appendPresetItems(ui::Menu* menu, WeakPtr<ModuleWidget> moduleWidget, std::string presetDir); | |||||
| struct ModulePresetFileItem : ui::MenuItem { | |||||
| WeakPtr<ModuleWidget> moduleWidget; | WeakPtr<ModuleWidget> moduleWidget; | ||||
| std::string presetPath; | |||||
| std::string path; | |||||
| void onAction(const ActionEvent& e) override { | void onAction(const ActionEvent& e) override { | ||||
| if (!moduleWidget) | if (!moduleWidget) | ||||
| return; | return; | ||||
| try { | try { | ||||
| moduleWidget->loadAction(presetPath); | |||||
| moduleWidget->loadAction(path); | |||||
| } | } | ||||
| catch (Exception& e) { | catch (Exception& e) { | ||||
| osdialog_message(OSDIALOG_WARNING, OSDIALOG_OK, e.what()); | osdialog_message(OSDIALOG_WARNING, OSDIALOG_OK, e.what()); | ||||
| @@ -264,6 +267,57 @@ struct ModulePresetPathItem : ui::MenuItem { | |||||
| }; | }; | ||||
| struct ModulePresetDirItem : ui::MenuItem { | |||||
| WeakPtr<ModuleWidget> moduleWidget; | |||||
| std::string path; | |||||
| ui::Menu* createChildMenu() override { | |||||
| if (!moduleWidget) | |||||
| return NULL; | |||||
| ui::Menu* menu = new ui::Menu; | |||||
| appendPresetItems(menu, moduleWidget, path); | |||||
| return menu; | |||||
| } | |||||
| }; | |||||
| // Create ModulePresetPathItems for each patch in a directory. | |||||
| static void appendPresetItems(ui::Menu* menu, WeakPtr<ModuleWidget> moduleWidget, std::string presetDir) { | |||||
| bool hasPresets = false; | |||||
| // Note: This is not cached, so opening this menu each time might have a bit of latency. | |||||
| if (system::isDirectory(presetDir)) { | |||||
| for (const std::string& path : system::getEntries(presetDir)) { | |||||
| std::string name = system::getStem(path); | |||||
| // Remove "1_", "42_", "001_", etc at the beginning of preset filenames | |||||
| std::regex r("^\\d*_"); | |||||
| name = std::regex_replace(name, r, ""); | |||||
| if (system::isDirectory(path)) { | |||||
| hasPresets = true; | |||||
| ModulePresetDirItem* dirItem = new ModulePresetDirItem; | |||||
| dirItem->rightText = RIGHT_ARROW; | |||||
| dirItem->text = name; | |||||
| dirItem->path = path; | |||||
| dirItem->moduleWidget = moduleWidget; | |||||
| menu->addChild(dirItem); | |||||
| } | |||||
| else if (system::getExtension(path) == ".vcvm") { | |||||
| hasPresets = true; | |||||
| ModulePresetFileItem* presetItem = new ModulePresetFileItem; | |||||
| presetItem->text = name; | |||||
| presetItem->path = path; | |||||
| presetItem->moduleWidget = moduleWidget; | |||||
| menu->addChild(presetItem); | |||||
| } | |||||
| } | |||||
| } | |||||
| if (!hasPresets) { | |||||
| menu->addChild(createMenuLabel("(None)")); | |||||
| } | |||||
| }; | |||||
| struct ModulePresetItem : ui::MenuItem { | struct ModulePresetItem : ui::MenuItem { | ||||
| WeakPtr<ModuleWidget> moduleWidget; | WeakPtr<ModuleWidget> moduleWidget; | ||||
| ui::Menu* createChildMenu() override { | ui::Menu* createChildMenu() override { | ||||
| @@ -304,42 +358,15 @@ struct ModulePresetItem : ui::MenuItem { | |||||
| clearTemplateItem->disabled = !moduleWidget->hasTemplate(); | clearTemplateItem->disabled = !moduleWidget->hasTemplate(); | ||||
| menu->addChild(clearTemplateItem); | menu->addChild(clearTemplateItem); | ||||
| // Create ModulePresetPathItems for each patch in a directory. | |||||
| auto createPresetItems = [&](std::string presetDir) { | |||||
| bool hasPresets = false; | |||||
| // Note: This is not cached, so opening this menu each time might have a bit of latency. | |||||
| if (system::isDirectory(presetDir)) { | |||||
| for (const std::string& presetPath : system::getEntries(presetDir)) { | |||||
| if (system::getExtension(presetPath) != ".vcvm") | |||||
| continue; | |||||
| hasPresets = true; | |||||
| std::string presetName = system::getStem(presetPath); | |||||
| // Remove "1_", "42_", "001_", etc at the beginning of preset filenames | |||||
| std::regex r("^\\d*_"); | |||||
| presetName = std::regex_replace(presetName, r, ""); | |||||
| ModulePresetPathItem* presetItem = new ModulePresetPathItem; | |||||
| presetItem->text = presetName; | |||||
| presetItem->presetPath = presetPath; | |||||
| presetItem->moduleWidget = moduleWidget; | |||||
| menu->addChild(presetItem); | |||||
| } | |||||
| } | |||||
| if (!hasPresets) { | |||||
| menu->addChild(createMenuLabel("(None)")); | |||||
| } | |||||
| }; | |||||
| // Scan `<user dir>/presets/<plugin slug>/<module slug>` for presets. | // Scan `<user dir>/presets/<plugin slug>/<module slug>` for presets. | ||||
| menu->addChild(new ui::MenuSeparator); | menu->addChild(new ui::MenuSeparator); | ||||
| menu->addChild(createMenuLabel("User presets")); | menu->addChild(createMenuLabel("User presets")); | ||||
| createPresetItems(moduleWidget->model->getUserPresetDir()); | |||||
| appendPresetItems(menu, moduleWidget, moduleWidget->model->getUserPresetDir()); | |||||
| // Scan `<plugin dir>/presets/<module slug>` for presets. | // Scan `<plugin dir>/presets/<module slug>` for presets. | ||||
| menu->addChild(new ui::MenuSeparator); | menu->addChild(new ui::MenuSeparator); | ||||
| menu->addChild(createMenuLabel("Factory presets")); | menu->addChild(createMenuLabel("Factory presets")); | ||||
| createPresetItems(moduleWidget->model->getFactoryPresetDir()); | |||||
| appendPresetItems(menu, moduleWidget, moduleWidget->model->getFactoryPresetDir()); | |||||
| return menu; | return menu; | ||||
| } | } | ||||