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.

154 lines
3.4KB

  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. rackScroll->box.pos.y = menuBar->box.size.y;
  21. moduleBrowser = moduleBrowserCreate();
  22. moduleBrowser->hide();
  23. addChild(moduleBrowser);
  24. }
  25. Scene::~Scene() {
  26. }
  27. void Scene::step() {
  28. // Resize owned descendants
  29. menuBar->box.size.x = box.size.x;
  30. rackScroll->box.size = box.size.minus(rackScroll->box.pos);
  31. // Autosave every 15 seconds
  32. double time = glfwGetTime();
  33. if (time - lastAutoSaveTime >= 15.0) {
  34. lastAutoSaveTime = time;
  35. APP->patch->save(asset::user("autosave.vcv"));
  36. settings::save(asset::user("settings.json"));
  37. }
  38. Widget::step();
  39. }
  40. void Scene::draw(const DrawArgs &args) {
  41. Widget::draw(args);
  42. }
  43. void Scene::onHoverKey(const event::HoverKey &e) {
  44. OpaqueWidget::onHoverKey(e);
  45. if (e.isConsumed())
  46. return;
  47. if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) {
  48. switch (e.key) {
  49. case GLFW_KEY_N: {
  50. if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  51. APP->patch->resetDialog();
  52. e.consume(this);
  53. }
  54. } break;
  55. case GLFW_KEY_Q: {
  56. if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  57. APP->window->close();
  58. e.consume(this);
  59. }
  60. } break;
  61. case GLFW_KEY_O: {
  62. if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  63. APP->patch->loadDialog();
  64. e.consume(this);
  65. }
  66. if ((e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) {
  67. APP->patch->revertDialog();
  68. e.consume(this);
  69. }
  70. } break;
  71. case GLFW_KEY_S: {
  72. if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  73. APP->patch->saveDialog();
  74. e.consume(this);
  75. }
  76. if ((e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) {
  77. APP->patch->saveAsDialog();
  78. e.consume(this);
  79. }
  80. } break;
  81. case GLFW_KEY_Z: {
  82. if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  83. APP->history->undo();
  84. e.consume(this);
  85. }
  86. if ((e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) {
  87. APP->history->redo();
  88. e.consume(this);
  89. }
  90. } break;
  91. case GLFW_KEY_MINUS: {
  92. if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  93. float zoom = settings::zoom;
  94. zoom *= 2;
  95. zoom = std::ceil(zoom - 0.01) - 1;
  96. zoom /= 2;
  97. settings::zoom = zoom;
  98. e.consume(this);
  99. }
  100. } break;
  101. case GLFW_KEY_EQUAL: {
  102. if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
  103. float zoom = settings::zoom;
  104. zoom *= 2;
  105. zoom = std::floor(zoom + 0.01) + 1;
  106. zoom /= 2;
  107. settings::zoom = zoom;
  108. e.consume(this);
  109. }
  110. } break;
  111. case GLFW_KEY_ENTER: {
  112. moduleBrowser->show();
  113. e.consume(this);
  114. } break;
  115. case GLFW_KEY_F11: {
  116. APP->window->setFullScreen(!APP->window->isFullScreen());
  117. e.consume(this);
  118. } break;
  119. }
  120. }
  121. }
  122. void Scene::onPathDrop(const event::PathDrop &e) {
  123. OpaqueWidget::onPathDrop(e);
  124. if (e.isConsumed())
  125. return;
  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->load(path);
  130. e.consume(this);
  131. }
  132. }
  133. }
  134. } // namespace app
  135. } // namespace rack