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.

194 lines
4.9KB

  1. #include "settings.hpp"
  2. #include "logger.hpp"
  3. #include "window.hpp"
  4. #include "plugin.hpp"
  5. #include "app.hpp"
  6. #include "engine/Engine.hpp"
  7. #include <jansson.h>
  8. namespace rack {
  9. namespace settings {
  10. bool gSkipAutosaveOnLaunch = false;
  11. static json_t *settingsToJson() {
  12. // root
  13. json_t *rootJ = json_object();
  14. // token
  15. json_t *tokenJ = json_string(gToken.c_str());
  16. json_object_set_new(rootJ, "token", tokenJ);
  17. if (!windowIsMaximized()) {
  18. // windowSize
  19. Vec windowSize = windowGetWindowSize();
  20. json_t *windowSizeJ = json_pack("[f, f]", windowSize.x, windowSize.y);
  21. json_object_set_new(rootJ, "windowSize", windowSizeJ);
  22. // windowPos
  23. Vec windowPos = windowGetWindowPos();
  24. json_t *windowPosJ = json_pack("[f, f]", windowPos.x, windowPos.y);
  25. json_object_set_new(rootJ, "windowPos", windowPosJ);
  26. }
  27. // opacity
  28. float opacity = gToolbar->wireOpacity;
  29. json_t *opacityJ = json_real(opacity);
  30. json_object_set_new(rootJ, "wireOpacity", opacityJ);
  31. // tension
  32. float tension = gToolbar->wireTension;
  33. json_t *tensionJ = json_real(tension);
  34. json_object_set_new(rootJ, "wireTension", tensionJ);
  35. // zoom
  36. float zoom = gRackScene->zoomWidget->zoom;
  37. json_t *zoomJ = json_real(zoom);
  38. json_object_set_new(rootJ, "zoom", zoomJ);
  39. // allowCursorLock
  40. json_t *allowCursorLockJ = json_boolean(gAllowCursorLock);
  41. json_object_set_new(rootJ, "allowCursorLock", allowCursorLockJ);
  42. // sampleRate
  43. json_t *sampleRateJ = json_real(gEngine->getSampleRate());
  44. json_object_set_new(rootJ, "sampleRate", sampleRateJ);
  45. // lastPath
  46. json_t *lastPathJ = json_string(gRackWidget->lastPath.c_str());
  47. json_object_set_new(rootJ, "lastPath", lastPathJ);
  48. // skipAutosaveOnLaunch
  49. if (gSkipAutosaveOnLaunch) {
  50. json_object_set_new(rootJ, "skipAutosaveOnLaunch", json_true());
  51. }
  52. // moduleBrowser
  53. json_object_set_new(rootJ, "moduleBrowser", appModuleBrowserToJson());
  54. // powerMeter
  55. json_object_set_new(rootJ, "powerMeter", json_boolean(gEngine->powerMeter));
  56. // checkVersion
  57. json_object_set_new(rootJ, "checkVersion", json_boolean(gCheckVersion));
  58. return rootJ;
  59. }
  60. static void settingsFromJson(json_t *rootJ) {
  61. // token
  62. json_t *tokenJ = json_object_get(rootJ, "token");
  63. if (tokenJ)
  64. gToken = json_string_value(tokenJ);
  65. // windowSize
  66. json_t *windowSizeJ = json_object_get(rootJ, "windowSize");
  67. if (windowSizeJ) {
  68. double width, height;
  69. json_unpack(windowSizeJ, "[F, F]", &width, &height);
  70. windowSetWindowSize(Vec(width, height));
  71. }
  72. // windowPos
  73. json_t *windowPosJ = json_object_get(rootJ, "windowPos");
  74. if (windowPosJ) {
  75. double x, y;
  76. json_unpack(windowPosJ, "[F, F]", &x, &y);
  77. windowSetWindowPos(Vec(x, y));
  78. }
  79. // opacity
  80. json_t *opacityJ = json_object_get(rootJ, "wireOpacity");
  81. if (opacityJ)
  82. gToolbar->wireOpacity = json_number_value(opacityJ);
  83. // tension
  84. json_t *tensionJ = json_object_get(rootJ, "wireTension");
  85. if (tensionJ)
  86. gToolbar->wireTension = json_number_value(tensionJ);
  87. // zoom
  88. json_t *zoomJ = json_object_get(rootJ, "zoom");
  89. if (zoomJ) {
  90. gRackScene->zoomWidget->setZoom(clamp((float) json_number_value(zoomJ), 0.25f, 4.0f));
  91. }
  92. // allowCursorLock
  93. json_t *allowCursorLockJ = json_object_get(rootJ, "allowCursorLock");
  94. if (allowCursorLockJ)
  95. gAllowCursorLock = json_is_true(allowCursorLockJ);
  96. // sampleRate
  97. json_t *sampleRateJ = json_object_get(rootJ, "sampleRate");
  98. if (sampleRateJ) {
  99. float sampleRate = json_number_value(sampleRateJ);
  100. gEngine->setSampleRate(sampleRate);
  101. }
  102. // lastPath
  103. json_t *lastPathJ = json_object_get(rootJ, "lastPath");
  104. if (lastPathJ)
  105. gRackWidget->lastPath = json_string_value(lastPathJ);
  106. // skipAutosaveOnLaunch
  107. json_t *skipAutosaveOnLaunchJ = json_object_get(rootJ, "skipAutosaveOnLaunch");
  108. if (skipAutosaveOnLaunchJ)
  109. gSkipAutosaveOnLaunch = json_boolean_value(skipAutosaveOnLaunchJ);
  110. // moduleBrowser
  111. json_t *moduleBrowserJ = json_object_get(rootJ, "moduleBrowser");
  112. if (moduleBrowserJ)
  113. appModuleBrowserFromJson(moduleBrowserJ);
  114. // powerMeter
  115. json_t *powerMeterJ = json_object_get(rootJ, "powerMeter");
  116. if (powerMeterJ)
  117. gEngine->powerMeter = json_boolean_value(powerMeterJ);
  118. // checkVersion
  119. json_t *checkVersionJ = json_object_get(rootJ, "checkVersion");
  120. if (checkVersionJ)
  121. gCheckVersion = json_boolean_value(checkVersionJ);
  122. }
  123. void save(std::string filename) {
  124. INFO("Saving settings %s", filename.c_str());
  125. json_t *rootJ = settingsToJson();
  126. if (rootJ) {
  127. FILE *file = fopen(filename.c_str(), "w");
  128. if (!file)
  129. return;
  130. json_dumpf(rootJ, file, JSON_INDENT(2) | JSON_REAL_PRECISION(9));
  131. json_decref(rootJ);
  132. fclose(file);
  133. }
  134. }
  135. void load(std::string filename) {
  136. INFO("Loading settings %s", filename.c_str());
  137. FILE *file = fopen(filename.c_str(), "r");
  138. if (!file)
  139. return;
  140. json_error_t error;
  141. json_t *rootJ = json_loadf(file, 0, &error);
  142. if (rootJ) {
  143. settingsFromJson(rootJ);
  144. json_decref(rootJ);
  145. }
  146. else {
  147. WARN("JSON parsing error at %s %d:%d %s", error.source, error.line, error.column, error.text);
  148. }
  149. fclose(file);
  150. }
  151. } // namespace settings
  152. } // namespace rack