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.

180 lines
4.4KB

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