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.

192 lines
5.0KB

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