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.

227 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 (" 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 (" WINDOW_MOD_KEY_NAME "+O)";
  40. }
  41. void onAction(EventAction &e) override {
  42. gRackWidget->openDialog();
  43. }
  44. };
  45. struct SaveButton : TooltipIconButton {
  46. SaveButton() {
  47. setSVG(SVG::load(assetGlobal("res/icons/noun_1343816_cc.svg")));
  48. tooltipText = "Save (" 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 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";
  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 = "Internal 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("Internal 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. Toolbar::Toolbar() {
  135. box.size.y = BND_WIDGET_HEIGHT + 2*5;
  136. SequentialLayout *layout = new SequentialLayout();
  137. layout->box.pos = Vec(5, 5);
  138. layout->spacing = 5;
  139. addChild(layout);
  140. layout->addChild(new NewButton());
  141. layout->addChild(new OpenButton());
  142. layout->addChild(new SaveButton());
  143. layout->addChild(new SaveAsButton());
  144. layout->addChild(new RevertButton());
  145. layout->addChild(new DisconnectCablesButton());
  146. wireOpacitySlider = new Slider();
  147. wireOpacitySlider->box.size.x = 150;
  148. wireOpacitySlider->label = "Cable opacity";
  149. wireOpacitySlider->precision = 0;
  150. wireOpacitySlider->unit = "%";
  151. wireOpacitySlider->setLimits(0.0, 100.0);
  152. wireOpacitySlider->setDefaultValue(50.0);
  153. layout->addChild(wireOpacitySlider);
  154. wireTensionSlider = new Slider();
  155. wireTensionSlider->box.size.x = 150;
  156. wireTensionSlider->label = "Cable tension";
  157. wireTensionSlider->unit = "";
  158. wireTensionSlider->setLimits(0.0, 1.0);
  159. wireTensionSlider->setDefaultValue(0.5);
  160. layout->addChild(wireTensionSlider);
  161. layout->addChild(new SampleRateButton());
  162. layout->addChild(new PowerMeterButton());
  163. layout->addChild(new RackLockButton());
  164. struct ZoomSlider : Slider {
  165. void onAction(EventAction &e) override {
  166. Slider::onAction(e);
  167. gRackScene->zoomWidget->setZoom(roundf(value) / 100.0);
  168. }
  169. };
  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. /*
  179. cpuUsageButton = new RadioButton();
  180. cpuUsageButton->box.size.x = 100;
  181. cpuUsageButton->label = "CPU usage";
  182. layout->addChild(cpuUsageButton);
  183. */
  184. #if defined(RELEASE)
  185. Widget *pluginManager = new PluginManagerWidget();
  186. layout->addChild(pluginManager);
  187. #endif
  188. }
  189. void Toolbar::draw(NVGcontext *vg) {
  190. bndBackground(vg, 0.0, 0.0, box.size.x, box.size.y);
  191. bndBevel(vg, 0.0, 0.0, box.size.x, box.size.y);
  192. Widget::draw(vg);
  193. }
  194. } // namespace rack