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.

121 lines
2.8KB

  1. #include "app.hpp"
  2. #include "window.hpp"
  3. #include "util/request.hpp"
  4. #include "osdialog.h"
  5. #include <string.h>
  6. #include <thread>
  7. namespace rack {
  8. RackScene::RackScene() {
  9. scrollWidget = new RackScrollWidget();
  10. {
  11. zoomWidget = new ZoomWidget();
  12. {
  13. assert(!gRackWidget);
  14. gRackWidget = new RackWidget();
  15. zoomWidget->addChild(gRackWidget);
  16. }
  17. scrollWidget->container->addChild(zoomWidget);
  18. }
  19. addChild(scrollWidget);
  20. gToolbar = new Toolbar();
  21. addChild(gToolbar);
  22. scrollWidget->box.pos.y = gToolbar->box.size.y;
  23. }
  24. void RackScene::step() {
  25. // Resize owned descendants
  26. gToolbar->box.size.x = box.size.x;
  27. scrollWidget->box.size = box.size.minus(scrollWidget->box.pos);
  28. // Resize to be a bit larger than the ScrollWidget viewport
  29. gRackWidget->box.size = scrollWidget->box.size
  30. .minus(scrollWidget->container->box.pos)
  31. .plus(Vec(500, 500))
  32. .div(zoomWidget->zoom);
  33. Scene::step();
  34. zoomWidget->box.size = gRackWidget->box.size.mult(zoomWidget->zoom);
  35. // Version popup message
  36. if (!gLatestVersion.empty()) {
  37. std::string versionMessage = stringf("Rack %s is available.\n\nYou have Rack %s.\n\nClose Rack and download new version on the website?", gLatestVersion.c_str(), gApplicationVersion.c_str());
  38. if (osdialog_message(OSDIALOG_INFO, OSDIALOG_OK_CANCEL, versionMessage.c_str())) {
  39. std::thread t(systemOpenBrowser, "https://vcvrack.com/");
  40. t.detach();
  41. windowClose();
  42. }
  43. gLatestVersion = "";
  44. }
  45. }
  46. void RackScene::draw(NVGcontext *vg) {
  47. Scene::draw(vg);
  48. }
  49. void RackScene::onHoverKey(EventHoverKey &e) {
  50. Widget::onHoverKey(e);
  51. if (!e.consumed) {
  52. switch (e.key) {
  53. case GLFW_KEY_N: {
  54. if (windowIsModPressed() && !windowIsShiftPressed()) {
  55. gRackWidget->reset();
  56. e.consumed = true;
  57. }
  58. } break;
  59. case GLFW_KEY_Q: {
  60. if (windowIsModPressed() && !windowIsShiftPressed()) {
  61. windowClose();
  62. e.consumed = true;
  63. }
  64. } break;
  65. case GLFW_KEY_O: {
  66. if (windowIsModPressed() && !windowIsShiftPressed()) {
  67. gRackWidget->openDialog();
  68. e.consumed = true;
  69. }
  70. } break;
  71. case GLFW_KEY_S: {
  72. if (windowIsModPressed() && !windowIsShiftPressed()) {
  73. gRackWidget->saveDialog();
  74. e.consumed = true;
  75. }
  76. if (windowIsModPressed() && windowIsShiftPressed()) {
  77. gRackWidget->saveAsDialog();
  78. e.consumed = true;
  79. }
  80. } break;
  81. case GLFW_KEY_ENTER:
  82. case GLFW_KEY_KP_ENTER: {
  83. appModuleBrowserCreate();
  84. e.consumed = true;
  85. } break;
  86. case GLFW_KEY_F11: {
  87. windowSetFullScreen(!windowGetFullScreen());
  88. }
  89. }
  90. }
  91. }
  92. void RackScene::onPathDrop(EventPathDrop &e) {
  93. if (e.paths.size() >= 1) {
  94. const std::string& firstPath = e.paths.front();
  95. if (stringExtension(firstPath) == "vcv") {
  96. gRackWidget->loadPatch(firstPath);
  97. e.consumed = true;
  98. }
  99. }
  100. if (!e.consumed)
  101. Scene::onPathDrop(e);
  102. }
  103. } // namespace rack