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.

223 lines
5.7KB

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