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.

146 lines
5.2KB

  1. ////////////////////////////////////////////////////////////////////////////////////////////////////
  2. ////// Blank Panel 2 HP module /////////////////////////////////////////////////////////////////////
  3. ////////////////////////////////////////////////////////////////////////////////////////////////////
  4. #include "Ohmer.hpp"
  5. namespace rack_plugin_Ohmer {
  6. struct OhmerBlank2 : Module {
  7. enum ParamIds {
  8. NUM_PARAMS
  9. };
  10. enum InputIds {
  11. NUM_INPUTS
  12. };
  13. enum OutputIds {
  14. NUM_OUTPUTS
  15. };
  16. enum LightIds {
  17. NUM_LIGHTS
  18. };
  19. unsigned int screwsPos = 0; // Screws setting (default is two screws: top/left and bottom/right).
  20. OhmerBlank2() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  21. void step() override;
  22. // Persistence for extra data (screws setting). This extra data belongs .vcv file (including "autosave.vcv") and while cloning module.
  23. json_t *toJson() override {
  24. json_t *rootJ = json_object();
  25. json_object_set_new(rootJ, "screwsPos", json_integer(screwsPos));
  26. return rootJ;
  27. }
  28. void fromJson(json_t *rootJ) override {
  29. // Retrieving screws setting (when loading .vcv and cloning module).
  30. json_t *screwsPosJ = json_object_get(rootJ, "screwsPos");
  31. if (screwsPosJ)
  32. screwsPos = json_integer_value(screwsPosJ);
  33. }
  34. };
  35. void OhmerBlank2::step() {
  36. }
  37. struct OhmerBlank2Widget : ModuleWidget {
  38. // Silver Torx screws.
  39. SVGScrew *topLeftScrewSilver;
  40. SVGScrew *topRightScrewSilver;
  41. SVGScrew *bottomLeftScrewSilver;
  42. SVGScrew *bottomRightScrewSilver;
  43. //
  44. OhmerBlank2Widget(OhmerBlank2 *module);
  45. void step() override;
  46. Menu* createContextMenu() override;
  47. };
  48. OhmerBlank2Widget::OhmerBlank2Widget(OhmerBlank2 *module) : ModuleWidget(module) {
  49. box.size = Vec(2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  50. setPanel(SVG::load(assetPlugin(plugin, "res/Blank_2HP.svg")));
  51. // Top-left silver screw, may be visible or hidden, depending KlokSpid model.
  52. topLeftScrewSilver = Widget::create<Torx_Silver>(Vec(0, 0));
  53. addChild(topLeftScrewSilver);
  54. // Top-right silver screw, may be visible or hidden, depending KlokSpid model.
  55. topRightScrewSilver = Widget::create<Torx_Silver>(Vec(box.size.x - RACK_GRID_WIDTH, 0));
  56. addChild(topRightScrewSilver);
  57. // Bottom-left silver screw, may be visible or hidden, depending KlokSpid model.
  58. bottomLeftScrewSilver = Widget::create<Torx_Silver>(Vec(0, RACK_GRID_HEIGHT - RACK_GRID_WIDTH));
  59. addChild(bottomLeftScrewSilver);
  60. // Bottom-right silver screw, may be visible or hidden, depending KlokSpid model.
  61. bottomRightScrewSilver = Widget::create<Torx_Silver>(Vec(box.size.x - RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH));
  62. addChild(bottomRightScrewSilver);
  63. }
  64. //// Screw setting, depending context-menu choice.
  65. void OhmerBlank2Widget::step() {
  66. OhmerBlank2 *ohmerblank2 = dynamic_cast<OhmerBlank2*>(module);
  67. assert(ohmerblank2);
  68. // Silver Torx screws visible or hidden, depending screws setting from context-menu.
  69. topLeftScrewSilver->visible = (ohmerblank2->screwsPos == 0) || (ohmerblank2->screwsPos == 2);
  70. topRightScrewSilver->visible = (ohmerblank2->screwsPos == 1) || (ohmerblank2->screwsPos == 2);
  71. bottomLeftScrewSilver->visible = (ohmerblank2->screwsPos == 1) || (ohmerblank2->screwsPos == 2);
  72. bottomRightScrewSilver->visible = (ohmerblank2->screwsPos == 0) || (ohmerblank2->screwsPos == 2);
  73. ModuleWidget::step();
  74. }
  75. // First screw setting (2: top/left and bottom/right).
  76. struct screwsTLBRMenuItem : MenuItem {
  77. OhmerBlank2 *ohmerblank2;
  78. void onAction(EventAction &e) override {
  79. ohmerblank2->screwsPos = 0;
  80. }
  81. void step() override {
  82. rightText = (ohmerblank2->screwsPos == 0) ? "✔" : "";
  83. MenuItem::step();
  84. }
  85. };
  86. // Second screw setting (2: top/right and bottom/left).
  87. struct screwsTRBLMenuItem : MenuItem {
  88. OhmerBlank2 *ohmerblank2;
  89. void onAction(EventAction &e) override {
  90. ohmerblank2->screwsPos = 1;
  91. }
  92. void step() override {
  93. rightText = (ohmerblank2->screwsPos == 1) ? "✔" : "";
  94. MenuItem::step();
  95. }
  96. };
  97. // Third screw setting (4: all corners).
  98. struct screwsCornersMenuItem : MenuItem {
  99. OhmerBlank2 *ohmerblank2;
  100. void onAction(EventAction &e) override {
  101. ohmerblank2->screwsPos = 2;
  102. }
  103. void step() override {
  104. rightText = (ohmerblank2->screwsPos == 2) ? "✔" : "";
  105. MenuItem::step();
  106. }
  107. };
  108. // Context-menu construction.
  109. Menu* OhmerBlank2Widget::createContextMenu() {
  110. Menu* menu = ModuleWidget::createContextMenu();
  111. OhmerBlank2 *ohmerblank2 = dynamic_cast<OhmerBlank2*>(module);
  112. assert(ohmerblank2);
  113. menu->addChild(construct<MenuEntry>());
  114. menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Screws number & arrangement:"));
  115. menu->addChild(construct<screwsTLBRMenuItem>(&screwsTLBRMenuItem::text, "2: top/left, bottom/right", &screwsTLBRMenuItem::ohmerblank2, ohmerblank2));
  116. menu->addChild(construct<screwsTRBLMenuItem>(&screwsTRBLMenuItem::text, "2: top/right, bottom/left", &screwsTRBLMenuItem::ohmerblank2, ohmerblank2));
  117. menu->addChild(construct<screwsCornersMenuItem>(&screwsCornersMenuItem::text, "Four screws", &screwsCornersMenuItem::ohmerblank2, ohmerblank2));
  118. return menu;
  119. }
  120. } // namespace rack_plugin_Ohmer
  121. using namespace rack_plugin_Ohmer;
  122. RACK_PLUGIN_MODEL_INIT(Ohmer, BlankPanel2) {
  123. Model *modelBlankPanel2 = Model::create<OhmerBlank2, OhmerBlank2Widget>("Ohmer Modules", "OhmerBlank2", "2 HP Blank Panel", BLANK_TAG);
  124. return modelBlankPanel2;
  125. }