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.

143 lines
3.1KB

  1. #include "app.hpp"
  2. #include "gui.hpp"
  3. #include "util/request.hpp"
  4. #include "../ext/osdialog/osdialog.h"
  5. #include <string.h>
  6. #include <thread>
  7. namespace rack {
  8. static std::string newVersion = "";
  9. #if defined(RELEASE)
  10. static void checkVersion() {
  11. json_t *resJ = requestJson(METHOD_GET, gApiHost + "/version", NULL);
  12. if (resJ) {
  13. json_t *versionJ = json_object_get(resJ, "version");
  14. if (versionJ) {
  15. const char *version = json_string_value(versionJ);
  16. if (version && strlen(version) > 0 && version != gApplicationVersion) {
  17. newVersion = version;
  18. }
  19. }
  20. json_decref(resJ);
  21. }
  22. }
  23. #endif
  24. RackScene::RackScene() {
  25. scrollWidget = new RackScrollWidget();
  26. {
  27. zoomWidget = new ZoomWidget();
  28. {
  29. assert(!gRackWidget);
  30. gRackWidget = new RackWidget();
  31. zoomWidget->addChild(gRackWidget);
  32. }
  33. scrollWidget->container->addChild(zoomWidget);
  34. }
  35. addChild(scrollWidget);
  36. gToolbar = new Toolbar();
  37. addChild(gToolbar);
  38. scrollWidget->box.pos.y = gToolbar->box.size.y;
  39. // Check for new version
  40. #if defined(RELEASE)
  41. std::thread versionThread(checkVersion);
  42. versionThread.detach();
  43. #endif
  44. }
  45. void RackScene::step() {
  46. // Resize owned descendants
  47. gToolbar->box.size.x = box.size.x;
  48. scrollWidget->box.size = box.size.minus(scrollWidget->box.pos);
  49. // Resize to be a bit larger than the ScrollWidget viewport
  50. gRackWidget->box.size = scrollWidget->box.size
  51. .minus(scrollWidget->container->box.pos)
  52. .plus(Vec(500, 500))
  53. .div(zoomWidget->zoom);
  54. Scene::step();
  55. zoomWidget->box.size = gRackWidget->box.size.mult(zoomWidget->zoom);
  56. // Version popup message
  57. if (!newVersion.empty()) {
  58. std::string versionMessage = stringf("Rack v%s is available.\n\nYou have Rack v%s.\n\nWould you like to download the new version on the website?", newVersion.c_str(), gApplicationVersion.c_str());
  59. if (osdialog_message(OSDIALOG_INFO, OSDIALOG_YES_NO, versionMessage.c_str())) {
  60. std::thread t(openBrowser, "https://vcvrack.com/");
  61. t.detach();
  62. guiClose();
  63. }
  64. newVersion = "";
  65. }
  66. }
  67. void RackScene::draw(NVGcontext *vg) {
  68. Scene::draw(vg);
  69. }
  70. void RackScene::onHoverKey(EventHoverKey &e) {
  71. switch (e.key) {
  72. case GLFW_KEY_N:
  73. if (guiIsModPressed() && !guiIsShiftPressed()) {
  74. gRackWidget->reset();
  75. e.consumed = true;
  76. return;
  77. }
  78. break;
  79. case GLFW_KEY_Q:
  80. if (guiIsModPressed() && !guiIsShiftPressed()) {
  81. guiClose();
  82. e.consumed = true;
  83. return;
  84. }
  85. break;
  86. case GLFW_KEY_O:
  87. if (guiIsModPressed() && !guiIsShiftPressed()) {
  88. gRackWidget->openDialog();
  89. e.consumed = true;
  90. return;
  91. }
  92. break;
  93. case GLFW_KEY_S:
  94. if (guiIsModPressed() && !guiIsShiftPressed()) {
  95. gRackWidget->saveDialog();
  96. e.consumed = true;
  97. return;
  98. }
  99. if (guiIsModPressed() && guiIsShiftPressed()) {
  100. gRackWidget->saveAsDialog();
  101. e.consumed = true;
  102. return;
  103. }
  104. break;
  105. }
  106. Widget::onHoverKey(e);
  107. }
  108. void RackScene::onPathDrop(EventPathDrop &e) {
  109. if (e.paths.size() >= 1) {
  110. const std::string& firstPath = e.paths.front();
  111. if (extractExtension(firstPath) == "vcv") {
  112. gRackWidget->loadPatch(firstPath);
  113. e.consumed = true;
  114. }
  115. }
  116. if (!e.consumed)
  117. Scene::onPathDrop(e);
  118. }
  119. } // namespace rack