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.

163 lines
3.7KB

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