|
- #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>
- #include <history.hpp>
-
-
- namespace rack {
- namespace app {
-
-
- /** Manages an engine::Module in the rack. */
- struct ModuleWidget : widget::OpaqueWidget {
- struct Internal;
- Internal* internal;
-
- /** Not owned */
- plugin::Model* model = NULL;
- /** Owned */
- engine::Module* module = NULL;
-
- ModuleWidget();
- DEPRECATED ModuleWidget(engine::Module* module) : ModuleWidget() {
- setModule(module);
- }
- ~ModuleWidget();
-
- /** Returns the Model instance of this ModuleWidget. */
- plugin::Model* getModel();
- void setModel(plugin::Model* model);
-
- /** Returns Module attached to this ModuleWidget. */
- engine::Module* getModule();
- /** Returns Module attached to this ModuleWidget, casted to the given Module type. */
- template <class TModule>
- TModule* getModule() {
- return dynamic_cast<TModule*>(getModule());
- }
- /** Associates this ModuleWidget with the Module.
- Transfers ownership to `this`.
- */
- void setModule(engine::Module* module);
-
- widget::Widget* getPanel();
- /** Sets the panel and sets the size of the ModuleWidget from the panel.
- Transfers ownership.
- */
- void setPanel(widget::Widget* panel);
- void setPanel(std::shared_ptr<window::Svg> svg);
-
- /** Convenience functions for adding special widgets.
- Just calls addChild() with additional checking.
- It is not required to call this method. You may instead use addChild() in a child widget for example.
- */
- void addParam(ParamWidget* param);
- void addInput(PortWidget* input);
- void addOutput(PortWidget* output);
- /** Scans children widgets recursively for a ParamWidget with the given paramId. */
- ParamWidget* getParam(int paramId);
- PortWidget* getInput(int portId);
- PortWidget* getOutput(int portId);
- /** Scans children widgets recursively for all ParamWidgets. */
- std::vector<ParamWidget*> getParams();
- std::vector<PortWidget*> getPorts();
- std::vector<PortWidget*> getInputs();
- std::vector<PortWidget*> getOutputs();
-
- void draw(const DrawArgs& args) override;
- void drawLayer(const DrawArgs& args, int layer) override;
-
- /** Override to add context menu entries to your subclass.
- It is recommended to add a blank `ui::MenuSeparator` first for spacing.
- */
- virtual void appendContextMenu(ui::Menu* menu) {}
-
- void onHover(const HoverEvent& e) override;
- void onHoverKey(const HoverKeyEvent& e) override;
- void onButton(const ButtonEvent& e) override;
- void onDragStart(const DragStartEvent& e) override;
- void onDragEnd(const DragEndEvent& e) override;
- void onDragMove(const DragMoveEvent& e) override;
- void onDragHover(const DragHoverEvent& e) override;
-
- json_t* toJson();
- void fromJson(json_t* rootJ);
- /** Returns whether paste was successful. */
- bool pasteJsonAction(json_t* rootJ);
- void copyClipboard();
- bool pasteClipboardAction();
- void load(std::string filename);
- void loadAction(std::string filename);
- void loadTemplate();
- void loadDialog();
- void save(std::string filename);
- void saveTemplate();
- void saveTemplateDialog();
- bool hasTemplate();
- void clearTemplate();
- void clearTemplateDialog();
- 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 appendDisconnectActions(history::ComplexAction* complexAction);
- void disconnectAction();
- void cloneAction(bool cloneCables = true);
- void bypassAction(bool bypassed);
- /** Deletes `this` */
- void removeAction();
- void createContextMenu();
-
- // Returns the rack position in grid coordinates
- math::Vec getGridPosition();
- void setGridPosition(math::Vec pos);
- math::Vec getGridSize();
- math::Rect getGridBox();
-
- PRIVATE math::Vec& dragOffset();
- PRIVATE bool& dragEnabled();
- PRIVATE engine::Module* releaseModule();
- };
-
-
- } // namespace app
- } // namespace rack
|