You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

167 lines
4.1KB

  1. #pragma once
  2. #include "plugin/Model.hpp"
  3. #include "ui/MenuOverlay.hpp"
  4. #include "ui/MenuItem.hpp"
  5. #include "ui/MenuLabel.hpp"
  6. #include "ui/Menu.hpp"
  7. #include "app/PortWidget.hpp"
  8. #include "app/ParamQuantity.hpp"
  9. #include "app/ParamWidget.hpp"
  10. #include "app/Scene.hpp"
  11. #include "engine/Module.hpp"
  12. #include "app.hpp"
  13. #include "window.hpp"
  14. namespace rack {
  15. template <class TModule, class TModuleWidget, typename... Tags>
  16. plugin::Model *createModel(std::string slug) {
  17. struct TModel : plugin::Model {
  18. engine::Module *createModule() override {
  19. TModule *o = new TModule;
  20. return o;
  21. }
  22. app::ModuleWidget *createModuleWidget() override {
  23. TModule *module = new TModule;
  24. TModuleWidget *o = new TModuleWidget(module);
  25. o->model = this;
  26. return o;
  27. }
  28. app::ModuleWidget *createModuleWidgetNull() override {
  29. TModuleWidget *o = new TModuleWidget(NULL);
  30. o->model = this;
  31. return o;
  32. }
  33. };
  34. plugin::Model *o = new TModel;
  35. o->slug = slug;
  36. return o;
  37. }
  38. template <class TWidget>
  39. TWidget *createWidget(math::Vec pos) {
  40. TWidget *o = new TWidget;
  41. o->box.pos = pos;
  42. return o;
  43. }
  44. template <class TWidget>
  45. TWidget *createWidgetCentered(math::Vec pos) {
  46. TWidget *o = new TWidget;
  47. o->box.pos = pos.minus(o->box.size.div(2));;
  48. return o;
  49. }
  50. template <class TParamWidget>
  51. TParamWidget *createParam(math::Vec pos, engine::Module *module, int paramId) {
  52. TParamWidget *o = new TParamWidget;
  53. o->box.pos = pos;
  54. if (module) {
  55. engine::ParamQuantityFactory *f = module->params[paramId].paramQuantityFactory;
  56. if (f)
  57. o->paramQuantity = f->create();
  58. else
  59. o->paramQuantity = new app::ParamQuantity;
  60. o->paramQuantity->module = module;
  61. o->paramQuantity->paramId = paramId;
  62. }
  63. return o;
  64. }
  65. template <class TParamWidget>
  66. TParamWidget *createParamCentered(math::Vec pos, engine::Module *module, int paramId) {
  67. TParamWidget *o = createParam<TParamWidget>(pos, module, paramId);
  68. o->box.pos = o->box.pos.minus(o->box.size.div(2));
  69. return o;
  70. }
  71. template <class TPortWidget>
  72. TPortWidget *createInput(math::Vec pos, engine::Module *module, int inputId) {
  73. TPortWidget *o = new TPortWidget;
  74. o->box.pos = pos;
  75. o->module = module;
  76. o->type = app::PortWidget::INPUT;
  77. o->portId = inputId;
  78. return o;
  79. }
  80. template <class TPortWidget>
  81. TPortWidget *createInputCentered(math::Vec pos, engine::Module *module, int inputId) {
  82. TPortWidget *o = new TPortWidget;
  83. o->box.pos = pos.minus(o->box.size.div(2));
  84. o->module = module;
  85. o->type = app::PortWidget::INPUT;
  86. o->portId = inputId;
  87. return o;
  88. }
  89. template <class TPortWidget>
  90. TPortWidget *createOutput(math::Vec pos, engine::Module *module, int outputId) {
  91. TPortWidget *o = new TPortWidget;
  92. o->box.pos = pos;
  93. o->module = module;
  94. o->type = app::PortWidget::OUTPUT;
  95. o->portId = outputId;
  96. return o;
  97. }
  98. template <class TPortWidget>
  99. TPortWidget *createOutputCentered(math::Vec pos, engine::Module *module, int outputId) {
  100. TPortWidget *o = new TPortWidget;
  101. o->box.pos = pos.minus(o->box.size.div(2));
  102. o->module = module;
  103. o->type = app::PortWidget::OUTPUT;
  104. o->portId = outputId;
  105. return o;
  106. }
  107. template <class TModuleLightWidget>
  108. TModuleLightWidget *createLight(math::Vec pos, engine::Module *module, int firstLightId) {
  109. TModuleLightWidget *o = new TModuleLightWidget;
  110. o->box.pos = pos;
  111. o->module = module;
  112. o->firstLightId = firstLightId;
  113. return o;
  114. }
  115. template <class TModuleLightWidget>
  116. TModuleLightWidget *createLightCentered(math::Vec pos, engine::Module *module, int firstLightId) {
  117. TModuleLightWidget *o = new TModuleLightWidget;
  118. o->box.pos = pos.minus(o->box.size.div(2));
  119. o->module = module;
  120. o->firstLightId = firstLightId;
  121. return o;
  122. }
  123. template <class TMenuLabel = ui::MenuLabel>
  124. TMenuLabel *createMenuLabel(std::string text) {
  125. TMenuLabel *o = new TMenuLabel;
  126. o->text = text;
  127. return o;
  128. }
  129. template <class TMenuItem = ui::MenuItem>
  130. TMenuItem *createMenuItem(std::string text, std::string rightText = "") {
  131. TMenuItem *o = new TMenuItem;
  132. o->text = text;
  133. o->rightText = rightText;
  134. return o;
  135. }
  136. inline ui::Menu *createMenu() {
  137. ui::Menu *o = new ui::Menu;
  138. o->box.pos = APP->window->mousePos;
  139. ui::MenuOverlay *menuOverlay = new ui::MenuOverlay;
  140. menuOverlay->addChild(o);
  141. APP->scene->addChild(menuOverlay);
  142. return o;
  143. }
  144. } // namespace rack