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.

211 lines
5.3KB

  1. #include "app.hpp"
  2. #include "window.hpp"
  3. #include "engine.hpp"
  4. #include "asset.hpp"
  5. namespace rack {
  6. struct TooltipIconButton : IconButton {
  7. std::string tooltipText;
  8. void onMouseEnter(EventMouseEnter &e) override {
  9. TooltipOverlay *overlay = new TooltipOverlay();
  10. Tooltip *tooltip = new Tooltip();
  11. tooltip->box.pos = getAbsoluteOffset(Vec(0, BND_WIDGET_HEIGHT));
  12. tooltip->text = tooltipText;
  13. overlay->addChild(tooltip);
  14. gScene->setOverlay(overlay);
  15. }
  16. void onMouseLeave(EventMouseLeave &e) override {
  17. gScene->setOverlay(NULL);
  18. }
  19. };
  20. struct NewButton : TooltipIconButton {
  21. NewButton() {
  22. setSVG(SVG::load(assetGlobal("res/icons/037-file-empty.svg")));
  23. tooltipText = "New patch (" WINDOW_MOD_KEY_NAME "+N)";
  24. }
  25. void onAction(EventAction &e) override {
  26. gRackWidget->reset();
  27. }
  28. };
  29. struct OpenButton : TooltipIconButton {
  30. OpenButton() {
  31. setSVG(SVG::load(assetGlobal("res/icons/049-folder-open.svg")));
  32. tooltipText = "Open patch (" WINDOW_MOD_KEY_NAME "+O)";
  33. }
  34. void onAction(EventAction &e) override {
  35. gRackWidget->openDialog();
  36. }
  37. };
  38. struct SaveButton : TooltipIconButton {
  39. SaveButton() {
  40. setSVG(SVG::load(assetGlobal("res/icons/099-floppy-disk.svg")));
  41. tooltipText = "Save patch (" WINDOW_MOD_KEY_NAME "+S)";
  42. }
  43. void onAction(EventAction &e) override {
  44. gRackWidget->saveDialog();
  45. }
  46. };
  47. struct MeterButton : TooltipIconButton {
  48. MeterButton() {
  49. setSVG(SVG::load(assetGlobal("res/icons/167-meter.svg")));
  50. tooltipText = "Toggle CPU meter\nSee manual for mV definition";
  51. }
  52. void onAction(EventAction &e) override {
  53. gCpuMeters ^= true;
  54. }
  55. };
  56. struct EnginePauseItem : MenuItem {
  57. void onAction(EventAction &e) override {
  58. gPaused ^= true;
  59. }
  60. };
  61. struct SampleRateItem : MenuItem {
  62. float sampleRate;
  63. void onAction(EventAction &e) override {
  64. engineSetSampleRate(sampleRate);
  65. gPaused = false;
  66. }
  67. };
  68. struct SampleRateButton : TooltipIconButton {
  69. SampleRateButton() {
  70. setSVG(SVG::load(assetGlobal("res/icons/030-feed.svg")));
  71. tooltipText = "Internal sample rate";
  72. }
  73. void onAction(EventAction &e) override {
  74. Menu *menu = gScene->createMenu();
  75. menu->box.pos = getAbsoluteOffset(Vec(0, box.size.y));
  76. menu->box.size.x = box.size.x;
  77. EnginePauseItem *pauseItem = new EnginePauseItem();
  78. pauseItem->text = gPaused ? "Resume engine" : "Pause engine";
  79. menu->addChild(pauseItem);
  80. std::vector<float> sampleRates = {44100, 48000, 88200, 96000, 176400, 192000};
  81. for (float sampleRate : sampleRates) {
  82. SampleRateItem *item = new SampleRateItem();
  83. item->text = stringf("%.0f Hz", sampleRate);
  84. item->rightText = CHECKMARK(engineGetSampleRate() == sampleRate);
  85. item->sampleRate = sampleRate;
  86. menu->addChild(item);
  87. }
  88. }
  89. };
  90. struct DisconnectItem : MenuItem {
  91. void onAction(EventAction &e) override {
  92. gRackWidget->disconnect();
  93. }
  94. };
  95. struct SaveAsItem : MenuItem {
  96. void onAction(EventAction &e) override {
  97. gRackWidget->saveAsDialog();
  98. }
  99. };
  100. struct RevertItem : MenuItem {
  101. void onAction(EventAction &e) override {
  102. gRackWidget->revert();
  103. }
  104. };
  105. struct FileChoice : ChoiceButton {
  106. void onAction(EventAction &e) override {
  107. Menu *menu = gScene->createMenu();
  108. menu->box.pos = getAbsoluteOffset(Vec(0, box.size.y));
  109. menu->box.size.x = box.size.x;
  110. menu->addChild(MenuItem::create<DisconnectItem>("Disconnect cables"));
  111. menu->addChild(MenuItem::create<SaveAsItem>("Save as", WINDOW_MOD_KEY_NAME "+Shift+S"));
  112. menu->addChild(MenuItem::create<RevertItem>("Revert"));
  113. }
  114. };
  115. Toolbar::Toolbar() {
  116. box.size.y = BND_WIDGET_HEIGHT + 2*5;
  117. SequentialLayout *layout = new SequentialLayout();
  118. layout->box.pos = Vec(5, 5);
  119. layout->spacing = 5;
  120. addChild(layout);
  121. layout->addChild(new NewButton());
  122. layout->addChild(new OpenButton());
  123. layout->addChild(new SaveButton());
  124. layout->addChild(new SampleRateButton());
  125. layout->addChild(new MeterButton());
  126. ChoiceButton *fileChoice = new FileChoice();
  127. fileChoice->box.size.x = 100;
  128. fileChoice->text = "File";
  129. layout->addChild(fileChoice);
  130. wireOpacitySlider = new Slider();
  131. wireOpacitySlider->box.size.x = 150;
  132. wireOpacitySlider->label = "Cable opacity";
  133. wireOpacitySlider->precision = 0;
  134. wireOpacitySlider->unit = "%";
  135. wireOpacitySlider->setLimits(0.0, 100.0);
  136. wireOpacitySlider->setDefaultValue(50.0);
  137. layout->addChild(wireOpacitySlider);
  138. wireTensionSlider = new Slider();
  139. wireTensionSlider->box.size.x = 150;
  140. wireTensionSlider->label = "Cable tension";
  141. wireTensionSlider->unit = "";
  142. wireTensionSlider->setLimits(0.0, 1.0);
  143. wireTensionSlider->setDefaultValue(0.5);
  144. layout->addChild(wireTensionSlider);
  145. struct ZoomSlider : Slider {
  146. void onAction(EventAction &e) override {
  147. Slider::onAction(e);
  148. gRackScene->zoomWidget->setZoom(roundf(value) / 100.0);
  149. }
  150. };
  151. zoomSlider = new ZoomSlider();
  152. zoomSlider->box.size.x = 150;
  153. zoomSlider->precision = 0;
  154. zoomSlider->label = "Zoom";
  155. zoomSlider->unit = "%";
  156. zoomSlider->setLimits(25.0, 200.0);
  157. zoomSlider->setDefaultValue(100.0);
  158. layout->addChild(zoomSlider);
  159. /*
  160. cpuUsageButton = new RadioButton();
  161. cpuUsageButton->box.size.x = 100;
  162. cpuUsageButton->label = "CPU usage";
  163. layout->addChild(cpuUsageButton);
  164. */
  165. #if defined(RELEASE)
  166. Widget *pluginManager = new PluginManagerWidget();
  167. layout->addChild(pluginManager);
  168. #endif
  169. }
  170. void Toolbar::draw(NVGcontext *vg) {
  171. bndBackground(vg, 0.0, 0.0, box.size.x, box.size.y);
  172. bndBevel(vg, 0.0, 0.0, box.size.x, box.size.y);
  173. Widget::draw(vg);
  174. }
  175. } // namespace rack