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.

157 lines
4.0KB

  1. #include <app/Scene.hpp>
  2. #include <app/ModuleBrowser.hpp>
  3. #include <app.hpp>
  4. #include <system.hpp>
  5. #include <network.hpp>
  6. #include <history.hpp>
  7. #include <settings.hpp>
  8. #include <patch.hpp>
  9. #include <asset.hpp>
  10. #include <osdialog.h>
  11. #include <thread>
  12. namespace rack {
  13. namespace app {
  14. Scene::Scene() {
  15. rackScroll = new RackScrollWidget;
  16. addChild(rackScroll);
  17. rack = rackScroll->rackWidget;
  18. menuBar = createMenuBar();
  19. addChild(menuBar);
  20. moduleBrowser = moduleBrowserCreate();
  21. moduleBrowser->hide();
  22. addChild(moduleBrowser);
  23. }
  24. Scene::~Scene() {
  25. }
  26. void Scene::step() {
  27. bool fullscreen = APP->window->isFullScreen();
  28. menuBar->visible = !fullscreen;
  29. rackScroll->box.pos.y = menuBar->visible ? menuBar->box.size.y : 0;
  30. // Resize owned descendants
  31. menuBar->box.size.x = box.size.x;
  32. rackScroll->box.size = box.size.minus(rackScroll->box.pos);
  33. // Autosave every 15 seconds
  34. if (settings::autosavePeriod > 0.0) {
  35. double time = glfwGetTime();
  36. if (time - lastAutosaveTime >= settings::autosavePeriod) {
  37. lastAutosaveTime = time;
  38. APP->patch->save(asset::autosavePath);
  39. settings::save(asset::settingsPath);
  40. }
  41. }
  42. Widget::step();
  43. }
  44. void Scene::draw(const DrawArgs& args) {
  45. Widget::draw(args);
  46. }
  47. void Scene::onHoverKey(const event::HoverKey& e) {
  48. OpaqueWidget::onHoverKey(e);
  49. if (e.isConsumed())
  50. return;
  51. if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) {
  52. if (e.key == GLFW_KEY_N && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  53. APP->patch->resetDialog();
  54. e.consume(this);
  55. }
  56. else if (e.key == GLFW_KEY_Q && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  57. APP->window->close();
  58. e.consume(this);
  59. }
  60. else if (e.key == GLFW_KEY_O && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  61. APP->patch->loadDialog();
  62. e.consume(this);
  63. }
  64. else if (e.key == GLFW_KEY_O && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) {
  65. APP->patch->revertDialog();
  66. e.consume(this);
  67. }
  68. else if (e.key == GLFW_KEY_S && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  69. APP->patch->saveDialog();
  70. e.consume(this);
  71. }
  72. else if (e.key == GLFW_KEY_S && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) {
  73. APP->patch->saveAsDialog();
  74. e.consume(this);
  75. }
  76. else if (e.key == GLFW_KEY_Z && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  77. APP->history->undo();
  78. e.consume(this);
  79. }
  80. else if (e.key == GLFW_KEY_Z && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) {
  81. APP->history->redo();
  82. e.consume(this);
  83. }
  84. else if ((e.key == GLFW_KEY_MINUS || e.key == GLFW_KEY_KP_SUBTRACT) && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  85. float zoom = settings::zoom;
  86. zoom *= 2;
  87. zoom = std::ceil(zoom - 0.01f) - 1;
  88. zoom /= 2;
  89. settings::zoom = zoom;
  90. e.consume(this);
  91. }
  92. else if ((e.key == GLFW_KEY_EQUAL || e.key == GLFW_KEY_KP_ADD) && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  93. float zoom = settings::zoom;
  94. zoom *= 2;
  95. zoom = std::floor(zoom + 0.01f) + 1;
  96. zoom /= 2;
  97. settings::zoom = zoom;
  98. e.consume(this);
  99. }
  100. else if ((e.key == GLFW_KEY_0 || e.key == GLFW_KEY_KP_0) && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  101. settings::zoom = 0.f;
  102. e.consume(this);
  103. }
  104. else if ((e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) && (e.mods & RACK_MOD_MASK) == 0) {
  105. moduleBrowser->show();
  106. e.consume(this);
  107. }
  108. else if (e.key == GLFW_KEY_F1 && (e.mods & RACK_MOD_MASK) == 0) {
  109. std::thread t([] {
  110. system::openBrowser("https://vcvrack.com/manual/");
  111. });
  112. t.detach();
  113. e.consume(this);
  114. }
  115. else if (e.key == GLFW_KEY_F3 && (e.mods & RACK_MOD_MASK) == 0) {
  116. settings::cpuMeter ^= true;
  117. e.consume(this);
  118. }
  119. else if (e.key == GLFW_KEY_F11 && (e.mods & RACK_MOD_MASK) == 0) {
  120. APP->window->setFullScreen(!APP->window->isFullScreen());
  121. e.consume(this);
  122. }
  123. }
  124. }
  125. void Scene::onPathDrop(const event::PathDrop& e) {
  126. if (e.paths.size() >= 1) {
  127. const std::string& path = e.paths[0];
  128. if (string::filenameExtension(string::filename(path)) == "vcv") {
  129. APP->patch->loadPathDialog(path);
  130. e.consume(this);
  131. return;
  132. }
  133. }
  134. OpaqueWidget::onPathDrop(e);
  135. }
  136. } // namespace app
  137. } // namespace rack