diff --git a/include/app.hpp b/include/app.hpp index 3fae0af5..64db4f36 100644 --- a/include/app.hpp +++ b/include/app.hpp @@ -160,6 +160,8 @@ struct RackWidget : OpaqueWidget { void saveAsDialog(); /** If `lastPath` is defined, ask the user to reload it */ void revert(); + /** Disconnects all wires */ + void disconnect(); void savePatch(std::string filename); void loadPatch(std::string filename); json_t *toJson(); diff --git a/src/app/RackWidget.cpp b/src/app/RackWidget.cpp index 92fc9707..38c60dc5 100644 --- a/src/app/RackWidget.cpp +++ b/src/app/RackWidget.cpp @@ -149,6 +149,14 @@ void RackWidget::revert() { } } +void RackWidget::disconnect() { + for (Widget *w : moduleContainer->children) { + ModuleWidget *moduleWidget = dynamic_cast(w); + assert(moduleWidget); + moduleWidget->disconnect(); + } +} + json_t *RackWidget::toJson() { // root json_t *rootJ = json_object(); diff --git a/src/app/Toolbar.cpp b/src/app/Toolbar.cpp index 507db58c..7b83d54e 100644 --- a/src/app/Toolbar.cpp +++ b/src/app/Toolbar.cpp @@ -12,6 +12,12 @@ struct NewItem : MenuItem { } }; +struct DisconnectItem : MenuItem { + void onAction(EventAction &e) override { + gRackWidget->disconnect(); + } +}; + struct OpenItem : MenuItem { void onAction(EventAction &e) override { gRackWidget->openDialog(); @@ -48,12 +54,13 @@ struct FileChoice : ChoiceButton { menu->box.pos = getAbsoluteOffset(Vec(0, box.size.y)); menu->box.size.x = box.size.x; - menu->addChild(construct(&MenuItem::text, "New", &MenuItem::rightText, WINDOW_MOD_KEY_NAME "+N")); - menu->addChild(construct(&MenuItem::text, "Open", &MenuItem::rightText, WINDOW_MOD_KEY_NAME "+O")); - menu->addChild(construct(&MenuItem::text, "Save", &MenuItem::rightText, WINDOW_MOD_KEY_NAME "+S")); - menu->addChild(construct(&MenuItem::text, "Save as", &MenuItem::rightText, WINDOW_MOD_KEY_NAME "+Shift+S")); - menu->addChild(construct(&MenuItem::text, "Revert", &MenuItem::rightText, WINDOW_MOD_KEY_NAME "+R")); - menu->addChild(construct(&MenuItem::text, "Quit", &MenuItem::rightText, WINDOW_MOD_KEY_NAME "+Q")); + menu->addChild(MenuItem::create("New", WINDOW_MOD_KEY_NAME "+N")); + menu->addChild(MenuItem::create("Disconnect cables")); + menu->addChild(MenuItem::create("Open", WINDOW_MOD_KEY_NAME "+O")); + menu->addChild(MenuItem::create("Save", WINDOW_MOD_KEY_NAME "+S")); + menu->addChild(MenuItem::create("Save as", WINDOW_MOD_KEY_NAME "+Shift+S")); + menu->addChild(MenuItem::create("Revert", WINDOW_MOD_KEY_NAME "+R")); + menu->addChild(MenuItem::create("Quit", WINDOW_MOD_KEY_NAME "+Q")); } };