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.

137 lines
3.4KB

  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. // opacity
  15. float opacity = gToolbar->wireOpacitySlider->value;
  16. json_t *opacityJ = json_real(opacity);
  17. json_object_set_new(rootJ, "wireOpacity", opacityJ);
  18. // tension
  19. float tension = gToolbar->wireTensionSlider->value;
  20. json_t *tensionJ = json_real(tension);
  21. json_object_set_new(rootJ, "wireTension", tensionJ);
  22. // zoom
  23. float zoom = gRackScene->zoomWidget->zoom;
  24. json_t *zoomJ = json_real(zoom);
  25. json_object_set_new(rootJ, "zoom", zoomJ);
  26. // allowCursorLock
  27. json_t *allowCursorLockJ = json_boolean(gAllowCursorLock);
  28. json_object_set_new(rootJ, "allowCursorLock", allowCursorLockJ);
  29. // sampleRate
  30. json_t *sampleRateJ = json_real(engineGetSampleRate());
  31. json_object_set_new(rootJ, "sampleRate", sampleRateJ);
  32. // plugLight
  33. json_t *plugLightJ = json_boolean(gToolbar->plugLightButton->value > 0.0);
  34. json_object_set_new(rootJ, "plugLight", plugLightJ);
  35. // lastPath
  36. json_t *lastPathJ = json_string(gRackWidget->lastPath.c_str());
  37. json_object_set_new(rootJ, "lastPath", lastPathJ);
  38. return rootJ;
  39. }
  40. static void settingsFromJson(json_t *rootJ) {
  41. // token
  42. json_t *tokenJ = json_object_get(rootJ, "token");
  43. if (tokenJ)
  44. gToken = json_string_value(tokenJ);
  45. // opacity
  46. json_t *opacityJ = json_object_get(rootJ, "wireOpacity");
  47. if (opacityJ)
  48. gToolbar->wireOpacitySlider->value = json_number_value(opacityJ);
  49. // tension
  50. json_t *tensionJ = json_object_get(rootJ, "wireTension");
  51. if (tensionJ)
  52. gToolbar->wireTensionSlider->value = json_number_value(tensionJ);
  53. // zoom
  54. json_t *zoomJ = json_object_get(rootJ, "zoom");
  55. if (zoomJ) {
  56. gRackScene->zoomWidget->setZoom(clampf(json_number_value(zoomJ), 0.25, 4.0));
  57. gToolbar->zoomSlider->setValue(json_number_value(zoomJ) * 100.0);
  58. }
  59. // allowCursorLock
  60. json_t *allowCursorLockJ = json_object_get(rootJ, "allowCursorLock");
  61. if (allowCursorLockJ)
  62. gAllowCursorLock = json_is_true(allowCursorLockJ);
  63. // sampleRate
  64. json_t *sampleRateJ = json_object_get(rootJ, "sampleRate");
  65. if (sampleRateJ) {
  66. float sampleRate = json_number_value(sampleRateJ);
  67. engineSetSampleRate(sampleRate);
  68. }
  69. // plugLight
  70. json_t *plugLightJ = json_object_get(rootJ, "plugLight");
  71. if (plugLightJ)
  72. gToolbar->plugLightButton->setValue(json_is_true(plugLightJ) ? 1.0 : 0.0);
  73. // lastPath
  74. json_t *lastPathJ = json_object_get(rootJ, "lastPath");
  75. if (lastPathJ)
  76. gRackWidget->lastPath = json_string_value(lastPathJ);
  77. }
  78. void settingsSave(std::string filename) {
  79. printf("Saving settings %s\n", filename.c_str());
  80. FILE *file = fopen(filename.c_str(), "w");
  81. if (!file)
  82. return;
  83. json_t *rootJ = settingsToJson();
  84. if (rootJ) {
  85. json_dumpf(rootJ, file, JSON_INDENT(2));
  86. json_decref(rootJ);
  87. }
  88. fclose(file);
  89. }
  90. void settingsLoad(std::string filename) {
  91. printf("Loading settings %s\n", filename.c_str());
  92. FILE *file = fopen(filename.c_str(), "r");
  93. if (!file)
  94. return;
  95. json_error_t error;
  96. json_t *rootJ = json_loadf(file, 0, &error);
  97. if (rootJ) {
  98. settingsFromJson(rootJ);
  99. json_decref(rootJ);
  100. }
  101. else {
  102. printf("JSON parsing error at %s %d:%d %s\n", error.source, error.line, error.column, error.text);
  103. }
  104. fclose(file);
  105. }
  106. } // namespace rack