#pragma once #include #include #include #include #include #include #include "dhe-modules.h" namespace DHE { inline void moveTo(rack::Rect &box, rack::Vec center) { box.pos = center.minus(box.size.mult(0.5f)); } inline void moveTo(float x, float y, rack::Widget *widget) { moveTo(widget->box, rack::mm2px({x, y})); } template class Jack : public rack::SVGPort { public: Jack() { background->svg = P::svg("port"); background->wrap(); box.size = background->box.size; } }; template class InputJack : public Jack

{}; template class OutputJack : public Jack

{}; static auto plugin_asset_dir() -> std::string { #ifdef USE_VST2 static const auto dir = rack::assetPlugin("DHE-Modules"/*plugin*/, "svg/"); #else static const auto dir = rack::assetPlugin(plugin, std::string("svg/")); #endif return dir; } template class Panel : public rack::ModuleWidget { public: Panel(rack::Module *module, int widget_hp) : rack::ModuleWidget{module} { box.size = rack::Vec{widget_hp * rack::RACK_GRID_WIDTH, rack::RACK_GRID_HEIGHT}; auto panel = new rack::SVGPanel(); panel->box.size = box.size; panel->setBackground(panel_svg()); addChild(panel); install_screws(); } void fromJson(json_t *patch) override { // If there's no data, we're loading from a legacy patch. Add empty data to // the incoming patch so that ModuleWidget::fromJson will call // Module::fromJson, which will configure the module with appropriate legacy // behavior. if (!json_object_get(patch, "data")) { json_object_set_new(patch, "data", json_object()); } rack::ModuleWidget::fromJson(patch); } static auto svg(const std::string &filename) -> std::shared_ptr { static const auto module_asset_dir = plugin_asset_dir() + P::module_slug + "/"; return rack::SVG::load(module_asset_dir + filename + ".svg"); } static auto panel_svg() -> std::shared_ptr { return rack::SVG::load(plugin_asset_dir() + P::module_slug + ".svg"); } protected: auto height() const -> float { return box.size.y * MM_PER_IN / SVG_DPI; } auto width() const -> float { return box.size.x * MM_PER_IN / SVG_DPI; } void install(float x, float y, InputJack

*jack) { moveTo(x, y, jack); addInput(jack); } void install(float x, float y, OutputJack

*jack) { moveTo(x, y, jack); addOutput(jack); } void install(float x, float y, rack::ParamWidget *param) { moveTo(x, y, param); addParam(param); } void install(float x, float y, rack::Widget *widget) { moveTo(x, y, widget); addChild(widget); } template