@@ -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 | ||||