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.

164 lines
4.0KB

  1. #include "../5V.hpp"
  2. ModuleWidget::ModuleWidget(Module *module) {
  3. this->module = module;
  4. if (module) {
  5. rackAddModule(module);
  6. }
  7. }
  8. ModuleWidget::~ModuleWidget() {
  9. // Make sure WireWidget destructors are called *before* removing `module` from the rack.
  10. disconnectPorts();
  11. if (module) {
  12. rackRemoveModule(module);
  13. delete module;
  14. }
  15. }
  16. json_t *ModuleWidget::toJson() {
  17. json_t *root = json_object();
  18. // plugin
  19. json_object_set_new(root, "plugin", json_string(model->plugin->slug.c_str()));
  20. // model
  21. json_object_set_new(root, "model", json_string(model->slug.c_str()));
  22. // pos
  23. json_t *pos = json_pack("[f, f]", (double) box.pos.x, (double) box.pos.y);
  24. json_object_set_new(root, "pos", pos);
  25. // params
  26. json_t *paramsJ = json_array();
  27. for (ParamWidget *paramWidget : params) {
  28. json_t *paramJ = paramWidget->toJson();
  29. json_array_append_new(paramsJ, paramJ);
  30. }
  31. json_object_set_new(root, "params", paramsJ);
  32. return root;
  33. }
  34. void ModuleWidget::fromJson(json_t *root) {
  35. // pos
  36. json_t *pos = json_object_get(root, "pos");
  37. double x, y;
  38. json_unpack(pos, "[F, F]", &x, &y);
  39. box.pos = Vec(x, y);
  40. // params
  41. json_t *paramsJ = json_object_get(root, "params");
  42. size_t paramId;
  43. json_t *paramJ;
  44. json_array_foreach(paramsJ, paramId, paramJ) {
  45. params[paramId]->fromJson(paramJ);
  46. }
  47. }
  48. void ModuleWidget::disconnectPorts() {
  49. for (InputPort *input : inputs) {
  50. input->disconnect();
  51. }
  52. for (OutputPort *output : outputs) {
  53. output->disconnect();
  54. }
  55. }
  56. void ModuleWidget::resetParams() {
  57. for (ParamWidget *param : params) {
  58. param->setValue(param->defaultValue);
  59. }
  60. }
  61. void ModuleWidget::cloneParams(ModuleWidget *source) {
  62. assert(params.size() == source->params.size());
  63. for (size_t i = 0; i < params.size(); i++) {
  64. params[i]->setValue(source->params[i]->value);
  65. }
  66. }
  67. void ModuleWidget::draw(NVGcontext *vg) {
  68. Widget::draw(vg);
  69. bndBevel(vg, box.pos.x, box.pos.y, box.size.x, box.size.y);
  70. }
  71. void ModuleWidget::onDragStart() {
  72. dragPos = gMousePos.minus(getAbsolutePos());
  73. }
  74. void ModuleWidget::onDragMove(Vec mouseRel) {
  75. requestedPos = gMousePos.minus(parent->getAbsolutePos()).minus(dragPos);
  76. requested = true;
  77. }
  78. void ModuleWidget::onDragEnd() {
  79. }
  80. struct DisconnectPortsMenuItem : MenuItem {
  81. ModuleWidget *moduleWidget;
  82. void onAction() {
  83. moduleWidget->disconnectPorts();
  84. }
  85. };
  86. struct ResetParamsMenuItem : MenuItem {
  87. ModuleWidget *moduleWidget;
  88. void onAction() {
  89. moduleWidget->resetParams();
  90. }
  91. };
  92. struct CloneModuleMenuItem : MenuItem {
  93. ModuleWidget *moduleWidget;
  94. void onAction() {
  95. // Create new module from model
  96. ModuleWidget *clonedModuleWidget = moduleWidget->model->createModuleWidget();
  97. clonedModuleWidget->requestedPos = moduleWidget->box.pos;
  98. clonedModuleWidget->requested = true;
  99. clonedModuleWidget->cloneParams(moduleWidget);
  100. gRackWidget->moduleContainer->addChild(clonedModuleWidget);
  101. }
  102. };
  103. struct DeleteModuleMenuItem : MenuItem {
  104. ModuleWidget *moduleWidget;
  105. void onAction() {
  106. gRackWidget->moduleContainer->removeChild(moduleWidget);
  107. delete moduleWidget;
  108. }
  109. };
  110. void ModuleWidget::onMouseDown(int button) {
  111. if (button == GLFW_MOUSE_BUTTON_RIGHT) {
  112. MenuOverlay *overlay = new MenuOverlay();
  113. Menu *menu = new Menu();
  114. menu->box.pos = gMousePos;
  115. {
  116. MenuLabel *menuLabel = new MenuLabel();
  117. menuLabel->text = model->plugin->name + ": " + model->name;
  118. menu->pushChild(menuLabel);
  119. ResetParamsMenuItem *resetItem = new ResetParamsMenuItem();
  120. resetItem->text = "Initialize parameters";
  121. resetItem->moduleWidget = this;
  122. menu->pushChild(resetItem);
  123. DisconnectPortsMenuItem *disconnectItem = new DisconnectPortsMenuItem();
  124. disconnectItem->text = "Disconnect wires";
  125. disconnectItem->moduleWidget = this;
  126. menu->pushChild(disconnectItem);
  127. CloneModuleMenuItem *cloneItem = new CloneModuleMenuItem();
  128. cloneItem->text = "Clone";
  129. cloneItem->moduleWidget = this;
  130. menu->pushChild(cloneItem);
  131. DeleteModuleMenuItem *deleteItem = new DeleteModuleMenuItem();
  132. deleteItem->text = "Delete";
  133. deleteItem->moduleWidget = this;
  134. menu->pushChild(deleteItem);
  135. }
  136. overlay->addChild(menu);
  137. gScene->addChild(overlay);
  138. }
  139. }