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.

157 lines
3.6KB

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