/* * DISTRHO Cardinal Plugin * Copyright (C) 2021-2022 Filipe Coelho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * For a full copy of the GNU General Public License see the LICENSE file. */ /** * This file is partially based on VCVRack's ModuleWidget.cpp * Copyright (C) 2016-2021 VCV. * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. */ #include "CardinalCommon.hpp" #include #include #include #include #include #include #include #include #include #include #include #undef ModuleWidget namespace rack { namespace app { static void CardinalModuleWidget__saveSelectionDialog(RackWidget* const w) { std::string selectionDir = asset::user("selections"); system::createDirectories(selectionDir); async_dialog_filebrowser(true, "selection.vcvs", selectionDir.c_str(), #ifdef DISTRHO_OS_WASM "Save selection", #else "Save selection as...", #endif [w](char* pathC) { if (!pathC) { // No path selected return; } std::string path = pathC; std::free(pathC); // Automatically append .vcvs extension if (system::getExtension(path) != ".vcvs") path += ".vcvs"; w->saveSelection(path); }); } } } namespace patchUtils { using namespace rack; void appendSelectionContextMenu(ui::Menu* const menu) { app::RackWidget* const w = APP->scene->rack; int n = w->getSelected().size(); menu->addChild(createMenuLabel(string::f("%d selected %s", n, n == 1 ? "module" : "modules"))); // Enable alwaysConsume of menu items if the number of selected modules changes // Select all menu->addChild(createMenuItem("Select all", RACK_MOD_CTRL_NAME "+A", [w]() { w->selectAll(); }, false, true)); // Deselect menu->addChild(createMenuItem("Deselect", RACK_MOD_CTRL_NAME "+" RACK_MOD_SHIFT_NAME "+A", [w]() { w->deselectAll(); }, n == 0, true)); // Copy menu->addChild(createMenuItem("Copy", RACK_MOD_CTRL_NAME "+C", [w]() { w->copyClipboardSelection(); }, n == 0)); // Paste menu->addChild(createMenuItem("Paste", RACK_MOD_CTRL_NAME "+V", [w]() { w->pasteClipboardAction(); }, false, true)); // Save menu->addChild(createMenuItem( #ifdef DISTRHO_OS_WASM "Save selection", #else "Save selection as...", #endif "", [w]() { CardinalModuleWidget__saveSelectionDialog(w); }, n == 0)); // Initialize menu->addChild(createMenuItem("Initialize", RACK_MOD_CTRL_NAME "+I", [w]() { w->resetSelectionAction(); }, n == 0)); // Randomize menu->addChild(createMenuItem("Randomize", RACK_MOD_CTRL_NAME "+R", [w]() { w->randomizeSelectionAction(); }, n == 0)); // Disconnect cables menu->addChild(createMenuItem("Disconnect cables", RACK_MOD_CTRL_NAME "+U", [w]() { w->disconnectSelectionAction(); }, n == 0)); // Bypass std::string bypassText = RACK_MOD_CTRL_NAME "+E"; bool bypassed = (n > 0) && w->isSelectionBypassed(); if (bypassed) bypassText += " " CHECKMARK_STRING; menu->addChild(createMenuItem("Bypass", bypassText, [w, bypassed]() { w->bypassSelectionAction(!bypassed); }, n == 0, true)); // Duplicate menu->addChild(createMenuItem("Duplicate", RACK_MOD_CTRL_NAME "+D", [w]() { w->cloneSelectionAction(false); }, n == 0)); // Duplicate with cables menu->addChild(createMenuItem("└ with cables", RACK_MOD_SHIFT_NAME "+" RACK_MOD_CTRL_NAME "+D", [w]() { w->cloneSelectionAction(true); }, n == 0)); // Delete menu->addChild(createMenuItem("Delete", "Backspace/Delete", [w]() { w->deleteSelectionAction(); }, n == 0, true)); } }