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.

169 lines
3.8KB

  1. #include "rack.hpp"
  2. namespace rack {
  3. static const char *filters = "JSON Patch\0*.json\0";
  4. struct NewItem : MenuItem {
  5. void onAction() {
  6. gRackWidget->clear();
  7. }
  8. };
  9. struct SaveItem : MenuItem {
  10. void onAction() {
  11. const char *path = guiSaveDialog(filters, "Untitled.json");
  12. if (path) {
  13. gRackWidget->savePatch(path);
  14. }
  15. }
  16. };
  17. struct OpenItem : MenuItem {
  18. void onAction() {
  19. const char *path = guiOpenDialog(filters, NULL);
  20. if (path) {
  21. gRackWidget->loadPatch(path);
  22. }
  23. }
  24. };
  25. struct FileChoice : ChoiceButton {
  26. void onAction() {
  27. MenuOverlay *overlay = new MenuOverlay();
  28. Menu *menu = new Menu();
  29. menu->box.pos = getAbsolutePos().plus(Vec(0, box.size.y));
  30. menu->box.size.x = box.size.x;
  31. {
  32. MenuItem *newItem = new NewItem();
  33. newItem->text = "New";
  34. menu->pushChild(newItem);
  35. MenuItem *openItem = new OpenItem();
  36. openItem->text = "Open";
  37. menu->pushChild(openItem);
  38. MenuItem *saveItem = new SaveItem();
  39. saveItem->text = "Save";
  40. menu->pushChild(saveItem);
  41. MenuItem *saveAsItem = new SaveItem();
  42. saveAsItem->text = "Save As";
  43. menu->pushChild(saveAsItem);
  44. }
  45. overlay->addChild(menu);
  46. gScene->setOverlay(overlay);
  47. }
  48. };
  49. struct SampleRateItem : MenuItem {
  50. float sampleRate;
  51. void onAction() {
  52. printf("\"\"\"\"\"\"\"\"switching\"\"\"\"\"\"\"\" sample rate to %f\n", sampleRate);
  53. }
  54. };
  55. struct SampleRateChoice : ChoiceButton {
  56. void onAction() {
  57. MenuOverlay *overlay = new MenuOverlay();
  58. Menu *menu = new Menu();
  59. menu->box.pos = getAbsolutePos().plus(Vec(0, box.size.y));
  60. menu->box.size.x = box.size.x;
  61. {
  62. MenuLabel *item = new MenuLabel();
  63. item->text = "(sample rate switching not yet implemented)";
  64. menu->pushChild(item);
  65. }
  66. float sampleRates[6] = {44100, 48000, 88200, 96000, 176400, 192000};
  67. for (int i = 0; i < 6; i++) {
  68. SampleRateItem *item = new SampleRateItem();
  69. char text[100];
  70. snprintf(text, 100, "%.0f Hz", sampleRates[i]);
  71. item->text = std::string(text);
  72. item->sampleRate = sampleRates[i];
  73. menu->pushChild(item);
  74. }
  75. overlay->addChild(menu);
  76. gScene->setOverlay(overlay);
  77. }
  78. };
  79. Toolbar::Toolbar() {
  80. float margin = 5;
  81. box.size.y = BND_WIDGET_HEIGHT + 2*margin;
  82. float xPos = margin;
  83. {
  84. Label *label = new Label();
  85. label->box.pos = Vec(xPos, margin);
  86. label->text = gApplicationName + " " + gApplicationVersion;
  87. addChild(label);
  88. xPos += 175;
  89. }
  90. xPos += margin;
  91. {
  92. ChoiceButton *fileChoice = new FileChoice();
  93. fileChoice->box.pos = Vec(xPos, margin);
  94. fileChoice->box.size.x = 100;
  95. fileChoice->text = "File";
  96. addChild(fileChoice);
  97. xPos += fileChoice->box.size.x;
  98. }
  99. xPos += margin;
  100. {
  101. SampleRateChoice *srChoice = new SampleRateChoice();
  102. srChoice->box.pos = Vec(xPos, margin);
  103. srChoice->box.size.x = 100;
  104. // TODO Change to actual sample rate, e.g. 44100 Hz
  105. srChoice->text = "Sample Rate";
  106. addChild(srChoice);
  107. xPos += srChoice->box.size.x;
  108. }
  109. xPos += margin;
  110. {
  111. wireOpacitySlider = new Slider();
  112. wireOpacitySlider->box.pos = Vec(xPos, margin);
  113. wireOpacitySlider->box.size.x = 150;
  114. wireOpacitySlider->label = "Cable opacity";
  115. wireOpacitySlider->precision = 0;
  116. wireOpacitySlider->unit = "%";
  117. wireOpacitySlider->setLimits(0.0, 100.0);
  118. wireOpacitySlider->setDefaultValue(50.0);
  119. addChild(wireOpacitySlider);
  120. xPos += wireOpacitySlider->box.size.x;
  121. }
  122. xPos += margin;
  123. {
  124. wireTensionSlider = new Slider();
  125. wireTensionSlider->box.pos = Vec(xPos, margin);
  126. wireTensionSlider->box.size.x = 150;
  127. wireTensionSlider->label = "Cable tension";
  128. // wireTensionSlider->unit = "";
  129. wireTensionSlider->setLimits(0.0, 1.0);
  130. wireTensionSlider->setDefaultValue(0.5);
  131. addChild(wireTensionSlider);
  132. xPos += wireTensionSlider->box.size.x;
  133. }
  134. }
  135. void Toolbar::draw(NVGcontext *vg) {
  136. bndBackground(vg, box.pos.x, box.pos.y, box.size.x, box.size.y);
  137. bndBevel(vg, box.pos.x, box.pos.y, box.size.x, box.size.y);
  138. Widget::draw(vg);
  139. }
  140. } // namespace rack