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.

222 lines
5.7KB

  1. #include "app.hpp"
  2. #include "window.hpp"
  3. #include "engine.hpp"
  4. #include "asset.hpp"
  5. namespace rack {
  6. struct TooltipIconButton : IconButton {
  7. Tooltip *tooltip = NULL;
  8. std::string tooltipText;
  9. void onMouseEnter(EventMouseEnter &e) override {
  10. if (!tooltip) {
  11. tooltip = new Tooltip();
  12. tooltip->box.pos = getAbsoluteOffset(Vec(0, BND_WIDGET_HEIGHT));
  13. tooltip->text = tooltipText;
  14. gScene->addChild(tooltip);
  15. }
  16. IconButton::onMouseEnter(e);
  17. }
  18. void onMouseLeave(EventMouseLeave &e) override {
  19. if (tooltip) {
  20. gScene->removeChild(tooltip);
  21. delete tooltip;
  22. tooltip = NULL;
  23. }
  24. IconButton::onMouseLeave(e);
  25. }
  26. };
  27. struct NewButton : TooltipIconButton {
  28. NewButton() {
  29. setSVG(SVG::load(assetGlobal("res/icons/noun_146097_cc.svg")));
  30. tooltipText = "New patch (" WINDOW_MOD_KEY_NAME "+N)";
  31. }
  32. void onAction(EventAction &e) override {
  33. gRackWidget->reset();
  34. }
  35. };
  36. struct OpenButton : TooltipIconButton {
  37. OpenButton() {
  38. setSVG(SVG::load(assetGlobal("res/icons/noun_31859_cc.svg")));
  39. tooltipText = "Open patch (" WINDOW_MOD_KEY_NAME "+O)";
  40. }
  41. void onAction(EventAction &e) override {
  42. gRackWidget->loadDialog();
  43. }
  44. };
  45. struct SaveButton : TooltipIconButton {
  46. SaveButton() {
  47. setSVG(SVG::load(assetGlobal("res/icons/noun_1343816_cc.svg")));
  48. tooltipText = "Save patch (" WINDOW_MOD_KEY_NAME "+S)";
  49. }
  50. void onAction(EventAction &e) override {
  51. gRackWidget->saveDialog();
  52. }
  53. };
  54. struct SaveAsButton : TooltipIconButton {
  55. SaveAsButton() {
  56. setSVG(SVG::load(assetGlobal("res/icons/noun_1343811_cc.svg")));
  57. tooltipText = "Save patch as (" WINDOW_MOD_KEY_NAME "+Shift+S)";
  58. }
  59. void onAction(EventAction &e) override {
  60. gRackWidget->saveAsDialog();
  61. }
  62. };
  63. struct RevertButton : TooltipIconButton {
  64. RevertButton() {
  65. setSVG(SVG::load(assetGlobal("res/icons/noun_1084369_cc.svg")));
  66. tooltipText = "Revert patch";
  67. }
  68. void onAction(EventAction &e) override {
  69. gRackWidget->revert();
  70. }
  71. };
  72. struct DisconnectCablesButton : TooltipIconButton {
  73. DisconnectCablesButton() {
  74. setSVG(SVG::load(assetGlobal("res/icons/noun_1745061_cc.svg")));
  75. tooltipText = "Disconnect cables";
  76. }
  77. void onAction(EventAction &e) override {
  78. gRackWidget->disconnect();
  79. }
  80. };
  81. struct PowerMeterButton : TooltipIconButton {
  82. PowerMeterButton() {
  83. setSVG(SVG::load(assetGlobal("res/icons/noun_305536_cc.svg")));
  84. tooltipText = "Toggle power meter (see manual for explanation)";
  85. }
  86. void onAction(EventAction &e) override {
  87. gPowerMeter ^= true;
  88. }
  89. };
  90. struct EnginePauseItem : MenuItem {
  91. void onAction(EventAction &e) override {
  92. gPaused ^= true;
  93. }
  94. };
  95. struct SampleRateItem : MenuItem {
  96. float sampleRate;
  97. void onAction(EventAction &e) override {
  98. engineSetSampleRate(sampleRate);
  99. gPaused = false;
  100. }
  101. };
  102. struct SampleRateButton : TooltipIconButton {
  103. SampleRateButton() {
  104. setSVG(SVG::load(assetGlobal("res/icons/noun_1240789_cc.svg")));
  105. tooltipText = "Engine sample rate";
  106. }
  107. void onAction(EventAction &e) override {
  108. Menu *menu = gScene->createMenu();
  109. menu->box.pos = getAbsoluteOffset(Vec(0, box.size.y));
  110. menu->box.size.x = box.size.x;
  111. menu->addChild(MenuLabel::create("Engine sample rate"));
  112. EnginePauseItem *pauseItem = new EnginePauseItem();
  113. pauseItem->text = gPaused ? "Resume engine" : "Pause engine";
  114. menu->addChild(pauseItem);
  115. std::vector<float> sampleRates = {44100, 48000, 88200, 96000, 176400, 192000};
  116. for (float sampleRate : sampleRates) {
  117. SampleRateItem *item = new SampleRateItem();
  118. item->text = stringf("%.0f Hz", sampleRate);
  119. item->rightText = CHECKMARK(engineGetSampleRate() == sampleRate);
  120. item->sampleRate = sampleRate;
  121. menu->addChild(item);
  122. }
  123. }
  124. };
  125. struct RackLockButton : TooltipIconButton {
  126. RackLockButton() {
  127. setSVG(SVG::load(assetGlobal("res/icons/noun_468341_cc.svg")));
  128. tooltipText = "Lock modules";
  129. }
  130. void onAction(EventAction &e) override {
  131. gRackWidget->lockModules ^= true;
  132. }
  133. };
  134. struct ZoomSlider : Slider {
  135. void onAction(EventAction &e) override {
  136. Slider::onAction(e);
  137. gRackScene->zoomWidget->setZoom(roundf(value) / 100.0);
  138. }
  139. };
  140. Toolbar::Toolbar() {
  141. box.size.y = BND_WIDGET_HEIGHT + 2*5;
  142. SequentialLayout *layout = new SequentialLayout();
  143. layout->box.pos = Vec(5, 5);
  144. layout->spacing = 5;
  145. addChild(layout);
  146. layout->addChild(new NewButton());
  147. layout->addChild(new OpenButton());
  148. layout->addChild(new SaveButton());
  149. layout->addChild(new SaveAsButton());
  150. layout->addChild(new RevertButton());
  151. layout->addChild(new DisconnectCablesButton());
  152. layout->addChild(new SampleRateButton());
  153. layout->addChild(new PowerMeterButton());
  154. layout->addChild(new RackLockButton());
  155. wireOpacitySlider = new Slider();
  156. wireOpacitySlider->box.size.x = 150;
  157. wireOpacitySlider->label = "Cable opacity";
  158. wireOpacitySlider->precision = 0;
  159. wireOpacitySlider->unit = "%";
  160. wireOpacitySlider->setLimits(0.0, 100.0);
  161. wireOpacitySlider->setDefaultValue(50.0);
  162. layout->addChild(wireOpacitySlider);
  163. wireTensionSlider = new Slider();
  164. wireTensionSlider->box.size.x = 150;
  165. wireTensionSlider->label = "Cable tension";
  166. wireTensionSlider->unit = "";
  167. wireTensionSlider->setLimits(0.0, 1.0);
  168. wireTensionSlider->setDefaultValue(0.5);
  169. layout->addChild(wireTensionSlider);
  170. zoomSlider = new ZoomSlider();
  171. zoomSlider->box.size.x = 150;
  172. zoomSlider->precision = 0;
  173. zoomSlider->label = "Zoom";
  174. zoomSlider->unit = "%";
  175. zoomSlider->setLimits(25.0, 200.0);
  176. zoomSlider->setDefaultValue(100.0);
  177. layout->addChild(zoomSlider);
  178. // Kind of hacky, but display the PluginManagerWidget only if the local directory is not the development directory
  179. if (assetLocal("") != "./") {
  180. Widget *pluginManager = new PluginManagerWidget();
  181. layout->addChild(pluginManager);
  182. }
  183. }
  184. void Toolbar::draw(NVGcontext *vg) {
  185. bndBackground(vg, 0.0, 0.0, box.size.x, box.size.y);
  186. bndBevel(vg, 0.0, 0.0, box.size.x, box.size.y);
  187. Widget::draw(vg);
  188. }
  189. } // namespace rack