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.

173 lines
4.5KB

  1. #include "app.hpp"
  2. #include "window.hpp"
  3. #include "engine.hpp"
  4. namespace rack {
  5. struct NewItem : MenuItem {
  6. void onAction(EventAction &e) override {
  7. gRackWidget->reset();
  8. }
  9. };
  10. struct OpenItem : MenuItem {
  11. void onAction(EventAction &e) override {
  12. gRackWidget->openDialog();
  13. }
  14. };
  15. struct SaveItem : MenuItem {
  16. void onAction(EventAction &e) override {
  17. gRackWidget->saveDialog();
  18. }
  19. };
  20. struct SaveAsItem : MenuItem {
  21. void onAction(EventAction &e) override {
  22. gRackWidget->saveAsDialog();
  23. }
  24. };
  25. struct RevertItem : MenuItem {
  26. void onAction(EventAction &e) override {
  27. gRackWidget->revert();
  28. }
  29. };
  30. struct QuitItem : MenuItem {
  31. void onAction(EventAction &e) override {
  32. windowClose();
  33. }
  34. };
  35. struct FileChoice : ChoiceButton {
  36. void onAction(EventAction &e) override {
  37. Menu *menu = gScene->createMenu();
  38. menu->box.pos = getAbsoluteOffset(Vec(0, box.size.y));
  39. menu->box.size.x = box.size.x;
  40. menu->addChild(construct<NewItem>(&MenuItem::text, "New", &MenuItem::rightText, WINDOW_MOD_KEY_NAME "+N"));
  41. menu->addChild(construct<OpenItem>(&MenuItem::text, "Open", &MenuItem::rightText, WINDOW_MOD_KEY_NAME "+O"));
  42. menu->addChild(construct<SaveItem>(&MenuItem::text, "Save", &MenuItem::rightText, WINDOW_MOD_KEY_NAME "+S"));
  43. menu->addChild(construct<SaveAsItem>(&MenuItem::text, "Save as", &MenuItem::rightText, WINDOW_MOD_KEY_NAME "+Shift+S"));
  44. menu->addChild(construct<RevertItem>(&MenuItem::text, "Revert", &MenuItem::rightText, WINDOW_MOD_KEY_NAME "+R"));
  45. menu->addChild(construct<QuitItem>(&MenuItem::text, "Quit", &MenuItem::rightText, WINDOW_MOD_KEY_NAME "+Q"));
  46. }
  47. };
  48. struct EnginePauseItem : MenuItem {
  49. void onAction(EventAction &e) override {
  50. gPaused = !gPaused;
  51. }
  52. };
  53. struct EngineSampleRateItem : MenuItem {
  54. float sampleRate;
  55. void onAction(EventAction &e) override {
  56. engineSetSampleRate(sampleRate);
  57. gPaused = false;
  58. }
  59. };
  60. struct EngineSampleRateChoice : ChoiceButton {
  61. void onAction(EventAction &e) override {
  62. Menu *menu = gScene->createMenu();
  63. menu->box.pos = getAbsoluteOffset(Vec(0, box.size.y));
  64. menu->box.size.x = box.size.x;
  65. EnginePauseItem *pauseItem = new EnginePauseItem();
  66. pauseItem->text = gPaused ? "Resume engine" : "Pause engine";
  67. menu->addChild(pauseItem);
  68. std::vector<float> sampleRates = {44100, 48000, 88200, 96000, 176400, 192000};
  69. for (float sampleRate : sampleRates) {
  70. EngineSampleRateItem *item = new EngineSampleRateItem();
  71. item->text = stringf("%.0f Hz", sampleRate);
  72. item->sampleRate = sampleRate;
  73. menu->addChild(item);
  74. }
  75. }
  76. void step() override {
  77. if (gPaused)
  78. text = "Paused";
  79. else
  80. text = stringf("%.0f Hz", engineGetSampleRate());
  81. }
  82. };
  83. Toolbar::Toolbar() {
  84. box.size.y = BND_WIDGET_HEIGHT + 2*5;
  85. SequentialLayout *layout = new SequentialLayout();
  86. layout->box.pos = Vec(5, 5);
  87. layout->spacing = 5;
  88. addChild(layout);
  89. ChoiceButton *fileChoice = new FileChoice();
  90. fileChoice->box.size.x = 100;
  91. fileChoice->text = "File";
  92. layout->addChild(fileChoice);
  93. EngineSampleRateChoice *srChoice = new EngineSampleRateChoice();
  94. srChoice->box.size.x = 100;
  95. layout->addChild(srChoice);
  96. wireOpacitySlider = new Slider();
  97. wireOpacitySlider->box.size.x = 150;
  98. wireOpacitySlider->label = "Cable opacity";
  99. wireOpacitySlider->precision = 0;
  100. wireOpacitySlider->unit = "%";
  101. wireOpacitySlider->setLimits(0.0, 100.0);
  102. wireOpacitySlider->setDefaultValue(50.0);
  103. layout->addChild(wireOpacitySlider);
  104. wireTensionSlider = new Slider();
  105. wireTensionSlider->box.size.x = 150;
  106. wireTensionSlider->label = "Cable tension";
  107. wireTensionSlider->unit = "";
  108. wireTensionSlider->setLimits(0.0, 1.0);
  109. wireTensionSlider->setDefaultValue(0.5);
  110. layout->addChild(wireTensionSlider);
  111. struct ZoomSlider : Slider {
  112. void onAction(EventAction &e) override {
  113. Slider::onAction(e);
  114. gRackScene->zoomWidget->setZoom(roundf(value) / 100.0);
  115. }
  116. };
  117. zoomSlider = new ZoomSlider();
  118. zoomSlider->box.size.x = 150;
  119. zoomSlider->precision = 0;
  120. zoomSlider->label = "Zoom";
  121. zoomSlider->unit = "%";
  122. zoomSlider->setLimits(25.0, 200.0);
  123. zoomSlider->setDefaultValue(100.0);
  124. layout->addChild(zoomSlider);
  125. /*
  126. cpuUsageButton = new RadioButton();
  127. cpuUsageButton->box.size.x = 100;
  128. cpuUsageButton->label = "CPU usage";
  129. layout->addChild(cpuUsageButton);
  130. */
  131. #if defined(RELEASE)
  132. Widget *pluginManager = new PluginManagerWidget();
  133. layout->addChild(pluginManager);
  134. #endif
  135. }
  136. void Toolbar::draw(NVGcontext *vg) {
  137. bndBackground(vg, 0.0, 0.0, box.size.x, box.size.y);
  138. bndBevel(vg, 0.0, 0.0, box.size.x, box.size.y);
  139. Widget::draw(vg);
  140. }
  141. } // namespace rack