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.7KB

  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 author, std::string slug, std::string name, Tags... tags) {
  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->author = author;
  31. o->slug = slug;
  32. o->name = name;
  33. o->tags = {tags...};
  34. return o;
  35. }
  36. template <class TWidget>
  37. TWidget *createWidget(Vec pos) {
  38. TWidget *o = new TWidget;
  39. o->box.pos = pos;
  40. return o;
  41. }
  42. template <class TParamWidget>
  43. TParamWidget *createParam(Vec pos, Module *module, int paramId, float minValue, float maxValue, float defaultValue) {
  44. TParamWidget *o = new TParamWidget;
  45. o->box.pos = pos;
  46. o->quantity->module = module;
  47. o->quantity->paramId = paramId;
  48. o->setLimits(minValue, maxValue);
  49. o->setDefaultValue(defaultValue);
  50. return o;
  51. }
  52. template <class TParamWidget>
  53. TParamWidget *createParamCentered(Vec pos, Module *module, int paramId, float minValue, float maxValue, float defaultValue) {
  54. TParamWidget *o = new TParamWidget;
  55. o->box.pos = pos.minus(o->box.size.div(2));
  56. o->quantity->module = module;
  57. o->quantity->paramId = paramId;
  58. o->setLimits(minValue, maxValue);
  59. o->setDefaultValue(defaultValue);
  60. return o;
  61. }
  62. template <class TPort>
  63. TPort *createInput(Vec pos, Module *module, int inputId) {
  64. TPort *o = new TPort;
  65. o->box.pos = pos;
  66. o->module = module;
  67. o->type = Port::INPUT;
  68. o->portId = inputId;
  69. return o;
  70. }
  71. template <class TPort>
  72. TPort *createInputCentered(Vec pos, Module *module, int inputId) {
  73. TPort *o = new TPort;
  74. o->box.pos = pos.minus(o->box.size.div(2));
  75. o->module = module;
  76. o->type = Port::INPUT;
  77. o->portId = inputId;
  78. return o;
  79. }
  80. template <class TPort>
  81. TPort *createOutput(Vec pos, Module *module, int outputId) {
  82. TPort *o = new TPort;
  83. o->box.pos = pos;
  84. o->module = module;
  85. o->type = Port::OUTPUT;
  86. o->portId = outputId;
  87. return o;
  88. }
  89. template <class TPort>
  90. TPort *createOutputCentered(Vec pos, Module *module, int outputId) {
  91. TPort *o = new TPort;
  92. o->box.pos = pos.minus(o->box.size.div(2));
  93. o->module = module;
  94. o->type = Port::OUTPUT;
  95. o->portId = outputId;
  96. return o;
  97. }
  98. template <class TModuleLightWidget>
  99. TModuleLightWidget *createLight(Vec pos, Module *module, int firstLightId) {
  100. TModuleLightWidget *o = new TModuleLightWidget;
  101. o->box.pos = pos;
  102. o->module = module;
  103. o->firstLightId = firstLightId;
  104. return o;
  105. }
  106. template <class TModuleLightWidget>
  107. TModuleLightWidget *createLightCentered(Vec pos, Module *module, int firstLightId) {
  108. TModuleLightWidget *o = new TModuleLightWidget;
  109. o->box.pos = pos.minus(o->box.size.div(2));
  110. o->module = module;
  111. o->firstLightId = firstLightId;
  112. return o;
  113. }
  114. template <class TMenuLabel = MenuLabel>
  115. TMenuLabel *createMenuLabel(std::string text) {
  116. TMenuLabel *o = new TMenuLabel;
  117. o->text = text;
  118. return o;
  119. }
  120. template <class TMenuItem = MenuItem>
  121. TMenuItem *createMenuItem(std::string text, std::string rightText = "") {
  122. TMenuItem *o = new TMenuItem;
  123. o->text = text;
  124. o->rightText = rightText;
  125. return o;
  126. }
  127. inline Menu *createMenu() {
  128. Menu *o = new Menu;
  129. o->box.pos = context()->window->mousePos;
  130. MenuOverlay *menuOverlay = new MenuOverlay;
  131. menuOverlay->addChild(o);
  132. context()->event->rootWidget->addChild(menuOverlay);
  133. return o;
  134. }
  135. } // namespace rack