#include "settings.hpp" #include "app.hpp" #include "gui.hpp" #include "engine.hpp" #include "plugin.hpp" #include namespace rack { static json_t *settingsToJson() { // root json_t *rootJ = json_object(); // token json_t *tokenJ = json_string(gToken.c_str()); json_object_set_new(rootJ, "token", tokenJ); // opacity float opacity = gToolbar->wireOpacitySlider->value; json_t *opacityJ = json_real(opacity); json_object_set_new(rootJ, "wireOpacity", opacityJ); // tension float tension = gToolbar->wireTensionSlider->value; json_t *tensionJ = json_real(tension); json_object_set_new(rootJ, "wireTension", tensionJ); // zoom float zoom = gRackScene->zoomWidget->zoom; json_t *zoomJ = json_real(zoom); json_object_set_new(rootJ, "zoom", zoomJ); // allowCursorLock json_t *allowCursorLockJ = json_boolean(gAllowCursorLock); json_object_set_new(rootJ, "allowCursorLock", allowCursorLockJ); // sampleRate json_t *sampleRateJ = json_real(engineGetSampleRate()); json_object_set_new(rootJ, "sampleRate", sampleRateJ); // plugLight json_t *plugLightJ = json_boolean(gToolbar->plugLightButton->value > 0.0); json_object_set_new(rootJ, "plugLight", plugLightJ); // lastPath json_t *lastPathJ = json_string(gRackWidget->lastPath.c_str()); json_object_set_new(rootJ, "lastPath", lastPathJ); return rootJ; } static void settingsFromJson(json_t *rootJ) { // token json_t *tokenJ = json_object_get(rootJ, "token"); if (tokenJ) gToken = json_string_value(tokenJ); // opacity json_t *opacityJ = json_object_get(rootJ, "wireOpacity"); if (opacityJ) gToolbar->wireOpacitySlider->value = json_number_value(opacityJ); // tension json_t *tensionJ = json_object_get(rootJ, "wireTension"); if (tensionJ) gToolbar->wireTensionSlider->value = json_number_value(tensionJ); // zoom json_t *zoomJ = json_object_get(rootJ, "zoom"); if (zoomJ) { gRackScene->zoomWidget->setZoom(clampf(json_number_value(zoomJ), 0.25, 4.0)); gToolbar->zoomSlider->setValue(json_number_value(zoomJ) * 100.0); } // allowCursorLock json_t *allowCursorLockJ = json_object_get(rootJ, "allowCursorLock"); if (allowCursorLockJ) gAllowCursorLock = json_is_true(allowCursorLockJ); // sampleRate json_t *sampleRateJ = json_object_get(rootJ, "sampleRate"); if (sampleRateJ) { float sampleRate = json_number_value(sampleRateJ); engineSetSampleRate(sampleRate); } // plugLight json_t *plugLightJ = json_object_get(rootJ, "plugLight"); if (plugLightJ) gToolbar->plugLightButton->setValue(json_is_true(plugLightJ) ? 1.0 : 0.0); // lastPath json_t *lastPathJ = json_object_get(rootJ, "lastPath"); if (lastPathJ) gRackWidget->lastPath = json_string_value(lastPathJ); } void settingsSave(std::string filename) { printf("Saving settings %s\n", filename.c_str()); FILE *file = fopen(filename.c_str(), "w"); if (!file) return; json_t *rootJ = settingsToJson(); if (rootJ) { json_dumpf(rootJ, file, JSON_INDENT(2)); json_decref(rootJ); } fclose(file); } void settingsLoad(std::string filename) { printf("Loading settings %s\n", filename.c_str()); FILE *file = fopen(filename.c_str(), "r"); if (!file) return; json_error_t error; json_t *rootJ = json_loadf(file, 0, &error); if (rootJ) { settingsFromJson(rootJ); json_decref(rootJ); } else { printf("JSON parsing error at %s %d:%d %s\n", error.source, error.line, error.column, error.text); } fclose(file); } } // namespace rack