|
- #pragma once
- #include <app/common.hpp>
- #include <widget/OpaqueWidget.hpp>
- #include <widget/FramebufferWidget.hpp>
- #include <ui/Menu.hpp>
- #include <app/RailWidget.hpp>
- #include <app/ModuleWidget.hpp>
- #include <app/CableWidget.hpp>
- #include <app/PortWidget.hpp>
- #include <app/ParamWidget.hpp>
- #include <history.hpp>
-
- #include <set>
-
-
- namespace rack {
- namespace app {
-
-
- /** Container for ModuleWidget and CableWidget. */
- struct RackWidget : widget::OpaqueWidget {
- struct Internal;
- Internal* internal;
-
- /** DEPRECATED. Use get/setTouchedParam(). */
- ParamWidget* touchedParam = NULL;
-
- PRIVATE RackWidget();
- PRIVATE ~RackWidget();
-
- void step() override;
- void draw(const DrawArgs& args) override;
-
- 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 onDragHover(const DragHoverEvent& e) override;
-
- // Rack methods
-
- widget::Widget* getModuleContainer();
- widget::Widget* getCableContainer();
- math::Vec getMousePos();
-
- /** Completely clear the rack's modules and cables */
- void clear();
- void mergeJson(json_t* rootJ);
- void fromJson(json_t* rootJ);
- /** Pastes module JSON or selection JSON at the mouse position. */
- void pasteJsonAction(json_t* rootJ);
- void pasteModuleJsonAction(json_t* moduleJ);
- void pasteClipboardAction();
-
- // Module methods
-
- /** Adds a module and adds it to the Engine, adopting ownership.
- */
- void addModule(ModuleWidget* mw);
- void addModuleAtMouse(ModuleWidget* mw);
- /** Removes the module and transfers ownership to the caller.
- */
- void removeModule(ModuleWidget* mw);
- ModuleWidget* getModule(int64_t moduleId);
- std::vector<ModuleWidget*> getModules();
- bool hasModules();
-
- // Module position methods
-
- /** Sets a module's box if non-colliding. Returns true if set */
- bool requestModulePos(ModuleWidget* mw, math::Vec pos);
- /** Moves a module to the closest non-colliding position */
- void setModulePosNearest(ModuleWidget* mw, math::Vec pos);
- /** Moves a module to a position, pushing other modules in the same row to the left or right, as needed. */
- void setModulePosForce(ModuleWidget* mw, math::Vec pos);
- /** Moves a module, contracting old module positions and pushing modules to the right as needed to fit. */
- void setModulePosSqueeze(ModuleWidget* mw, math::Vec pos);
- PRIVATE void squeezeModulePos(ModuleWidget* mw, math::Vec pos);
- PRIVATE void unsqueezeModulePos(ModuleWidget* mw);
- /** Saves positions of modules for getModuleDragAction(). */
- void updateModuleOldPositions();
- history::ComplexAction* getModuleDragAction();
-
- // Module selection methods
-
- void updateSelectionFromRect();
- void selectAll();
- void deselectAll();
- void select(ModuleWidget* mw, bool selected = true);
- bool hasSelection();
- const std::set<ModuleWidget*>& getSelected();
- bool isSelected(ModuleWidget* mw);
- json_t* selectionToJson(bool cables = true);
- void loadSelection(std::string path);
- void loadSelectionDialog();
- void saveSelection(std::string path);
- void saveSelectionDialog();
- void copyClipboardSelection();
- void resetSelectionAction();
- void randomizeSelectionAction();
- void disconnectSelectionAction();
- void cloneSelectionAction(bool cloneCables = true);
- void bypassSelectionAction(bool bypassed);
- bool isSelectionBypassed();
- void deleteSelectionAction();
- bool requestSelectionPos(math::Vec delta);
- void setSelectionPosNearest(math::Vec delta);
- void appendSelectionContextMenu(ui::Menu* menu);
-
- // Cable methods
-
- void clearCables();
- void clearCablesAction();
- /** Removes all cables connected to the port */
- void clearCablesOnPort(PortWidget* port);
- /** Adds a complete cable and adopts ownership.
- */
- void addCable(CableWidget* cw);
- /** Removes cable and releases ownership to caller.
- */
- void removeCable(CableWidget* cw);
- CableWidget* getIncompleteCable();
- /** Takes ownership of `cw` and adds it as a child if it isn't already. */
- void setIncompleteCable(CableWidget* cw);
- CableWidget* releaseIncompleteCable();
- /** Returns the most recently added complete cable connected to the given Port, i.e. the top of the stack. */
- CableWidget* getTopCable(PortWidget* port);
- CableWidget* getCable(int64_t cableId);
- CableWidget* getCable(PortWidget* outputPort, PortWidget* inputPort);
- std::vector<CableWidget*> getCompleteCables();
- /** Returns all cables attached to port, complete or not. */
- std::vector<CableWidget*> getCablesOnPort(PortWidget* port);
- std::vector<CableWidget*> getCompleteCablesOnPort(PortWidget* port);
- /** Returns but does not advance the next cable color. */
- int getNextCableColorId();
- void setNextCableColorId(int id);
- /** Returns and advances the next cable color. */
- NVGcolor getNextCableColor();
- ParamWidget* getTouchedParam();
- void setTouchedParam(ParamWidget* pw);
-
- PRIVATE void updateExpanders();
- };
-
-
- } // namespace app
- } // namespace rack
|