| @@ -76,7 +76,8 @@ struct RackWidget : widget::OpaqueWidget { | |||||
| void resetSelectedModulesAction(); | void resetSelectedModulesAction(); | ||||
| void randomizeSelectedModulesAction(); | void randomizeSelectedModulesAction(); | ||||
| void disconnectSelectedModulesAction(); | void disconnectSelectedModulesAction(); | ||||
| void bypassSelectedModulesAction(); | |||||
| void bypassSelectedModulesAction(bool bypassed); | |||||
| bool areSelectedModulesBypassed(); | |||||
| void deleteSelectedModulesAction(); | void deleteSelectedModulesAction(); | ||||
| bool requestSelectedModulePos(math::Vec delta); | bool requestSelectedModulePos(math::Vec delta); | ||||
| @@ -802,13 +802,15 @@ void ModuleWidget::cloneAction() { | |||||
| void ModuleWidget::bypassAction() { | void ModuleWidget::bypassAction() { | ||||
| assert(module); | assert(module); | ||||
| APP->engine->bypassModule(module, !module->isBypassed()); | |||||
| bool bypassed = !module->isBypassed(); | |||||
| // history::ModuleBypass | // history::ModuleBypass | ||||
| history::ModuleBypass* h = new history::ModuleBypass; | history::ModuleBypass* h = new history::ModuleBypass; | ||||
| h->moduleId = module->id; | h->moduleId = module->id; | ||||
| h->bypassed = module->isBypassed(); | |||||
| h->bypassed = bypassed; | |||||
| APP->history->push(h); | APP->history->push(h); | ||||
| APP->engine->bypassModule(module, bypassed); | |||||
| } | } | ||||
| void ModuleWidget::removeAction() { | void ModuleWidget::removeAction() { | ||||
| @@ -1085,9 +1087,14 @@ void ModuleWidget::createSelectionContextMenu() { | |||||
| })); | })); | ||||
| // Bypass | // Bypass | ||||
| menu->addChild(createMenuItem("Bypass", "", [=]() { | |||||
| APP->scene->rack->bypassSelectedModulesAction(); | |||||
| })); | |||||
| menu->addChild(createBoolMenuItem("Bypass", | |||||
| [=]() { | |||||
| return APP->scene->rack->areSelectedModulesBypassed(); | |||||
| }, | |||||
| [=](bool bypassed) { | |||||
| APP->scene->rack->bypassSelectedModulesAction(bypassed); | |||||
| } | |||||
| )); | |||||
| // Delete | // Delete | ||||
| menu->addChild(createMenuItem("Delete", "", [=]() { | menu->addChild(createMenuItem("Delete", "", [=]() { | ||||
| @@ -731,8 +731,36 @@ void RackWidget::disconnectSelectedModulesAction() { | |||||
| delete complexAction; | delete complexAction; | ||||
| } | } | ||||
| void RackWidget::bypassSelectedModulesAction() { | |||||
| // TODO | |||||
| void RackWidget::bypassSelectedModulesAction(bool bypassed) { | |||||
| history::ComplexAction* complexAction = new history::ComplexAction; | |||||
| complexAction->name = "bypass modules"; | |||||
| for (ModuleWidget* mw : getSelectedModules()) { | |||||
| assert(mw->module); | |||||
| if (mw->module->isBypassed() == bypassed) | |||||
| continue; | |||||
| // history::ModuleBypass | |||||
| history::ModuleBypass* h = new history::ModuleBypass; | |||||
| h->moduleId = mw->module->id; | |||||
| h->bypassed = bypassed; | |||||
| complexAction->push(h); | |||||
| APP->engine->bypassModule(mw->module, bypassed); | |||||
| } | |||||
| if (!complexAction->isEmpty()) | |||||
| APP->history->push(complexAction); | |||||
| else | |||||
| delete complexAction; | |||||
| } | |||||
| bool RackWidget::areSelectedModulesBypassed() { | |||||
| for (ModuleWidget* mw : getSelectedModules()) { | |||||
| if (!mw->getModule()->isBypassed()) | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | } | ||||
| void RackWidget::deleteSelectedModulesAction() { | void RackWidget::deleteSelectedModulesAction() { | ||||
| @@ -863,11 +863,12 @@ void Engine::randomizeModule(Module* module) { | |||||
| void Engine::bypassModule(Module* module, bool bypassed) { | void Engine::bypassModule(Module* module, bool bypassed) { | ||||
| WriteLock lock(internal->mutex); | |||||
| assert(module); | assert(module); | ||||
| if (module->isBypassed() == bypassed) | if (module->isBypassed() == bypassed) | ||||
| return; | return; | ||||
| WriteLock lock(internal->mutex); | |||||
| // Clear outputs and set to 1 channel | // Clear outputs and set to 1 channel | ||||
| for (Output& output : module->outputs) { | for (Output& output : module->outputs) { | ||||
| // This zeros all voltages, but the channel is set to 1 if connected | // This zeros all voltages, but the channel is set to 1 if connected | ||||