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.

206 lines
5.3KB

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