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.

156 lines
3.8KB

  1. #include "settings.hpp"
  2. #include "app.hpp"
  3. #include "gui.hpp"
  4. #include "engine.hpp"
  5. #include "plugin.hpp"
  6. #include <jansson.h>
  7. namespace rack {
  8. static json_t *settingsToJson() {
  9. // root
  10. json_t *rootJ = json_object();
  11. // token
  12. json_t *tokenJ = json_string(gToken.c_str());
  13. json_object_set_new(rootJ, "token", tokenJ);
  14. if (!guiIsMaximized()) {
  15. // windowSize
  16. Vec windowSize = guiGetWindowSize();
  17. json_t *windowSizeJ = json_pack("[f, f]", windowSize.x, windowSize.y);
  18. json_object_set_new(rootJ, "windowSize", windowSizeJ);
  19. // windowPos
  20. Vec windowPos = guiGetWindowPos();
  21. json_t *windowPosJ = json_pack("[f, f]", windowPos.x, windowPos.y);
  22. json_object_set_new(rootJ, "windowPos", windowPosJ);
  23. }
  24. // opacity
  25. float opacity = gToolbar->wireOpacitySlider->value;
  26. json_t *opacityJ = json_real(opacity);
  27. json_object_set_new(rootJ, "wireOpacity", opacityJ);
  28. // tension
  29. float tension = gToolbar->wireTensionSlider->value;
  30. json_t *tensionJ = json_real(tension);
  31. json_object_set_new(rootJ, "wireTension", tensionJ);
  32. // zoom
  33. float zoom = gRackScene->zoomWidget->zoom;
  34. json_t *zoomJ = json_real(zoom);
  35. json_object_set_new(rootJ, "zoom", zoomJ);
  36. // allowCursorLock
  37. json_t *allowCursorLockJ = json_boolean(gAllowCursorLock);
  38. json_object_set_new(rootJ, "allowCursorLock", allowCursorLockJ);
  39. // sampleRate
  40. json_t *sampleRateJ = json_real(engineGetSampleRate());
  41. json_object_set_new(rootJ, "sampleRate", sampleRateJ);
  42. // lastPath
  43. json_t *lastPathJ = json_string(gRackWidget->lastPath.c_str());
  44. json_object_set_new(rootJ, "lastPath", lastPathJ);
  45. return rootJ;
  46. }
  47. static void settingsFromJson(json_t *rootJ) {
  48. // token
  49. json_t *tokenJ = json_object_get(rootJ, "token");
  50. if (tokenJ)
  51. gToken = json_string_value(tokenJ);
  52. // windowSize
  53. json_t *windowSizeJ = json_object_get(rootJ, "windowSize");
  54. if (windowSizeJ) {
  55. double width, height;
  56. json_unpack(windowSizeJ, "[F, F]", &width, &height);
  57. guiSetWindowSize(Vec(width, height));
  58. }
  59. // windowPos
  60. json_t *windowPosJ = json_object_get(rootJ, "windowPos");
  61. if (windowPosJ) {
  62. double x, y;
  63. json_unpack(windowPosJ, "[F, F]", &x, &y);
  64. guiSetWindowPos(Vec(x, y));
  65. }
  66. // opacity
  67. json_t *opacityJ = json_object_get(rootJ, "wireOpacity");
  68. if (opacityJ)
  69. gToolbar->wireOpacitySlider->value = json_number_value(opacityJ);
  70. // tension
  71. json_t *tensionJ = json_object_get(rootJ, "wireTension");
  72. if (tensionJ)
  73. gToolbar->wireTensionSlider->value = json_number_value(tensionJ);
  74. // zoom
  75. json_t *zoomJ = json_object_get(rootJ, "zoom");
  76. if (zoomJ) {
  77. gRackScene->zoomWidget->setZoom(clampf(json_number_value(zoomJ), 0.25, 4.0));
  78. gToolbar->zoomSlider->setValue(json_number_value(zoomJ) * 100.0);
  79. }
  80. // allowCursorLock
  81. json_t *allowCursorLockJ = json_object_get(rootJ, "allowCursorLock");
  82. if (allowCursorLockJ)
  83. gAllowCursorLock = json_is_true(allowCursorLockJ);
  84. // sampleRate
  85. json_t *sampleRateJ = json_object_get(rootJ, "sampleRate");
  86. if (sampleRateJ) {
  87. float sampleRate = json_number_value(sampleRateJ);
  88. engineSetSampleRate(sampleRate);
  89. }
  90. // lastPath
  91. json_t *lastPathJ = json_object_get(rootJ, "lastPath");
  92. if (lastPathJ)
  93. gRackWidget->lastPath = json_string_value(lastPathJ);
  94. }
  95. void settingsSave(std::string filename) {
  96. info("Saving settings %s", filename.c_str());
  97. FILE *file = fopen(filename.c_str(), "w");
  98. if (!file)
  99. return;
  100. json_t *rootJ = settingsToJson();
  101. if (rootJ) {
  102. json_dumpf(rootJ, file, JSON_INDENT(2));
  103. json_decref(rootJ);
  104. }
  105. fclose(file);
  106. }
  107. void settingsLoad(std::string filename) {
  108. info("Loading settings %s", filename.c_str());
  109. FILE *file = fopen(filename.c_str(), "r");
  110. if (!file)
  111. return;
  112. json_error_t error;
  113. json_t *rootJ = json_loadf(file, 0, &error);
  114. if (rootJ) {
  115. settingsFromJson(rootJ);
  116. json_decref(rootJ);
  117. }
  118. else {
  119. warn("JSON parsing error at %s %d:%d %s", error.source, error.line, error.column, error.text);
  120. }
  121. fclose(file);
  122. }
  123. } // namespace rack