#pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace rack { template plugin::Model *createModel(const std::string &slug) { struct TModel : plugin::Model { engine::Module *createModule() override { engine::Module *m = new TModule; m->model = this; return m; } app::ModuleWidget *createModuleWidget() override { TModule *m = new TModule; m->engine::Module::model = this; app::ModuleWidget *mw = new TModuleWidget(m); mw->model = this; return mw; } app::ModuleWidget *createModuleWidgetNull() override { app::ModuleWidget *mw = new TModuleWidget(NULL); mw->model = this; return mw; } }; plugin::Model *o = new TModel; o->slug = slug; return o; } template TWidget *createWidget(math::Vec pos) { TWidget *o = new TWidget; o->box.pos = pos; return o; } template TWidget *createWidgetCentered(math::Vec pos) { TWidget *o = createWidget(pos); o->box.pos = o->box.pos.minus(o->box.size.div(2)); return o; } template TParamWidget *createParam(math::Vec pos, engine::Module *module, int paramId) { TParamWidget *o = new TParamWidget; o->box.pos = pos; if (module) { o->paramQuantity = module->paramQuantities[paramId]; } return o; } template TParamWidget *createParamCentered(math::Vec pos, engine::Module *module, int paramId) { TParamWidget *o = createParam(pos, module, paramId); o->box.pos = o->box.pos.minus(o->box.size.div(2)); return o; } template TPortWidget *createInput(math::Vec pos, engine::Module *module, int inputId) { TPortWidget *o = new TPortWidget; o->box.pos = pos; o->module = module; o->type = app::PortWidget::INPUT; o->portId = inputId; return o; } template TPortWidget *createInputCentered(math::Vec pos, engine::Module *module, int inputId) { TPortWidget *o = createInput(pos, module, inputId); o->box.pos = o->box.pos.minus(o->box.size.div(2)); return o; } template TPortWidget *createOutput(math::Vec pos, engine::Module *module, int outputId) { TPortWidget *o = new TPortWidget; o->box.pos = pos; o->module = module; o->type = app::PortWidget::OUTPUT; o->portId = outputId; return o; } template TPortWidget *createOutputCentered(math::Vec pos, engine::Module *module, int outputId) { TPortWidget *o = createOutput(pos, module, outputId); o->box.pos = o->box.pos.minus(o->box.size.div(2)); return o; } template TModuleLightWidget *createLight(math::Vec pos, engine::Module *module, int firstLightId) { TModuleLightWidget *o = new TModuleLightWidget; o->box.pos = pos; o->module = module; o->firstLightId = firstLightId; return o; } template TModuleLightWidget *createLightCentered(math::Vec pos, engine::Module *module, int firstLightId) { TModuleLightWidget *o = createLight(pos, module, firstLightId); o->box.pos = o->box.pos.minus(o->box.size.div(2)); return o; } template TMenuLabel *createMenuLabel(std::string text) { TMenuLabel *o = new TMenuLabel; o->text = text; return o; } template TMenuItem *createMenuItem(std::string text, std::string rightText = "") { TMenuItem *o = new TMenuItem; o->text = text; o->rightText = rightText; return o; } template TMenu *createMenu() { TMenu *o = new TMenu; o->box.pos = APP->window->mousePos; ui::MenuOverlay *menuOverlay = new ui::MenuOverlay; menuOverlay->addChild(o); APP->scene->addChild(menuOverlay); return o; } } // namespace rack