#pragma once #include <app/common.hpp> #include <widget/OpaqueWidget.hpp> #include <ui/Menu.hpp> #include <app/PortWidget.hpp> #include <app/ParamWidget.hpp> #include <plugin/Model.hpp> #include <engine/Module.hpp> namespace rack { namespace app { /** Manages an engine::Module in the rack. */ struct ModuleWidget : widget::OpaqueWidget { plugin::Model *model = NULL; /** Owned. */ engine::Module *module = NULL; widget::Widget *panel = NULL; /** Note that the indexes of these vectors do not necessarily correspond with the indexes of `Module::params` etc. */ std::vector<ParamWidget*> params; std::vector<PortWidget*> outputs; std::vector<PortWidget*> inputs; /** For RackWidget dragging */ math::Vec dragPos; math::Vec oldPos; ModuleWidget(); DEPRECATED ModuleWidget(engine::Module *module) : ModuleWidget() { setModule(module); } ~ModuleWidget(); void draw(const DrawArgs &args) override; void drawShadow(const DrawArgs &args); void onButton(const event::Button &e) override; void onHoverKey(const event::HoverKey &e) override; void onDragStart(const event::DragStart &e) override; void onDragEnd(const event::DragEnd &e) override; void onDragMove(const event::DragMove &e) override; /** Associates this ModuleWidget with the Module Transfers ownership */ void setModule(engine::Module *module); void setPanel(std::shared_ptr<Svg> svg); /** Convenience functions for adding special widgets (calls addChild()) */ void addParam(ParamWidget *param); void addOutput(PortWidget *output); void addInput(PortWidget *input); ParamWidget *getParam(int paramId); PortWidget *getOutput(int outputId); PortWidget *getInput(int inputId); /** Overriding these is deprecated. Use Module::dataToJson() and dataFromJson() instead */ virtual json_t *toJson(); virtual void fromJson(json_t *rootJ); /** Serializes/unserializes the module state */ void copyClipboard(); void pasteClipboardAction(); void loadAction(std::string filename); void save(std::string filename); void loadDialog(); void saveDialog(); /** Disconnects cables from all ports Called when the user clicks Disconnect Cables in the context menu. */ void disconnect(); /** Resets the parameters of the module and calls the Module's randomize(). Called when the user clicks Initialize in the context menu. */ void resetAction(); /** Randomizes the parameters of the module and calls the Module's randomize(). Called when the user clicks Randomize in the context menu. */ void randomizeAction(); void disconnectAction(); void cloneAction(); void bypassAction(); /** Deletes `this` */ void removeAction(); void createContextMenu(); /** Override to add context menu entries to your subclass. It is recommended to add a blank ui::MenuEntry first for spacing. */ virtual void appendContextMenu(ui::Menu *menu) {} }; } // namespace app } // namespace rack