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.

195 lines
5.0KB

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