Browse Source

Add subdirectory navigation to module presets.

tags/v2.0.0
Andrew Belt 3 years ago
parent
commit
f88ff2ae5f
1 changed files with 59 additions and 32 deletions
  1. +59
    -32
      src/app/ModuleWidget.cpp

+ 59
- 32
src/app/ModuleWidget.cpp View File

@@ -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;
std::string presetPath;
std::string path;
void onAction(const ActionEvent& e) override {
if (!moduleWidget)
return;
try {
moduleWidget->loadAction(presetPath);
moduleWidget->loadAction(path);
}
catch (Exception& e) {
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 {
WeakPtr<ModuleWidget> moduleWidget;
ui::Menu* createChildMenu() override {
@@ -304,42 +358,15 @@ struct ModulePresetItem : ui::MenuItem {
clearTemplateItem->disabled = !moduleWidget->hasTemplate();
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.
menu->addChild(new ui::MenuSeparator);
menu->addChild(createMenuLabel("User presets"));
createPresetItems(moduleWidget->model->getUserPresetDir());
appendPresetItems(menu, moduleWidget, moduleWidget->model->getUserPresetDir());

// Scan `<plugin dir>/presets/<module slug>` for presets.
menu->addChild(new ui::MenuSeparator);
menu->addChild(createMenuLabel("Factory presets"));
createPresetItems(moduleWidget->model->getFactoryPresetDir());
appendPresetItems(menu, moduleWidget, moduleWidget->model->getFactoryPresetDir());

return menu;
}


Loading…
Cancel
Save